Не вдаваясь в детали для чего и зачем так нужно, но хочется, чтобы было Красиво.
Хочу присвоить значения массиву структур, или одному из элементов массива, но сразу заполнить всю структуру, не обращаясь к её полям. Делаю, например, так:
struct tres {
int k;
char words[10];
};
int main () {
struct tres treses[5];
treses={1,"a",2,"b",3,"c",4,"d",5,"e"};
return 0;
}
Компилятор ругается:
"ttt.c", line 9: syntax error before or at: {
"ttt.c", line 9: warning: syntax error: empty declaration
Уже я и нагуглился, и наперепробовал разных вариантов и комбинаций — а всё равно очень хочется присвоить сразу всеё структуре. Не подскажете? Ну, наверняка же можно это как-то через указатель на этот массив реализовать...
Здравствуйте, Bystrii_Lis, Вы писали:
B_L>Не вдаваясь в детали для чего и зачем так нужно, но хочется, чтобы было Красиво. B_L>Хочу присвоить значения массиву структур, или одному из элементов массива, но сразу заполнить всю структуру, не обращаясь к её полям. Делаю, например, так: B_L>
B_L>struct tres {
B_L>int k;
B_L>char words[10];
B_L>};
B_L>int main () {
B_L>struct tres treses[5];
B_L>treses={1,"a",2,"b",3,"c",4,"d",5,"e"};
B_L>return 0;
B_L>}
B_L>
B_L>Компилятор ругается:
B_L>
B_L>"ttt.c", line 9: syntax error before or at: {
B_L>"ttt.c", line 9: warning: syntax error: empty declaration
B_L>Уже я и нагуглился, и наперепробовал разных вариантов и комбинаций — а всё равно очень хочется присвоить сразу всеё структуре. Не подскажете? Ну, наверняка же можно это как-то через указатель на этот массив реализовать...
Здравствуйте, k06a, Вы писали:
K>tres treses[5] = {{1,{'a','b'}}, {2,{'c','d'}}};
У меня в примере структура из двух полей (int, char[10]), а у вас что-то более изощрённое... Но объявление имени структуры перед присваиванием выдаёт ошибку:
"ttt.c", line 10: undefined symbol: tres
"ttt.c", line 10: syntax error before or at: treses
"ttt.c", line 10: warning: syntax error: empty declaration
Здравствуйте, 0xABDAB, Вы писали:
ABD>Здравствуйте, Bystrii_Lis, Вы писали:
ABD>По-моему, массив в Си не является lvalue, поэтому присвоить ему что-то можно только при инициализации, как писали выше.
А если не всему массиву структур, а одному элементу?
treses[3]={1,"f"};
Эх... может через указатели как-нибудь извратится...
Здравствуйте, Bystrii_Lis, Вы писали:
B_L>Не вдаваясь в детали для чего и зачем так нужно, но хочется, чтобы было Красиво. B_L>Хочу присвоить значения массиву структур, или одному из элементов массива, но сразу заполнить всю структуру, не обращаясь к её полям. Делаю, например, так: B_L>
B_L>struct tres {
B_L>int k;
B_L>char words[10];
B_L>};
B_L>int main () {
B_L>struct tres treses[5];
B_L>treses={1,"a",2,"b",3,"c",4,"d",5,"e"};
B_L>return 0;
B_L>}
B_L>
B_L>Компилятор ругается:
B_L>
B_L>"ttt.c", line 9: syntax error before or at: {
B_L>"ttt.c", line 9: warning: syntax error: empty declaration
B_L>Уже я и нагуглился, и наперепробовал разных вариантов и комбинаций — а всё равно очень хочется присвоить сразу всеё структуре. Не подскажете? Ну, наверняка же можно это как-то через указатель на этот массив реализовать...
Если я правильно вас понял, вы ищите путь, как присвоить значение структуре или элементу массива структур уже после объявления объекта, но схожим образом, как это деоается при инициализации объекта. Для этих целей вы можете воспользоваться составным литералом, если ваш компилятор поддерживает стандарт языка С99.
Здравствуйте, Сыроежка, Вы писали:
С>Если я правильно вас понял, вы ищите путь, как присвоить значение структуре или элементу массива структур уже после объявления объекта, но схожим образом, как это деоается при инициализации объекта. Для этих целей вы можете воспользоваться составным литералом, если ваш компилятор поддерживает стандарт языка С99.
Здравствуйте, Bystrii_Lis, Вы писали:
B_L>А если не всему массиву структур, а одному элементу?
вам уже порекомендовали использовать удобную иинициализацию только при определении переменной, других случаях она не скомпилируется
далее нужно почленно делать присвоения, либо воспользуйтесь низкоуровневыми функциями копирования структур:
пример:
Pod myArray[10] = {..blah-blah-blah..};
Pod newValue = {blah-blah};
memcpy(&myArray[3], &newValue, sizeof(Pod));
Здравствуйте, 0xABDAB, Вы писали:
ABD>Здравствуйте, Bystrii_Lis, Вы писали:
ABD>По-моему, массив в Си не является lvalue, поэтому присвоить ему что-то можно только при инициализации, как писали выше.
все же уточню: массив (точнее выражение "имя переменной типа массив") является lvalue, однако во многих случаях преобразуетсяв указатель на первый элемент, который уже не является lvalue
массив не является modifiable lvalue, поэтому ему нельзя ничего присваивать
3.2.2.1 Lvalues and function designators
An lvalue is an expression (with an object type or an incomplete
type other than void) that designates an object. /24/ When an object
is said to have a particular type, the type is specified by the lvalue
used to designate the object. A modifiable lvalue is an lvalue that
does not have array type, does not have an incomplete type, does not
have a const-qualified type, and if it is a structure or union, does
not have any member (including, recursively, any member of all
contained structures or unions) with a const-qualified type.
.................<skipped>...............
Except when it is the operand of the sizeof operator or the unary &
operator, or is a character string literal used to initialize an array
of character type, or is a wide string literal used to initialize an
array with element type compatible with wchar_t, an lvalue that has
type ``array of type '' is converted to an expression that has type
``pointer to type '' that points to the initial member of the array
object and is not an lvalue.
.................<skipped>...............
On 12/20/2011 05:33 PM, Bystrii_Lis wrote:
> Хочу присвоить значения массиву структур, или одному из элементов массива,
memcpy()
но > сразу заполнить всю структуру, не обращаясь к её полям. Делаю, например, так:
Если одинаковое значение -- memset. Разное --- почленное присваивание. > struct tres treses[5]; > > treses={1,"a",2,"b",3,"c",4,"d",5,"e"};
Во-первых, надо как минимум либо
treses[0] = {1,"a"};
либо
treses[] = {{1,"a"},{2, "bee"}, {3,"cee"}};
во-вторых, это должна быть ИНИЦИАЛИЗАЦИЯ,
а у тебя тут присваивание.
> Уже я и нагуглился, и наперепробовал разных вариантов и комбинаций — а всё равно > очень хочется присвоить сразу всеё структуре. Не подскажете? Ну, наверняка же
On 12/20/2011 06:09 PM, Bystrii_Lis wrote:
> А если не всему массиву структур, а одному элементу? > > treses[3]={1,"f"}; > > > > Эх... может через указатели как-нибудь извратится...
Заведи эталонный элемент массива. Или эталонный масив.
Заполни его инициализацией.
Затем "присваивай" значение конктерным перменным с
помощью memcpy() эталон --> переменная.