Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Izdvajanje razlicitih elemenata dva Array

[es] :: Visual Basic 6 :: Izdvajanje razlicitih elemenata dva Array

[ Pregleda: 2622 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

steve585
Stevan Stanić
Project Manager
Zagreb

Član broj: 131815
Poruke: 281
*.xnet.hr.



+1 Profil

icon Izdvajanje razlicitih elemenata dva Array04.04.2008. u 19:18 - pre 194 meseci
Dakle kao sto i sam naslov govori trebao bih uporediti vrijednosti iz dva Array-a, te izbaciti razlicite vrijednosti.
Mislio sam da unutar VBA postoji funkcija tipa ArrayDiff.
ono sto sam dosada uspio napraviti je sljedce:

Code:

Trazeni_File_Array = Array(Left(Lista_P, Duzina_Liste_P))
Lista_Imena = Array(Left(Lista, Duzina_Liste))

 x = True
   For i = LBound(Trazeni_File_Array) To UBound(Trazeni_File_Array)
   If Trazeni_File_Array(i) <> Lista_Imena(i) Then
      x = False
      Exit For
   End If
   Next i
 If x = True Then
   MsgBox "Match"
 Else
   MsgBox "Item " & Trazeni_File_Array(i) & " does not match"
 End If


Na ovaj nacin uspijem dobiti da li prvi i drugi array imaju istu vrijednost.

Medjutim osim ove vrijednosti trebao bih i pronaci element unutar Array-a koji je razlicit od elemenata drugog Array-a.

Probao sam sljedece:
Code:

Tabelle1.Cells(10, 1) = Trazeni_File_Array
Tabelle1.Cells(10, 2) = Lista_Imena
c = Asc(Trazeni_File_Array(i)) - Asc(Lista_Imena(i))
Tabelle1.Cells(10, 3) = c

Medjutim bez uspjeha. Vrijednost c je uvijek 0. Ima li tko ideju kako izdvojiti razlicit element iz Array-a.

steve585
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.115.*



+7 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array04.04.2008. u 23:26 - pre 194 meseci
U slucaju da su nizovi iste duzine mozes ovako ... ako nisu promeni malo kod
Za VBA ovo moze i bez deklaracija promenljivih ...

Code:

'Deklaracija dva string niza iste duzine
Dim Trazeni_File_Array(0 To 3) As String
Dim Lista_Imena(0 To 3) As String

'U petlji popunjavamo vrednosti
For n = LBound(Trazeni_File_Array) To UBound(Trazeni_File_Array)
Trazeni_File_Array(n) = "Tekst" & CStr(n)
Lista_Imena(n) = "Tekst" & CStr(n)
Next n

'Ovo iznad je napisano samo zbog testiranja ...
'Deklarisemo niz za sve rezultate
Dim Results() As Boolean ' Ovo mora ovako zato sto se u VB-u tako prave dinamicki nizovi (neznamo velicinu dok programiramo ... )
ReDim Results(LBound(Trazeni_File_Array) To UBound(Trazeni_File_Array))
'Boolean koji ce biti True ako su svi elementi isti ili False ako nisu
Dim x As Boolean
x = True
For i = LBound(Trazeni_File_Array) To UBound(Trazeni_File_Array)
If Trazeni_File_Array(i) <> Lista_Imena(i) Then
    x = False
    Results(i) = False
Else
    Results(i) = True
End If
Next i

'Ako su svi isti x je ostao True , u suprotnom je False. U Results su poredjani rezultati kao True ili False

 If x = True Then
   MsgBox "Match"
 Else
   MsgBox "Item " & Trazeni_File_Array(i) & " does not match"
 End If
 
 For test = LBound(Results) To UBound(Results)
 MsgBox "Rezultat sa indeksom " & CStr(test) & " je " & CStr(Results(test))
 Next
 

 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array05.04.2008. u 00:03 - pre 194 meseci
evo ArrayDiff ako zatreba:
Code:

Sub ArrayDiff(a1 As Variant, a2 As Variant, ByRef diff As Variant, Optional checkBoth As Boolean = False, Optional Compare As VbCompareMethod = vbBinaryCompare)
    
    If IsArray(a1) And IsArray(a2) And IsArray(diff) Then
        
        Dim i           As Long
        Dim k           As Long
        Dim diffCount   As Long
        Dim found       As Boolean
        
        diffCount = 0
        
        For i = LBound(a1) To UBound(a1)
            found = False
            For k = LBound(a2) To UBound(a2)
                If TypeName(a1) = "String()" Then
                    If StrComp(a1(i), a2(k), Compare) = 0 Then
                        found = True
                        Exit For
                    End If
                Else
                    If a1(i) = a2(k) Then
                        found = True
                        Exit For
                    End If
                End If
            Next
            
            If Not found Then
                ReDim Preserve diff(0 To diffCount)
                diff(diffCount) = a1(i)
                diffCount = diffCount + 1
            End If
            
        Next
        
        If checkBoth Then
            
            For i = LBound(a2) To UBound(a2)
                found = False
                For k = LBound(a1) To UBound(a1)
                    If TypeName(a2) = "String()" Then
                        If StrComp(a2(i), a1(k), Compare) = 0 Then
                            found = True
                            Exit For
                        End If
                    Else
                        If a2(i) = a1(k) Then
                            found = True
                            Exit For
                        End If
                    End If
                Next
                
                If Not found Then
                    ReDim Preserve diff(0 To diffCount)
                    diff(diffCount) = a2(i)
                    diffCount = diffCount + 1
                End If
                
            Next
    
        End If
    
    End If

End Sub


test:
Code:

Dim i As Long
    
    
    Dim a(1 To 4) As String
    Dim b(2 To 6) As String
    
    Dim diff() As String
    
    a(1) = "a"
    a(2) = "b"
    a(3) = "c"
    a(4) = "d"
    
    b(2) = "c"
    b(3) = "a"
    b(4) = "123"
    b(5) = "b"
    b(6) = "..."
    
    ArrayDiff a, b, diff, True
    
    
    For i = LBound(diff) To UBound(diff)
        Debug.Print "diff("; i; ") = "; diff(i)
    Next


rezultat:
Code:

diff( 0 ) = d
diff( 1 ) = 123
diff( 2 ) = ...


morao sam malo da radim u vb-u, nisam odavno :)
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.115.*



+7 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array05.04.2008. u 09:16 - pre 194 meseci
Dobra FN :)
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array05.04.2008. u 09:45 - pre 194 meseci
A da proverite prvo da li nizovi imaju vise od... recimo 100 elemenata i ako imaju da ih smestite u dva binary search tree-a? Jos bolje balanced tree, ali je komplikovanija izvedba, ako nema gotovog.
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.115.*



+7 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array05.04.2008. u 11:30 - pre 194 meseci
Mislim da ce mu ova Aleksandrova funkcija biti sasvim dovoljna ... ipak je to VBA u Excelu
 
Odgovor na temu

steve585
Stevan Stanić
Project Manager
Zagreb

Član broj: 131815
Poruke: 281
*.xnet.hr.



+1 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array05.04.2008. u 14:26 - pre 194 meseci
I prva i druga opcija rade :-)

Mislim da bi ovo inace koristilo kod programiranja i u VB 6.0, pa me zanima da li je moguce Aleksandrovu funkciju nekako pohraniti i pozivati po potrebi kao neke standardne funkcije. Ovo samo kao prijedlog ako netko ima vremena.
steve585
 
Odgovor na temu

stefanpn
Total anonymous
Programer

Član broj: 172809
Poruke: 509
77.46.186.*



+1 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array05.04.2008. u 14:41 - pre 194 meseci
Smesti je u modul i postavi da je javna(Public)

Code:

Public Sub ArrayDiff(a1 As Variant, a2 As Variant, ByRef diff As Variant, Optional checkBoth As Boolean = False, Optional Compare As VbCompareMethod = vbBinaryCompare)
.
.
.
End Sub


I posle je mozes jednostavno dodati u svaki projekt, a pozivas je sa ArrayDiff kao i bilo koj drugi sub.
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array05.04.2008. u 15:49 - pre 194 meseci
Citat:
Shadowed: A da proverite prvo da li nizovi imaju vise od... recimo 100 elemenata i ako imaju da ih smestite u dva binary search tree-a? Jos bolje balanced tree, ali je komplikovanija izvedba, ako nema gotovog.

tacno je da ova fja koju sam napisao uopste nije optimizovana (recimo, radi se redim preserve za svaki duplikat) ali vidi se ideja pa ko hoce moze da je dalje optimizuje :)
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.115.*



+7 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array05.04.2008. u 20:55 - pre 194 meseci
Sto kaze Stefan prekopiraj je u Modul fajl i snimi ga negde na HD. U VBA postojeci modul se dodaje tako sto kliknes desno na projekat pa izaberes Import file a u VB6 kliknes desno na Projekat pa Add -> Module pa Existing.
U taj modul mozes posle da dodajes i druge funkcuje koje cesto koristis ... deklarisi ih kao Public
 
Odgovor na temu

steve585
Stevan Stanić
Project Manager
Zagreb

Član broj: 131815
Poruke: 281
*.xnet.hr.



+1 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array06.04.2008. u 08:44 - pre 194 meseci
Ok, to za modul mi je poznato!

Ono sto mi je sinulo kao ideja je da ta funkcija bude dio samog okruzenja, kao npr. funkcija Date(), te da bude generalno dostupno za sve nove ili postojece programe, a da ne moras svaki put praviti modul, pa Copy--> Paste.

Da li je to izvedivo? Mozda preko dll?
steve585
 
Odgovor na temu

rgdrajko
Beograd

Član broj: 117734
Poruke: 710
80.93.249.*



+3 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array06.04.2008. u 10:41 - pre 194 meseci
Da, preko modula klase tj. dll je veoma prosto. Da ne bih to objasnjavao bolje je da pogledate kompletno objasnjenje koje je dato na http://www.mycity.co.yu/Visual...ako-napraviti-ActiveX-DLL.html

Evo sta snoop na tom forumu kaze "Kako napraviti ActiveX DLL":

Citat:
DLLovi sluse kao dinamicke biblioteke koje programi pozivaju kada im je potrebna neka f-ja ili procedura i time smanjuju velicinu .exe fajla... isto tako ako radite u timu od nekoliko ljudi mozete da napisete DLL i drugi to da koriste, a da ne moraju da se bakcu oko celog koda za odredjeni zadatak nego jednostvano ukljuce DLL u projekat i koriste f-je i procedure iz DLLa...

mozete i da zastitite vas kod na taj nacin, posto mozete samo da izvrsavate f-je i procedure, ali nikako ne mozete da vidite kod...

elem, da mi krenemo sa tutorialom...


Pokrenite VisualBasic i izaberite ActiveX DLL kao vas projekat i stisnite na Open.

Otvorice vam se prozor Class1 koji pretstavlja klase koje ce vas dll da sadrzi... u jednom DLLu mozete imati klasa koliko hocete...

Pre nego sto pocnemo sa pisanjem f-ja i procedura moramo da definisemo kako ce da se zove klasa i kako ce se zvati projekat i kako ce biti prikazan.

Da bi promenili naziv projekta: Project > Project1 Properties >...

Upisite ime projekta kako zelite da se zove (ja sam stavio ActiveXDLL). Predjite na odeljak Make i tamo u polje Title pod grupom Application upisite ime projekta i kliknite na OK.

Kada ste to uradili upisite ime klase u koju cete upisivati f-je i procedure. Mozete da pravite koliko god zelite klasa, ali svaka klasa mora drukcije da se zove.

Sa strane, u Propertiesu klase u polju Name upisite npr. brStuff.

Sada cemo poceti sa pisanjem f-ja i procedura koje ce se nalaziti u ActiveX DLLu. Kao sto mozda znate, mozete da deklarisete lokalne i globalne promenljive (varijable). Sve ovo je isto kao da pisete neku proceduru ili f-ju unutar nekog standardnog .EXE projekta u Visual Basicu.

Napravicemo jednu f-ju koja ce izracunati dva broja. Nije korisna puno, ali cisto da vidimo kako se radi sa .dll-ovima.

Public Function saberi(jedan As Integer, dva As Integer) As Integer
saberi = jedan + dva
End Function

Kada ste zavrsili pisanje svih potrebnih f-ja i procedura onda mozete da predjete na kompajliranje klase ili klasa.

Kompajliranje se vrsi kao i svaki drugi projekat koji se radi u Visual Basicu. Znaci File > Make brStuff.dll. Otvorice vam se prozor gde vas pita gde cete da snimite vas kompajliran DLL.

Kada ste ovaj deo zavrsili, mozemo da predjemo na spajanje DLLa i EXE projekta.

Napravite standardni EXE Projekat i potom kliknite na OK.

Otvara vam se prazna forma. Sada moramo da ukljucimo novi dll. Idite na Project > References > Kliknite na Browse... i pronadjite ActiveX DLL koji ste upravo kompajlirali.

Sada ste ukljucili DLL u vas projekat i morate sada da napravite istancu objekta tj. da ga deklarisete kako bi ga mogli koristiti.

Dupli klik na formu i u padajucem meniju Form izaberite General.

Sada napisite kao bi deklarisali dll

Dim br As New ActiveXDLL.brStuff

Primerite da je ActiveXDLL ime projekta koji smo zadali jos na pocetku, a brStuff je ime jedne klase koju imamo u DLLu

Dodajte jedan TextBox i jedan CommandButton u projekat iz palete alatki.

Dupli klik na CommandButton i tu ubacite sledeci kod

Text1.Text = br.saberi (12,14)

Kod treba ovako da izgleda:

Private Sub CommandButton_Click()
Text1.Text = br.saberi (12,14)
End Sub

primeticete kada budete napisali br. da ce se otvoriti dropdown menu sa spisakom svih f-ja i procedura koje imate u instanciranoj klasi (u ovom slucaju samo saberi).

Sada samo pokrenite program i vidite da li radi.



[Za citiranje bolje koristi quote tag jer code ne prelama tekst.]

[Ovu poruku je menjao Shadowed dana 06.04.2008. u 12:14 GMT+1]
rgdrajko
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array06.04.2008. u 12:04 - pre 194 meseci
Rajko nije to ono sto je steve585 pitao (verujem da on zna kako da napravi dll)

steve, odgovor na tvoje pitanje je sledeci:

nije moguce dodati neku funkciju da bude "deo okruzenja", ali ono sto mezes da uradis to je da napravis templejt u koji ces da ubacis jedan modul u koji stavis fje koje zelis, i posle kada pokreces novi projekat ti izaberes taj templejt i automatski dobijes modul koji ima te fje.
mozes i preko type libraryja to da resis (na taj nacin neces imati dodatni modul a imaces potrebne fje) ali to je malo naprednija tehnika
 
Odgovor na temu

steve585
Stevan Stanić
Project Manager
Zagreb

Član broj: 131815
Poruke: 281
*.xnet.hr.



+1 Profil

icon Re: Izdvajanje razlicitih elemenata dva Array06.04.2008. u 12:10 - pre 194 meseci
Ovo za template nisam znao.
steve585
 
Odgovor na temu

[es] :: Visual Basic 6 :: Izdvajanje razlicitih elemenata dva Array

[ Pregleda: 2622 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.