多项式除法,方法

时间:2013-04-22 13:45:36

标签: c arrays

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

这是代码:

  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 个答案:

答案 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代替inttype实际上将malloc作为参数:

void *malloc(size_t size);

他们返回sizeoftype