Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
v0l0d1ka
9 / 9 / 3
Регистрация: 14.12.2010
Сообщений: 129
#1

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

27.02.2015, 21:17. Просмотров 1083. Ответов 2
Метки нет (Все метки)

Помогите разобраться, не могу понять где ошибка. Отлаживал, программа "вываливается" при вызове функции освобождения памяти
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
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void delete_array(int **arr, int r_c);
int **create_array(int n,int m);
void fill_array(int *arr, int n, int m);
void print_array(int *arr, int n, int m);
 
int main() {
    int **arr;
//Тут читаем n и m из файла
    int n, m;
    cout << "Enter n = ";
    cin >> n;
    cout << endl << "Enter m = ";
    cin >> m;
    arr = create_array(n,m);
    fill_array(&arr[0][0], n, m);
    print_array(&arr[0][0], n, m);
    delete_array(arr, n);
    system("pause");
    return 0;
}
void delete_array(int **arr, int row_count) {
    for(int r=0; r<row_count; r++)
        delete [] &arr[0][r];
    delete [] arr;
}
 
int **create_array(int n,int m) {
    int** array=new int*[m];
    for(int s=0; s<m; s++)
        array[s]=new int [1];
    return array;
}
 
void fill_array(int *arr, int n, int m){
    srand(time(NULL));
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++)
            *(arr + i*m + j) =  1 + rand() % 20;    // 1 ... 20 
    }
}
 
void print_array(int *arr, int n, int m){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++)
            cout << *(arr + i*m + j) << ' ';
        cout << endl;
    }
}

http://www.cyberforum.ru/cpp-beginners/thread2005025.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2015, 21:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передача динамического массива в функцию (C++):

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

Передача динамического массива в функцию
У меня задача передать в функцию в качестве параметра динамический 2-хмерный...

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

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

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

2
Melg
538 / 159 / 79
Регистрация: 23.09.2013
Сообщений: 316
27.02.2015, 22:02 #2
v0l0d1ka,
C++
1
2
3
4
5
void delete_array(int **arr, int row_count) {
    for(int r=0; r<row_count; r++)
        delete [] arr[r];
    delete [] arr;
}
Поскольку delete [] - удаляет массив элементов.
Ему нужно передать массив, а не указатель на конкретный элемент.

Плюс к тому, не понятно, что Вы тут пытались сделать:
C++
1
2
3
4
5
6
int **create_array(int n,int m) {
    int** array=new int*[m];
    for(int s=0; s<m; s++)
        array[s]=new int [1];
    return array;
}
переменная n вообще не используется.

Добавлено через 4 минуты
Может быть имелось ввиду, что-то типа:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstdlib>
#include <ctime>
 
void delete_array(int **arr, int width) {
  for (int w = 0; w < width; ++w) {
    delete[] arr[w];
  }
  delete[] arr;
}
 
int **create_array(int width, int height) {
  int **array = new int *[width];
  for (int w = 0; w < width; ++w) {
    array[w] = new int[height];
  }
  return array;
}
 
void fill_array(int **arr, int width, int height) {
  srand(time(NULL));
  for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) {
      arr[i][j] = 1 + rand() % 20;
    }
  }
}
 
void print_array(int **arr, int width, int height) {
  for (int w = 0; w < width; w++) {
    for (int h = 0; h < height; h++) {
      std::cout << arr[w][h] << ' ';
    }
    std::cout << '\n';
  }
}
 
int main() {
  const int width = 6;
  const int height = 5;
  int **arr = create_array(width, height);
  fill_array(arr, width, height);
  print_array(arr, width, height);
  delete_array(arr, width);
}
Пруф работоспособности:
http://ideone.com/ywyskn
1
v0l0d1ka
9 / 9 / 3
Регистрация: 14.12.2010
Сообщений: 129
28.02.2015, 01:07  [ТС] #3
Немного допилил программу, чтобы использовать арифметику указателей вместо индексов и добавил поиск минимального элемента с его заменой на arr[0][0].
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
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
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void delete_array(int **arr, int row) {
  for (int r = 0; r < row; ++r) {
    delete[] arr[r];
  }
  delete[] arr;
}
 
int **create_array(int row, int col) {
  int **array = new int *[row];
  for (int r = 0; r < row; ++r) {
    array[r] = new int[col];
  }
  return array;
}
 
void fill_array(int **arr, int row, int col) {
  srand(time(NULL));
  for (int r = 0; r < row; r++) {
    for (int c = 0; c < col; c++) {
      *(*(arr + r) + c) = 1 + rand() % 20;
    }
  }
}
 
void print_array(int **arr, int row, int col) {
  for (int r = 0; r < row; r++) {
    for (int c = 0; c < col; c++) {
        cout << setw(3) << *(*(arr+r)+c) << ' ';
    }
    cout << endl;
  }
}
 
int * find_min_pos(int **arr, int row, int col){
    int min = **arr;
    int *adr_min;
    for (int r = 0; r < row; r++) 
        for (int c = 0; c < col; c++) 
            if(*(*(arr+r)+c) < min) {
                min = *(*(arr+r)+c);
                adr_min = *(arr+r)+c;
            }
    return adr_min;
}
 
int main() {
  int width, height, *min;
  int temp;
  int i = 0;
  cout << "Enter rows: ";
  cin >> height;
  cout << endl << "Enter columns: ";
  cin >> width;
  int **arr = create_array(height, width);
  fill_array(arr, height, width);
  print_array(arr, height, width);
  min = find_min_pos(arr, height, width);
  temp = *(*arr);
  *(*arr) = *min;
  *min = temp;
  cout << "After swap: " << endl;
  print_array(arr, height, width);
  delete_array(arr, height);
  system("pause");
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2015, 01:07
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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