我在下一个代码中有一个奇怪的错误(它正在进行多项式除法)。 不确定,但正如我所见,问题在于方法的声明。在代码之后,我列出了我不断得到的错误。
这是代码:
1
2 int[] mul(int d[],int t,int idxq);
3 int[] sub(int a[],int b[]);
4 int check(int r[],int lengthr);
5 int[] cp(int a[]);
6 int[] div(int n[],int d[]);
7
8
9
10 int[] mul(int d[],int t,int idxq){
11 int i;
12 int size=sizeof(d)/sizeof(d[0]);
13 int c[size];
14 for(i=size-1;i>0;i--)
15 c[idxq+i]=d[i]+t;
16 return c;
17 }
18
19 int[] sub(int a[],int b[]){
20
21 int i;
22 int j;
23 int size=sizeof(a)/sizeof(a[0]);
24 int fin[size];
25 for(j=0;jsize;j++)
26 fin[j]=a[j];
27 for(i=0;isize;i++)
28 fin[i]=a[i]-b[i];
29
30 return fin;
31 }
32
33 int check(int r[],int lengthr){
34 int i;
35 for(i=0;i<lengthr;i++){
36 if(r[i]!=0)
37 return 1;
38 }
39 return 0;
40 }
41
42
43 int[] cp(int a[]){
44 int size=sizeof(a)/sizeof(a[0]);
45 int i;
46 int fin[size];
47 for(i=0;i<size;i++)
48 fin[i]=a[i];
49
50 return fin;
51 }
52
53 int[] div(int n[],int d[]){
54 int idxq=0;
55 int t=0;
56 int r[sizeof(n)/sizeof(n[0])]=cp(n);
57 int lengthr= sizeof(r)sizeof(r[0]);
58 int lengthd= sizeof(d)sizeof(d[0]);
59
60 while(check()!=0 && r[lengthr-1]=d[sizeof(d[0]])
61 t=r[lengthr-1]d[sizeof(d[0]])-1];
62 idxq=lengthr-d[sizeof(d[0]])-1]
63 q[idxq]=t;
64 r=sub[r,mul(d,t,idxq)];
65 idxq=0;
66
67 }
68
69 int main(){
70
71 int a[4]={-42,0,12,1};
72 int b[2]=(-3,1);
73 div(a,b);
74 }
以下是错误:
q6.c:2: error: expected identifier or Ç ( Ç before Ç [ Ç token
q6.c:3: error: expected identifier or Ç ( Ç before Ç [ Ç token
q6.c:5: error: expected identifier or Ç ( Ç before Ç [ Ç token
q6.c:6: error: expected identifier or Ç ( Ç before Ç [ Ç token
q6.c:10: error: expected identifier or Ç ( Ç before Ç [ Ç token
q6.c:19: error: expected identifier or Ç ( Ç before Ç [ Ç token
q6.c:43: error: expected identifier or Ç ( Ç before Ç [ Ç token
q6.c:53: error: expected identifier or Ç ( Ç before Ç [ Ç token
q6.c: In function Ç main Ç :
q6.c:72: error: invalid initializer
感谢您的帮助! :)
答案 0 :(得分:2)
根本不是“奇怪”。
C没有阵列作为一等公民;你无法从函数中返回它们。
另外,这个:
int size=sizeof(d)/sizeof(d[0]);
无效,因为传递给函数的任何数组都会衰减为指向第一个元素的指针,因此sizeof d
将为sizeof (int *)
。您需要将数组长度作为单独的参数传递。
答案 1 :(得分:0)
您无法从函数返回arrays
,但必要时可以返回指针。从
int[] mul(int d[],int t,int idxq);
到
int* mul(int d[],int t,int idxq);
并继续为有[]
的每个返回值执行此操作。
此外,您将返回指向本地对象的指针,这会导致最佳情况下的未定义行为,或者在最坏情况下使用SEGFAULT
导致程序崩溃。
为了从函数返回数组,您需要使用malloc()
在堆上分配它,并将原始数组的大小作为函数参数传递。例如
int* mul(int d[],int t,int idxq, int array_size){
int i;
int* c = malloc(array_size*sizeof(int));
for(i=array_size-1;i>0;i--)
c[idxq+i]=d[i]+t;
return c;
}
答案 2 :(得分:0)
您无法在c。
中返回数组所以int[] mul(int d[],int t,int idxq);
无效。
此外,我发现您的某些功能中有int size=sizeof(d)/sizeof(d[0]);
。这通常不会使您获得数组的长度。如果你在编译时知道它,它只会得到数组的长度。
答案 3 :(得分:0)
正如其他人所指出的那样,你不能从一个函数返回一个array
而你不能使用可变长度的数组而不使用动态分配,但是你也试图从堆栈中返回一个指向局部变量的指针例如,在cp
:
int fin[size];
//... other code
return fin;
^^^
fin
在函数堆栈上分配,退出后将不存在。一个可能的解决方案是通过malloc
使用动态内存并返回pointer
,但之后需要记住free
该内存:
int *fin = malloc(size*sizeof(int));
此方法还具有不需要const
大小的附加优势。我们现在回到这样一个事实:您无法返回array
,因此您的函数需要返回int *
:
int* cp(int a[], size_t size)
^^^^^^
请注意使用size_t
代替int
,type
实际上将malloc
作为参数:
void *malloc(size_t size);
他们返回sizeof
的type
。