www.mikrocontroller.net

Forum: PC-Programmierung Pointerproblem für Schleife


Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef struct {
    SDL_Surface *iii[3];
} Istruct;

for (i=1; i < 3; i++) {
        draw_ibs(screen, ibs->iii[i], i);
}

Autor: Murkser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur: for (i=0; ...

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh gut ... erzähl doch mal

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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:
for (i=0; i < 3; i++) {
        draw_ibs(screen, (&ibs->i1)[i], i);

Autor: Promeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rofl
das ist aber wirklich sehr versaut.....

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Promeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Udo Schmitt (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Hoffentlich nicht nach meinem Vorschlag!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.