Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Issues of stdRefArray

クローズ
#145 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
38/100
issue の種類
機能追加
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
visualbasic
領域
tooling

調査の方向性

Start by locating the stdRefArray implementation and reproducing the TeststdRefArray2 and TeststdRefArray3 examples from the issue. Compare the current array access behavior with the requested VarPtrArr and default-property behavior, then verify that both examples produce the stated reads and writes without changing the intended reference semantics.

索引モデルが issue の本文から書いたものです。

説明

enhancement
  1. VarPtrArr shall be reurn the pointer of the safearray address.
#If Win64 Then
Private Function VarPtrArr(ByRef arr As Variant) As LongLong
#Else
Private Function VarPtrArr(ByRef arr As Variant) As Long
#End If

Dim vt As VbVarType
Dim p As Long
p = VarPtr(arr)
CopyMemory vt, ByVal p, 2

If (vt And vbArray) = vbArray Then '//安全数组
    VarPtrArr = PtrAdd(p, 8) 'VARIANT结构中wReserved2的地址
    
    If (vt And &H4000) = &H4000 Then     '//引用类型VT_BYREF,如果是引用类型则wReserved2的值才是数组地址的地址
        CopyMemory VarPtrArr, ByVal VarPtrArr, PTR_SIZE
    End If
End If
End Function
Private Function PtrAdd(ByVal Ptr As LongPtr, ByVal iOffset As Long) As LongPtr
    ' For adding (or subtracting) a small number from a pointer.
    ' Use PtrAddEx for adding (or subtracting) large numbers from a pointer.
    PtrAdd = (Ptr Xor &H80000000) + iOffset Xor &H80000000
End Function
  1. It is better to provide a default property to use it like a real array. But there is some CopyMemory cost that it shall not be used in a loop
Property Get GetData()
Attribute GetData.VB_UserMemId = 0
Call CopyMemory(GetData, data, 16)
End Property

Sub TeststdRefArray2()
Dim arr As Variant: arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Dim rarr As stdRefArray: Set rarr = stdRefArray.Create(arr)
Debug.Print rarr(1)  '=> 2
rarr(1) = 3
Debug.Print rarr(1)  '=> 3
Debug.Print rarr(2)  '=> 3
End Sub

Sub TeststdRefArray3()
Dim arr As Variant: arr = [M1:M3]

Dim rarr As stdRefArray: Set rarr = stdRefArray.Create(arr)
Debug.Print rarr(1, 1) '=> 2
rarr(1, 1) = 3
Debug.Print rarr(1, 1) '=> 3
Debug.Print rarr(2, 1) '=> 3
End Sub
主要言語
VBA
スター
412
フォーク
70
平均マージ
1日 3時間
マージ済み PR(30日)
4

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

sancarn/stdVBA のほかの issue

sancarn/stdVBA の issue をすべて見る

似ている issue

DevTools の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。