Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / DWORD to unsigned char* / 23 сообщений из 23, страница 1 из 1
29.01.2007, 16:14
    #34290290
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
Имеется структура
Код: plaintext
1.
2.
3.
4.
typedef struct
{
	DWORD	ID[ 5 ];		
	.....
} TCID; 

требуется передать в unsigned char* значение ID[0]. Пробовал, мой "код" при компиляции не ругается, но вот при передаче вылетает ошибка. Как это правильно сделать?
...
Рейтинг: 0 / 0
29.01.2007, 16:29
    #34290370
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
sax_Пробовал, мой "код" при компиляции не ругается, но вот при передаче вылетает ошибка. Как это правильно сделать?Так и показал бы свой код.
Но должно сгодиться (unsigned char*)ID[0], при неявном предположении, что длина адреса равна 4 байтам.
И куда передаем, в какой ОС?
...
Рейтинг: 0 / 0
29.01.2007, 16:32
    #34290385
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
pandrew sax_Пробовал, мой "код" при компиляции не ругается, но вот при передаче вылетает ошибка. Как это правильно сделать?Так и показал бы свой код.
Но должно сгодиться (unsigned char*)ID[0], при неявном предположении, что длина адреса равна 4 байтам.
И куда передаем, в какой ОС?
Передаем из одной DLL в другую. WinXP. Тоже самое было и у меня!
...
Рейтинг: 0 / 0
29.01.2007, 16:48
    #34290443
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
sax_ pandrew sax_Пробовал, мой "код" при компиляции не ругается, но вот при передаче вылетает ошибка. Как это правильно сделать?Так и показал бы свой код.
Но должно сгодиться (unsigned char*)ID[0], при неявном предположении, что длина адреса равна 4 байтам.
И куда передаем, в какой ОС?
Передаем из одной DLL в другую. WinXP. Тоже самое было и у меня!

Скорее всего что-то напутал в своем коде.
...
Рейтинг: 0 / 0
29.01.2007, 16:51
    #34290458
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
Функция DLL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
extern "C" int __declspec(dllexport)  getID(unsigned char* ID)
{
          int stat =  0 ;
          TCID CID;
          stat = GetCID(&CID);
          if (stat ==  0 )
          {
                  strcpy(ID,(unsigned char*)CID.ID[ 0 ]);
          }
          return stat;
}
вызываю

Код: plaintext
1.
2.
unsigned char* ID = new char[ 10 ];
int stat = getID(ID);
frmMain->Caption = AnsiString(*ID);
...
Рейтинг: 0 / 0
29.01.2007, 16:52
    #34290464
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
ID [0] - это по логике должен быть символ или указатель на символ?
...
Рейтинг: 0 / 0
29.01.2007, 17:02
    #34290507
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
HryuckinnenID [0] - это по логике должен быть символ или указатель на символ?
Это должен быть массив символов
...
Рейтинг: 0 / 0
29.01.2007, 17:03
    #34290512
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
sax_ HryuckinnenID [0] - это по логике должен быть символ или указатель на символ?
Это должен быть массив символов
Точнее строкой DWORD, там где-то 10 символов
...
Рейтинг: 0 / 0
29.01.2007, 17:07
    #34290521
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
Ошибку выдает на int stat = getID(ID);
Ошибка: Assecc violation по такому-то адресу в модуле CC3260MT.dll
...
Рейтинг: 0 / 0
29.01.2007, 17:07
    #34290523
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
Тогда я бы передал (unsigned char*) &CID.ID [0]
...
Рейтинг: 0 / 0
29.01.2007, 17:09
    #34290532
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
А то у тебя выходит, что ты значение ID [0] пытаешься представить как указатель:
(unsigned char*)CID.ID[0],
что не есть правильно.
...
Рейтинг: 0 / 0
29.01.2007, 17:11
    #34290541
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
extern "C" int __declspec(dllexport)  getID(unsigned char *ID)
{
          int stat =  0 ;
          TCID CID;
          stat = GetCID(&CID);
          if (stat ==  0 )
          {
                  sprintf(ID, "%d", CID[ 0 ]);
          }
          return stat;
}
...
Рейтинг: 0 / 0
29.01.2007, 17:14
    #34290553
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
sax_Ошибка: Assecc violation по такому-то адресу в модуле CC3260MT.dll

И, небось, попытка обращения к памяти по твоему id.
...
Рейтинг: 0 / 0
29.01.2007, 17:16
    #34290560
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
HryuckinnenТогда я бы передал (unsigned char*) &CID.ID [0]

Прокатило! Ошибки нет, только вот пока выдает не то, что надо.
...
Рейтинг: 0 / 0
29.01.2007, 17:25
    #34290598
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
Надо полностью код смотреть и тот, что кладет данные в структуру, и тот, что читает
...
Рейтинг: 0 / 0
29.01.2007, 17:30
    #34290618
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
Учит, что unsigned char - это есть BYTE, так что strcpy напихает тебе по 4 символа в каждый DWORD.
...
Рейтинг: 0 / 0
29.01.2007, 17:31
    #34290619
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
HryuckinnenНадо полностью код смотреть и тот, что кладет данные в структуру, и тот, что читает
Я полностью выложил, то что у меня было. А того "куска", что кладет именно в CID у меня нет. Это dll разработана не мною.
...
Рейтинг: 0 / 0
29.01.2007, 17:32
    #34290626
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
HryuckinnenУчит, что unsigned char - это есть BYTE, так что strcpy напихает тебе по 4 символа в каждый DWORD.
Сейчас я немного запутался, но в ID[0] должно быть пятизначное число, которое может быть отрицательным
...
Рейтинг: 0 / 0
29.01.2007, 17:40
    #34290658
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
У тебя по существу массив из 5 двойных слов (CID), который ты передаешь strcpy в качестве источника, чтобы она скопировала его содержимое в ID. Поставь брейкпойнт на строку с вызовом strcpy () и посмотри в отладчике, что реально в этом массиве находится. Не знаю, что ты имеешь в виду под "пятизначным числом".
Пятизначное число в бинарном представлении вполне может содержаться в ID [0], даже и отрицательное. Но тогда зачем передавать его с помощью функции копирования строк? А пятизначное число в символьном представлении ("-12345") в DWORD не понестится.
...
Рейтинг: 0 / 0
29.01.2007, 17:52
    #34290704
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
HryuckinnenТогда я бы передал (unsigned char*) &CID.ID [0]

Функция копирования строк прекратит работать при встрече нулевого байта. Во первых он может быть слишком рано, до завершения интересуемых байт, во вторых он может быть слишком далеко, после выхода за границу допустимой области памяти. В первом случае данные будут не достоверные, во втором или не достоверные или будет акссес виолейшен.

Это по поводу потери данных.

По смыслу записи - не вижу смысла приобразовывать данные для того чтобы их передать на верх с последующей конвертацией в строку.
...
Рейтинг: 0 / 0
29.01.2007, 17:54
    #34290707
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
И я о том же...
...
Рейтинг: 0 / 0
29.01.2007, 17:55
    #34290714
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
Akh HryuckinnenТогда я бы передал (unsigned char*) &CID.ID [0]

Функция копирования строк прекратит работать при встрече нулевого байта. Во первых он может быть слишком рано, до завершения интересуемых байт, во вторых он может быть слишком далеко, после выхода за границу допустимой области памяти. В первом случае данные будут не достоверные, во втором или не достоверные или будет акссес виолейшен.

Это по поводу потери данных.

По смыслу записи - не вижу смысла приобразовывать данные для того чтобы их передать на верх с последующей конвертацией в строку.
Спасибо всем. Вот так работает
Код: plaintext
sprintf(ID, "%d", CID[ 0 ]);
и выдает правильные значения.
...
Рейтинг: 0 / 0
29.01.2007, 17:56
    #34290718
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DWORD to unsigned char*
sax_ HryuckinnenУчит, что unsigned char - это есть BYTE, так что strcpy напихает тебе по 4 символа в каждый DWORD.
Сейчас я немного запутался, но в ID[0] должно быть пятизначное число, которое может быть отрицательным

То что я тебе раньше предложил - это конвертация в строку в самой функции. Ты же можешь пойти и другим путем, передать наверх число, а там его сконвертировать.

Пятизначное число в десятичной системе исчесления имеет отношение к информатике по тольку по скольку, ибо числа представляются в двоичной системе исчесления.

Раз у тебя пятизначное число, то максимальное число будет 99999, косличество всех возможных чисел - 199999, а это меньше чем 2^18, т.е. меньше 3-х байт. Так что в дубель ворд поместиться полюбому.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / DWORD to unsigned char* / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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