質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

6回答

2044閲覧

strtolが使えない

Anfaenger

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2021/10/31 12:07

編集2021/10/31 12:25

char*で宣言したarrayにstrtolを使って、longで宣言したarrayiに代入しようと
したのですが、_p!=nullptrとエラーが出てうまくいきません。

C++

1struct Arrays{ 2 char* array[ex][ey][3]; 3 long arrayi[ex][ey][4]; 4} 5~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 7 Arrays arrays; 8         fp = fopen(file, "rb"); 9 fread(header, 1, 54, fp); 10 for (int i = 0; i < ex; i++) { 11 for (int j = 0; j < ey; j++) { 12 for (int k = 0; k < 3; k++) { 13 fread(&arrays.array[i][j][k], sizeof(int), 1, fp); 14 } 15 } 16 } 17 for (int i = 0; i < ex; i++) { 18 for (int j = 0; j < ey; j++) { 19 for (int k = 0; k < 3; k++) { 20 arrays.arrayi[i][j][k] = strtol(arrays.array[i][j][k], (char**)NULL, 10); 21 } 22 } 23 }

どなたかご教示お願いします…。

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

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

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

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

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

otn

2021/10/31 12:11

配列の変数宣言部分も示してください。
episteme

2021/10/31 12:14

array[][][] の型は?
episteme

2021/10/31 12:17

arrays.array[i][j][k] には longに変換可能な文字列がちゃんと入っていますか? 確認しましたか?
pepperleaf

2021/10/31 12:18

もしかして、char array[ex][ey][3]; ということ? そしたら、当然、エラー。
Anfaenger

2021/10/31 12:26

char* array[ex][ey][3]で宣言しているのですがエラーになります… 文字列は入っていると思うのですが、freadを使い慣れておらずもしかしたら間違っているかもしれません
episteme

2021/10/31 12:29

> 文字列は入っていると思うのですが printfでもすればわかるでしょ。なんで確認せんのですか?
Anfaenger

2021/10/31 12:34

>printfでもすればわかるでしょ coutで出してみたのですが、コード -1073741819 で終了してしまいます。
episteme

2021/10/31 12:38 編集

「文字列は入っていると思うのですが」がマチガイだった、と。 なら strtol がどーのこーの以前の問題です。変換不能な文字列を渡してるんだから。
Anfaenger

2021/10/31 12:50

もう少し文字列が入ってるかどうか確認してみます。
jimbe

2021/10/31 12:57 編集

バイナリモードのファイルから char* に sizeof(int) で文字列を読み込んでいるそうなのでめちゃくちゃでしょう。 array を char にしてもう1次元追加する必要があるのでは。
Anfaenger

2021/10/31 13:23

>バイナリモードのファイルから char* に sizeof(int) で文字列を読み込んでいるそうなのでめちゃくちゃでしょう。 >array を char にしてもう1次元追加する必要があるのでは。 やってみたのですが、読み込んだデータがめちゃくちゃになって文字化けしていました。
jimbe

2021/11/01 19:53 編集

「やってみた」ではこちらには全く修正内容が分かりませんが。 それと、いったいどのようなファイルを読んで arrayi に入れようとしているのでしょうか。ex,ey は幾つになっているのでしょう。
guest

回答6

0

ベストアンサー

BMP ファイルを対象にしたプログラムなのでしたら、そのようにご質問に書かれていればもっと簡単にお話が進んだと思うのですが…。

BMP のフォーマットの中でも一部に限定するとしてヘッダ解析を飛ばしてあるとしまして、まず strtol は不要ですから arrayi は無くすものと考えます。

array が 3 次元なのは 幅・高さ・RGB(各1バイト)でしょう。
なら最小単位は R・G・B の各バイトですので array の型は (char*では無く) char でなければならないです。(なぜポインタにしているのか謎です。)
それを 3 重ループで読むのであれば、 fread では 1 バイトずつ読むことになるはずです。
読み込むサイズは (sizeof(int) では無く) sizeof(char) もしくはすっきり 1 と書くことになります。
…としましたが。
どうせ連続して配列の大きさ分を全部読むのでしたら、ちまちま 1 バイトずつ読まなくても header のように丸ごと前部読んでしまえば簡単ではないでしょうか。

投稿2021/11/01 20:21

編集2021/11/01 20:34
jimbe

総合スコア13209

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

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

Anfaenger

2021/11/03 06:22

ありがとうございます!それで解決しました!
guest

0

BMPファイルのデータはバイナリであり文字列ではありませんから、
strtol を使うことは全くの見当違いです。

投稿2021/11/01 13:05

kazuma-s

総合スコア8224

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

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

0

freadは基本的にはバイナリーデータを読むために使います。

文字列データを読みたいのなら、fgetsとか、fscanfとかを、入力ファイルの形式に合わせて使います。

投稿2021/10/31 12:39

otn

総合スコア85901

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

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

Anfaenger

2021/10/31 12:49

bmpファイルなのでバイナリデータを読み込めばRGB値(0~255)が出てくると思ったのですが、違うのでしょうか?文字列として読み込んだほうがいいですか?
otn

2021/10/31 13:11

ああ、バイナリデータなのであれば、strtol するのがおかしいです。 strtolしているので、てっきり文字列データだと思いました。
Anfaenger

2021/10/31 13:21

バイナリデータのbmpをfreadで読み込んだのですが、int arrayだと値が4302920みたいにおかしな数字になってしまいます。なのでchar型で宣言してそこにfreadでarrays.arrayに格納しました。てっきり文字列の扱いになっていると思ってstrtolを使ってしまいました。
otn

2021/10/31 13:31

BMPファイルを読むのであれば、ファイルフォーマットをちゃんと理解してないといけませんが、 > int arrayだと値が4302920みたいにおかしな数字になってしまいます。 と言っている時点で、理解の入り口にすら立ってない気がしますので、かなりスキルアップしないと駄目でしょうね。
Anfaenger

2021/10/31 13:44

ヘッダもきちんと飛ばして読み込んでいるんですが、unsigned char arrayにしてfread(arrays.array[i][j][k], sizeof(char), fp)にしているのに文字化けしてしまうんです。これでも間違っているんでしょうか…?
otn

2021/10/31 13:51

読んだ後それをどう解釈するかですね。
Anfaenger

2021/10/31 14:00

…どういう意味でしょうか?すみません、ヒントをください
otn

2021/10/31 14:05

> ファイルフォーマットをちゃんと理解してないといけません と書いたとおりです。理解すればどうしたらいいかわかるはずです。
episteme

2021/10/31 14:36

...formatもわからんデータを闇雲に読んでるのか。まるでデタラメやな。
guest

0

C++

1struct Arrays{ 2 char* array[ex][ey][3]; 3 long arrayi[ex][ey][4]; 4} 5... 6 fread(&arrays.array[i][j][k], sizeof(int), 1, fp);

arrays.array[i][j][k] には fread で読んだ文字列を格納できるだけの十分な領域が確保されていますか?

投稿2021/10/31 12:28

episteme

総合スコア16612

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

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

Anfaenger

2021/10/31 12:48

unsigned char*にしてみたのですが、今度はunsigned char*とconst char*との互換性がないと言われてしまいました
guest

0

arrayi[i][j][k] = strtol(array[i][j][k], (char**)NULL, 10);

strtol()の宣言を見ると、long strtol(const char *s, char **endptr, int base);
第一引数が、 char *で、戻り値がlong これに対し、~~同じ arrayi[i][j][k] を与えてる時点で不適切。 ~~
よく見ると、arrayarrayi で違った。すみません。


改めてみると、 array[][][]char *で定義されているけど、実体(実際の文字列を入れる領域)が無いみたいです。それを確保しないとダメでしょう。(書かれてないところにある?)
例えば、char array[ex][ey][3][50];とか。ただ、単純にそうしても ex,ey のサイズ次第でエラーになるかも。

投稿2021/10/31 12:22

編集2021/11/01 11:33
pepperleaf

総合スコア6385

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

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

Anfaenger

2021/10/31 12:24

すみません、知識不足で何が不適切なのかが分かりません。
episteme

2021/10/31 12:25

引数は array / 結果は arrayi で受けてるので、そこは問題なさげ
pepperleaf

2021/11/01 11:45

変数が違う事を見逃してました。他にもありそうですが、少しだけ、見直し。(多分、足りない)
guest

0

どー見ても使い方がおかしいです。
関数の仕様を調べてみては

投稿2021/10/31 12:13

y_waiwai

総合スコア88042

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

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

Anfaenger

2021/10/31 12:23

調べてみましたがどこが間違っているのか見当がつかず…すみません…
y_waiwai

2021/10/31 12:25

C言語 strtol、でぐぐれば、関数の仕様から使い方にサンプルコードまででてきますけど、どのあたりがわからないんでしょうか
Anfaenger

2021/10/31 12:26

それ通りにやっているつもりなのですが、全くエラーの箇所の検討がつかないのです。
y_waiwai

2021/10/31 12:36

その関数は、文字列を整数に変換するものです 関数の引数には、文字列のアドレスを与える必要があります
y_waiwai

2021/10/31 12:38

コードを見る限り、arrays.arrayには何も代入されてませんけど、ホンマに文字列のアドレスが入ってるんでしょうか
y_waiwai

2021/10/31 12:41

なんかどんどん質問文が変更されてますねw きちんと全文出るまで待つことにしますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問