icefox Geschrieben 18. November 2008 Geschrieben 18. November 2008 Hallo Leute, wie findet man heraus, wie groß ein Array ist? Wieviele Element hat wohl der array environ? int i; extern char* environ[]; for( i = 0; i++; NULL != environ[i] ) i--; Das wars. Kein Codeblock für for und i enthält die Anzahl der Element für den array environ. Zitieren
TDM Geschrieben 18. November 2008 Geschrieben 18. November 2008 sizeof(environ)/sizeof(environ[0]) Wenn du weißt, von welchem Typ (in dem Fall char) der Array ist auch: sizeof(environ)/sizeof(char) [Editerle] Das zweite würd ich bevorzugen, weil wenn nichts im Array drin steht, könnte ein Verweiß auf 0 mitunter zu einem Fehler kommen. Zitieren
icefox Geschrieben 18. November 2008 Autor Geschrieben 18. November 2008 sizeof(environ)/sizeof(environ[0]) Wenn du weißt, von welchem Typ (in dem Fall char) der Array ist auch: sizeof(environ)/sizeof(char) [Editerle] Das zweite würd ich bevorzugen, weil wenn nichts im Array drin steht, könnte ein Verweiß auf 0 mitunter zu einem Fehler kommen. Bei erstens muss nicht unbedingt environ[0] existieren und das Prog würde zur Laufzeit SIGSEGV falls environ[0]; nicht alloziert ist. Bei 2. ist environ ein 2 dimensionales Array. Erst ein character array und dann eine dimension weiter. Es gibt sicherlich einige Methoden um den Array zu zählen. Welche fällt euch ein? Zitieren
Crash2001 Geschrieben 18. November 2008 Geschrieben 18. November 2008 Na es kann maximal 65536 Felder haben, da int nicht mehr Zahlen zur Verfügung stellt. Bei unsigned int ginge der Wertebereich von 0 bis 65535 und bei signed int von -32768 bis 32767. Wie gross es aber wirklich ist, bzw wie viele Werte es enthält, lässt sich anhand der belegten Felder herausfinden. bzw anhand entsprechender Funktionen (siehe die Posts über meinem), die dir die Anzahl ausgibt. Irgendwie kapier ich die for-Schleife da aber nicht so ganz. Kann das sein, dass die beiden letzten beiden Elemente dadrin vertauscht sind und es eigentlich for(i=0; environ[i] != NULL; i++) { //mach was } heissen sollte. Was soll das i-- da überhaupt? Das i++ im Kopf der for-schleife und das i-- im Code darunter heben sich doch auf und es würde zu einer Endlosschleife führen, falls da nicht noch etwas anderes steht. P.S.: Man prüft normalerweise afaik nicht ab, ob NULL ungleich einem Wert ist, sondern umgekehrt. Zitieren
Klotzkopp Geschrieben 18. November 2008 Geschrieben 18. November 2008 Das wars. Kein Codeblock für for und i enthält die Anzahl der Element für den array environ.Nein, i enthält die Position des ersten Nullelements in environ. Das ist etwas völlig anderes. Es gibt sicherlich einige Methoden um den Array zu zählen. Welche fällt euch ein? Die einzige portable Möglichkeit, die Anzahl der Elemente eines Arrays zu ermitteln, ist sizeof, so wie TDM es gezeigt hat. Zitieren
icefox Geschrieben 18. November 2008 Autor Geschrieben 18. November 2008 Zwichen for() und i--; war mit Absicht eine Leerzeile, denn diese seperiert for() und schliesst es ohne Block ab. environ; <- enthält zu guter letzt NULL. environ[i--]; <- enthält jetzt letztes element i = Anzahl der Elemente i-- = letztes Element So, ich glaube jetzt haben wir es auseinandergezogen? sizeof() berechnet die Anzahl, obiger Algorithmus zählt die Anzahl. Was nun schneller geht und/oder portabler ist wohl von Fall zu Fall unterschiedlich. Was meint ihr? Zitieren
Klotzkopp Geschrieben 18. November 2008 Geschrieben 18. November 2008 sizeof() berechnet die Anzahl, obiger Algorithmus zählt die Anzahl.Nein, dein Algorithmus zählt nicht die Anzahl, sondern sucht das erste Nullelement. In Arrays muss aber gar kein Nullelement vorkommen. Dein Algorithmus funktioniert nur mit Arrays, die mit einer 0 terminiert sind. Das ist aber nicht der Normalfall. int main() { int foo[] = { 3, 4, 5 }; return 0; }[/code] "Zähl" hier bitte mal die Elemente von foo. Zitieren
TDM Geschrieben 18. November 2008 Geschrieben 18. November 2008 ich hab grad mal bisschen rumprobiert: template <class T, int size> int f(T (&x)[size]) { return size; } template <class T, int size, int size2> int f2(T (&x)[size][size2]) { int maxsize = 0; for (int i = size; i; i--) maxsize += f(x[i]); return maxsize; } int main(int argc, char* argv[]) { int na[] = {1,2,3,4}; std::cout<<f(na)<<std::endl; int na2[] = {1,2,3,4,5,6,7}; std::cout<<f(na2)<<std::endl; char ca[] = "test"; std::cout<<f(ca)<<std::endl; int na3[2][3]; na3[0][0] = 0; na3[0][1] = 1; na3[0][2] = 2; na3[1][0] = 0; na3[1][1] = 1; na3[1][2] = 2; std::cout<<f2(na3)<<std::endl; Sleep(3000); return 0; } Muss sagen, klappt gut. Sogar das Zeichenkettenendekennzeichen hat es beim String mitgezählt. Zitieren
Klotzkopp Geschrieben 18. November 2008 Geschrieben 18. November 2008 Tipp: C wie groß ist der Array? :floet: Zitieren
icefox Geschrieben 18. November 2008 Autor Geschrieben 18. November 2008 Nein, dein Algorithmus zählt nicht die Anzahl, sondern sucht das erste Nullelement. In Arrays muss aber gar kein Nullelement vorkommen. Dein Algorithmus funktioniert nur mit Arrays, die mit einer 0 terminiert sind. Das ist aber nicht der Normalfall. int main() { int foo[] = { 3, 4, 5 }; return 0; } "Zähl" hier bitte mal die Elemente von foo. Wie wärs mit: int foo[] = { 3, 4, 5 }; int i; for( i = 0; NULL != foo[i]; i++ ) i--; printf("array first dimension count: %d\n", i); ? Zitieren
xk4fu Geschrieben 18. November 2008 Geschrieben 18. November 2008 OT: woher kommt das foo eigentlich? 4711 gibts ja z.b. auch, aber das ist klar wir könnten ja mal so eine zusammenstellung von namen/ werten erstellen, die im bereich informatik häufig verwendet werden mit hintergrund usw Zitieren
icefox Geschrieben 18. November 2008 Autor Geschrieben 18. November 2008 OT: woher kommt das foo eigentlich? 4711 gibts ja z.b. auch, aber das ist klar wir könnten ja mal so eine zusammenstellung von namen/ werten erstellen, die im bereich informatik häufig verwendet werden mit hintergrund usw foobar geht in die richtung blafasel, bzw. bla und fasel oder blah und fasel. Zitieren
TDM Geschrieben 18. November 2008 Geschrieben 18. November 2008 Fubar ? Wikipedia @Klotzkopp: Ok, erwischt. :upps Zitieren
Klotzkopp Geschrieben 18. November 2008 Geschrieben 18. November 2008 Wie wärs mit: int foo[] = { 3, 4, 5 }; int i; for( i = 0; NULL != foo[i]; i++ ) i--; printf("array first dimension count: %d\n", i); [/CODE] ?Hast du das mal ausprobiert? Hier hast du das Semikolon hinter der for-Anweisung weggelassen. So terminiert das nie. Wenn man das Semikolon wieder reinpackt, bekommt man entweder falsche Werte oder Segfaults bzw. Access Violations. Dieses Programm liefert nur dann den richtigen Wert, wenn zufällig hinter dem Array eine Null im Speicher steht. Und selbst dann wäre es undefiniertes Verhalten. Zitieren
Bubble Geschrieben 18. November 2008 Geschrieben 18. November 2008 (bearbeitet) Na es kann maximal 65536 Felder haben, da int nicht mehr Zahlen zur Verfügung stellt. Bei unsigned int ginge der Wertebereich von 0 bis 65535 und bei signed int von -32768 bis 32767. Ein 16-Bit System? Es ist compilerspezifisch, welche die größte Zahl einer int Variablen ist. Gängig sind im heutigen PC Bereich 4 Bytes pro int. wie findet man heraus, wie groß ein Array ist? Eine allgemeine Möglichkeit, die Größe eines beliebigen Speicherblocks festzustellen, gibt es nicht. Der sizeof Operator gibt die Größe des Operanden, bezogen auf ein char, zurück. Die Anzahl der Elemente eines Arrays kann man daraus berechnen. Nur bei char Arrays ist das Ergebnis des Operators gleich der Anzahl der Elemente, sonst nicht! Man muss aufpassen, wenn man ein Array an eine Funktion übergibt, denn aus Sicht der Funktion ist ein als Parameter übergebenes Array ein Pointer und der sizeof Operator würde nun nicht die Größe des Arrays (bezogen auf ein char), sondern die Größe des Pointers ermitteln. Bearbeitet 18. November 2008 von Bubble Zitieren
Crash2001 Geschrieben 18. November 2008 Geschrieben 18. November 2008 Ein 16-Bit System? Es ist compilerspezifisch, welche die größte Zahl einer int Variablen ist. Gängig sind im heutigen PC Bereich 4 Bytes pro int.Da steht Programmierspräche ist C. Und da sollte es denke ich mal darauf begrenzt sein. Zitieren
Klotzkopp Geschrieben 18. November 2008 Geschrieben 18. November 2008 Da steht Programmierspräche ist C. Und da sollte es denke ich mal darauf begrenzt sein.In C ist die Größe von int nicht festgelegt, und (auch) in C sind auf heutigen Architekturen 32 Bit für int üblich. Zitieren
Crash2001 Geschrieben 18. November 2008 Geschrieben 18. November 2008 Hmmm... dann haben die uns in der Berufsschule damals etwas falsches beigebracht, oder die Werte von dem von uns benutzten Compiler einfach verallgemeinert. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.