La expresión debe tener puntero a la estructura o error de unión

La variable t aparece con un error de la función assigntime en adelante que dice que debe tener un puntero a una estructura o tipo de unión. los indicadores son mi debilidad, si alguien pudiera explicarme, no solo dame la respuesta, ¡lo que debo hacer para solucionar esto sería lo más útil! aclamaciones.

//MY TIME C FILE #include "my_time.h" #include  #include  #include  struct my_time_int { int hour; int minute; int second; }; void init_my_time(my_time *t) { t=(my_time)malloc(sizeof(struct init_my_time*)); } /* * Alter hour, minute, and second * Param h new value for hour * Param m new value for minute * Param s new value for second */ void assignTime(my_time *t, int h, int m, int s) { t->hour = h; t->minute = m; t->second = s; } //FOLLOWING CODE T VARIABLE HAS RED UNDERLINE ERROR SAYING EXPRESSION MUST HAVE POINTER TO STRUCT OR UNION> char *toString(my_time t) { char *r = (char *)malloc(12 * sizeof(char)); if (t.hour >= 12) { if (t.hour == 12) sprintf(r, "%02d:%02d:%02d PM", 12, t.minute, t.second); else sprintf(r, "%02d:%02d:%02d PM", t.hour - 12, t.minute, t.second); } else { if (t.hour == 0) sprintf(r, "%02d:%02d:%02d AM", 12, t.minute, t.second); else sprintf(r, "%02d:%02d:%02d AM", t.hour, t.minute, t.second); } return r; } /* * Find printable form of time in 24 hour mode * Return String form of time in 24 hour mode for printing etc. */ char *toMilString(my_time t) { char *s = (char *)malloc(9 * sizeof(char)); sprintf(s, "%02d:%02d:%02d", t.hour, t.minute, t.second); return s; } /* * Find number of seconds elapsed since midnight * Return number of seconds elapsed since midnight as int */ int secsSinceMidnight(my_time t) { return t.second + (60 * t.minute) + (60 * 60 * t.hour); } 

Archivo de encabezado aquí:

 #include  struct my_time_int; typedef struct my_time_int *my_time; void init_my_time(my_time *t); void assignTime(my_time *t, int h, int m, int s); void addTime(my_time t, double s); char *toString(my_time t); char *toMilString(my_time t); bool equals(my_time this, my_time that); bool my_timeIncHour(my_time *t); bool my_timeIncMinute(my_time *t); bool my_timeIncSecond(my_time *t); 

Hay un par de errores en su código.

Principalmente el uso de indicadores no es correcto con respecto al resultado deseado. En el encabezado tienes la línea:

typedef struct my_time_int *my_time;

que efectivamente declara que my_time es un tipo de puntero a la struct my_time_int . Pero en los prototipos de su función (y las definiciones también) usa un puntero a my_time como argumento: my_time* t . De hecho, aquí está utilizando un puntero a un puntero a la estructura my_time_int.

Entonces, cuando intenta asignar t utilizando el operador de flecha de deferencia -> comete un error, porque de hecho está asignando un puntero a un puntero a una estructura, no a un puntero plano a una estructura como desee.

También debe evitar el uso de la . Operador en variables de tipo my_time porque están en punteros de hechos. Debes usar en su lugar la flecha -> operador en ellos.

Aquí la solución propuesta:

 //MY TIME C FILE #include "prova.h" #include  #include  #include  struct my_time_int { int hour; int minute; int second; }; //void init_my_time(my_time *t) my_time init_my_time() { //t=(my_time)malloc(sizeof(struct init_my_time*)); return (my_time)malloc(sizeof(struct my_time_int)); } /* * Alter hour, minute, and second * Param h new value for hour * Param m new value for minute * Param s new value for second */ //void assignTime(my_time *t, int h, int m, int s) void assignTime(my_time t, int h, int m, int s) { t->hour = h; t->minute = m; t->second = s; } //FOLLOWING CODE T VARIABLE HAS RED UNDERLINE ERROR SAYING EXPRESSION MUST HAVE POINTER TO STRUCT OR UNION> char *toString(my_time t) { char *r = (char *)malloc(12 * sizeof(char)); //if (t.hour >= 12) { if(t->hour >= 12){ //if (t.hour == 12) if(t->hour == 12) //sprintf(r, "%02d:%02d:%02d PM", 12, t.minute, t.second); sprintf(r, "%02d:%02d:%02d PM", 12, t->minute, t->second); else //sprintf(r, "%02d:%02d:%02d PM", t.hour - 12, t.minute, t.second); sprintf(r, "%02d:%02d:%02d PM", t->hour - 12, t->minute, t->second); } else { //if (t.hour == 0) if (t->hour == 0) //sprintf(r, "%02d:%02d:%02d AM", 12, t.minute, t.second); sprintf(r, "%02d:%02d:%02d AM", 12, t->minute, t->second); else //sprintf(r, "%02d:%02d:%02d AM", t.hour, t.minute, t.second); sprintf(r, "%02d:%02d:%02d AM", t->hour, t->minute, t->second); } return r; } /* * Find printable form of time in 24 hour mode * Return String form of time in 24 hour mode for printing etc. */ char *toMilString(my_time t) { char *s = (char *)malloc(9 * sizeof(char)); //sprintf(s, "%02d:%02d:%02d", t.hour, t.minute, t.second); sprintf(s, "%02d:%02d:%02d", t->hour, t->minute, t->second); return s; } /* * Find number of seconds elapsed since midnight * Return number of seconds elapsed since midnight as int */ int secsSinceMidnight(my_time t) { //return t.second + (60 * t.minute) + (60 * 60 * t.hour); return t->second + (60 * t->minute) + (60 * 60 * t->hour); } 

Y encabezado también:

 #include  struct my_time_int; typedef struct my_time_int *my_time; //void init_my_time(my_time *t); my_time init_my_time(); //void assignTime(my_time *t, int h, int m, int s); void assignTime(my_time t, int h, int m, int s); //and son on removing the unnecessary pointer types void addTime(my_time t, double s); char *toString(my_time t); char *toMilString(my_time t); bool equals(my_time this, my_time that); bool my_timeIncHour(my_time t); bool my_timeIncMinute(my_time t); bool my_timeIncSecond(my_time t); 

Como puede ver en el código comentado hay las declaraciones y definiciones erróneas anteriores.

EDITAR

Como se señaló en los comentarios, el init_my_time , como se define, init_my_time memoria porque asigna un puntero que no devuelve a la persona que llama. Lo correcto a hacer aquí es asignar la memoria y devolver el puntero a esa memoria a la persona que llama. Esto requiere cambiar la statement y la definición de init_my_time como ya se hizo anteriormente en el código.

Pruebe malloc(sizeof(struct my_time_int)); en lugar de malloc(sizeof(struct init_my_time*)); Está asignando memoria para un puntero a init_my_time lugar de para my_time .

t es un puntero a un puntero a my_time_int que significa que necesita asignar suficiente memoria para almacenar un objeto my_time_int . El puntero se almacena en la stack, por lo que no necesita asignar memoria para él.

 void init_my_time(my_time *t) { *t=(my_time)malloc(sizeof(struct my_time_int)); }