Seite 1 von 1

Compilercrash

Verfasst: 01.09.2009 21:47
von cxAlex
Dieser Code crasht den Compiler mit folgende Fehlermeldung:
Der Compiler scheint abgestürzt oder unerwartet beendet worden zu sein.

Er wird neu gestartet.



Bitte melden Sie die Umstände, welchen diesen Programmfehler verursachten.
Ich drücke auf F5, es kommt ein IMA bevor ich das Compilerfenster sehe und aus. Das komische ist das ich mir sicher bin das der Code vor 2 Stunden bevor ich im Training war funktioniert hat und ich seit dem nichts geändert habe?

PS:
Compiler - Optionen:
XP - Skin

Code: Alles auswählen

EnableExplicit

Structure _BMPPixel
  Green.c
  Red.c
  Blue.c
EndStructure

Structure _ColorTableEntry
  Entry.l[0]
EndStructure

Structure _RGBMasks
  Green.l
  Red.l
  Blue.l
EndStructure

Structure _Bitmap
  FileHeader.BITMAPFILEHEADER
  InfoHeader.BITMAPINFOHEADER
  RGBMask._RGBMasks
  *BMPData
  BMPDataSize.i
  *ColorTable._ColorTableEntry
EndStructure

Prototype BMP_FilterCB(*Pixel._BMPPixel)

; BMP - Laden
Procedure BMP_Load(File$)
  Protected hFile, *BMP._Bitmap, TableSize
  
  With *BMP
    hFile = ReadFile(#PB_Any, File$)
    If hFile
      *BMP = AllocateMemory(SizeOf(_Bitmap))
      
      ; Header laden
      ReadData(hFile, @\FileHeader, SizeOf(BITMAPFILEHEADER))
      ReadData(hFile, @\InfoHeader, SizeOf(BITMAPINFOHEADER))
      
      ; RGB - Masken laden
      If \InfoHeader\biCompression = #BI_bitfields
        ReadData(hFile, @\RGBMask, SizeOf(_RGBMasks))
      EndIf
      
      ; Farbtabelle laden
      If \InfoHeader\biClrUsed Or (\InfoHeader\biBitCount = 1) Or(\InfoHeader\biBitCount = 4) Or (\InfoHeader\biBitCount = 8) ; Farbtabelle (Bei 4 oder 8 ist 0 = max)
        If Not \InfoHeader\biClrUsed ; Maximum
          TableSize = Pow(2, \InfoHeader\biBitCount)
        Else
          TableSize = \InfoHeader\biClrUsed*SizeOf(Long)
        EndIf
        \ColorTable = AllocateMemory(TableSize)
        ReadData(hFile, \ColorTable, TableSize)
      EndIf
      
      ; Rohdaten laden
      FileSeek(hFile, \FileHeader\bfOffBits)
      If \FileHeader\bfOffBits
        \BMPDataSize = Lof(hFile)-\FileHeader\bfOffBits
        \BMPData = AllocateMemory(\BMPDataSize)
        ReadData(hFile, \BMPData, \BMPDataSize)
      EndIf
      
      CloseFile(hFile)
      ProcedureReturn *BMP
    EndIf
  EndWith
EndProcedure

; BMP - Speichern
Procedure BMP_Save(*BMP._Bitmap, FileName$)
  Protected hFile
  
  With *BMP
    hFile = CreateFile(#PB_Any, FileName$)
    If hFile
      ; Header Speichern
      WriteData(hFile, @\FileHeader, SizeOf(BITMAPFILEHEADER))
      WriteData(hFile, @\InfoHeader, SizeOf(BITMAPINFOHEADER))
      
      ; RGB Masken speichern
      If \InfoHeader\biCompression = #BI_bitfields
        ReadData(hFile, @\RGBMask, SizeOf(_RGBMasks))
      EndIf
      ; Farbtabelle speichern
      If \InfoHeader\biClrUsed
        WriteData(hFile, \ColorTable, \InfoHeader\biClrUsed*SizeOf(Long))
      EndIf
      
      ; Rohdaten speichern
      FileSeek(hFile, \FileHeader\bfOffBits)
      If \BMPData
        WriteData(hFile, \BMPData, \BMPDataSize)
      EndIf
      CloseFile(hFile)
      ProcedureReturn #True
    EndIf
  EndWith
EndProcedure

; Bitmapdaten kopieren
Procedure BMP_Copy(*BMP._Bitmap)
  Protected *NewBMP._Bitmap
  *NewBMP = AllocateMemory(SizeOf(_Bitmap))
  
  ; Copy BMP Data
  With *BMP
    *NewBMP\FileHeader = \FileHeader
    *NewBMP\InfoHeader = \InfoHeader
    *NewBMP\RGBMask = \RGBMask
    If \BMPData
      *NewBMP\BMPDataSize = \BMPDataSize
      *NewBMP\BMPData = AllocateMemory(\BMPDataSize)
      CopyMemory(\BMPData, *NewBMP\BMPData, \BMPDataSize)
    EndIf
    If \ColorTable
      *NewBMP\ColorTable = AllocateMemory(\InfoHeader\biClrUsed*SizeOf(Long))
      CopyMemory(\ColorTable, *NewBMP\ColorTable, \InfoHeader\biClrUsed*SizeOf(Long))
    EndIf
    
    ProcedureReturn *NewBMP
  EndWith
EndProcedure

; BMP - Freigeben
Procedure BMP_Free(*BMP._Bitmap)
  With *BMP
    If \BMPData
      FreeMemory(\BMPData)
    EndIf
    If \ColorTable
      FreeMemory(\ColorTable)
    EndIf
    FreeMemory(*BMP)
  EndWith
EndProcedure

Procedure BMP_Filter(*BMP._Bitmap, *CB.BMP_FilterCB)
  Protected row, col, pattern, *Pixel._BMPPixel, width, height
  
  With *BMP
    Select \InfoHeader\biBitCount
      Case 1, 4, 8
        
      Case 16
        
      Case 24
        Select \InfoHeader\biCompression
          Case #BI_bitfields
            ; Ungebräuchlich
            
          Case #BI_RGB
            pattern = \InfoHeader\biWidth%4 ; Füllpattern
            height = \InfoHeader\biHeight
            width = \InfoHeader\biWidth
            
            *Pixel = \BMPData
            
            For row = 1 To height
              For col = 1 To width
                ; # + (3*width + pattern)*(height-row) + (col*3) + 1
                *CB(*Pixel)
                *Pixel + SizeOf(_BMPPixel)
              Next
              *Pixel + pattern
            Next
            
          Case #BI_RLE8, #BI_RLE4
            ; Ungebräuchlich
            
        EndSelect
        
      Case 32
        
    EndSelect
  EndWith
EndProcedure

Procedure BMP_ConvertTo24Bit(*BMP._Bitmap)
  Protected *Pixel._BMPPixel, *p8Pixel._BMPPixel, *p8PixelEntry
  Protected pattern, height, width, row, col
  
  With *BMP
    Select \InfoHeader\biBitCount
      Case 1
        ; Noch zu erledigen
        
      Case 4
        ; Noch zu erledigen
        
      Case 8
        pattern = \InfoHeader\biWidth%4 ; Füllpattern
        height = \InfoHeader\biHeight
        width = \InfoHeader\biWidth
        
        *p8PixelEntry = \BMPData
        *Pixel = AllocateMemory(width*height*3)
        
        Select \InfoHeader\biCompression
          Case #BI_bitfields
            ; Ungebräuchlich
            
          Case #BI_RGB
            
            ; Umrechnen von 8 auf 24 Bit
            For row = 1 To height
              For col = 1 To width
                
                ; Wert aus der Farbtabelle holen
                *p8Pixel = \ColorTable\Entry[PeekC(*p8PixelEntry)]
                
                ; Wert direkt eintragen
                *Pixel\Red = *p8Pixel\Red
                *Pixel\Green = *p8Pixel\Green
                *Pixel\Blue = *p8Pixel\Blue
                
                ; Weiterzählen
                *p8PixelEntry + SizeOf(Byte)
                *Pixel + SizeOf(_BMPPixel)
              Next
              
              ; Pattern
              *p8PixelEntry + pattern
              *Pixel + pattern
            Next
            
            ; Farbtable entfernen, offset ändern
            \FileHeader\bfOffBits-(\InfoHeader\biClrUsed*SizeOf(Long))
            If \ColorTable
              FreeMemory(\ColorTable)
            EndIf
            \InfoHeader\biClrUsed = #Null
            \InfoHeader\biClrImportant = #Null
            \ColorTable = #Null
            
            ; Daten wechseln
            FreeMemory(\BMPData)
            \BMPData = *Pixel
            
            ; Neue Größe schreiben
            \BMPDataSize = width*height*3
            \InfoHeader\biSizeImage = \BMPDataSize
            
            ; Format - Infos ändern
            \InfoHeader\biBitCount = 24
            \InfoHeader\biCompression = #BI_RGB
            
          Case #BI_RLE8, #BI_RLE4
            ; Ungebräuchlich
            
        EndSelect
        
      Case 16
        ; Ungebrächlich, ev. noch erledigen
        
      Case 24
        ; Unnötig
        
      Case 32
        ; Ungebrächlich, ev. noch erledigen
        
    EndSelect
  EndWith
EndProcedure
Gruß, Alex

Verfasst: 01.09.2009 22:09
von Tur0k
// Alles entfernt

Ok, nur für Beta User :P
Sry ^^

Verfasst: 01.09.2009 22:10
von cxAlex
Der Code setzt mindestens PB 4.4b1 vorraus.

Gruß, Alex

Verfasst: 01.09.2009 22:30
von ts-soft
Bestätigt.

Windows-Version, XP-Style, x86, x64 usw. spielen keine Rolle.

Verfasst: 01.09.2009 22:32
von cxAlex
Ich habs gefunden:

Code: Alles auswählen

*NewBMP\FileHeader = \FileHeader
*NewBMP\InfoHeader = \InfoHeader
*NewBMP\RGBMask = \RGBMask 
mag der Compiler nicht,

Code: Alles auswählen

CopyMemory(@\FileHeader, @*NewBMP\FileHeader, SizeOf(BITMAPFILEHEADER))
CopyMemory(@\InfoHeader, @*NewBMP\InfoHeader, SizeOf(BITMAPINFOHEADER))
CopyMemory(@\RGBMask, @*NewBMP\RGBMask, SizeOf(_RGBMasks))
aber schon. Sollte aber mit PB 4.4 gehen, bzw. der Compiler sollte so oder so nicht abstürzen.

Gruß, Alex

Verfasst: 01.09.2009 22:36
von ts-soft
> bzw. der Compiler sollte so oder so nicht abstürzen.
Darauf bezog sich meine Aussage, nach Fehlern hab ich nicht gesucht :mrgreen: