Вопрос по libtcod и C.
Модераторы: Sanja, Максим Кич
-
- Сообщения: 22
- Зарегистрирован: 03 апр 2012, 17:26
- Откуда: Курган, Россия
Re: Вопрос по libtcod и C.
Итак, получилось. Спасибо большое всем, кто помог разобраться в вопросе. Не уверен пока что всё будет нормально работать на всех системах, но хотя бы на своей мне удалось заставить это работать.
У меня было понимание того как в С устроены строки, но работать с ними не особо получалось. В данном случае (так как работать с консолью не надо) обошёлся маленькой функцией, которая считывает параметр-строку посимвольно и выводит соответствующий символ средствами libtcod. И даже менять код символа не пришлось (где-то я ошибся тогда).
Вобще, С пока произвёл хорошее впечатление и исполняемый байткод всяко лучше транслируемого пайтона для конечного пользователя.
У меня было понимание того как в С устроены строки, но работать с ними не особо получалось. В данном случае (так как работать с консолью не надо) обошёлся маленькой функцией, которая считывает параметр-строку посимвольно и выводит соответствующий символ средствами libtcod. И даже менять код символа не пришлось (где-то я ошибся тогда).
Вобще, С пока произвёл хорошее впечатление и исполняемый байткод всяко лучше транслируемого пайтона для конечного пользователя.
Re: Вопрос по libtcod и C.
C хороший язык. Но, к сожалению, в нём крайне легко совершить ошибку, и еще сложнее её найти.
Так как общей практикой является приведение к void*, несоответствие типов никак не отслеживается компилятором, и ловится мучительно.
Так же полностью отсутствует какая-то автоматизация управления памятью. Только руками, только хардкор.
Так как общей практикой является приведение к void*, несоответствие типов никак не отслеживается компилятором, и ловится мучительно.
Так же полностью отсутствует какая-то автоматизация управления памятью. Только руками, только хардкор.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Вопрос по libtcod и C.
Мне любопытно, имел ли sukiminoku-san в виду C/C++, когда говорил "C" и, если все-таки нет, почему?
Пытается раскуклиться
-
- Сообщения: 22
- Зарегистрирован: 03 апр 2012, 17:26
- Откуда: Курган, Россия
Re: Вопрос по libtcod и C.
Имел в виду чистый C. Плюсы сильно уж мороченые. Да и ООП хорош, но не настолько =)
-
- Сообщения: 22
- Зарегистрирован: 03 апр 2012, 17:26
- Откуда: Курган, Россия
Re: Вопрос по libtcod и C.
А вот и очередной вопрос: как сделать массив wchar_t* ?
То есть аналог паскального a: array[a..b] of string;.
Что-то нагуглить не удаётся.
То есть аналог паскального a: array[a..b] of string;.
Что-то нагуглить не удаётся.
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: Вопрос по libtcod и C.
есть 2 варианта.sukiminoku-san писал(а):А вот и очередной вопрос: как сделать массив wchar_t* ?
То есть аналог паскального a: array[a..b] of string;.
Что-то нагуглить не удаётся.
1. массив строк одинаковой (или не более чем) длинны
Код: Выделить всё
#define MAX_STRING_LEN 256
#define STRING_COUNT 10
wchar_t a[STRING_COUNT][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])
}
это обходится ручным выделение памяти но это я могу тебя послать читать про malloc.
2.
3.
что-то устал писать ...
-
- Сообщения: 22
- Зарегистрирован: 03 апр 2012, 17:26
- Откуда: Курган, Россия
Re: Вопрос по libtcod и C.
Спасибо за развёрнутый ответ. Всё оказалось не так уж и сложно =)
Гугол мне при моих попытках составить запрос выдавал материал исключительно по адресации внутри строки.
Гугол мне при моих попытках составить запрос выдавал материал исключительно по адресации внутри строки.
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: Вопрос по libtcod и C.
в случае первого описанного варианта (массив строк одной длинны) записывать в строки надо копированием.
или лучше
Код: Выделить всё
wcscpy(a[1], "blablabla");
Код: Выделить всё
wcsncpy(a[0], "blablabla", MAX_STRING_LEN);
Re: Вопрос по libtcod и C.
Можно еще так сделать:
Узнать потом количество строк в массиве можно так:
Код: Выделить всё
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.
Потенциально опасно. Попытка модифицировать строку приведет к segfault. В случае с объявлением wchar_t str[] = L""; как у Jesus05, переменная является реальным массивом на стеке. В случае с wchar_t *str = L""; это всего лишь указатель на, как правило, константную область памяти. Ничего плохого в этом нет, но надо держать в уме.Xecutor писал(а):wchar_t* strings[]={ L"string1", L"string2", L"string3" };
Потенциально опасно. Способ будет работать только в случае, если в месте выполнения "видно" исходное определение этого массива. Стоит передать массив строк куда-нибудь в функцию для обработки и все, pointer decay и неверные числа. Ей-богу, проще не пользоваться, чем следить.Xecutor писал(а):size_t count=sizeof(strings)/sizeof(strings[0]);
От себя поставлю +1 про посмотреть ручное выделение памяти, malloc/free. Тем более, если "Всё оказалось не так уж и сложно" =) Блоки памяти, выделенные вручную, хотя бы ведут себя предсказуемо.
Пытается раскуклиться
Кто сейчас на конференции
Сейчас этот форум просматривают: Bing [Bot] и 31 гость