3

ご迷惑をおかけして申し訳ありませんが、もう長い間立ち往生しています。freadで次の警告が表示されます:「警告:「fread」の引数1を渡すと、キャストなしで整数からポインターが作成されます」
Cは初めてで、本当に気に入っていますが、これを乗り越えないでください。
前もって感謝します。

    typedef unsigned char byte;

    int main( int argc, char *argv[]){
        FILE * filein;
        filein = fopen(argv[1], "r" );
        int width=10;
        int height=10;
        byte ** data;

        // Allocation
        data = (byte **) malloc(height*sizeof(byte *));
        for(int i=0;i<height;i++){
            data[i]=(byte *) malloc(width*sizeof(byte));
        }

        for(int i=0;i<height;i++){
            for(int j=0;j<width;j++){
                fread(data[i][j], sizeof(const char), 1, infile);
            }
        }

        for(int i=0;i<height;i++){
            free(data[i]);
        }
        free(data);
        fclose(filein);

        return 0;
        exit(0);
    }

これは実際のプログラムのほんの一部です。タスクは、バイナリpgm-imageを読み取り、それをdata-matrixに格納し、値を正規化して、新しいバイナリpgm-imageに書き込むことです。

4

3 に答える 3

6

fread()は、バッファへのvoid*ポインタを想定しています。要素data[i][j]へのポインタではなく、data[i][j]に格納されているを渡します。

を使用してみてください

fread(&data[i][j], sizeof(const char), 1, infile);

ちなみに、.pgmファイル形式(これなら)にはヘッダーがあり、width*height文字だけを読み取るだけでは不十分です。ピクセル値もスペースで区切られているため、少し解析する必要があります。また、行末記号もスペースを取ることに注意してください(.pgmは1行に70文字を超えることはできません)

于 2012-06-29T19:57:06.817 に答える
3

data[i][j]のタイプはバイトです。それはポインタではありません。一度に1バイトを読み取る場合、本当に必要なのは&data[i][j]に読み取ることです。

于 2012-06-29T19:56:54.927 に答える
0

単一の文字を読み取るには、次のことができます

int c; // not char, because it must be able to hold EOF
c = getc(infile);
if( c == EOF ){
   // do something about error or premature EOF
}
data[i][j] = c;

これは主に、コードが実行しないエラーチェックが原因でより冗長になります。

于 2012-06-29T21:03:39.810 に答える