Forum: Compiler & IDEs Probleme mit Array


von Wolfgang Hattig (Gast)


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 ??

von Daniel Jelkmann (Gast)


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

von Wolfgang Hattig (Gast)


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.

von Wolfgang Hattig (Gast)


Angehängte Dateien:

Lesenswert?

Hier das komplette Programm welches so nicht läuft (siehe Anhang)

von Wolfgang Hattig (Gast)


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 !!

von Daniel Jelkmann (Gast)


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

von Daniel Jelkmann (Gast)


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

von Dominic Thomé (Gast)


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

von Christian Schifferle (Gast)


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

von Wolfgang Hattig (Gast)


Lesenswert?

hmm .. aber counter1 ist ein integer und wird pro durchlauf immer um 1
erhöht. kann es da passieren dass er 10 überspringt ??

von Dominic Thomé (Gast)


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

von Wolfgang Hattig (Gast)


Lesenswert?

nein .. wer oder was ist das ??

von Dominic Thomé (Gast)


Lesenswert?

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

von Dominic Thomé (Gast)


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 !

von Wolfgang Hattig (Gast)


Lesenswert?

bin nur diplomand .. aber die aktien steigen doch wieder soweit ich
weiss oder nicht ??

von Dominic Thomé (Gast)


Lesenswert?

Nö, die steigen nicht, ist eher ein nach unten gerichteter
seitentrend..... Und keine Ausreden, auch Diplomanden kosten Geld.
Was diplomierst Du denn da ?

von Wolfgang Hattig (Gast)


Lesenswert?

ich entwickel einen messaufbau um optisch die radiale und tangentiale
verbiegung von dvd-halbscheiben zu messen

von Dominic Thomé (Gast)


Lesenswert?

Interessant, wie wird das gemessen?
Per Laserinterferenz?

von Wolfgang Hattig (Gast)


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.

von QuadDash (Gast)


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).

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
Noch kein Account? Hier anmelden.