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;
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
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:
... 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. :-)