Форум программистов, компьютерный форум CyberForum.ru

Как передать массив в функцию не указывая размер - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.72
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
31.08.2011, 22:13     Как передать массив в функцию не указывая размер #1
Хочу сделать функцию для сортировки массивов с разным размером

как передать массив в функцию не указывая его размер ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2011, 22:13     Как передать массив в функцию не указывая размер
Посмотрите здесь:

C++ Передать в функцию размер массива указателей
C++ Как передать такой массив в функцию
Как передать двухмерный массив в функцию? C++
Как передать массив в функцию? C++
как передать массив у функцию? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
01.09.2011, 14:49     Как передать массив в функцию не указывая размер #21
Цитата Сообщение от Bers Посмотреть сообщение
когда делаешь delete [] ptr; компилятор же знает, откуда брать размер массива.
Значит он где то хранится.
В Билдере (адрес начала выделенного блока) - 4 байта. В ВС при релизе где-то в специальном месте, при дебаге выделяется дополнительно 20 байт со служебной информацией непосредственно перед выделяемым блоком.
Цитата Сообщение от easybudda Посмотреть сообщение
И даже размер правильно возвращает. Но вот незадача - только в винде.
Не совсем, тут все завсит от компилятора, допустим тотже Билдер выделяет память блоками по 4 байта и минимальный размер выделяемой памяти - 12 байт.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.09.2011, 07:26     Как передать массив в функцию не указывая размер #22
Цитата Сообщение от Bers
когда делаешь delete [] ptr; компилятор же знает, откуда брать размер массива.
Значит он где то хранится.
Цитата Сообщение от Bers
Однако же, и под линем компилятор откуда то же узнает, сколько элементов нужно удалять.
может они и отличаются от сишных
в C эта инфа хранится прямо рядом с выделенным блоком
в таком заголовке записанный размер блока показывает функциям выделения, где память занята,
чтобы они искали свободную память за его пределами
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.09.2011, 09:00     Как передать массив в функцию не указывая размер #23
Цитата Сообщение от kazak Посмотреть сообщение
тут все завсит от компилятора
Полностью согласен. У меня в частном случае размер правильно вернулся. Но без всякой гарантии, что так всегда будет.

Цитата Сообщение от accept Посмотреть сообщение
в C эта инфа хранится прямо рядом с выделенным блоком
Ну тут скорее вопрос не "где хранится", а "что хранится"... Суть в том, что при динамическом выделении памяти malloc() & co. могут выделить столько, сколько просят, или немного больше (выравнивание там и всё такое...), то есть
размер выделенной памяти >= размер 1 элемента * количество элементов
соответственно определять количество элементов разделив значение, возвращённое _msize() на размер элемента - не очень разумная затея.

Цитата Сообщение от grizlik78 Посмотреть сообщение
Что плохого в явном указании размера?
Лишние буковки лень писать, другого объяснения не могу придумать...
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
02.09.2011, 12:01     Как передать массив в функцию не указывая размер #24
Самое простое решение - хранить размер массива в самом массиве (в первом элементе. Если остальные элементы массива не числовые, то с malloc ом самым милым делом будет использовать void* + небольшая работа с указателями)... либо использовать класс vector с его итераторами.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
02.09.2011, 13:08     Как передать массив в функцию не указывая размер #25
Цитата Сообщение от Yurii_74 Посмотреть сообщение
Самое простое решение - хранить размер массива в самом массиве
Зачем? Ну, на крайний случай, ведь структуры для того и придуманы, чтобы объединять разнородную информацию. Зачем в массив-то пытаться размер запихнуть?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.09.2011, 13:19     Как передать массив в функцию не указывая размер #26
Цитата Сообщение от grizlik78 Посмотреть сообщение
Зачем? Ну, на крайний случай, ведь структуры для того и придуманы, чтобы объединять разнородную информацию. Зачем в массив-то пытаться размер запихнуть?
Да в общем-то удобно, нумерация с единицы начинается, и в нулевом элементе храниться размер массива, прямо как у строк в турбопаскале =)
А вопрос ТСа не имеет практического применения, т.к. если писать на плюсах, то у вектора/etc есть метод size, а в си лучше передавать размер массива аргументом...
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
02.09.2011, 16:39     Как передать массив в функцию не указывая размер #27
Цитата Сообщение от grizlik78 Посмотреть сообщение
Зачем?
Чтобы понять полезность этих самых структур, классов и других страшных слов. Ну и для общего развития. А иногда очень хочется, чтобы в памяти вещи лежали в строго определенном порядке (в конце концов вся память является одной сплошной строкой битов, и умение работать с ней одними ссылками да указателями бывает весьма полезно, imho).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2011, 21:46     Как передать массив в функцию не указывая размер
Еще ссылки по теме:

C++ как передать одномерный массив в функцию?
C++ Как передать массив в функцию?
Как правильно передать динамический массив в функцию, увеличивающую его размер, чтобы изменения сохранились C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
02.09.2011, 21:46     Как передать массив в функцию не указывая размер #28
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от nill Посмотреть сообщение
Хочу сделать функцию для сортировки массивов с разным размером

как передать массив в функцию не указывая его размер ?
У вас есть две возможности. Во-первых, передавать в функцию итераторы, то есть если речь о массиве, то передавать начальный и конечный итераторы, задающие диапазон.

Например,

C++
1
2
3
4
5
6
7
8
void f( int *, int * );
 
int main()
{
   int a[ 10 ];
 
   f( a, a + 10 );
}
Так как массивы с разной размерностью - это разные типы данных, то вы можете создать шаблонную функцию, которая будет создавать экземпляр инстанциации для каждого массива, а в эту шаблонную функцию передавать массив по ссылке. Пример такого подхода здесь вам уже показали.
Yandex
Объявления
02.09.2011, 21:46     Как передать массив в функцию не указывая размер
Ответ Создать тему
Опции темы

Текущее время: 13:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru