Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / возврат объекта с изменяемым размером. / 2 сообщений из 2, страница 1 из 1
04.07.2006, 13:54
    #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
04.07.2006, 16:48
    #33830792
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возврат объекта с изменяемым размером.
все, допер, где ошибка:
в ф-ции bdequery я осуществлял сдвиг на размер текущего поля от начала буфера, а не тек. позиции итератора.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / возврат объекта с изменяемым размером. / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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