|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.01.2010, 20:37 | #1 |
Форумчанин
Регистрация: 17.12.2009
Сообщений: 101
|
Гики двумерных массивов
Благодаря вашим подсказкам дело с текстовым квестом продвигается. Я решил реализовать функцию, которая рисовала бы условную карту, показывая где находится персонаж, потому что в текстовом квесте игроку легко заблудиться.
Можно, конечно, сделать просто и топорно, выводя карту построчно функцией printf(): printf("------------\n"); printf("| Хижина |\n"); printf("|*Вы здесь|\n"); printf("------------\n"); Но не хватает в жизни перцу, хочется садо-мазо. Решил попробовать с массивами. С одномерным всё просто: char ar[] = {'-','-','-','-','-','-','-','-','-','\n', '|',' ','Х','и','ж','и','н','а','|','\n' \\И так далее... Но вот уже первые проблемы. Во-первых, компилятор таким образом вовсе не желает, чтобы элементы массива содержали в себе кириллические шрифты. Выводится предупреждение: warning: multi-character character constant warning: overflow in implicit constant conversion Что же это значит, и как с этим бороться? Можно обозначить массив, предположим, как char ar[] = "абв\nгде" Но это не прокатывает, получается чёрте что, хотя таким образом кириллица почему-то вполне корректно сохраняется. Но если инициализировать массив, как в случае с "хижиной" выше, то при компиляции выводится это самое предупреждение, а вместо русских букв выводятся символы из марсианского алфавита. Как быть? И, во вторых, инициализировать массив поэлементно, как "хижину", конечно садомазохизм, и я не хочу столько потеть и путаться. Может, подскажете, как нормально инициализировать массив, чтобы там можно было и вставлять "\n", и чтобы кириллица нормально отображалась, да чтоб и удобно инциализировать было? P.S. Работаю под Ubuntu Linux, компилирую на gcc |
30.01.2010, 22:27 | #2 |
Пользователь
Регистрация: 03.03.2009
Сообщений: 29
|
Файл программы, скорее всего сохранет в Unicode, или по крайней мере кодировка файла отличается от локали.
Если локаль UTF8 - то русские символы в ней должны занимать 2 байта, что в char не умещается. Используйте wchar_t. По поводу инициализации двумерных массивов можно так: char a[3][3]={{'a','b','c'},{'d','e','f'},{'x', 'y','z'}}; внутренние фигурные скобки можно и опустить |
31.01.2010, 13:33 | #3 |
Форумчанин
Регистрация: 17.12.2009
Сообщений: 101
|
Спасибо за совет, но всё же хочу спросить.
Двумерные массивы я инициализирую именно так, как вы и сказали, но, повторяю, если в массиве большое количество элементов, я замучаюсь так их инициализировать. Есть ли способ делать это проще и быстрее, но с сохранением возможности вставки "\n"? |
31.01.2010, 13:44 | #4 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
А зачем вам обязательно вставка \n? Может быть, и такой вариант сойдет?
Код:
Код:
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
31.01.2010, 21:17 | #5 |
Форумчанин
Регистрация: 17.12.2009
Сообщений: 101
|
Спасибо за совет по wchar_t и массивам, попотел и перешёл на другие функции. Теперь другая проблема. Ещё с самого начала меня при компиляции преследовало предупреждение:
warning: deprecated conversion form string constant to 'wchar_t*' Это предупреждение провоцируется так Сначала я создаю класс, например, action, который наследует переменные wchar_t name[16] и wchar_t description[100] от класса word class action: public word{ public: object(wchar_t a_name[16]) {wcscpy(name,o_name);} }; Далее я при помощи конструктора создаю объект action take(L"возьми"); И вот при компиляции строки, где создаётся объект вылезает то самое предупреждение. Мне кажется, что именно вот эта неполадка не даёт моей программе нормально работать. Как всё исправить, чтобы не было никаких предупреждений? Последний раз редактировалось Кипящий чайник; 01.02.2010 в 06:41. |
31.01.2010, 21:30 | #6 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
Ну, во-первых, раз используете wchar_t, то строки нужно предварять буквой L
Код:
Код:
|
01.02.2010, 06:42 | #7 |
Форумчанин
Регистрация: 17.12.2009
Сообщений: 101
|
Ну, строки я и так предваряю буквой L, просто забыл это указать (голова ещё дырявая, чего уж), так что проблемы остаются лишь с константами. Как решить эту проблему?
|
01.02.2010, 18:04 | #8 | |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
Цитата:
Ну да это и не так страшно, это лишь предупреждение, что лучше не присваивать указатель на строку указателю на неконстантные данные |
|
01.02.2010, 21:59 | #9 |
Форумчанин
Регистрация: 17.12.2009
Сообщений: 101
|
Понимаешь, моя "бета" сейчас работает, как Windows Vista, хотя я дотошно проверил все функции и связи между ними. Я подозреваю, что дело может быть как раз в этой мелочи при конструировании объектов.
Насчёт твоего кода - спасибо большое, я просто по зелени не понял, что это подсказка. |
01.02.2010, 22:09 | #10 | |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обработка двумерных массивов | Kreigen | Помощь студентам | 3 | 29.11.2009 10:50 |
передача двумерных массивов в функцию | Wast | Общие вопросы C/C++ | 2 | 04.05.2009 23:04 |
Заполнение двумерных массивов(Basic) | mde | Помощь студентам | 1 | 30.05.2008 09:23 |
Программирование операций обработки двумерных массивов | Дима82 | Помощь студентам | 16 | 12.05.2008 21:33 |