Page 1 of 1

Compare Strings stored in to different allocated memory

Posted: Thu May 02, 2013 9:58 pm
by martin66119
Goog evening!

Sorry for question which is quite similar to my other.

I stored in 2 different allocated memory sections some strings. Now I would like to find which string in BufferSting2 is also in BufferString1.

I have no idea to do this. Please could you help me!

Thank you very much in advance.

Code: Select all

Dim a.s(10)
Dim b.s(10)
a(1) = "Wald"
a(2) = "Baum"
a(3) = "Strauch"
a(4) = "Blatt"

b(1) = "Blatt"
b(2) = "Stein"
b(3) = "Wasser"
b(4) = "Wald"
b(5) = "Obst"

  String1$ = a(1)
  *String1 = @String1$   
  
  String2$ = b(1)
  *String2 =@String2$
  
  *BufferString1 = AllocateMemory(1000000)
  *PointerString1 = *BufferString1
  
  *BufferString2 = AllocateMemory(1000000)
  *PointerString2 = *BufferString2 
;-----------------------------------------------------------  
  CopyMemoryString(a(1), @*PointerString1)
  
  For i= 2 To 4
    CopyMemoryString(a(i))
  Next
;----------------------------------------------------------- 
  CopyMemoryString(b(1), @*PointerString2)

 For i = 2 To 5
  CopyMemoryString(b(i))
 Next
  ;---------------------------------------------------------- 
  Debug PeekS(*BufferString1)
  Debug PeekS(*BufferString2)




Re: Compare Strings stored in to different allocated memory

Posted: Fri May 03, 2013 12:18 am
by buddymatkona
One way is to compare new string arrays using RegEx.

Code: Select all

Debug " " : Debug "Strings from BufferString2 also found in BufferString1: " 
  If CreateRegularExpression(0, "[A-Z][a-z]*") ; This RegEx assumes all strings are proper names. If not, you will have to define EXACTLY what you are looking for.
    Dim Buf1Strs.s(0) : Dim Buf2Strs.s(0)
    Found1 = ExtractRegularExpression(0, PeekS(*BufferString1), Buf1Strs())
    Found2 = ExtractRegularExpression(0, PeekS(*BufferString2), Buf2Strs())
    For k2 = 0 To Found2-1         
      For k1 = 0 To Found1-1
        If Buf2Strs(k2) = Buf1Strs(k1)
          Debug Buf2Strs(k2)
          Break
        EndIf
      Next
    Next 
  Else
    Debug RegularExpressionError()
  EndIf

Re: Compare Strings stored in to different allocated memory

Posted: Sat May 04, 2013 9:04 pm
by martin66119
Thank you very much for your help buddymatkona!

And sorry for asking almost the same question again.

Now I have a testcode to write string in an allocated memory and some other strings an an other allocated memory. In order provide the string length of individual string I use an auxillary array a_laenge () for the strings in array a() y and an other auxillar array b_laenge() for the strings in array b(). In the loop between "ElapsedMilliseconds() " I try to find out if a string in allocatedmemory b is also in allocatedmemory a or not. But I do not know to do this because I have no idea to use the function "comparememory and set (calculate) the correct length in the compare function.

Please could someone help me with a code!

Right now I use the following code.

Code: Select all

Dim a.s(20000)
Dim b.s(20000)
Dim c.s(20000)
Dim a_laenge(20000)
Dim b_laenge(20000)

a(1) = "Wald"
a(2) = "Baum"
a(3) = "Ast"
a(4) = "Blatt"

b(1) = "Hund"
b(2) = "Maus"
b(3) = "Katze"
b(4) = "Ast"
b(5) = "Vogel"
b(6) = "Wald"


Anzahl_a = 4              
Anzahl_b = 6            
            
  String1$ = a(1)
  *String1 = @String1$   
  
  String2$ = b(1)
  *String2 =@String2$
  
  *BufferString1 = AllocateMemory(10000000)
  *PointerString1 = *BufferString1
  
  *BufferString2 = AllocateMemory(10000000)
  *PointerString2 = *BufferString2 
;-----------------------------------------------------------  

Ergebnis = CopyMemoryString(a(1), @*PointerString1)
a_laenge(1) = Len(a(1))
 
For i= 2 To Anzahl_a
  CopyMemoryString(a(i)) 
  a_laenge(i) = Len(a(i))
  ;Debug PeekS(*BufferString1)
Next
 
;----------------------------------------------------------- 
  CopyMemoryString(b(1), @*PointerString2)
  b_laenge(1) = Len(b(1))
 For i = 2 To Anzahl_b
   CopyMemoryString(b(i))
   b_laenge(i) = Len(b(i))
 Next
  ;---------------------------------------------------------- 
  ;Debug PeekS(*BufferString1)
  ;Debug PeekS(*BufferString2)
  ;StringBuffer1$ = PeekS(*BufferString1)
  ;Debug StringBuffer1$ 
   *AdresseString2 = *BufferString2
  StartTime = ElapsedMilliseconds() 
  For i = 1 To Anzahl_b
    ;Debug b(i)
    ; How do I have to set and calculate *BufferString2 in order to use the function CompareMemory ()????????
    MessageRequester("",PeekS(*BufferString1, a_laenge(1)) + "  " + PeekS(*AdresseString2, b_laenge(i)))
     If CompareMemory(*BufferString1, *AdresseString2, b_laenge(i)) = 0 ;???????????????????
       NichtGefunden = NichtGefunden + 1     
       c(NichtGefunden) = PeekS(*BufferString2)       
     Else

     EndIf
   *AdresseString2 = *AdresseString2 + b_laenge(i)
   Next
   Time =ElapsedMilliseconds() - StartTime
   MessageRequester("Auswertezeit", Str(Time))
   MessageRequester("","Nicht gefunden" +  Str(NichtGefunden))

Re: Compare Strings stored in to different allocated memory

Posted: Sun May 05, 2013 5:49 am
by wilbert
Have you considered using a Map ?
You can put the strings from one block of memory in a Map and while going through the second list of strings, you can use FindMapElement() to check if it also was in the first list.

Re: Compare Strings stored in to different allocated memory

Posted: Sun May 05, 2013 11:17 am
by martin66119
Hi wilbert,

thank“s a lot for your help. I have tried to use map. It works well but it seems that comparememory is faster then using maps. Therefore I try to change the code.

Martin