Initialisiert ein const-Array in einer Struktur

8
%Vor%

Ich versuche diese Struktur zu haben, die direkt die Daten enthält, an denen ich interessiert bin, sizeof(foo) == 6+the rest , nicht sizeof(foo) == sizeof(void*)+the rest . Allerdings kann ich keine Möglichkeit finden, eine Struktur vom Typ foo mit einem data_t zu initialisieren. Ich denke, vielleicht könnte ich den const Modifikator aus dem Feld entfernen und memcpy verwenden, aber ich mag die zusätzliche Sicherheit und Klarheit.

Ich erhalte keine Kompilierungsfehler, aber wenn ich den Code ausführe, bekomme ich

%Vor%

damit die Kopie nicht richtig funktioniert, denke ich.

Dies ist für ein Arduino (oder ähnliches Gerät), also versuche ich, es auf sehr portablen Code zu halten.

Ist das nicht möglich?

BEARBEITEN: Das Entfernen des const Modifikators im data_t Feld scheint nicht zu helfen.

    
user2475269 04.06.2017, 08:19
quelle

3 Antworten

1

Es ist unmöglich, dies standardkonform zu tun.

Da% const ist, muss const char data[6]; initialisiert werden, um verwendbar zu sein, und es kann nur statisch initialisiert werden (statische Objekte ohne Initialisierer werden automatisch auf Null gesetzt), mit einem String-Literal oder mit einer geschweiften Initialisierungsliste . Sie können es nicht mit einem Zeiger oder einem anderen Array initialisieren.

Wenn ich Sie wäre, würde ich das const -Dokument loswerden, dass .data nach der Initialisierung nicht geändert werden sollte, und dann memcpy verwenden, um es zu initialisieren.

( const auf Struktur-Mitgliedern funktioniert meiner Meinung nach nicht sehr gut. Es verhindert effektiv, dass Sie Initialisierungsfunktionen haben können, und während C ++ das Problem ein wenig umgeht, indem es spezielle Sprachunterstützung für seinen Konstruktor hat Funktionen, bleibt das Problem bestehen, wenn die const -Member Arrays sind).

    
PSkocik 04.06.2017 09:37
quelle
1

Dies ist möglich, für einige Kosten >=0 .

%Vor%

Einige Compiler (z. B. clang) sind sogar in der Lage, das redundante Kopieren zu optimieren (von x nach d.c und dann von d nach foo.data ⇒ von x direkt nach foo.data ). Andere (gcc ich schaue dich an) scheinen das nicht zu erreichen.

Wenn Sie Zeiger auf data_t und nicht auf direkte char Zeiger übergeben, benötigen Sie diesen zusätzlichen memcpy-Schritt nicht. OTOH Um Zugriff auf das Array char in foo zu haben, benötigen Sie eine weitere Stufe des Mitgliederzugriffs ( .data.c anstatt nur .data ; dies hat jedoch keine Laufzeitkosten).

    
n.m. 04.06.2017 09:53
quelle
0

Eehh Ich habe irgendwie eine Lösung gefunden. Es ist ein bisschen albern, aber was auch immer

%Vor%

Es gibt keine Warnung und ich kann die Const auf dem Feld halten. Ich weiß, es ist technisch nicht in Ordnung, memcpy auf ein Feld zu setzen, das als const betrachtet wird, aber in diesem Fall mache ich es nur einmal in der Funktion, die die Struktur initialisiert. Es scheint auch, dass das Array kein Zeiger ist, sondern tatsächlich vollständig innerhalb der foo struct (kein Zeiger, yay)

Ich würde immer noch gerne Feedback, wenn jemand bereit ist zu geben.

    
user2475269 04.06.2017 08:49
quelle

Tags und Links