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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.72
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

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

31.08.2011, 22:13. Просмотров 4362. Ответов 27
Метки нет (Все метки)

Хочу сделать функцию для сортировки массивов с разным размером

как передать массив в функцию не указывая его размер ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2011, 22:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как передать массив в функцию не указывая размер (C++):

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

Не могу разобраться как передать корректно передать массив из функции в функцию - C++
//--------------------------------------------------------------------------- #pragma hdrstop ...

Как передать массив структур в функцию в качестве параметра, чтобы изменения в функции меняли исходный массив? - C++
Допустим есть структура struct Base { int a; int b; int c; }; В основном методе main() объявим массив...

Как передать массив в функцию? - C++
передайте, пожалуйста, массив у функцию #include "stdafx.h" #include <iostream> #include <stdlib.h> #include <time.h> using...

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

Как передать массив в функцию? - C++
#include <iostream> #include <cmath> using namespace std; int func(float arrcos, float arrsin) { int f=5000; int...

27
iama
31.08.2011, 23:44     Как передать массив в функцию не указывая размер
  #16

Не по теме:

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

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

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

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

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

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

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

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

У меня программа вообще валится, при попытке узнать количество нетривиальных объектов в массиве.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
01.09.2011, 01:13 #20
Переносимого способа определить размер массива нет. Баловство это всё. Даже если ограничиться Windows, то использование _msize() сделает функцию не универсальной — она не сможет работать с автоматическими/статическими массивами, а так же нельзя будет передать ей часть массива. Для использования _msize() должна быть какая-то веская причина, которую я с ходу придумать не могу.


Цитата Сообщение от nill Посмотреть сообщение
Хочу сделать функцию для сортировки массивов с разным размером
как передать массив в функцию не указывая его размер ?
Что плохого в явном указании размера?
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
01.09.2011, 14:49 #21
Цитата Сообщение от Bers Посмотреть сообщение
когда делаешь delete [] ptr; компилятор же знает, откуда брать размер массива.
Значит он где то хранится.
В Билдере (адрес начала выделенного блока) - 4 байта. В ВС при релизе где-то в специальном месте, при дебаге выделяется дополнительно 20 байт со служебной информацией непосредственно перед выделяемым блоком.
Цитата Сообщение от easybudda Посмотреть сообщение
И даже размер правильно возвращает. Но вот незадача - только в винде.
Не совсем, тут все завсит от компилятора, допустим тотже Билдер выделяет память блоками по 4 байта и минимальный размер выделяемой памяти - 12 байт.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.09.2011, 07:26 #22
Цитата Сообщение от Bers
когда делаешь delete [] ptr; компилятор же знает, откуда брать размер массива.
Значит он где то хранится.
Цитата Сообщение от Bers
Однако же, и под линем компилятор откуда то же узнает, сколько элементов нужно удалять.
может они и отличаются от сишных
в C эта инфа хранится прямо рядом с выделенным блоком
в таком заголовке записанный размер блока показывает функциям выделения, где память занята,
чтобы они искали свободную память за его пределами
0
easybudda
Модератор
Эксперт CЭксперт С++
9662 / 5611 / 952
Регистрация: 25.07.2009
Сообщений: 10,774
02.09.2011, 09:00 #23
Цитата Сообщение от kazak Посмотреть сообщение
тут все завсит от компилятора
Полностью согласен. У меня в частном случае размер правильно вернулся. Но без всякой гарантии, что так всегда будет.

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

Цитата Сообщение от grizlik78 Посмотреть сообщение
Что плохого в явном указании размера?
Лишние буковки лень писать, другого объяснения не могу придумать...
1
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
02.09.2011, 12:01 #24
Самое простое решение - хранить размер массива в самом массиве (в первом элементе. Если остальные элементы массива не числовые, то с malloc ом самым милым делом будет использовать void* + небольшая работа с указателями)... либо использовать класс vector с его итераторами.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
02.09.2011, 13:08 #25
Цитата Сообщение от Yurii_74 Посмотреть сообщение
Самое простое решение - хранить размер массива в самом массиве
Зачем? Ну, на крайний случай, ведь структуры для того и придуманы, чтобы объединять разнородную информацию. Зачем в массив-то пытаться размер запихнуть?
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.09.2011, 13:19 #26
Цитата Сообщение от grizlik78 Посмотреть сообщение
Зачем? Ну, на крайний случай, ведь структуры для того и придуманы, чтобы объединять разнородную информацию. Зачем в массив-то пытаться размер запихнуть?
Да в общем-то удобно, нумерация с единицы начинается, и в нулевом элементе храниться размер массива, прямо как у строк в турбопаскале =)
А вопрос ТСа не имеет практического применения, т.к. если писать на плюсах, то у вектора/etc есть метод size, а в си лучше передавать размер массива аргументом...
0
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
02.09.2011, 16:39 #27
Цитата Сообщение от grizlik78 Посмотреть сообщение
Зачем?
Чтобы понять полезность этих самых структур, классов и других страшных слов. Ну и для общего развития. А иногда очень хочется, чтобы в памяти вещи лежали в строго определенном порядке (в конце концов вся память является одной сплошной строкой битов, и умение работать с ней одними ссылками да указателями бывает весьма полезно, imho).
0
Сыроежка
Заблокирован
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 );
}
Так как массивы с разной размерностью - это разные типы данных, то вы можете создать шаблонную функцию, которая будет создавать экземпляр инстанциации для каждого массива, а в эту шаблонную функцию передавать массив по ссылке. Пример такого подхода здесь вам уже показали.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2011, 21:46
Привет! Вот еще темы с ответами:

Как передать массив в функцию? - C++
Добрый вечер! Задание следующие: Реализовать функцию, которая сдвигает содержимое массива влево на заданное число позиций (циклический...

Как передать массив в функцию? - C++
Вот код #include<iostream> #include<ctime> #include <cstdlib> #include <iomanip> using namespace std; int F(int a,int* nn){ ...

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

Как передать в функцию char массив? - C++
Стараюсь сделать консольную змейку. Вообще не понимаю ничего с этими char. #include "stdafx.h" #include "stdio.h" #include "iostream"...


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

Или воспользуйтесь поиском по форуму:
28
Yandex
Объявления
02.09.2011, 21:46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru