CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Nombre à virgule

GTO25
GTO25
Niveau 10
05 octobre 2009 à 16:01:49

Salut!

J'ai un problème vraiment idiot -___-
J'ai fait un programme qui calcule la moyenne d'un certain nombre de valeur que l'on choisit.

Je sais que pour avoir des nombres à virgule on doit utiliser les types Float ou Double.
Que pour utiliser l'un de ces deux types on doit mettre dans les printf : %f
Et dans les scanf : %f ou %lf.

Mais j'ai toujours une erreur, celle ci : "main.c|23|error: array subscript is not an integer|"
Et ce dans les printf ou scanf, qui utilise une variable de type float ou double, ça fou tout en l'aire.

Je me suis demandé si c'était tout simplement que ces fonctions n'utilisent que des types Int. Ou bien parce que l'une de mes variables est un tableau de type float.

Je pense que c'est ce dernier cas, que l'une de mes variables est un tableau...

Si vous avez une solution, ou bien une astuce pour éviter ce problème et pouvoir utiliser quand même le tableau pour mes calcules ^^

Merci d'avance ^^ (s'il le faut je posterai mon code, il n'est pas très long et très simpliste ^^)

godrik
godrik
Niveau 30
05 octobre 2009 à 16:13:25

Je ne peux pas etre sur snas avoir vu le code, mais ton message d'erreur semble plutot clair:
"main.c|23|error: array subscript is not an integer|"
Tu dereference un tableau avec une variable qui n'est pas entiere.
Lorsque tu fais
float tab[8];
int i = 1;
float f=1.0;
tab[i];//est valide
tab[f];//n'est pas valide

GTO25
GTO25
Niveau 10
05 octobre 2009 à 16:17:48

Je crois pas avoir saisie, je poste mon code :
http://codepad.org/EKzUehN4

J'ai modifié le code, ce qui explique que j'ai des %d, et des %f qui sont mélangé.

Bunyan
Bunyan
Niveau 17
05 octobre 2009 à 17:24:33

Première chose : %d, c'est uniquement pour les entier, pas les flottants ni les doubles.
Deuxième chose : %f, c'est pour les flottants, %lf, c'est pour les doubles.
Dans ton code, tu n'utilises que des %lf, or tu n'utilises aucun double.

Les tableaux n'utilisent pas d'indice décimaux aussi, donc passe ta variable i en int.
Ca vient peut-être de là.

Bunyan
Bunyan
Niveau 17
05 octobre 2009 à 17:26:56

Histoire de compléter mon truc sur tes %d :

float ex = 16.38;
printf ("%d\n", ex);
Ca va t'afficher "16", le compilateur aura fait un transtypage passif.
A moins que tu voulais faire ça depuis le début, bien entendu ^^

godrik
godrik
Niveau 30
05 octobre 2009 à 17:32:35

Bunyan a raison : "Les tableaux n'utilisent pas d'indice décimaux aussi, donc passe ta variable i en int. "
L'indice d'un tableau DOIT etre un entier.

"float ex = 16.38;
printf ("%d\n", ex);
Ca va t'afficher "16", le compilateur aura fait un transtypage passif. "
Ca, c'est si tu as de la chance, printf devrait afficher le float comme un entier sans typecast aucun. Ce qui donenrait une valeure bizarre. C'est le comportement que j'attend qu'il ait en tout cas.

GTO25
GTO25
Niveau 10
05 octobre 2009 à 18:59:49

Normale pour les %d, %lf et %f, je fesais des testes et j'ai donné le code comme tel ^^

Mais à la base j'avais fais le programme qu'avec des Int donc j'utilise des %d.
Ensuite j'ai voulu intégré les virgules, mais pas moyen ^^'

Je vais voir en écoutant vos conseils et je vous dis le résultat ^^

Le résultat :
Maintenant j'ai la virgule mais le calcule n'est pas complet oO

Déjà ce que ça donne : http://codepad.org/u48TJfgO

Maintenant, disons que je prenne 5 nombres dont je veux la moyenne : 1, 5, 10, 0 et 20 (je tiens à préciser que ce ne sont pas mes notes lol), normalement ça donnerai 7.2, mais dans le programme ça me donne 7.0000000000. C'est pas qu'il y ait trop de zero, c'est pas grave, mais le .2 qui manque c'est assez gênant, d'autant plus qu'il tronque, qu'il n'arrondie pas... Entre 7.9 et 7.0 il y a une grosse différence quand même ^^'

GTO25
GTO25
Niveau 10
05 octobre 2009 à 19:01:03

Merci de vos réponses ^^ (j'avais oublié malpolie que je suis '.' )

godrik
godrik
Niveau 30
05 octobre 2009 à 19:10:57

C'est un probleme de priorite dans les conversions. lorsque tu ecris:
div = note[k] / nbNote;
il fait une division entiere entre note[k] et nbnote. Ce qui donne un resultat entier. Cet entier est ensuite convertit en flottant, mais la precision a ete perdu.
Si tu convertis explicitement l'un des deux en flottant avant de diviser, alors le resultat sera correcte. Je suggere:
div = ((float)note[k]) / nbNote;

GTO25
GTO25
Niveau 10
05 octobre 2009 à 19:22:21

Ah merci! Je connaissais pas cette astuce!

Ca marche nikel :-) merci encore ^^

Lapintade
Lapintade
Niveau 30
09 octobre 2009 à 13:13:38

Tes notes sont des nombres a virgules, dont utilise un tableau de float (et pas int)
Tu n'aura ainsi pas besoin de forcer la conversion en float.

GTO25
GTO25
Niveau 10
10 octobre 2009 à 15:37:07

Ouaip merci ^^

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment