"legitimer Ausdruck?"



  • Ich habe heute ein älteres Testprogramm mit neuem Compiler erzeugt und festgestellt das es auf einmal nicht mehr richtig funktionert.

    Ok, Compiler Warunungen auf höchste Warnstufe und habe dann den "Fehler" gefunden, jedoch verstehe ich es jetzt nicht ganz.

    Folgendes ist "legitim":

    for(read_in=0; read_in<dim; read_in++){ 
    	 *iterator++=fgetc(fp_read);   
    }
    

    Bei folgendem hat mein Compiler die Warunung :

    [Warning] operation on 'iterator' may be undefined [-Wsequence-point]

    gebracht:

    for(run=0; run<dim; run++){  
    	 *iterator++=dechiff_sub(iterator, key, priv, hide);
             //*iterator=dechif....
             // iterator++;
    

    Die Kommentarvariante funktioniert wieder.
    Kann mir das evtl. jmd. erklären? dechiff_sub gibt ein char zurück, iterator ist ein Zeiger auf char.
    Compiler : MinGW GCC 4.8.1 32-bit Release



  • Die Warnung ist gut.

    unsure110 schrieb:

    Bei folgendem hat mein Compiler die Warunung :

    [Warning] operation on 'iterator' may be undefined [-Wsequence-point]

    google "sequence point"!



  • Oh, kann es sein das es sich auf "iterator" bei der übergabe an dechiff_sub handelt?
    Dachte jetzt das *iterator++ ist das Problem, aber wahrscheinlich ist das problem, das erst iterator erhöht wird, aber in der funktionsübergabe iterator übergeben wird. Glaub ich war da aufm Holzweg.


  • Mod

    unsure schrieb:

    aber wahrscheinlich ist das problem, das erst iterator erhöht wird, aber in der funktionsübergabe iterator übergeben wird.

    So nah und doch so fern. 🙄

    Um dich auf den richtigen Pfad zu lenken:
    -Wieso sollte obiges ein Problem sein, wenn es denn so wäre?
    -Bist du sicher, ob das überhaupt so der Fall ist? Welche Regeln lägen dem denn zugrunde? Gibt es diese Regeln wirklich?
    -Die Antwort auf die letzte Frage kannst du dir sicherlich denken, denn wenn die Antwort nicht "Nein" wäre, hätte ich sie sicher nicht gestellt. Nachdem du volkards Rat befolgt hast, kannst du sicherlich auch sagen, welche Regeln stattdessen gelten. Mit diesen Regeln: Siehst du nun das Problem?



  • Bevor ich jetzt versuche das "umständlich" auszurücken, vermute ich das folgendes zutreffend ist :

    4.Before a function is entered in a function call. The order in which the arguments are evaluated is not specified, but this sequence point means that all of their side effects are complete before the function is entered. In the expression f(i++) + g(j++) + h(k++), f is called with a parameter of the original value of i, but i is incremented before entering the body of f. Similarly, j and k are updated before entering g and h respectively. However, it is not specified in which order f(), g(), h() are executed, nor in which order i, j, k are incremented. Variables j and k in the body of f may or may not have been already incremented. Note that a function call f(a,b,c) is not a use of the comma operator and the order of evaluation for a, b, and c is unspecified.

    ??



  • ... gelöscht ...



  • lieg ich richtig?


  • Mod

    Ja.




Anmelden zum Antworten