Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Speicher für string-Array erst in Funktion zuweisen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.12.2007, 16:28 Uhr
Dr.Strangelove



Hallo

ich möchte Speicher für ein Array aus STL-Strings, das in main() verfügbar sein soll, erst in einer Funktion reservieren, da diese Funktion Werte aus einer Datei einliest und erst dann die Größe des Arrays bestimmt werden kann. Gibt es dazu eine Möglichkeit?

Wenn ich das ganze in einer Klasse umsetze, funktioniert's, allerdings benötige ich in dem Kontext keine Klasse. Weierhin möchte ich das Array auch nicht als Return-Wert zurückgeben, da in der Funktion mehrere Arrays diesen Typs erstellt werden sollen.

Ich habe es nach diesem Muster versucht, aber wenn ich in main() versuche, Werte aus dem String-Array auszulesen, gibt's Maul-Mecker-Motz:

void readfile(string *str)
{
str = new sting[1000];

str[0] = "bitte nich schon wieder abstürzen...";
}

void main(void)
{
string *ohauehaueha;

readfile(ohauehaueha);

cout << ohauehaueha[0]; // <- Zugriffsfehler
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.12.2007, 16:57 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wieso benutzt du nicht einen entsprechenden Container wenn du eh die STL verwendest wie zum Beispiel std::vector?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.12.2007, 17:01 Uhr
Kest
saint


Hi!

>str< und >ohauehaueha< zeigen auf dieselbe Adresse, aber >str< und >ohauehaueha< sind unterschiedliche Variablen.

C++:
void foo(std::string* str){
    std::cout << "str zeigt auf: " <<  str << std::endl
              << "str liegt auf: " << &str << std::endl;
}

int main()
{
    std::string* ohauehaueha;
    std::cout << "ohauehaueha zeigt auf: " <<  ohauehaueha << std::endl
              << "ohauehaueha liegt auf: " << &ohauehaueha << std::endl
              << std::endl;

    foo(ohauehaueha);
}


Bei >str = new sting[1000]< wird also dem Zeiger >str< ein Array zugewiesen, nicht dem >ohauehaueha<.

Um das zu erreichen, was du vorhast, könnte man zur C++-sichen Lösung greifen, mit Referenzen:

C++:
void readfile(std::string*& str) {
    str = new std::string[1000];
    str[0] = "bitte nich schon wieder abstürzen...";
}


int main()
{
    std::string* ohauehaueha;

    readfile(ohauehaueha);

    std::cout << ohauehaueha[0]; // <- Zugriffsfehler
}


oder aber das Problem auf alte C-siche Art lösen, mit einem Zeiger-Zeiger:

C++:
void readfile(std::string** str){
    *str = new std::string[1000];
    (*str)[0] = "bitte nich schon wieder abstürzen...";
}


int main()
{
    std::string* ohauehaueha;

    readfile(&ohauehaueha);

    std::cout << ohauehaueha[0];
}

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 17.12.2007 um 17:07 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.12.2007, 17:26 Uhr
Dr.Strangelove



Danke für die Erklärung, Kest! Funktioniert jetzt.

Stimmt Guybrush, nen STL-vector hätte ich natürlich auch benutzen können...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.12.2007, 23:17 Uhr
xXx
Devil



Zitat:
Stimmt Guybrush, nen STL-vector hätte ich natürlich auch benutzen können...
Solltest du auch immer noch. Der kümmert sich wenigstens darum, dass deine Strings auch wieder gelöscht werden!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: