Вопрос по libtcod и C.

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

sukiminoku-san
Сообщения: 22
Зарегистрирован: 03 апр 2012, 17:26
Откуда: Курган, Россия

Re: Вопрос по libtcod и C.

Сообщение sukiminoku-san » 22 июл 2012, 13:04

Итак, получилось. Спасибо большое всем, кто помог разобраться в вопросе. Не уверен пока что всё будет нормально работать на всех системах, но хотя бы на своей мне удалось заставить это работать.

У меня было понимание того как в С устроены строки, но работать с ними не особо получалось. В данном случае (так как работать с консолью не надо) обошёлся маленькой функцией, которая считывает параметр-строку посимвольно и выводит соответствующий символ средствами libtcod. И даже менять код символа не пришлось (где-то я ошибся тогда).

Вобще, С пока произвёл хорошее впечатление и исполняемый байткод всяко лучше транслируемого пайтона для конечного пользователя.

Аватара пользователя
Xecutor
Мастер
Сообщения: 758
Зарегистрирован: 25 мар 2008, 08:32

Re: Вопрос по libtcod и C.

Сообщение Xecutor » 22 июл 2012, 15:09

C хороший язык. Но, к сожалению, в нём крайне легко совершить ошибку, и еще сложнее её найти.
Так как общей практикой является приведение к void*, несоответствие типов никак не отслеживается компилятором, и ловится мучительно.
Так же полностью отсутствует какая-то автоматизация управления памятью. Только руками, только хардкор.

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Вопрос по libtcod и C.

Сообщение Cfyz » 22 июл 2012, 15:41

Мне любопытно, имел ли sukiminoku-san в виду C/C++, когда говорил "C" и, если все-таки нет, почему?
Пытается раскуклиться

sukiminoku-san
Сообщения: 22
Зарегистрирован: 03 апр 2012, 17:26
Откуда: Курган, Россия

Re: Вопрос по libtcod и C.

Сообщение sukiminoku-san » 22 июл 2012, 16:30

Имел в виду чистый C. Плюсы сильно уж мороченые. Да и ООП хорош, но не настолько =)

sukiminoku-san
Сообщения: 22
Зарегистрирован: 03 апр 2012, 17:26
Откуда: Курган, Россия

Re: Вопрос по libtcod и C.

Сообщение sukiminoku-san » 24 июл 2012, 10:39

А вот и очередной вопрос: как сделать массив wchar_t* ?
То есть аналог паскального a: array[a..b] of string;.

Что-то нагуглить не удаётся.

Аватара пользователя
Jesus05
Сообщения: 1840
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Вопрос по libtcod и C.

Сообщение Jesus05 » 24 июл 2012, 11:03

sukiminoku-san писал(а):А вот и очередной вопрос: как сделать массив wchar_t* ?
То есть аналог паскального a: array[a..b] of string;.

Что-то нагуглить не удаётся.
есть 2 варианта.
1. массив строк одинаковой (или не более чем) длинны

Код: Выделить всё

#define MAX_STRING_LEN 256
#define STRING_COUNT 10

wchar_t a[STRING_COUNT][MAX_STRING_LEN];
где MAX_STRING_LEN максимальная длинна одной строки (в символах)
где STRING_COUNT кол-во строк которое будет в этом массиве (опять-же максимальное)
ну использовать как-то так.

Код: Выделить всё

wprintf("%s", a[1])
или другой вариант.

Код: Выделить всё

#define STRING_COUNT 10

wchar_t *a[STRING_COUNT]
т.е. создаем указатели на указатели на строки.

добавление строки тогда будет выглядеть так.

Код: Выделить всё

wchar_t b[] = L"blablabla";
a[0] = b;
использование идентично

Код: Выделить всё

wprintf("%s", a[1])
тут кроется несколько засад:
1. созданные переменные путем wchar_t b[] = L"blablabla"; живут тока в пределах видимости. т.е. такой пример

Код: Выделить всё

#define STRING_COUNT 10

wchar_t *Global_a[STRING_COUNT]

void create_new_string()
{
wchar_t b[] = L"blablabla";
Global_a[0] = b;
}

void print_string(int i)
{
wprintf("%s", Global_a[i])
}
так работать не будет (точнее будет, но результат не предсказуем) память выделенная под строку b будет существовать тока пока выполняется процедура create_new_string сразу после выполнения этой процедуры память будет освобождена и что будет находится в памяти на момент вызова print_string неизвестно.
это обходится ручным выделение памяти :) но это я могу тебя послать читать про malloc.
2.
3.

что-то устал писать :)...

sukiminoku-san
Сообщения: 22
Зарегистрирован: 03 апр 2012, 17:26
Откуда: Курган, Россия

Re: Вопрос по libtcod и C.

Сообщение sukiminoku-san » 24 июл 2012, 11:13

Спасибо за развёрнутый ответ. Всё оказалось не так уж и сложно =)

Гугол мне при моих попытках составить запрос выдавал материал исключительно по адресации внутри строки.

Аватара пользователя
Jesus05
Сообщения: 1840
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Вопрос по libtcod и C.

Сообщение Jesus05 » 24 июл 2012, 11:36

в случае первого описанного варианта (массив строк одной длинны) записывать в строки надо копированием.

Код: Выделить всё

wcscpy(a[1], "blablabla");
или лучше

Код: Выделить всё

wcsncpy(a[0], "blablabla", MAX_STRING_LEN);

Аватара пользователя
Xecutor
Мастер
Сообщения: 758
Зарегистрирован: 25 мар 2008, 08:32

Re: Вопрос по libtcod и C.

Сообщение Xecutor » 24 июл 2012, 15:17

Можно еще так сделать:

Код: Выделить всё

wchar_t* strings[]={
L"string1",
L"string2",
L"string3",
};
Узнать потом количество строк в массиве можно так:

Код: Выделить всё

  size_t count=sizeof(strings)/sizeof(strings[0]);
  for(size_t i=0;i<count;++i)
  {
    wprintf("%S\n",strings[i]);
  }

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Вопрос по libtcod и C.

Сообщение Cfyz » 24 июл 2012, 15:52

Xecutor писал(а):wchar_t* strings[]={ L"string1", L"string2", L"string3" };
Потенциально опасно. Попытка модифицировать строку приведет к segfault. В случае с объявлением wchar_t str[] = L""; как у Jesus05, переменная является реальным массивом на стеке. В случае с wchar_t *str = L""; это всего лишь указатель на, как правило, константную область памяти. Ничего плохого в этом нет, но надо держать в уме.
Xecutor писал(а):size_t count=sizeof(strings)/sizeof(strings[0]);
Потенциально опасно. Способ будет работать только в случае, если в месте выполнения "видно" исходное определение этого массива. Стоит передать массив строк куда-нибудь в функцию для обработки и все, pointer decay и неверные числа. Ей-богу, проще не пользоваться, чем следить.

От себя поставлю +1 про посмотреть ручное выделение памяти, malloc/free. Тем более, если "Всё оказалось не так уж и сложно" =) Блоки памяти, выделенные вручную, хотя бы ведут себя предсказуемо.
Пытается раскуклиться

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 31 гость