C to VB - Programmers Heaven

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

C to VB

Hi,

Is there anyone here who could translate this C Code into VB? Or is it possible to link VB and C/C++ codes using the MSVisual Studio?? Thanks!

#define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b))

void KR(char *x, int m, char *y, int n) {
int d, hx, hy, i, j;

/* Preprocessing */
/* computes d = 2^(m-1) with
the left-shift operator */
for (d = i = 1; i < m; ++i)
d = (d<<1);

for (hy = hx = i = 0; i < m; ++i) {
hx = ((hx<<1) + x[i]);
hy = ((hy<<1) + y[i]);
}

/* Searching */
j = 0;
while (j <= n-m) {
if (hx == hy && memcmp(x, y + j, m) == 0)
OUTPUT(j);
hy = REHASH(y[j], y[j + m], hy);
++j;
}

}

Comments

  • BitByBit_ThorBitByBit_Thor Posts: 2,444Member
    : Hi,
    :
    : Is there anyone here who could translate this C Code into VB? Or is it possible to link VB and C/C++ codes using the MSVisual Studio?? Thanks!
    :
    : #define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b))
    :
    : void KR(char *x, int m, char *y, int n) {
    : int d, hx, hy, i, j;
    :
    : /* Preprocessing */
    : /* computes d = 2^(m-1) with
    : the left-shift operator */
    : for (d = i = 1; i < m; ++i)
    : d = (d<<1);
    :
    : for (hy = hx = i = 0; i < m; ++i) {
    : hx = ((hx<<1) + x[i]);
    : hy = ((hy<<1) + y[i]);
    : }
    :
    : /* Searching */
    : j = 0;
    : while (j <= n-m) {
    : if (hx == hy && memcmp(x, y + j, m) == 0)
    : OUTPUT(j);
    : hy = REHASH(y[j], y[j + m], hy);
    : ++j;
    : }
    :
    : }
    :

    Well... here it goes:
    [code]
    'Function Rehash (note: d has to be supplied as well!)
    Function Rehash(a As Integer, b As Integer, h As Integer, _
    d As Integer) As Integer
    Rehash = (h - a * d) * 2 + b
    End Function

    Sub KR(ByRef x() As Byte, ByVal m As Integer, ByRef y() As Byte, _
    ByVal n As Integer)
    '% stands for As Integer
    Dim d%, hx%, hy%, i%, j As Integer

    ' /* Preprocessing */
    ' /* computes d = 2^(m-1) with
    'the left-shift operator */
    d = 2 ^ (m - 1)
    i = m - 1
    hx = i
    hy = hx
    For i = 0 To m - 1
    hx = hx * 2 + x(i)
    hy = hy * 2 + y(i)
    Next

    '/* Searching */
    j = 0
    Do While (j <= n-m)
    'I am not really sure if I got this one right... Sure hope so
    If (hx = hy And CompareArrays(x, y, j, m)) Then
    'OUTPUT(j); '//Don't know what this does
    End If
    hy = Rehash(CInt(y(j)), CInt(y(j + m)), hy, d)
    j = j + 1
    Loop
    End Sub

    Function CompareArrays(x() As Byte, y() As Byte, j As Integer, _
    m As Integer) As Boolean
    Dim i As Integer
    Dim bSame As Boolean

    bSame = True
    For i = j To m - 1
    If (x(i) <> y(i)) Then
    bSame = False
    Exit For
    End If
    Next i

    CompareArrays = bSame
    End Function
    [/code]
    I think this is correct, though I am not able to test it because I don't know what paramaters to supply to the function.
    Greets...
    Richard

  • GenjuroGenjuro Posts: 913Member
    : : Hi,
    : :
    : : Is there anyone here who could translate this C Code into VB? Or is it possible to link VB and C/C++ codes using the MSVisual Studio?? Thanks!
    : :
    : : #define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b))
    : :
    : : void KR(char *x, int m, char *y, int n) {
    : : int d, hx, hy, i, j;
    : :
    : : /* Preprocessing */
    : : /* computes d = 2^(m-1) with
    : : the left-shift operator */
    : : for (d = i = 1; i < m; ++i)
    : : d = (d<<1);
    : :
    : : for (hy = hx = i = 0; i < m; ++i) {
    : : hx = ((hx<<1) + x[i]);
    : : hy = ((hy<<1) + y[i]);
    : : }
    : :
    : : /* Searching */
    : : j = 0;
    : : while (j <= n-m) {
    : : if (hx == hy && memcmp(x, y + j, m) == 0)
    : : OUTPUT(j);
    : : hy = REHASH(y[j], y[j + m], hy);
    : : ++j;
    : : }
    : :
    : : }
    : :
    :
    : Well... here it goes:
    : [code]
    : 'Function Rehash (note: d has to be supplied as well!)
    : Function Rehash(a As Integer, b As Integer, h As Integer, _
    : d As Integer) As Integer
    : Rehash = (h - a * d) * 2 + b
    : End Function
    :
    : Sub KR(ByRef x() As Byte, ByVal m As Integer, ByRef y() As Byte, _
    : ByVal n As Integer)
    : '% stands for As Integer
    : Dim d%, hx%, hy%, i%, j As Integer
    :
    : ' /* Preprocessing */
    : ' /* computes d = 2^(m-1) with
    : 'the left-shift operator */
    : d = 2 ^ (m - 1)
    : i = m - 1
    : hx = i
    : hy = hx
    : For i = 0 To m - 1
    : hx = hx * 2 + x(i)
    : hy = hy * 2 + y(i)
    : Next
    :
    : '/* Searching */
    : j = 0
    : Do While (j <= n-m)
    : 'I am not really sure if I got this one right... Sure hope so
    : If (hx = hy And CompareArrays(x, y, j, m)) Then
    : 'OUTPUT(j); '//Don't know what this does
    : End If
    : hy = Rehash(CInt(y(j)), CInt(y(j + m)), hy, d)
    : j = j + 1
    : Loop
    : End Sub
    :
    : Function CompareArrays(x() As Byte, y() As Byte, j As Integer, _
    : m As Integer) As Boolean
    : Dim i As Integer
    : Dim bSame As Boolean
    :
    : bSame = True
    : For i = j To m - 1
    : If (x(i) <> y(i)) Then
    : bSame = False
    : Exit For
    : End If
    : Next i
    :
    : CompareArrays = bSame
    : End Function
    : [/code]
    : I think this is correct, though I am not able to test it because I don't know what paramaters to supply to the function.
    : Greets...
    : Richard

    Just a quick note:

    memcmp(x, y + j, m)

    means basically "compare the m bytes starting from the address x with the same number of bytes starting from the address y + j". In other words, given that x and y are 0-based arrays of bytes, so the loop for CompareArrays should be:

    [code]
    for i = 0 to m - 1
    If (x(i) <> y(i + j)) Then
    bSame = False
    Exit For
    End If
    next i
    [/code]

    It would be *very* wise to pass any parameter other than pointers in the original C code (j and m in the CompareArrays function) as ByVal, just in case (C has no idea of what ByVal and ByRef mean - it calls them respectively "copying the data", or "copying the pointer").
    Also, I'd declare them as Longs - not that it probably matters,however.
  • brutallicabrutallica Posts: 20Member
    : : : Hi,
    : : :
    : : : Is there anyone here who could translate this C Code into VB? Or is it possible to link VB and C/C++ codes using the MSVisual Studio?? Thanks!
    : : :
    : : : #define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b))
    : : :
    : : : void KR(char *x, int m, char *y, int n) {
    : : : int d, hx, hy, i, j;
    : : :
    : : : /* Preprocessing */
    : : : /* computes d = 2^(m-1) with
    : : : the left-shift operator */
    : : : for (d = i = 1; i < m; ++i)
    : : : d = (d<<1);
    : : :
    : : : for (hy = hx = i = 0; i < m; ++i) {
    : : : hx = ((hx<<1) + x[i]);
    : : : hy = ((hy<<1) + y[i]);
    : : : }
    : : :
    : : : /* Searching */
    : : : j = 0;
    : : : while (j <= n-m) {
    : : : if (hx == hy && memcmp(x, y + j, m) == 0)
    : : : OUTPUT(j);
    : : : hy = REHASH(y[j], y[j + m], hy);
    : : : ++j;
    : : : }
    : : :
    : : : }
    : : :
    : :
    : : Well... here it goes:
    : : [code]
    : : 'Function Rehash (note: d has to be supplied as well!)
    : : Function Rehash(a As Integer, b As Integer, h As Integer, _
    : : d As Integer) As Integer
    : : Rehash = (h - a * d) * 2 + b
    : : End Function
    : :
    : : Sub KR(ByRef x() As Byte, ByVal m As Integer, ByRef y() As Byte, _
    : : ByVal n As Integer)
    : : '% stands for As Integer
    : : Dim d%, hx%, hy%, i%, j As Integer
    : :
    : : ' /* Preprocessing */
    : : ' /* computes d = 2^(m-1) with
    : : 'the left-shift operator */
    : : d = 2 ^ (m - 1)
    : : i = m - 1
    : : hx = i
    : : hy = hx
    : : For i = 0 To m - 1
    : : hx = hx * 2 + x(i)
    : : hy = hy * 2 + y(i)
    : : Next
    : :
    : : '/* Searching */
    : : j = 0
    : : Do While (j <= n-m)
    : : 'I am not really sure if I got this one right... Sure hope so
    : : If (hx = hy And CompareArrays(x, y, j, m)) Then
    : : 'OUTPUT(j); '//Don't know what this does
    : : End If
    : : hy = Rehash(CInt(y(j)), CInt(y(j + m)), hy, d)
    : : j = j + 1
    : : Loop
    : : End Sub
    : :
    : : Function CompareArrays(x() As Byte, y() As Byte, j As Integer, _
    : : m As Integer) As Boolean
    : : Dim i As Integer
    : : Dim bSame As Boolean
    : :
    : : bSame = True
    : : For i = j To m - 1
    : : If (x(i) <> y(i)) Then
    : : bSame = False
    : : Exit For
    : : End If
    : : Next i
    : :
    : : CompareArrays = bSame
    : : End Function
    : : [/code]
    : : I think this is correct, though I am not able to test it because I don't know what paramaters to supply to the function.
    : : Greets...
    : : Richard
    :
    : Just a quick note:
    :
    : memcmp(x, y + j, m)
    :
    : means basically "compare the m bytes starting from the address x with the same number of bytes starting from the address y + j". In other words, given that x and y are 0-based arrays of bytes, so the loop for CompareArrays should be:
    :
    : [code]
    : for i = 0 to m - 1
    : If (x(i) <> y(i + j)) Then
    : bSame = False
    : Exit For
    : End If
    : next i
    : [/code]
    :
    : It would be *very* wise to pass any parameter other than pointers in the original C code (j and m in the CompareArrays function) as ByVal, just in case (C has no idea of what ByVal and ByRef mean - it calls them respectively "copying the data", or "copying the pointer").
    : Also, I'd declare them as Longs - not that it probably matters,however.
    :
    Thanks so much for your replies :) I'll try it out!!
Sign In or Register to comment.