Приём двумерного массива из функции???
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Вопрос по двумерным массивам. Имеется файл map.cpp с функцией map_making(), результат её работы – двумерный массив map[ ][ ]. Не знаю как его передать в main.cpp, а главное как его там правильно принять?
Ошибку выдаёт: инициализация: невозможно преобразовать «char» в «char [24][50]»
// main.cpp
// map.h
// map.cpp
Я так понимаю, что константы length и width должны быть доступны в main.cpp раз подключен заголовочный файл, поэтому использую их там для объявления размера массива. Или это ошибка?
Правильно ли выглядит синтаксис:
И как должен правильно выглядеть приём массива:
И отдельный вопрос по map.h. Создаваемый массив является объектом с постоянным содержимым, поэтому по моему разумению создавать class бессмысленно. Правильно ли тогда выглядит оформление map.h?
Slonopotam, тут у тебя есть несколько нестыковок.
(1) Ты спланировал, что двумерный массив
map
должен существовать глобально. Это у тебя не получилось правильно реализовать, но пока не об этом. Еслиmap
глобален и видим в других файлах проекта через заголовочный файл map.h, то ни передавать его в функцию, ни возвращать его из функции, ни переприсваивать его в функцииmain
другой переменной (совершенно варварским методом) не надо. Он и так доступен и вmain()
, и вmap_making()
. Поэтому первый, третий и четвёртый вопросы снимаются как бы сами собой.(2) Результатом работы
map_making()
является не массив, а заполнение массива некими данными. Точность формулировок здесь важна: от них зависит суть вопроса.(3) Что неправильно в файле map.h и как правильно определить двумерный массив
map
?Неправильно всё, за исключением директив условной компиляции ))
Как уже выяснилось, функция
map_making()
не должна ничего возвращать. Поэтому сигнатура функции будет немного иной.Есть такое правило хорошего тона: заголовочный файл не должен порождать исполняемого кода. В данном случае исполняемый код порождают определения констант и определение массива (здесь это выделение памяти и инициализация). Что при этом получается? Мы включаем файл map.h в файл main.cpp, и в файл map.cpp. При компиляции main.cpp и map.cpp константы и массив будут существовать в обоих объектных файлах, что приведёт к ошибке при сборке: линкер не сможет разобраться с двумя копиями одних и тех же переменных и констант.
Выход из этой ситуации: в заголовочном файле необходимо сделать только объявления переменных, а в файле кода (.cpp) — их определения.
Здесь натыкаемся ещё на один камень: если определения констант (т.е. конкретные числовые значения) поместить в .cpp-файл, то они не будут видны в заголовочном файле и, следовательно, компилятор не сможет определить размерности массива. Выход: вместо константных переменных использовать
#define
.Исходя из вышесказанного, файлы map.h и map.cpp будут выглядеть так:
map.h
map.cpp
Соответственно вносим изменения в main.cpp:
Дополнительно можешь ещё почитать статью Многомерные массивы в C++ — практическое пособие.
Большое спасибо! У меня всё получилось!