Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Заполнить двухмерный массив char в dll

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

1. Zireael - 12 Августа, 2018 - 19:34:52 - перейти к сообщению
С одномерными массивами всё понятно.
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?
2. Kibor - 12 Августа, 2018 - 22:40:52 - перейти к сообщению
Все массивы это последовательность одномерного массива.
Заполнять массив надо с помощью расчета и смещения адресов исходя из размерности 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 и тд
}
3. Zireael - 13 Августа, 2018 - 03:41:42 - перейти к сообщению
С char понятно. А с двухмерным string как быть?
4. Kibor - 13 Августа, 2018 - 04:08:57 - перейти к сообщению
Двухмерный char и string разные вещи.
В 2мерный char можно записать список какого плана
CODE:

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

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

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


Что именно надо хранить в этом массиве string?
5. Zireael - 13 Августа, 2018 - 04:48:08 - перейти к сообщению
 Цитата:
Что именно надо хранить в этом массиве 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 возвращало.
6. Kibor - 13 Августа, 2018 - 05:27:52 - перейти к сообщению
Собирался проект 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
7. Zireael - 26 Августа, 2018 - 08:46:47 - перейти к сообщению
Как вернуть 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
8. Kibor - 26 Августа, 2018 - 20:47:25 - перейти к сообщению
С double проблема. Там все сложнее с возвратом. Пока не корректно работает.
Выйти можно передавая указатель на double и изменяя значение этой переменной в самой dll по указателю.
9. Zireael - 27 Августа, 2018 - 06:29:04 - перейти к сообщению
В длл так нельзя делать или оно не работает?:
CODE:
extern "C" __declspec(dllexport)void fn(int x=10)
{
// если вызов из кибор: fn(123), то x=123
// если fn(), то x=10
}
10. Kibor - 27 Августа, 2018 - 16:36:45 - перейти к сообщению
Не знаю.

Powered by ExBB FM 1.0 Final