IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Как создать типизированный файл, file of
сообщение
Сообщение #21


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


kosya4ok,
просмотрел тему и у меня сложилось впечатление, что некоторое недопонимание между тобой и теми, кто тебе отвечал связано тем, что тебе нужно разобрать ДВА вопроса, а не ОДИН:
1. Чем отличается бинарное (внутреннее, машинное) редставление чисел от текстового (форматного).
2. Для чего нужен типизированный файл.

1. Внутри компьютера числа находятся в бинарном виде. Так же они могут быть и сохранены на диске. Т.е. область диска (файл) может быть просто копией фрагмента оперативной памяти. Но разобрать что-либо в таком файле глазами совершенно невозможно. Поэтому прибегают к текстовому представлению информации. При этом дробное число, занимающее в памяти (или бинарном файле), скажем, 4 байта, в виде текста займет уже 12 байт - да и то с потерей точности. Опять же, Паскаль скрывает этот факт, но операторы read и write с текстовыми и бинарными файлами работают совершенно по-разному: при работе с текстом каждый символ подвергается достаточно сложным преобразованиям. Таким образом, разработчику всеегда риходится решать, какому формату файла отдать предпочтение в конкретной программе.
Если нам надо хранить, скажем, 8 Мбайт данных, то
- бинарное представление: длина файла - 8 Мбайт, время чтения - 0.1 с, глазами ничего не увидишь,
- текстовое представление: длна файла - 96 Мбайт, время чтения - 50 с, можно посмотреть глазами.
Что ты в данном случае предпочтешь?
А если надо записать всего десяток чисел, которые и в том, и в другом случае будут занимать один сектор на диске и читаться практически мгновенно?

2. Вообще-то он не нужен. Т.е. без него легко можно обойтись, заменив файлом нетипизированным. Но в некоторых случаях удобнее работать с типизированным.
Твой пример к таковым не относится: если ты работаешь с вещественными числами, то разницы между типизированным и нетипизированным практически нет.
А когда же появляется разница?
Тогда, когда тебе нужно работать не с простым, а со сложным типом данных. Ну например:
type
t3DPoint = packed record
x,y,z : single; // координаты точки в пространстве
u,v : byte; // текстурные координаты
end;

Длина такого типа данных составляет 14 байт и, чтобы не запутаться, лучше объявить фвйл как file of t3DPoint. Одновременно, если ты запросишь длину файла, то тебе будет возвращено именно количество точек, а не количество байтов.

Сообщение отредактировано: andriano -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Опочки прикольно! То есть вы хотите сказать что write принимает типа write(&, &), а ему даю write(&, ЗНАЧЕНИЕ ОБЛАСТИ ПАМЯТИ) Так? Я с указателями в Паскале пока ещё не разбирался и плохо пока знаю эту тему. А можно тогда в Паскале перегрузить оператор write что бы он принимал write(&, ЗНАЧЕНИЕ)?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Минуточку.
Та ЗНАЧЕНИЕ или ОБЛАСТЬ ПАМЯТИ?
write работает именно с областью памяти. А результат функции возвращается в регистрах процессора. Поэтому, естественно, у него нет АДРЕСА и write не может с ним работать.
По поводу пергрузки: во-первых, write - не функция, а во вторых: "а оно надо?".

По поводу указателей в Паскале:
к сожалению, указатели в Паскале реализованы довольно непоследовательно. Отчасти это объясняется как раз попыткой избавить новичка от этого понятия на начальных этапах обучения. И отсюда вполне естественное недоумение по поводу того, что два вызова в приведенном ниже примере работают (или не работают) совершенно по-разному.

procedure proc1(a : integer);
begin
inc(a);
end;

procedure proc2(var a : integer);
brgin
inc(a);
end;

var i1,i2 : integer;
begin
i1 := 10;
i2 := 20;
writeln(i1:4,i2:4);
proc1(i1);
proc2(i2);
writeln(i1:4,i2:4);
proc1(30);
proc2(40);
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Привет! Вот же ж люди какие бывают какие проницательные! Извиняюсь за свою не точную формулировку данной задачи, больше буду работать над собой.

Если нам надо хранить, скажем, 8 Мбайт данных, то
- бинарное представление: длина файла - 8 Мбайт, время чтения - 0.1 с, глазами ничего не увидишь,
- текстовое представление: длна файла - 96 Мбайт, время чтения - 50 с, можно посмотреть глазами.
Что ты в данном случае предпочтешь?

Конечно же я предпочел увидеть собственными глазами + время чтения 0.1 с good.gif

Поповоду кода. Если я сделаю так sizeof(t3Dpoint), то будут 14 байт.
А если так type f1 = file of t3Dpoint, то sizeof(f1), то будут 128 что? Байт?И как это соотнесется с точками?

С количеством точек и числом байтов, что то не совсем понятно. Можно пример?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Длина файла возвращается в количестве тех переменных указанного типа, что ты описал. Т.е. если в файле присутствует 100 14-байтных записей (точек), то FileSize(F) возвратит число 100. Длина же файла при этом составит 1400 байт.
Функция же sizeof возвращает не длину файла, а размер объекта в байтах. т.е. для одной точки это будет 14.

Цитата
А если так type f1 = file of t3Dpoint, то sizeof(f1), то будут 128 что? Байт?И как это соотнесется с точками?
Это будет длина перемнной типа f1 в байтах. К длине файла она никакого отношения не имеет. Ведь, обрати внимание, ее тип не "3DPoint", а "File of 3DPiont", а это далеко не одно и то же.
Просто тип file - это тоже сложный тип, состоящий из нескольких полей, в которых хранится набор переменных, необходимых для доступа к файлу. С содержимым файла содержимое этих переменных никак не связано.
Если проводить аналогию, то файл и файловая переменная связаны примерно так же, как ячейка памяти и указательна ячейку памяти.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


За

По поводу пергрузки: во-первых, write - не функция, а во вторых: "а оно надо?".

Сорри пока не выучил терминоголию, конечно не функция, а процедура. А вопрос был задан с целью экстеншена данной программки. Думал просто провести аналогия с cout.

Просто тогда write отложу пока в сторону пока не разберусь с разлиными передачами в процедуры и функции.


procedure proc1(a : integer);
begin
inc(a);
end;

procedure proc2(var a : integer);
brgin
inc(a);
end;

var i1,i2 : integer;
begin
i1 := 10;
i2 := 20;
writeln(i1:4,i2:4);
proc1(i1);
proc2(i2);


Я так понимаю произошла передача переменных по ссылке?
Так а так

proc1(30);
proc2(40);


неполучится, т.к. низя ж передавать в процедуру константное выражение, а только адрес переменной?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Нет, в том то и дело, что в proc1 произошла передача значения, а в proc2 - адреса (т.е. "по ссылке"), хотя внешне код выглядит совершенно одинаково.
А что касается "не получится", то первая строка омпилируется, т.к. константа (содержащаяся в сегменте кода, если это о чем-то говорит) при вызове записывается в стек, а во втором случае в стек должен быть записан адрес, но в сегменте данных этой константы нет, соответственно, нет и адреса. Вот компилятор и отказывается пропускать эту строку.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Ну и ну. Вообщем пошёл учить Паскаль.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.04.2024 3:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name