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

Указатель на многомерный массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Algiz
159 / 159 / 13
Регистрация: 23.02.2011
Сообщений: 347
19.07.2011, 23:45     Указатель на многомерный массив #1
Есть двумерный массив, его нужно передать в функцию, так, что бы внутри функции можно было его изменять.
Как с помощью указателей передать двумерный массив в функцию, и как внутри ф-ции к его элементам обращаться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2011, 23:45     Указатель на многомерный массив
Посмотрите здесь:

Многомерный массив, Си!!! C++
многомерный массив C++
C++ многомерный массив
Многомерный массив C++
Многомерный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
19.07.2011, 23:48     Указатель на многомерный массив #2
передача в функцию
C++
1
2
3
4
void FillingMatrix ( int ** matrix, int size )
{
    //...
}
работа с динамической матрицей точно такая же, как и с обычной...
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
19.07.2011, 23:54     Указатель на многомерный массив #3
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 <time.h>
#include <stdio.h>
 
using namespace std;
 
#define rows 10
#define cols 10
 
void Fill(int **m)
{
    for(int i = 0;i<rows;i++)
    {
        for(int j = 0;j<cols;j++)
        {
            m[i][j] = rand()%100;
        }
    }
}
 
void Print(int **m)
{
    for(int i = 0;i<rows;i++)
    {
        for(int j = 0;j<cols;j++)
        {
            cout<<m[i][j]<<" ";
        }
        cout<<endl;
    }
}
 
int main()
{
    srand(time(NULL));
    int **mas = new int*[rows];
    for(int i=0;i<rows;i++)
    {
        mas[i] = new int[cols];
    }
    Fill(mas);
    Print(mas);
    system("pause");
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
20.07.2011, 00:00     Указатель на многомерный массив #4
Algiz, покажи объявление своего массива, если у тебя зарание забито число элементов, то есть некоторые ньюансы, а так в общем случае Mиxaил прав...

Добавлено через 4 минуты
m1Rr0r , ну а для случая когда я с клавиатуры ввести хочу rows и cols или же програмно они определяются, как быть?Как по мне если уж передавать массив в функцию ту лучше с его размерностью, т.е числом строк и столбцов. Кстати для твоего кода эти строки
C++
1
2
#define rows 10
#define cols 10
можно записать так
C++
1
2
int rows = 10;
int cols = 10;
просто к сведенью
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
20.07.2011, 00:07     Указатель на многомерный массив #5
C++
1
2
#define rows 10
#define cols 10
Если размерности жестко прописаны в программе, зачем нужен вообще этот геморрой с динамикой - проще всё сделать в статике:
C++
1
int mas[rows][cols];
Algiz
159 / 159 / 13
Регистрация: 23.02.2011
Сообщений: 347
20.07.2011, 00:30  [ТС]     Указатель на многомерный массив #6
Процедура:
C++
1
2
3
4
5
6
7
8
void fillboard(int **board)
{
    for (int i=0; i!=8; i++){
        for (int j=0; j!=8; j++){
            if ((i+j) % 2 != 0) 
            {board[i][j]='#';}
            else {[board[i][j]=' ';}}}
}
компилятор на последние 2 строчки: error: invalid type argument of ‘unary *’

объявление массива:
C++
1
 int board[8][8];
передаю массив в функцию:
C++
1
fillboard(&board);
компилятор: error: cannot convert ‘int (*)[8][8]’ to ‘int*’ for argument ‘1’ to ‘void fillboard(int*)’
-=ЮрА=-
Заблокирован
Автор FAQ
20.07.2011, 00:46     Указатель на многомерный массив #7
Как я говорил для статических массивов есть ньансывот посмотри
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>
 
#define rows 5
#define cols 5
 
void fill_mass(int m, int n, int mass[][cols]);
void show_mass(int m, int n, int mass[][cols]);
 
int main()
{
    int mass[rows][cols];
    fill_mass(rows, cols, &pmass);
    printf("View mass\r\n");
    show_mass(rows, cols, &pmass);
    return 0;
}
 
void fill_mass(int m, int n, int mass[][cols])
{
    for(int i = 0,j; i < m; i++)
        for(j = 0; j < n; j++)
            mass[i][j] = (i + 1)*(j + 1);
}
 
void show_mass(int m, int n, int mass[][cols])
{
    for(int i = 0,j; i < m; i++)
    {
        for(j = 0; j < n; j++)
            printf("%d ", mass[i][j]);
        printf("\r\n");
    }
}
Добавлено через 4 минуты
Касательно твоего кода, вот так юзай

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void fillboard(int board[][8])
{
    for (int i=0,j; i!=8; i++)
    {
        for (j=0; j!=8; j++)
        {
            if ((i+j) % 2 != 0) 
            {
                board[i][j]='#';
            }
            else 
            {
                board[i][j]=' ';
            }
        }
    }
}
 
//Вызов функции
fillboard(board);
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
20.07.2011, 00:48     Указатель на многомерный массив #8
Algiz, У вас ошибка в 7 строке - что это за:
C++
1
[board[i][j]...
-=ЮрА=-, Можно и так:
C++
1
fillboard((int**)board);
AlexeyDevil
 Аватар для AlexeyDevil
21 / 21 / 2
Регистрация: 06.11.2010
Сообщений: 57
20.07.2011, 00:51     Указатель на многомерный массив #9
Algiz, ты путаешь статику и динамику, если ты передаешь динамический массив(массив из указателей) так ты его создай сперва правильно, это раз. Как его создавать тебе паказали в предыдущих сообщениях, это два. Если не понятно вот пример конкретно твой, разбирайся
C++
1
2
3
4
5
6
int **board=new int *[8];
for(int i=0; i!=8; ++i){
    board[i]=new int[8];
    for(int j=0; j!=8; ++j)
        board[i][j]=0;
}
Но это с++, если нужен с там другие команды))

если создашь массив таким образом, то свободно передашь его в свою функцию
-=ЮрА=-
Заблокирован
Автор FAQ
20.07.2011, 01:10     Указатель на многомерный массив #10
C 12 по 14-ую строчки нужно так писать
C++
1
2
3
fill_mass(rows, cols, mass);
printf("View mass\r\n");
show_mass(rows, cols, mass);
Приношу извинения за неточность...(
Миниатюры
Указатель на многомерный массив  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2011, 01:31     Указатель на многомерный массив
Еще ссылки по теме:

C++ Многомерный массив
C++ многомерный массив
Указатель на многомерный массив C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
20.07.2011, 01:31     Указатель на многомерный массив #11
Вобщем решил написать универсальный алгоритм, как для динамических массивов, так и для статических любой размерности, для єтого использую дополнительный массив указателей pmass/ Каждый элемент pmass - указатель на соотвествующую строку исходного массива mass
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
#include <stdio.h>
 
#define rows 5
#define cols 5
 
void fill_mass(int m, int n, int **mass);
void show_mass(int m, int n, int **mass);
 
int main()
{
    int mass[rows][cols];
    int *pmass[rows];//Дополнительный массив указателей
    for(int i = 0; i < rows; i++)
        pmass[i] = (int *)&mass[i];
    fill_mass(rows, cols, pmass);
    printf("View mass\r\n");
    show_mass(rows, cols, pmass);
    return 0;
}
 
void fill_mass(int m, int n, int **mass)
{
    for(int i = 0,j; i < m; i++)
        for(j = 0; j < n; j++)
            mass[i][j] = (i + 1)*(j + 1);
}
 
void show_mass(int m, int n, int **mass)
{
    for(int i = 0,j; i < m; i++)
    {
        for(j = 0; j < n; j++)
            printf("%d ", mass[i][j]);
        printf("\r\n");
    }
}
Добавлено через 5 минут
Цитата Сообщение от AlexeyDevil Посмотреть сообщение
Algiz, ты путаешь статику и динамику, если ты передаешь динамический массив(массив из указателей) так ты его создай сперва правильно, это раз. Как его создавать тебе паказали в предыдущих сообщениях, это два. Если не понятно вот пример конкретно твой, разбирайся
C++
1
2
3
4
5
6
int **board=new int *[8];
for(int i=0; i!=8; ++i){
    board[i]=new int[8];
    for(int j=0; j!=8; ++j)
        board[i][j]=0;
}
Но это с++, если нужен с там другие команды))

если создашь массив таким образом, то свободно передашь его в свою функцию
Это ещё не значит что нельзя использовать общие функции для динамики и статики вида
fun(int **mass), смотри мой пост выше...
Yandex
Объявления
20.07.2011, 01:31     Указатель на многомерный массив
Ответ Создать тему
Опции темы

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