C проблема с передачей указателя на структуру в функцию - PullRequest
2 голосов
/ 07 января 2020

У меня проблема с передачей структурного указателя на функцию с fscanf().

Вот моя структура:

typedef struct {
  int health;
  int y;
  int z;
} save;

в main У меня есть:

save save = { 0 }; //init with zeros
loadgame(&save);
health = save.health;

и моя функция loadgame() выглядит так:

bool loadgame(save* save) {
  FILE* fptr;
  fptr = fopen("savegame.txt", "r");
  if (fptr == NULL)
    return 0;
  fscanf(fptr, "health= %d", save->health);
  return 1;
};

В моем savegame.txt файле есть строка:

health= 5

, и моя функция не изменяется save->health, после окончания sh этой функции мое здоровье равняется нулю.

Я пытался выполнить свою функцию таким же образом, и у нее также есть то же решение в функции loadgame() Я изменил

fscanf(fptr, "health= %d", save-health);

до

fscanf(fptr, "health= %d", &(save-health));

Ответы [ 3 ]

2 голосов
/ 07 января 2020

Похоже, что ваш fscanf передает значение save-> health вместо своего адреса.

Вам нужно сделать

fscanf(fptr, "health= %d", &save->health);

Так как -> имеет приоритет над & это даст Вы адрес медицинского работника.

2 голосов
/ 07 января 2020

fscanf(fptr, "health= %d", save->health); -> fscanf(fptr, "health= %d", &save->health);

Здесь у вас есть рабочая версия для игры с https://godbolt.org/z/5CuZwR

Как в моем примере всегда проверить результат scanf

1 голос
/ 07 января 2020

fscanf нужен указатель, чтобы он знал, где сохранить значение. Помимо этого в вашем коде есть куча других мелких проблем. Я обратился к тем в комментариях ниже:

#include <stdio.h>
#include <stdbool.h>
typedef struct {
    int health;
    int y;
    int z;
}save_tp;

//using the same name for a typedef and a variable is a bad idea;
//typedef struct{...} foo; foo foo; prevents you from declaring other varibles of type foo
//as the foo variable overshadows the foo typedef name;
//better give types a distinct name


bool loadgame(save_tp* save){
    FILE* fptr;
    fptr = fopen("savegame.txt", "r");
    if (fptr == NULL)
        return false;
    bool r = (1==fscanf(fptr, "health= %d", &save->health)); //needs an address + may fail
    fclose(fptr); //need to close the file or you'd be leaking a file handle
    return r;
} //shouldn't have a semicolon here

int main(void)
{
    save_tp save={0};
    if (!loadgame(&save)) perror("nok");
    else printf("ok, health=%d\n", save.health);
}
...