|
[ Aleksandar Vasic @ 05.10.2007. 20:19 ] @
| Pozdrav, jedno pitanje, npr u TextBox se upise rec od nekoliko slova, kako napisati da se ta rec razlozi na slova na primer da svako slovo bude dodeljeno jedno promenljivoj
npr:
rec: tekst
1. promenljiva = t
2. promenljiva = e
3. promenljiva = k
4. promenljiva = s
5. promenljiva = t |
[ Marko_L @ 05.10.2007. 21:58 ] @
Za tako nešto je bolje koristiti matricu, jer verovatno nećeš uvek znati tačnu dužinu teksta, pa nećeš znati koliko varijabli trebaš da deklarišeš.
Code: Dim sText() As String
Dim i As Long
For i = 1 To Len(Text1.Text)
ReDim Preserve sText(i)
sText(i) = Mid(Text1.Text, i, 1)
Next i
i tako ćeš dobiti matricu sText gde ti je sText(1) prvo slovo, sText(2) drugo slovo i tako dalje. Prvo i zadnje slovo možeš dobiti funkcijama LBound i UBound, recimo ako hoćeš da znaš koje je zadnje slovo
Code: MsgBox sText(Ubound(sText))
[ Aleksandar Vasic @ 05.10.2007. 22:13 ] @
hvala
[ Aleksandar Ružičić @ 06.10.2007. 23:59 ] @
@Marko: imam par zamerki na tvoj post :)
Citat: Za tako nešto je bolje koristiti matricu, jer verovatno nećeš uvek znati tačnu dužinu teksta, pa nećeš znati koliko varijabli trebaš da deklarišeš.
mozda gresim, ali koliko ja znam matrica ne moze da ima samo jednu dimenziju, to je niz (a matrica je visedimenzionlni niz)... ali terminologija i nije toliko bitna, ono sto mi "smeta" u tvom kodu je onaj ReDim Preserve... koji je nepotreban i usporava izvrsavanje koda, elem, potreban je samo ReDim (i to ne Preserve) pre for petlje (jer se pre ulaska u petlju zna duzina stringa koji se deli), znaci 'vako:
Code:
Dim sText() As String * 1 ' dodatna optimizacija
Dim i As Long
ReDim sText(Len(Text1.Text))
For i = 1 To Len(Text1.Text)
sText(i) = Mid(Text1.Text, i, 1)
Next i
[ Marko_L @ 07.10.2007. 05:42 ] @
Citat: mozda gresim, ali koliko ja znam matrica ne moze da ima samo jednu dimenziju, to je niz (a matrica je visedimenzionlni niz)... ali terminologija i nije toliko bitna
Ma stvar je u terminologiju i kako navikneš da izgovaraš pojedine stvari. U programerskom rečinku zapravo i ne postoji reč matrica (matrix), već samo array i multidimensional array, što je zapravo niz i multidimanzionalni niz (koji može da se zove matricom). E sad, nekako sam vremenom navikao da bilo koji array nazivam matricom što možda jeste greška, ali se uglavnom sporazumevam sa kolegama :)
Citat: ono sto mi "smeta" u tvom kodu je onaj ReDim Preserve... koji je nepotreban i usporava izvrsavanje koda, elem, potreban je samo ReDim (i to ne Preserve) pre for petlje (jer se pre ulaska u petlju zna duzina stringa koji se deli), znaci 'vako:
A što ti smeta ? :) Zamisli da je kojim slučajem došao rgdrajko, to bi izgledalo nekako ovako
Code: If Mid(Text1.Text, 1, 1) = "a" then PrvoSlovoIzvucenoIztextBoxaMalopre = "a"
If Mid(Text1.Text, 1, 1) = "b" then PrvoSlovoIzvucenoIztextBoxaMalopre = "b"
...
If Mid(Text1.Text, 5, 1) = "a" then DrugoSlovoIzvucenoIztextBoxaMalopre = "a"
...
Msgbox PrvoSlovoIzvucenoIztextBoxaMalopre & DrugoSlovoIzvucenoIztextBoxaMalopre & TreceSlovoIzvucenoIztextBoxaMalopre
Šalu na stranu, slažem se sa tobom. Iako se ne dobija neko značajno ubrzanje, uvek je dobro optimizovati kod i izbaciti nepotrebne stvari. Kod sam napisao onako "na prvu loptu" bez razmišljanja.
[ Aleksandar Ružičić @ 07.10.2007. 13:06 ] @
ma znam ja da si to ti pisao na brzinu, i da znas "da tako ne treba", nego da se ostali ne bi naviknuli da koriste ReDim Preserve unutar For petlje
Citat:
A što ti smeta ?  Zamisli da je kojim slučajem došao rgdrajko, to bi izgledalo nekako ovako
Code:
If Mid(Text1.Text, 1, 1) = "a" then PrvoSlovoIzvucenoIztextBoxaMalopre = "a"
If Mid(Text1.Text, 1, 1) = "b" then PrvoSlovoIzvucenoIztextBoxaMalopre = "b"
...
If Mid(Text1.Text, 5, 1) = "a" then DrugoSlovoIzvucenoIztextBoxaMalopre = "a"
...
Msgbox PrvoSlovoIzvucenoIztextBoxaMalopre & DrugoSlovoIzvucenoIztextBoxaMalopre & TreceSlovoIzvucenoIztextBoxaMalopre
LOL 
[ BinLaden @ 09.10.2007. 19:55 ] @
Kad ste vec krenili sa ispravkama moram i ja da se umijesam.
Kao prvo koliko ja znam niz uvijek pocinje od Nule nevazno dali je
posle definisan Sa Redim ili Redim Preserve, uvijek mu je nulti prvi zapis,
a obadvojica u for petlji krecete od 1 i preskacete odnosno
ostavljate prazan prvi odnosno nulti zapis.
I ovo sto je @Marko_l rekao, sa LBound nebi dobi prvo slovo rijci nego
bi dobio 0 zapis koji je prazan.
Slazem se sa @Aleksandrom da je u ovom slucaju bolje koristiti Redim
od Redim Preserve ali ima situacija gdje je on neizbijezan.Imam jednu
aplikaciju u kojoj sam Koristio Redim Preserve koji se vrti u petlji po nekoliko
hiljada puta i nisam primijetio da nesto vidno usporava program.
Jos nesto, komanda Redim ponistava citav niz, odnosno ukoliko je u nizu
bilo nekih podataka oni posle Redim vise nece postojati, dok Redim Preserve samo
definise novu duzinu niza ne brisuci podatke koji se vec nalaze u nizu.
[ Marko_L @ 09.10.2007. 20:40 ] @
Da, to je tačno, ali lako rešivo.
Umesto
Code: ReDim sText(Len(Text1.Text))
treba da ide
Code: ReDim sText(1 To Len(Text1.Text))
i to ako mu uopšte treba da dobije prvo slovo na taj način. Uvek može da ga zatraži sa sText(1).
[ rgdrajko @ 11.10.2007. 22:03 ] @
Citat: Marko_L: A što ti smeta ? :) Zamisli da je kojim slučajem došao rgdrajko...
Ok, shvaticu ovo kao salu coveka koji nezna kada je vreme za salu i koji ne ume da napravi salu, a drugo gospodine Marko ja i ti nismo prijatelji da bi se ti tako salio samnom. Postuj ti mene i ja cu tebe.
Svi izlozeni primeri, od oba moderatora, koji su se ovde prepucavali sa silnim znanjem, do ove zadnje ispravke na koju je opomenuo Bin laden kada se unesu u program ne rade i tu je Bin Laden apsolutno u pravu. Vi cesto pisete kod bez testiranja i onda se pojavljuju mnoge greske dok vas neko ne ispravi, ne bi bila losa praksa da uz svaki komentar ubuduce prikacite i vas kod u zip fajlu, onda se ovakve greske nece desavati.
Citat: Marko_L: Da, to je tačno, ali lako rešivo.
Umesto
Code: ReDim sText(Len(Text1.Text))
treba da ide
Code: ReDim sText(1 To Len(Text1.Text))
i to ako mu uopšte treba da dobije prvo slovo na taj način. Uvek može da ga zatraži sa sText(1).
Umesto ovog gornjeg koda mogao si da stavis:
Code: Option Base 1
i sve bi radilo. Option Base 0 je podrazumevana vrednost sa kojom si od prvog posta baratao.
[ Shadowed @ 11.10.2007. 22:40 ] @
U Markovom kodu ne radi jedino taj LBound, ali ne znam zasto ga uopste pominjao, prvi element dobijes index-om 1, drugi 2 i tako do UBound. Nije nikakav problem ako koristis elemente niza od 1 (osim maaalo veceg zauzeca memorije, bar u ovom slucaju) pod uslovom da tako stalno radis.
Sto se shale tice, necu mnogo komentarisati ali mislim da je imala osnova :)
[ rgdrajko @ 11.10.2007. 23:44 ] @
Citat: Shadowed: U Markovom kodu ne radi jedino taj LBound, ali ne znam zasto ga uopste pominjao, prvi element dobijes index-om 1, drugi 2 i tako do UBound. Nije nikakav problem ako koristis elemente niza od 1 (osim maaalo veceg zauzeca memorije, bar u ovom slucaju) pod uslovom da tako stalno radis.
Sto se shale tice, necu mnogo komentarisati ali mislim da je imala osnova :)
Mislis da je ovo korektno.
[Ovu poruku je menjao rgdrajko dana 12.10.2007. u 01:21 GMT+1]
[ Shadowed @ 11.10.2007. 23:59 ] @
Nemas pojma koliko je smesno kada to ti kazes
[ BinLaden @ 12.10.2007. 00:39 ] @
+Evo jos jedan polu-offtopic.
Moj prvi post je bio izazvan @aleksanrovim ispravkom @markovog rjesenja, odnosno
vec sam jednom rekao da je ovaj forum postao monoton i u dosta slucajeva se svodi
na prepucavanje izmedju najaktivnijih clanova i modaratora cim neko primjeti
neku "greskicu" odnosno neko drugo rjeseje. Poceli smo najbanalniji
problem da razlazemo na detalje. Jedino sto me raduje je to sto je
ovde izgleda pocela da vlada demokretija, pa su i Moderatori poceli jedan drugog
da ispravljaju.
Citat: ma znam ja da si to ti pisao na brzinu, i da znas "da tako ne treba",
nego da se ostali ne bi naviknuli da koriste ReDim Preserve unutar For petlje
U 90% slucajeva (Redim Preserve) se koristi BAS u petlji, doduse vecinom u (Do) petlji
odnosno kad neznas tacan broj izvrsenja petlje i ne znam zbog cega ono "da se ostali
ne bi navukli" i "da tako ne treba"?
Citat: Nije nikakav problem ako koristis elemente niza od 1
(osim maaalo veceg zauzeca memorije, bar u ovom slucaju) pod uslovom da tako stalno radis.
Zauzece memoirje je najmanji problem u ovom slucaju, problem je ako se pokusa iscitati
prazan zapis u nizu, doci ce do greske. Tj. ne u ovom slucaju, nego nastavljam ispravke
koje je @Aleksandar poceo, u globalnom pogledu kada uzmemo da skoro sve komponente,
kontrole i ostalo po defoult-u pocinje od 0 bolje je u svakom smislu popunjavanje niza
poceti od 0.
A sto se tice zauzeca memorije niza, u ovom slucaju vise memorije ce zauzet taj prazan
zapis nego ako mu dodijelimo vrijednost nekog znaka, osim u slucaju kako je
@aleksandar rekao Za dodatnu optimalizaciju. Ali kad dodamo da se tu radi o byte-ovima
o tome je glupost pricati.
[ Shadowed @ 12.10.2007. 01:40 ] @
ReDim koristis onako kako je u odgovarajucoj situaciji najbolje. Ovde je bolje jednom pre petlje. Negde je mozda neophodno da se vrsi svaki put unutar petlje. Sto manje, to bolje. Nisam siguran, ali ako nisam nesto pomesao (slicna je stvar sa stringovima u .net-u), kada uradis ReDim Preserve, kreira se nov niz pa se zatim kopira sadrzaj starog u taj nov a stari odbacuje. Zbog toga (dodatno) preporucljivo vrsiti ovo sto manje puta.
Ostalo se slazem. Samo bih napomenuo da sam rekao "ako tako stalno radis". Znaci, ako uvek citas od 1, onda nije problem. Inace, ja praktikujem od 0 osim kada je nekad logika aplikacije takva da je lakse koristiti od 1 nego stalno neku vrednost smanjivati, povecavati za 1.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|