Присваивание значений структурам (си)
От: Bystrii_Lis  
Дата: 20.12.11 13:33
Оценка:
Не вдаваясь в детали для чего и зачем так нужно, но хочется, чтобы было Красиво.
Хочу присвоить значения массиву структур, или одному из элементов массива, но сразу заполнить всю структуру, не обращаясь к её полям. Делаю, например, так:
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


Уже я и нагуглился, и наперепробовал разных вариантов и комбинаций — а всё равно очень хочется присвоить сразу всеё структуре. Не подскажете? Ну, наверняка же можно это как-то через указатель на этот массив реализовать...
Re: Присваивание значений структурам (си)
От: nen777w  
Дата: 20.12.11 13:44
Оценка:
struct tres treses[5] = {{1,"a"},{2,"b"},{3,"c"},{4,"d"},{5,"e"}};


Хотя это уже не присваивание а инициализация.
Re[2]: Присваивание значений структурам (си)
От: Bystrii_Lis  
Дата: 20.12.11 13:50
Оценка:
Здравствуйте, nen777w, Вы писали:

N>
N>struct tres treses[5] = {{1,"a"},{2,"b"},{3,"c"},{4,"d"},{5,"e"}};
N>


N>Хотя это уже не присваивание а инициализация.


Угу. Он тогда на повторную инициализацию ругается...
Re: Присваивание значений структурам (си)
От: k06a http://k06a.blogspot.com/
Дата: 20.12.11 13:56
Оценка:
Здравствуйте, 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>Уже я и нагуглился, и наперепробовал разных вариантов и комбинаций — а всё равно очень хочется присвоить сразу всеё структуре. Не подскажете? Ну, наверняка же можно это как-то через указатель на этот массив реализовать...


tres treses[5] = {{1,{'a','b'}}, {2,{'c','d'}}};
Re[2]: Присваивание значений структурам (си)
От: Bystrii_Lis  
Дата: 20.12.11 14:02
Оценка:
Здравствуйте, 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
Re: Присваивание значений структурам (си)
От: 0xABDAB Россия  
Дата: 20.12.11 14:04
Оценка:
Здравствуйте, Bystrii_Lis, Вы писали:

По-моему, массив в Си не является lvalue, поэтому присвоить ему что-то можно только при инициализации, как писали выше.
Re[2]: Присваивание значений структурам (си)
От: Bystrii_Lis  
Дата: 20.12.11 14:09
Оценка:
Здравствуйте, 0xABDAB, Вы писали:

ABD>Здравствуйте, Bystrii_Lis, Вы писали:


ABD>По-моему, массив в Си не является lvalue, поэтому присвоить ему что-то можно только при инициализации, как писали выше.


А если не всему массиву структур, а одному элементу?

treses[3]={1,"f"};


Эх... может через указатели как-нибудь извратится...
Re[3]: Присваивание значений структурам (си)
От: 0xABDAB Россия  
Дата: 20.12.11 14:13
Оценка: 3 (1)
Здравствуйте, Bystrii_Lis, Вы писали:

B_L>А если не всему массиву структур, а одному элементу?


treses[3]=(struct tres){1,"f"};
Re: Присваивание значений структурам (си)
От: Сыроежка  
Дата: 20.12.11 14:13
Оценка:
Здравствуйте, 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.
Меня можно встретить на www.cpp.forum24.ru
Re[2]: Присваивание значений структурам (си)
От: Bystrii_Lis  
Дата: 20.12.11 14:31
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Если я правильно вас понял, вы ищите путь, как присвоить значение структуре или элементу массива структур уже после объявления объекта, но схожим образом, как это деоается при инициализации объекта. Для этих целей вы можете воспользоваться составным литералом, если ваш компилятор поддерживает стандарт языка С99.


Ок, спасибо!
Re: Присваивание значений структурам (си)
От: Bystrii_Lis  
Дата: 20.12.11 14:33
Оценка:
Окончательно выглядит так, в двух вариантах (напрямую и через указатель)


#include <stdio.h>

struct tres {
int k;
char words[10];
};

int main () {

struct tres treses[5];
struct tres *pr;
pr=&treses[2];

treses[3]=(struct tres){1,"f"};
*pr=(struct tres){1,"f"};

printf("%d %s\n",pr->k,pr->words);
printf("%d %s\n",treses[3].k, treses[3].words);

return 0;
}

Всем спасибо!
Re[3]: Присваивание значений структурам (си)
От: uzhas Ниоткуда  
Дата: 20.12.11 14:33
Оценка:
Здравствуйте, Bystrii_Lis, Вы писали:

B_L>А если не всему массиву структур, а одному элементу?

вам уже порекомендовали использовать удобную иинициализацию только при определении переменной, других случаях она не скомпилируется
далее нужно почленно делать присвоения, либо воспользуйтесь низкоуровневыми функциями копирования структур:
пример:
Pod myArray[10] = {..blah-blah-blah..};
Pod newValue = {blah-blah};
memcpy(&myArray[3], &newValue, sizeof(Pod));
Re[4]: Присваивание значений структурам (си)
От: Bystrii_Lis  
Дата: 20.12.11 14:33
Оценка:
Здравствуйте, 0xABDAB, Вы писали:

ABD>
ABD>treses[3]=(struct tres){1,"f"};
ABD>


Спасибо!
Re[2]: Присваивание значений структурам (си)
От: uzhas Ниоткуда  
Дата: 20.12.11 14:44
Оценка:
Здравствуйте, 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>...............

3.3.16 Assignment operators
Syntax
assignment-expression:
conditional-expression
unary-expression assignment-operator assignment-expression

assignment-operator: one of
= *= /= %= += -= <<= >>= &= ^= |=

Constraints
An assignment operator shall have a modifiable lvalue as its left operand.

Re: Присваивание значений структурам (си)
От: MasterZiv СССР  
Дата: 20.12.11 16:53
Оценка:
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"}};

во-вторых, это должна быть ИНИЦИАЛИЗАЦИЯ,
а у тебя тут присваивание.


> Уже я и нагуглился, и наперепробовал разных вариантов и комбинаций — а всё равно

> очень хочется присвоить сразу всеё структуре. Не подскажете? Ну, наверняка же

Присвоить нельзя.
Только инициализировать.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Присваивание значений структурам (си)
От: MasterZiv СССР  
Дата: 21.12.11 12:59
Оценка:
On 12/20/2011 05:50 PM, Bystrii_Lis wrote:

> N>Хотя это уже не присваивание а инициализация.

>
> Угу. Он тогда на повторную инициализацию ругается...

Повторной инициализации не бывает.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Присваивание значений структурам (си)
От: MasterZiv СССР  
Дата: 21.12.11 13:01
Оценка:
On 12/20/2011 06:09 PM, Bystrii_Lis wrote:

> А если не всему массиву структур, а одному элементу?

>
> treses[3]={1,"f"};
>
>
>
> Эх... может через указатели как-нибудь извратится...

Заведи эталонный элемент массива. Или эталонный масив.
Заполни его инициализацией.
Затем "присваивай" значение конктерным перменным с
помощью memcpy() эталон --> переменная.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Присваивание значений структурам (си)
От: Bystrii_Lis  
Дата: 22.12.11 12:51
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>On 12/20/2011 05:50 PM, Bystrii_Lis wrote:


MZ>Повторной инициализации не бывает.


Сорьки, делает ворнинг на повторное объявление переменной.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.