![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| almikhail |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 19.12.2006 Репутация: нет Всего: нет |
Как изнутри функции определить размер массива который передан как указатель в аргумент этой функции.
Функция sizeof в данном случае возвращает лишь размер типа. Спасибо за ответ. |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Простыми методами никак.
Думаю теоритически можно узнать размер выделенного блока памяти (delete[] ведь как-то это делает) Насколько я знаю sizeof вычисляет значение на этапе компиляции - динамический массив им мерить бесполезно Это сообщение отредактировал(а) Anikmar - 19.12.2006, 11:07 |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
а нельзя размер передать?
или vector -------------------- <удалено администрацией форума> |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
А ведь это совсем не сложно
Это сообщение отредактировал(а) apook - 19.12.2006, 13:23 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Я не понял принцип работы данного кода, если честно
|
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
apook не знаю что ты курил когда написал сий код, но вставило конкретно...
передай массивчик вида int daytab[14] = { 4, 5, 8, 0, 0, 28, 31, 40, 5, 88, 7, 7, 8 }; и погляди как сработает) это сработает для NULL-терминированных строк....ну уж никак для рандомного массива. Более того тот код вообще не коорректен и в общем случае вызовет(может вызвать) пробой памяти. Кто вам даст гарантию что в стеке есть NULL ?? ------- зы : в ф-цию передается лишь указатель и никаких данных более. нельзя пологаться на то что массив создан по new (malloc\etc).... передавайте отдельно размер или делайте тип (vector как кто-то уже предложил) что содержит в себе указание на размер... Это сообщение отредактировал(а) jonie - 19.12.2006, 13:51 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
В том-то и дело, что там не NULL ищется
for( ; *Array ; Array++, i++ ); ^^^^^ Этот каод применим только к строкам с конечным 0. Простого метода определения нет, и я полностью согласен с jonie. Проще передать указатель на массив и его размер - так сделано в огромном количестве библиотечных функций. Теоритически - можно узнать размер блока памяти, выделенного под массив, но это никак не даст нам собственно размер массива - там может быть выравнивание, память могла выделится с запасом и т.п. |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Принцып в том что известен последний символ массива
Цикл for( ; *Array ; Array++, i++ ); будет читать до последнего элемента для этого его размер на 1 больше а вообще можно явно указать последний символ например '\0'; int daytab[14] = { 4, 5, 8, 0, 0, 28, 31, 40, 5, 88, 7, 7, '\0' }; -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
И что этот код выдаст? Неужели размер массива?! Конкретно на этом примере он остановится на первом же 0. Код нерабочий, это и ежу понятно. Это сообщение отредактировал(а) Anikmar - 19.12.2006, 14:04 |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Код рабочий! Работает он по тому принципу что имя массива это есть указатель
на его нулевой символ таким образом по массиву можно пройти от начала до конца не используя индексы а прибавляя к имени единицу это детском саду говорили Array++ Вообще конечно такой способ для типа char ну вот вариант с нагромождениями
-------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
на daytab[3] ( == 0 ) код остановится. Код нерабочий. Для типа char давно написан std::string. А для других типов - basic_string<T>. |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Вообще то almikhail не указал какого типа массив возможна специфичная ситу
ация когда не следует использовать библиотечные функции. Зачем то же задан был этот вопрос
На Борландских компиляторах все прекрасно работает теоритически и практически -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| bsa |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Сказали код не работает. И не будет работать, так как алгоритм заведомо неверный. Преобразуем исходную программу в эту. Ведь это тоже самое, не так ли?
результат ее выполнения:
|
||||||||
|
|||||||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
Все что вы говорите относится к числовым массивам
для массивов символов алгоритм актуален не передает ни кто в strlen длину массива чтоб он правильно ее определил... int strlen(char* p) { int i = 0; while (*p++) i++; return i; } и не морочте мне голову Это сообщение отредактировал(а) apook - 19.12.2006, 17:18 -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Это ты морочишь голову. Причем не только себе. Посмотри, что ты здесь написал. Где там char? Там в массиве даже нуля в конце нет.
Кстати, речь идет о массивах вообще, а не о строковых. Если в строковых нулевой символ на конце - норма (для C/C++), то для всех остальных видов массивов - нет. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |