Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
4-86595
lmatveev
2003-11-01 03:14
2003.12.26
Как передать текст в другое приложение


4-86596
DDS
2003-10-24 10:16
2003.12.26
Как создать MS-DOS ярлык и указать размер окна (размер шрифта).


9-86237
elf_123
2003-06-06 15:37
2003.12.26
Тякстуры...


3-86320
Frag
2003-11-29 14:00
2003.12.26
Загрузка из Excel`я в StringGrid боольшой таблицы


1-86384
vovan1
2003-12-15 13:52
2003.12.26
hlp-файл