🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

Q&A

解決済

2回答

4975閲覧

型 "double **" の引数は型 "double *" のパラメーターと互換性がありません

langhtorn

総合スコア105

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

0グッド

1クリップ

投稿2021/01/23 03:09

###実現したいこと
関数onestep内で計算したe0の値をmain内で出力したい。
###問題点
関数の関数の部分でのやり取りがうまくいかない。
multiIterからonestepに値を渡すところでうまくいっていないのだと思います。

gyouretu.cc: In function 'void ex::multiIter(int, double (*)[200], int, double*)': gyouretu.cc:74:25: error: cannot convert 'double**' to 'double*' 74 | onestep(n,A,&e0); | ^~~ | | | double** gyouretu.cc:31:47: note: initializing argument 3 of 'void ex::onestep(int, double (*)[200], double*)' 31 | void onestep(int n,double A[N][N],double *e0){ | ~~~~~~~~^~

###試したこと
そこで、onestep内のe0double **e0にしてみたらプログラムが強制終了してしまいました。
最大固有値の近似値を出すところです。
どこを直せばmain内までe0を持ってくることができるのか教えてください。
###コード

C++

1#include<cstdio> 2#include<cstdlib> 3#include<cmath> 4 5#define N 200 6double A[N][N]; 7double x0[N]; 8 9namespace ex{ 10 double y0[N],y1[N]; 11 12 //乱数発生 13 double uran(){ 14 double v=rand(); 15 return v/RAND_MAX; 16 } 17 18 //ノルム計算 19 double norm(int n,double x[]){ 20 double s=0; 21 int i; 22 for(i=0;i<n;i++){ 23 s=s+x[i]*x[i]; 24 } 25 return sqrt(s); 26 } 27 28 //1回のべき乗法の計算 29 void onestep(int n,double A[N][N],double *e0){ 30 double u0; 31 int i,j; 32 printf("べき乗法:\n"); 33 for(i=0;i<n;i++){ 34 printf("x[%d]=%f ",i,x0[i]); 35 } 36 printf("\n"); 37 for(i=0;i<n;i++){ 38 for(j=0;j<n;j++){ 39 printf("%f ",A[i][j]); 40 } 41 printf("\n"); 42 } 43 //y=Ax 44 for(i=0;i<n;i++){ 45 //printf("AXi=%d\n",i); 46 y0[i]=0; 47 for(j=0;j<n;j++){ 48 y0[i]+=A[i][j]*x0[j]; 49 //printf("y0=%f\n",y0[i]); 50 } 51 } 52 for(i=0;i<n;i++){ 53 printf("y[%d]=%f ",i,y0[i]); 54 } 55 e0=0; 56 for(i=0;i<n;i++){ 57 *e0+=x0[i]*y0[i]; //最大固有値の近似値 58 } 59 printf("e0=%.10g\n",e0); 60 u0=norm(n,y0); //||y0|| 61 for(i=0;i<n;i++){ 62 x0[i]=y0[i]/u0; //x=y/||y|| 63 } 64 } 65 66 //べき乗法の指示 67 void multiIter(int n,double A[N][N],int kmax,double *e0){ 68 int k; 69 //反復してべき乗法 70 for(k=0;k<kmax;k++){ 71 //printf("k=%d\n",k); 72 onestep(n,A,&e0); 73 } 74 printf("e0=%f\n",e0); 75 } 76} 77 78int main(int ac,char**av) 79{ 80 int i,j,n,kmax=3000; 81 double e0; 82 if(ac>1){ 83 kmax=atoi(av[1]); //文字列をint型に変換 84 } 85 printf("n="); 86 scanf("%d",&n); 87 printf("行列式Aを入力:\n"); 88 for(i=0;i<n;i++){ 89 for(j=0;j<n;j++){ 90 scanf("%lf",&A[i][j]); 91 } 92 } 93 printf("ベクトルbを入力:\n"); 94 for(i=0;i<n;i++){ 95 scanf("%lf",&x0[i]); 96 } 97 98 ex::multiIter(n,A,kmax,&e0); 99 printf("最大固有値: %f\n",e0); 100}

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

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

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

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

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

guest

回答2

0

ベストアンサー

関数onestepの引数のdouble *e0はe0は「double型の変数のポインタ」を受け取るという意味になります。

関数multiIterの引数も同じくdouble *e0となっていますが、この中でonestepを呼び出す際に
onestep(n,A,&e0);としていますが、こうすると、「double型の変数のポインタ(e0)のポインタ」を渡していることになってしまいます。

おそらく、onestep(n,A,e0);とすれば動くと思います。

投稿2021/01/23 03:17

Amakaze

総合スコア313

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

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

langhtorn

2021/01/23 07:41

できました。無事にmain内で表示できました。ありがとうございます。
guest

0

変数名を引きずってしまって混乱していたりしませんか? 変数の「名前」はプログラムの動作に影響を与えませんから、ちょっと書き換えてみましょう。

C++

1 void onestep(int n,double A[N][N],double *e0){ 2 //略 3 e0=0;//これ、ダメでしょう 4 //略 5 } 6 7 //べき乗法の指示 8 //この関数のローカル変数e0の名前をeeに変える 9 void multiIter(int n,double A[N][N],int kmax,double *ee){ 10 //略 11 onestep(n,A,ee); 12 } 13 printf("e0=%f\n",*ee); 14 }

multiIterのローカルのee変数はdouble型です。
なら、onestepの第3バラメータがdouble
型を要求しているのですから、(値がどうなっているかは知りませんが)そのまま渡すしかないでしょう。逆に、最後のprintfでは浮動小数点型を要求しているのですから、doubleの変数にはをつけないと、ですね。

余計なことを言えば、そんなところにポインタを使って混乱していないで、素直に関数が返す型をdoubleにすればよかったりしませんか?

投稿2021/01/23 05:42

編集2021/01/23 05:43
thkana

総合スコア7703

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

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

langhtorn

2021/01/23 07:41

そうですね。ポインタを使わないやり方も考えてみます。アドバイスありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問