C - Změnit všechny hodnoty pole struktur v jednom řádku

hlasů
3

Mohu prohlásit strukturu:

typedef struct
{
  int var1;
  int var2;
  int var3;
} test_t;

Pak vytvořit řadu těch structs konstrukce s výchozími hodnotami:

test_t theTest[2] =
{
   {1,2,3},
   {4,5,6}
};

Ale poté, co jsem vytvořil pole, existuje nějaký způsob, jak změnit hodnoty stejným způsobem jako já výše, s použitím pouze jeden řádek s uvedením každé hodnoty výslovně bez smyčce?

Položena 03/08/2009 v 19:02
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
8

V C99 můžete přiřadit každé struktury v jedné linii. Nemyslím si, že můžete přiřadit celou řadu structs v jedné linii ačkoli.

C99 představuje složené literály. Podívejte se na Dr. Dobbs článek zde: The New C: Sloučenina literály

theTest[0] = (test_t){7,8,9};
theTest[1] = (test_t){10,11,12};

Dalo by se přidělit na ukazatel, jako je tento:

test_t* p; 
p = (test_t [2]){ {7,8,9}, {10,11,12} };

Dalo by se memcpy použít také:

memcpy(theTest, (test_t [2]){ {7,8,9}, {10,11,12} }, sizeof(test_t [2]);

Výše testován s GCC -std = C99 (verze 4.2.4) na Linuxu.

Měli byste si přečíst článek Dr. Dobbs pochopit, jak sloučenina literals fungovat.

Odpovězeno 03/08/2009 v 19:11
zdroj uživatelem

hlasů
1

V případě, že chcete nastavit hodnoty na nulu (nebo -1), můžete použít memset:

memset(struct_array, 0, sizeof(struct_array));
memset(struct_array, -1, sizeof(struct_array));
Odpovězeno 03/08/2009 v 19:09
zdroj uživatelem

hlasů
0

Pokud jsou proměnné jsou zkopírovány z jiného zdroje, můžete použít metodu jako memcpy přímo přepsat hodnoty struct.

Nicméně, jazyk neposkytuje přímý způsob, jak jen nastavit hodnoty, kromě nastavení jednotlivých prvků.

Odpovězeno 03/08/2009 v 19:06
zdroj uživatelem

hlasů
0

Myslím, že ne, může pouze init pole tímto způsobem vy. ale můžete změnit hodnoty konstrukcí pomocí ‚jednořádkové‘ metoda

Odpovězeno 03/08/2009 v 19:05
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more