Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ Таблица рекордов

Автор: 1234 8.02.2007 0:20

Вот делаю таблицу рекордов (в типизированном файле). Да не могу найти ошибку в алгоритме.
mas-массив типа string;
st-файл типа string.


rocedure Verif(Var F: st;Name,Ochki: String);
{Процедура предназначена для перепроверки рекордов в связи с новым достижением}
Var Points,Nick,A,Nick1,Points1: mas;
S : String;
I,J,Nom,I1,N,Chp : Integer;
Begin
N:=0;
While Not Eof(F) Do {Perezapis' v massiv}
Begin
Read(F,S);
Inc(N);
A[N]:=S;
End;
For I:=1 To N Do
Begin
S:=A[I];
For I1:=1 To Length(S) Do
Begin
Chp:=0;
While Chp=6 Do {Schitka odnoy stroki}
Begin
If S[I1]=' ' Then
Inc(Chp);
If S[I1]<>' ' Then Nick1[I]:=S[I1]+Nick1[I];{Svedeniya uje imeyuschihsya igrokov}
End;
While Chp=5 Do
Begin
If S[I1]=' ' Then
Inc(Chp); {eto ya seychas razrabativayu}
If S[I1]<>' ' Then Points1[I]:=S[I1]+Points1[I];
End; {Smeschenie na odnu stroku}
End;
If Ochki>=Points1[I] Then
Nom:=I;
For J:=1 To N-1 Do
Begin {Zapisivaem uchitivaya izmeneniya}
Nick[J]:=Nick1[J];
Points[J]:=Points1[J];
While J=Nom Do
Begin
Nick[Nom]:=Name;
Points[Nom]:=Ochki;
End;
End;
Rewrite(F);
Reset(F);
For J:=1 To N Do
Begin
S:='';
S:=J+ ' '+Nick[J]+' '+Points(J);
Write(F,S);
End;
Close(F);
End;


Автор: volvo 8.02.2007 0:31

            For J:=1 To N Do
Begin
S:='';
S:=J+ ' '+Nick[J]+' '+Points(J); { <--- Ошибка здесь !!! }
Write(F,S);
End;

Нельзя перемешивать строки с числами... Да и скобки круглые у Points, хотя должны быть квадратные... Преобразуй число J в строку (функция IntToStr взята из хелпа TP 7.0):
function IntToStr(I: Longint): String;
{ Convert any integer type to a string }
var
S: string[11];
begin
Str(I, S);
IntToStr := S;
end;

Твой фрагмент будет выглядеть так:
            For J:=1 To N Do
Begin
S:='';
S:=IntToStr(J)+ ' '+Nick[J]+' '+Points[J];
Write(F,S);
End;

Автор: 1234 8.02.2007 19:18

Функция IntToStr действительно хорошо должна работать. Но только должна. Процедуру Str я уже использовал, но эффект тот же-выводятся каракули не многим похожие на цифры. Может быть просто строку нельзя выводить на экран в графическом режиме?
Да, и почему здесь...


Read(F,S);


...выводится ошибка 100(Disk read error).
Очень странно.
А типизированные файлы создаются в Pascal или отдельным алгоритмом?

Автор: volvo 8.02.2007 19:33

Цитата
Может быть просто строку нельзя выводить на экран в графическом режиме?
А ты что, где-то показал, КАК ты выводишь строку на экран? Да еще в графике? Здесь не телепаты сидят, кстати...

Автор: 1234 8.02.2007 19:47

Вывожу я строку процедурой OutTextXY. Но тут понял, что через текстовый файл будет лучше. Но снова ошибка-Range Check Error. Что это вообще значит?

Автор: TarasBer 9.02.2007 0:07

Цитата(1234 @ 8.02.2007 15:18) *

Функция IntToStr действительно хорошо должна работать. Но только должна. Процедуру Str я уже использовал, но эффект тот же-выводятся каракули не многим похожие на цифры. Может быть просто строку нельзя выводить на экран в графическом режиме?

Хм, можно я версию скажу? Вы при выводе текста какой шрифт используете? DefaultFont? Он у многих неправильно выводит цифры (даже где-то тема была, в которой человек на это жаловался). Используйте векторные шрифты.
Кстати, я только что дописал chr_edit (предварительная версия, но пока багов не обнаружено). Так что если хотите русифицировать свою программу - могу кинуть русский готический шрифт и сам редактор.

Автор: 1234 9.02.2007 0:17

Да, здравствуйте! Скиньнте,пожалуйста русский готический шрифт и сам редактор.Заранее благодарен.

Автор: TarasBer 9.02.2007 0:33

Цитата(1234 @ 8.02.2007 20:17) *

Да, здравствуйте! Скиньнте,пожалуйста русский готический шрифт и сам редактор.Заранее благодарен.

Хорошо, держите. Вам выпало почётное право первому протестировать мою новую программу. За размер модулей не ругайте, я их писал давно, для себя и на все случаи жизни (сам иногда удивляюсь, что столько накатал). Тот, кто сможет разобраться в этих кошмарных модулях - Воистину Великий Программист. Пока надёжность программы не проверена, заранее сохраните где-нибудь копии шрифтов, чтобы потом в случае их порчи можно было восстановить.
Там пока на русский переведён только goth.chr. У меня он работает.
Версия винрара - 3.51.


Прикрепленные файлы
Прикрепленный файл  chr.rar ( 115.23 килобайт ) Кол-во скачиваний: 286

Автор: volvo 9.02.2007 0:37

Опять изобретение велосипедов... Шрифты русифицированы N лет назад:
http://pascal.sources.ru/graph/bgirfont.htm

Автор: TarasBer 9.02.2007 1:44

Цитата(volvo @ 8.02.2007 20:37) *

Опять изобретение велосипедов... Шрифты русифицированы N лет назад:
http://pascal.sources.ru/graph/bgirfont.htm

Спасибо. Но придерусь: вдруг кому-нибудь понадобится буква "Ё"? А из тех, что на сайте, она есть только в litt и sans. Конечно, без неё прекрасно можно обойтись, но некоторые предпочитают использовать русский язык полностью, без усечений типа замены ё на е. Так что редактор пожалуй имеет смысл.

Автор: Altair 9.02.2007 14:15

TarasBer, фантастически удобный редактор!
В качестве предложения - перекомпилировать в FPC что бы было в окошке виндовом (код не смотрел, не знаю насколько это будет сложно)

Автор: 1234 9.02.2007 16:46

Мой вопрос повис в воздухе. А тема превратилась в бенефис г-на Березняка...

Автор: volvo 9.02.2007 17:24

Цитата
Но тут понял, что через текстовый файл будет лучше. Но снова ошибка-Range Check Error.
Прекрасно... Значит, ты менял код (на обработку текстового файла)? Покажи хотя бы строку, на которой происходит Range Check Error...

Цитата
Что это вообще значит?
Выход за границы массива это значит... Вот и хотелось бы посмотреть, ГДЕ именно, и тогда, возможно, будет понятно ПОЧЕМУ это происходит...

Автор: 1234 9.02.2007 17:36

В самом начале:


A[N]:=S;


Автор: volvo 9.02.2007 18:44

{$TELEPATHY ON}

Если ты работаешь с текстовыми файлами, то с большой степенью вероятности тебя спасет

     While Not SeekEof(F) Do  { <--- SEEK добавлено }
Begin
ReadLN(F,S); { <--- LN добавлено }
Inc(N);
A[N]:=S;
End;
Больше ничего без твоего TXT файла и того, как именно описан тип mas (массив, понятно, но на сколько элементов??? Может, элементарно у тебя строк в файле больше?) сказать не могу...

{$TELEPATHY OFF}

Автор: 1234 9.02.2007 18:56

Да, видимо что-то не то. А время поджимает. Поэтому... набираюсь наглости ... и прошу прислать мне исходник с подобной подпрограммой. Ах да, и ещё вопрос. Как я понял из множества папок Сhr я выбрал одну и послал её в нужную директорию. Но не катит. Это означает, что в программе присутствие русификатора нужно как-то прописать. Если да, то как?

Автор: volvo 9.02.2007 20:11

Цитата
Поэтому... набираюсь наглости ... и прошу прислать мне исходник с подобной подпрограммой.
no1.gif Не пойдет... У меня - встречное предложение, давай лучше ты вышлешь сюда (или в приват, если не хочешь показывать форуму) полный исходник твоей программы с TXT файлом вместе... Чтобы можно было запустить и посмотреть, ПОЧЕМУ происходит ошибка...

Автор: 1234 9.02.2007 21:06

Да я уже не успеваю. Поэтому придётся без этих рекордов. Сейчас меня больше интересует интерфейс: насколько я знаю у каждого типа шрифта есть свой код. Как мне вообще можно связать любой из Chr с моей программой. Например, с той что вы мне посоветовали, сказав что её давно выпустили. А что касается прислать, то могу только завтра. После презентации проекта. Хотя, думаю, на кой чёрт она вам нужна. Вы такую за 5 минут наклепаете.

Автор: TarasBer 10.02.2007 2:40

Цитата(1234 @ 9.02.2007 17:06) *

Да я уже не успеваю. Поэтому придётся без этих рекордов. Сейчас меня больше интересует интерфейс: насколько я знаю у каждого типа шрифта есть свой код. Как мне вообще можно связать любой из Chr с моей программой. Например, с той что вы мне посоветовали, сказав что её давно выпустили. А что касается прислать, то могу только завтра. После презентации проекта. Хотя, думаю, на кой чёрт она вам нужна. Вы такую за 5 минут наклепаете.

Готический шрифт задаётся строчкой SetTextStyle(4, 0, 4);
А для замены стандартного готического шрифта на модифицированный надо найти goth.chr в папке *** и заменить файл. *** - это та, которую вы указали при вызове InitGraph (по-моему, так).
Или не готический (чего это я всё о нём?), а любой другой.
К тому же в Паскале можно поступить так:

var
MyFont: integer;
...
MyFont := InstallUserFont('abcd');
if MyFont >= 0 then
SetTextStyle(MyFont, 0, 4);


Abcd - это имя файла со шрифтом (без расширения). То есть если вы хотите загрузить rgot.chr, то вместо "abcd" пишете "rgot".
P.S. В редакторе замечены баги:
1. Если завести розовую линию за край символа и стереть правой кнопкой все линии, то розовая линия вылезет далеко справа (исправил)
2. Файлы с русскоязычным названием глючат (исправил)
3. Файлы с названием не из 4х букв глючат (не исправил, по-моему не лечится).
4. Точки с координатами < 0 по X отображаются далеко справа (нечего левее границы рисовать).
5. В некоторых символах некоторых шрифтов более 256 векторов. Теперь верхняя граница - 320.
Кстати, в стандартных шрифтах столько артефактов (лишних векторов)! Особенно отвратителен bold.
Новая версия (1.01):


Прикрепленные файлы
Прикрепленный файл  chr.rar ( 80.17 килобайт ) Кол-во скачиваний: 264