C: Dimensionen eines Arrays zur Laufzeit herausbekommen

Gast #4896301
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 :-)
Gast #4896326
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.
Gast #4896355
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.
Gast #4896392
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.
Gast #4896411
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.
Gast #4896440
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.
Moderator #4896518
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.
Gast #4896520
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.
Moderator #4896604
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
Gast #4896677
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.
Gast #4896683
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.
Gast #4898068
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>

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren