Hallo! Gibt es in C eine Möglichkeit die Dimensionen eines Arrays, zur Laufzeit herauszubekommen? "sizeof" liefert ja nur die Gesamtgröße des Arrays. Irgendwelche "Terminierungen" -wie NULL- zu verwenden hilft nicht, da jede Zahl erlaubt ist. Danke & Grüße
Array schrieb: > "sizeof" liefert ja nur die Gesamtgröße des Arrays. Das geteilt durch die Größe eines Elements gibt dir das Gesuchte. Oder du machst es wie alle anderen und übergibst die Größe in einer zusätzliche Variablen. Denn kennen musst du sie, entweder weil das Array statisch angelegt wurde (Dann nimmt man eine Konstante für die Größe) oder weil du es dynamisch alloziert hast. Es fällt ja schliesslich nicht vom Himmel :-)
Hi "Der Andere"! Das meine ich nicht ... Auch, wenn du mit deiner Ergänzung recht hast (sizeof(array)/sizeof(<datatype array>)). Ich rede von den Dimensionen. Wollte nämlich nicht n-1 Dimensionen angeben müssen.
Spätestens dann, wenn das Array als Funktionsparameter übergeben wurde, ist auch sizeof machtlos. Und nein, dazu gibt's in C keine Lösung. Oliver
:
Bearbeitet durch User
Hmm, ich verstehe den "Use case" dafür nicht so richtig? Eine Funktion die Arrays unterschiedlicher Dimensionen verarbeiten können soll?
Array schrieb: > Hi "Der Andere"! > > Das meine ich nicht ... Auch, wenn du mit deiner Ergänzung recht hast > (sizeof(array)/sizeof(<datatype array>)). > > Ich rede von den Dimensionen. Wollte nämlich nicht n-1 Dimensionen > angeben müssen. Dimensionen sind nur eine Hilfe die richtigen Indexe zu finden. Es ist genauso gut/schlecht ein eindimensionales Array anzulegen. Dann muss man zwar für den Index mehr rechnen, aber im Prinzip macht das keinen Unterschied. Und wieder stellt sich die Frage: Hast du das dynamisch aufm Heap oder im Stack. Bei Heap, einfach einen uint für die Dimension spendieren. Wenn du so viele Dimensionen hast, dann macht der Speicherverbrauch es auch nicht aus. Oliver S. schrieb: > Spätestens dann, wenn das Array als Funktionsparameter übergeben wurde, > ist auch sizeof machtlos. Deswegen übergibt man auch normalerweise die Länge des Arrays, bzw. wenn man einen void pointer übergibt die "Größe" des Speichers, alles andere ist schlechter Stil.
Meinst Du, wieviele [ ] Paare das Array hat? Jedes Paar entspricht einer dereferenzierung mehr, schafft also einen ganz anderen "Level" von Typ. Meinst du im Code bei Kenntnis der Definition? Da kannst Du jede Größe analog eindimensional Arrays mit sizeof bestimmen. Oder meinst Du als Funktionsargument? Da musst Du alle Infos zur Interpretation explizit oder implizit übergeben.
Das geht nur, wenn Du das Array in einer eigenen Klasse versteckst und Du immer die Klasse referierst. Bei Übergabeparametern wird praktisch immer ein Zeiger übergeben: Fazit keine Größenreferenz. Hast Du schlampig programmiert kann der sogar ins Nirwana (!= 0) zeigen. Ist das Ganze statisch, so geht zwar sizeof (). Ist aber sinnlos, da die Frage bei einem konstanten Konstrukt nicht auftritt - immer gleich. Wurde das Ganze dynamisch angelegt, z.B. mittels malloc oder so, so gibt es nur einen anonymen Zeiger. Wahrscheinlich kennt die hinter malloc stehende Speicherverwaltung ja (für free ()), die tatsächliche "Speichergröße". Ob diese aber Bytegenau reserviert hat ist eine andere Frage. Das "natürliche" align kann auch noch für manchen Spaß sorgen. Ich wüsste aber auch nicht, wie man an diese Information herankommen kann.
Amateur schrieb: > Das geht nur, wenn Du das Array in einer eigenen Klasse versteckst Hier geht es um C. Da gibt es keine Klassen.
Array schrieb: > Gibt es in C eine Möglichkeit die Dimensionen eines Arrays, zur Laufzeit > herauszubekommen? Die einfache (und einzig richtige) Antwort lautet: nein.
Fällt mir gerade noch ein: Du kannst es wie die Pascal-Leute machen. Die beginnen das Zählen bei 1. So ist es möglich das Element 0 für eine Längeninfo zu verwenden. Natürlich reicht der Bereich nur für die, einem Element entsprechende, Länge. Also bei Byte-Arrays 0 bis 255 bei (Intel-)Integern bis 18446744073709551616. Eine weitere Möglichkeit ist das Verpacken in eine Struktur, die dann "herumgezeigt" wird. Dabei ist der erste Eintrag explizit die Länge in gewünschter "Breite" und der Zweite ein Zeiger auf den reservierten Bereich. Da Du ja der "Reservierer" bist, kannst Du ja natürlich auch die gewünschten Parameter, wie z.B. die reservierte Größe ablegen.
Der Andere schrieb: > Eine Funktion die Arrays unterschiedlicher Dimensionen verarbeiten > können soll? Ja, warum nicht. Beispiel wäre Tensoralgebra. Allerdings würde da niemand erwarten, dass man ohne Signatur auskäme oder diese raten könnte.
Array schrieb: > Gibt es in C eine Möglichkeit die Dimensionen eines Arrays, zur Laufzeit > herauszubekommen? Was genau verstehst du unter "Dimensionen"? Es gibt die Dimension eines Arrays. Die ist 1 für ein eindimensionales Array, 2 für ein zweidimensionales, 3 für ein dreidimensionales usw. Betrachtet man ein (eindimensionales) Array als mathematischen Vektor, dann ist die Dimension dieses Vektors die Anzahl seiner Elemente. Alle diese Informationen sind aber zur Compilezeit bekannt, du brauchst also keine Abfrage zur Laufzeit. Vielleicht möchtest du deine Frage anhand eines Beispiel serläutern.
Amateur schrieb: > Du kannst es wie die Pascal-Leute machen. Die beginnen das Zählen bei 1. > So ist es möglich das Element 0 für eine Längeninfo zu verwenden. Nochmal zum mitlesen: Es geht NICHT um die Länge, sondern um die Dimension des Arrays! Johann L. schrieb: > Beispiel wäre Tensoralgebra. Auch da kann man die Dimension mitgeben. Mein Erfahrung: Zu 95% wollen Anfänger mehrdimensionale Arrays verwenden, und fast immer (Algebra Bibliotheken ausgenommen, aber wer schreibt sowas schon selbst) gibt es einfachere Alternativen.
Der Andere schrieb: > Nochmal zum mitlesen: > Es geht NICHT um die Länge, sondern um die Dimension des Arrays! Naja, dann nochmnal nachgefragt: Um WAS geht es Dir denn? In welchem KONTEXT möchtest Du die Dimension eines Arrays zur Laufzeit herausbekommen. Oder wie Yalu X. schrieb: > Vielleicht möchtest du deine Frage anhand eines Beispiel serläutern.
Achim S. schrieb: > In welchem > KONTEXT möchtest Du die Dimension eines Arrays zur Laufzeit > herausbekommen. Sei so gut und lese doch mal die Beiträge. Ich bin nicht der Fragesteller, nur der der dir bei deiner Leseschwäche helfen wollte.
Der Andere schrieb: > Nochmal zum mitlesen: > Es geht NICHT um die Länge, sondern um die Dimension des Arrays! Auch das nicht, sondern um die DimensionEN (im Plural): Array schrieb: > Gibt es in C eine Möglichkeit die Dimensionen eines Arrays, zur Laufzeit > herauszubekommen? Wenn er zu einem einzelnen Array nach mehreren Dimensionen fragt, kann das fast nur so gemeint sein, dass er zu
1 | int a[3][6][5][7]; |
nicht 4 (das wäre die Dimension des Arrays), sondern die Größen 3, 6, 5 und 7 ermitteln will. Das geht übrigens mit den folgenden Ausdrücken, die alle zur Compilezeit ausgewertet werden:
1 | sizeof a / sizeof *a // -> 3 |
2 | sizeof *a / sizeof **a // -> 6 |
3 | sizeof **a / sizeof ***a // -> 5 |
4 | sizeof ***a / sizeof ****a // -> 7 |
:
Bearbeitet durch Moderator
Der Andere schrieb: > Ich bin nicht der Fragesteller sorry, war keine Absicht. Aber (bitte erlaube mir die Spitze) warum sprichst Du auch für den UP wenn Du (genauso wie wir) keine Ahnung hast, was er will?
Achim S. schrieb: > Aber (bitte erlaube mir die Spitze) warum > sprichst Du auch für den UP wenn Du (genauso wie wir) keine Ahnung > hast, was er will? Weil ich dir erklären wollte was er meint.
Der Andere schrieb: > Weil ich dir erklären wollte was er meint. nichts für ungut, aber ich bin als erster auf die Dimensionen eingegangen. Achim S. schrieb: > Meinst Du, wieviele [ ] Paare das Array hat? > > Jedes Paar entspricht einer dereferenzierung mehr, schafft also einen > ganz anderen "Level" von Typ. auf dem Handy war es aber nicht so einfach so ausführlich zu schreiben wie später Yalu X.
@???? >> Du kannst es wie die Pascal-Leute machen. Die beginnen das Zählen bei 1. >> So ist es möglich das Element 0 für eine Längeninfo zu verwenden. >Nochmal zum mitlesen: >Es geht NICHT um die Länge, sondern um die Dimension des Arrays! Was Du in einen zusätzlichen Platzhalter hineinschreibst liegt doch bei Dir! Ob das Geburtsdatum Deiner Großmutter oder die Dimension - was auch immer Du damit meinst - ist doch gehopst wie gehüpft.
Yalu X. schrieb: > int a[3][6][5][7]; > > nicht 4 (das wäre die Dimension des Arrays), sondern die Größen 3, 6, 5 > und 7 ermitteln will. Genau. Nur ist sizeof zur Compilezeit, oder nicht!?
Amateur schrieb: > Du kannst es wie die Pascal-Leute machen. Die beginnen das Zählen bei 1. > So ist es möglich das Element 0 für eine Längeninfo zu verwenden. Na, na, na, so ist das bei Pascal aber nicht. Was du schreibst gilt für einen string a la Turbo und seinen Nachkommen, einen ganz speziellen Datentypen. Es wird aber nicht die Länge/Größe der Variablen angegeben, sondern die Länge der "gültigen" Zeichenkette innerhalb der Variablen. Bei Pascal kannst du ein array mit beliebigen Start- und Endindex erstellen: var GutesJahr: array[1995..2017] of boolean; Und den kleinsten bzw. größten Index erhälst du über GutesJahr[Low] bzw. High. <Ironie> Der Pascal und der C Compiler kennen die Größe eines array beim Compilerlauf. Der Pascal Compiler stellt dir die Werte zur Verfügung, der C Compiler nicht. </Ironie>
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.