Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema usando #define como funcion.

Estas en el tema de problema usando #define como funcion. en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 14/07/2011, 04:14
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 2 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
  #2 (permalink)  
Antiguo 14/07/2011, 10:41
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema usando #define como funcion.

mmm yo no usaria define para estas cosas. Te estas complicando mucho...Empeza a usar funciones. Porque por ejemplo la funcion redim simplemente hace un new...pero nunca libera el objeto anterior. Si usas esto en un gran proyecto estarias desperdiciendo mucha memoria.

Mira ese ejemplo...
Código C++:
Ver original
  1. template <typename T>
  2. T * redim (T *array, size_t new_size)
  3. {
  4.    T *temp = new T[new_size];
  5.    delete [] array;
  6.  
  7.    return temp;
  8. }
  #3 (permalink)  
Antiguo 14/07/2011, 11:59
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 2 meses
Puntos: 8
Gracias por la respuesta....

Muchisimas gracias por tu respuesta sam90, nunca habia usado templates, pero parecen bastante utiles, siente verguenza de mi codigo al ver tu respuesta xD.

Gracias por tu respuesta sam90.
  #4 (permalink)  
Antiguo 14/07/2011, 13:04
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 2 meses
Puntos: 8
Ultima Duda

A por cierto, una ultima duda (para no crear un nuevo tema), por ejemplo, yo necesito saber el tamaño de un var*, para poder redimensionarlo progresivamente.

Ejemplo.

Código C++:
Ver original
  1. #define tamanio (dato)(sizeof(dato)/sizeof(dato[0]))
  2.  
  3.     template <typename T>
  4.     T * redim (T *array, size_t new_size)
  5.     {
  6.        T *temp = new T[new_size];
  7.        delete [] array;
  8.      
  9.        return temp;
  10.     }
  11.  
  12. int main()
  13. {
  14.           var *b = new var[1];
  15.           cout << tamanio(b) << endl;
  16.           b = redim(b, ((tamanio(b)+1));
  17.           wait(2);
  18.           cout << tamanio(b) << endl;
  19.           wait(2);
  20.           return 1;
  21. }
En este caso usar tamanio no me sirve, por que por lo que vi solo funciona con un array como: array[1], array[2], etc....

La pregunta es si se puede saber el limite de datos que soporta un array*.

o si se redimensionar un array[] (redim(array, (tamanio(array)+1)) por ejemplo).
ya que con ese tipo de datos puedo saber el tamaño usando sizeof por lo que vi.

Gracias y por favor sepan disculpar las molestias.

Última edición por Doommarine_Maxi; 14/07/2011 a las 13:06 Razón: Agregar la funcion template de sam90 de redim
  #5 (permalink)  
Antiguo 14/07/2011, 14:18
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 10 meses
Puntos: 9
Respuesta: problema usando #define como funcion.

bien por lo que veo eres nuevo programando en c++. Yo te sugeriria que si no tienes la necesidad de implementar algo como lo que quieres, utilices la clase vector. Que te permite hacer algo como lo que tu quieres.
  #6 (permalink)  
Antiguo 14/07/2011, 16:13
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema usando #define como funcion.

Lo mas recomendable seria o usar la clase vector o llevar vos una cuenta.
Los array estos se guardan en memoria y no se almacena donde se terminan. Encontrar ese tope debe ser posible usando new pero necesitas codigo a mas bajo nivel.
Dejo de hablar al pedo porque te voy a mariar. Te recomendaria que te acostumbre a lo que es C/C++ y al manejo mas profundo de memoria y no tanto como es Visual Basic que te preocupas poco y nada de eso.
  #7 (permalink)  
Antiguo 14/07/2011, 17:14
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 2 meses
Puntos: 8
Respuesta: problema usando #define como funcion.

Muchas gracias sam90 y dragg04, usar vectores fue la mejor solucion! ya puedo dar por terminado el tema, por favor disculpen que les haya quitado su tiempo.

Etiquetas: boost, define, funcion, preserve, redim, variant
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:27.