・初期値設定の原則と"例外スロー"の発生について質問していましたが、下記の解決を得ました。
1.初期設定について
・下記コードで、初期値x=0を与えない場合、sub_f(double *x)(print)は、当然x=-9.256e+61とゴミになっています。一方、初期値x=0を与えた場合はx=0となります。しかしながら、計算の答えであるmainでは、どちらもx=6.283となって変わりません。sub_f()での、*Xの計算が初期値の設定となっているということ、解釈します。
C++
1#include <cstdio>
2#include<cstdlib>
3#define _USE_MATH_DEFINES
4#include <math.h>
5
6void sub_f(double * x); //--Prototype declaration
7
8int main(void) {
9double x;
10// x = 0; //-- xを初期化 してもしなくても良いようだ
11sub_f(&x);
12printf(" sub_f()での計算結果をmainでprint:x =%6.3f\
13\n (xを初期化してもしなくても同じ結果)\n\n", x);
14}
15// =================================
16// **** Subruotine sub_f() ****
17void sub_f(double * x) {
18printf("\n sub_f()の最初でprint:*x =%11.3e\n\n", *x);
19*x=2*M_PI;
20}
2.例外スルーの発生原因について
・下記コードをでデバッグすると'y' is being used without being initialized.と表示されます。初期設定の位置を分かり易くするため、当該subroutineのsub_f2()の直前で実行したためです。これを止め、コードの冒頭で初期化実行すれば、正常に動作します。
#include <cstdio>
#include<cstdlib>
#define _USE_MATH_DEFINES
#include <math.h>
void sub_f1(double * x,double y,double d); //--Prototype declaration
void sub_f2(double d); //--Prototype declaration
int main(void) {
// double x, y,d; //---これを生かして("//"を削除)正常動作
double x, d; //---例外スローを起こる.,正常動作には"//"とする
x = 1;
// y = 2; //---これで”例外スロー”が起こる。"//"無しで初期化して正常動作
d = 0.1;
static int N = 0;
sub_f2(&d);
int i;
for (i = 0; i <= 2; i++) {
double y; //---正常動作とするには、ここ"//"とする。
//---下記までで、sub_f1()前にyを初期化する(1回通過)
static int kxy = 0;
if (kxy != 1) {
y = 2; /---これで”例外スロー”。"//"とすれば正常動作
kxy = 1;
}
//**
sub_f1(&x,y,&d);
x = x + y + d;
printf("\n sub_f1(),sub_f2()での計算結果を呼び出したmainで計算結果
print:x=%5.1f, y=%4.1f, d=%4.1f, N=%d\n\n", x,y,d,N);
N = N + 1;
} //---”for”
}
// **** Subruotine sub_f() ****
void sub_f2(double d) { *d = *d + 0.1; }
void sub_f1(double *x,double y,double *d) {
printf("\n sub_f()の最初でprint:*x =%5.1f, y =%4.1f\n", *x,y);
*x =*x+y; //---y が初期化されていないと,*x はゴミになるのでNG
printf("\n sub_f()の最後でprint:*x =%5.1f, y =%4.1f\n", *x,y);
}