2010-06-25 2 views
1

공용 VB 컨트롤 라이브러리에 대한 인터페이스 역할을하는 간단한 VB.NET 양식이 있습니다. API 호출의배열의 하위 집합을 VB.NET에서 작동하도록 전달할 수 있습니까?

하나는 UIntegers하는 ByRef 배열한다 : 전화 후

Public Function Get_Values(source_id As Byte, first_value_address As Byte, number_of_values As Byte, ByRef valuesOut As UInteger()) As Integer 

을 valuesOut 값의 목록을 개최한다 number_of_valuessource_id에서 first_value_address에서 시작.

요청 된 길이에 관계없이 반환되는 최대 값 수가 15 인 하드웨어 기반 제한 사항이 있습니다. VB.NET 코드에서 28 개의 값을 배열로 가져와야합니다.

배열 변수의 일부만 다음 C 코드와 유사한 함수로 보낼 수 있습니까?

uint[28] values; 
Get_Values(0, 0, 15, values); // Get first part 
Get_Values(0, 15, 13, &values[15]); // Get second part of data 

답변

1

아니요, 구체적으로 묻지 않는 것은 불가능합니다. C/C++ 스타일 배열 (단순화 된 메모리 블록 인 sizeof(Type) * n, 여기서 n은 요소 수임)과 달리 .NET 배열은 포인터 산술 *로 참조되거나 오프셋 될 수 없습니다. 결과적으로 공용 API가 배열에 오프셋을 표시하는 방법을 제공하지 않으면 중간 배열을 함수에 전달하고 완료 한 후에 직접 다시 배열해야합니다. ByValByRef이 유형은 값 유형이 아닙니다 여부, 호출 규칙을 나타내는 것을

public int GetValues(byte source_id, byte first_value_address, byte number_of_values, uint[] buffer, int offset) 
{ 
    uint[] temp = new uint[number_of_values]; 

    int retValue = GetValues(source_id, first_value_address, number_of_values, temp); 

    Array.Copy(temp, 0, buffer, offset, number_of_values); 

    return retValue; 
} 

또한 주목해야한다 :

당신은, 그러나, 함수의 자신의 버전에 전화를 포장 할 수 . 특별한 이유가없는 한 (그리고 여기서는 그렇지 않은 것처럼 보입니다) 배열 인수에 ByRef을 지정할 필요가 없습니다. 유일한 유형 ByRef은 함수가 변수의 실제 값을 변경하고 호출 코드에 반영되도록하려는 경우에만 필요합니다. 여러분이 그것을 부르는 방식으로 배열을 할당하고 함수에 전달한 다음 그 내용을 사용하는 것처럼 보입니다. 함수가 변수 값을 수정하는 유일한 시간은 다른 배열 인스턴스과 동일하게 설정하면됩니다. 단순히 배열 값을 변경하면 호출 코드가 결과를 볼 수 있도록 ByRef이 필요하지 않습니다. 실제로 unsafe 코드를 사용하여 포인터 기반의 배열을 직접 수행하지만 귀하의 질문에 *

+0

ByRef는 라이브러리 함수의 결과입니다. 그것은 실제로 C# 출력 매개 변수입니다. – CodeFusionMobile

+0

@CSharperWithJava : 실제로 'out'은 C# 관련 기능입니다. 일리노이 자체에는 'out'이라는 개념이없고 'ref'만 있습니다. C#은 함수가 모든 반환 경로에서 변수에 값을 할당하는 컴파일 시간을 확인합니다. 그건 제쳐두고,이 대답은 정확해야합니다. –

0

고정 크기 버퍼 배열을 만들어 함수에 넣어야합니다. 그런 다음 주 크기로 복사하십시오.

0

내가 아는 한, 배열만으로는 VB에서이 기능을 사용할 수 없습니다. 내가 잘못 될 수 있지만, 난 꽤 자신에 VB는 새로운 해요 - 해결 방법은 목록에 배열을 변환하는 것입니다 (귀하의 배열이 상당히 작아 보이는 것,이 문제가 안된다), addRange 루틴을 호출, toArray() 메소드를 호출합니다.

Dim list as New List(Of Object) 
list.addRange(theArray) 
theArray = list.GetRange(0, 2).ToArray() ' Gets only the first two indices and puts them into an array 
+0

의 범위를 벗어나는 아니라면

는 ** 난 당신이 단지를 만드는 대신 배열에'ToList을()'호출 할 수 있습니다 생각 리스트에 추가하고 AddRange()를 사용하여 값을 복사한다. –

관련 문제