![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Proger10 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Есть такой код, которым я пытаюсь определить размер массива:
выражение: "Subchunk2Size / ( BitsPerSample / 8 )" - это некоторое значение из переменных. Думаю в этом проблемы быть не может, поэтому не останавливаюсь на объяснении каждой переменной. Выводит этот код вот что:
Получается он определяет мне размер массива Data как - 2 элемента, в то время когда туда загружено 106 тысяч элементов) А как бы определить покорректнее размер?) Такой вариант, которым я 106 тысяч определил - хороший конечно, но такой трюк не везде удасться в проекте использовать ![]() |
||||
|
|||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
Proger10 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Чего чего?
![]() |
|||
|
||||
Sosed |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 18.8.2009 Репутация: 1 Всего: 1 |
sizeof(Data)==sizeof(short)
sizeof возвращает размер указателя Data, равный 2 байтам если динамический массив то таскай размер с собой int size = Subchunk2Size / ( BitsPerSample / 8 ); Это сообщение отредактировал(а) Sosed - 13.6.2010, 23:45 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Уважаемые наркоманы, переставайте курить план и садитесь за учебники. Размер указателя любого типа кроме указателей на член класса равен размеру size_t. На x86 это 4 байта.
Закономерно равняется двум, ИЧСХ упорно распечатывается printf-ом. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Proger10
используй std::vector раз уж пишешь на C++. |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Alca, это для массива, а не для указателя на массив.
|
|||
|
||||
Proger10 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
А через указатель можно ли как-то узнать размер массива? Я пробовал через:
Оно вообще еденицу возвращает ![]() А как доступиться до самого массива-то? Пока так и таскаю за собой размер массива в переменной, что не очень удобно. Код не мой, переписывать на std::vector пока не много желания.. |
||||
|
|||||
toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
нет нельзя |
|||
|
||||
Proger10 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 16.12.2008 Репутация: нет Всего: нет |
Т.е. выхода иного получается нет, кроме как таскать за собой это число в переменной? ![]() (ну или использования std::vector) |
||||
|
|||||
toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Proger10
насколько мне известно, в векторе так и сделано(в классе существует отдельные переменные, которые отвечает за фактический размер и текущий размер capacity, size) |
|||
|
||||
bsa |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
У вектора есть минимум 3 приватных указателя (в принципе, можно извратиться и использовать только два, но тогда capacity всегда будет равен size). Первый указывает на начало области данных, второй на первую свободную ячейку этой области, третий - на следующую за концом области ячейку. Таким образом: size() = ptr2 - ptr1 capacity() = ptr3 - ptr1 empty() = ptr1 == ptr2 end() = ptr2 begin() = ptr1 ... Добавлено через 2 минуты и 16 секунд
тогда уж так:
|
||||||||
|
|||||||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
в 0 байте храни размер массива, с 1 по 255 байты храни сами данные, это будет аналог массива в паскале.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
аналог строки, насколько мне известно, но никак не массива.. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
... и добро пожаловать в каменный век! Далеко не все массивы имеют размер в 255 элементов. Очень часто встречаются и более большие. Да и не всегда массивы хранят целые числа, еще бывает структуры, классы, указатели... Короче, твой совет из разряда медвежьих услуг. |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
Dem_max, в паскале у массивов длина хранится в int (int16 в 16-разрядном турбопаскале, int32 в 32-разрядной делфе) и находится не в начале массива, а перед ним.
|
|||
|
||||
Chiren |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.10.2009 Репутация: нет Всего: нет |
"Таскать" одну переменную не так уж тяжело ![]() Можно ввести символ конца массива: например, последний элемент равен нулю. И по такому признаку узнавать длину массива ![]() Информацию об объёме выделенной памяти хранит ОС где-то в своих таблицах о свободной памяти. Но программисту эта информация не доступна. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
а также программист лишен одного варианта, того кто будет терминатором.. и еще раз : не надо путать строку ( как терминированную последовательность ) и массив |
|||
|
||||
djamshud |
|
||||||||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
>Но выход есть.
Среди извращений есть более простой и надежный вариант - выделять памяти на четыре (например) байта больше, чем нужно
в начало буфера записывать длину:
и отдавать массив в пользование:
Освобождать память из-под него так:
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
![]() |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
mes, таким извращением удобно пользоваться например для передачи буферов данных по сети и обработки их без дополнительных промежуточных преобразований. Но вообще лучше конечно без них, хотя извращенцы всегда найдутся, и от этого никуда не уйти. Так сделаем их жизнь прекрасней!
:) -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну да пакет, массив и буффер одно и то же.. одного из них я уже знаю "в лицо".. но не буду показывать пальцем.. ![]() Это сообщение отредактировал(а) mes - 21.7.2010, 16:42 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |