1. Kik på første listitem, og smit det evt. i et array 2. Loop over de efterfølgende listitems, og tæl en op hver gang der findes et magen til første listitem.
Herefter kører du følgende loop, indtil sidste item nås:
3. Kit på næste listitem, der ikke findes i dit array. Smid det i arrayet, og loop over alle de resterende elementer. tæl en op for hver du møder et item magen til det du lige har smidt i arrayet
PS: Du er altså nødt til at have to tællere, en der tæller det aktuelle item, og inden i den løkke en anden løkke, en der tæller over de resterende items :o)
Det kan være helt sjov at lave sådanne løkker (synes jeg;o), så held og lykke...
Ser du...Det fattede jeg ikke en brik af...Sorry... Har aldrig rigtigt haft brug for arrays i mine programmer, så har ikke så pokkers meget forstand på sådanne...
Det link...Hvad skulle jeg med det?? Jeg ved udemærket hvordan man programmerer, og har gjort det i snart 10 år...
Jeg kan bare ikke gennemskue din ide, derfor er jeg interesseret i et lille eksempel...Det behøver slet ikke at have noget med min kode at gøre...Bare et eksempel på hvordan man laver sådan noget...
Jeg kan nemlig ikke se hvordan den skulle kunne holde styr på hvilke IP'ere der optræder flest gange...
Øhh - til at starte med kunne jeg ikke vide at du havde programmeret i 10 år eller 10 minutter (ofte stilles der spørgsmål af folk, der slet ikke kender nget til VB på forhånd). Og når du så siger, at du ikke kender til arrays, tænkte jeg straks, et du var newbii - derfor et link til en tuturial. Desuden tjekker jeg mig, at du kender til løkker, da de jo også er helt centrale og nødvendige for min løsning.
Herefter får jeg at vide at du har programmeret i ti år, og jeg tillader at undre mig over, at du så ikke kender til arrays. Det er jo noget af det allermest centrale, og i mine øjne helt uundgåeligt at komme til at bruge...
Jeg har en løsning fiks og færdig, der dog er lavet med et dynamsik array - interesseret?
"siden du behandler folk sådan..." - jeg tror du opfatter tonen i mine svar helt forkert!!!
Blot fordi ikke alle programmerer på samme måde som du måske gør, betyder jo ikke at de er helt grønne...
At jeg ikke har haft behov for arrays endnu (andet end til split funktionen) betyder jo ikke at jeg ikke har en disse forstand på programmering...Dog lægger jeg det meste af min programmeringstid i PHP-scripts...
Men lad mig se om det er noget jeg kan bruge, og viser det sig brugbart, skal du selvfølgelig nok få dine points...
OK - her er en løsning. Jeg vil foreslå at du opretter et nyt VB-projekt, følger vejledningen, og når du ser hvordan det fungerer, så kopierer det du kan bruge til dit eget projekt:
Opret en form, hvorpå du smider 2 listboxe (List1 og List2) samt en knap (Command1). Opret desuden et modul.
I modulet skriver du:
Option Explicit
Public Type IPnummer IP As String Antal As Integer End Type
I Formens kodevindue skriver du:
Dim i As Integer Dim j As Integer Dim k As Integer Dim MitArray() As IPnummer
Private Sub Form_Load() 'Smider demo-data i list1. Disse svarer til IP-numrene List1.AddItem "Jeg er her 4 gange" List1.AddItem "Jeg er her 1 gange" List1.AddItem "Jeg er her 4 gange" List1.AddItem "Jeg er her 4 gange" List1.AddItem "Jeg er her 2 gange" List1.AddItem "Jeg er her 4 gange" List1.AddItem "Jeg er her 2 gange" End Sub
Private Function FindesIArray(ByVal p_i As Integer) As Boolean 'Undersøger, om et listitem allerede findes i MitArray Dim local_i FindesIArray = False For local_i = LBound(MitArray) To UBound(MitArray) If MitArray(local_i).IP = List1.List(p_i) Then FindesIArray = True Exit Function End If Next local_i End Function
Private Sub Command1_Click() 'Tæller ens forekomster i List 1 og gemmer resultaterne i MitArray k = -1 ReDim MitArray(0) For i = 0 To List1.ListCount - 1 If Not FindesIArray(i) Then k = k + 1 ReDim Preserve MitArray(k) MitArray(k).IP = List1.List(i) MitArray(k).Antal = 1 For j = 1 + i To List1.ListCount - 1 If List1.List(i) = List1.List(j) Then MitArray(k).Antal = MitArray(k).Antal + 1 End If Next j End If Next i
'Skriver resultaterne til List2 For j = 0 To k List2.AddItem "'" & MitArray(j).IP & "' optræder " & MitArray(j).Antal & " gange" Next j
End Sub
Prøv at kør programmet - og skift evt. indholdet af List1. Hurra - det virker!!!
Helt almindelig kode, med 3 løkker inden i hinanden. Der er naturligvis 117 andre måder at gøre det på, og du kan også gøre det uden brug af selvdefinerede typer (IPnummer) og uden brug af arrays. Jeg gør i min løsning brug af en selvdefineret type (IPnummer) samt et dynamisk array (der bliver redimensioneret adskellige gange), da jeg synes det er det mest elegante måde. Jeg kan godt skrive det om, hvis du stadig ikke kan lide arrays ;o)
Det ser skide godt ud, og dit eksempel virker efter hensigten...
Men når jeg prøvet at få flettet mit eget program ind, med listview'et i stedet for listbox'en, så kommer koden til at se sådan her ud:
Public Function countIP(ByVal theType As String) 'Tæller ens forekomster i lstLog og gemmer resultaterne i MitArray If theType = "source" Then 'tæller source IP k = -1 ReDim MitArray(0) For i = 0 To frmMain.lstLog.ListItems.Count - 1 Debug.Print i If Not FindesIArray(i) Then k = k + 1 ReDim Preserve MitArray(k) MitArray(k).IP = frmMain.lstLog.ListItems(i).SubItems(4) MitArray(k).Antal = 1 For j = 1 + i To frmMain.lstLog.ListItems.Count - 1 If frmMain.lstLog.ListItems(i).SubItems(4) = frmMain.lstLog.ListItems(j).SubItems(4) Then MitArray(k).Antal = MitArray(k).Antal + 1 End If Next j End If Next i
For j = 0 To k Debug.Print "'" & MitArray(j).IP & "' optræder " & MitArray(j).Antal & " gange" Next j ElseIf theType = "destination" Then 'tæller destination IP End If End Function
Private Function FindesIArray(ByVal p_i As Integer) As Boolean 'Undersøger, om et listitem allerede findes i MitArray Dim local_i FindesIArray = False For local_i = LBound(MitArray) To UBound(MitArray) Debug.Print "local_i - " & local_i & " & p_i - " & p_i If MitArray(local_i).IP = frmMain.lstLog.ListItems(p_i).SubItems(4) Then FindesIArray = True Exit Function End If Next local_i End Function
Men det virker ikke...Den bliver ved med at komme med fejlen "Index out of bounds" på FindesIArray funktionen...
Jeg har jo en list1 og en list2 samt et array der alle starter med index 0 som første index - måske starter dun lstLog med index 1, og fejler når der forsøges med index 0?
Altså - hvilket index er der tale om, hvilken værdi har det når det fejler, og hvor fejler det -. i arrayet, i listItems eller?
Så fik jeg det til at virke, ca. som jeg havde forestillet mig...Måtte selvfølgelig lave en del om i den kode du foreslog, men det var jo kun et eksempel...
Har tilladt mig at give dig en dobbelt op da jeg synes du har fortjent det, og som et plaster på såret, vedr. mit sure opstød :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.