KCC y veut deux tableaux...et ben il en a qu'un [Resolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

J'suis en train de penser en ecrivant...
C'est peut etre pas la le bleme......

Car le premier tableau il se créé bien niquel, mais c'est apres que l'autre y viens mettre ses gros pingles tout crades dans sa gamelle :?

Donc cela veut dire que la DLL elle donne pas des nouvelles adresses, mais peut etre bien en partie celle du 1er tableau, non ????
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Ou alors ....il faudrait sauvegarder le tableau ailleur avant que la DLL elle revienne pour en remettre une couche :roll:
C'est peut etre aussi que la DLL elle sait pas que y'a un bernard...non pas 13 :lol: , un l'hermite qui viens squatter ses adresses memoires :?
Puisque de ce que je sais, l'exe et la DLL ont chacun leur tables d'allocations !!!

Et elle, elle repose ses valises, en plein dans le premier tableau ....

Enfin bon...c'est juste des "suposages" tout ça... :roll:

Nota bene :J'aurais pu mettre "supositoires"...mais c'est un peu crade...encore plus que les pinglots de la DLL :D
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Kwai chang caine a écrit :Donc cela veut dire que la DLL elle donne pas des nouvelles adresses, mais peut etre bien en partie celle du 1er tableau, non ????
çà c'est bien possible, puisque tu réinitialises le tableau.
Quand tu fais ArrayA() = CallFunction(0, "CreateArray", "a"), ArrayA() va pointer vers de la mémoire allouée par la DLL (les chaînes).

C'est comme la différence entre VarPtr() et StrPtr() en (Visual/Quick)Basic. Pour une chaîne, VarPtr() renvoie l'adresse du pointeur alors que StrPtr() renvoie l'adresse de la chaîne.

Le plus simple c'est de passer les chaînes une par une de la DLL à l'EXE.
Si tu veux vraiment tout passer en un bloc mémoire, il faudrait utiliser des chaînes à longueur fixe.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Ouaaaahhh !! KCC il a peut etre compris quelque chose tout seul 8O :D
Si tu veux vraiment tout passer en un bloc mémoire, il faudrait utiliser des chaînes à longueur fixe.
J'ai un trou la .....(non pas celui la..tout l'monde l'a :oops:)
Non, je me rappelle plus comment on dimensionne un tableau a longueur fixe ??? :roll:

Et aussi, je viens d'avoir une autre idée....
Oulalalal !!! Vrroouu !!! ça tourne le neurone de KCC
Je peux peut etre utiliser la commande SWAP entre les deux appel et comme ça, ça deplace le premier tableau, et elle l'aura dans l'os la DLL pour ecrire dedans...je vais essayer
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message par Cls »

Kwai chang caine a écrit : Non, je me rappelle plus comment on dimensionne un tableau a longueur fixe ??? :roll:

Code : Tout sélectionner

Dim tab.s{50}(50)
Exemple d'un tableau de 51 éléments de 50 caractères chacun (c'est bien ça ?)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bon bah, j'ai fait ça avec la combine de GNOZAL
Je copie les valeurs du premier tableau avant de faire de second appel

C'est mieux que si c'etait pire ....
Si quinquin y dit mieux.....qu'il hesite pas a surencherir :D
La DLL n'a pas changé

Code : Tout sélectionner

Dim Temp.s(0)
OpenLibrary(0,"dll.dll") 

Temp() = CallFunction(0, "CreateArray", "a")
LenTemp = ArraySize(Temp())
Dim ArrayA.s(LenTemp) 

For i = 1 To LenTemp
 ArrayA(i) = Temp(i)
Next

Dim ArrayB.s(0)  
ArrayB() = CallFunction(0, "CreateArray", "b")

For i=1 To ArraySize(ArrayA()) 
 Debug "ArrayA = " + ArrayA(i)
Next 

For i=1 To ArraySize(ArrayB()) 
 Debug "ArrayB = " + ArrayB(i)
Next 
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Cls a écrit :
Kwai chang caine a écrit : Non, je me rappelle plus comment on dimensionne un tableau a longueur fixe ??? :roll:

Code : Tout sélectionner

Dim tab.s{50}(50)
Exemple d'un tableau de 51 éléments de 50 caractères chacun (c'est bien ça ?)
Oui oui merci beaucoup, je vais marquer ça dans mes TEMPLATES, car, faut reconnaitre que l'aide sur les tableaux a plutot la taille d'un timbre poste que d'un tableau

Merci beaucoup CLS 8)
Tu vois quand tu veux que tu peux donner d'autres reponses :lol: :lol: :lol:

Je te souhaite une excelente journée, ainsi que tout ceux qui m'on aidé sur ce POST 8)
Anonyme

Message par Anonyme »

Code : Tout sélectionner

Procedure CreateArray(Char$,NbElement.i)

; On alloue un tableau de pointeur Dim A.s n'est en fait qu'un tableau de pointeur vers des strings
; qui se situe ailleurs en mémoire , car on ne peut pas prévoir à l'avance leur longueur vue quelles 
; ne sont pas fixe.
*Tab = AllocateMemory(NbElement * 4); Tableau de pointeur


For e = 0 To NbElement-1
xx+1
	*String = AllocateMemory(xx+4)
		For f = 1 To xx
			PokeS(*String+(f-1),Mid(Char$,1,1)) ; Mid$ au cas ou len(Char$) > 1
		Next 
		  PokeS(*String+(f-1),Chr(#Null)) ; on ajoute le charactère fin de ligne '\0'
			; on construit notre tableau en lui envoyant les pointeurs *String
			; les uns derrière les autres.
			PokeI(*Tab+(e*4),*String)
Next 

ProcedureReturn *Tab
EndProcedure



Dim TabA.s(0)
TabA() = CreateArray("A",10)

For i = 0 To 9
	Debug TabA(i)
Next 




Debug ""





Dim TabB.s(0)
TabB() = CreateArray("B",10)

For i = 0 To 9
	Debug TabB(i)
Next 
je rentre du boulot à l'instant , voila un code fonctionnel.
t'en apprendra sur les pointeurs avec , j'ai essayer de commenté un peu
pour que tu comprennes les tableaux de strings.


Evite d'utilisé shared dans ta procédure , car admettons dans ma boucle principale , j'ai une variable qui se nomme "passage" , avec une autre valeur , tu risque des plantages. utilise plutot Static , ca permet à la variable de garder sa valeur à l'intérieur d'une procédure sans être accessible de l'extérieure.

@+
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Ouuaaahhh des PIC et des POC...comme si il pleuvait 8O

Super merci CPL 8)
Bon je vais essayer de comprendre ton code et des que j'y suis arrivé...... je reviens pour te tenir au courant :D

Bon ...a l'année prochaine !!!!
:oops:
Anonyme

Message par Anonyme »

C'est pas compliqué.


Voici 2 strings :

Code : Tout sélectionner

A$ = "Ceci est un test pour KCC , c'est relativement simple au final."
B$ = "Coucou"
C'est deux Variables totalement différentes n'ont pas du tout la même taille
A$ Vaut 64 bytes
B$ Vaut 7 bytes
si tu compte Coucou ( 6 caractères ) , j'ai écrit 7 , car on rajoute un #null a la fin pour signalé la fin de chaine.

en Ascii coucou est comme ceci :
67,111,117,99,111,117,#NULL
C'est un fragment de mémoire qui se suit , c'est contigu.
si l'adresse de 67 vaut 0 , #NULL vaut 6.
évidement , une adresse commence jamais à zéro , c'est pour imagé ici.
Imagine donc que la variable B$ à comme adresse mémoire 127356

on en déduis donc que la lettre 'C' de Coucou , est à la même adresse puisque c'est le début de chaîne.
'o' à donc 127356 + 1 comme adresse soit 127357
'u' à donc 127356 + 2 comme adresse
'c' à donc 127356 + 3 comme adresse
'o' à donc 127356 + 4 comme adresse
'u' à donc 127356 + 5 comme adresse
#NULL 'o' à donc 127356 + 6 comme adresse


Tu peut stocker cette adresse dans une variable pour la sauvegardé :

Adresse_de_u = @A$+5

On connais donc sont emplacement dans la mémoire du programme, on peut donc modifié juste le u si on le désire , via pokec() ( écrit 1 byte )

Code : Tout sélectionner

A$ = "Coucou"
Adresse_de_u = @A$+5
PokeC(Adresse_de_u,65) ; 65 = Code Ascii de 'A'
Debug A$
Dans se petit code , on à écrit 1 byte à l'adresse @A$ + 5 soit 127361


Pour en revenir à notre tableau de string , on comprend la difficulté à stocké les données puisque elles ont des tailles variable en mémoire
(A$=7 , B$=64)

Rappel toi de cette variable 'Adresse_de_u' , elle stocke l'adresse d'une partie du mot Coucou dans A$

on aurait pu faire cela aussi

Code : Tout sélectionner

Dim MonTableau.i(2)

MonTableau(0) = @A$
MonTableau(1) = @B$
Mais ce n'est pas un véritable tableau de string au sens strict du terme.


Un tableau de string ne contient pas vraiment les strings , il contient juste des adresses , un peu comme 'Adresse_de_u'


Pour le faire avec des AllocateMemory() , c'est simple , une adresse est stocké sur 4 bytes , si j'ai 2 éléments , mon tableau fera alors 8 bytes
on pourra alors stocker 2 string , du moins les adresses.

Donc , un tableau de strings avec nos premières variable fera 8 bytes , même si les strings sont des romans !
car , je le repète , le tableau ne contient que les adresses !

voici en code

Code : Tout sélectionner

A$ = "Ceci est un test pour KCC , c'est relativement simple au final."
B$ = "Coucou"





Adresse_De_A = @A$
; ou *Adresse_De_A , c'est pareil , c'est des pointeurs...
Adresse_De_B = @B$



MaMemoireTableau = AllocateMemory( 2 * 4) ; 2 element à 4 byte chacun


;On écrit les 4 premier bytes ( l'adresse de A$ )

PokeI(MaMemoireTableau,Adresse_De_A)

; Les 4 suivants , on oublie pas , à la suite de ceux que l'on vient d'écrire ( 4 bytes plus loin )

PokeI(MaMemoireTableau + 4,Adresse_De_B)


; MaMemoireTableau est organisé comme un vrai tableau de string


Dim TAB.s(0)
TAB() = MaMemoireTableau


Debug TAB(0)
Debug TAB(1)


Edit :

MaMemoireTableau est donc une zone CONTIGUE dans la mémoire...

Comme ceci

___4 bytes______4 bytes
[XX XX XX XX] [YY YY YY YY]
___Adresse A____Adresse B
Anonyme

Message par Anonyme »

Autres précisions sur la portée des variables.


Tout ce que tu déclares dans une Procédure est valable uniquement dans cette procédure , la mémoire qu'occupait cette variable est considéré comme "libre" a la fin de la procédure. tu peut donc y avoir accès en dehors , mais la prochaine déclaration de variable / tableau / mémoire peut récrire par dessus !

A l'exception des variables "shared , static" , qui eux ne seront pas libérée en fin de procédure.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Alors la CPL, t'as loupé ta vocation 8O
C'est maitresse que t'aurais du faire :D

Merci pour ces explications plus que détaillées 8)

Bon maintenant que j'ai a peu pres compris comment c'est géré la memoire pour les variables et les tableaux.
Ca m'appelle une autre question

Si j'ai bien compris ton code, tu créé un tableau toi meme.
Tu fait pas confiance a PB :lol:

Donc tu créé une zone mémoire dans laquelle tu pose chaque variable et tu pose chaque adresse de chaque variable dans un autre tableau de pointeur.
Puis tu renvoi l'adresse du tableau de pointeur au sortir de la procedure.

Donc si j'ai pas tout faux et que je peux revenir du coin :oops:
PB y crois que c'est un tableau que tu lui envoi

Donc la premiere question c'est comment y fait PB quand c'est lui qui fait les tableaux pour dire que c'est fini ????
Il met un chr(0) a la fin du tableau de pointeur ???
On peut construire un tableau de string que PB il y voit que du feu ???
On peut utiliser donc ArraySize() apres ????

Et ma seconde question, c'est pourquoi tu rajoute un chr(0) a la fin de chaque chaine

Code : Tout sélectionner

PokeS(*String+(f-1),Chr(#Null)) ; on ajoute le charactère fin de ligne '\0' 
puisque PokeS d'apres FRED il le met deja :roll:
Dieu a écrit :Syntaxe
PokeS(*ZoneMemoire, Texte$ [, Longueur [, Options]])
Description
Ecrit une chaîne de caractères, y comprit son caractère nul de fin de chaîne (0), à l'adresse *ZoneMémoire
Encore merci de ton aide 8)
Anonyme

Message par Anonyme »

Code : Tout sélectionner

Et ma seconde question, c'est pourquoi tu rajoute un chr(0) a la fin de chaque chaine 
Bien vu , c'est une erreur de ma part , par contre , si c'est PokeC , faut le faire.

Donc la premiere question c'est comment y fait PB quand c'est lui qui fait les tableaux pour dire que c'est fini ????
Il met un chr(0) a la fin du tableau de pointeur ???
On peut construire un tableau de string que PB il y voit que du feu ???
On peut utiliser donc ArraySize() apres ????
Tu as tout compris.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Ouaaahhh merci beaucoup CPL.
Avec des profs comme toi, je ne peux que progresser.

Le premier miracle "kiss cool", c'est que je comprenne 8O
Mais le second miracle "Kiss cool", c'est que je m'en rappelle :oops:

Parce que comme les electrons dans un fil electrique....quand y'en rentre un a un bout, y'en a un qui sort immediatement de l'autre coté :?
Esperons que ce soit celui qui me dit tous les jours qu'il faut que je paye ma facture :lol:

Le soucis avec l'informatique, c'est que y'a tellement de domaines differents, que il suffit que tu fasse plus de travail de la memoire PC (par exemple, passer au reseau, au graphisme etc ...) et ben du coup c'est la mienne qui marche plus des que je refait de la gestion memoire au bout de 6 mois ou plus.
C'est pas evident d'avoir comme passion quelque chose qui fait appel constamment, a de l'outillage, que je ne possede pas :oops:

Heureusement, y'a les templates de PB, les codes que je recupere a droite a gauche, les forums et a ma grande honte .....EXCEL :oops:
Des que j'apprend quelque chose je le note.....le probleme c'est que j'ai tellement de choses a apprendre que ça fait des pages et des pages d'Excel......et apres on sait plus bien ou est la reponse et si on l'a :oops:

Enfin bref chacun sa croix :D

Donc pour arreter de parler du sujet que je prefere...C'est a direMOI :oops:

Tu dis que l'on peut berner notre PB en lui faisant croire que c'est un vrai tableau qu'il a construit lui meme avec ses petites mains potelée :D
Je vais donc essayer ça.

Elle est super cool ta combine de AllocateMemory 8)
En plus si j'ai toujours bien compris, y'a pas d'histoire de GLOBAL, SHARED et tout le toutim :?
On y a acces de partout d'une procedure de DLL ou d'EXE, du corp de la DLL ou de l'EXE, du moment qu'on a l'adresse pointeur :roll:

Bon je vais creuser ça aujourd'hui, car il faut que j'essaie de le modifier et l'adapter dans ma DLL, et c'est pas de la "roupie de sansonet" tu peux me croire.....enfin surtout pour moi.

Tiens j'ai appris que MICROSOFT y viens de s'associer a YAHOO pour niquer, enfin essayer de niquer le maitre incontesté et incontestable GOOGLE
J'suis un peu vexé qu'il m'ai pas contacté avant..... :roll:
Quand meme je fait drolement des efforts et je m'ameliore ...quand meme :?

Encore merci de m'avoir et de continuer à me soutenir depuis le debut que je suis sur ce formidable forum et language.
C'est ça les potes de tranchée 8)
Je te souhaite une excelente journée et te tiens au courant :wink:
Anonyme

Message par Anonyme »

que il suffit que tu fasse plus de travail de la memoire PC (par exemple, passer au reseau, au graphisme etc ...)

Non , car c'est utile dans tout les domaines , d'ailleurs je peut pas m'en passé des peek poke , indispensable à mon sens.
j'utilise rarement des Dim().
Tu verras qu'avec le temps cela deviens un automatisme , c'est presque naturel maintenant :)
Répondre