| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Узнать размер динамического массива |
| Автор: TheDestroyer 2.4.2009, 13:04 | ||
Возможно ли узнать размер динамического массива?
Похоже, что размер динамического массива узнать в C++, (у меня Borland C++) невозможно, и надо каждый раз передавать его размер как параметр. Это так? Спасибо |
| Автор: Alca 2.4.2009, 13:07 | ||||||||
Возможно если массив это сишная строка
Добавлено через 34 секунды В других случаях надо передавать размер массива. Добавлено через 1 минуту и 5 секунд
Это размер указателя |
| Автор: zim22 2.4.2009, 13:14 |
один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца. ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы. |
| Автор: Dmi3ev 2.4.2009, 13:14 | ||||
когда ты так пишешь ты должен понимать, что ar - это не массив, это всего лишь указатель... и размер массива массива ( 1 или 1000 элементов) никак не касается указателя... а если ты хочешь узнать объем в байтах, то можно просто после выделения памяти посчитать
|
| Автор: Alca 2.4.2009, 13:22 |
| заверни свои данные в структуру и передавай ее в функцию |
| Автор: zim22 2.4.2009, 13:22 | ||
Гугл рекомендует не использовать sizeof от типа. лучше написать
Т.к. если вы вдруг измените тип переменной size, то размер будет считаться неправильно. |
| Автор: azesmcar 2.4.2009, 13:39 | ||||
а может лучше в первом байте хранить размер и не считать в таком случае
что-то вроде этого |
| Автор: mrbrooks 2.4.2009, 13:39 |
| TheDestroyer, используй std::vector и не ломай мозг. |
| Автор: mrbrooks 2.4.2009, 13:40 |
| mes, припозднился |
| Автор: azesmcar 2.4.2009, 13:40 |
| по любому у этих методов полно недостатков, лучше передавать..либо в структуре, либо просто так..без разницы Добавлено через 2 минуты и 3 секунды а еще лучше - как сказали mrbrooks, mes используй вектор |
| Автор: Anikmar 2.4.2009, 13:47 | ||
Если это массив собственных классов - попутно наградить себя определением соответствующих конструкторов и операторов |
| Автор: zim22 2.4.2009, 13:47 | ||
размер статических массивов неявно передаётся в функцию в качестве параметра
|
| Автор: ISergeyN 2.4.2009, 14:03 | ||
А если так
|
| Автор: Dmi3ev 2.4.2009, 14:15 | ||||||
а зачем size другого типа, если я пишу:
хотя согласен, он может быть и беззнаковый и тд... но size в данном случае не влияет на размер одного элемента, влияние оказывает new int, соответственно как раз так писать
ненадежно! потому как, size - это количество элементов, и эта переменная будет неизменна, независимо от того какого типа будет массив и тд... zim22, ты в этот раз не прав... |
| Автор: mrbrooks 2.4.2009, 14:20 |
| хм. ребзя предлагаю объявить конкурс на самые лучшие костыли. |
| Автор: Soah 2.4.2009, 14:20 | ||
Dmi3ev, думаю zim22 хотел написать
|
| Автор: zim22 2.4.2009, 14:25 |
для этого случая непринципиально было, передавать в sizeof тип или название элементов. но есть большое НО. во всех остальный случаях это принципиально. Добавлено через 1 минуту и 30 секунд телепатией владеете? научите! |
| Автор: Soah 2.4.2009, 14:51 | ||||||
я что-то неправильно написал?
думаешь так правильно |
| Автор: zim22 2.4.2009, 15:05 | ||
думаешь так правильно |
| Автор: Dmi3ev 2.4.2009, 15:08 | ||||
zim22, правильнее, чем
это абсолютно то же самое, что взять переменную постороннюю совсем и написать вот так
те ни в склад, ни в лад, поцелуй дрова в живот получается... |
| Автор: zim22 2.4.2009, 15:14 |
| Dmi3ev, http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#sizeof только открывайте любым браузером, кроме Оперы. иначе половину текста не увидите |
| Автор: Soah 2.4.2009, 15:15 |
| zim22, а сколько будет в size1, в твоём варианте, и сколько в варианте Dmi3ev`a sizeof(int)*size != sizeof(long)*size а что не правильно? |
| Автор: zim22 2.4.2009, 15:18 |
акцент необходимо было делать не на конкретном значении, это не принципиально важно, а на приёме, который используется для минимизации возможных будущих потенциальных ошибок, связанных с передачей в sizeof не переменной, а типа. почитайте ссылку, что я выше дал на Гугл. |
| Автор: Soah 2.4.2009, 15:23 | ||
а с чего ты взял что varname в данном случае size? и что не правильно в моём варианте? |
| Автор: zim22 2.4.2009, 15:37 | ||
точно. в sizeof нужно было заключать не size, а &ar[0]. так что, да, я был не прав. |
| Автор: Dov 2.4.2009, 15:48 |
не &ar[0], а ar[0], т. е. не указатель на эл-нт, а его значение |
| Автор: Dmi3ev 2.4.2009, 16:11 | ||||
zim22, я тебе про то же, и Soah... короче вот так надо:
|
| Автор: zim22 2.4.2009, 17:11 | ||
| всё-равно не правильно. лучше тип передать, а не значение переменной. если у нас будет
то обращение к элементу по индексу 0, которого не существует считает мусор... |
| Автор: Dmi3ev 2.4.2009, 17:19 | ||
можно условие написать, что если равно 0, то вернуть 0... короче, хватит... бредовое уже обсуждение пошло... |
| Автор: zim22 2.4.2009, 17:21 | ||
кстати, правильно обнулить элементы так надо:
|
| Автор: mes 2.4.2009, 17:21 | ||
нельзя ли тут поподробней ? при чем тут мусор ? и вообще речь идет о sizeof(*array) или я чего то упустил ? Добавлено через 1 минуту и 12 секунд а где соблюдение рекомендации от гугля ? |
| Автор: Soah 2.4.2009, 17:25 | ||||
zim22,
посмотри что будет |
| Автор: zim22 2.4.2009, 17:27 |
гугл меня простит. sizeof(*array) или sizeof(array[0]) - разницы ведь нет? (я уже запутался окончательно %) ) это обращение к первому элементу массива. А если переменная мы пишем в коде int size=0; то *array будет содержать мусор. |
| Автор: Soah 2.4.2009, 17:30 |
нас интересует тип, а не значение |
| Автор: Anikmar 2.4.2009, 17:30 |
Никакого обращения к элементу здесь нет. Результат выражения считается при компиляции. |
| Автор: zim22 2.4.2009, 17:34 | ||
Я этого не знал. Всем спасибо за наставления |
| Автор: mes 2.4.2009, 17:34 | ||||
|
| Автор: Dmi3ev 2.4.2009, 17:58 | ||
короче, я так понимаю, мы пришли к такому варианту, учитывая все наши обсуждения)))
|
| Автор: Alca 2.4.2009, 18:06 | ||
| макрос ARRAYSIZE Есть Добавлено через 14 секунд Добавлено через 1 минуту
|
| Автор: andrew_121 2.4.2009, 18:14 |
| Alca, Простите, Уважаемая, а можно взглянуть на расширенный текст сего макроса? |
| Автор: mes 2.4.2009, 18:17 | ||||
насколько я помню он для статических массивов и звучит примерно так
|
| Автор: andrew_121 2.4.2009, 18:24 |
Глупо получилось |
| Автор: Dov 2.4.2009, 18:47 | ||||
Мне кажется, что все здесь запутались и не понимают, что имел ввиду ТС. Я думаю, что он имел ввиду следующее. Допустим у него есть такой код:
По-моему, что-то такое и хотел узнать ТС.. |
| Автор: Soah 2.4.2009, 18:55 |
| Dov, мы конечно немного отошли от темы, но ведь есть и решение http://forum.vingrad.ru/index.php?showtopic=253934&view=findpost&p=1831345 |
| Автор: Dov 2.4.2009, 19:04 |
| Soah, я не уверен, что это решение подойдёт к Добавлено через 3 минуты и 18 секунд к тому же, _msize возвращает размер памяти, выделенной при помощи сишных ф-ций: malloc и т.д. но не с помощью new. ИМХО. |
| Автор: Soah 2.4.2009, 19:22 | ||
Borland C++ 5, всё работает. |
| Автор: Dov 2.4.2009, 19:26 |
Ну, тогда и слава Б-гу. |
| Автор: TheDestroyer 3.4.2009, 13:00 | ||
| Спасибо большое за советы. Похоже, наилучший вариант по моему вопросу:
Выдает ошибку [Linker Error] Unresolved external '__msize' referenced from D:\...\UNIT1.OBJ Подскажите плз как справиться. |
| Автор: Soah 3.4.2009, 13:37 |
| http://forum.codenet.ru/showthread.php?t=26390 |
| Автор: SerK 1.12.2016, 17:28 | ||
Количество элементов в массие
|
| Автор: Alca 1.12.2016, 17:31 |
| Это динамический массив, бро? |