実現したいこと
最適化オプションの有無に関わらず同じ結果を出力させたい
起こっていること
C言語で画素値を読み込んで配列に格納するプログラムを組んだのですが、最適化オプションを付けた時とつけなかった時で以下のソースコードの62行目の出力が異なります。
期待する動作はimg[0]、すなわちimgという配列に格納した先頭の数値がprintfで出力されることです。
しかし、実際には最適化オプションの有無で以下のように結果が異なります。
最適化オプションあり(下1行目):配列の先頭に格納された値が出力される(下記データ群の画素値の最初の値である50が出力される)
最適化オプションなし(下2行目):配列の末尾に格納された値が出力される(下記データ群の画素値の最初の値である90が出力される)
指定したgccのオプションは以下です。
gcc
1gcc sample.c -O -Wall...最適化あり 2gcc sample.c -Wall...最適化なし
該当のソースコード
C
1#include <stdio.h> 2#include <stdbool.h> 3#include <string.h> 4#include <stdlib.h> 5 6 7#define HEIGHT 256 8#define WIDTH 256 9 10 11//do not support comments in the header section. 12bool is_correct_PNM_style(FILE *fp, char *magic_number, int *width, int *height, int *max_intensity); 13void load_gray_img(FILE *fp, unsigned char img[]); 14 15int main(int argc, char *argv[]){ 16 char *file_name = argv[1]; 17 char magic_number[2]; 18 int height, width; 19 int max_intensity; 20 unsigned char img[HEIGHT * WIDTH];//for P2,P5 21 unsigned char dst_img[HEIGHT * WIDTH];//for P2,P5 22 unsigned char color_img[HEIGHT * WIDTH * 3];//for P3,P6 23 unsigned char dst_color_img[HEIGHT * WIDTH * 3];//for P3,P6 24 FILE *fp; 25 errno_t error; 26 bool correct_PNM_style = false; //if the format of PNM is correct, this is true. 27 28 29 if(argc != 2){ 30 printf("Usage: %s <file_name>\n", argv[0]); 31 exit(1); 32 } 33 34 error = fopen_s(&fp, file_name, "rb"); 35 36 if(error != 0){ 37 printf("Could not open %s.\n", argv[1]); 38 fclose(fp); 39 exit(1); 40 } 41 42 correct_PNM_style = is_correct_PNM_style(fp, magic_number, &width, &height, &max_intensity); 43 44 if(correct_PNM_style == false){ 45 printf("Check PNM style.\n"); 46 fclose(fp); 47 exit(1); 48 } 49 50 load_gray_img(fp, img); 51 fclose(fp); 52} 53 54void load_gray_img(FILE *fp, unsigned char img[]){ 55 unsigned char pixel_value = 255; 56 int i = 0; 57 58 for(i = 0; i < HEIGHT * WIDTH; i++){ 59 fscanf_s(fp, "%hhu", &pixel_value); 60 img[i] = pixel_value; 61 } 62 printf("%d\n", img[0]); 63}
試したこと
配列のサイズとプログラムが小さい場合(格納するだけ)に配列の先頭の値を出力することを確認した。
for文内で用意されるpixel_valueの値が正しいことを確認した。
ここで正しいとはマジックナンバーがP2であるpgmファイルの画素値と上記の59行目でpixel_valueに格納される値が一致していることを指す。
なお、画素値とは下記の4行目以降の数値群を指す。
P2 256 256 255 50 46 49 52 52 58 55 57 50 49 44 43 43 44 38 39 40 ... 11 13 12 13 15 13 17 26 31 29 32 44 53 67 90
環境
Windows 10 Pro
gcc (tdm64-1) 10.3.0

回答2件
あなたの回答
tips
プレビュー