Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 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
d9m0n
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 29
По умолчанию

Файл программы, скорее всего сохранет в Unicode, или по крайней мере кодировка файла отличается от локали.
Если локаль UTF8 - то русские символы в ней должны занимать 2 байта, что в char не умещается. Используйте wchar_t.

По поводу инициализации двумерных массивов
можно так:

char a[3][3]={{'a','b','c'},{'d','e','f'},{'x', 'y','z'}};

внутренние фигурные скобки можно и опустить
d9m0n вне форума Ответить с цитированием
Старый 31.01.2010, 13:33   #3
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Спасибо за совет, но всё же хочу спросить.
Двумерные массивы я инициализирую именно так, как вы и сказали, но, повторяю, если в массиве большое количество элементов, я замучаюсь так их инициализировать. Есть ли способ делать это проще и быстрее, но с сохранением возможности вставки "\n"?
Кипящий чайник вне форума Ответить с цитированием
Старый 31.01.2010, 13:44   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

А зачем вам обязательно вставка \n? Может быть, и такой вариант сойдет?
Код:
char ar[4][10] = {"+--------+", "|-Хижина-|", "|Вы здесь|", "+--------+"};
for (int i = 0; i < 4; i++)
   printf("%s\n", ar[i]);
Насчет инициализации массива не проверял, но
Код:
char str[18] = "This is a string!";
должно работать, так что по аналогии - .
Простые и красивые программы - коды программ + учебник 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
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну, во-первых, раз используете wchar_t, то строки нужно предварять буквой L
Код:
action take(L"возьми");
а во-вторых, это предупреждение говорит о том, что преобразование из строковой константы в неконстантный указатель использоваться не должно
Код:
class action : public word {
public:
    action(const wchar_t* a_name) { wcscpy(name, a_name); }
};
netrino вне форума Ответить с цитированием
Старый 01.02.2010, 06:42   #7
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Ну, строки я и так предваряю буквой L, просто забыл это указать (голова ещё дырявая, чего уж), так что проблемы остаются лишь с константами. Как решить эту проблему?
Кипящий чайник вне форума Ответить с цитированием
Старый 01.02.2010, 18:04   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
Ну, строки я и так предваряю буквой L, просто забыл это указать (голова ещё дырявая, чего уж), так что проблемы остаются лишь с константами. Как решить эту проблему?
Я же написал - добавить слово const к указателю.
Ну да это и не так страшно, это лишь предупреждение, что лучше не присваивать указатель на строку указателю на неконстантные данные
netrino вне форума Ответить с цитированием
Старый 01.02.2010, 21:59   #9
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Понимаешь, моя "бета" сейчас работает, как Windows Vista, хотя я дотошно проверил все функции и связи между ними. Я подозреваю, что дело может быть как раз в этой мелочи при конструировании объектов.
Насчёт твоего кода - спасибо большое, я просто по зелени не понял, что это подсказка.
Кипящий чайник вне форума Ответить с цитированием
Старый 01.02.2010, 22:09   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
Понимаешь, моя "бета" сейчас работает, как Windows Vista, хотя я дотошно проверил все функции и связи между ними. Я подозреваю, что дело может быть как раз в этой мелочи при конструировании объектов.
Насчёт твоего кода - спасибо большое, я просто по зелени не понял, что это подсказка.
Было бы неплохо, если бы Вы сказали, какие же именно проблемы возникают(что работает не так), тогда будет значительно проще помочь Вам )
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка двумерных массивов 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