powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно получить данные из STORAGE_BUS_TYPE
21 сообщений из 21, страница 1 из 1
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658254
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получаю значение из 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
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658268
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
Как минимум вот этого не должно быть.
Код: plaintext
1.
sprintf(strDD, "%s %d", strDD, busType);


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


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

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


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

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

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

strDD указывает на поле в динамической части STORAGE_DEVICE_DESCRIPTOR.
Я на 100% уверен что в это поле нельзя ничего дописывать.
И на 99% уверен что вообще эта структура не должна модифицироваться юзером.
...
Рейтинг: 0 / 0
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658398
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS, у тебя на куче лежит структура DeviceDescriptor с членом-указателем ProductIdOffset на какую-то строку, также лежащую в каком-то участке кучи. Затем твой sprintf пытается сформировать на этом же участке кучи новую форматированную строку явно большего размера, одновременно вычитывая оттуда якабы то, что там было. Не мудрено, что твоя куча разваливается на раз!
А чего ты ожидал? Иди, учи матчасть!
...
Рейтинг: 0 / 0
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658538
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658565
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658567
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychа память по DEVICE и пробелы Пушкин будет выделять?))
К чему эти формальности при работе с кучей?
...
Рейтинг: 0 / 0
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658613
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658639
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658665
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devAIS, хотел бы я посмотреть в глаза тому кто преподавал тебе Си...ну да, правильный сишник написал бы это всё в одну строчку
...
Рейтинг: 0 / 0
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658699
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658736
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658774
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS, ты еще и опечатку от принципиальной ошибки не отличаешь... Скверно.

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

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

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

При любой ошибке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно получить данные из STORAGE_BUS_TYPE
    #39658865
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
21 сообщений из 21, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно получить данные из STORAGE_BUS_TYPE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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