2009-11-19 7 views
3

J'ai une question concernant le rassemblement de tableaux C++ en C#. Le double * est-il automatiquement converti en double []? Je sais que double est un type blittable, donc double de C++ est le même que double de C#. Et qu'en est-il de double **, convertit-il en double [,]?Les types double * et double ** sont-ils blittables? C#

J'ai la fonction non gérée suivante: int get_values ​​(param double battant **, int sz)

où est un pointeur param à un tableau de doubles et sz sa taille.

Comment est-ce que je peux DLLImporter cette fonction à C#?

Merci à l'avance

Répondre

2

La déclaration n'a pas de sens. Il serait logique si la fonction prend un pointeur sur un tableau de doubles, mais la déclaration serait

int get_values(double* array, int size); 

où la taille donnerait la taille du tableau alloué par le client et la valeur de retour de la fonction indique le nombre les doubles ont été copiés dans le tableau. La déclaration P/Invoke équivalent serait:

[DllImport("blah.dll")] 
private static extern int get_values(double[] array, int size); 

Vous avez à allouer le tableau avec une nouvelle à la taille que vous avez promis avant d'appeler la fonction.

Mais l'argument double ** est un blocage. Cela peut signifier que la fonction renvoie un pointeur sur un tableau de doubles, mais que l'argument size n'a pas beaucoup de sens.Puisque c'est la fonction qui possède le tableau et contrôle sa taille. Ou cela peut signifier que le client passe un tableau à deux dimensions, mais avoir ensuite un seul argument de taille n'a aucun sens.

Veuillez mettre à jour votre question avec l'interprétation correcte de ce que fait la fonction.

0

This article dit le texte suivant:

Les types complexes suivants sont également types blittables:

tableaux unidimensionnels de types blittables , comme un tableau de entiers. Toutefois, un type qui contient une matrice variable de type blittable est et n'est pas blittable.

0

Dans le contexte d'un type de paramètre de la fonction, double* et double[] sont identiques:

void f(double* p); 
void g(double p[]); 
void h(double p[10]); // even if you supply a size! (it's ignored) 

void i(double (&a)[10]); // now this is different 

Dans d'autres contextes, ils ne sont pas:

void j() { 
    double a[10]; // sizeof a == sizeof(double) * 10 
    double* p; // sizeof p == sizeof(void*) 
} 

Cela est de même pour double** vs double*[] , mais la note double[][] (sans les tailles) est différente, et avec les tailles signifie un pointeur-à-tableau (vous devez spécifier toutes les dimensions sauf une).

Il semble que vous utilisiez un double** lorsque ce n'est pas nécessaire. Est-ce que le simple passage du tableau en tant que double* fonctionne pour vous?

int get_values(double* array, int size); 

void func() { 
    double a[10]; 
    get_values(a, 10); 
} 

(je sais que je ne l'ai pas répondre à votre question DLLImport, je ne connais pas la réponse.)

+0

Je pense que l'exigence technique est 'sizeof (double *) <= sizeof (void *)' (parce que vous êtes autorisé à mettre un pointeur-à-objet dans un 'void * 'et le sortir), mais ils sont généralement de la même taille. Cela peut même être plus particulier. –