Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/56: Рейтинг темы: голосов - 56, средняя оценка - 4.70
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434

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

31.08.2011, 22:13. Показов 11677. Ответов 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 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru