Пятница, 27 Декабря 2024, 05:34

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
dedmorozДата: Понедельник, 10 Ноября 2014, 00:09 | Сообщение # 1381
был не раз
Сейчас нет на сайте
CARATOV, стивен прата

Сообщение отредактировал dedmoroz - Понедельник, 10 Ноября 2014, 00:12
AlkoshaДата: Вторник, 18 Ноября 2014, 23:06 | Сообщение # 1382
участник
Сейчас нет на сайте
как извлечь символ из строки string ?
Так не получается
print1.display(input[0][i]);

error: invalid conversion from 'char' to 'char*' [-fpermissive]|

В функцию print1.display() должен передаваться char*.

Можно весь стринг передать, а не посимвольно. Но нужно его сконвертить в char*

Добавлено (18.11.2014, 23:06)
---------------------------------------------
Ой... даже не так...
Считываю из файла таким образом.

Код

void readfile()
{
ifstream file;

int i=0;

  file.open("maps", ios::in);
         if (file)
             {
                 while (!file.eof())
                     {
                         file>>input[i];
                         i++;
                     }
                 file.close();
             }
}



Сперва думал, что разобьёт по отдельным стрингам строки файла (после каждого /n)... но теперь мне кажется, что разобъётся всё по словам, после каждого пробела.


Сообщение отредактировал Alkosha - Вторник, 18 Ноября 2014, 23:00
goldsphereДата: Среда, 19 Ноября 2014, 08:49 | Сообщение # 1383
заслуженный участник
Сейчас нет на сайте
Цитата Alkosha ()
... но теперь мне кажется, что разобьётся всё по словам, после каждого пробела.

так и есть. Если нужно вывести всю строку, считанную из файла, можно сделать так
getline(file, input);
где input - объект типа string.
а потом print1.display(input.c_str());


FinderX - Android Аркада

Сообщение отредактировал goldsphere - Среда, 19 Ноября 2014, 08:50
AlkoshaДата: Среда, 19 Ноября 2014, 22:03 | Сообщение # 1384
участник
Сейчас нет на сайте
Цитата goldsphere ()
так и есть. Если нужно вывести всю строку, считанную из файла, можно сделать так


ну вообще хочу сделать систему диалогов.
Диалоги хранятся в файле.
Каждая реплика отделяется ключевым словом (допустим "next").
И при считывании из файла, нужно каждую реплику расфасовать по отдельным строковым массивам , типа char* (или string, если заюзать c_str()), для последующего вывода.

Добавлено (19 ноября 2014, 18:12)
---------------------------------------------
В диалогах будет присутствовать символ \n, разумеется.

Добавлено (19 ноября 2014, 22:03)
---------------------------------------------

Цитата goldsphere ()
а потом print1.display(input.c_str());


Што за?

Цитата
E:\TURBO\platform3\main.cpp|974|error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|


Не нравится ему, что константное значение.


Сообщение отредактировал Alkosha - Среда, 19 Ноября 2014, 21:48
froexДата: Среда, 19 Ноября 2014, 23:55 | Сообщение # 1385
Руководитель Froexilize team
Сейчас нет на сайте
Alkosha,
строка представляет из себя массив символов, последний из которых должен оканчиваться символом конца строки, или нулевым символом.
Цитата Alkosha ()
print1.display(input[0][i]);

Полагаю, что input - массив строк. Хорошо. Тогда каждый элемент этого массива является массивом символов. По сути, input - это массив указателей типа char*. Поэтому можно передавать таким образом:
Код
print1.display(input[i])

где i - номер строки в массиве input (начиная с нуля), которую нужно передать.

В случае использования стандартных контейнеров типа std::string, взять указатель на строку можно, воспользовавшись методом c_str():
Код
std::string input[N];
//...
char *s = input[i].c_str();


Цитата Alkosha ()
Што за?

Цитата
E:\TURBO\platform3\main.cpp|974|error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|

Не нравится ему, что константное значение.

метод c_str() возвращает константный указатель по причине закрытия возможности управлять содержимым контейнера вручную. Контейнер std::string считает длину хранимой строки и прочую другую информацию. Если будет доступ к хранимой строке по указателю с возможностью замены, то данные контейнера будут фальсифицироваться, что нарушит правильную его работу.

Могу предположить, что метод display() написан вручную, а по названию можно судить, что он не будет менять принимаемый параметр. Так не проще ли подставить квалификатор const в списке параметров?
Код
void display(const char* src);


Цитата Alkosha ()
Диалоги хранятся в файле.
Каждая реплика отделяется ключевым словом (допустим "next").
И при считывании из файла, нужно каждую реплику расфасовать по отдельным строковым массивам

Могу предложить не просто чтение по словам, а сразу же поиск ключевого слова функцией find. Нашлась позиция - можно точно определить количество необходимых символов для хранения реплики. Сохраняем, идём далее - до конца файла.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Четверг, 20 Ноября 2014, 00:02
geralexДата: Четверг, 20 Ноября 2014, 13:24 | Сообщение # 1386
участник
Сейчас нет на сайте
Подскажите пример источника с кодом программы на форме ComboBox, DataGrid, Button.
В комбо боксе выводится список вариантов, при нажатии кнопки выполняется запрос в sql с параметром value, который заранее настроен.

Вопрос, как прописать в коде наполнение combobox некими именами, простым для пользователя, а при выполнении скрипта sql использовался некий параметр?
HPlusDieseДата: Четверг, 20 Ноября 2014, 14:16 | Сообщение # 1387
участник
Сейчас нет на сайте
geralex, А гуй какой?
AlkoshaДата: Четверг, 20 Ноября 2014, 19:36 | Сообщение # 1388
участник
Сейчас нет на сайте
Цитата froex ()
void display(const char* src);


Спасибо, сразу полегчало...

но теперь какая-то фигня с кодировками.
Латиница правильно отображается, а кириллица - нет. Фонты TTF содержат в себе русскоязычный алфавит.
Пробовал файл сохранить в UTF8 и в ANSI - всё равно кракозябры, только в разной кодировке по-своему.
Файл редактирую через notepad++
Если выводить буквы непосредственно из программы [print1.display("Аллаху акбар")] , то с кодировкой проблем нет.
froexДата: Четверг, 20 Ноября 2014, 20:14 | Сообщение # 1389
Руководитель Froexilize team
Сейчас нет на сайте
Цитата Alkosha ()
теперь какая-то фигня с кодировками.
Латиница правильно отображается, а кириллица - нет. Фонты TTF содержат в себе русскоязычный алфавит.
Пробовал файл сохранить в UTF8 и в ANSI - всё равно кракозябры, только в разной кодировке по-своему.
Файл редактирую через notepad++
Если выводить буквы непосредственно из программы [print1.display("Аллаху акбар")] , то с кодировкой проблем нет.

Отображается где? На какой платформе?
Если вывод в консоль, то можно использовать несколько вариантов:
Код
setlocale(LC_ALL,"Russian");

Есть костыльный вариант в случае использования dos-кодировки:
Код
system("chcp 1251");

Code page по умолчанию, если не ошибаюсь, 866, для возврата к ней, используется системный вызов "chcp 866".

При использовании UTF-8 возникает ещё затруднение, т.к. каждый символ кодируется двумя байтами - номером кодовой таблицы и кодом символа в этой таблице. Из-за использования двух байтов, надо хранить их не как char, а как wchar. Кстати, например, вывод тоже отличаеться будет: wcout вместо cout.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
AlkoshaДата: Четверг, 20 Ноября 2014, 21:58 | Сообщение # 1390
участник
Сейчас нет на сайте
Цитата froex ()
Отображается где? На какой платформе?
Если вывод в консоль, то можно использовать несколько вариантов:


Не дос, не консоль, а SDL2 под windows
Код
textSurface=TTF_RenderText_Solid(fnt,text,color);
         texxture=SDL_CreateTextureFromSurface(renderer,textSurface);
         SDL_RenderCopy(renderer, texxture,  NULL, &Dest);

Где переменная text - та самая const char*.
froexДата: Четверг, 20 Ноября 2014, 22:05 | Сообщение # 1391
Руководитель Froexilize team
Сейчас нет на сайте
Цитата Alkosha ()
Где переменная text - та самая const char*.

При работе с UTF8 желательно хранить строки как массивы wchar. Не могу по памяти сказать - найди функции для преобразования UTF8 в ANSI (wchar в char). Читаешь с файла UTF8 в wchar*, после чего используешь функцию, которая переведёт в char*, потом подаёшь в RenderText функцию.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
AlkoshaДата: Пятница, 21 Ноября 2014, 18:38 | Сообщение # 1392
участник
Сейчас нет на сайте
Цитата froex ()
после чего используешь функцию, которая переведёт в char*


Похоже, что такая функция есть в вижуал студии и борландовском билдере.
Я же использую кодблокс mingw gcc
froexДата: Пятница, 21 Ноября 2014, 19:51 | Сообщение # 1393
Руководитель Froexilize team
Сейчас нет на сайте
Цитата Alkosha ()
Похоже, что такая функция есть в вижуал студии и борландовском билдере.
Я же использую кодблокс mingw gcc

Библиотеки и функционал языка, на сколько мне правильно мама объясняла, не зависят от среды разработки. Код, написанный в одной среде, можно скомпилировать и в другой.
Работа с wchar - часть возможностей стандартной библиотеки.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
AlkoshaДата: Воскресенье, 23 Ноября 2014, 22:46 | Сообщение # 1394
участник
Сейчас нет на сайте
wacko .....всё равно не понятно..... wacko

считываю не посимольно, а построково.
Код
     while (!file.eof())
                     {
                         getline(file, input[i]);
                         i++;
                     }
                 file.close();

Но функция getline не работает с wstring, только string.
-l33t-h4xx-Дата: Понедельник, 24 Ноября 2014, 06:35 | Сообщение # 1395
участник
Сейчас нет на сайте
Alkosha, так ты загугли в яндексе. Я за минуту нашёл два варианта, почему это может не работать. Вот один, вот второй.

Как правильно задавать вопросы
AlkoshaДата: Понедельник, 24 Ноября 2014, 21:12 | Сообщение # 1396
участник
Сейчас нет на сайте
Вроде бы сделал как тута: http://littletechnibbles.com/2009....ng-in-c

Результат всё тот же -> каракули вместо символов.

Код

string conv (const wstring& wstr)
{
    return (string(wstr.begin(), wstr.end()));
}
...
wfstream file;
int i=0;

  file.open("maps//dialog.dlg", ios::in);
         if (file)
             {
                 while (!file.eof())
                     {
                         getline(file, input[i]);
                         i++;
                     }
                 file.close();
             }
...
string lin=conv(input[0]);
print1.display(lin.c_str(),80,50,w*25,18,200,200,200);
...
-l33t-h4xx-Дата: Вторник, 25 Ноября 2014, 12:40 | Сообщение # 1397
участник
Сейчас нет на сайте
Alkosha, хорошо, проблема несколько сложнее.
По скудным сведениям, которые ты нам предоставил, я заключил, что ты используешь SDL2_ttf. Открываем руководство и видим:
Цитата
SDL_Surface *TTF_RenderText_Solid(TTF_Font *font, const char *text, SDL_Color fg)

font
Font to render the text with. A NULL pointer is not checked.
text
The LATIN1 null terminated string to render.

О, привет! Тебе наверняка нужна функция TTF_RenderUTF8_Solid, а не эта.


Как правильно задавать вопросы
AlkoshaДата: Вторник, 25 Ноября 2014, 18:48 | Сообщение # 1398
участник
Сейчас нет на сайте
Ясно.
Даже wstring to string конвертить не надо оказывается.
daffy-doomerДата: Среда, 07 Января 2015, 21:20 | Сообщение # 1399
частый гость
Сейчас нет на сайте
Проблема с бесконечным вращение камеры (OpenGL), возможно с матрицей учудил
Код

void DrawCamera(int)
{
float anglex;
float angley;
int mx, my;

//Обработка вращения;
anglex = 0;
angley = 0;

POINT cPt;
GetCursorPos(&cPt);
my=int(cPt.y)-320;
GetCursorPos(&cPt);
mx=int(cPt.x)-240;
SetCursorPos(320,240);

glPushMatrix();
anglex=(mx-(320/2))/16;
angley=(my-(240/2))/16;

if (anglex >= 360.0f || anglex <= -360.0f) anglex = 0.0f;
if (angley > 80.0f) angley = 80.0f;
if (angley < -80.0f) angley = -80.0f;

Rotate (anglex, angley, 0.0f);
glPopMatrix();

if(GetAsyncKeyState(VK_ESCAPE)){
exit(0);
}
return glutTimerFunc(100, DrawFPSCamera, 1);
}


Как избавиться от бесконечного, хаотичного, вращения?
OpenGOOДата: Среда, 07 Января 2015, 22:44 | Сообщение # 1400
почти ветеран
Сейчас нет на сайте
Цитата daffy-doomer ()
Код
if(GetAsyncKeyState(VK_ESCAPE)) {
exit(0);
}  

return glutTimerFunc(100, DrawFPSCamera, 1);

Для чего ты это здесь написал? Ты сколько дней уже программируешь?


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг