CodeBlocks项目关于从指针类型传递参数
以下是主要功能:CodeBlocks项目关于从指针类型传递参数,c,pointers,struct,C,Pointers,Struct,以下是主要功能: int main (void){ tProyecto proyecto; /*Proyecto a gestionar*/ int opcion; /*Opción del menú elegida*/ encabezado(); inicializarProyecto (proyecto); do { opcion=menu(); switch (opcion)
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);
代码块单词中的问题是“警告:从不兼容的指针类型传递'INIALIZARPROYCTO'的参数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));
}
}
void AltaiGadorenproyecto(tProyecto*proyecto){
特努姆布雷·诺姆布雷;
tDNI-dni;
int-salida=0;
如果(HaysitoenProyecto(proyecto,&salida)==1){
printf(“\nIntroduzca el investigador a dar de alta:\n”);
scanf(“%s\n”,名称);
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(项目[salida]->investigador.dni,dni,MAX_dni);
}
}
}
int HAYSTIOENPROYETO(TPROYETO*proyecto,int*sitio){
int ok=0;
int i;
对于(i=0;(iocupado==0){
ok=1;
*sitio=i;
}
}
返回ok;
}
无效列表arproyecto(tProyecto*proyecto){
int i;
printf(“/nproyector:\n”);
对于(i=0;iocupado==1){
printf(“/nInvestigador:\n”);
printf(“/n/tNombre:%s:\n”,proyecto[i]->investigador.nombre);
printf(“/n/tDNI:%s:\n”,proyecto[i]->investigador.dni);
printf(“/n/t区域:\n”);
列表区域信号(项目[i]>调查区域);
}
}
}
无效指定区域调查人(tProyecto*proyecto){
tDNI-dni;
int posicion=0;
int aniadir=0;
int i;
listarProyecto(proyecto);
printf(“\n在亚洲的安静地区进行调查
关税:\n“;
scanf(“%s\n”,dni);
if(BuscarinInvestigaderOrdni(项目、dni和位置)==1){
对于(i=0;i<(MAX_TAREAS-proyecto[posicion]-
>调查机构(tareas.NUMEROTAREASASASIGNADAS);i++){
printf(“/n”Quiere aniadir una tarea?:(0:no quiero;1:quiero)\n”);
scanf(“%u\n”、&aniadir);
如果(aniadir==1){
if(proyecto[posicion]-
>调查者。总收入。总收入信号investigador.tareas));
}
}
}
}
}
国际商业调查组织(tProyecto*proyecto,tDNI dni,国际*posicion)
{
int ok=0;
int i;
对于(i=0;(iinvestigador.dni,dni,MAX_dni)==0){
ok=1;
*posicion=i;
}
}
返回ok;
}
无效borrarInvestigadorDelProyecto(tProyecto*proyecto){
tDNI-dni;
int posicion=0;
listarProyecto(proyecto);
printf(“\nIntroduzca el-DNI del investigador que quire eliminar:\n”);
scanf(“%s\n”,dni);
if(BuscarinInvestigaderOrdni(项目、dni和位置)==1){
proyecto[posicion]>ocupado=0;
strncpy(proyecto[posicion]->investigador.nombre,”,MAX_nombre);
strncpy(proyecto[posicion]->investigador.dni,“,MAX_dni);
Inicializartaraassignadas(&(proyecto[posicion]>investigador.tareas));
}
}
问题是——你说的不对
inicializarProyecto (proyecto);
将是
inicializarProyecto (&proyecto);
这将解决警告消息。第一个类型为tCelda*
,但第二个类型为tCelda(*)[MAX\u INVES]
,它依次与类型定义类型tProyecto
(基本上是tCelda[MAX\u INVES]
)的指针匹配
这意味着无论您在哪里拥有tProyecto*proyecto
pass&proyecto
,然后在函数中,您都可以像这样访问它
(*proyecto)[i].ocupado = 1;
或
其中
i
显然是i>=0
并且i您应该尝试深入研究问题并发布。请缩进代码。例如,在这里您可以轻松省略其他方法。这也将有助于提供一个。缩进您的代码会更有帮助。
proyecto[0][i].ocupado = 1;