Forum: Mikrocontroller und Digitale Elektronik Allgemeine Frage: FOR Schleife


von Hagen (Gast)


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?

von Rainer (Gast)


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.

von Hagen (Gast)


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

von Joerg Wunsch (Gast)


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.

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.