<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Hilfe beim Debugging: Tip benötigt]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe ein Problem beim Debugging. Ich habe eine C DLL geschrieben die ich in Excel eingebunden habe. Wenn ich die Funktion aufrufe gibt es die Fehlermeldung Division durch 0. Beim Debuggen sehe ich das die Funktion den Rückgabewert (ein double, deshalb vielleicht auch die Fehlermeldung) richtig berechnet. Es kommt dann sowas wie 4.12478e-8 heraus. Bei der Rueckgabe des Wertes an Excel per return Statement scheint sich der Wert jedoch in Infinity zu verwandeln.<br />
Habt Ihr eine Idee woran das liegen kann?</p>
<p>Der Wert wird by value übergeben. Es bleiben doch nur 2 Möglichkeiten: Es wurde irgendwas auf dem Stack durcheinander gebracht, oder meine Funktion schreibt irgendwas in den Speicher von Excel und löst so den Fehler aus.</p>
<pre><code class="language-cpp">double __stdcall funcABC(double a, double b, int c) {
  double tmp;

  tmp=myFunc(a, b);
  return tmp;
}
</code></pre>
<p>Excel ruft funcABC auf, in tmp wird eine Zahl wie 4.78e-8 hereingeschrieben, wenn ich mit F10 hinter das return statement gehe gibt es den Div/0 Fehler.</p>
<p>Viele Grüße</p>
<p>Mike</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/66355/hilfe-beim-debugging-tip-benötigt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 06 Jun 2026 07:10:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/66355.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Feb 2004 15:12:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Fri, 27 Feb 2004 15:12:24 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe ein Problem beim Debugging. Ich habe eine C DLL geschrieben die ich in Excel eingebunden habe. Wenn ich die Funktion aufrufe gibt es die Fehlermeldung Division durch 0. Beim Debuggen sehe ich das die Funktion den Rückgabewert (ein double, deshalb vielleicht auch die Fehlermeldung) richtig berechnet. Es kommt dann sowas wie 4.12478e-8 heraus. Bei der Rueckgabe des Wertes an Excel per return Statement scheint sich der Wert jedoch in Infinity zu verwandeln.<br />
Habt Ihr eine Idee woran das liegen kann?</p>
<p>Der Wert wird by value übergeben. Es bleiben doch nur 2 Möglichkeiten: Es wurde irgendwas auf dem Stack durcheinander gebracht, oder meine Funktion schreibt irgendwas in den Speicher von Excel und löst so den Fehler aus.</p>
<pre><code class="language-cpp">double __stdcall funcABC(double a, double b, int c) {
  double tmp;

  tmp=myFunc(a, b);
  return tmp;
}
</code></pre>
<p>Excel ruft funcABC auf, in tmp wird eine Zahl wie 4.78e-8 hereingeschrieben, wenn ich mit F10 hinter das return statement gehe gibt es den Div/0 Fehler.</p>
<p>Viele Grüße</p>
<p>Mike</p>
]]></description><link>https://www.c-plusplus.net/forum/post/469097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/469097</guid><dc:creator><![CDATA[Mike Fudd]]></dc:creator><pubDate>Fri, 27 Feb 2004 15:12:24 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Fri, 27 Feb 2004 16:04:24 GMT]]></title><description><![CDATA[<p>1. falsche forum<br />
2. Welche Entwicklungsumgebung?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/469110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/469110</guid><dc:creator><![CDATA[CMatt]]></dc:creator><pubDate>Fri, 27 Feb 2004 16:04:24 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Sat, 28 Feb 2004 18:12:53 GMT]]></title><description><![CDATA[<p>Hallo CMatt,</p>
<p>Du hast recht. &quot;Rund um die Programmierung&quot; wäre vielleicht das bessere Forum.<br />
Ich benutze das Visual Studio 6.</p>
<p>Das Problem ist das myFunc(a, b) den Wert richtig berechnet. In tmp steht ein normaler Doublewert. Ich debugge weiter mit F10... wenn ich die Funktion funcABC verlasse gerate ich in irgendwelche Assemblerbefehle. KA was die bewirken. Vielleicht sind es die Befehle die den Stack aufräumen, da ja bei stdcall die aufgerufene Funktion den Stack aufräumt. Drücke ich jetzt F5 um das Programm automatisch weiter laufen zu lassen erscheint wieder der Div/0 Fehler in Excel.<br />
Die Rücksprungadresse habe ich mir vor und nach dem Aufruf von myFunc angesehen. Es ist immer die gleiche. -&gt; myFunc überschreibt sie nicht. Nehme ich den Funktionsaufruf von myFunc heraus und ersetze ihn durch eine normale Zahl gibt es keine Div/0 und in Excel erscheint der Dummywert.</p>
<p>Ach ja: Excel verlang stdcall. Nehme ich eine andere Aufrufkonvention gibts Mecker von Eckart;-)</p>
<p>Bei dieser Funktion gibt es die gleiche Fehlermeldung:</p>
<pre><code class="language-cpp">double __stdcall funcABC(double a, double b, int c) {
  myFunc(a, b);
  return 3;
}
</code></pre>
<p>Kommentier ich myFunc aus ist wieder alles in Ordung. Könntet Ihr mir einen Tip geben was ich noch überprüfen könnte?</p>
<p>Mike</p>
]]></description><link>https://www.c-plusplus.net/forum/post/469757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/469757</guid><dc:creator><![CDATA[Mike Fudd]]></dc:creator><pubDate>Sat, 28 Feb 2004 18:12:53 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Sat, 28 Feb 2004 18:14:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Du hast recht. &quot;Rund um die Programmierung&quot; wäre vielleicht das bessere Forum.</p>
</blockquote>
<p>nö, aber ich schubse es mal ins richtige <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/469758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/469758</guid><dc:creator><![CDATA[CMatt]]></dc:creator><pubDate>Sat, 28 Feb 2004 18:14:47 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Sun, 29 Feb 2004 14:49:15 GMT]]></title><description><![CDATA[<p>^</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/905">@CMatt</a>: So richtig passt der Beitrag in keines der Foren. Es wird zwar der MS VC++ Compiler benutzt, er hat jedoch nichts mit C++ zu tun. Es ist nämlich eine reine C DLL.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/470125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/470125</guid><dc:creator><![CDATA[Mike Fudd]]></dc:creator><pubDate>Sun, 29 Feb 2004 14:49:15 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Sun, 29 Feb 2004 15:42:38 GMT]]></title><description><![CDATA[<p>Naja, ich würde sagen, es liegt eindeutig an myFunc <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Deswegen wäre es gut, wenn du uns die mal zeigen würdest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/470159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/470159</guid><dc:creator><![CDATA[dEUs]]></dc:creator><pubDate>Sun, 29 Feb 2004 15:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Thu, 04 Mar 2004 08:51:52 GMT]]></title><description><![CDATA[<p>Hallo dEUs,</p>
<p>myFunc steht in einer 2. dll. Sie liest einfach eine Datei von der Festplatte in ein static struct ein. Das struct besteht unter anderem aus mehreren dynamisch angeforderten Arrays. Danach sucht myFunc je nach den Übergabeparametern in diesen Arrays und wirft das Ergebnis zurück. Dieses Ergebnis ist dann sowas wie 4.487e-8<br />
Außerdem merkt sich myFunc das die Datei eingelesen wurde. Wenn ich jetzt myFunc ein zweites Mal aufrufe wird nur in den Arrays gesucht. Das Ergebnis das jetzt zurückgegeben wird, erscheint dann ohne Probleme in Excel.</p>
<p>Den Code kann ich schlecht zeigen. Er schon etwas umfangreicher, außerdem &quot;gehört&quot; er nicht mir. Da Ihr in der Sache nicht drin steht würdet Ihr Stunden brauchen um herauszufinden worum es geht.<br />
Meine Frage zielte mehr in die Richtung was ich prinzipiell noch überprüfen könnte. Die Rücksprungadressen werden nicht überschrieben. Es wird nicht über Arraygrenzen hinaus geschrieben... was könnte man noch machen?</p>
<p>Ich habe mal irgendwas gelesen das wenn man dynamischen Speicher zwischen dll's austauscht man eventuell Probleme kriegen könnte. ICh weiß aber nicht mehr worum es da geht.</p>
<p>Viele Grüße</p>
<p>Mike</p>
]]></description><link>https://www.c-plusplus.net/forum/post/472837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/472837</guid><dc:creator><![CDATA[Mike Fudd]]></dc:creator><pubDate>Thu, 04 Mar 2004 08:51:52 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Thu, 04 Mar 2004 12:00:48 GMT]]></title><description><![CDATA[<p>Mike Fudd schrieb:</p>
<blockquote>
<p>könnte. Die Rücksprungadressen werden nicht überschrieben. Es wird nicht über Arraygrenzen hinaus geschrieben... was könnte man noch machen?</p>
</blockquote>
<p>Du könntest beispielsweise einen Breakpoint in myFunc setzen und mal mit dem Debugger rüberschauen.</p>
<p>Mike Fudd schrieb:</p>
<blockquote>
<p>Ich habe mal irgendwas gelesen das wenn man dynamischen Speicher zwischen dll's austauscht man eventuell Probleme kriegen könnte. ICh weiß aber nicht mehr worum es da geht.</p>
</blockquote>
<p>Wenn Du den Speicher von unterschiedlichen Heaps allocierst, knallt es bei der Freigabe. Der Austausch des Speichers selbst ist kein Problem. Das betrifft Dich aber sowieso nicht, da Du lediglich einen double zurücklieferst.</p>
<p>BTW: Wie sieht denn das Merken des Arrays aus? Wird das auch irgendwo wieder feigegeben? Wenn ja, wo? Passiert das in DllMain? Wenn ja, hast Du die CRT statisch gelinkt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/472992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/472992</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Thu, 04 Mar 2004 12:00:48 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Fri, 05 Mar 2004 11:06:22 GMT]]></title><description><![CDATA[<p>Hallo King,</p>
<p>den Merker setze ich schon seit Tagen in die verschiedenen Funktionen und jage durchs Programm. Ich gehe von Schritt zu Schritt und sehe zu wie Daten in die Struktur gefüllt werden;-) Daran liegt es nicht.<br />
Die Struktur an sich wird überhaupt nicht mehr freigegeben. Es handelt sich um eine statische Variable in myFunc.</p>
<p>Code von dllMain wo myFunc drinsteht:</p>
<pre><code class="language-cpp">char *root=0;
HANDLE hDllHandle=0;
char *dllPath=0;

// Dll Einstiegspunkt.
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved) {
    switch (ul_reason_for_call)	{
		case DLL_PROCESS_ATTACH:
			break;
		case DLL_THREAD_ATTACH:
			break;
		case DLL_THREAD_DETACH:
			break;
		case DLL_PROCESS_DETACH:
			break;
    }

		hDllHandle = hModule;
		init();
    return TRUE;
}

// Die Pfadvariablen setzen
void init() {
	int i=0;
	char *tmp=0;

	// Den Pfad+Namen der dll abspeichern.
	tmp=(char *)malloc(4101);
	GetModuleFileName((HINSTANCE__ *)hDllHandle, tmp, 4100);
	i=strlen(tmp);
	dllPath=(char *)malloc(++i);
	memcpy(dllPath, tmp, i);
	free(tmp);

	// Den Pfad zum Verzeichnis eine Ebene Tiefer abspeichern.
	while (dllPath[--i]!='\\');
	while (dllPath[--i]!='\\') {
		if (i==0) {	// Falls &quot;C:\&quot;, wieder zum ersten \ gehen.
			while (dllPath[++i]!='\\');
			break;
		}
	}
	i=i+2;
	root=(char*)malloc(i);
	memcpy(root, dllPath, i);
	root[i-1]='\0';
}
</code></pre>
<p>Es werden nur Pfadvariablen gesetzt, mehr nicht.</p>
<p>Viele Grüße</p>
<p>Mike</p>
]]></description><link>https://www.c-plusplus.net/forum/post/473611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/473611</guid><dc:creator><![CDATA[Mike Fudd]]></dc:creator><pubDate>Fri, 05 Mar 2004 11:06:22 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Fri, 05 Mar 2004 11:16:16 GMT]]></title><description><![CDATA[<p>Wenn ich mal myFunc von dem unwichtigen Gerümpel befreie sieht sie so aus:</p>
<pre><code class="language-cpp">// Errechnung des Rückgabewertes. Bei Fehler INFINITY.
extern ABCDLL_API double myFunc(double a, double b) {
	static int alreadyLoaded=0;		// Marker ob File schon geladen.
	static struct myData *data=0;	// Die Struktur.
	int retval=SUCCESS;
	double c=0;

	// File nur einmal laden.
	if (alreadyLoaded==0) {
		retval+=nothingLoaded(&amp;data, &quot;File.txt&quot;); // Daten aus Datei laden
		if (retval==SUCCESS) alreadyLoaded=1; // Wenn kein Fehler!
	}

	// Ergebnis nur berechnen wenn Datei geladen.
	if ((data != NULL) &amp;&amp; (retval==SUCCESS)) {
		retval=errechne(data, b, a, &amp;c);
		if (retval==SUCCESS) {
			return c;
		} else {
			return log(0);
		}
	} else {
		return log(0);
	}
}
</code></pre>
<p>Kommentiere ich den Funktionsaufruf von &quot;nothingLoaded(&amp;data, &quot;File.txt&quot;);&quot; aus, passiert kein Fehler. Gleiches beim zweiten Aufruf, da die Datei schon geladen wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/473620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/473620</guid><dc:creator><![CDATA[Mike Fudd]]></dc:creator><pubDate>Fri, 05 Mar 2004 11:16:16 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Fri, 05 Mar 2004 11:38:40 GMT]]></title><description><![CDATA[<p>Mike Fudd schrieb:</p>
<blockquote>
<p>Es werden nur Pfadvariablen gesetzt, mehr nicht.</p>
</blockquote>
<p>Aber aus DllMain heraus. Das funktioniert nur dann sicher, wenn Du die CRT statisch linkst. Machst Du das?</p>
<p>BTW: Der erste Parameter von <a href="http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/dllmain.asp?frame=true" rel="nofollow">DllMain</a> ist nicht HANDLE, sondern HINSTANCE. Damit kannst Du dann Deiner globalen Variablen auch den richtigen Datentypen verpassen und kannst in der Init-Funktion auf diesen fürchterlichen cast verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/473633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/473633</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Fri, 05 Mar 2004 11:38:40 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Fri, 05 Mar 2004 11:46:11 GMT]]></title><description><![CDATA[<p>Mike Fudd schrieb:</p>
<blockquote>
<p>Kommentiere ich den Funktionsaufruf von &quot;nothingLoaded(&amp;data, &quot;File.txt&quot;);&quot; aus, passiert kein Fehler. Gleiches beim zweiten Aufruf, da die Datei schon geladen wurde.</p>
</blockquote>
<p>Das verstehe ich nun gar nicht. Du sagst doch in Deinem Kommentar, daß die Datei in 'nothingLoaded' geladen wird. Wie kann die Datei beim zweiten Aufruf geladen sein, wenn Du die Zeile auskomentierst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/473642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/473642</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Fri, 05 Mar 2004 11:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Fri, 05 Mar 2004 13:21:44 GMT]]></title><description><![CDATA[<p>Ich meinte wenn ich den Funktionsaufruf &quot;nothingLoaded(&amp;data, &quot;File.txt&quot;);&quot; ganz auskommentiere gibt es keinen Fehler mehr.</p>
<p>Lasse ich den Aufruf drinnen passiert beim ersten Durchgang folgendes wenn ich mit F10 Schritt für Schritt durchgehe:<br />
Im ersten IF Statement wird die Datei ohne irgendwelche Fehler in die Struktur data geladen.<br />
Im zweiten IF Statement wird ganz normal ein Wert wie 4,78944e-8 errechnet. Dieser Wert steht in c.<br />
Die Funktion wird via &quot;return c;&quot; verlassen. In c steht immer noch diese Zahl. Zurück in Excel erscheint dann die div/0 Fehlermeldung.</p>
<p>Rufe ich in Excel die Funktion erneut auf wird in das erste IF Statement gar nicht mehr gesprungen. Diesmal wird wieder 4,78944e-8 errechnet. Dieser Wert erscheint dann auch in Excel...<br />
Ersetze ich &quot;return c;&quot; durch &quot;return 3;&quot; passiert etwa das Gleiche: Beim ersten Aufruf erscheint die div/0 Meldung, obwohl ich nur 3 zurückgebe. Beim zweiten Aufruf erscheint dann die 3.</p>
<p>Was ist CRT? Die Bibliothek wird als Lib ins Projekt eingebunden. Während der Compilezeit. Also statisch.</p>
<blockquote>
<p>Der erste Parameter von DllMain ist nicht HANDLE, sondern HINSTANCE</p>
</blockquote>
<p>Aber das Visual Studio hat dllMain so erstellt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/473708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/473708</guid><dc:creator><![CDATA[Mike Fudd]]></dc:creator><pubDate>Fri, 05 Mar 2004 13:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe beim Debugging: Tip benötigt on Fri, 05 Mar 2004 14:08:23 GMT]]></title><description><![CDATA[<p>Mike Fudd schrieb:</p>
<blockquote>
<p>Was ist CRT? Die Bibliothek wird als Lib ins Projekt eingebunden. Während der Compilezeit. Also statisch.</p>
</blockquote>
<p>Das sind die C-Runtimes. Wenn Du da ohne Dll auskommst, ist's gut.</p>
<blockquote>
<p>Aber das Visual Studio hat dllMain so erstellt?</p>
</blockquote>
<p>Na und? Davon wird's nicht richtiger ...</p>
<p>Schau Dir den Link wenigstens an. Jedenfalls ist ein HANDLE in der Regel ein Kernel-Object, nicht aber ein Instanzen-Handle. HMODULE hätte ich mir auch noch gefallen lassen, HANDLE ist aber definitiv falsch.</p>
<p>Wenn ich Dich diesmal richtig verstanden habe, sitzt Dein Fehler entweder in 'nothingLoaded' oder in 'errechne' (auch letztere Funktion wird nicht mehr aufgerufen, wenn 'nothingLoaded' auskommentiert wird, da 'data' NULL bleibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/473771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/473771</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Fri, 05 Mar 2004 14:08:23 GMT</pubDate></item></channel></rss>