←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Losowanie tekstu ze stringu do drugiego

  • +
  • -
wiwi249 - zdjęcie wiwi249 22.09.2014

Hej!

Mam mały problem, nie chcę się bachnąć.

Mam dwie tablice:

new tablica[5] 
formatex(tablica, charsmax(tablica), "abcde");

...

new tekst[8];

I teraz, za pomocą pętli for, uzupełniam tablicę tekst. Poprawnie to będzie, jeśli zrobię to w następujący sposób?

for(new i=0; i<=8; i++)
{
		tekst[i] = tablica[random_num(0,4)];
}

Jeśli nie, jak to inaczej zrobić? Przeglądam dokumentację biblioteki string ale nie mam pomysłu.


Użytkownik wiwi249 edytował ten post 22.09.2014 21:57
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 22.09.2014

Zacznijmy od tego, czym chcesz ją wypełnić? Losowymi literami?

Odpowiedz

  • +
  • -
wiwi249 - zdjęcie wiwi249 22.09.2014

Tak jest, losowymi literami z tablicy ;)

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 22.09.2014

To kombinujesz w dobrą stronę, ale... to jeszcze nie to :)

 

Litera w programie komputerowym to nic innego, jak cyfra o odpowiedniej wartości... ale nie są to wartości od 0 do 4 (te są zarezerwowane dla specjalnych znaków), ale 65-90 dla wielkich liter i 97-122 dla małych. Ale nie trzeba tych wartości pamiętać, wystarczy użyć 'A' i 'Z' dla wielkich liter oraz 'a' i 'z' dla małych. Więc random_num('a', 'z') wylosuje małą literę. Jeśli chcesz losować wielkie lub małe, trzeba troszkę nakombinować.

 

I pamiętaj, że ostatni znak musi być KONIECZNIE nullem (czyli znakiem o numerze 0).

 

Tak, jak zrobiłeś również zadziała, ale jest trochę naokoło. Lepiej od początku uczyć się dobrych praktyk

Odpowiedz

  • +
  • -
wiwi249 - zdjęcie wiwi249 22.09.2014

Czyli sugerujesz nie wykorzystywać w ogóle tablicy "tablica[5]" ? Rozumiem chyba. Skoro zadziała to okej, dzięki wielkie ;)

Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 22.09.2014

Twój pomysł byłby dobry jesli chciałbyś losować tylko z jakiegoś wzorca (wzorzec to tablica) tyle że do Twojej tablicy możesz wpisać 4 znaki a nie 5 tak jak to zrobiłeś bo zawsze musisz zarezerwować sobie ostatni element na znacznik końca ciągu-znaków

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 23.09.2014

Twój pomysł byłby dobry jesli chciałbyś losować tylko z jakiegoś wzorca (wzorzec to tablica) tyle że do Twojej tablicy możesz wpisać 4 znaki a nie 5 tak jak to zrobiłeś bo zawsze musisz zarezerwować sobie ostatni element na znacznik końca ciągu-znaków

Chyba chciałeś napisać 7 znaków, a nie 8 ^ ^
sebul (23.09.2014 16:56):
*a nie 9
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 23.09.2014


Chyba chciałeś napisać 7 znaków, a nie 8 ^ ^

 

 


new tablica[5]

 

 

EDIT

Wiem Sebul ale przestałem debbugować jak znalazłem pierwszy błąd ^^


sebul (23.09.2014 16:50):
I? Przecież to jest ta tablica, z której losuje się znaki, niżej masz inną tablicę, do której są przypisywane znaki ^ ^
sebul (23.09.2014 16:54):
A dobra, w obydwu miejscach jest źle :D
Zarówno przy tablicy "tablica" (ale tutaj po prostu nie zapisze "e"), ale też w tablicy "tekst" jest pętla od 0 do 8, a powinna być od 0 do 6.

Użytkownik G[o]Q edytował ten post 23.09.2014 17:54
Odpowiedz

  • +
  • -
wiwi249 - zdjęcie wiwi249 23.09.2014

w takim razie wedlug tego ma byc tak?

new tablica[5] 
formatex(tablica, charsmax(tablica), "abcd"); //tutaj 4 znaki jak tablica jest 5-znakowa?

...

new tekst[9];
for(new i=0; i<=8; i++)
{
        tekst[i] = tablica[random_num(0,4)]; //tutaj podobnie?
}
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 23.09.2014

random(0,3) albo random(o,charsmax(tablica))

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 23.09.2014

W przypadku tablicy źródłowej nie gra to roli, czy będzie null na końcu, czy nie, bo może go nie być... Tą tablicę traktujemy jako zbiór znaków, a nie jako string. Jednak żeby nulla na końcu nie było, musimy ją wypełnić mniej więcej w taki sposób:

 

new tablica[] = {'a', 'b', 'c', 'd', 'e'};

I absolutnie nic tu się złego nie stanie, jeśli każdy ze znaków będziemy używać osobno, a nie całość jako string. Nie możemy tego potraktować formatem, bo nam ten null na końcu wstawi (albo przynajmniej spróbuje).

 

Prawdziwy problem jest tu:

new tekst[9];
for(new i=0; i<=8; i++)

Jeśli tablicę docelową również masz zamiar użyć tak, jak źródłową, czyli każdy znak z osobna to nie ma się tu do czego przyczepić, ale jej nazwa wskazuje co innego...

Wypełniasz ją całą tekstem i na końcu nie ma miejsca na znak null. Pętla powinna wyglądać tak:

new tekst[9];
for(new i=0; i<8; i++)

a po pętli powinno znaleźć się jeszcze:

tekst[8] = '^0'

 

I taka przestroga na przyszłość, jeśli chcesz dodać tego nulla na końcu stringa to nie używaj nigdy:

tekst[8] = 0

nie chodzi tu o to, że to nie zadziała, bo zrobi dokładnie to co wyżej... chodzi o to, że poprzedni zapis od razu sugeruje, że operujemy na tekście, a nie na liczbach, więc jest od razu czytelniejszy nie tylko dla osoby trzeciej, ale też dla Ciebie gdy za tydzień, miesiąc, rok czy dwa zaglądniesz do kodu i będziesz się zastanawiał co tutaj miałeś na myśli.

Odpowiedz