![]() |
|
|
Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Senior Member
|
![]()
Здравствуйте,
c18 ver 3.47 Предистория: 4 года писал проект в одном файле, но он достиг размера 250кБ в тексте и решил его побить на файлы... убил полдня, разбил, а теперь проект глючит. Нашел такую беду, например: main.c Код:
... char query[255]; ... Код:
... extern char query[]; ... ... cnt = sizeof(query); Для меня это было совсем не очевидно, и компилятор тоже никак не ругается... может я просто должен как-то по другому объявлять массив? суть: мне нужно объявить массив где либо, и использовать его в разных модулях... как это сделать правильно? Михаил. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,598
Вес репутации: 3110/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
hfmscan
может я просто должен как-то по другому объявлять массив? - да. нельзя использовать магические числа. плохая идея применять sizeof к чему-либо, кроме типов. если что-то можно указать явным образом - лучше указывать явным. вообще с C18 я работал давно. если мне не изменяет память - поддержка стандартов не дотягивала даже до С89. так что нужно детально вспоминать, как видели С 30 лет назад. Код:
... /* module conf */ #define QUERRY_SIZE 0xff ... char query[QUERRY_SIZE]; ... extern char query[QUERRY_SIZE]; ... size = sizeof(char)*QUERRY_SIZE; |
![]() |
![]() |
![]() |
#3 |
Senior Member
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 35
Сообщений: 1,130
Вес репутации: 3560/77 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
sizeof возвращает размер в байтах, так-что умножение некорректно.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её. |
![]() |
![]() |
![]() |
#4 |
Senior Member
|
![]()
я вас понял, так и напишу (через define объявлю количество и везде пропишу), но SizeOf() пользуюсь нередко и пока все было в одном файле все корректно работало...
еще один баг/фича который нужно держать в голове когда программируешь контроллеры в моем случае sizeof я использовал для того чтобы узнать кол-во элементов, поэтомв моем случае будет просто cnt=QUERY_SIZE |
![]() |
![]() |
![]() |
#5 |
Senior Member
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,598
Вес репутации: 3110/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
yeskela
в целом согласен. я неправильно трактовал в вопросе переменную size, как размер в байтах. как аргумента для типовых функций для работы с сырой памятью(memcpy и.т.д.). hfmscan в двух словах: сложные архитектурно проекты нужно делать многофайловыми. иначе они становятся из сложных запутанными. еще один баг/фича который нужно держать в голове когда программируешь контроллеры - контроллеры программируются абсолютно также, как и все остальное. разница минимальна. |
![]() |
![]() |
![]() |
#6 |
Senior Member
|
![]()
так же, но не совсем
![]() есть некоторые некорректности, которые может знать, думаю, только тот, кто наступал на грабли... кстати, вопрос в тему. Сейчас все переписываю на дефайны и не могу придумать как правильно. я делаю так unit1.c #define arr_count 10 char arr[arr_count] unit1.h extern char arr[arr_count] понятно что получаю ошибку в H файле, потому что компилятор не находит arr_count где мне ее нужно объявлять чтобы корректно все было? |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 137
Вес репутации: 1161/25 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Попробуйте объявить с размером Код:
... extern char query[255]; Код:
... #define QUERY_SIZE 255 extern char query[QUERY_SIZE]; Код:
... #define _countof(__array) (sizeof(__array) / sizeof(*__array)) |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,598
Вес репутации: 3110/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
я могу сбросить какой-нибудь свой модуль, как пример.
чтобы глянуть как я оформлял. это будет тупо мой опыт, из которого можно что-нибудь черпать. понятное дело, что можно какие-то вещи делать лучше. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 137
Вес репутации: 1161/25 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
В *.H файле очевидно - #define-ы разворачиваются на этапе препроцессора - ещё до передачи С файла компилятору - а компилятор видит в вашем случае только неизвестную сущность в квадратных скобках. Перенесите дефайн непосредственно перед extern объявлением массива в H файле.
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
|
![]()
да, в таком случае работает,
но приходится делать строку unit1.c Цитата:
|
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 137
Вес репутации: 1161/25 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Так ведь unit1.h ещё называется "интерфейсом модуля unit1.c" и модуль uint1.c обязан его включать, чтобы компилятор мог как минимум проверить, что объявление публичных ресурсов в интерфейсе модуля совпадает с их имплементацией в самом модуле.
|
![]() |
![]() |
![]() |
#13 |
Senior Member
|
![]()
ну да. но интерфейс внешний, т.е. как бы я в h кроме дефайнов ничего объявить значимого не могу, например тот же массив... я никогда не вызывал h модули в С файлах и все работало... только вот в этой конкртной ситуации мне понадобилось это...
нет опыта у меня с С, поэтому такие вот тупые ситуации возникают ![]() |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 137
Вес репутации: 1161/25 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
PS: Но если "по-правильному" модуль вообще никакого доступа к своим глобальным переменным никому позволять не должен - все манипуляции с ними должны делаться только функциями самого модуля. Так, мол, безопаснее. |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 45
Сообщений: 1,437
Вес репутации: 2181/72 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Вот я только что попробовал: Код:
// test.c: uint8_t MyTest[TEST_NUM]={0,1,1,1, 1, 0,1}; //test.h: #define TEST_NUM 7 extern uint8_t MyTest[TEST_NUM]; // main.c a= sizeof(MyTest); если вместо uint8_t написать uint32_t, то получим а=28 |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
|
![]()
Спасибо Всем...
с этим понятно, сделал инклюды H файлов в свои модули и пока так оставил... глюк ушел, посмотрю, может еще вылезут ![]() PS: тупое разбиение одного файла на модули, бонусом минус 800 байт кода.. видимо оптимизатору проще мелкие файлы оптимизировать. чем один большой... |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|