Page 1 sur 2

Contrefaçon..ou plutot "copie de tableau" [résolu]

Publié : mer. 07/janv./2009 15:28
par Kwai chang caine
Boujour la famille :D

Decidement ces tableaux, j'peux meme pas les voir en peinture :?

Ooouuuuiinn !!! j'arrive pas à copier ce tableau dans l'autre :cry:

Code : Tout sélectionner

Procedure LeTablo()
 
 Dim Tablo.s(30)
 Tablo(0) = " "
 
 For i = 1 To 5  
  Tablo(i) = Str(i)
 Next
 
 ProcedureReturn @Tablo()
 
EndProcedure
 
Dim NouveauTablo.s(30)
NouveauTablo() = LeTablo()

Debug NouveauTablo(1)
Debug NouveauTablo(2)
Et un truc encore plus dingue (Enfin pour moi evidemment :oops:)
Si on remplace les str(i) par un texte ça marche 8O

Code : Tout sélectionner

Procedure LeTablo()
 
 Dim Tablo.s(30)
 Tablo(0) = " "
 
 For i = 1 To 5  
  Tablo(i) = "Kcc"
 Next
 
 ProcedureReturn @Tablo()
 
EndProcedure
 
Dim NouveauTablo.s(30)
NouveauTablo() = LeTablo()

Debug NouveauTablo(1)
Debug NouveauTablo(2)
Mais alors la.......cerise sur la merguez
Ca marche encore plus quand le debug est dans une autre procedure :?
Ca fait 2 heure que je rame à savoir pourquoi ce #%*£$¤^ de tableau y veut pas rentrer dans mon coffre :?

Code : Tout sélectionner

Procedure LeTablo()
 
 Dim Tablo.s(30)
 Tablo(0) = " "
 
 For i = 1 To 5  
  Tablo(i) = "Kcc"
 Next
 
 ProcedureReturn @Tablo()
 
EndProcedure

Procedure Essai() 
 
 Dim NouveauTablo.s(30)
 NouveauTablo() = LeTablo()
 Debug NouveauTablo(1)
 Debug NouveauTablo(2)
 
EndProcedure

Essai()
Si y'a "quinquin" qui comprend, qu'il hésite pas à me jeter un de ses nombreux neurones en trop :cry:

Merci et bonne journée

Publié : mer. 07/janv./2009 15:40
par Anonyme
Bizarre , faudrait testé avec la 4.2 , ca devrais fonctionné.

sinon :

Code : Tout sélectionner

Procedure CopyDim(Array  Src.s(1), Array Dst.s(1))
Dst() = Src()
EndProcedure


Dim A.s(5)
A(0) = "Kcc0"
A(1) = "Kcc1"
A(2) = "Kcc2"
A(3) = "Kcc3"
A(4) = "Kcc4"
A(5) = "Kcc5"

Dim B.s(5)
CopyDim(A(),B())

Debug B(5)

Publié : mer. 07/janv./2009 16:02
par zaphod
Salut,

on peut faire aussi :

Code : Tout sélectionner

Procedure LeTablo(Array tablo.s(1)) 
  
 ;Dim Tablo.s(30) 
 ;Tablo(0) = " " 
  
 For i = 1 To 5  
  Tablo(i) = Str(i) 
 Next 
  
 ;ProcedureReturn @Tablo() 
  
EndProcedure 
  
 Dim NouveauTablo.s(30) 
;NouveauTablo() = LeTablo() 
letablo(nouveautablo())
;
Debug NouveauTablo(1) 
Debug NouveauTablo(2)

Je sais pas si c'est vraiment ce que tu cherches.

Zaphod

Publié : mer. 07/janv./2009 16:27
par comtois
Cpl.Bator a écrit :Bizarre , faudrait testé avec la 4.2 , ca devrais fonctionné.

sinon :

Code : Tout sélectionner

Procedure CopyDim(Array  Src.s(1), Array Dst.s(1))
Dst() = Src()
EndProcedure


Dim A.s(5)
A(0) = "Kcc0"
A(1) = "Kcc1"
A(2) = "Kcc2"
A(3) = "Kcc3"
A(4) = "Kcc4"
A(5) = "Kcc5"

Dim B.s(5)
CopyDim(A(),B())

Debug B(5)
Non ça ne fonctionne pas, il faut faire un copymemory() s'il n'y a pas de chaine ou si les chaines sont fixes , sinon recopier champ par champ.

Code : Tout sélectionner

Procedure CopyDim(Array  Src.s(1), Array Dst.s(1))
Dst() = Src()
EndProcedure


Dim A.s(5)
A(0) = "Kcc0"
A(1) = "Kcc1"
A(2) = "Kcc2"
A(3) = "Kcc3"
A(4) = "Kcc4"
A(5) = "Kcc5"

Dim B.s(5)
CopyDim(A(),B())

A(5)="GLOUPS"

Debug B(5)
Exemple avec chaine fixe

Code : Tout sélectionner

Dim Tablo.s{5}(30)
Tablo(0) = " "
 
For i = 1 To 5 
 Tablo(i) = Str(i)
Next

Dim NouveauTablo.s{5}(30)

CopyMemory(Tablo(),NouveauTablo(),ArraySize(NouveauTablo()))


Tablo(1)="GLOUPS"
Debug NouveauTablo(1)
Debug NouveauTablo(2)

Publié : mer. 07/janv./2009 16:46
par Kwai chang caine
Merci à tous les copains

En fait, j'avais tout installé la table de camping avec le gobelet en plastique et la fleur dedans
Et quand j'me suis mis à table, y'avais rien dans l'assiette :cry:

J'ai pas compris pourquoi, y'a rien dans mon debug sur ce code 8O

Code n°1

Code : Tout sélectionner

Procedure LeTablo() 
  
 Dim Tablo.s(30) 
 Tablo(0) = " " 
  
 For i = 1 To 5  
  Tablo(i) = "Kcc" 
 Next 
  
 ProcedureReturn @Tablo() 
  
EndProcedure 

Procedure Essai() 
  
 Dim NouveauTablo.s(30) 
 NouveauTablo() = LeTablo() 
 Debug NouveauTablo(1) 
 Debug NouveauTablo(2) 
  
EndProcedure 

Essai()
Quand on sort le debug de la procedure Essai() ça marche et quand il est dedans non 8O
Enfin pour etre plus precis quand on supprime la procedure Essai et qu'on sort dehors tout ce qui est dedans ça marche, truc de ouf !!!!

Par contre je viens d''essayer le code ZAPHOD en le mettant dans la procedure Essai et la ça marche, normal parce que de ce que j'ai compris avec cette nouvelle fonction on envois le tableau en reference et on le modifie dans la premiere procedure et il reviens tout plein tout neuf, et la peau du ventre bien tendu, merci petit ....... :D

Code n°2

Code : Tout sélectionner

Procedure LeTablo(Array tablo.s(1)) 
   
 For i = 1 To 5  
  Tablo(i) = Str(i) 
 Next 
     
EndProcedure 
 
Procedure Essai() 

 Dim NouveauTablo.s(30) 
 LeTablo(nouveautablo()) 
  
 Debug NouveauTablo(1) 
 Debug NouveauTablo(2) 
 
EndProcedure

Essai() 
Mais pourquoi le code n° 1 y marche pas :cry:

Publié : mer. 07/janv./2009 17:42
par Kwai chang caine
@CPL
Ce qui est fou, c'est que ton code aussi plante, si je le met dans la procedure Essai 8O

Code : Tout sélectionner

Procedure CopyDim(Array  Src.s(1), Array Dst.s(1)) 
Dst() = Src() 
EndProcedure 

Procedure Essai()

 Dim A.s(5) 
 A(0) = "Kcc0" 
 A(1) = "Kcc1" 
 A(2) = "Kcc2" 
 A(3) = "Kcc3" 
 A(4) = "Kcc4" 
 A(5) = "Kcc5" 
 
 Dim B.s(5) 
 CopyDim(A(),B()) 
 
 Debug B(5)
 
EndProcedure

Essai() 

Publié : mer. 07/janv./2009 18:10
par Anonyme
Static Dim ?



@Comtois , un tableau de string fixe n'est pas indexé pareil qu'un tableau de string variable.

Pour un tableau normal de string , le tableau n'est qu'en fait qu'une serie de pointeur.

Tab.s(5)

;-DEBUT DU TABLEAU A L'ADRESSE X
Tab(0) ; Adresse X+4 contient un pointeur vers le string
Tab(1) ; Adresse X+8 contient un pointeur vers le string
Tab(2) ; Adresse X+12 contient un pointeur vers le string
Tab(3) ; Adresse X+16 contient un pointeur vers le string
etc...

Code : Tout sélectionner

 Dim A.s(5)
 A(0) = "Kcc0"
 A(1) = "Kcc1"
 A(2) = "Kcc2"
 A(3) = "Kcc3"
 A(4) = "Kcc4"
 A(5) = "Kcc5"
 


Adressedutablo = @A()
Debug "C'est pas le premier element : "+PeekS(Adressedutablo) 
Debug "Mais une adresse : " +Str(Adressedutablo)

Debug ""

For i = 0 To 5
Debug PeekS(PeekL(Adressedutablo+ (i * 4) ) )
Next 

Debug ""


Dim B.s{5}(5)

 B(0) = "Kcc00"
 B(1) = "Kcc11"
 B(2) = "Kcc22"
 B(3) = "Kcc33"
 B(4) = "Kcc44"
 B(5) = "Kcc55"
 
 Adressedutablo = @B()
 Debug "Pas pareil en string fixe : "+PeekS(Adressedutablo) 

Publié : mer. 07/janv./2009 20:01
par Anonyme2
Comme le dis Cpl.Bator, tu déclares ton tableau static ou global dans la procedure essai() et ça marche, mais franchement, je ne sais pas pourquoi, peut être du fait du passage du paramètre tableau qui n'est pas identique en global ou local (?)

Publié : jeu. 08/janv./2009 9:15
par Kwai chang caine
Merci à tous les deux.
C'est vrai ça marche en static 8)
En global, je me doutais, car ce qui est global est partout dans le programme.
Mais pour une fois, je voulais essayer de programmer un peu comme les vrais :oops:
Et je lis souvent que les globales, quand on peut éviter faut le faire.
Alors voila, "j'm'ai" dit : "KCC 2009 est l'année ou tu va arreter de programmer comme une bouse mal digérée". :?

Et la pof !!! pas de retour dans ma procedure :cry:

Bon impecable, merci à tous les freres :D et tanpis y'a pas de soeurs :roll:
Grace à vous, j'ai deux codes qui marchent.

1/ Mon code avec STATIC

2/ Le code de ZAPHOD qui propose au tableau "d'aller se faire remplir dans la maison d'en face" et de revenir le ventre rond et ça marche. :D

En attendant, on voit bien que les mentalités évoluent..... :roll:
Parce que y'a quelques années, et ben, celle qui allait se faire remplir dans la maison d'en face, et qui revenait le ventre rond......ouille ouille ouille....ça marchait pas si bien que ça :lol:

Encore merci et à bientot malheureusement pour vous, pour des nouvelles aventures de KCC au pays de la prog :D

Publié : jeu. 08/janv./2009 12:31
par Kwai chang caine
Ben, je croyais en avoir fini avec le trafic de faux tableaux :?
Mais, que néni néni....

Je n'arrive pas à mettre le code de ZAPHOD dans une DLL :cry:
J'envoie bien l'adresse du tablo, mais dans la DLL il ne recupere rien = "0"
Le pense que ce ne doit pas etre l'adresse tu tableau qu'il faut envoyer, alors j'ai aussi essayé d'envoyer le tableau, et rien non plus :cry:

Code : Tout sélectionner

CallFunction(0, "ListeDll", Essai())
ou

Code : Tout sélectionner

CallFunction(0, "ListeDll", Essai(0))
ou

Code : Tout sélectionner

CallFunction(0, "ListeDll", Essai(1))
Code de la DLL

Code : Tout sélectionner

ProcedureDLL ListeDll(Array Tablo.s(1))
 
 MessageRequester("Essai", Str(@Tablo()))
 x = 0 
 x+1:Tablo(x) = UCase("J'aime")
 x+1:Tablo(x) = UCase("les ")
 x+1:Tablo(x) = UCase("bananes")
 x+1:Tablo(x) = UCase("parceque ya")
 x+1:Tablo(x) = UCase("pas ")
 x+1:Tablo(x) = UCase("d'os")
 x+1:Tablo(x) = UCase("dedans")
 
EndProcedure
Code de l'EXE

Code : Tout sélectionner

Dim Essai.s(30)

OpenLibrary(0, "c:\dll.dll")
Debug @Essai()

CallFunction(0, "ListeDll", @Essai())
 
For i = 1 To 10
 Debug Essai(i)
Next 
 
CloseLibrary(0)

Publié : jeu. 08/janv./2009 13:10
par Cls
Je ne crains que ce soit un tout petit peu plus compliqué (mais pas beaucoup ;)).

Les zones mémoires ne sont pas communes à tous les programmes. Chaque exe ou dll a son propre espace afin que 2 codes ne se marchent pas sur les pieds. Tu peux néanmoins créer des zones communes à plusieurs programmes, ceci dans le but de s'échanger des informations.

Voilà le topic qui en parle : http://www.purebasic.fr/french/viewtopi ... viewoffile

En utilisant ce principe, tu peux dire à ta DLL de copier ton tableau dans cette zone et récupérer la copie de ce tableau via la même zone.

Bon par contre, il y a peut être une solution plus simple à ce problème. :roll: (Ou peut être que je me goure complètement ! :oops:)

Publié : jeu. 08/janv./2009 13:26
par Kwai chang caine
Merci CLS de ta reponse.
Tu veux donc dire que la fonction ARRAY ne fonctionne que parce que le tableau est dans le meme programme :roll:

Tu as surement raison car j'ai testé ce code et je reçois bien une adresse.
Ce qui voudrais dire que ça ne marche pas avec les DLL comme tu le dit

Je vais essayer de poser cette question sur le forum US pour voir ce qu'ils en disent, parce que entre cette histoire de STATIC et ça c'est drolement compliqué les tableaux qui se promenent :?

Code : Tout sélectionner

ProcedureDLL ListeDll(Array Tablo.s(1))
 
 MessageRequester("Essai", Str(@Tablo()))
 x = 0 
 x+1:Tablo(x) = UCase("J'aime")
 x+1:Tablo(x) = UCase("les ")
 x+1:Tablo(x) = UCase("bananes")
 x+1:Tablo(x) = UCase("parceque ya")
 x+1:Tablo(x) = UCase("pas ")
 x+1:Tablo(x) = UCase("d'os")
 x+1:Tablo(x) = UCase("dedans")
 
EndProcedure

Dim Essai.s(30)
ListeDll(Essai()) 

For i = 1 To 10
 Debug Essai(i)
Next 
 

Publié : jeu. 08/janv./2009 13:38
par gnozal
Denis a écrit :Comme le dis Cpl.Bator, tu déclares ton tableau static ou global dans la procedure essai() et ça marche, mais franchement, je ne sais pas pourquoi, peut être du fait du passage du paramètre tableau qui n'est pas identique en global ou local (?)
Il me semble que les variables locales (déclarées dans une procédure) sont stockées sur la pile, ce qui n'est pas le cas des variables GLOBAL/STATIC/SHARED qui sont stockées en mémoire

Publié : jeu. 08/janv./2009 13:49
par Kwai chang caine
Merci GNOZAL 8)
Depuis des années que j'entend parler de cette pile, faudra que j'me penche dessus un jour, parce que les miennes y'a longtemps que j'aurais du les changer :lol:

Qu'en pense tu de cette histoire de ne pas pouvoir utiliser le code de ZAPHOD dans une procedure (Quelques POST plus haut??)
Je suis en train de pôser la question sur le US, mais je t'aime encore plus quand tu parle le molierien que le shakespearien :D
Comment ferais tu toi pour inserer ce code dans une DLL ??? :roll:
Parce que la ça marche pas :cry:
CLS me propose un partage de memoire, mais y'a pas moyen d'envoyer le tableau a la DLL ???

Code de la DLL

Code : Tout sélectionner

ProcedureDLL ListeDll(Array Tablo.s(1))
 
 MessageRequester("Essai", Str(@Tablo()))
 x = 0 
 x+1:Tablo(x) = "J'aime"
 x+1:Tablo(x) = "les "
 x+1:Tablo(x) = "bananes"
 x+1:Tablo(x) = "parceque ya"
 x+1:Tablo(x) = "pas "
 x+1:Tablo(x) = "d'os"
 x+1:Tablo(x) = "dedans"
 
EndProcedure
Code de l'EXE

Code : Tout sélectionner

Dim Essai.s(30)

OpenLibrary(0, "c:\dll.dll")
Debug @Essai()

CallFunction(0, "ListeDll", @Essai())
 
For i = 1 To 10
 Debug Essai(i)
Next 
 
CloseLibrary(0)

Publié : jeu. 08/janv./2009 14:00
par Cls
Voilà une petit exemple. J'ai repris le code de Nico pour ça. Attention je suis au boulot et je n'ai pas encore installé la 4.30, donc c'est compatible 4.20 jusqu'à ce soir ;)

Code : Tout sélectionner

Enumeration
  #Window
  #StringGadget
  #BOUTON
EndEnumeration
 
If OpenWindow(#Window,0,0,160,160,"Mapping Envoie",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CreateGadgetList(WindowID(#Window))
  ButtonGadget(#BOUTON, 10, 90, 100, 20, "Envoyer")
 
  MemoirePartagee=CreateFileMapping_($FFFFFFFF,#Null, #PAGE_READWRITE, 0, 10000,"Mapping")
  VueDonnees=MapViewOfFile_(MemoirePartagee, #FILE_MAP_WRITE, 0, 0, 0)

  Repeat
    EventID.l=WaitWindowEvent()
    Select EventID
     
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #BOUTON
            
            If OpenLibrary(0, "c:\dll.dll") 
            
              CallFunction(0, "ListeDll") 
              
              Debug PeekS(VueDonnees)
               
              CloseLibrary(0)
            EndIf
            
        EndSelect
       
      Case #WM_CLOSE
        Quit=1
    EndSelect
  Until Quit=1
EndIf
Et la DLL :

Code : Tout sélectionner

ProcedureDLL ListeDll()
 
 MemoirePartagee = CreateFileMapping_($FFFFFFFF,#Null, #PAGE_READWRITE, 0, 10000,"Mapping")
 VueDonnees = MapViewOfFile_(MemoirePartagee, #FILE_MAP_WRITE, 0, 0, 0)
 
 PokeS(VueDonnees, "J'aime les bananes !")
 
EndProcedure
Je ferais un truc plus complet plus tard, je dois travailler un peu ;)

Edit : Oui il y a certainement moyen d'envoyer le tableau à la DLL