Текущий архив: 2003.12.26;
Скачать: CL | DM;
Вниз
Incompatible types: Array and String Найти похожие ветки
← →
Aster-X (2003-12-10 22:52) [0]Есть тип данных - запись, которая должна считываться из и записываться в файл.
type
TMyRecord = record
a: array[1..50] of Char; // чтобы компилер не ворчал по поводу type needs finalization
b: array[1..1000] of Char; // то же самое
end;
При попытки присваивания полю a или b значения типа стринг, выдаётся ошибка сабж. Подскажите плиз, как надо?
← →
Hint © (2003-12-10 23:53) [1]Можно напролом
for i := 1 to 1000 do
a[i] := str[i];
только смотреть, чтобы данные в str все же были :)
← →
Anatoly Podgoretsky © (2003-12-11 00:18) [2]StrCopy
← →
Aster-X (2003-12-11 00:40) [3]Узанал. Всё намного проще. Нужно ставит не array[1..50] of Char, а array[0..50] of Char. Тогда вроде как получается совсем другой тип, что-то типо PCHAR, и всё работает на ура. )
В связи с этим другой вопрос.
b: array[0..1000] of Char; - создаю с запасом. Если же записать только один символ, то в файле запишутся остальные 999(+1, т.к. с нуля отсчёт). Как сделать, чтобы писалась только нужная инфа и соответственно считывалось всё как следует?
← →
Palladin © (2003-12-11 00:43) [4]типизированные файлы тут не помогут, соответственно делаем выводы...
← →
Юрий Зотов © (2003-12-11 07:33) [5]> Aster-X
Данные переменной длины можно записывать по такой схеме:
var
F: file; // Нетипизированный!
L: integer;
S: string;
.......
// запись
L := Length(S);
BlockWrite(F, L, SizeOf(L));
BlockWrite(F, S[1], L);
.......
// чтение
BlockRead(F, L, SizeOf(L));
SetLength(S, L);
BlockRead(F, S[1], L);
← →
alex_*** (2003-12-11 09:37) [6]ну можно еще в самой записи давать ее размер... только неудобно работать будет.
Запас нужно давать разумный. размер записи будет фиксированный - гораздо легче работать будет
← →
Eugene1501 © (2003-12-11 10:50) [7]А почему не объявить перменные так:
type
TMyRecord = record
a: String[50];
b: String[100];
end;
тогда проблем записи строк не будет.
← →
Aster-X (2003-12-12 14:20) [8]2 Юрий
Относительно примера, который вы привели. Немогли бы вы вкратце рассказать его логику? Интересуют строчки:
BlockWrite(F, L, SizeOf(L));
BlockWrite(F, S[1], L);
Зачем нужно записывать в файл длину строки, и почему(во второй строке) записывается только один символ(s[1])? Я присваиваю s:= "hello", открываю и закрываю файл как обычно (assignfile и closefile), в результате чего у меня в файле получается каша на 1,12 КБ, среди которой смутно виднеется строчка "hello". Но мне-то нужно записать только одну строку!
← →
Вася Пупкин © (2003-12-12 14:25) [9]F1 на BlockWrite и изучаем азы...
BlockWrite(F, S[1], L);
procedure BlockWrite(var f: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);
отсюда следствие - передается адрес первого символа строки, а не "записывается только один символ"
← →
Aster-X (2003-12-12 14:43) [10]2 Вася Пупкин
Таки я нажал F1 ещё до того, как запостил мессагу, но ничего толком не понял. В противном случае, я бы не стал постить сюда. :)
← →
Вася Пупкин © (2003-12-12 14:49) [11]Aster-X (12.12.03 14:43) [10]
вот потому и сказано "изучаем азы..." -)
← →
pasha_golub © (2003-12-12 15:37) [12]В файл пишется размер строки, чтобы при чтении знать какого размера строку нам считывать.
← →
Aster-X © (2003-12-12 16:06) [13]pasha_golub
Спасибо, теперь всё понятно. В частности, и то, откуда берётся эта чушь на 1 с лишним кб. :))
Страницы: 1 вся ветка
Текущий архив: 2003.12.26;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.015 c