Forum: Compiler & IDEs Software-Lib porten, obwohl Feature fehlt


von XC8-Nutzer (Gast)


Lesenswert?

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.
1
struct x = {.member1 = 1, .member2=2};
funktioniert nicht.

Hat jemand ne Idee, wie man dieses Problem umgehen kann?


http://ww1.microchip.com/downloads/en/AppNotes/Atmel-8984-CryptoAuth-CryptoAuthLib-ApplicationNote.pdf

von Oliver S. (oliverso)


Lesenswert?

Tja, was auch immer porten bedeuten mag, es ist wohl mit Anpassungen im 
lib-Quellcode verbunden.

Oliver

von Jack (Gast)


Lesenswert?

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 };

von Jan K. (jan_k)


Lesenswert?

Das Ganze heißt designated initializer und ist mit C99 in den Standard 
geflossen. Such mal die C99 flag für deinen Compiler.

von --- (Gast)


Lesenswert?

> 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.

von Bernd K. (prof7bit)


Lesenswert?

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
struct x;
2
x.member1 = 1;
3
x.member2 = 2;

Auch wenns mehr Schreiberei ist wäre das weitaus wartungsfreundlicher 
und robuster.

: Bearbeitet durch User
von Zweig (Gast)


Lesenswert?

Explizit hinschreiben aber am besten indem man die ganze Struktur 
zunächst mit memset
 auf 0 initialisiert

von derMosphet (Gast)


Lesenswert?

Zweig schrieb:
> mit memset
>  auf 0 initialisiert

Eine schlechte idee, da nicht portabel.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

derMosphet schrieb:
> Eine schlechte idee, da nicht portabel.

Wieso?

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

derMosphet schrieb:
> Eine schlechte idee, da nicht portabel.
Was ist daran nicht portabel?
1
memset(&x, 0, sizeof(x));
ob da paddingbytes drin sind ist egal. Werden die halt auch auf 0 
gesetzt. Tut nicht weh und macht auch nichts kaputt.

von MaWin O. (Gast)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

Wenn es cpp ist kannst du das initialisieren der Member auch im 
Konstruktor der Struct machen.

von Rolf M. (rmagnus)


Lesenswert?

--- 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.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

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. :-/

von Zweig (Gast)


Lesenswert?

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.

von XC8-Nutzer (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.