Probleme mit Array

Gast #77458
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
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
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
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
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
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
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
@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
@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
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
Nö, die steigen nicht, ist eher ein nach unten gerichteter
seitentrend..... Und keine Ausreden, auch Diplomanden kosten Geld.
Was diplomierst Du denn da ?
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.