Модераторы: 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   Вверх
mes
Дата 18.7.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Dem_max @  18.7.2010,  09:07 Найти цитируемый пост)
аналог массива в паскале

аналог строки, насколько мне известно, но никак не массива..



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


Эксперт
****


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

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



Цитата(Dem_max @  18.7.2010,  11:07 Найти цитируемый пост)
в 0 байте храни размер массива, с 1 по 255 байты храни сами данные

... и добро пожаловать в каменный век! Далеко не все массивы имеют размер в 255 элементов. Очень часто встречаются и более большие. Да и не всегда массивы хранят целые числа, еще бывает структуры, классы, указатели...
Короче, твой совет из разряда медвежьих услуг.
PM   Вверх
Abyx
Дата 19.7.2010, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dem_max, в паскале у массивов длина хранится в int (int16 в 16-разрядном турбопаскале, int32 в 32-разрядной делфе) и находится не в начале массива, а перед ним.
PM MAIL   Вверх
Chiren
Дата 21.7.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Т.е. выхода иного получается нет, кроме как таскать за собой это число в переменной?

"Таскать" одну переменную не так уж тяжело smile. Но выход есть.
Можно ввести символ конца массива: например, последний элемент равен нулю. И по такому признаку узнавать длину массива smile. Но выяснение этой длины будет занимать время. Если не жалко быстродействия ради экономии одной переменной, то почему нет? 

Информацию об объёме выделенной памяти хранит ОС где-то в своих таблицах о свободной памяти. Но программисту эта информация не доступна.
PM MAIL   Вверх
mes
Дата 21.7.2010, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Chiren @  21.7.2010,  14:01 Найти цитируемый пост)
Но выяснение этой длины будет занимать время. 

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

и еще раз : не надо путать строку ( как терминированную последовательность )  и массив




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


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


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

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



>Но выход есть.

Среди извращений есть более простой и надежный вариант - выделять памяти на четыре (например) байта больше, чем нужно
Код

void *buf=malloc(sizeof(struct mystruct)*N+4);

в начало буфера записывать длину:
Код

memcpy(buf,&N,4);

и отдавать массив в пользование:
Код

struct mystruct *array=buf+4;

Освобождать память из-под него так:
Код

free(((void*)array)-4);



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


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


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

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



Цитата(djamshud @  21.7.2010,  14:26 Найти цитируемый пост)
Среди извращений есть более простой и надежный вариант 

smile, а стоит ли даже задумываться об этом, если есть нормальные неизвращенные варианты ?!   


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


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


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

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



mes, таким извращением удобно пользоваться например для передачи буферов данных по сети и обработки их без дополнительных промежуточных преобразований. Но вообще лучше конечно без них, хотя извращенцы всегда найдутся, и от этого никуда не уйти. Так сделаем их жизнь прекрасней!

:)


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


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


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

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



Цитата(djamshud @  21.7.2010,  15:10 Найти цитируемый пост)
таким извращением удобно пользоваться например для передачи буферов данных по сети и обработки их без дополнительных промежуточных преобразований.

ну да пакет, массив  и буффер одно и то же.. 


Цитата(djamshud @  21.7.2010,  15:10 Найти цитируемый пост)
хотя извращенцы всегда найдутся, 

одного из них я уже знаю "в лицо".. но не буду показывать пальцем.. smile 

Это сообщение отредактировал(а) mes - 21.7.2010, 16:42


--------------------
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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