Проблема с++ двумерный массив через указатель. - Вопросы по С+

Вопрос Проблема с++ двумерный массив через указатель.

Регистрация
20 Окт 2013
Сообщения
99
Репутация
-20
Спасибо
0
Монет
0
#include<iostream>

#include<conio.h>

void Draw_road(int *width,int *height,int **arr)

{

for(int i = 0;i < *width;i++)

{

for(int j = 0;j < *height;j++)

{

arr[j] ='0';

}

}

}



int main()

{

int width = 11,height = 110;

int arr[width][height];

int *widthPTR;

widthPTR = &width;

int *heightPTR;

heightPTR =&height;

Draw_road(&width,&height,&arr);



}

|22|error: cannot convert 'int (*)[width][height]' to 'int**'|

если передать числа без массива,то всё работает. Но если передать массив - ошибка.
 
Регистрация
9 Авг 2013
Сообщения
72
Репутация
0
Спасибо
0
Монет
0
Ошибка возникает из-за неправильного способа передачи двумерного массива в функцию. В C++, двумерный массив не может быть напрямую преобразован в указатель на указатель (т.е. `int**`). Прежде всего, давайте исправим вашу функцию и способ передачи массива.

Вот как это можно сделать:

1. Передайте массив как `int (*)[height]` в функцию.
2. Объявите массив в функции как `int (*arr)[height]`.

Вот исправленный код:

```cpp
#include <iostream>
#include <conio.h>

// Изменяем сигнатуру функции
void Draw_road(int *width, int *height, int (*arr)[110])
{
for(int i = 0; i < *width; i++)
{
for(int j = 0; j < *height; j++)
{
arr[j] = '0';
}
}
}

int main()
{
int width = 11, height = 110;
int arr[11][110]; // Используем значения вместо переменных для размера массива
int *widthPTR;
widthPTR = &width;
int *heightPTR;
heightPTR = &height;

// Передаем массив как указатель на массив
Draw_road(&width, &height, arr);

// Для проверки выведем массив
for(int i = 0; i < width; i++) {
for(int j = 0; j < height; j++) {
std::cout << arr[j] << " ";
}
std::cout << std::endl;
}

getch(); // Ожидание нажатия клавиши
return 0;
}
```

Обратите внимание на следующие моменты:
- Размер массива должен быть указан явно, так как массивы в C++ должны быть статически определены.
- Функция `Draw_road` теперь принимает `int (*arr)[110]` вместо `int **arr`.
- Внутри функции используются указатели, чтобы манипулировать элементами массива.

Этот код должен работать корректно и выполнять вашу задачу.
 
Регистрация
28 Сен 2013
Сообщения
88
Репутация
0
Спасибо
0
Монет
0
В C++ двумерный массив и указатель на указатель (int**) - это разные типы данных. Вот несколько способов решить эту проблему:

Изменить объявление функции и использовать ссылку на двумерный массив: void Draw_road(int *width, int *height, int (&arr)[11][110])
{
for(int i = 0; i < *width; i++)
{
for(int j = 0; j < *height; j++)
{
arr[j] = '0';
}
}
}

int main()
{
int width = 11, height = 110;
int arr[11][110];
Draw_road(&width, &height, arr);
// ...
} Использовать шаблон для функции: template
void Draw_road(int *width, int *height, int (&arr)[W][H])
{
for(int i = 0; i < *width; i++)
{
for(int j = 0; j < *height; j++)
{
arr[j] = '0';
}
}
}

int main()
{
int width = 11, height = 110;
int arr[11][110];
Draw_road(&width, &height, arr);
// ...
} Использовать одномерный массив вместо двумерного: void Draw_road(int *width, int *height, int *arr)
{
for(int i = 0; i < *width; i++)
{
for(int j = 0; j < *height; j++)
{
arr[i * (*height) + j] = '0';
}
}
}

int main()
{
int width = 11, height = 110;
int arr[11 * 110];
Draw_road(&width, &height, arr);
// ...
} Использовать std::vector вместо обычного массива: #include

void Draw_road(int *width, int *height, std::vector& arr)
{
for(int i = 0; i < *width; i++)
{
for(int j = 0; j < *height; j++)
{
arr[j] = '0';
}
}
}

int main()
{
int width = 11, height = 110;
std::vector arr(width, std::vector(height));
Draw_road(&width, &height, arr);
// ...
}
 

yar

Capitan

yar

Capitan
Регистрация
17 Ноя 2013
Сообщения
84
Репутация
-3
Спасибо
0
Монет
0
Ошибка возникает, потому что двумерный массив не может быть передан как `int **arr`. Используйте `int arr[][height]` для передачи массива в функцию.
 
Сверху Снизу