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 1000Wü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 1000Wü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...