• Domingo 28 de Abril de 2024, 13:03

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 - jorgelaprida

Páginas: [1]
1
C/C++ / Re: Añadir archivo.cpp
« en: Sábado 2 de Mayo de 2009, 13:42 »
Hola, me alegro tousan, que hayas podido solucionarlo.

Cita de: "m0skit0"
Además, jamás hace falta incluír un .cpp.

No tengo intención de generar un debate. Pero hay ocasiones en las que  pueden incluirse archivos .cpp para evitar errores de enlazado (link) cuando se usan plantillas (templates). Seguro éste no es el caso, pero no quería que quede como que "jamas" se hace.

Saludos.

2
C/C++ / Re: Añadir archivo.cpp
« en: Viernes 1 de Mayo de 2009, 22:30 »
Hola.

En primer lugar seŕa bueno que incluyeras el mensaje de error, que compilador usas y como compilas. Caso contrario no podemos saber que pasa.  :comp:

Suponiendo que que tu código es correcto, es decir que no redeclares variables u otros errores de ese tipo, es posible hacerlo de la manera que describes ( por medio de #include ). Por lo que es probable que tu codigo no sea del todo correcto.
Igualmente, a menos que utilices templates no es lo habitual. Por lo general se incluyen los .h (.hpp, hh, o como sea que tu compilador los reconozca.).

Se le suele indicar al compilador que  archivos .cpp tiene que compilar y enlazar (aunque el compilador no enlace, dejemosló así para empezar).

Si compilas desde un terminal, como en linux con g++ (gcc) u otro similar, tienes que incluir todos los archivos así:

Código: Text
  1. g++ main.cpp archivo.cpp -o nombredelejecutable
  2.  

o usar un makefile ( pero no creo que eso busques ).

Si estás con un IDE, debes indicarle que archivos son integrantes del proyecto, o algo parecido dependiendo de que entorno uses.

Saludos.

3
C/C++ / Re: [Solucionado] Cambiar state flag despues de un fail()
« en: Jueves 30 de Abril de 2009, 21:01 »
Otra forma de "limpiar" el stream es usando str()

Código: C++
  1. if(convertir.fail())
  2.         {
  3.         cerr<<"error "<<endl;
  4.         convertir.clear(); //reseteo las states flags
  5.         convertir.str("");   //reseteo el stream sobreescribiendolo  
  6.         revisarcoordenada = 0;
  7.         }
  8.  

Así también se resuelven los casos que nombro Eternal Idol. Todavía estoy tratando de resolver, cuando en el archivo aparecen errores del tipo "4tt", que el programa no lea solo 4 y yo no me de cuenta.

Saludos.

4
Sobre los Foros de SoloCodigo / Re: Antes De Postear
« en: Jueves 30 de Abril de 2009, 16:37 »
Cita de: "mOsquitO"
A mí me parece buena idea, aunque indudablemente es un poco redundante. Igualmente creo que la gente tampoco lo leería  :P  &lt;_&lt;


Sí, puede ser que igualmente nadie lo lea. Pero la probabilidad de que lo hagan aumenta. Mucha gente (incluyéndome) ingresa directamente a los subforos mediante algún buscador (i.e. Google) y no se enteran que existe una sección específica sobre el foro, en este caso "Sobre los Foros de SoloCodigo".

Igual queda picando. :P

5
Sobre los Foros de SoloCodigo / Re: Antes De Postear
« en: Jueves 30 de Abril de 2009, 14:48 »
Hola a todos. Quería aportar unas sugerencias.

Primero, a quienes consultan por un problema y logran solucionarlo, aunque sea fuera del foro, que posteen la solución para que otros puedan verla y utilizarla si les surge la misma duda.
Esto apunta a que no se repitan hilos sobre el mismo tema que no terminan en nada o que no se retomen hilos muy antiguos. Agregar el cartel [Solucionado] al título ayuda a ahorrar tiempo en la búsqueda para quienes necesitan respuestas.

Segundo, más bien lo digo a modo de pregunta, ¿será bueno poner en los subforos un link a esta pequeña guía? Así evitaríamos la publicación de los mensajes que ni te dan ganas de leer, esos del tipo: "Ayudennnme,  quiero que me hagan la tarea, no saben  hijos de ***, etc.. "

Por último, si la segunda les parece bien, habría que editar este hilo y ponerle algo así como: "Guia para postear"

Saludos

6
C/C++ / Re: Cambiar state flag despues de un fail()
« en: Jueves 30 de Abril de 2009, 13:56 »
Muchas gracias!!!!  
 
Yo creí en principio que podía hacerlo con flush(). Como flush() pertenece a ostream, pense que el error era no asignar el stream a un dispositivo de salida. Entonces cambié la linea 33:

Código: C++
  1. cerr<<"error"<<endl;convertir1.flush();revisar=00;convertir1.clear();
  2.  

por esta:

Código: C++
  1. cerr<<"error"<<endl<<convertir1.flush();revisar=00;convertir1.clear();
  2.  

y de paso me enteraba que había encontrado. Pero no funcionó. Se ve que flush() solo vacía el buffer, no el stream. Y fail() no es true hasta la próxima pasada en la que vuelve a leer el stream.

Realmente estaba atorado.

Otra pregunta al margen:
Uso el compilador gcc, si compilo con la opción "-Wall" es normal que no me avise que el flujo no esta asignado a nada, cuando usaba convertir1.flush().

Saludos.

7
C/C++ / Re: Cambiar state flag despues de un fail()
« en: Jueves 30 de Abril de 2009, 00:03 »
Te cuento que en la pc que estoy ahora tiene fedora 8 y aunque compilo con "g++ -g", gdb no me reconoce el archivo compilado como ejecutable aunque la salida de  file confirma que es ELF. Creo que es un problema con esta versión de fedora.

Igualmente, convertir1 lo usa cada vez que lee una linea nueva del archivo. En una versión anterior usaba solo un stream convertir en vez de los tres distintos.
En ese caso la salida era:

      latitud           longitud       cuentadigital
             99             66             33
             99             66             33
             99             66             33
             99             66             33

y como estoy sin depurador por el momento agregue un par de salidas.
 
pasada1
linealeida 99,66,33
palabraleida  99
palabraleida  66
palabraleida  33

pasada2
linealeida t,55,22
palabraleida  t
palabraleida  55
palabraleida  22

pasada3
linealeida 77,44,11
palabraleida  77
palabraleida  44
palabraleida  11

pasada4
linealeida 55,33,99
palabraleida  55
palabraleida  33
palabraleida  99

por lo que pienso que el problema es con el stream pero no estoy seguro que hacer.

8
C/C++ / Re: Cambiar state flag despues de un fail()
« en: Miércoles 29 de Abril de 2009, 22:36 »
Hola. Gracias por contestar.
Tenés razón, fail no no devuelve true. Yo creía que el error podría estar ahí, pero no.
Antes no entendía que pasaba, ahora creo que estoy asustado  :D .
Si yo vacié el flujo con flush() y limpié las banderas con clear() ¿por qué el flujo sigue "bloqueado" con el valor anterior? Porque el contenido de "palabraleida" va cambiando como corresponde a la entrada.

9
C/C++ / [Solucionado] Cambiar state flag despues de un fail()
« en: Miércoles 29 de Abril de 2009, 21:51 »
Hola a todos.
Estoy escribiendo un programa que guarda datos numéricos leídos desde un archivo separado por comas es una estructura y ésta en un vector de la STL. Uso stringstreams para dar formato a los datos de forma segura con "<<" y ">>". Quería asegurarme que los datos fueran válidos (números) revisando si la conversión con ">>" es exitosa y lo hago con la función miembro fail(). El problema surge cuando detecta un error, yo trato de recuperar el stream con la función clear() pero no funciona.
Pongo una parte del código que carga los datos y los muestra con la comprobación en el primer campo del struct como ejemplo.


Código: C++
  1. #include<vector>
  2. #include<fstream>
  3. #include<iostream>
  4. #include<iomanip>
  5. #include<sstream>
  6. #include<string>
  7.  
  8. using namespace std;
  9.  
  10. typedef float coordenada ;
  11. typedef struct posicion { coordenada latitud; coordenada longitud; };
  12. typedef struct pixel { posicion posicionpixel; int cuentadigital; };
  13. typedef  vector<pixel> :: iterator iterador;
  14.  
  15. int main()
  16. {
  17. string linealeida, palabraleida;
  18. coordenada revisar;
  19. vector<pixel>vsat;
  20. pixel p;
  21. fstream flujoentrada ("mat.txt");
  22. stringstream  flujodestrings, convertir1, convertir2, convertir3;
  23.  
  24. while(getline(flujoentrada,linealeida))
  25.  
  26.     {
  27.      flujodestrings<<linealeida;
  28.      getline(flujodestrings,palabraleida,',');
  29.      convertir1<<palabraleida;
  30.      convertir1>>revisar;
  31. if(convertir1.fail())
  32. {
  33. cerr<<"error"<<endl;convertir1.flush();revisar=00;convertir1.clear();
  34. }
  35.  
  36.      p.posicionpixel.latitud=revisar;
  37.      convertir1.clear();
  38.      
  39.      getline(flujodestrings,palabraleida,',');
  40.      convertir2<<palabraleida;
  41.      convertir2>>p.posicionpixel.longitud;
  42.      convertir2.clear();
  43.  
  44.      getline(flujodestrings,palabraleida,',');
  45.      convertir3<<palabraleida;
  46.      convertir3>>p.cuentadigital;
  47.      convertir3.clear();
  48.  
  49.      flujodestrings.clear();
  50.  
  51. vsat.push_back(p);
  52.  
  53.  
  54.      }
  55.  
  56.     cout<<setw(15)<<"latitud";
  57.     cout<<setw(15)<<"longitud";
  58.     cout<<setw(15)<<"cuentadigital"<<endl;
  59.  
  60. for( iterador iter = vsat.begin() ; iter != vsat.end() ; iter++ )
  61.     {  
  62.              
  63.     cout<<setw(15)<<iter->posicionpixel.latitud;
  64.     cout<<setw(15)<<iter->posicionpixel.longitud;
  65.     cout<<setw(15)<<iter->cuentadigital<<endl;
  66.  
  67.     }
  68.  
  69. return 0;
  70.  
  71. }
  72.  

Si mat.txt es así:

99,66,33
t,55,22
77,44,11
55,33,99

la salida es:

error
error
error
        latitud       longitud  cuentadigital
             99             66             33
              0             55             22
              0             44             11
              0             33             99

Estoy seguro que el problema está en que bloquea el flujo convertir1.
¿Alguien sabe si se me pasa algo por alto?

Saludos y gracias de antemano.

10
C/C++ / Re: error al cargar archivo cvs
« en: Miércoles 22 de Abril de 2009, 14:51 »
Hola y gracias por responder.

Primero quería aclarar que olvidé modificar la linea 20: while(!is.eof() ) por una comprobación como en la linea 13, quedaría así:
20:while( getline(is,palabra,delimitador)) y la linea 23 desaparece. No es buena idea usar eof(). Así el error del último número duplicado desaparece pero igual queda una linea vacía si hay un "enter" al final del archivo.

No use isdigit() porque no quería desglosar el string y leer por caracteres.
Quería comprobar el valor completo, algo así:

Código: C++
  1.  
  2. #include<typeinfo>
  3.  
  4. ...
  5.  
  6. if( typeid(valor).name()==typeid(T).name())
  7. matriz.back().push_back(valor);
  8.  
  9. else
  10. matriz.back().push_back(-99);
  11.  
  12.  
  13.  

pero yo declaro valor del tipo T asi que no sirve.
Quizá sea un error usar un stringstream para formatear los datos del archivo.

Otra cosa que no entiendo es que si, usando el código con la modificación de arriba, si pongo una letra en vez de un número en el archivo la matriz se llena con el último valor numérico obtenido antes de la letra en el resto de la matriz.
por ejemplo, si la matriz en el archivo es:

1,2,3,4
5,k,6,7  

la matriz cargada se llena así:

1,2,3,4
5,5,5,5

Creo que en cualquier momento  :hitcomp: .

Igual no se si es la forma correcta de generar una matriz, tal vez deba cambiar el enfoque.
Saludos.

11
C/C++ / error al cargar archivo cvs
« en: Lunes 20 de Abril de 2009, 23:08 »
Hola a todos. Estoy tratando de cargar números que están un un archivo separado por comas en una matriz.
Para ejemplificar, el archivo contiene esto:

1,5,8,43,8
78,34,6,2

pero al cargar los valores a la matriz obtengo lo siguiente:

1,5,8,43,8
78,34,6,2
2

el codigo para cargar la matriz es el siguiente;

Código: C++
  1.  
  2. template <class T>
  3. void Matriz<T>::cargarMatriz(string archivo, char delimitador)
  4. {
  5.  
  6. ifstream ar ;
  7.   string linea, palabra;
  8.   stringstream is;//stream para procesar lineas
  9.   stringstream os;//stream para procesar palabras
  10.   ar.open(archivo.c_str());
  11.  
  12.  
  13.   while (getline(ar,linea))
  14.     {
  15.          
  16.       is<<linea;
  17.  
  18.  matriz.push_back(vector <T> ());  
  19.  
  20.  while(!is.eof() )
  21.     {
  22.      
  23.         getline(is,palabra,delimitador);
  24.         os<<palabra;
  25.         T valor;
  26.         os>>valor;
  27.         matriz.back().push_back(valor);
  28.          os.clear();
  29.        
  30.          
  31.     }
  32.  
  33.       is.clear();
  34.    
  35.     }
  36.       ar.close();
  37.  }
  38.  
  39.  


y el código para mostrar el contenido es:

Código: C++
  1. template <class T>
  2. void Matriz<T>:: mostrar()
  3. {
  4.  
  5.  
  6.   typedef typename vector<vector<T> >::iterator itfila;
  7. itfila iteradorFila = matriz.begin();
  8. itfila finDeFila = matriz.end();
  9. for(;iteradorFila < finDeFila; iteradorFila++)
  10.     {
  11.  
  12.  typedef typename vector<T> ::iterator itcolumna;
  13. itcolumna iteradorColumna = iteradorFila->begin();
  14. itcolumna finDeColumna = iteradorFila->end();
  15.       for(; iteradorColumna < finDeColumna ; iteradorColumna++ )
  16.    
  17.  
  18.     cout << setw ( 5 ) << *iteradorColumna;
  19.  
  20.       cout<<endl;
  21.     }
  22. }
  23.  
  24.  

El problema desaparece si abro el archivo a leer con un editor de texto, me sitúo en la última linea (que no tiene ningún valor numérico) y la borro dejando el cursor junto al último número de la última linea.

Interpreto que estoy leyendo esta linea (vacía) con getline() pero no estoy seguro de como evitarlo (con ignore() será?).
Saludos y gracias.

Páginas: [1]