Re: [问题] 开成专案以后标头档&全域变量问题

楼主: LPH66 (-6.2598534e+18f)   2014-12-19 13:42:10
※ 引述《defsrisars (阿转)》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: DevC 5.8.2
: 问题(Question):
: 小的最近初学C语言
: 目前大一在做C语言实习课的期末作业
: 但有些问题上网看了许久还是找不太到答案QQ
: (像extern 结构避免重复宣告也是上网看了很久才知道)
: 希望有大大能够不吝指导一下
: 1. void Deal_First(int *card,Player *P,int *flag);
: 这一行会跑出编译讯息
: [Note] expected 'int *' but argument is of type 'int (*)[52]'
: 想请问是什么意思呢? int * 跟 int(*) 是差在哪QQ
: 我呼叫的地方是这样写的
: Deal_First(&card,A,&flag);
: 其中card跟flag是宣告int
: A是用malloc做出指向结构Player(我有typedef了)的指标
: struct player * A = (struct player*)malloc(sizeof(struct player));
你要传一个阵列进去, 直接丢那个阵列的名字进去即可
&card 是指向 card 这个阵列的指标
(这也是 int (*)[52] 的意思:指向一个长 52 的 int 阵列的指标)
: 2. 然而最主要的错误是出在
: 14 34 C:\Users\PC\Desktop\期末专题Dev\Deal_First.c [Error]
: 'flower_table' undeclared (first use in this function)
: 14 64 C:\Users\PC\Desktop\期末专题Dev\Deal_First.c [Error]
: 'number_table' undeclared (first use in this function)
: 也就是下方程式码的78行
: 我看起来的认知是compiler觉得我的flower_table跟number_table没有宣告
: 但是我5~8行宣告不是应该在main.c里面宣告为全域变量了吗?
: (我专案应该开的没问题~都有连结到,这行//就可以执行了)
: 另外就是想请问有没有办法把这个5~8行放进标头档(全域变量放进标头档?)
: 然后又像extern结构的用法一样不要重复宣告呢?
: 然后如果有哪里是很烂的写法该做修改请告诉我谢谢QQ
: 谢谢大家QQ
: p.s 程式码只放部份 main.c 标头档H.h 跟出问题的函式
: 预期的正确结果(Expected Output):
: 程式能正常运行
: 程式码(Code):(请善用置底文网页, 记得排版)
: http://codepad.org/B41FXz3N
你的主要问题是 extern 的使用
这里你需要的是将一个在 main.c 里定义的东西开给 Deal_First.c 来用
因此 Deal_First.c 里需要宣告“有这两个阵列会定义在别处”
这便是靠 extern 宣告来达成
在此即 extern const char flower_table[4];
extern const char number_table[13][BUF_SIZE];
(相对的, struct 宣告反而不用 extern, 因为它没有实体定义
只需要写在 H.h 里面, 所有人就都知道了)
由于每个使用到的地方都需要这个宣告
因此这两行 extern 便需要摆在 H.h 里面
至于 main.c 里的那两行则必须留着, 那就是上面讲的“定义在别处”的“别处”
这个“别处”会在编译完之后的连结阶段才将它们凑在一起
如此 Deal_First.c 就能使用到这个阵列了
作者: defsrisars (阿转)   2014-12-19 13:46:00
谢谢!!! 非常简单明了~~我懂囉!!谢谢您~我在po文发问有个地方说错也被您发现了我那边传进去的&card不是int 是int[] QAQ
作者: CCWck (干嘛要暱称)   2014-12-19 14:20:00
你的程式OK吗?
作者: defsrisars (阿转)   2014-12-19 18:50:00
就刚刚发问的地方OK 不过我又遇到新的问题了QQ

Links booklink

Contact Us: admin [ a t ] ucptt.com