C: Dimensionen eines Arrays zur Laufzeit herausbekommen

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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.