Array dinamici di più tipi interni alla DLL

di il
1 risposte

Array dinamici di più tipi interni alla DLL

Salve a tutti,
sono programmatore in C# e ho la necessità di dovermi confrontare con C++.

Come ben sapete è tutta un'altra storia.

Mi è stato chiesto di implementare una DLL in C++ che possa allocare al suo interno la memoria necessaria per gli array.

Mi spiego meglio:
un sistema che con array ad elementi limitati deve poter estendere la sua performance aumentando il numero di elementi, e per farlo può appoggiarsi soltanto a DLL esterne da scrivere in C++.
La DLL quindi deve poter fornire le funzioni per aprire array di tipi diversi (monodimensionali) allocati nella memoria dalla stessa DLL (le funzioni non possono quindi ricevere parametri per riferimento da riempire).

Ad esempio, una funzione int ApriArray(int Size, int Type) deve aprire un array nella memoria di tipo Type, dimensione Size, e restituire un intero che identifichi l'array aperto nella DLL.
In modo che Leggi/Scrivi Array(int Handle) possa leggere gli elementi o scriverli, e AddDelElement(int Handle) possa aggiungerne/toglierne.

Spero di aver reso bene l'idea.

In C# sarebbe semplicissimo, basterebbe un array dinamico di classe da popolare con gli array creati, la cui prima dimensione costituirebbe il puntatore.

In C++ sono abbastanza bloccato, un po' perchè sono parecchio arrugginito, un po' perchè non riesco a superare i limiti di tipo, multidimensione, dinamismo.

Sto cercando una soluzione, un esempio, insomma qualcosa che mi aiuti, magari anche ridisegnando l'architettura della DLL, se necessario, non mi pongo limiti.

Ringrazio chiunque possa darmi indicazioni.

1 Risposte

  • Re: Array dinamici di più tipi interni alla DLL

    Ad esempio, una funzione int ApriArray(int Size, int Type) deve aprire un array nella memoria di tipo Type, dimensione Size, e restituire un intero che identifichi l'array aperto nella DLL.
    Un array in C++ è identificato dal suo puntatore e non da un intero. in C# lo puoi usare come IntPtr quindi il PInvoke lo devi usare in questo modo
    
    [DllImport("miadll.dll")]
    static extern IntPtr ApriArray(int Size, int Type);
    
    int Type credo che ti riferisci a degli enum vero?

    Poi nelle funzioni leggi/scrivi devi passare l'IntPtr e non un int.

    Cmq se i contenitori creati nella dll non devono essere modificati direttamente dal C# ma solo attraverso le funzioni in C++ si può benissimo fare uso di vector che tengono conto della memoria in modo automatico.
Devi accedere o registrarti per scrivere nel forum
1 risposte