Solved

va_arg problem

Posted on 2009-05-11
10
1,007 Views
Last Modified: 2013-11-05
I am trying to create a function with a variable argument list. But, the code I have written (see below) is not giving me the first argument of the variable argument list.

The output to the program should be:

1
2
3

but I am getting

2
3
0

where the last value is out of bounds for the ap pointer. I used gcc 4.3.2 and intel ia32 11.0 compilers on Mac OS X 10.5.6, and got the same results on both.

I found that if I add the following line before the first call to va_arg() that I will get the correct output:

ap -= sizeof(size_t);

but I should not need to manually change the pointer before using it.

What am I doing wrong and how can I fix it?

Thank you in advance.
#include <iostream>
#include <stdarg.h>
 
void vatest(const unsigned int n, const size_t args, ...) {
  size_t x;
  va_list ap;
  va_start(ap, args);
 
//  ap -= sizeof(size_t); // I should not need this line!
  for(unsigned int i = 0; i < n; ++i) {
    x = va_arg(ap, size_t);
    std::cout << x << std::endl;
  }
 
  va_end(ap);
}
 
int main() {
  vatest(3, 1, 2, 3);
  return 0;
}

Open in new window

0
Comment
Question by:gandalf79
  • 4
  • 2
10 Comments
 
LVL 86

Accepted Solution

by:
jkr earned 125 total points
ID: 24357459
There is no need to use 'args' in your argument list, in fact this is what is causing the error. The last non-variable argument is 'n', so use this in 'va_start()', e.g.
#include <iostream>
#include <stdarg.h>
 
void vatest(const unsigned int n, ...) {
  size_t x;
  va_list ap;
  va_start(ap, n);
 
  for(unsigned int i = 0; i < n; ++i) {
    x = va_arg(ap, size_t);
    std::cout << x << std::endl;
  }
 
  va_end(ap);
}
 
int main() {
  vatest(3, 1, 2, 3);
  return 0;
}
 
Output:
 
$ vatest
1
2
3

Open in new window

0
 
LVL 9

Expert Comment

by:wellhole
ID: 24357470
You're passing the parameters wrong. Get rid of argument args and use n as the size for va_start.
0
 
LVL 2

Author Comment

by:gandalf79
ID: 24357628
Thanks for the quick response. I made the following changes and it work perfectly now.

void vatest(const unsigned int n, ...) {
  // ...
  va_start(ap, n);
0
Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

 
LVL 86

Expert Comment

by:jkr
ID: 24357641
Um, may I ask what was wrong with my - a bit more complete - answer?
0
 
LVL 2

Author Comment

by:gandalf79
ID: 24357818
I am sorry, I accidentally over looked your solution. When I looked at it, I thought your code was my code. I will attempt to rectify the situation.
0
 
LVL 2

Author Comment

by:gandalf79
ID: 24357864
Please, I am looking but I don't see how I can modify the accepted answer. =(

Had I not overlooked your solution, I would have given you credit for the question since yours is more complete. Thank you for your understanding.
0
 
LVL 2

Author Closing Comment

by:gandalf79
ID: 31580262
Thank you for your help and the quick response.
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

813 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now