Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/54: Рейтинг темы: голосов - 54, средняя оценка - 4.96
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406

101 Basic Computer Games

25.05.2024, 16:17. Показов 18620. Ответов 273
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недавно я натолкнулся в сети на книгу, о которой никогда не слышал.
Книга называется "101 Basic Computer Games". Она была выпущена DEC в 1975 году
и содержит тексты игр с аннотациями. Игры написаны на BASIC, на компьютере PDP-11.

Очень интересная коллекция для начинающих программистов, и не только.

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

https://github.com/coding-horr... uter-games
4
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2024, 16:17
Ответы с готовыми решениями:

Создайте график функций x^3 на отрезке [-101; 101]. В качестве значений используйте массив x размером в 101 элемент
Создайте график функций x^3 на отрезке . В качестве значений используйте массив x размером в 101 элемент. Для создания массива значений...

Coodo Games & Datcroft Games Java Developer (Самара)
В Самарский офис требуется талантливый разработчик. 
О нас: - Мы разрабатываем только лучшие игры. Наши запущенные продукты:...

Coodo Games & Datcroft Games AS3.0 Developer (Самара)
В Самарский офис требуется талантливый разработчик. 
О нас: - Мы разрабатываем только лучшие игры. Наши запущенные продукты: Fragoria,...

273
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.06.2024, 09:32
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Потенциально памяти уходит одинаковое количество
Это неправда. 100 массивов по 1 мегабайту созданные заранее буду занимать 100 мегабайт памяти.
100 массивов создающиеся только когда надо и уничтожающиеся когда не надо — будут занимать 1 мегабайт памяти.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вы тут просто смешали коней и людей. Структурный код с неструктурным
О чём это говорит? О том, что макаронинг приводит к проблемам, а структурный код нет. Зачем нужен подход, который приводит к проблемам?
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Компилятор может оптимизировать
В таком случае можно сразу использовать функцию, потому что компилятор её оптимизирует. В отличие от «блока кода» мало того, что оптимизации не поддаётся, так ещё и приводит к проблемам.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Пересекаются переходы
Переход и есть блок кода.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.06.2024, 10:18
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Например в Паскале - нет.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Потенциально памяти уходит одинаковое количество. Вы же её прописали в коде.
Это вопрос личных предпочтений Замабувараева. Он амбассадор новых веяний в кодинге.
Хулиган, старпёром быть это на самом деле неплохо, плохо не иметь нормальных проектов на языках,
за идеологии которых(отщипывая от них) ты нам тут поясняешь, форт, фортран, Паскаль и иже с ними.


Цитата Сообщение от CoderHuligan Посмотреть сообщение
но не может иметь косвенной или прямой рекурсии, что более безопасно.
Скажи почему тебе так просто запудрить мозги? Только пошёл диалог, а ты уже поплыл и покорно полез
изучать "косвенные", "прямые" и всякие другие прочие.
Рекурсия - это крайне редкая техника программирования, настолько редкая, что некоторые, овладев ею
внезапно ощущают себя какими-то особенными, несмотря на то, что без неё вполне всё пишется.
Был тут юноша один с ником geh, любитель рекурсии, ничего путного от него не было за всё время
пребывания тут, да можно для затравки 1-2 примера вбросить как и делал, полюбоваться на картинки
генеренные десяткой строк кода, но это абсолютно бестолковая вещь. Рекурсия в серьёзных софтах
почти не применяется, а грамотные люди, осознавая все её плюсы и минусы всегда её разворачивают, да
это тяжело и требует мозгов, но оно себя окупает. Ибо схлопотать и отгрести никто даже из маститых
не хочет, чтобы потом возиться отлаживать это дерьмо, все прекрасно понимают почему.
Одно дело играться с фракталами и совсем другое строить маршруты для теслы. В первом случае жертв
нет, во втором - могут появиться.
И самое гиблое дело лезть ещё за этим на ютуб, где разного формата губошлёпы с голосом 10 летнего
мальчика, наевшиеся синтаксических сахаров и никогда не нюхавшие реального кодинга, будут затирать
что хорошо, а что плохо. Хулиган, сформируй уже в себе хоть какой-то стержень. Много лет прошло
"а воз и ныне там".


Цитата Сообщение от Mikle Quits Посмотреть сообщение
И у меня большая часть кода - это украшательство (процедура DrawLine, её можно заменить на обычный Line, потеряв раскраску), а само формирование фрактала вот:
Думаешь не понимаю как работает этот код, где и какие отростки он создаёт? Весёлый ты дядька.
Вообще прежде чем тебе писать, просто чтобы посмотреть результат переписал его на FB:
PureBasic
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
TYPE tVec2
  x AS SINGLE
  y AS SINGLE
END TYPE
 
DECLARE SUB DrawFractal(vPos AS tVec2, vDir AS tVec2)
DECLARE SUB DrawLine(vP1 AS tVec2, vP2 AS tVec2)
 
  SCREEN 20, 32
  DIM vP AS tVec2, vD AS tVec2
 
  vP.x = 440
  vP.y = 750
  vD.x = 0
  vD.y = -115
  DrawFractal vP, vD
 
  SLEEP
 
SUB DrawFractal(vPos AS tVec2, vDir AS tVec2)
DIM vP AS tVec2, vD AS tVec2, q AS LONG
 
  IF vDir.x * vDir.x + vDir.y * vDir.y < 0.017 THEN EXIT SUB
 
  vP.x = vPos.x + vDir.x
  vP.y = vPos.y + vDir.y
 
    DrawLine (vPos, vP)
 
  vD.x = vDir.x * .85 - vDir.y * 0.04
  vD.y = vDir.y * .85 + vDir.x * 0.04
  
    DrawFractal (vP, vD)
  
  vD.x = vDir.x * 0.15 + vDir.y * 0.24
  vD.y = vDir.y * 0.15 - vDir.x * 0.24
  
    DrawFractal (vP, vD)
  
  vD.x = vDir.x * 0.14 - vDir.y * 0.25
  vD.y = vDir.y * 0.14 + vDir.x * 0.25
 
    DrawFractal (vP, vD)
End Sub
 
SUB DrawLine(vP1 AS tVec2, vP2 AS tVec2)
DIM x AS SINGLE, y AS SINGLE, k AS SINGLE, dx AS SINGLE, dy AS SINGLE
  dx = vP2.x - vP1.x
  dy = vP2.y - vP1.y
  IF ABS(dx) < ABS(dy) THEN
    k = dx / dy
    IF vP2.y > vP1.y THEN
      y = vP1.y
      WHILE y < vP2.y
        x = vP1.x + (y - vP1.y) * k
        PSET(x, y), &H50BB50
        y = y + 1
      WEND
    ELSE
      y = vP2.y
      WHILE y < vP1.y
        x = vP1.x + (y - vP1.y) * k
        PSET(x, y), &H40FF30
        y = y + 1
      WEND
    END IF
  ELSE
    k = dy / dx
    IF vP2.x > vP1.x THEN
      x = vP1.x
      WHILE x < vP2.x
        y = vP1.y + (x - vP1.x) * k
        PSET(x, y), &HA0AF20
        x = x + 1
      WEND
    ELSE
      x = vP2.x
      WHILE x < vP1.x
        y = vP1.y + (x - vP1.x) * k
        PSET(x, y), &H609F30
        x = x + 1
      WEND
    END IF
  END IF
END SUB
Но вот скажи, действительно считаешь это хорошим кодом?
Т.е. DrawFractal, вот это аццкое месево из кучи захардкоденных "магических чисел", без комментариев
и сделанное не по фен шую рекурсии(1 вызов функции + условие схождения, а не процедурой, что есть нонсенс).
И на полном серьёзе говоришь что это прям логика? Если да, то, ну ради бога... Тогда все вопросы отпадают
сами собой.

Цитата Сообщение от Mikle Quits Посмотреть сообщение
У меня достаточно "божеский" вид?
Сильной разницы не увидел. Что то херня, что это херня. Оба папоротника выглядят как говно.
Нужно очень сильно постараться, чтобы это было похоже на живой куст. Базовыми примитивами
прикольно сделать скорее всего не получится.
0
 Аватар для Mikle Quits
787 / 310 / 17
Регистрация: 21.01.2023
Сообщений: 530
28.06.2024, 11:13
PureBasic
1
[quote="Quiet Snow;17345186"]Вообще прежде чем тебе писать, просто чтобы посмотреть результат переписал его на FB[/quote]
"просто чтобы посмотреть результат" в архиве есть EXE.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
DrawFractal, вот это аццкое месево из кучи захардкоденных "магических чисел", без комментариев
Твой папоротник:
PureBasic
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
k = 10
  Midx = 320
  Midy = 480
  radius = .1 * Midy
     RANDOMIZE TIMER
  x = 1
  y = 0
 
  FOR k = 1 TO Iterations
   p = RND
   t = x
   IF p <= .85 THEN
     x = .85 * x + .04 * y
     y = -.04 * t + .85 * y + 1.6
   ELSE
      IF p <= .92 THEN
       x = .2 * x - .26 * y
       y = .23 * t + .22 * y + 1.6
      ELSE
         IF p <= .99 THEN
          x = -.15 * x + .28 * y
          y = .26 * t + .24 * y + .44
         ELSE
          x = 0
          y = .16 * y
         END IF
 
      END IF
   END IF
   PSET (Midx + radius * x, Midy - radius * y), POINT(Midx + radius * x, Midy - radius * y) + 1
  NEXT
Мой папоротник (в твоём переводе):
PureBasic
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
SUB DrawFractal(vPos AS tVec2, vDir AS tVec2)
DIM vP AS tVec2, vD AS tVec2, q AS LONG
 
  IF vDir.x * vDir.x + vDir.y * vDir.y < 0.017 THEN EXIT SUB
 
  vP.x = vPos.x + vDir.x
  vP.y = vPos.y + vDir.y
 
    DrawLine (vPos, vP)
 
  vD.x = vDir.x * 0.85 - vDir.y * 0.04
  vD.y = vDir.y * 0.85 + vDir.x * 0.04
  
    DrawFractal (vP, vD)
  
  vD.x = vDir.x * 0.15 + vDir.y * 0.24
  vD.y = vDir.y * 0.15 - vDir.x * 0.24
  
    DrawFractal (vP, vD)
  
  vD.x = vDir.x * 0.14 - vDir.y * 0.25
  vD.y = vDir.y * 0.14 + vDir.x * 0.25
 
    DrawFractal (vP, vD)
End Sub
И там, и там нет комментариев и куча "магических" констант. Только у тебя констант больше.
Но какое это имеет отношение в выяснении преимуществ рекурсивного кода над нерекурсивным? По делу написать нечего?
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Думаешь не понимаю как работает этот код, где и какие отростки он создаёт?
Я привёл описание алгоритма на человеческом языке не для того, чтобы ты понял, а чтобы продемонстрировать, что рекурсивный код позволяет прямо воспроизвести алгоритм без добавления сущностей (циклов, условий, которых НЕТ в словесном описании).
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Сильной разницы не увидел. Что то херня, что это херня. Оба папоротника выглядят как говно.
Нужно очень сильно постараться, чтобы это было похоже на живой куст.
У тебя было написано "божеский вид", это можно понять по всякому, я понял, как "красиво", а не "натурально".
И это к вопросу рекурсии не имеет отношения.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.06.2024, 12:01
Цитата Сообщение от Замабувараев Посмотреть сообщение
Это неправда. 100 массивов по 1 мегабайту созданные заранее буду занимать 100 мегабайт памяти.
100 массивов создающиеся только когда надо и уничтожающиеся когда не надо — будут занимать 1 мегабайт памяти.
Для этого нужно быть уверенным что "когда надо" это исключительно всегда кусок кода, работающий
только с 1 массивом этой программы. Понятно что, зачастую, программе не нужны всегда все
её возможности и что-то можно выгрузить, но скажу честно, сильно сомневаюсь что даже будучи
бережным к памяти можно выкроить больше 20-40% в общих задачах и вообще хоть сколько-нибудь
в realtime задачах. Это очень сильно зависит от специфики задач.
Т.е. есть некоторая минимальная планка памяти ниже которой программу не завести и есть массивы,
которые просто невыгодно выгружать, т.к. их повторное заведение и заполнение даст устойчивый лаг
и это скажется сильным образом на юзабилити.

Добавлено через 44 минуты
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Твой папоротник
Это не мой папоротник, там написано откуда он. Это был давний общеобразовательный вброс по фракталам.
Чтобы людям что-то показать. Потом уже понял, что не стоило. На вред пошло.

Цитата Сообщение от Mikle Quits Посмотреть сообщение
Но какое это имеет отношение в выяснении преимуществ рекурсивного кода над нерекурсивным? По делу написать нечего?
По делу(по рекурсии) уже своё мнение высказал. А по фракталам высказал кучу лет назад.
Ни на чём не настаиваю, нравится рекурсия - пиши.

Цитата Сообщение от Mikle Quits Посмотреть сообщение
а чтобы продемонстрировать, что рекурсивный код позволяет прямо воспроизвести алгоритм без добавления сущностей
Если написать прогу нормально(сделать тригонометрич прослойку, работать радиус векторами, написать
комментарии) - то может и позволяет, но что с того? Сложность понимания случайным юзером в данном случае
сильно не зависит от приёма разработки, либо рекурсия, либо линейный итеративный алгоритм, конкретно
тут - пофиг.
Она зависит от реализации алгоритма, в другом алгоритме по другому будет, попадётся сложный алг - вообще
жопа будет. Рекурсия же может уничтожить мозг даже в простых вещах, про сложные молчу.
Но нормальный код в линейном виде сделал бы этот алгоритм более понятным вообще любым людям. Насколько
"более" - трудно сказать, у всех мышление разное. Это я понимаю, что там стояли синусы и косинусы,
сам такое много раз писал и то на глаз не понять где куда и что оно там крутит.
Сделай эксперимент, спроси у любого без трассировки на ПК, как этот твой код в точности работает.
Сможет человек сам разобрать этот код, в уме это прикинуть и показать тебе на листике без компа...
То то и оно. Ну не надо выпендриваться, сколько можно. Ознакомься хоть с общим мнением у людей
по этому вопросу, желательно тех, кто сам что-то пишет, а не берёт чужие алгоритмы и не фракталы.
Почти все тебе скажут, что пишут без рекурсии, за очень редким исключением. И выделят единственный
плюс рекурсии - компактный код, не то чтобы понятный, но компактный. А дальше одни минусы,
от возможности бесконечно зациклить, до переполнения стека, при этом память никак не контролируется,
состояния никак не контролируются(и отдельно отладить их нельзя), жопа куда не клюнь.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.06.2024, 12:02
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Хулиган, сформируй уже в себе хоть какой-то стержень. Много лет прошло
"а воз и ныне там".
Воз постепенно движется. Сейчас асм подтягиваю. Основы информационной безопасности. С++ изучаю.
Мелкие проекты делал, но нигде не выкладывал, чисто для себя. Один на TCL, второй на VB.
Думаю пора приступить к написанию тестового проекта по языку, в котором осуществил бы некоторые свои идеи. Я давно начал, но забросил. В частности была написана библиотека по двухсвязному списку на Си. Просто хотел осуществить способ компиляции не как у всех, а по новому способу, более ясному для понимания. Не через рекурсию, а загнать токены в список и обрабатывать уже его посредством автомата, а не через рекурсию сверху вниз.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Рекурсия в серьёзных софтах
почти не применяется
В большинстве компиляторов. В библиотеках регулярных выражений. В обходах директорий файловой системы. Варианты? Рекурсия гораздо проще в реализации компиляторов. Возможно выберу этот путь если со списком не заладится.
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,040
Записей в блоге: 7
28.06.2024, 12:06
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Потенциально памяти уходит одинаковое количество.
Нет. Под параметры и локальные переменные используется память стека и только на время пока эти переменные нужны.
Если вы под параметры и локальные переменные используете глобальные переменные, память занята зря.
Показывайте примеры кода чтобы не было недопонимания.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
А процедура не должна возвращать значение и соответственно не должна участвовать в выражениях.
Почему? Прекрасно возвращается значения!
PureBasic
1
2
3
Procedure Plus(x, y)
  ProcedureReturn x+y
EndProcedure
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.06.2024, 12:41
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В обходах директорий файловой системы. Варианты?
Обход директорий уже показывал как без рекурсии делать. Для себя позже его же в 19-м году сделал
прям хорошо, дописал сортировку списка, двустороннюю пузырьком + rapid, очень круто получилось.
В компилях не знаю где, не писал компили, но по сути в первом приближении - там всё без рекурсии,
по крайней мере анализ и разбор строки - да, анализ формул - тут надо думать, но думаю можно итеративно,
проверка вложенностей операторов - скорее всего да. Т.е. вполне можно сделать, не вижу где там можно
встрять, но конечно, это надо глубоко анализировать, может что-то и всплыть. Но даже если и, то мало где.
За регулярки не скажу - не пользуюсь.

Добавлено через 11 минут
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В частности была написана библиотека по двухсвязному списку на Си.
Даже побоюсь спросить сколько ты её писал своим стилем))) работает хоть?
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,680
Записей в блоге: 2
28.06.2024, 13:01
Цитата Сообщение от locm Посмотреть сообщение
Почему? Прекрасно возвращается значения!
PureBasic
Выделить код
1
2
3
Procedure Plus(x, y)
ProcedureReturn x+y
EndProcedure
Тогда, получается, ето функция )
0
 Аватар для Mikle Quits
787 / 310 / 17
Регистрация: 21.01.2023
Сообщений: 530
28.06.2024, 13:21
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Обход директорий уже показывал как без рекурсии делать. Для себя позже его же в 19-м году сделал
прям хорошо
Вопрос зачем.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
анализ формул - тут надо думать
Именно, анализ формул, разбор математических выражений. Не требуется делать никаких предварительных анализов структуры выражения, код максимально лаконичен.
Ты пойми. Я же не агитирую использовать рекурсию везде, я, скорее, противник того, чтобы от чего-то отказываться из каких-то идеологических побуждений. Для вышеперечисленных задач рекурсия предпочтительнее. На счёт того, что она на вид непонятна, вопрос спорный. Если ты её изучил, но никогда не пользуешься, то и навыка на взгляд понимать, что тут к чему, не будет.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.06.2024, 13:28
Цитата Сообщение от Quiet Snow Посмотреть сообщение
а грамотные люди, осознавая все её плюсы и минусы всегда её разворачивают
Зачем? Оптимизирующий компилятор сам развернёт и превратит хвостовую рекурсию в цикл.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Но нормальный код в линейном виде сделал бы этот алгоритм более понятным вообще любым людям
Не согласен.
Например, рекурсивный обход двоичного дерева намного проще и понятней, и сама функция занимает примерно шесть строк кода:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
' Узел дерева
Type Node
    LeftNode As Node Ptr
    RightNode As Node Ptr
    ' Данные
    Value As String
End Type
 
' Обход дерева получается простым и лаконичным:
Sub TreeVisit(ByVal pTree As Node Ptr)
    If pTree Then
        TreeVisit(pTree->LeftNode)
        
        ' Печать данных
        Print(pTree->Value)
        
        TreeVisit(pTree->RightNode)
    End If
End Sub
Итеративный обход дерева не обладает такой простотой и элегантностью.

Добавлено через 5 минут
Цитата Сообщение от Quiet Snow Посмотреть сообщение
не вижу где там можно
встрять, но конечно, это надо глубоко анализировать, может что-то и всплыть. Но даже если и, то мало где.
Например, быстрая сортировка — это рекурсивный алгоритм.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,680
Записей в блоге: 2
28.06.2024, 13:33
Я квик-сорт пробовал переделать в линейку когда-то, не получилось
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.06.2024, 13:52
Цитата Сообщение от locm Посмотреть сообщение
Под параметры и локальные переменные используется память стека
А как же быть с размером стека? Вы уверены что ваша прога сможет всегда оставаться в пределах заданным компилятором, причем обычно небольшими? Особенно это актуально для программ работающих в реальном времени постоянно.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Даже побоюсь спросить сколько ты её писал своим стилем))) работает хоть?
У меня ВСЕГДА ВСЁ РАБОТАЕТ. Такая особенность: я всегда тестирую свой код. Код находится на другом компе, я его пока не включаю, но если нужно могу показать. Во всяком случае все равно выложу в составе компилятора. В блоге напишу подробней.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.06.2024, 15:02
Цитата Сообщение от CoderHuligan Посмотреть сообщение
оставаться в пределах заданным компилятором, причем обычно небольшими?
Это же настраивается, до 2 гигабайт можно резервировать под стэк.
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,040
Записей в блоге: 7
28.06.2024, 15:16
Цитата Сообщение от CoderHuligan Посмотреть сообщение
А как же быть с размером стека? Вы уверены что ваша прога сможет всегда оставаться в пределах заданным компилятором, причем обычно небольшими?
Если нет неконтролируемой рекурсии, проблем не возникнет. По умолчанию стек имеет размер несколько мегабайт и этого достаточно.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.06.2024, 15:34
Цитата Сообщение от Замабувараев Посмотреть сообщение
Это же настраивается, до 2 гигабайт можно резервировать под стэк.
И становится константой в ран-тайм. И сколько выделить это часто гадание на кофейной гуще.
Цитата Сообщение от locm Посмотреть сообщение
Если нет неконтролируемой рекурсии, проблем не возникнет.
Если функция а вызывает функцию b, b вызывает с, c вызывает а, то может произойти исчерпание стека. Часто мы не знаем размера выделяемого блока памяти для массива. Быстрая сортировка может легко вызвать исключение в этом случае. Я один раз с этим столкнулся пытаясь отсортировать большой массив в куче.
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,040
Записей в блоге: 7
28.06.2024, 15:56
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Если функция а вызывает функцию b, b вызывает с, c вызывает а, то может произойти исчерпание стека.
Эти ошибки обычно отлавливаются на этапе тестирования.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Часто мы не знаем размера выделяемого блока памяти для массива.
Выделять нужно из кучи, а не из стека. В стеке только указатель на память (4 или 8 байт в зависимости от разрядности).
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Я один раз с этим столкнулся пытаясь отсортировать большой массив в куче.
Если массив в куче то причем здесь стек?
При отсутствии свободной памяти, указатель будет равен 0.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.06.2024, 18:28
Цитата Сообщение от locm Посмотреть сообщение
Если массив в куче то причем здесь стек?
Причем здесь алгоритм быстрой сортировки который валится на большом массиве.
Цитата Сообщение от locm Посмотреть сообщение
Эти ошибки обычно отлавливаются на этапе тестирования.
Не всегда можно предусмотреть всё на этом этапе.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Полный запрет GOTO лишает читающих код
такого дерьма. А оставили GOTO потому что при разработке он бы
Что вы на goto зациклились? Допустим у нас есть переменная состояния:
PureBasic
1
statevar v
Присваивание ей значения в виде имени блока кода, приводит к выполнению сразу двух операций:
1. присваивание собственно значение адреса блока данной переменной, и
2. переход на этот адрес.
При этом оформление блоков может быть разным, например в стиле basic:
PureBasic
1
2
3
state bbb
    v = aaa;
end state
При этом возникает несколько любопытных моментов:
1. каждый state может узнать предыдущий state
2. легко организуются циклы, например аналог цикла while:
PureBasic
1
2
3
4
state bbb
  если /условие/ то v = ааа;//вылетаем из цикла
  // тело цикла
end state
так как переменная v содержит адрес текущего state то не нужно делать goto в конце. Таким же образом реализуются и другие циклы.
Но в моем представлении понятие цикла ущербно.
И никаких goto.

Добавлено через 26 минут
Цитата Сообщение от locm Посмотреть сообщение
По умолчанию стек имеет размер несколько мегабайт и этого достаточн
При исчерпании стека возникает исключение. Это нужно помнить. А должна быть всего лишь потеря последнего элемента стека на его дне, может быть с дополнительной сигнализацией этого обстоятельства. В нормальном языке так должно быть.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.06.2024, 20:05
Цитата Сообщение от CoderHuligan Посмотреть сообщение
И становится константой в ран-тайм
Ну во‐первых, память под стэк только резервируется, а выделяется по требованию.
Во‐вторых, сколько вам доступно памяти не из стека — это тоже гадание на кофейной гуще. Вы думали что сейчас свободно 16 гигабайт? А вот и нет, через секунду другая программа (браузёр) съела эти гигабайты, и ваши сведения о свободной памяти устарели. Я надеюсь, ваша программа написана ответственно и умеет обрабатывать такие ошибки.

Добавлено через 1 минуту
Цитата Сообщение от CoderHuligan Посмотреть сообщение
А должна быть всего лишь потеря последнего элемента стека
Нет не должна. ОС не имеет права портить данные.

Добавлено через 2 минуты
Цитата Сообщение от CoderHuligan Посмотреть сообщение
При этом оформление блоков может быть разным, например в стиле basic:
Так это уже придумано: и называется Sub:
PureBasic
1
2
3
4
Sub Blablabla()
    Print "hello world"
    ' любые другие операторы
End Sub
Не знали что так можно?
0
Эксперт по электронике
7139 / 3319 / 341
Регистрация: 28.10.2011
Сообщений: 13,040
Записей в блоге: 7
28.06.2024, 20:23
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Причем здесь алгоритм быстрой сортировки который валится на большом массиве.
Я где-то писал про быструю сортировку?

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Не всегда можно предусмотреть всё на этом этапе.
Тоже можно сказать и про другие виды ошибок. При вашем методе они тоже будут.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
1. присваивание собственно значение адреса блока данной переменной, и
2. переход на этот адрес.
Почему присваивание должно приводить к переходу?
Какой-то странный ЯП разрабатываете. Это точно не бейсик!
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
29.06.2024, 00:13
Цитата Сообщение от Замабувараев Посмотреть сообщение
Это же настраивается, до 2 гигабайт можно резервировать под стэк.
Т.е. это не будешь считать bloatware? Кстати ты пробовал заводить 2 гигабайта?
32 битка XP\2000 заведёт? А если у человека винда 10-я и 4 Гб памяти на компе,
я в офисах видел такие компы. Они половину своего рабочего времени в свопе
и тут такое. Но и что за задача которая потребует столько стека?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Итеративный обход дерева не обладает такой простотой и элегантностью.
Простота в типовом случае - это не простота в общем. Бинарное дерево частный случай.
На самом деле не вижу элегантности в сжирании стека и в тратах тактов на вызов.
Наверное это не так критично для сканирования жёсткого диска, но для чего-то
другого может быть критично. Ну да если задача дерево тупо обойти - да, покатит.
В каких-то суровых алгоритмах природа которых - состояния(зависящие от множества факторов),
это не стал бы применять.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Зачем? Оптимизирующий компилятор сам развернёт
Ну да, если оптимизирующий, а если нет? Но дело не в этом. Зачем? - Для обхода идеологии рекурсии,
вычислительный(в т.ч. логический) код, который можно сделать на независимых состояниях в строго
рекурсионном виде становится зависимый, сам принцип рекурсии(сводить "сложную" задачу к однотипным простым)
подразумевает преобразование кода в подобный вид. И это сложно отлаживаемая хрень, по
аналогии с тем, за что топит хулиган. Сложно отлаживаемая она при разработке, а не когда ты
уже такой красавец всё написал и показываешь как всё красиво.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вы уверены что ваша прога сможет всегда оставаться в пределах заданным компилятором
Да ни в чём они не уверены. Люди перебивают готовые алгоритмы(такие как сканирование директорий),
которые уже есть в интернете.
И только один из отписавшихся попытался напрячь мозг и что-то развернуть.
Если постоянно говорить про велосипеды и как всё уже хорошо(а оно нихрена не хорошо), то кто
будет в принципе делать что-то лучше, да и вообще что-то делать. Это застой.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Например, быстрая сортировка — это рекурсивный алгоритм.
А что если BigData? Покатит? Вижу никто особо не прикидывал что там со стеком в худшем случае.
Мол это дормовая какая-то память.
А если надо портировать прогу в ограниченные условия, под микроконтроллер или под тот же DOS?
Там гигабайты уже не выделишь.

Цитата Сообщение от Mikle Quits Посмотреть сообщение
Если ты её изучил, но никогда не пользуешься, то и навыка на взгляд понимать, что тут к чему, не будет.
Дело не в навыке, изучил давно, когда ещё не было всех этих модных словечек "хвостовая" "нелинейная" и т.п.,
а не использую сознательно, во-первых, потому что могу себе это позволить(в отличии от тех, кто даже
не пытался), а во-вторых уже давно наелся кода, который никак не модифицировать, вывалят тебе это
говно никак не комментированное, с кучей "магических чисел" и сиди разгребай, сложного кода,
который в трубку мозг сворачивает и не всё так очевидно бывает как в примере от Замабувараева.
Я тебе написал что твой пример без компа люди не смогут оттрассировать в голове и даже примерно понять
Проведи этот эксперимент, не объясняя никому ничего и удивись.
Всё чего хочу - чтобы люди не выпендривались и писали максимально просто для других людей и вообще
осознанно это делали, а не потому что в интернете увидели какой-то приём программирования "лаконичный"
или "элегантный".
Линейный итеративный вид максимально гибок на любых видах алгоритмов, если выбирать скажем между
эталонной рекурсией по идеологии рекурсии и кодом на состояниях, то однозначно линейный код.
Потому что каждое состояние можно "поймать", остановить итерации, покрутить в памяти, всё прикинуть
на 100% и сделать это по отдельности. Более того изолированные - они подлежат осмыслению бошкой,
с этим человек может работать без компа, т.е. создавать сам алгоритм, сложный из простых кусков.

Но без оформления и комментирования - любой код будет парашей как не пиши.
Стековые алгоритмы к слову не самые простые. Стек вообще довольно интересная структура
многие штуки позволяет делать.

Добавлено через 23 минуты
Цитата Сообщение от Замабувараев Посмотреть сообщение
А вот и нет, через секунду другая программа (браузёр) съела эти гигабайты, и ваши сведения о свободной памяти устарели. Я надеюсь, ваша программа написана ответственно и умеет обрабатывать такие ошибки.
Vivaldi браузер не умеет обрабатывать такие ошибки, намертво зависает, плюс сильно вешает систему,
приходится пришибать его. Что из-за памяти как бы понятно.
При этом если смотреть по диспетчеру - свободных гигабайт ещё хватает. Файл подкачки выключен,
т.к. такое дерьмо как своп хронически не переношу, лучше пусть упадёт чем буду ждать пол часа пока
оно просрётся.
GIMP 2.8(много лет разработки) не умеет обрабатывать такие ошибки - падает.
Ждём живичного ответственного кодинга в массах, долго ждём уже. Надеюсь начнут)))

Добавлено через 3 часа 14 минут
Цитата Сообщение от locm Посмотреть сообщение
Почему присваивание должно приводить к переходу?
Какой-то странный ЯП разрабатываете.
Я там вообще ничерта не понял из того, что хулиган прототипирует. Какая-то дичь.
Словесно у него донести походу не получилось.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2024, 00:13

Coodo Games & Datcroft Games 3d Artist (Самара)
В Самарский офис требуется талантливый разработчик. 
О нас: - Мы разрабатываем только лучшие игры. Наши запущенные продукты:...

Coodo Games & Datcroft Games Lead Java Developer / Team Lead
Для решения задач, связанных с разработкой серверной части казино игр, нам в команду требуется сильный Java developer. Помимо технических...

Выполнить следующие операции в двоичной системе счисления: 10101,10101+1001,0011 101110,101-101,11 1011*111 1010101
Прямой, обратный и дополнительный коды двоичных чисел, их использование в двоичной арифметике. Выполнить с использованием кодов двоичных...

Даны действительные числа x1,…,x101, y1…,y101. Получить действительные x'1,…,x'101, y'1,…,y'101
Написать код в Free Pascal. Помогите, пожалуйста! Даны действительные числа x1,…,x101, y1…,y101. Получить действительные x'1,…,x'101,...

Bsod - *50,*3B, *101, *101
Доброго времени суток. Началось все после того как снял 2ю GTX 550 Ti(SLI) и немного разогнал оставшуюся(GPU c 900 до 1000, память с...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru