Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 05.02.2018, 22:07   #1
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/26
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию SizeOf (массив, объявленный в другом модуле) = 1

Здравствуйте,

c18
ver 3.47

Предистория: 4 года писал проект в одном файле, но он достиг размера 250кБ в тексте и решил его побить на файлы... убил полдня, разбил, а теперь проект глючит.

Нашел такую беду,
например:
main.c
Код:
...
  char query[255];
...
unit1.c
Код:
...
  extern char query[];
...
...
  cnt = sizeof(query);
так вот, ранее, когда все было в одном файле cnt = 255, а сейчас cnt=1;

Для меня это было совсем не очевидно, и компилятор тоже никак не ругается...
может я просто должен как-то по другому объявлять массив?
суть: мне нужно объявить массив где либо, и использовать его в разных модулях...
как это сделать правильно?


Михаил.
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 05.02.2018, 22:50   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,696
Вес репутации: 3274/70
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

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;
besogon вне форума   Ответить с цитированием
Старый 06.02.2018, 09:35   #3
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 35
Сообщений: 1,139
Вес репутации: 3762/79
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Цитата:
Сообщение от besogon Посмотреть сообщение
Код:
size = sizeof(char)*QUERRY_SIZE;
sizeof возвращает размер в байтах, так-что умножение некорректно.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 06.02.2018, 09:48   #4
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/26
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

я вас понял, так и напишу (через define объявлю количество и везде пропишу), но SizeOf() пользуюсь нередко и пока все было в одном файле все корректно работало...
еще один баг/фича который нужно держать в голове когда программируешь контроллеры

в моем случае sizeof я использовал для того чтобы узнать кол-во элементов, поэтомв моем случае будет просто
cnt=QUERY_SIZE
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.02.2018, 10:56   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,696
Вес репутации: 3274/70
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

yeskela
в целом согласен.
я неправильно трактовал в вопросе переменную size, как размер в байтах.
как аргумента для типовых функций для работы с сырой памятью(memcpy и.т.д.).
hfmscan
в двух словах: сложные архитектурно проекты нужно делать многофайловыми. иначе они становятся из сложных запутанными.

еще один баг/фича который нужно держать в голове когда программируешь контроллеры - контроллеры программируются абсолютно также, как и все остальное. разница минимальна.
besogon вне форума   Ответить с цитированием
Старый 06.02.2018, 11:40   #6
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/26
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

так же, но не совсем
есть некоторые некорректности, которые может знать, думаю, только тот, кто наступал на грабли...

кстати, вопрос в тему.
Сейчас все переписываю на дефайны и не могу придумать как правильно.
я делаю так



unit1.c
#define arr_count 10

char arr[arr_count]

unit1.h
extern char arr[arr_count]

понятно что получаю ошибку в H файле, потому что компилятор не находит arr_count
где мне ее нужно объявлять чтобы корректно все было?
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.02.2018, 11:42   #7
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 148
Вес репутации: 1161/26
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Цитата:
Сообщение от hfmscan Посмотреть сообщение
Код:
...
  extern char query[];
...
...
  cnt = sizeof(query);
так вот, ранее, когда все было в одном файле cnt = 255, а сейчас cnt=1;

Для меня это было совсем не очевидно, и компилятор тоже никак не ругается...
sizeof отрабатывается компилятором - и если при компиляции текущего С-файла компилятор видит только extern определение массива без указания его размера - по-хорошему должен выйти с ошибкой.
Попробуйте объявить с размером
Код:
...
  extern char query[255];
Ещё проверьте как он реагирует на extern объявление с размером отличающимся как в большую (256) так и в меньшую сторону (250) - если компилятор отловит обе ситуации как ошибочные - можете пользоваться и этим вариантом. Но чаще всего встречается вариант:
Код:
...
#define QUERY_SIZE 255
  extern char query[QUERY_SIZE];
Для опеределения количества элементов в массиве можно завести макрос в sizeof стиле:
Код:
...
#define _countof(__array) (sizeof(__array) / sizeof(*__array))
siarzhuk вне форума   Ответить с цитированием
Старый 06.02.2018, 11:43   #8
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/26
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

siarzhuk, да, я так и делаю. сообщение 6
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.02.2018, 11:50   #9
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,696
Вес репутации: 3274/70
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

я могу сбросить какой-нибудь свой модуль, как пример.
чтобы глянуть как я оформлял.
это будет тупо мой опыт, из которого можно что-нибудь черпать.
понятное дело, что можно какие-то вещи делать лучше.
Вложения
Тип файла: zip example.zip (4.9 Кб, 3 просмотров)
besogon вне форума   Ответить с цитированием
Старый 06.02.2018, 12:28   #10
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 148
Вес репутации: 1161/26
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Цитата:
Сообщение от hfmscan Посмотреть сообщение
unit1.c
#define arr_count 10

char arr[arr_count]

unit1.h
extern char arr[arr_count]

понятно что получаю ошибку в H файле, потому что компилятор не находит arr_count
где мне ее нужно объявлять чтобы корректно все было?
В *.H файле очевидно - #define-ы разворачиваются на этапе препроцессора - ещё до передачи С файла компилятору - а компилятор видит в вашем случае только неизвестную сущность в квадратных скобках. Перенесите дефайн непосредственно перед extern объявлением массива в H файле.
siarzhuk вне форума   Ответить с цитированием
Старый 06.02.2018, 12:45   #11
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/26
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

да, в таком случае работает,
но приходится делать строку

unit1.c
Цитата:
#include "unit1.h"
Спасибо
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.02.2018, 12:59   #12
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 148
Вес репутации: 1161/26
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Цитата:
Сообщение от hfmscan Посмотреть сообщение
да, в таком случае работает, но приходится делать строку
Так ведь unit1.h ещё называется "интерфейсом модуля unit1.c" и модуль uint1.c обязан его включать, чтобы компилятор мог как минимум проверить, что объявление публичных ресурсов в интерфейсе модуля совпадает с их имплементацией в самом модуле.
siarzhuk вне форума   Ответить с цитированием
Старый 06.02.2018, 13:03   #13
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/26
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

ну да. но интерфейс внешний, т.е. как бы я в h кроме дефайнов ничего объявить значимого не могу, например тот же массив... я никогда не вызывал h модули в С файлах и все работало... только вот в этой конкртной ситуации мне понадобилось это...
нет опыта у меня с С, поэтому такие вот тупые ситуации возникают
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.02.2018, 14:21   #14
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 148
Вес репутации: 1161/26
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Цитата:
Сообщение от hfmscan Посмотреть сообщение
но интерфейс внешний, т.е. как бы я в h кроме дефайнов ничего объявить значимого не могу, например тот же массив...
В интерфейсе модуля желательно только то, что требуется знать об этом модуле извне. Если массив и его размер важны для "окружающих" - то они и должны быть в интерфейсе модуля - т.е. в H файле.
PS: Но если "по-правильному" модуль вообще никакого доступа к своим глобальным переменным никому позволять не должен - все манипуляции с ними должны делаться только функциями самого модуля. Так, мол, безопаснее.
siarzhuk вне форума   Ответить с цитированием
Старый 06.02.2018, 14:32   #15
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 45
Сообщений: 1,465
Вес репутации: 2283/74
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Цитата:
Сообщение от hfmscan Посмотреть сообщение
main.c
Код:
...
  char query[255];
...
unit1.c
Код:
...
  extern char query[];
...
...
  cnt = sizeof(query);
так вот, ранее, когда все было в одном файле cnt = 255, а сейчас cnt=1;

Для меня это было совсем не очевидно, и компилятор тоже никак не ругается...
может я просто должен как-то по другому объявлять массив?
суть: мне нужно объявить массив где либо, и использовать его в разных модулях...
как это сделать правильно?
Михаил.
Правильно уже сказали - нужно вынести 255 в дефайн и в экстерне тоже его прописывать, а не просто []
Вот я только что попробовал:
Код:
// 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);
запускаем и видим, что а=7

если вместо uint8_t написать uint32_t, то получим а=28
DimaS вне форума   Ответить с цитированием
Старый 06.02.2018, 14:49   #16
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 43
Сообщений: 415
Вес репутации: 243/26
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Спасибо Всем...
с этим понятно, сделал инклюды H файлов в свои модули и пока так оставил...
глюк ушел, посмотрю, может еще вылезут ))

PS: тупое разбиение одного файла на модули, бонусом минус 800 байт кода.. видимо оптимизатору проще мелкие файлы оптимизировать. чем один большой...
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 15:54.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot