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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 05.02.2018, 22:07   #1
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 45
Сообщений: 422
Вес репутации: 243/34
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
Возраст: 33
Сообщений: 2,359
Вес репутации: 4510/98
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
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/87
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
Адрес: Москва
Возраст: 45
Сообщений: 422
Вес репутации: 243/34
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
Возраст: 33
Сообщений: 2,359
Вес репутации: 4510/98
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
Адрес: Москва
Возраст: 45
Сообщений: 422
Вес репутации: 243/34
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
Возраст: 49
Сообщений: 184
Вес репутации: 1617/38
siarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant future
По умолчанию 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
Адрес: Москва
Возраст: 45
Сообщений: 422
Вес репутации: 243/34
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
Возраст: 33
Сообщений: 2,359
Вес репутации: 4510/98
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
Возраст: 49
Сообщений: 184
Вес репутации: 1617/38
siarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant future
По умолчанию 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
Адрес: Москва
Возраст: 45
Сообщений: 422
Вес репутации: 243/34
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
Возраст: 49
Сообщений: 184
Вес репутации: 1617/38
siarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant future
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Цитата:
Сообщение от hfmscan Посмотреть сообщение
да, в таком случае работает, но приходится делать строку
Так ведь unit1.h ещё называется "интерфейсом модуля unit1.c" и модуль uint1.c обязан его включать, чтобы компилятор мог как минимум проверить, что объявление публичных ресурсов в интерфейсе модуля совпадает с их имплементацией в самом модуле.
siarzhuk вне форума   Ответить с цитированием
Старый 06.02.2018, 13:03   #13
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 45
Сообщений: 422
Вес репутации: 243/34
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
Возраст: 49
Сообщений: 184
Вес репутации: 1617/38
siarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant future
По умолчанию Re: SizeOf (массив, объявленный в другом модуле) = 1

Цитата:
Сообщение от hfmscan Посмотреть сообщение
но интерфейс внешний, т.е. как бы я в h кроме дефайнов ничего объявить значимого не могу, например тот же массив...
В интерфейсе модуля желательно только то, что требуется знать об этом модуле извне. Если массив и его размер важны для "окружающих" - то они и должны быть в интерфейсе модуля - т.е. в H файле.
PS: Но если "по-правильному" модуль вообще никакого доступа к своим глобальным переменным никому позволять не должен - все манипуляции с ними должны делаться только функциями самого модуля. Так, мол, безопаснее.
siarzhuk вне форума   Ответить с цитированием
Старый 06.02.2018, 14:32   #15
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,875
Вес репутации: 2596/88
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
Адрес: Москва
Возраст: 45
Сообщений: 422
Вес репутации: 243/34
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, время: 13:53.


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