Array-Feinheiten

Status
Nicht offen für weitere Antworten.

con-f-use

Erfahrenes Mitglied
Hallo,

mir ist gerade aufgefallen, das folgendes (zumindest im gcc) nicht funktioniert:
Code:
double arr[5];

if( argv[1] == '1' )
    arr = { 1, 2, 3, 4, 5 };
else
    arr = { 11, 12, 13, 14, 15 };
Anscheidend möchte er die Zuweisung mit geschweiften Klammern bei der Deklaration des Arrays haben. Steht die Klammer-Liste nicht bei der Deklaration kommt ein Fehler. Gibt es in C eine Möglichkeit jenseits der Deklaration dem Array eine Liste von Werten zuzuweisen? Wenn möglich ohne den Schreibaufwand von folgendem:
Code:
double arr[5];

if( argv[1] == '1' ) {
    arr[0] = 1;
    arr[1] = 2;
    //... etc.
} else {
    arr[0] = 11;
    arr[1] = 12;
    //... etc.
}
Das ist natürlich nur ein Minimalbeispiel. Bei den Array-Einträgen handelt es sich natürlich nicht um so was einfaches wie "1,2,3,4,5" was man in eine for-Schleife packen könnte und es sind auch mehr als fünf.

Danke im Voraus, lg
con-f-use
 
Okay. Dank dir. Wieder mal ein Punkt auf der Liste der vielen contra-intuitiven Dinge in C. Wenigstens nicht so schlimm wie FOTRAN. Weißt du zufällig auch den Grund, warum man's nicht in die Sprache eingebaut hat?
 
Okay. Dank dir. Wieder mal ein Punkt auf der Liste der vielen contra-intuitiven Dinge in C. Wenigstens nicht so schlimm wie FOTRAN. Weißt du zufällig auch den Grund, warum man's nicht in die Sprache eingebaut hat?
Vermutlich weil Arrays keine Größeninformationen besitzen und falls sie welche hätten, Operationen mit Arrays unterschiedlicher Größe zu "Überraschungen" / undefiniertem Verhalten führen könnte.

Übrigens gibt es in C99 die Möglichkeit "compound literals" zu verwenden, diese sind allerdings beschränkt auf konstante Ausdrücke und funktionieren nur mit Zeigern, eine direkte Zuweisung an ein Array ist nicht erlaubt. Ist also nicht das was du gefragt hast:
C:
int* a;
a = (int[]){ 1, 2, 3 };
Der GCC unterstützt dieses Feature auch im C89 Modus.

In diesem Sinne kann man das was du machen wolltest natürlich auch auf diese Weise erreichen:
C:
double* arr;
double a1[5] = { 1, 2, 3, 4, 5 };
double a2[5] = { 11, 12, 13, 14, 15 };
 
if( argv[1] == '1' )
    arr = a1;
else
    arr = a2;
Gruß
 
Naja, es ist auf jeden Fall eine Seltsamkeit von C. Mit Pointer-Operationen oder dem []-Operator, kann man ja auch ähnlichen Unfug treiben.

Ob ich jetzt bei "double a[5];" ein "a[6] = 10;" oder ein "a = { 1,2,3,4,5,10}" mache ist auch schon wurscht.

Ich danke dir auf jeden Fall für's bestätigen meiner Befürchtung. Immer wieder schön, auf hilfsbereite Leute zu treffen.
 
Status
Nicht offen für weitere Antworten.
Zurück