Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что такое static и с чем его едят? 
:(
    Опции темы
cardinal
Дата 31.10.2005, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Процессор по не понятным мне причинам не работает с функцией
Код

static void PAInit(void) 
{
  DDRA = 0xFF;        // all set as output
  PORTA = 0x00;            // init values = 0
}

если ее задекларировать так:
Код

void PAInit(void) 
{
  DDRA = 0xFF;        // all set as output
  PORTA = 0x00;            // init values = 0
}

а записать в .h файл static и в .c файл компиллятор не дает - ругается...

Какие мысли?

Спасибо.

Это сообщение отредактировал(а) cardinal - 31.10.2005, 18:26


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
setq
Дата 31.10.2005, 18:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











кажется статическая функция - это та, которую не видно из других файлов .c.

Цитата
если ее задекларировать так

до сих пор пытаюсь найти отличия. :-D
  Вверх
cardinal
Дата 31.10.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Стормозил. smile
p.s. Сверху подправил...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Neitron
Дата 31.10.2005, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



setq
О да)))

Статическая может быть членом класса, но из статической ф-ции нельзя получить объект который вызвал её, так как ей не передается указатель this;
static объявляется при объявлении а не определении.

Это сообщение отредактировал(а) Neitron - 31.10.2005, 18:29


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
cardinal
Дата 31.10.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Ну у меня в .h (и больше нигде) сидит
Код

static void PAInit(void) 
{
  DDRA = 0xFF;        // all set as output
  PORTA = 0x00;            // init values = 0
}

Это что не определение? И так работает, а по другому ни в какую.

У меня Си (никаких классов и this не испольсзую)...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 31.10.2005, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
Процессор по не понятным мне причинам не работает с функцией

не знаю, как у других, а у меня серьезные проблемы с пониманием этой фразы...
Цитата
а записать в .h файл static и в .c файл компиллятор не дает - ругается...

что именно записывается в эти файлы, что вызывает ругательства компилятора?

и еще один вопрос: что именно нужно?
т.к. вполне может оказаться, что static здесь совсем не нужен...


--------------------
qqq
PM WWW   Вверх
cardinal
Дата 31.10.2005, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата(maxim1000 @ 31.10.2005, 16:33)
не знаю, как у других, а у меня серьезные проблемы с пониманием этой фразы...

Процессор не стартует и все...
Цитата(maxim1000 @ 31.10.2005, 16:33)
и еще один вопрос: что именно нужно?

Хочу чтобы в .h файле сидело
Код

static void PAInit(void);

а в .с
Код

static void PAInit(void) 
{
  DDRA = 0xFF;        // all set as output
  PORTA = 0x00;            // init values = 0
}

Цитата(maxim1000 @ 31.10.2005, 16:33)
что именно записывается в эти файлы, что вызывает ругательства компилятора?

Вышеописанное и вызывает ошибки...



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 31.10.2005, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
Ну у меня в .h (и больше нигде) сидит

ага... пока писал, появилось...

директива #include работает очень просто: вставляет содержимое указанного файла туда, где написана
к чему это приводит:
в каждом c-файле, в котором написано #include "qqq.h" появляется своя функция PAInit, т.е. куча функций с одинаковыми именами... для того, чтобы разрешить конфликт этих имен, можно написать static перед определением, это приведет к тому, что область видимости каждой такой функции сузится (изначально она - весь проект) до исходного файла, в котором она определена (т.е. в котором был написан #include)
в большинстве ситуаций это - не то, что нужно...
это приводит к жуткому и ненужному разрастанию кода+перекомпиляция всех c-файлов, использующих эту функцию

более подходящий и общепринятый подход такой:
функция определяется в одном из c-файлов (без всяких static)
в тех файлах, в которых она нужна, она объявляется - т.е. просто void PAInit();
обычно это даже выносят в h-файл и подключают его...
Добавлено @ 18:44
Цитата
Хочу чтобы в .h файле сидело

Цитата
а в .с

ну, в принципе, так и должно быть
извиняюсь за нескромный вопрос: а зачем static?
какие есть причины для его использования?


--------------------
qqq
PM WWW   Вверх
cardinal
Дата 31.10.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



в .h файле
Код

void PAInit(void);

а в .с
Код

void PAInit(void) 
{
  DDRA = 0xFF;        // all set as output
  PORTA = 0x00;            // init values = 0
}

не проходит. То есть компилируется, но не работает. Почему на знаю...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Neitron
Дата 31.10.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



А ты ф-цию вызываешь?smile smile


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
LPBOY
Дата 31.10.2005, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



static функции можно использовать только в тех единицах трансляции, где они определены. Если ты хочешь вызывать такую функцию из более чем из одного *.c файла помести ее в хедер вместе с определением и подключай во все .c файлы.

PS В том и смысл static, что у них внутренняя линковка, и из других единиц трансляции их вызывать нельзя.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
cardinal
Дата 31.10.2005, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата(maxim1000 @ 31.10.2005, 16:41)
извиняюсь за нескромный вопрос: а зачем static?
какие есть причины для его использования?

Кто-то меня написал. Я пытаюсь тоже понять зачем. Один чел тут сказанул что-то типа этот static в данном месте означает нечто иное чем то что писано в ANSI. smile
Добавлено @ 18:51
Цитата(LPBOY @ 31.10.2005, 16:48)
Если ты хочешь вызывать такую функцию из более чем из одного *.c файла помести ее в хедер вместе с определением и подключай во все .c файлы.

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

Neitron, на глупые вопросы не отвечаю... smile



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
LPBOY
Дата 31.10.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(cardinal @ 31.10.2005, 18:48)
В этом и загвоздка. Так и было сделано. Я решил поделить по разным файлам и проц перестал запускаться вообще smile Вот я и пытаюсь понять почему. Еще раз подчеркиваю, что дело не в компилляции, а в том, что один код работат, а другой нет.


Сам сейчас мучаюсь с этими долбанными AVR smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Dreamer_0x01
Дата 31.10.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Проверьте, вызывается ли эта функция. Просто в ней инфертируйте какую-нибудь ножку порта, и гляньте осциллографом. Вполне возможно, что дело вовсе не в этой функции.
Может быть, что-то другое жить мешает.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
maxim1000
Дата 31.10.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
Один чел тут сказанул что-то типа этот static в данном месте означает нечто иное чем то что писано в ANSI.

ннда... уже повод погрустить...

тогда несколько вопросов:
1. в скольких файлах используется эта функция?
2. какие отличия в ассемблерном листинге?

в принципе, когда все подходит настолько близко к процессору, всплывают разные вопросы:
например, в каком месте памяти находится static и доступен ли этот блок во время старта

а то при расположении функции в h-файле со static она появляется в каждом c-файле, и кто бы не вызывал ее из этого файла, будет использовать "родную" для этого файла копию этой функции, а значит, скорее всего, она будет располагаться в том же блоке памяти, в котором исполняемый в данный момент код, а значит, этот блок памяти доступен...


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.