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

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

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

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

Q&A

解決済

2回答

1484閲覧

画像解析ソフト簡易版についてどう直せばいいのか、わからない。

Kino96

総合スコア11

C

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

0グッド

0クリップ

投稿2017/04/19 09:29

###前提・実現したいこと
プログラミング初心者です。
cで画像ファイルの解析かつ判断するソフトの簡易版を作成しています。
どうも検証をしたところfreadがセグメンテーションに引っかかるらしく、原因がよくわかりません。どうか原因と解決策を教えていただけませんか?
追記)拙い英語でコメントを書いています。どうぞ温かい目で笑

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

エラーメッセージ

###該当のソースコード

#include<stdio.h>
#include<stdlib.h>
#include<dirent.h>

int compare(unsigned int a,unsigned int b,int c) //approxicimation
{
int x,y;
x = a - c;
y = b - c;

if(x > y){
return 1;
} else{
return 0;
}
}

int main(int argc,char *argv[])
{
FILE *fpi;
struct dirent *dp;
DIR *dir1,*dir2; //file pointa
unsigned int average1=0,average2=0; //各画像の色彩データの平均値
int sample = 0;

int i=0,j=0;//the number of the file in the current direct

/* Command sentence checker */
if(argc != 4){
fprintf(stderr,"Usage: %s [input][input][output]\n",argv[0]);
exit(1);
}

if((dir1=opendir(argv[1])) == NULL){
fprintf(stderr,"input file open error\n");
exit(1);
}
if((dir2=opendir(argv[2])) == NULL){
fprintf(stderr,"input file open error\n");
exit(1);
}
if((fpi=fopen(argv[3], "rb")) == NULL){
fprintf(stderr,"input file open error\n");
exit(1);
}

/* materials file sort program */

do{
dp=readdir(dir1);
unsigned char idat=0;
fread(&idat,sizeof(unsigned char),1,(FILE *)dp);
average1 += idat;
i++;
}while(dp!=NULL);

average1 = average1/i; // the result of image sort printf("2\n");

for (dp=readdir(dir2);dp!=NULL;dp=readdir(dir2)){
unsigned char idat=0;

average2 += idat; j++;

}
average2 = average2/j; //the result of image sort

/* read of the sample */ unsigned char idat=0; fread(&idat,sizeof(unsigned char),1,fpi); sample = idat; /* compare between the sample and the result of the images study */ if(compare(average1,average2,sample)== 1){ puts("the image is similar with the former dirent"); } else{ puts("the image is similar with the latter dirent"); } closedir(dir1); closedir(dir2); fclose(fpi); return 0;

}

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報画像ファイル

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

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

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

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

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

guest

回答2

0

ベストアンサー

dpはdirent構造体へのポインターですがdirentは例えキャストしてもFILEとは違うものですので、FILE*を要求する関数の引数に渡すとNGです。まったく違う構造体へのポインターをキャストしてfreadへ渡したため不当な情報を参照して動いてしまい、おかしなメモリーアドレスをアクセスした結果segmentation faultになっていると思います。

キャストはint->doubleなどのプリミティブ型どうしの変換を除くとキャスト前後の型が同一の構造(=同じ機能を果たすもの)でなければいけないという点に注意するとよいと思います。

投稿2017/04/19 12:25

KSwordOfHaste

総合スコア18394

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

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

0

エラーは
fread(&idat,sizeof(unsigned char),1,(FILE *)dp);
ここでしょうか?

となると、構造体direntの読み込みはfreadでできるのでしょうか。
readdirで読み込むものだと思ってましたが。

上記無視してください。しっかりソース読み込みきれてなかったので

投稿2017/04/19 10:29

編集2017/04/19 10:33
ardin

総合スコア544

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

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

Kino96

2017/04/19 12:12

エラー文まで載せられれば良かったのですが、リセットしてしまったあとでしたのですいません。 よくわからないのですがgccのコンパイル時のエラー文に、freadに構造体direntのポインタを私自身が書いていて「型があっていない。」と言われたので、キャストで変更した次第です。 ディレクトリ内の複数の画像ファイルはreaddirで読み込めるのでしょうか?よくわかってないので教えていただければありがたいです。
ardin

2017/04/20 00:02

readdirはディレクトリの中身を読む(というか探索?)だけで、ファイルを開いてはくれません。 構造体dpが持つ変数にファイル名が格納されるので、 そこからファイル名を抜き出して、開くという作業が必要でしょう エラーの理由はKSwordOfHasteさんが答えているとおりだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問