【问题标题】:How to use a function of a struct in another struct?如何在另一个结构中使用结构的功能?
【发布时间】:2020-08-21 17:56:25
【问题描述】:

我正在用 C 语言做一个简单的项目,目前我使用两个结构:Player 和 Card。 我在不同的头文件中创建了 2 结构,因为 Player 中的函数使用 Card,但还有其他我尚未完成的元素。 当我尝试在 Player 中使用 getId() 时,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);

card.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;
}

有人可以帮助我吗? (如果您发现代码中有一些不一致的地方,那是因为我尝试使用我的语言进行快速翻译)

【问题讨论】:

  • 拼写? GetIdgetId。链接器说第一个,你的原型说第二个。
  • 已纠正错字:还是在card.c 中仍然存在?你用什么编译的?来自card.c 的目标文件是否指定用于链接?
  • @WeatherVane 对不起,我输入了错误的东西,编译器说 getId 和 discardCard,我用正确的替换了消息
  • 您的 MAKEFILE 是否告诉它编译 card.c 并链接 card.obj?它怎么知道card.c?它知道card.h,但你在哪里告诉它card.c
  • 好的,我找到了链接cart.obj的方法,我首先编译了card.c,然后编译了player.c:cl player.c /link card.obj,最后一切正常,非常感谢@WeatherVane和@Dmitri

标签: c struct


【解决方案1】:

因此,正如建议的那样,问题在于在 Windows 的编译器中,当您使用使用其他结构中定义的函数的结构时,需要在编译期间传递 .obj 文件。 为此,您需要编译其他人使用的每个 .c 文件,然后链接在此过程中创建的 .obj 文件。 所以在我的情况下,第一步是编译:

cl card.c

创建 card.obj (Windows 的编译器可能会向您显示一条消息,例如:“未指示起点”,如果您不在第一个文件中使用 main,请不要担心,并且继续这个过程)然后我编译:

cl player.c /link card.obj

因此,通过这种方式,您可以传递编译后的对象,其中提供了结构中所有函数的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多