Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DieNeueMitte Ohne eigene Schuld umlautfrei
Anmeldungsdatum: 14.06.2007 Beiträge: 850
Wohnort: Southampton
|
(#897082) Verfasst am: 30.12.2007, 22:51 Titel: Kann hier wer C++? |
|
|
Ich versuche mich gerade in OpenGL einzuarbeiten und bei einem Beispielprogramm sehe ich nach den Definitionen:
Code: | int idx = 0;
GLushort* indexPtr = _indices; //GLushort ist das selbe wie short
|
in einer Schleife diese Anweisung:
Code: |
*indexPtr++ = idx++;
|
Was (zum fliegenden Spaghettimonster) passiert hier?
_________________ Lieber ständig übermüdet als ständig überwacht!
Center or Centrist: Your own political position, regardless of where you are outside the fora. This position is, of course, the voice of sweet reason and compromise.
|
|
Nach oben |
|
 |
Algol Katholik, saugverwirrte schleichende Scharia
Anmeldungsdatum: 22.06.2006 Beiträge: 4797
Wohnort: Berlin
|
(#897090) Verfasst am: 30.12.2007, 22:57 Titel: |
|
|
Du zählst einen Speicherpointer um eins hoch und mit ihm eine IntegerVariable?
Sieht seltsam aus.
Ist schon ewig her ...
_________________ Leben kann tödlich sein
|
|
Nach oben |
|
 |
pyrrhon registrierter User
Anmeldungsdatum: 22.05.2004 Beiträge: 8770
|
(#897100) Verfasst am: 30.12.2007, 23:09 Titel: |
|
|
Das ist doch schön an C++: Man kann in einer knappen Anweisung allerhand machen mit Nebeneffekten usw. und niemand kennt sich aus, nicht einmal selber, wenn man sich den Code ein Jahr später ansieht.
|
|
Nach oben |
|
 |
kolja der Typ im Maschinenraum

Anmeldungsdatum: 02.12.2004 Beiträge: 16631
Wohnort: NRW
|
(#897108) Verfasst am: 30.12.2007, 23:18 Titel: Re: Kann hier wer C++? |
|
|
Code: | int idx = 0;
GLushort* indexPtr = _indices; //GLushort ist das selbe wie short
[...]
*indexPtr++ = idx++; |
Der Operator * dereferenziert eine Zeigervariable und erlaubt den direkten Zugriff auf die Adresse, auf die der Zeiger zeigt. Der Operator ++ incrementiert eine Variable, wobei die Bedeutung dieser Operation vom Typ der Variable abhängt: ein Integer wird um 1 erhöht, die Adresse in einer Zeigervariable wird um die Größe des Datentyps, auf den der Zeiger zeigt, erhöht. Wenn der Incrementoperator hinter der Variable steht, wird der Ausdruck zuerst ausgewertet und anschließend die Variable incrementiert. Wenn der Incrementoperator vor der Variable steht, wird die Variable vor der Auswertung incrementiert.
Hier wird also zuerst die Zuweisung ausgeführt, das heißt der Wert von idx wird an die Adresse kopiert, auf die indexPtr zeigt.
Erst dannach werden beide Variablen incrementiert, anschließend hat idx einen um 1 höheren Wert und indexPtr zeigt auf eine sizeof(GLushort) höhere Adresse.
Letztlich wird im Speicher beginnend bei Adresse _indices ein Array von GLushort mit einer aufsteigenden Folge von Werten erzeugt.
Ein paar andere, ausführlichere und vielleicht leichter verständlichere Schreibweisen wären:
Code: | *indexPtr = idx;
indexPtr = indexPtr + 1;
idx = idx + 1; |
Code: | *indexPtr = idx;
indexPtr += 1;
idx += 1; |
Code: | *indexPtr = idx;
indexPtr++;
idx++; |
Code: | *indexPtr = idx;
++indexPtr;
++idx; |
Nicht äquivalent wären hingegen folgende Ausdrücke:
Code: | *++indexPtr = ++idx; |
Code: | *indexPtr++ = ++idx; |
Code: | *indexPtr++ = idx++; |
_________________ Hard work often pays off after time, but laziness always pays off now.
|
|
Nach oben |
|
 |
kolja der Typ im Maschinenraum

Anmeldungsdatum: 02.12.2004 Beiträge: 16631
Wohnort: NRW
|
(#897116) Verfasst am: 30.12.2007, 23:30 Titel: |
|
|
pyrrhon hat folgendes geschrieben: | Das ist doch schön an C++: Man kann in einer knappen Anweisung allerhand machen mit Nebeneffekten usw. und niemand kennt sich aus, nicht einmal selber, wenn man sich den Code ein Jahr später ansieht. |
Damit hast Du zwar prinzipiell recht, aber eine einfacge Zuweisung + Postincrement ist dafür kein geeignetes Beispiel. Das ist vielmehr eine absolute Standardformulierung. Wer die nicht auf Anhieb auch in fremdem Code versteht, kann lediglich kein C++.
_________________ Hard work often pays off after time, but laziness always pays off now.
|
|
Nach oben |
|
 |
DieNeueMitte Ohne eigene Schuld umlautfrei
Anmeldungsdatum: 14.06.2007 Beiträge: 850
Wohnort: Southampton
|
(#897117) Verfasst am: 30.12.2007, 23:31 Titel: |
|
|
Danke!
_________________ Lieber ständig übermüdet als ständig überwacht!
Center or Centrist: Your own political position, regardless of where you are outside the fora. This position is, of course, the voice of sweet reason and compromise.
|
|
Nach oben |
|
 |
Backside NGC 2997
Anmeldungsdatum: 17.07.2003 Beiträge: 755
Wohnort: Sirius
|
(#897122) Verfasst am: 30.12.2007, 23:37 Titel: |
|
|
Ach ja, Pointer ... ich liebe sie
Aber hier kommt es eigentlich darauf an, was _indices genau sein soll.
Wenn _indices ein Array ist, dann macht die Anweisung:
Code: | *indexPtr++ = idx++; |
quasi nichts anderes wie den einzelnen Arrayelementen Werte zuzuweisen und zwar von 0 bis n.
Ich hab mal folgendes Beispielprogramm geschrieben:
Code: | #include <iostream>
#include <stdlib>
using namespace std;
int main(int argc, char *argv[])
{
int idx = 0;
int _indices[10];
int *indexPtr = _indices;
for(int i=0; i < 10; i++) {
*indexPtr++ = idx++;
printf("%i: %i\n",i,_indices[i]);
}
system("PAUSE");
return 0;
} |
Ausgabe:
Code: | 0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9 |
Wenn _indices ein Array ist (und das müsste es sein), dann zeigt indexPtr zunächst auf die Adresse des ersten Elements von _indices.
Durch *indexPtr wird auf den Inhalt bzw. den Wert dieses Arrayelements zugegriffen und auf den Wert von idx gesetzt, der danach ja wegen dem ++ um 1 erhöht wird.
Genauso wird *indexPtr durch das ++ um 1 erhöht (nach der Zuweisung), wodurch der Pointer dann auf das nächste Arrayelement zeigt.
Interessanterweise bezieht sich das ++ hier beim *indexPtr++ nur auf indexPtr und nicht auf *indexPtr. Soll heißen: Die Adresse auf die indexPtr zeigt wird inkrementiert und nicht der Inhalt auf den gezeigt wird. Vermutlich eine Operator-Prioritäts Geschichte.
Falls dir das alles nicht so klar ist, dann les dir unbedingt den Zeiger-Schmarrn nochmal durch und kleb dir Notizen an den Bildschirm
Glaub mir, man wird sonst wahnsinnig mit dem Zeug, vor allem weil * in manchen Kontexten nicht immer "Zeiger" bedeutet.
_________________ Atheist = Realist
|
|
Nach oben |
|
 |
lemonstar registrierter User
Anmeldungsdatum: 17.07.2003 Beiträge: 1004
|
(#897133) Verfasst am: 30.12.2007, 23:49 Titel: Re: Kann hier wer C++? |
|
|
kolja hat folgendes geschrieben: |
Nicht äquivalent wären hingegen folgende Ausdrücke:
Code: | *++indexPtr = ++idx; |
Code: | *indexPtr++ = ++idx; |
Code: | *indexPtr++ = idx++; | |
Ist die dritte Variante nicht der Orginalausdruck?
_________________
eindrucksvolles
|
|
Nach oben |
|
 |
Gustav Aermel dauerhaft gesperrt
Anmeldungsdatum: 05.04.2007 Beiträge: 1811
|
(#897137) Verfasst am: 30.12.2007, 23:53 Titel: |
|
|
"Kann hier wer C++?"
Jo, versuchs mir gerade abzugewöhnen.
Wo ist die Flasche?
|
|
Nach oben |
|
 |
Ragmaanir Fieser Necessitator
Anmeldungsdatum: 12.06.2005 Beiträge: 833
Wohnort: Hamburg
|
(#897142) Verfasst am: 31.12.2007, 00:00 Titel: |
|
|
In C++ habe ich früher mal programmiert.
Hm, dieser (imho verständlichere) Ausdruck müsste doch auch äquivalent sein, oder?
Code: |
indexPtr[idx] = idx++;
|
|
|
Nach oben |
|
 |
Gustav Aermel dauerhaft gesperrt
Anmeldungsdatum: 05.04.2007 Beiträge: 1811
|
(#897147) Verfasst am: 31.12.2007, 00:03 Titel: |
|
|
Ragmaanir hat folgendes geschrieben: | In C++ habe ich früher mal programmiert.
Hm, dieser (imho verständlichere) Ausdruck müsste doch auch äquivalent sein, oder?
Code: |
indexPtr[idx] = idx++;
| |
Würde spontan behaupten: Nö!
|
|
Nach oben |
|
 |
Backside NGC 2997
Anmeldungsdatum: 17.07.2003 Beiträge: 755
Wohnort: Sirius
|
(#897149) Verfasst am: 31.12.2007, 00:05 Titel: |
|
|
Jop, wobei man sich indexPtr sowieso sparen und schreiben könnte:
Code: | _indices[idx] = idx++; |
_________________ Atheist = Realist
|
|
Nach oben |
|
 |
Backside NGC 2997
Anmeldungsdatum: 17.07.2003 Beiträge: 755
Wohnort: Sirius
|
(#897151) Verfasst am: 31.12.2007, 00:06 Titel: |
|
|
Sharif hat folgendes geschrieben: |
Würde spontan behaupten: Nö! |
Also bei meinem Beispielprog funktionierts zumindest.
Ach ... c++ ist schon ein schöner scheiß
Ich weiß schon warum ich so lange bei Basic geblieben bin
_________________ Atheist = Realist
|
|
Nach oben |
|
 |
Critic oberflächlich
Anmeldungsdatum: 22.07.2003 Beiträge: 16357
Wohnort: Arena of Air
|
(#897152) Verfasst am: 31.12.2007, 00:07 Titel: |
|
|
Ragmaanir hat folgendes geschrieben: | In C++ habe ich früher mal programmiert.
Hm, dieser (imho verständlichere) Ausdruck müsste doch auch äquivalent sein, oder?
Code: |
indexPtr[idx] = idx++;
| |
Deswegen habe ich auch spontan gedacht: Der Zugriff über die Pointer mag vielleicht gewählt werden, wenn man damit schneller arbeiten kann. Wobei man aber damit alles mögliche kaputtschreiben kann. Man nehme etwa an, der Programmierer vergißt ein Postinkrement und überschreibt sich damit etwas ganz Anderes.
_________________ "Die Pentagon-Gang wird in der Liste der Terrorgruppen geführt"
Dann bin ich halt bekloppt.
"Wahrheit läßt sich nicht zeigen, nur erfinden." (Max Frisch)
|
|
Nach oben |
|
 |
DieNeueMitte Ohne eigene Schuld umlautfrei
Anmeldungsdatum: 14.06.2007 Beiträge: 850
Wohnort: Southampton
|
(#897153) Verfasst am: 31.12.2007, 00:07 Titel: |
|
|
Der Pointer wird nachher für bestimmte Funktionsaufrufe verwendet... so wie es aussieht zumindestens...
_________________ Lieber ständig übermüdet als ständig überwacht!
Center or Centrist: Your own political position, regardless of where you are outside the fora. This position is, of course, the voice of sweet reason and compromise.
|
|
Nach oben |
|
 |
pyrrhon registrierter User
Anmeldungsdatum: 22.05.2004 Beiträge: 8770
|
(#897159) Verfasst am: 31.12.2007, 00:10 Titel: |
|
|
kolja hat folgendes geschrieben: | Das ist vielmehr eine absolute Standardformulierung. |
Ich weiß. Solche Standardformulierungen sind dafür mitverantwortlich, dass so viele Programme so schlecht sind.
|
|
Nach oben |
|
 |
Backside NGC 2997
Anmeldungsdatum: 17.07.2003 Beiträge: 755
Wohnort: Sirius
|
(#897160) Verfasst am: 31.12.2007, 00:10 Titel: |
|
|
Syku hat folgendes geschrieben: | Der Pointer wird nachher für bestimmte Funktionsaufrufe verwendet... so wie es aussieht zumindestens... |
Wahrscheinlich wird er vorher noch mit Adressen von anderen Variablen oder Arrays überschrieben
_________________ Atheist = Realist
|
|
Nach oben |
|
 |
Gustav Aermel dauerhaft gesperrt
Anmeldungsdatum: 05.04.2007 Beiträge: 1811
|
(#897177) Verfasst am: 31.12.2007, 00:26 Titel: |
|
|
War wohl doch nichts mit meiner Spontanität.
Ich geh jetzt am Besten ins Bett.
|
|
Nach oben |
|
 |
kolja der Typ im Maschinenraum

Anmeldungsdatum: 02.12.2004 Beiträge: 16631
Wohnort: NRW
|
(#897183) Verfasst am: 31.12.2007, 00:29 Titel: |
|
|
Backside hat folgendes geschrieben: | Aber hier kommt es eigentlich darauf an, was _indices genau sein soll. |
Nein, der Effekt des Ausdrucks in der Schleife hängt nur vom Typ von indexPtr an. _indicies könnte z.B. ein Zeiger auf void sein, der von malloc() geliefert wurde.
lemonstar hat folgendes geschrieben: | Ist die dritte Variante nicht der Orginalausdruck? |
Äh ja, mist, ich meinte natürlich: Code: | *++indexPtr = idx++; |
_________________ Hard work often pays off after time, but laziness always pays off now.
|
|
Nach oben |
|
 |
kolja der Typ im Maschinenraum

Anmeldungsdatum: 02.12.2004 Beiträge: 16631
Wohnort: NRW
|
(#897194) Verfasst am: 31.12.2007, 00:37 Titel: |
|
|
Ragmaanir hat folgendes geschrieben: | Hm, dieser (imho verständlichere) Ausdruck müsste doch auch äquivalent sein, oder? |
Code: | indexPtr[idx] = idx++; |
Der Ausdruck auf der rechten Seite des Zuweisungsoperators wird komplett ausgewertet (inclusive Postincrement!), bevor der Ausdruck auf der linken Seite ausgewertet wird und die Zuweisung stattfinden kann. Eine Zuweisung auf indexPtr[0] fände niemals statt, auch wenn idx bei 0 startet.
_________________ Hard work often pays off after time, but laziness always pays off now.
|
|
Nach oben |
|
 |
Critic oberflächlich
Anmeldungsdatum: 22.07.2003 Beiträge: 16357
Wohnort: Arena of Air
|
(#897196) Verfasst am: 31.12.2007, 00:37 Titel: |
|
|
kolja hat folgendes geschrieben: | Backside hat folgendes geschrieben: | Aber hier kommt es eigentlich darauf an, was _indices genau sein soll. |
Nein, der Effekt des Ausdrucks in der Schleife hängt nur vom Typ von indexPtr an. _indicies könnte z.B. ein Zeiger auf void sein, der von malloc() geliefert wurde.
lemonstar hat folgendes geschrieben: | Ist die dritte Variante nicht der Orginalausdruck? |
Äh ja, mist, ich meinte natürlich: Code: | *++indexPtr = idx++; | |
Und dann finde mal solche Fehler in einem längeren Stück Code.
_________________ "Die Pentagon-Gang wird in der Liste der Terrorgruppen geführt"
Dann bin ich halt bekloppt.
"Wahrheit läßt sich nicht zeigen, nur erfinden." (Max Frisch)
|
|
Nach oben |
|
 |
lemonstar registrierter User
Anmeldungsdatum: 17.07.2003 Beiträge: 1004
|
(#897563) Verfasst am: 31.12.2007, 13:27 Titel: |
|
|
pyrrhon hat folgendes geschrieben: | kolja hat folgendes geschrieben: | Das ist vielmehr eine absolute Standardformulierung. |
Ich weiß. Solche Standardformulierungen sind dafür mitverantwortlich, dass so viele Programme so schlecht sind. |
_________________
eindrucksvolles
|
|
Nach oben |
|
 |
phoenix64 Entkommen.
Anmeldungsdatum: 24.09.2006 Beiträge: 203
Wohnort: Brazil
|
(#900581) Verfasst am: 04.01.2008, 04:31 Titel: |
|
|
Das liebe ich an C(++). 3 Codezeilen können einen Riesenthread auslösen.
Sollen wir jetzt noch über Klammersetzung diskutieren?
_________________ "If God exists, I hope he has a good excuse" - Woody Allen
|
|
Nach oben |
|
 |
kolja der Typ im Maschinenraum

Anmeldungsdatum: 02.12.2004 Beiträge: 16631
Wohnort: NRW
|
(#900755) Verfasst am: 04.01.2008, 12:52 Titel: |
|
|
Super Idee! Die einen Block markierenden geschweiften Klammern gehören in eine eigene Zeile:
Code: | if(a)
{
do_something();
}
else
{
do_whatever();
} |
_________________ Hard work often pays off after time, but laziness always pays off now.
|
|
Nach oben |
|
 |
lemonstar registrierter User
Anmeldungsdatum: 17.07.2003 Beiträge: 1004
|
(#900759) Verfasst am: 04.01.2008, 12:54 Titel: |
|
|
kolja hat folgendes geschrieben: | Super Idee! Die einen Block markierenden geschweiften Klammern gehören in eine eigene Zeile:
|
Nie im Leben!
So gehört sich das:
Code: | if(a) {
do_something();
} else {
do_whatever();
} |
_________________
eindrucksvolles
|
|
Nach oben |
|
 |
lemonstar registrierter User
Anmeldungsdatum: 17.07.2003 Beiträge: 1004
|
(#900779) Verfasst am: 04.01.2008, 13:10 Titel: |
|
|
Kann mir jemand diese Abbruchbedingung erklären?
Code: | int i;
main(){
for(; i["]<i;++i){--i;}"]; read('-'-'-',i+++"hell\o, world!\n",'/'/'/'));
}
read(j,i,p){
write(j/p+p,i---j,i/i);
} |
_________________
eindrucksvolles
|
|
Nach oben |
|
 |
kolja der Typ im Maschinenraum

Anmeldungsdatum: 02.12.2004 Beiträge: 16631
Wohnort: NRW
|
(#900788) Verfasst am: 04.01.2008, 13:17 Titel: |
|
|
Das ist doch eine der ersten Einreichungen für den IOCCC gewesen?
Gefunden, es ist der Eintrag von "anonymous" im Jahre 1984:
-> http://www.de.ioccc.org/years.html#1984
_________________ Hard work often pays off after time, but laziness always pays off now.
|
|
Nach oben |
|
 |
Yamato Teeist
Anmeldungsdatum: 21.08.2004 Beiträge: 4548
Wohnort: Singapore
|
(#900814) Verfasst am: 04.01.2008, 13:38 Titel: |
|
|
Ach wird das jetzt ein Unverständliche-C++-Programme-Sammelthread?
Ich wollt schon immer mal wissen, wie das da funktioniert:
Code: | #include <iostream>
int a=10000,b,c=2800,d,e,f[2801],g;
main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);} |
|
|
Nach oben |
|
 |
phoenix64 Entkommen.
Anmeldungsdatum: 24.09.2006 Beiträge: 203
Wohnort: Brazil
|
(#900824) Verfasst am: 04.01.2008, 13:49 Titel: |
|
|
Klammern: Lemonstar hat Recht, Kolja hat Unrecht.
Code: | int i;
main(){
for(; i["]<i;++i){--i;}"]; read('-'-'-',i+++"hell\o, world!\n",'/'/'/'));
}
read(j,i,p){
write(j/p+p,i---j,i/i);
} |
Womit zum Henker lässt sich sowas kompilieren? Vermutlich braucht man zum Code von 1984 auch den passenden Compiler von 1984.
Und die Abbruchbedingung verstehe ich nicht ansatzweise...
Eigentlich müsste "]<i;++i){--i;}" einfach nur einen Zeiger auf einen statischen String ergeben. Der wiederum wird als Index für i benutzt... aber das ist doch gar kein Array?!
_________________ "If God exists, I hope he has a good excuse" - Woody Allen
|
|
Nach oben |
|
 |
lemonstar registrierter User
Anmeldungsdatum: 17.07.2003 Beiträge: 1004
|
(#900828) Verfasst am: 04.01.2008, 13:52 Titel: |
|
|
kolja hat folgendes geschrieben: | Das ist doch eine der ersten Einreichungen für den IOCCC gewesen?
| Darauf hätte ich die Antwort auch gewusst
_________________
eindrucksvolles
|
|
Nach oben |
|
 |
|