Errores en C
Errores en C
Errores en C
Introducción a la Computación
Preguntas y Respuestas más Frecuentes sobre Compilación
[1] ¿Para qué esas opciones de compilación -Wall -ansi -pedantic -O2?
Estas dos opciones ayudan a eliminar varios errores que de otro modo podrían pasar
desapercibidos. En las opciones de compilación que estamos utilizando:
-Wall
Varios warning tipo programa sin int del main, Variables sin ser utilizadas,
comandos inútiles, etc
-O2
Junto con -Wall reprocha que las variables pueden no estar inicializadas.
-ansi -pedantic
Se intentó normalizar el uso de un compilador para que sea posible probar los EPs con
cierta facilidad. El objetivo mayor de la disciplina es, usando C, mostrar cómo
funcionan los diversos lenguajes de programación, pero sin quedarse en el camino. Al
igual que otros lenguajes, C tiene un estándar y varios dialectos. Es bueno escribir un
programa en C que pueda ser compilado en cualquier máquina con cualquier sistema
operativo. Esto es lo que las personas llama portabilidad: la capacidad de "portar" el
programa de una computadora a otra utilizando cualquier compilador decente.
Por cierto, evita comentarios con "//", que por sí mismo no es grave, pero indica que no
se están utilizando las otras opciones de compilación. También puede servir para evitar
otras construcciones extrañas, pero el autor del documento original no sabe si eso sería
importante.
Es posible que el programa tenga un 'scanf' sin un '&' antes de una variable.
In function 'main':
7: warning: format '%d' expects type 'int *', but
argument 3 has type 'int'
7: warning: 'b' is used uninitialized in this function
#include <stdio.h>
int main()
{
int a, b, suma;
return 0;
}
En la línea 7 está faltando un '&' antes de la variable 'b', debería estar escrito '&b' en lugar
de simplemente 'b'.
Una función (¿el main?) no es del tipo 'void' y no tiene un "return <expresión>" al
final.
In function 'main':
10: warning: control reaches end of non-void function
#include <stdio.h>
int main()
{
int a, b, suma;
In function 'main':
7: warning: too few arguments for format
9: warning: too few arguments for format
#include <stdio.h>
int main()
{
int a, b, suma;
return 0;
}
En la línea 7 hay tres '%d' y hay solo dos variables para ser inicializadas en la lectura: a y
b. En la línea 9 hay un error idéntico con el printf.
In function 'main':
7: warning: too many arguments for format
9: warning: too many arguments for format
#include <stdio.h>
int main()
{
int a, b, suma;
return 0;
}
En la línea 7 solo hay un '%d' y hay dos variables que se inicializan en la lectura: a y b.
En la línea 9 que hay un error idéntico con el printf.
In function 'main':
8: warning: suggest parentheses around assignment used
as truth value
#include <stdio.h>
int main()
{
int a, b;
return 0;
}
In function 'main':
8: error: invalid lvalue in assignment
#include <stdio.h>
int main()
{
int a, b;
return 0;
}
In function 'main':
5: warning: unused variable 'suma'
#include <stdio.h>
int main()
{
int a, b, suma;
return 0;
}
La variable 'suma' fue declarada en la línea 5, pero no fue utilizada por el programa.
¿Qué significa "warning: format '%d' expects type 'int', but argument 'xx'
has type 'int *'"?
Es posible que en un printf haya un '&' antes de una variable que se desea imprimir el
contenido: printf("%d",&x);.
Remueva el '&' del printf.
In function 'main':
9: warning: format '%d' expects type 'int', but
argument 4 has type 'int *'
#include <stdio.h>
int main()
{
int a, b, suma;
return 0;
}
El programa debe tener algún scanf o printf con un '%' donde debería haber un '%d' o
algún otro formato.
#include <stdio.h>
int main()
{
int a, b, suma;
return 0;
}
En la línea 7 hay un '%' donde debería estar un '%d'. El otro aviso (too many arguments
for format) también es consecuencia de ese mismo error.
¿Qué significa " warning: ISO C90 forbids mixed declarations and code"?
In function 'main':
9: warning: ISO C90 forbids mixed declarations and code
#include <stdio.h>
int main()
{
int a, b;
int suma;
suma = a + b;
printf("%d + %d = %d\n", a, b, suma);
return 0;
}
In function 'main':
9: warning: ISO C90 forbids mixed declarations and code
#include <stdio.h>
int main()
{
int i, j, nI;
scanf("%d", &nI);
int isla[100][100];
return 0;
}
En la línea 9 del 'main' fue declarada la matriz isla entre los comandos scanf y for.
La declaración de variables debe ser hecha al inicio de las funciones.
La función 'bla' está siendo usada en su programa sin haber sido definida.
es posible que solo haya un error de digitación, como digitar print en lugar de printf.
In function 'main':
9: warning: implicit declaration of function 'print'
/tmp/ccC14gmU.o: In function `main':
(.text+0x48): undefined reference to `print'
collect2: ld returned 1 exit status
#include <stdio.h>
int main()
{
int a, b, suma;
return 0;
}
En la línea 9 está escrito 'print' en lugar de 'printf'. Los otros mensajes de error son el
resultado de ese mismo error tipográfico.
In function 'main':
5: warning: implicit declaration of function 'scanf'
5: warning: incompatible implicit declaration of built-
in function 'scanf'
7: warning: implicit declaration of function 'printf'
7: warning: incompatible implicit declaration of built-
in function 'printf'
int main()
{
int a, b, suma;
return 0;
}
In function 'main':
5: error: expected expression before '/' token
12: error: expected expression before '/' token
#include <stdio.h>
int main()
{
int a, b, suma; // declaración de variables
En las líneas 5 y 12 está siendo usado '//' en lugar de '/* <comentario> */'.
#include <stdio.h>
int main()
{
int a, b, suma;
return 0;
}
Significa que la variable bla de su programa está siendo utilizada sin ser inicializada.
Este mensaje suele indicar un error de lógica. La compilación del siguiente programa
muestra la advertencia:
In function 'main':
8: warning: 'a' is used uninitialized in this function
#include <stdio.h>
int main()
{
int a, b, suma;
b = 2;
suma = a + b; /* ERROR */
printf("%d + %d = %d\n", a, b, suma);
return 0;
}
Significa que es posible que la variable bla de su programa esté siendo usada sin haber
sido inicializada. Este mensaje suele indicar un error de lógica o una estructura
"artificiosa" de su programa. La compilación del programa siguiente muestra la
advertencia:
In function 'main':
5: warning: 'b' may be used uninitialized in this
function
#include <stdio.h>
int main()
{
int a, b;
printf("Digite 1 o 2: ");
scanf("%d", &a);
if (a == 1)
{
b = 2;
}
if (a == 2)
{
b = 1;
}
b = b + 1;
printf("b = %d\n", b);
return 0;
}
#include <stdio.h>
int main()
{
int a, b;
printf("Digite 1 o 2: ");
scanf("%d", &a);
if (a == 1)
{
b = 2;
}
else
{
b = 1;
}
b = b + 1;
printf("b = %d\n", b);
return 0;
}
¿Qué significa " warning: passing arg 'xx' of 'bla' makes pointer from
integer without a cast"?
Significa que la función 'bla', en su declaración, tiene como primer parámetro una
variable con '*' y en la llamada a la función está faltando un '&' antes del primer
correspondiente primer argumento (arg 1). La compilación del programa siguiente
muestra la advertencia:
In function 'main':
#include <stdio.h>
/* main */
int main()
{
int i;
i = 0;
while (i < 10)
{
printf("i = %d\n", i);
suma(i); /* ERROR */
}
return 0;
}
En la línea 15, en la función 'main', está faltando un '&' antes de la variable 'i', debería
estar escrito 'suma(&i)' en lugar de simplemente 'suma(i)'.
¿Qué significa " warning: assignment makes integer from pointer without a
cast"?
Significa que su programa está usando una variable que fue declarada con '*' sin el '*'.
La compilación del programa siguiente muestra la advertencia:
In function 'suma':
24: warning: assignment makes integer from pointer
without a cast
#include <stdio.h>
i = 0;
while (i < 10)
{
printf("i = %d\n", i);
suma(&i);
}
return 0;
}
En la línea 24, en la función suma, está faltando un '*' antes de la variable 'k', debería
estar escrito '*k = *k + 1;' en lugar de '*k = k + 1;'.
¿Qué significa " warning: passing arg 'xx' of 'bla' from incompatible
pointer type"?
Significa que su programa está llamando la función 'bla' pasando como primer
argumento (arg 1) una variable de tipo diferente de aquel declarado. La compilación del
programa de abajo muestra la advertencia:
In function 'main':
15: warning: passing argument 1 of 'suma' from
incompatible pointer type
#include <stdio.h>
/* main */
int main()
{
float x;
x = 0;
while (x < 10)
{
printf("x = %f\n", x);
suma(&x); /* ERROR */
i++;
}
return 0;
}
En la línea 15, en la función 'main' la variable pasada para la función 'suma' es del tipo
float, pero el correspondiente parámetro *k en la declaración de la función es del tipo
"int".
Es posible que en su programa una variable haya sido declarada con '* y esté faltando
un '*' cuando ella está siendo utilizado en alguna operación aritmética. La compilación
del programa siguiente muestra el error:
In function 'multiplica':
24: error: invalid operands to binary *
#include <stdio.h>
/* main */
int main()
{
int i;
i = 0;
while (i < 10)
{
printf("i = %d\n", i);
multiplicar(&i);
i++;
}
return 0;
}
En la línea 24, en la función multiplica, está faltando un '*' antes de la variable 'k',
debería estar escrito '*k = *k * 2;' en lugar de '*k = k * 2;'.
Respuesta más larga. El compilador está avisando que hay una función que es de tipo
int o float que no tiene return o no está claro para el compilador que toda la
ejecución de la función siempre llega a un return. No hay problemas en dejar return's
dentro de if-else, mientras que el programador tenga seguridad que la función
siempre termina en uno de esos return. Con ese tipo de warning el compilador está
dando algún indicio de que la función está un poco desorganizada, pero todo bien.
La compilación del programa siguiente no da ese warning.
#include <stdio.h>
int main()
{
int a;
a = 12;
if (a > 0)
return 0;
else
return 1;
#include <stdio.h>
int main()
{
int a;
a = 12;
if (a > 0)
return 0;
if (a <= 0)
return 1;
}
Esta advertencia dice que no fue especificado el tipo de la función 'bla' de su programa
y, por lo tanto, está siendo asumido que la función es del tipo 'int' (esto es, la función
devuelve un valor que es un número entero). La declaración de una función debe seguir
el formato:
<tipo de la función> <nombre de la función>(<lista de
parámetros>)
{
<variables locales>
<lista de comandos>
}
<tipo de la función> puede ser, por ejemplo, int, float, char o inclusive void.
#include <stdio.h>
/* prototipo */
f(float a, float b, int k); /* Falta el tipo de la
función */
/* main */
int main()
{
int i;
float x;
i = 0;
while (i < 10)
{
x = f(0,1,i);
printf("x = %f\n", x);
i++;
}
return 0;
}
/* función f */
f(float a, float b, int k)
{
float deltax;
deltax = (b - a)/k;
return deltax;
}
En las líneas 4 y 24 no fue especificado el tipo de la función 'f' que, por lo tanto, se
supone como de tipo 'int'.
¿Qué significa " error: expected identifier or '(' before '{' token"?
#include <stdio.h>
/* prototipo */
float f(float a, float b, int k);
/* main */
int main()
{
int i;
float x;
i = 0;
while (i < 10)
{
x = f(0,1,i);
printf("x = %f\n", x);
i++;
}
return 0;
}
/* función f */
float f(float a, float b, int k); /* ERROR: este ';'
está sobrando */
{
float deltax;
deltax = (b - a)/k;
return deltax;
}
En la línea 23 hay un ';' entre el prototipo y el cuerpo de la función. Removiéndose ese
';' el programa compila sin errores o avisos.
In function 'f':
26: error: 'k' redeclared as different kind of symbol
23: error: previous definition of 'k' was here
#include <stdio.h>
/* prototipo */
float f(float a, float b, int k);
/* main */
int main()
{
int i;
float x;
i = 0;
while (i < 10)
{
x = f(0,1,i);
printf("x = %f\n", x);
i++;
}
return 0;
}
/* función f */
float f(float a, float b, int k)
{
float deltax;
int k; /* k ya fue declarada como parámetro */
k = k*10;
deltax = (b - a)/k;
return deltax;
}
En la línea 26 de la función 'f' la variable local del nombre k fue declarada, pero ya
había un parámetro con este nombre en la línea 23 ('int k').
In function 'f':
26: error: 'k' redeclared as different kind of symbol
23: error: previous definition of 'k' was here
#include <stdio.h>
/* prototipo */
float f(float a, float b, int *k);
/* main */
int main()
{
int i;
float x;
i = 0;
while (i < 10)
{
x = f(0,1,&i);
printf("x = %f\n", x);
i++;
}
return 0;
}
/* función f */
float f(float a, float b, int *k)
{
float deltax;
int k; /* k ya fue declarada como parámetro */
k = k*10;
deltax = (b - a)/k;
return deltax;
}
¿Qué significa " warning: ISO C90 forbids variable-size array `blá'"?
Esto significa que en su programa una matriz está siendo declarada como una dimensión
en lugar de como una constante (número entero).
#include <stdio.h>
int main()
{
int i, j, nI;
int isla[nI][nI]; /* debería ser un número en lugar
de una variable */
scanf("%d", &nI);
return 0;
}
En la línea 6 del 'main' fue usada la variable nI para indicar a dimensión de la matriz
isla. En lugar de una variable como nI, la declaración debe utilizar un número, por
ejemplo, "int isla[100][100];".
Para eliminar ese aviso, agregue una línea en blanco al final del archivo que contiene su
programa.
Según un mensaje en el mailing list for the GCC project, el lenguaje C estándar
recomienda que un archivo con un programa termine con el carácter "new-line", que no
debe estar inmediatamente precedido de backslash ('\'). Como esto es una
recomendación, los desarrolladores del compilador causan un mensaje de violación de
esa recomendación sea emitido.
¿Qué significa " error: void value not ignored as it ought to be"?
Usted está tratando de utilizar el valor devuelto por una función de tipo void. Sin
embargo, las funciones de tipo void no devuelven nada. Ejemplo:
void f(int a)
{
a = a + 1;
}
int main ()
{
int a,b;
b = 5;
a = f(b);
return 0;
}
Posiblemente la función main llama a un subproceso o función que no está definido, y/o
fue colocado antes de la función sin haber declarado su correspondiente prototipo.
(véase también error 13) Ejemplo:
In function 'main':
25: undefined reference to `copio'
#include <stdio.h>
#include <windows.h>
#define MAX_LINEA 1000 /* máximo tamaño de línea de
entrada */
int getline(void);
void copio(void);
max = 0;
printf("Ingrese una cadena");
len = getline();
¿Qué significa "error: 'for' loop initial declarations are only allowed in
C99 or C11 mode"?
Se declaró la variable de recorrido dentro del bloque for en lugar de hacerlo fuera del
bloque for. Declare la variable de recorrido fuera del bloque for.