Offene Cee FAQ / Nichtlineares Feld Als Lineares Feld
 
StartSeite | OffeneCeeFAQ/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Veränderung (letzte Änderung) (Korrektur, Autor, Normalansicht)

Verändert: 99c99
KategorieCee
KategorieC KategorieCee KategorieSchellong

Frage

Kann ein zwei- oder mehrdimensionaler Array als linearer Array aufgefasst und bearbeitet werden?

Antwort

Ja das ist möglich, denn der C-Standard garantiert:

Beispiel

Hinter der Frage steckt folgender Gedanke:

TYP a[2][5];
TYP b[3][4][5];

void TypArrayAction(TYP *ptyp,int n) {
  while(n--) {
    TypAction(ptyp++);
  }
}
...
TypArrayAction((TYP *)a,10);
TypArrayAction((TYP *)b,60);

oder konkreter z.B. für das Löschen beliebiger double-Arrays:

double a[2][5];
double b[3][4][5];

void DoubleArrayClear(double *pd,long n) {
  while(n--) {
    *pd++ =0.0;
  }
}
...
DoubleArrayClear((double *)a,10);
DoubleArrayClear((double *)b,60);

Diskussion

Welche Stellen im Standard garantieren, dass es zwischen den SubArrays kein störendes Padding gibt? -- HelmutLeitner

Siehe oben. SubArrays sind Array-ELEMENTE! Aus meiner Sicht kann jeder Pointer aus einem Array wie ein malloc-Pointer verwendet werden, sofern man korrektes Alignment beachtet und innerhalb der Byte-Grenzen bleibt! --hs

Welche Standard-Abschnitte garantieren das?

Operatoren == !=
...
[#6]  Two  pointers compare equal if both are null pointers,
both are pointers to the same object (including a pointer to
an  object  and  a  subobject at its beginning) or function,
both are pointers to one past the last element of  the  same
array object, or one is a pointer to one past the end of one
array object and the other is a pointer to the  start  of  a
different  array  object  that happens to immediately follow
the first array object in the address space.80)

80)Two objects may be adjacent in memory  because  they  are
   adjacent  elements  of a larger array or adjacent members
   of a structure with no padding between them,  or  because
   the  implementation  chose  to place them so, even though
   they are unrelated.  If prior invalid pointer operations,
   such as accesses outside array bounds, produced undefined
   behavior, the effect of subsequent  comparisons  is  also
   undefined.

--hs

Ich versteh das nicht ganz :-(( . Was garantiert mir, dass ein Compiler z. B. bei einem "char array[4][7];" nicht ein Padding-Byte ans Ende jedes SubArrays legt? -- hl

Der obenstehende Text allein garantiert das bereits eindeutig und zweifelsfrei:
Zwei Pointer sind gleich, wenn der eine um eins hinter ein Array-Objekt zielt
und der andere auf den Start eines anderen Array-Objektes, das sofort dem
erstgenannten im Adressraum folgt. 80)
80)Zwei Objekte können im Speicher aneinanderstoßend sein, weil sie die
   aneinanderstoßenden Elemente eines größeren Arrays sind.

An anderer Stelle sagt der Standard:
Arrays bestehen aus einer ununterbrochenen Folge von Elementen.
SubArrays sind Element-Objekte eines übergeordneten Arrays (Dimension).
Obwohl der Standard hier blöde formuliert und ebenso komische Worte wählt, habe ich dennoch keine Probleme, das eindeutig zu verstehen.
Der Standard muß doch nicht explizit sagen: "Hinter SubArrays darf kein Padding stehen."
Wozu? Der Standard verbietet doch durch massenhaft vorhandene andere Formulierungen, daß Padding innerhalb von Arrays vorkommen kann.
Beispw. steht oben "with no padding between them" nur bei Struktur, nicht aber darüber bei Array - warum denn wohl?! --hs

Danke, jetzt versteh ich's auch. Ich hab's immer verwendet, war mir aber nicht sicher, ob ich mich damit nicht an der Grenze des Standards bewege. Andererseits verstehe ich jetzt auch deine Anspielung auf malloc. Wäre ein Padding zwischen den Elementen zugelassen, könnte malloc(Dim1*Dim2*..*DimN*sizeof(Element)) einen Speicherblock liefern, der zu klein für den Speicherbedarf des Arrays wäre (was natürlich undenkbar ist). -- hl

So ist es. Der Standard müßte andernfalls unbedingt explizit verlangen, daß man Arrays per malloc() stets nur per sizeof(long[10][20]) und vergleichbar anfordert, damit die Sache vollkommen gleichsinnig bleibt und der Compiler dies erkennen kann.
Und er müßte auch noch bei der Formel D1xD2xD3x?...xDn eine Erwähnung vornehmen. --hs


KategorieC KategorieCee KategorieSchellong
StartSeite | OffeneCeeFAQ/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 29. November 2007 8:42 (diff))
Suchbegriff: gesucht wird
im Titel
im Text