• Sábado 4 de Mayo de 2024, 19:05

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - alb

Páginas: [1]
1
C/C++ / Re: funcion recursiva
« en: Martes 30 de Noviembre de 2010, 20:43 »
Hola,
Cita de: "m0skit0"
Cita de: "morfus_bedxhed"
En IA32 (comúnmente llamada x86), el paso de argumentos a funciones se realiza a través de la pila. Esto es, se ponen en la pila los argumentos de la función en orden inverso a los declarados en C, usando la instrucción PUSH. En este caso, se pasa el char en la pila a inversa(). La función lo recupera con la instrucción POP.
Eso depiende del modo de llamada de una funccion : cdecl/stdcall pasa por la pila, pero fastcall utiliza ecx y edx para los dos primeros parametros. Luego hay differencia en quien tiene la responsabilidad de limpiar la pila. Antes existia tambien __pascal para indicar que se pasaba de hizquierda hacia derecha. Y otro modo register que utilizaba eax. En C++, this puede ser pasado en ECX o en la pila. Todo eso depiende del compilador y del 'calling conventions' de la function. No es nada estandar. ver aqui : x86 calling conventions

2
C/C++ / Re: problema con funcion
« en: Martes 30 de Noviembre de 2010, 20:21 »
Hola,
Para un tipo como std::string, se puede pasar una referencia constante para no hacer una copia inutil (si no implementa COW de manera eficiente ) :
Código: C++
  1. int RecogeDatos(string const & nombre_del_parámetro)
  2.  

3
C/C++ / Re: No entiendo muy bien el tipo float
« en: Martes 30 de Noviembre de 2010, 19:54 »
Holà,
Los tipos 'nativos' de C y de C++ son :
**** integer types ****
char : bastante para contenir un 'execution caracter set'
signed char, short, int, long son signed integers types. No se sabe cuanto occupan cada uno de esos tipos (sus tamaños) pero la norma indica lo mìnimo que tiene que caber en cada uno de ellos :
signed char [-127;128[
short [-32767,32768[
int [-32767,32768[
long [-2147483647,2147483648[
C define tambien long long que no existe todavia en C++ pero me parece que debe ser introducido con C++0x.
long long [-9223372036854775807,9223372036854775808[

C++ tiene bool que puede contener true/false. En C90 no hay boolean tipo pero en C99 hay _Bool que debe poder contenir 0 y 1.

Estos tipos existen tambien en unsigned : unsigned char, unsigned short, unsigned int, unsigned long (y unsigned long long en C) con valores :
unsigned char [0;255[
unsigned short [0;65535[
unsigned int [0;65535[
unsigned long [0;4294967295[
unsigned long long [0;18446744073709551615[
Ai que notar que signed char != char != unsigned char : son tres tipos distinctos. Pero short/signed short, int/signed int, long/signed long, long long/signed long long son los mismos.
Tambien sizeof(char)==1 esto siempre aun que char puede occupar mas de 8 bits.
En los ordenadores modernos en 32 bits, los tipos suelen ser :
char/unsigned char : 8 bits
short/unsigned short : 16 bits
int/unsigned int : 32 bits
long/unsigned long : 32 bits
long long/unsigned long long : 64 bits.
En 64 bits, int, long pueden ser en 64 bits sin que sea eso la norma.
En desarrollo para lo embedido (? embedded), es todavia normal trabajar con int/unsigned int en 16 bits. Existe tambien procesador con char sobre 10 bits y short con 20 bits.

Lo que tienes que recordar :
char <= short <= int <= long <= long long
unsigned char <= unsigned short <= unsigned int <= unsigned long <= unsigned long long

y los intervales garantizados por la norma :
signed char [-127;128[
short [-32767,32768[
int [-32767,32768[
long [-2147483647,2147483648[


unsigned char [0;255[
unsigned short [0;65535[
unsigned int [0;65535[
unsigned long [0;4294967295[
unsigned long long [0;18446744073709551615[


Los mìnimos y los maximos de cada tipos te lo da el compilador :
En C, estan definidos en <limits.h>
Código: C
  1. #define CHAR_BIT   specific compiler value
  2. #define CHAR_MAX   specific compiler value
  3. #define CHAR_MIN   specific compiler value
  4. #define INT_MAX    specific compiler value
  5. #define INT_MIN    specific compiler value
  6. #define LONG_MAX   specific compiler value
  7. #define LONG_MIN   specific compiler value
  8. #define LLONG_MAX  specific compiler value
  9. #define LLONG_MIN  specific compiler value
  10. #define MB_LEN_MAX specific compiler value
  11. #define SCHAR_MAX  specific compiler value
  12. #define SCHAR_MIN  specific compiler value
  13. #define SHRT_MAX   specific compiler value
  14. #define SHRT_MIN   specific compiler value
  15. #define UCHAR_MAX  specific compiler value
  16. #define USHRT_MAX  specific compiler value
  17. #define UINT_MAX   specific compiler value
  18. #define ULONG_MAX  specific compiler value
  19. #define ULLONG_MAX specific compiler value
  20.  
En C++, estan definidos en <limits> y se obtene los min/max con dedicado std::numeric_limits :
Código: C++
  1. std::numeric_limits<signed char>::min()
  2. std::numeric_limits<signed char>::max()
  3. std::numeric_limits<unsigned char>::min()
  4. std::numeric_limits<unsigned char>::max()
  5. std::numeric_limits<short>::min()
  6. std::numeric_limits<short>::max()
  7. std::numeric_limits<unsigned short>::min()
  8. std::numeric_limits<unsigned short>::max()
  9. std::numeric_limits<int>::min()
  10. std::numeric_limits<int>::max()
  11. std::numeric_limits<unsigned int>::min()
  12. std::numeric_limits<unsigned int>::max()
  13. std::numeric_limits<long>::min()
  14. std::numeric_limits<long>::max()
  15. std::numeric_limits<unsigned long>::min()
  16. std::numeric_limits<unsigned long>::max()
  17.  

Tambien podria hablar de intN_t, uintN_t y otros tipos definidos en <stdint.h> en C99, que no existen en C++03 pero son definidos en C++0X en <cstdint>. Esos tipos son definidos para garantizar su tamaño : exacto (intN_t), a minimo (int_leastN_t) o optimizado ((int_fastN_t)

**** real types ****
C y C++ definen 3 tipos : float, double y long double con la restricción : lo que cabé en float, debe caber en double y lo que cabe en double debe caber en long double.
Y tambien tienes min/max par esos tipos en <float.h> en C y con std::numeric_limits<float/double/long double> en C++ con valores al minimo de 1.17549435E-38F y al maximo de 3.40282347E+38F par esos tres tipos.

Pero las valores suelen ser :
Código: C
  1. #include <float.h>
  2. FLT_MIN  1.17549435E-38F
  3. FLT_MAX   3.40282347E+38F
  4.  
  5. DBL_MIN 2.2250738585072014E-308
  6. DBL_MAX 1.7976931348623157E+308
  7.  
  8. LDBL_MIN 3.3621e-4932
  9. LDBL_MAX - 1.18973e+4932
  10.  
y en C++
Código: C++
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. template<typename type>
  5. void dump()
  6. {
  7.     std::cout<<std::numeric_limits<type>::min()<<" ; "<<std::numeric_limits<type>::max()<<"n";
  8. }
  9. int main()
  10. {
  11.     dump<float>();
  12.     dump<double>();
  13.     dump<long double>();
  14.     return 0;
  15. }
  16.  
  17.  
produe con mi ordenador (puede cambiar selun tu compilador/OS/processor) :
Citar
1.17549e-038 ; 3.40282e+038
2.22507e-308 ; 1.79769e+308
3.3621e-4932 ; 1.18973e+4932

Aun que no es normativo, los tipos real suelen seguir la norma IEC 60559. Los tipos real suelen ser representado con
[S|Exponent|                    fraction                     ]
S : one bit
Exponent y fraction van a ser diferentes segun que sea float, double o long double
float : 32 bits con 8 bit para exponent y 23 bit para fraccion
double : 64 bits con 11 bit para exponent y 52 bit para fraccion
long double : 96 bits con 15 bit para exponent y 80 bit para fraccion
El modo de calculo de los reales es un poco tecnico par ser explicado aqui. Te puedes referir a la entrada de wikipedia que me parece bastante clara : IEEE 754-1985
Los tamaños de float (32bits), double (64 bits) y long double (96 bits) no dependen tanto de saber si tienes processor/OS de 32 o 64 bits porque el calculo con tipos real tiene una unidad dedicada en el processor. De memoria, ya el intel 8087 tenia float sobre 32bits y double sobre 64 bits (long double sobre 80 bits me parece). Cuando al mismo tiempo, el 8086 estaba sobre 16 bits (int == short == 16 bits). Aunque es verda que 8086 y 8087 son de un dato que los menos de veinte años no se pueden recordar  :D

Los problemas con los tipos real es que necesitan rapidamente conocimiento matématico por problemas de representacion, convercion, precicion, error de calculo etc. Un documento muy interesante à leer : What Every Computer Scientist Should Know About Floating-Point Arithmetic de David Goldberg

**** y ademas ****
todavia queda de decir sobre los tipos pointers y void (C++) que tambien hacen parte de tipos fundamuntales del lenguage.

4
C/C++ / Re: Problemas como pasar char por referencia
« en: Martes 30 de Noviembre de 2010, 07:15 »
Holà,
Para pasa un pointer de una arrray, hubiera sido :
Código: C
  1. void encriptar(char (*frase)[50], int longitud, int n)
  2.  
Lueog es impide que lo utilizes asì : (*frase). Por ejemplo :
Código: C
  1. if ((*frase)[i] != ' ')
  2.  
Pero me parece que no sirve a nada de pasarlò como lo haces. Esto es suficiente :
Código: C
  1. void encriptar(char frase[50], int longitud, int n)
  2.  
llamando la funcion :
Código: C
  1. encriptar(frase,longitud,n);
  2.  


main no tiene forma correcta. Debrìa ser :
Código: C++
  1. int main(void)
  2.  
o
Código: C++
  1. int main(int argc, char *argv[])
  2.  


Una cadena de caracter se termina por ''. Asi abc no tiene 27 sino 28 caracteres. Però, lo mejor es dejar el compilador calcularlo solo :
Código: C
  1.    char abc[]="ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
  2.    const size_t abc_len = sizeof(abc)/sizeof(abc[1]);
  3.  
  4.  

Las bucles de vectores no se hacen de 1 hasta Length, pero empezan con 0. Asì que debria ser :
Código: C
  1. for (i=0;i<longitud;i++)
  2.  
y
Código: C
  1.          j=0; encontrado=0;
  2.          while (j<27 && encontrado==0)
  3.  
  4.  

5
C/C++ / Re: ruta ftp en ++
« en: Lunes 8 de Noviembre de 2010, 13:44 »
Holà,
Cita de: "m0skit0"
La mejor forma es pasárselo como parámetro al programa. Recuerda que el prototipo de main es

Código: C++
  1. int main(int argc, char* argv[])
  2.  
Código: C++
  1. int main()
  2.  
y
Código: C++
  1. int main(int argc, char* argv[])
  2.  
son los dos prototipos vàlidos en C++ (ISO/IEC 14882:2003, 3.6.1 Main function)

Código: C++
  1. int main(void)
  2.  
y
Código: C++
  1. int main(int argc, char *argv[])
  2.  
son los dos prototipos vàlidos en C (ISO/IEC 9899:1999,5.1.2.2.1 Program startup)

6
C/C++ / Re: [C++] Duda sobre funciones amigas y herencia
« en: Martes 2 de Noviembre de 2010, 19:07 »
Holà,
La amistad no se transmite con herencia.
Aunque no me sale evidente de porque necesitas herencia con ostream ? Para eso, function virtual es bastante :
Código: C++
  1. #include <iostream>
  2.  
  3. struct base
  4. {
  5.     std::ostream& print(std::ostream&out_) const
  6.     {
  7.         out_<<"I'am a class : ";
  8.         return do_print(out_);
  9.     }
  10.     virtual ~base() // =default con C++0x
  11.     {}
  12. private :
  13.     virtual std::ostream& do_print(std::ostream&out_) const
  14.     {
  15.         return out_<<"base";
  16.     }
  17. };
  18.  
  19. struct derived : public base
  20. {
  21.     private:
  22.     virtual std::ostream& do_print(std::ostream&out_) const
  23.     {
  24.         return out_<<"derived";
  25.     }
  26. };
  27.  
  28. std::ostream& operator<<(std::ostream&out_, base const &base_)
  29. {
  30.     base_.print(out_);
  31.     return out_<<"n";
  32. }
  33.  
  34. void tell_me_who_am_i(base const&b_)
  35. {
  36.     std::cout<<b_;
  37. }
  38.  
  39. int main()
  40. {
  41.     tell_me_who_am_i(base());
  42.     tell_me_who_am_i(derived());
  43.    return 0;
  44. }
  45.  
  46.  

7
C/C++ / Re: Ruego su apollo con este codigo
« en: Viernes 29 de Octubre de 2010, 14:12 »
Cita de: "m0skit0"
En su caso creo que islower es más adecuado ya que sólo busca las letras minúsculas según su ejemplo.
Si. La idea es de mirar en cctype cual es la que le arregle lo mas.

8
C/C++ / Re: La variable local no se destruye?
« en: Viernes 29 de Octubre de 2010, 14:10 »
C++ te da la garantia que à salir de la funcion el destructor de todas las variables locales son llamado. Con los tipos triviales (int, short, char, *, ...) no hay destructor pero el principio es igual.
Pero en cuanto de que pasà a la memoria reservada para esas variables es un comportamento indeterminado. Es decir que puede quedarse tal que en la funcion, cambiar de valor, o explotar ;)
La nocìon de pila (stack) o de heap no existe en la norma de C ni de C++. Es un detalle que releva del systema (processor + Operating System).

9
C/C++ / Re: Ruego su apollo con este codigo
« en: Viernes 29 de Octubre de 2010, 14:00 »
Holà,
No es possible utilizar un case VAL_1 ... VAL_Ultimo. Debes o separarlo en tanto casos :
Código: C++
  1. case 'a':
  2. case 'b':
  3. case 'c':
  4. etc...
  5.  
pero est bastande fastidioso. Puedes utilizar std::isalpha de <cctype> (http://www.cplusplus.com/reference/clibrary/cctype/) que salé differente de 0 si le das una lettra ('a' o 'A') :
Código: C++
  1. if(std::isalpha(letra)!=0)
  2. {
  3.    // do_it
  4. }
  5. else{// letra no es ['a'-'z'] ni ['A'-'Z']
  6. }
  7.  

10
C/C++ / Re: Validar Numeros
« en: Domingo 17 de Octubre de 2010, 10:02 »
Hola,
Tienes que comprobar que la lectura se pasa bien, y sino tratar el problema.
Cuando haces std::cin>>var_, si falla la instruction, std::cin se pone en error y tiene el flag fail puesto. Ya puedes probar su valor y preguntar por entrar une valor appropuesto.
Seria algo asi :
Código: C++
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. bool entrar_doble(double &d_)
  5. {
  6.     std::cin>>d_;
  7.     if(std::cin.eof())
  8.     {
  9.         // 'Ctrl+Z' - se cierra el stream
  10.         std::cin.clear(); // borrar el flag de error
  11.         return false;
  12.     }
  13.     else if(std::cin.fail())
  14.     {
  15.         std::cin.clear(); // borrar el flag de error
  16.         std::cin.ignore( std::numeric_limits<std::streamsize>::max(), 'n' );
  17.         // ir hasta el fin de la linea entrada por el utilisador
  18.  
  19.         return false;
  20.     }
  21.  
  22.     return true;
  23. }
  24.  
  25. int main()
  26. {
  27.     double X;
  28.     std::cout << "X: " ;
  29.     while(!entrar_doble(X))
  30.     {
  31.         std::cout<<"X debe que ser un doble !n";
  32.     }
  33.  
  34.     std::cout<<"nn"<<X<<"n";
  35.     return 0; // succès
  36. }
  37.  
  38.  

11
C/C++ / Re: VS 2010 ERROR DE UBICACION
« en: Domingo 17 de Octubre de 2010, 09:41 »
No tendràs errores de compilacion antes ? Porque este error me hace pensar que has tratado de hacer Ctr+F5 en tu programma pero la compilacion fallo.

12
C/C++ / Re: Avanzar una cadena hasta tope
« en: Domingo 10 de Octubre de 2010, 23:00 »
char no es string sino std::string en C++ (o char */char[] en C). A que sirve longitud ?

13
C/C++ / Re: problemas al visualizar ua linea en dev
« en: Domingo 10 de Octubre de 2010, 22:56 »
Intentata esto :
Código: C++
  1. #include <stdio.h>
  2. #include <conio.h>
  3. int main(void)
  4. {
  5.   printf("Bienvenido al primer programa en cn");
  6.   fflush(stdout);
  7.   _getch();
  8.   return 0;
  9. }
  10.  
Lo que puede haberse pasado es que el programa fue tan rapido que no vistes lo que paso. _getch() permite esperar que le des à una tecla ante de que se acabe.

14
C/C++ / Re: como asigno un valor a cada posicion de un vector de 10?
« en: Jueves 7 de Octubre de 2010, 15:34 »
Hola,
Hay varios problemas en todo esos còdigos :
Código: C++
  1. #include <iostream.h>
  2.  
En C++, los .h de C ya no se deben usar sino los de la STL :
Código: C++
  1. #include <iostream>
  2.  

Código: C++
  1. #include <conio.h>
  2.  
conio.h no es estandard y muchos compiladores no lo proponen. So de debrìa usar.

Código: C++
  1.  
  2. int dim;
  3. cin >> dim; // Supongamos que ingrese 10
  4. int vector[dim]; // mi vector es de tamaño 10
  5.  
  6.  
No es standard definir un vector cuya dimensìon no sea constante, es decir conocida por el compilador. Mejor es usar new/delete :
Código: C++
  1.  int *vector = new int[dim];
  2.  
Sino que cada new [] se debe liberar con un delete [] y no con delete solo:
Código: C++
  1.  
  2. int *p = new int;
  3. delete p;
  4. int *vector = new int[dim];
  5. delete []vector;
  6.  

Pero, en C++, se prifiere usar std::vector que utilizar new[]/delete[] :
Código: C++
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. int main()
  5. {
  6.      int dim;
  7.      std::cout << "Ingresa la dimension del vector" << std::endl;
  8.      std::cin >> dim; // Supongamos que ingrese 10
  9.      std::vector<int> mi_vector(dim); // mi vector es de tamaño 10
  10.  
  11.      for(int i=0;i < dim;i++)
  12.      {
  13.          std::cout << "Ingresa un numero" << std::endl;
  14.          std::cin >> mi_vector[i];
  15.      }
  16.  
  17.      for(std::vector<int>::const_iterator it = mi_vector.begin();it!=mi_vector.end();++it)
  18.      {
  19.          std::cout << *it << " ";
  20.      }
  21.  
  22.      return 0;
  23. }
  24.  

15
C/C++ / Re: como organizar el code en Dev-Cpp
« en: Domingo 3 de Octubre de 2010, 23:15 »
Has salvado el primer archivo con nombre "funciones.h" ?

16
C/C++ / Re: impresion de vactores de tipo char
« en: Domingo 3 de Octubre de 2010, 23:03 »
Utilizando char[] tienes que accabar con '' y parar la salida cuando encuentras este ''.
Código: C++
  1. for(i=0;i<=cont;i++){
  2.    cout<<"n";
  3.    for(j=0;(j<=20)&&(nom[i][j]!='');j++){
  4.       cout<<nom[i][j];
  5.    }
  6.  

Salrdia mejor si utilizas std::string en vez de char[] et std::vector<std::string> > en vez de char[][].
Código: C++
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <iterator>
  4. #include <vector>
  5. #include <string>
  6.  
  7. int main()
  8. {
  9. std::vector<std::string> vect_nom;
  10. std::copy(vect_nom.begin(),vect_nom.end(),std::ostream_iterator<std::string>(std::cout,"n"));
  11.  
  12.  
  13.     return 0;
  14.  
  15. }
  16.  
  17.  

17
C/C++ / Re: Liberar el puntero de un puntero
« en: Domingo 3 de Octubre de 2010, 22:50 »
Bueno,
A cada malloc tiene que corresponder un free. Poco importa si un puntero apunta a otros punteros o a otra cosa.

18
C/C++ / Re: numeros aleatorios C++ Allegro
« en: Domingo 3 de Octubre de 2010, 07:50 »
Lo mas completo que conozco es Boost.Random  en boost.org/doc/html/boost_random.html

19
C/C++ / Re: como organizar el code en Dev-Cpp
« en: Domingo 3 de Octubre de 2010, 07:38 »
En C++, puedes declarar la clase en un archivo .h y definirla en un .cpp. Es importante al empezar un nuevo programa de tener una idea de los elementos mas importantes del programa. Eso te puede ayudar a separar el codigo en diferentes partes.

20
C/C++ / Re: Librería STL
« en: Sábado 2 de Octubre de 2010, 10:15 »
Cita de: "player_"
Y para pasar como parámetro de una función un vector creado con stl, es correcto así, pasándolo por referencia?
Si, es correcto pasarlo por referencia (posiblemente const).
Pero me dado cuenta que cada vèz que pasaba tal parametro (un std::vector, std::list, etc.), acababa por echarlo de menos. Prifiero ahora pasar iterators:
Código: C++
  1. #include <iostream>
  2. #include <vector>
  3. void dump_vector(std::vector<int>::const_iterator begin_,std::vector<int>::const_iterator end_)
  4. {
  5.     for(;begin_!=end_;++begin_)
  6.     {
  7.         std::cout<<*begin_<<"n";
  8.     }
  9. }
  10.  
  11. void fill_vector(std::vector<int>::iterator begin_,std::vector<int>::size_type count_, int value_)
  12. {
  13.    for(;count_>0;--count_,++begin_)
  14.    {
  15.       *begin_ = value_;
  16.    }
  17. }
  18.  
  19. int main()
  20. {
  21.     std::vector<int> v;
  22.     v.resize(10);
  23.     fill_vector(v.begin(),10,1);
  24.     dump_vector(v.begin(),v.end());
  25.     return 0;
  26. }
  27.  
  28.  

Tambien me di cuenta que muchas cosas son posibles sin esfuerto con la STL :
Código: C++
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <iterator>
  5.  
  6. int main()
  7. {
  8.     std::vector<int> v;
  9.     std::fill_n(std::back_inserter(v),10,1); // igual que fill_vector pero todo en standard
  10.     std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout,",")); // igual que dump_vector pero todo con standard
  11.     std::cout<<"n";
  12.     return 0;
  13. }
  14.  
  15.  

21
C/C++ / Re: duda con un switch
« en: Sábado 2 de Octubre de 2010, 09:52 »
Holà,
Llamar main en el codigo es algo bastante raro. main no es una funcion como las otras.
A mi me parece que utilizar la recursion en este caso no es muy apropiado porque solo te interesa la primera respuesta valida. Me paracer que usar un do...while es mas apropiado, no ?

22
C/C++ / Re: Darle un valor a una var dentro de la definicion de una clas
« en: Sábado 2 de Octubre de 2010, 09:45 »
Holà,
Para darle valor en el constructor, suele hacerse con una inicializacion-list :
Código: C++
  1. class my_class
  2. {
  3.     public:
  4.     my_class():my_var(4)
  5.     {}
  6.    
  7.     private:
  8.     int my_var;
  9. };
  10.  
Cuando se escribe :
Código: C++
  1. my_class::my_class()
  2. {
  3.    my_var = value;
  4. }
  5.  
lo que pasa es :
1/ construcion del objecto my_var antes de entrar el constructor de my_class
2/ llamada al operador= para darle valor.

Sin embargo, al escribir :
Código: C++
  1. my_class::my_class():my_var(value)
  2. {}
  3.  
solo hay :
1/ llamada al constructor de my_var con el buen valor.

Con los tipos basicos (int, char, short, double, etc...), las dos escrituras son iguales porque construir my_var no cuesta nada. Pero accostumbrarse a escribir lo con inicializacion-list permitira hacerlo sin pensar cuando el typo no sera tan basico.

Otra cosa :
En la futura norma (C++0x) serà valido escribir algo cierca de lo que querias :
Código: C++
  1. class my_class
  2. {
  3. public :
  4.    my_class()
  5.    {// aquì i==4
  6.    }
  7.  
  8. private:
  9.    int i = 4;
  10. };
  11.  

23
C/C++ / Re: Error undefined reference to `vtable for
« en: Sábado 2 de Octubre de 2010, 09:22 »
Hola,
Suele occurir en este caso :
Todas las funcìones virtual estàn definidas en le .h y no el .cpp. Muchos compiladores ponen la vtable en el .obj(.o) del .cpp con la primera non-pure non inline virtual funcìon.

24
C/C++ / Re: Acceder a objetos atraves de un array
« en: Sábado 2 de Octubre de 2010, 09:02 »
Holà,
Me parece que utilizar una array de 40000 espacios par solo 300 objetos nos es lo mas appropriado.
Porque no proponer un container dedicado que puede utilizar una std::map con la llave siendo une std::pair de las cordenadas. En vez de utilizar el operador [] utilizas el operador() para obtener un elemento.
Algo asi :
Código: C++
  1. #include <map>
  2. #include <utility>
  3.  
  4. template<typename key_t_,typename my_data_t_>
  5. struct my_container
  6. {
  7.     my_data_t_& operator()(key_t_ x_, key_t_ y_)
  8.     {
  9.         return my_set[std::make_pair(x_,y_)];
  10.     }
  11.  
  12.     my_data_t_ const & operator()(key_t_ x_, key_t_ y_) const
  13.     {
  14.         return my_set[std::make_pair(x_,y_)];
  15.     }
  16.  
  17.     private:
  18.     std::map<std::pair<key_t_,key_t_>,my_data_t_> my_set;
  19. };
  20.  
  21. struct dummy {};
  22.  
  23. int main()
  24. {
  25.     my_container<int,dummy> cont;
  26.     cont(1,2) = dummy();
  27.  
  28.    return 0;
  29. }
  30.  

Páginas: [1]