Jump to content
  • 0

pomoc Jak sečíst stringy


ForestCZE

Dotaz

Zdravím ve spolek, mám tento kód:

 

new slot1[128], slot2[128], allslots[128];
if(personalvehicle[playerid][0] != 0)
{
	format(slot1, sizeof(slot1), "%s", vehName[personalvehicle[playerid][0]]);
}
else
{
	format(slot1, sizeof(slot1), "Prázdný slot 1");
}
						
if(personalvehicle[playerid][1] != 0)
{
	format(slot2, sizeof(slot2), "%s", vehName[personalvehicle[playerid][1]]);
}
else
{
	format(slot2, sizeof(slot2), "Prázdný slot 2");
}

A potřeboval bych tyto dva stringy sečíst do jednoho. Nějak takto:

new result[128];
result = slot1."\n".slot2;
ShowPlayerDialog(playerid, 0, "Menu", result, "Potvrdit", "");

Jsem zvyklý z PHP, ale v pawnu nevím, jak to bude. Našel jsem, že by to mělo být fcí strcat, ale nejde mi to. Díky předem za pomoc :)

Link to comment
Share on other sites

14 odpovědí na tuto otázku

Recommended Posts

  • 4
 
new result[128];
strcat(result, slot1, sizeof(result));
strcat(result, "\n", sizeof(result));
strcat(result, slot2, sizeof(result));
//v proměnné result teď budeš mít výsledný string

Nebo můžeš využít zkrácenější zápis a to přes fci format()

format(result, sizeof(result), "%s\n%s", slot1, slot2);

Více specikátorů máš zde:

http://wiki.sa-mp.com/wiki/Format

Dej si pozor na velikosti stringů... Máš dva o velikost 128 znaků a snažíš se je spojit též do stringu o 128 znacích. Chápu asi, že této velikost nenabývají, ale je zbytečné rezervovat tolik znaků, když je nepotřebuješ.. :/

Link to comment
Share on other sites

  • 2
před 9 minutami, ForestCZE said:

Dobře, díky za vysvětlení. A teď zpět k tomu problému. Netuším, proč, ale mám to takto:

 


new slot1[128], slot2[128], allslots[128];
if(personalvehicle[playerid][0] != 0)
{
	format(slot1, sizeof(slot1), "%s", vehName[personalvehicle[playerid][0]]);
}
else
{
	format(slot1, sizeof(slot1), "Prázdný slot 1");
}
						
if(personalvehicle[playerid][1] != 0)
{
	format(slot2, sizeof(slot2), "%s", vehName[personalvehicle[playerid][1]]);
}
else
{
	format(slot2, sizeof(slot2), "Prázdný slot 2");
}
format(allslots, sizeof(allslots), "%s\n%s", slot1, slot2);
ShowPlayerDialog(playerid, D_PERSONALVEHICLES, DIALOG_STYLE_LIST, "Osobní vozidla", allslots, "Potvrdit", "Zpět");

A dialog to vůbec nezobrazí...

Tipujem, že to padá kvôli tomuto: vehName[personalvehicle[playerid][0]].. 
Ak tvoje vehName vyzerá nejak takto: new vehName[][] = {"Landstalker", ..., "Utility Trailer"}, treba si dať pozor na to, že sa indexuje od 0 do 211 a nie od 400 do 611 (ako pri ID modelov áut).
Navyše ak v personalvehicle nie je uložený model ale ID vozidla, bude potrebné použiť http://wiki.sa-mp.com/wiki/GetVehicleModel

Link to comment
Share on other sites

  • 1
před 28 minutami, GaRGoyLeS said:


 

new result[128];
strcat(result, slot1, sizeof(result));
strcat(result, "\n", sizeof(result));
strcat(result, slot2, sizeof(result));
//v proměnné result teď budeš mít výsledný string

Nebo můžeš využít zkrácenější zápis a to přes fci format()


format(result, sizeof(result), "%s\n%s", slot1, slot2);

Více specikátorů máš zde:

http://wiki.sa-mp.com/wiki/Format

Dej si pozor na velikosti stringů... Máš dva o velikost 128 znaků a snažíš se je spojit též do stringu o 128 znacích. Chápu asi, že této velikost nenabývají, ale je zbytečné rezervovat tolik znaků, když je nepotřebuješ.. :/

Super :) A zeptám se všeobecně. Když je 128 moc, jak mám vědět, kolik nastavit? To mám jít a počítat znak po znaku? (bez sarkasmu, ironie a špatného mínění)

 

EDIT: Nevím, co je špatně, ale dialog se vůbec nezobrazí...

Edited by ForestCZE
Bez chyb, ale nefunkční
Link to comment
Share on other sites

  • 1

Néééé, to rozhodně nemusíš. Stačí nějakým odhadem vydedukovat.. Někdy samozřejmě nemůžeš vědět a prostě si tipneš - radši více než méně, ale zrovna u názvů aut si to zjistit dokážeš.  Určitě máš nějaké pole s názvy aut, stačí se porozhlédnout po nejdelším názvu, mě třeba až na druhý pohled přišel největší tento: "Luggage Trailer A", což má 17 znaků. Dejme tomu, že jsem nenašel ten největší tak si dám rezervu třeba 25 nebo 30. Tady vidíš, že jsi zrovna ušetřil zbytečných 100 znaků. U spousty věcí máš třeba už velikost pevně danou (zde). Například jméno hráče může nabýt maximálně 24 znaků, ale dává se jich 25 pro nulový znak (konečný znak - EOS). Takže třeba zde by bylo úplně zbytečně dělat pole znaků na jméno o velikosti 128 znaků... a divil by ses kolik lidí to dělá.

 

Samozřejmě s dnešní technikou už je to celkem zanedbatelný, když tvůj server nepoběží na bramboře.... ale není špatný se snažit pamětí šetřit.. pokud jednou budeš programovat, taky po tobě bude požadováno, aby tvůj program byl co nejúčinnější, ale zároveň nesebral spoustu výkonu (=optimalizovaný). Takže rozhodně není na škodu se naučit šetřit :d 

Link to comment
Share on other sites

  • 1
před 23 minutami, GaRGoyLeS said:

Néééé, to rozhodně nemusíš. Stačí nějakým odhadem vydedukovat.. Někdy samozřejmě nemůžeš vědět a prostě si tipneš - radši více než méně, ale zrovna u názvů aut si to zjistit dokážeš.  Určitě máš nějaké pole s názvy aut, stačí se porozhlédnout po nejdelším názvu, mě třeba až na druhý pohled přišel největší tento: "Luggage Trailer A", což má 17 znaků. Dejme tomu, že jsem nenašel ten největší tak si dám rezervu třeba 25 nebo 30. Tady vidíš, že jsi zrovna ušetřil zbytečných 100 znaků. U spousty věcí máš třeba už velikost pevně danou (zde). Například jméno hráče může nabýt maximálně 24 znaků, ale dává se jich 25 pro nulový znak (konečný znak - EOS). Takže třeba zde by bylo úplně zbytečně dělat pole znaků na jméno o velikosti 128 znaků... a divil by ses kolik lidí to dělá.

 

Samozřejmě s dnešní technikou už je to celkem zanedbatelný, když tvůj server nepoběží na bramboře.... ale není špatný se snažit pamětí šetřit.. pokud jednou budeš programovat, taky po tobě bude požadováno, aby tvůj program byl co nejúčinnější, ale zároveň nesebral spoustu výkonu (=optimalizovaný). Takže rozhodně není na škodu se naučit šetřit :d 

Dobře, díky za vysvětlení. A teď zpět k tomu problému. Netuším, proč, ale mám to takto:

 

new slot1[128], slot2[128], allslots[128];
if(personalvehicle[playerid][0] != 0)
{
	format(slot1, sizeof(slot1), "%s", vehName[personalvehicle[playerid][0]]);
}
else
{
	format(slot1, sizeof(slot1), "Prázdný slot 1");
}
						
if(personalvehicle[playerid][1] != 0)
{
	format(slot2, sizeof(slot2), "%s", vehName[personalvehicle[playerid][1]]);
}
else
{
	format(slot2, sizeof(slot2), "Prázdný slot 2");
}
format(allslots, sizeof(allslots), "%s\n%s", slot1, slot2);
ShowPlayerDialog(playerid, D_PERSONALVEHICLES, DIALOG_STYLE_LIST, "Osobní vozidla", allslots, "Potvrdit", "Zpět");

A dialog to vůbec nezobrazí...

 

EDIT: Zapomněl jsem odečíst 400

Edited by ForestCZE
Už to frčííí
Link to comment
Share on other sites

  • 0

Pokud je obsah dialogu prazdny (allstlost je null) tak se dialog nezobrazi. Takze doporucuji pouzit neco v tomto duchu:

if(strlen(allslots) > 0) ShowPlayerDialog(playerid, D_PERSONALVEHICLES, DIALOG_STYLE_LIST, "Osobní vozidla", allslots, "Potvrdit", "Zpět");
else SendClientMessage(playerid,-1,"Někde se stala chyba");

Jinak na nejaky odhadovani velikosti pole se vykasli. RAM pameti je vsude dost. A hlavne ta promena existuje jen kdyz je v dane urovni te funkce/podminky a pak se smaze. Tam jde o to ze jen zabira procesorovy cas jeji vytvoreni, ale to je tak mizive ze nestoji za to se tim vubec zabyvat. Takze na velikost promenych muzes s klidnout dusi kaslat (tedy na jeji velkou velikost, pokud das veliksot moc malou tak samozrejme ne :) )
 

Jinak plugin crashdetect rozhodne doporucuji. Hodne urychli hledani nekterych typu problemu :)

Edited by ATomas
Link to comment
Share on other sites

  • 0
On 15. 2. 2018 at 21:23, ATomas said:

Jinak plugin crashdetect rozhodne doporucuji. Hodne urychli hledani nekterych typu problemu :)

A poradíš prosím tě, jak na to?

Link to comment
Share on other sites

  • 0
před 2 hodinami, IllidanS4 said:

Stáhnout, dát do složky plugins a přidat do plugins v server.cfg. Na Win "plugins crashdetect", na Linuxu "plugins crashdetect.so".

[13:48:17] 
[13:48:17] Server Plugins
[13:48:17] --------------
[13:48:17]  Loading plugin: crashdetect.dll
[13:48:17]   CrashDetect v4.18.1 is OK.
[13:48:17]   Loaded.
[13:48:17]  Loaded 1 plugins.

A nikde žádné zprávy o crash

EDIT: A ta rekurze mě taky děsí

Header size:           4508 bytes
Code size:           125640 bytes
Data size:           673772 bytes
Stack/heap size:     262144 bytes; estimated max. usage: unknown, due to recursion
Total requirements: 1066064 bytes

EDIT2: Rekurzi způsobuje include na registraci <dof2> .. je to normální?

Edited by ForestCZE
Doplňující info
Link to comment
Share on other sites

  • 0
CMD:vehicles(playerid, params[]){
	new
	    row[24],
	    str[MAX_PLAYER_VEHICLES*24];
	    
    for(new i = 0; i < MAX_PLAYER_VEHICLES; i++){
        if(VehicleID[playerid][i] != -1){
	        format(row, sizeof(row), "%s\n", VehicleName[GetVehicleModel(VehicleID[playerid][i])-400]);
        } else format(row, sizeof(row), "- Volný slot -\n");
        strcat(str, row);
    }
    
    ShowPlayerDialog(playerid, dialog_vehicle, DIALOG_STYLE_LIST, "Vlastněná vozidla", str, "Spravovat", "Zavřít");
	return true;
}

Takhle to mám já no to sečtení jsem moc nepochopil (asi jsem to vůbec nepochopil).

Edited by rEf
Nepochopil jsem to
Link to comment
Share on other sites

  • 0

Narazil jsem ještě na jeden problém :) Mám:

 

new radiolist[500]; //mám těch rádií víc, ale nechci tu psát moc dlouhý text, princip pak bude stejný
strcat(radiolist, "Stanice\tPosluchačů\n");
strcat(radiolist, "Vypnout rádio\n");
strcat(radiolist, "Evropa 2\t%i\n", listeners[0]);
strcat(radiolist, "Rádio Express\t%i\n", listeners[1]);
strcat(radiolist, "Dance Rádio\t%i", listeners[2]);

new radiostring[500];
format(radiostring, sizeof(radiostring), "%s", radiolist);
ShowPlayerDialogEx(playerid, D_RADIO, DIALOG_STYLE_TABLIST_HEADERS, "Rádio", radiostring, "Zvolit", "Zavřít"); 

Jak do toho strcat zakomponovat format, aby mi to vzalo ty integery? Díky :)

Link to comment
Share on other sites

  • 0
před 16 hodinami, ForestCZE said:

Narazil jsem ještě na jeden problém :) Mám:

 


new radiolist[500]; //mám těch rádií víc, ale nechci tu psát moc dlouhý text, princip pak bude stejný
strcat(radiolist, "Stanice\tPosluchačů\n");
strcat(radiolist, "Vypnout rádio\n");
strcat(radiolist, "Evropa 2\t%i\n", listeners[0]);
strcat(radiolist, "Rádio Express\t%i\n", listeners[1]);
strcat(radiolist, "Dance Rádio\t%i", listeners[2]);

new radiostring[500];
format(radiostring, sizeof(radiostring), "%s", radiolist);
ShowPlayerDialogEx(playerid, D_RADIO, DIALOG_STYLE_TABLIST_HEADERS, "Rádio", radiostring, "Zvolit", "Zavřít"); 

Jak do toho strcat zakomponovat format, aby mi to vzalo ty integery? Díky :)

Možno niečo na tento spôsob:
new radiolist[500];
strcat(radiolist, "Stanice\tPosluchačů\n");
format(radiolist, sizeof(radiolist), "%sEvropa2\t%i\n", radiolist, listeners[0]); 
format(radiolist, sizeof(radiolist), "%sRádio Express\t%i\n", radiolist, listeners[1]);
...
 

Nie som si ale istý, či nebude rýchlejšie naformátovať si nejaký kratší buffer a ten potom pripojiť cez strcat k radiolistu, ktorý bude fungovať ako akumulátor (nikdy som to netestoval):
new radiolist[500];
new buff[32];
format(buff, sizeof(buff), "Evropa 2\t%i\n", listeners[0]);
strcat(radiolist, buff);
format(buff, sizeof(buff), "Rádio Express\t%i\n", listeners[1]);
strcat(radiolist, buff);

...


Možno ešte jedna vec, neviem, či si vynechal nejaký kus kódu, kde využívaš radiostring, ale momentálne mi tá premenná príde zbytočná.
Podľa mňa môžeš do ShowPlayerDialogEx dať priamo radiolist a nepotrebuješ si vyrábať jeho kópiu (radiostring).

Edited by DuFF
Link to comment
Share on other sites

  • 0

Nakonec to mám takto:

new radiolist[500]; 
strcat(radiolist, "Stanice\tPosluchačů\n"); 
strcat(radiolist, "Vypnout rádio\n"); 
format(radiolist, sizeof(radiolist), "%sEvropa 2\t%i\n", radiolist, listeners[0]); 
format(radiolist, sizeof(radiolist), "%sRádio Express\t%i\n", radiolist, listeners[1]);
format(radiolist, sizeof(radiolist), "%sDance Rádio\t%i\n", radiolist, listeners[2]);
ShowPlayerDialogEx(playerid, D_RADIO, DIALOG_STYLE_TABLIST_HEADERS, "Rádio", radiolist, "Zvolit", "Zavřít");

 

Edited by ForestCZE
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...