<?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[new reserviert nicht genug Speicher?]]></title><description><![CDATA[<p>Moin Leute,<br />
mir stellt sich folgendes Problem:</p>
<p>Was alles vorhanden ist:<br />
Ich habe versucht den Code auf das Wesentliche zu reduzieren.</p>
<pre><code>//==========================================================================
// teile.h: Polomorphie am Beispiel einer Teileverwaltung
//--------------------------------------------------------------------------

//==========================================================================
// Typdeklarationen
//==========================================================================
typedef FILE * fp_t; // Dateizeiger
typedef unsigned long int uli_t; // grosse Ganzzahl n &gt;= 0
typedef long int li_t; // grosse Ganzzahl n +/-

//==========================================================================
// globale Konstanten
//==========================================================================

  #define  BZL  20                // Laenge Textfeld bez fuer Teilebezeichnung

//==========================================================================
// teil: oberste abstrakte Basisklasse für alle abgeleiteten Klassen
//==========================================================================
class teil
  {
    friend class tverw; // Verwaltungsklasse 'tverw' hat vollen Zugriff

  protected:
    int wgrp;
    char bez[21];
    uli_t tnr;
    li_t best;
    float preis;
    int matr;

  public:
    //Konstruktor
    teil( fp_t );
  }; // class teil

teil::teil( fp_t fp )
  {
    for( int i = 0; i &lt; 2; ) // 2 Zeilen verwerfen
      {
        if( fgetc( fp ) == '\n' ) { i++; }
      } // for( int i = 0; i &lt; 2; )
    fscanf( fp, &quot;%d&quot;&quot;%d&quot;&quot;%f&quot;&quot;%d&quot;, &amp; tnr, &amp; best, &amp; preis, &amp; matr );
    cout &lt;&lt; tnr &lt;&lt; &quot;\t&quot; &lt;&lt; best &lt;&lt; &quot;\t&quot; &lt;&lt; preis &lt;&lt; &quot;\t&quot; &lt;&lt; matr; // funktioniert is hierher
  }

//==========================================================================
// mutter: von teil abgeleitete konkrete Klasse
//==========================================================================
class mutter : public teil
  {
  protected:
    int gewinde;
  public:
    //Konstruktor
    mutter( fp_t );
  }; // class mutter

mutter::mutter( fp_t fp ) : teil( fp )
  {
    fscanf( fp, &quot;%d&quot;, &amp; gewinde );
    wgrp = 1;
  }

//==========================================================================
// tverw: Anwendungsklasse fuer die Teile-Datenbank
//==========================================================================
class tverw
  {
  protected:
    uli_t tAnz; // Teileanzahl: Anzahl der verschiedenen Teile in der Datendatei
    teil * * tArr; // Zeiger: Zeiger auf dynamsiches Feld mit tAnz Elementen aus Basisklassenzeigern
    bool fileError; // Dateistatus: true: Dateiöffnen fehlgeschlagen, false: Datei erfolgreich geöffnet
    unsigned int tAnz_counter;
    int wgrp_tmp;
    char tmpchar[81];

  public:
    //Konstruktoren
    tverw( char * );

    //Elementfunktionen

    virtual getFileError( void )
      { return fileError; }

  }; // class tverw

//--------------------------------------------------------------------------
// Funktionsdefinitionen der Klasse tverw
//--------------------------------------------------------------------------
tverw::tverw( char * filename )
  {
    fp_t fp; // FILE * - Zeiger 'fp' erstellen
    if( !( fp = fopen( filename, &quot;r&quot; ) ) )
      { fileError = true; }
    else
      {
        char inBuf[81];
        fileError = false;
        for( int i = 0; i &lt; 3; ) // 3 Zeilen verwerfen
          {
            if( fgetc( fp ) == '\n' ) { i++; }
          } // for( int i = 0; i &lt; 3; )
        fscanf( fp, &quot;%d&quot;, &amp; tAnz );
        tArr = new teil * [tAnz];
        for( int i = 0; i &lt; 2; ) // 2 Zeilen verwerfen
          {
            if( fgetc( fp ) == '\n' ) { i++; }
          } // for( int i = 0; i &lt; 2; )

        for( tAnz_counter = 0; tAnz_counter &lt; 1; tAnz_counter++ ) // Teil für Teil einlesen... im Moment aber nur ein einziges
          {
            fscanf( fp, &quot;%d&quot;, &amp; wgrp_tmp );
            for( int i = 0; i &lt; 1; ) // 1 Zeile verwerfen
              {
                if( fgetc( fp ) == '\n' ) { i++; }
              } // for( int i = 0; i &lt; 1; )
            tArr[tAnz_counter] = new mutter( fp );
          } // for()
//Dieser cout- Befehl verursacht beim Compilieren das Problem:
        cout &lt;&lt; tArr[tAnz_counter]-&gt;wgrp &lt;&lt; tArr[tAnz_counter]-&gt;tnr &lt;&lt; &quot; | &quot; &lt;&lt; tArr[tAnz_counter]-&gt;best &lt;&lt; &quot; | &quot; &lt;&lt; tArr[tAnz_counter]-&gt;preis &lt;&lt; &quot; | &quot; &lt;&lt; tArr[tAnz_counter]-&gt;matr &lt;&lt; &quot; | &quot; &lt;&lt; tArr[tAnz_counter]-&gt;gewinde &lt;&lt; endl;

      }
  }
</code></pre>
<p>Wenn ich nun den ganzen Kram ohne den letzten cout- Befehl (auskommentieren) compiliere, gibt es offenbar keinerlei Probleme. Mit diesem cout- Befehl meckert der Compiler &quot;&quot;teile.h&quot;: E2316 'gewinde' ist kein Element von 'teil' in Funktion tverw::tverw(char <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="😉"
    /> in Zeile 285&quot;. Also habe ich mir mal das tArr[0] per Debug angeschaut und festgestellt, dass meines Erachtens das &quot;tArr = new teil * [tAnz];&quot; (Zeile 107) keinen Speicher für das &quot;int gewinde&quot; reserviert. Warum nicht? Ich bin der Meinung, die Konstruktoren korrekt aufgerufen zu haben...<br />
Ein &quot;Ding&quot; sehe ich noch: Warum muss ich bei dem o.g. cout- Befehl immer noch das &quot;tArr[tAnz_counter]-&gt;&quot; voranstellen? Die Klasse tverw (Teileverwaltung) ist doch &quot;friend&quot; von &quot;teil&quot; und sollte doch somit vollen Zugriff auf die einzelnen Elemente haben, oder?</p>
<p>Danke schon mal für eure Hilfe!</p>
<p>Gruß<br />
Christian</p>
<p>P.S.: Es gehört nicht hierher aber wenn gerade jemand, der sich damit auskent &quot;zuschaut&quot;: für den Fall, dass ich aus dem &quot;float preis&quot; ein &quot;double preis&quot; mache, was für einen Platzhalter muss ich mit fscanf benutzen? Tausend Dank an alle Helfenden!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170710/new-reserviert-nicht-genug-speicher</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 04:41:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170710.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Jan 2007 20:03:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new reserviert nicht genug Speicher? on Thu, 18 Jan 2007 21:41:57 GMT]]></title><description><![CDATA[<p>Moin Leute,<br />
mir stellt sich folgendes Problem:</p>
<p>Was alles vorhanden ist:<br />
Ich habe versucht den Code auf das Wesentliche zu reduzieren.</p>
<pre><code>//==========================================================================
// teile.h: Polomorphie am Beispiel einer Teileverwaltung
//--------------------------------------------------------------------------

//==========================================================================
// Typdeklarationen
//==========================================================================
typedef FILE * fp_t; // Dateizeiger
typedef unsigned long int uli_t; // grosse Ganzzahl n &gt;= 0
typedef long int li_t; // grosse Ganzzahl n +/-

//==========================================================================
// globale Konstanten
//==========================================================================

  #define  BZL  20                // Laenge Textfeld bez fuer Teilebezeichnung

//==========================================================================
// teil: oberste abstrakte Basisklasse für alle abgeleiteten Klassen
//==========================================================================
class teil
  {
    friend class tverw; // Verwaltungsklasse 'tverw' hat vollen Zugriff

  protected:
    int wgrp;
    char bez[21];
    uli_t tnr;
    li_t best;
    float preis;
    int matr;

  public:
    //Konstruktor
    teil( fp_t );
  }; // class teil

teil::teil( fp_t fp )
  {
    for( int i = 0; i &lt; 2; ) // 2 Zeilen verwerfen
      {
        if( fgetc( fp ) == '\n' ) { i++; }
      } // for( int i = 0; i &lt; 2; )
    fscanf( fp, &quot;%d&quot;&quot;%d&quot;&quot;%f&quot;&quot;%d&quot;, &amp; tnr, &amp; best, &amp; preis, &amp; matr );
    cout &lt;&lt; tnr &lt;&lt; &quot;\t&quot; &lt;&lt; best &lt;&lt; &quot;\t&quot; &lt;&lt; preis &lt;&lt; &quot;\t&quot; &lt;&lt; matr; // funktioniert is hierher
  }

//==========================================================================
// mutter: von teil abgeleitete konkrete Klasse
//==========================================================================
class mutter : public teil
  {
  protected:
    int gewinde;
  public:
    //Konstruktor
    mutter( fp_t );
  }; // class mutter

mutter::mutter( fp_t fp ) : teil( fp )
  {
    fscanf( fp, &quot;%d&quot;, &amp; gewinde );
    wgrp = 1;
  }

//==========================================================================
// tverw: Anwendungsklasse fuer die Teile-Datenbank
//==========================================================================
class tverw
  {
  protected:
    uli_t tAnz; // Teileanzahl: Anzahl der verschiedenen Teile in der Datendatei
    teil * * tArr; // Zeiger: Zeiger auf dynamsiches Feld mit tAnz Elementen aus Basisklassenzeigern
    bool fileError; // Dateistatus: true: Dateiöffnen fehlgeschlagen, false: Datei erfolgreich geöffnet
    unsigned int tAnz_counter;
    int wgrp_tmp;
    char tmpchar[81];

  public:
    //Konstruktoren
    tverw( char * );

    //Elementfunktionen

    virtual getFileError( void )
      { return fileError; }

  }; // class tverw

//--------------------------------------------------------------------------
// Funktionsdefinitionen der Klasse tverw
//--------------------------------------------------------------------------
tverw::tverw( char * filename )
  {
    fp_t fp; // FILE * - Zeiger 'fp' erstellen
    if( !( fp = fopen( filename, &quot;r&quot; ) ) )
      { fileError = true; }
    else
      {
        char inBuf[81];
        fileError = false;
        for( int i = 0; i &lt; 3; ) // 3 Zeilen verwerfen
          {
            if( fgetc( fp ) == '\n' ) { i++; }
          } // for( int i = 0; i &lt; 3; )
        fscanf( fp, &quot;%d&quot;, &amp; tAnz );
        tArr = new teil * [tAnz];
        for( int i = 0; i &lt; 2; ) // 2 Zeilen verwerfen
          {
            if( fgetc( fp ) == '\n' ) { i++; }
          } // for( int i = 0; i &lt; 2; )

        for( tAnz_counter = 0; tAnz_counter &lt; 1; tAnz_counter++ ) // Teil für Teil einlesen... im Moment aber nur ein einziges
          {
            fscanf( fp, &quot;%d&quot;, &amp; wgrp_tmp );
            for( int i = 0; i &lt; 1; ) // 1 Zeile verwerfen
              {
                if( fgetc( fp ) == '\n' ) { i++; }
              } // for( int i = 0; i &lt; 1; )
            tArr[tAnz_counter] = new mutter( fp );
          } // for()
//Dieser cout- Befehl verursacht beim Compilieren das Problem:
        cout &lt;&lt; tArr[tAnz_counter]-&gt;wgrp &lt;&lt; tArr[tAnz_counter]-&gt;tnr &lt;&lt; &quot; | &quot; &lt;&lt; tArr[tAnz_counter]-&gt;best &lt;&lt; &quot; | &quot; &lt;&lt; tArr[tAnz_counter]-&gt;preis &lt;&lt; &quot; | &quot; &lt;&lt; tArr[tAnz_counter]-&gt;matr &lt;&lt; &quot; | &quot; &lt;&lt; tArr[tAnz_counter]-&gt;gewinde &lt;&lt; endl;

      }
  }
</code></pre>
<p>Wenn ich nun den ganzen Kram ohne den letzten cout- Befehl (auskommentieren) compiliere, gibt es offenbar keinerlei Probleme. Mit diesem cout- Befehl meckert der Compiler &quot;&quot;teile.h&quot;: E2316 'gewinde' ist kein Element von 'teil' in Funktion tverw::tverw(char <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="😉"
    /> in Zeile 285&quot;. Also habe ich mir mal das tArr[0] per Debug angeschaut und festgestellt, dass meines Erachtens das &quot;tArr = new teil * [tAnz];&quot; (Zeile 107) keinen Speicher für das &quot;int gewinde&quot; reserviert. Warum nicht? Ich bin der Meinung, die Konstruktoren korrekt aufgerufen zu haben...<br />
Ein &quot;Ding&quot; sehe ich noch: Warum muss ich bei dem o.g. cout- Befehl immer noch das &quot;tArr[tAnz_counter]-&gt;&quot; voranstellen? Die Klasse tverw (Teileverwaltung) ist doch &quot;friend&quot; von &quot;teil&quot; und sollte doch somit vollen Zugriff auf die einzelnen Elemente haben, oder?</p>
<p>Danke schon mal für eure Hilfe!</p>
<p>Gruß<br />
Christian</p>
<p>P.S.: Es gehört nicht hierher aber wenn gerade jemand, der sich damit auskent &quot;zuschaut&quot;: für den Fall, dass ich aus dem &quot;float preis&quot; ein &quot;double preis&quot; mache, was für einen Platzhalter muss ich mit fscanf benutzen? Tausend Dank an alle Helfenden!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212278</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Thu, 18 Jan 2007 21:41:57 GMT</pubDate></item><item><title><![CDATA[Reply to new reserviert nicht genug Speicher? on Thu, 18 Jan 2007 22:16:40 GMT]]></title><description><![CDATA[<p>Nachdem die for Schleife durchgelaufen ist steht tAnz_counter in diesem Fall auf 1, gültig ist aber nur Index 0.<br />
-&gt; boom</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212344</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 18 Jan 2007 22:16:40 GMT</pubDate></item><item><title><![CDATA[Reply to new reserviert nicht genug Speicher? on Fri, 19 Jan 2007 09:52:56 GMT]]></title><description><![CDATA[<p>Das ist korrekt, aber wie sieht es mit den Antworten zu meinen anderen Fragen aus? Hat jemand eine Idee?</p>
<p>Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212498</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Fri, 19 Jan 2007 09:52:56 GMT</pubDate></item><item><title><![CDATA[Reply to new reserviert nicht genug Speicher? on Fri, 19 Jan 2007 10:12:29 GMT]]></title><description><![CDATA[<p>Öh, so wie ich das sehe, ist 'gewinde' in 'mutter' deklariert, nicht in 'teil'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212517</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 19 Jan 2007 10:12:29 GMT</pubDate></item><item><title><![CDATA[Reply to new reserviert nicht genug Speicher? on Fri, 19 Jan 2007 10:13:47 GMT]]></title><description><![CDATA[<p>ChrisPHL schrieb:</p>
<blockquote>
<p>Ein &quot;Ding&quot; sehe ich noch: Warum muss ich bei dem o.g. cout- Befehl immer noch das &quot;tArr[tAnz_counter]-&gt;&quot; voranstellen? Die Klasse tverw (Teileverwaltung) ist doch &quot;friend&quot; von &quot;teil&quot; und sollte doch somit vollen Zugriff auf die einzelnen Elemente haben, oder?</p>
</blockquote>
<p>'friend' bedeutet nur, daß du die geschützten Elemente (private und protected) der entsprechenden Klasse lesen kannst. Um zuzugreifen, muß der Compiler trotzdem wissen, mit welchem Objekt du arbeiten willst (der Compiler kann schließlich nicht wissen, ob du tArr[0], tArr[500] oder ein lokal angelegte teil ausgeben willst.</p>
<blockquote>
<p>P.S.: Es gehört nicht hierher aber wenn gerade jemand, der sich damit auskent &quot;zuschaut&quot;: für den Fall, dass ich aus dem &quot;float preis&quot; ein &quot;double preis&quot; mache, was für einen Platzhalter muss ich mit fscanf benutzen? Tausend Dank an alle Helfenden!</p>
</blockquote>
<p>Wenn du unbedingt fscanf() verwenden willst &quot;%lf&quot;. Aber in C++ gibt es einen wesentlich sichereren Ansatz zur Ein/Ausgabe - IOStreams.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212518</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 19 Jan 2007 10:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to new reserviert nicht genug Speicher? on Fri, 19 Jan 2007 11:10:02 GMT]]></title><description><![CDATA[<p>Joe_M. schrieb:</p>
<blockquote>
<p>Öh, so wie ich das sehe, ist 'gewinde' in 'mutter' deklariert, nicht in 'teil'.</p>
</blockquote>
<p>aber ich reserviere doch mit</p>
<pre><code>tArr[tAnz_counter] = new mutter(fp)
</code></pre>
<p>Speicher für das gesamte Konstrukt einer Mutter (beinhaltet 'gewinde' und alles, was ein 'teil' hat - klärt mich auf, wenn das nicht so ist) wobei die Konstruktoren doch hübsch in umgekehrter Reihenfolge aufgerufen werden und tArr[tAnz_counter]-&gt;gewinde laut der einzulesenden Datei den Wert &quot;4&quot; haben sollte, oder nicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code>mutter::mutter(fp_t fp) : teil(fp) { // Gewinde und wgrp Werte zuweisen }
</code></pre>
<p>Ich schreibe mit dem mutter::mutter- Konstruktor den Wert &quot;4&quot; in tArr[tAnz_counter]-&gt;gewinde und tArr[] kann die Klasse 'tverw' doch lesen... So ist meine 'Denke' an der Stelle.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>:</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>'friend' bedeutet nur, daß du die geschützten Elemente (private und protected) der entsprechenden Klasse lesen kannst. Um zuzugreifen, muß der Compiler trotzdem wissen, mit welchem Objekt du arbeiten willst (der Compiler kann schließlich nicht wissen, ob du tArr[0], tArr[500] oder ein lokal angelegte teil ausgeben willst.</p>
</blockquote>
<p>Das will mir einleuchten. Manchmal sieht man den Wald vor lauter Bäumen nicht...</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Wenn du unbedingt fscanf() verwenden willst &quot;%lf&quot;. Aber in C++ gibt es einen wesentlich sichereren Ansatz zur Ein/Ausgabe - IOStreams.</p>
</blockquote>
<p>Um das als Fehlerquelle auszuschließen, habe ich den kompletten iostram-Kram testweise auf &quot;FILE*...&quot; umgestellt...</p>
<p>Danke für Deine Hilfe!</p>
<p>Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212564</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Fri, 19 Jan 2007 11:10:02 GMT</pubDate></item><item><title><![CDATA[Reply to new reserviert nicht genug Speicher? on Fri, 19 Jan 2007 11:24:56 GMT]]></title><description><![CDATA[<p>Die friend-Beziehung wird aber nicht vererbt. Dadurch, daß 'teil' friend-Zugriff bereitstellt, kannst du die in dieser Klasse angelegten Member problemlos lesen (und schreiben). Aber 'mutter' hat der Klasse tverw <strong>keinen</strong> friend-Zugriff gegeben, also kannst du deren Member nicht von außen sehen.</p>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox250776" checked="true" /><label for="checkbox250776">in einen mutter* casten, damit du die neuen Member erreichen kannst - die Klasse teil hat schließlich kein Element namens gewinde)</label></div></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212573</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 19 Jan 2007 11:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to new reserviert nicht genug Speicher? on Fri, 19 Jan 2007 12:55:04 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a> &amp; Co.<br />
Ihr könnt den Thread löschen, die Frage führt eher zu Verwirrung für diejenigen, die genau so wenig vom Stoff verstehen wie ich.</p>
<p>Danke<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212624</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Fri, 19 Jan 2007 12:55:04 GMT</pubDate></item></channel></rss>