Fonctions/bouts de code
#21

[pawn]

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

[/pawn]
Reply
#22

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
Reply
#23

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

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]
Reply
#25

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
Reply
#26

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)
Reply
#27

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).
Reply
#28

@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.
Reply
#29

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
Reply
#30

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.
Reply
#31

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);
    }

Reply
#32

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


Forum Jump:


Users browsing this thread: 1 Guest(s)