Forum: PC-Programmierung Pointerproblem für Schleife


von Walter (Gast)


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;

von (prx) A. K. (prx)


Lesenswert?

1
typedef struct {
2
    SDL_Surface *iii[3];
3
} Istruct;
4
5
for (i=1; i < 3; i++) {
6
        draw_ibs(screen, ibs->iii[i], i);
7
}

von Murkser (Gast)


Lesenswert?

Du koenntest innerhalb Deiner Struct ein Array mit den drei Pointern 
anlegen (statt der drei separaten Pointer). Dann klappt es auch mit der 
Schleife ueber das Array zu iterieren.

Murkser

von (prx) A. K. (prx)


Lesenswert?

Korrektur: for (i=0; ...

von Walter (Gast)


Lesenswert?

Danke erstmal, vielleicht mach ich das so, sieht ja erstmal einfacher 
aus. Aber rein aus Interesse: gibts auch ne Lösung für meinen Ansatz?

von (prx) A. K. (prx)


Lesenswert?

Walter schrieb:

> Danke erstmal, vielleicht mach ich das so, sieht ja erstmal einfacher
> aus. Aber rein aus Interesse: gibts auch ne Lösung für meinen Ansatz?

Nur ein paar vergleichsweise schmutzige Lösungen.

von Walter (Gast)


Lesenswert?

oh gut ... erzähl doch mal

von Karl H. (kbuchegg)


Lesenswert?

Walter schrieb:
> Danke erstmal, vielleicht mach ich das so, sieht ja erstmal einfacher
> aus. Aber rein aus Interesse: gibts auch ne Lösung für meinen Ansatz?

Das Problem ist, dass dein Ansatz schon ein Problem darstellt.
Du verwendest Einzelvariablen, wo du mit einem Array besser bedient 
wärest.

von Karl H. (kbuchegg)


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

von Klaus W. (mfgkw)


Lesenswert?

Ausreichend versaut wäre z.B., sich darauf zu verlassen, daß
alle drei Elemente der struct hintereinander liegen.
Dann kommt man über die Adresse des ersten an die anderen ran:
1
for (i=0; i < 3; i++) {
2
        draw_ibs(screen, (&ibs->i1)[i], i);

von Promeus (Gast)


Lesenswert?

rofl
das ist aber wirklich sehr versaut.....

von Walter (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

Walter schrieb:

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

Handgranate besorgen, Stift ziehen, Auslöser loslassen, warten...

von Karl H. (kbuchegg)


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.

von Promeus (Gast)


Lesenswert?

Je nach dem wieviele Bytes das Struct hat, sonst kann man das Padding ja 
selber machen, innerhalb des Structs.
Aber das ist nun wirklich die unendlich versaute Lösung.

von Udo S. (urschmitt)


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?

von Stefan B. (stefan) Benutzerseite


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?

von Walter (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

Walter schrieb:
> Habs geändert, läuft jetzt super. Danke!

Hoffentlich nicht nach meinem Vorschlag!

von Karl H. (kbuchegg)


Lesenswert?

Walter schrieb:

> naja, ich hab grade gelernt, dass man mit Ellipsen sehr hässliche Dinge
> bauen kann

:-)
Kann man
:-)

>, incl pseudo-Typüberladung-Ähnlichem;

wenn du gesteinigt werden willst, dann machst du das. :-)

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.