goto - с любимыми не расставайтесь, или break не тащит

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 02.11.2020 20:12:39

скалогрыз писал(а):заинтересовался этим вопросом

— SizeUint — эквивалент size_t в C++, где его принято использовать для индексов (в частности, контейнерами стандартной библиотеки) по очевидной причине: High(Size(U)Int) — теоретический предел размера массива, и в предположении, что элемент массива занимает минимум 1 байт, это и предел числа элементов.

— RTL определяет TDynArrayIndex = SizeInt и предполагает его, в частности, типом длины, хранящейся в заголовке динамического массива. А понятия длины и индекса взаимозаменяемы: индекс — это длина массива перед ним, или длина — это индекс элемента «за последним».
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 498
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение скалогрыз » 02.11.2020 20:32:18

runewalsh писал(а):RTL определяет TDynArrayIndex = SizeInt и предполагает его, в частности, типом длины, хранящейся в заголовке динамического массива. А понятия длины и индекса взаимозаменяемы: индекс — это длина массива перед ним, или длина — это индекс элемента «за последним»

вполне убедительно
скалогрыз
долгожитель
 
Сообщения: 1756
Зарегистрирован: 03.09.2008 02:36:48

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 03.11.2020 13:04:26

Seenkao писал(а):это называется разработка кода на глаз...:roll:

Анекдот про соль на глаз знаешь?
Ты вот не отмазывайся, а просто задумайся:
если человек не знает как может выглядеть пузырьковая сортировка на языке, которым пользуется, то что же он знает о программировании вообще?
iskander
постоялец
 
Сообщения: 382
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Seenkao » 03.11.2020 17:28:53

iskander, я так понимаю, это камень в мой огород? :?
Я смотрю, ты в жизни ни когда не ошибался и всё делал с выверенной точностью!? И, я так понимаю, ты мне сейчас прямо в чате (даже не в блокноте! А именно здесь, пользуясь только этим чатом!) за пять минут сварганишь программку, поиска хода конём (ты ведь её знаешь наизусть), а мы запустим и проверим, как она работает.
Seenkao
постоялец
 
Сообщения: 162
Зарегистрирован: 01.04.2020 03:37:12

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 03.11.2020 17:57:13

О каком камне речь? Мне казалось всего лишь пожелание. Впрочем, уже видно, что напрасное.
iskander
постоялец
 
Сообщения: 382
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Seenkao » 03.11.2020 19:59:12

iskander, это интернет, не всякий твой посыл доходит должным образом. Точнее даже большинство не доходят.
Я иногда так изголяюсь, чтоб людям написать и чтоб более-менее понятно было, и всё равно они понимают не так, как я формулировал. )))
Seenkao
постоялец
 
Сообщения: 162
Зарегистрирован: 01.04.2020 03:37:12

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 04.11.2020 18:46:53

Seenkao писал(а):iskander, это интернет

А мужики не знали?
Seenkao писал(а):Я иногда так изголяюсь

Должен заметить, что слова "изголяться" в русском языке я не нашёл, ну да ладно, вот это
Seenkao писал(а):программку, поиска хода конём

означает "Knight's tour" или что-то иное?
iskander
постоялец
 
Сообщения: 382
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Сквозняк » 04.11.2020 22:16:04

Прицепились к этому пузырьку, который представляет собой квадратичную функцию с обработкой исключений через goto. А если сортировать массивы с длиной int64, то для компиляции в 32 бита циклы for придётся заменять на циклы goto. Такое в fpc ограничение.
Код: Выделить всё
{$MODE FPC}
{$GOTO ON}
{$R+}

CONST
AA3: ARRAY[0..14] OF BYTE=(21,45,4,0,1,0,54,111,6,21,167,255,1,3,14);
VAR
ZZ3:  ARRAY OF BYTE;
Q2,W2: LONGINT;

PROCEDURE BUBLESORT1(VAR BB3: ARRAY OF BYTE);//СОРТИРОВКА МАССИВА ПО ВОЗРАСТАНИЮ
VAR
Q3: BYTE;
A2,S2,D2: LONGINT;
LABEL
100;
BEGIN
S2:=LENGTH(BB3);
IF S2<2 THEN GOTO 100;
IF S2=2 THEN BEGIN
   IF BB3[1]<BB3[0] THEN BEGIN
      Q3:=BB3[1];
      BB3[1]:=BB3[0];
      BB3[0]:=Q3;
                         END;
   GOTO 100;
             END;
S2:=S2-2;
FOR D2:=0 TO S2 DO
  FOR A2:=0 TO S2 DO IF BB3[A2]>BB3[A2+1] THEN BEGIN
      Q3:=BB3[A2+1];
      BB3[A2+1]:=BB3[A2];
      BB3[A2]:=Q3;   
                                               END;
100:
END;

BEGIN
ZZ3:=AA3;
W2:=LENGTH(ZZ3);
WRITELN;
FOR Q2:=0 TO W2-1 DO WRITE(ZZ3[Q2],',');
WRITELN;
BUBLESORT1(ZZ3);//СОРТИРОВКА МАССИВА ПО ВОЗРАСТАНИЮ
W2:=LENGTH(ZZ3);
FOR Q2:=0 TO W2-1 DO WRITE(ZZ3[Q2],',');
WRITELN;
END.

И вот как выглядит тот же самый код для 32 битных систем, можете добавлять в вики.
Код: Выделить всё
{$MODE FPC}
{$GOTO ON}
{$R+}

CONST
AA3: ARRAY[0..14] OF BYTE=(21,45,4,0,1,0,54,111,6,21,167,255,1,3,14);
VAR
ZZ3:  ARRAY OF BYTE;
Q64,W64: INT64;
LABEL
1,2;

PROCEDURE BUBLESORT1(VAR BB3: ARRAY OF BYTE);//СОРТИРОВКА МАССИВА ПО ВОЗРАСТАНИЮ
VAR
Q3: BYTE;
A64,S64,D64: LONGINT;
LABEL
1,2, 100;
BEGIN
S64:=LENGTH(BB3);
IF S64<2 THEN GOTO 100;
IF S64=2 THEN BEGIN
   IF BB3[1]<BB3[0] THEN BEGIN
      Q3:=BB3[1];
      BB3[1]:=BB3[0];
      BB3[0]:=Q3;
                         END;
   GOTO 100;
             END;
S64:=S64-2;
D64:=-1;
1:
INC(D64);
A64:=-1;
2:
INC(A64);
IF BB3[A64]>BB3[A64+1] THEN BEGIN
      Q3:=BB3[A64+1];
      BB3[A64+1]:=BB3[A64];
      BB3[A64]:=Q3;   
                            END;
IF A64<S64 THEN GOTO 2;
IF D64<S64 THEN GOTO 1;
100:
END;

BEGIN
ZZ3:=AA3;
W64:=LENGTH(ZZ3);
DEC(W64);
Q64:=-1;
WRITELN;
1:
INC(Q64);
WRITE(ZZ3[Q64],',');
IF Q64<W64 THEN GOTO 1;
WRITELN;
BUBLESORT1(ZZ3);//СОРТИРОВКА МАССИВА ПО ВОЗРАСТАНИЮ
W64:=LENGTH(ZZ3);
DEC(W64);
Q64:=-1;
2:
INC(Q64);
WRITE(ZZ3[Q64],',');
IF Q64<W64 THEN GOTO 2;
WRITELN;
END.
Сквозняк
энтузиаст
 
Сообщения: 799
Зарегистрирован: 29.06.2006 22:08:32

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 04.11.2020 22:31:31

Сквозняк писал(а):А если сортировать массивы с длиной int64, то для компиляции в 32 бита

Не волнуйся об этом, в 32 битах массив НЕ МОЖЕТ иметь int64-длину.
Если тебе всё же нужен аналог for с int64-счётчиком на 32-битной платформе, заменой будет не прости-господи-goto, а while.
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 498
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Сквозняк » 04.11.2020 22:53:15

runewalsh писал(а):Если тебе всё же нужен аналог for с int64-счётчиком на 32-битной платформе, заменой будет не прости-господи-goto, а while.

Почему он будет, если практически никогда не применяется? Для замены в первую очередь используется то, что применяется, а while используется только при чтении и правке чужого кода.

Добавлено спустя 14 минут 39 секунд:
runewalsh писал(а):Не волнуйся об этом, в 32 битах массив НЕ МОЖЕТ иметь int64-длину.


Это смотря какой. Внешний массив может хоть терабайтами измеряться. Например, на 32 битах шерститить циклом for внешний файл читая его фрагменты, подгружаемые по мере необходимости.
Сквозняк
энтузиаст
 
Сообщения: 799
Зарегистрирован: 29.06.2006 22:08:32

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 05.11.2020 01:15:57

Сквозняк писал(а):while используется только при чтении и правке чужого кода.

Ты так говоришь «только», будто 99,99999% кода в мире — твои (и используют goto вместо while), а не наоборот.
Сквозняк писал(а):Внешний массив может хоть терабайтами измеряться.

Не-не-не, речь шла про *сортировку массива* (более того, *пузырьком*) Перечитай сам себя:
Сквозняк писал(а):Прицепились к этому пузырьку, который представляет собой квадратичную функцию с обработкой исключений через goto. А если сортировать массивы с длиной int64, то для компиляции в 32 бита циклы for придётся заменять на циклы goto.

Cортировку массива во внешнем хранилище ты будешь делать другими алгоритмами, чем сортировку массивов в памяти со случайным доступом.
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 498
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Seenkao » 05.11.2020 10:20:41

runewalsh писал(а):Cортировку массива во внешнем хранилище ты будешь делать другими алгоритмами, чем сортировку массивов в памяти со случайным доступом.
не совсем понимаю, что мешает загрузить данный "массив" в память? Кроме объёма памяти.
iskander писал(а):в русском языке я не нашёл

iskander писал(а):"Knight's tour"

мы можем долго перекидываться словами, но слово "изголяться" ("изгаляться") более понятно на русском чем фраза брошенная на английском. Будешь придираться к словам, тогда лучше детей иди в школу учи русскому языку! Что-то не нравится, пиши в личку, там "поругаемся", не фиг тут всякую фигню выкладывать, показывая своё серое вещество в работе.
iskander писал(а):означает "Knight's tour" или что-то иное?

я не вижу кода, написанного за 5 минут.
Seenkao
постоялец
 
Сообщения: 162
Зарегистрирован: 01.04.2020 03:37:12

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение iskander » 05.11.2020 10:41:59

Ну, не стану уверять, что за пять, но держи, дарю:
Код: Выделить всё
program knight_tour;

{$mode objfpc}{$H+}

uses
  SysUtils, lgUtils, lgSparseGraph, lgSimpleGraph;

type
  TSolver = class
  private
  const
    FindSpan = 5;
  var
    FGraph: TStrChart;
    function CreateKnightGraph: TStrChart;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Solve;
  end;

  TKnightTourSolver = specialize TGAutoRef<TSolver>;

function TSolver.CreateKnightGraph: TStrChart;
const
  CellChars: array[1..8] of AnsiChar = 'abcdefgh';
var
  Brd: array[1..8, 1..8] of string;

  procedure TryAddEdge(x0, y0, x1, y1: Integer);
  begin
    if (x1 >= 1) and (x1 <= 8) and (y1 >= 1) and (y1 <= 8) then
      Result.AddEdge(Brd[x0, y0], Brd[x1, y1]);
  end;
var
  Cell: string;
  I, J: Integer;
begin
  Result := TStrChart.Create;
  for I in [1..8] do
    for J in [1..8] do begin
      Cell := CellChars[I] + J.ToString;
      Brd[I, J] := Cell;
      Result.AddVertex(Cell);
    end;
  for I in [1..8] do
    for J in [1..8] do begin
      TryAddEdge(I, J, I - 1, J - 2);
      TryAddEdge(I, J, I + 1, J - 2);
      TryAddEdge(I, J, I + 1, J + 2);
      TryAddEdge(I, J, I - 1, J + 2);
      TryAddEdge(I, J, I - 2, J - 1);
      TryAddEdge(I, J, I + 2, J - 1);
      TryAddEdge(I, J, I + 2, J + 1);
      TryAddEdge(I, J, I - 2, J + 1);
    end;
end;

constructor TSolver.Create;
begin
  FGraph := CreateKnightGraph;
end;

destructor TSolver.Destroy;
begin
  FGraph.Free;
  inherited;
end;

procedure TSolver.Solve;
var
  Src, I: SizeInt;
  PathVec: TIntArrayVector;
  Path: TIntArray;
begin
  Src := Random(FGraph.VertexCount);
  if not(FGraph.FindHamiltonPathsI(Src, 1, PathVec, FindSpan) and
         FGraph.IsHamiltonPath(PathVec[0], Src)) then begin
    WriteLn('Couldn''t find any solution within ', FindSpan, ' s');
    exit;
  end;
  WriteLn('Found the first tour from cell ', FGraph[Src], ':');
  Path := PathVec[0];
  for I := 0 to Length(Path) - 2 do
    Write(FGraph[Path[I]], '-');
  WriteLn(FGraph[Path[High(Path)]]);
end;

var
  Solver: TKnightTourSolver;

begin
  Randomize;
  Solver.Instance.Solve;
{$ifdef mswindows}
  ReadLn;
{$endif}
end.

Добавь LGenerics в зависимости.

Добавлено спустя 21 минуту 7 секунд:
Seenkao писал(а):тогда лучше детей иди в школу учи русскому языку!

Ты не поверишь, я когда-то так и делал.
iskander
постоялец
 
Сообщения: 382
Зарегистрирован: 08.01.2012 18:43:34

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение runewalsh » 05.11.2020 12:46:50

Seenkao писал(а):не совсем понимаю, что мешает загрузить данный "массив" в память? Кроме объёма памяти.

Сам понял, что сказал?
>Не совсем понимаю, что мешает мокрицам летать? Кроме отсутствия крыльев.
32-битное приложение — то, в котором for имеет багофичу неподдерживания int64 — принципиально не увидит (не адресует) больше 4, а то и 2, Гб памяти. Так что индекс любого элемента любого массива в памяти поместится в 32-битное число. Я это с самого начала сказал.
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 498
Зарегистрирован: 27.04.2010 00:15:25

Re: goto - с любимыми не расставайтесь, или break не тащит

Сообщение Seenkao » 05.11.2020 18:02:11

iskander писал(а):Ну, не стану уверять, что за пять, но держи, дарю:

Seenkao писал(а):И, я так понимаю, ты мне сейчас прямо в чате (даже не в блокноте! А именно здесь, пользуясь только этим чатом!)
думаю дальше продолжать не надо. Одно то, что её запускаешь и она без ошибок запускается, показывает, что наобум ты программу написать не можешь. А уж "опозорится" пред всеми, что можешь допустить ошибки тем более.
Молодец! Программу сделал. Но не засчитано, потому что сделана программа не в этом чате.
Не тебе её проверять надо было, а другим.
Напоминаю, ту программу пузырьком, я просто набрал в чате здесь, ни где не проверяя и не выверяя.

runewalsh, что мешает грузить кусок за куском? (это идиотизм конечно, но кто мешает это делать??? :) ) берём кусок, сортируем, ещё кусок, сортируем и так до упора. (не верно выразился изначально)
По идее это вообще ни кому нафиг не надо. Большинство уложатся в разумные пределы массива.
Seenkao
постоялец
 
Сообщения: 162
Зарегистрирован: 01.04.2020 03:37:12

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: Alex2013 и гости: 5

Рейтинг@Mail.ru