
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.128] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|||
|
Это будет база данных, компилятор Borland C 3.1 Компилятор подвисает после выполнения программы, или пишет "allocation error, system halted", или выдает "system unstable" Borland C 5.01 выдает либо тоже самое, либо "acces violation at 0x40c772: write of adress 0x860050" Помогит плиз, очень надо.
|
Сообщ.
#2
,
|
|||
|
iostream и stdio вместе использовать не рекомендуют... значит на то есть причины, на которые ты рано или поздно наткнешься ![]() в программе прпробуй написать так:
(В етой же функции и ошибка содержится ![]() |
Сообщ.
#3
,
|
|
|
Правильно. В функции указанной Visitorom, куда ты читаешь данные из файла?!
![]() Указатель s у тебя неинициализирован и вместо буфера указывает на неизвестные просторы памяти. Вот как они зафигачутся в важное место - система и валится! ![]() |
Сообщ.
#4
,
|
|||
|
DrunkArd, что-то я не понял про указатель. В указатель s читается инф. из файла и вызывается метод TFileld::SetData В методе строке TString присваевается этот самый указатель, а оператор присвоения для TString у меня перегружен и имеет такой код:
Не понимаю в чем ошибка, обьясни подробнее плиз. Что значит указатель не инициализирован? |
Сообщ.
#5
,
|
|
|
Гм... возьми какой-нибудь хороший учебник по Си...
В указатель никогда и ничего не пишется. Указатель, как сущность имеет место быть только в паре с объектом на который он указывает. Указатель указывает на какую-то область данных в памяти (переменную, например). (Переменная, конечно, может иметь тип "указатель", и ее значение можно менять, но мы меняем значение переменной типа "указатель", а не сам указатель ![]() В данном случае, переменная s содержит неопределенный указатель (указывающий неизвестно на что), так как она не инициализирована, и вот в ето "неизвестно что" и читаются данные. Так получилось, что "неизвестно что" оказалось самым уязвимым местом операционной системы. Оно так часто получается. ![]() |
Сообщ.
#6
,
|
|||
|
Visitor, а в моем случае, что ты предлагаешь делать? Вместо указателя char* использовать мой класс TString? Просто странно, когда делаешь так:
то система не ругается. |
Сообщ.
#7
,
|
|
|
Проще всего вместо char *s написать char s[1000];
Дело в том, что при s = "asdfghjkl"; в s как раз помещается указатель на лежащую хде-то в памяти строку "asdfghjkl"... а при обращении *s = 'a' символ а помещается туда, куда указывает указатель, хранящися в s. Разница даже наглядно видна -- наличие или отсутстве вот етого оператора * |
Сообщ.
#8
,
|
|||
|
Visitor, если ты имеешь ввиду:
то такое не работает. а посимвольно заносить как в массив гимморно. Или я че-то не понял ![]() |
Сообщ.
#9
,
|
|||
|
Хде тут хоть одно место, где требуется s = "asdfghjkl"? |
Сообщ.
#10
,
|
|||
|
Думаешь будет работать? |
Сообщ.
#11
,
|
|
|
А куда оно денется...
Кстати, у тебя еще такие функции есть... Где, например, вместо new TString[n] используется calloc.... |
Сообщ.
#12
,
|
|
|
Огромное спасибо, я попробую.
З.Ы: а разве указатель char * и указатель на массив char s[1000] это одно и то же? Не скажет ли ф-я fread, мол че ты мне не такой указатель пихаешь? ![]() |
Сообщ.
#13
,
|
|
|
В Си имя массива имеет тип * const (указатель, константный).
Но тебе практически весь код придется переписать, в любом случае... Тут какая-то жуткая смесь С и C++... |
Сообщ.
#14
,
|
|||
|
А разве так нельзя? |
Сообщ.
#15
,
|
|
|
Если бы TString был struct, без всяких там методов -- то пжл. С классами так в общем случае поступать нельзя.
|