C 提示写一个可重入的求和函数

C 提示写一个可重入的求和函数,c,linux,pointers,reentrancy,C,Linux,Pointers,Reentrancy,我必须用C写一个正规和函数和一个可重入函数。我必须传递一个int,并且它必须被加到INIT_值上。在可重入函数中,main传递int*以保持状态。如何在第一次调用时初始化此指针?我必须在乐趣中初始化它,而不是在主要方面。谢谢 #include <stdio.h> #ifndef INIT_VALUE #define INIT_VALUE 0 #endif int somma(int x){ static int val = INIT_VALUE; val += x;

我必须用C写一个正规和函数和一个可重入函数。我必须传递一个int,并且它必须被加到INIT_值上。在可重入函数中,main传递int*以保持状态。如何在第一次调用时初始化此指针?我必须在乐趣中初始化它,而不是在主要方面。谢谢

#include <stdio.h>
#ifndef INIT_VALUE
#define INIT_VALUE 0
#endif

int somma(int x){
    static int val = INIT_VALUE;
    val += x;
    return val;
}

int somma_r(int x, int* saveptr){
    // pointer initialize and sum
    // return old_value ;
}

int main (){
int x;
int s;
int s_r;
int *stato;
fscanf(stdin,"%d",&x);
while(x>=0){
    s = somma(x);
    s_r = somma_r(x,stato);
       fscanf(stdin,"%d",&x);
   }
   printf("%d\n",s);
   printf("%d\n",s_r);
   return 0;
}
#包括
#ifndef初始值
#定义初始值0
#恩迪夫
int-somma(int-x){
静态int val=初始值;
val+=x;
返回val;
}
int somma_r(int x,int*saveptr){
//指针初始化和求和
//返回旧的_值;
}
int main(){
int x;
int-s;
国际统计局;
int*stato;
fscanf(标准输入、%d、&x);
而(x>=0){
s=somma(x);
s_r=somma_r(x,stato);
fscanf(标准输入、%d、&x);
}
printf(“%d\n”,s);
printf(“%d\n”,s\u r);
返回0;
}

如果程序中有函数签名(
int-somma\r(int-x,int*saveptr)
),则无法在第一次调用时初始化指针

您可能需要这样做(修改3行代码):

somma_r函数

int somma_r(int x, int* saveptr){
  *saveptr += x;
  return *saveptr;
}
somma_r
功能中带有初始化的版本。这需要修改
somma\u r
的签名:

int somma_r(int x, int **saveptr){
  if (*saveptr == NULL) {
    *saveptr = malloc(sizeof(int));
    **saveptr = INIT_VALUE;
  }

  **saveptr += x;
  return **saveptr;
}    

int main (){
  int x;
  int s = 0;
  int s_r = 0;
  int *stato = NULL;
  fscanf(stdin,"%d",&x);

  while(x>=0){
    s = somma(x);
    s_r = somma_r(x,&stato);
    fscanf(stdin,"%d",&x);
  }

  printf("%d\n",s);
  printf("%d\n",s_r);
  return 0;
}

我必须在乐趣中初始化它,而不是在主要方面。没有。为什么?使用指向指针的指针,并在函数内部使用。例如,
intsomma_r(intx,int**saveptr){*saveptr=malloc(sizeof(int);}
是的,诅咒。。不久前,我读到了(如果我没记错的话)你和奥拉夫的讨论。我不得不像斯特克一样使用somma_r。当我调用strtok_r时,我使用一个指针,但我没有设置它NULL@user3357296
strtok\u r
与您的
somma\u r
函数有很大不同。从
strtok_r
文档中:在第一次调用strtok_r()时,str应该指向要解析的字符串,saveptr的值被忽略。在后续调用中,str应为NULL,saveptr应自上次调用以来保持不变。。但是您没有将空ptr传递给somma_r的选项。试着用与strtok描述类似的方式描述你的
somma_r
函数,你会发现这是不可能的。
int somma_r(int x, int **saveptr){
  if (*saveptr == NULL) {
    *saveptr = malloc(sizeof(int));
    **saveptr = INIT_VALUE;
  }

  **saveptr += x;
  return **saveptr;
}    

int main (){
  int x;
  int s = 0;
  int s_r = 0;
  int *stato = NULL;
  fscanf(stdin,"%d",&x);

  while(x>=0){
    s = somma(x);
    s_r = somma_r(x,&stato);
    fscanf(stdin,"%d",&x);
  }

  printf("%d\n",s);
  printf("%d\n",s_r);
  return 0;
}