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
hmm .. aber counter1 ist ein integer und wird pro durchlauf immer um 1 erhöht. kann es da passieren dass er 10 überspringt ??
@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 !
bin nur diplomand .. aber die aktien steigen doch wieder soweit ich weiss oder nicht ??
Nö, die steigen nicht, ist eher ein nach unten gerichteter seitentrend..... Und keine Ausreden, auch Diplomanden kosten Geld. Was diplomierst Du denn da ?
ich entwickel einen messaufbau um optisch die radiale und tangentiale verbiegung von dvd-halbscheiben zu messen
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).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.