Страницы: 1
RSS
CopyMemory для массива со строками
 
Добрый день, уважаемые господа.  
Есть вопрос по CopyMemory, помогите пожалуйста.  
   
Образец для фрагмента, где возникает вопрос:    
 
Private Sub Test()  
Dim str As String  
Dim num_elem As Long  
Dim mas_str() As String, mas_str2() As String  
 
' есть исходный массив    
ReDim mas_str(0 To 2)  
mas_str(0) = "4,1,2,3"  
mas_str(1) = "4,3,1,2"  
mas_str(2) = "4,3,2,1"  
   
'есть новый элемент elem, который мне надо поставить в начало нового массива    
'а остальная часть второго массива - все элементы из исходного массива mas_str  
'начиная с элемента, заданного num_str  
elem = "4,2,1,3"  
num_str = 1  
     
ReDim mas_str2(0 To UBound(mas_str, 1) - num_str + 1)  
   
CopyMemory mas_str2(1), mas_str(num_str), (Len(elem) + 10) * UBound(mas_str2, 1)  
' И вот здесь по моей задумке должны копироваться 2 элемента (размер 34 байт - 2 * string по 7 символов + 10 байт для строки переменной длины , т.е. = 2*(7+10)).  
' А копируется только 1 элемент "4,3,1,2"  
 
mas_str2(0) = elem  
End Sub  
 
Подскажите, где я неправ?
 
{quote}{login=Grin23}{date=22.02.2011 05:02}{thema=CopyMemory для массива со строками}{post}Добрый день, уважаемые господа.  
Есть вопрос по CopyMemory, помогите пожалуйста.  
   
Образец для фрагмента, где возникает вопрос:    
 
Private Sub Test()  
Dim str As String  
Dim num_elem As Long  
Dim mas_str() As String, mas_str2() As String  
 
' есть исходный массив    
ReDim mas_str(0 To 2)  
mas_str(0) = "4,1,2,3"  
mas_str(1) = "4,3,1,2"  
mas_str(2) = "4,3,2,1"  
   
'есть новый элемент elem, который мне надо поставить в начало нового массива    
'а остальная часть второго массива - все элементы из исходного массива mas_str  
'начиная с элемента, заданного num_str  
elem = "4,2,1,3"  
num_str = 1  
     
ReDim mas_str2(0 To UBound(mas_str, 1) - num_str + 1)  
   
CopyMemory mas_str2(1), mas_str(num_str), (Len(elem) + 10) * UBound(mas_str2, 1)  
' И вот здесь по моей задумке должны копироваться 2 элемента (размер 34 байт - 2 * string по 7 символов + 10 байт для строки переменной длины , т.е. = 2*(7+10)).  
' А копируется только 1 элемент "4,3,1,2"  
 
mas_str2(0) = elem  
End Sub  
 
Подскажите, где я неправ?{/post}{/quote}  
с текстом copymemory всегда проблемы :)  
 
автор не я но мне очень помогает:)  
 
Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)  
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)  
Private Sub Test()  
Dim str As String  
Dim num_elem As Long  
Dim mas_str() As String, mas_str2() As String  
ReDim mas_str(0 To 2)  
mas_str(0) = "4,1,2,3"  
mas_str(1) = "4,3,1,2"  
mas_str(2) = "4,3,2,1"  
elem = "4,2,1,3"  
num_str = 1  
ReDim mas_str2(0 To UBound(mas_str, 1) + 1)  
Call CopyStringArray(mas_str2(), mas_str(), 1)  
mas_str2(0) = elem  
For i = 0 To 3  
Debug.Print mas_str2(i)  
Next  
End Sub  
Public Sub CopyStringArray(ByRef Dest() As String, Src() As String, Optional StartIndex As Long = -1)  
        Dim tmpArr() As String, VarSize&, NewUbound&  
        tmpArr = Src  
       VarSize = (UBound(Src) - LBound(Src) + 1)  
       If StartIndex = -1 Then StartIndex = LBound(Dest)  
        If UBound(Dest) < StartIndex + VarSize Then  
           NewUbound = StartIndex + VarSize  
           ReDim Preserve Dest(LBound(Dest) To NewUbound)  
        End If  
        CopyMemory ByVal VarPtr(Dest(StartIndex)), ByVal VarPtr(tmpArr(LBound(tmpArr))), VarSize * 4  
        ZeroMemory ByVal VarPtr(tmpArr(LBound(tmpArr))), VarSize * 4  
 End Sub
Спасибо
 
Не вникал, но, может быть  
 
ReDim PRESERVE mas_str2(0 To UBound(mas_str, 1) - num_str + 1)
 
R Dmitry, спасибо большое за подсказку. С указателями все работает.  
А напрямую нельзя, получается в данному случае? Или кто-нибудь подскажет еще  варианты для общего развития?
Страницы: 1
Читают тему
Наверх