2017-02-16 5 views
0

Ich lerne C und meine Aufgabe ist 24bit Bitmaps zu ändern. Was ich bisher getan haben:Segmentation Fault mit Bitmaps und Malloc

-Correctly geschriebenen Code, die Kopien und aktualisiert die Header

-Correctly Code geschrieben, der das Bild vertikal

das Auffüllen funktioniert Ich möchte jetzt

passt die Größe haben es schreibt, um die Größe veränderten Linien zu einem Middleman, damit ich ihn f mal auf die outfile schreiben kann, etwa so:

// save scanline 
FILE* scanline = malloc(sizeof(bi.biWidth) * sizeof(RGBTRIPLE)); 

// iterate over infile's scanlines 
for (int i = 0, biHeight = (abs(bi.biHeight)/f); i < biHeight; i++) 
{ 

    // iterate over pixels in scanline 
    for (int j = 0; j < (bi.biWidth/f); j++) 
    { 
     // temporary storage 
     RGBTRIPLE triple; 

     // read RGB triple from infile 
     fread(&triple, sizeof(RGBTRIPLE), 1, inptr); 

     for(int z = 0; z < f; z++) 
     { 
      // write RGB triple to outfile 
      fwrite(&triple, sizeof(RGBTRIPLE), 1, scanline);     
     } 

    } 

    // Add Padding to Outfile 
    for (int k = 0; k < padding2; k++) 
    { 
     fputc(0x00, scanline); 
    } 

    // skip over padding, if any 
    fseek(inptr, padding, SEEK_CUR); 

    for(int s = 0; s < f; s++) 
    { 
     // write RGB triple to outfile 
     fwrite(scanline, sizeof(RGBTRIPLE), 1, outptr); 
    } 

}  

Mein Problem ist, (dies war mit einem Debugging-Tool herausgefunden), dass immer, wenn es in die Scanline-Datei schreiben muss, ich einen Segmentierungsfehler bekomme. Vielen Dank im Voraus und ich habe versucht, dafür zu sorgen, dass ich die Gemeinschaftsrichtlinien nicht verletze, aber wenn ich versagte, entschuldige ich mich. Hab einen Guten!

Antwort

1

Ihr Problem die meisten ist wahrscheinlich auf die erste Zeile des Codes im Zusammenhang zeigen Sie

// save scanline 
FILE* scanline = malloc(sizeof(bi.biWidth) * sizeof(RGBTRIPLE)); 

Sie haben den Compiler gesagt, dass scanline ist ein FILE* (die normalerweise von fopen(3) erhalten werden würde), sondern haben Sie einige zugewiesen nicht initialisierter Heapspeicher für diesen Zeiger. Wenn Sie dann scanline in fwrite(3) und fputc(3) passieren sie für FILE Informationen suchen, es zu sagen, wohin sie zu schreiben, wird aber Junk finden.

Es ist schwierig, viel mehr zu sagen, wie Sie zeigen nicht die Definition von bi und RGBTRIPLE, aber Sie müssen den richtigen Typ für scanline und wahrscheinlich scanline für outptr in den fwrite und fputc Anrufe ändern bestimmen.

--EDIT--

In Bezug auf Ihre Follow-up-Frage in den Kommentaren, ob FILE* scanline = fopen("scanline", "w") korrekt ist, wird davon abhängen, ob Sie scanline wollen eine Datei oder ein Speicherpuffer sein. In der ersten Hälfte deines Codes scheinst du es als Datei zu behandeln, aber in der letzten for Schleife behandelst du es als Speicherpuffer.

+0

Große, ich glaube, das ist es! Wenn es dir nichts ausmacht, habe ich nur eine kurze Folge. Ich versuche jetzt diese Zeile wie folgt: FILE * scanline = fopen (Scanline, "w"); –

+0

Großartig, ich denke das war's! Wenn es dir nichts ausmacht, habe ich nur eine kurze Folge. Ich versuche jetzt diese Zeile so: FILE * scanline = fopen (Scanline, "w"); Das gibt mir jedoch einen unitären Fehler. Außerdem: bi ist eine Abkürzung für Bitmapinfoheader, wo Dinge wie Länge und Breite in Pixeln definiert sind, RGBTRIPLE ist die Pixelfarbe wie von Microsofts bmp Header definiert und sowohl die Infile als auch die Outfile sind FILE * Ich denke, das sollte der Typ für Scanline sein. Danke für Ihre Hilfe, es wird sehr geschätzt! –

+0

Bitte sehen Sie sich die Parameter und den Rückgabetyp von fopen an – Gerhardh