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

[Maple] Bad index into Array?

Squik22
Squik22
Niveau 10
09 avril 2013 à 17:04:16

Salut à tous,

Voilà je suis en seconde année de prépa maths et dans le cadre de mon TIPE j'essaie de réaliser un algorithme permettant de jouer au jeu de Hex et de déterminer une stratégie gagnante.
Donc évidemment comme dans tout programme j'ai déjà eu pas mal de problèmes que j'ai réussi à surmonter jusque là, mais ici j'ai vraiment du mal à voir ce qui cloche, donc si certains s'y connaissent un peu en langage Maple, voici l'algorithme en question qui bloque:

trier:=proc(n)
local A,V,D,k ;
A:=generer(n^2) ;
W:=NULL ;
L:=NULL ;
for k from 1 to combinaison(floor((n^2)/2),(n^2)) do
if Vainqueur(A[k],n) then V:=V,A[K] ;
else D:=D,A[k] ;
fi;
od;
[W],[L];
end proc;

Alors un peu d'explications quand même:

Le but de ce programme est une fois qu'on a toutes les possibilités de remplissage d'une matrice n*n au jeu de Hex, de déterminer lesquelles sont gagnantes (pour le joueur qui joue en premier) et lesquelles sont perdantes.

Le programme "combinaison" (dans la boucle for k...) renvoie la taille de la matrice A qui contient toutes les possibilités sous forme de vecteur. Cette taille est définie de la même manière dans le programme "générer" qui fonctionne parfaitement, donc je ne pense pas qu'il y ait de problème à ce niveau là.

Et le programme "Vainqueur" teste une possibilité et renvoie true ou false pour dire si elle est gagnante ou perdante. Là aussi j'ai testé ce programme plein de fois et même si j'ai du le corriger à plusieurs reprises, cette fois ci je suis à peu près sur qu'il fonctionne correctement.

Bref en fait c'est pas un algorithme très compliqué je trouve, sauf que par exemple même en testant sur un cas extrêmement simple (sur un échiquier 1*1 : le premier joueur pose son pion et a gagné), voici ce que Maple me répond:

debug(trier);trier(1);

trier
{--> enter trier, args = 1

A := [[0]]
W :=
L :=
<-- ERROR in trier (now at top level) = bad index into %1}

Error, (in trier) bad index into Array

(et j'ai la même réponse sur des échiquiers plus grand)

Et en fait même en me renseignant sur internet je suis pas sûr d'avoir compris ce que le message "bad index into array" signifiait, donc là je vois absolument pas ce qui bloque, si ça se trouve c'est un truc très con. :pf:

Du coup si quelqu'un voit où est le problème et pouvait m'aider, ce serait super sympa merci beaucoup! :ange:

J'ai essayé d'être le plus précis possible dans les indications que j'ai donné pour comprendre l'algorithme, mais si vous pensez que je ne l'ai pas été assez, vous pouvez me demander d'autres précisions évidemment.

Squik22
Squik22
Niveau 10
09 avril 2013 à 17:14:54

Déjà il y a une erreur dans mon programme mais il ne faut pas y faire attention : j'avais commencé par faire une version avec des listes nommées V et D (comme victoire et défaite), mais apparemment Maple aime pas qu'on utilise la lettre D donc j'ai voulu changer pour W et L.

...Et forcément j'ai oublié de modifier mon programme à certains endroits et pas à d'autres. Enfin maintenant c'est fait mais ça fonctionne pas plus, donc il faut pas en tenir compte.

Squik22
Squik22
Niveau 10
09 avril 2013 à 19:37:54

Bon, alors... Problème résolu, mais c'est à se taper la tête contre les murs.
J'ai essayé de réécrire le programme en testant un à un les éléments qui fonctionnaient et ceux qui ne marchaient pas, et en quelques minutes je suis arrivé à cette magnifique fontion "trier2":

trier2:=proc(n)
local A,W,L,k ;
A:=generer(n^2);
W:=NULL;
L:=NULL;
for k from 1 to combinaison(floor((n^2)/2),(n^2)) do
if Vainqueur(A[k],n) then
W:=W,A[k];
else L:=L,A[k];
fi;
od;
W:=[W];L:=[L];
W,L;
end proc;

Sauf que... J'ai relu attentivement les deux programmes, et je suis absolument certain que c'est exactement le même que "trier" à la virgule près!!! (sauf pour les 2 dernières lignes, mais j'ai aussi changé ça dans la fonction trier et c'est pas ça qui l'aide à fonctionner en tout cas)

Bref je me retrouve avec deux programmes exactement identiques, mais l'un qui marche et l'autre non.
D'une certaine manière mon problème est résolu mais... Sérieusement? :ouch:

Bon vu qu'en informatique c'est de toute manière l'ordinateur qui a toujours raison, je me doute bien qu'il doit quand même y avoir une erreur quelque part dans la première version. Donc si quelqu'un la voit, je suis curieux de la connaitre parce que ça fait une semaine que je cherche quand même. :(

DN4
DN4
Niveau 7
10 avril 2013 à 06:02:09

:d) if Vainqueur(A[k],n) then V:=V,A[K];

k est différent de K.
Maple est sensible à la case. :hap:

Explication quand même :

K est un symbole n'ayant pas de valeur à proprement dite (puisque c'est une variable que tu n'as pas affectée), si ce n'est le nom de son symbole. Le symbole K est évalué et retourne donc "K". Tu tentes donc d'accéder à l'index "K" de ton tableau A, or ce n'est pas un tableau associatif, donc Maple, avoir remarqué que K n'était ni un chiffre ni un nombre, te fait savoir que t'essayes d'accéder à un index incorrect, autrement dit que la valeur que tu as écrite entre les crochets n'a rien à faire là dans ce contexte.

Concernant la syntaxe de l'erreur renvoyée, à priori le %1 signifie "première variable déclarée dans la procédure", c'est-à-dire le tableau A.

N'hésite pas à utiliser des mots / abréviations pour tes noms de variables, c'est plus clair. :)

godrik
godrik
Niveau 30
10 avril 2013 à 06:17:42

Interessant il y a un autre forumeur qui a travaille sur hex cette annee.

Squik22
Squik22
Niveau 10
10 avril 2013 à 14:42:21

Merci beaucoup DN4, fallait quand même la voir la différence entre k minuscule et majuscule.

Enfin le bon côté des choses c'est que je suis tellement resté bloqué sur ce problème que maintenant ce sera la première chose que je vérifierai. :hap:

Godrik :d) ça m'étonne pas beaucoup en cherchant sur le net j'ai vu que c'était un sujet qui avait déjà été abordé à plusieurs reprises dans les TIPE... C'est mon prof qui m'a conseillé ce sujet parce que j'en trouvais pas. Initialement je voulais continuer mon travail de première année sur le Mastermind, mais il n'était pas d'accord.

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