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

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> перезапуск программы, непонятно почему.
prottoss
сообщение Jan 19 2007, 11:11
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(xemul @ Jan 19 2007, 04:20) *
Цитата(prottoss @ Jan 18 2007, 22:04) *

Цитата(xemul @ Jan 19 2007, 01:59) *
Цитата(prottoss @ Jan 18 2007, 21:43) *

Канешна, это все здорово очень, объясните тада, умные сотоварищи, зачем мне указывать размер стека данных, еслиФ все равно компилятор и иже с ними, создаст массив в этом самом стекеданных, то бишь нарушит мое НЕОСПОРИМОЕ правило???

Не понял про "мое НЕОСПОРИМОЕ правило".
Вы же можете среднепотолочно прикинуть требуемый размер стека с учетом вложенности подпрограмм (и их потребностей для локальных переменных) и прерываний.
А у компилятора по стеку правило одно: сказали "Отсель", значит так и будет.
Угу, а тада зафига мне куча в Си??? Без плюсиков...

Повторюсь за всех, уже говоривших об этом: куча используется для динамического выделения памяти, автоматические переменные обычно размещаются на стеке.
Цитата
Цитата(xemul @ Jan 19 2007, 01:59) *
Вы же можете среднепотолочно прикинуть требуемый размер стека
Гон всезнайки????????????????????????

Вам не доводилось этим заниматься и установки стека по умолчанию достаточно? Ну и слава богу и разработчикам используемых Вами компиляторов.
Если помните, причина возникновения этого треда крылась в некорректной работе со стеком. Подобные треды возникают достаточно регулярно, и в них неоднократно обсуждались способы контроля переполнения и оценки требуемой глубины стека. Кста, Вы в них активно участвовали. Не отложилось?
И, плз, если Вы чего-то не знаете, не выставляйте это напоказ несколько агрессивным образом.
Извиняюсь, был не прав smile.gif


--------------------
Go to the top of the page
 
+Quote Post
makc
сообщение Jan 19 2007, 11:58
Сообщение #47


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Предложение ко всем участникам форума - квотить меньше и аккуратнее дабы не подпадать под предупреждение по пункту правил 3.4 (оверквотинг).


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 19 2007, 12:06
Сообщение #48


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(SasaVitebsk @ Jan 19 2007, 01:21) *
Я не путаюсь в терминах. Я пишу "В библиотеках которые я выкладывал по поводу 18b20 применено динамическое выделение памяти.
Да, после приведенного кода снимаю все возражения и обвинения smile.gif Извиняюсь, не смотрел ваши библиотеки, ограничился лишь анализом приведенного куска. Подумал, что раз уж вы выложили кусочек кода, то решили облегчить мне задачу поиска исходников этих библиотек и в представленном коде есть все, что необходимо для обсуждения.
Цитата(SasaVitebsk @ Jan 19 2007, 01:21) *
Это было выложено в библиотеках для всеобщего 18.10.2006, что явно раньше этой дискусии.
Бывает, что некоторые темы я пропускаю wink.gif
Цитата(SasaVitebsk @ Jan 19 2007, 01:21) *
А примером по локальному массиву, я возразил что он не всегда ложится на стэк. В моём случае компилятор при оптимизации разместил его в регистрах.
Это да, с этим я не спорю. Я пытался спорить с чьим-то утверждением, что компилятор может разместить его в куче.
Цитата(SasaVitebsk @ Jan 19 2007, 01:21) *
Вы меня не поняли. Я имел в виду следующее. Представьте что я выполнил процедуру определения датчиков OW_cnt_device() и получил указатель на свободное место в куче. После этого компилятор без моего ведома разместил там ещё какое-то колличество переменных.
Где там? В куче? Зарадибога. Заметьте, вы получили указатель не "на свободное место в куче", а на свободный участок указанного вами размера. В этот участок никто больше не залезет. Но и вы не имеете права лезть за границы этого участка.
Цитата(SasaVitebsk @ Jan 19 2007, 01:21) *
Не зная об этом я беру и выполняю операцию OW_free(). В результате происходит крах проги. Поэтому я и высказал сомнение о реальности.
Никакого краха. В кучу возвращается выделенный вам участок, на который указывал OW_Rom_Device. Остальные участки если и были выделены кому-то без вашего ведома продолжают существовать.

Цитата(SasaVitebsk @ Jan 19 2007, 01:21) *
Я редко высказываюсь категорично. Приведу пример. В серьёзных (во всяком случае я об этом читал) системах/компиляторах (В винде этого нет) существуют так называемые "сборщики мусора".
Тут я тоже не буду утверждать категорично - изучал вопрос довольно поверхностно и для аргументированной беседы мне нужно обратиться к литературе, а литература в данный момент не доступна (она на работе, я-дома). Если есть желание - можем продолжить в понедельник, можно в отдельной ветке.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 19 2007, 12:21
Сообщение #49


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(prottoss @ Jan 18 2007, 19:39) *
А в чем разница между "динамически" и "автоматически"???

"динамически" == "в куче", "автоматически" == "в стеке/регистрах", "статически" == "в специально зарезервированном линкером участке памяти, не в стеке и не в куче".
Цитата(prottoss @ Jan 18 2007, 19:39) *
1. Если уж говорить по русски - я считаю что "динамически" - это на этапе исполнения кода, а Вы о чем глаголите???
Пытаемся обсуждать тематический вопрос с применением принятой в этой области терминологии. Чтобы избежать несуразностей, вызванных неправильной трактовкой "пимпочек", "загогулин" и "фИгни" biggrin.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 19 2007, 12:36
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Сергей Борщ @ Jan 19 2007, 16:21) *
Цитата(prottoss @ Jan 18 2007, 19:39) *

А в чем разница между "динамически" и "автоматически"???

"динамически" == "в куче", "автоматически" == "в стеке/регистрах", "статически" == "в специально зарезервированном линкером участке памяти, не в стеке и не в куче".
Цитата(prottoss @ Jan 18 2007, 19:39) *
1. Если уж говорить по русски - я считаю что "динамически" - это на этапе исполнения кода, а Вы о чем глаголите???
Пытаемся обсуждать тематический вопрос с применением принятой в этой области терминологии. Чтобы избежать несуразностей, вызванных неправильной трактовкой "пимпочек", "загогулин" и "фИгни" biggrin.gif
Да, я стараюсь избегать создания массивов внутри функции... Тем паче, что, посмотрев код, на самом деле убедился в том, что ИАР выделил место под массив в стеке данных - он просто в начале функции взял, и увеличил значение регистра Y на размер моего объявленного массива! В принципе, в х86 компиляторах делается то же самое, но там размер памяти 4 Gb, здесь же иногда приходится крутится в 128 байтах да еще с практически всеми возможными задействованными прерываниями



НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 19 2007, 12:57
Сообщение #51


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(prottoss @ Jan 19 2007, 11:36) *
НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 19 2007, 13:29
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Сергей Борщ @ Jan 19 2007, 16:57) *
Цитата(prottoss @ Jan 19 2007, 11:36) *

НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти
Вы сами то эти функции применяете в проектах? smile.gif


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 19 2007, 13:55
Сообщение #53


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(prottoss @ Jan 19 2007, 12:29) *
Цитата(Сергей Борщ @ Jan 19 2007, 16:57) *
Цитата(prottoss @ Jan 19 2007, 11:36) *

НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти
Вы сами то эти функции применяете в проектах? smile.gif

Я, например, применяю.
Работает.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 19 2007, 13:57
Сообщение #54


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(prottoss @ Jan 19 2007, 12:29) *
Вы сами то эти функции применяете в проектах? smile.gif
На ARM - да, но там я пользую ++ и они "обернуты" в new и delete. В аврах - нет, не было необходимости. Когда для РС писал (еще под ДОСом) - тоже применял.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 19 2007, 14:12
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(IgorKossak @ Jan 19 2007, 17:55) *
Цитата(prottoss @ Jan 19 2007, 12:29) *

Цитата(Сергей Борщ @ Jan 19 2007, 16:57) *
Цитата(prottoss @ Jan 19 2007, 11:36) *

НО, зачем тогда в опциях ИАРа стоит heap size для Си (без плюсиков) ? Оператор new использовать нет возможности, зачем же тогда куча?
Чтобы размещать в ней различные данные, используя функции malloc, calloc, free и т.д. из stdlib.h. Динамическое распределение памяти
Вы сами то эти функции применяете в проектах? smile.gif

Я, например, применяю.
Работает.
Интересно, что делает контроллер, когда узнает, указатель равен NULL??? наверное начинает истерично мигать лампочками smile.gif


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 19 2007, 15:42
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(prottoss @ Jan 18 2007, 19:39) *
а Вы о чем глаголите???

Я об ОБЩЕПРИНЯТОЙ терминологии идущей от Авторов языка.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 19 2007, 15:47
Сообщение #57


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(prottoss @ Jan 19 2007, 13:12) *
Интересно, что делает контроллер, когда узнает, указатель равен NULL??? наверное начинает истерично мигать лампочками smile.gif

Равенство нулю указателя легко проверить и уж потом принять решение.
Как один из вариантов - вызвать функцию истеричного мигания лампочками.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 19 2007, 15:55
Сообщение #58


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(zltigo @ Jan 19 2007, 19:42) *
Цитата(prottoss @ Jan 18 2007, 19:39) *

а Вы о чем глаголите???

Я об ОБЩЕПРИНЯТОЙ терминологии идущей от Авторов языка.
Хорошо, хорошо, признаю - я заблуждался


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 19 2007, 15:55
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(prottoss @ Jan 19 2007, 12:29) *
Вы сами то эти функции применяете в проектах? smile.gif

Нет ни одного проекта без менеджера памяти и соотвественно без функций использования оной.
Кроме всего прочего позволяет для отладочных целей просмотреть списки блоков, их владельцев и содержимое без сокровенных знаний почерпнутых из мапфайла конкретной сборки. Соответственно задачи тоже под контекст используют динамическое выделение памяти и расшаривание способствует солидной экономии ресурса.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 20 2007, 04:48
Сообщение #60


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Prottoss последний мой проект целиком построен на динамической памяти. Именно AVR правда m640 (8к озу)

Фишка в том что программа в МК - это продолжение железа. И Вы и я это понимаем. NULL не может быть получен. Это говорит о том, что у Вас в проге что-то не верно. Если даже менеджер и не полный, значит вы сами должны контролировать.

Я работаю с данными типа файл. Этот файл приходит с PC. Внутри данных идут упорядоченные структуры. Они нескольких типов и разной длины. Длина файла не известна. Как можно с этим работать? Только куча и указатели. Причём Вы не поверите. Я сам не поверил. Удобно до безобразия. Наглядно и красиво. Вырву кусочек.

Код
  KomXx    = (struct AddrKomXx*) AdrActiveKom[i];            // Прочитать адрес текущей активной    команды
  if(KomXx->TimeStart>TekTime) continue;                // Если    не подошло время для исполнения    команды, то    пропустить данную команду
  switch (KomXx->Name) {
.........
  /* Команда "OUTG"    - "Вывод статической графики" */
  case 'G':
             KomG =    (struct    AddrKomG*) AdrActiveKom[i];    // Прочитать адрес текущей активной    команды
             KomG->TimeMashtabTek++;                    // Следующий такт
             if(KomG->TimeMashtabTek >=    KomG->TimeMashtab)// если    подошёл, то
               KomG->TimeMashtabTek=0;                    // иначе начать    заново
             OutPict(KomG->BegX,KomG->BegY,KomG->SizeX,KomG->SizeY,&KomG->Pict[0]);    // Вывести картинку
             if(KomG->TimeMashtabTek ==    0){                // если    подошёл, то
               KomG->TimeLife--;                        // Уменьшить время жизни
               KomG->BegX += KomG->VecX;                // Сместить    объект
               KomG->BegY += KomG->VecY;                // Сместить    объект
             }
             break;
  /* Команда "ANIMATE" - "Вывод    анимированной графики" */
  case 'M':
             KomM =    (struct    AddrKomM*) AdrActiveKom[i];    // Прочитать адрес текущей активной    команды
.....
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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