Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/07/2011, 04:14
Avatar de Doommarine_Maxi
Doommarine_Maxi
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 10 meses
Puntos: 8
problema usando #define como funcion.

Hola buenos dias a todos, lo que les queria comentar era lo siguiente que me esta haciendo pensar un rato.


Estoy creando para C++ unas funciones de redim, redim preserve (para los que usaron alguna vez visual basic saben a que me refiero). y sino es simple.

Redim permite redimencionar un array eliminando todo su contenido.
redim preserve permite redimensionar un array conservando todo su contenido.

Funciones.h
Código C++:
Ver original
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <boost/variant.hpp>
  4.  
  5. typedef  boost::variant< int, std::string> var;
  6. #define tamanio(arr)(sizeof(arr)/sizeof(arr[0]))
  7. #define redim(arr, tam)(arr = new var[tam])
  8. #define copyarr(arr1, arr2)(redim(arr1, tamanio(arr2)), cop_array(arr1, arr2, tamanio(arr2)))
  9.  
  10. #define redim_preserve(arr, tam)(redim(arr, tam))
  11. /*Aqui deberia primero, copiar el array en una variable temporal,
  12. luego lo redimensiono con redim, y luego copio el array temporal
  13.  en la variable redimensionada*/

main.cpp
Código C++:
Ver original
  1. #include <time.h>
  2. #include "funciones.h"
  3.  
  4. using namespace std;
  5.  
  6.  
  7. void wait ( int seconds )
  8. {
  9.   clock_t endwait;
  10.   endwait = clock () + seconds * CLOCKS_PER_SEC ;
  11.   while (clock() < endwait) {}
  12. }
  13.  
  14.  
  15. void cop_array(var *arr, var arr2[], int tam)
  16. {
  17.  
  18.      int i;
  19.  
  20.      for (i = 0; i < tam; i++)
  21.      {
  22.             arr[i] = arr2[i];
  23.      }
  24.      return;
  25.      
  26. }
  27.  
  28.  
  29.  
  30. int main()
  31. {
  32.      var a[] = {1, "probando", 35, 28, "probando"};
  33.      var *b;
  34.  
  35.      copyarr(b, a);
  36.  
  37.      b = redim_preserve(b, (tamanio(b)+1));
  38.      b[5] = "funcionaa";
  39.  
  40.      cout << tamanio(a) << " Valores: " << b[0] << b[1] << b[2] << b[5] <<  endl;
  41.      wait(5);
  42.  
  43.      return 1;
  44. }

Antes que nada explico de forma breve mi codigo:

Cree una tipo de dato, basado en otro tipo de dato boost::variant, que permite que en una variable se almacene un dato tipo integer o string.

la meta del codigo es poder "imitar" las funciones que les mencione de Visual basic en C++, con el redim no tuve ningun problema, el problema es cuando quiero hacer el redim_preserve, por que necesito (supongo yo) primero guardar el array en otro temporal, luego redimensionarlo (que eso puedo usando la funcion que estableci de redim), y luego al array redimensionado guardarle el array temporal que cree antes.

El problema es que usando #define como funcion no se como crear un array, segundo es que no puedo usar funciones comunes (void por ejemplo) por que cuando envio el array como parametro ya pierdo muchos datos (longitud del array y la posibilidad de redimensionarlo usando new var[dimension])


Por favor si algo no se entendio preguntenme por que soy malo para expresarme, y segundo gracias por tomarse el tiempo de leer el problema.

Soy bastante novato en C y en C++, agradesco a los usuarios del foro por ayudar a los novatos con sus problemas.

Última edición por Doommarine_Maxi; 14/07/2011 a las 04:15 Razón: Eliminar comentario en el codigo de main.c