powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / возврат объекта с изменяемым размером.
2 сообщений из 2, страница 1 из 1
возврат объекта с изменяемым размером.
    #33830084
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
бд на bde (paradox), с ней работает самописная субд.
пишу dll для доступа к бд в bds2006.
ее ф-ция: получить текст запроса, выполнить его, передать рез-т обратно.
запрос может быть любым, поэтому для вызывающей ф-ции неизвестно кол-во строк в рез-те, а для вызываемой ф-ции неизвестна стр-ра табл (в общем случае - рез-та). так как писать вызывающую ф-цию я собираюсь в visual .net, то применять в кач-ве параметров/возвращаемых значений можно только типы данных, не завязанные на среду ide;
вызываемая ф-ция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
int _export BDEQuery(record* ptrRes,const size_t* szar, const char* ptrQry)
{
	TQuery* myQ = new TQuery((TComponent*)NULL);
	myQ->Active = false;
	myQ->DatabaseName = AnsiString("db");
	myQ->SQL->Clear();
	myQ->SQL->Add(AnsiString(ptrQry));
	myQ->Active = true;
	myQ->First();
	ptrRes->resize(myQ->RecordCount*myQ->RecordSize);
	void* iter = ptrRes->begin();
	try
	{
	for(int i= 0 ;i<myQ->RecordCount;i++)
	{
		const size_t* ptrSz = szar;
		for(int j= 0 ;j<myQ->FieldCount;j++)
		{
			myQ->Fields->operator [](j)->GetData(iter,true);
			iter = ptrRes->shift(*(ptrSz++));
		}
	}
	myQ->~TQuery();
	return  0 ;
	}
	catch(...)
	{
		return - 1 ;
	}
}
используемый класс record:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <malloc.h>

class record
{
	void* ptrData;
	int size;

public:
	record();
	record(size_t);

	void*	resize(size_t);
	void*	begin()			{return ptrData;}
	void*	shift(size_t v)	{return (char*)ptrData+v;}
	void*	end()			{return (char*)ptrData+size;}
};
текст тестирующей вызывающей ф-ции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
typedef vector<char> v_char;
__declspec(dllimport) int BDEQuery(record* , const size_t*, const char*);

struct BarRec
{
	char code[ 16 ];
	char articul[ 31 ];
	char sz[ 11 ];
	int num;
};

#pragma argsused
int main(int argc, char* argv[])
{
	const char* query = "select * from bar.db where barcode = 2400002099732";
	record* man = new record();
	BarRec* bar = new BarRec();
	size_t szar[] = {sizeof(bar->code), sizeof(bar->articul), sizeof(bar->sz), sizeof(bar->num)};
	try
	{
		BDEQuery(man,szar, query);
		char* first = static_cast<char*>(man->begin());
		char* sec = static_cast<char*>(man->shift(*szar));
		std::cout<<first<<";\n "<<sec;
	}
	catch(...)
	{
	std::cout<<"something wrong happened";
	}
	return  0 ;
}
проблема в след.: для первого поля данные возвращаются верные, но для 2го вообще ничего. стр-ра табл указана в стр-ре barrec. плз, вгляните свежим взглядом, где ошибка?
...
Рейтинг: 0 / 0
возврат объекта с изменяемым размером.
    #33830792
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все, допер, где ошибка:
в ф-ции bdequery я осуществлял сдвиг на размер текущего поля от начала буфера, а не тек. позиции итератора.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / возврат объекта с изменяемым размером.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]