Reihenfolge der Structs im Speicher durcheinander

Gast #4600419
Lesenswert?

Hi,
ich möchte eine Art Datenbank in C hinterlegen. Dazu habe ich mehrere 
Stukturen unterschiedlicherer Größe als Konstante angelegt.
const struct pbl_char = {....};
const struct pbl_int = {....};

Mit Zeigeroperationen gehe ich die gesamte Liste durch. Dazu müssen die 
Strukturen zwingend hintereinander im Speicher liegen. Leider würfelt 
der Compiler mir die Stukturen beim optimieren durcheinander.

Ich habe versucht die Optimierung für den Bereich auszuschalten.
#pragma GCC optimize ("O0") (ARM GCC Compiler)
Leider funktioniert das nicht. (Weiß nicht warum.)

Ich habe auch versucht die Strukturen in eine weitere zu verpacken, aber 
dann kann ich die strukturen nicht mehr mit den enthaltenen 
Funktionspointern initialisieren. Die Initialisierung mit 
Funktionspointer funktioniert nur bei der ersten Struktur, bei einer 
Struktur in der Struktur gibt es eine Compilerfehler.

Hat jemand noch eine Idee?
#4600441
Lesenswert?

zwei punkte dazu:

Wie einzelne Variablen im Speicher abgelegt werden ist Aufgabe des 
Linkers. Darauf hat der c-Code keinen Einfluss (normalerweise)

Auf Structs benutzt man keine Pointer, da der Compiler diese optimieren 
kann. Pointer verwendet man normalerweise mit Arrays oder Listen.

Wenn du eine Datenbank anlegen möchtest, dann tu das doch in Form eines 
Arrays von einem Struct.
1
struct DataElement MeineDatenbank [DatenbankGroesse] = {...}
#4600451
Lesenswert?

Honkmichi schrieb:
> Die Initialisierung mit
> Funktionspointer funktioniert nur bei der ersten Struktur, bei einer
> Struktur in der Struktur gibt es eine Compilerfehler.

Und der lautet?

Du kannst jedes Element einer Struct über seinen Namen initialisieren.
1
struct data data = {
2
// ...
3
        .p[USET].mon.gain = 1.0,
4
        .p[USET].mon.offset = 0.0,
5
// ...
6
        };
#4600455
Lesenswert?

Little B. schrieb:
> Auf Structs benutzt man keine Pointer

Komisch, wieso sieht man das dann so oft? ;-)

Für Zeiger auf Strukturen bzw. Strukturelemente gibt es in C doch extra 
den Operator -> zur Vereinfachung der Schreibweise.

> Wenn du eine Datenbank anlegen möchtest, dann tu das doch in Form eines
> Arrays von einem Struct.
>
1
> struct DataElement MeineDatenbank [DatenbankGroesse] = {...}
2
>

Das wiederum klingt vernünftig.
Gast #4600474
Lesenswert?

Honkmichi schrieb:
> Mit Zeigeroperationen gehe ich die gesamte Liste durch.

Also sowas wie zeiger = &struct1 + (sizeof(struct) * n) ?

Ich weiss gerade nicht, wo ich das gelesen habe, aber direkte 
Manipulation von Zeigern dürften nach diversen Kodier-Richtlinien 
verboten sein.
Da ist ein Array von Structs doch direkt viel sauberer.
Gast #4600490
Lesenswert?

Peter D. schrieb:
> Du kannst jedes Element einer Struct über seinen Namen initialisieren.

Peter, ich geb dir Recht. Der Fehler hieß "Syntax Error". Grund dafür 
war aber ein define vor dem Funktionspointer, das unbekannt war.
Es funktionier. Ich kann eine Struktur in der Struktur auch mit einem 
Funktionspointer initialisieren.

Weiß jemand wie ich dem Linker für einen Codeabschnitt sagen kann, das 
er die Variablen nicht optimieren soll? (ARM GCC)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren