<?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[Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib]]></title><description><![CDATA[<p>Moin, moin,</p>
<p>habe hier einen Screensaver der korrekt startet und durchläuft, wenn ich diesen via Kommandozeile starte:</p>
<pre><code>screensafer.scr /s
</code></pre>
<p>oder</p>
<pre><code>screensafer.scr /c
</code></pre>
<p>Allerdings, und jetzt kommt es, in der Vorschau und wenn Windows den Screensafer starten möchte <strong>*patsch*</strong> &quot;screensafer.scr hat ein Problem festgestellt und ...&quot;</p>
<p>Ich konnte den Fehler auf folgende Codezeile eingrenzen:</p>
<pre><code class="language-cpp">st-&gt;lenses = (Lens *)calloc(st-&gt;lensnum, sizeof(Lens));
</code></pre>
<p>Ich schlage mich jetzt schon ein bis zwei Wochen (allerdings hobbymäßig) mit diesem Problem rum und versteh nicht wieso es läuft, wenn ich es von der Konsole starte und nicht in der Miniaturvorschau der Bildschirmschoner-Eigenschaften?</p>
<p>Anbei noch das typedef für Lens:</p>
<pre><code class="language-cpp">typedef struct Lens {
double  r,    // Rotation
        s,    // Scale
        tx,   // Translation
        ty;   // Translation

double  ro,    // Rotation zuvor
        rt,    // Rotationsziel
        rc;    // Rotationszähler

double  so,    // Skalierung zuvor
        st,    // Skalierungsziel
        sc;    // Skalierungszähler

double  sa,    // Skalierung  Wichtung
        txa,    // Translation Wichtung
        tya;    // Translation Wichtung

int     ua,    // berechnete r,s,t
        ub,
        utx;

int     uc,    // berechnete r,s,t
        ud,
        uty;
} Lens;
</code></pre>
<p>Und in der Structur &quot;st&quot; (die, um hier komplett zu posten, viel zu lang ist) sind die benutzten Elemente wie folgt definiert:</p>
<pre><code class="language-cpp">int      lensnum;    // Anzahl der Linsen
Lens    *lenses;     // Zeiger auf Linsen
</code></pre>
<p>Grübel, grübel ...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/166399/merkwürdiges-verhalten-von-calloc-in-verbindung-mit-scrnsaver-lib</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 01:49:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166399.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Nov 2006 19:59:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib on Tue, 28 Nov 2006 19:59:52 GMT]]></title><description><![CDATA[<p>Moin, moin,</p>
<p>habe hier einen Screensaver der korrekt startet und durchläuft, wenn ich diesen via Kommandozeile starte:</p>
<pre><code>screensafer.scr /s
</code></pre>
<p>oder</p>
<pre><code>screensafer.scr /c
</code></pre>
<p>Allerdings, und jetzt kommt es, in der Vorschau und wenn Windows den Screensafer starten möchte <strong>*patsch*</strong> &quot;screensafer.scr hat ein Problem festgestellt und ...&quot;</p>
<p>Ich konnte den Fehler auf folgende Codezeile eingrenzen:</p>
<pre><code class="language-cpp">st-&gt;lenses = (Lens *)calloc(st-&gt;lensnum, sizeof(Lens));
</code></pre>
<p>Ich schlage mich jetzt schon ein bis zwei Wochen (allerdings hobbymäßig) mit diesem Problem rum und versteh nicht wieso es läuft, wenn ich es von der Konsole starte und nicht in der Miniaturvorschau der Bildschirmschoner-Eigenschaften?</p>
<p>Anbei noch das typedef für Lens:</p>
<pre><code class="language-cpp">typedef struct Lens {
double  r,    // Rotation
        s,    // Scale
        tx,   // Translation
        ty;   // Translation

double  ro,    // Rotation zuvor
        rt,    // Rotationsziel
        rc;    // Rotationszähler

double  so,    // Skalierung zuvor
        st,    // Skalierungsziel
        sc;    // Skalierungszähler

double  sa,    // Skalierung  Wichtung
        txa,    // Translation Wichtung
        tya;    // Translation Wichtung

int     ua,    // berechnete r,s,t
        ub,
        utx;

int     uc,    // berechnete r,s,t
        ud,
        uty;
} Lens;
</code></pre>
<p>Und in der Structur &quot;st&quot; (die, um hier komplett zu posten, viel zu lang ist) sind die benutzten Elemente wie folgt definiert:</p>
<pre><code class="language-cpp">int      lensnum;    // Anzahl der Linsen
Lens    *lenses;     // Zeiger auf Linsen
</code></pre>
<p>Grübel, grübel ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183367</guid><dc:creator><![CDATA[timmix]]></dc:creator><pubDate>Tue, 28 Nov 2006 19:59:52 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib on Tue, 28 Nov 2006 20:14:59 GMT]]></title><description><![CDATA[<p>der fehler liegt an einer anderen stelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183377</guid><dc:creator><![CDATA[callo]]></dc:creator><pubDate>Tue, 28 Nov 2006 20:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib on Tue, 28 Nov 2006 20:42:45 GMT]]></title><description><![CDATA[<p>Ist 'lenses' korrekt initialisiert (lies: Zeigt diese Variable auf einen gültigen Speicherbereich ?) ? Du musst ggf. mit new/malloc allokieren, oder gleich auf die Zeigerarithmetik verzichten (auf jeden Fall sinnvoller, verstehe sowieso nicht warum das immer so viele machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183392</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Tue, 28 Nov 2006 20:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib on Tue, 28 Nov 2006 21:39:44 GMT]]></title><description><![CDATA[<p>CodeFinder schrieb:</p>
<blockquote>
<p>Ist 'lenses' korrekt initialisiert (lies: Zeigt diese Variable auf einen gültigen Speicherbereich ?) ? Du musst ggf. mit new/malloc allokieren, oder gleich auf die Zeigerarithmetik verzichten (auf jeden Fall sinnvoller, verstehe sowieso nicht warum das immer so viele machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ).</p>
</blockquote>
<p>Ähem, wie jetzt! Allokiere ich mit calloc nicht einen Speicherbereich und initialisieren den Zeiger <strong>st-&gt;lenses</strong> mit der Startadresse des Speicherbereichs?</p>
<p>Ein Umschreiben der betroffenen Codeabschnitte kommt zur Zeit nicht in Frage, ich bin blutiger Anfänger und würde Wochen dafür brauchen. <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>
<p>@callo:<br />
Ein Systembeep vor dem genannten Ausschnitt wird ausgeführt, ein Systembeep in der Zeile danach nicht. Der Fehler muss meinem Verständnis nach mit dieser Codezeile zusammenhängen. Lasse mich aber gern eines besseren belehren.</p>
<p>Edit: Typos</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183429</guid><dc:creator><![CDATA[timmix]]></dc:creator><pubDate>Tue, 28 Nov 2006 21:39:44 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib on Tue, 28 Nov 2006 21:41:14 GMT]]></title><description><![CDATA[<p>Debugger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183433</guid><dc:creator><![CDATA[TGGC|_work_]]></dc:creator><pubDate>Tue, 28 Nov 2006 21:41:14 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib on Tue, 28 Nov 2006 22:30:38 GMT]]></title><description><![CDATA[<p>Ne ich mein das anders:</p>
<p>Wenn <strong>st</strong> eine Zeigervariable ist, dann muss die vorher auch initialisiert sein, damit du auf das Element <strong>lenses</strong> von <strong>st</strong> zugreifen kannst. Anderfalls erzeugst Du hier schon die Speicherzugriffsverletzung.</p>
<p><strong>st</strong> muss also auf einen gültigen Speicherbereich zeigen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> .<br />
Zeig mir mal die Definition bzw. vorherige Benutzung (-&gt;Initialisierung) - falls vorhanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> - von <strong>st</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183452</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Tue, 28 Nov 2006 22:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib on Wed, 29 Nov 2006 08:59:29 GMT]]></title><description><![CDATA[<p>CodeFinder schrieb:</p>
<blockquote>
<p>Zeig mir mal die Definition bzw. vorherige Benutzung (-&gt;Initialisierung) - falls vorhanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> - von <strong>st</strong>.</p>
</blockquote>
<p>Anmerkung: gebe ich <strong>st-&gt;lenses</strong> und <strong>sizof(st-&gt;Lens)</strong> aus erhalte ich die Werte 3 und 128 was korrekt ist).<br />
Here we go, die komplette Funktion die mir die Struktur erstellt.</p>
<pre><code class="language-cpp">/////////////////////////////////////
// Initialisiere IFS-Struktur
static state * ifs_init (void) {
    struct state *st = (struct state *) calloc (1, sizeof(*st));

    ifs_reshape(st, myScreenSize.right, myScreenSize.bottom);

    if (NCLR % 2 == 0)			// Anzahl der Farben muss ungerade sein!
        st-&gt;ncolours = NCLR + 1;
    else
        st-&gt;ncolours = NCLR;	// TODO: lese/schreibe Einstellungen

    st-&gt;length		= 10;		// TODO: lese/schreibe Einstellungen
    st-&gt;rotate		= true;		// TODO: lese/schreibe Einstellungen
    st-&gt;scale		= true;		// TODO: lese/schreibe Einstellungen
    st-&gt;translate	= true;		// TODO: lese/schreibe Einstellungen
    st-&gt;recurse		= true;		// TODO: lese/schreibe Einstellungen
    st-&gt;lensnum		= 3;		// TODO: lese/schreibe Einstellungen
    st-&gt;colorfreq	= CLRFREQUENCY;	// TODO: lese/schreibe Einstellungen

    // Größe einer Bildschirmzeile in Bytes
    st-&gt;scanline	= (bmih.biWidth * (bmih.biBitCount / 8)) &gt;&gt; 2;

    // Standardfarben
    st-&gt;hbrBlack	= (HBRUSH)GetStockObject(BLACK_BRUSH);
    st-&gt;hbrWhite	= (HBRUSH)GetStockObject(WHITE_BRUSH);

    // Erstelle Polarkoordinaten als Cashe (array) zum Zeichnen radialer Farbverläufe (0,0 ist die Mitte des Bildschirms)
    if (st-&gt;xpolar) free(st-&gt;xpolar);
    st-&gt;xpolar	= (int *)calloc(myScreenSize.right, sizeof(int));
    for (int i = 0; i &lt;= myScreenSize.right;i++){
        st-&gt;xpolar[i] = -(myScreenSize.right/2) + i;
    }
    if (st-&gt;ypolar) free(st-&gt;ypolar);
    st-&gt;ypolar	= (int *)calloc(myScreenSize.bottom, sizeof(int));
    for (int i = 0; i &lt;= myScreenSize.bottom;i++){
        st-&gt;ypolar[i] = -(myScreenSize.bottom/2) + i;
    }

    // Hole Speicher für Farbtabelle (Hinweis: BBGGRR00 ist ein typedef vom Typ COLORREF wird nur rückwärts verwendet)
    if (st-&gt;colours) free(st-&gt;colours);
    st-&gt;colours = (BBGGRR00 *)calloc(st-&gt;ncolours, sizeof(BBGGRR00));
    if (!st-&gt;colours) exit(1);

    if (st-&gt;lenses) free (st-&gt;lenses);
    // CRASH //////////////////////////////////////////////
    st-&gt;lenses = (Lens *)calloc(st-&gt;lensnum, sizeof(Lens));
    ///////////////////////////////////////////////////////
    if (!st-&gt;lenses) exit(1);

    for (int i = 0; i &lt; st-&gt;lensnum; i++) {
        CreateLens(st, (myrandom(1.0) - 0.5), myrandom(1.0), myrandom(4.0) - 2.0, myrandom(4.0) + 2.0, &amp;st-&gt;lenses[i]);
    }
return st;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1183604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183604</guid><dc:creator><![CDATA[timmix]]></dc:creator><pubDate>Wed, 29 Nov 2006 08:59:29 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiges Verhalten von calloc in Verbindung mit scrnsaver.lib on Wed, 29 Nov 2006 10:07:09 GMT]]></title><description><![CDATA[<p>Erstmal ist die st doch frisch erzeugt. Da dürften die Abfragen <code>if(st-&gt;...) free(st-&gt;...);</code> unnötig sein. (btw, was genau macht ifs_reshape() mit dem Parameter?)</p>
<p>Danach solltest du dir mal den Debugger vornehmen und das Programm Schritt für Schritt durchlaufen lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183662</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 29 Nov 2006 10:07:09 GMT</pubDate></item></channel></rss>