[Ajuda] sscanf + fread
#1

Olб, estou tentando carregar objetos .map por meio deste script, sу que estou enfrentando sйrios problemas pois o loop estб girando e estб printando apenas debug1 (10k de vezes), sendo que em um exemplo quase igual que um colega me passou funcionou tranquilo.. gostaria de saber por que nгo estб carregando..
pawn Код:
LoadMap(map[])
{
    if(ob@created > 10000) return er_2(), 0;
    if(!fexist(map)) return er_3(), 0;
    new interior, world;
    new ll@cou, string[400];
    new File:l@map=fopen(map);
    while(fread(l@map, string))
    {
        print("debug1");
        if(!sscanf(string, "p<\">'object''model='d'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotX='f'rotY='f'rotZ='f", ob@modelid[ll@cou], interior, world, ob@pd[0][ll@cou], ob@pd[1][ll@cou], ob@pd[2][ll@cou], ob@pd[3][ll@cou], ob@pd[4][ll@cou], ob@pd[5][ll@cou]))
        {
            dt@cr_ob ++;
            printf("-- DEBUG: OBJETO %d >>", dt@cr_ob);
        }
        ++ll@cou;                                                                                                                                  // ddsddffff
    }
    fclose(l@map);
    //dt@cr_ob = ll@cou;
    return 1;
}
Quero carregar a XYZ em ob@pd[ll@cou][0], ob@pd[ll@cou][1], ob@pd[ll@cou][2] e RXRYRZ em ob@pd[ll@cou][3], ob@pd[ll@cou][4] e ob@pd[ll@cou][5]... sendo que ll@cou й a var do giro do loop e ob@pd[3][10000] й uma float .-.
PS: Nunca mechi com fread/fwrite do SA-MP, nem com sscanf dessa maneira .-.
PSІ: Nгo quero code, quero entender o que ta errado '-'
PSі: O code do sscanf foi copiado da include do mick88, abaixo:

pawn Код:
stock LoadMtaMap(file[], convert03c=false)
{
    if (!fexist(file) || MinElementID == MAX_LOADED_ELEMENTS)
    {
        printf("Map %s cannot be loaded", file);
        return 0;
    }
    new File:MapFile=fopen(file),
    n, string[400], numberplate[MAX_NUMBERPLATE],
    Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz,
    modelid, paintjob, interior, world,
    t = GetTickCount();

    while(fread(MapFile, string))
    {
        if (!sscanf(string, "p<\">'object''model='d'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotX='f'rotY='f'rotZ='f", modelid, interior, world, x, y, z, rx, ry, rz))
        {
            printf("DEBUG OBJECT %d", n);
            /*if (convert03c)
            {
                switch(modelid)
                {
                    case 14383..14483:  modelid += 4248;
                    case 14770..14856:  modelid += 4063;
                    case 14858..14871:  modelid += 4062;
                    case 18000..18036:  modelid += 934;
                    case 18038..18101:  modelid += 933;
                    case 14872..14883:  modelid += 4163;
                    case 14885..14891:  modelid += 4162;
                    case 13590..13667:  modelid += 5142;
                    case 14500..14522:  modelid += 4310;
                    case 12835..12944:  modelid -= 6219;
                    case 14892:         modelid += 5009;
                }
            }    */

            //modelid x y z rx ry rz interior world
            new objectid = ADD_OBJECT(modelid, x, y, z, rx, ry, rz);
            if (objectid == INVALID_OBJECT_ID) printf("Error, object could not be created. Make sure you don't exceed max number of objects. Use stramer if you need to create more than %d objects!", MAX_OBJECTS);
            else
            {
                #if defined _streamer_included
                    Streamer_SetFloatData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_DRAW_DISTANCE, MAP_STREAM_DISTANCE);
                #endif
                MapElements[MinElementID][eElementType]     = ELEMENT_TYPE_OBJECT;
                MapElements[MinElementID][eElementID]       = objectid;
                strcp(file, MapElements[MinElementID][eElementSource]);
                //MapElements[MinElementID][eElementSource]     = file;
                n++;
                //printf("Object %d loaded into slot %d", objectid, MinElementID);
                if (!NextElementID())
                {
                    fclose(MapFile);
                    return n;
                }
            }
        }
        else if (!sscanf(string, "p<\">'vehicle''paintjob='d'model='d'plate='s["#MAX_NUMBERPLATE"]'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotZ='f", paintjob, modelid, numberplate, interior, world, x, y, z, rz))
        {
            printf("DEBUG VEHICLE %d", n);
            new col1, col2, colors[20], mods[80], mod[MAX_MODS];
            sscanf(string, "p<\">'color='s[20] ", colors);
            sscanf(string, "p<\">'upgrades='s[80] ", mods);
            sscanf(colors, "p<,>dd", col1, col2);
            sscanf(mods, "p<,>A<d>(0)["#MAX_MODS"]", mod);

            //modelid x y z rz col1 col2 paintjob interior world
            new vehicleid = CreateVehicle(modelid, x, y, z, rz, col1, col2, VEHICLE_RESPAWN_DELAY);
            if (vehicleid == INVALID_VEHICLE_ID) print("Vehicle failed to load! Check if you exceeded maximum of 2000 vehicles");
            else
            {
                SetVehicleNumberPlate(vehicleid, numberplate);
                SetVehicleToRespawn(vehicleid);
                for (new i; i < MAX_MODS; i++) if (mod[i]) AddVehicleComponent(vehicleid, mod[i]);
                ChangeVehiclePaintjob(vehicleid, paintjob);
                LinkVehicleToInterior(vehicleid, interior);
                SetVehicleVirtualWorld(vehicleid, world);

                MapElements[MinElementID][eElementType]     = ELEMENT_TYPE_VEHICLE;
                MapElements[MinElementID][eElementID]       = vehicleid;
                strcp(file, MapElements[MinElementID][eElementSource]);
                //MapElements[MinElementID][eElementSource]     = file;
                n++;
                //printf("Vehicle %d loaded into slot %d", vehicleid, MinElementID);
                if (!NextElementID())
                {
                    fclose(MapFile);
                    return n;
                }
            }
        }
    }
    fclose(MapFile);
    printf("%d items loaded from '%s' in %dms", n, file, GetTickCount()-t);
    return n;
}
Reply
#2

if(!sscanf(string...

Nгo seria

if(sscanf(string...

?
Reply
#3

O Que seria fread? fiquei curioso.
Reply
#4

Quote:
Originally Posted by tonisantolia
Посмотреть сообщение
O Que seria fread? fiquei curioso.
n00bz0r
Reply
#5

Quote:
Originally Posted by tonisantolia
Посмотреть сообщение
O Que seria fread? fiquei curioso.
Vei na boa...

Existe o famoso ******, nгo precisa ficar perguntando em um tуpico sу para ganhar post sem ajudar o cara...

#edit

Quote:
Originally Posted by Stewie`
Посмотреть сообщение
n00bz0r
ninja :O
Reply
#6

Quote:
Originally Posted by Victor'
Посмотреть сообщение
Vei na boa...

Existe o famoso ******, nгo precisa ficar perguntando em um tуpico sу para ganhar post sem ajudar o cara...

#edit



ninja :O
Nгo fiz isso para ganhar post.. Nunca vi estб funзгo e fiquei curioso e perguntei. Me mostre uma regra que й proibido perguntar..

@Stewie`
Sу porque nгo conheзo uma funзгo quer dizer que sou nob? me polpe de criancices.

@edit Agora que vim ver que era fread eu li errado
Reply
#7

Quote:
Originally Posted by Victor'
Посмотреть сообщение
if(!sscanf(string...

Nгo seria

if(sscanf(string...

?
Puta merda, й mesmo EHAUHEUAHEUHAU


Thanx man, +6 rйpes *-*
Reply
#8

Quote:
Originally Posted by Kuddy
Посмотреть сообщение
Puta merda, й mesmo EHAUHEUAHEUHAU


Thanx man, +6 rйpes *-*
Eu creio que nгo seja isso nгo, pois sscanf retorna falso se estiver certo e true se estiver errado, entгo o erro estб em outro lugar, isso que vc fez apenas liberou acesso ao if mais da forma que vocк nгo queria, teste melhor para ver isso, veja se todas Vars estгo recebendo seus devidos valores..
Reply
#9

Quote:
Originally Posted by paulor
Посмотреть сообщение
Eu creio que nгo seja isso nгo, pois sscanf retorna falso se estiver certo e true se estiver errado, entгo o erro estб em outro lugar, isso que vc fez apenas liberou acesso ao if mais da forma que vocк nгo queria, teste melhor para ver isso, veja se todas Vars estгo recebendo seus devidos valores..
Isto mesmo Paulo, por isto nos comandos simples usamos:
pawn Код:
if(sscanf(params, "...", values)){
     // Se estiver errado.
}


if(!sscanf(params, "...", values)) {
     // Se estiver correto.
}
Reply
#10

Quote:
Originally Posted by [Full]Garfield[XDB]
Посмотреть сообщение
Isto mesmo Paulo, por isto nos comandos simples usamos:
pawn Код:
if(sscanf(params, "...", values)){
     // Se estiver errado.
}


if(!sscanf(params, "...", values)) {
     // Se estiver correto.
}
Sim, creio que ele errou no 2° parвmetro do sscanf..
Reply
#11

Quote:
Originally Posted by paulor
Посмотреть сообщение
Sim, creio que ele errou no 2° parвmetro do sscanf..
Por isto que eu disse para ele revisar o cуdigo dele seguindo
a sua prуpria lуgica.
Reply
#12

Quote:
Originally Posted by [Full]Garfield[XDB]
Посмотреть сообщение
Por isto que eu disse para ele revisar o cуdigo dele seguindo
a sua prуpria lуgica.
Eu fiz um teste aki com esse sscanf que ele postou e funcionou perfeitamente, creio que deve ter erro no arquivo dele...
Reply
#13

Realmente, apenas liberou o if, fui testar hoje e:
- Ele estб vendo a quantidade de linhas,
- Estб lendo o arquivo corretamente,
- As variбveis nгo estгo sendo carregadas, usei:
pawn Код:
LoadMap(map[])
{
    if(ob@created > 10000) return er_2(), 0;
    if(!fexist(map)) return er_3(), 0;
    new interior, world;
    new ll@cou, string[400];
    new File:l@map=fopen(map);
    while(fread(l@map, string))
    {
        print(string);
        if(sscanf(string, "p<\">'object''model='d'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotX='f'rotY='f'rotZ='f", ob@modelid[ll@cou], interior, world, ob@pd[0][ll@cou], ob@pd[1][ll@cou], ob@pd[2][ll@cou], ob@pd[3][ll@cou], ob@pd[4][ll@cou], ob@pd[5][ll@cou]))
        {
            dt@cr_ob ++;
            printf("-- DEBUG: OBJETO %d | %d, %d, %d, %f, %f, %f, %f, %f, %f", dt@cr_ob,ob@modelid[ll@cou], interior, world, ob@pd[0][ll@cou], ob@pd[1][ll@cou], ob@pd[2][ll@cou], ob@pd[3][ll@cou], ob@pd[4][ll@cou], ob@pd[5][ll@cou]);
        }
        ++ll@cou;                                                                                                                                  // ddsddffff
    }
    fclose(l@map);
    //dt@cr_ob = ll@cou;
    return 1;
}
e o console printou todas as vars como 0.

Os testes feitos com a include do mick88 foram satisfatуrios, estб carregando o mesmo arquivo que estou tentando carregar no meu.

Resultados do debug de um mapa de 7297 objetos:
Код:
[13:16:06] debug1
[13:16:06] -- DEBUG: OBJETO 1 | 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000
[13:16:06] debug1
[13:16:06] -- DEBUG: OBJETO 2 | 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000

(...)

[13:16:11] debug1
[13:16:11] -- DEBUG: OBJETO 7296 | 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000
[13:16:11] debug1
[13:16:11] -- DEBUG: OBJETO 7297 | 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000
Tem algum problema em usar direto a float array global ob@pd[6][10000]?

@edit

Nгo й erro no arquivo, pois:
pawn Код:
Code:
    LoadMap("korace/map/ClimAXX.map");
    LoadMtaMap("korace/map/ClimAXX.map",0);
Reply
#14

Bump
Reply
#15

Quote:
Originally Posted by tonisantolia
Посмотреть сообщение
O Que seria fread? fiquei curioso.
fread й uma funзгo que le uma linha do arquivo. uma funзгo nativa da samp, esta na include file.inc
Reply
#16

Quote:
Originally Posted by Kuddy
Посмотреть сообщение
Realmente, apenas liberou o if, fui testar hoje e:
- Ele estб vendo a quantidade de linhas,
- Estб lendo o arquivo corretamente,
- As variбveis nгo estгo sendo carregadas, usei:
pawn Код:
LoadMap(map[])
{
    if(ob@created > 10000) return er_2(), 0;
    if(!fexist(map)) return er_3(), 0;
    new interior, world;
    new ll@cou, string[400];
    new File:l@map=fopen(map);
    while(fread(l@map, string))
    {
        print(string);
        if(sscanf(string, "p<\">'object''model='d'interior='d'dimension='d'posX='f'posY='f'posZ='f'rotX='f'rotY='f'rotZ='f", ob@modelid[ll@cou], interior, world, ob@pd[0][ll@cou], ob@pd[1][ll@cou], ob@pd[2][ll@cou], ob@pd[3][ll@cou], ob@pd[4][ll@cou], ob@pd[5][ll@cou]))
        {
            dt@cr_ob ++;
            printf("-- DEBUG: OBJETO %d | %d, %d, %d, %f, %f, %f, %f, %f, %f", dt@cr_ob,ob@modelid[ll@cou], interior, world, ob@pd[0][ll@cou], ob@pd[1][ll@cou], ob@pd[2][ll@cou], ob@pd[3][ll@cou], ob@pd[4][ll@cou], ob@pd[5][ll@cou]);
        }
        ++ll@cou;                                                                                                                                  // ddsddffff
    }
    fclose(l@map);
    //dt@cr_ob = ll@cou;
    return 1;
}
e o console printou todas as vars como 0.

Os testes feitos com a include do mick88 foram satisfatуrios, estб carregando o mesmo arquivo que estou tentando carregar no meu.

Resultados do debug de um mapa de 7297 objetos:
Код:
[13:16:06] debug1
[13:16:06] -- DEBUG: OBJETO 1 | 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000
[13:16:06] debug1
[13:16:06] -- DEBUG: OBJETO 2 | 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000

(...)

[13:16:11] debug1
[13:16:11] -- DEBUG: OBJETO 7296 | 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000
[13:16:11] debug1
[13:16:11] -- DEBUG: OBJETO 7297 | 0, 0, 0, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000
Tem algum problema em usar direto a float array global ob@pd[6][10000]?

@edit

Nгo й erro no arquivo, pois:
pawn Код:
Code:
    LoadMap("korace/map/ClimAXX.map");
    LoadMtaMap("korace/map/ClimAXX.map",0);
Sim sim, fui pegar o sscanf do sistema e vi isso tbm, mais eu consegui corrigir .
@edit: desculpe o double post
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)