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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> или глюк в IAR, или я что- то упускаю, вопрос по массиву
OLEG_BOS
сообщение Jan 22 2011, 23:48
Сообщение #16


Местный
***

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



Цитата(zltigo @ Jan 23 2011, 01:38) *
Перед тем, как начинать программировать следует ТВЕРДО усвоить,.что такое стеки и как они используются и соответственно,

Я бы уточнил: усвоить что такое переменные, их область видимости, время жизни. И как вызываемые программой функции используют те самые стеки для работы с этими переменными.
Как пример: если б нужно (по каким-то причинам - ограничить область видимости) оставить переменную char data[15] внутри функции main но при этом обозначить ее как static char data[15]. Программа тоже б работала стабильно в указанном случае sm.gif
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 23 2011, 12:32
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 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';
  }
  
}


и, получается, здесь тоже надо массив как статик указывать?

все- равно не понятно.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 23 2011, 12:58
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Метценгерштейн @ Jan 23 2011, 15:32) *
все- равно не понятно.

Чем этот пример отличается от того, что приводилось раньше?
Если Вы не используете данные массива, какое значение имеет, как определен массив ?
Вы бы книжки прочитали, чтобы постичь те несколько десятков правил программирования дополнительно к синтаксису операторов.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 23 2011, 13:07
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



читаю, читаю...
пока не разобрался еще.
Если есть ссылка под рукой, где наиболее четко проливается свет на это дело, прошу дать ее.
Спасибо.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 23 2011, 13:14
Сообщение #20


Гуру
******

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



QUOTE (Метценгерштейн @ Jan 23 2011, 15:32) *
и, получается, здесь тоже надо массив как статик указывать?

Надо делать так, как Вам надо.
При этом, если Вам надо размещать массив в стеке то надо иметь в стеке достаточно места. Где Вам надо размещать массив Вы не знаете, что такое стек Вы не знаете. Размера стека который Вам нагенерил какой-нибудь безумный визард по умолчанию Вы тоже не знаете (подсказываю он у Вас в проекте 32 бвйта из которых Вы лихо 15 отдали под массив). Рановато взялись программировать sad.gif.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 23 2011, 13:24
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Мне как- то лет в 18 инструктор по вождению говорил, что рано я за руль сел... И, что? послушать его надо было? И больше не садиться? Тогда и не научился бы никогда. Сейчас я довольно неплохо езжу- практика, практика... Так что неуместно Ваше замечание. Тем не менее, за помощь спасибо.

Я знаю что такое стек, писал на асме под авры.

То, что таким образом, объявляя массив, загоняю его в стек- признаю, упустил.

Сейчас читаю литературу, пытаюсь найти то, где это написано, что стек у меня 32 байта.

И, напомню, мы в разделе для начинающих... Думаю, многие начинающие на подобные грабли да наступали.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 23 2011, 13:36
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Метценгерштейн @ Jan 23 2011, 16:24) *
И, напомню, мы в разделе для начинающих...

Это не освобождает Вас от необходимости осмысливать вопросы, если Вы хотите получить ответы.
Надеюсь, за рулем Вы более адекватны.
Тут пытаются Вам помочь, но не очень понятно, что Вам нужно.
Массив создать? - зачем, если он не используется?
Что Вы пытаетесь понять, наобум придумывая такие примеры?
Переменные должны разместиться в предназначенной для них памяти.
Все.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 23 2011, 13:41
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 23 2011, 13:48
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



На самом деле, спасибо за то, что прояснили ситуацию, пытаюсь осмыслить.

на асме-
push r17

pop r16

Но довольно быстро можно было зарыться в коде, поэтому старался через стек не писать.

Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 23 2011, 13:51
Сообщение #25


Гуру
******

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



QUOTE (Метценгерштейн @ Jan 23 2011, 16:48) *
на асме-
push r17
pop r16

Печально. Где установка РАЗМЕРА стека, я спрашивал.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 23 2011, 14:00
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



ldi r16, low(RAMEND)
out SPL, r16 ;инициализация стека
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 23 2011, 14:35
Сообщение #27


Гуру
******

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



QUOTE (Метценгерштейн @ Jan 23 2011, 17:00) *
ldi r16, low(RAMEND)
out SPL, r16 ;инициализация стека

Третья часть марлезонского балета - где здесь у Вас РАЗМЕР sm.gif стека sm.gif? Это ТОЛЬКО инициализация указателя. Сколько там места ниже указателя до первых Ваших переменных неведомо. Хватит-ли этого места для, например, размещения желаемых локальных переменных до того, как они наедут на статические переменные это чисто на вашей совести.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 23 2011, 15:02
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Получается, так. Я устанавливал только указатель на память. Размер стека не устанавливал.
В ИАРе стоит размер стека 0х20, т.е. 32 байта как Вы и указали.

Итого, если объявляю массив внутри main (), то он сохранится в стеке, а если в глобальных переменных, то где? Пока не нашел ответа в литературе.

Почему в стартовом коде
Второй if бессмысленный с точки зрения применения результатов. Т.е. в результате его выполнения или невыполнения ничего в данном объекте компиляции не меняется.
?

Очевидно, что бессмысленна запись
data [num] = getchar();

т.к. массив объявлен в стеке, внутри main()



Сообщение отредактировал Метценгерштейн - Jan 23 2011, 15:43
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 23 2011, 20:39
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Метценгерштейн, любая работа должна приносить какой-то результат. В противном случае она становится бессмысленной. Локальные переменные, объявленные внутри функции, имеют срок жизни до момента окончания работы этой функции. Поэтому, если функция работает только с локальными данными и не передает результат своей работы "наружу" или в процессе выполнения не модифицирует никакие внешние (глобальные или volatile) данные, то эта функция нафиг не нужна. И компилятор имеет право вообще ее выкинуть из конечного кода.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 24 2011, 08:50
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



rezident

Спасибо, дошло до меня. Я же при вызове ф-ии
data [num] = getchar();

покидаю тело ф-ии main, работаю с внешним файлом. Тут и уничтожается моя переменная (массив).

Сейчас читаю книгу
Философия C++. Введение в стандартный C++

как раз про это дело.

Сообщение отредактировал Метценгерштейн - Jan 24 2011, 08:50
Go to the top of the page
 
+Quote Post

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

 


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


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