swarnam@cs.tamu.edu (Prabaharan Ilanji Swarnam) (11/09/90)
This is my first posting to this group hence forgive my ignorance !!! Recently one of my friends had a program in which there had been some procedure calls like free_vectori(x,y,z); .....etc etc... Thes procedures were included in a header file which contained them in the following format void free_vectori(a,b,c); .....etc etc...(with no body for the above) I was under the impression that that call for free_vectori() would not return any changes to the arguments or induce any side effects. But she argued that the call certainly made some changes to the arguments indirectly. Is that possible ? The void procedure format had no body so I understand that the parameters cannot be used or modified. Then why are those kind of void procedures used ? ***************************************************************************** Make this World a better place to live in !!!!!! Praba Swarnam email: swarnam@cssun.tamu.edu *****************************************************************************
gwyn@smoke.brl.mil (Doug Gwyn) (11/10/90)
In article <9944@helios.TAMU.EDU> swarnam@cs.tamu.edu (Prabaharan Ilanji Swarnam) writes: >Recently one of my friends had a program in which there had >been some procedure calls like > free_vectori(x,y,z); > .....etc etc... >Thes procedures were included in a header file which contained >them in the following format > void free_vectori(a,b,c); > .....etc etc...(with no body for the above) >I was under the impression that that call for free_vectori() would >not return any changes to the arguments or induce any side effects. >But she argued that the call certainly made some changes to the >arguments indirectly. >Is that possible ? >The void procedure format had no body so I understand that the >parameters cannot be used or modified. Then why are those kind of >void procedures used ? Your problem is a lack of precision in the concepts involved. free_vectori(x,y,z); is an invocation of a function named "free_vector" (technically, via a pointer to the function that was derived from the name), with actual arguments that in this particular case are the values of simple expressions, each consisting simply of the evaluation of the contents of a variable (named "x", "y", or "z"). Before invoking a function, in most cases (I recommend in all cases) it needs to be properly declared. The declaration associates a specific type with the identifier that designates the function. The header file that you mention does not contain "procedures"; it contains declarations for the functions. Such a declaration does not in itself cause the function to come into existence; only a definition provided elsewhere can do that. The declaration void free_vectori(a,b,c); simply says that after that point in the translation unit (source file) the identifier "free_vectori" will designate a function taking three arguments each of type int -- it would have been better style to write extern void free_vectori(int a, int b, int c); -- and not returning a value. (Not returning a value does not mean that no computation is performed by the function!) Somewhere else, perhaps in a library or in another object module linked together with the object resulting from compiling the source we have been discussing, there must be a definition for every function that is actually invoked. Usually the definition is produced from a C source that defines the function, for example: void free_vector(int p, int q, int r) { printf("%d %d %d\n", p, q, r); } In this example, "p". "q", and "r" are identifiers that act as parameters for the definition; whenever the function is invoked at run time, the actual argument values are bound to these parameters before the body of the function is executed. There is no such thing in C as a bodyless definition for a function.