Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 09, 2025 20:10

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Pointerproblem
BeitragVerfasst: So Mär 04, 2007 19:30 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
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:
  1.  
  2. // Write the vertices of the heightmap directly to VRAM
  3. for x := 0 to Resolution-2 do
  4.  for z := 0 to Resolution-2 do
  5.   begin
  6.   for i := 0 to 3 do
  7.    begin
  8.    Vertex[i,0] := (X + VertPos[I][0])/Resolution*Size-Size/2*Ratio;
  9.    Vertex[i,2] := (Z + VertPos[I][1])/Resolution*Size-Size/2;
  10.    Vertex[i,1] := HeightData[X + VertPos[I][0],Z + VertPos[I][1]]*4;
  11.  
  12.    VPointer    := VBOPointer;
  13.    VPointer^.X := Vertex[i,0];
  14.    VPointer^.Y := Vertex[i,1]*0.0015;
  15.    VPointer^.Z := Vertex[i,2];
  16.    VPointer^.S := (Vertex[i,0]-Size*Ratio/2)/(Size*Ratio);
  17.    VPointer^.T := (-Vertex[i,2]-Size/2)/Size;
  18.  
  19.    inc(Integer(VBOPointer), SizeOf(TVertex));
  20.    inc(VBOSize);
  21.    end;
  22.   end;
  23.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointerproblem
BeitragVerfasst: So Mär 04, 2007 19:50 
Offline
DGL Member

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

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 04, 2007 19:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Der Zeiger wird am Ende des Schleifendurchgangs erhöht, zeigt also eine Speicherstelle weiter. Deshalb wird da nix gelöscht.

Das gehört aber zur Thematik "Zeigerarithmetik" und deshalb verschiebe ich das mal.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 04, 2007 22:13 
Offline
DGL Member
Benutzeravatar

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:
  1. // In einem seperaten TVertex werden die Daten vorbereitet.
  2. // Da die Daten unten mehrfach gebraucht werden macht das durchaus sinn.
  3. // So muss man Vertex[i,0] nur einmal berechnen.
  4. Vertex[i,0] := (X + VertPos[I][0])/Resolution*Size-Size/2*Ratio;
  5. Vertex[i,2] := (Z + VertPos[I][1])/Resolution*Size-Size/2;
  6. Vertex[i,1] := HeightData[X + VertPos[I][0],Z + VertPos[I][1]]*4;
  7.  
  8. // Dort wird die Adresse auf die VBOPointer zeigt in VPointer geladen.
  9. VPointer    := VBOPointer;
  10.  
  11. // Die Vertexdaten werden in den echten Speicher kopiert
  12. VPointer^.X := Vertex[i,0];
  13. VPointer^.Y := Vertex[i,1]*0.0015;
  14. VPointer^.Z := Vertex[i,2];
  15. VPointer^.S := (Vertex[i,0]-Size*Ratio/2)/(Size*Ratio);
  16. VPointer^.T := (-Vertex[i,2]-Size/2)/Size;
  17.  
  18. // Hier wird die Adresse von VBOPointer um die Größe von TVertex erweitert
  19. inc(Integer(VBOPointer), SizeOf(TVertex));
  20.  
  21. // Rest
  22. 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.
Code:
  1. Vertex[i,0] := (X + VertPos[I][0])/Resolution*Size-Size/2*Ratio;
  2. Vertex[i,2] := (Z + VertPos[I][1])/Resolution*Size-Size/2;
  3. Vertex[i,1] := HeightData[X + VertPos[I][0],Z + VertPos[I][1]]*4;
  4.  
  5. VBOPointer^.X := Vertex[i,0];
  6. VBOPointer^.Y := Vertex[i,1]*0.0015;
  7. VBOPointer^.Z := Vertex[i,2];
  8. VBOPointer^.S := (Vertex[i,0]-Size*Ratio/2)/(Size*Ratio);
  9. VBOPointer^.T := (-Vertex[i,2]-Size/2)/Size;
  10. inc(VBOPointer);
  11. inc(VBOSize);


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 04, 2007 22:36 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
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:
  1.  
  2.  X:=1:
  3.  P:=@X;
  4.  write(P^); //->1
  5.  P^:=2;
  6.  write(X); // ->2
  7.  

mit inc(p) erhöhst du den zeiger, er zeigt also auf eine stelle im arbeitsspeicher direkt hinter der alten adresse.[/pascal]


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]