![]() |
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.
|
|
google unix.com
|
|||||||
| Forums | S'inscrire | Forum Rules | Liens | Albums | FAQ | Liste des membres | Calendrier | Recherche | Aujourd'hui, les postes | Marquer les forums comme lus |
| High Level Programming Posez vos questions à propos de C, C + +, Java, SQL, et d'autres langages de programmation ici. |
Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
|
||||
| Fil | Thread Starter | Forum | Réponses | Last Post |
| sera de ce script dans crontab effet dimanche 9? | thepurple | SUN Solaris | 2 | 10-05-2007 05:31 AM |
| Effet de désactiver temporairement mis-e en ksh | ugeek | De programmation et de script Shell | 1 | 03-28-2007 05:21 AM |
| Comment propriétés effet script? | Chiefos | UNIX pour les nuls Questions et réponses | 1 | 06-21-2006 07:23 AM |
| Effet de noyau préemptif | sriram.ec | UNIX for Advanced & Expert Users | 2 | 03-15-2006 01:43 AM |
| recursive effet! | sskb | UNIX pour les nuls Questions et réponses | 2 | 01-30-2003 12:05 PM |
![]() |
|
|
LinkBack | Thread Tools | Recherche sur ce Thread |
Rating:
|
Modes d'affichage |
|
|
|
||||
|
étrange effet: si ... C ailleurs dans l'influence d'une précédente déclaration
Je vous écris un petit code en c
mai, il fonctionne bien, mais quand je ajouter une si ... else ... structure, un calcul avant que la structure ne peut pas donner un résultat correct la compilation et l'exécution peuvent faire bien, mais le résultat est mauvais. Très étrange (1) y2 \u003d expression; / / y2 \u003d 0 toujours 0 erreur ................. ajouter: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; (2) y2 \u003d expression; / / y2 \u003d 0 toujours 0 erreur ................. ajouter: if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (3) y2 \u003d expression; / / y2 \u003d valeur normale, normale ................. ajouter: / / if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (4) y2 \u003d expression; / / y2 \u003d valeur normale, normale ................. ajouter: if (a-> is_root) c \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; (5) y2 \u003d expression; / / y2 \u003d valeur normale, normale ajouter: / / if (a-> is_root) c \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; Problème: ne peut pas utiliser en cas de ... else ... normalement Question: (1) si ... else ... peuvent influer sur une précédente déclaration, pourquoi? (2) Comment faire pour résoudre le problème? Dernière édition par cdbug; au 11.20.2008 05:38 AM.. |
|
||||
|
Cela se passe dans une grande fonction, qui dispose d'un algorithme relativement complexe.
En bref, sa structure est comme tel: ___________________________________________________________ base de calcul ------------------------------ y \u003d expression; ------------------------------- ____________________________________________________________ certaines opérations -------------------------------- -------------------------------- if ( bloc 1; ) else ( (si le bloc 2;) else (bloc 3;) ) La structure des blocs 2 et 3 vont changer la façon dont y est calculé. Le résultat est faux. Je vérifie par gdb. Les cinq résultats ci-dessus sont obtenus dans le même environnement, sauf pour les changements dans les deux blocs Dans de nombreuses exécutions, y est toujours égal à 0. Sinon, il sera beaucoup plus grande que la valeur d'un droit. Mais quand l'un ou chacun des deux blocs est enlevé, y aura une valeur normale. Je ne comprends pas |
|
||||
|
La seule situation ici est que block2 ou block3 regorgent d'une variable sur la pile de votre fonction et votre y var est en train de changer.
Une fonction de la pile est composée (de plus en plus grande quantité de mémoire à peu de mémoire) par variables (dans l'ordre inverse), eip, esp, Nom de fonction et esp. Voici un exemple simple possible pour votre situation: Code:
void of()
{
char a[10];
char b[10];
strcpy (a, "aaaaaaaaaa");
printf ("%s\n", a);
strcpy(b, "bbbbbbbbbboverflow");
printf ("%s\n", a);
}
void
main ()
{
of();
}
|
|
||||
|
La valeur est attribuée à tort à y exécuter quand 'y \u003d expression; "
dans gdb, 'py' va donner la fausse valeur runing après la déclaration ci-dessus. mais' p expression donne le droit de valeur. block2 et block3 sont comme ceci: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; Comme dit auparavant: une seule déclaration: si (a-> is_root) c \u003d m2 - y2 / / y2 normal une seule déclaration: if (! a-> is_root) f \u003d m2 - y2 / / y2 normal mais: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; ou if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; les deux font y2 anormal. 'y2 \u003d expression »est loin de if__ autre structure __ Merci pour votre enseignement Dernière édition par cdbug; au 11.23.2008 04:28 AM.. |
|
||||
|
Hum! Quel type de la variable est y2? Quelle est la expression qui lui sont assignées? Il ya en fait plusieurs choses qui peuvent causer de sorte que c'est un peu difficile de vous aider sans le code compilable.
|
![]() |
| Bookmarks |
| Thread Tools | Recherche sur ce Thread |
| Modes d'affichage | Rate this thread |
|
|