Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
35 / 32 / 21
Регистрация: 11.07.2014
Сообщений: 390
1

Работа с динамическим массивом: три варианта инициализации в отдельной функции

11.10.2014, 18:24. Просмотров 1202. Ответов 10
Метки нет (Все метки)

Не правильно выводит
C++
1
cout << "1 елемент массива: " << mainArray[0] << endl;
В чем проблема? Спасибо.
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
#include <iostream>
#include <locale.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
 
int enterArray(int *, int);
int MaxElement(int *, int);
int MinElement(int *, int);
 
int main(int argc, char** argv) {
    setlocale(LC_ALL,"rus");
    int* mainArray;
    int size;
    cout << "Размер массива: ";cin >> size;
    enterArray(mainArray, size);
    cout << "1 елемент массива: " << mainArray[0] << endl;
    return 0;
}
 
int enterArray(int* array, int size){
    cout << "Размер массива enterArray: " << size << " !\n";
    array = new int[size];
    for(int i = 0 ; i < size ; i++){
        array[i] = i*i;
    }
    for(int i = 0 ; i < size ; i++){
        cout << "Елементы массива: "<<array[i]<<" !\n";
    }
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2014, 18:24
Ответы с готовыми решениями:

Работа с динамическим массивом
Дано: динамический двумерный массив. Определить сумму всех элементов (с помощью функции, массив и...

Работа с динамическим массивом
Помогите, пожалуйста. В чем проблема? Компилирует, но выполнять не хочет. Надо вставить элемент в...

Работа с динамическим массивом структур
Односвязный список. Проблема (скорее всего) в строке ListPoint1 = pointer; Pointer использую как...

Работа с динамическим двумерным массивом
Написал код. В двумерном массиве 5х5 находится максимальное значение каждой строки и затем...

10
Заблокирован
11.10.2014, 18:28 2
Пишем в строке 15
C++
1
mainArray = new int[size];
а строке 22 убираем
C++
1
array = new int[size];
Не забудьте перед return 0 в main удалить
C++
1
delete [] mainArray;
1
35 / 32 / 21
Регистрация: 11.07.2014
Сообщений: 390
11.10.2014, 18:34  [ТС] 3
спасибо!
0
4197 / 1790 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
11.10.2014, 18:45 4
bazJaz, проблема в том, что сам указатель передан по указателю, то есть функция enterArray имеет его копию, когда она выделяет память, меняет значение копии, но не оригинала, так как к нему функция enterArray вообще не имеет доступа, поэтому память выделяется по параметру функции enterArray , а не по переменной, взятой за основу его значения, в функции main память по прежнему не выделена.
1
35 / 32 / 21
Регистрация: 11.07.2014
Сообщений: 390
11.10.2014, 18:57  [ТС] 5
Цитата Сообщение от taras atavin Посмотреть сообщение
проблема в том, что сам указатель передан по указателю, то есть функция enterArray имеет его копию, когда она выделяет память, меняет значение копии, но не оригинала, так как к нему функция enterArray вообще не имеет доступа, поэтому память выделяется по параметру функции enterArray , а не по переменной, взятой за основу его значения, в функции main память по прежнему не выделена.
__________________
если у меня будет несколько функций и массив надо инициализировать в одной из функций а в другой надо найти минимальный елемент массива, как передавать?
надо чтобы инициализация была в enterArray
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
int main(int argc, char** argv) {
    setlocale(LC_ALL,"rus");
    int* mainArray;
    int size;
    cout << "Размер массива: ";cin >> size;
    mainArray = new int[size];
    enterArray(mainArray, size);
    cout << "1 елемент массива: " << mainArray[2] << endl;
    cout << "Минимальный елемент: " << MinElement(mainArray, size) << " !\n"; 
    cout << "Максимальный елемент: " << MaxElement(mainArray, size) << " !\n";
    
    delete [] mainArray;
    return 0;   
}
 
int enterArray(int* array, int size){   
    for(int i = 0 ; i < size ; i++){
        array[i] = (i+1)*(i+1);
    }
    for(int i = 0 ; i < size ; i++){
        cout << "Елементы массива: "<<array[i]<<" !\n";
    }
    return 0;
}
int MinElement(int* array, int size){
    int min = array[0];
    for(int i = 1 ; i < size; i++){
        if(min > array[i]){
            min = array[i];
        }
    }
    return min;
}
int MaxElement(int* array, int size){
    int max = array[0];
    for(int i = 1 ; i < size; i++){
        if(max < array[i]){
            max = array[i];
        }
    }
    return max;
}
0
Заблокирован
11.10.2014, 19:05 6
Цитата Сообщение от bazJaz Посмотреть сообщение
и массив надо инициализировать в одной из функций
Тогда функция должна возвращать указатель на массив.

Добавлено через 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
int main(int argc, char** argv) {
    setlocale(LC_ALL,"rus");
    int size;
    cout << "Размер массива: ";cin >> size;
    int *mainArray = enterArray(size);
    cout << "1 елемент массива: " << mainArray[2] << endl;
    cout << "Минимальный елемент: " << MinElement(mainArray, size) << " !\n";   
    cout << "Максимальный елемент: " << MaxElement(mainArray, size) << " !\n";
    
    delete [] mainArray;
    return 0;   
}
 
int *enterArray(int size){   
    int *arr = new int[size];
    for(int i = 0 ; i < size ; i++){
        arr[i] = (i+1)*(i+1);
    }
    for(int i = 0 ; i < size ; i++){
        cout << "Елементы массива: "<<arr[i]<<" !\n";
    }
    return arr;
}
1
4197 / 1790 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
11.10.2014, 19:07 7
Цитата Сообщение от IrineK Посмотреть сообщение
Тогда функция должна возвращать указатель на массив.
Не обязательно. Можно передать указатель на указатель, или ссылку на указатель.
1
Заблокирован
11.10.2014, 19:11 8
Цитата Сообщение от taras atavin Посмотреть сообщение
Можно передать указатель на указатель, или ссылку на указатель.
Ваш код?
1
4197 / 1790 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
11.10.2014, 19:17 9
Лучший ответ Сообщение было отмечено bazJaz как решение

Решение

Цитата Сообщение от bazJaz Посмотреть сообщение
если у меня будет несколько функций и массив надо инициализировать в одной из функций а в другой надо найти минимальный елемент массива, как передавать?
надо чтобы инициализация была в enterArray
Указатель на параметр надо передать по ссылке, или указателю, а сам параметр (массив) по ссылке на указатель, или по указателю на указатель.
C++
1
int MinElement(int **, int);
, или
C++
1
int MinElement(int *&, int);
. Кстати, почему функция возвращает int? Если уж надо возвращать значение, зависящее от того, была ли ошибка времени исполнения, то лучше bool. Но зачем? Неудача выделения памяти даст указатель, равный NULL, или null_ptr, так что достаточно void. Или надо обязательно вызов функции запихать в условие ифа, или цикла?

Добавлено через 3 минуты
Цитата Сообщение от IrineK Посмотреть сообщение
Ваш код?
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
#include <iostream>
#include <locale.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
 
int enterArray(int *, int);
int MaxElement(int *, int);
int MinElement(int **, int);
 
int main(int argc, char** argv) {
    setlocale(LC_ALL,"rus");
    int* mainArray;
    int size;
    cout << "Размер массива: ";cin >> size;
    enterArray(&mainArray, size);
    cout << "1 елемент массива: " << mainArray[0] << endl;
    delete [] mainArray;
    return 0;
}
 
int enterArray(int **array, int size){
    cout << "Размер массива enterArray: " << size << " !\n";
    *array = new int[size];
    for(int i = 0 ; i < size ; i++){
        (*array)[i] = i*i;
    }
    for(int i = 0 ; i < size ; i++){
        cout << "Елементы массива: "<<(*array)[i]<<" !\n";
    }
    return 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
#include <iostream>
#include <locale.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
 
int enterArray(int *, int);
int MaxElement(int *, int);
int MinElement(int *&, int);
 
int main(int argc, char** argv) {
    setlocale(LC_ALL,"rus");
    int* mainArray;
    int size;
    cout << "Размер массива: ";cin >> size;
    enterArray(mainArray, size);
    cout << "1 елемент массива: " << mainArray[0] << endl;
    delete [] mainArray;
    return 0;
}
 
int enterArray(int *&array, int size){
    cout << "Размер массива enterArray: " << size << " !\n";
    array = new int[size];
    for(int i = 0 ; i < size ; i++){
        array[i] = i*i;
    }
    for(int i = 0 ; i < size ; i++){
        cout << "Елементы массива: "<<array[i]<<" !\n";
    }
    return 0;
}
.
1
Заблокирован
11.10.2014, 19:19 10
bazJaz, у вас три варианта - выбирайте )
1
35 / 32 / 21
Регистрация: 11.07.2014
Сообщений: 390
11.10.2014, 21:07  [ТС] 11
Цитата Сообщение от IrineK Посмотреть сообщение
у вас три варианта - выбирайте )
спасибо))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2014, 21:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка в функции с динамическим массивом
Данный код у меня выдаёт ошибку :Необработанное исключение в &quot;0x01281d09&quot; в &quot;Chernovick.exe&quot;:...

Работа с матрицей, представленной динамическим массивом
Есть задание: Написать программу, которая осуществляет добавление, удаление строки или столбца в...

Функции для работы с одномерным динамическим массивом
Написать функции для работы с одномерным динамическим массивом: 1. Заполнение массива случайными...

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


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

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

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