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

Aktuelle Zeit: So Jul 06, 2025 00:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 06, 2003 15:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 10, 2002 10:54
Beiträge: 42
Also, ich bin echt am verzweifeln!
Ich habe mich endlich mal daran gewagt Texturen mit FreePascal zu machen, aber irgendwie wollte meine meine glaux unit nicht auf meinem PC eine Funktion rausrücken. Kurzerhand habe ich versucht selst ein paar Funktionen zu schreiben, die mir eine Textur laden sollten. Es kompiliert auch alles Fehlerlos, aber es gibt eine Exception.


Im Debugger bekomme ich folgendes mitgeteilt:
Code:
  1.  
  2.  
  3. Program received signal SIGSEGV, Segmentation fault.
  4.  
  5. $405418 in T24BITBITMAP__GETTGL_RGBA_BITMAP (this=$416dbc) at tex.pp:82
  6.  
  7. 82            AktuellerBereich^ := (Data + DataPosition)^;
  8.  
  9.  


Deswegen vermute ich, dass ich mit den Pointern mist gebaut habe, aber was ist falsch?

hier der Quelltext! (Ich weiß dass er nicht gut dokumentiert ist, sorry)

Code:
  1.  
  2.  
  3. {ASMMODE intel}
  4.  
  5. {$MODE OBJFPC}
  6.  
  7. program
  8.  
  9.    GlutLektion3FreePascal;
  10.  
  11. uses
  12.  
  13.    glut,     //für Openglfenster
  14.  
  15.    gl,       //OpenGL Unit (gl.... Befehle)
  16.  
  17.    glu,      //GL Utilities (glu... Befehle);
  18.  
  19.    Sysutils; //Dateihandlingbefehle
  20.  
  21. type
  22.  
  23. RGB = record
  24.  
  25.       R,
  26.  
  27.       G,
  28.  
  29.       B : Byte;
  30.  
  31.       end;
  32.  
  33. TBitMapHeader = record    //Header einer Bitmap Datei
  34.  
  35.              MyIdentifier : array[0..1] of char;
  36.  
  37.              FileSize,
  38.  
  39.              Reserved,
  40.  
  41.              BitmapDataOffset,
  42.  
  43.              BitmapHeaderSize,
  44.  
  45.              width,
  46.  
  47.              height : DWord;
  48.  
  49.              planes,
  50.  
  51.              bpp : Word;
  52.  
  53.              Compression,
  54.  
  55.              BitmapDataSize,
  56.  
  57.              HResolution,
  58.  
  59.              VResolution,
  60.  
  61.              Colors,
  62.  
  63.              ImportantColors : DWord;
  64.  
  65.              end;
  66.  
  67. TGLRGBABitmap = record
  68.  
  69.                 sizex,
  70.  
  71.                 sizey : integer;
  72.  
  73.                 Pixels  : Pointer;
  74.  
  75.                 end;            
  76.  
  77. T24BitBitmap = class
  78.  
  79.                public
  80.  
  81.                   procedure ReadfromFile (Filename : String); //Liest Bitmap aus Datei ein
  82.  
  83.                   function GetTGl_RGBA_BitMap : TGlRGBABitmap; //Wandelt T24BitBitmap in ein TGLRGBABitmap um, sollte OpenGL kompatibel sein.
  84.  
  85.                protected
  86.  
  87.                   Header : TBitMapHeader;
  88.  
  89.                   Data   : ^RGB;
  90.  
  91.                end;
  92.  
  93. procedure T24BitBitmap.Readfromfile(Filename : String);
  94.  
  95. var
  96.  
  97.    Datei : Longint;
  98.  
  99.    AnzahlPixel : cardinal;
  100.  
  101. begin
  102.  
  103.    if not FileExists(Filename) then
  104.  
  105.       begin
  106.  
  107.       writeln('Datei ', Filename,' existiert nicht. Beende Programm');
  108.  
  109.       readln;
  110.  
  111.       halt;
  112.  
  113.       end;
  114.  
  115.    Datei := FileOpen(filename, fmOpenRead);
  116.  
  117.    FileRead(Datei,Header,sizeOf(Header));
  118.  
  119.    AnzahlPixel := Header.width * header.height * 3;
  120.  
  121.    GetMem(Data,AnzahlPixel);
  122.  
  123.    FileRead(Datei,Data^,AnzahlPixel);
  124.  
  125.    FileClose(Datei);    
  126.  
  127. end;
  128.  
  129.  

hier ist die Wurzel allen übels
Code:
  1.  
  2.  
  3. function T24BitBitmap.GetTGl_RGBA_BitMap : TGlRGBABitmap;
  4.  
  5. var
  6.  
  7.    SpeicherGroesse : cardinal;
  8.  
  9.    Position : cardinal;
  10.  
  11.    DataPosition : cardinal;
  12.  
  13.    AktuellerBereich : ^RGB;
  14.  
  15. begin
  16.  
  17.    Result.SizeX := Header.Width;
  18.  
  19.    Result.SizeY := Header.Height;
  20.  
  21.   
  22.  
  23.    speichergroesse := Result.SizeX*Result.SizeY*4;
  24.  
  25.    GetMem(Result.Pixels,speichergroesse);
  26.  
  27.    DataPosition := 0;
  28.  
  29.   
  30.  
  31.    for Position := 0 to speichergroesse do
  32.  
  33.       begin
  34.  
  35.       AktuellerBereich := Result.Pixels + Position;
  36.  
  37.       AktuellerBereich^ := (Data + DataPosition)^; //FehlerFehlerFehlerFehlerFehlerFehlerFehlerFehlerFehler
  38.  
  39.       inc(Dataposition,3);
  40.  
  41.       inc(Position,3);
  42.  
  43.       if Position >= speichergroesse then
  44.  
  45.          exit;
  46.  
  47.       end;
  48.  
  49. end;
  50.  
  51. var
  52.  
  53.    Bild : T24BitBitmap;
  54.  
  55.    texture1 : TGlRGBABitMap;
  56.  
  57.    tex : GLuint;
  58.  
  59. procedure DrawGL; cdecl;
  60.  
  61. begin
  62.  
  63.    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  64.  
  65.    glLoadIdentity;
  66.  
  67.    glBindTexture(GL_TEXTURE_2D, tex);
  68.  
  69.    glTranslatef(0,0,-5);
  70.  
  71.    glBegin(GL_QUADS);
  72.  
  73.       glTexCoord2f(0,0); glVertex3f(-1,-1,0);
  74.  
  75.       glTexCoord2f(0,1); glVertex3f(-1,1,0);
  76.  
  77.       glTexCoord2f(1,1); glVertex3f(1,1,0);
  78.  
  79.       glTexCoord2f(1,0); glVertex3f(1,-1,0);
  80.  
  81.    glEnd;
  82.  
  83.  
  84.  
  85.    GlutSwapBuffers;
  86.  
  87. end;
  88.  
  89. procedure Tasten(key : byte; x,y : integer);
  90.  
  91.  
  92.  
  93. begin
  94.  
  95.    x:=x+y;
  96.  
  97.    case char(key) of
  98.  
  99.       'f','F': glutFullscreen;
  100.  
  101.       'Q','q': halt;
  102.  
  103.    end;
  104.  
  105.    writeln(key);
  106.  
  107. end;
  108.  
  109. {------------------------------------------------------------------}
  110.  
  111. {  Initialisierung von OpenGL                                      }
  112.  
  113. {------------------------------------------------------------------}
  114.  
  115. procedure InitGL; cdecl;
  116.  
  117. begin
  118.  
  119.   glEnable(GL_TEXTURE_2D);        // Aktiviert Texture Mapping
  120.  
  121.   glShadeModel(GL_SMOOTH);        // Aktiviert weiches Shading
  122.  
  123.   glClearColor(0.0, 0.0, 0.0, 0.5);    // Bildschirm löschen (schwarz)
  124.  
  125.   glClearDepth(1.0);         // Depth Buffer Setup
  126.  
  127.   glEnable(GL_DEPTH_TEST);        // Aktiviert Depth Testing
  128.  
  129.   glDepthFunc(GL_LEQUAL);        // Bestimmt den Typ des Depth Testing
  130.  
  131.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  132.  
  133.                                          // Qualitativ bessere Koordinaten Interpolation
  134.  
  135. end;
  136.  
  137.  
  138.  
  139.  
  140.  
  141. {------------------------------------------------------------------}
  142.  
  143. {  Behandelt Größenveränderung des Fensters                        }
  144.  
  145. {------------------------------------------------------------------}
  146.  
  147. procedure ResizeWndgl(Width, Height : Integer); cdecl;
  148.  
  149. begin
  150.  
  151.   if (Height = 0) then Height := 1;
  152.  
  153.   glViewport(0, 0, Width, Height);    // Setzt den Viewport für das OpenGL Fenster
  154.  
  155.   glMatrixMode(GL_PROJECTION);        // Matrix Mode auf Projection setzen
  156.  
  157.   glLoadIdentity();                   // Reset View
  158.  
  159.   gluPerspective(45.0, GLfloat(Width)/Height, 1.0, 100.0);  // Perspektive den neuen Maßen anpassen.
  160.  
  161.   glMatrixMode(GL_MODELVIEW);         // Zurück zur Modelview Matrix
  162.  
  163.   glLoadIdentity();                   // Reset View
  164.  
  165. end;
  166.  
  167.  
  168.  
  169.  
  170.  
  171. begin
  172.  
  173.    Bild := T24BitBitmap.Create;
  174.  
  175.    Bild.ReadfromFile('energy.bmp');
  176.  
  177.    texture1 := Bild.GetTGL_RGBA_Bitmap;
  178.  
  179.    Bild.Destroy;
  180.  
  181.   
  182.  
  183.    glGenTextures(1,@tex);
  184.  
  185.    glBindTexture(GL_TEXTURE_2D,tex);
  186.  
  187.    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  188.  
  189.    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  190.  
  191.    glTexImage2D(GL_TEXTURE_2D,0,3,texture1.sizeX,texture1.sizey,0,GL_RGBA,GL_UNSIGNED_BYTE,texture1.pixels);
  192.  
  193.   
  194.  
  195.    writeln('Vollbild mit F, beenden mit Q');
  196.  
  197.    GlutInit(@argc,@argv);
  198.  
  199.    glutInitWindowSize(400,400);
  200.  
  201.    glutInitWindowPosition(100,100);
  202.  
  203.    glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
  204.  
  205.    glutCreateWindow('OpenGL via Glut mit FreePascal.');
  206.  
  207.    glutReshapeFunc(@ResizeWndgl);
  208.  
  209.    glutDisplayFunc(@DrawGL);
  210.  
  211.    glutIdleFunc(@DrawGL); //Wird aufgerufen, wenn gerade kein Ereignis anfällt.
  212.  
  213.    glutKeyboardFunc(@Tasten);
  214.  
  215.    InitGl;
  216.  
  217.    GlutMainLoop;
  218.  
  219. end.
  220.  
  221.  

_________________
FreePascal unter Linux


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 16:24 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Code:
  1. AktuellerBereich^ := (Data + DataPosition)^;

Diese Zeile macht für mich nicht wirklich Sinn. Das Dächlein am Ende ist meines erachtens fehl am Platze. Es soll dort ja nicht auf einen "Inhalt" zugegriffen werden, sondern auf die "Variableninhalte"... arg.... kann es mal wieder nicht erklären, aber meines erachtens ist sowas bei Delphi sogar ungültig.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 16:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Beim überfliegen ist mir eine Sache aufgefallen.
Ist es nicht sinnvoller, wenn du gleich in Result.Pixels liest?
Also nicht erst über den Pointer AktuellerBereich.

Und noch eines, du iterierst von 0 bis zum Ende des Speichers.
An und für sich ist das ja nichts schlimmes. Aber in der Schleife erhöhst du die Pointer um 3.
Meines erachtens läuft er dir eiskalt aus deinem Speicherbereich raus, weil du zu viele Pixel lesen und schreiben willst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 16:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Mein Tipp: Schau mal in die Textures.pas von Jan Horn. Da findest du bestimmt was.
Zitat:
for Position := 0 to speichergroesse do
begin
...
inc(Position,3);
...
end;

Das geht ja gleich garnicht. Du kannst nicht einfach in einer for-Schleife den Durchlaufwert verändern. Wie's unter FreePascal ist weiß ich nicht, aber der Delphicompiler bemängelt diesen groben Fehler sofort.
Für 3er Schritte empfehle ich
Code:
  1.  
  2.  
  3. while Position <> speichergroesse do // bzw. <= oder >=
  4.  
  5. begin
  6.  
  7.  inc(Position, 3);
  8.  
  9. end;

Ansonsten, geht es mit For-Schleifen nur in Einerschritten.

Achja, eins noch:
Zitat:
Das Dächlein
auch Accent Circonflexe genannt. :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 17:35 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
@bluetoby: Weiß nicht wie es unter Delphi ist... aber mit genau der Aussage hat sich mein Info-Lehrer damals vor der gesamten Klasse blamiert, als er eine Aufgabe von mir als komplett falsch darstellen wollte und mir "5 minuten gab" um es zu beweisen... es geht hrhrhr

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Äääh... hä?
1. Wieso weißt du nicht wie es in Delphi ist?
2. Hat das Forum Mist gebaut und du bist DigitalVertex nicht Phobeus?
3. Mag sein, dass es geht, aber dazu hat man wohl die For-Schleife nicht erfunden...
In Delphi meldet der Compiler klipp und klar:
"Fehler: Befehl für For-Schleifenvariable 'i'"
Was wurde denn da im Infountericht gelehrt? FreePascal?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 18:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 10, 2002 10:54
Beiträge: 42
1. Phobeus will sicher damit ausdrücken dass er nicht weiß wie Delphi darauf reagiert.
2. Das Forum hat keinen Fehler gemacht.
3. Ich weiß nicht was Phobeus in seinem Info Unterricht hatte, aber warscheinlich war der Lehrer TP geeicht.

PS: Wenn dann um 4 erhöhen.

Aber das Problem hat sich nun erübricht.

_________________
FreePascal unter Linux


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 20:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
sorry, ich befand mich in einer geisten Umnachtung :wink:
Da das Prob eh gelöst ist hat keiner mehr ein Problem... hoffe ich :wink:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.010s | 15 Queries | GZIP : On ]