Probleme bei DLL Erzeugung



  • Hallo ihr Fachmänner,

    ich will eine DLL erzeugen und habe zu diesem Zwecke einen Code erstellt. Nun enstehen jedoch beim kompilieren über 100 Fehler und der Vorgang wird abgebrochen... 😕
    Ich denke das dies ein einzelner Syntax Fehler sein dürfte, nur finde ich ihn nicht.
    Vielleicht weiß ja jemand von euch wo der Hacken ist und es ist keine größere Sache.

    #include <windows.h>
    #include <math.h>
    #include <string.h>
    #include <algorithm>
    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <sstream>
    #include <string>
    #include <vector>
    #include <stdlib.h>

    int __declspec(dllexport) APIENTRY UserGrinDefinition(double *data);
    int __declspec(dllexport) APIENTRY UserParamNames(char *data);

    BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
    {
    return TRUE;
    }

    /* the data is stored as follows:
    ndata = the number of elements in the array data
    data[0] = the total number of values in the passed data array
    data[1] = x
    data[2] = y
    data[3] = z
    data[4] = wavelength in µm
    data[5] = millimeters per unit length (1.0 for mm, 25.4 for inches, 10.0 for cm and 1000.0 for meters)
    data[6] = n (to be computed by the dll and returned)
    data[7] = n * dn/dx (to be computed by the dll and returned)
    data[8] = n * dn/dy (to be computed by the dll and returned)
    data[9] = n * dn/dz (to be computed by the dll and returned)
    data[10] = parameter 1 from user input
    data[11] = parameter 2 from user input
    etc... up to data[maxdata] where maxdata = int(data[0])

    The DLL must compute data 6 through 9 given the other data,
    and return 0 if it works; else return -1
    */

    // Modified to be periodic with period dx and dy if both are greater than zero to support arrays

    int __declspec(dllexport) APIENTRY UserGrinDefinition(double *data)
    {
    long double r, index, rKugel, nKritisch, aktMin, aktIndex, x, y, z, dx, dy, dz;

    x = data[1];
    y = data[2];
    z = data[3];
    nKritisch = data[10];
    rKugel = data[11];
    dx = data[12];
    dy= data[13];
    dz= data[14];

    using namespace std;

    int main(void) {
    ifstream ifs("C:\\Simulationsergebnisse.txt");

    if (!ifs) {
    cerr << "Datei kann nicht geöffnet werden" << endl;
    exit(-1);
    }

    vector<vector<double> > matrix;
    while (ifs) {
    string line;
    getline(ifs, line);
    istringstream iss(line);
    vector<double> values;
    copy(istream_iterator<double>(iss),
    istream_iterator<double>(),
    back_insert_iterator<vector<double> >(values));
    if (values.size() > 0) matrix.push_back(values);
    }

    if (dx > 0 && dy > 0 && dz > 0)
    {
    // adjust to center of array
    if (x > +0.5*dx) x -= dx*(double)ceil(+(x - 0.5dx)/dx);
    if (x < -0.5*dx) x += dx*(double)ceil(-(x + 0.5
    dx)/dx);
    if (y > +0.5*dy) y -= dy*(double)ceil(+(y - 0.5dy)/dy);
    if (y < -0.5*dy) y += dy*(double)ceil(-(y + 0.5
    dy)/dy);
    if (z > +0.5*dz) z -= dz*(double)ceil(+(z - 0.5dz)/dz);
    if (z < -0.5*dz) z += dz*(double)ceil(-(z + 0.5
    dz)/dz);
    }

    r = sqrt(x*x + y*y + z*z);

    for (int q = 0; q < matrix.size(); ++q){
    if (r <= rKugel )
    {
    index = 1; //Frage innerhalb der Kugel index auf 1 oder 0 setzen
    }
    else if (abs(matrix[q][0] - r)< aktMin)
    {
    aktMin = abs(matrix [q] [0] -r);
    aktIndex = q;
    index = sqrt(1-(matrix[aktIndex][1]/nKritisch));
    }
    else
    {
    index = 1;
    }

    data[6] = index;

    if (index < 0.0)
    {
    return -1;
    }

    /* now the derivatives, note they are multiplied by index */

    if (r <= rKugel)
    {
    data[7] = 0;
    data[8] = 0;
    data[9] = 0;
    }
    else
    {
    data[7] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*x*index/r;
    data[8] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*y*index/r;
    data[9] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*z*index/r;
    }

    return 0;
    }

    int __declspec(dllexport) APIENTRY UserParamNames(char *data)
    {
    /* this function returns the name of the parameter requested */
    int i;
    i = (int) data[0];
    strcpy(data,"");
    if (i == 1) strcpy(data,"nKritisch");
    if (i == 2) strcpy(data,"rKugel");
    if (i == 3) strcpy(data,"Array dx");
    if (i == 4) strcpy(data,"Array dy");
    if (i == 5) strcpy(data,"Array dz");
    return 0;
    }

    Vielen Dank für eure Unterterstützung



  • Cpp Tags und Fehlermeldungen auch posten.



  • Hier habe ich einmal Beispielhaft die Fehlermeldungen rauskopiert.

    1>c:\programme\microsoft visual studio 9.0\vc\include\cstring(21) : error C2143: Syntaxfehler: Es fehlt '{' vor ':'
    1>c:\programme\microsoft visual studio 9.0\vc\include\cstring(21) : error C2059: Syntaxfehler: ':'

    1>c:\programme\microsoft visual studio 9.0\vc\include\cstdio(39) : error C2143: Syntaxfehler: Es fehlt '{' vor ':'
    1>c:\programme\microsoft visual studio 9.0\vc\include\cstdio(39) : error C2059: Syntaxfehler: ':'

    ich denke das der Fehler an den include Dateien liegt und nicht an der Programmierung.

    Ich habe den Code einfachhalber noch etwas umgeschrieben

    #include <windows.h>
    #include <math.h>
    #include <string.h>
    #include <algorithm>
    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <sstream>
    #include <string>
    #include <vector>
    #include <stdlib.h>

    int __declspec(dllexport) APIENTRY UserGrinDefinition(double *data);
    int __declspec(dllexport) APIENTRY UserParamNames(char *data);

    BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
    {
    return TRUE;
    }

    int __declspec(dllexport) APIENTRY UserGrinDefinition(double *data)
    {
    long double r, index, rKugel, nKritisch, aktMin, aktIndex, x, y, z, dx, dy, dz;

    x = data[1];
    y = data[2];
    z = data[3];
    nKritisch = data[10];
    rKugel = data[11];
    dx = data[12];
    dy= data[13];
    dz= data[14];

    if (dx > 0 && dy > 0 && dz > 0)
    {
    if (x > +0.5*dx) x -= dx*(double)ceil(+(x - 0.5dx)/dx);
    if (x < -0.5*dx) x += dx*(double)ceil(-(x + 0.5
    dx)/dx);
    if (y > +0.5*dy) y -= dy*(double)ceil(+(y - 0.5dy)/dy);
    if (y < -0.5*dy) y += dy*(double)ceil(-(y + 0.5
    dy)/dy);
    if (z > +0.5*dz) z -= dz*(double)ceil(+(z - 0.5dz)/dz);
    if (z < -0.5*dz) z += dz*(double)ceil(-(z + 0.5
    dz)/dz);
    }
    using namespace std;

    // Textdatei einlesen und in Matrix speichern

    ifstream ifs("C:\\Simulationsergebnisse.txt");
    if (!ifs) {
    cerr << "Datei kann nicht geöffnet werden" << endl;
    exit(-1);
    }

    vector<vector<double> > matrix;
    while (ifs) {
    string line;
    getline(ifs, line);
    istringstream iss(line);
    vector<double> values;
    copy(istream_iterator<double>(iss),
    istream_iterator<double>(),
    back_insert_iterator<vector<double> >(values));
    if (values.size() > 0) matrix.push_back(values);
    }

    r = sqrt(x*x + y*y + z*z);

    if (r <= rKugel ){
    data[6] = 1;
    data[7] = 0;
    data[8] = 0;
    data[9] = 0;
    }
    else{
    aktMin=1000.;
    for (int q = 0; q < matrix.size(); ++q){
    if (abs(matrix[q][0] - r)< aktMin){
    aktMin = abs(matrix [q] [0] -r);
    aktIndex = q;
    }
    }
    index = sqrt(1-(matrix[aktIndex][1]/nKritisch));
    data[6] = index;
    data[7] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*x*index/r;
    data[8] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*y*index/r;
    data[9] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*z*index/r;
    }
    if (index < 0.0)
    {
    return -1;
    }
    return 0;
    }

    int __declspec(dllexport) APIENTRY UserParamNames(char *data)
    {

    int i;
    i = (int) data[0];
    strcpy(data,"");
    if (i == 1) strcpy(data,"nKritisch");
    if (i == 2) strcpy(data,"rKugel");
    if (i == 3) strcpy(data,"Array dx");
    if (i == 4) strcpy(data,"Array dy");
    if (i == 5) strcpy(data,"Array dz");
    return 0;
    }

    der Teil der die Textdatei einließt hat bei einem separaten Test funktioniert und der Rest sollte auch funktionieren. 😕



  • Bitte den C/C++ button vor und nach dem Code betätigen danke.
    ich habe nichts geändert

    #include <windows.h>
    #include <math.h>
    #include <string.h>
    #include <algorithm>
    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <sstream>
    #include <string>
    #include <vector>
    #include <stdlib.h>
    
    int __declspec(dllexport) APIENTRY UserGrinDefinition(double *data);
    int __declspec(dllexport) APIENTRY UserParamNames(char *data);
    
    BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
    {
    return TRUE;
    }
    
    int __declspec(dllexport) APIENTRY UserGrinDefinition(double *data)
    {
    long double r, index, rKugel, nKritisch, aktMin, aktIndex, x, y, z, dx, dy, dz;
    
    x = data[1];
    y = data[2];
    z = data[3];
    nKritisch = data[10];
    rKugel = data[11];
    dx = data[12];
    dy= data[13];
    dz= data[14];
    
    if (dx > 0 && dy > 0 && dz > 0)
    {
    if (x > +0.5*dx) x -= dx*(double)ceil(+(x - 0.5*dx)/dx);
    if (x < -0.5*dx) x += dx*(double)ceil(-(x + 0.5*dx)/dx);
    if (y > +0.5*dy) y -= dy*(double)ceil(+(y - 0.5*dy)/dy);
    if (y < -0.5*dy) y += dy*(double)ceil(-(y + 0.5*dy)/dy);
    if (z > +0.5*dz) z -= dz*(double)ceil(+(z - 0.5*dz)/dz);
    if (z < -0.5*dz) z += dz*(double)ceil(-(z + 0.5*dz)/dz);
    }
    using namespace std;
    
    // Textdatei einlesen und in Matrix speichern
    
    ifstream ifs("C:\\Simulationsergebnisse.txt");
    if (!ifs) {
    cerr << "Datei kann nicht geöffnet werden" << endl;
    exit(-1);
    }
    
    vector<vector<double> > matrix;
    while (ifs) {
    string line;
    getline(ifs, line);
    istringstream iss(line);
    vector<double> values;
    copy(istream_iterator<double>(iss),
    istream_iterator<double>(),
    back_insert_iterator<vector<double> >(values));
    if (values.size() > 0) matrix.push_back(values);
    }
    
    r = sqrt(x*x + y*y + z*z);
    
    if (r <= rKugel ){
    data[6] = 1;
    data[7] = 0;
    data[8] = 0;
    data[9] = 0;
    }
    else{
    aktMin=1000.;
    for (int q = 0; q < matrix.size(); ++q){
    if (abs(matrix[q][0] - r)< aktMin){
    aktMin = abs(matrix [q] [0] -r);
    aktIndex = q;
    }
    }
    index = sqrt(1-(matrix[aktIndex][1]/nKritisch));
    data[6] = index;
    data[7] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*x*index/r;
    data[8] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*y*index/r;
    data[9] = (sqrt(1-(matrix[aktIndex+1][1]/nKritisch))-sqrt(1-(matrix[aktIndex][1]/nKritisch)))
    /(matrix[aktIndex+1][0]-matrix[aktIndex][0])*z*index/r;
    }
    if (index < 0.0)
    {
    return -1;
    }
    return 0;
    }
    
    int __declspec(dllexport) APIENTRY UserParamNames(char *data)
    {
    
    int i;
    i = (int) data[0];
    strcpy(data,"");
    if (i == 1) strcpy(data,"nKritisch");
    if (i == 2) strcpy(data,"rKugel");
    if (i == 3) strcpy(data,"Array dx");
    if (i == 4) strcpy(data,"Array dy");
    if (i == 5) strcpy(data,"Array dz");
    return 0;
    }
    


  • ok danke, das werde ich mir fürs nächste mal merken...



  • int __declspec(dllexport) APIENTRY UserParamNames(char *data)
    {
    int i;
    i = (int) data[0];
    strcpy(data,"");
    if (i == 1) strcpy(data,"nKritisch");
    if (i == 2) strcpy(data,"rKugel");
    if (i == 3) strcpy(data,"Array dx");
    if (i == 4) strcpy(data,"Array dy");
    if (i == 5) strcpy(data,"Array dz");
    return 0;
    }
    

    Was ist das?
    1. Ist es zumindest fragwürdig für ein 1 Byte großes Datum einen int zu verwenden. Zum anderen macht es keinen Sinn zu fragen ob i == 1 ist und danach noch mal, ob es nicht doch lieber 2 oder 3 sein möchte.

    In solchen Fällen immer else if und hier am besten switch().



  • diesen Teil habe ich 1 zu 1 aus einer Beispiel DLL von dem Programm das ich verwende entnommen. In anderen Fällen hat dieser Teil auch bisher keine Probleme gemacht...... 😞


Anmelden zum Antworten