Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Как передать строку на const char* в dll с++
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Vanya. Vanya. вне форума
Member
 
Сообщений: 96
Сказал(а) спасибо: 5
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
По умолчанию Как передать строку на const char* в dll с++ - 20.01.2018, 16:32

Array=arrayM::newNonAtomicFromList(Stroka) иероглифы,
writeString8(Stroka)=Array:-Array=arrayM::newAtomicFromList(Stroka) иероглифы,
writeString8(Spisok,Dlina)=Ukazatel:-string::listToArray(Spisok,Ukazatel,Dlina)
иероглифы,
writeString8(Stroka)=Ukaz:-Uncek=uncheckedConvert(string8,Stroka),
Ukaz=uncheckedConvert(pointer,Uncek) отображается первая буква строки,
memory::setString(не setString8) тоже отображается первая буква строки.
И еще если выделять память под строку в классе memory и дальше передавать в setString вообще приложение не запускается.

Последний раз редактировалось Vanya.; 20.01.2018 в 16:39
Ответить с цитированием
  (#2 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,964
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 20.01.2018, 21:08

Воспроизвести Вашу проблему не могу, т.к. нет Вашей dll на С++.
Однако ж, может помогут вопросы:
1. dll ожидает ASCII-строку или однобайтовую unicode-строку?
2. Вы передаёте английский текст или русский?
3. Пролог-программа в GUI или консольная?
4. Если в консольная, то наверное надо посмотреть в цели (goal) какую кодировку строк использует консоль.
5. Какой версией Пролога пользуетесь? Наверное VIP7?
Ответить с цитированием
  (#3 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 566
Сказал(а) спасибо: 17
Поблагодарили 35 раз(а) в 35 сообщениях
Регистрация: 28.03.2012
По умолчанию 21.01.2018, 01:54

есть такие приметы у программистов:
1. Если видна только первая буква(цифра и тп), то вы получили строку в UNICODE (UTF16), а смотрите её как ASCII. т.к. обычная буква в UNICODE - это буква и 0 (т.е. буква и конец строки)
2. Если вы видете иероглифы разные, то вам дали строку в ASCII, а вы пытаетесь её понять в UNICODE

это конечно не 100% но обычно достаточно понять в чём ошибка.
Ответить с цитированием
  (#4 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 566
Сказал(а) спасибо: 17
Поблагодарили 35 раз(а) в 35 сообщениях
Регистрация: 28.03.2012
По умолчанию 21.01.2018, 01:57

да, напоминаю. Все обычные строки в VIP - UNICODE UTF16.
Тут можно или использовать класс string8 и преобразовывать после получения, или в C/C++ использовать не char*, а wchar_t* (что кажется разумней)
Ответить с цитированием
  (#5 (permalink)) Старый
Vanya. Vanya. вне форума
Member
 
Сообщений: 96
Сказал(а) спасибо: 5
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
По умолчанию 21.01.2018, 04:04

Больше русский,консольная,версия 7.5
Так
%console::init (stream::ansi(866)).
%console::init (stream::binary).
%console::init (stream::unicode).
%console::init8(866).
%console::init (stream::ansi(1251)).
приложение аварийно закрывается,
%%console::run(main::run,stream::ansi(65000)).
%%console::run(main::run,stream::binary).
%%console::run(main::run,stream::unicode).
%%console::run(main::run,stream::ansi(1251)).
%%console::run(main::run,stream::ansi(866)).
%%console::runUtf8(main::run).
так работает,тоже иероглифы.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Vanya. Vanya. вне форума
Member
 
Сообщений: 96
Сказал(а) спасибо: 5
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
По умолчанию 21.01.2018, 04:18

Если вы об этом WideCharToMultiByte и MultiByteToWideChar - с русскими буквами не прокатывает,из пролога в opengl только таким способом мне получалось передавать строки.Я даже пробовал из с++ WideCharToMultiByte и MultiByteToWideChar переносить в пролог,тоже самое.
Ответить с цитированием
  (#7 (permalink)) Старый
Vanya. Vanya. вне форума
Member
 
Сообщений: 96
Сказал(а) спасибо: 5
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
По умолчанию 21.01.2018, 06:04

Вот так заработало только вместо русских иероглифы и куда надо передавать строку вместо pointer заменить string8.Кодировки перебрал не помогает.
String8=string8::mapFromString ( Source, CodePage).
Если String8 через setString8 вообще никакие символы не отображаются.
Ответить с цитированием
  (#8 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 566
Сказал(а) спасибо: 17
Поблагодарили 35 раз(а) в 35 сообщениях
Регистрация: 28.03.2012
По умолчанию 21.01.2018, 14:32

я ничего не понял. Можно прислать то, что можно запустить и посмотреть?


вот такое работает:
Visual Prolog Код:
clauses
    run() :-
        stdio::write("Здравствуй мир!\n").

end implement main

goal
    console::runUtf8(main::run).
WideCharToMultiByte & MultiByteToWideChar должны работать всегда, все претензии к Микрософт.

Маленький совет:
Всегда, где возможно, надо использовать UNICODE. И только там, где абсолютно необходимо - string8. И никаких проблем не будет.
Ответить с цитированием
  (#9 (permalink)) Старый
Vanya. Vanya. вне форума
Member
 
Сообщений: 96
Сказал(а) спасибо: 5
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
По умолчанию 21.01.2018, 15:55

GLFWwindow* glfwCreateWindow ( int width,
int height,
const char * title,
GLFWmonitor * monitor,
GLFWwindow * share
)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
glfwCreateWindow:(unsigned,unsigned,string8,pointe r,pointer)->pointer procedure language c as"glfwCreateWindow".


%%%%%%%%%%%%%%%%%%%
window3():-
String8=string8::mapFromString ( "stroka", 866),
_=glfwInit(),
Window = glfwCreateWindow(800, 800, String8, null, null),
glfwMakeContextCurrent(Window),
W=glfwWindowShouldClose(Window),
std::repeat,
if not(W>0) then
glfwSwapBuffers(Window),
glfwPollEvents()
end if;
glfwTerminate().
Ответить с цитированием
  (#10 (permalink)) Старый
Vanya. Vanya. вне форума
Member
 
Сообщений: 96
Сказал(а) спасибо: 5
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
По умолчанию 21.01.2018, 16:29

Цитата:
Сообщение от Vanya. Посмотреть сообщение
GLFWwindow* glfwCreateWindow ( int width,
int height,
const char * title,
GLFWmonitor * monitor,
GLFWwindow * share
)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
glfwCreateWindow:(unsigned,unsigned,string8,pointe r,pointer)->pointer procedure language c as"glfwCreateWindow".


%%%%%%%%%%%%%%%%%%%
window3():-
String8=string8::mapFromString ( "stroka", 866),
_=glfwInit(),
Window = glfwCreateWindow(800, 800, String8, null, null),
glfwMakeContextCurrent(Window),
W=glfwWindowShouldClose(Window),
std::repeat,
if not(W>0) then
glfwSwapBuffers(Window),
glfwPollEvents()
end if;
glfwTerminate().




вместо "stroka" "строка"
Ответить с цитированием
  (#11 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 566
Сказал(а) спасибо: 17
Поблагодарили 35 раз(а) в 35 сообщениях
Регистрация: 28.03.2012
По умолчанию 21.01.2018, 16:34

если почитать описание ф-ии, то там написано

Цитата:
[in] title The initial, UTF-8 encoded window title.
, т.е. там не ASCII а UTF8 - туда и надо конвертировать (используя предикат toUtf8).

2. я не уверен, за "language c" в строке "procedure language c as"glfwCreateWindow"." Это может быть и stdcall.
т.к. у меня нет этих функций, я не могу проверить.
Ответить с цитированием
Пользователь сказал cпасибо:
Vanya. (21.01.2018)
  (#12 (permalink)) Старый
Vanya. Vanya. вне форума
Member
 
Сообщений: 96
Сказал(а) спасибо: 5
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.12.2011
По умолчанию 21.01.2018, 17:00

Ооооооооооо!!!!!!!!!!! спасибо заработало
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно перевести строку string в char Chvalov Delphi 5 21.09.2012 08:48
Почему для int возвращает адрес, а для char пытается вернуть строку Vogulov Вопросы начинающих программистов 1 23.01.2011 22:14
Как конвертировать AnsiString to const char v-i.king C++ Builder 1 21.12.2009 02:01
Как в строку char добавить переменную другого типа rusl Вопросы начинающих программистов 6 14.08.2009 23:28
Unresolved external 'CreateAvi(const char что она означает Devill C++ Builder 1 13.03.2006 19:58
Что значит команда const char oshur Вопросы начинающих программистов 10 05.01.2006 12:34
Реализование функции atof() [double atof(const char *) imported__Sergey_ Вопросы начинающих программистов 1 22.09.2005 08:27
Как передать в функцию адрес массива указателей на char лисс Вопросы начинающих программистов 2 20.12.2004 21:29
Как проще всего передать char через UDP DENIS451 C++ Builder 4 04.10.2004 23:32
Как передать свою русскую строку через клипбоард в Word Arseny Visual C++ 1 14.08.2004 16:08
Как Ansi-строку преобразовать в обычную типа char Anonymous С/С++ 9 24.12.2003 13:15
Как конвертировать строку AnsiString в массив char Anonymous C++ Builder 2 10.07.2003 01:43



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов