Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
#1

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

09.12.2009, 16:30. Просмотров 2036. Ответов 15
Метки нет (Все метки)

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[]
И в чем различия.
Заранее благодарю за ответы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2009, 16:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамический двумерный массив в функцию. (C++):

Как передать в функцию двумерный динамический массив? - C++
#include &lt;iostream&gt; #include&lt;time.h&gt; #include&lt;cstdlib&gt; using namespace std; void zap(int array, int n) { ...

Динамический двумерный массив - C++
Если число находится в интервале от 100 до 110, то используя подпрограмму, в матрицах Р(N,M), Q(N1,M1) и R(N2,M2) найти и отпечатать L -...

Двумерный динамический массив - C++
Здравствуйте, подскажите пожалуйста где ошибка? реализовал 2 фукнции ввода и вывода массива. #include &lt;iostream&gt; #include &lt;windows.h&gt; ...

Двумерный динамический массив - C++
Необходимо ввести с клавиатуры количество строк и столбцов массива(матрица размером N*M), ввести исходные данные. Удалить столбец матрицы,...

Двумерный динамический массив - C++
Выскакивает ошибка Ошибка C2440 =: невозможно преобразовать &quot;int *&quot; в &quot;int **&quot; ConsoleApplication5 Из-за этого не выполняются...

Двумерный динамический массив - C++
Здравствуйте, задание такое: &quot;Описать двумерный массив R целых чисел, размерностью NхM элементов, заполнять массив случайными числами по...

15
Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
09.12.2009, 20:38  [ТС] #2
лабораторную надо сдать, а тут ошибка такая. подскажите плз, где я ступил.

буду очень благодарен)
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
09.12.2009, 20:53 #3
Для начала
C++
1
2
3
for(int i=0;i<strok;i++)
{
    for(int m=0;m<stolb;m++)
1
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);
}
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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);
}
1
Sergey_O
5 / 5 / 1
Регистрация: 09.12.2009
Сообщений: 65
09.12.2009, 23:53  [ТС] #6
без изменения(((
у вас работает это?

Добавлено через 27 минут
добавлю ещё, что конкретной ошибки не вылетает, программа просто виснет, когда доходит до этой строчки. смотрел через дебаггер.
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
10.12.2009, 00:49 #7
Sergey_O, все работает. В какой среде работаешь?
0
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 минут
щас всё работает, спасибо
0
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;
???
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
10.12.2009, 09:56 #10
В аттаче посмотри

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

в любом случае, благодарю за помошь)))
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
10.12.2009, 10:03 #13
основная ошибка была здесь
C++
1
int *massiv = new int [stolb];
сравни с правильным вариантом
C++
1
massiv[i] = new int [stolb];
1
-=ЮрА=-
Заблокирован
Автор 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";
        }
}
1
Миниатюры
Динамический двумерный массив в функцию.  
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 строка
И опять не понимаю, где я ошибся.

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

Двумерный Динамический массив - C++
Здравствуйте, такая проблема: не могу задать int** и char**...проблема в том что в функцию передются их размеры , но они не константы и...

Двумерный массив (поменять статический массив на динамический) - C++
Нужно поменять статический массив на динамический с выделением памяти #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; ...

Двумерный динамический массив символов - C++
Одномерный массив создаётся, но когда пытаюсь сделать двумерный, то ошибка. Заранее спасибо. #pragma argsused #include &lt;tchar.h&gt; ...

Глобальный динамический двумерный массив - C++
Вообще то задача на Си, но в разделе мало людей, поэтому пишу тут, помогите пожалуйста. Вообщем есть задача считать файл в функции init(),...


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

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

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