传递参数使得指针没有强制转换?

时间:2017-03-29 18:23:37

标签: c

我在编写代码方面遇到了问题。 我一直收到这些错误。

" C:194警告传递参数3' matrix_column_subtract'在没有强制转换的情况下从整数生成指针"

" C:12注意:预期'加倍**'但是参数是类型' int'

" C:194错误的函数参数太少' matrix_column_subtract'

我想我知道发生了什么我调用matrix_column_multiply是一个空洞,我需要将它称为指针指针我认为并且我不知道如何改变它。如果有人有一些想法,我怎么能得到这个编译,将非常感谢!!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define DEBUG 0
#define MAX_ITER 10000

double *eigen (int n, double **A);
void qr_decomp (int n, double **A, double **Q, double **R);

void matrix_copy_column(double **msrc, int col1, double **mdst,int col2, int rows);
void matrix_column_subtract(double **m1, int c1, double **m2, int c2, int rows);
void matrix_column_multiply(double **m, int c, double k, int rows);


int main() {

    int i, n = 126;
    double *eig, **Am;
    FILE *BinInp, *TxtOut;

    /* Input Code: Reads bv, Am in binary form from CGrad.bin */
    if ( (BinInp = fopen("CGrad.bin","r")) == NULL ) {
        fprintf(stderr, "Cannot open matrix binary file INPUT... exiting\n");
        exit(-1);
    }

    Am = (double**)malloc (n*sizeof(double*));
    Am[0] = (double*)malloc (n*n*sizeof(double));
    for (i = 1; i < n; ++i) {
        Am[i] = Am[0] + i*n;
    }
    for (i = 0; i < n; i++) {
        if (i==0) { /* Read one extra line that is discarded (bv is still in bin       file) */
            if (!fread(Am[i], sizeof(double), n, BinInp)) {
                fprintf(stderr, "Cannot read row Am[%03d] of matrix...      exiting\n", i+1);
                exit(1);
            }
        }
        if (!fread(Am[i], sizeof(double), n, BinInp)) {
            fprintf(stderr, "Cannot read row Am[%03d] of matrix... exiting\n",  i+1);
            exit(1);
        }
    }

    if (fclose(BinInp) == EOF) {
        fprintf(stderr, "Cannot close matrix binary file INPUT... exiting\n");
        exit(-1);
    }

    /* COMPUTE EIGENVALUES HERE USING FUNCTIONS. RETURN EIGENVALUES (AS 1D    VECTOR) TO eig. */
    if (DEBUG) printf ("Calling eigen\n");
    eig = eigen (n, Am);

    /* Output Code: Writes eig in text form to Eigs.txt */

    if ( (TxtOut = fopen("Eigs.txt", "w")) == NULL ) {
        fprintf(stderr, "Cannot open matrix text file OUTPUT... exiting\n");
        exit(-1);
    }
    for (i = 0; i < n; i++) {
        fprintf (TxtOut, "%18.14e ", eig[i]);
    }

    if (fclose(TxtOut) == EOF) {
        fprintf(stderr, "Cannot close matrix text file INPUT... exiting\n");
        exit(-1);
    }

    return 0;
}

double* eigen (int n, double **Acur)
{
    double err = 1, eps = 1e-2;
    double ndenom, nnumer, temp;
    double *eig, **Anex, **Qsub, **Rsub;
    int i, j, k, iters = 1;

    /* Malloc memory for the three matricies */
    Anex = malloc (n*sizeof(double*));
    Anex[0] = malloc (n*n*sizeof(double));
    for (i = 1; i < n; ++i) {
        Anex[i] = Anex[0] + i*n;
    }
    Qsub = malloc (n*sizeof(double*));
    Qsub[0] = malloc (n*n*sizeof(double));
    for (i = 1; i < n; ++i) {
        Qsub[i] = Qsub[0] + i*n;
    }
    Rsub = malloc (n*sizeof(double*));
    Rsub[0] = malloc (n*n*sizeof(double));
    for (i = 1; i < n; ++i) {
        Rsub[i] = Rsub[0] + i*n;
    }

    /* Malloc memory for the return eig vector */
    eig  = malloc (n*sizeof(double));
    for (i = 0; i < n; i++) {
        eig[i] = 0;
    }

    /* Enter main iteration loop for eigenvalues */
    while (err > eps && iters < MAX_ITER) {

        /* QR Decompose Acur then find next iterate value in Anex */
        qr_decomp (n, Acur, Qsub, Rsub);
        // FIND NEXT ITERATE VALUE, PUT IN Anex.

        /* Determine relative error change, reset "old" iterate value. */
        ndenom = 0;
        nnumer = 0;
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                temp = Anex[i][j]-Acur[i][j];
                ndenom += temp*temp;
                nnumer += Anex[i][j]*Anex[i][j];

                Acur[i][j] = Anex[i][j];
            }
        }
        err = sqrt(ndenom)/sqrt(nnumer);

        /* Increment the iteration count and report error */
        if (iters % 25 == 0) {
            printf ("Error at end of iteration %05d = %14.10f %%\n", iters,   100*err);
        }
        ++iters;
    }
    printf ("Error at end of iteration %05d = %14.10f\nCONVERGED.\n", iters-1, err);

    if (iters == MAX_ITER) {
        printf ("WARNING: MAX_ITER iterations reached!...\n");
    }

    /* Copy diagonal entries of Acur into eig for return to main */
    for (i=0; i<n; i++) {
        eig[i] = Acur[i][i];
    }
    return eig;
}

void qr_decomp (int n, double **Adec, double **myQ, double **myR) 
{
    int i, j, k; /* Loop Variables: this is all you should need! */
    double **T, **S;
    double r;

    T = malloc (n*sizeof(double*));
    T[0] = malloc (n*n*sizeof(double));
    for (i = 1; i < n; ++i) {
        T[i] = T[0] + i*n;
    }

    S = malloc (n*sizeof(double*));
    S[0] = malloc (n*n*sizeof(double));
    for (i = 1; i < n; ++i) {
        S[i] = S[0] + i*n;
    }

    /* Main loop for decomposition */
    for (i=0; i<n; i++) {
        /* Column i of Q is initially column i of A */

        matrix_copy_column(Adec,i,myQ,i,n);

        /* For j < i-1, Perform the dot product between the j row of Q and the
        i row of A to determine the R(j,i) value, then insure the Q i column
        is orthogonal to all other Q columns by subtracting existing Q columns
        from it. */

        for (j = 0; j < i; j++) {

            //r[j,i] = Qj^T * Ui
            matrix_copy_column(myQ,j,T,0,n);
            matrix_copy_column(Adec,i,S,0,n);

            for (k=0; k<n; k++) {
                r += T[k][0] * S[k][0];
            }
            /* Determine the R diagonal as the magnitude of the Q column, then
            normalize the Q column (make it a unit vector). */

            //Qi = Ui

            myR[j][i] = r;

            // Something wrong here.
            // There is one parameter missing, as matrix_column_subtract needs 5 parameters and
            // only 4 are given.
            // Also, matrix_column_multiply is defined as returning a void, whereas the   3rd parameter
            // of matrix_column_subtract should be a double **

            matrix_column_subtract(myQ,i,matrix_column_multiply(T,0,r,n),j);

        }
    }
}


/* Copies a matrix column from msrc at column col1 to mdst at column col2 */
void matrix_copy_column(double **msrc, int col1, double **mdst,int col2, int rows) {
    int i = 0;
    for (i=0; i<rows; i++) {
        mdst[i][col2] = msrc[i][col1];
    }
}

/* Subtracts m2's column c2 from m1's column c1 */
void matrix_column_subtract(double **m1, int c1, double **m2, int c2, int rows) {
    int i = 0;
    for (i=0; i<rows; i++) {
        m1[i][c1] -= m2[i][c2];
    }
    /*return m1;*/
}

void matrix_column_multiply(double **m, int c, double k, int rows) {
    int i = 0;
    for (i=0; i<rows; i++) {
        m[i][c] *= k;
    }
    /*return m;*/
}

1 个答案:

答案 0 :(得分:0)

问题出在这里。

matrix_column_subtract(myQ,i,matrix_column_multiply(T,0,r,n),j);

相关的功能签名是:

void matrix_column_subtract(double **m1, int c1, double **m2, int c2, int rows);
void matrix_column_multiply(double **m, int c, double k, int rows);

请注意,matrix_column_multiply返回void,但您将其传递为double **。我猜测编译器正在拼命尝试使它工作并返回某种垃圾整数。

这些函数返回void,因为它们直接在相关矩阵上完成工作。 matrix_column_multiply改变mmatrix_column_subtract改变m1

要使其有效,请在matrix_column_multiply上致电T,然后将T(现在通过乘法修改)传递到matrix_column_subtract

matrix_column_multiply(T, 0, r, n);
matrix_column_subtract(myQ, i, T, j, ...rows...);

你仍然缺少第五个参数rows。我猜这是n,与用于每个其他matrix_column_blah调用的行相同。