Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно получить данные из STORAGE_BUS_TYPE / 21 сообщений из 21, страница 1 из 1
08.06.2018, 12:37
    #39658254
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
Получаю значение из STORAGE_BUS_TYPE busType для HDD и USB-flash на ПК (Win7) и ноутбук (WinXP).
busType from HDD and USB-flash
Код: 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.
char* strDD;
char* strBT;
if (pDeviceDescriptor->ProductIdOffset != 0) {
	strDD = (char*)((char*)pDeviceDescriptor + pDeviceDescriptor->ProductIdOffset);
}
busType = pDeviceDescriptor->BusType;

/* 1 вариант - просто числовое значение */
sprintf(strDD, "%s %d", strDD, busType);

/* 2 вариант - перевожу в текст*/
if (busType != 0) {
	switch (busType)
	{
		...
		case BusTypeScsi: //0x1
			strBT = "BusTypeScsi";
			break;
		...
		default:
			strBT = "default";
	}
	sprintf(strDD, "%s %s", strDD, strBT);
}

///////////////
MessageBox(
	NULL,
	strDD,
	"DeviceDescriptor",
	MB_OK | MB_ICONINFORMATION);


На ПК 1-ый и 2-ой варианты работают для HDD, но НЕ работает для USB-flash
Error for USB-flash
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Error!

Program: ...

HEAP CORRUPTION DETECTED: after Normal block (#62) at 0x006D7BF0.
CRT detected that the application wrote to memory after end of heap buffer.
...

2-ой вариант на ноутбуке НЕ работает ни для HDD, ни для USB-flash, приложение просто падает.

Как правильно получить данные из STORAGE_BUS_TYPE в числовом и текстовом виде для вывода данных, чтобы везде работало?
...
Рейтинг: 0 / 0
08.06.2018, 12:44
    #39658268
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
AIS,
Как минимум вот этого не должно быть.
Код: plaintext
1.
sprintf(strDD, "%s %d", strDD, busType);


Ну и вообще есть сомнения что в strDD можно писать что-то.
...
Рейтинг: 0 / 0
08.06.2018, 13:11
    #39658307
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
Anatoly MoskovskyAIS,
Как минимум вот этого не должно быть.
Код: plaintext
1.
sprintf(strDD, "%s %d", strDD, busType);


Ну и вообще есть сомнения что в strDD можно писать что-то.
Т.е. надо собрать все данные, которые мне надо, до кучи, а потом одним вызовом sprintf сформировать строку для вывода. Так? или как иначе такое собирается во едино?

ПС. спасибо за комментарии, советы и помощь и на этом форуме :)
...
Рейтинг: 0 / 0
08.06.2018, 14:21
    #39658382
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
AISAnatoly MoskovskyAIS,
Как минимум вот этого не должно быть.
Код: plaintext
1.
sprintf(strDD, "%s %d", strDD, busType);


Ну и вообще есть сомнения что в strDD можно писать что-то.
Т.е. надо собрать все данные, которые мне надо, до кучи, а потом одним вызовом sprintf сформировать строку для вывода. Так? или как иначе такое собирается во едино?

ПС. спасибо за комментарии, советы и помощь и на этом форуме :)

Да фиг тебя знает, что тебе надо. Наркоманский какой-то код совсем...
Формулируй вопрос правильно, тогда получишь ответ.
...
Рейтинг: 0 / 0
08.06.2018, 14:34
    #39658390
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
AISТ.е. надо собрать все данные, которые мне надо, до кучи, а потом одним вызовом sprintf сформировать строку для вывода. Так? или как иначе такое собирается во едино?

strDD указывает на поле в динамической части STORAGE_DEVICE_DESCRIPTOR.
Я на 100% уверен что в это поле нельзя ничего дописывать.
И на 99% уверен что вообще эта структура не должна модифицироваться юзером.
...
Рейтинг: 0 / 0
08.06.2018, 14:44
    #39658398
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
AIS, у тебя на куче лежит структура DeviceDescriptor с членом-указателем ProductIdOffset на какую-то строку, также лежащую в каком-то участке кучи. Затем твой sprintf пытается сформировать на этом же участке кучи новую форматированную строку явно большего размера, одновременно вычитывая оттуда якабы то, что там было. Не мудрено, что твоя куча разваливается на раз!
А чего ты ожидал? Иди, учи матчасть!
...
Рейтинг: 0 / 0
08.06.2018, 18:00
    #39658538
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
Anatoly MoskovskyAISТ.е. надо собрать все данные, которые мне надо, до кучи, а потом одним вызовом sprintf сформировать строку для вывода. Так? или как иначе такое собирается во едино?

strDD указывает на поле в динамической части STORAGE_DEVICE_DESCRIPTOR.
Я на 100% уверен что в это поле нельзя ничего дописывать.
И на 99% уверен что вообще эта структура не должна модифицироваться юзером.
strDD - признаю, не подумал.
Так уже вроде все заработало
Код: plaintext
1.
2.
3.
4.
5.
...
size_t sLen = strlen(strDD) + strlen(strBT);
char *strReturn = (char*)malloc(sizeof(char)*(sLen+1));
sprintf(strReturn, "DEVICE: %s %s", strDD, strBT);
...



Большое спасибо.
...
Рейтинг: 0 / 0
08.06.2018, 18:54
    #39658565
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
AISТак уже вроде все заработало
Код: plaintext
1.
2.
3.
4.
5.
...
size_t sLen = strlen(strDD) + strlen(strBT);
char *strReturn = (char*)malloc(sizeof(char)*(sLen+1));
sprintf(strReturn, "DEVICE: %s %s", strDD, strBT);
...

а память по DEVICE и пробелы Пушкин будет выделять?))
...
Рейтинг: 0 / 0
08.06.2018, 18:56
    #39658567
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
egorychа память по DEVICE и пробелы Пушкин будет выделять?))
К чему эти формальности при работе с кучей?
...
Рейтинг: 0 / 0
08.06.2018, 21:35
    #39658613
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
egorychAISТак уже вроде все заработало
Код: plaintext
1.
2.
3.
4.
5.
...
size_t sLen = strlen(strDD) + strlen(strBT);
char *strReturn = (char*)malloc(sizeof(char)*(sLen+1));
sprintf(strReturn, "DEVICE: %s %s", strDD, strBT);
...

а память по DEVICE и пробелы Пушкин будет выделять?))
Упс, опять поторопился
Ай да Пушкин, ай да сукин сын (с)

NekZegorychа память по DEVICE и пробелы Пушкин будет выделять?))
К чему эти формальности при работе с кучей?
И на груди его могучей одна медаль висела кучей (с)
...
Рейтинг: 0 / 0
08.06.2018, 23:29
    #39658639
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
AIS, хотел бы я посмотреть в глаза тому кто преподавал тебе Си...
Код: plaintext
1.
2.
3.
4.
char* buf = NULL;
size_t sz = 0;
buf = (char*)malloc(++(sz = snprintf(buf, sz, "%s", test)));
snprintf(buf, sz, "%s", test);
...
Рейтинг: 0 / 0
09.06.2018, 05:09
    #39658665
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
rdb_devAIS, хотел бы я посмотреть в глаза тому кто преподавал тебе Си...ну да, правильный сишник написал бы это всё в одну строчку
...
Рейтинг: 0 / 0
09.06.2018, 09:16
    #39658699
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
CEMb, дело не в одной строчке, а в том, что snprintf умеет возвращать количество символов, необходимое для размещения форматированной строки. Написать-то можно и в несколько строчек и для понимания так даже лучше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
static const char fmt_DEVICE[] = "DEVICE: %s %s";
char* buf = NULL;
size_t sz = 0;
sz = snprintf(buf, sz, fmt_DEVICE, strDD, strBT);
sz++;
buf = (char*)malloc(sz);
if (NULL != buf)
  sprintf(buf, sz, fmt_DEVICE, strDD, strBT);
...
Рейтинг: 0 / 0
09.06.2018, 10:14
    #39658736
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
rdb_devCEMb, дело не в одной строчке, а в том, что snprintf умеет возвращать количество символов, необходимое для размещения форматированной строки. Написать-то можно и в несколько строчек и для понимания так даже лучше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
static const char fmt_DEVICE[] = "DEVICE: %s %s";
char* buf = NULL;
size_t sz = 0;
sz = snprintf(buf, sz, fmt_DEVICE, strDD, strBT);
sz++;
buf = (char*)malloc(sz);
if (NULL != buf)
  sprintf(buf, sz, fmt_DEVICE, strDD, strBT);


Конечно, предыдущий код был интересней, хвала тому "кто преподавал тебе Си" ;)
Я бы тоже хотел посмотреть ему в глаза и узнать, чтобы он поставил бы тебе за этот код )))

ПС. "мы конечно университетов не заканчивали"(с), поэтому за оба кода спасибо.
...
Рейтинг: 0 / 0
09.06.2018, 11:04
    #39658774
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
AIS, ты еще и опечатку от принципиальной ошибки не отличаешь... Скверно.

P.S. Я тоже университетов не заканчивал, что не помешало мне в 9-ом классе освоить ассемблер Z-80 без чьей-либо помощи.
...
Рейтинг: 0 / 0
09.06.2018, 12:06
    #39658799
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
rdb_devдело не в одной строчке, а в том, что snprintf умеет возвращать количество символов,
необходимое для размещения форматированной строки.

Ага, или -1 при ошибке. Твой код прокатывал полвека назад, но с тех пор некоторые
программисты начали заботиться о том, чтобы их поделия не падали с возгласом "шит хаппен".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.06.2018, 12:59
    #39658824
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
Dimitry Sibiryakov, не будет никакого "shit happen" при вызове snprintf с размером буфера 0 ни на одной из платформ - ни на линухе, ни на венде. Везде будет выдан требуемый размер символов.
...
Рейтинг: 0 / 0
09.06.2018, 13:07
    #39658825
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
rdb_devВезде будет выдан требуемый размер символов.

Повторяю медленно: или -1 при ошибке .
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.06.2018, 13:21
    #39658842
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
Dimitry SibiryakovПовторяю медленно: или -1 при ошибке .При какой ошибке? При нулевом указателе на строку формата?
...
Рейтинг: 0 / 0
09.06.2018, 13:32
    #39658853
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
rdb_devПри какой ошибке?

При любой ошибке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.06.2018, 13:43
    #39658865
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить данные из STORAGE_BUS_TYPE
Dimitry Sibiryakovrdb_devПри какой ошибке?

При любой ошибке.
Вот конкретный участок кода:
Код: plaintext
1.
2.
3.
4.
static const char fmt_DEVICE[] = "DEVICE: %s %s";
char* buf = NULL;
size_t sz = 0;
sz = snprintf(buf, sz, fmt_DEVICE, strDD, strBT);

Укажи, пожалуйста, на условия возникновения "любой ошибки" при том, что strDD и strBT указывают на корректно сформированные строки в однобайтовой национальной или ASCII кодировке.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно получить данные из STORAGE_BUS_TYPE / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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