Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Länge eines Feldes feststellen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
11.05.2003, 09:30 Uhr
MeisterB



Kennt jemand einen Befehl um die Länge eines Feldes festzustellen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.05.2003, 10:05 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
sizeof(feld)/sizeof(*feld);


Nicht zu verwecheln mit strlen, was die Länge eines Strings berechnet.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.05.2003, 11:33 Uhr
MeisterB



Nein damit funktioniert es nicht! In der Hilfe zu diesem Befehl steht auch der Grund:"kann nicht Größe eines dynamischen Feldes ermitteln". Das Feld ist per new-Befehl erstellt und soll in einer Funktion benutzt werden. Doch um richtig zu arbeiten braucht die Funktion die genaue Größe. Irgend eine Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.05.2003, 11:41 Uhr
~Heiko
Gast


Ich habe das noch nicht probiert, aber ich habe mal gehört das der die Länge des Feldes in der Speicherzelle vor der ersten speichert. (irgendwie muss der ja auch wissen wie lange das feld ist, an sonsten würde IMHO ein delete [] pointer ja nicht funktionieren können)

mit ein bisschen tricksen müssten man eigenlich relativ leicht auf die speicherzelle vor der ersten des Arrays zugreifen können (Ich vermute mal das das ein 4 byte unsinged int wert ist.)

Kannst du ja mal ausprobieren wenn du langeweile hast

Gruss Heiko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.05.2003, 11:55 Uhr
~0xdeadbeef
Gast


Das, was du meinst, gilt für Pascal-Strings. Die sind dafür dann auch nicht null-terminiert und in der Länge beschränkt. Was mit new erzeugte Arrays angeht - entweder, du merkst dir die Länge bei der Allokation, oder du benutzt einen vector. Ich würde das zweite tun.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.05.2003, 13:50 Uhr
Pablo
Supertux
(Operator)


Wenn das Feld per new erstellt worden ist, dann könnte die die Array-Arithmetic behilflich sein. Nehmen wir an das myArr[] ein durch new-keyword erzeugtes Feld ist.

Es könnte so funktionieren (hab ich einmal gelesen, aber noch nie benutzt)


Code:
int arLength=0;
while(myArr++)
   arLength++;
printf("Die Länge vom Array beträgt %d\n",arLength);



myArr++ bedeutet, dass in myArr um 1 inkrementiert wird, weil es ein Pointer ist, dann wird die Adresse um 1 inkrementiert und somit kannst du auf das nächste Element vom Feld zurückgreifen. Die While-Schleife wird ausgeführt solange myArr Elemente hat, weil wenn wir das letzte Element erreicht haben, das nächste Element ist NULL.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 11.05.2003 um 13:50 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.05.2003, 14:08 Uhr
~0xdeadbeef
Gast


Das wird nicht funktionieren. Diese Schleife bricht ab, wenn myArr den Wert 0 erhält, und wenn du myArr immer um 1 erhöhst, wirst du darauf lange warten können.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.05.2003, 08:50 Uhr
MeisterB



Da ich gerade erst mit C++ anfange sind die Lösungsvorschläge kaum umsetzbar. Gibt es denn eine Möglichkeit an das Ende des Integerfeldes ein bestimmtes Zeichen zu setzen nach welchem die Funktion dann einfach suchen kann?(Hab das mal mit dem '\0' probiert hat aber nichts gebracht da die Suche beim finden einer normalen 0 aufhört)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.05.2003, 09:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn Du nur mit ints arbeiten willst, hast Du eigentlich drei Möglichkeiten:
1. Du merkst Dir die Größe beim Aufruf von new.

C++:
int sizeof_ints = 100;
int * ints = new[sizeof_ints];


Hat den nachteil, daß Du diese Größe überall hin mitschleppen mußt.
2. Du markierst das Ende mit einem Int. welches garantiert nicht vorkommen kann, zB

C++:
int* ints = new[100];
ints[99] = hundertprozentig_niemals_sonst_verwendete_zahl;


Wenn Du nach hundertprozentig_niemals_sonst_verwendete_zahl suchst, solltest du dann auch die Größe bekommen (ist halt verwandt mit der von Dir vorgschlagenen Lösung). Nachteil liegt halt klar auf der Hand: vielleicht gibt es diese Zahl garnicht.
3. Du belegts ein int mehr als Du brauchst und tust da die Länge rein:

C++:
int sizeof_ints = 100;
int * ints = new[sizeof_ints+1];
ints[0] = sizeof_ints;


Das hat dan Nachteil, daß Du nicht - wie sonst üblich, mit 0 auf das erste Element im Array zugreifen darfst. Zwar kannst Du solche unflätigen Routinen Schreiben:

C++:
int* new_int_array(int size)
{
   int* ret = new int[size+1];
   *ret++ = size;
   return ret;
}

void del_int_array(int* array)
{
    delete  [] (--array);
}

int sizeof_int_array(int* array)
{
    return *(--array);
}


Also quasi immer einen Zeiger auf den bereich verwenden, der hinter der Längenangabe liegt, aber solche Schweinerein finde ich für einen Anfänger wenig empfehlenswert udn auch sonst recht fragwürdig (das wird zwar auch in "professioneller" Software gemacht, allerdings selten und nur in klar definiertem Rahmen).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.05.2003, 09:49 Uhr
~0xdeadbeef
Gast


Naja, wenn du schon so anfängst, würde ich eher sowas in der Richtung machen:

C++:
typedef struct {
    int *feld;
    int laenge;
} int_array;


Aber wie gesagt, einfachste Möglichkeit in C++ - vector<int> benutzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: