Подсказка написать реентерабельную функцию суммы

Я должен написать нормальную функцию суммы и реентерабельную в C. Я должен передать int, и она должна быть добавлена ​​в INIT_VALUE. В реентерабельной функции основной проход 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;
}

1 ответ

Решение

С функцией подписи в вашей программе (int somma_r(int x, int* saveptr)Вы не можете инициализировать указатель при первом вызове.

Вам, вероятно, нужно это (3 строки вашего кода изменены):

...
int s   = INIT_VALUE;     // otherwise s will not be initialized
int s_r = INIT_VALUE;     // otherwise s_r will not be initialized
int stato = INIT_VALUE;   // state to be used with the somma_r function
    ...
    s_r = somma_r(x, &stato);
    ...

функция somma_r

int somma_r(int x, int* saveptr){
  *saveptr += x;
  return *saveptr;
}

Версия с инициализацией внутри somma_r функция. Это требует изменения подписи 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;
}
Другие вопросы по тегам