免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2332 | 回复: 6
打印 上一主题 下一主题

[C] 最是销魂就是你-->Include [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-02 14:51 |只看该作者 |倒序浏览
做回标题党...

照着ooc.pdf练习的代码.
可是编译不过...Trace了一下.应该是Set.h的定义没有被Include到.
可是为什么Reference不到却查不出.
请各位网友帮忙了.

WINDOWS XP
Dev-C++ 4.9.9.2


========================================================================
被封之前报告下进展
编译报错为"Set.c dereferencing pointer to incomplete type "

把下面这段struct的定义从头文件转移到Set.c里面就顺利编译成功了


  1. struct Set{
  2.        unsigned count;
  3. };

  4. struct Object
  5. {
  6.        unsigned count;
  7.        struct Set * in;
  8. };
复制代码


搞不懂呢,struct的定义为啥放在Set.h就认不出来了呢

[ 本帖最后由 bellavista 于 2007-11-2 17:06 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-11-02 14:52 |只看该作者
封之前留个名

论坛徽章:
0
3 [报告]
发表于 2007-11-02 14:52 |只看该作者
Dev文件如下


  1. [Project]
  2. FileName=bag.dev
  3. Name=bag
  4. UnitCount=5
  5. Type=1
  6. Ver=1
  7. ObjFiles=
  8. Includes=
  9. Libs=
  10. PrivateResource=
  11. ResourceIncludes=
  12. MakeIncludes=
  13. Compiler=
  14. CppCompiler=
  15. Linker=
  16. IsCpp=0
  17. Icon=
  18. ExeOutput=
  19. ObjectOutput=
  20. OverrideOutput=0
  21. OverrideOutputName=
  22. HostApplication=
  23. Folders=
  24. CommandLine=
  25. UseCustomMakefile=0
  26. CustomMakefile=
  27. IncludeVersionInfo=0
  28. SupportXPThemes=0
  29. CompilerSet=0
  30. CompilerSettings=

  31. [Unit1]
  32. FileName=main.c
  33. CompileCpp=0
  34. Folder=
  35. Compile=1
  36. Link=1
  37. Priority=1000
  38. OverrideBuildCmd=0
  39. BuildCmd=

  40. [Unit2]
  41. FileName=new.h
  42. CompileCpp=0
  43. Folder=
  44. Compile=1
  45. Link=1
  46. Priority=1000
  47. OverrideBuildCmd=0
  48. BuildCmd=

  49. [Unit3]
  50. FileName=Object.h
  51. CompileCpp=0
  52. Folder=
  53. Compile=1
  54. Link=1
  55. Priority=1000
  56. OverrideBuildCmd=0
  57. BuildCmd=

  58. [Unit4]
  59. FileName=Set.h
  60. CompileCpp=0
  61. Folder=
  62. Compile=1
  63. Link=1
  64. Priority=1000
  65. OverrideBuildCmd=0
  66. BuildCmd=

  67. [Unit5]
  68. FileName=Set.c
  69. CompileCpp=0
  70. Folder=
  71. Compile=1
  72. Link=1
  73. Priority=1000
  74. OverrideBuildCmd=0
  75. BuildCmd=

  76. [VersionInfo]
  77. Major=0
  78. Minor=1
  79. Release=1
  80. Build=1
  81. LanguageID=1033
  82. CharsetID=1252
  83. CompanyName=
  84. FileVersion=
  85. FileDescription=Developed using the Dev-C++ IDE
  86. InternalName=
  87. LegalCopyright=
  88. LegalTrademarks=
  89. OriginalFilename=
  90. ProductName=
  91. ProductVersion=
  92. AutoIncBuildNr=0

复制代码

论坛徽章:
0
4 [报告]
发表于 2007-11-02 14:55 |只看该作者
main.c


  1. #include <stdio.h>
  2. #include "Object.h"
  3. #include "new.h"
  4. #include "Set.h"

  5. int main ()
  6. {   
  7.      void * s    =   new(Set);
  8.      void * a    =   add(s, new(Object));
  9.      void * b    =   add(s, new(Object));
  10.      void * c    =   new(Object);
  11.      if (contains(s, a) && contains(s, b))
  12.           puts("ok");
  13.      if (contains(s, c))
  14.           puts("contains?");
  15.      if (differ(a, add(s, a)))
  16.           puts("differ?");
  17.      if (contains(s, drop(s, a)))
  18.           puts("drop?");
  19.      delete(drop(s, b));
  20.      delete(drop(s, c));

  21.        return 0;
  22. }

复制代码


new.h

  1. void * new (const void * type, ...);
  2. void delete (void * item);

复制代码


Object.h

  1. void * new (const void * type, ...);
  2. void delete (void * item);

复制代码


Set.c

  1. #include <assert.h>
  2. void * new (const void * type, ...)
  3. {      
  4.     const unsigned size = * (const unsigned *) type;
  5.     void * p = calloc(1, size);
  6.     assert(p);
  7.     return p;
  8. }

  9. void delete (void * _item)
  10. {     
  11.       free(_item);
  12. }

  13. void * add (void * _set, const void * _element)
  14. {   
  15.     struct Set * set = _set;
  16.     struct Object * element = (void *) _element;
  17.     assert(set);
  18.     assert(element);
  19.     if (! element -> in)
  20.         element -> in = set;
  21.     else
  22.         assert(element -> in == set);
  23.     ++ element -> count, ++ set -> count;
  24.     return element;
  25. }

  26. void * find (const void * _set, const void * _element)
  27. {   
  28.     const struct Object * element = _element;
  29.     assert(_set);
  30.     assert(element);
  31.     return element -> in == _set ? (void *) element : 0;
  32. }


  33. int contains (const void * _set, const void * _element)
  34. {
  35.      return find(_set, _element) != 0;
  36. }

  37. void * drop (void * _set, const void * _element)
  38. {   
  39.     struct Set * set = _set;
  40.     struct Object * element = find(set, _element);
  41.     if (element)
  42.     {     if (-- element -> count == 0)
  43.           element -> in = 0;
  44.           -- set -> count;
  45.     }
  46.     return element;
  47. }


  48. int differ (const void * a, const void * b)
  49. {
  50.     return a != b;
  51. }

  52. unsigned count (const void * _set)
  53. {   
  54.     const struct Set * set = _set;
  55.     assert(set);
  56.     return set -> count;
  57. }

  58. Set.h
  59. [code]
  60. #ifndef SET_H
  61. #define SET_H
  62. struct Set
  63. {
  64.        unsigned count;
  65. };

  66. struct Object
  67. {
  68.        unsigned count;
  69.        struct Set * in;
  70. };

  71. static const unsigned _Set = sizeof(struct Set);
  72. static const unsigned _Object = sizeof(struct Object);
  73. const void * Set = &_Set;
  74. const void * Object = &_Object;

  75. void * add (void * set, const void * element);
  76. void * find (const void * set, const void * element);
  77. void * drop (void * set, const void * element);
  78. int contains (const void * set, const void * element);
  79. #endif

复制代码

[/code]

论坛徽章:
0
5 [报告]
发表于 2007-11-02 14:56 |只看该作者
原帖由 flw 于 2007-11-2 14:52 发表
封之前留个名


莫封
封了就不销魂了

论坛徽章:
0
6 [报告]
发表于 2007-11-02 15:33 |只看该作者
编译的错误信息呢?

论坛徽章:
0
7 [报告]
发表于 2007-11-02 19:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP