0

我在下一个代码中有一个奇怪的错误(它正在执行多项式除法)。不确定,但正如我所见,问题出在方法的声明中。在代码之后,我列出了我不断遇到的错误。

这是代码:

  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

感谢帮助!:)

4

4 回答 4

2

一点都不“奇怪”。

C 没有数组作为一等公民;你不能从函数中返回它们。

另外,这个:

int size=sizeof(d)/sizeof(d[0]);

无效,因为传递给函数的任何数组都将衰减为指向第一个元素的指针,因此sizeof d将是sizeof (int *). 您需要将数组长度作为单独的参数传递。

于 2013-04-22T13:54:23.120 回答
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;
}
于 2013-04-22T13:52:04.187 回答
0

您不能在 c 中返回数组。

所以int[] mul(int d[],int t,int idxq);无效。

我也看到你有int size=sizeof(d)/sizeof(d[0]);一些你的功能。这通常不会为您提供数组的长度。如果您在编译时知道它,它只会为您提供数组的长度。

于 2013-04-22T13:52:05.257 回答
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)
                 ^^^^^^

注意使用 ofsize_t而不是,int它实际上是作为参数的:typemalloc

void *malloc(size_t size);

他们回来typesizeof

于 2013-04-22T13:57:45.080 回答