回答編集履歴

8

文言修正

2020/10/01 17:30

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -136,7 +136,7 @@
136
136
 
137
137
  `students.csv`が14行にも関わらず`noOfRecords()`では`15`が返り、
138
138
 
139
- 15行目を読もうとして`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。
139
+ 15行目を読もうとして上記Valgrindのメッセージと`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。
140
140
 
141
141
 
142
142
 

7

コード追記

2020/10/01 17:30

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -134,6 +134,32 @@
134
134
 
135
135
  ---
136
136
 
137
- おそらく`students.csv`が14行にも関わらず`noOfRecords()`では`15`が返り、
137
+ `students.csv`が14行にも関わらず`noOfRecords()`では`15`が返り、
138
138
 
139
139
  15行目を読もうとして`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。
140
+
141
+
142
+
143
+ ```diff
144
+
145
+ int noOfRecords() {
146
+
147
+ int noOfRecs = 0;
148
+
149
+ char ch;
150
+
151
+ while (fscanf(fptr, "%c", &ch) == 1) {
152
+
153
+ noOfRecs += (ch == '\n');
154
+
155
+ }
156
+
157
+ rewind(fptr);
158
+
159
+ - return noOfRecs + 1; // 最終行用に +1
160
+
161
+ + return noOfRecs;
162
+
163
+ }
164
+
165
+ ```

6

指摘追加

2020/10/01 16:50

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -129,3 +129,11 @@
129
129
  }
130
130
 
131
131
  ```
132
+
133
+
134
+
135
+ ---
136
+
137
+ おそらく`students.csv`が14行にも関わらず`noOfRecords()`では`15`が返り、
138
+
139
+ 15行目を読もうとして`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。

5

文言修正

2020/10/01 16:43

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
 
68
68
 
69
- ファイルを読めておらず未初期化の変数`names`を`while`の条件に使用して怒られています。
69
+ ファイルを正しく読めておらず未初期化の変数`names`を`while`の条件に使用して怒られています。
70
70
 
71
71
  以下を直せば今指摘されているValgrindのエラーは消えます。
72
72
 

4

指摘追加

2020/10/01 16:29

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -55,3 +55,77 @@
55
55
  }
56
56
 
57
57
  ```
58
+
59
+
60
+
61
+ ---
62
+
63
+
64
+
65
+ > Conditional jump or move depends on uninitialised value(s)
66
+
67
+
68
+
69
+ ファイルを読めておらず未初期化の変数`names`を`while`の条件に使用して怒られています。
70
+
71
+ 以下を直せば今指摘されているValgrindのエラーは消えます。
72
+
73
+
74
+
75
+ ```diff
76
+
77
+ struct Student {
78
+
79
+ char* m_name;
80
+
81
+ int m_studentNumber;
82
+
83
+ double m_gpa;
84
+
85
+ + Student() : m_name( nullptr){}
86
+
87
+ };
88
+
89
+
90
+
91
+ - Student* students;
92
+
93
+ + Student* students = nullptr;
94
+
95
+
96
+
97
+ bool readName(char name[]) { // データファイル内の学生名の読み取り
98
+
99
+ char names[256];
100
+
101
+ int gi = 0; //names index;
102
+
103
+ int i = 0;// name[i] index
104
+
105
+ - bool res = fscanf(fptr, "%[^,],", names);
106
+
107
+ + bool res = 1 == fscanf(fptr, "%[^,],", names);
108
+
109
+ if (res) { //csvを文字列の配列に拡散する
110
+
111
+ res = false;
112
+
113
+ while (names[gi]) {
114
+
115
+ name[i++] = names[gi++];
116
+
117
+ res = true;
118
+
119
+ }
120
+
121
+ }
122
+
123
+ name[i++] = '\0';
124
+
125
+ name[i] = '\0'; // 文字列の配列を終了する
126
+
127
+ return res;
128
+
129
+ }
130
+
131
+ ```

3

指摘追加

2020/10/01 16:23

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -29,3 +29,29 @@
29
29
  レコード数を読めたけれど、名前を読めなかった場合それ以降の要素の`m_name`は不定値なのでdeleteしてはまずいのでは?
30
30
 
31
31
  `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr`で初期化するべき。
32
+
33
+
34
+
35
+ ---
36
+
37
+
38
+
39
+ > 画面内のエラーメッセージをGoogle翻訳してみましたが、全く意味がわかりません...
40
+
41
+ エラー:読み取られたレコードの数が正しくありません。 データが破損している可能性があります
42
+
43
+
44
+
45
+ あなたの書いたプログラムが出しているメッセージですが…
46
+
47
+ ```C++
48
+
49
+ // レコードの数が読み取り数と一致しない場合、エラーメッセージを出力
50
+
51
+ if (i != noOfStudents){
52
+
53
+ cout << "Error: incorrect number of records read; the data is possibly corrupted" << endl;
54
+
55
+ }
56
+
57
+ ```

2

誤記修正

2020/10/01 16:07

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -28,4 +28,4 @@
28
28
 
29
29
  レコード数を読めたけれど、名前を読めなかった場合それ以降の要素の`m_name`は不定値なのでdeleteしてはまずいのでは?
30
30
 
31
- `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr_t`で初期化するべき。
31
+ `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr`で初期化するべき。

1

指摘追加

2020/10/01 15:58

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -9,3 +9,23 @@
9
9
 
10
10
 
11
11
  `delete[]`じゃないの?
12
+
13
+
14
+
15
+ ---
16
+
17
+
18
+
19
+ ```C++
20
+
21
+ for (int i = 0; i < noOfStudents; i++) {
22
+
23
+ delete students[i].m_name;
24
+
25
+ }
26
+
27
+ ```
28
+
29
+ レコード数を読めたけれど、名前を読めなかった場合それ以降の要素の`m_name`は不定値なのでdeleteしてはまずいのでは?
30
+
31
+ `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr_t`で初期化するべき。