Re: passing structures among functions



On Mar 2, 5:16 pm, "Arthur J. O'Dwyer" <ajonos...@xxxxxxxxxxxxxx>
wrote:
On Fri, 2 Mar 2007, sofeng wrote:

The following link shows a chart I created about passing structures
among functions. Would you review it and tell me if it requires any
corrections?

http://bp2.blogger.com/_lZhqNsiakm4/Reh26hy-JHI/AAAAAAAAAAk/wvyV3Yx8g...

FYI, many readers of Usenet *will not* go to a Web page just because
a pseudonymous poster asks them to, especially when the page has such
an obviously machine-generated URL. (And perhaps doubly so when the
URL is actually the URL of an HTML page, despite the ".gif" ending.
That's just unnecessary.)

Note to prospective Web-goers: I used 'wget' to grab the GIF, so if
there's any malicious code on that Web page, I didn't encounter it.
Don't think I'm endorsing the page.

Okay, now on to your question. Mistakes ordered from most significant
to least significant:

* All your ".h" files are missing the include guards.http://en.wikipedia.org/wiki/Include_guard
* "get_data.h" refers to DATA, so it needs to #include "defs.h".
* "get_data.c" refers to get_data(), so it needs to #include "get_data.h".
* "DATA", in all caps, looks like a preprocessor macro. It is better to
use something non-macro-ish, such as "Data" or "data_t". Except...
* The use of "typedef" is superfluous, and most comp.lang.c regulars
will counsel you not to use it. Give the struct a tag, such as "struct
data", and use that instead.
* You spelled "definitions" as "definitons" in one place.
* "float" is rarely used; "double" would be more newbie-friendly, if your
goal is to show what real code looks like.
* "Header files should only contain declarations." should read
"Header files should contain only declarations." (And macro definitions,
and comments.)
* Burn your GIFs and use PNG instead; it's cooler. :)

HTH,
-Arthur

Thank you much for the feedback. I have made the changes suggested.
How does it look now? Here is the link for the png file:
http://bp1.blogger.com/_lZhqNsiakm4/RezJubUauVI/AAAAAAAAAA4/nYIxnx9E1Z8/s1600-h/png_1.png
The text contained in the diagram is below:

main.c:
- main.c contains the main function which calls the other functions
that operate on the data structure.
- It also defines (allocates memory) for the data structure at the
file level.
- The data structure is declared using the static keyword so that it
will have static duration (i.e. it will exist from program start to
finish), but it will have internal linkage (i.e. it won't be global).
- The address operator, &, is used to create a pointer to the data
structure which is passed to the other functions.

#include "defs.h"
#include "get_data.h"
#include "modify_data.h"

static struct data the_data;

int main()
{
get_data(&the_data);
modify_data(&the_data);

return 0;
}

get_data.c:
- get_data() fills the data structure
- it is passed a pointer to the data structure defined in main.c

#include "defs.h"
#include "get_data.h"

int get_data(struct data *data_ptr)
{
data_ptr->item1 = 1;
data_ptr->item2 = 2;
data_ptr->item3 = 3.0;
data_ptr->item4 = 4.0;

return 0;
}

modify_data.c:
- modify_data() modifies the data structure
- It is similar to get_data()

#include "defs.h"
#include "modify_data.h"

int modify_data(struct data *data_ptr)
{
data_ptr->item2 += 1;
data_ptr->item4 += 1.0;

return 0;
}

defs.h:
- contains the structure data type declaration

#ifndef DEFS_H_
#define DEFS_H_

struct data
{
int item1;
int item2;
double item3;
double item4;
};

#endif /*DEFS_H_*/

get_data.h:
- contains the get_data() function declaration

#ifndef GET_DATA_H_
#define GET_DATA_H_

#include "defs.h"

int get_data(struct data *data_ptr);

#endif /*GET_DATA_H_*/

modify_data.h:
- contains the modify_data() function declaration

#ifndef MODIFY_DATA_H_
#define MODIFY_DATA_H_

#include "defs.h"

int modify_data(struct data *data_ptr);

#endif /*MODIFY_DATA_H_*/

NOTE: Header files should contain only declarations, macro
definitions, and comments. They should not contain variable
definitions because if the header file is included in multiple
locations, there would be multiple definitions of the same variable.

.



Relevant Pages

  • Re: [C++] Help Parsing an Integer/Character Mix
    ... - What kind of data structure are you using? ... int Number; ... while(InFile>> Buffer) ... possible even an member function. ...
    (alt.comp.lang.learn.c-cpp)
  • Re: large file support
    ... FileHeader::Allocate(BitMap *freeMap, int fileSize) ... describing where on disk to find all of the data in the file. ... // The file header data structure can be stored in memory or on disk. ...
    (comp.lang.cpp)
  • Passing complex structure from C# to C++ and back
    ... to pointer structure, as in "prop **x". ... My question is what data structure, marshaling or code do I have to ... int l; // number of elements ...
    (microsoft.public.dotnet.framework.interop)
  • Re: pass an array throuh a function
    ... In message, Ben Cottrell ... > int minutes; ... >So now, you have a data structure called clock, which has 3 properties ...
    (alt.comp.lang.learn.c-cpp)
  • Re: Map of vectors how? <Long>
    ... > I realized that I wanted to modify my frequency tables, so far I have been using maps like: ... > A string for the letter combinations and an int for the frequency, but now I want to add three more frequencies: ... > I thought about using a vector within a map but I've no idea how to use such a data structure? ...
    (comp.lang.cpp)