Compilercrash

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Compilercrash

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Beitrag von Tur0k »

// Alles entfernt

Ok, nur für Beta User :P
Sry ^^
Zuletzt geändert von Tur0k am 01.09.2009 22:12, insgesamt 1-mal geändert.
buuh* :D
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Der Code setzt mindestens PB 4.4b1 vorraus.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Bestätigt.

Windows-Version, XP-Style, x86, x64 usw. spielen keine Rolle.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten