www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Allgemeine Frage: FOR Schleife


Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, hab mal ne Frage an alle C-Programmierer.
Gibt es einen Unterschied zwischen folgenden C-Anweisungen ??

VARIANTE 1:


For (i=0;i<anzahl;i++){
   *ptr_to_flash=*p;
   ptr_to_flash++;
   p++;
}

Variante 2:

For (i=0;i<anzahl;(i++),(ptr_to_flash++),(p++){
   *ptr_to_flash=*p;
}

____
Also die zweite Variante funktioniert, während bei der ersten etwa
jeden 100000 bis 100-Millionsten Durchlauf die Aktualisierung von p
oder ptr_to_flash nicht klappt. Es ist doch komisch oder. Hat damit
jemand Erfarungen gemacht?

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jeden 100 Millionsten Durchlauf?! Wie hast denn das gemessen?

Anyway, aus meiner Sicht sollte es keinen Unterschied machen, welche
Version du verwendest. Welchen Compiler hast denn? Wäre interessant,
das ASM-Listing dazu zu sehen, vielleicht gibts da irgendwelche
gravierenden Unterschiede.

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fuelle zunächst einen Speicherbereich mit 0%256 bis 32768%256. 100%
kontrolliert. Es steht das richtige im Speicher!!!

In der Vorschleife lese ich den Speicher wieder und wieder aus.
Die for-schleife läuft in einer while scheife, welche erst abbricht
wenn ein fehler auftritt.In der while-Schleife laufen Zaehler, die die
for-schleifen Durchläufe zählen. Fehlerprüfung: hat eine Speicherstelle
nicht den erwarteten Wert, dann Fehler.

Durch Printout habe ich festgestellt, dass sich die Werte von i,
ptr_to_flash und p im Falle des Fehlers unterscheiden. I (also der
Wert, der in der in der for-schleife inkrementiert wird), war immer
richtig.

Benutze CVAR Compiler

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte einen Bugreport an Deinen Compilerhersteller wert sein.

Die Klammern um i++ usw. sind übrigens auch überflüssig.

Die kürzestes und optisch schönste Form, das aufzuschreiben, wäre:

for (i = 0;i < anzahl; i++)
  *ptr_to_flash++ = *p++;

Semantisch sind die genannten Varianten untereinander aber allesamt
identisch (sofern sich nicht noch weiterer Code in der Schleife
befindet).

Schneller wäre allerdings die Benutzung von memcpy():

memcpy(ptr_to_flash, p, anzahl * sizeof *p);

Ggf. danach noch

ptr_to_flash += anzahl;
p += anzahl;

falls deren Werte hernach noch von Interesse sind.

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.