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

Передача двумерного массива через указатели - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 67, средняя оценка - 4.67
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
06.11.2010, 17:19     Передача двумерного массива через указатели #1
Подскажите пожалуйста как передать статический двумерный массив в функцию через указатели. Я начал писать программу с функции ввода, но появились ошибки, помогите пожалуйста, исправьте где неправильно.

C++
1
2
3
4
5
6
7
8
void input (float *, int const, int const);
void main (void)
{
    
    int const n=5, m=5;
    float B[n][m];
    input (B, n, m);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void input (float *B, int const n, int const m)
{
    int i, j;
    cout << "Input i: ";
        cin >> i;
    cout << "Input j: ";
        cin >> j;
    cout <<  "Input elements of file";
    for (int str=0; str<n; str++)
    {
        for (int stl=0; stl<m; stl++)
        {
            cin >> B[str][stl];
        }
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-comrade-
355 / 356 / 42
Регистрация: 11.06.2010
Сообщений: 703
06.11.2010, 17:24     Передача двумерного массива через указатели #2
C++
1
void input (float **, int const, int const);
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
06.11.2010, 18:43  [ТС]     Передача двумерного массива через указатели #3
Не работает! В main при вызове input(B,n,m) подчеркивает B.
Lerny
 Аватар для Lerny
56 / 56 / 3
Регистрация: 14.03.2010
Сообщений: 151
06.11.2010, 18:54     Передача двумерного массива через указатели #4
Создавай в дин. памяти)

C++
1
void input (float **, int const, int const);
C++
1
2
3
int **B = new int *[n];
for (int i=0; i<n; i++)
         B[i] = new int [m];
C++
1
input (B, n, m);
C++
1
2
3
for (int i=0; i<n; i++) delete [] B[i];
delete [] B;
B=NULL;
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
06.11.2010, 19:14     Передача двумерного массива через указатели #5
Если массив статический
C++
1
void input (float (*B)[m], int const n, int const m)
либо
C++
1
void input (float B[][m], int const n, int const m)
Lerny
 Аватар для Lerny
56 / 56 / 3
Регистрация: 14.03.2010
Сообщений: 151
06.11.2010, 19:32     Передача двумерного массива через указатели #6
rangerx, я так понял ему надо заполнить массив вызвав функцию, тут статика не поможет.

Добавлено через 9 минут
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
void input (float **B, int const n, int const m)
{
        for (int str=0; str<n; str++)
        {
                for (int stl=0; stl<m; stl++)
                {
                        cout << "B["<<str<<"]["<<stl<<"]: ";
                        cin >>B[str][stl];
                }
        }
}
void main()
{
int n, m;
        cout << "Input row count: ";
                cin >> n;
        cout << "Input cloumn count: ";
                cin >> m;
float **B = new float *[n];
for (int i=0; i<n; i++)
         B[i] = new float [m];
 
input(B,n,m);
 
        for (int str=0; str<n; str++)
        {
                for (int stl=0; stl<m; stl++)
                {
                        cout <<B[str][stl]<<" ";
                }
                cout << endl;
        }
 
for (int i=0; i<n; i++) delete [] B[i];
delete [] B;
B=NULL;
}
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
06.11.2010, 20:02  [ТС]     Передача двумерного массива через указатели #7
Мне нужно как раз сделать и в динамике и в статике. Мне нужно вызвать функцию ввода массива. Пока ещё не один из предложенных вариантов не работает. В main при вызове функции input(B,n,m) подчеркивает "B" и выдает "Аргумент типа float(*)[5] несовместим с параметром типа float "
Lerny
 Аватар для Lerny
56 / 56 / 3
Регистрация: 14.03.2010
Сообщений: 151
06.11.2010, 20:13     Передача двумерного массива через указатели #8
MarchZM, последний мой пример у меня прекрасно работает.
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
06.11.2010, 22:30  [ТС]     Передача двумерного массива через указатели #9
В статике!
Lerny
 Аватар для Lerny
56 / 56 / 3
Регистрация: 14.03.2010
Сообщений: 151
07.11.2010, 00:20     Передача двумерного массива через указатели #10
Если использовать статический массив, то можно передавать в функцию указатель на первый элемент массива.

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
void input (float *p, int const n, int const m)
{
for (int str=0; str<2; str++)
        for (int stl=0; stl<2; stl++)
        {
         cout << "B["<<str<<"]["<<stl<<"]: ";
         cin >> p[2*str + stl];
        }
}
 
void main()
{
        float A[2][2];
 
        input(&A[0][0],2,2);
 
        for (int str=0; str<2; str++)
        {
                for (int stl=0; stl<2; stl++)
                {
                        cout << A[str][stl]<<" ";
                }
                cout << endl;
        }
}
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.11.2010, 03:29     Передача двумерного массива через указатели #11
Цитата Сообщение от rangerx
C++
1
void input (float (*B)[m], int const n, int const m)
C++
1
2
3
4
5
6
    const int N = 5;
    const int M = 5;
 
    float b[N][M];
 
    input(&b[0], N, M);
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
07.11.2010, 11:16  [ТС]     Передача двумерного массива через указатели #12
Цитата Сообщение от accept Посмотреть сообщение
C++
1
input(&b[0], N, M);
Как было так и осталось только теперь подчеркивает Амперсанд и выводит ту же ошибку что и раньше

C++
1
void input (float (*B)[m], int const n, int const m)
Тут подчеркивает
C++
1
(*B)[m]
- m неопределенный идентификатор
Lerny
 Аватар для Lerny
56 / 56 / 3
Регистрация: 14.03.2010
Сообщений: 151
07.11.2010, 11:21     Передача двумерного массива через указатели #13
Да передай ты указатель на первый элемент массива, или сделай массив указателей.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.11.2010, 11:54     Передача двумерного массива через указатели #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
const int N = 5;
const int M = 5;
 
void input(float (*b)[M], const int n, const int m);
 
int main(void)
{
    float b[N][M];
 
    input(&b[0], N, M);
    return 0;
}
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
07.11.2010, 12:36  [ТС]     Передача двумерного массива через указатели #15
Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
const int N = 5;
const int M = 5;
 
void input(float (*b)[M], const int n, const int m);
 
int main(void)
{
    float b[N][M];
 
    input(&b[0], N, M);
    return 0;
}
И что там поменялось, ну заменили m на M а толку? Не работает и всё

Добавлено через 1 минуту
Цитата Сообщение от Lerny Посмотреть сообщение
Да передай ты указатель на первый элемент массива, или сделай массив указателей.
Мне массив надо полностью передать, а не первый элемент, так в задании сказано
Lerny
 Аватар для Lerny
56 / 56 / 3
Регистрация: 14.03.2010
Сообщений: 151
07.11.2010, 12:43     Передача двумерного массива через указатели #16
Резюмирую уже возможные способы, которые с лихвой хватит:
1. Динамический массив.
C++
1
2
3
4
5
6
7
8
9
10
11
void input (float **B, int const n, int const m)
{
        for (int str=0; str<n; str++)
        {
                for (int stl=0; stl<m; stl++)
                {
                        cout << "B["<<str<<"]["<<stl<<"]: ";
                        cin >>B[str][stl];
                }
        }
}
C++
1
2
3
4
5
float **B = new float *[n];
for (int i=0; i<n; i++)
         B[i] = new float [m];
 
input(B,n,m);
C++
1
2
3
for (int i=0; i<n; i++) delete [] B[i];
delete [] B;
B=NULL
2.Передача указателя на первый элемент массива
C++
1
2
3
4
5
6
7
8
9
void input (float *p, int const n, int const m)
{
for (int str=0; str<2; str++)
        for (int stl=0; stl<2; stl++)
        {
         cout << "B["<<str<<"]["<<stl<<"]: ";
         cin >> p[2*str + stl];
        }
}
C++
1
2
 float A[n][m];
        input(&A[0][0],n,m);
3. Создание массива указателей.
C++
1
2
3
4
5
6
7
8
9
void input (float *p[][2], int const n, int const m)
{
for (int str=0; str<n; str++)
        for (int stl=0; stl<m; stl++)
        {
         cout << "B["<<str<<"]["<<stl<<"]: ";
         cin >> *p[str][stl];
        }
}
C++
1
2
3
4
5
6
7
8
float A[n][m];
        float *p[n][m];
 
        for (int str=0; str<n; str++)
        for (int stl=0; stl<m; stl++)
        p[str][stl]=&A[str][stl];
 
        input(p,n,m);
В последнем случае ты массив полностью передаёшь)
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.11.2010, 13:34     Передача двумерного массива через указатели #17
Цитата Сообщение от MarchZM Посмотреть сообщение
И что там поменялось, ну заменили m на 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 <iostream>
 
using namespace std;
 
const int N = 5;
const int M = 5;
 
void input(float (*b)[M], const int n, const int m);
 
int main(void)
{
    float b[N][M];
 
    input(&b[0], N, M);
    return 0;
}
 
void input(float (*b)[M], const int n, const int m)
{
        int i, j;
        cout << "Input i: ";
                cin >> i;
        cout << "Input j: ";
                cin >> j;
        cout <<  "Input elements of file";
        for (int str=0; str<n; str++)
        {
                for (int stl=0; stl<m; stl++)
                {
                        cin >> b[str][stl];
                }
        }
}
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
07.11.2010, 16:52  [ТС]     Передача двумерного массива через указатели #18
Цитата Сообщение от accept Посмотреть сообщение
input(&b[0], N, M)
почему &b[0]? объясните пожалуйста
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
07.11.2010, 16:56     Передача двумерного массива через указатели #19
при передаче через указатель надо передавать адрес
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2010, 17:06     Передача двумерного массива через указатели
Еще ссылки по теме:

C++ Передача массива в функцию (указатели)
C++ Передача массива и указатели
Преобразование нединамического двумерного массива через указатели C++

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

Или воспользуйтесь поиском по форуму:
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.11.2010, 17:06     Передача двумерного массива через указатели #20
&b[0] - это адрес массива из M элементов
&b[0][0] - это адрес элемента

двумерный массив каких-то элементов организован как одномерный массив одномерных массивов этих элементов
поэтому когда мы берём адрес первого элемента в массиве одномерных массивов, мы получаем адрес первого одномерного массива в массиве одномерных массивов
Yandex
Объявления
07.11.2010, 17:06     Передача двумерного массива через указатели
Ответ Создать тему
Опции темы

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