Parameter passing to function with void * as Argument


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
Top Forums Programming Parameter passing to function with void * as Argument
# 1  
Parameter passing to function with void * as Argument

Earlier I had one structure C
Code:
typedef struct c
{
    int cc;
}CS;

I used to call a library function say int GetData(CS *x) which was returning me the above structure C with data.
Code:
GetData(CS *x)

Function call used to be like:
Code:
CS CSobj;
GetData(&CSObj);

Now there are two structures say C and D
Code:
typedef struct c
{
    int cc;
}CS;
CS CSobj;

typedef struct d
{
    int dc;
    int dd;
}DS;
DS DSobj;

Function GetData() has been modified to:
Code:
GetData(void* x)

I have to call the library function say int GetData(void* x) which will be returning me one of the above structures through that void* paramter. The return type of the function tells which structure is returned.

Problem is while calling the function GetData() how and what parameter to pass since I am unaware of which struct the function will return. Any way out of this problem?

Last edited by rupeshkp728; 05-22-2014 at 09:54 AM.. Reason: adding more details
# 2  
Without knowing more, a NULL pointer is a good guess.

Regards,
Alister
# 3  
Passing a pointer to memory location which is big enough to hold the larger of the two structures will solve this problem.
Union will solve this issue.
# 4  
Yes, a union is useful in this situation. Specifically:

Code:
enum { TYPE_CS, TYPE_DS };

typedef struct CS {
        int type;
        int cc;
} CS;

typedef struct DS {
        int type;
        int dc;
        int dd;
} DS;

typedef union S {
        int type;
        DS ds;
        CS cs;
} S;

CS mycs={TYPE_CS, 0};
DS myds={TYPE_DS, 1, 1};

void myfunc(S *data)
{
        switch(s->type) {
        case TYPE_DS:
                s->ds.dc=0;
                s->ds.dd=0;
                break;
        case TYPE_CS:
                s->cs.cc=0;
                break;
        }
}

myfunc(&mycs);
myfunc(&myds);

Your function can tell which is which by checking the value of the type variable, then using either the ds or cs member of the union. All the members of the union overlap.
This User Gave Thanks to Corona688 For This Post:
# 5  
Modifying the myfunc function changing
Code:
data->type

inplace of
Code:
 s->type

Code:
void myfunc(S *data)
{
        switch(data->type) {
        case TYPE_DS:
                data->ds.dc=0; 
                data->ds.dd=0;
                break;
        case TYPE_CS:
                data->cs.cc=0;
                break;
        }
}

This User Gave Thanks to techmonk For This Post:
# 6  
Thanks Coronna and Techmonk for the replies.
I guess(may be I am wrong) the func call is incorrect.

Code:
myfunc(&mycs);
myfunc(&myds);

We need to pass object of type S.
Code:
S sobj = {.type = 1};
myfunc(&sobj);

if(sobj.type == 0)
{
    print sobj.cs.cc
}
else
{
    print sobj.ds.dc; 
    print sobj.ds.dd;
}

# 7  
Quote:
Originally Posted by rupeshkp728
I guess(may be I am wrong) the func call is incorrect.
Did you try the code or just consider it to look wrong...?
Quote:
We need to pass object of type S.
Why?

The whole point of using a union, and the whole point of adding type to the beginning of your CS and DS structures, was that they'd all have the same memory layout.

The compiler warns you since it doesn't know you built with these assumptions in mind. You can avoid the warning with a typecast if you want:

Code:
myfunc((S *)&obj);

This User Gave Thanks to Corona688 For This Post:
Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #212
Difficulty: Medium
According to OSPF, an autonomous system boundary router is a router that is connected by using more than one routing protocol and that exchanges routing information with routers autonomous systems.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Passing command as a function parameter

Hi All, Just trying to implement the below shell script using AIX ksh shell. myfunc { eval "$*" } CMD='ls -la /etc/hosts | awk '{print $9"|"$5}'' myfunc $CMD Keeping getting "|}: not found" errors, any pointers would greatly be appreciated. Kind Regards Ed Please... (2 Replies)
Discussion started by: eo29
2 Replies

2. Shell Programming and Scripting

Passing parameter to script, and split the parameter

i am passing input parameter 'one_two' to the script , the script output should display the result as below one_1two one_2two one_3two if then echo " Usage : <$0> <DATABASE> " exit 0 else for DB in 1 2 3 do DBname=`$DATABASE | awk -F "_" '{print $1_${DB}_$2}` done fi (5 Replies)
Discussion started by: only4satish
5 Replies

3. Shell Programming and Scripting

passing argument from one function to another

Hi all, In the given script code . I want to pass the maximum value that variable "i" will have in function DivideJobs () to variable $max of function SubmitCondorJob(). Any help? Thanks #!/bin/bash ... (55 Replies)
Discussion started by: nrjrasaxena
55 Replies

4. Shell Programming and Scripting

Passing sql as parameter to unix function

Hi, I have a function which connects to the db and runs the sql. it works fine when I run it like: function "select empname from emp;" but when I try to pass the sql string to a variable which in turn in fed to the function , it throws error. please advise. Thanks, Arnie. (1 Reply)
Discussion started by: itsarnie
1 Replies

5. Shell Programming and Scripting

Passing commandline argument to a function

Hi, I have 2 ksh scripts. Script1.ksh contains function definition. script1.ksh function f1() { while getopts a:c: args do case $args in a) ARG1=$OPTARG ;; c) ARG2=$OPTARG ;; \?) echo "Error no valid Arguments passed" esac done echo $ARG1 echo $ARG2 script2.sh (2 Replies)
Discussion started by: siba.s.nayak
2 Replies

6. Shell Programming and Scripting

Passing more than one argument in a function

Hi All, Calling a function with one argument and storing the return value in a shell script is as below:( so far I know) value="`fun_1 "argument1"`" Its working perfectly for me. Can u help me with passing more than one argument and storing the return value Thnaks in advance JS (1 Reply)
Discussion started by: jisha
1 Replies

7. Programming

How to return void function pointer

Hello all im trying to build function that will return void function pointer what is mean is ( not working ) the main function void * myClass::getFunction(int type){ if(type==1) return &myClass::Test1; if(type==2) return &myClass::Test2; } void myClass::Test1(){... (1 Reply)
Discussion started by: umen
1 Replies

8. UNIX for Advanced & Expert Users

Parameter passing in a function

I need to pass a parameter to a function in a script. My parameter is a string. When I display the parameter within my function, I only get the first word from string I pass in. How can I make the function receive the whole string (and not terminate at the first space it encounters)?. part of... (2 Replies)
Discussion started by: fastgoon
2 Replies

9. Shell Programming and Scripting

Passing a string parameter to a function

I need to pass a parameter to a function in a script. My parameter is a string. When I display the parameter within my function, I only get the first word from string I pass in. How can I make the function receive the whole string (and not terminate at the first space it encounters)?. part of... (1 Reply)
Discussion started by: fastgoon
1 Replies

10. UNIX for Dummies Questions & Answers

Passing Argument to Function

May i know how to pass an argument to a function in a shell script? Sorry, i din stated that it is in a shell script in my previous post. Means: checkStatus() { ........... } read status; I wanna use the status in the function checkstatus, how... (2 Replies)
Discussion started by: AkumaTay
2 Replies

Featured Tech Videos