![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Доброе время суток.
Такой код:
Выдаются ошибки: (все ко второй строке) error C2057: expected constant expression error C2466: cannot allocate an array of constant size 0 error C2133: 'lettersArray' : unknown size Если вызов функции заменить на значение, то ошибка пропадает, но нужно-то присвоить значение функции. Подскажите, пожалуйста, в чём проблема? Это сообщение отредактировал(а) KaraKum - 1.6.2008, 08:53 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
размер такого массива должен быть не просто константой, а константой, известной на момент компиляции
если он становится известен только в процессе работы программы, придётся использовать динамическую работу с памятью -------------------- qqq |
|||
|
||||
ifndef |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 25.5.2008 Где: Россия, Москва Репутация: нет Всего: нет |
Подкреплю ответ maxim1000 примером..
![]() Можно сделать так:
|
|||
|
||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Компилируется.
Большое спасибо ![]() Вопрос помечен как решённый. |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Зававно, что в C99 это работает.
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
и должно работать
ограничение-то надуманное... думаю просто в плюсах не стали убирать, так как есть vector Добавлено через 28 секунд практически то-же самое, что и delete[] |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну как сказать... в голову приходят 2 аргумента: 1. такие массивы могут быть использованы не только в каком-то блоке кода, но и, например, в структуре, там (по крайней мере мне) не видно простого способа сделать возможным инициализацию константой, неизвестной на момент компиляции (нужно учесть, что кто-то захочет сделать из структур массив, и нужно будет знать их размер), получается нужно разделять понятие такого массива на два: те, которые используются в структурах, и в блоках кода, а понятий в C++ и так немало 2. сужается простор для оптимизации: если у нас есть массив, а за ним какая-то локальная переменная, её адрес относительно кадра стека, используемого в функции становится непостоянным и не может быть "зашит" в ассемблерный код, если таких массивов несколько, придётся вычислять несколько адресов при входе в функцию (не или при первом использовании) Это сообщение отредактировал(а) maxim1000 - 2.6.2008, 10:35 -------------------- qqq |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Судя по сообщениям об ошибках, это компилятор от MS. На сколько мне известно, ее компиляторы не соответствуют стандарту c99.
|
|||
|
||||
MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
может GCC, к примеру, локальные переменные функции идентифицирует через RBP (EBP) а формирование массива переменной длины идет через декрементацию RSP (ESP)
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ключевое слово - "массива" но ведь локальных массивов тоже может быть несколько, как и локальных переменных я сомневаюсь, что подобный метод может нормально масштабироваться (разве что резервируя под это всё новые и новые регистры) или я неправильно понял смысл? Это сообщение отредактировал(а) maxim1000 - 5.6.2008, 15:12 -------------------- qqq |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
maxim1000, RSP - это указатель вершины стека. Его никто не резервирует
![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну хорошо, использует ![]() но основная мысль была про масштабируемость ну никак я не пойму, как можно расширить этот подход для нескольких локальных массивов -------------------- qqq |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
смотри пример там два локальных массива с тем же успехом их может быть и 3, и 4, и 5, и... здесь ключевой момент для понимания - это то, что переменная-массив является переменной-указателем, который содержит адрес массива в стеке Это сообщение отредактировал(а) MAKCim - 5.6.2008, 20:53 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
неее, я имел в виду, что если два локальных массива в самой функции, т.е.
здесь по-любому придётся вычислять адрес как минимум одного массива, а не вшивать сразу в ассемблерный код -------------------- qqq |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
а как ты предлагаешь "вшивать" адрес чего-либо в стеке? ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |