アプリ版:「スタンプのみでお礼する」機能のリリースについて

レポートで1024×1024ピクセルの画像を、間引いて256×256の画像にしろというのが出されました。画像はrawファイルです。
それで、とりあえず画像を読み込んで、出力するプログラムを書いてみたんですが、コンパイルは出来るのに実行すると不正な処理とけいこくがでてきてしまいます。
ソースは

#include<stdio.h>
main()
{
unsigned char in[1024][1024],out[1024][1024];
FILE *fp;
int i,j;
fp=fopen("aaa.raw","rb");
fread(in,sizeof(unsigned char),1024*1024,fp);
fclose(fp);
for(i=0;i<1024;i++){
for(j=0;j<1024;j++)
out[i][j]=in[i][j];
}
fp=fopen("bbb.raw","wb");
fwrite(out,sizeof(unsigned char),1024*1024,fp);
fclose(fp);
}
です。
どこがいけないのかアドバイスいただきたいです。よろしくお願いします。

A 回答 (3件)

こんにちわ。


#2 のmuyoshid です。

取りあえず、もう少し小さい単位でread/write する方法のプログラムを
記載してますので、参考にしてみて下さい。
※ BUF_SZ の値を変更すると、read/write サイズを変更できます。

#include <stdio.h>
#define IN_FILE   "aaa.raw"
#define OUT_FILE  "bbb.raw"
#define BUF_SZ   8192    // Buffer Size
static int fcopy(FILE *, FILE *);

main()
{
  FILE  *rfp, *wfp;
  int   rinf;

  rfp = fopen(IN_FILE, "rb");
  if (((FILE *)NULL) == rfp) {
    printf("File \"%s\" cannot open.\n", IN_FILE);
    exit(-1);
  }
  wfp = fopen(OUT_FILE, "wb");
  if (((FILE *)NULL) == wfp) {
    printf("File \"%s\" cannot open.\n", OUT_FILE);
    exit(-1);
  }
  rinf = fcopy(rfp, wfp);
  fclose(rfp);
  fclose(wfp);
  printf("fcopy() = %d\n", rinf);
  exit(rinf);
}

static int
fcopy(FILE *rfp, FILE *wfp)
{
  unsigned char  in_buf[BUF_SZ], out_buf[BUF_SZ];
  int       rinf;

  while(!feof(rfp)) {
    rinf = fread((void *)in_buf, 1, BUF_SZ, rfp);
    if (rinf < 0) {
      printf("File read error.\n");
      return(-1);
    }
    memcpy((void *)out_buf, (void *)in_buf, BUF_SZ);
    rinf = fwrite((void *)out_buf, 1, rinf, wfp);
    if (rinf < 0) {
      printf("File write error.\n");
      return(-1);
    }
  }
  return(0);
}
    • good
    • 1
この回答へのお礼

わざわざありがとうございます。とても参考になりました。
何箇所か分からない関数もあったけど、なんとかなりました。
ありがとうございます。

お礼日時:2002/11/07 21:53

こんにちわ。



mickjey2 さんもおっしゃられていますが、Stack Orverflow の可能性
が高いですね。
→ ローカル変数が獲得される領域を超えて、変数を宣言したと言う事です。
解決策としては、
 1) malloc で領域を獲得する。
 2) in, out 変数をmain 関数の外で宣言する。
 3) 一気にデータを読まずに、もう少し小さい単位でデータをread/write する。
といったところでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
何とか動きました。

お礼日時:2002/11/06 15:26

>unsigned char in[1024][1024],out[1024][1024];


動的に malloc などで確保するようにしてみてください。

これでは一つの配列のサイズが、1Mbyteになります。
実行時にこのサイズが確保できていない可能性が高いです。

一般に静的に確保できる変数のサイズはそれほど大きくありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
お礼遅くなってすいません。mallocの使い方がわからなくて調べたりしてたら遅くなっちゃいました。
なんとか動きました。ありがとうございます。

お礼日時:2002/11/06 15:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!