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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

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

Q&A

解決済

3回答

4931閲覧

visual studio C++ 初期化されていない可能性のあるポインター変数が使用されている。

bldtemporal

総合スコア35

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

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

0グッド

0クリップ

投稿2022/01/11 05:59

編集2022/01/11 07:46

恐れ入ります。先ほど”配列表記のエラー”について質問して、下記コードepisteme様からご教示頂いた下記コードでうまくいったので、”解決済”としたのですが、本番のコードに利用すると、下部に示す”初期化されていない可能性のあるローカルポインター変数PC(本番名PC7)が使用されている"とエラー表記されます。コード冒頭にPC=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} 13 14エラー C4703 初期化されていない可能性のあるローカル ポインター変数 'PC7' が使用されています(本番変数名のPC7はPC相当です)

・ご指摘がありましたように、下記のように、N=2のケースを入れると、上記C4703のエラーとなります。何か対策がありますでしょうか、(コードは実際に合わせてforにしています。)

C++

1 /* **** Pointer print **** */ 2#include <cstdio> 3#include<cstdlib> 4int main() { 5 int i; 6 for (i = 0; i < 3; i++) { 7 double* PC; 8 int N = 1; 9 if (N == 1) { 10 static double pc[5]{ 1, 0.885, 0.826, 0.794, 0.775 }; 11 PC = pc; 12 }else if(N==2) { 13 static double pc[5] = { 1, 0.769, 0.709, 0.671, 0.645 }; 14 PC = pc; 15 } 16 if (i = 2) { printf("\n PC[1]=%7.3f, i=%d\n", PC[1],i); } 17 } 18}

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

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

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

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

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

int32_t

2022/01/11 06:01

Nが1以外の場合は何を表示したいのですか?
bldtemporal

2022/01/11 06:21

int32_t様:早速のご投稿有難うございます。実際にはN=1 or N=2です。{}中の数値で、異なる物性を表しています。
int32_t

2022/01/11 06:27

質問の答えになってないです。N==2の場合はprintf()で何を表示したいのですか?
episteme

2022/01/11 06:28

だったら else { N==1でなかったとき... } を追加すれば。 ...あ、やっちゃイケナイって言ったのに...
dodox86

2022/01/11 06:29

[visual studio C++ 配列表記のエラー] https://teratail.com/questions/377522 の回答でいただいていた指摘、注意事項がスッポ抜けているのですがそれは良いのでしょうか。
bldtemporal

2022/01/11 07:52

9nt_32t様、eisteme様、dodox86様: ・コードを、N=2の場合を入れて再編集しました。入力として与えるN=1、or N=2について計算するのですが、N=2については何も定義していないことになるのでしょうか、
episteme

2022/01/11 08:06

謎のfor-loop / 謎の if(i=2) が書き加えられてる...
ozwk

2022/01/11 08:08

int N=1と書いているからif(N==1)の中を通ってPCは確実に初期化されるじゃないか、 と思っているかもしれませんが、コンパイラはそんな細かいところまで見ていません。 で、事前に0を代入したりelse句を追加してみたりしても「効果はありませんでした」とのことですが、 本当でしょうか? ただ単に別の警告に変わっただけでは?
bldtemporal

2022/01/11 08:40

・episteme様:if(i=2)は4回ループする中でi=2の1回だけprintfしろ、と言うことです。 ・ozwk様:参考意見有難うございます。実際の大きなコードではPC=0としても効果はありませんでした(警告は変わらなかったと思いましたが)。 }else if(N=2){ でなく、}else{ のみですと投稿のモデルコードではきちんと計算されます。実コードでもprintfの部分ではエラーはでなくなりましたが、完全ではなく、まだc4703残ってしまっています(同じ原因かどうか検討中です)。
luuguas

2022/01/11 13:24

>if(i=2)は4回ループする中でi=2の1回だけprintfしろ、と言うことです。 それをコードにするなら「if(i==2)」です。数学の「=」とC言語の「=」の違い、C言語における「=」と「==」の違いを意識していますか? (本題から逸れてしまいますが、一応指摘しておきます) https://wa3.i-3-i.info/diff210programming.html
guest

回答3

0

ベストアンサー

何か解決策はありませんでしょうか、

  • 「初期化してない」のがダメだと言われているならば,初期化すれば良い.
  • あるいは,「(PCの値を使用するよりも前の)全ての処理経路において PC に何かを代入する」でも良いかと.
    if(N==1){ ... }else if(N==2){ ... } だけだと「Nが1でも2でもない場合」を網羅できていない.)

実際にはN=1 or N=2です

そういう話ならば,Nが1でない場合に「Nが2か否か」をチェックするのは無駄だよね.
素直に以下のようにすればよいのでは.

C

1//「Nが1か否か」という話ならば,素直にこう書けば良いのでは. 2if( N==1 ) 3{ ... } 4else //←単にelseでいいよね 5{ ... }

(これはこの質問内容への回答ではないけども)
そんなstaticの使い方をせずとも,この程度の話なのではあるまいか…?

int main() { //(ふつーにこんな感じに配列を2個書くのではダメな理由が何かあるのだろうか?) double pc_1[5] = { 1, 0.885, 0.826, 0.794, 0.775 }; double pc_2[5] = { 1, 0.769, 0.709, 0.671, 0.645 }; double *PC; int N; //... //(Nの値が1か2になるような処理があるとして) PC = ( N==1 ? pc_1 : pc_2 ); //Nの値によってPCが指す先を変える //... }

投稿2022/01/11 09:09

編集2022/01/11 09:45
fana

総合スコア11996

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

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

bldtemporal

2022/01/11 11:00

fana様:経験したことのない面白いやり方と思います。ただ、該当プログラムでは二つとも同じ名前にしておかないと扱い難いです。どちらかを選んで、以後二つを同じ名前で処理しております。
bldtemporal

2022/01/11 11:04

fana様;「追記」今のところN=1とelseでも構いません(エラーが出るのですから)。ただ後々解析対象としてN=3、N=4も加えなければならないことも想定して、N=2 & N=2としていました、と言うことです。
guest

0

1)int N = 1;
Nがforのループ毎に1に初期化されてしまっています。Nのスコープを見直す必要があります。

2)if (i = 2) {...
iに2が代入されてしまっています。意図としては比較ではないでしょうか?

投稿2022/01/11 08:27

Serbonis

総合スコア586

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

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

bldtemporal

2022/01/11 10:53

Serbonis様:コメント有難うございます。 1)int N = 1;---Nがforのループ毎に1に初期化されてしまっています。Nのスコープを見直す必要があります---。 ・本来なら、static int N;としてforループの外側すべきと思いますが、中にあってもN=1が更新されるだけなので、モデルコードではあまり気にしていません。 2)if (i = 2) {...iに2が代入されてしまっています。意図としては比較ではないでしょうか--- ・比較ではいけんません。i=2の時1回だけprintする意図です。
guest

0

if (N == 1) {

この条件が不成立の場合はPCは初期化されません

投稿2022/01/11 06:01

y_waiwai

総合スコア88042

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

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

bldtemporal

2022/01/11 06:29

y_waiwai様:早速のご投稿有難うございます。実際には if(N==1) { }else if(N==2) { としています。もちろ単に、]else{ でも試しています。
y_waiwai

2022/01/11 06:52

あらゆる条件でも初期化してるならそのエラーが出るはずもありませんが。
bldtemporal

2022/01/11 08:46

y_waiwai様:他もいじってしまったかも知れませんが、単に}else{とした場合は効果があるようです。printf部分でのエラーメッセージは無くなったようです(また出るかも知れませんが)。ただ、変数PCについて、コードが進んだ部分で同じc4703のエラーメッセージが出るので、まだすっきりしていません。
bldtemporal

2022/01/13 02:51

y_waiwai様、他の質問にコメントを書いてしまっていますが、この問題は下記の方法で暫定的には解決しました。 ・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)としてもエラーになっていない。 ということから、if(N==1),else if(N=2)として実行したのですが、通りませんでした。配列部分はより厳密になっているように感じました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問