Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (1): [1]   

> Без описания
Zireael
Отправлено: 13 Августа, 2018 - 03:34:52
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4395
Дата рег-ции: Нояб. 2017  
Репутация: 580




С одномерными массивами всё понятно.
CODE:
// код dll
#include "stdafx.h"
#include <string>
using namespace std;
extern "C" __declspec(dllexport)void fn(char* s, int size_buffer)
{
strcpy_s(s, size_buffer, "text1"); // копируем в s "text1"
}

// код в кибор
external(VOID, "fn", "fn", "C:\Users\yacir\source\repos\test\Release\test.dll");

char result[10];
fn(address(#result[0]), 10); // передаём указатель на массив и размер массива
messagebox(format(#result[0])); // результат - text1

Как присвоить значения двухмерному char или string?
 
 Top
Kibor
Отправлено: 13 Августа, 2018 - 06:40:52
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8094
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Все массивы это последовательность одномерного массива.
Заполнять массив надо с помощью расчета и смещения адресов исходя из размерности 2х мерного (или более) массива.

CODE:
// код dll
#include < windows.h >
extern "C" __declspec(dllexport)void fn(char* s, int x, int y)
{
for (int n=0; n<x; n++)
{
wsprintf(s+n*y, "text %i", n);
}
}



CODE:
// код в кибор
external(VOID, "fn", "fn", "C:\Users\yacir\source\repos\test\Release\test.dll");

char result[10][8];
fn(address(#result[0][0]), 10, 8); // передаём указатель на массив и размер массива

for (int n=0; n<10; n++)
{
messagebox(format(#result[n][0])); // результат - text 0, text 1 и тд
}
 
 Top
Zireael
Отправлено: 13 Августа, 2018 - 11:41:42
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4395
Дата рег-ции: Нояб. 2017  
Репутация: 580




С char понятно. А с двухмерным string как быть?
 
 Top
Kibor
Отправлено: 13 Августа, 2018 - 12:08:57
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8094
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Двухмерный char и string разные вещи.
В 2мерный char можно записать список какого плана
CODE:

пункт 1
пункт 2
пункт 3

В 2мерный string можно записать такой
 Цитата:

пункт 1 еще пункт 1
пункт 2 еще пункт 2
пункт 3 еще пункт 3


Что именно надо хранить в этом массиве string?
 
 Top
Zireael
Отправлено: 13 Августа, 2018 - 12:48:08
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4395
Дата рег-ции: Нояб. 2017  
Репутация: 580




 Цитата:
Что именно надо хранить в этом массиве string?

Результат regex_search или regex_iterator.
Функция в dll принимает:
Строку, в которой надо что-то найти.
Регулярное выражение.
Указатель на массив, в который возвращает результат поиска.

Пока сделал чтобы возвращало в двухмерный char. Но, было удобнее в string. По сути вот это:
 Цитата:
Так же будет работать такая выборка данных с помощью /\
/RU\+, ALL+, /NUM\+
Сразу выведет ИМЯ ТЕЛЕФОН без лишней информации.
Вывод будет в массив.

Удобнее вернуть в двухмерный string, чем в char.
(Добавление)
dll
Вот так сейчас это выглядит (проверял только в win10):
CODE:
// код dll, собирался в vs 2017
#include "stdafx.h"
#include <iostream>
#include <string>
#include <regex>

using namespace std;
extern "C" __declspec(dllexport)int regexp(char* ss, char* sss, char* result, int size_x, int size_y)
{
string s(ss);
smatch match;
regex e(sss);
if (regex_search(s, match, e))
{
for(int i=0; i<size_x; i++)
strcpy_s(result + size_y * i, size_y, match.str(i).c_str());
return 1;
}
else return 0;
}

CODE:
// код в кибор
external(INT, "regexp", "regexp", "C:\Users\abc\Desktop\regexp.dll");
string s="Какой-то текст. User: Вася, +7(495)123-45-67. Ещё текст"; // строка, в которой ищем имя и телефон
string r="User.*?([а-яА-ЯёЁ]+).*?([\d-+()]+)"; // регулярное выражения
char result[3][100]; //сюда запишется результат

// передаётся строка, регулярка, указатель, размеры массива
int x=regexp(s, r, address(#result[0][0]), 3, 100); // если найдено возвращает 1, иначе 0
//messagebox(x);
if(x==1)
{
messagebox(format(#result[0][0])); // найденная строка
messagebox(format(#result[1][0])); // захват1 - то что в первых скобках
messagebox(format(#result[2][0])); // захват2 - то что во вторых скобках

}
else messagebox("Не найдено");

Неплохо бы переделать чтобы в string возвращало.
 
 Top
Kibor
Отправлено: 13 Августа, 2018 - 13:27:52
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8094
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Собирался проект MFC AppWizard (dll) в среде Создание диалогового окна и любых конторолов в dll с MFC

CODE:

//DLL
#include "stdafx.h"


extern "C" __declspec(dllexport)void fn(CString *s, int x, int y)
{
for (int xt=0; xt<x; xt++)
{
for (int yt=0; yt<y; yt++)
{
s[yt+xt*y].Format("text %i %i", xt, yt);
}
}
}



Надо инициализировать весь массив string строками более длиной, чем ожидается в них писать.
CODE:
// код в кибор
external(VOID, "fn", "fn", "C:\Users\yacir\source\repos\test\Release\test.dll");
string result[10][20];
for (int n=0; n<10; n++)
{
for (int n1=0; n1<20; n1++)
{
result[n][n1]="tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt";
}
}
fn(address(#result[0][0]), 10, 20); // передаём указатель на массив и размер массива
messagebox(result[0][0]); // результат - text 0 0
messagebox(result[1][5]); // результат - text 1 5
 
 Top
Zireael
Отправлено: 26 Августа, 2018 - 16:46:47
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4395
Дата рег-ции: Нояб. 2017  
Репутация: 580




Как вернуть double из dll?
CODE:
#include "stdafx.h"
extern "C" __declspec(dllexport)double d()
{
return 123.5;
}

CODE:
external(DOUBLE, "d", "d", "C:\Users\yacir\source\repos\test\Release\test.dll");
double x=d();
messagebox(x); // возвращает 0.000000
 
 Top
Kibor
Отправлено: 27 Августа, 2018 - 04:47:25
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8094
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




С double проблема. Там все сложнее с возвратом. Пока не корректно работает.
Выйти можно передавая указатель на double и изменяя значение этой переменной в самой dll по указателю.
 
 Top
Zireael
Отправлено: 27 Августа, 2018 - 14:29:04
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4395
Дата рег-ции: Нояб. 2017  
Репутация: 580




В длл так нельзя делать или оно не работает?:
CODE:
extern "C" __declspec(dllexport)void fn(int x=10)
{
// если вызов из кибор: fn(123), то x=123
// если fn(), то x=10
}
 
 Top
Kibor
Отправлено: 28 Августа, 2018 - 00:36:45
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8094
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Не знаю.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы и решение проблем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by