2009-06-02 7 views
3

Je reçois l'erreur de compilation: (83) erreur: combinaison pointeur/nombre incorrect: arg # 1.C - Combinaison incorrecte pointeur/entier dans strftime()

Voici le code qui est le faire:

char boot_time[BUFSIZ]; 

... Ligne 83:

strftime(boot_time, sizeof(boot_time), "%b %e %H:%M", localtime(table[0].time)); 

où la table est une struct et le temps est un membre time_t. J'ai lu que "combinaison pointeur/nombre incorrect" signifie que la fonction est indéfinie (puisqu'en C, les fonctions retournent ints lorsqu'elles ne sont pas trouvées), et la solution normale est d'inclure certaines bibliothèques. strftime() et localtime() sont à la fois dans time.h, et sizeof() dans string.h, les deux que j'ai inclus (avec stdio.h) je suis complètement perplexe ici.

+0

Nit-pick: sizeof n'est pas une fonction. C'est un C builtin (mot-clé), et n'est défini dans aucun en-tête. Vous n'avez pas non plus besoin des parenthèses, sauf si elles font partie de l'argument * (pour les types). Dans cet exemple, écrivez simplement "sizeof boot_time" car vous ne voulez pas la taille d'un type. – unwind

Répondre

1

localtime prend un time_t*, donc passez &table[0].time (l'adresse, pas la valeur).

1

Le problème semble être l'appel en heure locale. Cette fonction attend un pointeur time_t et non une valeur. Je crois que vous devez faire votre appel comme suit

localtime(&(table[0].time)) 

Signature du localtime

struct tm * localtime (const time_t * timer); 

Référence à l'API localtime

4
struct tm * localtime (const time_t * timer); 

Le usage correcte est:

time_t rawtime; 
localtime(&rawtime); 

Dans votre cas: localtime(&(table[0].time))

0

Comme d'autres l'ont mentionné, le problème particulier est que vous devez passer un time_t * à LOCALTIME. Cependant, le problème général était que vous aviez un problème flou sur une ligne compliquée qui faisait plusieurs choses. La première chose à avoir essayé quand vous avez l'erreur serait de diviser la mise en ligne dans ses composants, pour limiter exactement là où le problème est, comme ceci:

char boot_time[BUFSIZ]; 
// Temporary, putting the sizeof() call inline is normally better. 
size_t boot_time_size = sizeof(boot_time); 
time_t temp_time = table[0].time; 
// Use a more descriptive name here. 
struct tm *mytime = localtime(temp_time); 

strftime(boot_time, boot_time_size, "%b %e %H:%M", mytime); 

De cette façon, le compilateur peut vous dire que appel est celui qui vous cause des problèmes. Une fois que vous l'avez compris, vous pouvez le condenser comme bon vous semble - je garderais probablement l'appel localtime() sur sa propre ligne, mais c'est juste moi.