www.mikrocontroller.net

Forum: Compiler & IDEs Probleme mit Array


Autor: Wolfgang Hattig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ??

Autor: Daniel Jelkmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang Hattig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang Hattig (Gast)
Datum:
Angehängte Dateien:

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

Autor: Wolfgang Hattig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !!

Autor: Daniel Jelkmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Jelkmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dominic Thomé (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang Hattig (Gast)
Datum:

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

Autor: Dominic Thomé (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang Hattig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein .. wer oder was ist das ??

Autor: Dominic Thomé (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Dominic

Autor: Dominic Thomé (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Wolfgang Hattig (Gast)
Datum:

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

Autor: Dominic Thomé (Gast)
Datum:

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

Autor: Wolfgang Hattig (Gast)
Datum:

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

Autor: Dominic Thomé (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessant, wie wird das gemessen?
Per Laserinterferenz?

Autor: Wolfgang Hattig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: QuadDash (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.