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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2031閲覧

C++で構造体をグローバルに扱いたい。

hanamur

総合スコア45

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/05/11 23:54

現在Visual Studioを使ってC++でプログラムを書いています。

main.cpp

1#include <iostream> 2#include <stdio.h> 3#include <stdlib.h> 4#include"header.h" 5 6typedef struct { 7 int aaa[1000]; 8} structure1; 9 10int main() { 11 12 structure1* ccc; 13 ccc = new structure1[10]; 14 memset(ccc, 0, 10 * sizeof(ccc)); 15 emPTY(); 16 delete[] ccc; 17}

sub.cpp

1 2#include <iostream> 3#include <stdio.h> 4#include <stdlib.h> 5#include"header.h" 6 7void emPTY() { 8 9 std::cerr << ccc[9].aaa[999] << std::endl; 10 11}

header.h

1extern int* aaa; 2extern structure1* ccc; 3void emPTY();

とプログラムを書いて、構造体をグローバルに扱おうとしているのですがうまくいきません。何か根本的に勘違いをしていそうですが、どうかよろしくお願いします。

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

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

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

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

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

int32_t

2022/05/12 00:01

> うまくいきません。 具体的にどのような期待と違う結果になってますか? コンパイルエラーが出ているならエラーを質問文に含めてください。
ozwk

2022/05/12 00:05

> うまくいきません どう「うまくいかない」のかを書きましょう
guest

回答2

0

ベストアンサー

sub.cppでいきなりstructure1が出てきます。
わかりやすさのためsub.cppheader.hの中身を展開してみます。
structure1の定義がないままいきなり使われているのがわかると思います。

sub.cpp

1 2#include <iostream> 3#include <stdio.h> 4#include <stdlib.h> 5// #include"header.h" 6extern int* aaa; 7extern structure1* ccc; 8void emPTY(); 9 10void emPTY() { 11 12 std::cerr << ccc[9].aaa[999] << std::endl; 13 14}

structure1の定義をheader.hに移してしまいましょう。


memsetが未定義だと怒られるかもしれません。
適当なヘッダをインクルードするなりで対処しましょう。


cccがグローバルで宣言されていません。現状main内のローカル変数になっています。
externはこの変数がどこかに定義されている、ということを示しているだけで、
変数を定義しているわけではありません。(宣言だけして定義しない)

したがってmain.cppでグローバル変数として定義する必要があります。

(前の質問 C++で配列のグローバル変数を使いたい。 で指摘されているのと同じ原因です)

main.cpp

1#include <iostream> 2#include <stdio.h> 3#include <stdlib.h> 4#include"header.h" 5 6 7structure1* ccc; 8int main() { 9 10 // structure1* ccc; 11 ccc = new structure1[10]; 12 memset(ccc, 0, 10 * sizeof(ccc)); 13 emPTY(); 14 delete[] ccc; 15}

投稿2022/05/12 00:16

編集2022/05/12 00:24
ozwk

総合スコア13512

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

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

hanamur

2022/05/12 08:00

すべて丁寧にありがとうございます。 気づいてなかったエラーについても感謝します。 もう二度と同じ過ちは繰り返しません。
guest

0

sub.cpp をコンパイルするとき、コンパイラは main.cpp の内容をいっさい知ることができません。なので、structure1 型の定義を利用することができません。

typedef struct ... は header.h など sub.cpp からも参照できるヘッダに移動しましょう。

投稿2022/05/12 00:00

編集2022/05/12 00:05
int32_t

総合スコア20659

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

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

hanamur

2022/05/12 08:01

理由がとても腑に落ちました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問