SA-MP Forums Archive
Fonctions/bouts de code - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Français/French (https://sampforum.blast.hk/forumdisplay.php?fid=30)
+----- Forum: Showroom (https://sampforum.blast.hk/forumdisplay.php?fid=81)
+----- Thread: Fonctions/bouts de code (/showthread.php?tid=527424)

Pages: 1 2


Re : Fonctions/bouts de code - S4t3K - 24.07.2014

[pawn]

new str[] = "2014-07-24 23:40:07";

[/pawn]


Re : Fonctions/bouts de code - Ruto - 24.07.2014

Pourquoi se faire chier alors qu'il y a des trucs tout fait ?

[pawn]stock SplitDateTime(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
sscanf(datetime, "P<:->dddddd", annee, mois, jour, heure, minute, seconde);
}[/pawn]

En plus, зa forme un smiley :p


Re : Fonctions/bouts de code - S4t3K - 24.07.2014

Ruto : En fait y'a deux sйparateurs : le '/' et le ':'.


Re : Fonctions/bouts de code - Ruto - 24.07.2014

sscanf permet de gйrer зa.
Utilise P</:> dans ce cas:

[pawn]stock SplitDateTime(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
sscanf(datetime, "P</:>dddddd", annee, mois, jour, heure, minute, seconde);
}

public OnFilterScriptInit()
{
new str[] = "2014/07/24 23:40:07";
new annee, mois, jour, heure, minute, seconde;
SplitDateTime(str, annee, mois, jour, heure, minute, seconde);
printf("%04d-%02d-%02d %02d:%02d:%02d", annee, mois, jour, heure, minute, seconde); // 2014-07-24 23:40:07
return 1;
}[/pawn]


Re: Fonctions/bouts de code - Baltimore - 25.07.2014

Je lui ai dis а maintes reprises qu'il fait des trucs inutiles, une fois il m'a sortit un code qui permet de passer un paramиtre du timer en tableau, lа un code que sscanf peut trиs bien gйrer et encore d'autres... :X


Re : Re: Fonctions/bouts de code - Kilou - 25.07.2014

Baltimore;3134899 Wrote:Je lui ai dis а maintes reprises qu'il fait des trucs inutiles, une fois il m'a sortit un code qui permet de passer un paramиtre du timer en tableau, lа un code que sscanf peut trиs bien gйrer et encore d'autres... :X
Parce que faut optimiseeeeeer

[pawn]stock SplitDateTime(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
annee = cval(datetime[0]) * 1000;
annee += cval(datetime[1]) * 100;
annee += cval(datetime[2]) * 10;
annee += cval(datetime[3]);

mois = cval(datetime[5]) * 10;
mois += cval(datetime[6]);

jour = cval(datetime[8]) * 10;
jour += cval(datetime[9]);

heure = cval(datetime[11]) * 10;
heure += cval(datetime[12]);

minute = cval(datetime[14]) * 10;
minute += cval(datetime[15]);

seconde = cval(datetime[17]) * 10;
seconde += cval(datetime[18]);
}

stock cval(ch)
return '0' <= ch <= '9' ? ch - 48 : 0;[/pawn]

(cval() est juste une petite fonction comme strval() mais pour un seul caractиre)


Re : Fonctions/bouts de code - Ruto - 25.07.2014

Dans ce cas, pourquoi ne pas tout simplement faire comme зa ?

[pawn]stock SplitDateTime(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
annee = strval(datetime[0]);
mois = strval(datetime[5]);
jour = strval(datetime[8]);
heure = strval(datetime[11]);
minute = strval(datetime[14]);
seconde = strval(datetime[17]);
}[/pawn]



Au pire, j'ai fait quelques tests avec les diffйrentes versions :

[pawn]
#include <a_samp>
#include <sscanf2>

stock cval(ch)
return '0' <= ch <= '9' ? ch - 48 : 0;

stock SplitDateTime1(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
new tmp[5], copy[20];
copy = datetime;

strmid(tmp, copy, 0, 4);
strdel(copy, 0, 5);
annee = strval(tmp);

strmid(tmp, copy, 0, 2);
strdel(copy, 0, 3);
mois = strval(tmp);

strmid(tmp, copy, 0, 2);
strdel(copy, 0, 3);
jour = strval(tmp);

strmid(tmp, copy, 0, 2);
strdel(copy, 0, 3);
heure = strval(tmp);

strmid(tmp, copy, 0, 2);
strdel(copy, 0, 3);
minute = strval(tmp);

strmid(tmp, copy, 0, 2);
strdel(copy, 0, 3);
seconde = strval(tmp);
}

stock SplitDateTime2(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
new tmp[5], copy[20], index = 0;
copy = datetime;

strmid(tmp, copy, 0, 4);
index += 5;
annee = strval(tmp);

strmid(tmp, copy, index, index + 2);
index += 3;
mois = strval(tmp);

strmid(tmp, copy, index, index + 2);
index += 3;
jour = strval(tmp);

strmid(tmp, copy, index, index + 2);
index += 3;
heure = strval(tmp);

strmid(tmp, copy, index, index + 2);
index += 3;
minute = strval(tmp);

strmid(tmp, copy, index, index + 2);
index += 3;
seconde = strval(tmp);
}

stock SplitDateTime3(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
sscanf(datetime, "P</:>dddddd", annee, mois, jour, heure, minute, seconde);
}

stock SplitDateTime4(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
annee = cval(datetime[0]) * 1000;
annee += cval(datetime[1]) * 100;
annee += cval(datetime[2]) * 10;
annee += cval(datetime[3]);

mois = cval(datetime[5]) * 10;
mois += cval(datetime[6]);

jour = cval(datetime[8]) * 10;
jour += cval(datetime[9]);

heure = cval(datetime[11]) * 10;
heure += cval(datetime[12]);

minute = cval(datetime[14]) * 10;
minute += cval(datetime[15]);

seconde = cval(datetime[17]) * 10;
seconde += cval(datetime[18]);
}

stock SplitDateTime5(datetime[20], &annee, &mois, &jour, &heure, &minute, &seconde)
{
annee = strval(datetime[0]);
mois = strval(datetime[5]);
jour = strval(datetime[8]);
heure = strval(datetime[11]);
minute = strval(datetime[14]);
seconde = strval(datetime[17]);
}

public OnFilterScriptInit()
{
new str[] = "2014/07/24 23:40:07";
new annee, mois, jour, heure, minute, seconde;
new tick;

tick = GetTickCount();
for(new i; i < 100000; i++) SplitDateTime1(str, annee, mois, jour, heure, minute, seconde);
tick = GetTickCount() - tick;
printf("V1 : %d ms", tick);

tick = GetTickCount();
for(new i; i < 100000; i++) SplitDateTime2(str, annee, mois, jour, heure, minute, seconde);
tick = GetTickCount() - tick;
printf("V2 : %d ms", tick);

tick = GetTickCount();
for(new i; i < 100000; i++) SplitDateTime3(str, annee, mois, jour, heure, minute, seconde);
tick = GetTickCount() - tick;
printf("V3 : %d ms", tick);

tick = GetTickCount();
for(new i; i < 100000; i++) SplitDateTime4(str, annee, mois, jour, heure, minute, seconde);
tick = GetTickCount() - tick;
printf("V4 : %d ms", tick);

tick = GetTickCount();
for(new i; i < 100000; i++) SplitDateTime5(str, annee, mois, jour, heure, minute, seconde);
tick = GetTickCount() - tick;
printf("V5 : %d ms", tick);
return 1;
}[/pawn]


Voilа ce que j'obtiens :
[pawn]V1 : 215 ms // premiиre version de S4t3k
V2 : 159 ms // premiиre version de Kilou
V3 : 42 ms // premiиre version de Ruto (sscanf)
V4 : 201 ms // deuxiиme version de Kilou
V5 : 87 ms // deuxiиme version de Ruto[/pawn]

La version avec sscanf semble кtre la plus rapide (mais c'est possible que ce soit dы а la rapiditй du plugin).


Re : Fonctions/bouts de code - S4t3K - 25.07.2014

@Ruto : Thйoriquement, la version ou tu spйcifies un index pour strval ne marchera pas comme tu le souhaites puisque les index servent а commencer la recherche quelque part, pas а la terminer.


Re : Fonctions/bouts de code - Kilou - 25.07.2014

Ruto;3134957 Wrote:Voilа ce que j'obtiens :
[pawn]V1 : 215 ms // premiиre version de S4t3k
V2 : 159 ms // premiиre version de Kilou
V3 : 42 ms // premiиre version de Ruto (sscanf)
V4 : 201 ms // deuxiиme version de Kilou
V5 : 87 ms // deuxiиme version de Ruto[/pawn]

La version avec sscanf semble кtre la plus rapide (mais c'est possible que ce soit dы а la rapiditй du plugin).
Ah en effet, mais зa vient bel et bien du fait que ce soit un plugin: le code que j'ai mit ne peut en aucun cas кtre plus lent qu'un sscanf


Re : Fonctions/bouts de code - Ruto - 25.07.2014

S4t3K;3135012 Wrote:@Ruto : Thйoriquement, la version ou tu spйcifies un index pour strval ne marchera pas comme tu le souhaites puisque les index servent а commencer la recherche quelque part, pas а la terminer.

strval s'arrкtera de lui mкme dиs qu'il ne rencontrera plus de caractиres chiffrйs.


Re : Fonctions/bouts de code - Dutheil - 11.11.2015

Ce bout de code est а prendre en compte si vous voulez faire un systиme pour crйer des vйhicules а des positions bien dйfinies, mais que vous ne souhaitez pas faire apparaоtre 2 vйhicules au mкme endroit.
C'est juste un brouillon pour que vous compreniez la logique et surtout selon moi l'une des meilleures mйthodes pour s'y prendre.

Edit : Y aurait une autre mйthode en utilisant y_iterator avec Iter_Random, mais bon j'ai pas voulu vous compliquer la vie et en terme de rapiditй, si vous avez pas trop de positions, bon зa peut passer, mais si vous en avez +50/60, je vous conseille relativement l'autre mйthode avec y_iterator.
PHP Code:
#include "a_samp"

enum e_spawns
{
    
Float:e_spawns_pos[3],
    
bool:e_is_already_use
}

new
    array[][
e_spawns] = 
                        {
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false },
                            { {
0.00.00.0}, false }
                        };

main()
{
    for(new 
0&lt20i++)
    {
        static
            
rand;

        do 
rand random(sizeof(array));
        while(array[
rand][e_is_already_use]);

        array[
rand][e_is_already_use] = true;
        
CreateVehicle(400, array[rand][e_spawns_pos][0], array[rand][e_spawns_pos][1], array[rand][e_spawns_pos][2], 0.00086400);
    }




Re : Fonctions/bouts de code - S4t3K - 11.11.2015

Suffit juste de pas rentrer deux fois les mкmes coordonnйes dans l'array ou alors j'ai pas compris le principe.