Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Array-Größe ermitteln klappt nicht mehr

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 <
000
03.06.2007, 11:06 Uhr
VuuRWerK



Ich habe zum ermitteln einer Array-Größe immer ein Standard-Makro was bisher immer funktioniert hatte. Jetzt hab ich zum ersten mal mit Dev-Cpp auf Win ein Projekt angefangen und auch dieses Makro wieder verwendet. Problem: Das Makro liefert mir immer 1, als wäre das Array nur ein Feld groß. Liegt es vllt am Mingw-Compiler? Denn mit MS Visual Studio C++ funktioniert es ohne Probleme?

Hier kurz der Code damit man weiß was ich eigentlich will


C++:
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(*(x)))

int length = ARRAY_SIZE(ar);   // length = 1



IMHO ist das doch in C die Standard-Funktion um die Größe eines Arrays zu ermitteln? Bei der Ausgabe von sizeof(ar) kommt auch nicht 64 raus(weil 16 Felder im Array) sondern 4 ...

Schonmal jemand das selbe Problem gehabt? Wäre für jeden Gedankenanstoß dankbar! Vielleicht steh ich einfach auf dem Schlauch

Gut Schuß
VuuRWerK
--
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.06.2007, 12:19 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,

so die arraygröße zu ermitteln klappt auch nur bedingt beim VC!

sizeof liefert dir zur Compilezeit die größe des Speicherbereichs der dahintersteht - unter umständen eben nur 4 (bei z.b nem pointer)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.06.2007, 12:30 Uhr
VuuRWerK



Das klingt ja ganz logisch und kenn ich so auch nicht anders, aber zur Compilezeit ist das Array, im Moment, konstant vorhanden:


C++:
int ar[] = {0, 6, 9, 9, 0, 0, 4, 3, 1, 3, 1, 3, 9, 6, 4, 2};


Das ist ja genau das was mich wundert.

Gut Schuß
VuuRWerK
--
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.

Dieser Post wurde am 03.06.2007 um 12:30 Uhr von VuuRWerK editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.06.2007, 12:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,
der gcc interpretiert das was du da schreibst als


C++:
int *ar = new int[anzahl mit inhalt { ... }];




darum kriegst du da nur "4" (eben weil ar nurn pointer ist)

wie gesagt - auf sowas kann man sich nicht verlassen. darum muss man sich eigentlich immer die länge mitliefern, die man als programmierer entsprechend liefern muss.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.06.2007, 13:27 Uhr
VuuRWerK



AHA! Das ist ja mal interessant und erklärt mir auch warum es im VC funktioniert und gcc nicht, Danke für die Info.

Dennoch habe ich aber nun das Problem das ermitteln der Arraygröße, denn im fertigen Algorithmus ist die größe des gelieferten Arrays unbekannt und wird nicht so konstant angegeben sondern aus einem char* generiert. Und das kann beliebig lang sein. Im Algo muss ich aber auf die Länge testen die 16 nicht unter- / überschreiten darf.

Mal abgesehen von einer Lösung mit Iteration gibt es noch eine andere die konkrete Länge herauszubekommen?

Gut Schuß
VuuRWerK
--
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.06.2007, 14:11 Uhr
xXx
Devil


kannst alles in nen String packen und dessen Länge abfragen ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.06.2007, 15:12 Uhr
VuuRWerK



Ich hab gerade anhand meines vorherigen Post gemerkt das ich ja das int-Array aus einem char* generiere, dann ist die länge ja kein Thema mehr Und solang ich mit einem konstanten Array arbeite geb ich halt auch die länge konstant an.

Dennoch würde mich interessieren ob es eine schöne Lösung gibt mit der man die länge eines int-Array(-Zeigers) herausbekommt?

Gut Schuß
VuuRWerK
--
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.

Dieser Post wurde am 03.06.2007 um 15:13 Uhr von VuuRWerK editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.06.2007, 15:48 Uhr
Tron



Moin,

wie wäre es mit:


Code:
int ar[] = {0, 6, 9, 9, 0, 0, 4, 3, 1, 3, 1, 3, 9, 6, 4, 2};
std::cout<<sizeof(ar) / sizeof(ar[0])<<std::endl;


liefert 16 wie gewünscht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.06.2007, 17:24 Uhr
VuuRWerK



Genau das selbe macht mein Makro welches ich zu anfangs gepostet habe doch auch und kompiliert mit dem gcc ergibt es 1 mit dem des VC 16. Das ist ja das blöde, daher wollt ich ja gern eine Lösung die beide Compiler gleich berechnen.

Gut Schuß
VuuRWerK
--
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.06.2007, 18:12 Uhr
0xdeadbeef
Gott
(Operator)


Aus dem Zeiger kriegst du nicht mehr raus, auf ein wie großes Array der nun zeigt. Ein Zeiger ist nur ne Speicheradresse.

Bei Strings ist es ein bisschen anders, weil da am Ende ein Sentinel erwartet wird - siehe strlen - aber bei normalen Arrays haut das nicht hin. Es sei denn, natürlich, du vereinbarst einen Sentinel, aber das ist eine ziemlich ungewöhniche Praxis.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: