CodeBlocks项目关于从指针类型传递参数

问题描述 投票:-1回答:1

这是主要功能:

int main (void){
    tProyecto proyecto; /*Proyecto a gestionar*/
    int opcion;         /*Opción del menú elegida*/

    encabezado();

    inicializarProyecto (proyecto);

    do
    {
        opcion=menu();
        switch (opcion)
        {
        case 1: altaInvestigadorEnProyecto (proyecto);
            break;
        case 2: listarProyecto (proyecto);
            break;
        case 3: asignarTareasAInvestigador (proyecto);
            break;
        case 4: borrarInvestigadorDelProyecto (proyecto);
            break;
        case 5: printf ("\nAdios. Gracias por utilizar este programa");
            break;
        default: printf ("\nNo es una opcion correcta. Por favor, introduzca un numero entre 1 y 5.");
        }
    }while (opcion!=5);

    return 0;
}

这里是.h文件

typedef char tDNI[MAX_DNI];

typedef char tNombre[MAX_NOMBRE];

typedef struct {
    tNombre nombre;
    tDNI dni;
    tTareasAsignadas tareas;
} tInvestigador;

typedef struct {
    tInvestigador investigador;
    int ocupado;    /*1 ocupado, 0 no ocupado */
} tCelda;

typedef tCelda tProyecto [MAX_INVES];


/* Extern functions prototype */

extern void altaInvestigadorEnProyecto(tProyecto* proyecto);
extern void listarProyecto(tProyecto* proyecto);
extern void inicializarProyecto(tProyecto* proyecto );
extern void borrarInvestigadorDelProyecto(tProyecto* proyecto);
extern void asignarTareasAInvestigador(tProyecto* proyecto);

CodeBlocks单词中的问题是“警告:从不兼容的指针类型传递'inicializarProyecto'的参数1 - 注意:期望'struct tCelda(*)[3]'但参数的类型为'struct tCelda *”

我理解这意味着该函数需要一个struct数组,但我只向它发送一个结构。我不知道如何设计它,所以它的工作方式。问题在于调用main和“extern void”函数中的函数。如果有人能告诉我怎么做,我真的很感激。

这是使用指针的函数:

void altaInvestigadorEnProyecto(tProyecto* proyecto){
    tNombre nombre;
    tDNI dni;
    int salida = 0;

    if (haySitioEnProyecto(proyecto, &salida) == 1){
        printf("\nIntroduzca el investigador a dar de alta: \n");
        scanf("%s\n", nombre);
        if (strncmp(proyecto[salida]->investigador.nombre, nombre, MAX_NOMBRE) 
                != 0){
            printf("\nIntroduzca el DNI del investigador a dar de alta: \n");
            scanf("%s\n", dni);
            proyecto[salida]->ocupado = 1;
            strncpy(proyecto[salida]->investigador.nombre, nombre, MAX_NOMBRE);
            strncpy(proyecto[salida]->investigador.dni, dni, MAX_DNI);
        }
    }
}

int haySitioEnProyecto(tProyecto * proyecto, int * sitio){
    int ok = 0;
    int i;

    for (i=0; (i<MAX_INVES) && (ok == 0); i++){
        if (proyecto[i]->ocupado == 0){
            ok = 1;
            *sitio = i;
        }
    }
    return ok;
}

void listarProyecto(tProyecto * proyecto){
    int i;
    printf("/nProyecto: \n");
    for(i=0; i<MAX_INVES; i++){
        if (proyecto[i]->ocupado == 1){
            printf("/nInvestigador:\n");
            printf("/n/tNombre: %s: \n", proyecto[i]->investigador.nombre);
            printf("/n/tDNI: %s: \n", proyecto[i]->investigador.dni);
            printf("/n/tTareas:\n");
            listarTareasAsignadas(proyecto[i]->investigador.tareas);
        }
    }
}

void asignarTareasAInvestigador(tProyecto * proyecto){
    tDNI dni;
    int posicion = 0;
    int aniadir = 0;
    int i;

    listarProyecto(proyecto);
    printf("\nIntroduzca el DNI del investigador al que se quiere asignar 
tareas: \n");
    scanf("%s\n", dni);
    if (buscarInvestigadorPorDNI(proyecto, dni, &posicion) == 1){
        for (i = 0; i < (MAX_TAREAS - proyecto[posicion]-
        >investigador.tareas.numeroTareasAsignadas); i++){
            printf("/n¿Quiere aniadir una tarea?: (0: no quiero; 1: quiero)\n");
            scanf("%u\n", &aniadir);
            if (aniadir == 1){
                if (proyecto[posicion]-
                        >investigador.tareas.numeroTareasAsignadas < MAX_TAREAS){
                    aniadirTarea(&(proyecto[posicion]->investigador.tareas));
                }
            }
        }
    }
}

int buscarInvestigadorPorDNI(tProyecto * proyecto, tDNI dni, int * posicion)
{
    int ok = 0;
    int i;
    for (i = 0; (i < MAX_INVES) && (ok == 0); i++){
        if (strncmp(proyecto[i]->investigador.dni, dni, MAX_DNI) == 0){
            ok = 1;
            *posicion = i;
        }
    }
    return ok;
}

void borrarInvestigadorDelProyecto(tProyecto * proyecto){
    tDNI dni;
    int posicion = 0;

    listarProyecto(proyecto);
    printf("\nIntroduzca el DNI del investigador que quiere eliminar: \n");
    scanf("%s\n", dni);
    if (buscarInvestigadorPorDNI(proyecto, dni, &posicion) == 1){
        proyecto[posicion]->ocupado = 0;
        strncpy(proyecto[posicion]->investigador.nombre, "", MAX_NOMBRE);
        strncpy(proyecto[posicion]->investigador.dni, "", MAX_DNI);
        inicializarTareasAsignadas(&(proyecto[posicion]->investigador.tareas));
    }

}
c pointers struct
1个回答
0
投票

问题是 - 你说错了。

inicializarProyecto (proyecto);

将会

inicializarProyecto (&proyecto);

这将解决警告信息。第一个有tCelda *类型,但第二个将是tCelda (*)[MAX_INVES],而tProyecto又与指向typedef-ed类型tCelda [MAX_INVES](基本上是tProyecto * proyecto)的指针匹配。

这意味着无论你有&proyecto通过(*proyecto)[i].ocupado = 1; ,然后在功能,你将访问它像这样

proyecto[0][i].ocupado = 1;

要么

i

其中i>=0显然是i<=MAX_INVES-1和qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.