11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434

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

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

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

как передать массив в функцию не указывая его размер ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2011, 22:13
Ответы с готовыми решениями:

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

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

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

27
 Аватар для kazak
3605 / 2745 / 356
Регистрация: 11.03.2009
Сообщений: 6,313
01.09.2011, 14:49
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Bers Посмотреть сообщение
когда делаешь delete [] ptr; компилятор же знает, откуда брать размер массива.
Значит он где то хранится.
В Билдере (адрес начала выделенного блока) - 4 байта. В ВС при релизе где-то в специальном месте, при дебаге выделяется дополнительно 20 байт со служебной информацией непосредственно перед выделяемым блоком.
Цитата Сообщение от easybudda Посмотреть сообщение
И даже размер правильно возвращает. Но вот незадача - только в винде.
Не совсем, тут все завсит от компилятора, допустим тотже Билдер выделяет память блоками по 4 байта и минимальный размер выделяемой памяти - 12 байт.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.09.2011, 07:26
Цитата Сообщение от Bers
когда делаешь delete [] ptr; компилятор же знает, откуда брать размер массива.
Значит он где то хранится.
Цитата Сообщение от Bers
Однако же, и под линем компилятор откуда то же узнает, сколько элементов нужно удалять.
может они и отличаются от сишных
в C эта инфа хранится прямо рядом с выделенным блоком
в таком заголовке записанный размер блока показывает функциям выделения, где память занята,
чтобы они искали свободную память за его пределами
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
02.09.2011, 09:00
Цитата Сообщение от kazak Посмотреть сообщение
тут все завсит от компилятора
Полностью согласен. У меня в частном случае размер правильно вернулся. Но без всякой гарантии, что так всегда будет.

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

Цитата Сообщение от grizlik78 Посмотреть сообщение
Что плохого в явном указании размера?
Лишние буковки лень писать, другого объяснения не могу придумать...
1
paladin
 Аватар для Yurii_74
286 / 187 / 7
Регистрация: 25.02.2009
Сообщений: 589
02.09.2011, 12:01
Самое простое решение - хранить размер массива в самом массиве (в первом элементе. Если остальные элементы массива не числовые, то с malloc ом самым милым делом будет использовать void* + небольшая работа с указателями)... либо использовать класс vector с его итераторами.
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.09.2011, 13:08
Цитата Сообщение от Yurii_74 Посмотреть сообщение
Самое простое решение - хранить размер массива в самом массиве
Зачем? Ну, на крайний случай, ведь структуры для того и придуманы, чтобы объединять разнородную информацию. Зачем в массив-то пытаться размер запихнуть?
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
02.09.2011, 13:19
Цитата Сообщение от grizlik78 Посмотреть сообщение
Зачем? Ну, на крайний случай, ведь структуры для того и придуманы, чтобы объединять разнородную информацию. Зачем в массив-то пытаться размер запихнуть?
Да в общем-то удобно, нумерация с единицы начинается, и в нулевом элементе храниться размер массива, прямо как у строк в турбопаскале =)
А вопрос ТСа не имеет практического применения, т.к. если писать на плюсах, то у вектора/etc есть метод size, а в си лучше передавать размер массива аргументом...
0
paladin
 Аватар для Yurii_74
286 / 187 / 7
Регистрация: 25.02.2009
Сообщений: 589
02.09.2011, 16:39
Цитата Сообщение от grizlik78 Посмотреть сообщение
Зачем?
Чтобы понять полезность этих самых структур, классов и других страшных слов. Ну и для общего развития. А иногда очень хочется, чтобы в памяти вещи лежали в строго определенном порядке (в конце концов вся память является одной сплошной строкой битов, и умение работать с ней одними ссылками да указателями бывает весьма полезно, imho).
0
Заблокирован
02.09.2011, 21:46
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от nill Посмотреть сообщение
Хочу сделать функцию для сортировки массивов с разным размером

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

Например,

C++
1
2
3
4
5
6
7
8
void f( int *, int * );
 
int main()
{
   int a[ 10 ];
 
   f( a, a + 10 );
}
Так как массивы с разной размерностью - это разные типы данных, то вы можете создать шаблонную функцию, которая будет создавать экземпляр инстанциации для каждого массива, а в эту шаблонную функцию передавать массив по ссылке. Пример такого подхода здесь вам уже показали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2011, 21:46

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

Как передать в функцию массив?
Как передать в функцию массив?

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

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

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


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

Новые блоги и статьи
Хабру пора сливаться, время пришло, оно прийдёт за всеми, но ему давно пора (Хабр - галимый плагиат и кликбейт с саморекламой).
Hrethgir 04.08.2026
Стирают публикации с эффективными алгоритмами (в частности по алгоритму обхода дерева, был опубликован там 3-го мая, в зипапке . . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru