[AIDE PUREBASIC] Mises à jour.

Informations pour bien débuter en PureBasic
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: [AIDE PUREBASIC] Mises à jour.

Message par Marc56 »

Une petite coquille trouvée par hasard dans les exemples sur les fonctions Loc(), Lof() etc

Fichiers = OpenFileRequester(...

en v.o on a

File$ = OpenFileRequester(

(sans doute 's' à la place de '$') :?:

Donc les exemples ne fonctionnent pas car 'OpenFileRequester' doit normalement retourner une chaine.

:wink:
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [AIDE PUREBASIC] Mises à jour.

Message par Mesa »

Corrigé.

Vous pouvez télécharger l'aide mise à jour ici
http://frazier.wood.free.fr/chm/PureBasic531.rar

M.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [AIDE PUREBASIC] Mises à jour.

Message par Ollivier »

Bonjour Mesa,

je pense qu'il faut modifier la doc pour la commande Newmap. Il est indiqué une chose actuellement fausse sur l'efficacité du paramètre optionnel 'slots'.

"Plus il y a de slots en interne, plus l'accès à un élément sera rapide, [...]"

Pour l'instant, c'est l'inverse qui se produit...
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [AIDE PUREBASIC] Mises à jour.

Message par Mesa »

@Ollivier
"Plus il y a de slots en interne, plus l'accès à un élément sera rapide, [...]"

Pour l'instant, c'est l'inverse qui se produit...
Les tests que j'ai fait sont conformes à la doc.

Fait plusieurs fois ok avec le code ci-dessous:

Code : Tout sélectionner

n=1
slot=n*512

Global t.L, TimeDebut.q, TimeFin.q
Structure Employe
		Prenom.s
		Nom.s
		Age.L
EndStructure
Structure Service
		Map Employe.Employe()
EndStructure
Structure Societe
		Map Service.Service()
	EndStructure
	
	Repeat
Global NewMap Societe.Societe(slot)
TimeDebut = ElapsedMilliseconds()
For t=1 To 200000
		Define *a.Employe = AddMapElement(Societe("PureBasic"+Str(t))\Service("Commercial"+Str(t))\Employe(), "Reference"+Str(t))
		With *a
			\Prenom = "Pierre "+Str(t)
			\Nom = "Dupond"
			\Age = 28
		EndWith
Next
Global Controle.s = "Prénom du commercial Reference9999 : "+Societe("PureBasic9999")\Service("Commercial9999")\Employe("Reference9999")\Prenom + Chr(10)
TimeFin = ElapsedMilliseconds()
MessageRequester("Nombre de SLOT= "+ Str(slot), Controle + Str( TimeFin - TimeDebut ) + " ms", #MB_OK)
n=n*10
slot=n*512
FreeMap(Societe())

Until n > 100000
Avec mon petit ordi, je passe de 11 secondes avec 512 slots (par défaut) à 2,9 secondes avec 51 200 000 slots.

T'aurais un code à me donner stp ?

M.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [AIDE PUREBASIC] Mises à jour.

Message par Ollivier »

Bonjour Mesa,

merci pour ta rapidité de réponse tout d'abord, et, merci aussi pour ta participation concernant la documentation, ensuite.

J'ai un code effectivement, en espérant qu'il ne soit pas bugué, donc inéquitable.

Les maps I() et I2() sont testées durant le tracé de dessin. Deux valeurs divergentes en millisecondes en haut à gauche de l'écran. Et c'est défavorable pour la map qui a $FFFFFF au lieu de 512 en argument de création:

Code : Tout sélectionner

 #AuPif = #PB_Any
Macro Qt:"
EndMacro
Macro _(Method, Arg = )
I(Qt#Method(Arg#)Qt) = Method(Arg)
EndMacro
Macro _2(Method, Arg1, Arg2)
I(Qt#Method(Arg1#)Qt) = Method(Arg1, Arg2)
EndMacro
Macro _3(Method, Arg1, Arg2, Arg3)
I(Qt#Method(Arg1#)Qt) = Method(Arg1, Arg2, Arg3)
EndMacro
Macro _4(Method, Arg1, Arg2, Arg3, Arg4)
I(Qt#Method(Arg1#)Qt) = Method(Arg1, Arg2, Arg3, Arg4)
EndMacro
Macro _5(Method, Arg1, Arg2, Arg3, Arg4, Arg5)
I(Qt#Method(Arg1#)Qt) = Method(Arg1, Arg2, Arg3, Arg4, Arg5)
EndMacro
Macro _6(Method, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)
I(Qt#Method(Arg1#)Qt) = Method(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)
EndMacro
Macro _7(Method, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)
I(Qt#Method(Arg1#)Qt) = Method(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)
EndMacro
Macro _8(Method, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)
I(Qt#Method(Arg1#)Qt) = Method(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)
EndMacro
Macro Alloue:Allocate
EndMacro
Macro Memoire:Memory
EndMacro
Macro Initialise:Init
EndMacro
Macro Lutin:Sprite
EndMacro
Macro Clavier:Keyboard
EndMacro
Macro Souris:Mouse
EndMacro
Macro Bureau:Desktop
EndMacro
Macro Largeur:Width
EndMacro
Macro Hauteur:Height
EndMacro
Macro Profondeur:Depth
EndMacro
Macro Ouvre:Open
EndMacro
Macro Fenetre:Window
EndMacro
Macro Fenetree:Windowed
EndMacro
Macro Ecran:Screen
EndMacro
Macro Efface:Clear
EndMacro
Macro Charge:Load
EndMacro
Macro Police:Font
EndMacro
Macro Echange:Flip
EndMacro
Macro Tampon:Buffer
EndMacro





Global.I NewMap I()
Global.S NewMap S()
Global.I NewMap I2($1000000)
Global.S NewMap S2($1000000)



_(Alloue#Memoire, 32768)

	_(Initialise#Lutin)
		_(Initialise#Clavier)
		_(Initialise#Souris)

		_(Examine#Bureau#s)

			_(Bureau#Largeur, 0)
			_(Bureau#Hauteur, 0)
			_(Bureau#Profondeur, 0)

		_7(Ouvre#Fenetre, #AuPif, 0, 0, I("DesktopWidth(0)"), I("DesktopHeight(0)"), "", #PB_Window_BorderLess)

		FenetreID = WindowID(I("OpenWindow(#AuPif)") )
		_8(Ouvre#Fenetree#Ecran, FenetreID, 0, 0, 320, 240, 1, 0, 0)
		_3(Charge#Police, #AuPif, "FixedSys", 15)

		For A = 1 To 255
			CreateImage(A, 16, 16, 32)
			s = 16
			CreateSprite(A, s, s, #PB_Sprite_AlphaBlending)
			StartDrawing(ImageOutput(A) )
				DrawingFont(FontID(I("LoadFont(#AuPif)") ) )
				DrawText(0, 0, Chr(A), RGBA(255, 255, 255, 255), RGBA(0, 0, 0, 0) )
			StopDrawing()
			ResizeImage(A, s, s, #PB_Image_Raw)
			StartDrawing(SpriteOutput(A) )
				DrawImage(ImageID(A), 0, 0)
			StopDrawing()
		Next
CopyMap(I(), I2() )
Repeat
	Delay(16)
	ExamineKeyboard()
	ExamineMouse()
	Efface#Ecran(0)
	StartDrawing(ScreenOutput() )
		DrawingFont(FontID(I("LoadFont(#AuPif)") ) )
		Y = 0
		Lap0 = ElapsedMilliseconds()
		ForEach I()
			 DrawText(0, 16 * Y, MapKey(I() ) + " -> " + I(), $FFFFFF, $0)
			 Y + 1
		Next
		Lap1 = ElapsedMilliseconds()
		ForEach I2()
			 DrawText(0, 16 * Y, MapKey(I2() ) + " -> " + I2(), $FFFFFF, $0)
			 Y + 1
		Next
		Lap2 = ElapsedMilliseconds()

		DrawText(0, 0, Str(Lap1 - Lap0) + "ms ")
		DrawText(0, 16, Str(Lap2 - Lap1) + "ms ")

	StopDrawing()
	;DisplaySprite(65, 0, 0)
	Echange#Tampon#s()
Until KeyboardPushed(#PB_Key_Escape)
 
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [AIDE PUREBASIC] Mises à jour.

Message par Ollivier »

En étudiant ton code et mon code, Fred voit forcément le problème sainement.

C'est le "ForEach" qui merde quand on tente avec les maps l'équivalent comparatif de ramasser un grain de poussière avec une pelle de 27 tonnes.

Je me risque à penser que le problème expliqué par Erix14 est lié à cela.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [AIDE PUREBASIC] Mises à jour.

Message par Ollivier »

Cher Mesa,

Le Foreach 100 fois plus lent n'est pas considéré comme un bug.

Donc je te présente mon mea culpa.

J'ai tenté d'exécuter ton code.

L'ordinateur s'essouffle péniblement un quart d'heure puis disjoncte totalement.
Ce n'est pas grave. C'est de la fièvre.

Théoriquement, il est capable de l'exécuter en deux minutes environ. Là, il ne le fait pas du tout, mais ce n'est pas un bug.

J'espère qu'il n'y a pas que la commande Newmap pour modifier les slots.

En tout cas, merci pour ces précisions. J'ignorais que Newmap pouvait se balader dans un boucle...
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [AIDE PUREBASIC] Mises à jour.

Message par Mesa »

Ok, pas de problème.

M.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [AIDE PUREBASIC] Mises à jour.

Message par blendman »

dans la doc, il faudrait préciser quelque chose pour RGBA() (sans doute vrai aussi pour RGB())
Comtois a précisé :
attention au type des variables utilisées pour contenir la couleur (les nombres sont signés). Utiliser un quad pour être compatible en x86 et x64 (ou un integer si on compile en x64)
Il faut un masque sinon les comparaisons seront faussées :

a.q = RGBA(255,255,255,255) & $FFFFFFFF
Debug a
b.q = RGBA(255,255,255,255)
Debug b
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [AIDE PUREBASIC] Mises à jour.

Message par Mesa »

@Blendman

Plusieurs choses me paraissent bizarres:
(les nombres sont signés)
D'après la doc, de toutes façon, toutes les variables PB de 32 bits et plus sont signées.

Toujours dans la doc, dans "Règles de syntaxe générales", on peut lire: "- La valeur renvoyée par les commandes est le plus souvent un Integer. Dans le cas contraire, le type de la valeur est indiqué dans la description (ligne de syntaxe) de la commande. "

or dans la bibliothèque 2D, on a :
Couleur = RGB(Rouge, Vert, Bleu)
Couleur = RGBA(Rouge, Vert, Bleu, Alpha)
idem dans la doc anglaise.
Donc ces deux fonctions doivent renvoyer un integer.
Il n'est donc pas nécessaire d'utiliser un quad.

Il faut juste se rappeler que sous un OS 32bits, un integer vaut 32 bits alors que sous un OS 64 bits, un integer vaut 64 bits. (voir: "Variables, Types et Opérateurs")

Sauf erreur, en utilisant un LONG qui fait 32 bits que ce soit sur un OS 32 ou un OS 64 bits, il ne devrait pas y avoir de problème et en plus, on économise de la mémoire.

Je vais demander conseil à Fred pour plus d'info.

M.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [AIDE PUREBASIC] Mises à jour.

Message par comtois »

l'inconvénient d'un long ou d'un integer en x86 c'est la plage d'utilisation :
-2 147 483 648 to +2 147 483 647

Alors que la valeur de RGBA(255,255,255,255) est 4 294 967 295
pour contenir cette valeur il n'y a que le quad ou l'integer en x64.

En clair, il faudrait préciser dans la doc que la valeur retournée est un quad pour RGBA. C'est le seul type qui fonctionne en x86 et x64 (et encore à condition de masquer la valeur si on a besoin de faire des tests par encadrement : If Couleur>x and Couleur<x+100)

Après est-ce nécessaire de surcharger la doc pour expliquer ça ? je n'en suis pas sûr, à toi de voir :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [AIDE PUREBASIC] Mises à jour.

Message par Mesa »

Ok, je comprends mieux.
Je vais voir avec Fred.

M.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: [AIDE PUREBASIC] Mises à jour.

Message par nico »

Il n'y a pas d'erreur ici:
File$ = OpenFileRequester

Vous corrigez des erreurs sans même vous donnez la peine de les tester?
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [AIDE PUREBASIC] Mises à jour.

Message par microdevweb »

Resultat.q = MovieStatus(#Video)

-1: La vidéo est en pause.
0: La vidéo est stoppée
> 0: La vidéo est en cours d'exécution.
La valeur renvoyée est le numéro de la trame en cours d'affichage.


>0 retourne le temps en microsecondes... (sauf erreur de ma part)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [AIDE PUREBASIC] Mises à jour.

Message par falsam »

Bonjour Mesa. Est ce que ce monstrueux travail sert de base à la version accessible sur internet ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre