質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

5496閲覧

C言語、配列のメンバが含まれる構造体をグローバル変数として初期化する方法

lictt

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/09/11 11:24

編集2021/09/12 07:00

例えば、

typedef struct{ int a; } kouzoutai1; typedef struct{ kouzoutai1 kouzoutai[3]; } kouzoutai2; kouzoutai1 kou1[3] = {{1},{3},{2}}; kouzoutai2 kou2 = {{kou1[0],kou1[1]kou1[2]}};

このコードを実行すると式には定数値が必要ですというエラーが出ます。(VSCodeでC,C++の拡張機能の疑わしき部分を報告する機能)このような場合、どのように宣言したらよいのでしょうか。

それと、後からkouzoutai1を変えたらkou2の構造体のメンバも変わってるようにしたいので、初期化の際は構造体を入れるようにしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

2

ベストアンサー

コレ↓じゃご不満ですか?

C

1typedef struct{ 2 int a; 3} kouzoutai1; 4 5typedef struct{ 6 kouzoutai1 kouzoutai[3]; 7} kouzoutai2; 8 9kouzoutai2 kou2 = {{{1}, {3}, {2}}};

[追記] あなたのやりたいことはコレ↓ではありませんか?

C

1typedef struct{ 2 int a; 3} kouzoutai1; 4 5typedef struct{ 6 kouzoutai1* kouzoutai[3]; // kouzoutai1 -> kouzoutai1* 7} kouzoutai2; 8 9kouzoutai1 kou1[3] = {{1},{3},{2}}; 10kouzoutai2 kou2 = { &kou1[0], &kou1[1], &kou1[2] }; 11 12#include <stdio.h> 13 14int main() { 15int main() { 16 printf("before: %d\n", kou2.kouzoutai[0]->a); 17 kou1[0].a = 123; 18 printf("after: %d\n", kou2.kouzoutai[0]->a); 19 return 0; 20}

投稿2021/09/11 11:29

編集2021/09/11 14:29
episteme

総合スコア16612

lictt, ozwk👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lictt

2021/09/11 11:59

すみません。質問に不備がありました。あとからkouzoutai配列のメンバを変更する予定があるので、直接書いてもダメな気がします。
episteme

2021/09/11 12:01

> 質問に不備がありました。 ならば質問を編集してください。
episteme

2021/09/11 12:03 編集

> 直接書いてもダメな気がします。 "気がする"留まりですか? 検証/確認してないんですか?
ozwk

2021/09/11 12:09

>あとからkouzoutai配列のメンバを変更する予定があるので kou2.kouzoutai[0].a=4; とかで変えられますけどそういう話ではない?
episteme

2021/09/11 14:00

> 後からkouzoutai1を変えたらkou2の構造体のメンバも変わってるようにしたいので int x = 123; int y = x; // yも123 x = 456; このとき y も456になります? ならんでしょ? あなたはそれを望んでるんですか? だったら int x = 123; int* y = &x; // *yも123 x = 456; // *yも456 ...違いますか? # 追記しました
guest

1

C++

1#include <iostream> 2 3typedef struct{ 4 int a; 5} k1; 6typedef struct{ 7 k1(&b)[3]; 8} k2; 9 10k1 ob1[3] = {{1},{3},{2}}; 11k2 ob2{ob1}; 12 13int main(){ 14 ob1[2].a = 8; 15 std::cout << ob2.b[2].a; 16}

元の変数とリンクさせたいなら、参照を使うのがてっとり早いですよ。配列の参照は少しだけ宣言とか面倒ですが、せっかくC++を使っているなら、生ポインタを使わない作法を覚えましょう!

さらに幸せになりたいなら: constexprで検索!

投稿2021/09/11 15:11

編集2021/09/11 15:14
majiponi

総合スコア1722

lictt👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/09/11 16:09 編集

ん-...C++なんすかね? C++の質問なら typedef struct とかやらんのじゃないかと。 # タイトルからして "C言語" いうてますし...
退会済みユーザー

退会済みユーザー

2021/09/11 16:52

タグはC++ついてるけど
lictt

2021/09/12 07:00

概念が似てると思いつけてしまいましたが、C++の質問を求めている人の邪魔になってしまうと思うので編集しておきます。すみません。
guest

1

このコードを実行すると

「実行」という言葉は、ソースコードに書いてある内容に沿ってコンピュータが動作するとき「だけ」に使ってください。今回は文法エラーでコンパイルの段階で止まっています。いわば「プログラムとして成立していない」ものなので実行できません。

で、静的変数の初期化子には定数しか使えません。
いくらkouzoutai1 kou1[3] = {{1},{3},{2}};で定数を使って初期化したとはいえ、あくまで変数の中身の値として変数を参照しただけなので、kou1[0]自体はどう見ても変数です。だからエラーです。

「定数を代入したら変数の値が変更不可になる」と思い込んでいたりしませんか? あくまで代入されるのは「値」ですから、そんなことはないです。

投稿2021/09/11 12:21

編集2021/09/11 12:55
thkana

総合スコア7733

lictt👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/09/11 12:58

> 後からkouzoutai1を変えたらkou2の構造体のメンバも変わってるようにしたい 「後から」というのがいまひとつ状況が曖昧ですが、ソースコード上で、という話ですね? 定数しか使えないところには変数は持ち込めないので、「初期化」をあきらめてプログラム冒頭で代入するなどの処置をとってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問