Muutujate edasiandmine VB-s
#1
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
Vasta
#2
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:
Kood:
AnaloogKonf(1) = 77

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.
Vasta
#3
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.
Vasta
#4
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.
Vasta
#5
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.
Vasta
#6
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.
.txt   AQUA5.txt (Suurus: 104.46 KB / Tõmbamised: 581)
Vasta
#7
Sellise asja parsimine võiks ideaalis võtta 0.1 sekundit.
Äkki loed failist ridahaaval ? Tõmba terve fail mälupuhvrisse ?
Vasta
#8
(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 Sad

Ü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
Vasta
#9
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.

Vasta
#10
Ü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.
Vasta


Alamfoorumi hüpe:


Kasutaja, kes vaatavad seda teemat: 4 külali(st)ne