1)So als erstes mal ne allgemeine Frage zu Pointern.
P := @X;
so adressier ich ja den Pointer
Was ist aber der unterschied zu dem ?
P^:=X ; ??
2) dann hab ich zu diesem Quelltext noch ne Frage : (is ausm fertigen Vertexprogramm)
und zwar zur Stelle VPointer := VBOPointer ;
Was wird da genau gemacht ? .. Das ziel ist doch alle Daten auf den VBOPointer zu speichern oder nicht ?
wird das nicht bi jedem sdchleifen durchgang gelöscht ?
kenn mich leider mit Pointern nicht so aus.
nur grob
Code:
// Write the vertices of the heightmap directly to VRAM
Registriert: Sa Okt 22, 2005 20:24 Beiträge: 291 Wohnort: Frauenfeld/CH
simon1988 hat geschrieben:
1)So als erstes mal ne allgemeine Frage zu Pointern. P := @X; so adressier ich ja den Pointer Was ist aber der unterschied zu dem ? P^:=X ; ??
also beim ersten ist X kein Pointer und P ist einer. @X ist aber ein Pointer.
wenn du aber P^ machst, dann wird P dereferenziert. Das heisst, von P wird der richtige Speicherbereich angegeben. Wenn du aber P^ z.B. = nil ist, dann wird es vermutlich zu einer exception kommen, da dann auf einen ungültigen speicherbereich geschrieben wird.
beim zweiten bin ich etz zu faul zum durchlesen, sry
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also um noch etwas weiter auszuholen. Ein Pointer zeigt auf eine Stelle im Speicher. Wenn man zu diesem einen Wert hinzufügst, dann verschiebst du die Stelle auf die er Zeigt. Deswegen auch Zeiger. Wie Gaugler schon sagt mit @ bekommst du die Adresse einer Variable und nicht dessen Wert und mit ^ bekommst du die Daten die hinter einem Zeiger stecken.
Ich mache das mit dem Code mal anders. Ich kommentiere das inline. Ist einfacher für mich.
Code:
// In einem seperaten TVertex werden die Daten vorbereitet.
// Da die Daten unten mehrfach gebraucht werden macht das durchaus sinn.
// Hier wird die Adresse von VBOPointer um die Größe von TVertex erweitert
inc(Integer(VBOPointer),SizeOf(TVertex));
// Rest
inc(VBOSize);
Wenn du mich fragst ist das unnötig umständlich gemacht. Ich denke VBOPointer ist ein ganz normaler Pointer (sieht man leider nicht) wärend VPointer ein Pointer auf einen TVertex ist. Wenn man aber VBOPointer als PVertex deklariert, dann kann man die Daten direkt auf VBOPointer zuweisen. Wenn man dann Inc(VBOPointer) aufruft, dann vergrößert Delphi automatisch den Pointer um 1 * die Größe von TVertex. In dem Code wird der Pointer als Integer behandelt und dann manuell die Größe drauf gerechnet. Ist in meinen Augen unnötig kompliziert.
Wenn VBOPointer vom Typ PVertex ist dann funktioniert folgendes genau so gut.
PS: Falls das jetzt zu kompliziert war scheue dich nicht zu fragen. Bei Pointern muss man erst einmal den Sinn verstehen. Dann ist alles ganz einfach. Und sehr mächtig.
Ein Pointer ist in etwa das selbe wie eine Verknüpfung(Link) auf eine stelle im Arbeitsspeicher. Mit P:=@X; Sagst du dem zeiger dass er auf x zeigen soll. Mit P^ greifst du auf das ziel von p zu. Also wenn du z.B. folgenden code ausführst:
Code:
X:=1:
P:=@X;
write(P^);//->1
P^:=2;
write(X);// ->2
mit inc(p) erhöhst du den zeiger, er zeigt also auf eine stelle im arbeitsspeicher direkt hinter der alten adresse.[/pascal]
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.