Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Странная ошибка |
Автор: Serik 22.12.2006, 15:59 | ||
значит программа запускается, а потом как запускаю эту процеДУРУ выдается ошибка не подскажете где ошибся, помоеиу что-то с типами, но что? |
Автор: Matematik 22.12.2006, 16:08 |
Какая? |
Автор: Serik 22.12.2006, 16:16 |
а потом |
Автор: Matematik 22.12.2006, 16:30 |
Что такое "tempmas" и "temp"? |
Автор: Serik 22.12.2006, 16:32 |
Это масивы типа стринг |
Автор: MetalFan 22.12.2006, 16:34 |
бредовый кусок. или это не весь код? |
Автор: Serik 22.12.2006, 16:35 |
конечно не весь!!! ![]() |
Автор: MetalFan 22.12.2006, 17:04 |
давай описание типов переменных |
Автор: Serik 22.12.2006, 17:11 | ||
|
Автор: MetalFan 22.12.2006, 18:11 |
SetLength(temp[1], 10 ); stream.seek(0, soFromBeginning); stream.write(temp[1][1],10); stream.seek(0, soFromBeginning); stream.read(temp[1][1],10); так должно работать по идее) |
Автор: Serik 23.12.2006, 19:15 |
не получилось |
Автор: Matematik 23.12.2006, 19:26 |
Что не получилось? Какой код не работает? Пиши весь код. А так ошибка в 17 строке. Добавлено @ 19:30 MetalFan правильно на ошибку указал |
Автор: MetalFan 23.12.2006, 19:33 |
где теперь ошибка? что не получилось? я непойму, КОМУ тут нужна помощь? почему из тебя должны доп.информацию клещями вытягивать?! ![]() з.ы. 99% на StrToInt валится) |
Автор: Beltar 23.12.2006, 19:35 | ||
Можно я свои 5 копеек вставлю. При чтении в строку да и в массивы тоже, очень неплохо бы ее длину сначала задать с помощью SetLength. И читать примерно вот так:
От всяких Access Violation помогает. |
Автор: MetalFan 23.12.2006, 19:37 |
те же яйца, только сбоку ;) |
Автор: Beltar 24.12.2006, 15:02 |
Нифига, нужно преобразование к Pointer. Я тоже когда-то в это вперся и долго не мог понять что за фигня, спасибо одному знакомому программеру, объяснил. |
Автор: MetalFan 24.12.2006, 15:53 | ||
Фига! и чтож он тебе объяснил?! 1) FStream.read(str[1] ,lLength); и 2) FStream.ReadBuffer(Pointer(str)^,lLength); где str: string, lLength: integer... АБСОЛЮТНО идентичны по результату, только в 1) не делается проверка, прочиталось ли необх.кол-во байт в в буфер, а в 2) в случае, если будет прочитано кол-во байт <> lLength, то получим исключение 'Stream read error'. да и подход немного поизвращенней получается... имхо 1) более наглядный. |
Автор: Beltar 24.12.2006, 18:34 | ||||
Извиняюсь. Дабы не вносить путаницы я не поленился найти то обсуждение, и проблемный код там был таким:
Ответ был таким. во первых, кто будет длину выставлять? аццес виолатион схватишь без проблем. Там же указатель на область памяти и длина этой области. Сама процедура чтения не заботится о выделении памяти. Во вторых что Read что Save работают не со стрингами а с PChar. Можно, конечно более криво сделать как ты сделал - NodeDesc.Text[1]. Но это не совсем правильно, и в теории если сменится версия компилятора то ты будешь ловить баги, которые сложно поймать. Надо переводить в PChar - "красивой конструкцией" Pointer(String)^ ибо PChar(String) может глюкануть. ну или грузить в какой ниить Array of Char а потом через StrPas(TArrayOfChar) переводить в String. С указанием первого элемента массива действительно будет работать. А вот записывать надо через указатель, иначе попа. Кстати, а что записывается в проблемный файл посмотреть каким-нибудь Windows commander'ом пробовали? Англ. буквы им хорошо видны. Может там лажа просто. Вот экземпл. Просто записывыет из эдита в файл текст и считывает его. Можете экспериментировать.
|
Автор: MetalFan 24.12.2006, 19:16 | ||
мда. притянутые за уши аргументы. про выделение памяти - это понятно. а вот остальное - безосновательные доводы, имхо. PChar(String) может глюкануть ну-ну, а Pointer(String)^ не может? да что угодно может, если ручки неоттуда растут ;) ну или грузить в какой ниить Array of Char а потом через StrPas(TArrayOfChar) переводить в String. StrPas вообще можно не использовать - функция-пустышка для обратной совместимости. (по крайней мере с D6)
все отрабтывает без проблем. и запись и чтение. так что ненадо "воду мутить" ) |