質問編集履歴

4

ソースコードの修正

2023/05/12 05:15

投稿

shupira
shupira

スコア7

test CHANGED
File without changes
test CHANGED
@@ -71,7 +71,7 @@
71
71
  exit(1);
72
72
  }
73
73
 
74
- load_gray_img(fp, src_gray_img);
74
+ load_gray_img(fp, img);
75
75
  fclose(fp);
76
76
  }
77
77
 

3

ソースコードの修正

2023/05/12 04:58

投稿

shupira
shupira

スコア7

test CHANGED
File without changes
test CHANGED
@@ -71,7 +71,7 @@
71
71
  exit(1);
72
72
  }
73
73
 
74
- load_gray_img(fp, src_gray_img, magic_number);
74
+ load_gray_img(fp, src_gray_img);
75
75
  fclose(fp);
76
76
  }
77
77
 

2

ソースコードの修正

2023/05/12 04:57

投稿

shupira
shupira

スコア7

test CHANGED
File without changes
test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  //do not support comments in the header section.
36
36
  bool is_correct_PNM_style(FILE *fp, char *magic_number, int *width, int *height, int *max_intensity);
37
- void load_gray_img(FILE *fp, unsigned char src_gray_img[], char *magic_number);
37
+ void load_gray_img(FILE *fp, unsigned char img[]);
38
38
 
39
39
  int main(int argc, char *argv[]){
40
40
  char *file_name = argv[1];

1

main関数の記載と説明の追加

2023/05/12 04:43

投稿

shupira
shupira

スコア7

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