FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» trop de fichiers en cours
incohérence POKE32 Emptypar Marc Aujourd'hui à 11:42

» Bataille navale SM
incohérence POKE32 Emptypar jjn4 Hier à 17:39

» Une calculatrice en une ligne de programme
incohérence POKE32 Emptypar jean_debord Hier à 8:01

» Gestion d'un système client-serveur.
incohérence POKE32 Emptypar Pedro Jeu 25 Avr 2024 - 19:31

» Les maths du crocodile
incohérence POKE32 Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
incohérence POKE32 Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
incohérence POKE32 Emptypar Froggy One Mer 24 Avr 2024 - 18:38

» Dessine-moi une galaxie
incohérence POKE32 Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
incohérence POKE32 Emptypar jjn4 Lun 22 Avr 2024 - 13:43

» Bug sur DIM_LOCAL ?
incohérence POKE32 Emptypar papydall Dim 21 Avr 2024 - 23:30

» Form
incohérence POKE32 Emptypar leclode Dim 21 Avr 2024 - 18:09

» 2D_fill_color(résolu)
incohérence POKE32 Emptypar leclode Sam 20 Avr 2024 - 8:32

» Consommation gaz électricité
incohérence POKE32 Emptypar leclode Mer 17 Avr 2024 - 11:07

» on_key_down (résolu)
incohérence POKE32 Emptypar leclode Mar 16 Avr 2024 - 11:01

» Sous-programme(résolu)
incohérence POKE32 Emptypar jjn4 Jeu 4 Avr 2024 - 14:42

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Avril 2024
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
2930     
CalendrierCalendrier
Le deal à ne pas rater :
Funko POP! Jumbo One Piece Kaido Dragon Form : où l’acheter ?
Voir le deal

 

 incohérence POKE32

Aller en bas 
5 participants
AuteurMessage
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

incohérence POKE32 Empty
MessageSujet: incohérence POKE32   incohérence POKE32 EmptyLun 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
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyLun 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
Klaus

Klaus


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

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyLun 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
http://klauspanoramic.comxa.com/index.html
Jack
Admin
Jack


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

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyLun 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.

_________________
incohérence POKE32 Webdav username : panoramic@jack-panoramic password : panoramic123
Revenir en haut Aller en bas
https://panoramic.1fr1.net
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyLun 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
Klaus

Klaus


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

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyMar 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
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2380
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyMar 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
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyMar 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
Jack
Admin
Jack


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

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyMar 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

_________________
incohérence POKE32 Webdav username : panoramic@jack-panoramic password : panoramic123
Revenir en haut Aller en bas
https://panoramic.1fr1.net
Klaus

Klaus


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

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyMer 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:
incohérence POKE32 Aa159

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


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

incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 EmptyDim 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().

_________________
incohérence POKE32 Webdav username : panoramic@jack-panoramic password : panoramic123
Revenir en haut Aller en bas
https://panoramic.1fr1.net
Klaus

Klaus


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

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

Super ! Merci !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





incohérence POKE32 Empty
MessageSujet: Re: incohérence POKE32   incohérence POKE32 Empty

Revenir en haut Aller en bas
 
incohérence POKE32
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» bug : PEEK32/POKE32 inverse l'ordre des octets

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: