Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
Common Lisp

Избавиться от вывода Nil

14.05.2021, 09:34. Показов 4030. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Имеется функция find-path, которая занимается поиском Эйлерова пути в неориентированном графе. В параметр x передается точка с которой нужно начать поиск пути, в параметр graph сам граф. На выходе функция печатает все возможные пути в заданном графе.
Но функция имеет особенность, что даже если удалось найти пути, она в конце все равно выводит nil.
Кликните здесь для просмотра всего текста

Lisp
1
2
3
4
5
CL-USER> (find-path '1 '((1 2) (1 3) (2 1) (2 3) (3 1) (3 2)) nil)
 
((1 2) (2 3) (3 1)) 
((1 3) (3 2) (2 1)) 
NIL

Можете помочь, переделать функцию find-path так, чтобы если пути найдены, в конце печати всех элементов выводить T, а если пути не найдены выводить Nil.

Листинг программы:
Кликните здесь для просмотра всего текста

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun add (thing lst) (append lst (list thing)))
 
(defun rm-edge (x s)
       (cond ((null s) nil)
         ((equal x (car s)) (rm-edge x (cdr s)))
         (t (cons (car s) (rm-edge x (cdr s))))))
 
(defun search-point (x s)
       (cond ((null s) nil)
         ((equal x (caar s)) (cons (car s) (search-point x (cdr s))))
         (t (search-point x (cdr s)))))
 
(defun find-path (x graph path)
       (if graph (loop for y in (search-point x graph) do
              (let ((edge y))
                (cond ((null graph) path)
                  (edge (find-path (cadr edge) (rm-edge (reverse edge) (rm-edge edge graph)) (add edge path)))
                  (T nil)))) (print path)))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2021, 09:34
Ответы с готовыми решениями:

Ошибка undefined method `mday' for nil:NilClass при попытке вывода значений массива в цикле
Задаю такой вот массив @days = Array.new(daysCount) #массив объектов класса Time i = 0; (-2..daysCount - 3).map {|n| @days =...

nil
Добрый день! В чем отличие nil от . Я правильно понимаю, что первая конструкция используется для обнуления объекта, а вторая для создания...

Команда nil
Здравствуйте! Есть массив Image : Array of TImage; Есть кнопка, добавляющая на форму картинки. И есть кнопка, которая удаляет...

9
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
14.05.2021, 10:01
Цитата Сообщение от Vladim98 Посмотреть сообщение
она в конце все равно выводит nil.
Функция не выводит ничего.

Знаете ли вы, что такое REPL? Это read evaluate PRINT loop. Вы забиваете в REPL выражение (find-path '1 '((1 2) (1 3) (2 1) (2 3) (3 1) (3 2)) nil). REPL его сначала читает, потом вычисляет, потом печатает результат, потом ждёт нового ввода, и так до бесконечности. В процессе вычисления выражения тоже может что-то печататься самим выражением, но результат всегда печатается не самим выражением, а REPLом.

Таким образом, проблемы с вашей функции нет, она не печатает ничего лишнего. Например, если вы используете её в программе, то программа будет печатать только пути, а NIL печатать не будет.

Если вас эстетически беспокоит, что в REPLе печатается значение функции, хотя по вашей задумке она не возвращает осмысленного значения, можете в явном виде вернуть из неё ноль значений, поставив в конце (values):
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun find-path (x graph path)
  (if graph
      (loop for y in (search-point x graph)
            do (let ((edge y))
                 (cond ((null graph) path)
                       (edge (find-path (cadr edge)
                                        (rm-edge (reverse edge)
                                                 (rm-edge edge graph))
                                        (add edge path)))
                       (t nil))))
      (print path))
  (values))
Теперь у меня печатает
Lisp
1
2
3
4
5
CL-USER> (find-path '1 '((1 2) (1 3) (2 1) (2 3) (3 1) (3 2)) nil)
 
((1 2) (2 3) (3 1)) 
((1 3) (3 2) (2 1)) 
; No value
Данная реализация REPLа всё-таки даёт знать, что значений там нет, и это хорошо, а то я подумал бы, что ((1 3) (3 2) (2 1)) - это и есть значение.

Но, по-моему, смысла в этом нет. Не всегда можно вернуть осмысленное значение, и стандартные функции часто в таком случае возвращают nil, а ноль значений - никогда. То есть имеет смысл пересмотреть свои эстетические соображения, чтобы они более соответствовали стандарту. Лучше обратите внимание на форматирование кода. По вашему коду невозможно различить, где у if-а ветка "да", где ветка "нет"; невозможно отличить аргументы внутреннего find-path от аргументов rm-edge. Скобки - для компьютера, для людей - отступы. Обратите внимание, что с отступами всё видно. Тоже так делайте. То есть вам не надо ничего делать, этим занимается Emacs.
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,697
Записей в блоге: 14
14.05.2021, 10:26


Lisp
1
2
3
4
5
6
(defun find-path (x graph path)
       (if graph (loop for y in (search-point x graph) do
              (let ((edge y))
                (cond ((null graph) path)
                  (edge (find-path (cadr edge) (rm-edge (reverse edge) (rm-edge edge graph)) (add edge path)))
                  (T 'OK)))) (print path)))
1
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
14.05.2021, 11:17  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Лучше обратите внимание на форматирование кода. По вашему коду невозможно различить, где у if-а ветка "да", где ветка "нет"; невозможно отличить аргументы внутреннего find-path от аргументов rm-edge. Скобки - для компьютера, для людей - отступы. Обратите внимание, что с отступами всё видно. Тоже так делайте. То есть вам не надо ничего делать, этим занимается Emacs.
С lisp знаком не так давно, в основном по учебным методичкам из университета, а там по оформлению нету не чего, ну все равно спасибо, буду иметь ввиду.

Цитата Сообщение от helter Посмотреть сообщение
Но, по-моему, смысла в этом нет. Не всегда можно вернуть осмысленное значение, и стандартные функции часто в таком случае возвращают nil, а ноль значений - никогда. То есть имеет смысл пересмотреть свои эстетические соображения, чтобы они более соответствовали стандарту.
На самом деле это не мои эстетические соображения, а преподавателя. Цитирую замечание по моей работе "NIL всегда означает «неуспех», «ложь», «неверный результат». Подправьте программу таким образом, чтобы в случае существования эйлерова пути функция все-таки возвращала T."

Цитата Сообщение от helter Посмотреть сообщение
Знаете ли вы, что такое REPL? Это read evaluate PRINT loop. Вы забиваете в REPL выражение (find-path '1 '((1 2) (1 3) (2 1) (2 3) (3 1) (3 2)) nil). REPL его сначала читает, потом вычисляет, потом печатает результат, потом ждёт нового ввода, и так до бесконечности. В процессе вычисления выражения тоже может что-то печататься самим выражением, но результат всегда печатается не самим выражением, а REPLом.
Сейчас у меня программа работает не в REPL режиме, у меня есть функция euler-path которая инкапсулирует работу функции find-path, а так же делает проверку на существование пути. Конечно можно было обойтись, без функций проверки наличия пути, так как если путь не найден все равно будет nil, но написание такой функции является частью задания.
Вариант с (values) к сожалению не подходит под требования преподавателя, но как я понимаю выводить T после вывода всех путей, не получится? Ну либо придется переписывать функцию find-path, чтобы она рекурсивно формировала список всех возможных путей, а потом выводить получившийся список циклом foreach?

Листинг всей программы:
Кликните здесь для просмотра всего текста

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(defun add (thing lst) (append lst (list thing)))
 
(defun rm-edge (x s)
       (cond ((null s) nil)
         ((equal x (car s)) (rm-edge x (cdr s)))
         (t (cons (car s) (rm-edge x (cdr s))))))
 
(defun rm-edges (x s)
           (cond ((null x) s)
             (t (rm-edges (rm-edge (car x) x) (rm-edge (car x) s)))))
 
(defun search-point (x s)
       (cond ((null s) nil)
         ((equal x (caar s)) (cons (car s) (search-point x (cdr s))))
         (t (search-point x (cdr s)))))
 
(defun odd-edges (count graph)
            (let ((edges (search-point (caar graph) graph)))
              (cond ((null graph) count) 
                (t (odd-edges (+ count (if (evenp (length edges)) 0 1)) (rm-edges edges graph))))))
 
(defun find-path (x graph path)
       (if graph (loop for y in (search-point x graph) do
              (let ((edge y))
                (cond ((null graph) path)
                  (edge (find-path (cadr edge) (rm-edge (reverse edge) (rm-edge edge graph)) (add edge path)))
                  (T nil)))) (print path)))
 
(defun euler-path (start graph)
       (if (> (odd-edges 0 graph) 2) "Path does not exist" (find-path start graph nil)))


Добавлено через 2 минуты
Добавлено через 6 минут
Цитата Сообщение от Catstail Посмотреть сообщение
(defun find-path (x graph path)
       (if graph (loop for y in (search-point x graph) do
              (let ((edge y))
                (cond ((null graph) path)
                  (edge (find-path (cadr edge) (rm-edge (reverse edge) (rm-edge edge graph)) (add edge path)))
                  (T 'OK)))) (print path)))
Данное решение, к сожалению не помогло избавится от nil.
0
 Аватар для _sg
4708 / 4403 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
14.05.2021, 11:32
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(defun over-find-path (x graph path)
  (not (find-path x graph path)))
 
(defun find-path (x graph path)
  (if graph
      (loop for y in (search-point x graph) do
            (let ((edge y))
              (cond ((null graph) path)
                    (edge (find-path (cadr edge)
                                     (rm-edge (reverse edge)
                                              (rm-edge edge graph))
                                     (add edge path)))
                    (t nil)))) (print path)))
 
(defun add (thing lst) (append lst (list thing)))
 
(defun rm-edge (x s)
  (cond ((null s) nil)
        ((equal x (car s)) (rm-edge x (cdr s)))
        (t (cons (car s) (rm-edge x (cdr s))))))
 
(defun search-point (x s)
  (cond ((null s) nil)
        ((equal x (caar s)) (cons (car s)
                                  (search-point x (cdr s))))
        (t (search-point x (cdr s)))))
 
 
> (over-find-path '1 '((1 2) (1 3) (2 1) (2 3) (3 1) (3 2)) nil)
 
((1 2) (2 3) (3 1)) 
((1 3) (3 2) (2 1)) 
T
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,697
Записей в блоге: 14
14.05.2021, 12:09
Цитата Сообщение от Vladim98 Посмотреть сообщение
Данное решение, к сожалению не помогло избавится от nil.
- да, я неправ.


Lisp
1
2
3
4
5
6
(defun find-path (x graph path)
       (if graph (loop for y in (search-point x graph) do
              (let ((edge y))
                (cond ((null graph) path)
                  (edge (find-path (cadr edge) (rm-edge (reverse edge) (rm-edge edge graph)) (add edge path)))
                  (T nil)))) (print path) 'ok))
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
14.05.2021, 13:30
Цитата Сообщение от Vladim98 Посмотреть сообщение
С lisp знаком не так давно, в основном по учебным методичкам из университета, а там по оформлению нету не чего, ну все равно спасибо, буду иметь ввиду.
Ну, если охота познакомиться с принципами, то вот: https://dept-info.labri.fr/~id... ation.html
Но на самом деле рецепт простой: емакс + здравый смысл. Возможно, в вашей методичке не написано, что для лиспа нужен особый редактор. Тогда я вам это скажу. Лисп надо писать в емаксе. Он расставит отступы, как положено.

А здравый смысл - ну, скажем, неужели вы сами можете проанализировать, что передаётся во внутренний find-path? А раз не можете вы, автор кода, то и никто не может. Чтобы стало ясно, надо разбить строки или определить локальные переменные.

Цитата Сообщение от Vladim98 Посмотреть сообщение
На самом деле это не мои эстетические соображения, а преподавателя. Цитирую замечание по моей работе "NIL всегда означает «неуспех», «ложь», «неверный результат». Подправьте программу таким образом, чтобы в случае существования эйлерова пути функция все-таки возвращала T."
И в чём проблема? Вы знаете, как вернуть значение из функции? Тело функции состоит из нескольких выражений. При обычном вызове эти выражения вычисляются по очереди и возвращается результат последнего выражения. Поэтому если вы хотите возвращать t, достаточно дописать его в конце, как я дописал (values).

Но это спорная эстетическая позиция. Скажем, стандартные выражения (что функции, что нефункции) стараются вернуть что-то полезное. Например, print возвращает напечатанный объект (поэтому удобно дебажить принтами). Но если вернуть вообще нечего, по-моему, возвращают nil. Навскидку: format и результат циклов по умолчанию. Nil вовсе не всегда означает неуспех, это и пустой список тоже. Nil по-латински - "ничто". Если нечего вернуть, возвращаем ничто. Хотя, конечно, из-за таких пустяков нет смысла спорить с преподавателем.

Добавлено через 17 минут
Цитата Сообщение от Vladim98 Посмотреть сообщение
Ну либо придется переписывать функцию find-path, чтобы она рекурсивно формировала список всех возможных путей
А вот это, по-моему, хороший вариант.

От напечатанных значений толка нет. Их человек увидит, а компьютер не знает о них. Вы их никак не можете анализировать. Например, вас спросят: "а какой из этих путей имеет наименьшую длину сначала проходит через А, а потом через Б?" А вы только вручную можете проверить, потому что в компьютер пути не забиты. Или, скажем, тестить проблематично. Можно, но проблематично. То бы вы сравнили результат с известным, а то вам придётся перенаправлять вывод функции в строку, печатать известный результат тоже в строку, и сравнивать эти строки. Звучит костыльно, нет?

И такое соображение. Есть задача - найти эйлеровы пути, и есть задача вывести их. Вы эти задачи прибили гвоздями друг к другу. Это всегда чревато. Например, вы вроде бы умеете находить эйлеровы пути, а я скажу: "Вот вам библиотека для рисования png, нарисуйте мне эти пути стрелочками на графе!" Или: "У нас будет веб-сервис нахождения эйлеровых путей, нам нужен REST-хендлер, возвращающий их в JSON". А ваша функция для этого абсолютно бесполезна. Вы потрудились, написали алгоритм, но прибив его гвоздями к конкретному способу вывода, вы похоронили его в недрах find-path.

Добавлено через 2 минуты
Цитата Сообщение от Vladim98 Посмотреть сообщение
циклом foreach?
Такого нету. Есть dolist или loop на все случаи жизни.

Добавлено через 11 минут

Не по теме:

Цитата Сообщение от helter Посмотреть сообщение
Лисп надо писать в емаксе.
Я когда это пишу, всегда передёргивает. Лисп надо писать в виме! Всё надо писать в виме!

3
0 / 0 / 0
Регистрация: 16.10.2018
Сообщений: 3
14.05.2021, 15:12  [ТС]
Всем спасибо!
Выбрал следующее решение: в функции find-path добавил (values T), теперь функция возвращает всегда T, даже если путь не будут найден, что не очень хорошо я считаю, ведь если нет путей, то логичней вывести nil. Но так как я инкапсулирую данную функцию в функции euler-path, то там происходит проверка на существование пути, то такое решение в принципе имеет право на жизнь, на зачет думаю точно. Но правда пришлось изменить функцию euler-path, а именно добавить условие, которое проверяет, что если есть две вершины, которые имеют нечетную степень, то согласно теореме, путь возможен только из данных вершин, и можно будет вызывать функцию find-path передавая нечетную вершину, а иначе выводит предупреждение "Path from the given point is not possible", ну чтоб не выводить просто T.

Вот такой код получился:
Кликните здесь для просмотра всего текста

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(defun add (thing lst)
  (append lst (list thing)))
 
(defun rm-edge (x s)
  (cond ((null s) nil)
    ((equal x (car s)) (rm-edge x(cdr s)))
    (t (cons (car s)
         (rm-edge x (cdr s))))))
 
(defun rm-edges (x s)
  (cond ((null x) s)
    (t (rm-edges (rm-edge (car x) x)
             (rm-edge (car x) s)))))
 
(defun search-point (x s)
  (cond ((null s) nil)
    ((equal x (caar s))
     (cons (car s)
           (search-point x (cdr s))))
    (t (search-point x (cdr s)))))
 
(defun odd-edges (count graph)
  (let ((edges (search-point (caar graph) graph)))
    (cond ((null graph) count) 
      (t (odd-edges
          (+ count
         (if (evenp (length edges))
             0 1))
          (rm-edges edges graph))))))
 
(defun find-path (x graph path)
  (if graph
      (loop for y in (search-point x graph)
        do (let ((edge y))
         (cond ((null graph) path)
               (edge (find-path (cadr edge)
                    (rm-edge (reverse edge)
                         (rm-edge edge graph))
                    (add edge path)))
               (T nil))))
    (print path))
  (values T))
 
(defun euler-path (start graph)
  (cond ((> (odd-edges 0 graph) 2) "Path does not exist")
    ((or (< (odd-edges 0 graph) 2)
         (and (= (odd-edges 0 graph) 2)
          (oddp (length (search-point start graph)))))
     (find-path start graph nil))
    (t "Path from the given point is not possible")))


Добавлено через 4 минуты
Цитата Сообщение от helter Посмотреть сообщение
А вот это, по-моему, хороший вариант.
От напечатанных значений толка нет. Их человек увидит, а компьютер не знает о них. Вы их никак не можете анализировать. Например, вас спросят: "а какой из этих путей имеет наименьшую длину сначала проходит через А, а потом через Б?" А вы только вручную можете проверить, потому что в компьютер пути не забиты. Или, скажем, тестить проблематично. Можно, но проблематично. То бы вы сравнили результат с известным, а то вам придётся перенаправлять вывод функции в строку, печатать известный результат тоже в строку, и сравнивать эти строки. Звучит костыльно, нет?
И такое соображение. Есть задача - найти эйлеровы пути, и есть задача вывести их. Вы эти задачи прибили гвоздями друг к другу. Это всегда чревато. Например, вы вроде бы умеете находить эйлеровы пути, а я скажу: "Вот вам библиотека для рисования png, нарисуйте мне эти пути стрелочками на графе!" Или: "У нас будет веб-сервис нахождения эйлеровых путей, нам нужен REST-хендлер, возвращающий их в JSON". А ваша функция для этого абсолютно бесполезна. Вы потрудились, написали алгоритм, но прибив его гвоздями к конкретному способу вывода, вы похоронили его в недрах find-path.
Полностью согласен, но в рамках лабораторной работы пока не стал переписывать, хотя это самый правильный вариант. Если зачет не получу в этот раз, то так и сделаю.

Цитата Сообщение от helter Посмотреть сообщение
Сообщение от Vladim98
циклом foreach?
Такого нету. Есть dolist или loop на все случаи жизни.
По привычки назвал так), работаю с языком С#
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
14.05.2021, 15:24
Цитата Сообщение от Vladim98 Посмотреть сообщение
(values T)
Просто t.

CL поддерживает такую нечасто встречающуюся штуку как множественные значения. Обычно выражение возвращает одно значение, но может возвращать и несколько. Не один список, а буквально несколько значений. Форма values как раз служит для возврата нескольких значений. Например, (values 1 2 3) возвращает три значения: 1, 2, 3. Выражение (values t) возвращает одно значение: t. Написать (values t) и t - это абсолютно одно и то же.

Код в CL пишут маленькими буквами, в том числе t. Раньше писали большими, но давно это было, лет сорок назад.
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,697
Записей в блоге: 14
14.05.2021, 15:57
В HomeLisp этот код выглядит так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(defun add (thing lst) (append lst (list thing)))
 
(defun rm-edge (x s)
       (cond ((null s) nil)
         ((equal x (car s)) (rm-edge x (cdr s)))
         (t (cons (car s) (rm-edge x (cdr s))))))
 
(defun search-point (x s)
       (cond ((null s) nil)
         ((equal x (caar s)) (cons (car s) (search-point x (cdr s))))
         (t (search-point x (cdr s)))))
 
(defun find-path (x graph path)
       (if graph 
           (iter (for y in (search-point x graph))
                 (let ((edge y))
                       (cond ((null graph) path)
                             (edge (find-path (cadr edge) (rm-edge (reverse edge) (rm-edge edge graph)) (add edge path))))))
            (printline path)) 'ok)
 
(find-path '1 '((1 2) (1 3) (2 1) (2 3) (3 1) (3 2)) nil)
 
((1 2) (2 3) (3 1))
((1 3) (3 2) (2 1))
 
==> OK
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2021, 15:57
Помогаю со студенческими работами здесь

Поясните строку q^.next := nil;
ниже код , что значит строка q^.next := nil;и еще что можете поясните //вставка элементов procedure Ins_SingleList(x: elementtype;...

Alamofire response nil
static func getProfile(){ let inside4_session = defaults.string(forKey: &quot;new_token&quot;) ...

Вылавливание Nil в функции
Есть функция, которая по коду находит в таблице описание: function ShowRef(table: string; code: string): string; begin with...

Почему на выходе nil?
Хочу сделать ввод в список с клавиатуры до того, как будет введён nil. Подскажите пожалуйста, что я недопонимаю и почему в итоге список...

Attempt to call a nil value
Здравствуйте, пробую освоить Луа, делаю все по уроку, выдает такое сообщение: lua: main.lua:23: attempt to call a nil value (field...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru