Debug vs. Release



  • Hallo zusammen,

    stehe gerade vor einem ganz strangen Problem. Ich habe eine DLL entwickelt, welche per VBA angesprochen wird. Debugge ich das Release-Build bekomme ich die richtigen Ergebnisse in Excel zurück gegeben. Starte ich aber die Funktion (ohne Debugging) von Excel aus, wird Excel mit einem schwerwiegenden Fehler beendet. Dies kommt allerdings nur vor, wenn mit folgender Funktion der Minimumwert errechnet wird und alle Werte gleich groß sind:

    int kleinsterWert=0;
    
       int z = 0;
    
        kleinsterWert = vergleichsarray[0];
        for (; z < sizeof(vergleichsarray) / sizeof(int); z++) {
            if (vergleichsarray[z] < kleinsterWert)
                kleinsterWert = vergleichsarray[z];
        }
    

    Dieser Wert wird dann einem Array gegenübergestellt um die Zeile zu bestimmen:

    for (i=0; i<anzahlRessourcen; i++)
    	{
    		if (kleinsterWert==vergleichsarray[i])
    		{break;
    		}
    	}
    

    Die Ergebnisse werden sowohl im Debug, Release (debugging mit der Excel-Datei) und Release korrekt kalkuliert. Führe ich aber das Release per Excel (ohne debugging) aus, wird Excel mit einem schwerwiegenden Fehler beendet.
    Woran kann das liegen bzw. wie komme ich auf den Fehler. Die Ergebnisse sind da und werden korrekt zurückgeschrieben.

    Hoffe ich bin mit meiner Anfrage im richtigen Forum.

    Danke jedenfalls jetzt schon für die Hilfe.

    Liebe Grüße



  • Wo ist vergleichsarray deklariert? Ist es ein Zeiger?

    Und gibt es einen Grund, wieso du auf die STL verzichtest? Nicht nur Containerklassen wie std::vector , sondern auch Algorithmen könnten dir massiv Arbeit abnehmen.

    std::vector<int> vergleichsarray;
    // ...
    int max = *std::max_element(vergleichsarray.begin(), vergleichsarray.end());
    

    Die entsprechende Dokumentation findest du auf www.cplusplus.com.



  • Wow, das ging aber schnell 🙂

    vergleichsarray ist zu Beginn der Funktion korrekt deklariert und es wird auch korrekt gefüllt.
    Ursprünglich hatte *min_element integriert. Ich dachte mir, dass daher der Fehler kommt und habe den Teil eigens umgeschrieben um es auszutesten.
    War nur leider nicht zielführend. Die Funktion rechnet richtig und das Ergebnis kann auch weiter verwendet werden.
    Ich verstehe nicht, warum die DLL bis zum Schluss die richtigen Ergebnisse liefert, wenn ich das Release debugge und wenn ich es nicht debugge sonder direkt ansteuere mir die Ergebnisse zwar vorliegen, aber Excel abschmiert. (In VBA ist aber auch kein Fehler, da direkt nach dem DLL Aufruf Sense ist).



  • schreima schrieb:

    vergleichsarray ist zu Beginn der Funktion korrekt deklariert und es wird auch korrekt gefüllt.

    Das beantwortet aber nicht die Frage, wie es deklariert ist. Kannst du den Code der ganzen Funktion zeigen?

    Woher weisst du überhaupt, dass der Fehler dort auftritt? Hast du schon versucht, mit Ausgaben (oder dem Debugger) die genaue Absturzstelle zu lokalisieren?

    schreima schrieb:

    Ursprünglich hatte *min_element integriert. Ich dachte mir, dass daher der Fehler kommt und habe den Teil eigens umgeschrieben um es auszutesten.

    Die STL-Algorithmen sind schon korrekt programmiert. Du solltest sie eigenen Implementierungen eigentlich immer vorziehen.



  • achtung,

    std::vector<int> vergleichsarray;
    // ...
    int max = *std::max_element(vergleichsarray.begin(), vergleichsarray.end());
    

    wenn der container leer ist, krachts...
    lieber wirklich den iterator speichern, gegen end prüfen und erst dann dereferenzieren(nein, nicht wenn er gleich end ist^^)

    bb



  • Danke für eure Hilfe. Ich hab den Fehler gefunden. Vergleichsarray war zu klein dimensioniert. Jetzt läufts perfekt.
    Liebe Grüße



  • Solche Fehler hättest du unmittelbar gefunden, wenn du Container benutzen würdest...



  • Danke fuer den tipp, beschaeftige mich erst seit ein paar monaten mit c++. Hab einige vorkenntnisse in vba und somit kann ich mich halbwegs gut ueber bestimmte problemstellungen helfen. Das programm funktioniert jetzt recht gut, aber fuer die zukunft muss ich mein wissen noch sicher erweitern. Hast du zu den containern zufaellig eine einfach verstaendliche doku parat?

    Einen wichtigen punkt brauche ich noch fuer mein programm. Und zwar die kommunikation zwischen vba und einer c++ dll. Ich moechte einen string aus vba an die dll uebergeben, in der dll verandern und wieder an vba retour schicken. Im moment loese ich das mit csv dateien als kommunikationstraeger. Ich habe das problem schon gegoogelt und herausgefunded, dass ein string in vba anders aussieht als ein string in c++ (beides als string deklariert). Das problem habe ich erkannt, allerdings die ursache und ev loesungen im netz sind mir zu hoch, bin leider kein informatiker 🙂 hast du da vl auch einen tipp, wie ich zb "hallo" von vba an ne dll schicke und "hallo retour" in vba als messagebox zurueck bekomme.

    Danke,
    Liebe gruesse



  • schreima schrieb:

    Hast du zu den containern zufaellig eine einfach verstaendliche doku parat?

    In diesem Artikel findest du eine Einführung. Als Dokumentation kannst du www.cplusplus.com verwenden.

    schreima schrieb:

    Ich moechte einen string aus vba an die dll uebergeben, in der dll verandern und wieder an vba retour schicken.

    Ich kenne VBA leider nicht und kann dir deshalb nichts Konkretes bezüglich Interoperabilität mit C++-DLLs sagen. Aber vielleicht gibt es eine Möglichkeit über C-Strings (nullterminierte char -Arrays). Allerdings gibt es hier sicher andere Leute, die sich besser damit auskennen.



  • String ist String. Am Ende eine Null-terminierte Folge von Zeichen, die in einem Speicherbereich liegen.

    Am Ende einfach mal eine Testfunktion erstellen, das ganze als DLL kompillieren und mal in VB über import o.ä. reinladen...

    Erstellen der DLL (Google)
    http://de.wikipedia.org/wiki/Dynamic_Link_Library

    Laden der DLL in VBA (Google)
    http://www.tutorials.de/forum/visual-basic-6-0/164095-externe-dll-unter-vba-excel-einbinden.html

    Sind jetzt nur gegoogelte Beispiele... Sollte aber helfen.


Log in to reply