Forum: Compiler & IDEs C: Dimensionen eines Arrays zur Laufzeit herausbekommen


von Array (Gast)


Lesenswert?

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

von Der Andere (Gast)


Lesenswert?

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 :-)

von Array (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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
von Der Andere (Gast)


Lesenswert?

Hmm, ich verstehe den "Use case" dafür nicht so richtig?
Eine Funktion die Arrays unterschiedlicher Dimensionen verarbeiten 
können soll?

von ui (Gast)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Amateur schrieb:
> Das geht nur, wenn Du das Array in einer eigenen Klasse versteckst

Hier geht es um C. Da gibt es keine Klassen.

von Markus F. (mfro)


Lesenswert?

Array schrieb:
> Gibt es in C eine Möglichkeit die Dimensionen eines Arrays, zur Laufzeit
> herauszubekommen?

Die einfache (und einzig richtige) Antwort lautet: nein.

von Amateur (Gast)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Der Andere (Gast)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Der Andere (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von A. S. (Gast)


Lesenswert?

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?

von Der Andere (Gast)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

@????
>> 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.

von Array (Gast)


Lesenswert?

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!?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Array schrieb:
> Nur ist sizeof zur Compilezeit, oder nicht!?

Ja. Umso besser, oder nicht?

von du du du (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.