Ayuda urgente error en valgrind

Iniciado por kuni2006, 26 Agosto 2016, 19:13 PM

0 Miembros y 1 Visitante están viendo este tema.

kuni2006

Yo hice la siguiente funcion:


int comparar(int vector1[], int n1, int vector2[], int n2)
{
    int i;
    if (n1 == 0 && n2 != 0)
        {
        return -1;
        }
    if  (n2 == 0 && n1 != 0)
        {
        return 1;
        }
    for(i=0;i<n1||i<n2;i++)
        {
        if(vector1[i]<vector2[i])
            {
            return -1;
            }
        if(vector1[i]>vector2[i])
            {
            return 1;
            }
        if(vector1[i]==vector2[i]&&n1==n2)
            {
            return 0;
            }
        }
    return 0;
}


y me devuelve el siguiente error varias veces:

==22== Conditional jump or move depends on uninitialised value(s)
==22==    at 0x400738: comparar (tp0.c:67)
==22==    by 0x400DEB: prueba_comparar (tp0_pruebas.c:80)
==22==    by 0x400558: main (tp0_pruebas.c:147)
==22==  Uninitialised value was created by a stack allocation
==22==    at 0x400B20: prueba_comparar (tp0_pruebas.c:48

Si alguien me pudiera dar una mano, estaria muy agradecido.

avesudra

Hola, el error que te da valgrind es claro, no inicializas la variable i cuando la declaras. Así que con esto debería arreglarse:
Código (cpp) [Seleccionar]
int comparar(int vector1[], int n1, int vector2[], int n2)
{
   int i = 0; //esto es lo que debes modificar
   if (n1 == 0 && n2 != 0)
       {
       return -1;
       }
   if  (n2 == 0 && n1 != 0)
       {
       return 1;
       }
   for(i=0;i<n1||i<n2;i++)
       {
       if(vector1[i]<vector2[i])
           {
           return -1;
           }
       if(vector1[i]>vector2[i])
           {
           return 1;
           }
       if(vector1[i]==vector2[i]&&n1==n2)
           {
           return 0;
           }
       }
   return 0;
}
Regístrate en

palacio29

Cita de: kuni2006 en 26 Agosto 2016, 19:13 PM
Yo hice la siguiente funcion:


int comparar(int vector1[], int n1, int vector2[], int n2)
{
    int i;
    if (n1 == 0 && n2 != 0)
        {
        return -1;
        }
    if  (n2 == 0 && n1 != 0)
        {
        return 1;
        }
    for(i=0;i<n1||i<n2;i++)
        {
        if(vector1[i]<vector2[i])
            {
            return -1;
            }
        if(vector1[i]>vector2[i])
            {
            return 1;
            }
        if(vector1[i]==vector2[i]&&n1==n2)
            {
            return 0;
            }
        }
    return 0;
}


y me devuelve el siguiente error varias veces:

==22== Conditional jump or move depends on uninitialised value(s)
==22==    at 0x400738: comparar (tp0.c:67)
==22==    by 0x400DEB: prueba_comparar (tp0_pruebas.c:80)
==22==    by 0x400558: main (tp0_pruebas.c:147)
==22==  Uninitialised value was created by a stack allocation
==22==    at 0x400B20: prueba_comparar (tp0_pruebas.c:48

Si alguien me pudiera dar una mano, estaria muy agradecido.

Como dijeron te falta inicializar variable, en algunos compiladores como el codeblocks no te pide que inicialices pero si es necesario hacerlo si vas a usar la variable en un arreglo o si lo que estas haciendo es un contador porque no sabes el valor que puede tener esa variable.

do-while

#3
A la variable i le asignas un valor al principio del bucle for y sólo la utilizas dentro del bucle, por lo que ese no debería de el problema.

Hasta donde conozco valgrind (que es más bien poco o nada), lo que hace es buscar fugas de memoria en tus programas, pero por lo que comentas también debe de hacer el seguimiento de las variables que utilizas.

El error que estas recibiendo, si buscas en Google o incluso si utilizas un traductor, que cuesta bien poco, lo sabrías, es sobre la utilización de una variable sin inicializar en la evaluación de una condición. Asumiendo que valgrind hace un seguimiento de las variables, si descartamos la variable i nos quedan las cuatro variables que recibe la función. Asegúrate de haberles asignado un valor, ya sea por una asignación o una lectura, entre el momento de su declaración y el momento en el que llamas a la función. Sin ver más código no podemos decir nada más. Salvo que la variable que está dando problemas está en la línea 48 del archivo tp0_pruebas.c, dentro de la función pruebas_comparar:

==22==  Uninitialised value was created by a stack allocation
==22==    at 0x400B20: prueba_comparar (tp0_pruebas.c:48
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!