[RESOLU][C] console qui plante après scanf


edit: bon voilà, résolu par kineox sur IRC, merci.

  1. ma fonction est fausse, voilà la bonne:

[code]void maximumTableau(long tableau[], long tailleTableau, long valeurMax)
{
long i=0;

for (i=0; i < tailleTableau; i++)
{
if (tableau[i] > valeurMax)
{
tableau[i] = 0;
}
}
}[/code]

2)j’avais oublié le “&” au scanf, forcément ça plante.


Je me suis mis au C via les tuto/exos du site du zer0 (c’est gratos et je trouve ça bien expliqué).

J’en suis arrivé aux tableaux. Un des exos me pose problème. (j’ai limite honte, car ça va surement être une broutille pour vous les pros B))

"Exercice 4 : créer une fonction maximumTableau qui aura pour rôle de remettre à 0 toutes les cases du tableau ayant une valeur supérieure à un maximum. Cette fonction prendra en paramètre le tableau ainsi que le nombre maximum autorisé (valeurMax). Toutes les cases qui contiennent un nombre supérieur à valeurMax doivent être mises à 0.
Prototype : void maximumTableau(long tableau[], long tailleTableau, long valeurMax);"

Je fais mon truc (ou j’essais)
Donc j’ai ça dans le main.c :

[code]{blablabla

printf("\nvaleur maximum du tableau?");
scanf("%ld", max); //on récupère la valeur maximale qu’on veut

maximumTableau(tableau, 4, max); // on envoi ça dans la fonction qui va bien

affiche(tableau, 4); //et on affiche le résultat

return 0;

}[/code]

voilà la fonction “maximumTableau” en question :

[code]void maximumTableau(long tableau[], long tailleTableau, long valeurMax)
{
long i=0;

for (i=0; tableau[i]>valeurMax; i++)
{
tableau[i]=0;
}
}[/code]

Je suis pas sur du tout de la fonction (pour ne pas dire que je suis persuadé qu’il est faux).

Toujours est-il que quand je lance ça, une fois que j’ai rentré ma valeur max, la console plante (“console.exe a rencontré un problème et doit fermer. blabla” > je suis sous xp). Donc je vérifie d’où ça peut venir (je suspecte surtout ma fonction maximumTableau) et chose étrange, même en supprimant les lignes “maximumTableau(tableau, 4, max);” et “affiche(tableau, 4);” , ça plante encore O_o (aussi bien sous code::blocks que visual studio 2005)

Quelqu’un aurait une idée d’où ça pourrait venir B) ?

for (i=0; tableau[i]>valeurMax; i++)

C’est pas valeur max c’est tailletableau…

Faut que tu fasses un if ensuite pour tester valeurMax

[code]void maximumTableau(long tableau[], long tailleTableau, long valeurMax)
{
long i=0;

for (i=0; i< tailleTableau; i++)
{
if(tableau[i] > valeurMax)
tableau[i]=0;
}
}[/code]

Ca c’est la correction de la fonction que astrojojo avait déjà déclarée comme fausse :

Débuggé sur IRC avec astrojojo, la déclaration de max (qu’on ne voit pas dans le code) était “long max = 0”.
Comme il passe max au lieu de &max à scanf, la libc essaie d’écrire à l’adresse 0 (ou une différente si on est sur un système 64 bits puisqu’il prendra en compte des données à côté de max).

Merci B)

max, c’est un long ?
Si c’est le cas, c’est pas max, que tu dois passer en paramètre à ta fonction, c’est l’adresse de max (&max). Parce que avec max, il va chercher à ércire dans l’adresse identifiée par la valeur de max, et ca, tu sais pas ou c’est.Y a 99% de chances pour que le programme ait pas le droit -> plantage.

sinon, pareil que avavrin pour la boucle. Telle que tu l’as faite, il va remplacer toutes les valeurs de ton tableau par 0 jusqu’à ce qu’il trouve une valeur supérieure à valeurmax. En plus, si il trouve pas de valeur supérieur à valeurmax, t’as un joli segfault qui t’attend (il va vouloir écrire en dehors du tableau)

EDIT : mega grilled…