Hallo,
ich würde in einem derzeitigen Projekt gerne die Atmel CryptoLib mit dem
XC8 Compiler nutzen.
Wie sich herausgestellt hat, unterstützt der XC8 die
Inline-Initialisierung von Strukturen nicht (zumindest nicht mit
Bezeichner).
D.h.
XC8-Nutzer schrieb:> Wie sich herausgestellt hat, unterstützt der XC8 die> Inline-Initialisierung von Strukturen nicht (zumindest nicht mit> Bezeichner).>> D.h.struct x = {.member1 = 1, .member2=2};> funktioniert nicht.>> Hat jemand ne Idee, wie man dieses Problem umgehen kann?
Ansehen wie die Struktur definiert ist und eine klassische
Initialisierung schreiben. Angenommen es stellt sich raus, dass member1
an dritter und member2 an sechster Stelle in der struct steht:
struct x = { 0, 0, 1, 0, 0, 2 };
> C99 flag
und XC8.
"Some features from the later standard, C99, are also supported."
"1. Not all C99 features have been adopted by all Microchip MPLAB XC
compilers."
Vielleicht später mal.
Jack schrieb:> Ansehen wie die Struktur definiert ist und eine klassische> Initialisierung schreiben. Angenommen es stellt sich raus, dass member1> an dritter und member2 an sechster Stelle in der struct steht:>> struct x = { 0, 0, 1, 0, 0, 2 };
Das ist aber sehr fehlerträchtig weil man nicht mehr sieht welche Felder
man da wie initialisiert und weil man die Struktur nicht mehr ändern
kann ohne eventuell unmerklich(!) ganz am anderen Ende den Code kaputt
zu machen.
Dann würd ich schon lieber explizit hinschreiben:
1
structx;
2
x.member1=1;
3
x.member2=2;
Auch wenns mehr Schreiberei ist wäre das weitaus wartungsfreundlicher
und robuster.
Kaj G. schrieb:> ob da paddingbytes drin sind ist egal. Werden die halt auch auf 0> gesetzt. Tut nicht weh und macht auch nichts kaputt.
Wenn Pointer drin sind, ist es theoretisch nicht portabel.
Praktisch gibt es aber kaum Maschinen mit NULL!=0.
--- schrieb:> "Some features from the later standard, C99, are also supported.">> "1. Not all C99 features have been adopted by all Microchip MPLAB XC> compilers.">> Vielleicht später mal.
Wenn sie es in den letzten 19 Jahren nicht hinbekommen haben, sehe ich
da wenig Chancen, dass es überhaupt jemals drin sein wird.
Am besten wäre eigentlich, sich beim Hersteller zu beschweren und dann
einen anderen Compiler zu nehmen, der das korrekt umsetzt. Natürlich
geht letzteres aus verschiedenen Gründen oft nicht ohne weiteres.
Ma W. schrieb:> Kaj G. schrieb:>> ob da paddingbytes drin sind ist egal. Werden die halt auch auf 0>> gesetzt. Tut nicht weh und macht auch nichts kaputt.>> Wenn Pointer drin sind, ist es theoretisch nicht portabel.> Praktisch gibt es aber kaum Maschinen mit NULL!=0.
Okay, guter Punkt. Daran hatte ich nicht gedacht. :-/
Kaj G. schrieb:> Wenn Pointer drin sind, ist es theoretisch nicht portabel.>> Praktisch gibt es aber kaum Maschinen mit NULL!=0.> Okay, guter Punkt. Daran hatte ich nicht gedacht. :-/
Dann haben sie mit memset wenigstens einen default Wert. Auch mit der
ursprünglichen Form werden nicht explizit angegebene Members auf „0“
initialisiert. Im Gegensatz zu einer lokalen Variablen.
Guten Abend,
vielen Dank für die vielen Antworten!
Ich habe an etwas wie einen Compiler-Switch gedacht (wie der erwähnte
"C99-Modus"), aber leider ist der XC8 inkompatibel.
Microchip hat mir mitgeteilt, dass die Lib derzeit an den XC8 angepasst
wird, aber das noch nicht vorzeigbar ist.
Ich werde daher nochmal evaluieren, ob es sinnvoller ist die von mir
benötigen Funktionen selbst zu implementieren, oder doch die ganze Lib
zu porten.