2010-12-29 5 views
1

C 코드의 재귀 함수가 작동하지 않습니다 (C 코드를 작성하지 않았습니다). 다음은 내가 변환하는 스 니펫입니다.C에서 C# 코드로의 변환 - 매개 변수로 배열

int makeroad(float x1, float y1, float x2, float y2, float var, float X[], float Y[], float prec) 
{ 
//stuff 
k+=makeroad(x,y,x2,y2,var,X+k,Y+k,prec); 
} 

나는이 일을 잘 모릅니다. 이 이름을 가진 C 코드의 유일한 함수이므로 오버로드 문제는 아닙니다. 재귀 적으로 자신을 호출하면, X와 Y 배열에 k를 추가합니다. C#에서 그것을 두는 것은 다음과 같습니다

int makeroad (float x1, float y1, float x2, float y2, float var, float[] X, float[] Y, float prec) 
    { 
     //stuff 
     k += makeroad(x, y, x2, y2, var, X + k, Y + k, prec); 
    } 

그리고 비주얼 스튜디오는 X + K와 Y + k는 무효 나에게 말하고있다. 원래의 C 코드는 Visual C++ Express 2010에서 컴파일되어 제대로 작동합니다. 대소 문자 x와 y 변수 사이에 혼란이 있다고 생각하지 않습니다. 만약 그렇다면 코드는 완전한 행운으로 작동합니다.

아이디어가 있으십니까?

+0

어디에서 k가 무엇인지 보여 줬습니까? 아니면 x 또는 y ... –

답변

0

C에서 배열은 자신의 위치를 ​​전달하여 전달되기 때문에 C에서 포인터를 k 번째 항목 (즉, array+k)에 전달하면 C에서 기존 k 요소없이 배열을 "만들 수 있습니다. 첫 번째 요소 ("새로운"배열은 "원래"요소의 동일한 요소를 참조하기 때문에 전혀 새로운 것이 아닙니다).

C#에서는 배열이 연속 메모리에 대한 포인터로 처리되지 않기 때문에이 방법은 작동하지 않습니다. 빠른 수정을 원할 경우 새 배열을 만들고 Array.Copy을 사용하여 k 번째부터 끝까지 요소를 복사 한 다음이 새 배열을 재귀 함수에 전달할 수 있지만 알고리즘이 느린 경우 알고리즘이 작동하지 않습니다 배열의 요소를 수정합니다 (수정 사항은 다른 배열에 반영되지 않습니다. 이제 복사되기 때문입니다).

더 나은 해결책은 배열을 그대로 전달하고 k을 매개 변수로 전달하고 그 위치에서 배열을 사용하여 루틴을 시작하는 것입니다. 당신은 상당한 속도 벌칙없이 동일한 행동을 달성해야합니다.

0

배열은 C로 참조로 전달되므로 실제 전달 된 것은 배열의 시작 부분에 대한 포인터입니다. 예를 들어 통과 할 때 "X + k"는 k에서 시작하는 하위 배열에 대한 포인터를 전달합니다.

C#이 배열 매개 변수와 어떤 관련이 있는지 전혀 알지 못합니다.

0

X + k 및 ​​Y + k는 배열에 대한 포인터입니다. 호출 된 함수에서 배열의 시작 부분을 "건너 뛸"수 있습니다.

C 코드를 다른 CLR 코드와 함께 사용할 수 있으므로 실제로 변환 할 필요가 없습니다.

정말로 필요할 경우 X, Y 및 k를 전달하고 X를 시작 오프셋으로 사용하기 위해 "stuff"를 다시 쓰는 것을 고려할 수 있습니다. 저자는이 경우 C를 매우 효율적으로 사용하며 다른 언어로 포팅하기가 어렵습니다.

관련 문제