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

 
 
> нехитрый вопрос по С
vitko
сообщение Jan 28 2008, 11:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066



Пардон, что простой вопрос.
Разбираюсь с програмой, в которой много конструкций вида :

void func1 ()
{
uchar LocalArr[5];

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

Может кто-то объяснить, насколько законно передавать во вложенные функции указатель на локальную переменную. В массив грузятся данные каждый раз по новому, глобально хранить их не надо.
Пишу в IAR для AVR.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
Непомнящий Евген...
сообщение Jan 28 2008, 11:27
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



А где вы в С нашли вложенные функции?
Передавать в функции указатель на локальные переменные вполне допустимо. Нежелательно возвращать указатель на локальные переменные.
Go to the top of the page
 
+Quote Post
forever failure
сообщение Jan 28 2008, 11:31
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Да, законно. А в ИАРе вложенные функци есть что-ли ? (в GCC точно есть). Вероятно, автор чо-то путает или неясно выражает, но в приведённом коде нет ничего, напоминающего вложенные функции.

Сообщение отредактировал forever failure - Jan 28 2008, 11:34
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2008, 11:35
Сообщение #4


Гуру
******

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



Цитата(Непомнящий Евгений @ Jan 28 2008, 14:27) *
Нежелательно возвращать указатель на локальные переменные.

"Нежелательно" это не то слово, которое может характеризовать возвращение указателя на место в стеке в котором когда-то действительно была локальная переменная smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 28 2008, 11:57
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



В GCC есть вложенные функции?
Т.е. можно написать:
Код
int f()
{
   int a = 10;
   int f2()
   {
     return a + 2;
   }
   return f2();
}

А не могли бы вы дать ссылку на описание этого? И как интересно он разруливает локальные области видимости внутри функции...
Go to the top of the page
 
+Quote Post
vitko
сообщение Jan 28 2008, 12:33
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066



Да, я неясно выразился - имел ввиду вызов из функции другой функции.
Спасибо за ответ, просто читал хелп ИАРа, засомневался - вдруг последствия могут появиться при оптимизации.
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 28 2008, 12:37
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Непомнящий Евгений @ 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, 12:56
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 28 2008, 13:00
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(aesok @ Jan 28 2008, 15:37) *


Спасибо, не знал.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Jan 29 2008, 10:35
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



И передавать, и возвращать указатели на локальные переменные, и сами переменные никто не запрещает, главное, чтобы интерфейс функции был соблюден. Ограничения в основном накладываются на вызов функций, которые выполняют запуск асинхронных операций - здесь следует соблюдать внимание.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 29 2008, 12:51
Сообщение #10


Гуру
******

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



Цитата(oran-be @ Jan 29 2008, 13:35) *
...возвращать указатели на локальные переменные ... никто не запрещает

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

Что?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
forever failure
сообщение Jan 29 2008, 13:07
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



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

Однако, писать так - ССЗБ.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:24
Рейтинг@Mail.ru


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