Почему мой указатель на структуру забывает строки? - PullRequest
0 голосов
/ 11 апреля 2019

В моих основных функциях у меня есть два игрока, которые представлены структурами с данными, включая имена.Когда в другом исходном файле я создаю указатель на эти структуры, я не могу получить доступ к именным строкам, тогда как с остальными данными все в порядке.

//In pokemonList.c
typedef struct{

    char name[20];
    int level;
    int health;
    int type;
    int type2;


    int fainted;


    int moves[4];

    //stats
    int hp;
    int attack;
    int defense;
    int spAttack;
    int spDefense;
    int speed;

    int attackStage;
    int defenseStage;
    int spAttackStage;
    int spDefenseStage;
    int speedStage;

    int spriteNo;

}Pokemon;

Pokemon summon(Pokemon pokemon, int level){
    pokemon.level = level;
    pokemon.health = (int)((((2.0 * (double)pokemon.hp) + 31.0) * (double)level)/100.0) + (double)level + 10.0;
    pokemon.attack = levelUp(pokemon.attack, pokemon.level);
    pokemon.defense = levelUp(pokemon.defense, pokemon.level);
    return pokemon;
}

//In main.c
player1 = summon(venusaur, 50);
player2 = summon(blastoise, 100);

initialiseGUI(&player1, &player2);

//In video.c

void initialiseGUI(Pokemon *p1, Pokemon *p2){

    strcpy(player1name, p1->name);
    strcpy(player2name, p2->name);
    printf("p1->name: %s\n", p1->name);
    player1 = p1;
    player2 = p2;

    printf("p1->name: %s\nplayer1->name: %s\n", p1->name, player1->name);
}

Я ожидал, что результат этого будет:

p1->name: Venusaur

p1->name: Venusaur

player1->name: Venusaur

Фактический вывод:

p1->name: Venusaur

p1->name:

player1->name:

все остальные данные в структуре доступны из player1 -> ....

1 Ответ

2 голосов
/ 11 апреля 2019

player1 должен иметь тип Pokemon, поскольку он получает свое значение от функции summon, которая возвращает Pokemon

p1, имеет тип Pokemon * (он же указатель Pokemon)

и вы делаете player1 = p1;

Другими словами - вы присваиваете «указатель покемона» на «покемона», который является недопустимым.

То, что, похоже, происходитВы перезаписываете часть строки name переменной указателя и тем самым уничтожаете строковое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...