Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > variadic arithmetic, boolean operators

Reply
Thread Tools

variadic arithmetic, boolean operators

 
 
Trent Buck
Guest
Posts: n/a
 
      01-01-2005
(Note: C99 supports variadic macros, but C89 does not.)

I'm pretty sure what I'm trying to do is impossible, but I'll ask here
in case I'm missing something.

I'm trying to define generic, variadic arithmetic and boolean operators.
For example,

product (2, sum (3, 4), 5);

should expand to

(2) * ((3) + (4)) * (5);

Here is my pseudocode:

#define sum(x,y) \
(x) + (y)

#define sum(x, y, ...) \
(x) + sum (y, __VA_ARGS__)

int main (void)
{
sum (1, 2, 3, 4);
return 0;
}

Unfortunately, this has two problems:

- Macros cannot be overriden, hence the base case cannot be caught
generically. (You can define the base case as a function if the
definition (and declaration) precede the macro definition.)

- Macros expansion is not recursive (apparently).

For example, GCC's preprocessor outputs the following:

tmp.c:4:1: warning: "sum" redefined
tmp.c:1:1: warning: this is the location of the previous definition
# 1 "tmp.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "tmp.c"






int main (void)
{
(1) + sum (2, 3, 4);
return 0;
}

Can someone please either confirm that this is impossible in C, or
suggest how to go about it?

--
-trent
Physics is what results when you pollute mathematics with reality.
 
Reply With Quote
 
 
 
 
Thomas Matthews
Guest
Posts: n/a
 
      01-01-2005
Trent Buck wrote:
> (Note: C99 supports variadic macros, but C89 does not.)
>
> I'm pretty sure what I'm trying to do is impossible, but I'll ask here
> in case I'm missing something.
>
> I'm trying to define generic, variadic arithmetic and boolean operators.
> For example,
>
> product (2, sum (3, 4), 5);
>
> should expand to
>
> (2) * ((3) + (4)) * (5);
>
> Here is my pseudocode:
>
> #define sum(x,y) \
> (x) + (y)
>
> #define sum(x, y, ...) \
> (x) + sum (y, __VA_ARGS__)
>
> int main (void)
> {
> sum (1, 2, 3, 4);
> return 0;
> }
>
> Unfortunately, this has two problems:
>
> - Macros cannot be overriden, hence the base case cannot be caught
> generically. (You can define the base case as a function if the
> definition (and declaration) precede the macro definition.)
>
> - Macros expansion is not recursive (apparently).


My suggestion is to change your design so that you are passing
containers (lists, vectors, arrays, etc.) to each function. Each
function would return the result. This design would eliminate
the need for variable argument lists.

int sum(int * array_of_integers,
unsigned int num_integers)
{
int result;
unsigned int index;
for (index = 0, result = 0;
index < num_integers;
++index)
{
result += *array_of_integers++;
}
return result;
}


--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.comeaucomputing.com/learn/faq/
Other sites:
http://www.josuttis.com -- C++ STL Library book
http://www.sgi.com/tech/stl -- Standard Template Library

 
Reply With Quote
 
 
 
 
Trent Buck
Guest
Posts: n/a
 
      01-01-2005
Up spake Thomas Matthews:
> My suggestion is to change your design so that you are passing
> containers (lists, vectors, arrays, etc.) to each function. Each
> function would return the result. This design would eliminate
> the need for variable argument lists.


Not a solution I'm particularly taken with, but better than anything I
had come up with. Thank you.

--
-trent
Turn off your targeting computer, Luke. ASS. AHS. You have a better
chance of making this shot by guessing.
 
Reply With Quote
 
Mysidia
Guest
Posts: n/a
 
      01-02-2005
If using gcc, I might say use the ({}) extension:

#define sum(s...) \
({ int args[] = { s }; \
mysum(args, sizeof(args)/sizeof(*args)); \
})

int mysum(int args[], int n)
{
int i,w=0;

for(i=0;i<n;i++) w+= args[i];
return w;
};


For C99, perhaps a make_list macro could be a useful
approach... so you would have

make_list(list, 3,4,5,6)
sum(list);

struct List {
int *arr;
int len;
};

#define make_list(L,...) \
do {
int args[] = { __VA_ARGS__ };
int len = sizeof(args) / sizeof(*args);
L.args = args;
L.len = len;
} while(0)


-Jmh

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Call again a variadic function (... variable number of arguments)with same arguments that its variadic wrapper moreau.steve@gmail.com C Programming 3 12-31-2008 07:13 AM
variadic function calling variadic function goldfita@signalsguru.net C Programming 5 05-03-2006 05:23 PM
Using variadic functions within variadic functions pinkfloydhomer@gmail.com C Programming 2 02-27-2006 05:47 AM
Variadic functions calling variadic functions with the argument list, HLL bit shifts on LE processors Ross A. Finlayson C Programming 19 03-10-2005 03:57 AM
is casting a variadic function to a non-variadic one legal? Colin Walters C Programming 2 02-13-2004 10:55 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57