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中多维数组的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章