2009-02-07 6 views
2

Ok ici est le programme que j'ai tapé (stdio.h est également inclus):Comment corriger « l'affectation fait entier sans transtypage » ** Mise à jour **

/* function main begins program execution */ 
int main (int argc, char *argv[]) 
{ 
    int x; /*first number input*/ 
    int y; /*second number input*/ 
    int sum; /* variable in which sum will be stored */ 
    int product; /* variable in which product will be stored */ 
    int quotient; /* variable in which x divided by y will be stored */ 
    int md; /* variable in which the modulo division of x divided by y */ 

    x = argv[2]; /*assign total to x*/ 
    y = argv[3]; /*assign total to y*/ 

    if (argc ==3) { 
     sum = x + y; /* assign total to sum */ 
     printf("%d\n",sum); /*print sum*/ 

     product = x * y; /*assign total to product*/ 
     printf("%d\n", product); /*print product*/ 

     quotient = x/y; /*assign total to quotient*/ 
     printf("%d\n", quotient); /*print quotient*/ 

     md = x % y; /*assign total to md*/ 
     printf("%d\n", md); /*print md*/ 
    } /*end if*/ 

    if (argc !=3) { 
     printf("need two integers\n"); /*need two integers*/ 
    } 

    return 0; /*indicate program ran successfully*/ 
} /*end of main*/ 

Lorsque je le lance à travers le compilateur il est dit que dans les lignes 15 et 16 (x = et y = lignes) "affectation fait un entier à partir du pointeur sans un cast." Comment puis-je réparer ça? ** Je l'ai changé en x = atoi (argv [2]) et y = atoi (argv [3]) et il a résolu ce problème. Mais comme toujours, quelque chose d'autre a maintenant foiré. Maintenant, quand je lance le programme que je reçois:

163 [principales] a_4312 _cygtls :: handle_exceptions: Erreur lors du dumping état

Segmentation fault

je lis que cela signifie que je ne l'ai pas allouer de la mémoire pour la sortie ou quelque chose comme ça ... quelqu'un peut-il me donner un coup de main ici? **

+1

Côté Remarque: Vous avez trop commenté votre code. Il est évident que vos instructions printf impriment quelque chose. Par conséquent, vous n'avez pas besoin d'ajouter le commentaire "produit d'impression", ou autre. – EndangeredMassa

+0

De plus, de meilleurs noms de variables peuvent être auto-documentés. Au lieu de x et y, pensez à utiliser le premier et le second. –

+0

Ya, il y a beaucoup de commentaires, mais notre professeur veut que nous le fassions de cette façon. – Kaity

Répondre

2

L'erreur du compilateur est dû à vous attribuer le texte à un numéro. Vous avez réellement besoin d'appeler une fonction pour convertir entre les 2 atoi. L'erreur d'exécution la plus importante est la faute de seg, provoquée par l'utilisation d'index erronés dans le tableau, c a des tableaux de 0 donc le premier élément est 0, cela signifie que les 2 arguments que vous voulez sont 1 et 2 (puisque le premier argument est le nom de l'exécutable). Enfin, vous voudrez peut-être vérifier la valeur de y avant la division et mod puisque si c'est 0, vous obtiendrez diviser par zéro problèmes.

x = atoi(argv[1]); /*assign total to x*/ 
y = atoi(argv[2]); /*assign total to y*/ 
+0

2 et 3 est faux, il devrait être 1 et 2 –

+0

Cela va évidemment planter .. il devrait être 1 et 2. – Naveen

+0

Je l'ai fait remarquer dans les commentaires de la question - ont mis à jour ici. – Tom

1

argv[2] vous donne un char *. Vous avez besoin d'une conversion à un int:

x = atoi(argv[2]); 
2

En dehors de la solution fournie, vous devriez également vérifier si les arguments nécessaires sont là (déplacer le dernier si bloc avant l'affectation à x et y) avant d'essayer de les transmettre à atoi ou vous obtiendrez problèmes d'exécution.

4

Les numéros que vous avez passés sont argv [1] et argv [2], pas argv [2] et argv [3].

1

Si votre ligne de commande est:

rapide >> myprogram 5 6

argv [0] devrait être le nom du programme (MyProgram) argv [1] devrait être le premier paramètre ("5" argv [2] devrait être le deuxième paramètre ("6")

Je pense que vous faites référence à argv [3], qui n'existe pas.