реклама на сайте
подробности

 
 
> static const vs const, ошарашен!
ViKo
сообщение Jan 14 2015, 16:02
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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. И память используется сильно, не могу сказать, вся / не вся. Если компилируется, значит, есть куда пихать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Jan 14 2015, 16:47
Сообщение #2


Универсальный солдатик
******

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



Если задаю const chat *Text, что заставляет компилятор не извлекать строки прямо из flash-памяти? Я же их только читаю.
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 14 2015, 16:59
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(ViKo @ Jan 14 2015, 19:47) *
Если задаю const chat *Text, что заставляет компилятор не извлекать строки прямо из flash-памяти? Я же их только читаю.

Объявление переменной внутри ф-ции без "static" подразумевает, что переменная лежит на стеке, и всем совершенно все равно, только читаете Вы ее, или не только.
Так что, чтобы оно лежало во флеш - или объявляйте ВНЕ функции (тут static будет лишь ограничивать видимость идентификатора внутри файла, поэтому, он желателен, но не обязателен), или внутри функции, но обязательно со static.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Jan 14 2015, 19:03
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 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;
}

Умный компилятор сам должен разобраться в константах/переменных, а если он глючный и тупой, то придется глядеть в листинг.
Да, в случае с Ц++ статические объекты внутри функций ведут себя по-другому относительно чистого Ц.
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 14 2015, 19:20
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(CrimsonPig @ Jan 14 2015, 22:03) *
тут тоже будет на переменная на стеке ?

Если отключите все оптимизации, то должна быть именно там. Если включите, скорее всего этой переменной вообще не будет. Но не надо путать такой простой случай с массивом строк. Его в непосредственную константу не соптимизируешь. Разумеется, речь про С, без плюсов. С плюсами я не знаю, как оно обязано быть.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 23:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01607 секунд с 7
ELECTRONIX ©2004-2016