gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:31:47 25 4
gpt4 key购买 nike

主要功能如下:

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 语言中的问题是“警告:从不兼容的指针类型传递 'initializarProyecto' 的参数 1 - 注意:预期为 'struct tCelda (*)[3]',但参数的类型为 'struct tCelda *”

我理解这意味着该函数需要一个结构数组,但我只向它发送一个结构。我不知道如何设计它,所以它就是这样工作的。问题出在 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));
}

}

最佳答案

问题是 - 你把它叫错了。

inicializarProyecto (proyecto);

将会

inicializarProyecto (&proyecto);

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

这意味着无论你在哪里 tProyecto * proyecto通过&proyecto然后在函数中您将像这样访问它

(*proyecto)[i].ocupado = 1;

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

哪里i显然是i>=0i<=MAX_INVES-1 .

关于关于从指针类型传递参数的 CodeBlocks 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48028023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com