47 Stimmen

Mehrere Werte einem Array in C zuweisen

Gibt es eine Möglichkeit, dies in komprimierter Form zu tun?

GLfloat coordinates[8];
...
coordinates[0] = 1.0f;
coordinates[1] = 0.0f;
coordinates[2] = 1.0f;
coordinates[3] = 1.0f;
coordinates[4] = 0.0f;
coordinates[5] = 1.0f;
coordinates[6] = 0.0f;
coordinates[7] = 0.0f;
return coordinates;

Etwas wie coordinates = {1.0f, ...}; ?

4voto

Douglas Lovell Punkte 1446

Ich habe mich für eine Array-Initialisierungsmethode entschieden:

#include <stdarg.h>

void int_array_init(int *a, const int ct, ...) {
  va_list args;
  va_start(args, ct);
  for(int i = 0; i < ct; ++i) {
    a[i] = va_arg(args, int);
  }
  va_end(args);
}

wie genannt,

const int node_ct = 8;
int expected[node_ct];
int_array_init(expected, node_ct, 1, 3, 4, 2, 5, 6, 7, 8);

Die C99-Array-Initialisierung, wie diese:

const int node_ct = 8;
const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };

Und in der configure.ac :

AC_PROG_CC_C99

hatte den Compiler auf meiner Dev-Box vollkommen zufrieden. Der Compiler auf dem Server beschwerte sich mit:

error: variable-sized object may not be initialized
   const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };

et

warning: excess elements in array initializer
   const int expected[node_ct] = { 1, 3, 4, 2, 5, 6, 7, 8 };

für jedes Element

Sie beschwert sich zum Beispiel überhaupt nicht über:

int expected[] = { 1, 2, 3, 4, 5 };

Ich mag die Überprüfung der Größe, und dass die varargs Unterstützung robuster als die Unterstützung für den Array-Initialisierer handelt.

PR mit Beispielcode finden Sie unter https://github.com/wbreeze/davenport/pull/15/files

Betreffend https://stackoverflow.com/a/3535455/608359 von @paxdiablo, ich mochte es; aber, fühlte sich unsicher über die Anzahl der Male, die der Initialisierungszeiger Fortschritte synchronisiert mit der Anzahl der Elemente zugewiesen, um das Array. Im schlimmsten Fall bewegt sich der Initialisierungszeiger über die zugewiesene Länge hinaus. Daher enthält der Diff im PR,

  int expected[node_ct];
- int *p = expected;
- *p++ = 1; *p++ = 2; *p++ = 3; *p++ = 4;
+ int_array_init(expected, node_ct, 1, 2, 3, 4);

Le site int_array_init Methode wird sicher Junk zuweisen, wenn die Anzahl der Argumente kleiner ist als der node_ct. Die Junk-Zuweisung sollte einfacher sein zu erkennen und zu debuggen.

0voto

dpi Punkte 1665

Wenn Sie die gleichen Aufgaben in Ihrem Programm häufig ausführen und eine Abkürzung wünschen, ist die einfachste Lösung vielleicht, eine Funktion hinzuzufügen

static inline void set_coordinates(
        GLfloat coordinates[static 8],
        GLfloat c0, GLfloat c1, GLfloat c2, GLfloat c3,
        GLfloat c4, GLfloat c5, GLfloat c6, GLfloat c7)
{
    coordinates[0] = c0;
    coordinates[1] = c1;
    coordinates[2] = c2;
    coordinates[3] = c3;
    coordinates[4] = c4;
    coordinates[5] = c5;
    coordinates[6] = c6;
    coordinates[7] = c7;
}

und rufen dann einfach

GLfloat coordinates[8];
// ...
set_coordinates(coordinates, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f);

-1voto

Marek Punkte 1
typedef struct{
  char array[4];
}my_array;

my_array array = { .array = {1,1,1,1} }; // initialisation

void assign(my_array a)
{
  array.array[0] = a.array[0];
  array.array[1] = a.array[1];
  array.array[2] = a.array[2];
  array.array[3] = a.array[3]; 
}

char num = 5;
char ber = 6;

int main(void)
{
  printf("%d\n", array.array[0]);
// ...

  // this works even after initialisation
  assign((my_array){ .array = {num,ber,num,ber} });

  printf("%d\n", array.array[0]);
// ....
  return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X