Pointerproblem für Schleife

Gast #1893189
Lesenswert?

Hallo,
könnt Ihr mal erklären, wie ich das hier in Schleifenform bringen kann?

draw_ibs(screen, ibs->i1, 1);
draw_ibs(screen, ibs->i2, 2);
draw_ibs(screen, ibs->i3, 3);

-------------------------
ich hatte es so versucht, aber das klappt so nicht

void * ibmpptr = ibs->i1;
for (i=1; i < 3; i++) {
        draw_ibs(screen, ibmpptr, i);
        ibmpptr++;
}

------------------
definitiert als
typedef struct {
    SDL_Surface *i1;
    SDL_Surface *i2;
    SDL_Surface *i3;
} Istruct;
typedef Istruct *IPointer;
IPointer ibs;
#1893228
Lesenswert?

Walter schrieb:
> oh gut ... erzähl doch mal

Die 'schmutzigen' Lösungen wurden schon genannt. Und es gibt sicherlich 
noch ein paar andere noch schmutzigere Lösungen (mit schwebt da zb etwas 
mit einer union vor :-)

Sei nicht so faul.
Andere deine Datenstruktur um und mach eine saubere Lösung. Das hast du 
in ein paar Minuten erledigt und wenn du es nicht allzu ungeschickt 
machst, hilft dir sogar der Compiler dabei, indem er dir die Stellen im 
Code raussucht, die du anpassen musst.
Geht ratz-fatz
Gast #1893245
Lesenswert?

... och Mensch :(   /me geht codeändern

Aber angenommen ich habe unterschiedliche Typen und nicht immer das 
selbe, dann funktioniert der Ansatz mit nem Array ja nicht mehr so 
schön, und wenn man dann dort kein Union einsetzen will ... wie geht das 
dann?

Verständnisfrage: liegen die Werte des Structs hintereinander im 
Speicher, wie bei einem Array? Oder ist der Ansatz da einfach einen 
Pointer rumzuschieben überhaupt nicht machbar?
#1893248
Lesenswert?

Walter schrieb:
> ... och Mensch :(   /me geht codeändern
>
> Aber angenommen ich habe unterschiedliche Typen

Wenn du unterschiedliche Typen hast, kannst du auch nicht dieselbe 
Funktion dafür aufrufen :-)

> Verständnisfrage: liegen die Werte des Structs hintereinander im
> Speicher, wie bei einem Array? Oder ist der Ansatz da einfach einen
> Pointer rumzuschieben überhaupt nicht machbar?

Machbar schon.
Aber du hast keinerlei Garantie, dass sie tatsächlich hintereinander 
liegen und der Compiler keine Füllbytes eingefügt hat.
Es bestehen auch gewisse Chancen, dass man den Verzehr eines 
Fliegenpilzes überlebt. Nur drauf ankommen lassen würde ich es nicht.
#1893273
Lesenswert?

Walter schrieb:
> Aber angenommen ich habe unterschiedliche Typen und nicht immer das
> selbe, dann funktioniert der Ansatz mit nem Array ja nicht mehr so
> schön, und wenn man dann dort kein Union einsetzen will ... wie geht das
> dann?

Dann machst Du einen Parent Typ der die entsprechenden Methoden hat, von 
dem leitest Du dann Deine unterschiedlichen Typen ab.
Dann kannst Du die wieder in ein Array packen.
Und deinen Methoden/Funktionen übergibst Du dann nur den (abstrakten) 
Parent Typ.
Nennt sich objektorientierte Programmierung.

oder Du siehst das so: Wenn Du in Deiner Küche Limo direkt neben 
Kloreiniger stehen hast benutzt Du auch nicht die Funktion "trinken" für 
beide, oder?
Persönliche Seite #1893277
Lesenswert?

> draw_ibs(screen, ibs->i3, 3); // #1
> for (i=1; i < 3; i++)
>        draw_ibs(screen, irgendwas, i); // #2

#2 erzeugt nie #1, weil i < 3 die Abbruchbedingung ist.

Darfst du draw_ibs() verändern oder einen Wrapper schreiben? Dann 
könntest du als 2. Argument ibs übergeben und dann z.B. mit einem 
switch-case und dem 3. Argument auf das Strukturelement zugreifen.

Bringt das wirklich so viel (Speed?, Codeersparnis?), wenn man die drei 
diskreten Aufrufe in eine Schleife packt?
Gast #1893278
Lesenswert?

Habs geändert, läuft jetzt super. Danke!

> Wenn du unterschiedliche Typen hast, kannst du auch nicht dieselbe Funktion 
dafür aufrufen :-)

naja, ich hab grade gelernt, dass man mit Ellipsen sehr hässliche Dinge 
bauen kann, incl pseudo-Typüberladung-Ähnlichem;
aber keine Angst, das tu ich wissentlich der Welt nicht an

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