Estoy tratando de modificar una matriz a través de argumentos variables pasando valores de va_arg a la matriz, pero por alguna razón da resultados extraños. Aquí está el código:
#include <stdio.h> #include <stdarg.h> void get_args(double* args, int argc, ...); void get_args(double* args, int argc, ...) { va_list argv; va_start(argv, argc); if (argc == 1) { args[0] = va_arg(argv, double); } else if (argc == 4) { for (int i = 0; i < argc; i++) { args[i] = va_arg(argv, double); } } va_end(argv); } int main(void) { double args[4] = { 0, 0, 0, 0 }; get_args(args, 4, 0, 1, 2, 3); for (int i = 0; i < 4; i++) { printf("args[%d] = %f\n", i, args[i]); } return 0; }En Visual Studio (MSVC) da lo siguiente:
args[0] = 0.000000 args[1] = 0.000000 args[2] = 0.000000 args[3] = -92559592143668871097826611732759620974286504571030640424648704.000000En GCC da lo siguiente:
args[0] = 0.000000 args[1] = 0.000000 args[2] = 0.000000 args[3] = 0.000000¿Alguien sabe cuál es el error que cometí?
Los tipos de argumentos variados no coinciden con el tipo dado a va_arg .
Los argumentos que está pasando a get_args , es decir 0, 1, 2, 3 son todos de tipo int , pero está usando el tipo double cuando intenta recuperarlos con va_arg . Esta es una discrepancia de tipos que desencadena un comportamiento indefinido .
Pase argumentos que tengan tipo double :
get_args(args, 4, 0.0, 1.0, 2.0, 3.0); O use int para extraer los argumentos:
args[i] = va_arg(argv, int);