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

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

ただいまの
回答率

90.12%

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 973

cooh2

score 4

この部分にエラーが出て→ 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;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cooh2

    2018/12/07 19:28

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

    キャンセル

  • y_waiwai

    2018/12/07 19:39

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

    キャンセル

  • cooh2

    2018/12/07 19:43

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

    キャンセル

回答 3

+1

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/07 20:26

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

    キャンセル

  • 2018/12/07 20:40

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

    キャンセル

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)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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も型が違うから渡せないんじゃないかと・・・。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る