C error de tipo conflictivo

Cuando bash comstackr esto, gcc me dice que tengo tipos en conflicto para pack_cui(C) .

No veo cómo podría estar obteniendo tipos conflictivos, ya que sé que estoy pasando una char* . Soy nuevo en C, así que estoy seguro de que me estoy perdiendo algo obvio.

 int main(){ char* C = malloc(sizeof(char) * 4); C[0] = 1; C[1] = 2; C[2] = -1; C[3] = 4; pack_cui(C); return 0; } unsigned int pack_cui(char* C){ unsigned int new_int = 0; unsigned int i; for(i = 0; i < 4; i++){ new_int = new_int | (unsigned int)(signed int)C[i]; if(i != 3) new_int = new_int << 8; } return new_int; } 

El error que recibí fue

 hw12.c:17:14: error: conflicting types for 'pack_cui' unsigned int pack_cui(char* C){ ^ hw12.c:13:5: note: previous implicit declaration of 'pack_cui' was here pack_cui(C); 

Agregue un prototipo para pack_cui antes de main :

 unsigned int pack_cui(char* C); 

De lo contrario, cuando el comstackdor ve la llamada a pack_cui , tiene que adivinar el tipo, y en este caso adivina que es incorrecto.

Cuando llama a una función no declarada, el estándar C89 exige una statement implícita. Esta statement sería:

 int pack_cui(); 

El () no es lo mismo que (void) , indica que la función toma un número no especificado de argumentos, mientras que (void) significa cero. Esto queda de pre-ISO / ANSI C, de vuelta en los días K&R.

No quieres eso, porque esa es la statement equivocada. Crea tu propia statement en la parte superior, arriba de main() :

 unsigned pack_cui(char *); 

Mueva la definición de pack_cui desde debajo de la función main , por encima de la función main . O configure e incluya un archivo de encabezado que declare pack_cui .

Además, una vez hecho esto, vuelva a comstackr con las advertencias activadas, para que pueda detectar el otro problema con su código:

 $ gcc -Wall foo.c 

Debe incluir stdlib.h , al menos.

Cuando llamas a una función C, ya sea una propia o declarada por la biblioteca estándar, debes tener una statement visible de esa función para que el comstackdor sepa cómo generar el código para llamarla. Esa statement debe ser un prototipo, es decir, una statement que especifique los tipos de parámetros de la función. Una definición de función (con el {} contiene el código que implementa la función) proporciona una statement.

En su ejemplo, ninguna statement de pack_cui es visible en el punto de la llamada; No está definido hasta más tarde.

Puede solucionar este problema moviendo la definición de pack_cui encima de la definición de main , o agregando una “statement de reenvío” y dejando las definiciones donde están.

Este último se vería así:

 unsigned int pack_cui(char* C); /* a declaration, not a definition */ int main(void) { /* definition of main */ /* ... */ } unsigned int pack_cui(char* C) { /* definition of pack_cui */ /* ... */ } 

Cualquiera de los dos enfoques es aceptable.

Por la misma razón, debe proporcionar una statement para la función malloc . Debes hacer esto agregando

 #include  

a la parte superior de su archivo de origen.