Перейти к содержимому

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

  • автор:

Передача динамического массива в функцию

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

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Передача динамического массива в функцию
void create_matrix(float **matr,float * mass,int n1);.

Передача динамического массива в функцию
Помогите разобраться, не могу понять где ошибка. Отлаживал, программа "вываливается" при вызове.

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

Передача динамического массива в функцию
Добрый вечер! Пытаюсь передать динамический массив a с размером n в функцию ii, изменить его.

Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873

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

Регистрация: 20.11.2008
Сообщений: 81

Что-то я не понял. Указатель на что тебе нужно возвращать. Да и как ты создаешь тот указатель, который возвращаешь.

295 / 55 / 5
Регистрация: 22.05.2008
Сообщений: 788
Не возможно создать двухмерный динамический массив. Компилятор тебя пошлет.
сцуко киборг
103 / 30 / 4
Регистрация: 11.09.2008
Сообщений: 193

Как вариант можешь создать класс, содержащий массив. И его передавать куда надо.
Тем более, что «динамический двумерный массив» всёравно, как верно заметил Spo1ler, реализовать «влоб» невозможно.

Регистрация: 13.10.2008
Сообщений: 144

Ну, не знаю, на сколько это правильно но я делаю так:
//создаем динам. 2-мерный массив
int n=10;
int **arr = new int *[n];
for(int i=0;i

//прототип функции прин. этот массив
void myFunction(int **, int rows, int columns);
//где rows-кол. строк, columns-столбцов

сцуко киборг
103 / 30 / 4
Регистрация: 11.09.2008
Сообщений: 193

Если так, то ничего возвращать не надо. Массив передается в подпрограмму «в оригинале», и все изменения в подпрограмме будут отражаться на нем и так. Тем более, функция типа void в принципе ничего не должна возвращать т.е. что бы ты не написал после return, компилятор будет ругаться.

А так, как написанно — по-моему правильно. Ничего изменять не надо.

нубик программист)
Регистрация: 04.06.2008
Сообщений: 348

void myFunction(int **, int n, int m)
int n=10;
int **arr = new int *[n];
for(int i=0;i >
вот так чтоли динамический массив в функции будет

Добавлено через 5 минут 48 секунд

1 2 3 4 5 6 7
void myFunction(int **, int n, int m) { int **arr = new int *[n] *[m]; for(int i=0;in;i++) arr[i] = new int[n]; }

вот так будет выглядеть функция двухмерного динамического массива
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602

A_etot_ne_zanyat,
У меня задача передать в функцию в качестве параметра динамический 2-хмерный массив
Сие в принципе невозможно, т.к. в Си нет динамических массивов.
В С++ можно заюзать класс std::vector, но препод тебе скорее всего не разрешит (они обычно любят студням гемора подкинуть Ж)
А для остального подойдут предложенные здесь варианты двойных указателей.

инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533

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

Добавлено через 8 минут 16 секунд
Посмотри пост Feuer, он правилен

нубик программист)
Регистрация: 04.06.2008
Сообщений: 348
И зачем создавать в функции двумерный массив, если он должен в фуекцию передаваться?
тоесть функция не может внутри себя создавать такой массив?

Эксперт С++

1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,819
Записей в блоге: 1
Мегатрон, Вот те со старых запасов

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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#include templatetypename T> inline int arrlen(T *arr){ return static_castint>(_msize(arr)/sizeof(T)); } int **arrCreate(const int row,const int col){ int **arr = new int*[row]; for(int i = 0; i  row; ++i) arr[i] = new int[col]; return arr; } void arrFree(int **arr){ int lenrow = arrlen(arr); for(int i = 0; i  lenrow; ++i) delete[] arr[i]; delete[] arr; } void arrInput(int **arr){ int lenrow = arrlen(arr); int lencol = arrlen(arr[0]); for(int i = 0; i  lenrow; ++i) for(int j = 0; j  lencol; ++j){ std::cout<"arr["<"]"<"["<"] = "; std::cin>>arr[i][j]; } } void arrOut(int **arr){ int lenrow = arrlen(arr); int lencol = arrlen(arr[0]); for(int i = 0; i  lenrow; ++i){ std::cout<"[ "; for(int j = 0; j  lencol; ++j) std::cout[i][j]<" "; std::cout<"]"::endl; } } int main() { const int r = 3; const int c = 3; int **arr = arrCreate(r,c); arrInput(arr); arrOut(arr); arrFree(arr); return 0; }

нубик программист)
Регистрация: 04.06.2008
Сообщений: 348

int n;
cin >> n;
int **arr = new int *[n];
for(int i=0;i так тут получается задаем n столбцов,а как же со строками?

инженер-системотехник
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533

Мегатрон, в функции можно делать что угодно, и создавать динамические массивы тоже, просто по условию задачи массив уже есть и его нужно передать в функцию, а не создавать там

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

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

Передача динамического массива в функцию
Нужно передать динамический массив в функцию, описав как ссылку (&p). Но я не понимаю, как к нему.

Передача динамического массива в функцию
извините мб глупый вопрос но не знаю как передать в функцию свой массив в 2 примере( в 1 примере.

Передача в функцию динамического массива
Всем привет. Есть, например, функция, работающая с динамическим массивом. Допустим я заполняю этот.

Как правильно передавать указатель или ссылку на динамический массив в функцию?

Добрый день! пытаюсь разобраться что лучше и как передавать ?
например у меня есть вот такой код : — в нем я передаю массив одномерный по ссылке ?
как правильно передать его по указателю ? я столкнулся при передачи по указателю что не понимаю где и что нужно разыменовывать например в этом кусочке кода !
следующий вопрос как передать тогда двумерный массив по ссылке и по указателю и как к ним обращаться ?

for (int i = 0; i < N; i++) < for (int j = N - 1; j >i; j--) < if (mass[j - 1] >mass[j]) < T3 temp = mass[j]; mass[j] = mass[j - 1]; mass[j - 1] = temp;
template void Bubble( T4 &mass,T3 N) < for ( int i =0;ifor (int i = 0; i < N; i++) < for (int j = N - 1; j >i; j--) < if (mass[j - 1] >mass[j]) < T3 temp = mass[j]; mass[j] = mass[j - 1]; mass[j - 1] = temp; >> > > int main()< int n; int m; cout>n; cout>m; cout cout return 0; >
  • Вопрос задан более трёх лет назад
  • 4454 просмотра

Комментировать
Решения вопроса 1
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻

Зачем усложнять? Динамический массив, как у тебя - это указатель на массив указателей, вот его и передавай. А лучше всего конечно vector.

#include #include const size_t SIZE = 10; // const нужен для защиты данных от модификации template void print1DArray(const T* array, const size_t size) < for (size_t i = 0; i < size; ++i) < std::cout std::cout template void print2DArray(const T* const* array, const size_t rows, const size_t columns) < for (size_t y = 0; y < rows; ++y) < for (size_t x = 0; x < columns; ++x) < std::cout std::cout std::cout template void printVector(const std::vector& vector) < for (const auto& item : vector) < std::cout std::cout int main() < int* array1D = new int[SIZE]; array1D[0] = 99; array1D[1] = 55; print1DArray(array1D, SIZE); delete[] array1D; int** array2D = new int*[SIZE]; for (size_t i = 0; i < SIZE; ++i) < array2D[i] = new int[SIZE * 2]; for (size_t j = 0; j < SIZE * 2; ++j) < array2D[i][j] = i + j; >> print2DArray(array2D, SIZE, SIZE * 2); for (size_t i = 0; i < SIZE; ++i) < delete[] array2D[i]; >delete[] array2D; std::vector vector(SIZE, 14); printVector(vector); return 0; >

Ответ написан более трёх лет назад
Vadim kyklaed @kyklaed Автор вопроса

так вот например я передаю
int *mass = new int [n]; - указатель на массив указателей
передача в функцию не по ссылке ?

int** array2D = new int*[SIZE] - вот это что значит int*[SIZE] - еще разыменование ?

мне не понятно где то пишут что когда передаешь указатель в функцию ты ты должен отдать ссылку на объект

Передача динамического массива как аргумент функции

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

Пытался изменить объявление на

void readFile(const char* file, int ** array, int * size)

и передавать

readFile(inputFile, &array, &size);

но запутался в дальнейшем.

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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#include #include void readFile(const char* file, int * array, int * size) { FILE* f = fopen(file, "rt"); if (!f) { printf("Error! Can not open source file!\nExit!\n"); exit(EXIT_FAILURE); } *size = 0; while ( !feof(f)) { if (fgetc(f) == '\n') (*size)++; } array = (int * )malloc((*size) * sizeof(int)); rewind(f); int i = 0; for (; i  *size; ++i) { fscanf(f, "%d", &array[i]); } fclose(f); } int main(int argc, char **argv) { if (argc  4) { printf("Error! Not enought of arguments!\nExit!\n"); exit(EXIT_FAILURE); } if (argc > 4) { printf("Error! Too many arguments!\nExit!\n"); exit(EXIT_FAILURE); } const char* inputFile = argv[1]; const char* outputFile = argv[2]; int * array /*= NULL*/; int size = 0; readFile(inputFile, array, &size); /*int i=0; for (; i < size; ++i)   printf("%d%s",array[i],"\n"); >*/ }

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Не получается адрес динамического двумерного массива передать, как аргумент функции
/* Лабораторная работа №3 Во всех вариантах необходимо написать три функции, которые будут.

Передача массива как аргумент функции
Здравствуйте! Не подскажете - как передать функции массив как аргумент без использования Variant.

Передача динамического массива в функции
#include <iostream> #include <cstdlib> using namespace std; /*const*/ int k=3; //void sum.

Передача динамического массива функции
Всем привет Возникла такая вот проблема. Создаю динамический массив а точнее 3, 2 одномерных и 1.

133 / 131 / 51
Регистрация: 25.05.2013
Сообщений: 233

ЦитатаСообщение от Enesi Посмотреть сообщение

Как тогда правильно передавать динамический массив
Вот пример передачи динамического массива в функцию:

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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#include #include #include #include //функция заполняет матрицу псевдослучайными данными void FillMatrix( int** matrix, const int size, const unsigned randRange, const int shift ); //функция печатает матрицу void PrintMatrix( int** matrix, const int size ); int main( void ) { srand( time( 0 ) ); // засеять генератор случайных чисел // запрашиваем у пользователя данные для матрицы int size; printf( "Введите размер квадратной матрицы " ); scanf( "%u", &size ); // объявляем нашу матрицу как указатель на int и выделяем необходимую память для нее int** a = ( int** ) calloc( size, sizeof(int*) ); int i; for ( i = 0; i  size; ++i ) a[ i ] = ( int* ) calloc( size, sizeof(int) ); // заполняем матрицу псевдослучайными значениями типа int FillMatrix( a, size, 100, 0 ); // выводим матрицу на экран puts( "Исходная матрица" ); PrintMatrix( a, size ); // освобождаем память, выделенную под матрицу for ( i = 0; i  size; ++i ) free( a[ i ] ); free( a ); return EXIT_SUCCESS; } void FillMatrix( int** matrix, const int size, const unsigned randRange, const int shift ) { int i, j; for ( i = 0; i  size; ++i ) for ( j = 0; j  size; ++j ) // shift - начальное значение диапазона, randRange - диапазон значений matrix[ i ][ j ] = shift + rand() % randRange; } void PrintMatrix( int** matrix, const int size ) { int i, j; for ( i = 0; i  size; ++i ) { for ( j = 0; j  size; ++j ) printf( "%4d ", matrix[ i ][ j ] ); puts( "" ); } }

Т.е. для массива двумерного передаем: ( указатель, количество строк, количество столбцов ).
Если массив квадратный, то количество строк == количетву столбцов == размер массива и передаем: ( указатель, размер массива ).

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

Слышала, что массив можно передавать в функцию в виде указателя. Откуда можно взять этот указатель? И как потом через него получать доступ к элементам исходного массива? Заранее спасибо.

Отслеживать
11.5k 8 8 золотых знаков 42 42 серебряных знака 69 69 бронзовых знаков
задан 4 ноя 2017 в 17:18
47 1 1 золотой знак 1 1 серебряный знак 3 3 бронзовых знака

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вас интересует это?

int func(int * arr, int n) < . >. int * array = new int[20]; func(array,20); 

Если нет - сформулируйте свой вопрос поточнее.

Отслеживать
ответ дан 4 ноя 2017 в 17:21
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков

Когда говорят про передачу массива в виде указателя, на самом деле подразумевают передачу пары «указатель на первый элемент массива — количество элементов массива»:

int func(int* base, size_t count) < // . >

Доступ же к элементам производится, как и в случае обычных массивов, через индексацию (при этом мы притворяемся, что указатель base — это и есть сам массив):

int item = base[i]; 

Данный фокус работает, потому что переменные-массивы — это на самом деле замаскированные указатели на участки фиксированного размера с данными этого массива. То есть никакой технической разницы между массивом и указателем на его первый элемент нет.

Теперь о том, почему мы передаём количество элементов (параметр count ). Дело в том, что пока мы работаем с переменной-массивом, компилятор знает его размер и может в любой момент предоставить его нам (через sizeof(array) / sizeof(array[0]) ). Однако, как только мы начинаем работать с указателями, всякая информация о массиве теряется, а потому мы должны передавать её явно, вместе с указателем. При создании же динамического массива мы сразу же получаем указатель, а потому вынуждены хранить и передавать количество его элементов явно.

Количество же нужно только для того, чтобы проверять, не обращаемся ли мы за пределы массива.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *