ошибки компилятора с многомерными массивами в c - PullRequest
0 голосов
/ 18 октября 2011

Это первый раз, когда я использую C. Я должен сделать домашнее задание по числовой математике на C.

Итак, у меня проблема с использованием многомерных массивов. Я не знаю, почему я получаю следующие ошибки:

  • подписанное значение не является ни массивом, ни указателем, ни вектором
  • подписанное значение не является ни массивом, ни указателем, ни вектором
  • В функции «inMatrix»: ошибка: подписанное значение не является ни массивом, ни указателем, ни вектором |
  • В функции «inVector»: | ошибка: подписанное значение не является ни массивом, ни указателем, ни вектором |
  • В функции «outVector»: | ошибка: подписанное значение не является ни массивом, ни указателем, ни вектором |
  • В функции «main»: | ошибка: несовместимый тип для аргумента 2 'plu ’|
  • примечание: ожидается ‘float (*) [(long unsigned int) (k)]’, но аргумент имеет тип «float» | ошибка: несовместимый тип для аргумента 3 'plu ’|
  • ожидается "float *", но аргумент имеет тип "float" |

Например: Я не знаю, почему он жалуется на 'float *', когда я не использовал указатель с плавающей точкой. Поиск в Google не дал никаких результатов, поэтому я не знаю, в чем ошибка Я не понимаю эту ошибку «значение в подписке не является ни массивом, ни указателем, ни вектором».

Что я могу сделать? Как я могу переписать свой исходный код, чтобы избавиться от этих ошибок компилятора?

Извините за мой плохой английский.

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

void inMatrix(double matrix, int n)
     {
     int j, i;
        for (i = 0; i < n; i++)
        {
            for (j= 0; j < n; j++)
            {
               scanf("%lf", &matrix[i][j]);
            }
        }
     }

void inVector(double vektor, int n)
     {
     int k;
        for (k = 0; k < n; k++)
        {
            scanf("%lf", &vektor[k]);
        }
     }

void outVector(double vektor, int n)
     {
     int k;
        for (k = 0; k < n; k++)
        {
            printf("%.8lf", vektor[k]);
        }
     }

int plu(int k, float A[k][k], float b[k], float x[k])
    {
        int P[k];
        int n, m, p, i, j;
        int d=0;
        int r=0;
        int T=0;
        float t=0;
        float y[k];
        //seged vektorok
        for(n=1; n<k;n++)
        {
            x[n]=0;
            y[n]=0;
        }
        // Permutaciós matrix
        // permutation
        for(i=1; i<k; i++)
        {
            P[i]=i;
        }
        // Rendezes
        // sorting
        for(d=1; d<k-1;d++)
        {
            p=0;
            for(i=d; i<k; i++)
                {
                    t=A[i][d];
                    if(t<0)
                        t=-1*t;
                    if(t>p)
                    {
                        p=t;
                        r=i;
                    }
                }
                //Ha szingularis
                //If singular
                if(p==0)
                {
                   // printf("szingularis");
                    return 1;
                }
                //Matrix Csere
                //Matrix change
                T=P[r];
                P[r]=P[d];
                P[d]=T;

                //matrix elem csere
                //matrix value change
                for(i=1; i<k; i++)
                {
                    t=A[r][i];
                    A[r][i]=A[d][i];
                    A[d][i]=t;
                }
                for(i=d+1;i<k;i++)
                {
                    A[i][d]=A[i][d]/A[d][d];
                    for(j=d+1; j<k; j++)
                    {
                        A[i][j]=A[i][j]-A[i][d]*A[d][j];
                    }
                }
            }
            // Megoldas Vektorra
            // Solve for Vector
            for(n=1; n<k;n++)
            {
                t=0;
                for(m=1;m<=n-1;m++)
                {
                    t+=A[n][m]*y[m];
                }
                y[n]=b[P[n]]-t;
            }
            for(n=k-1;n>=1;n--)
            {
                t=0;
                for(m=n+1; m<k;m++)
                {
                    t+=A[n][m]*x[m];
                }
                x[n]=(y[n]-t)/A[n][n];
            }
        return 0;
    }

int main()
{
    //int i,j,k, num,value;
    // d as numbers of dimmension
    int d;
    // Read dimension of array
    scanf("%d", &d);

    float matrix[d][d];
    float vector[d];

    inMatrix(matrix[d][d], d);
    inVector(vector[d], d);

    float resVector[d];

    if(plu(d,matrix[d][d],vector[d], resVector[d])==1)
    {
        printf("szingularis");
    }
    else
    {
        outVector(resVector[d], d);
    }

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

Ну, я не совсем понимаю, каково было ваше назначение, но давайте посмотрим на первую функцию

Я вижу, что вы пытаетесь перебрать квадратную матрицу размера n и прочитать двойные значения из stdinв матрицу.Входным параметром для этого не должно быть (double, int).Должно быть (double *, int).Двойной * - это массив парных символов.Если вы объявите эту функцию только с двойным (как вы это сделали), то программа выделит достаточно места для одного двойного в стеке, и ваш цикл for будет записывать в важную память (и я имею в виду, что, скорее всего, это будет простопадение) для размеров массива больше единицы.Кроме того, объявление этого способа означает, что в стеке найдена память для этого вызова функции.Это означает, что после завершения функции установленные вами значения массива теряются навсегда.

Вместо этого вам нужно объявить его следующим образом:

void inMatrix (double * matrix, int n)

и передайте массив при вызове.

double myArray [16];

inMatrix (myArray, 4);

Я надеюсь, что этополезно.Я не уверен, насколько хорошо вы понимаете указатели / массивы.

0 голосов
/ 18 октября 2011

Здесь я исправил ошибки компилятора.Я не стану подробно объяснять ошибки, так как вам необходимо сначала прочитать хорошую книгу.

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

void inMatrix(int n,double matrix[n][n])
     {
     int j, i;
        for (i = 0; i < n; i++)
        {
            for (j= 0; j < n; j++)
            {
               scanf("%lf", &matrix[i][j]);
            }
        }
     }

void inVector(double vektor[], int n)
     {
     int k;
        for (k = 0; k < n; k++)
        {
            scanf("%lf", &vektor[k]);
        }
     }

void outVector(double vektor[], int n)
     {
     int k;
        for (k = 0; k < n; k++)
        {
            printf("%.8lf", vektor[k]);
        }
     }

int plu(int k, double A[k][k], double b[k], double x[k])
    {
        int P[k];
        int n, m, p, i, j;
        int d=0;
        int r=0;
        int T=0;
        float t=0;
        float y[k];
        //seged vektorok
        for(n=1; n<k;n++)
        {
            x[n]=0;
            y[n]=0;
        }
        // Permutaciós matrix
        // permutation
        for(i=1; i<k; i++)
        {
            P[i]=i;
        }
        // Rendezes
        // sorting
        for(d=1; d<k-1;d++)
        {
            p=0;
            for(i=d; i<k; i++)
                {
                    t=A[i][d];
                    if(t<0)
                        t=-1*t;
                    if(t>p)
                    {
                        p=t;
                        r=i;
                    }
                }
                //Ha szingularis
                //If singular
                if(p==0)
                {
                   // printf("szingularis");
                    return 1;
                }
                //Matrix Csere
                //Matrix change
                T=P[r];
                P[r]=P[d];
                P[d]=T;

                //matrix elem csere
                //matrix value change
                for(i=1; i<k; i++)
                {
                    t=A[r][i];
                    A[r][i]=A[d][i];
                    A[d][i]=t;
                }
                for(i=d+1;i<k;i++)
                {
                    A[i][d]=A[i][d]/A[d][d];
                    for(j=d+1; j<k; j++)
                    {
                        A[i][j]=A[i][j]-A[i][d]*A[d][j];
                    }
                }
            }
            // Megoldas Vektorra
            // Solve for Vector
            for(n=1; n<k;n++)
            {
                t=0;
                for(m=1;m<=n-1;m++)
                {
                    t+=A[n][m]*y[m];
                }
                y[n]=b[P[n]]-t;
            }
            for(n=k-1;n>=1;n--)
            {
                t=0;
                for(m=n+1; m<k;m++)
                {
                    t+=A[n][m]*x[m];
                }
                x[n]=(y[n]-t)/A[n][n];
            }
        return 0;
    }

int main()
{
    //int i,j,k, num,value;
    // d as numbers of dimmension
    int d;
    // Read dimension of array
    scanf("%d", &d);

    double matrix[d][d];
    double vector[d];

    inMatrix(d,matrix);
    inVector(vector, d);

    double resVector[d];

    if(plu(d,matrix,vector, resVector)==1)
    {
        printf("szingularis");
    }
    else
    {
        outVector(resVector, d);
    }

    return 0;
}

Ваши ошибки показывают, что вы вообще не понимаете основ языка Си.Потратьте некоторое время, чтобы пересмотреть свои концепции.

...