Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 16.08.2005, 12:00 Titel: Array Größe ermitteln |
|
|
Hallo
Hab mal wieder ein Problem.
CPP: | int main()
{
char* name;
name = new char[100];
int size = sizeof(name)/sizeof(char);
printf("%d",size);
return 0;
}
|
Ich moechte die Größe von name ermitteln klappt aber irgendwie nicht.
Gibt immer nur den Wert 4 statt 100 zurück. Ich befuerchte das ist die Groese des zeigers und nicht des Arrays. Aber wie geht das nun.
Thx 4 Help _________________ Theorie ist, wenn man alles weiss und nichts funktioniert.
Praxis ist, wenn alles funktioniert und keiner weiss warum. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 16.08.2005, 12:20 Titel: |
|
|
Um die Länge eines C-Strings zu bestimmen, gibt es die nette Funktion strlen().
*hier stand Mist*
Wie Christian sagt, 1 nur dazuaddieren, wenn du die Länge des Strings im Speicher brauchst(die ja das 0-Zeichen beinhaltet).
Wenn du nur die Zeichenanzahl brauchst, einfach strlen normal benutzen:
CPP: | int main()
{
char* name;
name = new char[100];
int size = strlen(name);
printf("%d",size);
delete[] name;
return 0;
} |
PS: Ich glaube du brauchst auch stdio.h
PPS: Für jedes new: delete nicht vergessen _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Zuletzt bearbeitet von The Lord of Programming am 16.08.2005, 12:42, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 16.08.2005, 12:30 Titel: |
|
|
Du musst nicht -1 abziehen, wenn schon dann 1 addieren, damit das 0 Zeichen mitkommt.
C. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 16.08.2005, 12:40 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | PS: Ich glaube du brauchst auch stdio.h |
ich kenne es anders
#include <cstring> _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 16.08.2005, 12:49 Titel: |
|
|
k Thx schon mal
Die Funktion strlen() ist mir schon bekannt aber das war nur ein zufall das es ein die variable ein char typ war was tun wenn der typ int oder egal was ist. _________________ Theorie ist, wenn man alles weiss und nichts funktioniert.
Praxis ist, wenn alles funktioniert und keiner weiss warum. |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 16.08.2005, 12:59 Titel: |
|
|
Dann musste es selbst mit merken.
strlen gibt dir auch nicht die Länge von dem charblock wieder, sondern sucht nach dem Nullzeichen. _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 16.08.2005, 13:06 Titel: Re: Array Größe ermitteln |
|
|
CPP: | int main()
{
int* zahlen;
int groesse = 100;
zahlen= new int[groesse];
int size = groesse * sizeof(int);
printf("%d",size);
return 0;
}
|
bittschön _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
Florian Super JLI'ler
Alter: 36 Anmeldedatum: 20.06.2003 Beiträge: 302
Medaillen: Keine
|
Verfasst am: 16.08.2005, 13:18 Titel: |
|
|
Ja danke schoen schon mal fuer die Antworten.
Hotacid ich moechte nicht die groese des ganzen wiesen ich moechte nur
die Groese vom Array ermitteln bei dir im Code (groesse).
Es funktioniert auch wenn ich so schreibe
CPP: | int main()
{
int name[100];
int size = sizeof(name)/sizeof(int);
printf("%d",size);
return 0;
}
|
Aber das bringt mir nichts gibts da nicht eine moeglichkeit ohne die groese in einer eigenen Variable mitzuspeichern.
Thx schon mal _________________ Theorie ist, wenn man alles weiss und nichts funktioniert.
Praxis ist, wenn alles funktioniert und keiner weiss warum. |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 16.08.2005, 13:54 Titel: |
|
|
das funktioniert leider nicht. du musst dich schon selbst darum kümmern die größe des arrays zu speichern.
Am einfachsten ist da noch die STL Klasse vector zu benutzen:
CPP: | std::vector<int> testVector( 100 );
int size = testVector.length() * sizeof( int );
|
|
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 16.08.2005, 14:24 Titel: |
|
|
Mit statischen Array gehts aber.
CPP: | char array[20];
::std::cout << sizeof(array)/sizeof(char) << ::std::endl; |
Und wenn du ein Array dynamisch anlegst, kennst du ja die Größe, du legst es ja schließlich an. Im Grunde ist sizeof() da doch eh überflüssig. |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 16.08.2005, 16:50 Titel: |
|
|
Theoretisch müsste man sie auch bei dynamischen Arrays herauskriegen können, da new die Größe irgendwo "dahinter" speichern muss, sonst wüsste delete nicht wieviel es löschen soll. _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 16.08.2005, 17:06 Titel: |
|
|
Wie kommst du darauf, das die Größe 'gespeichert' wird?
Ein Zugriff dieser Art ist in C++ völlig 'legal'.
CPP: | int* foo = new int[5];
foo[987] = 123; |
|
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 16.08.2005, 17:30 Titel: |
|
|
GreveN hat Folgendes geschrieben: | Wie kommst du darauf, das die Größe 'gespeichert' wird?
Ein Zugriff dieser Art ist in C++ völlig 'legal'.
CPP: | int* foo = new int[5];
foo[987] = 123; |
|
Was hat das damit zutun?
Bei jedem new aufruf wird zusätzlich die Größe irgendwo gespeichert werden, delete kann nich zaubern.
Guck mal was hier in *a drinsteht:
CPP: | unsigned * a = new unsigned[5];
a-=4;
|
_________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 16.08.2005, 18:01 Titel: |
|
|
OLiver hat Folgendes geschrieben: | GreveN hat Folgendes geschrieben: | Wie kommst du darauf, das die Größe 'gespeichert' wird?
Ein Zugriff dieser Art ist in C++ völlig 'legal'.
CPP: | int* foo = new int[5];
foo[987] = 123; |
|
Was hat das damit zutun? |
Das hat damit insofern zutun, dass dieser kurze Codeschnippsel ausreicht, um zuzeigen, dass die Größe nicht gespeichert wird und deshalb Zugriffe außerhalb der Array-Grenzen problemlos möglich sind, andere Sprachen fangen solche netten Dinge ab.
OLiver hat Folgendes geschrieben: | Bei jedem new aufruf wird zusätzlich die Größe irgendwo gespeichert werden, delete kann nich zaubern. |
Das nicht, aber 'delete' kann die Array-Signatur lesen, was es dir vorraus hat.
OLiver hat Folgendes geschrieben: | Guck mal was hier in *a drinsteht:
CPP: | unsigned * a = new unsigned[5];
a-=4;
|
|
3082224.
Sieht für mich nach einem Zugriff auf unallokierten Speicher aus. |
|
Nach oben |
|
|
|