2011-07-15 2 views
-2

Comment les deux dernières lignes d'une fonction êtrec passant la valeur à long unsigned long

printf("disk_free_blocks returning %llu\n",item_int3); 
return (item_int3); 

et à mettre

disk_free_blocks retour 233012428800

retour à la fonction d'appel comme

part_avail=disk_free_blocks(DiskParts[part_index].part_name,DISK_AVAIL); 
if (DEBUG) printf("DiskParts[%d].part_name=%s has %llu free.\n",part_index,DiskParts[part_index].part_name,part_avail); 

et la sortie être

DiskParts [0] .part_name =/dev/sda1 a 1084194816 gratuit.

??

unsigned long long part_avail, item_int3; 
+3

Devons-nous deviner le contenu du reste du code que vous ne nous avez pas montré? Par exemple les déclarations de type de tous les participants dans le puzzle. Si vous ne le jugez pas digne d'inclure ceux-là alors je dirais que vous n'avez pas besoin de chercher plus loin. Votre tâche consiste à apprendre l'importance des types dans C. –

+1

Comment 'disk_free_blocks' est-il déclaré? – cnicutar

+1

Question évidente, mais votre type de retour pour disk_free_blocks est défini comme 'unsigned long long'? – dolphy

Répondre

0

RESOLU

disk_free_blocks() résidaient dans un fichier différent de celui process_copy_out(), la fonction de faire l'appel à disk_free_blocks.

Le correctif ajoutait un prototype de fonction pour informer le compilateur.

Merci à tous pour votre aide.

5

Les deux numéros de sortie sont:

0x00000036409F8000 

et

 0x409F8000 

Il semble que le type de retour (que vous avez non représenté) n'est pas assez grand pour accueillir un Valeur de 64 bits, donc le compilateur tronque simplement (qui est le comportement requis par le standard, pour réduire les conversions sur les entiers non signés). J'ai tendance à penser que les deux sont faux: 233 milliards de blocs, avec un bloc de 512 octets, c'est-à-dire 100 Tb. Pas probable. 1 milliard de blocs est alors d'environ 512 Go, ce qui pourrait ou non correspondre à votre espace libre réel /dev/sda1.

unsigned long long part_avail, item_int3; 

Cela n'a pas de sens, étant donné que l'utilisation de ces deux variables est dans différents champs d'application. Y a-t-il deux variables avec le même nom? Ou utilisez-vous des variables globales?

Peut-être item_int3 dans la fonction est seulement 32 bits, printf lit après la fin de la liste des arguments au cours du traitement vararg, et la pile vient de se passer d'avoir 0x00000036 sur, de sorte que par l'été imprimés spécificateur %llu. Lorsqu'il est retourné comme unsigned long long, le compilateur remet correctement la valeur à zéro, puis l'appelant pousse la valeur 64 bits complète sur la pile, qui est récupérée et imprimée correctement pendant le traitement vararg printf du code de format %llu.

+1

+1, Math frappe à nouveau – dolphy

+0

+1, c'est vraiment évident avec les nombres hexadécimaux. Bien joué. – Coeffect

+0

unsigned long long disk_free_blocks (char * disque, option int) { –

1

La valeur de retour a été tronquée à 32 bits quelque part le long du chemin. Peut-être disk_free_blocks est déclaré comme renvoyant un int?

+0

unsigned long long disk_free_blocks (option char * disk, int) { –

Questions connexes