Operation on … darf undefiniert sein?

Lesezeit: 3 Minuten

Benutzeravatar von gbhall
gbhall

Ich habe folgenden Code

FRAME frameArray[5][10]; // Create the array of frames
int trackBufferFull[5] = {0, 0, 0, 0, 0};// Keeps track of how full the buffer for each node is
int trackFront[5] = {0, 0, 0, 0, 0}; // Array to keep track of which is the front of the array
int trackTail[5] = {0, 0, 0, 0, 0};


// Function to add to the array (CHANGE int frame)
void addFrame (int nodeNumber, FRAME frame)
{
    //Calc tail
    int tail = trackTail[nodeNumber-1];

    // Calc frames in buffer
    int framesinBuffer = trackBufferFull[nodeNumber-1];

    if (framesinBuffer == 10)
    {
        printf("Buffer is full\n");
    }
    else
    {

        // Add frame to frameArray
        frameArray[nodeNumber-1][tail] = frame; 
        printf("\nAdded a frame in node: %i to the buffer\n", nodeNumber);

        // Increment the count
        trackBufferFull[nodeNumber-1]++;
        trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;


    }  
}

Die Arrays, die ich für frameArray verwende, sind ein umlaufendes/zyklisches Array der Länge 10, daher habe ich den Code

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

Alles funktioniert perfekt in einer eigenständigen Datei, aber wenn ich innerhalb einer größeren Datei ausgeführt werde, erhalte ich die folgenden Kompilierungsfehler:

$ cnet GARETH -m 30
compiling gareth.c
gareth.c: In function ‘addFrame’:
gareth.c:77:27: error: operation on ‘trackTail[nodeNumber + -0x00000000000000001]’ may be undefined [-Werror=sequence-point]
gareth.c: In function ‘removeFirstFrame’:
gareth.c:98:28: error: operation on ‘trackFront[nodeNumber + -0x00000000000000001]’ may be undefined [-Werror=sequence-point]
gareth.c:105:1: error: control reaches end of non-void function [-Werror=return-type]
cc1: all warnings being treated as errors

Zeile 77 ist die Zeile

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

Hilfe.

Um den Code mit Zeilennummern und den Fehlern nebeneinander zu sehen, habe ich ein Bild hochgeladen auf:
http://i.imgur.com/wyO5a.png

  • stackoverflow.com/questions/4176328/… – du bist Glücklich Ihr Compiler warnt Sie dort.

    – Matte

    16. Mai 2012 um 16:54 Uhr

Benutzeravatar von NPE
NPE

Zeile 77 ist die Zeile

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

Du veränderst dich trackTail[nodeNumber-1] zweimal dazwischen Sequenzpunkte: einmal durch ++und einmal durch Zuweisung.

Das ist undefiniertes Verhalten.

Die Abhilfe besteht darin, die Aussage zum Beispiel so umzuformulieren:

trackTail[nodeNumber-1] = (trackTail[nodeNumber-1] + 1) % 10;

oder so:

trackTail[nodeNumber-1]++;
trackTail[nodeNumber-1] %= 10;

  • … oder ohne Teilung: if (++trackTail[nodeNumber-1] > 9) trackTail[nodeNumber-1] = 0;

    – Torsten Crull

    31. Januar 2021 um 13:40 Uhr


Du modifizierst trackTail[nodeNumber - 1] zwischen Sequenzpunkten. Es ist, als würden Sie zuweisen

i = ++i;

was auch undefiniertes Verhalten ist.

Ändern Sie Ihren Code in etwa so:

trackTail[nodeNumber - 1] = (trackTail[nodeNumber - 1] + 1) % 10;

  • Dein Lösungsvorschlag sieht für mich falsch aus. Du addierst 1 zu trackTail[nodeNumer - 1] auf einer Zeile und dann inkrementieren wieder mit ++ auf der nächsten.

    – sepp2k

    16. Mai 2012 um 16:58 Uhr

  • Nö. Eines zum Tracktail hinzufügen[nodeNumber + 1] weist ihm NICHT den inkrementierten Wert zu. Deshalb wird das icrement benötigt. OP möchte, dass das Modulo für den Wert ausgeführt wird Plus einsund möchte gleichzeitig den Wert dieses Array-Elements erhöhen.

    Benutzer529758

    16. Mai 2012 um 16:58 Uhr


  • Was? Der inkrementierte Wert (Modulo 10) wird zugewiesen trackTail[nodeNumer-1] weil es dort einen Zuweisungsoperator gibt, dessen rechter Operand der inkrementierte Wert ist. Nach Ausführung der Zeile trackTail[nodeNumber - 1] = (trackTail[nodeNumber - 1] + 1) % 10; der Wert von trackTail[nodeNumber - 1] wird definitiv sein vorheriger Wert + 1 modulo 10 sein. Nach Ausführung der folgenden Zeile wird es sein ursprünglicher Wert plus 2 sein (modulo 10, es sei denn, der ursprüngliche Wert war 8, in diesem Fall ist es jetzt 10).

    – sepp2k

    16. Mai 2012 um 17:01 Uhr

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;

Ja, das ist undefiniertes Verhalten, genau wie die Fehlermeldung sagt. Sie dürfen denselben Wert nicht zweimal ohne einen Sequenzpunkt dazwischen ändern. In diesem Fall bedeutet dies, dass Sie nicht beide erhöhen dürfen trackTail[nodeNumber-1] verwenden ++ und weisen Sie es mit neu zu =.

Wenn Sie nur verwenden + 1 Anstatt von ++es wird gut funktionieren.

1410430cookie-checkOperation on … darf undefiniert sein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy