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

Posted

技术标签:

【中文标题】c中多维数组的编译器错误【英文标题】:compiler errors with multi dimensional arrays in c 【发布时间】:2011-10-18 16:47:46 【问题描述】:

这是我第一次使用 C。我必须在 C 中完成我的数字数学作业。

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

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

【问题讨论】:

您可能想探索其他有关 C 中数组的有用帖子,例如:***.com/questions/4051/… 阅读comp.lang.c FAQ 的第 6 部分。它非常很好地解释了 C 中数组和指针之间的关系。 【参考方案1】:

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

#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 的基础知识。 花点时间回顾一下你的概念。

【讨论】:

你今天过得不好还是怎么了?为什么对OP这么粗鲁?他说得对,他是个初学者,没必要因此贬低他。 没关系,但请花点时间理解指针和数组之间的关系。 您的代码声明 inMatrix 采用特定(硬编码)矩阵大小,并传入一个可能不同大小的 VLA。而且任意大小的限制也是有问题的。 @jb。我没有粗鲁。我对帮助初学者没有任何问题,但是人们在编写代码之前确实需要理解这些概念,这对于所要求的代码来说太明显了。我只是提供免费建议,供 OP 跟进。 @nikhil:如果“不完美”是指“会导致段错误”,那么你是正确的。并且不需要double** 或堆分配。正确的解决方案是 VLA 参数。【参考方案2】:

好吧,我不太清楚你的任务是什么,但让我们看看第一个函数

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

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

void inMatrix(double* matrix, int n)

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

双myArray[16];

inMatrix(myArray, 4);

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

【讨论】:

天哪。好的,我现在理解了简单的 C 语言的 alloc 我用 php 和一点 python 编程过。而且 martix 更不稳定 另外,我应该在示例中使用 double myArray[4][4] 并告诉您将参数声明为 double**,因为它是一个二维数组。对于造成的混乱,我深表歉意。

以上是关于c中多维数组的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

初始化 C/C++ 多维数组时忽略大小

使用 typedef、多维数组和指针时出现编译器错误

多维数组

来自 C 函数的多维字符数组返回错误

正确分配多维数组

C# - 更改多维数组元素类型