Форум программистов, компьютерный форум CyberForum.ru

Динамический двумерный массив в функцию. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Sergey_O
 Аватар для Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
09.12.2009, 16:30     Динамический двумерный массив в функцию. #1
PHP
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
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <time.h>
using namespace std;
 
void razmerimassiva(int *strok, int *stolb)//Функция для запроса размерности массива
{
    cout << "Vvedite kol-vo strok i stolbcov" << endl;
    cin >> *strok >> *stolb;
}
void random(int** massiv,int *strok,int *stolb) //Функция для формирования рандомных чисел в динамическом массиве.
{
    for(int i=0;i<*strok;i++)
    {
        for(int m=0;m<*stolb;m++)
    {
        massiv[i][m]=rand()%100;
        }
    }
}
void main()
{
int strok, stolb;
razmerimassiva(&strok,&stolb);
 
int **massiv=new int *[strok];
for(int i=0;i<strok;i++)
{
    int *massiv=new int [stolb];
}
random(massiv,&strok,&stolb);
}
Добрый день.
Ошибка вот выходит, в 18 строчке, подскажите что делаю не так.
Работаю в visual studio

И ещё сразу вопрос, как правильно делать при определении параметров функции:int** massiv или int *massiv[]
И в чем различия.
Заранее благодарю за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2009, 16:30     Динамический двумерный массив в функцию.
Посмотрите здесь:

C++ Двумерный Динамический массив
C++ Не создается динамический двумерный массив
C++ Двумерный динамический массив символов
Двумерный массив (поменять статический массив на динамический) C++
Как передать в функцию двумерный динамический массив? C++
C++ Двумерный динамический массив. Разжевать
C++ Двумерный динамический массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sergey_O
 Аватар для Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
09.12.2009, 20:38  [ТС]     Динамический двумерный массив в функцию. #2
лабораторную надо сдать, а тут ошибка такая. подскажите плз, где я ступил.

буду очень благодарен)
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
09.12.2009, 20:53     Динамический двумерный массив в функцию. #3
Для начала
C++
1
2
3
for(int i=0;i<strok;i++)
{
    for(int m=0;m<stolb;m++)
Sergey_O
 Аватар для Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
09.12.2009, 22:14  [ТС]     Динамический двумерный массив в функцию. #4
Цитата Сообщение от M128K145 Посмотреть сообщение
Для начала
C++
1
2
3
for(int i=0;i<strok;i++)
{
    for(int m=0;m<stolb;m++)
убрал указатели, исправил параметр функции сразу(удалил указатели тоже)
проблема осталась

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
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <time.h>
using namespace std;
 
void razmerimassiva(int *strok, int *stolb)//Функция для запроса размерности массива
{
        cout << "Vvedite kol-vo strok i stolbcov" << endl;
        cin >> *strok >> *stolb;
}
void random(int** massiv,int strok,int stolb) //Функция для формирования рандомных чисел в динамическом массиве.
{
        for(int i=0;i<strok;i++)
        {
                for(int m=0;m<stolb;m++)
        {
                massiv[i][m]=rand()%100;
                }
        }
}
void main()
{
int strok, stolb;
razmerimassiva(&strok,&stolb);
 
int **massiv=new int *[strok];
for(int i=0;i<strok;i++)
{
        int *massiv=new int [stolb];
}
random(massiv,strok,stolb);
}
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
09.12.2009, 22:42     Динамический двумерный массив в функцию. #5
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
#include <iostream>
using namespace std;
 
void razmerimassiva(int *strok, int *stolb)
{
    cout << "Vvedite kol-vo strok i stolbcov" << endl;
    cin >> *strok >> *stolb;
}
void random(int** massiv,int strok,int stolb)
{
    int i, j;
    for(i = 0; i < strok; ++i)
        for(j = 0; j < stolb; ++j)
            massiv[i][j] = rand()%100;
}
void main()
{
    int strok, stolb, i;
    razmerimassiva(&strok,&stolb);
 
    int **massiv=new int *[strok];
    for(i = 0; i < strok; ++i)
        massiv[i]=new int [stolb];
    random(massiv,strok,stolb);
}
Sergey_O
 Аватар для Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
09.12.2009, 23:53  [ТС]     Динамический двумерный массив в функцию. #6
без изменения(((
у вас работает это?

Добавлено через 27 минут
добавлю ещё, что конкретной ошибки не вылетает, программа просто виснет, когда доходит до этой строчки. смотрел через дебаггер.
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
10.12.2009, 00:49     Динамический двумерный массив в функцию. #7
Sergey_O, все работает. В какой среде работаешь?
Sergey_O
 Аватар для Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
10.12.2009, 09:49  [ТС]     Динамический двумерный массив в функцию. #8
microsoft visual studio
file > new > project > visual c++ > win32 console application>галочка empty project > source file > add > new item > code > c++ file

Добавлено через 11 минут
щас всё работает, спасибо
cristaloleg
 Аватар для cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
10.12.2009, 09:54     Динамический двумерный массив в функцию. #9
а может проблема в том что rand() не объявлен???

C++
1
2
3
srand(GetTickCount());
//////////////
massiv[i][j] = rand()%100;
???
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
10.12.2009, 09:56     Динамический двумерный массив в функцию. #10
В аттаче посмотри

cristaloleg, нет, там все нормально
Вложения
Тип файла: rar HLP_Sergey_O.rar (1.5 Кб, 17 просмотров)
cristaloleg
 Аватар для cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
10.12.2009, 09:56     Динамический двумерный массив в функцию. #11
GetTickCount() - эт кол-во милисекунд активности системы...
просто по нему большой разброс цифр получается
Sergey_O
 Аватар для Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
10.12.2009, 09:58  [ТС]     Динамический двумерный массив в функцию. #12
а можете ткнуть носом, в чем была ошибка?
ибо у меня много подобных функций и ошибка повторяется(((

в любом случае, благодарю за помошь)))
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
10.12.2009, 10:03     Динамический двумерный массив в функцию. #13
основная ошибка была здесь
C++
1
int *massiv = new int [stolb];
сравни с правильным вариантом
C++
1
massiv[i] = new int [stolb];
-=ЮрА=-
Заблокирован
Автор FAQ
10.12.2009, 10:05     Динамический двумерный массив в функцию. #14
Не знаю но зачем так усложнять ++i если можно и i++?
Ну а в теле функции random добавил srand(0);
Кстати параметры в razmerimassiva(int *strok, int *stolb) можно и по ссылке передавать
C++
1
2
3
4
5
6
void razmerimassiva(int &strok, int &stolb)
{
        cout << "Vvedite kol-vo strok i stolbcov" << endl;
        cin >> strok;
        cin >> stolb;
}
PS:Я лишь изменил код под свои предпочтения!
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
#include <iostream>
using namespace std;
 
void razmerimassiva(int *strok, int *stolb)
{
        cout << "Vvedite kol-vo strok i stolbcov" << endl;
        cin >> *strok >> *stolb;
}
void random(int** massiv,int strok,int stolb)
{
        int i, j;
        srand(0);
        for(i = 0; i < strok; i++)//++i - Зачем так усложнять
                for(j = 0; j < stolb; j++)
                        massiv[i][j] = rand()%100;
}
void main()
{
        int strok, stolb, i,j;
        razmerimassiva(&strok,&stolb);
 
        int **massiv=new int *[strok];
        for(i = 0; i < strok; i++)
                massiv[i]=new int [stolb];
        random(massiv,strok,stolb);
        for(i = 0; i < strok; i++)
        {
                for(j = 0; j < stolb; j++)
                    cout<<massiv[i][j]<<"\t";
                cout<<"\r\n";
        }
}
Миниатюры
Динамический двумерный массив в функцию.  
Sergey_O
 Аватар для Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
10.12.2009, 10:14  [ТС]     Динамический двумерный массив в функцию. #15
Цитата Сообщение от M128K145 Посмотреть сообщение
основная ошибка была здесь
C++
1
int *massiv = new int [stolb];
сравни с правильным вариантом
C++
1
massiv[i] = new int [stolb];
этот момент я исправил, понял что сглупил))))

но вот щас так же вылетает на функции deletenaim
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <time.h>
using namespace std;
 
void razmerimassiva(int *strok, int *stolb)//Функция для запроса размерности массива
{
    cout << "Введите количество строк и столбцов" << endl;
    cin >> *strok >> *stolb;
}
void random(int** massiv,int strok,int stolb)
{
        int i, j;
        for(i = 0; i < strok; ++i)
                for(j = 0; j < stolb; ++j)
                        massiv[i][j] = rand()%100;
}
void vivodmassiva(int** massiv,int strok, int stolb)
{
        
    for(int i=0;i<strok;i++)
    {
        for(int m=0;m<stolb;m++)
        {
            cout << massiv[i][m] << "  " ;
        }
        cout << "\n";
    }
}
void poisknaim(int** massiv,int strok, int stolb,int *strok2, int *stolb2,int *pstrok, int *pstolb)//Поиск наим элемента и вывод его, позиция.
{   
    int k=0;
for(int i=0;i<strok;i++)
{
for(int m=0;m<stolb;m++)
        {
            if (massiv[i][m]<k) 
            {
                k=massiv[i][m];
                *pstrok=i;
                *pstolb=m;
            }
        }
    }
        cout << "" << endl;
        cout << "Naim element  " << k << endl;
        cout << "" << endl;
        *strok2=strok-1;
        *stolb2=stolb-1;
        cout << "Razmer novogo massiva  " << *strok2 << "  " << *stolb2 << endl;
}
void deletenaim(int** massiv,int** massiv2,int pstrok,int pstolb, int strok, int stolb)// Удаление наим элемента.
{
    int i2=0,m2=0;
    for(int i=0;i<strok;++i)
{
    if (i!=pstrok)
    {
        for(int m=0,m2=0;m<stolb;++m)
        {
            if(m!=pstolb)
        {massiv2[i2][m2]=massiv[i][m];
            m2++;
            }
        }
i2++;
    }
    
}
}
void main()
{
 
setlocale( LC_ALL,"Russian" );
int strok, stolb,strok2=0,stolb2=0,pstrok,pstolb,i;
razmerimassiva(&strok,&stolb);
 
        int **massiv=new int *[strok];
        for(i = 0; i < strok; ++i)
                massiv[i]=new int [stolb];
 
random(massiv,strok,stolb);
vivodmassiva(massiv,strok,stolb);
 int **massiv2=new int *[strok2];
        for(i = 0; i < strok2; ++i)
                massiv2[i]=new int [stolb2];
 
    
poisknaim(massiv,strok,stolb,&strok2,&stolb2,&pstrok,&pstolb);
deletenaim(massiv,massiv2,pstrok,pstolb,strok2,stolb2);
vivodmassiva(massiv2,strok2,stolb2);
 
for(int i=0;i<strok;i++)
delete massiv[i];
delete [] massiv;
 
}
Суть программы такова:
1. спрашиваю размеры
2. создаю
3. задаю рандомом.
4. вывожу на экран
5. ищу наим элемент
6. создаю новый дин.массив(исправил там код)
7. копирую старый массив в новый кроме столбца и строки с наим элементов, используя координаты наим числа
8. вывожу на экран
9. удаляю первый дин массив

Ошибка на {massiv2[i2][m2]=massiv[i][m]; 63 строка
И опять не понимаю, где я ошибся.

При чем без функций код работал отлично, но мне сказали всё перевести на функции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2009, 10:32     Динамический двумерный массив в функцию.
Еще ссылки по теме:

Двумерный динамический массив C++
C++ Двумерный динамический массив
Двумерный динамический массив структур C++
C++ Двумерный динамический массив
C++ Динамический двумерный вещественный массив

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

Или воспользуйтесь поиском по форуму:
cristaloleg
 Аватар для cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
10.12.2009, 10:32     Динамический двумерный массив в функцию. #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Не знаю но зачем так усложнять ++i если можно и i++?
Что тут сложного???
Yandex
Объявления
10.12.2009, 10:32     Динамический двумерный массив в функцию.
Ответ Создать тему
Опции темы

Текущее время: 22:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru