C: Strukt zugriff auf n. Element innerhalb des Structs

OP #2314308
Lesenswert?
• ▲
▼
Hallo,
ich habe einen Struct:
double a,b,c,d,e,f,... in einem Strukt. Da möchte ich nun das n. Element 
des Structs manipulieren.
Also statt struct->c z.B. struct->val, wobei val=3 ist, sodass ich durch 
val iterieren kann. Wie kann ich sowas machen?
Grüße
#2314467
Lesenswert?
• ▲
▼
Michael H. schrieb:
> Die 1. Lösung ist falsch. Die 2. ist der prinzipelle Ansatz den man
> verfolgt wenn man nochnicht 10k Lines geschrieben hat.

Ist nicht wirklich ein Problem.
Manchmal muss man auch ins kalte Wasser springen und einfach machen.
Der Compiler hilft ja dabei indem er alle zu ändernden Stellen raussucht 
und markiert. Und der Rest ist dann einfach Fehlermeldungen abarbeiten 
und die Ersetzung machen. Wenn man sich traut und seinen Code kennt, 
kann man sich mit einem Editor-Replace viel Arbeit im Vorfeld schon 
abnehmen lassen.

Eine Möglichkeit (wenn auch nicht 100% koscher), wäre es, die 
betreffenden Strukturelemente mittels einer Union mit einem Array zu 
überlagern.
#2314557
Lesenswert?
• ▲
▼
"nicht koscher" im Sinne von "laut c-Standard undefiniert".
Unions haben nur definierte Werte, wenn genau der Teil ausgelesen wird, 
der auch beschrieben wurde, wenn ich mich recht erinnere.

trotzdem ist es beliebte Praxis Unions zum Konvertieren von Datentypen 
in Bytearrays zu benutzen - scheint also meistens zu funktionieren ;)
#2314595
Lesenswert?
• ▲
▼
Vlad Tepesch schrieb:
> "nicht koscher" im Sinne von "laut c-Standard undefiniert".
> Unions haben nur definierte Werte, wenn genau der Teil ausgelesen wird,
> der auch beschrieben wurde, wenn ich mich recht erinnere.

Du erinnerst dich richtig.

> trotzdem ist es beliebte Praxis Unions zum Konvertieren von Datentypen
> in Bytearrays zu benutzen - scheint also meistens zu funktionieren ;)

Nicht nur meistens.
Bis vor einigen Jahren war definitiv kein Compiler bekannt, bei dem es 
nicht funktioniert hätte. Und man kann davon ausgehen, dass kein 
Compilerhersteller in der Zwischenzeit damit gebrochen hätte. Das hätte 
für ihn ein echtes Manko dargestellt. Auch wenn er im Recht gewesen 
wäre.

Daher "nicht koscher". Laut C-Standard nicht gedeckt - allerdings greift 
die normative Kraft des Faktischen.
#2314610
Lesenswert?
• ▲
▼
Karl Heinz Buchegger schrieb:
> Vlad Tepesch schrieb:
>> "nicht koscher" im Sinne von "laut c-Standard undefiniert".
>> Unions haben nur definierte Werte, wenn genau der Teil ausgelesen wird,
>> der auch beschrieben wurde, wenn ich mich recht erinnere.
>
> Du erinnerst dich richtig.

rein theoretisch könnte man unions als struct implementieren, oder steht 
irgendwo, dass sizeof(union) = max(sizeof(unionmember)) sein muss?
Persönliche Seite #2315969
Lesenswert?
• ▲
▼
Vlad Tepesch schrieb:
> "nicht koscher" im Sinne von "laut c-Standard undefiniert".
> Unions haben nur definierte Werte, wenn genau der Teil ausgelesen wird,
> der auch beschrieben wurde, wenn ich mich recht erinnere.

Jepp. Allerdings gibt zumindest GCC einen Persilschein [1] [2]:

> To fix the code above, you can use a union instead of a cast
> (note that this is a GCC extension which might not work with
> other compilers):

[1] http://gcc.gnu.org/bugs/#nonbugs
[2] 
http://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-and-bit_002dfields-implementation.html#Structures-unions-enumerations-and-bit_002dfields-implementation
Gast #2320208
Lesenswert?
• ▲
▼
einfach durch struct-Elemente iterieren so wie ich das verstanden habe 
geht schon, wenn die Elemente denselben Datentyp haben. Ich weiß nicht 
wie sich das mit gutem Stil deckt aber mit Zeigern in etwa:
1
struct {
2
double a,b,c,d,e; 
3
}dVar; // die Strukturvariable
4

5
double *p=(double) &dVar; // zeiger auf erstes struct-Element 
6

7
for(int i=0;i<sizeof(dVar)/sizeof(double);i++)
8
p[i]=i;

ohne das compiliert zu haben meine ich, dass dVar.a bis dVar.e nun mit 
0 bis 4 initialisiert sind.

Mache ich zB. in der WinAPI-Programmierung so, um z.B. bestimmte 
Fensterhandles zu gruppieren und in einem Rutsch zB. an oder 
auszuknipsen.
Muss man eben gucken, dass man mit sowas sicher handhabt.
#2320237
Lesenswert?
• ▲
▼
Finsbury schrieb:
> einfach durch struct-Elemente iterieren so wie ich das verstanden habe
> geht schon, wenn die Elemente denselben Datentyp haben. Ich weiß nicht
> wie sich das mit gutem Stil deckt aber mit Zeigern in etwa:

Ich würde sowas lassen.
wenn man iterieren will, ist so eine Strukturdefinition einfach schrott.
Dann sollte man nicht versuchen mit irgendwelchen schmutzigen Tricks 
trotzdem zum Ziel zu kommen, sondern den Code überarbeiten, bevor man 
sich böse Fehler rein holt.
Gast #2320249
Lesenswert?
• ▲
▼
Vlad Tepesch schrieb:
> wenn man iterieren will, ist so eine Strukturdefinition einfach schrott.

Vom Grundsatz: warum? Speicher ist Speicher, ob nun als Array oder 
struct formuliert. Kommt drauf an, warum es gerade ein struct sein muss 
und darum geht es nach der Eingangsfrage nicht, sondern ob es geht.

> irgendwelchen schmutzigen Tricks
indem man Grundkonstrukte der Programmiersprache anwendet?

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