Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: нехитрый вопрос по С
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
vitko
Пардон, что простой вопрос.
Разбираюсь с програмой, в которой много конструкций вида :

void func1 ()
{
uchar LocalArr[5];

. // load data to LocalArr
.
func2 (LocalArr);
.
.
}
/*========================
do smth with array
-------------------------*/
void func2 (uchar *ptr)
{
.
.
}
//-------------------------

Может кто-то объяснить, насколько законно передавать во вложенные функции указатель на локальную переменную. В массив грузятся данные каждый раз по новому, глобально хранить их не надо.
Пишу в IAR для AVR.
Непомнящий Евгений
А где вы в С нашли вложенные функции?
Передавать в функции указатель на локальные переменные вполне допустимо. Нежелательно возвращать указатель на локальные переменные.
forever failure
Да, законно. А в ИАРе вложенные функци есть что-ли ? (в GCC точно есть). Вероятно, автор чо-то путает или неясно выражает, но в приведённом коде нет ничего, напоминающего вложенные функции.
zltigo
Цитата(Непомнящий Евгений @ Jan 28 2008, 14:27) *
Нежелательно возвращать указатель на локальные переменные.

"Нежелательно" это не то слово, которое может характеризовать возвращение указателя на место в стеке в котором когда-то действительно была локальная переменная smile.gif.
Непомнящий Евгений
В GCC есть вложенные функции?
Т.е. можно написать:
Код
int f()
{
   int a = 10;
   int f2()
   {
     return a + 2;
   }
   return f2();
}

А не могли бы вы дать ссылку на описание этого? И как интересно он разруливает локальные области видимости внутри функции...
vitko
Да, я неясно выразился - имел ввиду вызов из функции другой функции.
Спасибо за ответ, просто читал хелп ИАРа, засомневался - вдруг последствия могут появиться при оптимизации.
aesok
Цитата(Непомнящий Евгений @ Jan 28 2008, 14:57) *
В GCC есть вложенные функции?
....
А не могли бы вы дать ссылку на описание этого? И как интересно он разруливает локальные области видимости внутри функции...


GCC Internals Manual
15.2 Trampolines for Nested Functions:
http://gcc.gnu.org/onlinedocs/gccint/Tramp...tml#Trampolines

A trampoline is a small piece of code that is created at run time when the address of a nested function is taken. It normally resides on the stack, in the stack frame of the containing function.

sad.gif

Анатолий.
Непомнящий Евгений
Цитата(aesok @ Jan 28 2008, 15:37) *


Спасибо, не знал.
oran-be
И передавать, и возвращать указатели на локальные переменные, и сами переменные никто не запрещает, главное, чтобы интерфейс функции был соблюден. Ограничения в основном накладываются на вызов функций, которые выполняют запуск асинхронных операций - здесь следует соблюдать внимание.
zltigo
Цитата(oran-be @ Jan 29 2008, 13:35) *
...возвращать указатели на локальные переменные ... никто не запрещает

В общем случае категорически неверно так поступать. Язык вообще не запрещает писать неверные программы smile.gif
Цитата
, главное, чтобы интерфейс функции был соблюден.

Что?
forever failure
сам язык не запрещает конструкции типа:
int * func (int i)
{
int l = i, * p = &l;
return p;
}

Однако, писать так - ССЗБ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.