c 中多维数组的编译器错误

发布于 2024-12-10 11:39:06 字数 3940 浏览 1 评论 0原文

这是我第一次使用 C。我必须用 C 做我的数值数学作业。

所以我在使用多维数组时遇到了问题。我现在不知道为什么会出现以下错误:

  • 下标值既不是数组也不是指针也不是向量下
  • 标值既不是数组也不是指针也不是向量
  • 在函数“inMatrix”中: 错误:下标值既不是数组,也不是指针,也不是向量|
  • 在函数“inVector”中:| 错误:下标值既不是数组,也不是指针,也不是向量|
  • 在函数“outVector”中:| 错误:下标值既不是数组,也不是指针,也不是向量|
  • 在函数“主”中:| 错误:'plu'| 的参数 2 的类型不兼容
  • 注意:预期为“float (*)[(long unsigned int)(k)]”,但参数的类型为“float”| 错误:'plu'| 的参数 3 的类型不兼容
  • 预期为“float *”,但参数的类型为“float”|

例如: 我不知道为什么当我没有使用浮点指针时它会抱怨“float *”。在谷歌上搜索没有返回任何结果,所以我不知道错误是什么。我不明白这个错误“下标值既不是数组也不是指针也不是向量”。

我能做些什么?如何重写源代码以消除这些编译器错误?

抱歉我的英语不好。

#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;
}

This is the first time, when I'm using C. I have to do my numeric mathematics homework in C.

So I have problem using multi dimensional arrays. I don't now why I'm getting the following errors:

  • subscripted value is neither array nor pointer nor vector
  • subscripted value is neither array nor pointer nor vector
  • In function ‘inMatrix’:
    error: subscripted value is neither array nor pointer nor vector|
  • In function ‘inVector’:|
    error: subscripted value is neither array nor pointer nor vector|
  • In function ‘outVector’:|
    error: subscripted value is neither array nor pointer nor vector|
  • In function ‘main’:|
    error: incompatible type for argument 2 of ‘plu’|
  • note: expected ‘float (*)[(long unsigned int)(k)]’ but argument is of type ‘float’|
    error: incompatible type for argument 3 of ‘plu’|
  • expected ‘float *’ but argument is of type ‘float’|

For example:
I don't know why it is complaining about the 'float *' when I didn't use a float pointer.Searching on google didn't return any results, so I don't know what the error is. I don't understand this error 'subscripted value is neither array nor pointer nor vector'.

What can I do? How can I rewrite my source code to get rid of these compiler errors?

Sorry for my poor English.

#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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我的影子我的梦 2024-12-17 11:39:06

在这里,我已经为您修复了编译器错误。
我不会费心去详细解释这些错误,因为你显然需要先读一本好书。

#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;
}

你的错误表明你根本不了解C的基础知识。
花一些时间回顾一下你的概念。

Here, I've fixed the compiler errors for you.
I won't bother to explain in detail the errors as you clearly need to read a good book first.

#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;
}

Your errors show that you don't understand the basics of C at all.
Take some time to review your concepts.

柠檬 2024-12-17 11:39:06

好吧,我不太清楚你的分配是什么,但让我们看一下

我看到的第一个函数,你正在尝试迭代大小为 n 的方阵并将双值从 stdin 读取到矩阵中。其输入参数不应该是 (double, int)。它应该是(double*, int)。 double* 是双精度数组。如果你只用一个 double 声明这个函数(就像你所做的那样),那么程序将为堆栈上的一个 double 分配足够的空间,并且你的 for 循环将写入重要的内存(我的意思是它很可能只是崩溃)对于大于 1 的数组大小。此外,以这种方式声明它意味着在堆栈上找到此函数调用的内存。这意味着一旦函数结束,您设置的数组值将永远丢失。

相反,您需要像这样声明它:

void inMatrix(double* matrix, int n)

并在调用它时传入一个数组。

双 myArray[16];

inMatrix(myArray, 4);

我希望这有帮助。我不确定您对指针/数组了解多少。

Well, I'm not totally clear on what your assignment was but lets look at the first function

I see you are trying to iterate through a square matrix of size n and read double-values from stdin into the matrix. The input parameter for this should not be (double, int). It should be (double*, int). A double* is an array of doubles. If you declare this function with just a double (like you did), then the program will allocate enough space for one double on the stack and your for-loop will be writing on important memory (and by that I mean it will most likely just crash) for array sizes bigger than one. Also, declaring it this way means the memory is found on the stack for this function call. This means that once the function is over, your array values you set are lost forever.

Instead, you need to declare it like:

void inMatrix(double* matrix, int n)

and pass in an array when you call it.

double myArray[16];

inMatrix(myArray, 4);

I hope this is helpful. Im not sure how much you understand about pointers/arrays.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文