DLL-ből tömb visszaadása c alatt

DLL-ből tömb visszaadása c alatt
2010-09-03T18:51:17+02:00
2010-09-06T17:47:38+02:00
2022-08-02T18:15:28+02:00
betman
Sziasztok!

A problémám kissé bonyolult ezért megpróbálom érthetően fogalmazni:
Egy Cuda kódot kellene dll-be foglalnom a következőt látja el:
A c alapú CUDA kód, mely egy DLL-ben van egy tömböt kap be majd azon számításokat végez és visszaad egy kész tömböt a DLL meghívójának.
Ehhez előbb egy C kódot szeretnék írni, mely visszaad egy tömböt a DLL meghívójának.

C++ ban a következőig jutottam:
Egy működő DLL-t alakítanék át mely egy int tömb bekapására egy számot ad vissza:

//DLLCode.cpp tartalma:

#include "Stdafx.h" #include "DLLCode.h" #include <iostream> using namespace std; int* DLLfun1(int* a) { int* b; for (int i=0; i<3; i++) { a[i]=a[i]+1; } b = a; return b; };

//a DLLCode.h tartalma:


#ifdef DLLDIR_EX #define DLLDIR __declspec(dllexport) // export DLL information #else #define DLLDIR __declspec(dllimport) // import DLL information #endif // names for the functions extern "C" { int* DLLDIR DLLfun1(int*); };
itt elakadtam mert egy tömbbel kellene visszatérni, de nem fogadja el a visszatérés módját. Valaki meg tudná mutatni a helyes használatot Tömb visszaadására DLL-en keresztül?

error: "Error 1 error C2556: 'int *DLLfun1(int *)' : overloaded function differs only by return type from 'int DLLfun1(int *)' d:\gyakorlatok\w32dll\w32dll\dllcode.cpp 13 W32DLL
"
Mutasd a teljes hozzászólást!
A struktúrában lévő tomb mutató definiálatlan!
Ez így nem fog menni. Először is a my_struktura-t nem adhatod vissza, mert auto változó. Használj helyette mutatót és allokálj egy struktúrát. Másodszor a struktúrában lévő tömböt kell lefoglalni, ahhoz viszont tudnod kellene a paraméterként átadott tömb méretét.

stuktura_tipus DLLfun2(int *a, int n) { stuktura_tipus *my_stuktura; my_struktura = (stuktura_tipus*) malloc(sizeof(struktura_tipus); my_struktura->tomb = (int*) malloc(sizeof(int)*n)); for (int i=0; i<3; i++) { my_stuktura->tomb[i]=a[i]+1; } my_stuktura->nev = "EZ EGY STRUKTURA"; return my_stuktura; }

Persze ezt a struktúra hókusz-pókuszt el is hagyhatod, mert sok értelme nincs, főleg hogy eredetileg sem ezt akartad:
int *DLLfun2(int *a, int n) { int *b; b = (int*) malloc(sizeof(int)*n)); for (int i=0; i<3; i++) { b[i] = a[i]+1; } return b; }
Mutasd a teljes hozzászólást!

  • ... extern "C" { int DLLDIR *DLLfun1(int*); };

    Próbáld meg így!
    Csináljál egy strukturát a tömbnek majd azt add át!
    Mutasd a teljes hozzászólást!
  • A nevekkel van baj: van egy

    int *DLLfun1(int *)

    meg egy

    int DLLfun1(int *)

    Találj egyedi neveket, akár még arra is ügyelhetsz, hogy a név utaljon a funkcióra
    Mutasd a teljes hozzászólást!
  • A másik kérdés, hogy a C++ -t egyáltalán minek keverted bele a történetbe?
    Mutasd a teljes hozzászólást!
  • Ha jól értem te azt mondod, hogy csináljak egy struktúrát és annak legyen a tömb egy része.Ezután már csak a struktúrát adjam visszatérési értékként?

    Eddig jutottam vele:
    error C2526: 'DLLfun2' : C linkage function cannot return C++ class 'stuktura_tipus'


    header file:
    #ifdef DLLDIR_EX #define DLLDIR __declspec(dllexport) // export DLL information #else #define DLLDIR __declspec(dllimport) // import DLL information #endif extern "C" { struct stuktura_tipus DLLDIR DLLfun2(int*); };



    DLL kód:
    #include "Stdafx.h" #include "DLLCode.h" #include <iostream> using namespace std; struct stuktura_tipus { char nev[20]; int* tomb; }; stuktura_tipus DLLfun2(int* a) { stuktura_tipus my_stuktura; for (int i=0; i<3; i++) { my_stuktura.tomb[i]=a[i]+1; } my_stuktura.nev = "EZ EGY STRUKTURA"; return my_stuktura; };
    Mutasd a teljes hozzászólást!
  • Elvileg sikerült lefordult a DLL, lehet a 3 napja tartó betegség miatt néztem el hülyeségeket. A köv gond a Cliens ami a DLL-ből megkapja a struktúrát, de mikor kiíratnám a benne található szöveget kiakad.

    header file:

    #ifdef DLLDIR_EX #define DLLDIR __declspec(dllexport) // export DLL information #else #define DLLDIR __declspec(dllimport) // import DLL information #endif struct stuktura_tipus { char* nev; int* tomb; }; extern "C" { stuktura_tipus DLLDIR DLLfun2(int*); };



    A kód file:

    #include "Stdafx.h" #include "DLLCode.h" #include <iostream> using namespace std; stuktura_tipus DLLfun2(int* a) { stuktura_tipus my_stuktura; for (int i=0; i<3; i++) { my_stuktura.tomb[i]=a[i]+1; } my_stuktura.nev = "EZ EGY STRUKTURA"; return my_stuktura; };

    A kliens:


    #include <iostream> #include <conio.h> #include <windows.h> #include "DLLCode.h" #pragma comment(lib,"W32DLL.lib") using namespace std; int main() { int *tomb; int N = 3; size_t memSize = N * sizeof(int); tomb = (int *) malloc(memSize); for (int i=0; i<3 ; i++) tomb[i]=i; stuktura_tipus tomb_eredmeny_struktura; tomb_eredmeny_struktura = DLLfun2(tomb); getch(); cout << "\n \n: " << tomb_eredmeny_struktura.nev << ", " << endl; return 0; }
    Mutasd a teljes hozzászólást!
  • nyilván
    int *a, int *tomb, char *nev
    van minden helyen ahol int* char* volt.
    Úgy tűnik hogy a kódhiba ebben a sorban van a dll fileban:

    my_stuktura.tomb=a+1;

    Valamiért nem tudok átadni értéket a my_stuktura.tomb elemének.
    Ötlet?
    Mutasd a teljes hozzászólást!
  • A struktúrában lévő tomb mutató definiálatlan!
    Ez így nem fog menni. Először is a my_struktura-t nem adhatod vissza, mert auto változó. Használj helyette mutatót és allokálj egy struktúrát. Másodszor a struktúrában lévő tömböt kell lefoglalni, ahhoz viszont tudnod kellene a paraméterként átadott tömb méretét.

    stuktura_tipus DLLfun2(int *a, int n) { stuktura_tipus *my_stuktura; my_struktura = (stuktura_tipus*) malloc(sizeof(struktura_tipus); my_struktura->tomb = (int*) malloc(sizeof(int)*n)); for (int i=0; i<3; i++) { my_stuktura->tomb[i]=a[i]+1; } my_stuktura->nev = "EZ EGY STRUKTURA"; return my_stuktura; }

    Persze ezt a struktúra hókusz-pókuszt el is hagyhatod, mert sok értelme nincs, főleg hogy eredetileg sem ezt akartad:
    int *DLLfun2(int *a, int n) { int *b; b = (int*) malloc(sizeof(int)*n)); for (int i=0; i<3; i++) { b[i] = a[i]+1; } return b; }
    Mutasd a teljes hozzászólást!
  • Holnap megnézem hogy hasznosíthatom a leírtakat, de a struktúra mégis jobb, mivel a cuda hibaüzeneteit is át kell adnom a végén :)
    Jelentkezem tomorrow. Addig pedig köszönöm.
    Mutasd a teljes hozzászólást!
  • Gyönyörűen működik, a cuda kódomat is beleimplementáltam és szépen fordul. Köszönöm a segítséget.
    Mutasd a teljes hozzászólást!
abcd