Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / struct ** / 11 сообщений из 11, страница 1 из 1
07.02.2017, 17:10
    #39400289
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
Добрый вечер, коллеги!
Нужна помощь.
В коде ниже на выходе получаем список из 10 Struct PERSON1.
Заполняется только 1, остальные пустые.
Как заполнить еще один, не могу понять.
Спасибо за помощь.

Код: 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.
31.
32.
struct PERSON1
{
	int   id;
	char* name;
	int   age;
	int   sex;
};


extern "C" __declspec(dllexport) void  WINAPI getA(PERSON1 ** p, int *c)
{
	if ( *p) {
		for (int i = 0; i < *c; i++) {
			::CoTaskMemFree((*p)[i].name);
			(*p)[i].name = nullptr;
		}
		::CoTaskMemFree(*p);
		*p = nullptr;
	}
	
	size_t sz = 10;
	PERSON1 *pt = (PERSON1*)CoTaskMemAlloc(sz*sizeof PERSON1);
	memset(pt, 0, sz * sizeof PERSON1);
	 
	 pt->age = 800;
	 std::string n = "asdf";
	 pt->name = (char*)::CoTaskMemAlloc(n.length()+1);
	 memcpy(pt->name,  n.c_str(), n.length()+1);

	 *p = pt;
	 *c = sz;
}
...
Рейтинг: 0 / 0
07.02.2017, 17:24
    #39400304
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
Замени "pt->" на "pt[0]." и, возможно, тебя осенит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.02.2017, 18:05
    #39400345
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
vadipok,

дикий треш...

DLL-и, Com, выделение памяти, std::string... -- и парень тупо не умеет работать с указателями...
Нафига браться ?

Как заполнить ещё один
-- научить отличать массив от элемента массива.
-- напиши цикл по обработке элементов массива, внутри -- заполняй.
...
Рейтинг: 0 / 0
08.02.2017, 01:19
    #39400514
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
MasterZivдикий треш...
это для интеропа с c#
не пугайся, там именно такие соглашения о выделении памяти
...
Рейтинг: 0 / 0
08.02.2017, 08:06
    #39400565
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
Dimitry SibiryakovЗамени "pt->" на "pt[0]." и, возможно, тебя осенит.



Код: 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.
extern "C" __declspec(dllexport) void  WINAPI getA(PERSON ** p, int *c)
{
	if (*p) {
		for (int i = 0; i < *c; i++) {
			::CoTaskMemFree((*p)[i].name);
			(*p)[i].name = nullptr;
		}
		::CoTaskMemFree(*p);
		*p = nullptr;
	}


	size_t sz = 10;
	PERSON *pt = (PERSON*)CoTaskMemAlloc(sz * sizeof PERSON);
	memset(pt, 0, sz * sizeof PERSON);

	pt[0].age = 800;
	string n = "asdf";
	pt[0].name = (char*)::CoTaskMemAlloc(n.length() + 1);
	memcpy(pt[0].name, n.c_str(), n.length() + 1);

	pt[1].age = 800;
	n = "vadim";
	pt[1].name = (char*)::CoTaskMemAlloc(n.length() + 1);
	memcpy(pt[1].name, n.c_str(), n.length() + 1);



спасибо, все работает

Засуну все в Loop, и думаю проблема будет решена
...
Рейтинг: 0 / 0
08.02.2017, 08:32
    #39400571
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
ИзопропилMasterZivдикий треш...
это для интеропа с c#
не пугайся, там именно такие соглашения о выделении памяти

А зачем extern "C" здесь нужен, если это будет использоваться в C#? Кажется мне, что этот код кое-какие компиляторы даже не скомпилируют.
...
Рейтинг: 0 / 0
08.02.2017, 09:15
    #39400599
vadipok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
ermak.nnИзопропилпропущено...

это для интеропа с c#
не пугайся, там именно такие соглашения о выделении памяти

А зачем extern "C" здесь нужен, если это будет использоваться в C#? Кажется мне, что этот код кое-какие компиляторы даже не скомпилируют.

В C# он работает без нареканий.
...
Рейтинг: 0 / 0
08.02.2017, 12:33
    #39400765
Common Lisp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
ermak.nnА зачем extern "C" здесь нуженЧтобы декорации имён не было.
...
Рейтинг: 0 / 0
08.02.2017, 14:54
    #39400955
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
vadipokermak.nnпропущено...


А зачем extern "C" здесь нужен, если это будет использоваться в C#? Кажется мне, что этот код кое-какие компиляторы даже не скомпилируют.

В C# он работает без нареканий.

Давно я не трогал windows.
...
Рейтинг: 0 / 0
08.02.2017, 15:20
    #39400994
Common Lisp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
ermak.nnДавно я не трогал windows.При чём тут windows?
...
Рейтинг: 0 / 0
08.02.2017, 19:03
    #39401202
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct **
Common Lispermak.nnДавно я не трогал windows.При чём тут windows?
C#, __declspec(dllexport), WINAPI

extern "C" оставалось единственным непонятным, но вы разъяснили Common LispЧтобы декорации имён не было.
так что теперь все понятно.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / struct ** / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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