Probleme mit Array

Gast #77458
Lesenswert?

Hallo,

habe Probleme mit nem Array. wenn ich ein zweidimensionales Array
erstelle, z.b. z[10][2], dann kann ich es nicht nutzen. Wenn ich aber
zwei Arrays, z.b. z[10], a[10], erstelle kann ich diese ohne Probleme
nutzen.
code der nicht geht:

float z[10][2];

while(counter1 != 10)
{
x += 1.0;
y += 1.0;
z[counter1][0]=x;
z[counter1][1]=y;
counter1++;
}

code der funktioniert:

float z[10], a[10];

while(counter1 != 10)
{
x += 1.0;
y += 1.0;
z[counter1]=x;
a[counter1]=y;
counter1++;
}


kann mir jemand sagen was ich falsch mache ?? Warum geht die
zweidimensionale Variante nicht ??
Gast #77459
Lesenswert?

Hi!

Was geht denn an dem Code nicht?
Der sieht korrekt aus, und wenn ich den bei mir compiliere und laufen
lasse, dann tut er das, was ich erwarten würde...
Schreib mal, wo genau das Problem liegt bzw. was Du meinst, was da
falsch läuft.

Bye
 Daniel Jelkmann
Gast #77460
Lesenswert?

Ich gebe das Array über den USART aus und schau mir die Ausgabe über
Hyperterminal an .. wenn ich die zweidimensionale Variante verwende
erhalte ich diese Ausgabe (wobei die erste Spalte für Spalte 1 im Array
steht und die zweite für die Spalte 2):

 0.0  0.0
 0.0  0.0
 0.0  0.0
usw.

Selbst wenn ich den Code simuliere (mit AVRStudio 4.08) dann geht es
nicht. Beim simulieren sehe ich, dass dann nichts in die einzelnen
Arrayelemente reingespeichert wird. Beim eindimensionalen Fall
funktioniert dies.
Gast #77462
Lesenswert?

Problem gelöst, weiss jetzt worans lag !!

Die Ausgabe war das Problem, ich verwendete lediglich einen String was
so nicht funktionierte. so lautet der code der läuft:


char s1[6], s2[6];

...

dtostrf(z[counter1][0],5,1,s1);
usart0_sendString(s1);
usart0_sendString(" ");

dtostrf(z[counter1][1],5,1,s2);
usart0_sendString(s2);
usart0_sendString("\r\n");

...

trotzdem danke erstmal !!
Gast #77463
Lesenswert?

Hi!

Also ich habe das mal mit dem normalen GCC kompiliert (nicht den
avr-gcc). Und da scheinen die Arrayzuweisen einwandfrei zu
funktionieren, wenn ich die Werte ausgeben lasse.
Warum das mit dem avr-gcc nicht funktioniert, sehe ich momentan auch
nicht.
Ich würd schon fast sagen: Ein Fall für Jörg ;)

Was mir nur einfällt: Brauchst Du noch an anderen Stellen
Gleitkommazahlen? Wenn nicht, dann würde ich an Deiner Stelle den Code
umschreiben und das ganze nur mit ganzzahligen Datentypen machen. Also
die Floats mit 10 multiplizieren und bei der Umwandlung in den String
kannst Du das Komma ja an der richtigen Stelle einfügen... Dann
brauchst Du den ganzen langsamen und code-aufblähenden
FloatingPoint-Kram garnicht...

Bye
 Daniel Jelkmann
Gast #77464
Lesenswert?

Hi!

Schön, dass Dein Programm jetzt läuft.
Aber wirklich einleuchten tuts mir irgendwie nicht, was das mit dem
String bzw. den beiden Strings zu tun hat... Ich sehe da den Fehler
nicht, vielleicht kann mir jemand helfen?

Bye
  Daniel Jelkmann
Gast #77465
Lesenswert?

Und noch was zur Codesicherheit
while(counter1 != 10) ist gründsätzlich böse, was passiert wenn aus
irgendeinem Grund counter1 > 10 ist ?
Besser wäre
while(counter1 < 10)

Gruß
Dominic
Gast #77466
Lesenswert?

@Dominic

Du hast grundsätzlich Recht. Wenn jedoch counter1 einmal tatsächlich >
10 seind sollte, dann liegt ein Fehler im Programm vor (Überschreiber)
und dann läuft das Programm vermutlich ohnehin nicht mehr stabil.

@Wolfgang
Ich empfehle für solche Schleifen grundsätzlich die for-Anweisung zu
verwenden:

for (counter1=0; counter1<10; counter1++) {
   tu irgendwas;
}

Gruss
Christian
Gast #77468
Lesenswert?

@Christian
Klar hast Du recht, wenn Du sagst, daß wenn der Coutner mal > 10 sein
sollte was im Programm nicht stimmt. Trotzdem ist es besser <10
abzufragen, da Du dann auf jeden Fall nicht wild im Speicher
umherspringst, ist halt Ansichtssache, ich sage halt : Programm läuft
auf jeden Fall weiter und kann sich wieder fangen. Der µC ist dann
ncith tot und kann noch andere Aufgaben korrekt erledigen.

@Wolfgang
Normalerweise läuft er nicht über 10, aber Dein Programm kann kmplexer
werden und evtl. willst Du mehr machen als nur einmal inkrementieren um
was zu finden, oder Du dekremtierst und erreichts einen Überlauf oder
oder oder .
Kennst Du Murphy ?

Dominic
Gast #77471
Lesenswert?

Da fällt mir gerade an Deiner eMail was auf :
Ich habe noch Aktien von euch, also verplemper Deine Zeit nicht hier im
Forum sondern schaff was, damit der scheiss Kurs mal wiedersteigt !
Gast #77476
Lesenswert?

einfacher .. gepulster laser und eine psd (gepulst deswegen um rauschen
rauszurechnen) .. durch die 4 ströme (ortsabhängig vom auftreffpunkt
des laserstrahls) kann ich dann eine aussage über die reflektierende
scheibe treffen.
Gast #77477
Lesenswert?

Auch wenns schon "länger" her ist:
Zur Ergänzung: Auch eine for-Schleife schützt vor Fehlbedingungen der
Schleifenvariable nicht! Wenn irgendwo im Rumpf count1++; o.ä. steht,
dann kanns vorbei sein.

----, (QuadDash).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren