2016-04-21 5 views
1

Während ich den folgenden Code in Eclipse aufbaue, bekomme ich void Wert nicht ignoriert, wie es sein sollte, im Allgemeinen wird dieser Fehler auftreten, wenn wir einen Wert von einer Funktion erwarten Zurückkehrende Leere. Aber hier verwende ich keine Funktion, ich verwende einen void-Zeiger. -Code ist unten:MINGW Kompilierfehler: void Wert nicht ignoriert, wie es sein sollte

typedef struct MessageName_T 
{ 
MPM_ParameterName_t parameterName; 
uint32_t minRange; 
uint32_t maxRange; 
bool_t isInRange; 
DataType_t dataType; 
bool_t isValueNa; 
void* const data; 
}MessageName_t ; 


MessageName_t messagefr[3] = 
/* Parameter,     Minimum,  Maximum,  isInRange dataType  isValueNa data*/ 
{ 
    { Parameter,    Minimum,  Maximum,  isInRange, dataType,  isValueNa, &stuctureA.data1}, 
    { Parameter1,    Minimum1,  Maximum1,  isInRange1, dataType1, isValueNa1, &stuctureA.data2}, 
    { Parameter2,    Minimum2,  Maximum2,  isInRange2, dataType2, isValueNa2, &stuctureA.data3} 
} 

void rangecheck(int index) 
{ 
    if(messagefr[index].isValueNa == FALSE) 
    { 
    if(*(messagefr[index].data) >= (messagefr[index].minRange) && 
    *(messagefr[index].data) <= (messagefr[index].maxRange)) 
{printf("N"); 
    messagefr[index].messagefr=TRUE; 
} 
else 
{printf("Y"); 
    messagefr[index].isInRange =FALSE; 
} 
} 
else 
{ 
    NOP(); 
} 
} 

In Zeile *(messagefr[index].data) >= (messagefr[index].minRange) den Fehler „ungültig Wert nicht, da es ignoriert sein sollte“ kommt. Daten sind Void-Zeiger und ich gebe ihm den Wert &stuctureA.data1. Jetzt beim Zugriff auf diese Informationen von Daten, d. H. *(messagefr[index].data) Ich bekomme den Fehler, wenn ich (messagefr[index].data) Ich bekomme Adresse Daten zugewiesen.

+0

1) der Aufruf von 'NOP()' ist ein komplettes tun nichts. vorschlagen entfernt den einschließenden 'else' Codeblock. 2) das Feld 'isInRange' ist definiert als enthaltend 'false' oder' true', jedoch wird der Code gegen' FALSE' 3 verglichen. Mehrere der Feldtypen in der 'MessageName_t'-Struktur sind nicht definiert. Um diese für Sie zu debuggen, muss der gepostete Code alle Details abdecken, nicht ein Schnipsel aus einem größeren Codeblock. – user3629249

+0

zur besseren Lesbarkeit und Verständnis von uns Menschen: 1) folgen Sie dem Axiom: * nur eine Anweisung pro Zeile und (höchstens) eine Variablendeklaration pro Anweisung. * 2) konsequent den Code einrücken. Einzug nach jeder öffnenden Klammer '{'. Un-Einzug vor jeder schließenden Klammer '}', schlagen Sie vor, dass jeder Einzug 4 Leerzeichen umfasst, da dieser so breit ist, dass er auch mit Schriftarten mit variabler Breite sichtbar ist. – user3629249

+0

in Bezug auf diese Art von Zeile: 'messagefr [index] .messagefr = TRUE;', Es gibt kein Feld namens: 'messagefr'. Schlagen Sie 1) hervor, welche Zeile das Problem verursacht, geben Sie die eigentliche vollständige Fehlermeldung ein, und geben Sie die Definitionen für alle 'homegrown'-Datentypen ein. – user3629249

Antwort

3

In Ihrem Code ist der Datentyp messagefr[index].datavoid * und Sie können ihn nicht dereferenzieren.

Sie müssen es in einen anderen vollständigen Typ umwandeln, bevor Sie es deaktivieren können.

Betrachtet man den Wert mit minRange vergleichen, so etwas wie

*(uint32_t *)(messagefr[index].data) 

arbeiten.


Um etwas über die Ausarbeitung warum Teil hinzufügen, lassen Sie uns zuerst über vollständigen und unvollständigen Typen sehen. Zitiert

...] an object type may be incomplete (lacking sufficient information to determine the size of objects of that type) or complete (having sufficient information).

Nun kommt nach Kapitel §6.5.3.2, einstellige * Operator,

The unary * operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. [...]

jedoch aus Kapitel §6.2.5/19 wissen wir

The void type comprises an empty set of values; it is an incomplete object type that cannot be completed.

So Ein Zeiger auf void kann nicht dereferenziert werden, da der resultierende Typ (void) unvollständig ist und die für das resultierende Objekt erforderliche Größe nicht bestimmt werden kann. Daher müssen wir den Zeiger vor dem Dereferenzieren auf einen vollständigen Typ umwandeln.

+0

dann wie kann ich die Informationen aus Daten oder einem void extrahieren * – Huntkil

+1

@ KlasLindbäck Ist es jetzt besser? :) –

+0

Danke, Typ Casting heped. Ich habe noch nicht viel programmiert, aber ich habe nur ein paar Dinge angefangen. – Huntkil

Verwandte Themen