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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить размер массива? странное значение получаю..) 
:(
    Опции темы
Proger10
Дата 13.6.2010, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть такой код, которым я пытаюсь определить размер массива:

Код

short *Data;

Data = new short[ Subchunk2Size / ( BitsPerSample / 8 ) ];
        
fread( Data, BitsPerSample / 8, Subchunk2Size / ( BitsPerSample / 8 ), fhandle );
        
printf( "count = %i == %i == %i\n", sizeof( Data ) / sizeof( short ), Subchunk2Size / ( BitsPerSample / 8 ), sizeof( Data ) );
        


выражение: "Subchunk2Size / ( BitsPerSample / 8 )" - это некоторое значение из переменных. Думаю в этом проблемы быть не может, поэтому не останавливаюсь на объяснении каждой переменной. 

Выводит этот код вот что:
Код
count = 2 == 106805 == 4


Получается он определяет мне размер массива Data как - 2 элемента, в то время когда туда загружено 106 тысяч элементов) А как бы определить покорректнее размер?) Такой вариант, которым я 106 тысяч определил - хороший конечно, но такой трюк не везде удасться в проекте использовать smile
PM MAIL   Вверх
djamshud
Дата 13.6.2010, 21:03 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



sizeof(Data)==sizeof(size_t)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Proger10
Дата 13.6.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чего чего? smile
PM MAIL   Вверх
Sosed
Дата 13.6.2010, 23:43 (ссылка)    | (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



sizeof(Data)==sizeof(short)

sizeof возвращает размер указателя Data, равный 2 байтам
если динамический массив то таскай размер с собой
int size = Subchunk2Size / ( BitsPerSample / 8 );

Это сообщение отредактировал(а) Sosed - 13.6.2010, 23:45
PM MAIL   Вверх
mes
Дата 13.6.2010, 23:58 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Sosed @  13.6.2010,  22:43 Найти цитируемый пост)
sizeof(Data)==sizeof(short)

 smile 



--------------------
PM MAIL WWW   Вверх
djamshud
Дата 14.6.2010, 00:03 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



Уважаемые наркоманы, переставайте курить план и садитесь за учебники. Размер указателя любого типа кроме указателей на член класса равен размеру size_t. На x86 это 4 байта.
Код

sizeof( Data ) / sizeof( short ) // 4/2=2

Закономерно равняется двум, ИЧСХ упорно распечатывается printf-ом.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 14.6.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Proger10

используй std::vector раз уж пишешь на C++.

PM   Вверх
Alca
Дата 14.6.2010, 17:58 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Код

#define ARRAY_SIZE(a)       (sizeof(a) / sizeof((a)[0]))



--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 14.6.2010, 19:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Alca, это для массива, а не для указателя на массив.



--------------------
PM MAIL WWW   Вверх
Proger10
Дата 17.7.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @ 14.6.2010,  19:06)
Alca, это для массива, а не для указателя на массив.

А через указатель можно ли как-то узнать размер массива?
Я пробовал через:
Код

sizeof( *Data ) / sizeof( short )

Оно вообще еденицу возвращает smile (2/2 = 1)
А как доступиться до самого массива-то?

Пока так и таскаю за собой размер массива в переменной, что не очень удобно. Код не мой, переписывать на std::vector пока не много желания.. 
PM MAIL   Вверх
toxx
Дата 17.7.2010, 21:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А через указатель можно ли как-то узнать размер массива?


нет нельзя
PM MAIL   Вверх
Proger10
Дата 17.7.2010, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(toxx @ 17.7.2010,  21:21)
Цитата

А через указатель можно ли как-то узнать размер массива?


нет нельзя

Т.е. выхода иного получается нет, кроме как таскать за собой это число в переменной? smile
(ну или использования std::vector)
PM MAIL   Вверх
toxx
Дата 17.7.2010, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Proger10
насколько мне известно, в векторе так и сделано(в классе существует отдельные переменные, которые отвечает за фактический размер и текущий размер capacity, size)
PM MAIL   Вверх
bsa
Дата 18.7.2010, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(toxx @ 18.7.2010,  00:35)
Proger10
насколько мне известно, в векторе так и сделано(в классе существует отдельные переменные, которые отвечает за фактический размер и текущий размер capacity, size)

У вектора есть минимум 3 приватных указателя (в принципе, можно извратиться и использовать только два, но тогда capacity всегда будет равен size). Первый указывает на начало области данных, второй на первую свободную ячейку этой области, третий - на следующую за концом области ячейку. Таким образом:
size() = ptr2 - ptr1
capacity() = ptr3 - ptr1
empty() = ptr1 == ptr2
end() = ptr2
begin() = ptr1
...

Добавлено через 2 минуты и 16 секунд
Цитата(Alca @ 14.6.2010,  18:58)
Код

#define ARRAY_SIZE(a)       (sizeof(a) / sizeof((a)[0]))

тогда уж так:
Код
template<typename Type, size_t Size>
size_t arraySize(Type (&array)[Size])
{
    return Size;
}
В отличие от твоего варианта, попытка подсовывания указателя завершится ошибкой компиляции.
PM   Вверх
Dem_max
Дата 18.7.2010, 10:07 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



в 0 байте храни размер массива, с 1 по 255 байты храни сами данные, это будет аналог массива в паскале. 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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