
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Сообщ.
#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, без всяких там методов -- то пжл. С классами так в общем случае поступать нельзя.
|
Сообщ.
#16
,
|
|
|
По хорошему делай так:
void TDataSet::ReadRec(){ char *s; char c=' '; int k; s=(char*)malloc(FCount); fread(s,sizeof(char),FCount,DataFile); // Из буфера s переноси данные куда тебе надо. free(s); } Будет работать быстрее т.к. не надо в цикле читать файл по одному байту |
Сообщ.
#17
,
|
|
|
а лучше вообще от alloc и stdio избавиться.
![]() На MSVC, например, ето практически сразу вылетит, на певом же созданном объекте ![]() |
Сообщ.
#18
,
|
|
|
Visitor, т.е new вызывает конструктор, а calloc нет?
|
Сообщ.
#19
,
|
|
|
Да. Там ного всего происходит, но и ето в том числе.
|
Сообщ.
#20
,
|
|
|
Visitor, да мне именно в Bc3.1 надо
![]() |
Сообщ.
#21
,
|
|||
|
А я не знаю Вашего С++ и MSVC ![]() ![]() Я смотрю, что он использует СИ-шные ф-ии типа fread() и пишу ему ответ в том же духе. |
Сообщ.
#22
,
|
|
|
А в BC вылетит тогда, когда ты уже допишешь до того места, хде потом с ужасом обнаружишь, что надцать кб кода надо переписывать
![]() |
Сообщ.
#23
,
|
|
|
s=(char*)malloc(FCount);
FCount - кол-во полей в записи Наверное ты имел ввиду: s=(char *)malloc(L); //L=50 - длинна моей строки по дефолту |
Сообщ.
#24
,
|
|
|
To Visitor
У меня не забалУешь! ![]() Я С++ (в смысле ООП) не использую, поэтому отслеживаю всё ручками. ![]() To EnvOder Может и так, я не разбирался в твоей проге. Мой тебе совет: Раз работаешь с БД - лучше поменьше файловых операций в теле цикла. Это существенно ускорит работу и не будет раздражать пользователя. Так что читай в буфер столько сколько возможно, а потом ужЕ ковыряйся циклами в памяти. |
Сообщ.
#25
,
|
|
|
Откуда я знаю, fread() сишная или с++сная?
![]() ![]() |
Сообщ.
#26
,
|
|
|
дык я ж говорю -- нада книжку хорошую... или две
![]() |
Сообщ.
#27
,
|
|
|
Drunkard, по поводу файловых операций я знаю. Только вот ВС3 под виндой сам жрет свою же кучу, и остается ее около 60 кб
![]() Так шо с буффером тут не шибко разгуляешься. ![]() |
Сообщ.
#28
,
|
|
|
И правда ведь заработало
![]() Сердечно благодарю, а то я думал, что пришел звиздец моему курсачу. |