Weigh

[Non résolu] Besoin d'explications sur sscanf

9 messages dans ce sujet

Bonsoir, j'ai très récemment pour m'amuser et passer le temps ouvert un gamemode vierge où je m'amuse à écrire quelques lignes, en voulant passer une étape et faire une commande /v je me suis rendu sur google afin de rechercher un script et voir les lignes et thermes qu'ils utilisaient dans leurs codes pour essayé de comprendre et faire le mien, je suis tombé sur un code plutôt compact mais utilisant sscanf, j'ai essayer de me documenter sur celui-ci mais je ne comprends pas son utilité et son utilisation.

 

Je trouve que ce serait bête que je prenne le code et que je le mette dans le gm sans même prendre la peine de le comprendre celui-ci donc j'aimerais si quelqu'un as le temps avoir une explication sur sscanf, son fonctionnement, son utilité, etc..

 

 

Code en question :

CMD:veh(playerid, params[]) {

	new vehid;

	if(sscanf(params, "i", vehid)) SendClientMessage(playerid, COLOR_GREY, "SYNTAX: /veh <carid>");
	else if (vehid < 400 || vehid > 611) SendClientMessage(playerid, COLOR_GREY, "[ERROR] Invalid car id! [ Car ID's range from 400 - 611 ]");
	else 
	{
		if(vCar[playerid] != -1)
		{
		    DestroyVehicle(vCar[playerid]);
		}
		new Float:x, Float:y, Float:z;
		GetPlayerPos(playerid, x, y, z);
		vCar[playerid] = CreateVehicle(vehid, x + 3, y, z, 0, 0,0, -1);
		SendClientMessage(playerid, COLOR_GREEN, "Car spawned at your location!");
	}

	return 1;
}

Trouvé ici : https://forum.sa-mp.com/showthread.php?t=258732

Modifié par Weigh

Partager ce message


Lien à poster
Partager sur d’autres sites

Ce code sert à faire spawn une voiture, sur SAMP le modèle des véhicules commence par 400 et finit à l'id 611. Voir la liste des véhicules ici: http://wiki.sa-mp.com/wiki/Vehicles:All

Si t'inscrits l'id d'un modèle véhicule inférieure à 611, le véhicule choisit se créera & spawnera sur ta position, d'oú la phrase "Voiture spawn à votre position"

Si supérieur à 611, ton véhicule ne sera pas crée & spawn, d'oú la phrase "Mauvais ID véhicule".

 

Pour des explications concrètes sur sscanf, je t'invite à lire le post ci-dessous.

Dans ce code, grâce à sscanf, ton script va pouvoir exécuter ton script, donc spawn un véhicule. "vehid"

 

J'espère t'avoir aidé ;)

Modifié par Omarr

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu m'as juste expliqué le code que j'avais déjà compris mais merci quand même et c'est sympa pour le lien d'explication de sscanf. J'ai pu comprendre la plupart du code sauf ceci que je ne comprends pas bien :

 

if(sscanf(params, "i", vehid))

Si quelqu'un peux m'expliquer cette ligne ce serait parfait.

 

 

Modifié par Weigh

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, Weigh a dit :

Tu m'as juste expliqué le code que j'avais déjà compris mais merci quand même et c'est sympa pour le lien d'explication de sscanf. J'ai pu comprendre la plupart du code sauf ceci que je ne comprends pas bien :

 

if(sscanf(params, "i", vehid))

Si quelqu'un peux m'expliquer cette ligne ce serait parfait.

 

 

 

Je vais t'expliquer.

Apparemment, tu n'as jamais codé en C ou PHP, tu ne connais donc pas cette fonction qui à première vue a des paramètres différents de ces jumelles dans les langages cités.

sscanf est une fonction qui permet d'extraire les données par le biais d'un format qu'on lui indique et de les stocker dans des éléments (variables et tableaux).

 

Le code que tu as donné dans ton premier message est une commande /veh qui prend un paramètre non-optionnel.

 

CMD:veh(playerid, params[])

Dans cette ligne, on comprend qu'à l'intérieur de son block se trouvera l'implémentation de la commande /veh.

Cette ligne est une macro qui est compilée en réalité en fonction publique, elle possède deux paramètres : 

Le premier, playerid stockera l'id du joueur qui aura tapé la commande

Le second, params[] est un tableau qui stockera la chaîne de caractères suivant la commande

 

Si on reprend cette ligne :

sscanf(params, "i", vehid)

Ici on en envoie le tableau params en premier argument à sscanf pour indiquer que c'est cette chaîne de caractères que nous souhaitons analyser, en deuxième argument une chaîne de caractères qui comprendra le formatage de ce que l'on souhaite extraire, ici on a "i" pour "integer" soit un entier, on souhaite donc extraire une valeur décimale 32 bits et en troisième argument la variable qui stockera la valeur extraite par sscanf.

 

J'ai expliqué en bref car j'ai pas trop le temps, n'hésite pas à poser tes questions si tu n'as pas compris quelque chose et aussi, je te réfère à ce tutoriel que j'ai rédigé il y a longtemps :

 

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 1 heure, C_far a dit :

 

Je vais t'expliquer.

Apparemment, tu n'as jamais codé en C ou PHP, tu ne connais donc pas cette fonction qui à première vue a des paramètres différents de ces jumelles dans les langages cités.

sscanf est une fonction qui permet d'extraire les données par le biais d'un format qu'on lui indique et de les stocker dans des éléments (variables et tableaux).

 

Le code que tu as donné dans ton premier message est une commande /veh qui prend un paramètre non-optionnel.

 

CMD:veh(playerid, params[])

Dans cette ligne, on comprend qu'à l'intérieur de son block se trouvera l'implémentation de la commande /veh.

Cette ligne est une macro qui est compilée en réalité en fonction publique, elle possède deux paramètres : 

Le premier, playerid stockera l'id du joueur qui aura tapé la commande

Le second, params[] est un tableau qui stockera la chaîne de caractères suivant la commande

 

Si on reprend cette ligne :

sscanf(params, "i", vehid)

Ici on en envoie le tableau params en premier argument à sscanf pour indiquer que c'est cette chaîne de caractères que nous souhaitons analyser, en deuxième argument une chaîne de caractères qui comprendra le formatage de ce que l'on souhaite extraire, ici on a "i" pour "integer" soit un entier, on souhaite donc extraire une valeur décimale 32 bits et en troisième argument la variable qui stockera la valeur extraite par sscanf.

 

J'ai expliqué en bref car j'ai pas trop le temps, n'hésite pas à poser tes questions si tu n'as pas compris quelque chose et aussi, je te réfère à ce tutoriel que j'ai rédigé il y a longtemps :

 

 

J'avais commencé à apprendre le pawn (avec toi sur ts d'ailleurs) mais je n'étais pas motivé, donc en effet je débute vraiment.

 

Citation

Le second, params[] est un tableau qui stockera la chaîne de caractères suivant la commande

 

C'est ça que je ne comprenais pas mais grâce à toi j'ai enfin compris merci énormément ! j'ai donc implanté le code suivant à mon gamemode que je comprends maintenant totalement.

 

new vid;

CMD:v(playerid, params[])
{
	if(sscanf(params, "i", vid)) SendClientMessage(playerid, GRIS, "USAGE: /v <vehid>");
	else if (vid < 400 || vid > 611) SendClientMessage(playerid, GRIS, "[ERREUR] ID de véhicule invalide 400 - 611");
	{
		new Float:x, Float:y, Float:z;
		GetPlayerPos(playerid, x, y, z);
		CreateVehicle(vid, x + 3, y, z, 0, 0,0, -1);
		SendClientMessage(playerid, VERT, "Votre véhicule est prêt!");
		}

	return 1;
}

Seul petit hic, quand je fais un simple /v en jeu j'ai la ligne suivante qui s'exécute : SendClientMessage(playerid, VERT, "Votre véhicule est prêt!"); alors que c'est celle-ci qui devrait s'exécuter : SendClientMessage(playerid, GRIS, "USAGE: /v <vehid>"); de même quand je fais un /v 4444 j'ai deux lignes qui s'exécutent : SendClientMessage(playerid, GRIS, "[ERREUR] ID de véhicule invalide 400 - 611"); celle-ci c'est normal mais en revanche j'ai encore celle-ci qui revient : SendClientMessage(playerid, VERT, "Votre véhicule est prêt!");

 

Est-ce une histoire de return ou end qui faudrait ajouter afin que la commande arrête son exécution ?

 

PS: la voiture ne spawn pas bien évidemment vu qu'il n'y a pas d'ID ou alors il n'existe pas. 

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 45 minutes, Weigh a dit :

Seul petit hic, quand je fais un simple /v en jeu j'ai la ligne suivante qui s'exécute : SendClientMessage(playerid, VERT, "Votre véhicule est prêt!"); alors que c'est celle-ci qui devrait s'exécuter : SendClientMessage(playerid, GRIS, "USAGE: /v <vehid>"); de même quand je fais un /v 4444 j'ai deux lignes qui s'exécutent : SendClientMessage(playerid, GRIS, "[ERREUR] ID de véhicule invalide 400 - 611"); celle-ci c'est normal mais en revanche j'ai encore celle-ci qui revient : SendClientMessage(playerid, VERT, "Votre véhicule est prêt!");

 

Est-ce une histoire de return ou end qui faudrait ajouter afin que la commande arrête son exécution ?

 

PS: la voiture ne spawn pas bien évidemment vu qu'il n'y a pas d'ID ou alors il n'existe pas. 

 

Je t'ai refait ta commande proprement et je te laisse comparer nos codes (j'y ai mis des macros, tu n'es pas forcé de les utiliser) :

#define SCM SendClientMessage
#define IsValidVehicleModel(%0) (400 <= %0 <= 611)

CMD:v(playerid, params[])
{
	new 
		modelid;

	if(sscanf(params, "i", modelid)) return SCM(playerid, GRIS, "USAGE: /v <vehid>");
	if(!IsValidVehicleModel(modelid)) return SCM(playerid, GRIS, "[ERREUR] ID de véhicule invalide 400 - 611");
	
	new 
		Float:x,
		Float:y,
		Float:z;
	
	GetPlayerPos(playerid, x, y, z);
	CreateVehicle(modelid, x + 3.0, y, z, 0, 0, 0, -1);
	
	SCM(playerid, VERT, "Votre véhicule est prêt!");

	return 1;
}

 

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 5 heures, C_far a dit :

 

Je t'ai refait ta commande proprement et je te laisse comparer nos codes (j'y ai mis des macros, tu n'es pas forcé de les utiliser) :

#define SCM SendClientMessage
#define IsValidVehicleModel(%0) (400 <= %0 <= 611)

CMD:v(playerid, params[])
{
	new 
		modelid;

	if(sscanf(params, "i", modelid)) return SCM(playerid, GRIS, "USAGE: /v <vehid>");
	if(!IsValidVehicleModel(modelid)) return SCM(playerid, GRIS, "[ERREUR] ID de véhicule invalide 400 - 611");
	
	new 
		Float:x,
		Float:y,
		Float:z;
	
	GetPlayerPos(playerid, x, y, z);
	CreateVehicle(modelid, x + 3.0, y, z, 0, 0, 0, -1);
	
	SCM(playerid, VERT, "Votre véhicule est prêt!");

	return 1;
}

 

 

Parfait ! merci beaucoup @C_far ça m'a permis d'apprendre quelques trucs et astuce pour un code fluide :)

 

Peux-tu juste m'expliquer cette ligne : 

#define IsValidVehicleModel(%0) (400 <= %0 <= 611)
Modifié par Weigh

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 14/10/2017 à 18:27, Weigh a dit :

 

Parfait ! merci beaucoup @C_far ça m'a permis d'apprendre quelques trucs et astuce pour un code fluide :)

 

Peux-tu juste m'expliquer cette ligne : 

#define IsValidVehicleModel(%0) (400 <= %0 <= 611)

C'est ce qu'on appel un macro. Ce macro se divise en plusieurs parties (3 pour faire plus simple):

// 1)
#define
// 2)
IsValidVehicleModel(%0)
// 3)
(400 <= %0 <= 611)

La troisième remplace la deuxième partie au moment de la compilation. Le %0 n'est d'autre qu'un "paramètre". Dans le IsValidVehicleModel, tu peux mettre tout et n'importe quoi. Ce que tu auras mis sera remplacé dans la troisième partie.

Donc:

if(!IsValidVehicleModel(modelid)) return SCM(playerid, GRIS, "[ERREUR] ID de véhicule invalide 400 - 611");
// Donne à la compilation
if(!(400 <= modelid <= 611)) return SCM(playerid, GRIS, "[ERREUR] ID de véhicule invalide 400 - 611");

 

Edit: Un très bon tuto pour t'expliquer quasiment tout sur les macros: http://forum.sa-mp.com/showthread.php?t=570954

Modifié par Dayrion

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup

Partager ce message


Lien à poster
Partager sur d’autres sites
Guest
Ce sujet ne peut plus recevoir de nouvelles réponses.