| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |