2016-04-29 11 views
0

Ich konvertiere einen Code von einer C-Version, die Inline-Variablendeklaration und die Verwendung von Mathe in Struct type Variableninitialisierungen zu einer Version ermöglicht, die beide nicht erlaubt und ich brauche sie gleich zu arbeiten. Der Code, den ich glaube, ich klarstellen müssen, ist dies:ansi c Strukturinitialisierung von c99

// definitions 

typedef struct poly poly_t; 

struct poly 
{ 
    size_t d; /* degree */ 
    byte c[512]; /* coefficients */ 
}; 

// usage in the middle of the method 
// (contains non-declaring code before) 

poly_t tmp = { 1, {1, gf_exp[i]} }; 

und ich bin Umwandlung dies als:

poly_t tmp; // at the beginning of function scope 

// then at the same spot of previous declaration 

tmp.d = 1; 
tmp.c[0] = 1; 
tmp.c[1] = gf_exp[i]; 

Ist dies der richtige Weg, um diese Struktur zu initialisieren?

Ich brauche beide von ihnen initialisieren die gleichen Werte in der Variablen.

+3

"mit Mathematik in Strukturtyp Variable Initialisierungen" - das in jedem erlaubt ist Version des C-Standards. Aber Sie verwenden eine Variable als Initialisierer, was in keiner Version erlaubt ist. – Olaf

+0

Wenn der erste zu einem Compiler-Fehler führte, könnte das mit etwas anderem zusammenhängen. Ist die Variable beispielsweise im Dateibereich deklariert oder nicht? – Lundin

+0

Abgesehen von der Tatsache, dass der vorherige Code gültig ist, funktioniert Ihre Neuschreibung nicht wie vorheriger Code. poly_t tmp = {1, {1, gf_exp [i]}}; initialisiert auch verbleibende Mitglieder von c auf Null. – rAndom69

Antwort

1

Sie sind nicht identisch. Variablen von tmp.c[2] bis tmp.c[511] sind nicht initialisiert und enthalten Müll.

können Sie zwingen Null-initialisiert mit = {0}:

poly_t tmp = {0}; // Set all elements to zero 
tmp.d = 1; 
tmp.c[0] = 1; 
tmp.c[1] = gf_exp[i]; 

Alternativ Sie erste Elemente mit intializer einstellen:

poly_t tmp = {1}; // Set tmp.d to 1, and other elements to zero 
tmp.c[0] = 1; 
tmp.c[1] = gf_exp[i]; 
+0

Setzt '{0} 'wirklich alle Elemente auf Null? Oder nur das erste Byte? –

+1

Ja, es setzt alles auf Null. Wenn der Initialisierer über weniger Elemente als den Zieltyp verfügt, werden alle verbleibenden Elemente auf Null gesetzt. – user694733

+0

Ist diese Funktion in allen C-Versionen ein Standard? Tut mir leid, ich frage das wirklich, weil ich wusste, dass nur das erste Byte auf '0' gesetzt wird. –