Valeurs maximales pour time_t (struct timespec)
Je suis en utilisant le struct timespec
structure et ici, il est:
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds */
};
Chose est, l'utilisateur doit entrer les valeurs pour chacun de ces membres individuels, et je veux mettre une case à un max. valeur à l'utilisateur d'entrer.
Puis-je prendre le max. la valeur de time_t
comme int valeur max? j'.e INT_MAX
pour tv_sec
et LONG_MAX
(défini dans les limites.h) pour l' tv_nsec
? Ce sera le minimum des valeurs acceptables pour les deux? Est-il égal à zéro? Je suppose que les valeurs négatives ne peut pas être accepté? Juste pour ajouter, ces valeurs vont être l'aide d'un timer.
P. S: Où est la définition de type de time_t
? Ne pouvait pas le trouver dans le temps.h.
source d'informationauteur kingsmasher1
Vous devez vous connecter pour publier un commentaire.
Un time_t est tout simplement un long int.
Il est défini dans (sur mon Ubuntu linux system) /usr/include/heure.h, en revanche, la définition s'étend en arrière tout le chemin vers le répertoire /usr/include/bits/types d'.h, où
__SLONGWORD_TYPE
(qui est ce que__TIME_T_TYPE
est défini à l') est défini.Le problème uniquement de vérifier si une valeur est plus grande que, par exemple,
LONG_MAX
c'est qu'une fois qu'une valeur est supérieure à cette valeur, il sera automatiquement renvoyé à la ligne autour et devenir négatif. Donc vous ne pouvez pas vérifier pour voir si quelque chose est plus grande que cette valeur - la macro est définie comme la valeur la plus grande de ce type peut prendre.Vous ne voulez pas vraiment un utilisateur saisie de ces valeurs, à moins que par "utilisateur" ou " vous voulez dire 'développeur'. Le seul véritable "coffre-fort" façon de tester ce serait de laisser à l'utilisateur la saisie d'une chaîne (c-style, bien sûr), puis exécutez deux vérifications:
1) Vérifier si l'utilisateur a entré plus de chiffres que ce qui est permis (un truc pas cher est
int(log10(number)) + 1
pour compter le montant de chiffres dans un nombre).2) Si c'est égal à la somme des chiffres, qui commencent à comparer chiffre par chiffre. Vous pouvez comparer chiffre par chiffre en utilisant un peu de l'arithmétique modulo.
C'est vraiment le plus sûr moyen de vérifier si oui ou non l'utilisateur tape un nombre beaucoup trop grand. Vous ne rencontrerez pas de tout les problèmes de débordement de cette façon, bien qu'il est terriblement fastidieux.
Espérons que cette aide.
Car les gens ici sont de répondre à la façon de définir le nombre maximal de
time_t
valeur, et de la poursuite de la conjecture selon leur type, je pensais ajouter lec++
façon de le faire:Je n'aurais pas autant sur ce qui se passe dans un
time_t
mais sur ce qui est raisonnable. Sur n'importe quel système que j'ai vu, untime_t
peut encoder timespans n'importe où à partir de 63 ans à 1011 d'années (à peu près chaque système que je connais utilise 64 bits depuis ces geniusses est venu avec le Y2K monde-sera-chose en fin de 1999, il reste à voir qui sera l'avis le plus grand "événement" lors de l'année 2038 va passé).Si vous raisonnablement s'attendre à ce que votre programme sera exécuté pendant plus de 50 ans, de refuser toute valeur supérieure à 50*365*86400 ou tout simplement de saturer la valeur. Je n'attends pas de l'un des programmes que j'écris maintenant à être en usage dans les années 50 (même si je ne vais pas vivre à vérifier).
D'autre part, si votre système ne utiliser un 32 bits
time_t
, alors il n'a pas d'importance de toute façon, parce que l'heure du système ont survolé en 50 ans, de toute façon, donc on ne peut pas construire un véritable temps de toute façon sans se déplacer époque.Si vous demandez: "combien de temps voulez-vous une pause?" et l'utilisateur dit "250 ans", j'estime qu'il est pas vraiment incorrect le comportement du programme si vous avez dit "oui, bon, 50 aussi". Parce que, bon, la différence n'est vraiment pas observables.
Prises de ISO/IEC 9899:TC3 §7.23
Par conséquent, vous ne pouvez pas faire d'hypothèse sur sa valeur max basé sur le C standard.
Si vous avez besoin d'écrire du code portable, vous aurez probablement utiliser le autotols. Autoconf offre la AC_CHECK_SIZEOF macro qui peut vous aider à traiter avec l'architecture de données spécifiques à des limites.
Malheureusement, le C ISO standard (actuellement C11) ne fournit aucun moyen pour obtenir le maximum de valeur de
time_t
. Donc, à moins que l'on utilise des outils comme le Autoconf fournir de l'information, on a besoin de faire des hypothèses.En supposant que
time_t
est un type entier, sans padding bits (ce qui est le cas sur la plupart des plates-formes de nos jours, si pas tous), on peut probablement prendre:qui est le maximum représentable de la valeur d'un entier signé de type (mais le fait qu'une valeur est représentable dans
time_t
ne signifie pas qu'il est pris en charge par le système comme untime_t
valeur).On peut aussi vouloir détecter si
time_t
est un type entier. Le C ISO norme spécifie quetime_t
est un type réel (Clause 7.27.1). Par définition, un type réel est un entier de type ou un réel flottant type (float
double
oulong double
et peut-être d'autres ajoutés dans les prochaines versions de la norme, comme mentionné dans l'article 6.11.1). Ainsi, sitime_t
n'est pas un entier, il est nécessairement un réel de type flottant. En conséquence, on peut détecter sitime_t
est un type entier, avec le test(time_t) 1 /2 == 0
.Remarque: La norme n'est pas strictement exiger que
(T) 1 /2
être différent de 0 siT
est un type flottant, mais si ce n'est pas le cas, je soupçonne que ces plates-formes aurait de graves problèmes avec les calculs en virgule flottante.Selon Wikipedia,
time_t
peut être un entier ou un nombre à virgule flottante, mais c'est habituellement un 32-bits ou 64-bits entier signé. Je pense que la plus grande valeur sûr vous pouvez le supposer, c'estINT_MAX
. Pourtime_t
au moins les nombres négatifs sont légales et consulter avant le 1er janvier 1970.