elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW  (Leído 4,611 veces)
fzp

Desconectado Desconectado

Mensajes: 130


Ver Perfil
Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« en: 7 Diciembre 2021, 17:36 pm »

¿Existe alguna razón por la que un mismo código C -estándar + librerías stdio.h - stdlib.h- se comporte de forma distinta en un entorno Linux-Ubuntu -compilador gcc-, que en otro entorno Windows-compilador-MinGW (gcc).

En concreto:

para una variabe declarada como:
Código
  1. int variable;

y un uso de ella con:
Código
  1. scanf (%d", &variable);

en el entorno Linux-Ubuntu me funciona con cualquier nº entero, pero en Windows-MinGW sólo me funciona si variable <=9. En cuanto  le meto variable = 10, 11, 12,... el programa simplemente se sale al terminal sin dar explicaciones.

NOTA: en el entorno Linux el nombre del programa es el mismo del programa fuente sin ".c"; en en el entorno Windows lo llamo nombre del programa ".exe". Lo he probado tanto desde Visual Studio -a través del run- como directamente en CMD-Windows compilando con gcc a mano y ejecutando a mano nombre-del-programa.exe.
En el entorno Linux siempre en consola compilado y ejecutado a mano.
 


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« Respuesta #1 en: 7 Diciembre 2021, 18:09 pm »

No deberia dar problemas y no me los da. ¿Seguro que no estas haciendo absolutamente nada mas que genere el problema? Publica una version minima compilable que reproduzca el poblema o ejecuta tu programa bajo un depurador.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« Respuesta #2 en: 7 Diciembre 2021, 18:18 pm »

Como dice @Eternal Idol, no debería haber ninguna diferencia.
Sólo decir que en el código anterior faltan unas comillas dobles antes del % pero supongo que ha sido un error al escribir el mensaje pues sino no compilaría el programa.

Qué más haces con esa variable?
Pega un par de ejecuciones donde se vea funcionando bien y fallando para poder echarle un ojo... :rolleyes:
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
fzp

Desconectado Desconectado

Mensajes: 130


Ver Perfil
Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« Respuesta #3 en: 7 Diciembre 2021, 20:02 pm »

Pego el código completo -que llevo hasta ahora-, lo que pasa es que en buena parte es supérfluo, porque simplemente es el inicio de un código que espero llegue a mayor y lo que estoy haciendo es empezar a depurar antes de escribir más. Lo que me interesa es lo que pasa con respecto a num_nodos.
Lo del porqué los elementos [3][4] es simplemente para llevar un control, no es nada especial. También sé que se puede hacer con pila (push-pop) pero yo quiero hacerlo así, con un a rreglo hecho por mí.

Código
  1. // Calcula si un grafo es conexo o no
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. #define ORDEN_MATR num_nodos * num_nodos
  6.  
  7. void intro_grafo (int num_nodos, int ** matr_adher);
  8.  
  9. int main ()
  10. {
  11. int num_nodos; // Nº de nodos del grafo
  12. int ** matr_adher; // Matriz de adherencia del grafo
  13. int nodo_actual; // El que se está procesando en un momento dado
  14. char * estado_nodo; // 1 - si ya se ha pasado por él al menos una vez; 0 - en caso contrario
  15. int * camino; // Guarda los nodos que se van recorriendo
  16. int posicion; // subindice del arreglo camino [] que corresponde a nodo_actual
  17. char sentido; // 1 si se va avanzando hacia nodo no visitado; 0 - si se va retrocediendo a nodo ya visitado
  18. int i, j;
  19.  
  20. printf ("Introducir no. de nodos del grafo: ");
  21. scanf ("%d", &num_nodos);
  22. printf ("el numero es: %d\n", num_nodos);
  23. // Declara variables
  24. matr_adher = (int **) malloc ( ORDEN_MATR * sizeof (int *) ); // Filas
  25. for ( i=0; i < ORDEN_MATR; i++ )
  26. {
  27. matr_adher [i] = (int *) malloc ( num_nodos * sizeof (int) ); // Columnas
  28. }
  29. estado_nodo = (char *) malloc ( sizeof(num_nodos) );
  30. camino = (int *) malloc ( sizeof(num_nodos) );
  31.  
  32. // Inicializa variables
  33. for (i = 0; i < ORDEN_MATR; i++)
  34. for (j = 0; j < ORDEN_MATR; j++)
  35. matr_adher [i][j] = 0; // Por defecto ningun nodo esta conectado con nigun otro
  36. for (i = 0; i < ORDEN_MATR; i++)
  37. estado_nodo [i] = 0; // Al inicio no se ha visitado ningun nodo
  38. sentido = 1;
  39.  
  40. intro_grafo (num_nodos, matr_adher);
  41. printf ("elem %d, %d = %d\n", 3,4, matr_adher [3][4]);
  42. printf ("elem %d, %d = %d\n", 4,3, matr_adher [3][4]);
  43.  
  44. return 0;
  45. }
  46.  
  47. void intro_grafo (int num_nodos, int ** matr_adher)
  48. {
  49. int nodo1, nodo2, peso;
  50.  
  51. printf ("Introducir conexiones y pesos entre nodos en la forma:\n");
  52. printf ("nudo inicial... nudo final... peso conexion\n\n");
  53. printf ("No es necesario introducir coexiones reciprocas, la conexion i-j automaticamente es = a la j-i\n");
  54. printf ("Una nueva conexion i-j actualiza a la anterior si existiera\n");
  55. printf ("para finalizar el grafo introduzca nudo incial = 0 y nudo final = 0\n\n");
  56. for (;;)
  57. {
  58. printf ("Nodo inicial: ");
  59. scanf ("%d", &nodo1);
  60. printf ("Nodo final: ");
  61. scanf ("%d", &nodo2);
  62. if (nodo1 == 0 && nodo2 == 0)
  63. return;
  64. else
  65. {
  66. printf ("Peso conexion: ");
  67. scanf ("%d", &peso);
  68. matr_adher [nodo1][nodo2] = peso;
  69. matr_adher [nodo2][nodo1] = peso;
  70. printf ("\n");
  71. }
  72. }
  73. }
  74.  

Ejecución en entorno Windows a mano:
al introducir no. de nodos del grafo: 14 (>9); el programa se sale. 3 Primeras líneas de la imagen de ejecución. Al introducir: 14 el programa se sale, al introducir:4 el programa prosigue tal cual está estipulado.




Ejecución en entorno Windows -Visual Code-:
Se introducen no. nodos del grafo: 17 (>9)... el programa se sale. Se introducen 6:---> el programa sigue.




Ejejecución en entorno Windows, máquina virtual UbuntU:
se introducen no. nodos del gráfo:23 ---> el programa actúa como se espera de él.



Si queréis puedo ejecutarlo también en un Lubuntu como SO nativo -no en máquina virtual- (tengo también un Lubuntu en arranque dual) pero creo que no hace falta. Parece que se ve que se comportan distinto el código C en Windows y Linux.

NOTA: el código es el mismo en todos los casos: copiar y pegar. No hay la más mínima diferencia. Sólo entre los nombres de los ejecutables (con .exe en Windows y sin nada an Linux).



« Última modificación: 8 Diciembre 2021, 15:30 pm por fzp » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« Respuesta #4 en: 7 Diciembre 2021, 20:25 pm »

El problema no tiene nada que ver con scanf. Con el Application Verifier puede reproducirlo con cualquier cifra. Ejemplo:

numero es 5
ORDEN_MATR es 25
En la linea 35 eventualmente j sera mayor a 4.

Código
  1. for (i = 0; i < ORDEN_MATR; i++)
  2. for (j = 0; j < ORDEN_MATR; j++)
  3. matr_adher [i][j] = 0;

Pero en la linea 27 reservaste memoria para 5 enteros, no 25. Tres cuartos de lo mismo te pasara con la linea 37.
« Última modificación: 7 Diciembre 2021, 20:35 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« Respuesta #5 en: 7 Diciembre 2021, 20:26 pm »

He probado a ejecutar tu código y tus mismos ejemplos en Windows (tanto desde CMD como Powershell) y... Funciona correctamente.

De todas formas, yo diría que el problema puede andar por las líneas 29 y 30. Utiliza:
Código
  1. estado_nodo = (char*)malloc(num_nodos * sizeof(char));
  2. camino = (int*)malloc(num_nodos * sizeof(int));

Si eso no soluciona tu problema, muestra mensajes por pantalla entre las líneas de los cálculos para ver hasta qué línea se ejecuta exactamente.

Además de esto, otra cosa aparte: Cuando definas una macro compleja con #define, usa siempre paréntesis.
Código
  1. #define A 2 * 2
  2. #define B (2 * 2)
  3.  
  4. int a = 16 / A; // a = 16 / 2 * 2 = 16
  5. int b = 16 / B; // b = 16 / (2 * 2) = 4
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
fzp

Desconectado Desconectado

Mensajes: 130


Ver Perfil
Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« Respuesta #6 en: 8 Diciembre 2021, 11:31 am »

Es que soy un burro. Cuando uno se ciega, se ciega y no ve lo que tiene delante. Está claro que ORDEN_MATR solo debe usarse en la línea 24 para reservar espacio para toda la matriz. Pero luego ya en la 25 en el for, la condición tiene que ser i < num_nodos (no < NUM_MATR).

Y luego en la inicialización de variables, en las líneas 33, 34 y 36 las condiciones para los bucles for, lo mismo tanto las i como la j tienen que ser < num_nodos.

Lo tenía delante de las narices y no me hadado cuenta hasta que he impreso por pantalla los pares i,j.

Solucionado. (Ahora es cuando viene el meollo de la cuestión.)
« Última modificación: 8 Diciembre 2021, 11:32 am por fzp » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« Respuesta #7 en: 8 Diciembre 2021, 11:54 am »

De nada; las lineas que te señalo K-YreX  tambien esta mal, estas usando sizeof de num_nodos que siempre sera lo mismo ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
fzp

Desconectado Desconectado

Mensajes: 130


Ver Perfil
Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW
« Respuesta #8 en: 8 Diciembre 2021, 12:13 pm »

¡Corregido! Efectívamente, éso también estaba mal. No reservaba el espacio adecuadamente. Muchas gracias a ambos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
linux Ubuntu es lo mismo en una pc virtual
GNU/Linux
XxTheCochixX 1 2,272 Último mensaje 28 Mayo 2010, 02:35 am
por -- KiLiaN --
¿¿windows XP, windows 7, y ubuntu en un mismo pc?? « 1 2 ... 6 7 »
Windows
mariaj 64 35,124 Último mensaje 23 Junio 2010, 11:13 am
por Songoku
Duda (en un mismo pc windows y linux) « 1 2 »
GNU/Linux
Diaf96 16 7,081 Último mensaje 21 Abril 2011, 20:07 pm
por 4rm4ndo
Instalación compilador GCC para ANSI C ¿32 o 64 bits? ¿MinGW o mingw-w64?
Programación C/C++
pacobsas 2 3,128 Último mensaje 10 Mayo 2016, 22:42 pm
por pacobsas
Guía Windows 10 y Ubuntu 18 ¡Aprovecha ambos en el mismo equipo!
Noticias
wolfbcn 0 1,852 Último mensaje 30 Abril 2018, 02:01 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines