L’espressione deve avere un puntatore a struct o union error

La variabile t sta generando un errore dalla funzione assigntime in poi che dice che deve avere un puntatore a un tipo struct o union. i puntatori sono la mia debolezza, se qualcuno potesse spiegare, non solo darmi la risposta, quello che devo fare per risolvere questo che sarebbe più utile! Saluti.

//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); } 

File di intestazione qui:

 #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); 

Ci sono un paio di errori nel tuo codice.

Principalmente l’uso di puntatori non è corretto rispetto al risultato desiderato. Nell’intestazione hai la linea:

typedef struct my_time_int *my_time;

che dichiara efficacemente my_time come un tipo di puntatore alla struct my_time_int . Ma nei prototipi della tua funzione (e anche nelle definizioni) usi un puntatore a my_time come argomento: my_time* t . Infatti qui stai usando un puntatore a un puntatore alla struct my_time_int.

Quindi quando provate ad assegnare a t usando l’operatore freccia deferenza -> commettete un errore, perché in effetti state assegnando a un puntatore un puntatore a una struttura non a un puntatore semplice a una struttura come desiderate.

Dovresti anche evitare di usare il . operatore su variabili di tipo my_time perché sono in fatti puntatori. Dovresti usare invece la freccia -> su di essi.

Ecco la soluzione proposta:

 //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); } 

E anche l’intestazione:

 #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); 

Come puoi vedere nel codice commentato ci sono le precedenti dichiarazioni e definizioni errate.

MODIFICARE

Come indicato nei commenti, init_my_time , come definito, perde memoria perché assegna un puntatore che non ritorna al chiamante. La cosa giusta da fare qui è allocare la memoria e restituire il puntatore a quella memoria al chiamante. Ciò richiede la modifica della dichiarazione e della definizione di init_my_time come già fatto sopra nel codice.

Prova malloc(sizeof(struct my_time_int)); invece di malloc(sizeof(struct init_my_time*)); Stai allocando memoria per un puntatore a init_my_time anziché a my_time .

t è un puntatore a un puntatore a un my_time_int che significa che è necessario allocare memoria sufficiente per memorizzare un object my_time_int . Il puntatore stesso viene memorizzato nello stack in modo da non dover allocare memoria per questo.

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