[英]array as function parameter c to c# confusion
我試圖用C#編寫一個類,以使用dll的導出功能,但是我遇到了很多函數,這些函數具有數組作為函數參數,我不確定該如何處理。 下面是一個例子。
我將如何在C#函數中使用它? 具體如何處理iymdf []?
調用函數時會發生什么?
這看起來正確嗎?
[DllImport("libsofa.dll")]
public static extern int iauJdcalf(int ndp, double dj1, double dj2, ref int[] iymdf = new int[4]);
例:
int __stdcall iauJdcalf(int ndp, double dj1, double dj2, int iymdf[4])
{
int j, js;
double denom, d1, d2, f1, f2, f;
/* Denominator of fraction (e.g. 100 for 2 decimal places). */
if ((ndp >= 0) && (ndp <= 9)) {
j = 0;
denom = pow(10.0, ndp);
} else {
j = 1;
denom = 1.0;
}
/* Copy the date, big then small, and realign to midnight. */
if (dj1 >= dj2) {
d1 = dj1;
d2 = dj2;
} else {
d1 = dj2;
d2 = dj1;
}
d2 -= 0.5;
/* Separate days and fractions. */
f1 = fmod(d1, 1.0);
f2 = fmod(d2, 1.0);
d1 = floor(d1 - f1);
d2 = floor(d2 - f2);
/* Round the total fraction to the specified number of places. */
f = floor((f1+f2)*denom + 0.5) / denom;
/* Re-assemble the rounded date and re-align to noon. */
d2 += f + 0.5;
/* Convert to Gregorian calendar. */
js = iauJd2cal(d1, d2, &iymdf[0], &iymdf[1], &iymdf[2], &f);
if (js == 0) {
iymdf[3] = (int) (f * denom);
} else {
j = js;
}
/* Return the status. */
return j;
}
功能文檔:
/*
** - - - - - - - - - -
** i a u J d c a l f
** - - - - - - - - - -
**
** Julian Date to Gregorian Calendar, expressed in a form convenient
** for formatting messages: rounded to a specified precision.
**
** This function is part of the International Astronomical Union's
** SOFA (Standards Of Fundamental Astronomy) software collection.
**
** Status: support function.
**
** Given:
** ndp int number of decimal places of days in fraction
** dj1,dj2 double dj1+dj2 = Julian Date (Note 1)
**
** Returned:
** iymdf int[4] year, month, day, fraction in Gregorian
** calendar
**
** Returned (function value):
** int status:
** -1 = date out of range
** 0 = OK
** +1 = NDP not 0-9 (interpreted as 0)
**
** Notes:
**
** 1) The Julian Date is apportioned in any convenient way between
** the arguments dj1 and dj2. For example, JD=2450123.7 could
** be expressed in any of these ways, among others:
**
** dj1 dj2
**
** 2450123.7 0.0 (JD method)
** 2451545.0 -1421.3 (J2000 method)
** 2400000.5 50123.2 (MJD method)
** 2450123.5 0.2 (date & time method)
**
** 2) In early eras the conversion is from the "Proleptic Gregorian
** Calendar"; no account is taken of the date(s) of adoption of
** the Gregorian Calendar, nor is the AD/BC numbering convention
** observed.
**
** 3) Refer to the function iauJd2cal.
**
** 4) NDP should be 4 or less if internal overflows are to be
** avoided on machines which use 16-bit integers.
**
** Called:
** iauJd2cal JD to Gregorian calendar
**
** Reference:
**
** Explanatory Supplement to the Astronomical Almanac,
** P. Kenneth Seidelmann (ed), University Science Books (1992),
** Section 12.92 (p604).
**
** This revision: 2010 July 27
**
** SOFA release 2010-12-01
**
** Copyright (C) 2010 IAU SOFA Board. See notes at end.
*/
從C#聲明中刪除ref關鍵字,這是不正確的。 您還需要丟失聲明中的初始化,這是不支持的語法。 在進行調用之前初始化數組。
[DllImport("libsofa.dll")]
public static extern int iauJdcalf(int ndp, double dj1, double dj2, int[] iymdf);
...
int[] arr = new int[] { 1, 2, 3, 4 };
int retval = iauJdcalf(1, 2, 3, arr);
您將要進行標准的函數調用,具體取決於您在做什么。 函數定義僅聲明“這些是我的輸入”,然后在調用它時,必須提供實際值。 您無需重新創建函數def。
[DllImport("libsofa.dll")]
myReturn = iauJdcalf(1, 2.0, 2.0, [1,2,3,4]);
您的函數定義為返回一個int,因此我們使用myReturn變量捕獲它,您當然需要首先對其進行聲明。 然后,我們提供一個int,兩個double和一個數組。 您還可以傳遞這些類型的變量,請注意確保數組的大小與所需大小相同。
另外,注意指針! 如果將變量傳遞給c,它將復制到函數中定義的局部變量。 如果給它一個指針,則需要在函數定義中聲明它,並意識到我們正在玩指針游戲。
太回答我自己的問題了,我認為會涉及到更多的Marshaling東西,但是下面的代碼給出了一個合理的輸出。
[DllImport("libsofa.dll")]
public static extern int iauJdcalf(int ndp, double dj1, double dj2, [MarshalAs(UnmanagedType.LPArray, SizeConst = 4)] int[] iymdf);
以及這個:
[DllImport("libsofa.dll")]
public static extern int iauJdcalf(int ndp, double dj1, double dj2, int[] iymdf);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.