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

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

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

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

Q&A

3回答

4061閲覧

引数のパラメータと互換性について

cooh2

総合スコア10

C++

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

0グッド

0クリップ

投稿2018/12/07 09:48

編集2022/01/12 10:55

この部分にエラーが出て→ sweep(c, t, 3, 4, iwork, ILL);
型"double”の引数は型”int*"とのパラメータとの互換性がありませんと出ます

また、void sweep(double *, double *, int, int, int *, int);が変換できないと出てきます。書き直し方を教えてください

#include<stdio.h> #include<math.h> #include<stdlib.h> #define eps 1.e-5 void sweep(double *, double *, int, int, int *, int); void DS0(double *, double *, int *, double *, double *, int, int); void FUN(double *, double *, double *, int, double *, int *); void main(void) { double a[1], da[1], x[7], y[7]; int i, n, delta[1]; scanf_s("%d", &n); for (i = 0; i < n; ++i) scanf_s("%1f %1f", &x[i], &y[i]); scanf_s("%1f %1f", &a[0], &da[0]); printf("Iteration b(1) b(2) b(3) a f\n"); DS0(a, da, delta, x, y, 1, n); } void DS0(double *pa, double *pda, int *pdelta, double *px, double *py, int m, int n) { double ak, akp, akm, f0, fp, fm; int k, j, iteration = 0; for (k = 0; k < m; ++k) { *(pdelta + k) = 1; } FUN(pa, px, py, n, &f0, &iteration); do { j = 0; for (k = 0; k < m; ++k) { ak = *(pa + k); akp = *(pa + k) + *(pda + k); akm = *(pa + k) - *(pda + k); if (*(pdelta + k) == 1) { *(pa + k) = akp; FUN(pa, px, py, n, &fp, &iteration); if (f0 > fp) { *(pdelta + k) = 1; f0 = fp; break; } else { *(pa + k) = akm; FUN(pa, px, py, n, &fm, &iteration); if (f0 > fm) { *(pdelta + k) = -1; f0 = fm; break; } else { j++; *(pa + k) = ak; } } } else { *(pa + k) = akm; FUN(pa, px, py, n, &fm, &iteration); if (f0 > fm) { *(pdelta + k) = -1; f0 = fm; break; } else { *(pa + k) = akp; FUN(pa, px, py, n, &fp, &iteration); if (f0 > fp) { *(pdelta + k) = 1; f0 = fp; break; } else { j++; *(pa + k) = ak; } } } } } while (j != m); printf("*** SOLVED ***\n"); FUN(pa, px, py, n, &f0, &iteration); return; } void FUN(double *pa, double *px, double *py, int n, double *pf, int *pi) { double b[3], c[3][4], iwork[3], t[3], yi; int i, ILL; c[0][0] = n; c[0][1] = 0.; c[0][2] = 0.; c[0][3] = 0.; c[1][1] = 0.; c[1][2] = 0.; c[1][3] = 0.; c[2][2] = 0.; c[2][3] = 0.; for (i = 0; i < n; i++) { c[0][1] += log10(*(px + i)); c[1][1] += log10(*(px + i))*log10(*(px + i)); c[0][2] += pow(log10(*(px + i)), *(pa + 0)); c[1][2] += pow(log10(*(px + i)), *(pa + 0) + 1.); c[2][2] += pow(log10(*(px + i)), 2.**(pa + 0)); c[0][3] += *(py + i); c[1][3] += *(py + i)*log10(*(px + i)); c[2][3] += *(py + i)*pow(log10(*(px + i)), *(pa + 0)); } c[1][0] = c[0][1]; c[2][0] = c[0][2]; c[2][1] = c[1][2]; sweep(c, t, 3, 4, iwork, ILL); for (i = 0; i < 3; ++i) { b[i] = c[i][3]; } *pf = 0.; for (i = 0; i < n; ++i) { yi = b[0] + b[1] * log10(*(px + i)) + b[2] * pow(log10(*(px + i)), *(pa + 0)); *pf += (*(py + i) - yi)*(*(py + i) - yi); } printf("%6d %12.3e%12.3e%12.3e%7.2f%11.2e\n", *pi, b[0], b[1], b[2], *(pa + 0), *pf); ++*pi; return; } void sweep(double *pa, double *pt, int n, int m, int *piwork, int ILL) { double max, w; int i, j, k, iw, p, q; for (i = 0; i < n; ++i) { max = fabs(*(pa + m * i)); for (j = 0; j < n; ++j) { if (max < fabs(*(pa + m * i + j))) max = fabs(*(pa + m * i + j)); } for (j = 0; j < m; ++j)*(pa + m * i + j) = *(pa + m * i + j) / max; } for (j = 0; j < n; ++j) { max = fabs(*(pa + j)); for (i = 0; i < n; ++j) { if (max < fabs(*(pa + m * i + j))) max = fabs(*(pa + m * i + j)); } *(pt + j) = max; for (i = 0; i < n; ++i) *(pa + m * i + j) = *(pa + m * i + j) / max; } for (i = 0; i < n; ++i) { *(piwork + i) = i; } for (k = 0; k < n; ++j) { max = fabs(*(pa + m * k + k)); p = k; q = k; for (j = k; j < n; ++j) { for (i = k; i < n; ++i) { if (max < fabs(*(pa + m * i + j))) { max = fabs(*(pa + m * i + j)); p = i; q = j; } } } if (max <= eps) { ILL = 1; printf("MATRIX IS ILL\n"); return; } for (i = 0; i < n; ++i) { w = *(pa + m * i + k); *(pa + m * i + k) = *(pa + m * i + q); *(pa + m * i + q) = w; } for (j = k; j < m; ++j) { w = *(pa + m * k + j); *(pa + m * k + j) = *(pa + m * p + j); *(pa + m * p + j) = w; } i = *(piwork + k); *(piwork + k) = *(piwork + q); *(piwork + q) = i; for (j = k + 1; j < m; ++j) { *(pa + m * k + j) = *(pa + m * k + j) / (*(pa + m * k + k)); } for (i = 0; i < n; ++i) { if (i != k) { for (j = k + 1; j < m; ++j) { *(pa + m * i + j) = *(pa + m * i + j) - *(pa + m * i + k)*(*(pa + m * k + j)); } } } } for (j = n; j < m; ++j) { for (i = 0; i < n; ++i) { iw = *(piwork + i); *(pa + m * iw + n - 1) = *(pa + m * i + j); } for (i = 0; i < n; ++i) { *(pa + m * i + j) = *(pa + m * i + n - 1) / (*(pt + i)); } } system("pause"); return; }

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

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

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

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

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

Zuishin

2018/12/07 09:57 編集

パラメータというのは呼び出される関数で宣言されたもの、引数は呼び出し側が渡すもので、この型が一致しなくてはなりません。int* を要求しているところに double を渡すとそのようなエラーが出ます。
cateye

2018/12/07 10:25

このまま(関数のコードだけ)では、確認が出来ません。最低限コンパイル出来る(エラーが出るのはOK)状態のソースを貼り付けて下さい。
cooh2

2018/12/07 10:28

ありがとうございます。貼り付けます。
y_waiwai

2018/12/07 10:39

コードは、<code>ボタンで、’’’の枠の中に貼り付けてください
cooh2

2018/12/07 10:43

すみません。貼り付けなおしました
guest

回答3

0

sweep(c, t, 3, 4, iwork, ILL);

第5引数はint* の指定となってますが、実際は double* (iwork) が渡されています。
これではきちんと動かないため、どうにかしましょう

関数の定義が間違っているのか、あるいは呼び出し時の引数が間違ってるのかどっちでしょうか

投稿2018/12/07 11:06

編集2018/12/07 11:10
y_waiwai

総合スコア87719

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

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

cooh2

2018/12/07 11:26

解決策はありますか?線形最小2乗法という問題なのですが…
y_waiwai

2018/12/07 11:40

そりゃsweepの定義をその引数の型に合わせるか、引数の方をsweepの型に合わせるか、というはなしになろうかと思いますが、どっちが正解なんでしょうか。 #コードのナカミは読んでません
guest

0

自分もコードの中身はそんなに読んでいませんが、

void sweep(double *, double *, int, int, int *, int);
void FUN(double *pa, double *px, double *py, int n, double *pf, int *pi) { double b[3], c[3][4], iwork[3], t[3], yi; 〜〜〜〜 sweep(c, t, 3, 4, iwork, ILL);

cも型が違うから渡せないんじゃないかと・・・。

投稿2018/12/15 05:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

最低限のエラー修正(main()がvoidだったり)をして、以下のエラーが出ます。
また、なぜCのヘッダを使っているのでしょう?

usr~/test/cpp % c++ -c s1.cpp s1.cpp:16:5: error: use of undeclared identifier 'scanf_s' scanf_s("%d", &n); ^ s1.cpp:18:9: error: use of undeclared identifier 'scanf_s' scanf_s("%1f %1f", &x[i], &y[i]); ^ s1.cpp:19:5: error: use of undeclared identifier 'scanf_s' scanf_s("%1f %1f", &a[0], &da[0]); ^ s1.cpp:114:5: error: no matching function for call to 'sweep' sweep(c, t, 3, 4, iwork, ILL); ^~~~~ s1.cpp:8:6: note: candidate function not viable: no known conversion from 'double [3][4]' to 'double *' for 1st argument void sweep(double *, double *, int, int, int *, int); ^ s1.cpp:146:21: warning: variables 'i' and 'n' used in loop condition not modified in loop body [-Wfor-loop-analysis] for (i = 0; i < n; ++j) { // iが加算されてない! ^ ~ 1 warning and 4 errors generated. usr~/test/cpp %

scanf_s()は実装依存で、ないコンパイラも有ります。データ長が決まっているもの(intなど)は通常のscnf()を使いましょう。(scanf()は使わないのが一番ですがw)

投稿2018/12/07 10:59

編集2018/12/07 11:02
cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問