10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|
1 | |
Указатели и указатели на указатели, а также типы данных16.11.2012, 12:46. Показов 3205. Ответов 17
Метки нет Все метки)
(
Недавно начал изучать Си, перешел с Delphi.
Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас хотелось бы узнать как решить следующую задачу: Пишу DLL, в ней есть экспортируемая функция: Код
void APIENTRY MtSrvManagerProtocol(ULONG ip, UserInfo *us, unsigned char *in_data, int in_size,unsigned char **out_data,int *out_size) char *in_data с горем пополам перевел в char Код
char temp[1024]; strcpy(temp,(char *)in_data) И мне нужно перевести in_data или temp перевести в LPCSTR, как это лучше сделать? Спасибо.
0
|
|
16.11.2012, 12:46 | |
Ответы с готовыми решениями:
17
Через указатели на указатели посчитать сумму двух чисел и записать в третье Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей? Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной |
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
16.11.2012, 12:56 | 2 |
это называется двойной указатель.
Ну во-первых через указатели на нулевые элементы реализуются массивы. А если элементы массива сами массивы? Получается, что массивы-элементы реализуются через указатели, а сам массив - массив указателей, но тоже реализуется через указатель. На что? Только на указатель же. Во-вторых через указатели реализуются изменяемые в самой функции параметры. А если при этом сам параметр - указатель? Или массив? Вот и получается двойной. Но тогда он может быть зщаменён ссылкой на указатель, да и вообще изменяемые параметры могут реализовываться ссылками вместо указателей.
Добавлено через 1 минуту У тебя нет такого типа.
1
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|
16.11.2012, 12:57 [ТС] | 3 |
Т.е. что такое unsigned char я понимаю, меня интересует зачем **. А для чего нужен двойной указатель? Т.е. он указывает на память, в которой хранится указатель на unsigned char ? Не совсем понимаю смысл этого.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
16.11.2012, 13:09 | 4 |
перекосячил. Указатель в ча не переводится.
Добавлено через 3 минуты Зачем? У тебя уже указатель на char. Зачем ещё один? К тому же это опасно переполнением массива, так как автоматический массив резервируется конкретного размера, а указатель подразумевает динамический, размер которого не известен. Добавлено через 34 секунды Нет худшего. Добавлено через 6 минут зачем?
1
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
16.11.2012, 13:21 | 5 | |||||
1
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|
16.11.2012, 13:21 [ТС] | 6 |
Ок, т.е. unsigned char *in_data - это массив чаров (строка),
а unsigned char **out_data это массив массивов чаров (массив строк). Есть функция записи в лог, она принимает LPCSTR, я бы хотел перевести char *in_data в LPCSTR и посмотреть что я получил то же что отправил или что-то другое) Как мне заполнить out_data данными? в Delphi можно было указать размеры массива, если он безразмерный или размер определялся при объявлении. Например я хочу в out_data засунуть 1 строчку Код
out_data[0] = in_data; Код
out_size[0] =in_size;
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
16.11.2012, 13:30 | 7 |
Передавай, как есть, это одно и то же.
Добавлено через 3 минуты Нет. Меня смущает out, возможно это выходные, то есть изменяемые параметры, тогда out_data - простой массив cahrов, а не массив массивов, а out_size - вообще не массив. Но в любом случае запись чего либо в нулевой элемент не говорит об остальных элементах.
0
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|
16.11.2012, 13:41 [ТС] | 8 |
Да, так и есть.
В ин я получаю строку, в аут могу отдать строку, в некоторых случаях массивы строк. Т.е. out_data должна быть массивом строк. Т.к. это DLL я должен передать размер всего этого дела, для этого служит out_size Добавлено через 1 минуту DU Спасибо за примеры, вкуривю. Добавлено через 2 минуты LogsOut: невозможно преобразовать параметр 3 из 'unsigned char *' в 'LPCSTR'
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
16.11.2012, 13:48 | 9 | |||||
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
16.11.2012, 13:49 | 10 | ||||||||||
Тогда передай
1
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|
16.11.2012, 16:33 [ТС] | 11 |
Во многом разобрался.
out_data - объявил как Код
char buffer[256]; char *res = buffer; int len; Код
res = "wwwww"; out_data = (unsigned char **)&res; len = sizeof(out_data); out_size = &len; Но после вызова функции получаю эти значения пустыми. Функция находится в ДЛЛ, вызываю ее не из самой длл. Может глобальные переменные нужно где-то в паблике объявить?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
16.11.2012, 16:50 | 12 | ||||||||||
Паблик в глобале. Капец! Это же не член класса, а память другой программы, она должна быть экспортируемой. А лучше создавай в куче.
Добавлено через 8 минут Причём, даже так: вызывающая программа:
0
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|
16.11.2012, 17:00 [ТС] | 13 |
В том то и дело- вызывающая программа не моя.
Я к ней могу написать DLL плагин и подключиться через API и вызвать через него функцию MtSrvManagerProtocol Т.е. спровоцировать ее вызов и получить результаты. Как мне засунуть переменные out в кучу?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
16.11.2012, 17:04 | 14 |
Тогда весь этот синтаксис там уже соблюдён.
0
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|
16.11.2012, 17:06 [ТС] | 15 |
т.е. мне достаточно у себя в DLL объявить переменные глобально, чтобы у вызывающей программы был к ним доступ?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
16.11.2012, 17:07 | 16 |
Одну переменную. size - обычная автоматическая переменная, только у тебя от неё не идентификатор, а только адрес и для записи нужна косвенная адресация. Это
и есть создание в куче. Добавлено через 1 минуту Нет. Во-первых ты можешь только экспортировать, а не глобалить. А во-вторых откуда вызывающая программа узнает, как эти переменные зовут?
0
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|
16.11.2012, 17:20 [ТС] | 17 |
[size="1"][color="grey"]откуда вызывающая программа узнает, как эти переменные зовут?[/QUOTE]
К вызывающей программе есть мануал, в нем сказано, что она вызывает функцию MtSrvManagerProtocol Синтаксис описан в .h файле Код
void APIENTRY MtSrvManagerProtocol(ULONG ip, UserInfo *us, unsigned char *in_data, int in_size,unsigned char **out_data,int *out_size) Да, про кучу я почитал немного так тоже пробовал. ругается: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию и инициализация: невозможно преобразовать 'char *' в 'int *' Добавлено через 2 минуты я еще хотел res создать в куче Код
res=new char [256]; Код
ut_data = (unsigned char **)&res;
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
17.11.2012, 22:08 | 18 | |||||
Добавлено через 1 минуту Исходник в студию. Добавлено через 3 минуты Нельзя: значение ut_data есть адрес простого указателя на char, оно не может быть передано вызывающей программе, надо в память по этому адресу записать другой адрес - значение простого указателя на char, оно же адрес нуль-терминальной строки. Добавлено через 1 минуту Запомни: сам параметр может быть возвращён вызывающей программе только в том случае, если он ссылка. Если же это указатель, то вернуть информацию можно только через память по адресу, равному полученному значению параметра. Добавлено через 2 минуты Да. Но она уже с ним скомпилена. И в ней уже не учтены те переменные, которые ты придумал после её компиляции. Синтаксис вызова учтён, а глобальных переменных библиотеки она не знает, так как они не учтены и не могли быть учтены при написании самой программы. Твоя библиотека - другая программа и о ней вызывающая не знает ничего, кроме синтаксиса вызова использованных в вызывающей программе функций из твоей библиотеки.
1
|
17.11.2012, 22:08 | |
17.11.2012, 22:08 | |
Помогаю со студенческими работами здесь
18
Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? Отсортировать массив и вывести на экран (массивы и указатели на указатели)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |