Errores en C

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 21

Departamento de Ciência da Computação - IME - USP (en portugués)

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?

 [2] Mi programa compila perfectamente en mi Codeblocks, pero en el sitio web


del curso aparece un montón de errores o warnings. ¿Qué debo hacer?
 [3] ¿Qué significa "warning: format '%d' expects type 'int *', but argument 'xx'
has type 'int'"?
 [4] ¿Qué significa "warning: control reaches end at non-void function"?
(respuesta corta)
 [5] ¿Qué significa " warning: too few arguments for format"?
 [6] ¿Qué significa " warning: too many arguments for format"?
 [7] ¿Qué significa " warning: suggest parentheses around assignment used as
truth value"?
 [8] ¿Qué significa " error: invalid lvalue in assignment "?
 [9] ¿Qué significa " warning: unused variable `bla' "?
 [10] ¿Qué significa " warning: format '%d' expects type 'int', but argument 'xx'
has type 'int *'"?
 [11] ¿Qué significa " warning: spurious trailing `%' in format"?
 [12] ¿Qué significa " warning: ISO C90 forbids mixed declarations and code"?
 [13] ¿Qué significa " warning: implicit declaration of function `bla'"?
 [14] ¿Qué significa " warning: implicit declaration of function `scanf'
('printf')"?
 [15] ¿Qué significa " error: expected expression before '/' token"?
 [16] ¿Qué significa "warning: unknown escape sequence"?
 [17] ¿Qué significa "warning: 'bla' is used uninitialized in this function"?
 [18] ¿Qué significa "warning: 'bla' may be used uninitialized in this function"?
 [19] ¿Qué significa " warning: passing arg 'xx' of 'bla' makes pointer from
integer without a cast"?
 [20] ¿Qué significa " warning: assignment makes integer from pointer without a
cast"?
 [21] ¿Qué significa " warning: passing arg 'xx' of 'bla' from incompatible
pointer type"?
 [22] ¿Qué significa " error: invalid operands to binary *"?
 [23] ¿Qué significa "warning: control reaches end at non-void function"?
(respuesta larga)
 [24] ¿Qué significa "warning: type defaults to `int' in declaration of `bla'"?
 [25] ¿Qué significa "error: expected identifier or '(' before '{' token"?
 [26] ¿Qué significa "error: 'bla' redeclared as different kind of symbol"?
 [27] ¿Qué significa "warning: ISO C90 forbids variable-size array `blá'"?
 [28] ¿Qué significa "warning: no newline at end of file"?
 [29] ¿Qué significa "error: void value not ignored as it ought to be"?
 [30] ¿Que significa "undefined reference to `bla'"?
 [31] ¿Qué significa "error: 'for' loop initial declarations are only allowed in
C99 or C11 mode"?

¿Para qué esas opciones de compilación?

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.

El estándar ANSI sirve en ese sentido de portabilidad.

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.

Mirando en conjunto, el -ansi -pedantic no es tan importante, ya que el compilador que


estamos utilizando, el tal gcc, es un compilador muy buen educado en el sentido de no
dar acceso fácil a particularidades de instalación.

Siempre que un estudiante NECESITE URGENTEMENTE usar un comando no dado


en clase, se puede percibir que la disciplina no consigue enseñar algo correcto para él.
Forzar a usar solo comandos dados en clase, mucho más restringido que usar ANSI C,
es bueno para tener esa evaluación del proceso de aprendizaje.

Mi programa compila perfectamente en mi Codeblocks, pero en el sitio


web de la disciplina aparece un montón de errores o warnings. ¿Qué debo
hacer?

Usted debe configurar su Codeblocks como se describe en la página configuración de


Codeblocks: usted debe escoger 4 opciones de la pestaña "Global compiler settings".
¿Qué significa "warning: format '%d' expects type 'int *', but argument
'xx' has type 'int'"?

Es posible que el programa tenga un 'scanf' sin un '&' antes de una variable.

La compilación del programa siguiente muestra la advertencia:

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;

scanf("%d %d", &a, b); /* ERROR */


suma = a + b;
printf("%d + %d = %d", 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'.

¿Qué significa "warning: control reaches end of non-void function"?


(respuesta corta)

Una función (¿el main?) no es del tipo 'void' y no tiene un "return <expresión>" al
final.

La compilación del programa siguiente muestra la advertencia:

In function 'main':
10: warning: control reaches end of non-void function

#include <stdio.h>

int main()
{
int a, b, suma;

scanf("%d %d", &a, &b);


suma = a + b;
printf("%d + %d = %d\n", a, b, suma);

/* Aquí, al final del programa, falta "return 0;"


*/
}

Falta "return 0;" al final del programa.

¿Qué significa " warning: too few arguments for format"?


Debe estar faltando una variable que usted quiere imprimir en un printf o una variable
a ser leída en un scanf.

La compilación del siguiente programa muestra las advertencias:

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;

scanf("%d %d %d", &a, &b);


suma = a + b;
printf("%d + %d = %d\n", a, b);

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.

¿Qué significa " warning: too many arguments for format"?

Debe estar faltando un '%d' o '%f' o '%c' en un comando printf o scanf.

La compilación del siguiente programa muestra las advertencias:

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;

scanf("%d", &a, &b);


suma = a + b;
printf("%d + %d = \n", 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.

¿Qué significa " warning: suggest parentheses around assignment used as


truth value"?
Su programa contiene, probablemente, una atribución en lugar de una comparación.
Posiblemente usted digitó un '=' (atribución) donde debería ser '==' (comparación).
También pode ser que usted digitara un "=!" donde debería ser "!=".

La compilación del siguiente programa muestra la advertencia:

In function 'main':
8: warning: suggest parentheses around assignment used
as truth value

#include <stdio.h>

int main()
{
int a, b;

scanf("%d %d", &a, &b);


if (a = b)
{
printf("el contenido de las variables es el
mismo.\n");
}

return 0;
}

En la línea 8 vemos un 'a = b' donde debería haber un 'a == b'.

¿Qué significa " error: invalid lvalue in assignment"?

Su programa contiene, probablemente, una atribución en lugar de una comparación.


Posiblemente usted digitó un '=' (atribución) donde debería ser '==' (comparación).
También pode ser que usted digitara un "=!" donde debería ser "!=".

La compilación del siguiente programa muestra la advertencia:

In function 'main':
8: error: invalid lvalue in assignment

#include <stdio.h>

int main()
{
int a, b;

scanf("%d %d", &a, &b);


if (5 > 4 && a = b)
{
printf("los contenidos de las variables son las
mismas.\n");
}

return 0;
}

En la línea 8 vemos un 'a = b' donde debería haber un 'a == b'.

¿Qué significa " warning: unused variable `bla' "?


La variable de nombre 'bla' fue declarada, pero no está siendo usada por el programa.
Si la variable, de hecho, es innecesaria, entonces debe ser removida del programa.

La compilación del siguiente programa muestra la advertencia:

In function 'main':
5: warning: unused variable 'suma'

#include <stdio.h>

int main()
{
int a, b, suma;

scanf("%d %d", &a, &b);


printf("%d + %d = %d\n", a, b, a+b);

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.

La compilación del siguiente programa muestra la advertencia:

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;

scanf("%d %d", &a, &b);


suma = a + b;
printf("%d + %d = %d\n", a, b, &suma);

return 0;
}

En la línea 9 hay un '&' antes de la variable 'suma'.

¿Qué significa " warning: spurious trailing `%' in format"?

El programa debe tener algún scanf o printf con un '%' donde debería haber un '%d' o
algún otro formato.

La compilación del programa muestra las advertencias:


In function 'main':
7: warning: spurious trailing '%' in format
7: warning: too many arguments for format

#include <stdio.h>

int main()
{
int a, b, suma;

scanf("%d %", &a, &b);


suma = a + b;
printf("%d + %d = %d\n", 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"?

Su programa tiene declaraciones de variables mezcladas con comandos.


Se recomienda que todas las variables sean declaradas al principio de la función (main).

La compilación del siguiente programa muestra la advertencia:

In function 'main':
9: warning: ISO C90 forbids mixed declarations and code

#include <stdio.h>

int main()
{
int a, b;

scanf("%d %d", &a, &b);

int suma;
suma = a + b;
printf("%d + %d = %d\n", a, b, suma);

return 0;
}

En la línea 9 está declarada la variable 'suma', después de que el comando de lectura


(scanf). En caso, la variable 'suma' debería haber sido declarada en el inicio del main,
junto con otras variables.

La compilación del programa muestra las siguientes advertencias:

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];

for (i = 0; i < nI; i++)


for (j = 0; j < nI; j++)
isla[i][j] = 0;

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.

¿Qué significa " warning: implicit declaration of function `bla'"?

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.

La compilación del programa a seguir muestra el aviso y error:

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;

scanf("%d %d", &a, &b);


suma = a + b;
print("%d + %d = %d\n", 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.

¿Qué significa " warning: implicit declaration of function `scanf' ('printf')


"?

Es posible que al inicio del programa esté faltando 'include':


#include <stdio.h>

La compilación del programa de abajo muestra las advertencias:

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;

scanf("%d %d", &a, &b);


suma = a + b;
printf("%d + %d = %d\n", a, b, suma);

return 0;
}

En la línea 5 aparece el 'scanf' y en la línea 7 el 'printf'. Los warnings fueron


generados por la falta del 'include'.

¿Qué significa " error: expected expression before '/' token"?

es posible que en el programa haya algún '//'.


En C patrón ANSI los comentarios deben estar entre '/* <comentario> */':
/* Este es un comentario en C patrón ANSI */
Si este error aparece solo cuando el programa es testeado la página MAC2166, indica
que usted no está utilizando adecuadamente las opciones de compilación -Wall -ansi
-pedantic -O2, como está descripto en la página del tutorial.

La compilación del programa a seguir muestra los errores:

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

/* Este es un comentario en C patrón ANSI. */


scanf("%d %d", &a, &b);
suma = a + b;
printf("%d + %d = %d\n", a, b, suma);

return 0; // fin del programa


}

En las líneas 5 y 12 está siendo usado '//' en lugar de '/* <comentario> */'.

¿Qué significa "warning: unknown escape sequence"?

Es posible que el programa tenga un 'printf' con un '\' en lugar de un '\n'.

La compilación del programa siguiente muestra la advertencia:


9:10: warning: unknown escape sequence: '\040'

#include <stdio.h>

int main()
{
int a, b, suma;

scanf("%d %d", &a, &b);


suma = a + b;
printf("%d + %d = %d\ ", a, b, suma); /* ERROR */

return 0;
}

En la línea 9 hay un '\' en lugar de un '\n'.

¿Qué significa "warning: 'bla' is used uninitialized in this function"?

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;
}

De hecho, se usó la variable en la línea 8, en 'suma = a + b' sin haber sido


inicializada. Para que desaparezca la advertencia simplemente inicialice la variable.
¿Con cuál valor inicializar? ¿Con 0? con -134? La respuesta es: ¡depende! En el
ejemplo, depende de la suma que quiere hacer en el programa. ¿La suma es 0+2? La
suma es -134+2?

¿Qué significa "warning: 'bla' may be used uninitialized in this function"?

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;
}

El número indicado por el aviso es el número de línea donde se declaró la variable b.


Para el programador puede ser evidente que la variable b siempre estará inicializa, ya
que le pide que ingrese 1 o 2 en la lectura del valor de a. Sin embargo, para el
compilador, que no es consciente de la lógica del programa, no es evidente que el valor
inicialmente asignado a la variable a ser leído por 1 o 2. Por lo tanto, teniendo en cuenta
el comando "b = b + 1" el compilador avisa que la variable b puede (may be) estar
siendo utilizada sin ser inicializada.

El siguiente programa es menos "exagerado" y tiene el mismo efecto que el programa


anterior. Para este programa, el compilador no muestra ninguna advertencia

#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':

15: warning: passing argument 1 of 'suma' makes pointer


from integer without a cast

#include <stdio.h>

/* prototipo de la función suma */


void suma(int *k);

/* main */
int main()
{
int i;

i = 0;
while (i < 10)
{
printf("i = %d\n", i);
suma(i); /* ERROR */
}

return 0;
}

/* declaración de la función de suma */


void suma(int *k)
{
*k = *k + 1;
}

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>

/* prototipo de la función suma */


void suma(int *k);
/* main */
int main()
{
int i;

i = 0;
while (i < 10)
{
printf("i = %d\n", i);
suma(&i);
}

return 0;
}

/* declaración de la función suma */


void suma(int *k)
{
*k = k + 1; /* ERROR */
}

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>

/* prototipo de la función suma */


void suma(int *k);

/* main */
int main()
{
float x;

x = 0;
while (x < 10)
{
printf("x = %f\n", x);
suma(&x); /* ERROR */
i++;
}

return 0;
}

/* declaración de la función suma */


void suma(int *k)
{
*k = *k + 1;
}

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".

¿Qué significa " error: invalid operands to binary *"?

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>

/* prototipo de la función multiplicar */


void multiplicar(int *k);

/* main */
int main()
{
int i;

i = 0;
while (i < 10)
{
printf("i = %d\n", i);
multiplicar(&i);
i++;
}

return 0;
}

/* declaración de la función multiplicar */


void multiplicar(int *k)
{
*k = k * 2; /* ERROR */
}

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;'.

¿Qué significa warning: control reaches end at non-void function?


(respuesta larga)

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;

Ya la compilación del programa muestra el siguiente: warning:

#include <stdio.h>

int main()
{
int a;

a = 12;

if (a > 0)
return 0;

if (a <= 0)
return 1;
}

Se puede percibir que el segundo main es más confuso que el primero.

¿Qué significa " warning: type defaults to `int' in declaration of 'bla'"?

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.

La compilación del programa muestra las siguientes advertencias y errores:

4: warning: data definition has no type or storage class


4: warning: type defaults to 'int' in declaration of 'f'
24: warning: return type defaults to 'int'

#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"?

Es posible que, en la declaración de una función haya un ';' entre el prototipo y el


cuerpo de la función.

La compilación del siguiente programa muestra el siguiente error:

24: 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.

¿Qué significa " error: 'bla' redeclared as different kind of symbol"?

Significa que en alguna función 'bla' es el nombre de un parámetro y de una variable


local.

La compilación del siguiente programa muestra las siguientes advertencias:

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').

La compilación del programa muestra las siguientes advertencias:

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 de nombre k fue declarada, pero ya


había un parámetro con este nombre en la línea 23 ('int *k').

¿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).

La compilación del siguiente programa muestra las siguientes advertencias:


In function 'main':
6: warning: ISO C90 forbids variable-size array 'isla'
6: warning: ISO C90 forbids variable-size array 'isla'

#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);

for (i = 0; i < nI; i++)


for (j = 0; j < nI; j++)
ilha[i][j] = 0;

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];".

¿Qué significa " warning: no newline at end of file"?

Para eliminar ese aviso, agregue una línea en blanco al final del archivo que contiene su
programa.

Es importante que programas no presenten advertencias durante la compilación, ya


que, frecuentemente, las advertencias en realidad indican erres de lógica. Sin embargo,
este aviso en particular, puede ser ignorado...

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:

/* Colaboración de Henrique de los Reis Cadioli */


#include <stdio.h>

void f(int a)
{
a = a + 1;
}

int main ()
{
int a,b;
b = 5;
a = f(b);

printf("a = %d\n", a);

return 0;
}

¿Qué significa " undefined reference to `blá'?

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 max; /* máximo tamaño visto hasta el momento */


char linea[MAX_LINEA]; /* línea actual */
char mas_larga[MAX_LINEA]; /* línea más larga hasta el
momento */

int getline(void);
void copio(void);

/* imprimir línea de la entrada más larga */


int main ()
{
int len;

max = 0;
printf("Ingrese una cadena");
len = getline();

while (len > 0)


if (len > max)
{
max=len;
copio(); /*función mencionada como
prototipo pero no definida*/
}
if (max > 0)
printf(" %s", mas_larga);
system("PAUSE");
return 0;
}

Completar con lo siguiente:

/* copio: copia una línea en otra */


void copio(void){
int i = 0;
while (linea[i] != '\0') {
mas_larga[i]=linea[i];
i++;
}
mas_larga[i]= '\0';
}

¿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.

void Cargar (arreglo arre)


{
for (int i=0; i<N; i++) /* variable i declarada dentro
del for*/
{
printf("Ingrese un valor para la posición %d del
arreglo: ",i+1);
scanf ("%d",&arre[i]);
}
}

La corrección se hace de la siguiente manera:

void Cargar (arreglo arre)


{
int i; /* variable i declarada dentro del for*/
for (i=0; i<N; i++) {
printf("Ingrese un valor para la posición %d del
arreglo: ",i+1);
scanf ("%d",&arre[i]);
}
}

Last modified: Tue May 27 07:56:11 BRT 2014


Traducido y ampliado del original en:
http://www.ime.usp.br/~mac2166/compilacao/#perfeito (en portugués)

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy