Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.233.41] |
|
Сообщ.
#1
,
|
|
|
Добрый день всем, подзабыл немного Си, ооочень давно не применял. Вопрос с массивами. Можно инициализировать массив следующим образом
int i[] = {0, 1, 2, 3}; но после изменить его таким же образом нельзя, то есть строка i={6, 7, 8, 9, 7, 8, 9}; приведет к ошибке компиляции, так вот не пойму что не так, почему так нельзя и как можно не перечисляя каждый элемент массива |
Сообщ.
#2
,
|
|
|
В текстовой части стандартов я не силен.
Но, i - это константный указатель. И вы ему пытаетесь присвоить другой указатель. примерно так, корректность не ручаюсь, код набираю тут, как то так примерно, использовать специальные классы. std::array<int, 4> aaa = {0, 1, 2, 3}; aaa = std::array<int, 5>{4, 5, 6, 7, 8}; ну или так: int aaa[] = {0, 1 ,2 ,3}; int bbb[] = {4, 5, 6, 7}; for(int i= 0;i<4;++i) aaa[i] = bbb[i]; размеры у массивов должны совпадать. |
Сообщ.
#3
,
|
|
|
Цитата Black_Dragon @ Та не. Синтаксически список значений через , внутри {} является инициализатором, а грамматически инициализаторы позволяются только в определениях. Выражения являются выполняемыми инструкциями, а не определениями, поэтому инициализаторы в них недопустимы. В текстовой части стандартов я не силен. Но, i - это константный указатель. И вы ему пытаетесь присвоить другой указатель. |
Сообщ.
#4
,
|
|
|
Цитата Qraizer @ Та не. Синтаксически список значений через , внутри {} является инициализатором, а грамматически инициализаторы позволяются только в определениях. Выражения являются выполняемыми инструкциями, а не определениями, поэтому инициализаторы в них недопустимы. спасибо, коротко и ясно ))) Цитата Black_Dragon @ примерно так, корректность не ручаюсь, код набираю тут, как то так примерно, использовать специальные классы. std::array<int, 4> aaa = {0, 1, 2, 3}; aaa = std::array<int, 5>{4, 5, 6, 7, 8}; Black_Dragon, классы не могу использовать ибо чистый Си Всем спасибо! Добавлено не поставил галочку ( |
Сообщ.
#5
,
|
|
|
Цитата Qraizer @ Та не. Синтаксически список значений через , внутри {} является инициализатором, а грамматически инициализаторы позволяются только в определениях. Выражения являются выполняемыми инструкциями, а не определениями, поэтому инициализаторы в них недопустимы. И да, и нет, ИМХО! "Инициализаторы", вангую, те же операторы. Пример части кода (x86_x64 gcc 10.1): const int A[]={0,1,2,3,4,5,6,7,8,9}; ... трансформируется в: mov DWORD PTR [rbp-48], 0 mov DWORD PTR [rbp-44], 1 mov DWORD PTR [rbp-40], 2 mov DWORD PTR [rbp-36], 3 mov DWORD PTR [rbp-32], 4 mov DWORD PTR [rbp-28], 5 mov DWORD PTR [rbp-24], 6 mov DWORD PTR [rbp-20], 7 mov DWORD PTR [rbp-16], 8 mov DWORD PTR [rbp-12], 9 |
Сообщ.
#6
,
|
|
|
Цитата Pit-Bul @ классы не могу использовать ибо чистый Си DEFINE-ы Типа так у меня #define RESETVAR(var, def) auto old = var; var = def; return old; bool GetResVisible() { RESETVAR(m_Visible, false) } #define cp_arr(t, a, b) { t tmp[] = b; for(int i = 0; i < size_of(tmp); ++i) a[i] = tmp[i];}; cp_arr(int, i, {5, 6, 7, 8}) |
Сообщ.
#7
,
|
|
|
Цитата Black_Dragon @ cp_arr(int, i, {5, 6, 7, 8}) i что тут делает? |
Сообщ.
#8
,
|
|
|
Цитата prografix @ i что тут делает? Наверно дестенейшен. Цитата Pit-Bul @ int i[] = {0, 1, 2, 3}; |
Сообщ.
#9
,
|
|
|
Цитата { int tmp[] = {5, 6, 7, 8}; for(int i = 0; i < size_of(tmp); ++i) i[i] = tmp[i];}; Это будет работать? |
Сообщ.
#10
,
|
|
|
Цитата prografix @ Это будет работать? Как идея для размышления, набранная в блокноте, да... А если брать нормальны редактор, то вот так: #define singleArgument(...) __VA_ARGS__ #define cp_arr(t, a, b) { t tmp[] = b; int ss = sizeof(tmp) / sizeof(t); for(int idx = 0; idx < ss; ++idx) a[idx] = tmp[idx];}; int ai[] = {1, 2, 3, 4}; cp_arr(int, ai, singleArgument({5, 6, 7, 8})) |