Go Down

Topic: Array gibt komische Werte aus...? (Read 591 times) previous topic - next topic

omatoasty

Hallo Community,

Ich habe da ein Problem...
ich habe zwei Arrays visit und wall,
nun will ich allen Speichermöglichkeiten (Dimensionen) in dem Array Visit den Wert 5 geben.
Dem Array wall mit drei Dimensionen möchte ich auch komplett den Wert 10 geben;

Beiden Arrays habe ich nun unten im Beispiel probiert die entsprechenden Werte zu geben.
Jedoch spinnt mein Programm wenn ich (egal welchen und egal wie) auf einen Wert des Arrays wall zugreife.

Wenn ich z.B einen Wert per SerialMonitor ausgeben möchte kommen unendlichlange Zeichenketten z.B "?¤??D?¤?¤?Ä?¤??¤??¤?¤?¤?¤?¤??¤¤?¤?¤?D??¤??¤?¤?¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤?¤??¤??¤??¤?¤?¤??D?¤?¤?Ä?¤??¤??¤?¤?¤?¤?¤??¤¤?¤?¤?D??¤??¤?¤?¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤?¤??¤??¤??¤?¤?¤??D?¤?¤?Ä?¤??¤??¤?¤?¤?¤?¤??¤?¤¤?¤?D??¤??¤?¤?¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤??¤?¤??¤??¤??¤?¤?¤??D?¤?¤?Ä?¤??¤??¤?¤?¤?¤?¤??¤?¤?D?¤??¤??¤?¤??¤??¤????D?ü"  Es können leider nich alle Zeichen angezeigt werden... -.-


Ich habe dieses Programm am UNO und MEGA getestet, bei beiden funktioniert das Programm nicht! Es wird nicht ausgegeben außer dieser komischen Zeichenketten...



Ich hoffe mir kann jemand entweder sagen was falsch ist oder mir einen funktionierende Möglichkeit geben, mit der ich allen Werten in allen Dimensionen einen Wert geben kann...



Gruß und danke fürs Lesen,

omatoasty


Hier der Code:
Code: [Select]
??
void setup()
{
  Serial.begin(9600);
  Serial.println("Der SerialMonitor ist einsatzbereit!");   
}


void loop()
{
 
  Serial.println("Start");
 
    int visit [49] [49];
     int wall [49] [49] [3];

        for(int i = 0; i < 50; i++)
        {
          for(int a = 0; a < 50; a++)
          {
            visit [i] [a] = 5;
           
            for(int b = 0; b < 4; b++)
            {
              wall [i] [a] [b] = 10;
            }
          }         
        }
   
    delay(100);   
   
   Serial.println(wall [15] [30] [3]);
   Serial.println("Stopp"); 
   
}
?

Eisebaer

hi,

wieviel platz brauchen Deine arrays im RAM (jede int braucht 2 byte)?
wieviel RAM haben Deine µCs?

gruß stefan

omatoasty

Meinst du das?

Binäre Sketchgröße: 4.276 Bytes (von einem Maximum von 258.048 Bytes)

jurs


    int visit [49] [49];


Zweidimensionales Array, 49*49= 2401 Werte, bei 2 Bytes je Wert = 4802 Bytes RAM-Speicher Bedarf


   int wall [49] [49] [3];


Dreidimensionales Array 49*49*3 = 7203 Werte, bei 2 Bytes je Wert = 14406 Bytes RAM-Speicher Bedarf

Summe RAM-Speicher = 19208 Bytes = ca. 19 KB

Nur ein Arduino DUE mit 32-Bit Controller hat mit 96 KBytes SRAM ausreichend RAM.

Verwendest Du einen Arduino Due?

omatoasty

Nein,

Ich benutze eine Mega...

du hast mit 49 * 49 gerechnet ist das nicht falsch?
Ein Array fängt doch bei 0 an zu zählen oder?

jurs


Ich benutze eine Mega...


Ein MEGA hat 8 KB RAM (für alles), das ist viel zu wenig für ein so großes Array.

Falls Du solche großen Datenmengen zu verwalten hast, solltest Du prüfen, ob Du die Daten/Arrays möglicherweise in Dateien entsprechender Größe auf einer SD-Karte verwalten könntest. Natürlich sind aber SD-Kartenzugriffe sehr viel langsamer als RAM-Speicherzugriffe, so dass es auf die Anwendung ankommt, ob das möglich ist.


du hast mit 49 * 49 gerechnet ist das nicht falsch?


Nö, wieso?


Ein Array fängt doch bei 0 an zu zählen oder?


Ja, wieso?

Wenn Du ein Array mit 49 Elementen definierst:
int test [49]
dann hat dieses Array insgesamt 49 Elemente und auf die Elemente des Arrays greifst Du mit test[0] bis test[48] zu. Macht genau die 49 Elemente, die Du für das Array definiert hast. Da bleibt nix über.





omatoasty

Stimmt ^^ lücke im Kopf^^


Ich möchte einen Boebot roboter durch ein Labyrinth fahren lassen...
Deshalb habe ich diese Arrays, ich nutze array visit als speicherort wo ich jeweils den wert speicher, wann ich das letzte mal bei den koordinaten war.
Dimension 1 = X Koordinate / Dimension 2 = Y...

Das Array wall dient dann als speicherort wo gespeichert wird wo sich wände befinden, hier dient die 3 Dimension als möglichkeit um zwischen norden westen süden osten zu unterscheiden...


Wenn du an hand dieser infos eine bessere idee hast...

lass es mich einfach wissen


Gruß und Danke

jurs


Ich möchte einen Boebot roboter durch ein Labyrinth fahren lassen...


Ich weiß zwar nicht, was ein Boebot ist, klingt aber ein bischen wie Bier-Bike.
Jedenfalls nicht so, als wenn sich das mit Lichtgeschwindigkeit bewegt, sondern schon ein paar Sekunden von A nach B braucht.


Deshalb habe ich diese Arrays, ich nutze array visit als speicherort wo ich jeweils den wert speicher, wann ich das letzte mal bei den koordinaten war.
Dimension 1 = X Koordinate / Dimension 2 = Y...

Das Array wall dient dann als speicherort wo gespeichert wird wo sich wände befinden, hier dient die 3 Dimension als möglichkeit um zwischen norden westen süden osten zu unterscheiden...


Wenn du an hand dieser infos eine bessere idee hast...

lass es mich einfach wissen


Wenn es nicht auf Geschwindigkeit ankommt, dann speicherst Du Deine Werte am besten in Dateien auf SD-Karte statt in Arrays im RAM. Dateien auf SD-Karte können nämlich recht groß werden. Dürfen die Zugriffe ein paar Millisekunden dauern?

Du mußt Dir die Datei dann eben nur als Array vorstellen, zwei- oder dreidimensional je nach Bedarf.

Stelle Dir die fortlaufenden Speicherstellen als Quadrat organisiert vor, statt mit 49 jetzt mal nur mit 8 Elementen wie beim Schachbrett:

8 Elemente in der ersten Dimension (nach rechts),
8 Elemente in der zweiten Dimension (nach unten),
man stellt es sich wie fortlaufend numerierte Speicherplätze vor:
Code: [Select]

0  1  2  3  4  5  6  7
8  9  10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63


Die Speicherstelle ergibt sich aus:

(8 pro Reihe) * (Index Reihe) + Index Seite
Index zählt mit 0 los wie beim Array.

Also um beispielsweise auf array[3][5] zuzugreifen, greifst Du linear zu auf
index[3*8+5]= 29

D.h. bei Integer-Werten würdest Du in einer Datei zugreifen per
file.seek((IndexReihe*8+IndexSeite)*sizeof(int));

Wenn Dein Array 49 Werte pro Reihe hat, wäre der Multiplikator entsprechend 49 statt 8:
file.seek((IndexReihe*49+IndexSeite)*sizeof(int));

Bei dreidimensionalen Arrays mit einer Multiplikation mehr, aber auch ein dreidimensionales Array kannst Du linear in einer Datei abbilden.

omatoasty

Vielen Danke,

du hast dir echt viel Mühe gegeben und mir das super erklärt...
hast du eine Empfehlung welchen SD-Kartenspeicher ich nehmen soll? Also ein spezielles Produkt was gut ist?

Hier ein Bild und Link von dem "Bier-Bike"^^:

http://www.generationrobots.de/mobiler-roboter-boe-shield-fur-arduino-parallax,fr,4,Robotics-Shield-kit.cfm






maverick1509

#9
May 26, 2013, 06:15 pm Last Edit: May 26, 2013, 06:21 pm by maverick1509 Reason: 1
@ omatoasty
Meiner Meinung nach kriegst du die falschen Anzeigen, weil du mehr Feldvariablen beschreibst als vorhanden sind.
Beispiel in deinem Code:

Code: [Select]

for(int b = 0; b < 4; b++)
           {
             wall [i] [a] [b] = 10;
           }


das beschreibt doch die 0,1,2,3 und das sind vier, du deklarierst aber nur drei. Und das bei allen Feldern.

gruss

Go Up