Announcement

Collapse
No announcement yet.

Anfänger, Variable zuweisen..

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anfänger, Variable zuweisen..

    Hallo,

    ich habe folgendes geschrieben.. tut soweit auch, bis auf die Tatsache, daß nach "delete BufServername" auch der Inhalt der zuvor zugewiesenen Variablen "szServerName" weg ist.. ??

    char *szServerName;
    char *szDbFile;
    char szDbFilePath[MAXPATH+1];

    int Size1 = Edit_Source_Servername->GetTextLen();
    Size1++;

    char *BufServername = new char[Size1];
    Edit_Source_Servername->GetTextBuf(BufServername,Size1);
    szServerName = BufServername;
    delete BufServername;

    Gruß
    Steffen

  • #2
    Hallo Steffen,

    du hast der Zeigervariablen szServerName nur die Adresse der Variablen BufServername zugewiesen, die natürlich nach dem delete ihre gültigkeit verliert.
    Damit das ganze auch richtig funktioniert, hast du zwei Möglichkeiten.
    1. für szServerName dynamisch Speicher anfordern (new char[Size1]) und den Inhalt von BufServername mit strcpy nach szServerName zu kopieren. Oder
    2. für szServerName dynamisch Speicher anfordern (new char[Size1]) und szServerName in deinem GetTextBuf-Aufruf zu verwenden. Damit kannst du dir auch die Variable BufServerName sparen.

    Gruß

    Heik

    Comment


    • #3
      Hallo,

      und danke für die schnelle Antwort. Leider klappts nich so ganz..
      Habs mit beiden Möglichkeiten versucht, einmal im GetTextBuf gleich in szServername zuweisen, und dann mit strcpy ( szServername,BufServername ); - beides endet in einer "Schmutz-verletzung".. ? Was mach ich falsch ??

      Gruß
      Steffen.

      Comment


      • #4
        Vielleicht leichter:

        Warum benutzt du nicht die Klasse String???

        String test="Hallo Welt";

        Wird dann irgendwo in einer WIN 32 API Funktion der Typ *char benötigt, dann steht mit

        test.c_str();

        eine Funktion zur Umwandlung bereit (die gibt das ganze als Zeiger zurück
        Christian

        Comment


        • #5
          Hallo,

          das Beispiel von mir sollte eigentlich funktionieren. Wenn du die Variablen noch in anderen Funktionen verwenden willst, solltest du sie natürlich in der Klasse definieren.
          Ich nehme an, du hast den Code aus dem Beispiel für GetTextLen/GetTextBuf aus der Online Hilfe verwendet. Dabei ist auch erwähnt, dass man besser mit der Eigenschaft Text arbeiten soll.

          Verwende einfach die Eigenschft Text des Editcontrols und weise deren Inhalt, Variablen vom Typ AnsiString zu, dann brachst du dir um die Länge der Strings keine Gedanken zu machen und erhälst auch keine Schutzverletzungen.

          Gruß Heik

          Comment


          • #6
            Hallo,

            ich hab keine andere Wahl - ich hab eine function, bei welcher ich
            den Servernamen und Datenbanknamen in Form von Char *szServerName brauche. Natürlich arbeite ich gerner mit ->Text Eingenschaft, ich komme ja auch von Delphi her, so richtig mit Objecten..
            Wie also wandle ich dann einen AnsiString in einen *char um ?? Dann
            könnte es auch funktionieren..

            Gruß Steffe

            Comment


            • #7
              Hallo,

              (MyEdit->Text).c_str()

              Der Aufruf dieser Methode gibt dir einen char* zurück, den du dann deinen Funktionen übergeben kannst.

              Gruß Heik

              Comment


              • #8
                Ja - hallo,

                ich bins nochmal.. hab jetzt folgendes gemacht..

                char *szServerName;
                char *szDbFile;

                szServerName = (Edit_Source_Servername->Text).c_str();
                szDbFile = (Edit_Source_Databasename->Text).c_str();

                Folgendes passiert. Beim Debuggen ist der Inhalt von szServername = "NS1_PWB/POWERBIT" - richtig ! Wird Zeile szDbFile ausgeführt,
                ist der Inhalt von szDbFile = "mail\srieger.nsf".. richtig. Nur jetzt ist szServername auch gleich mail\srieger.nsf" ?? szServername wird also irgendwie beim zuweisen von szDbFile überschrieben..

                C++ Builder 5 Std. SP1

                Gruß Steffe

                Comment


                • #9
                  Text.c_str())
                  Christian

                  Comment


                  • #10
                    szServerName =Edit_Source_Servername->Text.c_str();

                    szDbFile=Edit_Source_Databasename->Text.c_str();
                    Christian

                    Comment


                    • #11
                      duat net !! Wenns so einfach wäre .. genau so hab ichs gemacht..
                      aber wie gesagt, beim Zuweisen von der zweiten Variabeln, wird die erste mit dem Wert der zweiten Zuweisung überschrieben.. ??

                      Gruß
                      Steffe

                      Comment


                      • #12
                        Hi,

                        probiers mal hiermit.

                        <pre>

                        //-------------------------------------------------------------------
                        void __fastcall TForm1::Button1Click(TObject *Sender)
                        {
                        char *str1;
                        char *str2;
                        AnsiString astr1;
                        AnsiString astr2;

                        astr1 = Edit1->Text.c_str();
                        astr1.Unique();
                        astr2 = Edit2->Text.c_str();
                        astr2.Unique();
                        str1 = astr1.c_str();
                        str2 = astr2.c_str();
                        }
                        //-------------------------------------------------------------------

                        </pre>

                        Gruss Heik

                        Comment


                        • #13
                          Hallo,

                          SUPER !! Danke Heiko.. tut optimal..
                          aber an was lags jetzt ?? Ist das immer so ?
                          Muß ich immer erst einen AnsiString definieren, und dann in *str1 umwandeln ? Das kann doch sein, oder ? Naja - Hauptsache es funkt.

                          Gruß
                          Steffe

                          Comment


                          • #14
                            Das würde mich auch interessieren. Normalerweise sollte doch

                            str2 = Edit2->Text.c_str();

                            reichen. Hatte damit noch keine Problem
                            Christian

                            Comment


                            • #15
                              Das ist doch ganz einfach:

                              char *szServerName;
                              char *szDbFile;
                              char szDbFilePath[MAXPATH+1];

                              int Size1 = Edit_Source_Servername->GetTextLen();
                              Size1++;

                              char *BufServername = new char[Size1];
                              Edit_Source_Servername->GetTextBuf(BufServername,Size1);
                              szServerName = BufServername;
                              delete BufServername;

                              szServername ist als char * definiert, genauso wie BufServername.
                              mit der Zuweisung von szServerName = BufServername; wird dem char * von szServerName die Adresse von dem new char-Array, auf das BufServername zeigt zugewiesen. Wenn du diesen bereich mit delete wieder frei gibst, ist auch für szServerName dieser bereich nicht mehr erreichbar. Bei Windows liegt dieser dann ausserhalb des definierten Bereiches ( da wieder freigegeben).

                              Gruss Fran

                              Comment

                              Working...
                              X