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

 
 
 
Reply to this topicStart new topic
> проблема областей видимости в Си, в функции не видны переменные объявленные в вызывающей функции
Androliz
сообщение Sep 22 2008, 13:14
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 22-09-06
Из: Беларусь
Пользователь №: 20 595



Использую Keil RealView MDK-ARM V3.23
В функции main объявлена структура :
int main(void)
{
struct ButtState buttStates[20];//array of structures[/color]

Далее из main вызывается другая функция pressPreprocess, объявленная в другом файле, подключенном к проекту. Эта функция ипользует структуру buttStates[20].Но компилятор выдаёт ошибку, что не может найти эту переменную: identifyer buttStates is undefined...
Переменная объявленная в main является локальной. Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему вызова функции из другого файла, работающей с локальными переменными?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 22 2008, 13:25
Сообщение #2


Гуру
******

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



Цитата(Androliz @ Sep 22 2008, 17:14) *
Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему вызова функции из другого файла, работающей с локальными переменными?

Никак.
Go to the top of the page
 
+Quote Post
KRS
сообщение Sep 22 2008, 13:26
Сообщение #3


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Androliz @ Sep 22 2008, 17:14) *
Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему вызова функции из другого файла, работающей с локальными переменными?

Никак!
Go to the top of the page
 
+Quote Post
spf
сообщение Sep 22 2008, 13:29
Сообщение #4


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Androliz @ Sep 22 2008, 19:14) *
Далее из main вызывается другая функция pressPreprocess, объявленная в другом файле, подключенном к проекту. Эта функция ипользует структуру buttStates[20].Но компилятор выдаёт ошибку, что не может найти эту переменную: identifyer buttStates is undefined...

И это правильно!

Цитата
Переменная объявленная в main является локальной. Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему вызова функции из другого файла, работающей с локальными переменными?

Локальная переменная она на то и локальная, чтобы ее было видно только там, где она объявлена.
Пытаться обходить стандарты Си не стоит, это грабли.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
SergeiCh
сообщение Sep 22 2008, 13:33
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415



Цитата(Androliz @ Sep 22 2008, 20:14) *
Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему вызова функции из другого файла, работающей с локальными переменными?
AFAIK, никак. В gcc есть nested functions, которые имеют доступ к локальным переменным содержащей функции, но такая (nested) функция должна быть определена в той же функции, чьи переменные собирается использовать, т.е. в этом же файле. Разве что через #include smile.gif Про nested functions в Keil не слышал.
Go to the top of the page
 
+Quote Post
xemul
сообщение Sep 22 2008, 13:40
Сообщение #6



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Androliz @ Sep 22 2008, 17:14) *
...
Переменная объявленная в main является локальной. Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему вызова функции из другого файла, работающей с локальными переменными?

Объявите глобальный указатель ButtState *p_bs, в main() присвойте ему адрес buttStates[], в более другой функции из другого файла обращайтесь к buttStates[] через этот указатель. Но делать так стОит только при неудержимой склонности к программным перверсиям.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 22 2008, 13:47
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Androliz @ Sep 22 2008, 16:14) *
Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему
А вы поставьте себя на место компилятора и подумайте - как он может знать, что эту функцию будут вызывать именно из main() и как он сможет догадаться, что в другом файле в main() объявлен какой-то ButtStates. Если вам удастся разрешить эту проблему, вот вам вторая: а что должен будет делать компилятор, если вы вызовете эту функцию из другой, в которой нет локальной переменной ButtStates.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
VAI
сообщение Sep 22 2008, 13:48
Сообщение #8


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Цитата
Как не делая её голобальной и не передавая ее в функцию(или указатель на неё) решить проблему вызова функции из другого файла, работающей с локальными переменными?

Извините, а зачем? Может, поняв причину мы сможем что-либо предложить...


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Androliz
сообщение Sep 23 2008, 15:16
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 22-09-06
Из: Беларусь
Пользователь №: 20 595



спасибо за ответ.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th June 2025 - 10:13
Рейтинг@Mail.ru


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