Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос на миллион (GCC)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
antiwin
Привет всем, такой вот проблем: как можно узнать адрес в ОЗУ выше которого стек не "перерастет"? Это нужно сделать на этапе компиляции.
И еще, можно ли в теле функции узнать тип возвращаемого значения т.е допустим определена функция void *foo(...), далее где то вызывается int *ptr=foo(...), как в теле foo узнать что это указатель на int?
aesok
Цитата(antiwin @ Jul 2 2009, 11:15) *
Привет всем, такой вот проблем: как можно узнать адрес в ОЗУ выше которого стек не "перерастет"? Это нужно сделать на этапе компиляции.


Нет. Это можно только узнать после соборки поэкта. Проанализировав дерево вызовов функций и размеры их фрейм буферов.

Цитата(antiwin @ Jul 2 2009, 11:15) *
И еще, можно ли в теле функции узнать тип возвращаемого значения т.е допустим определена функция void *foo(...), далее где то вызывается int *ptr=foo(...), как в теле foo узнать что это указатель на int?


Никак нельзя.

Анатолий.
antiwin
жаль

Цитата(aesok @ Jul 2 2009, 11:20) *
Нет. Это можно только узнать после соборки поэкта. Проанализировав дерево вызовов функций и размеры их фрейм буферов.

Ну я так подозреваю выход есть в написании скрипта, анализирующий синтаксис всех сишников. Но это уже делает компилятор, неужели никак нельзя.
Непомнящий Евгений
Цитата(antiwin @ Jul 2 2009, 11:30) *
Ну я так подозреваю выход есть в написании скрипта, анализирующий синтаксис всех сишников. Но это уже делает компилятор, неужели никак нельзя.


В плюсах можно извернуться

Код
void* f_int(int a, long b, int type)
{
//  ваша функция
}

class TRet
{
  int a;
  long b;
public:
  TRet(int a, long b) : a(a), b(b) {}
  operator int*() { return f_int(a, b, 1); }
  operator float*() { return f_int(a, b, 2); }

};

TRet f(int a, long b) { return TRet(a, b); }


Вызовы конструктора и операторов преобразования скорее всего будут проинлайнены и все сведется к вызову f_int

Цитата(antiwin @ Jul 2 2009, 11:30) *
Ну я так подозреваю выход есть в написании скрипта, анализирующий синтаксис всех сишников. Но это уже делает компилятор, неужели никак нельзя.


Максимальный размер стека может зависеть от входных данных, так что анализ текста программы не поможет. Тут надо строить какие-то допущения на основании знания логики ее работы, или просто запустить программу и посмотреть, сколько стека она скушала
777777
Цитата(aesok @ Jul 2 2009, 11:20) *
Нет. Это можно только узнать после соборки проекта. Проанализировав дерево вызовов функций и размеры их фрейм буферов.

Боюсь что таже так нельзя. Потому что вызовы могут быть рекурсивными. Кроме того, функции можно вызывать по указателю, а такие вызовы не встроишь в дерево. Я уж не говорю о том, что каждая функция может запихнуть в стек что-то по своему желанию, помимо параметров и локальных переменных.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.