100万バイト(1MB)ほど、画像処理用に確保したいのですが。。。

[戻る]
ちゃまいえ 2018/08/28(火) 10:38:07
ポインターがループしているうちに急にマイナスになってしまいます。
記述が間違っているでしょうか?
   FILE   *fA;           
   FILE   *fB;   
   int    Width,Height;
   int    x,y;      
   int    RGB;
   size_t    size = 1000000;
   char  *in  = (char *)malloc( sizeof(char) * size );
   char  *out = (char *)malloc( sizeof(char) * size );

   for (y=0;y<Height;y++)
       for (x=0;x<Width;x++)
          for (RGB=0;RGB<3;RGB++)
          {
             *(in+3*(y*Width+x)+RGB)  = fgetc(fA); <== 144 ループ目で、
             fputc(*(in+3*(y*Width+x)+RGB),fB); 収める側のaddressが読み取れず
          }


   fclose(fA);
   fclose(fB);

   free(in);
  free(out);

瀬戸っぷ [E-Mail] 2018/08/28(火) 13:22:03
とりあえず……HeightとWidthの値はいくつになっているんでしょう?

fAやfBが正常にオープンできているんですかね?
とか、
char  *outって結局使っていないよね?
とか、
fgetc()で読み込むよりはfread()で読み込んだ方が簡単じゃないかなぁ…
とかありますけど。

ITO 2018/08/30(木) 17:16:58
1MB = 2^20 = 1048576
オーバーすることも考えて1100000ぐらいに設定しておいた方がいいですね。
Visual-Cのスタックは、1MBだったとおもいます。
mallocではなくC++のnewもしくはwindowsの関数を使った方がいいですね。
画像処理に使うみたいですので4MBぐらい確保しておいた方が安全では?

ちゃまいえ 2018/09/03(月) 17:53:26
解答、遅くなりましてすみません。
皆様、ご回答、ありがとうございます。
HeightとWidthは、それぞれ、600くらいです。
4MBですね。やってみます。

PATIO 2018/09/29(土) 21:03:43
それぞれの変数の方に対して表現可能な数の上限、下限がありますので
それをきちんと理解して変数の方を決定する必要があります。
intという型は開発環境によってサイズが変わることがあるので
自分が使っている開発環境でintサイズが何バイトで表現可能な数の上限、下限が
いくつになるのかをちゃんと調べてみてください。

C++言語は変数の上限以上に数を増やそうとした時にどういう挙動になるのか
という点も勉強した方がよいと思います。
CやC++言語は、変数やメモリの管理を開発者が自前で行う必要があります。
確保している変数の領域を超えるようなデータの格納はメモリ内の他のデータを
破壊することもあり得ますので注意が必要です。
特にポインタを使っている場合、使っているアドレスをきちんと
理解したうえで使用しないとアクセスしてはいけない領域にアクセスして
データを破壊したり、プログラムが暴走したりしますので注意してください。

PATIO 2018/09/29(土) 21:04:53
あうあう。

誤)
それをきちんと理解して変数の方を決定する必要があります。

正)
それをきちんと理解して変数の型を決定する必要があります。

PATIO 2018/09/29(土) 21:07:42
あと、状況によってsignedとunsignedの使い分けが必要になる場合があります。

とにかくデータ型に関してはしっかり理解して自分が扱うデータが
変数に格納できる範囲を超えないようにコントロールしてください。

ちゃまいえ 2018/10/07(日) 07:36:05
[[解決]]
皆様、いろいろ、アドバイスありがとうございました。
お蔭様で、何とか、動くようになりました。

古いスレッドには追加発言できません。