回答編集履歴

1 コメントにしてたエラーケースの個数不足を修正し、実際のエラーを記載

wwbQzhMkhhgEmhU

wwbQzhMkhhgEmhU score 237

2019/02/13 18:47  投稿

> このように初期化した場合最初の3つがpositionにはいってあとの3つがnormalに入るんですか?
はい。
> あと{ 1.0f, -1.0f, -1.0f)のように3つだけ書いたらどうなりますか?
後半3つは既定の値(GLfloat知らないけど多分0)が入ります。
規格に近いものは、普通に落ちてるのだと、
https://cpprefjp.github.io/lang/cpp11/initializer_lists.html
処理系のマニュアルだと
(Visual C++)
https://docs.microsoft.com/ja-jp/cpp/cpp/initializers?view=vs-2017
gccで試した結果だと
```C++
struct Vertex
{
   float position[3];
   float normal[3];
};
Vertex a[] = {
   {{1,2,3},{4,5,6}}, // 普通
   {{2,3},{5,6}},    // 少ない
   //{{2,3,4},{5,6,7}}, 多い。これはgcc 8.2.0だとエラー
   //{{2,3,4},{5,6,7,8}}, 多い。これはgcc 8.2.0だとエラー
   {2,3,4,5,6,7},    // 古い書き方(普通)
   {2,3,4,5,6},      // 古い書き方(少ない)
   //{2,3,4,5,6,7,8}    古い書き方(多い)。これはgcc 8.2.0だとエラー
};
```
```text
user@lubuntu:~/cpp$ cat test.cpp
struct Vertex
{
   float position[3];
   float normal[3];
};
Vertex a[] = {
   {{1,2,3},{4,5,6}}, // 普通
   {{2,3},{5,6}},    // 少ない
   //{{2,3,4},{5,6,7}}, 多い。これはgcc 8.2.0だとエラー
   {2,3,4,5,6,7},    // 古い書き方(普通)
   {2,3,4,5,6},      // 古い書き方(少ない)
   //{2,3,4,5,6,7,8}    古い書き方(多い)。これはgcc 8.2.0だとエラー
};
int main() {return 0;}
user@lubuntu:~/cpp$ g++ -g test.cpp -o test
user@lubuntu:~/cpp$ gdb test
GNU gdb (Ubuntu 8.2-0ubuntu1) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
   <http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) break main
Breakpoint 1 at 0x1129: file test.cpp, line 16.
(gdb) run
Starting program: /home/user/cpp/test
Breakpoint 1, main () at test.cpp:16
16     int main() {return 0;}
(gdb) display a
1: a = {{position = {1, 2, 3}, normal = {4, 5, 6}}, {position = {2, 3, 0}, normal = {5, 6, 0}}, {
   position = {2, 3, 4}, normal = {5, 6, 7}}, {position = {2, 3, 4}, normal = {5, 6, 0}}}
(gdb)
```  
多くてエラーになるケース(1)  
```text  
user@lubuntu:~/cpp$ cat test.cpp  
struct Vertex  
{  
   float position[3];  
   float normal[3];  
};  
Vertex a[] = {  
   {{1,2,3},{4,5,6}}, // 普通  
   {{2,3},{5,6}},    // 少ない  
   {{2,3,4},{5,6,7,8}},// 多い。これはgcc 8.2.0だとエラー  
   {2,3,4,5,6,7},    // 古い書き方(普通)  
   {2,3,4,5,6},      // 古い書き方(少ない)  
   //{2,3,4,5,6,7,8}   // 古い書き方(多い)。これはgcc 8.2.0だとエラー  
};  
 
int main() {return 0;}  
user@lubuntu:~/cpp$ g++ -g test.cpp -o test  
test.cpp:14:1: error: too many initializers for ‘float [3]’  
};  
^  
user@lubuntu:~/cpp$  
```  
多くてエラーになるケース(2)  
```text  
user@lubuntu:~/cpp$ cat test.cpp  
struct Vertex  
{  
   float position[3];  
   float normal[3];  
};  
 
Vertex a[] = {  
   {{1,2,3},{4,5,6}}, // 普通  
   {{2,3},{5,6}},    // 少ない  
   //{{2,3,4},{5,6,7,8}}, 多い。これはgcc 8.2.0だとエラー  
   {2,3,4,5,6,7},    // 古い書き方(普通)  
   {2,3,4,5,6},      // 古い書き方(少ない)  
   {2,3,4,5,6,7,8}   // 古い書き方(多い)。これはgcc 8.2.0だとエラー  
};  
 
int main() {return 0;}  
user@lubuntu:~/cpp$ g++ -g test.cpp -o test  
test.cpp:14:1: error: too many initializers for ‘Vertex’  
};  
^  
user@lubuntu:~/cpp$  
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る