Dynamisches Array



  • Hallo Jungs / Mädels

    Ich habe folgenden Code und ich möchte gerne das Array
    auf die Grösse eines Kommandozeilen Arguments setzen. Ich bin leider nirgendwo
    auf Hilfe gestossen.

    int main(int argc, char *argv[])
    
    int Argument4 = atoi(argv[4]);
    char buffer [PacketSize];
    

    Also wenn der Benutzer das vierte Argument als Argument4 über die Kommandozeile '1000' eingibt, dann soll 'char buffer [1000]' gelten.
    Funktioniert das überhaupt?

    Vielen tausend Dank schon jetzt
    SeeItPlus



  • Du benötigst ein dynamisches Array:

    unsigned long int buffersize = StringToInt (argv[4]);
    char* buffer = new char [buffersize];
    

    Noch besser wäre natürlich die C++-Variante der STL:

    unsigned long int buffersize = StringToInt (argv[4]);
    
    // Für Strings:
    std::string str;
    str.resize(buffersize);
    
    // Für Arrays:
    std::vector vec;
    vec.reserve(buffersize);
    

    MfG SideWinder



  • Das ging ja schnell, vielen herzlichen Dank!

    ABER.. jetzt scheint irgendwo das ganze zu hängen.

    Also nochmal den aktuellen Code:

    unsigned long int buffersize = atoi((argv[4]));
    char* buffer = new char [buffersize];
    
    //int PacketSize = atoi(argv[4]);
    //char buffer [PacketSize];
    

    Also nochmals zur Erklärung, das Array 'buffer' muss die Grösse des Kommando-Zeilen Argumentes haben.

    Beispiel; der Benutzer gibt ein:

    programm.exe 1024

    Danach soll das Array so aussehen:

    char buffer [1024];
    

    Wo liegt denn der Fehler? Beim Kompilieren krieg ich keine Errors...

    merci!



  • 1. argv[4] ist der 4. Parameter, nicht der 1. wie in deinem Beispiel gezeigt. Wenn der nicht vorhanden ist gibt es ein Problem - vorher also argc prüfen!

    2. Nach der Benützung des Arrays (am Ende des Programms) das dynamische Array wieder freigeben:

    delete [] buffer;
    

    MfG SideWinder



  • Scheint immernoch nicht zu funktionieren. Hier etwas mehr Code zum Verständnis:

    programm.exe inFile outFile BufferSize(Bytes) Delay(ms)
    z.B. programm.exe c:\src.txt c:\dst.txt 128 1000

    Würde das File c:\src.txt nach c:\dst.txt in 128Byte/1000ms kopieren.

    Aber dazu benötige ich halt das Array für die Buffersize, welche
    der Benutzer wünscht! Sorry wenn ich mich vorher zu unverständlich ausgedrückt habe..

    [cut...]
    //char buffer [8192];  //das war mal standard und genau das hätte ich nun gern
    //über die kommandozeile gehabt!
    
    unsigned long int buffersize = atoi((argv[4])); //dein Code
    char* buffer = new char [buffersize];
    //int PacketSize = atoi(argv[4]); //mein probiercode, der ja nicht funzt.
    //char buffer [PacketSize];
    
    [cut...]
    
    while (! inFile.eof()) 
    
    {
    	inFile.read (buffer, sizeof(buffer));
    	outFile.write (buffer, inFile.gcount());
    	Sleep(atoi(argv[4]));
    }
    
    inFile.close;
    outFile.close;
    
    [cut...]
    


  • SeeItPlus schrieb:

    [cut...]
    unsigned long int buffersize = atoi((argv[4])); //dein Code
    char* buffer = new char [buffersize];
    [cut...]
    while (! inFile.eof()) 
    
    {
    	inFile.read (buffer, sizeof(buffer));
    [cut...]
    

    sizeof(buffer) liefert die Größe von buffer. buffer ist ein *Zeiger* kein Array. Damit liefert sizeof(buffer) also die Größe eines Zeigers (auf gängigen Maschinen 4). Ich denke du willst aber wohl eher buffersize-Bytes lesen.



  • Das Problem ist einfach, dass es so NICHT geht:

    unsigned long int buffersize = atoi((argv[4])); //dein Code
    char* buffer = new char [buffersize];
    

    Aber SO geht es:

    char buffer [1024];
    

    Also das heisst, es ist UNmöglich mein vorhaben umzusetzen?

    Danke schon jetzt mal..

    Grüsse aus der CH



  • nein ist es nicht, wie Hume bereits gesagt hat, solltest du dir mal anschauen, was der sizeof-Operator macht.

    er liefert die größe eines Typs zurück.

    char *foo=new char[100];
    
    sizeof(foo) == sizeof(char*); // auf 32Bit Systemen idr 4
    
    char foo[100];
    
    sizeof(foo) == sizeof(char[100]); // == 100
    

    Aber du brauchst ja gar nicht sizeof, da du die größe bereits kennst

    btw. std::size_t ist der richtige Typ für Größen angaben und nicht unsigned long irgend was! ⚠



  • SeeItPlus schrieb:

    Scheint immernoch nicht zu funktionieren. Hier etwas mehr Code zum Verständnis:

    programm.exe inFile outFile BufferSize(Bytes) Delay(ms)
    z.B. programm.exe c:\src.txt c:\dst.txt 128 1000

    Würde das File c:\src.txt nach c:\dst.txt in 128Byte/1000ms kopieren.

    Aber dazu benötige ich halt das Array für die Buffersize, welche
    der Benutzer wünscht! Sorry wenn ich mich vorher zu unverständlich ausgedrückt habe..

    [cut...]
    //char buffer [8192];  //das war mal standard und genau das hätte ich nun gern
    //über die kommandozeile gehabt!
    
    unsigned long int buffersize = atoi((argv[4])); //dein Code
    char* buffer = new char [buffersize];
    //int PacketSize = atoi(argv[4]); //mein probiercode, der ja nicht funzt.
    //char buffer [PacketSize];
    
    [cut...]
    
    while (! inFile.eof()) 
    
    {
    	inFile.read (buffer, sizeof(buffer));
    	outFile.write (buffer, inFile.gcount());
    	Sleep(atoi(argv[4]));
    }
    
    inFile.close;
    outFile.close;
    
    [cut...]
    

    Er checkt es einfach nicht...


Anmelden zum Antworten