標準偏差を求める計算の途中でセグメンテーションエラー。。。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Tatsu

標準偏差を求める計算の途中でセグメンテーションエラー。。。

#1

投稿記事 by Tatsu » 5年前

こんにちは、C言語初心者です。下記のプログラムでセグメンテーションエラーが生じてしまいつまづいてしまいました。
image.jpgの画像データを求めるプログラミングです。
jpegioは独自のライブラリとなっています。
平均を出す迄は上手くいったのですが、その後の標準偏差でエラーが出てしまいます。
2回目のforのループが原因だとは思うのですが、どう対処すればいいでしょうか。
宜しくお願いします。

/*画像のR,G,Bの平均と標準偏差を求めるプログラム*/

#include "jpegio.h"
#include <math.h>

int main()
{
char *filename = "image.jpg";
BYTE *data = NULL;
int imageSize = 0;
int i;
int imageWidth = 0, imageHeight = 0;
double SumR = 0, SumG = 0, SumB = 0;
double averageR =0, averageG =0, averageB = 0;
double tempR = 0.0, tempG = 0.0, tempB = 0.0;
double R_deviation = 0.0, G_deviation = 0.0, B_deviation = 0.0;

imageWidth = readHeader(filename, IMAGE_WIDTH);
imageHeight = readHeader(filename, IMAGE_HEIGHT);

imageSize = readJpeg(filename, &data);

if (imageSize == 0) return 1;

/*----平均を求める計算式----*/

for(i = 0; i < imageWidth * imageHeight; i += 1){
SumR += data[3*i];
SumG += data[3*i + 1];
SumB += data[3*i + 2];
}

averageR = SumR / (imageWidth * imageHeight);
averageG = SumG / (imageWidth * imageHeight);
averageB = SumB / (imageWidth * imageHeight);

/*----平均の結果の出力----*/

fprintf(stdout, "averageR:%.1f averageG:%.1f averageB:%.1f\n",
averageR, averageG, averageB);



/*----標準偏差を求める計算式----*/

for(i = 0; i < imageWidth * imageWidth; i += 1){
tempR += (data[3*i] - averageR) * (data[3*i] - averageR);
tempG += (data[3*i+1] - averageG)*(data[3*i+1] - averageG);
tempB += (data[3*i+2] - averageB)*(data[3*i+2] - averageB);
}

R_deviation = sqrt(tempR / (imageWidth * imageHeight));
G_deviation = sqrt(tempG / (imageWidth * imageHeight));
B_deviation = sqrt(tempB / (imageWidth * imageHeight));

/*----標準偏差の結果の出力----*/

fprintf(stdout, "deviationR:%.1f deviationG:%.1f deviationB:%.1f\n",
R_deviation, G_deviation, B_deviation);

free(data);

return 0;
}


+++++出力結果+++++
averageR:163.7 averageG:172.6 averageB:165.3
Segmentation fault: 11

Tatsu
記事: 4
登録日時: 5年前

Re: 標準偏差を求める計算の途中でセグメンテーションエラー。。。

#2

投稿記事 by Tatsu » 5年前

すみません、初めてこの掲示板を使ったのでルールなど熟知しておりませんでした。申し訳御座いません。

コード:

/*画像のR,G,Bの平均と標準偏差を求めるプログラム*/

#include "jpegio.h"
#include <math.h>

int main()
{
	char *filename = "image.jpg";
	BYTE *data = NULL;
	int imageSize = 0;
    int i;
    int imageWidth = 0, imageHeight = 0;
    double SumR = 0, SumG = 0, SumB = 0;
    double averageR =0, averageG =0, averageB = 0;
    double tempR = 0.0, tempG = 0.0, tempB = 0.0;
    double R_deviation = 0.0, G_deviation = 0.0, B_deviation = 0.0;
    
    imageWidth  = readHeader(filename, IMAGE_WIDTH);
    imageHeight = readHeader(filename, IMAGE_HEIGHT);
	
	imageSize = readJpeg(filename, &data);

	if (imageSize == 0) return 1;
    
    /*----平均を求める計算式----*/
    
    for(i = 0; i < imageWidth * imageHeight; i += 1){
        SumR += data[3*i];
        SumG += data[3*i + 1];
        SumB += data[3*i + 2];
    }
    
    averageR = SumR / (imageWidth * imageHeight);
    averageG = SumG / (imageWidth * imageHeight);
    averageB = SumB / (imageWidth * imageHeight);
    
    /*----平均の結果の出力----*/
    
    fprintf(stdout, "averageR:%.1f  averageG:%.1f  averageB:%.1f\n",
			averageR, averageG, averageB);
    
    
    
    /*----標準偏差を求める計算式----*/
    
    for(i = 0; i < imageWidth * imageWidth; i += 1){
        tempR += (data[3*i] - averageR) * (data[3*i] - averageR);
        tempG += (data[3*i+1] - averageG)*(data[3*i+1] - averageG);
        tempB += (data[3*i+2] - averageB)*(data[3*i+2] - averageB);
    }
    
    R_deviation = sqrt(tempR / (imageWidth * imageHeight));
    G_deviation = sqrt(tempG / (imageWidth * imageHeight));
    B_deviation = sqrt(tempB / (imageWidth * imageHeight));
    
    /*----標準偏差の結果の出力----*/
    
    fprintf(stdout, "deviationR:%.1f  deviationG:%.1f  deviationB:%.1f\n",
			R_deviation, G_deviation, B_deviation);
	
	free(data);
	
	return 0;
}



アバター
Tatu
記事: 440
登録日時: 8年前
住所: 北海道

Re: 標準偏差を求める計算の途中でセグメンテーションエラー。。。

#3

投稿記事 by Tatu » 5年前

freeがあるのにmallocがないのが気になりましたが
平均を求めることはできているのでそれが問題なわけではないですね。

2回目のfor文の条件をもう一度よく見てください。そこが原因です。

初級者
記事: 200
登録日時: 8年前

Re: 標準偏差を求める計算の途中でセグメンテーションエラー。。。

#4

投稿記事 by 初級者 » 5年前

readJpeg関数で、
変数dataに対し
適切に領域を
割り付けていますね?

Tatsu
記事: 4
登録日時: 5年前

Re: 標準偏差を求める計算の途中でセグメンテーションエラー。。。

#5

投稿記事 by Tatsu » 5年前

単純なミスでしたね。。。

コード:

    for(i = 0; i < imageWidth * imageHeight; i += 1){
        tempR += (data[3*i] - averageR) * (data[3*i] - averageR);
        tempG += (data[3*i+1] - averageG)*(data[3*i+1] - averageG);
        tempB += (data[3*i+2] - averageB)*(data[3*i+2] - averageB);
    }
[code/]
で解決しました。Tatuさん、ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る