C言語関係掲示板

過去ログ

No30. mallocでintサイズを超えた場合


はじめまして。C言語を勉強している学生です。
とてもわかりやすいので、いつも参考にさせていただいています。

現在、学校の課題で3次元ボリュームデータを表示するプログラムをさくせいしているのですが
データの読み込のところで動作が遅くて困っています。
データは(unsigend char)型で256x256x248で区切りはなく、ひたすら一行にかかれています。

最初つくったプログラムは以下のようにつくっていたのですがなにぶん、遅くて困ってしまいました。
int             ng;
int             numread, dlen;
unsigned char   cval;
long            j=0, jx, jy, jz;

struct GridData{
        struct u{
           unsigned char *cfd;
        }u;
}*grid;


ファイルオープン部は省略


ng = 256*256*248;
dlen = sizeof(unsigned char);
grid->u.cfd = (unsigned char *)malloc(ng * dlen);

for(jz=0;jz<256;jz++){
for(jy=0;jy<256;jy++){
for(jx=0;jx<248;jx++){
numread = fread(&cval,dlen,1,fp);
grid->u.cfd[j++] = cval;
}
}
}

そこで以下のように一度に大量に読込むよう改善しようとしたのですが<br>
どうもうまくいきません。<br>

ng = 256*256*248;
ng2= 256*256;
dlen = sizeof(unsigned char);
grid->u.cfd = (unsigned char *)malloc(ng * dlen);
&cval = (unsiged char *)malloc(ng2 * dlen);

for(jz=0;jz<248;jz++){
numread = fread(&cval,dlen,256*256,fp);
grid->u.cfd[j] = cval;
j += 256*256;
}
エラーはループの中とcvalについて出ているようです。
もしよろしければご意見をおねがいします。


初めまして、ともじです。利用して頂いて嬉しいです。(^。^)

拝見したところ、malloc を使っていますが、これがまずいのではないでしょうか。
malloc の引数 size_t は 一般にunsigned int なので、一度に確保できる
エリアのサイズは unsigned int が2バイトの処理系ですと、65536バイト
までですよね。
256*256*248のエリアを一度に確保することは出来ません。このような場合には、
farmallocが使えるようでしたら、farmalloc を使ってみてください。
インタフェースやヘッダファイルは処理系によって異なるので、include
ファイルを検索してみてください。


さっそくのお返事ありがとうございます。
さっそくmallocのところを変えてプログラムを
書いてみます。
ご丁寧な対応ありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.8.8
Copyright(c) 2000-2002 TOMOJI All Rights Reserved