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

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

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

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

C++

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

配列

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

Q&A

解決済

3回答

1712閲覧

visual studio C++ 配列表記のエラー

bldtemporal

総合スコア35

Visual Studio

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

C++

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

配列

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

0グッド

0クリップ

投稿2022/01/10 13:04

編集2022/01/13 02:28

配列をいくつかのif文で分けたいくつかのケースで使用したのですが、開のようなエラーが出てしまいます。
C++
/* **** Pointer print **** */
#include <cstdio>
#include<cstdlib>

// 1:このコードなら、当然 0.885とprintされます。
int main() {
double PC[5]{ 1, 0.885, 0.826, 0.794, 0.775 };
double PCA[5] = { 1, 0.769, 0.709, 0.671, 0.645 };
printf("\n PC[1]=%7.3f\n", PC[1]);
}
// ===================================================
// 2:一方、このコードでは、識別子"PC"が定義されていない、
// または、pointer-to-object型が必要です、とエラー表示されます。
// これで、通す方法はありませんでしょうか、

int main() {
int N = 1;
if (N == 1) {
double PC[5]{ 1, 0.885, 0.826, 0.794, 0.775 };
double PCA[5] = { 1, 0.769, 0.709, 0.671, 0.645};
}
printf("\n PC[1]=%7.3f\n", PC[1]);
}
この質問は下記により、暫定的に解決しました。
・if(N==1),else if(N=2)としたのでは、N=1,N=2以外でエラーになるだろう、と言うことで、if(N=1),elseで試したところ、この部分での”初期値不設定”のエラーは無くなりました。しかしながら、下記の疑問が残りました。
➀品番の大きなコードでは、冒頭部分でN=1,N=2以外は、exit(0)としていること。
②他の部分ではif(N==1),else if(N=2)としているが、エラーになっていない。
ということから、同じ構成にしたのですが、通りませんでした。配列部分はより厳密になっているように感じました。

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

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

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

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

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

guest

回答3

0

ベストアンサー

C++

1#include <cstdio> 2#include <cstdlib> 3 4int main() { 5 double* PC; 6 int N = 1; 7 if (N == 1) { 8 double pc[5]{ 1, 0.885, 0.826, 0.794, 0.775 }; 9 PC = pc; 10 } 11 printf("\n PC[1]=%7.3f\n", PC[1]); 12}

...なんかできたっポいけど、実はこれもやっちゃダメ。
double pc[5] は {} の外に出ると寿命が尽きてしまいます。
死んでしまう変数のポインタ値をアテにしてはいかんのです。

[追記] これ↓ならOK (staticなのがミソ)

C++

1#include <cstdio> 2#include <cstdlib> 3 4int main() { 5 double* PC; 6 int N = 1; 7 if (N == 1) { 8 static double pc[5]{ 1, 0.885, 0.826, 0.794, 0.775 }; 9 PC = pc; 10 } else { 11 static double pc[5]{ 1, 0.588, 0.826, 0.794, 0.775 }; 12 PC = pc; 13 } 14 printf("\n PC[1]=%7.3f\n", PC[1]); 15}

[追記-2] いっそコレ↓でよくね?

C++

1#include <cstdio> 2 3int main() { 4 double pcs[2][5]{ 0, 1, 2, 3, 4, 5 5, 6, 7, 8, 9 }; 6 double* PC; 7 int N = 0; 8 if (N == 1) { 9 PC = pcs[0]; 10 } else { 11 PC = pcs[1]; 12 } 13 printf("\n PC[1]=%7.3f\n", PC[1]); 14}

投稿2022/01/10 15:36

編集2022/01/11 01:29
episteme

総合スコア16612

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

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

bldtemporal

2022/01/11 00:45

episteme様、有益なアドバイス有難うございます。変数寿命については本で学びましたが、具体的には理解していませんでした。ともかく、有寿命とであるif(n=1) {}の、{}範囲を広げることを考えてみます。
episteme

2022/01/11 01:02

追記しました。
bldtemporal

2022/01/11 01:04

episteme様 (追記)結局のところ、範囲をいくら広げても、外に取り出せないのでは意味ないですね。他の方法を考えなければなりません。
episteme

2022/01/11 01:08

え? ポインタを介して取り出してますよ?
bldtemporal

2022/01/11 02:12

episteme様: ・追記-2の方法、面白いと思い考えてみました。しかしながら、質問のケースでは、N=1にして1番と6番(PC[1]、PCA[1]とかして)を取り出さなければなりませんので、難しいように感じました。今のところitatagaki様ご教示のnamespaceA,namespaceBをmainの外において、条件によりどちらかを呼び出して、その何番目かを取り出す、のが良いかなと考えました。他にmain中で処理できる良い方法があれば別ですが、 ・申し訳ありませんが、”ポインターを介して取り出している” は良く分かりません。
bldtemporal

2022/01/11 03:11

episteme様、追記のコード実行してみました。上手くいきました。実際のコードでは、2番目の配列をpca{}としているので、PC[1],PCA[1]を取り出したかったのですが、エラーになりました。ただ、4配列を、ご教示のように組み替えることは可能ですので、これで組んでみます。➀static としたことに加え、②double *PCとする、のがポイントですね、②の宣言が分かっていませんでした。有難うございました。
itagagaki

2022/01/11 04:32

コンパイルできた、動いた、良かったではなく、理解することが大事なんじゃないですかね…
episteme

2022/01/11 04:45

追記-2 は static を必要としません。
guest

0

「スコープ」というものを学んでください。

4.3. スコープ - ゼロから学ぶ C++

投稿2022/01/10 14:12

itagagaki

総合スコア8402

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

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

bldtemporal

2022/01/11 00:34

itagagaki様、具体的な処理推奨案を頂き有難うございます。この方法はどこかで見ています。 ただ、namespaceA,namespaceBもサブルーチン扱いです。課題は複数の配列をmain中に入れ、どの配列の何番目を取り出すか、と言うことになります。難しいかな、と判断していました。
itagagaki

2022/01/11 04:26 編集

違います。名前スコープの使用の推奨などしていません。あなたはスコープ全般について学ぶ必要があり、この質問に関して言えば、特に理解するべきなのは名前空間スコープではなくて、関数スコープとブロックスコープです。よく読んで理解してください。
bldtemporal

2022/01/13 01:53

itaggaki様、興味あるご回答を頂き有難うございます。ご紹介頂いたnetを見ると、そのようなやり方でも可能なように感じました。スコープに関しては勉強します。初心者対象のテキスト本には無い有用な知見と思います。ただ質問のエラーは暫定的には解決しました。後で、編集するか、自己解決に書き込みますが、今のところy_wawai様へのコメントに書き込んでありますのでご一読頂ければ幸いです。
guest

0

変数は、定義されたブロックの中{}だけしか有効ではありません

ってことで、使いたいところと同じ、あるいはそこより外側のブロックで定義しましょう

投稿2022/01/10 13:19

編集2022/01/10 13:23
y_waiwai

総合スコア88042

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

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

bldtemporal

2022/01/11 00:58

y_waiwai様、何時も有益なアドバイス有難うございます。変数の有寿命範囲を具体的に理解していませんでした。複数の配列を1か所にまとめ、どれかを選び、かつ、その何番目の数値を取り出すというのは無理なようです。この辺はFortranと異なり、扱いにくいですね、ともかく、何とかしなくてはいけないので、一つの配列ごとに(if(N==1){{配列}}の外側{}の範囲を広げ、その中で計算することをトライしてみます。
y_waiwai

2022/01/11 01:03

変数の定義、利用を一つのブロックの中に限定できる、という考え方でどうでしょう。 不用意に影響を外部に及ばすことがない、というのは非常に大きなメリットだと思いますが
bldtemporal

2022/01/11 01:09

y_waiwai様、(追記) いくら{}を広げても、その外にデータを取り出せないのでは意味ありませんでした。itagagaki様からのご教示も踏まえて考えてみます。
y_waiwai

2022/01/11 01:13

その外でデータを取り出す、という考え方そのものが間違いだ、ってことです
bldtemporal

2022/01/13 01:36

y_waiwai様、 ・何時も参考になるご回答有難うございます。”その外でデータを取り出す、という考えそのものが間違い”と言うことですが、一つのブロックで求めたデータを次のブロックに入れて計算できないと、計算そのものが進められません。int main(){}の中は、そのように構成しております。 ・それから、この質問の原点ですが、if(N==1),else if(N=2)では、N=1,N=2以外でエラーになるらしい、と言うことで、if(N=1),elseで試したところ、この部分での”初期値不設定”のエラーは無くなりました。ですので、この問題は暫定的には解決です。しかしながら、下記の疑問が残りました。 ➀コードの冒頭部分でN=1,N=2以外は、exit(0)としていること。 ②他の部分ではi、f(N==1),else if(N=2)でエラーになっていない。 ということから、同じにしたのですが、通りませんでした。配列部分はより厳密になっているように感じました。 ・デバッグの際に更におかしな現象が発生しています。別の質問をしますので宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問