powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная со-программа
4 сообщений из 54, страница 3 из 3
Тяпничная со-программа
    #39296673
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С примером fixxer сегодня не успвеваю. Но вот пока есть порт с С на Scala.
Здесь yield return был-бы удобен тем что ничего кардинально переписывать не нужно.
Почти любой алгоритм существует в классическом императивном (а не списковом) виде
и мне как человеку достаточно ленивому можно было-бы в идеале сделать косметический
реплейсмент.

Код: java
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.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
package mayton.image

object ScalaMain {

  val u = 1

  var glx: Int = 0
  var gly: Int = 0

  def linerel(x: Int, y: Int) {
    glx += x
    gly += y
    printf("%d,%d\n", glx, gly)
  }

  def moveto(x: Int, y: Int) {
    glx = x
    gly = y
    printf("%d,%d\n", glx, gly)
  }

  def a(i: Int) {
    if (i > 0) {
      d(i - 1)
      linerel(+u, 0)
      a(i - 1)
      linerel(0, u)
      a(i - 1)
      linerel(-u, 0)
      c(i - 1)
    }
  }

  def b(i: Int) {
    if (i > 0) {
      c(i - 1)
      linerel(-u, 0)
      b(i - 1)
      linerel(0, -u)
      b(i - 1)
      linerel(u, 0)
      d(i - 1)
    }
  }

  def c(i: Int) {
    if (i > 0) {
      b(i - 1)
      linerel(0, -u)
      c(i - 1)
      linerel(-u, 0)
      c(i - 1)
      linerel(0, u)
      a(i - 1)
    }
  }

  def d(i: Int) {
    if (i > 0) {
      a(i - 1)
      linerel(0, u)
      d(i - 1)
      linerel(u, 0)
      d(i - 1)
      linerel(0, -u)
      b(i - 1)
    }
  }

  def flp2(arg1: Int): Int = {
    var x = arg1
    x = x | (x >> 1)
    x = x | (x >> 2)
    x = x | (x >> 4)
    x = x | (x >> 8)
    x = x | (x >> 16)
    x - (x >> 1)
  }

  def clp2(arg1: Int): Int = {
    var x = arg1
    x = x - 1
    x = x | (x >> 1)
    x = x | (x >> 2)
    x = x | (x >> 4)
    x = x | (x >> 8)
    x = x | (x >> 16)
    x + 1
  }

  def nlz(arg1: Int): Int = {
    var n: Int = 0
    var x = arg1
    if (x == 0){
      return 32
    }
    n = 1
    if ((x >> 16) == 0) {
      n += 16
      x <<= 16
    }
    if ((x >> 24) == 0) {
      n += 8
      x <<= 8
    }
    if ((x >> 28) == 0) {
      n += 4
      x <<= 4
    }
    if ((x >> 30) == 0) {
      n += 2
      x <<= 2
    }
    n = n - (x >> 31)
    n
  }

  def log2up(x: Int): Int = {
    if (x < 1)
      0
    else
      32 - nlz(x - 1)
  }

  def main(args: Array[String]): Unit = {


    if (args.length == 0) {

      printf("\nGilbert Route 1.0 (c) Mayton and SQL.RU. Written in 'Scala' :)\n")
      printf("\nUsage: gilbertroute [ { level=N | size=M } [binaryout]] [help]\n")
      printf("\nWhere:\n")
      printf("\n       M          : { 32 | 64 | 128 | 256 ... etc powers of two} ")
      printf("\n       N          : { 1,2,3...}")
      printf("\n")
      System.exit(-1)

    } else {

      var level:Int = -1
      var size:Int = -1
      val arg1 = args(0)

      if (arg1.substring(0,5) == "size="){
        val size:Int = arg1.substring(5).toInt
        if (size<=0){
          printf("\nGilbertroute: Error! Argument size cannot be zero or negative.\n")
          System.exit( -3 )
        }
        level = MathUtils.log2up(size)
      } else if (arg1.substring(0,6)=="level="){
        level = arg1.substring(6).toInt
        if (level<0){
          printf("\nGilbertroute: Error! Argument level cannot be negative.\n")
          System.exit( -3 )
        }
      }

      if (level>=0){
        moveto(0, 0)
        a(level)
        System.exit( 0 )
      } else {
        printf("\nGilbertroute: Error! Unrecognized argument.\n")
        System.exit( -2 )
      }
    }

  }
}

...
Рейтинг: 0 / 0
Тяпничная со-программа
    #39298977
Serg_77m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПоддержка со-программ в ЯП
LanguageCo-routines supportCno support
Для C есть Portable Coroutine Library (PCL)
А ещё в C возможен такой трюк (для меня это было открытием).

kealon(Ruslan)языковых конструкций нету, я же говорю делал нитевидную многозадачность под досом выделялась память под стэк и проца yield, которая меняла регистр SP на доступные стэки.
Сомневаюсь что так можно под виндой сделать, хотя попробовать не мешает ...Только что проверил под Linux (gcc x86). Внутри функции ассемблерной вставкой можно запросто поменять значение esp, поставив его на буфер, выделенный malloc'ом. Причём, функция после этого продолжает видеть свои параметры, и нормально завершается по return. Теперь добавить куда-нибудь в начало longjmp, в точках yield return вставить setjmp, и задача почти решена... кажется, так оно и сделано в PCL. Только там ассемблерных вставок нет, но есть хакерские манипуляции с jmp_buf.
...
Рейтинг: 0 / 0
Тяпничная со-программа
    #39299021
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_77m, это мегакруто. PCL.

Но КМК это левел библиотеки а не языка.
...
Рейтинг: 0 / 0
Тяпничная со-программа
    #39299077
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_77mТолько что проверил под Linux (gcc x86). Внутри функции ассемблерной вставкой можно запросто поменять значение esp, поставив его на буфер, выделенный malloc'ом. Причём, функция после этого продолжает видеть свои параметры, и нормально завершается по return. Теперь добавить куда-нибудь в начало longjmp, в точках yield return вставить setjmp, и задача почти решена... кажется, так оно и сделано в PCL. Только там ассемблерных вставок нет, но есть хакерские манипуляции с jmp_buf.
Оптимизацию включи.

Оптимизм то и выключится
...
Рейтинг: 0 / 0
4 сообщений из 54, страница 3 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная со-программа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]