C++ Frage bzgl. Array

V

VirusDeluXe

Gast
Guten Abend zusammen,

ich habe folgendes Problem:

Ich habe nun z.B. folgendes Array definiert ...

Code:
char* bekannteNamen[] = {
	"Dennis"	,
	"Lars"		,
	"Gott"		,
	"Jesus"		,
	"Chantal"	,
	"Trixi"		,
	"Gerd"
};

So ... nun habe ich sozusagen von 0 bis 6 genau 7 Elemente drin. Meine Frage nun: Wie ermittle ich, dass sich darin 7 Elemente befinden?

sizeof(Arrayname); ... verfehlt ja an dieser Stelle den Zweck :/

Vielen Dank für die Antwort :)
 
Hi ich glaube das ist nicht so einfach.
Benutze doch lieber einen vector, wenn du schon c++ benutzt.
Der hat dann auch eine .size, die dir die Anzahl der Elemente ausgibt ;)
 
Code:
sizeof(bekannteNamen)/sizeof(char*);
Diesen Ausdruck löst der Compiler zum Compilierzeitpunkt auf und du kannst die ermittelte Größe als const sogar in weiteren Array Deklarationen verwenden.
 
Zuletzt bearbeitet: (Formatierung als Code)
Einen Operator kenn ich aus dem Stehgreif nicht, aber Du kannst es über die Deklaration einschränken. Siehe: http://msdn.microsoft.com/en-us/library/1x82y1z4(VS.80).aspx

Beispiel:

template<int N>
int func(char* (&arr)[N])
{
int count = N; //N müsste jetzt die Anzahl der Elemente sein
return N;
}

char* bekannteNamen[] = {
"Dennis" ,
"Lars" ,
"Gott" ,
"Jesus" ,
"Chantal" ,
"Trixi" ,
"Gerd"
};
int size = func(bekannteNamen);
 
Zuletzt bearbeitet:
Ist zwar meines Erachtens nicht schön funzt aber!

#include <stdio.h>
#include <stdlib.h>

int getLen(char**);

int main(void) {

char *name[] = {
"string1",
"string10",
"string100",
NULL
};
printf("%d\n",getLen(&name));

return 0;
}

int getLen(char** s){
int i=0;

while(s[++i] != NULL){}
return i;
}
 
VirusDeluXe, wenn Du das so machen willst, dann musst Du am Ende ein leeres Element "" einfügen und das Abfragen um das Ende zu erkennen.
 
ein wenig komfortabler als der Vorschlag von DaZpoon:

Code:
#include <iostream>

int main() {
    const char* a[] = {"apfel", "banane", "wurst", "?"};
    std::cout << sizeof(a)/sizeof(a[0]) << std::endl;
}

Der statische Array a enthält Zeiger auf C-Strings und die haben immer die gleiche Größe. Die Zeichenketten werden vom Compiler separat gespeichert. Da für die Ermittlung alle Größen zur Compile-time vorhanden sind, sollte die Berechnung vom Compiler gemacht werden.
 
Zuletzt bearbeitet: (Erläuterungen)
convexus schrieb:

Was aber nur funktioniert solange jedes Element des Arrays nur aus einem einzigen Zeichen besteht. Sobald aber jedes Element ein char array (bzw string) unbestimmter Länge ist funktioniert dieser Ansatz nicht mehr.

Mir ist nicht ganz klar wozu das ganze gut sein soll. Ein Array hat von Anfang an eine feste Zahl an Elementen, damit ist diese bekannt.
 
Peppercake schrieb:
Was aber nur funktioniert solange jedes Element des Arrays nur aus einem einzigen Zeichen besteht.


Ähm, nein ... die Anzahl der Zeichen ist völlig Wurscht ... das funktioniert immer. Wenn das Array x Einträge hat, liefert dir diese Methode immer x, vollkommen egal, aus wie vielen Zeichen die einzelnen Array-Einträge bestehen.
Ergänzung ()

Funktioniert natürlich nur, so lange wir wirklich von Arrays im engsten Sinne sprechen. Mit dynamisch allozierten "Arrays" (in Anführungszeichen weil es eigentlich keine sind) geht das nicht.
 
Scotty4BMAN schrieb:
Einen Operator kenn ich aus dem Stehgreif nicht, aber Du kannst es über die Deklaration einschränken.

Sollte nicht funktionieren. void f(int a[10]) ist äquivalent zu void f(int a[]) ist äquivalent zu void f(int* a); . In C99 gibt's da was, in C++ (98/2003) nicht. Möglicherweise mit dem neuen Standard dazu gekommen, aber davor nicht. Nur zu dem Zeitpunkt wo das Array auch noch ein Array ist und keine Array-to-Pointer-Conversion durchgeführt wurde, kann man die Größe mit dem sizeof-Operator ermitteln.
 
Wenn das funktioniert hab ich wohl irgendwo einen Denkfehler. Kanns grad leider nicht ausprobiern, werd ich bei Gelegenheit machen. Mit Arrays hab ich schon ne Weile nichts mehr gemacht ^^
 
Die Frage ist ja nach die anzahl der Strings im Array und nicht die Anzahl der Zeichen, wie oben geloest

Ich wuerde auch enfach auf das NULL Element im String pruefen das mit " " jeweils angehangen wird, findest du 7 NULLen dann hasste auch 7 Elemente/Strings ;-)
 
Die Antwort von "convexus" hat mir super geholfen und reicht für die Mini-Aufgabe die ich da hatte :-)

Vielen Dank für eure Antworten und Bemühung. Da macht es gleich viel mehr Spaß und wieder etwas gelernt :-)
 
@7H3 N4C3R

funktioniert mit allen Visual Studio Compilern ab 2005.

edit: scheinbar auch 2003
 
Zuletzt bearbeitet:
Was spricht denn gegen den Einsatz eines Vektors? ^^
 
Die direkte Initialisierbarkeit (C++<0x) ist nicht gegeben. (BTW: Bei der Problemstellung gehe ich davon aus, das ein set wahrscheinlich am besten wäre).
Also ich mach sowas entweder mit sizeof(struct)/sizeof(struct[0]) und speicher das ab, oder grad bei char* kann man das letze Element auf 0 setzten, wie ein c-string halt auch, das funktioniert sehr gut.
 
Zurück
Oben