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

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

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

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

配列

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

Q&A

解決済

3回答

1092閲覧

C++配列のエラーについて

bldtemporal

総合スコア35

C++

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

配列

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

0グッド

0クリップ

投稿2021/12/07 13:04

編集2021/12/13 02:05

コード

int main(){
if(Ngas==1){
double PC7[50]={1,0.885,0.826,0.794,0.775,---}; double PC7A[50]={1,0.769,0.709,0.671,0.645,--};

}else if(Ngas==2){
double PC70[50]={1,0.885,0.826,0.794,0.775,---};
double PC70A[50]={1,0.820,0.773,0.743,0.722,--}:
double PC7[50]=PC70[50];
double PC7A[50]=PC70A[50]; //ここにもdoubleが無いとerrorになる。

}
PC8=PC7[0]; //PC7 was not declaredのerror(上でPC7[0]を定義してあるが)
NS=0; //--NS の初期値
PC8=PC7[NS]; //下でのerror,ここでは無し
PC8A=PC7A[NS]; //PC7A was not declaredのerror(上でNS=0を定義してあるが)
}

前回の質問1.PC70[50],PC70A[50]:array must be initialized--は解決しました。else if のところで、他のPrgの都合で、一度PC70[50],PC70A[50]を求めて、
PC7[50]=PC70[50],PC7A[50]=PC70A[50]としていましたが、else if なので、
このような間接的手法の必要はなく、ifのところと同じに
PC7[50]=,PC7A[50]=としたところmust be initializedは消えました。

2.PC7[0], PC7A[NS]:で,PC7, PC7A was not declared in this scopeが残っております。ここは最初の{}の外なので数値を与え無ければいけないかも知れません。

1.PC70[50]及びPC70A[50]:array must be initialized with a brace-enclosed initializer. 1.PC7[0], PC7A[NS]:それぞれ was not declared in this scope *プログラム(一部) int main() { ---- ---- if(Ngas==1){ //--インプットデータでNgas=1,or 2を与えている。 double PC7[50] = {1,0.885,0.826,0.794,0.775,-------}; double PC7A[50] = {1,0.769,0.709,0.671,0.645,------}; }else if(Ngas==2){ double PC70[50] = {1,0.885,0.826,0.794,0.775,------}; double PC70A[50] = {1,0.820,0.773,0.743,0.722,-----};               //--ここまでエラー表示なし。 double PC7[50]=PC70[50]; double PC7A[50]=PC70A[50]; //--ここにもdoubleが無いとerrorになる。      //--上記でPC70[50],PC70A[50]がarray must be initializedのerror      //--上の2行、Ngas==1でdoubleしてありますがここにもdoubleが無いとnot declared のerrorになります。 } ----- ----- PC8=PC7[0];  //--ここでPC7 was not declaredのエラー  PC8=PC7[NS]; //--下のPC7A[NS]はエラーだが、これはエラーになっていない? PC8A=PC7A[NS]; //--ここでPC7A was not declaredのエラー,NSはこの関数の前にあるsubroutineに実引数&NSで呼び出される。 ---- ---- return (0) } *** 本質問は要点以外のことを述べてしまっています。従って、要点を簡潔に記載して再質問させて頂きたいと思いますので宜しくお願い致します。***

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

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

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

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

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

y_waiwai

2021/12/07 13:11

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
int32_t

2021/12/07 13:35

> C言語では問題なくcompileされ、 Cでもエラーになるはずのコードですね。 ブロックスコープの変数を関数スコープに自動的に変更する独自拡張でもしてあるんでしょうか。
bldtemporal

2021/12/08 01:24

編集のところでコードを記載して再投稿しました。見て頂けますでしょうか、
guest

回答3

0

自己解決

本質問は解決済みのことも含めて記載してしまっています。現在の問題点をまとめて再質問させて下さい。従って本質問は、解決済(解決していませんが)として打ち切りとさせて下さい。

投稿2021/12/13 02:09

bldtemporal

総合スコア35

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

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

0

考え方として間違えているところを2点挙げます。

① 変数のスコープ
② 配列の代入

C++

1if(Ngas==1){ 2 double PC7[50] = {1,0.885,0.826,0.794,0.775,-------}; //① 3 double PC7A[50] = {1,0.769,0.709,0.671,0.645,------}; //① 4}else if(Ngas==2){ 5 double PC70[50] = {1,0.885,0.826,0.794,0.775,------}; //① 6 double PC70A[50] = {1,0.820,0.773,0.743,0.722,-----}; //① 7 8 double PC7[50]=PC70[50]; //② 9 double PC7A[50]=PC70A[50]; //② 10}

①{}で囲まれている範囲がスコープになりますので、
{}の外で参照しようとすると "was not declared"になります。

②C/C++は配列全体での代入(初期化も)ができません。for文などで要素ごとに代入する必要があります。
"array must be..."は初期化の書式として間違っているので出ています。

投稿2021/12/07 13:23

Serbonis

総合スコア581

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

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

bldtemporal

2021/12/08 01:32

有益なアドバイスを頂き有難うございます。 編集して再投稿しております。array must be---は消えましたので解決したようです。”(最初の){}の外にある”はその通りです。2か所同じ方法で記載しているのに、一か所だけerrorとなるのは不思議ですが、erroとなるところには初期値(数値)を入れてコンパイルしてみます。
guest

0

コードがまともに読めないんで、いまいち何が問題かわかってませんが、

ローカル変数は、定義されたブロック{}の中だけしか有効ではありません
そこらへんは大丈夫でしょうか。

投稿2021/12/07 13:15

y_waiwai

総合スコア87800

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

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

bldtemporal

2021/12/08 07:19

y_waiwai様 度々のアドバイス有難うございます。このPrgは3相電流の保護装置に関しています。従って、一つのsubroutineはA相、B相、C相の3回適用されます。今までの方法では、A相のみに適用されたような状態でした。それで、PC7[50],PC7A[50]をsubroutineの中に入れ、3相に取り込めるようにしたところ、今迄のnot declaredのerrorは無くなりました。しかしながら、下記のとんでもないerrorが出るようになってしまいました。画面だけでコピペできないことをお許しください。 C:\users\___\AppData\Local|Temp|cchP8xuI.O:object.cpp:(.txt+0xb68d):undefined reference to 'sub_A(double*, double ,----int *,int) C:\users\___\AppData\Local|Temp|cchP8xuI.O:object.cpp:(.txt+0xc50f):undefined reference to 'sub_B(double*, double ,----int *,int) ---これが3相分(3回)続き、最後に下記があります。 collect2.exe: error: ld return 1 exit status なお、sub_A,sub_Bはsubroutine名、()内は引数の型です(引数名)は無し。私にはさっぱり分かりませんが、subroutine関係ではあるようです。 誠にお手数で恐縮ですが、ご教示頂けたら幸いです。
bldtemporal

2021/12/11 11:30

y_waiwai様 他の皆様 度々お世話になります。掲題のエラーについて下記コメントが問題だと分かりました。 ”undefined reference to 'sub_A(double*, double ,----int *,int)” このエラーについては簡単に改善できないとして、ネットにいろいろ記載がありました。改善のための勧めに基づいて、MinGW-w64中のmakefileで、LDFLAGS=----lib-liconvとするなど実施してみましたが、全く変化無しでした。このエラーが出たらどうしようもないものでしょうか、何か改善方法がありましたら、ご教示お願い致します。
y_waiwai

2021/12/11 22:48

sub_Aが見つからないと言ってますが、それはどこにあるんでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問