|
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 65
|
|
Отладка кода (программы) во FreeBasic21.02.2024, 01:11. Показов 18221. Ответов 224
Уважаемые программисты. Подскажите - как производится
В QB это делалось просто. В меню Debug командой toggle breakpoint метится строка до которой проверить. После запуска идет проверка, отмечаются ошибки, проблемы. У меня во FreeBasic этот метод не работает. Программа на метку не реагирует, действия не совершаются. Прошу помощи.
0
|
|
| 21.02.2024, 01:11 | |
|
Ответы с готовыми решениями:
224
Грамотная отладка программы, подмога в структуризации кода Отладка программы в Delphi(нужно подредактировать текст чужой программы) |
|
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 65
|
|
| 06.03.2024, 14:03 [ТС] | |
|
0
|
|
|
Кормпилятор
|
||
| 06.03.2024, 14:23 | ||
|
Нюансов всяких "зачем" и "почему" там может быть миллион, я же не знаю задумку что в принципе там должно быть и зачем оно там должно быть. Но даже из этого мелкого куска кода можно увидеть, что стиль кода очень плохой это не позволит тебе написать хоть сколь-нибудь крупный проект. Если бы я так писал, то скорее всего мои проги не превышали бы 1.5-2k и я бы часто "буксовал" перечитывая код. Чтобы это всё привести в порядок прям самый самый минимум это: 1) Поработать над отступами. Самое простое и эффективное "мозаика", т.е. следующая строка начинается на пересечении пробела строки сверху, при этом отступы в 1 символ - минимально, т.е. в основном больше одного символа(2,3). 2) Модульное мышление. Ты разбиваешь код и помечаешь его на всю длину разными ASCII символами. И делаешь это слишком часто. Как лучше: помечай каждый блок осмысленным комментарием сверху блока, т.е. знак комментария, два пробела, описание блока, дальше пустая строка и код блока. 3) Избавься от GOTO, используй его только в крайней необходиости. Выучи бесконечные циклы(DO, WHILE) и выборку значений SELECT CASE. 4) Используй процедуры\функции. 5) Выбирай осмысленные имена переменных. И при любых декларациях описывай что за переменная, за что она отвечает. При правильном применении вышеозвученного код будет вылизан идеально, с ним будет легко работать. Добавлено через 10 минут Ну и 6) Частое применение знака разделителя. Например там где циклы я бы этого делать не стал. Да и в принципе редко когда это уместно. При рефакторинге можно где-то поджать код так, если там несколько присваиваний идут, которые тебе прям не надо видеть, где они лишние для осмысления.
1
|
||
|
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 65
|
||||||
| 06.03.2024, 17:26 [ТС] | ||||||
|
Quiet Snow
эту программу я делаю еще, и по-пионерски. Сразу в стиле не держусь (ни школы нет ни терпения) Потом, программу одну и ту же, с разными новшествами делаю уже много лет, и, хорошо запомнились многие фрагменты наизусть, потому вначале экономлю на времени. Но да, нечистоплотность бывает сказывается в потерях времени. Да все замечания ценные, со всеми согласен. Здорово, что есть где ума набраться. Большое спасибо. Буду стараться расти.
0
|
||||||
|
Кормпилятор
|
|||||||||
| 06.03.2024, 19:10 | |||||||||
|
Дословно означает: делать до тех пор, пока не выполнится условие. Самый простой. Выход из цикла EXIT DO. Остальные вариации потом освоишь. Но уже будет + читаемость. Вот банально делаешь процедуру(в конце текстового файла программы). Потом в самом начале объявляешь прототип этой процедуры: Это чтобы бейсик знал, что в конце кода есть тело процедуры. Далее в коде своей программы просто вызываешь процедуру: И всё у тебя вся отрисовка в отдельном месте. Обсчёт тоже можешь сделать в отдельном месте, простые программы допускают разделение. + структурирование кода, + читаемость. Остальное по процедурам почитай в справке. В них можно передавать параметры. Или можешь делать глобальные переменные\массивы (DIM SHARED) и они будут читаться в процедурах. 20 лет назад на ассемблере. Щас бы я опух так писать, уже переучил себя на венгерщину, ну более или менее, счётчики по прежнему так именую (i, j, k, ix, iy, iz и т.п.). вникать, когда немного подзабудешь код. Тоже этим раньше грешил, не в таком количестве, но было, потом уже когда на Паскале пописал, понял, что надо от этого гавна избавляться. И вообще перестал экономить строки. Всё равно кол-во байт одинаковое, двоеточие и пробел - это 2 байта, CHR(13) + CHR(10) - тоже 2 байта.
1
|
|||||||||
|
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 65
|
||
| 06.03.2024, 20:18 [ТС] | ||
|
Quiet Snow,
Про процедуры стало понятнее. Ещё два момента - в скобках что передаётся - переменные? И можно ли из программы по отсылу переходить внутрь процедуры? если можно - как - синтаксис. Вообще я еще в справке почитаю, сейчас будет понятнее. Благодарю!
0
|
||
|
787 / 307 / 17
Регистрация: 21.01.2023
Сообщений: 529
|
|||||||||||||||||||||||
| 06.03.2024, 21:05 | |||||||||||||||||||||||
А можно сделать процедуру с ByRef параметром:
1
|
|||||||||||||||||||||||
|
Кормпилятор
|
||||
| 06.03.2024, 22:12 | ||||
|
но и многого нету. На эту возьню убьёшь пол жизни, если захочешь написать что-то серьёзное. Это чисто программерская тема, для практиков, т.е. каким бы ты алгоритмистом не был, а без этого трудно и всё равно надо качать эти скилы. Многое есть в исходниках на си и делфи, на VB иногда попадается что-то ценное. В кодархивах\примерах других ЯП можно что-то выцарапать(например PB, QB64, FASM, Dev-C++) ну если лень копать MSDN и прогерские площадки. но ничего хорошего не будет(функция по идее делает пролог, т.е. работает со стеком, выходить тоже придётся специальным образом). Короче концептуально оно так не задумано, это нивелирует всю пользу от их использования(ты потеряешь структуризацию кода и сделаешь даже хуже). Если тебе надо управлять потоком выполнения в процедуре то отправь в неё параметр и выполни нужное действие по SELECT CASE. Т.е. например так: Процедуры задуманы как закрытые сущности, чёрные ящики. Ты 1 раз разработал чёрный ящик и дальше им пользуешься, вызываешь процедуру, основной код не должен сильно знать, что там в этом чёрном ящике. Процедура это лишь одна задача, программа по сути состоит из подобных задач, чем лучше ты продумаешь разбивку на процедуры, тем грамотнее и понятнее будет код. И основной код движка программы будет содержать строчек 20-30, где просто в цикле будут вызываться процедуры. Когда процедуры независимы тебе достаточно отладить их по отдельности. Это значительно уменьшает риски возникновения ошибок. Добавлено через 17 минут Перестроение мозгов это этап не на 1 проект, привычки есть привычки. В секунду не получится. Тут надо поспотыкаться просто самому, понять что мешает и нещадно отсечь.
1
|
||||
|
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 65
|
||||
| 06.03.2024, 22:59 [ТС] | ||||
|
Mikle Quits,
Синтаксис в FB отличается, будет позаморочнее. Спасибо! Добавлено через 9 минут Quiet Snow, Стандартные приёмы у меня нормально идут. Некоторые можно усложнить - упростить. Циклы (новые). Да, и процедуры. Пока будет еще долго хватать. Стиль буду развивать. Добавлено через 6 минут locm, Спасибо.
0
|
||||
|
|
|||
| 06.03.2024, 23:11 | |||
|
Не самая лучшая идея прыгать из одной части функции в другую. Для перехода в функцию ее нужно вызвать. Вернутся возможно в любой момент. Если говорить о графике, есть GDI и GDI+. Также есть функции работы с окнами, файлами, аудио, видео, 3D (DirectX, OpenGL), сетью, многопоточностю и т. д. В приложениях для винды почти все функции библиотеки ЯП так или иначе вызывают WinAPI.
2
|
|||
|
787 / 307 / 17
Регистрация: 21.01.2023
Сообщений: 529
|
|
| 06.03.2024, 23:24 | |
|
volchv, функция - это не только код, но и локальные переменные (которые внутри функции заданы). Пока функция не вызвана, память под переменные не выделена, ты прыгаешь внутрь функции, а там присвоение значения локальной переменной... которая не выделена. Ошибка. Казалось бы, почему не выделить память под эти переменные сразу, где-то на куче? Тут замысел интересный, за счёт динамического выделения памяти мы получаем такую замечательную штуку, как рекурсия. Это когда из функции можно вызвать саму себя, вещь просто замечательная.
1
|
|
|
Кормпилятор
|
|||
| 07.03.2024, 10:27 | |||
|
Часто всё это связано с механизмами самой операционной системы, которые тоже не всегда очевидны. Начинается возьня, "прощупывание", что, где и как работает, одним глазом смотря на доку, вторым в пример, если он есть. Несколько раз приходилось разгребать вообще без рабочего примера, тупо по MSDN, в FB-шных хедерах там вообще такая грязь творится, даже если есть пример, то приходится сверять всё, все константы, типы данных, даже названия функций, бывало что названия не совпадают с MSDN-овскими или тупо нет константы, приходится её искать декларировать. И прикинь без какого-либо примера это делать. В PB потому столько функций и наклепали, чтобы минимизировать общение юзера с механизмами системы. Даже мне практику это делать крайне непросто, не говоря уже про человека с небольшим опытом. Добавлено через 5 минут ставить билинейный фильтр - проге совсем плохеет. Насчёт GDI+ не знаю. Но простой GDI как бы только под старые системы актуален 98\2000\XP. Самое оптимальное юзать OpenGL, он решительно везде работает хорошо, реально где я его не тестил - всё было отлично. ну понятно что там есть ограничения на текстуры, но всё таки.
0
|
|||
|
787 / 307 / 17
Регистрация: 21.01.2023
Сообщений: 529
|
|||
| 07.03.2024, 10:48 | |||
|
0
|
|||
|
Кормпилятор
|
|||
| 07.03.2024, 12:40 | |||
Кнопочки это тоже GDI. Можно ещё десятку взять. Лучше это делать на одинаковом оборудовании. Нужно отличать ускорение за счёт железа и просто ускорение. Люди в своё время это всё тестили и писали про просадку, в среднем двухкратную. Так то оно работает и вроде даже прилично, но не всегда. Как то давно писал код, который на FB берёт вывод слоя со встроенной библиотеки на себя и как только врубал там билинейку - начиналась жопа. А без неё отлично работало. Кстати на XP билинейка почему-то работала по умолчанию и ничего не лагало. Интересно но факт. Рендер шрифтов можно и сторонними библиотеками делать тот же FreeType. А можно свои рисовать и выводить, мне такой подход нравится больше.
0
|
|||
|
COM‐пропагандист
|
|||
| 07.03.2024, 12:59 | |||
|
Добавлено через 1 минуту GOTO — вместо прыжков следует использовать современные средства структурного программирования: циклы, условия, оператор выбора, функции. Каша из таких штук как «If a Then Goto 10» заплесневела и протухла 60 лет назад. Так как все GOTO заменяются на приёмы структурного программирования, то метки оказываются не нужны. GOSUB — вместо него пришли функции. CALL — не нужно. В 21 веке пишем название функции и ставим круглые скобки. CALL — это избыточное усложнение, синтаксический яд, визуальный мусор. Отвыкайте называть переменные из одной‐двух букв. Через неделю сами будете вспоминать что означают бесконечные a, b, c, d, e, тратя на это десятки часов. Не пишите все переменные в куче в самом верху. Переменные следует объявлять рядом с тем местом где они используются. Иначе будете бегать глазами вниз‐вверх или использовать прокрутку. Если переменная используется только внутри условия или цикла — объявляйте её внутри условия или цикла. Не следует выносить переменные за пределы блока, за которым она не нужна. Переменные можно объявлять сразу вместе с инициализацией: Dim x As Integer = 5, вместо того чтобы разбивать эту конструкцию на две строки кода. Ne ispolzuite transliteratsiyu v kode. Это плохо читается. Число — это Number, а не Chislo. Длина — это Length, а не Dlina. Не используйте одну и ту же переменную для разных задач. Например, если Length означает длину, то она должна использоваться только для длины, а не для счётчика цикла потому что «ну вот у нас лишняя переменная есть». Для счётчика цикла заводите другую переменную. Если какие‐то переменные используются совместно, научитесь использовать пользовательский тип данных Type. То, что в Паскале называется «запись» и в Си называется «структура». Например, вместо того, чтобы по‐отдельности объявлять координаты x, y, z следует объявить структуру Vector3d с полями x, y, z. Отвыкайте использовать несколько инструкций на одной строке. Двоеточия — дурной тон, забудьте про них. Любите чтобы было кратко? Это плохо читается. Между краткостью и понятностью всегда следует выбирать понятность. Не используйте однострочный IF. Условия вместе с телом на одной строке «If a > b Then c = 100» читаются намного хуже. Разнесите условие и тело на разные строки. Вместо комментариев с «'===================» или «'----------------» или «'************» используйте приёмы структурного программирования: области видимости (Scope) и функции. Спагетти‐кодеры любят лепить всё вместе на одном уровне. Чтобы код не превращался в вермишель которую комком кинули в кипяток воду, следует ознакомиться с концепцией «блок видимости». Такие штуки как условный оператор, оператор выбора, цикл, функция создают собственный блок видимости. Во фрибесик дополнительно добавлен оператор блока Scope. Следует взять на вооружение эту концепцию. Не следует думать о таких вещах как «компилятору будет неудобно компилировать несколько строк, поэтому буду лепить всё в месиво на одной строке». Антропоморфизм здесь не уместен. Компилятор не устаёт, не испытывает эмоции и чувственные переживания. Код пишут для того, чтобы его читали люди, а не потому что компилятор будет духовно восхищаться правильными байтами. Горизонтальная прокрутка — это зло. Текст легко читается когда глаза движутся сверху вниз. Когда глаза идут слева направо — это читается тяжело. Если какое‐то выражение занимает больше 80‐120 символов, его следует разбить на несколько строк оператором _. (Именно поэтому текст в газетах и журналах разбивают на колонки небольшой ширины, а не пишут от края до края бумаги.) Не пишите комментарии справа от операторов. Возьмите за правило писать комментарии только на отдельной строке. Комментарий комментирует то, что находится ниже. Используйте вертикальные и горизонтальные отступы в коде. Для горизонтальных отступов выберите для себя концепцию «табуляции или пробелы» и придерживайтесь только одной концепции. Любой блок видимости (функция, условие, цикл, блок) добавляет отступ слева на 1 табуляцию. Научитесь вставлять пробелы в математических операторах. Следует писать «Zr = Zr * 2 + r» вместо того чтобы лепить всё в кучу. Это на бумажном листочке можно написать «Zr=Zr*2+r», а в коде это читается намного хуже. К условиям это тоже относится. Научитесь разбивать код на несколько файлов и подключать заголовочные файлы.
1
|
|||
|
|
||||
| 07.03.2024, 13:38 | ||||
|
То есть примерно то что нужно volchv для отображения синусоиды в окне.
0
|
||||
|
787 / 307 / 17
Регистрация: 21.01.2023
Сообщений: 529
|
||||
| 07.03.2024, 14:01 | ||||
|
D3D9 изначально встроен в систему (от 7-ки или Висты), через него идёт рендер GUI самой Винды.
0
|
||||
|
Кормпилятор
|
||||||||
| 07.03.2024, 14:29 | ||||||||
|
Но мне она не очень нравится. Сам тоже пытался с нуля(Мне Стас давно скидывал немецкий мануал, там всё подробно было, но без нюансов), словил кучу гемороя при попытке делать пиксель корректно, уточню что на разном оборудовании результат различается и это целая проблема. Однако считаю что всё равно надо это изучать и стараться сделать нормально, GL2D доказывает что это возможно. Забросил, потому что сгорела 9800GT, на которой некоторые косяки воспроизводились и можно было тестировать. Короче нужно много разного железа, чтобы тестировать, просто с ходу не влезть, но можно использовать GL2D там много разного функционала, ТС его хватит с лихвой. Для 3D - это непринципиально. работал в разы быстрее(можно было бы добавить приятный скролл) и ничего толком не потреблял бы(не обязательно делать постоянные обновления или делать их часто, это укладывается в рамки адекватного потребления ресурсов). Добавлено через 11 минут переносить куда-либо ещё. Мне непринципиально, а вот COM - не люблю, мне тяжело всё это разгребать на FB, я уже все карачки себе поломал с этим COM-ом грёбаным. OpenGL тоже не сахар, но он в разы понятнее с точки зрения архитектуры. Хотя если туда серьёзно влезать, то думаю разница будет не большая. проверки этого, просто это лишний гемор их изучать и опять же надо тестировать. Люди часто забивают на это. Т.е. есть два пути либо перестраховаться и всё рассчитать сразу на более раннее железо, либо использовать функции OGL для проверки возможностей(размер текстур, памяти и т.п.). Обычно на более серьёзном оборудовании такие баги не возникают, они возникают когда софт требует то, чего у карты нет. Добавлено через 6 минут Т.е. встроенный FBGfx. Т.к. он даже в худшем случае будет работать быстрее GDI. Объясняю, берёшь какой-нибудь софт с кучей кнопок, галочек, списков и т.п. т.е. кучу массированную стандартного интерфейса и таскаешь окно по экрану. Смотришь обновление окна. Думаешь это не показатель? При этом в 7-ке надо поставить не Aero, а классический интерфейс. Иначе это будет уже не GDI, а Direct3D трудиться. Добавлено через 7 минут риторический, у меня всегда выключено. Не перевариваю вид Aero(эти толстые окаймления каждого окна и прямоугольные кнопки управления окном). Плюс мне не нужно сглаживание текста, всегда выключаю, чтобы беречь зрение.
0
|
||||||||
|
Кормпилятор
|
|||
| 07.03.2024, 15:03 | |||
|
чем мы скролили по горизонтали. ))) Это о том что чёрточку надо тоже уметь применять, а лучше вообще не применять, что сделано, например, в прототипах в хедерах FB, вы же любите приводить в пример FB. Упрекните авторов там. Мол чё за фигня. Многие пишут справа комменты и всё шикарно читается.
0
|
|||
| 07.03.2024, 15:03 | |
|
Отладка кода Отладка кода Отладка кода Отладка кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости.
Решение:
Создан документ со следующими. . .
|
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово.
Решение:
Создан документ с единственным. . .
|
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Вычислить сумму и количество положительных элементов массива, расположенных в четных строках.
Решение:
Создан документ с. . .
|
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности.
. . .
|
|
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные.
. . .
|
Расчёт стоимости яблок по весу
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Написать программу вычисления стоимости некоторого количества (по весу) яблок.
Решение:
Создан документ, с табличной частью. . .
|
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни
1. Механизм отложенного высвобождения фосфора
Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ
Реализована разная скорость. . .
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|