Помощь - Поиск - Пользователи - Календарь
Полная версия: Таблица рекордов
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
1234
Вот делаю таблицу рекордов (в типизированном файле). Да не могу найти ошибку в алгоритме.
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
            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
Функция IntToStr действительно хорошо должна работать. Но только должна. Процедуру Str я уже использовал, но эффект тот же-выводятся каракули не многим похожие на цифры. Может быть просто строку нельзя выводить на экран в графическом режиме?
Да, и почему здесь...

Read(F,S);


...выводится ошибка 100(Disk read error).
Очень странно.
А типизированные файлы создаются в Pascal или отдельным алгоритмом?
volvo
Цитата
Может быть просто строку нельзя выводить на экран в графическом режиме?
А ты что, где-то показал, КАК ты выводишь строку на экран? Да еще в графике? Здесь не телепаты сидят, кстати...
1234
Вывожу я строку процедурой OutTextXY. Но тут понял, что через текстовый файл будет лучше. Но снова ошибка-Range Check Error. Что это вообще значит?
TarasBer
Цитата(1234 @ 8.02.2007 15:18) *

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

Хм, можно я версию скажу? Вы при выводе текста какой шрифт используете? DefaultFont? Он у многих неправильно выводит цифры (даже где-то тема была, в которой человек на это жаловался). Используйте векторные шрифты.
Кстати, я только что дописал chr_edit (предварительная версия, но пока багов не обнаружено). Так что если хотите русифицировать свою программу - могу кинуть русский готический шрифт и сам редактор.
1234
Да, здравствуйте! Скиньнте,пожалуйста русский готический шрифт и сам редактор.Заранее благодарен.
TarasBer
Цитата(1234 @ 8.02.2007 20:17) *

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

Хорошо, держите. Вам выпало почётное право первому протестировать мою новую программу. За размер модулей не ругайте, я их писал давно, для себя и на все случаи жизни (сам иногда удивляюсь, что столько накатал). Тот, кто сможет разобраться в этих кошмарных модулях - Воистину Великий Программист. Пока надёжность программы не проверена, заранее сохраните где-нибудь копии шрифтов, чтобы потом в случае их порчи можно было восстановить.
Там пока на русский переведён только goth.chr. У меня он работает.
Версия винрара - 3.51.
volvo
Опять изобретение велосипедов... Шрифты русифицированы N лет назад:
BGI - Русифицированные BGI фонты
TarasBer
Цитата(volvo @ 8.02.2007 20:37) *

Опять изобретение велосипедов... Шрифты русифицированы N лет назад:
BGI - Русифицированные BGI фонты

Спасибо. Но придерусь: вдруг кому-нибудь понадобится буква "Ё"? А из тех, что на сайте, она есть только в litt и sans. Конечно, без неё прекрасно можно обойтись, но некоторые предпочитают использовать русский язык полностью, без усечений типа замены ё на е. Так что редактор пожалуй имеет смысл.
Altair
TarasBer, фантастически удобный редактор!
В качестве предложения - перекомпилировать в FPC что бы было в окошке виндовом (код не смотрел, не знаю насколько это будет сложно)
1234
Мой вопрос повис в воздухе. А тема превратилась в бенефис г-на Березняка...
volvo
Цитата
Но тут понял, что через текстовый файл будет лучше. Но снова ошибка-Range Check Error.
Прекрасно... Значит, ты менял код (на обработку текстового файла)? Покажи хотя бы строку, на которой происходит Range Check Error...

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

A[N]:=S;

volvo
{$TELEPATHY ON}

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

{$TELEPATHY OFF}
1234
Да, видимо что-то не то. А время поджимает. Поэтому... набираюсь наглости ... и прошу прислать мне исходник с подобной подпрограммой. Ах да, и ещё вопрос. Как я понял из множества папок Сhr я выбрал одну и послал её в нужную директорию. Но не катит. Это означает, что в программе присутствие русификатора нужно как-то прописать. Если да, то как?
volvo
Цитата
Поэтому... набираюсь наглости ... и прошу прислать мне исходник с подобной подпрограммой.
no1.gif Не пойдет... У меня - встречное предложение, давай лучше ты вышлешь сюда (или в приват, если не хочешь показывать форуму) полный исходник твоей программы с TXT файлом вместе... Чтобы можно было запустить и посмотреть, ПОЧЕМУ происходит ошибка...
1234
Да я уже не успеваю. Поэтому придётся без этих рекордов. Сейчас меня больше интересует интерфейс: насколько я знаю у каждого типа шрифта есть свой код. Как мне вообще можно связать любой из Chr с моей программой. Например, с той что вы мне посоветовали, сказав что её давно выпустили. А что касается прислать, то могу только завтра. После презентации проекта. Хотя, думаю, на кой чёрт она вам нужна. Вы такую за 5 минут наклепаете.
TarasBer
Цитата(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):
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.