1

CでBMPイメージ(グレースケール)を読み取り、値を配列に保存し、この配列を値がコンマで区切られた文字列に変換しようとしています。

私のプログラムはWindows764ビットでうまく機能しましたが、ライブラリの互換性の問題のためにWindowsXP32ビットに移行する必要がありました。

読み取る画像が1,750枚あり、それらすべてを1つの文字列に保存したいと思います。

プログラムを起動すると、509:番目の画像まで正常に動作し、その後、fread()が原因でセグメンテーション違反が発生します。これが私のコードです:

int i=0,j,k,num,len,length,l;
unsigned char *Buffer;
FILE *fp;
char *string,*finalstring;
char *query;
char tmp2[5],tmp[3];
query = (char *)malloc(sizeof(char)*200000000);
string = (char *)malloc(sizeof(char)*101376);
Buffer = (unsigned char *)malloc(sizeof(unsigned char)*26368);
 BITMAPFILEHEADER bMapFileHeader;
BITMAPINFOHEADER bMapInfoHeader;
length = 0;


  for (k =1;k<1751;k++)
    {
    strcpy(link,"imagepath");
    //here just indexing the images from 0000 to 1750
    sprintf(tmp2,"%.4d",k);
    strcat(link,tmp2);
    strcat(link,".bmp");


       fp = fopen(link, "rb");
       num = fread(&bMapFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
       num = fread(&bMapInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);
    //seek beginning of data in bitmap
     fseek(fp,54,SEEK_SET);
    //read in bitmap file to data

    fread(Buffer,26368,1,fp);
    l=0;

    for(i=1024;i<26368;i++)
    {
      itoa(Buffer[i],tmp,10);
      len = strlen(tmp);
      memcpy(string+l,tmp,len);
      memcpy(string+l+len,",",1);
      l = l+len+1;

    }

    memcpy(query,"",1);
    memcpy(string,"",1);
    printf("%i\n",k);

    }

ありがとう

4

4 に答える 4

1

3桁tmp[4];で終了0にします。また、?はどこにありfcloseますか?ファイルハンドルが不足していると思われます。確認してくださいfp != 0

于 2011-03-24T10:49:31.197 に答える
1

どこ101376から来たの?各バイトは、コンマを含む 10 進数として最大 5 文字を使用します (例: -127,)、5*26368is 131840.

于 2011-03-24T10:44:36.683 に答える
0
  1. デバッガーでプログラムを実行します。

  2. fread の呼び出しにブレークポイントを設定します -- k==507 で条件付きにします (これにより、fread が成功すると予想される場合に停止します)。

  3. プログラムがブレークポイントに到達したら、変数を調べて、fread に渡される内容を確認します。ブレークポイントにヒットした最初の 1 ~ 2 回は、値が適切になります。

  4. 次に 509 回目で、偽の値が fread に渡されていることに気付くでしょう。これらの偽の値がどこから来ているかを突き止めます。おそらく、偽の値が何であれ、設定されている変数に条件付きブレークポイントを設定します。

于 2011-03-24T12:56:28.473 に答える
0

呼び出しでキャストを取り除きmallocます。そして#include <stdlib.h>

使用している 64 ビット システムと 32 ビット システムの両方で、このプログラムの出力はどうなりますか?

#include <stdio.h>
int main(void) {
    printf("sizeof (int) is %d\n", (int)(sizeof (int)));
    printf("sizeof (int*) is %d\n", (int)(sizeof (int*)));
    return 0;
}
于 2011-03-24T11:11:57.083 に答える