Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Zverit
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 21
Регистрация: 07.02.2010
Сообщений: 723
31.08.2011, 22:18     Как передать массив в функцию не указывая размер #2
Просто имя массива. Оно содержит адрес начала массива.
ruslan_abel
 Аватар для ruslan_abel
33 / 33 / 4
Регистрация: 06.05.2011
Сообщений: 91
31.08.2011, 22:18     Как передать массив в функцию не указывая размер #3
Использовать шаблон класса vector из std, или создать свой класс одномерного массива. Или использовать какое-нибудь значение для обозначения последнего элемента массива (как в стоках в стиле с). По другому вроде ни как.
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
31.08.2011, 22:21  [ТС]     Как передать массив в функцию не указывая размер #4
ITZver,
ruslan_abel,

можно короткий пример в коде, а то я как слабо понимаю о чем реч
Zverit
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 21
Регистрация: 07.02.2010
Сообщений: 723
31.08.2011, 22:22     Как передать массив в функцию не указывая размер #5
Т.е.
C++
1
2
int array[10];\\Создание массива
sort(array);\\Передача в функцию
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
31.08.2011, 22:31     Как передать массив в функцию не указывая размер #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>
 
int main()
{
    std::vector<int> vec;
    srand(time(0));
    for(int i = 0; i < 10; i++)
    {
        vec.push_back(rand() % 100);
        std::cout << vec[i] << " ";
    }
    std::cout << "\n";
    std::sort(vec.begin(), vec.end());
    for(int j = 0; j < vec.size(); j++)
        std::cout << vec[j] << " ";
    std::cout << "\n";
    system("pause");
    return 0;
}
Нельзя у обычного массива узнать размер.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.08.2011, 22:33     Как передать массив в функцию не указывая размер #7
если размер массива известен на этапе компиляции томожно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <iterator>
#include <algorithm>
 
template< typename T, std::size_t N >
void print(const T (&arr)[N])
{
    std::copy(arr, arr + N, std::ostream_iterator<T>(std::cout, " "));
}
 
template< typename T, std::size_t N >
void sort(T (&arr)[N])
{
    std::sort(arr, arr + N);
}
 
int main()
{
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    print(array);
    std::cout << std::endl;
    sort(array);
    print(array);
    return 0;
}
Zverit
Уничтожитель печенек
 Аватар для Zverit
276 / 204 / 21
Регистрация: 07.02.2010
Сообщений: 723
31.08.2011, 22:35     Как передать массив в функцию не указывая размер #8
nill, не указывая размер массива, можно передать в функцию. Но возможно множество ошибок времени выполнения, т.к вы можете перешагнуть за пределы массива.
Bers
Заблокирован
31.08.2011, 22:43     Как передать массив в функцию не указывая размер #9
Цитата Сообщение от ruslan_abel Посмотреть сообщение
Использовать шаблон класса vector из std, или создать свой класс одномерного массива. Или использовать какое-нибудь значение для обозначения последнего элемента массива (как в стоках в стиле с). По другому вроде ни как.

Есть какие то функции, которые возвращают размер массива.
Вот запамятовал, но помню точно - они есть
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
31.08.2011, 22:45     Как передать массив в функцию не указывая размер #10
Цитата Сообщение от Bers Посмотреть сообщение
Есть какие то функции, которые возвращают размер массива
C++
1
sizeof(массив) / sizeof(тип)
Bers
Заблокирован
31.08.2011, 22:53     Как передать массив в функцию не указывая размер #11
нет, сишная какая то...

искать нужно среди malloc`ов


когда делаешь delete [] ptr; компилятор же знает, откуда брать размер массива.
Значит он где то хранится.
И я точно помню, что когда то пользовался какой то функцией. Но за ненадобностью выветрилась из головы.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
31.08.2011, 23:18     Как передать массив в функцию не указывая размер #12
Цитата Сообщение от Bers Посмотреть сообщение
И я точно помню, что когда то пользовался какой то функцией. Но за ненадобностью выветрилась из головы.
Это что за чудо-функция такая? В linux есть malloc_usable_size(), но она возвращает количество памяти, выделенное malloc(). Это значение может быть равным или больше значения, переданного в malloc(), то есть нет гарантии, что вернётся точный размер массива.
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <malloc.h>
 
int main(void){
    char * buf = malloc(13);
    printf("%d\n", malloc_usable_size(buf));
    free(buf);
    return 0;
}
Код
$ ./buf13 
20
Bers
Заблокирован
31.08.2011, 23:33     Как передать массив в функцию не указывая размер #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от easybudda Посмотреть сообщение
Это что за чудо-функция такая?
Я её сколько ни шмуглил найти не мог, а вот по вашей наводке в итоге наткнулся на:

size_t _msize( void *memblock )
Returns the size of a memory block allocated in the heap. Parameters: memblock - Pointer to the memory block. Return Value: _msize returns the size (in bytes) as an unsigned integer. The _msize function returns the size, in bytes, of the memory...


Только надо проверить...

Добавлено через 8 минут
я конечно понимаю, что смешивать си и с++ - плохой вариант, но этот код работает:

C++
1
2
3
4
5
6
7
    char* A= new char[100];
    char* B= new char;
 
    cout << "Size="<< _msize(A)<<endl;
    cout << "Size="<< _msize(A)<<endl;
 
    delete[] A; A=NULL;    delete B; B=NULL;
Добавлено через 2 минуты
Там ещё есть какие то функции интересные. Я щас уже точно не помню, но с их помощью как то научил код различать указатели_на_объект, от указателей_на_массив.

Ну и помнить кол-во элементов дин. массива отпала нужда.

Но потом меня старшие товарищи напугали, что могут быть проблемы всякие. Да и вектор мне больше нравится, чем самопальный дин. массив....
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
31.08.2011, 23:38     Как передать массив в функцию не указывая размер #14
Bers, круто. А для стека не знаете как?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
31.08.2011, 23:42     Как передать массив в функцию не указывая размер #15
Цитата Сообщение от Bers Посмотреть сообщение
Только надо проверить...
Проверил, есть такая. И даже размер правильно возвращает. Но вот незадача - только в винде. То есть, если этой замечательной ОС не ограничиваться, тоже не вариант... Кстати странно - в винде памяти всегда выделяется ровно столько, сколько просил?

Добавлено через 1 минуту
Цитата Сообщение от iama Посмотреть сообщение
А для стека не знаете как?
На первой странице было
Цитата Сообщение от PointsEqual Посмотреть сообщение
sizeof(массив) / sizeof(тип)
iama
31.08.2011, 23:44
  #16

Не по теме:

easybudda, я на сонную голову подумал, что есть чудо-функция, которая покажет размер использованой части массива. Пардон.

Bers
Заблокирован
01.09.2011, 00:05     Как передать массив в функцию не указывая размер #17
Цитата Сообщение от iama Посмотреть сообщение
Bers, круто. А для стека не знаете как?
Нет)

Но, как мне старшеки объясняли: все, что знает компилятор, можно как то вытащить наружу.

... только нафег нужно да...

Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
Но вот незадача - только в винде.
Однако же, и под линем компилятор откуда то же узнает, сколько элементов нужно удалять.
Значит и там, может быть, есть какой то аналог?

Вообще, если опытный человек поковыряет malloc.h , то может быть что-то и узнает?

Добавлено через 1 минуту
Цитата Сообщение от easybudda Посмотреть сообщение
Кстати странно - в винде памяти всегда выделяется ровно столько, сколько просил?
Не могу сказать. У меня скилл маленький

Добавлено через 16 минут
вот кстати, любопытное обсуждение _msize
[ссылка удалена]
 Комментарий модератора 
Запрещено ссылки на другие форумы давать.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.09.2011, 00:47     Как передать массив в функцию не указывая размер #18
Цитата Сообщение от Bers Посмотреть сообщение
Однако же, и под линем компилятор откуда то же узнает, сколько элементов нужно удалять.
Значит и там, может быть, есть какой то аналог?
Ну так я же писал уже - malloc_usable_size(), но проблема та же - нет гарантии, что _msize() вернёт точный размер массива в байтах. Само собой ОС знает, сколько было выделено памяти по запросу, проблема в том, что выделено может быть чуть больше, чем запрошено...
Bers
Заблокирован
01.09.2011, 01:10     Как передать массив в функцию не указывая размер #19
Ну в общем, это не стандартное, не портируемое решение, и не безопасное решение.

У меня программа вообще валится, при попытке узнать количество нетривиальных объектов в массиве.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2011, 01:13     Как передать массив в функцию не указывая размер
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.09.2011, 01:13     Как передать массив в функцию не указывая размер #20
Переносимого способа определить размер массива нет. Баловство это всё. Даже если ограничиться Windows, то использование _msize() сделает функцию не универсальной — она не сможет работать с автоматическими/статическими массивами, а так же нельзя будет передать ей часть массива. Для использования _msize() должна быть какая-то веская причина, которую я с ходу придумать не могу.


Цитата Сообщение от nill Посмотреть сообщение
Хочу сделать функцию для сортировки массивов с разным размером
как передать массив в функцию не указывая его размер ?
Что плохого в явном указании размера?
Yandex
Объявления
01.09.2011, 01:13     Как передать массив в функцию не указывая размер
Ответ Создать тему
Опции темы

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