LINUX.ORG.RU

Программа для создания кроссвордов 1.0.0 в Lazarus

 , ,


1

1

Здравствуйте! Эта тема в поисках уранового лома... тссс, только никому...
Начало обсуждения тут
Скачать: SourceForge.Net-GPLv2
Убрал нечитаемый слеш:

Описание формата OpenKlest 1.1

Это двоичный формат файла кроссворда, разработанный так, чтобы было максимально просто сделать его поддержку в других языках программирования, отличных от C++. Он экспортируется средствами чистого C++, без расширяющих возможностей библиотеки Qt.

Чтение файла начинается c 14-ти байт типа Char('OpenKlest-1.1~'), где 1.1 - это версия формата. 1 символ Char = 1 символу AnsiChar = знаковое 1 байт.
Далее идёт язык кроссворда логического типа, boolean, 1 байт.
Далее количество строк сетки кроссворда, LongWord, беззнаковое 4 байта.
Далее количество столбцов сетки кроссворда, LongWord, беззнаковое 4 байта.
Затем размер ячейки сетки кроссворда, LongWord, беззнаковое 4 байта.
Затем значение цвета ячейки, Word, беззнаковое 2 байта. От него отнимается цифра 1. Чтение происходит в 2-х циклах: Основной от 0 до количества строк, вложенный цикл от 0 до количества столбцов.
Затем количество слов, LongWord, беззнаковое 4 байта.
Потом чтение координат первых букв слов(строки), Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Потом чтение координат первых букв слов(столбцы), Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Потом чтение направлений слов, Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Следующим будет чтение длин слов, Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Следующим будет чтение слов-ответов, состоящих из набора unicode-симоволов, типа Word, беззнаковое 2 байта. Основной цикл от 0 до количества слов, вложенный от 0 до количества букв текущего слова.
Следующим будет чтение длин вопросов, Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Далее идёт чтение предложений-вопросов, состоящих из набора unicode-симоволов, типа Word, беззнаковое 2 байта. Основной цикл от 0 до количества слов, вложенный от 0 до количества букв текущего вопроса.
Ну и в конце загружается флаг конца файла ('~OpenKlest'), 10 байт типа Char. 1 символ Char = 1 символу AnsiChar = знаковое 1 байт.

Для большей межкомпиляторной / межплатформенной переносимости Widestring разложил на коды unicode-символов, которые и сохраняю на диск ;) Тогда утверждение «бинарный и максимально простой» ближе к истине.
«Ярое формашлепство» сохранил :)
Сделал проверку версии файла, при загрузке, чтобы нельзя было «совать разный мусор».
Тестируем, критикуем, пользуемся.
Благодарю!

★★☆

а зачем его было делать бинарным ?

aldayneko
()

1. Ненужно.

2. Любители бинарных файлов после смерти попадут в специальный ад, где будут считывать массивы чисел с плавающей точкой из бесконечного количества типизированных файлов размерами от 1 до 5 Гб.

Axel
()
Ответ на: комментарий от Axel

Последнее - с помощью текстового редактора.

Axel
()
Ответ на: комментарий от aldayneko

Да

При сотне тормознутых программ, типа KAV, хомячок не должен гнать на мою. Другое дело, что на чистом компе будет «лишняя» скорость. Так вот, совершенству нет предела...

xwicked ★★☆
() автор топика
Ответ на: комментарий от zamtmn

С++ - это cgi-скрипт Lazarus - в этой теме C# - в будущих темах ;) ЗЫ: это 3 отдельных модуля.

xwicked ★★☆
() автор топика

Далее идёт язык кроссворда логического типа, boolean, 1 байт.

boolean, 1 байт

Гм.

unfo ★★★★★
()
Ответ на: комментарий от malbolge

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

zamtmn ★★
()
Ответ на: комментарий от malbolge
var
    FormOpenKlest: TFormOpenKlest;//указатель
    sNameCrossword: String;//Название текущего кроссворда
    slWordR,//указатель
    slWordC,//указатель
    slWordV,//указатель
    slWordL,//указатель
    ListWord,//указатель
    slQuestionT,//указатель
    ListCurrentWord: TStringList;//указатель
    wsQuestionL: WideString;//Список длин вопросов
    imgCell: array of TImage;//указатель
    bmCell: TBitMap;//Цветная ячейка
    RowFirstCellWord,//Координата строки текущего слова в сетке кроссворда
    ColumnFirstCellWord,//Координата столбца текущего слова в сетке кроссворда
    LengthWord,//Длина текущего слова
    LastRFCW,//Прошлая координата строки слова в сетке кроссворда
    LastCFCW,//Прошлая координата столбца слова в сетке кроссворда
    LastLW : Integer;//Последнее значение длины слова
    gWordLine,//Направление текущего слова в сетке кроссворда
    LastGWL: WideChar;//Прошлое направление слова в сетке кроссворда
    CellState: array of array of TCellState;указатель
    CountCellInWord: Word;
    SelectedWordToEdit: String;

Ну и где умышленное зло? За стек не вышел.

xwicked ★★☆
() автор топика
Ответ на: комментарий от unfo

Простите, один бит конечно же, но машине быстрее оперировать с байтами, потому и тип имеет размер в 1 байт. Или тебя после плюсовского bool смутило продолжение такое дииинное ['lean]Да?

xwicked ★★☆
() автор топика
Ответ на: комментарий от Deleted

Мне это не грозит - оборудования для тестирования нету ;)

xwicked ★★☆
() автор топика

смог бы ncurses/ascii версию? Помог бы с тестированием, возможно критикой, предложениями, патчами.

chinarulezzz ★★
()

совершенно ненужное байтопетушение, шизофазийный автор-школьник с лазарусом, быдлокроссворды… беда никогда не приходит одна

Sphinx ★★☆☆
()

Далее идёт язык кроссворда логического типа, boolean, 1 байт.

Почему не строка со стандартными «ru», «en», «de»,.. ?

Suigintou ★★★★★
()
Ответ на: комментарий от Axel

Не-е, «да», «нет», «таки да», «таки нет» и «а почему вы спрашиваете?». Иначе это не национальность.

feofil
()
Ответ на: комментарий от xwicked

Заранее поддерживать только два языка при том, что можно сделать, например, char'ом (не знаю, как там в лазарусе правильно), и иметь 256, занимая при этом тот же байт, — немного странное решение. Он тебе на это и намекнул, а ты тут с булеанами своими.

anonymous
()

смог бы ncurses/ascii версию? Помог бы с тестированием, возможно критикой, предложениями, патчами.

Можно пояснить?

Знову москалi треклятiе людей ображают

А вы первые начали. Разговариваете с людьми как попало: «ССЗБ, RTFM, Endianless, ЗЫ, УМВР». Какие проблемы? Всё в норме. :) Нынче нужно уважать людей.

Почему не строка со стандартными «ru», «en», «de»,.. ?

Да, конечно, я забыл об остальных языках, но на это есть объективные причины. Мне ещё никто не написал о помощи в разработке, кроме одного нашего человека. Так, что «de» и все остальные извиняйте - в будущем подправлю :) А Пока Русский - истина, English - ложь. ;)

Заранее поддерживать только два языка при том, что можно сделать, например, char'ом (не знаю, как там в лазарусе правильно), и иметь 256,занимая при этом тот же байт, — немного странное решение. Он тебе на это и намекнул, а ты тут с булеанами своими.

Понятно - мы же не в «Угадай мелодию» играем.

xwicked ★★☆
() автор топика
Ответ на: комментарий от xwicked

Разговариваете с людьми как попало: «ССЗБ, RTFM, Endianless, ЗЫ, УМВР». Какие проблемы? Всё в норме. :) Нынче нужно уважать людей.

Как-нибудь после школы почитайте - http://ru.wikipedia.org/wiki/Порядок_байтов (видимо в английском вы просто не сильны и слово Endianless вас повергает в шок). Сделаю подсказку: содержимое файлов для идентичных кроссвордов на LE и BE процессорах будет разное.

NegatiV
()
Ответ на: комментарий от xwicked

Да, конечно, я забыл об остальных языках, но на это есть объективные причины. Мне ещё никто не написал о помощи в разработке, кроме одного нашего человека. Так, что «de» и все остальные извиняйте - в будущем подправлю :) А Пока Русский - истина, English - ложь. ;)

Тебя не про то спросили. Тебя спросили, на кой тебе в структуре файла boolean, если информации он несет меньше byte, а занимет тот же 1 байт? То есть, это ни разу не проще делать, не меньше занимает, но выглядит абсолютно противоестественно. Ну и поясни после этого, разве ты не Буратина?

Axel
()
Ответ на: комментарий от NegatiV

Я плакал. Так вот почему dvd-iso'шник у Debian PowerPC всего один. Ну тогда я официально заявляю, что текущих поддерживаемых платформ и архитектур мне хватит :) Благодарю!

xwicked ★★☆
() автор топика
Ответ на: комментарий от xwicked

Смысл его заключается в создании открытого стандарта файла кроссвордов для всех компиляторов, независимо от платформы или языка.(Скажите это диагноз?! ;) )

Вам еще не поставили диагноз?

NegatiV
()
Ответ на: комментарий от NegatiV

Не ну на текущий момент это так, в будущем, при появлении соответствующего оборудования - всё будет меняться. Я своих слов не отменял. P.S. А диагноз нужно ставить тем, кто такие стандарты(порядок байтов и всего остального) придумывает. :)

xwicked ★★☆
() автор топика
Ответ на: комментарий от xwicked

За стек не вышел.

сте-ек?!?!

Следуй-ка ты строго за Томми.

malbolge ★★
()

Уж для такой небольшой структуры данных, как кроссворд, можно было сделать xml или даже plain text. Я ещё понимаю, когда речь идёт о гигабайтах...

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от xwicked

Так, что «de» и все остальные извиняйте - в будущем подправлю :)

Ага, и создашь несовместимость с уже сохранёнными кроссвордами. То есть у тебя уже заранее запланированная проблема, которую потом придётся решать.

Не лучше ли сразу хотя бы 2 символа под код языка отвести? Это тебя никак не обязывает их все поддерживать, а от геморроя в будущем избавит.

Кстати, у китайцев есть претензии к двухбайтовому юникоду :)

hobbit ★★★★★
()

Это ты конечно, молодец, но двоичный формат тут совершенно неоправдан. В остальное не вникал.

HerrWeigel ★★★★
()

не взлетит

Судя по тому, как автор заморочился с форматом файла, рабочей программы у него не будет никогда. Если так путаться в общении с памятью, проблемы со скоростью создания кроссвордов (это, кстати, единственное место в программе, где нужно беспокоиться о производительности) быстро станут неразрешимыми. Я вам открою страшную тайну: если программа составляет кроссворды из строк, такую программу можно сразу выкинуть на помойку! Ни для чего, кроме обучения, она не пригодится. Вообще, NP-задачи с таким багажом знаний не решают. Кто сказал автору, что это легкая тема?

Adamos ★★
()
Ответ на: комментарий от Deleted

mironov_ivan & unC0Rr
(Qt)Klest-crossword(C++) GNU / Linux Debian 6 amd64 LE создавались кроссворды .xwc
(Qt)Klest-crossword(C++) в системе GNU / Linux Debian 6 PowerPC BE отлично открыл эти бинарные данные.
Внимание вопрос: Endianless относится только к низкому уровню?
P.S. Один прецедент уже есть, поэтому можно поднять вопрос, а lazarus я завтра допроверю.
P.P.S. Да, я всё-таки рискнул самостоятельно это сделать в Qemu :) Всего пока 1,5 суток потратил :)

xwicked ★★☆
() автор топика
Ответ на: комментарий от hobbit

Уж для такой небольшой структуры данных, как кроссворд, можно было сделать xml

Читаю Флёнова «Компьютер глазами хакера» и удивляюсь, как точно он говорит, что всё это чистый воды мусор(дополнительные технологии), для отката функциональности своих конкурентов ;)

Кстати, у китайцев есть претензии к двухбайтовому юникоду :)

QString(Qt) имеет 2-а байта unsigned short, мне отказаться от этого мощного класса в пользу wchar_t? В будущем я попробую перейти на использование wchar_t, но как их хранить в Lazarus Widestring там же Word?

xwicked ★★☆
() автор топика
Ответ на: да от xwicked

QDataStream сам разруливает за тебя этот вопрос, сериализуя данные

unC0Rr ★★★★★
()
Ответ на: комментарий от xwicked

Читаю Флёнова «Компьютер глазами хакера» и удивляюсь, как точно он говорит, что всё это чистый воды мусор(дополнительные технологии), для отката функциональности своих конкурентов ;)

Огонь и движение? :)

hobbit ★★★★★
()

От Lazarus, к сожалению, я так и не смог добиться ответа ни «Да» ни «Нет». Легче IceWM я не знаю, что на эту машину поставить :(
Потому, пусть тестят, у кого нормальное железо есть ;)

xwicked ★★☆
() автор топика
Ответ на: комментарий от xwicked

хотя, погодь...

lazbuild -B $HOME/folder/project1.lpi

Консольный пример (не)заработал!(без иксов вообще).

procedure TMyApplication.loadCrossword();
const sFileBegin = 'OpenKlest-1.1~';//Начало файла
var handleFile: Integer;//Дескриптор файла кросворда
    i: Integer;//Счётчик для цикла
    j: Integer;//Счётчик для цикла
    iCountImage: Integer;//Счётчик уже созданных изображений(клеток)
    tar: PChar;//Массив для считывания текста из файла
    wCell: Word;//Для 2-хбайтовых значений файла
    wdata: Word;
    lwCell: Longword;//Для 4-хбайтовых значений файла
    wcCell: WideChar;//Для 2-хбайтовых значений файла / направления слова
    rectCell: TRect;//Координаты текущей клетки
    sTemp: WideString;//Переменная для временного использования
    iRowCount: Integer;
    iColCount: Integer;
    sNameCrossword : String;
    bLanguageWords: boolean;
begin
                sNameCrossword := '/home/wicked/project1/crossword1.ok';//Присваивание имени кроссворда для открытия
                iCountImage := 0;//Обнуление переменной
                handleFile := FileOpen(sNameCrossword, fmOpenRead);//Открытие файла для чтения
                GetMem(tar, 14);
                tar^ := #0;
                FileRead(handleFile, tar^, 14);//Чтение начала файла('OpenKlest-1.1~')
                sTemp := String(tar);
                //Для Windows
                //SetLength(sTemp, 14);

                if sTemp <> sFileBegin then
                begin
                     writeln('Error opens file!');
                     Exit;
                end;

                FileRead(handleFile, bLanguageWords, 1);//Чтение языка слов кроссворда
                FileRead(handleFile, lwCell, 4);//Чтение количества строк сетки кроссворда
                iRowCount := lwCell;
                WriteLn(lwCell);
                FileRead(handleFile, lwCell, 4);//Чтение количества столбцов сетки кроссворда
                iColCount := lwCell;
                WriteLn(lwCell);
                FileRead(handleFile, lwCell, 4);//Чтение ширины(высоты) ячейки сетки кроссворда
                WriteLn(lwCell);

                    for i := 0 to iRowCount - 1 do
                        for j := 0 to iColCount - 1 do
                            begin
                                FileRead(handleFile, wCell, 2);//Чтение значения цвета ячейки
                                Dec(wCell);//Минус 1 :)
                                wcCell := WideChar(wCell);//Преобразование в символ
                                WriteLn(wcCell);
                            end;

                FileRead(handleFile, lwCell, 4);//Чтение количества слов
                WriteLn(lwCell);

                    //Заполнение списка строк значениями из файла
                    for i := 0 to lwCell - 1 do
                        begin
                            FileRead(handleFile, wCell, 2);
                            wcCell := WideChar(wCell);
                            WriteLn(wcCell);
                        end;

                    for i := 0 to lwCell - 1 do
                        begin
                            FileRead(handleFile, wCell, 2);
                            wcCell := WideChar(wCell);
                            WriteLn(wcCell);
                        end;

                    for i := 0 to lwCell - 1 do
                        begin
                            FileRead(handleFile, wCell, 2);
                            wcCell := WideChar(wCell);
                            WriteLn(wcCell);
                        end;

                    for i := 0 to lwCell - 1 do
                        begin
                            FileRead(handleFile, wCell, 2);
                            wcCell := WideChar(wCell);
                            WriteLn(wcCell);
                        end;

                    Freemem(tar);//Очистка массива от букв

                //Флаг конца файла не загружается('~OpenKlest')
                FileClose(handleFile);//Закрытие файла
end;
Результат:

234234234234//17
23423423423//17
23423423423//30
?//c
?//b
?//c
?//b
?//b

В будущем, попробую использовать файловые потоки, вдруг поможет!?
Есть ещё конструктивная критика? ;)

xwicked ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.