Probleme beim definieren von char-Array



  • Hallo zusammen,

    ich habe folgendes Problem:

    In meinem Programm wird beim Aufruf ein Dateiname als Parameter uebergeben. Anschließend möchte ich die Laenge des Parameters(Dateiname) ermitteln und mit dieser Laenge ein neues char-Array definieren. Allerding meckert der Compiler immer: "Constant expression required"

    Ich verstehe das nicht...
    Hier mal ein Code-Schnipsel:

    int main(int argc,char *argv[]){
    
          int dat = strlen(argv[1]); // Laenge des Dateinamens
          char newdat[dar];          // Hier wird gemeckert, wieso?
    

    Ihr könnt mir sicher helfen....

    CIAO



  • int main(int argc,char *argv[]){ 
    
          const int dat = strlen(argv[1]); // Laenge des Dateinamens 
          char newdat[dat]; 
    }
    

    Siehe "const", weil

    "Constant expression required"



  • Ok, ich muss halt ´ne Konstante uebergeben. Doch wie mache ich dass am besten, da die Konstanten doch vorher fest stehen??? *Grübel*

    CIAO



  • char[...] darfst du nur mit konstanten werten (zur zeit der kompilierung bekannt) benutzen.

    verwende stattdessen folgendes:

    int main(int argc,char *argv[]){
    
          const int dat = strlen(argv[1]); // Laenge des Dateinamens
          char *newdat = new char[dat];
          ...
          delete[] newdat; // GANZ WICHTIG!!! IMMER DELETEN
    }
    

    mit new und delete holst du dir dynamisch speicher, also variable mengen.
    dabei gilt aber, folgendes zu beachten (char als beispiel für jeden anderen typen):

    char *bla = new char[einezahl]; delete[] bla; // ein "array" von chars
    char *bla = new char; delete bla; // ein "array" mit nur _einem_ char
    


  • c.rackwitz schrieb:

    char[...] darfst du nur mit konstanten werten (zur zeit der kompilierung bekannt) benutzen.

    verwende stattdessen folgendes:

    int main(int argc,char *argv[]){
    
          const int dat = strlen(argv[1]); // Laenge des Dateinamens
          char *newdat = new char[dat];
          ...
          delete[] newdat; // GANZ WICHTIG!!! IMMER DELETEN
    }
    

    mit new und delete holst du dir dynamisch speicher, also variable mengen.
    dabei gilt aber, folgendes zu beachten (char als beispiel für jeden anderen typen):

    char *bla = new char[einezahl]; delete[] bla; // ein "array" von chars
    char *bla = new char; delete bla; // ein "array" mit nur _einem_ char
    

    hallo,

    fange gerade erst mit c++ an kenne mich aber schon ein bissl bei c aus. entsprechen new und delete den c-funktionen malloc() und free()?? wenn ja, gibt es da frapierende unterschiede und warum ist es so wichtig zu deleten?

    grüße,

    sternenstaub



  • zwischen malloc()/free() und new/delete gibt es gewaltige unterschiede.

    mit malloc() holst du dir nur einfach rohen speicher, mit new wird auch gleich der speicher passend zum typen "vorbereitet". das merkt man bei klassen. wenn du eine klasse hast, dann kannst du ein objekt dieser klasse nur mit new erstellen, nicht mit malloc. das ist der unterschied. bei new/delete werden nämlich auch die konstruktoren/destruktoren der klassen aufgerufen.
    man darf auch nicht new mit free() oder malloc() mit delete benutzen (auf den gleichen speicher), gibt ärger.

    nach getaner arbeit seinen speicher mit free() oder delete wieder freizugeben, ist "pflicht". würdest du das nicht machen, würde das betriebssystem noch glauben, der speicher wäre in benutzung, obwohl dein programm vielleicht schon längst beendet wurde. so entstehen "speicherlecks".

    gruß



  • Es ist zwar wichtig, diesen ganzen Kram zu kennen (also kuck ihn dir an), aber in deinem speziellen Fall wäre der C++-Weg im Zweifel eher, an Stelle des char-arrays std::string zu benutzen:

    #include <string>
    
    int main(int argc, char *argv[]) {
      std::string newdat; // std::string übernimmt die ganze Speicherverwaltung für dich
    
      //...
    }
    

    Genaueres auf http://www.sgi.com/tech/stl/basic_string.html


Anmelden zum Antworten