Как использовать функцию структуры в другой структуре? - PullRequest
2 голосов
/ 06 мая 2020

Я делаю простой проект в C, в котором на данный момент я использую две структуры: Player и Card. Я создал две структуры в разных файлах заголовков, потому что функции в Player используют Card, а также другие элементы, которые я еще не сделал. Когда я пытаюсь использовать getId () в Player, компилятор VSCode говорит:

ссылка на внешний символ _getId не разрешена в _discardCard ()

код card.h :

#include <stdbool.h> 
typedef struct card{
    int id;
    bool black;
    int numElems;
    char* text[3];
}card;

card* initCard(int id,bool black,char* text[],int numElems)
int getId(card* c);

карта. c код:

#include "carta.h"
#include<stdio.h>
#include <stdbool.h>
#include <stdlib.h>

...
int getId(carta* c){
    return c->id;
}

Вместо этого код для Player.h:

#include "card.h"
#define CARDSMAX 5

typedef struct{
    bool master;
    int id;
    int points;
    char* nickname;
    card* cards[CARDSMAX];
    int NumCards;
}player;

... //other functions

card* discardCard(int id,player* g);

Код для Player. c это:

#include "player.h"
#include <stdio.h>
#include <stdlib.h>
player* initPlayer(char* nickname,int id){
    player* g=(player*) malloc(sizeof (player));
    g->id=id;
    g->nickname=nickname;
    g->master=false;
    g->points=0;
    g->NumCards=0;
    for(int i=0;i<CARDSMAX;i++){
        g->cards[i]=(card*)malloc(sizeof(card));
    }
    return g;
}

....   

card* DiscardCard(int id,player* g){
    for(int i=0;i<CARDSMAX;i++){
        card* c=g->cards[i];
        if(getId(c)==id){
            card* e= g->cards[i];
            g->cards[i]=NULL;
            g->NumCards--;
            return e;
        }
    }
    return NULL;
}

Кто-нибудь может мне помочь? (Если вы видите некоторую несогласованность в коде, это потому, что я пробовал быстрый перевод с моего языка)

1 Ответ

0 голосов
/ 07 мая 2020

Итак, как и предполагалось, проблема заключалась в том, что в компиляторе Windows ', когда вы используете структуру, которая использует функцию, определенную в других структурах, требуется передать файл .obj во время компиляции. Для этого вам нужно скомпилировать каждый файл. c, который используется другими пользователями, а затем связать файл .obj, созданный в этой фазе. Итак, в моем случае первым шагом является компиляция:

cl card.c

, которые создают card.obj (компилятор Windows 'может показать вам сообщение, которое говорит что-то вроде: «Начальная точка не указана. "если вы не используете main в этом первом файле, не беспокойтесь и продолжайте эту процедуру), а затем я компилирую:

cl player.c /link card.obj

Таким образом вы передаете скомпилированный объект, в котором он обеспечивает реализацию всех функций в структуре.

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