🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1840閲覧

3次元データを順番に読み込み方法

ckoa

総合スコア5

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/09/24 11:45

前提・実現したいこと

3次元のvolumeデータ(xyz=100010001000)から
10001000(xy)の画像でz軸1番
10001000(xy)の画像でz軸2番
10001000(xy)の画像でz軸3番
の3枚の画像に同一処理をかけて連結させて保存します。

そのまま次は
10001000(xy)の画像でz軸4番
10001000(xy)の画像でz軸5番
10001000(xy)の画像でz軸6番
の3枚の画像に同一処理をかけて連結させて保存します。

これを繰り返します。

3次元volumeを2次元データ(1000個)にわけて
1000*1000の2次元画像3枚を同一処理かけて連結させて保存することはできています。
それを3次元のまま処理できるように改良しようと思っています。

発生している問題・エラーメッセージ

100010001000は大きすぎて配列にはいりません。
そのため、100010001000を読み込まずに、
最初は100010001と100010002と100010003を順番に読み込んで処理をかける方法を考えています。

どうすれば読み込みを順番にできるのでしょうか?

エラーメッセージ 配列が大きすぎる

該当のソースコード

float org[4][IMG_YSIZE][IMG_XSIZE][IMG_ZSIZE];
float tch[IMG_YSIZE][IMG_XSIZE][IMG_ZSIZE];

C++

1 2define IMG_XSIZE 1000 //画像Xサイズ 3#define IMG_YSIZE 1000 //画像Yサイズ 4#define IMG_ZSIZE 1000 //画像Zサイズ 5#define PIXEL_BYTE 1 //画像タイプ 6 7//配列確保 8float org[4][IMG_YSIZE][IMG_XSIZE][IMG_ZSIZE]; 9float tch[IMG_YSIZE][IMG_XSIZE][IMG_ZSIZE]; 10 11void main() 12{ 13 int fd; 14 long fsize; 15 //入力 16 char inputfname[][256]="C:/work/animal/1000*1000*1000.raw"; 17 char nambar[]= "1"; 18 19 //出力 20 char head[]="C:/work/output/animal"; 21 char outputfname[256]; 22 23 読み込み 24 fd=open(input_fname[seq_no],O_RDONLY | O_BINARY);//ファイルのオープン 25 fsize=IMG_XSIZE*IMG_YSIZE*IMG_ZSIZE*PIXEL_BYTE; 26 read(fd,org[seq_no],fsize); 27 close(fd); 28 29 30 ///// 31 処理 32 ///// 33 34 35 出力 36 sprintf(output_fname,"8bit_%03d_1000x1000.raw",head,numbar); 37 fd=_open(output_fname,O_CREAT|O_RDWR|O_BINARY,_S_IREAD|_S_IWRITE); 38 fsize=IMG_XSIZE*IMG_YSIZE*IMG_ZSIZE*PIXEL_BYTE; 39 write(fd,patch,fsize); 40 close(fd); 41 42 43 return; 44} 45

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

read関数の第三引数が一度に読み込むサイズなのでを一度に処理したい分のバッファを確保してそこにそのサイズを指定すればよいです。読み込んだ分だけシーク位置が進むのでまた必要分、読み込めばいいです。

だいたいこんな感じです。

C

1int fd; 2static float buff[1*1000*1000] 3ssize_t read_len; 4 5fd = open(filename, O_RDONLY | O_BINARY); 6 7while( (read_len = read(fd, buff, sizeof(buff))) > 0){ 8 /* read_lenのサイズ分処理する */ 9} 10 11close(fd);

read - man page

投稿2019/09/24 12:11

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問