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

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 18.06.2012, 10:25   #1
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,139
Вес репутации: 4300/119
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Путаница какая-то с sizeof C18. Или так и должно быть?

В общем, имеется массив структур ms[8].

если в .с объявить
Код:
MS ms[8]
a в .h
Код:
extern MS ms[]
то
Код:
sizeof(ms)
возвращает длину одного элемента ms (т.е. размер структуры MS)
а если в .h
Код:
extern MS ms[8]
(либо при использовании sizeof внутри .с, где объявлен массив)
то
Код:
sizeof(ms)
возвращает длину всего массива, т.е длина MS*8

Оно вроде понятно... если длина не указана, то неизвестно число элементов массива. Но как-то путает.
__________________

Vanizma вне форума   Ответить с цитированием
Старый 18.06.2012, 11:40   #2
EugenOS
Senior Member
 
Регистрация: 31.12.2007
Адрес: Kazakhstan, Karaganda
Возраст: 36
Сообщений: 125
Вес репутации: 100/38
EugenOS will become famous soon enoughEugenOS will become famous soon enough
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

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

Правда в борланде RTTI есть, и оно может возвращать и размер всей выделенной динамической памяти...а здесь извините анси си...все на этапе компиляции
__________________
Хм...факир был пьян, и фокус не удался...
EugenOS вне форума   Ответить с цитированием
Старый 18.06.2012, 12:43   #3
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 67
Сообщений: 2,215
Вес репутации: 1898/79
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Вот поэтому детям и не разрешают

Цитата:
Сообщение от Vanizma Посмотреть сообщение
Оно вроде понятно... если длина не указана, то неизвестно число элементов массива. Но как-то путает.
играть со спичками.
Bill вне форума   Ответить с цитированием
Старый 18.06.2012, 13:55   #4
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

Цитата:
Сообщение от Vanizma Посмотреть сообщение
Оно вроде понятно... если длина не указана, то неизвестно число элементов массива. Но как-то путает.
Вот, предположим, ms описан в самом модуле, уберем extern, пусть:
Код:
 MS ms[];
Ну и посмотрите, сколько компилятор выделил места под ms, чему равно
Код:
sizeof(ms)
Так вот, сколько заказали, столько и получили.
Vlad&mir вне форума   Ответить с цитированием
Старый 18.06.2012, 14:22   #5
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,139
Вес репутации: 4300/119
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Вот, предположим, ms описан в самом модуле, уберем extern, пусть:
Код:
 MS ms[];
Ну и посмотрите, сколько компилятор выделил места под ms, чему равно
Код:
sizeof(ms)
Так вот, сколько заказали, столько и получили.
да оно понятно,
но в реале то объявлен ms[8] в .с
__________________

Vanizma вне форума   Ответить с цитированием
Старый 18.06.2012, 14:40   #6
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 42
Сообщений: 3,334
Вес репутации: 2341/95
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

Цитата:
Сообщение от Vanizma Посмотреть сообщение
да оно понятно,
но в реале то объявлен ms[8] в .с
MCC30 вообще не компилит с extern MS ms[];
Код:
error: invalid application of 'sizeof' to incomplete type 'struct MS[]
т.е., не к чему применить sizeof, что логично
vitalka вне форума   Ответить с цитированием
Старый 18.06.2012, 14:45   #7
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,139
Вес репутации: 4300/119
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

Цитата:
Сообщение от vitalka Посмотреть сообщение
MCC30 вообще не компилит с extern MS ms[];
Код:
error: invalid application of 'sizeof' to incomplete type 'struct MS[]
т.е., не к чему применить sizeof, что логично
Вот. и я о том же - могли бы предупреждение хотя бы и тут сделать.
__________________

Vanizma вне форума   Ответить с цитированием
Старый 18.06.2012, 14:50   #8
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

Цитата:
Сообщение от Vanizma Посмотреть сообщение
да оно понятно,
но в реале то объявлен ms[8] в .с
Но компилятор-то об этом "не знает". Вы же, по сути дела, обманули его.
Vlad&mir вне форума   Ответить с цитированием
Старый 18.06.2012, 14:52   #9
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,139
Вес репутации: 4300/119
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Но компилятор-то об этом "не знает". Вы же, по сути дела, обманули его.
Вай, я шаман, сумел таки )))
__________________

Vanizma вне форума   Ответить с цитированием
Старый 18.06.2012, 16:43   #10
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 67
Сообщений: 2,215
Вес репутации: 1898/79
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию А что мешает

Цитата:
Сообщение от Vanizma Посмотреть сообщение
да оно понятно,
но в реале то объявлен ms[8] в .с
объявить его и в .h?
Код:
extern MS ms[8];
Или нет?
Bill вне форума   Ответить с цитированием
Старый 18.06.2012, 16:52   #11
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,139
Вес репутации: 4300/119
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: А что мешает

Цитата:
Сообщение от Bill Посмотреть сообщение
объявить его и в .h?
Код:
extern MS ms[8];
Или нет?
ну это-то да....
__________________

Vanizma вне форума   Ответить с цитированием
Старый 19.06.2012, 10:06   #12
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,286
Вес репутации: 4442/101
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: А что мешает

Цитата:
Сообщение от Vanizma Посмотреть сообщение
ну это-то да....
как то не хорошо. Цифрами писать размер массива.
define в хедере, и потом уже везде подставлять размер, зато без проблем в одном месте поменял размер и не боишься что гдето он окажется другого размера.
ampersant вне форума   Ответить с цитированием
Старый 19.06.2012, 10:23   #13
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,139
Вес репутации: 4300/119
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: А что мешает

Цитата:
Сообщение от ampersant Посмотреть сообщение
как то не хорошо. Цифрами писать размер массива.
define в хедере, и потом уже везде подставлять размер, зато без проблем в одном месте поменял размер и не боишься что гдето он окажется другого размера.
ага, прямо на форуме...
естественно дефайнами сделано
__________________

Vanizma вне форума   Ответить с цитированием
Старый 06.03.2017, 13:10   #14
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 42
Сообщений: 375
Вес репутации: 243/23
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: А что мешает

Добрый день,
подскажите, а есть ли функция аналогичная sizeof() но чтобы возвращала количество элементов в массиве?
а то массив с элементами int и нужно знать сколько в нем элементов, можно конечно sizeof() делить на 2, но не хотса так...
есть человеческое решение?
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.03.2017, 13:27   #15
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,412
Вес репутации: 2927/62
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 C18. Или так и должно быть?

hfmscan
sizeof() лучше применять только к типам.
нужно знать сколько в нем элементов - количество элементов в массиве не должно быть магическим числом.
соответственно оно скорее всего будет макросом.
что мешает передать макрос через заголовок?
как лютый костыль можно sizeof(array_name)/sizeof(array_base_type)
besogon вне форума   Ответить с цитированием
Старый 06.03.2017, 13:33   #16
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,249
Вес репутации: 3684/107
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

Цитата:
Сообщение от besogon Посмотреть сообщение
как лютый костыль можно sizeof(array_name)/sizeof(array_base_type)
С чего это вдруг "лютый костыль"?
Нормальное решение. Второе из возможных.
Кстати в реалтайме оно не выполняется, а расчитывается на этапе компиляции.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 06.03.2017, 13:42   #17
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 42
Сообщений: 375
Вес репутации: 243/23
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

да, это решение очевидно, но в этом случае дейстаительно лучше завести константу или дефайн и его везде пользовтаь...
я думал есть функция готовая но раз нету, буду лепить дефайн
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.03.2017, 13:47   #18
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,412
Вес репутации: 2927/62
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 C18. Или так и должно быть?

IceS
Кстати в реалтайме оно не выполняется, а расcчитывается на этапе компиляции. - sizeof вычисляется на этапе компиляции. даже если массив переменной длины, то sizeof по факту это параметр создания, а не метод выяснения. верно?

почему лютый костыль. по простой причине: сперва человек определяет магическим числом длину массива. потом человеку оказывается нужна его длина, и заместо того, чтобы признать свою ошибку и сделать длину макросом он бахает sizeof/sizeof.

потом проходит время и оказывается, что код на ровном месте оказался гораздо хуже сопровождаем, чем мог бы быть.
besogon вне форума   Ответить с цитированием
Старый 06.03.2017, 13:50   #19
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 42
Сообщений: 375
Вес репутации: 243/23
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

ну вот я искал глюк, а оказалось что раньше массив был типа uchar, везде использовал в циклах sizeof(), а потом возникла необходимость поменять тип на u_int и ошибку нашел только недавно, благо в озу после объявления этого массива ничего критического не было, поэтому код и работал долго, пока я не решил увеличить размер массива с 20 элементов до 127 )
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.03.2017, 14:03   #20
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,412
Вес репутации: 2927/62
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 C18. Или так и должно быть?

hfmscan
есть разного рода статические анализаторы кода, которые могут помочь находить такого рода ошибки.
такой например.
https://www.viva64.com/ru/pvs-studio/
на год лицензия на 9 человек вроде около 300k.
besogon вне форума   Ответить с цитированием
Старый 06.03.2017, 14:07   #21
hfmscan
Senior Member
 
Аватар для hfmscan
 
Регистрация: 17.01.2013
Адрес: Москва
Возраст: 42
Сообщений: 375
Вес репутации: 243/23
hfmscan has a spectacular aura abouthfmscan has a spectacular aura abouthfmscan has a spectacular aura about
Отправить сообщение для hfmscan с помощью ICQ
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

Спасибо за информацию, но я то любитель и это не мой заработок ...
пошел шерстить проект по sizeof и еще накопал парочку потенциально кривых мест...
__________________
STM32F042
PIC18F25k80
hfmscan вне форума   Ответить с цитированием
Старый 06.03.2017, 14:09   #22
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,412
Вес репутации: 2927/62
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 C18. Или так и должно быть?

hfmscan
но я то любитель - тем более. для gpl проектов распространяется бесплатно.
иначе говоря если проект свободный - то можете использовать бесплатно.
реально мощный инструмент для статического анализа кода.
besogon вне форума   Ответить с цитированием
Старый 06.03.2017, 17:18   #23
Abivan
Member
 
Регистрация: 26.02.2007
Сообщений: 33
Вес репутации: 242/41
Abivan has a spectacular aura aboutAbivan has a spectacular aura aboutAbivan has a spectacular aura about
По умолчанию Re: Путаница какая-то с sizeof C18. Или так и должно быть?

/* Количество элементов */
#define arrsize(array) (sizeof(array)/sizeof((array)[0]))
ну и еще полезный макрос
/* размер члена структуры*/
#define sizeofm(ty, mem) sizeof(((ty*)(0))->mem)
Abivan вне форума   Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многофункциональные часы. Н.Заяц.Книга 4. samko Вопросы начинающих 11 12.06.2012 09:26
Нелинейность показаний АЦП..так должно быть или?.. maagalex Общетехнические вопросы 26 22.04.2012 09:08
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
Передача сигнала по линии питания 24В maagalex Общетехнические вопросы 34 25.04.2010 21:11


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


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