Postitused: 578
Teemad: 140
Liitus: Dec 2009
Soovin üht teatud koodijuppi korduvalt kasutada. Jup loeb ini-failist muutujad ja kopeerib nad vastavasse maatriksisse. Jupp eraldi töötab aga funktsioonina välja kutsudes ei oska kuidagi talle salvestuskoha nime edasi anda.
Väljakutse ( siin tahan, et jubin salvestaks töö tulemused maatriksisse "AnaloogKonf"
Kood: Ret = KopeeriIOKonfMuutujasse(AnaloogKonf, "AnaloogSisend 1")
Ja funktsioon ise. KonfiBlokiNimi peaks saama väärtuse "AnaloogKonf" aga seda ei juhtu.
Kas maatriksi nime üldse annab nii edastada?
Kood: Private Function KopeeriIOKonfMuutujasse(KonfiBlokiNimi, IONimi)
Dim KeyValue$
Dim Ret
Dim n, m
KeyValue$ = VBGetPrivateProfileString("IONimi", "IOaadress", FileName$)
KonfiBlokiNimi(1) = Val(KeyValue$)
KeyValue$ = VBGetPrivateProfileString("IONimi", "IOTüüp", FileName$)
KonfiBlokiNimi(2) = Val(KeyValue$)
KeyValue$ = VBGetPrivateProfileString("IONimi", "DispX", FileName$)
KonfiBlokiNimi(3) = Val(KeyValue$)
KeyValue$ = VBGetPrivateProfileString("IONimi", "DispY", FileName$)
KonfiBlokiNimi(4) = Val(KeyValue$)
KeyValue$ = VBGetPrivateProfileString("IONimi", "Atrib", FileName$)
KonfiBlokiNimi(5) = Val(KeyValue$)
KeyValue$ = VBGetPrivateProfileString("IONimi", "Nimi", FileName$)
For Ret = 1 To Len(KeyValue$)
KonfiBlokiNimi(6 + (Ret - 1)) = Mid(KeyValue$, Ret, 1)
Next Ret
n = 12 - Len(KeyValue$)
If n > 0 Then
KonfiBlokiNimi(8) = 13
n = n - 1
For m = 1 To n
KonfiBlokiNimi(6 + (Ret - 1) + m) = 0
Next m
End If
KeyValue$ = VBGetPrivateProfileString("IONimi", "KoefA", FileName$)
Ret = ujuta(Val(KeyValue$))
KonfiBlokiNimi(18) = mantiss
KonfiBlokiNimi(19) = bait0
KonfiBlokiNimi(20) = bait1
KonfiBlokiNimi(21) = bait2
KeyValue$ = VBGetPrivateProfileString("IONimi", "KoefB", FileName$)
Ret = ujuta(Val(KeyValue$))
KonfiBlokiNimi(22) = mantiss
KonfiBlokiNimi(23) = bait0
KonfiBlokiNimi(24) = bait1
KonfiBlokiNimi(25) = bait2
KeyValue$ = VBGetPrivateProfileString("IONimi", "ÜhikuKood", FileName$)
KonfiBlokiNimi(26) = Val(KeyValue$)
End Function
Postitused: 20
Teemad: 1
Liitus: Dec 2009
03-12-2011, 02:54 AM
(Seda postitust muudeti viimati: 03-12-2011, 02:59 AM ja muutjaks oli Elektrik.)
Tere felch.
Oled lahenduse leidnud juba?
Kui ei, siis prooviks aidata.
Kuidas see massiiv ehk maatriks Sul deklareeritud on?
Kas midagi sellist?
Kood: Dim KonfiBlokiNimi(26) as Integer
Et mis see muutujatüüp on? Täisarv ehk Integer?
Ma eeldan et täisarv, sest muudad ju INI'st loetud väärtused "numbriteks", Val'iga.
Kui nii, siis funktsiooni KopeeriIOKonfMuutujasse päis peaks olema selline:
Kood: Private Function KopeeriIOKonfMuutujasse(KonfiBlokiNimi() As Integer, IONimi)
Nii peaks asi töötama Sul.
EDIT: lihtsalt infoks:
Oletame, et teed mingi massiivi:
Kood: Dim AnaloogKonf(26) As Integer
Omistad mingi väärtuse ühele elemendile:
siis nüüd Sinu KopeeriIOKonfMuutujasse funktsioon peaks selle väärtusega nüüd tuttav olema.
Minu lihtne "debug" koodijupp, mis aitab selles veenduda: Kood: MsgBox Str(KonfiBlokiNimi(1))
KopeeriIOKonfMuutujasse funktsiooni panin selle. Sina muidugi loed andmed INI failist. Mul suvaarvud lihtsalt näiteks.
Postitused: 578
Teemad: 140
Liitus: Dec 2009
Tänks, sain tööle küll.
Funktsiooni päis:
Kood: Private Function KopeeriIOKonfMuutujasse(KonfiBlokiNimi, IONimi As String)
Väljakutsumine:
Kood: Ret = KopeeriIOKonfMuutujasse(AnaloogKonf, ("AnaloogSisend" + Str(n)))
Hetkel tegin asja ringi - nüüd on 1 n-dimensionaalne "andmekuubik".Jama on selles, et inist lugedeson muutujad nagu muutujad ikka. Kontroller aga saadad baithaaval ja edasi tuleb teisendada. Seda tegevust on maru palju...aga tegelen hetkel. Annab lootust. Huvitava kombel on just ini-st lugemine see kõige aeglasem tükk. TEgin lausa progressbar'iga laadimise indikaatori et oleks aru saada, millega parasjagu tegeletakse.
Postitused: 20
Teemad: 1
Liitus: Dec 2009
Hmm, kui suur INI on siis? KB? MB?
Ma igapäev VB'd ei näpi. Ma rohkem Delphi'ga mässan.
Aga Delphis nagu väga aeglane see küll pole. Rääkimata "progressi" kuvamisest.
Sellepärast hakkasingi mõtlema, et huvitav, kui suur Su ini fail siis on, et nii aeglane.
Postitused: 288
Teemad: 40
Liitus: Dec 2009
Vastan väga laiahaardeliselt kuna puudub kogemus VBga.
Kui ini lugemine võtab eoone, siis proovi asi läbi profileri lasta. Kuna praegu on arvutid nii krdi kiired, siis võib toimuda midagi stiilis "ava fail - loe filecache sisse 10MB - võta failist bait - pane kinni - flushi cache" ja nii iga baidi kohta. Või analoogne tegevus.
Ma olen paljusid programme debugida aidanud, mis on "peaaegu kiired" aga "see asi jupsib natuke", vahel leiab jubedat bloati, kasutatakse mingit legacy funktsiooni, stiilis Win7 alla wrapitud XP funktsioon mis varem oli XP alla wrapitud NT funktsioon mis varem oli NT alla wrapitud OS2 kompatiiblusega WIn 3.11 funktsioon, mis varem oli 3.11 alla wrapitud DOS funktsioon mis omakorda tehti kunagi workaroundina CPM süsteemist.
Postitused: 578
Teemad: 140
Liitus: Dec 2009
04-12-2011, 11:09 AM
(Seda postitust muudeti viimati: 04-12-2011, 11:11 AM ja muutjaks oli felch.)
Ini fail on suhteliselt pikk: 105 kB. Teksti on palju. Et oleks inimloetav. Faili lugemiseks kasutan Kernel32 lib'i funktsioone. Ega ta nüüd nii meeletult aeglane ka ole aga kokku läheb faili parsimisele kuskil 5+ sekundit. Minu meelest võiks kiirem olla.
Mismoodi lib tehtud on, pole aimugi. Vast on kiirem kui ise funktsiooni kirjutades.
Panin faili laiendiks .txt kuna foorum teda muidu ei seedinud.
AQUA5.txt (Suurus: 104.46 KB / Tõmbamised: 585)
Postitused: 288
Teemad: 40
Liitus: Dec 2009
Sellise asja parsimine võiks ideaalis võtta 0.1 sekundit.
Äkki loed failist ridahaaval ? Tõmba terve fail mälupuhvrisse ?
Postitused: 137
Teemad: 3
Liitus: Dec 2009
(04-12-2011, 11:39 AM)KaruTEC Kirjutas: Sellise asja parsimine võiks ideaalis võtta 0.1 sekundit.
Äkki loed failist ridahaaval ? Tõmba terve fail mälupuhvrisse ? Mõistlik, sest see 'VBGetPrivateProfileString("IONimi", "KoefB", FileName$)" paistab iga kord faili uuesti läbi lugevat
Üks variant on lugeda fail alguses paisktabelitesse (hashtable) või sõnastikesse (dictionary), ja pärast teha abifunktsioon 'MyGetProfileString', mille kasutamine analoogne funktsioonile 'VBGetPrivateProfileString', ainult et faili asemel kasutab mällu loetud andmeid.
Iseenesest oleksin selle variandi ka kohe valmis visanud, aga mul pole VB6-te, mida felch paistab kasutavat. Sõber Google aitab ehk järjele, näiteks siit: http://www.vbforums.com/showthread.php?t=431190 või siit: http://www.vbaccelerator.com/home/VB/cod...rticle.asp
Postitused: 334
Teemad: 26
Liitus: May 2011
04-12-2011, 02:36 PM
(Seda postitust muudeti viimati: 04-12-2011, 02:38 PM ja muutjaks oli A.R..)
Kirjutasin Lcc-32 all väikese testi.
Avan faili,
loen ridade kaupa,
seal vahel on veel pisianalüüs et mis on rea juhtstring. (Näidiseks)
salvestan loetu 200 kb faili.
_____________________________________________
char Fail[200000];
Fail[0]=0;
infile = fopen( iniFail,"rt" );
if( infile == NULL ){
wsprintf(txt, "fopen: Algseade fail %s ei avane\n\r", iniFail);
MessageBox(NULL,txt, "Veateade", MB_OK);
}else{
while( (p=fgets(txt, 70, infile))){
// if(*p==';') continue;
p1=p;
// while(*p1!=':')p1++;
// *p1++=0;
// while(*p1==' ') p1++;
if(!strcmp(txt, "TEST")){
test=1;
}
if(!strcmp(txt, "N")){
strcpy(Null, p1);
Null[strlen(Null)-1]=0;
}
if(!strcmp(txt, "NR")){
nr=(int)strtol(p1,&p1,10);
}
strcpy(Fail+strlen(Fail), p1);
}
fclose(infile);
}
}
________________________________
Ja kõik see lugemine võtab alla sekundi.
(Programm sek osasid ei lugenud.)
Kasutusel on arvuti 1,83 GHz Win-XP.
Selle C teksti pakkus translaator ise välja, mina lisasin
ainult lugemise, aja mõõtmise ja näitamise osa.
Copyd ühest vanemast asjast.
Kui kahtled-kõhkled, (võin saata) saadan kogu programmi exe ja/või C ja
ka lingid vabavaralisle LCC-le. Ühe USA (üli) koolpoisi tehtud.
Proovi. Ei kahetse. Usu vana inimest.
Basic on tore, kirjutasime selles 85. raamatu küljenduse programmi aga ......
Kui tahad, saad oma programmist kasvõi DOS versiooni või siis midagi muud uuemat.
Postitused: 20
Teemad: 1
Liitus: Dec 2009
Üks variant on kirjutada andmed registrisse.
Aga jah, kui igale inimesele kes Su softi kasutab, peavad andmed nähtavad ja loetavad olema, siis läheb raskeks.
Üks variant on teha eraldi programmijupp, mis kuvab need andmed registrist mingisse tabelisse vms ja siis kasutaja saab neid redigeerida ja salvestada.
Ega enne kiiremaks ei lähe, kuni Get(Set)PrivateProfileString'ist vabaned.
XML' ei tasu ka ära. Pigem proovi Windowsi Registrit.
|