Balkan SA:MP

PAWN skriptanje, gamemodovi, filterskripte, include fajlovi, mape, pluginovi => Razgovor u vezi PAWN - skriptanja => Temu započeo: .Drakula. poslato Avgust 10, 2018, 00:31:33 PRE PODNE

Naslov: Problem sa sscanf
Poruka od: .Drakula. poslato Avgust 10, 2018, 00:31:33 PRE PODNE
Problem(error/warning): Imam problem sa ssanf. Nisam bas nesto naucio oko njega, jos uvek ucim. Izbauje mi Debug, kod je dole.
Problem je u liniji:            if(sscanf(params, "s[6][4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");          .Moze li mi neko pokazati kako i sta da uradim jer imam na nekoliko mesta u skripti slicnu stvar.

Dio skripte: [pawn]
       new akcija[6];
       if(sscanf(params, "s[6]", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
      {
          new kolicina, nacin[4], str[90];
         if(sscanf(params, "s[6][4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
         if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
             if(!strcmp(nacin, "usd", true))
             {
               format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolara.", GetNameEx(playerid), kolicina);
               SCMTA(-1, str);
               for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                   if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
               }
            }
            else if(!strcmp(nacin, "eur", true))
            {
                format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d eura.", GetNameEx(playerid), kolicina);
                 SCMTA(-1, str);
                 for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                     if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
                 }
             }
      }
[/pawn]
Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log):
sscanf warning: String buffer overflow.
Slika/video ingame problema(obavezno ako je ingame problem): //
Naslov: Odg: Problem sa sscanf
Poruka od: GoodbyeSamp poslato Avgust 10, 2018, 04:05:24 PRE PODNE
Postavi [pawn]new akcija[6+5];[/pawn]
Naslov: Odg: Problem sa sscanf
Poruka od: bc-cod2 poslato Avgust 10, 2018, 10:31:42 PRE PODNE
if(sscanf(params, "s[6]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
Naslov: Odg: Problem sa sscanf
Poruka od: xsar.p poslato Avgust 10, 2018, 10:42:42 PRE PODNE
Citat: buLLeT_ poslato Avgust 10, 2018, 10:31:42 PRE PODNE
if(sscanf(params, "s[6]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
Cemu ovo? Bukvalno si iskopirao kod koji je Dragan_Milosavljevic poslao.
Naslov: Odg: Problem sa sscanf
Poruka od: .Drakula. poslato Avgust 10, 2018, 14:17:23 POSLE PODNE
Nije isto kod.

Moj:
if(sscanf(params, "s[6][4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

buLLeT_:
if(sscanf(params, "s[6]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

Komanda radi, daje usd normalno i daje eur normalno ali mi baca
sscanf warning: String buffer overflow.
Naslov: Odg: Problem sa sscanf
Poruka od: GoodbyeSamp poslato Avgust 10, 2018, 15:56:14 POSLE PODNE
Citat: Dragan_Milosavljevic poslato Avgust 10, 2018, 14:17:23 POSLE PODNE
Nije isto kod.

Moj:
if(sscanf(params, "s[6][4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

buLLeT_:
if(sscanf(params, "s[6]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");

Komanda radi, daje usd normalno i daje eur normalno ali mi baca
sscanf warning: String buffer overflow.
Je si li uradio ovo sto ti rekoh? Probaj staviti vrednost akcije vece od same nje
Naslov: Odg: Problem sa sscanf
Poruka od: .Drakula. poslato Avgust 10, 2018, 16:20:13 POSLE PODNE
Citat: ᴢɪᴠᴋᴏᴠɪá´,, poslato Avgust 10, 2018, 15:56:14 POSLE PODNE
Je si li uradio ovo sto ti rekoh? Probaj staviti vrednost akcije vece od same nje
Uradio sam ovako:
[pawn]new akcija[15];
       if(sscanf(params, "s[15]", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
      {
          new kolicina, nacin[4], str[98];
         if(sscanf(params, "s[15]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
         if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
                        if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");
             if(!strcmp(nacin, "usd", true))
             {
               format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolar/a.", GetNameEx(playerid), kolicina);
               SCMTA(-1, str);
               for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                   if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
               }
            }
            else if(!strcmp(nacin, "eur", true))
            {
                format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d euro/a.", GetNameEx(playerid), kolicina);
                 SCMTA(-1, str);
                 for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                     if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
                 }
             }
      }[/pawn]
Sada komanda radi sasvin normalno i ne baca nikakav error ili warning.
Ali kao sto gore vidis napravio sam limit
[pawn]if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
          if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");[/pawn]
To mi nedozvoljava da dam igracima manje od 1 i vise od 999.999 dolara ili evra.
Ali iznad limita je
[pawn]if(sscanf(params, "s[15]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");[/pawn]
Pa ako ja ukucam /agiveall monej usd 9999999999
meni izbaci error da ne mogu dati vise od 999.999 ali mi baci warning
[pawn]sscanf warning: String buffer overflow.[/pawn]
Naslov: Odg: Problem sa sscanf
Poruka od: GoodbyeSamp poslato Avgust 10, 2018, 16:25:48 POSLE PODNE
Citat: Dragan_Milosavljevic poslato Avgust 10, 2018, 16:20:13 POSLE PODNE
Uradio sam ovako:
[pawn]new akcija[15];
       if(sscanf(params, "s[15]", akcija)) return Cmd(playerid, "/agiveall (xp/level/money/gold)");
                if(strfind(akcija, "money", true) != -1)
      {
          new kolicina, nacin[4], str[98];
         if(sscanf(params, "s[15]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");
         if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
                        if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");
             if(!strcmp(nacin, "usd", true))
             {
               format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolar/a.", GetNameEx(playerid), kolicina);
               SCMTA(-1, str);
               for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                   if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
               }
            }
            else if(!strcmp(nacin, "eur", true))
            {
                format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d euro/a.", GetNameEx(playerid), kolicina);
                 SCMTA(-1, str);
                 for(new i = 0; i <= GetPlayerPoolSize(); i++)
               {
                     if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
                 }
             }
      }[/pawn]
Sada komanda radi sasvin normalno i ne baca nikakav error ili warning.
Ali kao sto gore vidis napravio sam limit
[pawn]if(kolicina < 1) return Error(playerid, "Ne moze manje od 1.");
          if(kolicina > 999999) return Error(playerid, "Ne moze vise od 999.999.");[/pawn]
To mi nedozvoljava da dam igracima manje od 1 i vise od 999.999 dolara ili evra.
Ali iznad limita je
[pawn]if(sscanf(params, "s[15]s[4]i", akcija, nacin, kolicina)) return Cmd(playerid, "/agiveall money (usd/eur) (kolicina)");[/pawn]
Pa ako ja ukucam /agiveall monej usd 9999999999
meni izbaci error da ne mogu dati vise od 999.999 ali mi baci warning
[pawn]sscanf warning: String buffer overflow.[/pawn]
lool zasto u parametru %i a ne %d? stavi %d pa mi reci sta kaze
Naslov: Odg: Problem sa sscanf
Poruka od: GoodbyeSamp poslato Avgust 10, 2018, 16:28:55 POSLE PODNE
PS: moja greska
mislio sam na ' "s[15]s[4]i" ' da stavis ovako ' "s[15]s[4]d" '
Naslov: Odg: Problem sa sscanf
Poruka od: .Drakula. poslato Avgust 10, 2018, 16:58:34 POSLE PODNE
Citat: ᴢɪᴠᴋᴏᴠɪá´,, poslato Avgust 10, 2018, 16:28:55 POSLE PODNE
PS: moja greska
mislio sam na ' "s[15]s[4]i" ' da stavis ovako ' "s[15]s[4]d" '
Razumeo sam sta si hteo da kazes, stavio sam ali se isto ponavlja
Ako ja ukucam /agiveall money usd 9999999999
Izbaci mi
sscanf warning: String buffer overflow.
verovatno cim prekoracim ovo: akcija[15]
Desi se isto kao gore sto sam ti obijasnio.
Naslov: Odg: Problem sa sscanf
Poruka od: GoodbyeSamp poslato Avgust 10, 2018, 17:04:02 POSLE PODNE
Citiracu Alexa(yless-a): "Actually it means that the string you tried to store in the buffer is longer than the specified string." probaj ga povecati pa vidi debugaj probaj pa javi sta kaze
Naslov: Odg: Problem sa sscanf
Poruka od: GoodbyeSamp poslato Avgust 10, 2018, 17:04:20 POSLE PODNE
jer sam ja na fonu sad pa cu kada budem PC proveriti kod
Naslov: Odg: Problem sa sscanf
Poruka od: .Drakula. poslato Avgust 10, 2018, 17:28:48 POSLE PODNE
Ako mozes da mi pomognes bio bi ti zahvalan.
Meni se desava ovako nesto:
http://forum.sa-mp.com/showthread.php?t=304609

Ako moze neko od iskusnijih da pogleda, ako ne postoji resenje za ovaj problem kako bi mogao da preradim komandu.?
Naslov: Odg: Problem sa sscanf
Poruka od: youngdeal poslato Avgust 11, 2018, 01:20:31 PRE PODNE
 evo ti nesto lakse na moj nacin / preradjena komanda,nemam vremena da ti ispravljam tvoju trenutno zurim idem negdje pa sam ti zacas ispisao na moj nacin / preradio komandu, uglavnom stavio sam velicinu sta 15 da mozes stavit moneyusd ili moneyeuro ili money-usd ili money-euro,ja sam stavio monusd i moneuro, mozes izmijenit kako zelis
[pawn]CMD:agiveall(playerid, params[]) {
   new sta[15],kolicina,str[90];
   if(sscanf(params, "s[15]i",sta,kolicina)) return Cmd(playerid, "/agiveall [monusd/moneuro] [kolicina]");
   if(strcmp(sta, "monusd", true) == 0)
   {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [monusd] [kolicina]");
      if(kolicina < 1) return Error(playerid, "Kolicina mora biti veca od 1.");
       format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolara.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
      }
     }
     if(strcmp(sta, "moneuro", true) == 0)
    {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [moneuro] [kolicina]");
      if(kolicina < 1) return Error(playerid, "Kolicina mora biti veca od 1.");
          format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d eura.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
      }
   }
     return 1;
}[/pawn]
EDIT - obojao za sta & velicinu sta - da skontas bolje / da razumijes bolje
Naslov: Odg: Problem sa sscanf
Poruka od: .Drakula. poslato Avgust 11, 2018, 21:59:22 POSLE PODNE
Citat: youngdeal poslato Avgust 11, 2018, 01:20:31 PRE PODNE
evo ti nesto lakse na moj nacin / preradjena komanda,nemam vremena da ti ispravljam tvoju trenutno zurim idem negdje pa sam ti zacas ispisao na moj nacin / preradio komandu, uglavnom stavio sam velicinu sta 15 da mozes stavit moneyusd ili moneyeuro ili money-usd ili money-euro,ja sam stavio monusd i moneuro, mozes izmijenit kako zelis
[pawn]CMD:agiveall(playerid, params[]) {
   new sta[15],kolicina,str[90];
   if(sscanf(params, "s[15]i",sta,kolicina)) return Cmd(playerid, "/agiveall [monusd/moneuro] [kolicina]");
   if(strcmp(sta, "monusd", true) == 0)
   {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [monusd] [kolicina]");
      if(kolicina < 1) return Error(playerid, "Kolicina mora biti veca od 1.");
       format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolara.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
      }
     }
     if(strcmp(sta, "moneuro", true) == 0)
    {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [moneuro] [kolicina]");
      if(kolicina < 1) return Error(playerid, "Kolicina mora biti veca od 1.");
          format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d eura.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
      }
   }
     return 1;
}[/pawn]
EDIT - obojao za sta & velicinu sta - da skontas bolje / da razumijes bolje
Komanda je ok ali testiraj je i probaj da ukucas /agiveall monusd 99999999 ili /agiveall monusd 999999999
Tada nastaje problem.
Zanima me da li to mooze nekako da se resi, niko nece davati tolike pare ali ako se nadje neka budala da proba, server krene da bode i baca errore i warninge
Naslov: Odg: Problem sa sscanf
Poruka od: youngdeal poslato Avgust 11, 2018, 22:33:31 POSLE PODNE
Citat: Dragan_Milosavljevic poslato Avgust 11, 2018, 21:59:22 POSLE PODNE
Komanda je ok ali testiraj je i probaj da ukucas /agiveall monusd 99999999 ili /agiveall monusd 999999999
Tada nastaje problem.
Zanima me da li to mooze nekako da se resi, niko nece davati tolike pare ali ako se nadje neka budala da proba, server krene da bode i baca errore i warninge
testirao je i radi i na /agiveall monusd 99999999 i /agiveall monusd 999999999 i /agiveall monusd 999999999 /agiveall monusd 999999999999 - samo sa ovoliko ne msm radi ne izbacuje warning nikakav nit error samo izbaci kolicina mora biti veca od 1. jer kad ukucas 999999999999 kolicinu ta kolicina ide u minus jer je previse nije normalna kolicina.
  azuriraj sscanf na najnoviju verziju,vidi da nema errora/warninga niti server krene da bode
(https://i.imgur.com/vZ4AO0p.png)
a to ako zelis postaviti max odredjenu kolicinu novca koja se moze dati trebao si reci tako ja sam ti samo rijesio komandu da radi (na moj nacin),evo ovako onda nek ti ide komanda
[pawn]CMD:agiveall(playerid, params[]) {
   new sta[15],kolicina,str[90];
   if(sscanf(params, "s[15]i",sta,kolicina)) return Cmd(playerid, "/agiveall [monusd/moneuro] [kolicina]");
   if(strcmp(sta, "monusd", true) == 0)
   {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [monusd] [kolicina]");
      if(kolicina < 1 || kolicina > 100000) return Error(playerid, "Kolicina mora biti veca od 1 i manja od 100 000.");
       format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d dolara.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerMoney(i, kolicina);
      }
     }
     if(strcmp(sta, "moneuro", true) == 0)
    {
      if(sscanf(params, "s[15]i", sta, kolicina)) return Cmd(playerid, "/agiveall [moneuro] [kolicina]");
      if(kolicina < 1 || kolicina > 100000) return Error(playerid, "Kolicina mora biti veca od 1 i manja od 100 000.");
          format(str, sizeof(str), ""zuta"(info) "bela"Administrator %s je dao svim igracima po %d eura.", GetNameEx(playerid), kolicina);
       SCMTA(-1, str);
      for(new i = 0; i <= GetPlayerPoolSize(); i++)
      {
         if(UlogovanIgrac == 1) m_GivePlayerEuro(i, kolicina);
      }
   }
     return 1;
}[/pawn] stavio sam da moze /agiveall monusd od 1 kolicine do 100 000  i /agiveall moneuro od 1 kolicine do 100 000, ti mozes zamijenit stavit umjesto 100000 stavit 99999999 (jer je max 8 devetki u moneybaru (kod huda), znaci if(kolicina < 1) sam zamijenio sa if(kolicina < 1 || kolicina > 100000)
Naslov: Odg: Problem sa sscanf
Poruka od: .Drakula. poslato Avgust 12, 2018, 00:49:12 PRE PODNE
Hvala.
Sredio sam svoju komandu.
Azurirao sam sscanf i streamer na najnoviju verziju.
Sada je sve ok, sve radi kako treba.
Hvala svima na pomoci.