Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 18th, 2012  |  syntax: None  |  size: 3.45 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Good Coding Practice With C structs?
  2. typedef struct {
  3.     float       sp;
  4.     float       K;                 // interactive form - for display only
  5.     float       Ti;                //  values are based in seconds
  6.     float       Td;
  7. } pid_data_t;
  8.        
  9. pid_data_t = pid_data;
  10. pid_data.K = 10;         // no good! changing K should be done via a function
  11.        
  12. int8_t pid_set_pid_params(float new_K_dash, float new_Ti_dash,
  13.     float new_Td_dash)
  14. {
  15.     …                             // perform lots of things
  16.     pid_data->K  = new_K_dash;
  17.     pid_data->Ti = new_Ti_dash;
  18.     pid_data->Td = new_Td_dash;
  19. }
  20.        
  21. // library.h
  22.  
  23. typedef struct data_t * data_handle;
  24.  
  25. data_handle create_data();
  26. void        free_data(data_handle);
  27.        
  28. #include "library.h"
  29.  
  30. struct data_t
  31. {
  32.   /* ... */
  33. };
  34.  
  35. data_handle create_data() { return malloc(sizeof(struct data_t)); }
  36. void        free_data(data_handle h) { free(h); }
  37. /* etc. etc. */
  38.        
  39. typedef struct Foo {
  40.     /* public elements */
  41. } Foo;
  42.  
  43. Foo *new_Foo(void);
  44. void Foo_something_opaque(Foo* foo);
  45.        
  46. #include "foo.h"
  47.  
  48. typedef struct Private_Foo_ {
  49.     struct Foo foo;
  50.     /* private elements */
  51. } Private_Foo_;
  52.  
  53. Foo *new_Foo(void)
  54. {
  55.     Private_Foo_ *foo = malloc(sizeof(Private_Foo_));
  56.     /* initialize private and public elements */
  57.     return (Foo*) foo;
  58. }
  59.  
  60. void Foo_something_opaque(Foo *foo)
  61. {
  62.     Private_Foo_ *priv_foo = (Private_Foo_*) foo;
  63.     /* do something */
  64. }
  65.        
  66. typedef struct Private_Foo_ {
  67.     /* private elements */
  68. } Private_Foo_;
  69.  
  70. static size_t Private_Foo_sizeof(void) { return sizeof(Private_Foo_); }
  71.        
  72. #include
  73.  
  74. #define FOO_SIZEOF_PRIVATE_ELEMENTS <generated by preconfigure step>
  75.  
  76. typedef struct Foo_ {
  77.     /* public elements */
  78.     char reserved[FOO_SIZEOF_PRIVATE_ELEMENTS];
  79. } Foo;
  80.  
  81. Foo *new_Foo(void);
  82. void Foo_something_opaque(Foo* foo);
  83.        
  84. #include "foo.h"
  85. #include "foo_private.h"
  86.  
  87. Foo *new_Foo(void)
  88. {
  89.     Foo *foo = malloc(sizeof(Foo));
  90.     /* initialize private and public elements */
  91.     return (Foo*) foo;
  92. }
  93.  
  94. void Foo_something_opaque(Foo *foo)
  95. {
  96.     Private_Foo_ *priv_foo = (Private_Foo_*) foo.reserved;
  97.     /* do something */
  98. }
  99.        
  100. Array *array_alloc(size_t sizeofElement, unsigned int elements);
  101. void *array_at(Array *array, unsigned int index);
  102. /* and all the other functions expected of arrays */
  103.        
  104. Array *Foo_array(unsigned int count);
  105.        
  106. #ifndef __MY_LIBRARY__
  107. #define __MY_LIBRARY__
  108. typedef void MiObject;
  109.  
  110. MyObject* newMyObject();
  111.  
  112. void destroyMyObject(MyObject*)
  113.  
  114. int setMyObjectProperty1(MyObject*,someDataType1*);
  115.  
  116. /*Return a pointer to the data/object,  classic pass by value */
  117. someDataType1* getMyObjectProperty2Style1(MyObject*);
  118.  
  119. int setMyObjectProperty2(MyObject*,someDataType2*);
  120.  
  121. /* The data/object is passed through reference */
  122. int getMyObjectProperty2Style2(MyObject*,someDataType2**);
  123.  
  124.     /* Some more functions here */
  125. #endif
  126.        
  127. struct _MyHiddenDataType{
  128.     int a;
  129.     char* b;
  130.     ..
  131.     ..
  132. };
  133.  
  134. MyObject* newMyObject(){
  135. struct _MyHiddenData* newData = (struct _MyHiddenData*)malloc(sizeof(struct _MyHiddenData);
  136. //check null, etc
  137. //initialize data, etc
  138. return (MyObject*)newData;
  139. }
  140.  
  141. int setMyObjectProperty1(MyObject* object,someDataType1* somedata){
  142.     struct _MyHiddenData* data = (struct _MyHiddenData*)object;
  143.     //check for nulls, and process somedata
  144.     data->somePropery=somedata;
  145. }
  146.  
  147. someDataType1* getMyObjectProperty2Style1(MyObject*){
  148.     struct _MyHiddenData* data = (struct _MyHiddenData*)object;
  149.     //check for nulls, and process somedata
  150.     return data->someProperty;
  151. }
  152. /* Similar code for the rest */