How to do pointers in Visual Basic

2020.03.26 20:50

졸리운_곰 조회 수:75

 

How to do pointers in Visual Basic

 
Rate me!
4.83 (26 votes)
 
4 Sep 2000
Show how to use pointers in a C like manner

Introduction

Most people think that Visual Basic does not have pointers and hence is not capable of handling data structures that require pointers (by the way these data structures can be implemented using classes).

Well, they are right but not for very long. Since Visual Basic has access to the entire Win32 API it is not so difficult to equip it with pointers. Let's look at a simple code fragment in C and then at its Visual Basic equivalent.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    int * ptr;                        //1               
    ptr=(int *)malloc(sizeof(int));   //2             
    *ptr=10;                          //3             
    printf("The address of ptr is %d and its values is %d\n",ptr,*ptr); //4
    free(ptr);                        //5
    return 0;
}

I have marked the lines with numbers so you ,the reader, can follow more easily.

The equivalent of the first line, in VB is:

dim ptr as long   'int * ptr; 

This was easy because it follows from the definition of the pointer. A pointer is just a variable whose value is the address of another variable. It is long because a pointer in MS Windows is 4 bytes.

The second line:

ptr=(int *)malloc(sizeof(int)); 

Well, how do we allocate memory dynamically in Visual Basic? malloc has no equivalent. Here we'll use the Win32 API function HeapAlloc(...).Please check the documentation for more information on it.

So here's our code:

Dim hHeap As Long hHeap = GetProcessHeap()
ptr=HeapAlloc(hHeap,0,2) 'an integer in Visual Basic is 2 bytes

We can even check if memory was allocated.

if ptr<>0 then 
    'memory was allocated
    'do stuff
end if

Now,

*ptr=10;

In Visual Basic we'll use the function CopyMemory which is declared like so:

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

Public Declare Sub CopyMemory Lib "kernel32" Alias _
    "RtlMoveMemory" (Destination As Any, Source As Any, _
    ByVal Length As Long)

Here's the little trick : I modify the parameters and have two more definitions.

'to write to memory
Public Declare Sub CopyMemoryWrite Lib "kernel32" Alias _
    "RtlMoveMemory" (Byval Destination As long, Source As Any, _
    ByVal Length As Long)

' to read from memory
Public Declare Sub CopyMemoryRead Lib "kernel32" Alias _
    "RtlMoveMemory" (Destination As Any,byval Source As Long, _
    ByVal Length As Long)

Now here's how,

*ptr=10;

translates into Visual Basic.

dim i as integer 
i=10
CopyMemoryWrite ptr,i,2 ' an intger is two bytes

Now towards line 5.

'printf("%d\n",*ptr);
dim j as integer
CopyMemoryRead j,ptr,2
MsgBox "The adress of ptr is " & cstr(ptr) & _
    vbCrlf & "and the value is " & cstr(j)

Now free the memory

HeapFree GetProcessHeap(),0,ptr

Here is the complete listing of the source code: (just copy it into a project and run it).

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" _
    Alias "RtlMoveMemory" (Destination As Any, _
    Source As Any, ByVal Length As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" _
    (ByVal hHeap As Long, ByVal dwFlags As Long,_
     ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" _
    (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Private Declare Sub CopyMemoryWrite Lib "kernel32" Alias _
    "RtlMoveMemory" (ByVal Destination As Long, _
    Source As Any, ByVal Length As Long)
Private Declare Sub CopyMemoryRead Lib "kernel32" Alias _
    "RtlMoveMemory" (Destination As Any, _
    ByVal Source As Long, ByVal Length As Long)

Private Sub Form_Load()
    Dim ptr As Long   'int * ptr;
    Dim hHeap As Long
    hHeap = GetProcessHeap()
    ptr = HeapAlloc(hHeap, 0, 2) 'an integer in Visual Basic is 2 bytes
    If ptr <> 0 Then
    'memory was allocated
    'do stuff
        Dim i As Integer
        i = 10
        CopyMemoryWrite ptr, i, 2 ' an intger is two bytes
        Dim j As Integer
        CopyMemoryRead j, ptr, 2
        MsgBox "The adress of ptr is " & CStr(ptr) & _
            vbCrLf & "and the value is " & CStr(j)
        HeapFree GetProcessHeap(), 0, ptr
    End If
End Sub

Bonus

Here is a simple and not complete implementation of a linked list. (On the form put a Command button named Command1)

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"_
    (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" _
    (ByVal hHeap As Long, ByVal dwFlags As Long, _
    ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" _ 
    (ByVal hHeap As Long, ByVal dwFlags As Long, _
    lpMem As Any) As Long
Private Declare Sub CopyMemoryPut Lib "kernel32" Alias _
    "RtlMoveMemory" (ByVal Destination As Long, _
    Source As Any, ByVal Length As Long)
Private Declare Sub CopyMemoryRead Lib "kernel32" Alias _
    "RtlMoveMemory" (Destination As Any, _
    ByVal Source As Long, ByVal Length As Long)

Dim pHead As Long
Private Type ListElement
    strData As String * 255 '==255 * 2=500 bytes  vbStrings are UNICODE !
    pNext As Long  '4 bytes
                'pointer to next ; ==0 if end of list
'----------------
'total: 504 bytes
End Type

Private Sub CreateLinkedList()
'add three items to list
' get the heap first
    Dim pFirst As Long, pSecond As Long 'local pointers
    Dim hHeap As Long
    hHeap = GetProcessHeap()
    'allocate memory for the first and second element
    pFirst = HeapAlloc(hHeap, 0, 504)
    pSecond = HeapAlloc(hHeap, 0, 504)
    If pFirst <> 0 And pSecond <> 0 Then
    'memory is allocated
        PutDataIntoStructure pFirst, "Hello", pSecond
        PutDataIntoStructure pSecond, "Pointers", 0
        pHead = pFirst
    End If
    'put he second element in the list
End Sub

Private Sub Command1_Click()
    CreateLinkedList
    ReadLinkedListDataAndFreeMemory
End Sub

Private Sub PutDataIntoStructure(ByVal ptr As Long, _
        szdata As String, ByVal ptrNext As Long)
Dim le As ListElement
    le.strData = szdata
    le.pNext = ptrNext
    CopyMemoryPut ptr, le, 504
End Sub

Private Sub ReadDataToStructure(ByVal ptr As Long, _ 
        struct As ListElement)
Dim le As ListElement
    CopyMemoryRead le, ptr, 504
    struct.strData = le.strData
    struct.pNext = le.pNext
End Sub

Private Sub ReadLinkedListDataAndFreeMemory()
Dim pLocal As Long
Dim hHeap As Long
Dim le As ListElement
Dim strData As String
    pLocal = pHead
    hHeap = GetProcessHeap()
    Do While pLocal <> 0
        ReadDataToStructure pLocal, le
        strData = strData & vbCrLf & le.strData
        HeapFree hHeap, 0, pLocal
        pLocal = le.pNext
    Loop
    MsgBox strData
End Sub

Private Sub Form_Load()

End Sub
 

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

[출처] https://www.codeproject.com/Articles/712/How-to-do-pointers-in-Visual-Basic

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
918 1932 > DP > #37 정수 삼각형 졸리운_곰 2020.04.12 74
917 Programmers > 2018 서머코딩 > #36 예산 졸리운_곰 2020.04.12 66
916 9084 > DP> #35 동전 졸리운_곰 2020.04.07 101
915 BaekJoon _ 백준 1149 > DP> #34 RGB 거리 졸리운_곰 2020.04.02 93
914 BaekJoon _ 백준 1026 > 탐색> #33 보물 졸리운_곰 2020.04.02 90
913 Programmers > 연습문제 > #32 N-Queen 졸리운_곰 2020.04.01 61
912 Programmers > 연습문제 > #31 2 x n 타일링 졸리운_곰 2020.04.01 69
911 List of freely available programming books 졸리운_곰 2020.03.31 184
» How to do pointers in Visual Basic file 졸리운_곰 2020.03.26 75
909 Linked List implementation in Visual Basic 졸리운_곰 2020.03.24 50
908 Programmers > 스택/큐(Stack/Queue) > #30 기능개발 졸리운_곰 2020.03.23 65
907 Programmers > #28 winter recruit > #2 [JAVA] 졸리운_곰 2020.03.23 47
906 Programmers > 깊이/너비 우선 탐색(DFS/BFS) > #27 타겟 넘버 [JAVA] 졸리운_곰 2020.03.09 65
905 Programmers > 완전탐색 > #26 소수찾기(level 2) [JAVA] 졸리운_곰 2020.03.09 69
904 Programmers > #25 winter recruit > #1 [JAVA] 졸리운_곰 2020.03.08 47
903 Programmers > Level 1 > #24 소수찾기 [Python] 졸리운_곰 2020.03.08 65
902 Programmes > #23 문자열 내 마음대로 정렬하기 [Python] 졸리운_곰 2020.03.08 61
901 Programmers > Hash > #22 위장 [JAVA] 졸리운_곰 2020.03.07 58
900 Programmers > Sort > #21 H-Index [JAVA] 졸리운_곰 2020.03.07 60
899 [Programmers] #20 라면공장 [JAVA] 졸리운_곰 2020.03.06 83
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED