Categorías > Lenguajes > C > Me da error ...
Nuevo Mensaje | Responder
lompa


150 envíos
Desconectado
1764 lecturas
5 respuestas
Me da error02-07-2010 a las 17:54:44

Buenas. He repasado varías veces el programa pero nada..
Me dice que "int * investigaComandos(char * comando)" conflicting types for ‘investigaComandos’.
Que he hecho mal??:S


Código Fuente:

#include <stdio.h>
#include <string.h>
#define LINEASIGUIENTE 0x0a
#define N_COMANDOS 2

void investigaModificaciones (int nArgumentos, char *pArgv[]);
int valorOpcionT;
char * comandos[N_COMANDOS]={"Listar","Borrar"};
int investigaComandos(char * comando);
void (*puntero_funcion)();
(* funciones[N_COMANDOS])();
void listar(void);
void borrar(void);
void ayuda(void);

main()
{
    int i=0;
    char sentencia[80];
    char * puntero;
    char separadores[] = "  , /t,/n,$,-"; /*Se que tienen que estar de otra forma pero sino sale mal en la web */
    char letra;
    funciones[0]=listar;
    funciones[1]=borrar;
    do
    {
        printf("#");
        do
        {
            scanf("%c",&letra);
            if(letra!=LINEASIGUIENTE)
            {
            sentencia[i++]=letra;
            }
        }while (letra != LINEASIGUIENTE);
        fflush(stdin);
        sentencia[i]='';
        i=0;
        puntero = strtok(sentencia, separadores);
        if(puntero!='' && puntero[0]!='*')
        {
            investigaComandos(puntero);
            puntero_funcion();
        }
    }while(sentencia[0] !='*');
    printf("---END---");
    getchar();
}

int * investigaComandos(char * comando)
{
    int i;
    puntero_funcion=ayuda;
    for(i=0;i<N_COMANDOS;i++)
            if(strcmp(comandos[i],comando)==0)
                puntero_funcion=funciones[i];
            return (int *)puntero_funcion;
}
void listar()
{
    printf(">Ejecutando comando listar/n");
}
void borrar ()
{
    printf("Ejecutando comando borrar/n");
}
void ayuda()
{
    printf("Comando desconocido/n");
    printf("Utilizar: Listar, Borrar, * para finalizar/n");
}

P.D.: los" n" están mal a proposito

Muchas gracias de antemanooo!


Responder | Citar | Moderar | Mensaje Privado
Training Channel
Sanguinario_Joe


368 envíos
Desconectado

#1
RE: Me da error03-07-2010 a las 04:28:01

Hola Lompa!

Lo que el error dice es que tienes un conflicto de tipos, es decir, que tienes una declaracion y una definicion donde los tipos no son iguales, ¿y tiene razon? pues veamos...

La funcion implicada, que es investigaComandos la declaras asi:

Declaracion de la rutina:int investigaComandos(char * comando);


Es decir, es una rutina que recibe un char * (cadena de caracteres), y devuelve un int (variable entera)

Pero luego la defines asi:

Definicion de la rutina:int * investigaComandos(char * comando)
{
    int i;
    puntero_funcion=ayuda;
    for(i=0;i<N_COMANDOS;i++)
            if(strcmp(comandos[i],comando)==0)
                puntero_funcion=funciones[i];
            return (int *)puntero_funcion;
}


Es decir, como una funcion que recibe un char * (cadena de caracteres), y devuelve un int* (puntero a variable entera).

Por eso son incompatibles, porque declaracion y definicion devuelven distintos valores.

Saludos!!!

Una causa es la causa de la siguiente. Y la suma de las causas es la causa del desastre.
(Principios de la causalidad de Pepe)

Responder | Citar | Moderar | Mensaje Privado
lompa


150 envíos
Desconectado

#2
RE: Me da error03-07-2010 a las 07:20:02

Gracias!
Maltito *! Mira que me pase rato mirando donde fallaba pero no lo encontraba...
Muchas gracias!


Responder | Citar | Moderar | Mensaje Privado
Sorancio


307 envíos
Desconectado

#3
RE: Me da error03-07-2010 a las 08:47:54

Yo soy así de chulo y voy a intentar ayudarte.

Si usas una variable global no necesitas luego en una función pasar su dirección de memoria y menos moldearla a un puntero a un entero (int *), simplemente asigna a dicha variable el puntero a la función y luego lo usas.

Los separadores usan el caracter de escape \, así que no es /n es \n (aunque creo que esto es lo que está mal a propósito no? )

No uses fflush para un stream de entrada como stdin, el comportamiento no está definido por el estándar. En su caso, haz esto:

Código Fuente:void clear_input_stream(FILE *stream)
{
  while (fgetc(stream) != '\n');
}


Y luego lo usas: clear_input_stream(stdin). Vaciará hasta el fin de linea.

En la declaración y definición de funciones en C se pone en la lista de parámetros void para señalar que no tiene parámetros (esto en la llamada a la función no hace falta). Tal como las declaras y defines, es más de C++. Esto es opcional hoy día, antes era obligatorio ya que no definir parámetros quería decir que era número variable de parámetros (ahora esto se define con tres puntos suspensivos "...").

Es mejor que uses getchar a usar scanf por el hecho de que scanf debe de parsear el formato del primer parámetro mientras getchar no usa parámetros y no tiene nada secundario que hacer.

En vez de usar * para salir del programa, haz una función "salir" que lo haga, así no necesitas especializar condiciones.

Si quieres leer una linea entera puedes usar la función fgets o scanf con un formato específico ("%[^\n]") aunque es mejor usar fgets. Busca información sobre esta función.

En C es int main(), no main() y debe devolver un valor obligatoriamente: 0 es salida correcta del programa y un número diferente es salida con error. Esto no es obligatorio pero es satisfacer el estándar que para algo está .

Y es eso, ¡sigue así!


Responder | Citar | Moderar | Mensaje Privado
lompa


150 envíos
Desconectado

#4
RE: Me da error04-07-2010 a las 18:54:33

Gracias Sorancio.
He cambiado a void clear_input_stream(FILE *stream).
hehe Pero ahora tengo que darle 2  veces al enter para que funcione
Gracias!


Responder | Citar | Moderar | Mensaje Privado
Sorancio


307 envíos
Desconectado

#5
RE: Me da error05-07-2010 a las 08:17:59

¿Has cambiado los getchar por fgets? Si lo haces no necesitarás usar la función que he hecho antes.

Si quieres puedes poner el código con los cambios hechos y seguimos ayudándote.


Responder | Citar | Moderar | Mensaje Privado