FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Planétarium virtuel.
par Pedro Alvarez Hier à 16:57

» Roues dentées
par jean_debord Hier à 10:40

» Attention arnaque !
par mindstorm Jeu 19 Juil 2018 - 19:18

» Qui fait quoi ?
par silverman Mer 18 Juil 2018 - 15:21

» ITEM_SELECT N,L pour synedit
par silverman Mer 18 Juil 2018 - 15:20

» Boussole
par jean_debord Mer 18 Juil 2018 - 11:06

» Roue à n faces
par Marc Dim 15 Juil 2018 - 22:16

» Exemple d'une nouvelle version d'un GRID
par Jean Claude Ven 13 Juil 2018 - 10:32

» Une simple question
par Oscaribout Sam 7 Juil 2018 - 23:20

» BUG sur l'objet TAB
par Jack Sam 7 Juil 2018 - 21:12

» Monopoly moderne
par jjn4 Sam 7 Juil 2018 - 15:06

» Récapitulatif ludothèque panoramic jjn4
par jjn4 Ven 6 Juil 2018 - 17:41

» Lignes ondulées
par JL35 Ven 6 Juil 2018 - 17:39

» bug off_activate 0 : sans d'effet
par silverman Ven 6 Juil 2018 - 13:02

» Position des objets d'un conteneur dans FBPano et Panoramic
par Navigateur Ven 6 Juil 2018 - 12:59

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juillet 2018
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 incohérence POKE32

Aller en bas 
AuteurMessage
silverman

avatar

Nombre de messages : 659
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: incohérence POKE32   Lun 26 Mar 2018 - 17:20

Bonjour à tous

Contrairement à PEEK32, POKE32 ne supporte pas les nombres négatifs. Il le devrait puisque les variables entières en panoramic sont signées.
Code:
dim a%,b%      
a%=1
poke32 adr(b%),a%      :' écrire 1 dans la mémoire à l'adresse b%
print peek32(adr(b%))  :' montrer le contenu de la mémoire à l'adresse b%
poke32 adr(b%),b%      :' inverser l'ordre des octets pour afficher correctement b%
print b% : print
a%= -1
poke32 adr(b%),a%      :' <--- ERREUR !!!   écrire -1 dans la mémoire à l'adresse b%  
print peek32(adr(b%))  :' montrer le contenu de la mémoire à l'adresse b%
poke32 adr(b%),b%      :' inverser l'ordre des octets pour afficher correctement b%
print b%
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5928
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: incohérence POKE32   Lun 26 Mar 2018 - 17:38

Pour moi, le fait que cela soit signé ou non devrait plutôt être un paramètre car une valeur sur 32 bit n'est pas forcément un entier signé même s'il peut l'être.
La même remarque peut s'appliquer au 64 bits, il faudrait rajouter un paramètre pour préciser la nature de la valeur attendue (signée ou non)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: incohérence POKE32   Lun 26 Mar 2018 - 18:21

Je ne pense pas que ce soit nécessaire. Peek, Poke et se dérivés attendent des adresses, et par nature, une adresse est en nombre non signé de 32 ou 64 bits. En Panoramic, il n'y a que des entiers, et donc, une adresse peut être vue comme un nombre négatif, mais ça reste néanmoins un ordinal non signé sur 32 ou 64 bits. Il faut bien entendu que Panoramic laisse passer ces valeurs - à Windows ensuite de rejeter ou non en cas de violation de mémoire.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jack
Admin
avatar

Nombre de messages : 1868
Date d'inscription : 28/05/2007

MessageSujet: Re: incohérence POKE32   Lun 26 Mar 2018 - 20:15

klaus a écrit:
Peek, Poke et ses dérivés attendent des adresses, et par nature, une adresse est en nombre non signé de 32 ou 64 bits.

Tout est là.
POKE32 d'une adresse de variable n'est qu'un cas particulier de l'utilisation de POKE32.
Ajouter un paramètre pour ce cas particulier irait trop loin.
Pourquoi pas un autre paramètre indiquant qu'on écrit dans la mantisse d'une variable réelle, ou dans son exposant, ou qu'on écrit dans un complément à 2 d'une variable entière négative, etc.

C'est trop compliqué et pas le but de PEEK(), POKE et dérivés.

_________________
username : panoramic@jack-panoramic password : panoramic123
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://panoramic.free-boards.net
silverman

avatar

Nombre de messages : 659
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: Re: incohérence POKE32   Lun 26 Mar 2018 - 22:32

Bien, je comprend. PEEK32 m'a donné des adresses négatives et je comptais sur POKE32 pour régler le pb. Je viens de remarquer que PEEK32 lit les adresses à l'envers d'ou la question suivante:
pourquoi PEEK32 lit les adresses à l'envers?
En fait c'est cette commande qui me pose un pb maintenant... Obtenir l'adresse qui donne accès aux octets qui compose une string n'est pas aisé directement. "a%=PEEK32(adr(machaine$))" ne retourne pas le résultat que j'attendais; je pensais transmettre cette adresse à une dll windows, mais ce n'est compatible, il faut passer par une bidouille Sad
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: incohérence POKE32   Mar 27 Mar 2018 - 0:17

D'après mes tests, Peek32 retourne bien la bonne suite de 4 octets, mais dans l'ordre inversé ! C'est ce qui rend ce résultat inexploitable. Il s'agit ici clairement d'un bug.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Marc

avatar

Nombre de messages : 803
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Re: incohérence POKE32   Mar 27 Mar 2018 - 11:37


Bonjour à tous !

Je viens de lire cet article sur l'organisation des données :

https://fr.wikipedia.org/wiki/Endianness

Très intéressant !

Bonne programmation à tous !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 659
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: Re: incohérence POKE32   Mar 27 Mar 2018 - 12:04

klaus a écrit:
D'après mes tests, Peek32 retourne bien la bonne suite de 4 octets, mais dans l'ordre inversé ! C'est ce qui rend ce résultat inexploitable.

Ouf, ça me rassure! Je l'ai vite remarqué, c'est pour ça que j'utilisais POKE32 pour inverser l'ordre des octets, car cette commande les inverse également.

Un code pour montrer le pb:
Code:
dim a%,b%,i%

' ecrire dans a% la série d'octet : 001 002 003 004
a%=001*power(256,3) + 002*power(256,2) + 003*power(256,1) + 004*power(256,0)
print "a% contient la série d'octet : 001 002 003 004"
' copier a% dans b%
b%=peek32(adr(a%))
print "a% est copié dans b% via la commande PEEK32"
print

print "lecture de a%:"
for i%=3 to 0 step -1
  print peek(adr(a%)+i%);"  ";
next i%

print:print

print "lecture de b%:"
for i%=3 to 0 step -1
  print peek(adr(b%)+i%);"  ";
next i%
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jack
Admin
avatar

Nombre de messages : 1868
Date d'inscription : 28/05/2007

MessageSujet: Re: incohérence POKE32   Mar 27 Mar 2018 - 20:44

silverman a écrit:
a% contient la série d'octet : 001 002 003 004

Eh bien non.

En faisant
Code:
a%=001*power(256,3) + 002*power(256,2) + 003*power(256,1) + 004*power(256,0)
Tu n'écris pas dans a% la série d'octet : 001 002 003 004, mais la série d'octets 004 003 002 001

_________________
username : panoramic@jack-panoramic password : panoramic123
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://panoramic.free-boards.net
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: incohérence POKE32   Mer 28 Mar 2018 - 0:08

Voici la preuve du problème, Jack. Je crée une variable string contenant "ABCD". J'affiche la valeur hexa de peek32(adr(cette variable)). En même temps, j'appelle une fonction DLL en passant adr(cette variable) en paramètre. Je place dans le titre de la form 0 la représentation hexa de adr(cette variable), le contenu du mot pointé par cette adresse (ce qui est l'adresse du début des données de la chaine de caractères), puis le mot pointé par cette adresse (ce qui affiche les 4 premiers caractères en hexa), puis la chaîne elle-même lue par la fonction DLL.

Or, on constate que, alors que la DLL accède parfaitement normalement à la chaîne, la valeur retournée par peek32 donne bien les bons octets, mais dans l'ordre inverse. Et, partant de là, cette valeur n'est pas utilisable comme adresse pour des traitements ultérieurs.

Voici la fonction DLL:
Code:
function TestAdr(hnd: HWND; a: integer):integer; stdcall; export;
var
  i1, i2: integer;
  s: string;
begin
  i1 := pinteger(a)^;
  i2 := pinteger(i1)^;
  s := inttohex(a,8)+'  '+inttohex(i1,8)+'   '+inttohex(i2,8)+'   '+pstring(a)^;
  sendmessage(hnd,WM_SETTEXT,0,integer(@s[1]));
  result := 0;
end;
exports TestAdr;

Et voici le code Panoramic:
Code:
dim MaChaine$, a%, b%, res%
MaChaine$ = "ABCD"
dll_on "KGF.dll"
a% = peek32(adr(MaChaine$))
res% = dll_call2("TestAdr",handle(0),adr(MaChaine$))
display
message "a%="+hex$(a%)
end

Et le résultat:


Compare l'affichage du message Panoramic avec le deuxième nombre hexa affiché dans la barre de titre...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jack
Admin
avatar

Nombre de messages : 1868
Date d'inscription : 28/05/2007

MessageSujet: Re: incohérence POKE32   Dim 8 Avr 2018 - 23:06

@Klaus:
dans la version instantanée V 0.9.28i17, j'ai inversé l'ordre des octets de PEEK16() et PEEK32().

_________________
username : panoramic@jack-panoramic password : panoramic123
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://panoramic.free-boards.net
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: incohérence POKE32   Lun 9 Avr 2018 - 0:41

Super ! Merci !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: incohérence POKE32   

Revenir en haut Aller en bas
 
incohérence POKE32
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: