Write uint sans arrondis

  • Initiateur de la discussion yunever
  • Date de début
  • Initiateur de la discussion
  • Banni
yunever

yunever

Geek
Messages
64
Score réaction
6
Points
65
Salut à tous les potes, j'ai un petit soucis :
Code:
net.Start("bteamFcoef")
net.WriteUInt(1.48,32)
net.SendToServer()
net.Receive( "bteamFcoef", function(len, ply, amount, self) bteamFcoef = net.ReadUInt(32) print(bteamFcoef)
end )
Output : 1 au lieu de 1.48. Pourriez vous m'aider s'il vous plait, cordialement.
Pourriez vous m'aider s'il vous plait, cordialement.
 
Guthen

Guthen

è_é
Messages
233
Score réaction
84
Points
150
Pour les nombres décimaux (float en anglais), il faut utiliser : net.WriteFloat - Garry's Mod
 
  • Initiateur de la discussion
  • Banni
yunever

yunever

Geek
Messages
64
Score réaction
6
Points
65
Guthen à dit:
Pour les nombres décimaux (float en anglais), il faut utiliser : net.WriteFloat - Garry's Mod
T'es trop beau merci <3
 
Guthen

Guthen

è_é
Messages
233
Score réaction
84
Points
150
  • J'aime
Réactions: enzoFR60
  • Banni
L

LPN64

Nouveau né
Messages
23
Score réaction
9
Points
15
Même si t'as la réponse, ca vaut une explication

UInt c'est pour Unsigned Integer, entié non signe (sans signe devant) ce qui ve dire > que 0


32 c'est pour 32 bits, pour savoir combien de bits envoyer soit tu regarde dans la table des bits ou sinon y'a une petite opération mathématique à faire :



Par exemple, si on sait que notre nombre ne dépassera jamais 254 on fait

log(255)/log(2) (on prend 255 car on a 255 valeurs le zéro compris) ce qui retourne environs 7.99435343686 on arrondis au dessus et on a 8 bits.

Donc pour un nombre qui varie de zéro (inclus) à 254 (enclus) soit 255 valeurs il nous faut 8 bits, d'ailleurs , log(256)/log(2) = 8 tout rond



Pour ceux qui ont des notions d'enums, ca peut être bien cette lib netStructures - net.Read/WriteTable replacement - Garry's Mod - Facepunch Forum
 
Dernière édition:
  • J'aime
Réactions: Membre supprimé 98332 et Guthen
  • Initiateur de la discussion
  • Banni
yunever

yunever

Geek
Messages
64
Score réaction
6
Points
65
LPN64 à dit:
Même si t'as la réponse, ca vaut une explication

UInt c'est pour Unsigned Integer, entié non signe (sans signe devant) ce qui ve dire > que 0


32 c'est pour 32 bits, pour savoir combien de bits envoyer soit tu regarde dans la table des bits ou sinon y'a une petite opération mathématique à faire :



Par exemple, si on sait que notre nombre ne dépassera jamais 254 on fait

log(255)/log(2) (on prend 255 car on a 255 valeurs le zéro compris) ce qui retourne environs 7.99435343686 on arrondis au dessus et on a 8 bits.

Donc pour un nombre qui varie de zéro (inclus) à 254 (enclus) soit 254 valeurs il nous faut 8 bits, d'ailleurs , log(256)/log(2) = 8 tout rond



Pour ceux qui ont des notions d'enums, ca peut être bien cette lib netStructures - net.Read/WriteTable replacement - Garry's Mod - Facepunch Forum
Merci pour ton explication !
 
Mouloud Hooden

Mouloud Hooden

Geek suprême
Messages
143
Score réaction
60
Points
140
Perso j'ai toujours utilisé WriteFloat je comprends pas l'utilité des autre endroit c'est plus opti ou nada ?
 
Guthen

Guthen

è_é
Messages
233
Score réaction
84
Points
150
Mouloud Hooden à dit:
Perso j'ai toujours utilisé WriteFloat je comprends pas l'utilité des autre endroit c'est plus opti ou nada ?
Float : nombre décimal positif ou négatif

Int (Integer) : nombre entier positif ou négatif

UInt (Unassigned integer) : nombre entier seulement positif (et « double » en quelques sortes le maximum du nombre positif (c’est juste que comme il n’y a pas de nombre négatif, le maximum négatif est additionné au maximum positif))

Tout dépend de l’addon et de la manière que tu veux faire.
 
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
Toutes ces notions n'ont pas énormément d'intérêt en Lua, vous verrez pourquoi dans la suite du message.

De manière générale :
uint_32 (non signé)
: nombre entier écrit sur 32 bits, allant de 0 à 4294 millions
int_32 (signé) : nombre entier écrit sur 32 bits, allant de -2147 millions à 2147 millions ( moitié de non signé - 1)
float : nombre à virgule flottante, selon les langages/systèmes il peut être écrit sur 32 ou 64 bits (simple ou double précision).
En Lua, le float est écrit sur 64 bits (double précision).
Il peut aller de -1.797*10^(308) à 1.797*10^(308)

Ce qui fait que tu peux écrire n'importe quel entier (type int) dans un float.
L'inverse n'est pas possible (sans perte).

La différence en terme d'optimisation (à ce niveau c'est de la micro optimisation) c'est que si tu veux envoyer un entier, pourquoi le stocker dans un emplacement de type float (64bits) si tu peux l'écrire sur int (32bits) ? C'est comme vouloir utiliser un colis pour envoyer une feuille A4.

Si on travaille qu'avec des entiers, utiliser WriteFloat fonctionnera dans tous les cas, mais en théorie*, l'utilisation de WriteInt permettra d'utiliser un format plus optimal.

* En théorie, car dans les faits, tous les nombres en Lua sont des nombres à virgule flottante (double precision) - source: Programming in Lua : 2.3
La partie flottante est mise à 0 dans le cas des nombres entiers du coup.
Je suppose que l'implémentation en C de WriteInt utilise bien le format int_32 et l'envoie sous ce format.
 
Dernière édition:
  • J'aime
Réactions: NoaGamingFR
᠌ ᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌

᠌ ᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌

Psychopathe
Messages
742
Score réaction
808
Points
265
Mouloud Hooden à dit:
Perso j'ai toujours utilisé WriteFloat je comprends pas l'utilité des autre endroit c'est plus opti ou nada ?
En lua honettement y'a pas vraiment d'utilité (en opti) mais en C oui c'est très utile, ça te permet de pouvoir gérer la mémoire que tu vas utiliser pour ton programme et éviter les dépassement de mémoire allias Blue Screen.
Mais bon maintenant avec la mémoire vive que possède nos pc faut être un sacré bourrin pour faire un dépassement de mémoire
 
M

Membre supprimé 98332

Anonyme
᠌ ᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌ à dit:
En lua honettement y'a pas vraiment d'utilité (en opti) mais en C oui c'est très utile, ça te permet de pouvoir gérer la mémoire que tu vas utiliser pour ton programme et éviter les dépassement de mémoire allias Blue Screen.
Mais bon maintenant avec la mémoire vive que possède nos pc faut être un sacré bourrin pour faire un dépassement de mémoire
Faux
Quand on fait de l'allocation de mémoire dynamique et qu'on maîtrise pas trop ces outils on a vite fait de faire des dépassements
 
᠌ ᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌

᠌ ᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌

Psychopathe
Messages
742
Score réaction
808
Points
265
Gabyfle à dit:
Faux
Quand on fait de l'allocation de mémoire dynamique et qu'on maîtrise pas trop ces outils on a vite fait de faire des dépassements
J'ai parlé d'allocation dynamique ?

À aucun moment je parle de malloc mais ok SeemsGood
Et c'est justement ce que j'explique la gestion de la mémoire en C c'est du calcul que se soit de manière dynamique ou statique ( c'est à dire de façon standard)
 
  • Banni
L

LPN64

Nouveau né
Messages
23
Score réaction
9
Points
15
᠌ ᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌ à dit:
En lua honettement y'a pas vraiment d'utilité (en opti) mais en C oui c'est très utile, ça te permet de pouvoir gérer la mémoire que tu vas utiliser pour ton programme et éviter les dépassement de mémoire allias Blue Screen.
Mais bon maintenant avec la mémoire vive que possède nos pc faut être un sacré bourrin pour faire un dépassement de mémoire


Non mais n'importequoi sérieux lmao, depuis quand on doit "oublier" l'opti dans un langage, depuis quand un malloc qui fail ca fait un blue screen.


Déjà tu confonds un malloc qui fail et un dépassement de tampon (et pas de mémoire), avant de parler de buffer overflow, va faire un peu d'assembleur et pige comment marche la stack, et ensuite on en reparle.


Là on parle d'optimisation réseau, ton serveur utilisera moins de bande passante car ton programme fait pas de la merde, tout simplement.

Optimiser le netcode c'est gagner du temps CPU (Moins de temps à envoyer les données et moins de temps à les parse), gagner du temps CPU c'est avoir de meilleurs performances.
 
  • J'aime
Réactions: While True
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
᠌ ᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌ à dit:
En lua honettement y'a pas vraiment d'utilité (en opti) mais en C oui c'est très utile, ça te permet de pouvoir gérer la mémoire que tu vas utiliser pour ton programme et éviter les dépassement de mémoire allias Blue Screen.
Mais bon maintenant avec la mémoire vive que possède nos pc faut être un sacré bourrin pour faire un dépassement de mémoire
Comme l'a dit @LPN64 on ne parle pas d'optimisation de mémoire, vu que pour Lua, tout nombre est un float, il prendra la taille physique d'un float dans tous les cas (sauf modification et ajout d'un type en Lua).
On parle seulement de WriteInt/ReadInt qui sont des fonctions de la bibliothèque réseau (aka net), qui envoient les données de manière différente si tu utilises la fonction WriteInt ou WriteFloat.

Au final niveau réseau, quand envoyer un int sur le réseau prend 32 bits et envoyer ce même int sous forme de float prendra 64 bits il faut se dire qu'il y a une légère optimisation possible.
 
  • J'aime
Réactions: ᠌ ᠌ ᠌ ᠌ ᠌ ᠌᠌ ᠌ ᠌ ᠌
Discord d'entraide
Rejoignz-nous sur Discord