|
static const vs const, ошарашен! |
|
|
|
Jan 14 2015, 16:02
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Добавил к программе еще немного вывода текстовых строк, задал их в виде массива, условно: const char *Text[] = { "text1", "text2", "text3" }; И функцию, естественно, для вывода, аналогичную другим таким же. И - завалил программу! Улетает при старте в HardFault, как понял, из недр RTOS (Keil CMSIS-RTOS RTX), пытаясь выделить некую память из пула. Я и размер кучи изменял, и стек задач, и ничего не помогает. Стал с прошлым вариантом сравнивать (вот где пришлись кстати TortoiseHg c Total Commander). Делаю небольшие изменения, компилирую, запускаю. Дошел до этого массива. И как только добавил static const char *Text.... все заработало. Поможите люди добрые, объясните, как такое могёт быть? Проект выложить не могу, он великий и коммерческий. Хотелось бы понять принцип. Файлов в проекте - штук 20. И память используется сильно, не могу сказать, вся / не вся. Если компилируется, значит, есть куда пихать?
|
|
|
|
|
 |
Ответов
|
Jan 14 2015, 16:59
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(ViKo @ Jan 14 2015, 19:47)  Если задаю const chat *Text, что заставляет компилятор не извлекать строки прямо из flash-памяти? Я же их только читаю. Объявление переменной внутри ф-ции без "static" подразумевает, что переменная лежит на стеке, и всем совершенно все равно, только читаете Вы ее, или не только. Так что, чтобы оно лежало во флеш - или объявляйте ВНЕ функции (тут static будет лишь ограничивать видимость идентификатора внутри файла, поэтому, он желателен, но не обязателен), или внутри функции, но обязательно со static.
|
|
|
|
|
Jan 14 2015, 19:03
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(SM @ Jan 14 2015, 16:59)  Объявление переменной внутри ф-ции без "static" подразумевает, что переменная лежит на стеке, и всем совершенно все равно, только читаете Вы ее, или не только. Так что, чтобы оно лежало во флеш - или объявляйте ВНЕ функции (тут static будет лишь ограничивать видимость идентификатора внутри файла, поэтому, он желателен, но не обязателен), или внутри функции, но обязательно со static. Ну-ну... тут тоже будет на переменная на стеке ? int Foo(int arg) { const int A = 23; return A+arg; } Умный компилятор сам должен разобраться в константах/переменных, а если он глючный и тупой, то придется глядеть в листинг. Да, в случае с Ц++ статические объекты внутри функций ведут себя по-другому относительно чистого Ц.
|
|
|
|
Сообщений в этой теме
ViKo static const vs const Jan 14 2015, 16:02 SM а это сильно зависит от того, где определены эти с... Jan 14 2015, 16:19 ViKo Массив - внутри функции. Имя - уникальное (реально... Jan 14 2015, 16:23 SM Если это внутри функции, то, возможно, просто стек... Jan 14 2015, 16:40 ViKo Посмотрел листинги со static и без.
Для const при ... Jan 14 2015, 20:02 SM Ну, о чем я и говорил. Скорее всего у Вас стека ма... Jan 14 2015, 20:06 ViKo Я сделал (?, проверю работоспособность завтра) ина... Jan 14 2015, 20:12 SM Цитата(ViKo @ Jan 14 2015, 23:12) Теперь ... Jan 14 2015, 20:15  ViKo Цитата(SM @ Jan 14 2015, 23:15) Только на... Jan 14 2015, 20:18 CrimsonPig Цитата(ViKo @ Jan 14 2015, 20:12) Я сдела... Jan 14 2015, 23:38 ViKo static const *text[] используется у отцов-основате... Jan 15 2015, 01:42 ViKo Проверил. Все работает.
Заодно посмотрел, что полу... Jan 15 2015, 09:35 Andrew2000 на эту тему:
http://rus-linux.net/MyLDP/algol/Sha... Jan 15 2015, 18:17 SM Ну, все в строгом соответствии с ANSI/IEC. Вывод и... Jan 15 2015, 09:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|