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