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 ??
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
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.
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 !!
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
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
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
@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
@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
Murphy's Gesetz.
Da gibt es unzählige §§
Einer davon :
Wenn Du einer Variablen die Möglichkeit gibst, undefinierte Zustände
anzunehmen, so wird sie das tun.
Etwas mehr davon hier :
http://userpage.chemie.fu-berlin.de/diverse/murphy/murphy.html
Dominic
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 !
Nö, die steigen nicht, ist eher ein nach unten gerichteter
seitentrend..... Und keine Ausreden, auch Diplomanden kosten Geld.
Was diplomierst Du denn da ?
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.
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).