唐突ですみません。
サイズが640*480の画像を180枚読み込むプログラムをポインタを使って作成しようと考えています。
以下で示すプログラムは画像を読み込むための作成したものですが、エラーが出てしまい実行することができません。
間違えている箇所があればご指摘お願いします。
また、そのほかに効率の良いやり方などがありましたらご教授願います。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define xsize 640
#define ysize 480
#define round 180
#include "Input.h"
void Input_task(unsigned char ***In);
void main()
{
static unsigned char ***In;
int i,j;
In=(unsigned char***)malloc(sizeof(unsigned char)*round);
for(i=0;i<round;i++)
{
In[i]=(unsigned char**)malloc(sizeof(unsigned char)*ysize);
for(j=0;j<ysize;j++)
{
In[i][j]=(unsigned char*)malloc(sizeof(unsigned char)*xsize);
}
}
Input_task(In);
}
Input.hの中身
void Input_task(unsigned char ***In)
{
char filename[30];
int i,j,k;
FILE *fp;
for(i=0;i<round;i++)
{
sprintf(filename,"b20_%04d.raw",i);
fp=fopen(filename,"rb");
for(j=0;j<ysize;j++)
{
for(k=0;k<xsize;k++)
{
*(*(*(In+i)+j)+k)=(unsigned char)getc(fp);
}
}
fclose(fp);
}
}
No.2ベストアンサー
- 回答日時:
★3次元配列のポインタ宣言が間違っています。
・3次元配列のポインタは『static unsigned char (*In)[ysize][xsize];』と宣言しますよ。
・ちなみに、3次元配列は『static unsigned char ln[round][ysize][xsize];』と同じになります。
・分かりますか?→多次元配列のポインタはなれないと難しいですよ。考え方が。宣言方法がね。
・『Input.h』内の『Input_task』の引数宣言も『unsigned char (*In)[ysize][xsize]』とします。
★その他
・640×480の画像を180枚ということは 55,296,000 バイト(約53Mバイト)ですよ。メモリ容量は大丈夫?
・『効率』良くというのならば、『getc』ではなく『fread』で一度に『640×480=307,200』バイトを
読み込みます。→メモリを確保しているので出来ますよ。あとは、180枚分をループして読み込みます。
・サンプルを載せておきます。解説しませんので読み取って下さい。
/* main関数のサンプル */
void main()
{
static unsigned char (*In)[ysize][xsize];
if ( (In = (unsigned char (*)[ysize][xsize])malloc(round * ysize * xsize)) == NULL ){
printf( "メモリが足りません。\n" );
exit( 255 );
}
Input_task( In );
free( In ); ←忘れずに!
}
/* Input.hの中身 */
void Input_task( unsigned char (*In)[ysize][xsize] )
{
char filename[30];
int i;
FILE *fp;
for ( i = 0 ; i < round ; i++ ){
sprintf( filename, "b20_%04d.raw", i );
if ( (fp = fopen(filename,"rb")) != NULL ){
fread( In[i], xsize, ysize, fp );
fclose( fp );
}
}
}
最後に:
・回答者 No.1 さんと同じくヘッダにはソースは記述してはいけません。→トラブルの原因になるから。
・また、単純に1次元配列を確保して自分で掛け算してアクセスするのも方法の1つですよ。
・以上。
この回答への補足
回答ありがとうございました。
実際まだポインタに慣れていないので、自分の理想とするものを作ることガで木津にいたのですが、この返答は理想に近いもので驚きました。
本当にありがとうございました。
No.1
- 回答日時:
>In=(unsigned char***)malloc(sizeof(unsigned char)*round);
In=(unsigned char***)malloc(sizeof(unsigned char **)*round);
>In[i]=(unsigned char**)malloc(sizeof(unsigned char)*ysize);
In[i]=(unsigned char**)malloc(sizeof(unsigned char *)*ysize);
InとIn[i]はポインタの配列ですよ。
私なら・・・
単純に一次元配列で確保して
unsigned char *In;
In = (unsigned char*)malloc(sizeof(unsigned char)*round*ysize*xsize);
Input_taskの代入部分
*In++ = (unsigned char)getc(fp);
後から参照する時は
In[i*ysize*xsize + j*xsize + k]
あと、ヘッダファイルにはプログラムは書かないですね。
的確な回答ありがとうございました。
確かに、一次元配列で確保したほうがいいですね。
まだ慣れていないせいもあり、苦労しているところですTT
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列内の数字削除
-
SetWindowTextについて。
-
構造体が戻り値の関数について...
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
new charとnew char[N]の違いは?
-
文字列str内の全ての数字を...
-
C言語において、以下の条件で...
-
strcat関数を自作したいです
-
ポインタを使用 [数字列を数値...
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
C言語で文字列をかえす正しい書...
-
文字の代入とコピーについて
-
小数点入りの文字列をfloat型に...
-
callocについて
-
'\\0'とはなんですか?
-
p = (char **)*p の意味
-
C言語を用いた環境変数の作成/...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報