Allgemeine Frage: FOR Schleife

Gast #46918
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?
Gast #46919
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.
Gast #46920
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
Gast #46921
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

Eine eigene Frage? Dieser Thread ist über 23 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.