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

Ошибка при передаче двумерного массива в функцию - C++

Восстановить пароль Регистрация
 
Leinstay
 Аватар для Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
18.03.2014, 18:46     Ошибка при передаче двумерного массива в функцию #1
Помогите пожалуйста, никак не могу разобраться. Я хочу чтобы функция createBlankGameField() ввела данные в массив gameField[3][3] созданный в main(), а gameOutput() эти данные вывела. На это я получаю две ошибки:

C++
1
2
3
4
5
6
7
D:\Lavina\CodeBlocks\Projects\cppProgram\main.cpp: In function 'void createBlankGameField(int*, int)':
D:\Lavina\CodeBlocks\Projects\cppProgram\main.cpp:25:27: error: invalid types 'int[int]' for array subscript
             someArray[i][j] = 0;
 
D:\Lavina\CodeBlocks\Projects\cppProgram\main.cpp: In function 'void gameOutput(int*, int)':
D:\Lavina\CodeBlocks\Projects\cppProgram\main.cpp:39:35: error: invalid types 'int[int]' for array subscript
             cout << someArray[i][j];

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>
 
using namespace std;
 
void createBlankGameField(int*, int);
void gameOutput(int*, int);
 
int main()
{
    int sizeOfGameField = 3;
    int gameField[sizeOfGameField][sizeOfGameField];
 
    createBlankGameField(&gameField[0][0], sizeOfGameField);
    gameOutput(&gameField[0][0], sizeOfGameField);
 
    return 0;
}
 
void createBlankGameField(int *someArray, int sizeOfArray)
{
    for (int i = 0; i < sizeOfArray; i++)
    {
        for (int j = 0; j < sizeOfArray; j++)
        {
            someArray[i][j] = 0;
        }
    }
}
 
void gameOutput(int *someArray, int sizeOfArray)
{
    cout << "-----";
    cout << "\n";
    for (int i = 0; i < sizeOfArray; i++)
    {
        cout << "|";
        for (int j = 0; j < sizeOfArray; j++)
        {
            cout << someArray[i][j];
        }
        cout << "|";
        cout << "\n";
    }
    cout << "-----";
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
18.03.2014, 19:16     Ошибка при передаче двумерного массива в функцию #2
Поскольку Ваши массивы двумерные, то имя массива - это int** (указатель на указатель),
а не int*.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,717
Записей в блоге: 3
18.03.2014, 19:28     Ошибка при передаче двумерного массива в функцию #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Leinstay, двумерный массив на стеке отличается от двухмерного массива в куче тем, что внутренне это одномерный массив размера rowsXcolumns. То есть, если передавать такой по указателю, то:
int a[3][3] можно передать как int *a и размер 9.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
18.03.2014, 19:35     Ошибка при передаче двумерного массива в функцию #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от IGPIGP Посмотреть сообщение
int a[3][3] можно передать как int *a
Сдается мне, что если просто указать имя массива a, то компилятор не пропустит вызов с сообщением:
error C2664: f: невозможно преобразовать параметр 1 из 'int [3][3]' в 'int *'
придется написать приведение типа:
C++
1
2
3
4
5
6
void f(int*);
int main()
{
    int a[3][3];
    f((int*)a);
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,717
Записей в блоге: 3
18.03.2014, 21:48     Ошибка при передаче двумерного массива в функцию #5
Цитата Сообщение от zss Посмотреть сообщение
придется написать приведение типа:
Конечно, - с явным приведением.
Leinstay
 Аватар для Leinstay
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 13
19.03.2014, 11:40  [ТС]     Ошибка при передаче двумерного массива в функцию #6
Спасибо ребят, очень выручили. Хотя все же не пойму от чего такая сложность и как придется выходить из ситуации с, например, многомерным массивом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2014, 04:26     Ошибка при передаче двумерного массива в функцию
Еще ссылки по теме:

Ошибка при передаче двумерного массива в функцию std::thread C++
C++ Ошибка при передаче в функцию
Написать процедуру для суммирования матриц. Ошибка при передаче массива в функцию C++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,717
Записей в блоге: 3
20.03.2014, 04:26     Ошибка при передаче двумерного массива в функцию #7
Цитата Сообщение от Leinstay Посмотреть сообщение
Хотя все же не пойму от чего такая сложность
От того, что внутренне, стековый массив одномерен. Он не является массивом массивов и не передается как массив указателей. Но можно передать по ссылке:
a[3][3];
//чем-то заполнили

//опрелеление ф-ции
foo(int a[3][3]){//
или
foo( int (&a)[3][3]){//
Последнее измерение можно не указывать.

Тогда в foo можно работать с переданным массивом как с 2-мерным (n-мерным).
Или используйте динамически создаваемые массивы. Их легко передавать указателями (на указатели)) и размерами.

Добавлено через 16 часов 0 минут
Цитата Сообщение от Leinstay Посмотреть сообщение
Спасибо ребят, очень выручили. Хотя все же не пойму от чего такая сложность и как придется выходить из ситуации с, например, многомерным массивом.
Leinstay, я тут мутновато наговорил. Добавлю ещё.
Вот, расковырял один пример и попытался сделать так, чтобы вызов для автоматического и динамического массива были формально одинаковы. То есть, в точке вызова передаём имя и измерения:
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
//для массива еа стеке
template<int n, int m, class T>
T summ( T (&a)[n][m], int n, int m){//в этом случае n и m можно было не передавать, но для единообразия вызовов)
T sum = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
sum += a[i][j];
return sum;
}
 
//для динамического
template< class T>
T summ( T **a, int n, int m){// тут же нужно передать
T sum = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
sum += a[i][j];
return sum;
}
 
int main()
{
    
    const int m = 4;
 
    int a[][m] = {
        { 1, 2,   3,  4},
        { 5, 6,   7,  8},
        { 9, 10, 11, 12}
    };
const int n = sizeof( a )/( sizeof( a[0][0] ) * m );
 
cout << summ(a, n, m)<<endl;//
 
float **b = new float*[m];
for(int j = 0; j < m; ++j)
b[j] = new float[n];
for(int i = 0; i < n; ++i)
    for(int j = 0; j < m; ++j)
b[i][j] = a[i][j];
 
cout << summ(b, n, m)<<endl;//
 
system ( "pause" );
    return 0;
}

То есть, не радостно. Особенно учитывая, что читая такое и не видя объявлений, легко запутаться. Лучше с такими вещами поступать по-разному. Тогда, по крайней мере не захочется освободить память из под массива на стеке.
Yandex
Объявления
20.03.2014, 04:26     Ошибка при передаче двумерного массива в функцию
Ответ Создать тему
Опции темы

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