|
Вопрос # 3 699/ вопрос открыт / |
|
Здравствуйте, эксперты!
Сегодня вылезла ошибка "Acess violation.." при попытке добавить строку в Memo или сообщение в StatusBar.
Хотя вчера все было Ок.
Комментирую одну строку, вылетает на следующей. В чем может быть дело?
C++Builder2007
 |
Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 27 января 2010, 11:10
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 28; последнее сообщение — 28 января 2010, 10:52; участников в обсуждении: 4.
Страницы: [1] [2] [Следующая »]
|
Егор (статус: 10-ый класс), 27 января 2010, 11:22 [#1]:
у меня друг есть, он телепат. но как раз сегодня в отпуск уехал...
код давай, как мы тебе ответим, если кода не видим?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Вадим К (статус: Академик), 27 января 2010, 11:27 [#2]:
классический ответ звучит так - ошибка в 17 строке. Потому что никаких исходников не было предоставлено.
В целом, может быть что угодно - от расстрела памяти в одном месте до передачи мертвого указателя.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 11:42 [#3]:
block1 - Объект того самого класса, создан через new, и туда записаны данные
Код обычный:
readMemo->Lines->Add("Выводим Таблицу №"+IntToStr(block1->StartAddr));
for(j=0; j<block1->Size; j++)
{
tmpStr.sprintf("0x%x", block1->Data[j]);
readMemo->Lines->Add("["+IntToStr(j)+"] = " + tmpStr);
}
}
MainStatusBar->Panels->Items[0]->Text = "Вывод завершен!";
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 11:44 [#4]:
Таких кусков соответственно по кол-ву block-ов. И вылетает именно на обращении к Memo или StatusBar.
|
|
Егор (статус: 10-ый класс), 27 января 2010, 12:04 [#5]:
как создаются объекты? приведи строчку с new
и коструктор тоже приведи
что-то похоже, что у тебя объект не создаётся (или неправильно создаётся)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
min@y™ (статус: Доктор наук), 27 января 2010, 12:14 [#6]:
Попробуй убрать tmpStr.sprintf("0x%x", block1->Data[j]), а вот это readMemo->Lines->Add("[" + IntToStr(j) + "] = " + tmpStr) заменить на readMemo->Lines->Add("[" + IntToStr(j) + "] = 0x" + IntToHex(block1->Data[j], 0)) и посмотреть, что получится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 12:19 [#7]:
создание:
block1 = new TMemoryBlock();
block1->StartAddr = 0;
block1->Size = 986;
block1->InitData(0);
Конструктор
TMemoryBlock::TMemoryBlock()
{
// конструктор пустой, не знаю что туда писать,
}
//---------------------------------------------------------------------------
void TMemoryBlock::InitData(unsigned int initValue)
{
unsigned int i;
Data = new unsigned int[Size];
for (i=0; i<Size; i++)
Data[i] = initValue;
}
Деструктора нет
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 12:38 [#8]:
To min@y™
Я полностью комментирую блок с выводом в Memo. Оставляю только StatusBar и на нем вылетает.
Поэтому думаю это не поможет, но спасибо, попробую
|
|
Вадим К (статус: Академик), 27 января 2010, 12:49 [#9]:
и цикл комментируется?
а в статусбаре есть добавленные панельки? а то по умолчанию их туда никто не добавляет.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 13:38 [#10]:
Панельки есть. Цикл вывода в Memo комментируется
|
|
Вадим К (статус: Академик), 27 января 2010, 13:56 [#11]:
Тогда значит классический расстрел памяти. Где то в другом месте код пишет не в свою память. Сказать наверняка где - нельзя. Это одна из самых увлекательных задач.
Общие методы решения такие
- коментировать код до тех пор, пока ошибка не пропадет. потом методом деления попалам локализировать строку, подумать.
- воспользоваться инструментом типа valgrind
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 14:18 [#12]:
1) А CodeGuard поможет?
2) а что, если увеличить макс. размер стека и "кучи" в настройках проекта?
|
|
Вадим К (статус: Академик), 27 января 2010, 14:25 [#13]:
CodeGuard не использовал, не могу ничего советовать в его сторону.
а вот увеличивать размер стека/кучи не советовал бы. в таких случаях наоборот часто уменьшают, что бы спровоцировать проблему более явно. В любом случае, изменения размера кучи обычно размажет проблему или сделает её чуть иной.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 14:53 [#14]:
Подскажите пжслта как мне правильно организовать мой класс?
CodeGuard ругается на место, где я создаю объекты класса
Access overrun: Attempt to access 4 byte(s) at 0x00F3000C+3012, that is at
offset 0+3012 in heap block 0x00F3000C which is only 2024 bytes long.
The object array (0x00F3000C) [size: 2024 bytes] was created with new[]
Call Tree:
0x00406855(=PConf812M_v2_1.exe:0x01:005855) MemoryMapUnit.cpp#21
0x0041AB5D(=PConf812M_v2_1.exe:0x01:019B5D) ZDevSettings.cpp#1300
|
|
Вадим К (статус: Академик), 27 января 2010, 15:11 [#15]:
Вот это уже веселее. теперь явно видно, что расстрел памяти есть. выделено памяти 2024 байт, а хочется получить доступ к смещению 3012.
Он показывает, какой именно код(строка какая именно) ему не нравиться? если да, проведите кусок кода и выделите строку.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 15:20 [#16]:
block6 = new TMemoryBlock();
block6->StartAddr = 0x1000;
block6->Size = 2 + 2 + 2 + 2*250;
block6->InitData(0); // !!!!!!!!!!!!!!!!!!!!!! Line: 1300
класс с методами я выше уже писал
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 15:21 [#17]:
а в MemoryMapUnit описан сам класс
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 15:23 [#18]:
похоже я неправильно описал класс, и неправильно его использую в основной программе
|
|
Вадим К (статус: Академик), 27 января 2010, 15:28 [#19]:
у меня есть только одно предположение. что в строке
Data = new unsigned int[Size];
Size равен чему то другому, попробуйте вывести его куда нибудь, или заменить на this->Size (или через точку).
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Muratov Radik (статус: Посетитель), 27 января 2010, 15:29 [#20]:
Сейчас попробую.
А как насчет пустого конструктора? Это нормально? Или что туда прописать?
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|