2017-02-16 3 views
0

私はC言語を学習しており、私の割り当ては24ビットビットマップのサイズを変更することです。私がこれまで行ってきた:ビットマップとMallocを使用したセグメンテーションフォルト

-Correctly書かれたコードをコピーをし、ヘッダーに画像をリサイズし

-Correctly書かれたコードを更新し、垂直

-Paddingは、私が今持っているしたい

作品私の問題がある

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

}  

を(これはだった:私はそうのように、OUTFILEに時間fは彼を書くことができますので、それが仲介にリサイズラインを書きますデバッグツールを使って計算しました)、スキャンラインファイルに書き込む必要があるときはいつでも、私はすぐにセグメンテーションフォルトを取得します。 あまり前もってありがとうございました。コミュニティのガイドラインを破っていないことを確認しようとしましたが、失敗した場合は謝罪します。良いものを持っている!

答えて

1

あなたの問題はあなたがscanline(通常fopen(3)から得られるであろう)FILE*であることをコンパイラに言ったが、代わりにあなたには、いくつかを割り当てた

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

を示し、最も可能性の高いコードの最初の行に関連していますそのポインタに初期化されていないヒープメモリ。 scanlinefwrite(3)fputc(3)に渡すと、どこに書き込むのかを尋ねるのにFILEの情報が検索されますが、ジャンクが見つかります。

あなたがbiRGBTRIPLEの定義を示していないが、あなたはscanlineの正しい種類を決定し、おそらくfwritefputc呼び出しでoutptrためscanlineを変更する必要があるとして、多くのより多くを語ることは困難です。 FILE* scanline = fopen("scanline", "w")が正しいかどうかをコメント欄にあなたのフォローアップの質問は、あなたがscanlineは、ファイル、またはメモリバッファになりたいかどうかに依存しますについて

--EDIT--

。あなたのコードの前半では、ファイルとして扱うようですが、最後のforループでは、それをメモリバッファとして扱います。

+0

偉大な、私はそれだと思う!あなたが気にしないなら、私は迅速なフォローアップしか持っていません。私は今のようにその行を試しています: FILE * scanline = fopen(scanline、 "w"); –

+0

偉大な、私はそれだと思う!あなたが気にしないなら、私は迅速なフォローアップしか持っていません。私は今、そのような行をしようとしています:FILE * scanline = fopen(scanline、 "w"); 、これは私にunitializedエラーを与えます。また、biはBitmapinfoheaderのショートカットで、ピクセルの長さや幅などが定義されています.RGBTRIPLEはmicrosoft bmpヘッダーで定義されているピクセルカラーで、infileとoutfileの両方がFILEです。*私はそれがscanlineの型であるべきだと思います。助けてくれてありがとう、それはとても感謝しています! –

+0

fopenのパラメータと戻り値の型を見てください – Gerhardh

関連する問題