Fg99
Гость
|
|
« : 28-01-2007 14:27 » |
|
После третьего вызова функции присходит ошибка "Access violation at address 00000000. Read of address 00000000." Выделяю память так: BYTE Mac[6] = { 0, 0, 0, 0, 0, 0}; DWORD Len = 6; вызов: SendARP( ipAddr, 0, (PULONG)&Mac, &Len); Освобождаю: delete [] Mac; Проблема точно с Mac[]. Тип его менял, но тот же эффект - три раза и вылет. Может кто подскажет что делаю нетак. Спасибо.
|
|
« Последнее редактирование: 28-01-2007 14:31 от Fg99 »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 28-01-2007 14:45 » |
|
Fg99, неправильно делаешь! delete - оператор освобождения динамически выделяемой памяти, а для Mac[] память выделяется автоматически. Это разные методы. Автоматическая память сама освобождается при выходе из ф-ии.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Fg99
Гость
|
|
« Ответ #2 : 28-01-2007 16:16 » |
|
Спасибо. Да, конечно. Присобачил такое удаление, ибо не мог понять где ошибка. Без delete[] ни чего не изменилось - ровно три вызова и всё тут.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 28-01-2007 16:25 » |
|
Fg99, SendARP( ipAddr, 0, (PULONG)&Mac, &Len);
- точно амперсенд нужен?
|
|
|
Записан
|
|
|
|
tishka17
Участник
Offline
Не разбрасывайте мусор
|
|
« Ответ #4 : 28-01-2007 16:32 » |
|
приведи код, как ты работаешь с этим массивом в самой функции... ты гдето обращаешься к указателю, который равен NULL
|
|
« Последнее редактирование: 28-01-2007 16:33 от tishka17 »
|
Записан
|
//1001101010110100010100110011101111000010110111010101110011
|
|
|
Fg99
Гость
|
|
« Ответ #5 : 28-01-2007 16:48 » |
|
tishka17, ошибка происходит при вызове самой функции. Алексей1153++, да. Но почему именно три раза? По идее все параметры уничтожаются, ошибки подгрузки библиотеки или ф-ии исключаются.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 28-01-2007 16:51 » |
|
Fg99, а зачем тебе указатель на переменную, хранящую адрес начала массива? Нипаняяятнаа.
|
|
|
Записан
|
|
|
|
Fg99
Гость
|
|
« Ответ #7 : 28-01-2007 18:39 » |
|
хз Запарился. Фишка в том, что работало всё еще несколько часов назад. Вот пример: //где тут тег типа CODE? //----- PMIB_IFTABLE ifTbl; ULONG dwSize = 0; DWORD dwRetVal = 0;
ifTbl = (MIB_IFTABLE*) malloc(sizeof(MIB_IFTABLE));
if (GetTable(ifTbl, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { free(ifTbl); ifTbl = (MIB_IFTABLE *) malloc (dwSize); }
if ((dwRetVal = GetTable(ifTbl, &dwSize, 0)) == NO_ERROR) { for (int i = 0; i<ifTbl->dwNumEntries;i++) { String s = (char*)ifTbl->table[i].bDescr; String t1 =(String)IntToHex(ifTbl->table[i].bPhysAddr[0],2); /*String str = (String)IntToHex(ifTbl->table[i].bPhysAddr[0],2) IntToHex(ifTbl->table[i].bPhysAddr[0],2)+":"+ IntToHex(ifTbl->table[i].bPhysAddr[1],2)+":"+ IntToHex(ifTbl->table[i].bPhysAddr[2],2)+":"+ IntToHex(ifTbl->table[i].bPhysAddr[3],2)+":"+ IntToHex(ifTbl->table[i].bPhysAddr[4],2)+":"+ IntToHex(ifTbl->table[i].bPhysAddr[5],2)+ " | "; str = (String)str + (ifTbl->table[i].dwInOctets/8) + " | "; str = (String)str + (ifTbl->table[i].dwOutOctets/8); mmt->Lines->Add(str); */ } } //.........
Тоже не бог весть какая ошибка. Правда, не при вызове, а при обращении к bPhysAddr или bDescr. Функция отрабатывает отлично. Если не через ss, а просто Add()(TMemo), то ошибка 100%. А так - катит. t1-уже ошибка опять. Ни черта не понимаю. Ведь все работало. Главное, другие программы(вообще сторонних производителей) отрабатывают отлично. Пипец...
|
|
« Последнее редактирование: 28-01-2007 19:13 от Алексей1153++ »
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #8 : 29-01-2007 06:09 » |
|
попробуй сделать, так как написано вот тут http://msdn2.microsoft.com/en-us/library/aa366358.aspxобрати внимание на то что буфер перед вызовом зачищают и 4-й параметр переустанавливают он IN/OUT кстати вот это (char*) не хорошо и даже плохо используй конструкции C++ а не C кстати в каком потоке это String s = (char*)ifTbl->table .bDescr; выполняется?
|
|
|
Записан
|
Странно всё это....
|
|
|
Fg99
Гость
|
|
« Ответ #9 : 29-01-2007 09:44 » |
|
кстати вот это (char*) не хорошо и даже плохо используй конструкции C++ а не C кстати в каком потоке это String s = (char*)ifTbl->table.bDescr; выполняется?
1)почему же? явное преобразование...2)не понял вопроса=) LogRus, спасибо за ответ. На счет кода МСДН - с него и начиналось всё когда-то. Однако коду на МСДН верить нужно осторожно, т.к. большинство содержит ошибки, как и в случае SendARP(). Но все-равно спасибо, буфер перед вызовом зачищают и 4-й параметр переустанавливают ты совершенно прав, а я в панике уже забыл об этом.Что получится - отпишу.
|
|
|
Записан
|
|
|
|
Fg99
Гость
|
|
« Ответ #10 : 29-01-2007 11:26 » |
|
нет. Ни какого эффекта. Не понимаю в чем проблема. А проект МСДН вообще не компилируется, кстати.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #11 : 29-01-2007 13:33 » |
|
1)почему же? явное преобразование...2)не понял вопроса=) LogRus, спасибо за ответ. На счет кода МСДН - с него и начиналось всё когда-то. Однако коду на МСДН верить нужно осторожно, т.к. большинство содержит ошибки, как и в случае SendARP(). Но все-равно спасибо, буфер перед вызовом зачищают и 4-й параметр переустанавливают ты совершенно прав, а я в панике уже забыл об этом.Что получится - отпишу. 1) не хорошо потому, что в коде это преобразование в глаза не бросается лучше C++ static_cast, dynamic_cast их явно видно в коде и не даёт ворнингов в аутпут, у нас в контере требование, ворнингов быть не должно 2)поток GUI или дополнительный 3) пример со страницы компилится и работает поставил в код цикл 100 итераций прошли успешно, ты случайно не забыл линковщику сказатать брать библиотечки ws2_32.lib and iphlpapi.lib
|
|
|
Записан
|
Странно всё это....
|
|
|
Fg99
Гость
|
|
« Ответ #12 : 30-01-2007 17:26 » |
|
1) дык и так нет варнингов, да и привычка ужо=). На счет визуального восприятия-учту, спасибо. 2)GUI 3)ты про МСДН? хммм... Да, конечно линковал. Пробовал вручную описывать структуры и подгружать функцию из библиотеки - вот тогда получалось. Впрочем, и в приведенных примерах функции описаны мной, а не подключением хелпер.h. Надо попробовать чрез .h, вдруг в этом прблема? Хотя вряд ли... Жаль ближайшие лни некогда будет разбираться с этим, но как пойдет дело отпишу. Спасибо, что не оставляете тему без внимания .
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #13 : 30-01-2007 17:47 » |
|
Fg99, дело не только в визуальном восприятии но и в возможности поиском найти все точки явных преобразований особенно полезно когда преходишь на другую платформу. 2) прекрасно 3) а вот руками ты зря структуры описываешь насчет не оставлять без внимания это от тебя зависит
|
|
|
Записан
|
Странно всё это....
|
|
|
zubr
Гость
|
|
« Ответ #14 : 30-01-2007 18:15 » |
|
В общето IntToHex возвращает тип AnsiString, похоже преобразование типов AnsiString в string и вызывает ошибку.
|
|
|
Записан
|
|
|
|
Fg99
Гость
|
|
« Ответ #15 : 30-01-2007 18:23 » |
|
zubr, String == AnsiString LogRus, 3) почему?
|
|
|
Записан
|
|
|
|
Fg99
Гость
|
|
« Ответ #16 : 30-01-2007 18:25 » |
|
Там преобразование (String) идет, чтоб дать понять что я вовсе не хочу складывать "строки", а склеивать их и результат - строка. //не знаю как это по-русски объяснить
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 30-01-2007 18:28 » |
|
Fg99, str = (String)str + (ifTbl->table[i].dwInOctets/8) ---------------------> str = ((String)str) + (String)(ifTbl->table[i].dwInOctets/8)
а попробуй приоритеты поставить скобками поточнее... Хотя может и так оно правильно, но сразу не очевидно
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #18 : 31-01-2007 07:16 » |
|
LogRus, 3) почему?
потому, что если ты не будешь сообщать о ходе работ то вероятность того, что про тему забудут резко возрастает. кстати вот тебе рабочий код на основе на основе данных из msdn : template<class T, class T2> void ByteToHexStream(T& strm, T2 b) { strm.fill('0'); strm.setf(std::ios_base:: hex, std::ios_base:: basefield); strm << std::setw(sizeof(T2)*2) << static_cast<unsigned long>(b); }
int _tmain(int argc, _TCHAR* argv[]) { // Declare and initialize variables PMIB_IFTABLE ifTable; DWORD dwSize = 0; DWORD dwRetVal = 0;
// Allocate memory for our pointers ifTable = (MIB_IFTABLE*) malloc(sizeof(MIB_IFTABLE));
// Make an initial call to GetIfTable to get the // necessary size into the dwSize variable if (GetIfTable(ifTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { free(ifTable); ifTable = (MIB_IFTABLE *) malloc (dwSize); }
// Make a second call to GetIfTable to get the // actual data we want if ((dwRetVal = GetIfTable(ifTable, &dwSize, 0)) == NO_ERROR) { printf("\tNumber of entries: %ld\n", ifTable->dwNumEntries); for (DWORD i = 0; i<ifTable->dwNumEntries; ++i) { std::stringstream str;
std::cout << "Entry: " << i << "\n";
if (ifTable->table[i].dwPhysAddrLen) ByteToHexStream(str, ifTable->table[i].bPhysAddr[0]);
for (DWORD j = 1; j < ifTable->table[i].dwPhysAddrLen; ++j) { str << ":"; ByteToHexStream(str, ifTable->table[i].bPhysAddr[j]); } str.setf(std::ios_base::dec, std::ios_base::basefield); str << "|" << ifTable->table[i].dwInOctets/8 << "|" << ifTable->table[i].dwOutOctets/8; std::cout << str.str() << "\n"; } } else printf("\tGetIfTable failed.\n");
return 0; }
|
|
« Последнее редактирование: 07-12-2007 21:09 от Алексей1153++ »
|
Записан
|
Странно всё это....
|
|
|
Fg99
Гость
|
|
« Ответ #19 : 05-02-2007 16:45 » |
|
LogRus, спасибо =) Твой пример не пробовал запускать, атнака все-равно пасиба. Так и не разобрался в чем была причина. Всё заработало о_0. в общем, спс.
|
|
|
Записан
|
|
|
|
Fg99
Гость
|
|
« Ответ #20 : 05-02-2007 16:48 » |
|
LogRus, 3) почему?
это я по структурам? Почему считаешь, что "зря"?
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #21 : 05-02-2007 18:18 » |
|
Fg99, потому, что велосипед это раз во вторых малоли какие там прагмы есть/нет посреди структуры в общем без крайней необходимости велосипеды изобретать дело вредное, наверняка кто уже обовсём подумал за нас
|
|
|
Записан
|
Странно всё это....
|
|
|
Антон (LogRus)
|
|
« Ответ #22 : 05-02-2007 18:20 » |
|
имхо код был немного, не универсален например, небыло этого for (DWORD j = 1; j < ifTable->table[i].dwPhysAddrLen; ++j) { str << ":"; ByteToHexStream(str, ifTable->table[i].bPhysAddr[j]); }
и возможно структуры у тебя всёже кривые были. выравнивания нет/есть да мало ли. Это же МАГИЯ
|
|
« Последнее редактирование: 07-12-2007 21:10 от Алексей1153++ »
|
Записан
|
Странно всё это....
|
|
|
|