µLua DS - Forum officiel | Official forum Index du Forum

µLua DS - Forum officiel | Official forum
Le bon endroit pour en savoir plus sur MicroLua et pour parler de vos projets ! | The right place to learn more about MicroLua and talk about your projects !

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer   ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Bug de liste

 
Poster un nouveau sujet   Répondre au sujet    µLua DS - Forum officiel | Official forum Index du Forum -> Section française -> Demande d'aide
Sujet précédent :: Sujet suivant  
Auteur Message
bzh0


Hors ligne

Inscrit le: 16 Juil 2012
Messages: 47

MessagePosté le: Sam 6 Avr 2013 - 13:13    Sujet du message: Bug de liste Répondre en citant

Bonjour,

Depuis quelque temps je pensait à écrire un programme de pathfinding.
C'est maintenant chose faite, mais j'ai un bug inexpliqué:
Mon programme fonctionne  de la manière suivante:

Je créé une liste que j’appelle path_I qui prend les valeurs des cases de la map.
Ensuite, j’écris dessus tout les chemins possibles.
Enfin, la fonctionne retourne le chemin le plus court.
Tout fonctionne à merveille, les chiffres retournés sont les bon, mais de manière inexplicable la map dans laquelle je cherche un chemin se transforme... en path_I!

Voici le code:
Code:


--pathfinder by bzh0

function findpath (map,D,A)
 
 local n = 0
 local path_I = map
 local i = 0
 local z = 0
 local N = 0
 
 for z = 1,#map do --localisation des cases traversables 
  for i = 1,#map[z] do
   if map[i][z] == 1 then
    path_I[i][z] = "J"
   else
    path_I[i][z] = "N"
   end
  end
  path_I[D.x][D.y] = 1
 end
 
 
 local path_F = {D}
 local END = false
 
 while not END do 
  i = 0
  z = 0
  n = n+1
     
  for z = 1,#path_I do --recherche des chemins
   for i = 1,#path_I[z] do
    if path_I[A.x][A.y] == n then
     END = true
    elseif path_I[z][i] == n then
     if z>1 and path_I[z-1][i] == "N" then
      path_I[z-1][i] = n+1     
     end
     if i>1 and path_I[z][i-1] == "N" then
      path_I[z][i-1] = n+1
     end
     if z < #path_I and path_I[z+1][i] == "N" then
      path_I[z+1][i] = n+1
     end
     if z < #path_I[z] and path_I[z][i+1] == "N" then
      path_I[z][i+1] = n+1
     end
    end
   end
  end
 
 end

 
 local path_F = {} -- retourne le chemin le plus court 
 i = 0
 local x = A.x
 local y = A.y
 path_F[1] = {x = A.x,y = A.y}
 
 for i = 2,n do  
  n = path_I[x][y]
  if x > 1 and path_I[x-1][y] == n-1 then 
   path_F[i] = {x = x-1,y = y}
   x = x-1
  elseif x < #path_I and path_I[x+1][y] == n-1 then 
   path_F[i] = {x = x+1,y = y}
   x = x+1
  elseif y < #path_I[x] and path_I[x][y+1] == n-1 then 
   path_F[i] = {x = x,y = y+1}
   y = y+1
  elseif y > 1 and path_I[x][y-1] == n-1 then 
   path_F[i] = {x = x,y = y-1}
   y = y-1
  end 
 end 
 
 return path_F
end

function drawmap (Map,size,height)--dessiner la carte à partir d'une liste
 
 
 local i = 0
 local z = 0
 
 for i = 1,#Map do 
  for z = 1,#Map[i] do 
   if Map[i][z] == 0 then
    c = Color.new (31,31,31)
   else
    c = Color.new (31,0,0)
   end
 screen.drawFillRect (0,(i-1)*size,(z-1)*height,i*size,z*height,c)
  end 
 end 
end




et

Code:


dofile ("pathfinding.lua")
map = {{0,1,0},{0,0,0},{0,0,0}}
findpath (map,{x = 1,y = 1},{x = 3,y = 3})
while not Keys.held.Start do 
 Controls.read ()   
 drawlist (map,0,0)
 drawmap (map,20,20)
 render ()
end



_________________
while not humeur.pas_content ("bzh0") do

face ("bzh0"):smile()
render ()

end


Revenir en haut
Publicité






MessagePosté le: Sam 6 Avr 2013 - 13:13    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Thomas99


Hors ligne

Inscrit le: 12 Avr 2012
Messages: 141
Localisation: Le forum.

MessagePosté le: Sam 6 Avr 2013 - 15:15    Sujet du message: Bug de liste Répondre en citant

J'ai regardé rapidement, et je crois que le problème vient de
Code:



local path_I = map



Avec ce code, path_I et map deviennent la même liste. Donc si on en modifie une, l'autre sera aussi modifiée.
Il faut copier la liste : http://lua-users.org/wiki/CopyTable
_________________
Publié : ctrµLua, Candran
A publier : TCPDebugger, FastShell
A finir : µPortal, LLUL, µStore, serveur wifis, microlua.js, d'autres trucs
Mon site \o/


Revenir en haut
Visiter le site web du posteur
bzh0


Hors ligne

Inscrit le: 16 Juil 2012
Messages: 47

MessagePosté le: Sam 6 Avr 2013 - 15:21    Sujet du message: Bug de liste Répondre en citant

Ah merci!
Je ne savais pas que cela créé un deuxième pointeur.
Mais pourquoi ça le fait sur les listes et pas les variables?

Edit:j'ai testé et ça marche avec deepcopy!Merci!
_________________
while not humeur.pas_content ("bzh0") do

face ("bzh0"):smile()
render ()

end


Revenir en haut
Reylak
Administrateur

Hors ligne

Inscrit le: 24 Nov 2008
Messages: 2 838
Localisation: Toulouse

MessagePosté le: Lun 8 Avr 2013 - 19:56    Sujet du message: Bug de liste Répondre en citant

C'est juste la manière de fonctionner de Lua. Au lieu de copier la table, il crée une nouvelle référence vers elle.
_________________


Plein d'infos sur le SourceForge !


Revenir en haut
Visiter le site web du posteur MSN Skype
geeker


Hors ligne

Inscrit le: 23 Déc 2012
Messages: 363

MessagePosté le: Mar 9 Avr 2013 - 16:22    Sujet du message: Bug de liste Répondre en citant

Ahhh c'est pour ça que certain programmes plantaient quand je faisais des modifs de tables ... Mais au mois, on économise de la RAM !
_________________
Beta-testeur de l'extrème
Tox: FFBDC8B34DC3CDE51F8F1CB0A628147DE740ACD1D44682EB5492A681F6541E32E8D8BB6052B3
CtrµLua: ctrulua.github.io
Des p'tits true, des p'tits true, toujours des p'tits true ...


Revenir en haut
Visiter le site web du posteur
thermo_nono
Modérateur

Hors ligne

Inscrit le: 31 Déc 2008
Messages: 2 415
Localisation: La Géhenne

MessagePosté le: Mar 9 Avr 2013 - 18:20    Sujet du message: Bug de liste Répondre en citant

je dois dire que cette particularité m'a aussi beaucoup déconcerté au début, mais bon !... c'est juste un truc à savoir. ^^ 
_________________
“Qui reçoit une idée de moi reçoit de la connaissance sans diminuer la mienne, comme celui qui allume sa chandelle à la mienne reçoit la lumière sans me plonger dans l’obscurité.” - Thomas Jefferson


Revenir en haut
Visiter le site web du posteur MSN
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 03:51    Sujet du message: Bug de liste

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    µLua DS - Forum officiel | Official forum Index du Forum -> Section française -> Demande d'aide Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  

Index | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com