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

No se muestran los datos

Estas en el tema de No se muestran los datos en el foro de C/C++ en Foros del Web. Que tal, un saludo a todos los colegas. Después de un tiempo sin programar, he vuelto con más entusiasmo que nunca. Ya que diversos temas ...
  #1 (permalink)  
Antiguo 28/12/2012, 14:55
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 11 años, 2 meses
Puntos: 1
No se muestran los datos

Que tal, un saludo a todos los colegas.

Después de un tiempo sin programar, he vuelto con más entusiasmo que nunca. Ya que diversos temas me han ayudado tanto, les solicito su ayuda con el siguiente código:

res=mysql_use_result(myData);
row=mysql_fetch_row(res);
//cout<<row[0]<<endl;
//cout<<row[1]<<endl;
for(k = 0 ; k < sizeof(res) ; k++)
cout << row[k]<<endl;
}

Es una aplicación que conecta a mysql, el problema es que no puedo imprimir los datos almacenados en una tabla llamada persona, y sólo me muestra los 2 primeros registros. Alguna idea, tip, ect. de como puedo resolver el problema?
  #2 (permalink)  
Antiguo 28/12/2012, 20:01
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 7 años, 8 meses
Puntos: 35
Respuesta: No se muestran los datos

Hola. No programo en C++, pero al estar los datos en la variable row, creo que el bucle debería ser:

Código C++:
Ver original
  1. for(k = 0 ; k < sizeof(row) ; k++)

  #3 (permalink)  
Antiguo 28/12/2012, 20:41
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: No se muestran los datos

ok, te agradezco tu ayuda. Pero continúa el error, te adjunto un archivo con los daatos que debería mostrar y lo que está omstrando.

https://www.dropbox.com/s/4of8oeph8csaeja/error.jpg?m
  #4 (permalink)  
Antiguo 29/12/2012, 03:15
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.329
Antigüedad: 11 años, 8 meses
Puntos: 606
Respuesta: No se muestran los datos

En realidad es un error de programación, o mejor dicho, una mala praxis. Cuando haces una consulta en SQL has de saber que campos consultas y por lo tanto sabes la cantidad. Lo que puedes desconocer es la cantidad de filas que te devolverá la consulta pero no la cantidad de columnas. Partiendo de eso, siempre vas a saber el tamaño de "row" y el valor máximo que poner en el for.

Si igualmente quieres seguir usando una "select *" (no te lo aconsejo ...) tendrías que usar la funcion mysql_num_fields de PHP.
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 29/12/2012, 15:24
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: No se muestran los datos

Me podrías explicar la manera?. De hecno en un manual de una web sobre C++, estaba el código parecido. En realidad me puedes explicar o indicar que investigar?
  #6 (permalink)  
Antiguo 30/12/2012, 10:58
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 7 años, 4 meses
Puntos: 127
Respuesta: No se muestran los datos

Una sugerencia, el código C++ que incluya dentro de la condición del for una comprobación de un recurso estático repite el mismo procedimiento una y otra vez haciendo que el procesador salte continuadamente a distintas fases del procesamiento y consumiendo más tiempo. Sería ideal quizás que incluyeras

double size = sizeof(res); // o int, según el tamaño
for(k = 0 ; k < res; k++){}

Lo cual sería una sola operación de cálculo simple numérico que setearía los flags y consumiría menos ciclos de proceso. (lo escribo tal cual, no lo comprobé)

mov eax, dword ptr [size]
cmp eax, dword ptr [k] // suponiendo que k es un puntero
jle dir

Lo que tienes puesto probablemente salte a otro punto del código para repetir la operación de comprobación nuevamente teniendo que introducir los mismos datos en el stack, etc.

mov eax, dword ptr [k]
add eax, 1
push loquesea
...
call/jmp sizeof // llamada adicional innecesaria
mov eax, dword ptr [size]
...

Como cuestión adicional se me ocurriría que el tipo de dato devuelto por sizeof es un tipo numérico sin signo (size_t), no sé hasta qué punto el typecasting puede consumir recursos a la hora de convertir ese tipo a un entero normal

size_t size = sizeof(res);
int size_int = (int) size;

Quizás vendría bien que mirases eso para comprobar la efectividad.

Un saludo.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 30/12/2012 a las 11:42
  #7 (permalink)  
Antiguo 30/12/2012, 16:00
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: No se muestran los datos

Aún sigue sin funcionar, ya le agregué los cambios propuestos y creo que el problema no es la función sizeof. Algún comentario extra??
  #8 (permalink)  
Antiguo 30/12/2012, 17:20
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 7 años, 4 meses
Puntos: 127
Respuesta: No se muestran los datos

En un principio tampoco entendí la finalidad de usar sizeof en ese contexto, pero te diré, sizeof sólo devuelve el tamaño en bytes del argumento, cosa que no tiene absolutamente nada que ver con la clase de bucle que deseas. En tu caso tendrías que usar mysql_num_rows

Código C++:
Ver original
  1. unsigned int num_rows =  mysql_num_rows(res);

que devuelve un entero sin signo con el número de registros.

Por otro lado, tampoco tiene sentido usar fetch_row solo una vez, se ha de usar continuadamente (una vez por cada fila) para mover el puntero de datos a la siguiente fila. En un principio y aplicando esos dos puntos

Código C++:
Ver original
  1. unsigned int num_rows =  mysql_num_rows(res);
  2. MYSQL_ROW row;
  3. for(k = 0 ; k < num_rows ; k++)
  4. {
  5. row = mysql_fetch_row(res);
  6. cout << row[1];
  7.  
  8. }

ya que row contiene la fila actual se puede referenciar a cada uno de los campos usando row[0] y row[1], para lo cual también podrías embeber otro bucle que recorra el número de columnas del resultado actual haciendo uso de mysql_num_fields.

Como apreciación (algo sabido de sobra por todos aquellos que hemos programado php), un bucle while al comprobar a cada ejecución la condición, se puede incluir la misma en un bucle while y por tanto sería equivalente

while(mysql_fetch_row(res))
{
...
}

En fin, es algo de imaginación y ya.

Como anotación adicional y sin ánimos de ofender quizás sería bueno que trataras de entender las cosas por tu propia cuenta.

Deberías leer la documentación y tratar de entenderla. (acá).
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 31/12/2012 a las 03:32
  #9 (permalink)  
Antiguo 31/12/2012, 13:04
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: No se muestran los datos

modifiqué el código al siguiente:

res=mysql_use_result(myData);
num_fields=mysql_num_fields(res);
i=0;
while ((row=mysql_fetch_row(res))) {
for(i = 0; i < num_fields; i++){
cout<<row[i]<<" ";
}
cout<<endl;
}
cout<<endl;

ya que con el anterior código y al agregar registros a la tabla mostraba unicamente lo siguiente:

https://www.dropbox.com/s/6u26sx8vf3...error_2.jpg?m#

Etiquetas: muestran, programa
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 14:46.