Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Познающая
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 25
#1

Извлечение данных из стека - C++

07.02.2013, 23:02. Просмотров 1113. Ответов 5
Метки нет (Все метки)

Доброго времени суток!
Помогите разобраться.
Изучаю функции и мне не понятно, как извлекаются значения локальных переменных из стека. В стек закладываются локальные переменные по мере их определения. Допустим вначале мы внутри функции объявляем переменную а, потом b. Данные из стека берутся по принципу "последним пришел-первым вышел". А что, если нам вначале нужно использовать переменную a, а только потом переменную b?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 23:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Извлечение данных из стека (C++):

Извлечение данных из программы - C++
в игре Counter Strike 1.6 на deathrun сервере в чате бывают задания где надо произвести арифметические операции с 5 числами и в том же...

Структура стек (: добавить элемент в стек, удалить элемент из стека, получить значение с вершины стека, размер стека...) - C++
Всем привет,ребят помогите пожалуйста с лабой,вообще без понятия про стеки:( Может кто то делал,или встречался с таким заданием: ...

Извлечение данных из введенной пользователем строки - C++
Подскажите как написать или что нужно исправить в том что я написал чтобы пользователь вводил данные в этом формате, сохранить значение в...

Запись и извлечение данных в несколько запусков программы - C++
Всем добрый вечер! Предоставляю исходник программы EMPL_IO стр.574 с книги Лаффорте ООП в С++. Пытаясь улучшить программу наткнулся на...

Работа с звуковыми файлами (извлечение и сохранение данных) - C++
Всем здравствуйте. Со звуком раньше не работал. Суть задания: считать данные из звукового файла в массив целых чисел, провести оконную...

Неправильный вывод данных из стека С++ - C++
Я только-только начал учить С++. Пишу под ДОСом. И у меня вот баг вылез: Я хочу поместить цифры в стек и потом их просто вывести от...

5
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 761
07.02.2013, 23:58 #2
Цитата Сообщение от Познающая Посмотреть сообщение
Доброго времени суток!
Помогите разобраться.
Изучаю функции и мне не понятно, как извлекаются значения локальных переменных из стека. В стек закладываются локальные переменные по мере их определения. Допустим вначале мы внутри функции объявляем переменную а, потом b. Данные из стека берутся по принципу "последним пришел-первым вышел". А что, если нам вначале нужно использовать переменную a, а только потом переменную b?
тогда используйте очередь, она именно для этого
0
I.M.
566 / 549 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
08.02.2013, 01:01 #3
Познающая, когда мы ее используем, мы не удаляем ее из стека. Она продолжает там храниться
Принцип "последним пришел-первым вышел" говорит о порядке создания/удаления переменных в стеке
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.02.2013, 01:19 #4
Цитата Сообщение от Познающая Посмотреть сообщение
Доброго времени суток!
Помогите разобраться.
Изучаю функции и мне не понятно, как извлекаются значения локальных переменных из стека. В стек закладываются локальные переменные по мере их определения. Допустим вначале мы внутри функции объявляем переменную а, потом b. Данные из стека берутся по принципу "последним пришел-первым вышел". А что, если нам вначале нужно использовать переменную a, а только потом переменную b?
В стек закладываются не отдельные переменные, а так называемые записи активаций функций, они же фреймы стека (они же стековые кадры и ещё бог весь что). В этих записях сразу выделяется место под адрес возврата, аргументы функции и все её локальные переменные. Аппаратный стек это не абстрактный тип данных, откуда можно доставать элементы только с верхушки. I.M. правильно сказал, что это просто метафора порядка создания удаления этих самых записей активаций. Функции же просто помнят, что локальная переменная с таким-то именем лежит в пяти ячейках от текущей верхушки стека, например.
1
Познающая
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 25
08.02.2013, 16:54  [ТС] #5
Так более понятно) Спасибо! Просто смутила общепринятая аналогия, проводимая между стеком и стопкой тарелок, что если ты хочешь достать тарелки снизу, то вначале надо взять верхние.
Можете еще, пожалуйста, какую-нибудь литературу посоветовать, где про организацию памяти доступно написано.
0
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
09.02.2013, 02:07 #6
типичный код функции с локальными переменными выглядит так.
C++
1
2
3
4
5
6
void func(){
int a;
int b;
a=0;
b=a+1;
}
Я так понял, ты услышал, что локальные переменные пихаются в стек и это тебя смутило.
Т.к. ты решил, что обращаются к ним командами push и pop
Нет, в ассемблере вышеприведённый код возможно будет выглядеть как
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
push ebp;      //сохранить прежнее значение ebp которое было вне функции, 
                    ;//ebp будет сейчас изменён, а до вызова функции в нём могло быть
                   ;// что-то полезное
mov ebp, esp     ;//теперь в ebp хранится вершина стека в момент входа в функцию,
                              ;// т.к. в процессе выполнения стек может расти и esp в  этой роли использовать неудобно: он меняется.
sub esp, 8;     //далее в стек запихивается место под две переменные типа int (8 байт)
                       ; // обрати внимание, что пихать/вынимать из стека можно не только командами push/pop
                       ;    // но и просто "арифметическим" уменьшением/увеличением вершины стека соответственно
mov [ebp+4], 0;   ///обращение к первой переменной
                        ;   // обрати внимание, ты думал, чтобы обратиться к переменной в стеке требуется команда pop 
                         ;// нет, мы специально сохранили в регистре ebp адрес, от которого начинается размещение локальных переменных
mov eax, [ebp+4];
add  eax, 1;
mov [ebp+8], eax;   //вычисления идут и к локальным переменным мы обращаемся, указывая смещение относительно ebp
 
 
add esp, 8;   //перед завершением функции, мы совершаем обратные действия:
                 ;   // назад опускаем вершину стека.
                ;   //( тот же эффект был бы достигнут несколькими командами pop )
pop ebp;   //и восстанавливаем ebp
Компиляторы С++ не обязательно генерируют именно такой код,
Но именно этот код демонстрируют, что имеют в виду, когда говорят "Локальные переменные хранятся в стеке"
1
09.02.2013, 02:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2013, 02:07
Привет! Вот еще темы с ответами:

Как создать программу, которая бы обеспечивала создание, просмотр, дополнения и извлечение данных из файла - C++
создать программу, которая бы обеспечивала создание, просмотр, дополнения и извлечение данных из файла, содержащего информацию об итогах...

Создание линейной структуры данных типа очереди или стека - C++
Здравствуйте, форумчане. Прошу помочь с заданием:

Создать стек из вещественных чисел; найти максимальный элемент в стеке; организовать просмотр данных стека - C++
Создать стек из вещественных чисел. Определить максимальный элемент в стеке. Организовать просмотр данных стека.

Удалить элемент из стека по условию и добавить элемент в начало стека - C++
Здравствуйте, помогите пожалуйста исправить(дописать) программы. 1). Нужно удалить элемент, находящийся в середине стека , если число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.