|
|
  |
или глюк в IAR, или я что- то упускаю, вопрос по массиву |
|
|
|
Jan 22 2011, 23:48
|

Местный
  
Группа: Свой
Сообщений: 386
Регистрация: 1-12-05
Пользователь №: 11 639

|
Цитата(zltigo @ Jan 23 2011, 01:38)  Перед тем, как начинать программировать следует ТВЕРДО усвоить,.что такое стеки и как они используются и соответственно, Я бы уточнил: усвоить что такое переменные, их область видимости, время жизни. И как вызываемые программой функции используют те самые стеки для работы с этими переменными. Как пример: если б нужно (по каким-то причинам - ограничить область видимости) оставить переменную char data[15] внутри функции main но при этом обозначить ее как static char data[15]. Программа тоже б работала стабильно в указанном случае
|
|
|
|
|
Jan 23 2011, 12:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
хорошо, простой пример: есть некий Код void main(void) { char mass [10]; int a = 3; int b = 5;
if (a < b) { mass [0] = 'D'; } } и, получается, здесь тоже надо массив как статик указывать? все- равно не понятно.
|
|
|
|
|
Jan 23 2011, 12:58
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Метценгерштейн @ Jan 23 2011, 15:32)  все- равно не понятно. Чем этот пример отличается от того, что приводилось раньше? Если Вы не используете данные массива, какое значение имеет, как определен массив ? Вы бы книжки прочитали, чтобы постичь те несколько десятков правил программирования дополнительно к синтаксису операторов.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jan 23 2011, 13:14
|

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

|
QUOTE (Метценгерштейн @ Jan 23 2011, 15:32)  и, получается, здесь тоже надо массив как статик указывать? Надо делать так, как Вам надо. При этом, если Вам надо размещать массив в стеке то надо иметь в стеке достаточно места. Где Вам надо размещать массив Вы не знаете, что такое стек Вы не знаете. Размера стека который Вам нагенерил какой-нибудь безумный визард по умолчанию Вы тоже не знаете (подсказываю он у Вас в проекте 32 бвйта из которых Вы лихо 15 отдали под массив). Рановато взялись программировать  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 23 2011, 13:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Мне как- то лет в 18 инструктор по вождению говорил, что рано я за руль сел... И, что? послушать его надо было? И больше не садиться? Тогда и не научился бы никогда. Сейчас я довольно неплохо езжу- практика, практика... Так что неуместно Ваше замечание. Тем не менее, за помощь спасибо.
Я знаю что такое стек, писал на асме под авры.
То, что таким образом, объявляя массив, загоняю его в стек- признаю, упустил.
Сейчас читаю литературу, пытаюсь найти то, где это написано, что стек у меня 32 байта.
И, напомню, мы в разделе для начинающих... Думаю, многие начинающие на подобные грабли да наступали.
|
|
|
|
|
Jan 23 2011, 13:36
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Метценгерштейн @ Jan 23 2011, 16:24)  И, напомню, мы в разделе для начинающих... Это не освобождает Вас от необходимости осмысливать вопросы, если Вы хотите получить ответы. Надеюсь, за рулем Вы более адекватны. Тут пытаются Вам помочь, но не очень понятно, что Вам нужно. Массив создать? - зачем, если он не используется? Что Вы пытаетесь понять, наобум придумывая такие примеры? Переменные должны разместиться в предназначенной для них памяти. Все.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jan 23 2011, 13:41
|

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

|
QUOTE (Метценгерштейн @ Jan 23 2011, 16:24)  То, что таким образом, объявляя массив, загоняю его в стек- признаю, упустил. Теперь знаете. QUOTE Сейчас читаю литературу, пытаюсь найти то, где это написано, что стек у меня 32 байта. Читать бесполезно - надо рассматривать картинки Вашего "проекта" - там на одной из картинок выставлено 32 байта. Кем, зачем и почему мне не ведомо, но это так. QUOTE (Метценгерштейн @ Jan 23 2011, 16:24)  Я знаю что такое стек, писал на асме под авры. Ну и как Вы устанавливали размеры стеков на ASM?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 23 2011, 14:35
|

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

|
QUOTE (Метценгерштейн @ Jan 23 2011, 17:00)  ldi r16, low(RAMEND) out SPL, r16 ;инициализация стека Третья часть марлезонского балета - где здесь у Вас РАЗМЕР  стека  ? Это ТОЛЬКО инициализация указателя. Сколько там места ниже указателя до первых Ваших переменных неведомо. Хватит-ли этого места для, например, размещения желаемых локальных переменных до того, как они наедут на статические переменные это чисто на вашей совести.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 23 2011, 15:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Получается, так. Я устанавливал только указатель на память. Размер стека не устанавливал. В ИАРе стоит размер стека 0х20, т.е. 32 байта как Вы и указали.
Итого, если объявляю массив внутри main (), то он сохранится в стеке, а если в глобальных переменных, то где? Пока не нашел ответа в литературе.
Почему в стартовом коде Второй if бессмысленный с точки зрения применения результатов. Т.е. в результате его выполнения или невыполнения ничего в данном объекте компиляции не меняется. ?
Очевидно, что бессмысленна запись data [num] = getchar();
т.к. массив объявлен в стеке, внутри main()
Сообщение отредактировал Метценгерштейн - Jan 23 2011, 15:43
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|