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;
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 | }
|
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
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?
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.
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.
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
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); |
... 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?
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...
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.
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.
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?
> 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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.