Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В цикле последовательно обратиться к полям записи.


Страницы:   1 2

AlexanderMS ©   (2007-12-26 16:03:00) 

Скажите, пожалуйста, как в цикле последовательно обратиться к полям записи, зная их размер?
Есть переменная типа record. Необходимо в цикле последовательно прочитать из текстового файла значения полей (каждой поле - 1 байт). То есть не так ( var F: TextFile):

Readln(F, S);
MyRec.Field1 := strtoint(S);
Readln(F, S);
MyRec.Field2 := strtoint(S);
Readln(F, S);
MyRec.Field3 := strtoint(S);
...


А вот так:


for Line := 0 to RecCount - 1 do
begin
 Readln(F, S);
//  MyRec.Fields[Line] := strtoint(S); тут нужен трюк
end;


Как можно осуществить сабж?


Sapersky   (2007-12-26 18:12:00) [1]

немножко будет, в случае array of MyRec

Finally, the compiler rounds the total size of the record upward to the byte boundary specified by the largest alignment of any of the fields.
В данном случае это 1 байт, т.е. размер округляться не будет.


Anatoly Podgoretsky   (2007-12-26 17:24:00) [2]

> Сергей М.  (26.12.2007 17:07:28)  [28]

> Это на случай потенциального overflow

Тогда опять программа неправильная и лучше получить сообщение об ошибке, чем неправильные данные и спрятаная ошибка.


Anatoly Podgoretsky   (2007-12-26 17:23:00) [3]

> Сергей М.  (26.12.2007 16:43:19)  [19]

Если не очевидно, то тогда программа полностью не работоспособная, смотри StrToInt(S)


Anatoly Podgoretsky   (2007-12-26 17:21:00) [4]

> AlexanderMS  (26.12.2007 16:39:14)  [14]

Тебе нужен массив, а не запись.
И strtoint лишнее для Readln


Palladin   (2007-12-26 17:14:00) [5]

немножко будет, в случае array of MyRec


Sapersky   (2007-12-26 17:08:00) [6]

Но при обязательном packed)

В данном конкретном случае - не обязательно... хотя и вреда от него не будет.


Сергей М.   (2007-12-26 17:07:00) [7]


> Palladin ©   (26.12.07 17:01) [27]


Не суть как важно)
Это на случай потенциального overflow)


Palladin   (2007-12-26 17:01:00) [8]


> Byte(IntToStr(S));


так, ведь, приведение не обязательно, компилятор справится сам с этой задачей.. или я не прав? :)


Сергей М.   (2007-12-26 17:00:00) [9]


> SizeOf(MyRec)-0


SizeOf(MyRec)- 1


Сергей М.   (2007-12-26 16:59:00) [10]


> Ну тады наверно так:


Но при обязательном packed)


Сергей М.   (2007-12-26 16:57:00) [11]

Ну тады наверно так:

for i := 0 to SizeOf(MyRec)-0 do begin
 Readln(F, S);
 PByteArray(@MyRec)[i] := Byte(IntToStr(S));
end;


Palladin   (2007-12-26 16:54:00) [12]

ну млин :) прошу прощения, написал не то, что имел в виду
одна строчка - одно числеко


Сергей М.   (2007-12-26 16:51:00) [13]


> Palladin ©   (26.12.07 16:47) [21]


Не-а.
Известно только, что файл текстовый.

Т.е. вида

154
1
0
66
255
33

Каждая строка в файле, возможно, имеет переменное число десятичных цифровых символов, а не "одна строчка - одна циферка"


Palladin   (2007-12-26 16:47:00) [14]


> [19] Сергей М. ©   (26.12.07 16:43)

ну как не очевидно, а:

Readln(F, S);
MyRec.Field1 := strtoint(S);
Readln(F, S);
MyRec.Field2 := strtoint(S);
Readln(F, S);
MyRec.Field3 := strtoint(S);

разве не говорит об ожидаемом четком формате файла?


Palladin   (2007-12-26 16:44:00) [15]

короче :)
если прямо уж так хочется обратиться к записи как к массиву однородных значений, то можно попробовать ректальный метод

Type
TMyRec=Packed Record
 f1,f2,f3,f4,f5,f6:Byte;
End;

Var
r:TMyRec;
a:Array [1..6] of Byte absolute r;
s:String;
function readlnn:byte;
Begin
Readln(f,s);
Result:=StrToInt(s);
End;

for i:=1 to 6 do a[i]:=readlnn;


Сергей М.   (2007-12-26 16:43:00) [16]


> Palladin ©   (26.12.07 16:41) [16]



> на одну строчку - одна циферка
>


Вовсе не очевидно.


Anatoly Podgoretsky   (2007-12-26 16:42:00) [17]

Просто для примера - надо приводить правильные примеры и писать что хочешь сделать, а не как и какие у тебя данные.
Поскольку обсуждать бред нет смысла, давай нормальную постановку.


AlexanderMS   (2007-12-26 16:42:00) [18]


> Спасибо, вроде неплохой вариант.

То есть спасибо большое, то что надо!


Palladin   (2007-12-26 16:41:00) [19]


> [13] Сергей М. ©   (26.12.07 16:36)

да почему перменной длинны, судя, опять же по первому посту, у него там циферки :) на одну строчку - одна циферка


AlexanderMS   (2007-12-26 16:40:00) [20]


> Sapersky   (26.12.07 16:34) [12]

Спасибо, вроде неплохой вариант.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо