Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
165 / 164 / 23
Регистрация: 23.02.2011
Сообщений: 347
1

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

19.07.2011, 23:45. Показов 5607. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть двумерный массив, его нужно передать в функцию, так, что бы внутри функции можно было его изменять.
Как с помощью указателей передать двумерный массив в функцию, и как внутри ф-ции к его элементам обращаться?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2011, 23:45
Ответы с готовыми решениями:

Указатель на многомерный массив
Можно ли создать и передать указатель одной строкой или как-то попроще? int main() { int m; ...

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

Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив.
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++. Условие:Реализовать 3 функции,...

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){};...

11
542 / 447 / 162
Регистрация: 10.12.2009
Сообщений: 1,857
19.07.2011, 23:48 2
передача в функцию
C++
1
2
3
4
void FillingMatrix ( int ** matrix, int size )
{
    //...
}
работа с динамической матрицей точно такая же, как и с обычной...
0
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
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;
}
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;
просто к сведенью
0
Программист
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
20.07.2011, 00:07 5
C++
1
2
#define rows 10
#define cols 10
Если размерности жестко прописаны в программе, зачем нужен вообще этот геморрой с динамикой - проще всё сделать в статике:
C++
1
int mas[rows][cols];
0
165 / 164 / 23
Регистрация: 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*)’
0
Заблокирован
Автор 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);
0
Программист
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
20.07.2011, 00:48 8
Algiz, У вас ошибка в 7 строке - что это за:
C++
1
[board[i][j]...
-=ЮрА=-, Можно и так:
C++
1
fillboard((int**)board);
0
21 / 21 / 4
Регистрация: 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;
}
Но это с++, если нужен с там другие команды))

если создашь массив таким образом, то свободно передашь его в свою функцию
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);
Приношу извинения за неточность...(
Миниатюры
Указатель на многомерный массив  
0
Заблокирован
Автор 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), смотри мой пост выше...
0
0 / 0 / 0
Регистрация: 15.10.2020
Сообщений: 2
26.08.2022, 20:25 12
Оказывается, весь прикол в скобках
По-моему, одним из наиболее точных ответов именно на вопрос топикастера, будет такой:
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
void fillboard( int (*board)[8][8] )
{
    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]=' ';
                }
            }
       }
    
}
void printboard( int (*board)[8][8] )
{
    for( int i=0; i!=8; i++)
         for( int j=0; j!=8; j++ )
              printf( "%c%s", (*board)[i][j], j==(7)?"\n":"" );
    
}
void main( )
{
    int board[8][8];
    fillboard( &board );
    printboard( &board );
}
Т.е., ключевым является использование не *board, а (*board)

Добавлено через 7 минут
Отдельно можно обратить внимание на массивы, у коих элементы являются указателями. Например, если нужен многомерный массив строк. Тогда будет, например, так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// размер массива. Может, кому тоже пригодится
# define COUNTOF( arr ) (sizeof(arr)/sizeof(arr[0]))
 
void PrintTblStr( char *(*m)[4][4] )
{
    for( int i=0,n=COUNTOF(*m); i<n; i++ )
         for( int j=0,k=COUNTOF((*m)[i]); j<k; j++ )
              printf( "%s%s", (*m)[i][j], j==(k-1)?"\n":", " );
}
 
void main( )
{
    char *m[4][4] = 
    {
        "+", "=", "+", "+",
        "|", " ", "|", "|",
        "+", "-", "+", "+",
        "+", "=", "+", "+",
    };
    PrintTblStr( &m );
}
0
26.08.2022, 20:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2022, 20:25
Помогаю со студенческими работами здесь

Многомерный массив
Имеется вот такое задание: Создать программу, которая реализует журнал с оценками в виде двумерного...

Многомерный массив
найти и напечатать значения и индексы минимального элемента в каждом рядке матрицы W(N,M)

многомерный массив
помогите сделать задачу через указатели Сформировать массив типа char размером в 7х5х8...

Многомерный массив
Найти максимальный элемент в массиве. Размеры массива задайте сами. Сделайте три варианта...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru