Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как создать массив без дженерика? / 15 сообщений из 15, страница 1 из 1
13.06.2021, 15:04
    #40077412
Ольга2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Нашла пример в интернете который нужно реализовать но так получилось, что Delphi 7 версия и не поддерживает дженерик коллекции как по другому записать массив вот пример.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function Test(const C: Char; const Buffer,BufLen,StartPos: Integer): Integer;
var
  CurrentByte: Byte;
  CurrentLen: Integer;
begin
  CurrentLen := StartPos;

  while CurrentLen <= BufLen do
  begin
    CurrentByte := TArray<Byte>(@Buffer)[CurrentLen];

   // if (CurrentByte = ord(#9)) or (CurrentByte = ord(#10)) or (CurrentByte = ord(#13)) or (CurrentByte = ord(#32)) then
  //  begin
  //    exit(CurrentLen);
  //  end;

   // inc(CurrentLen);
  end;

  //if CurrentLen = BufferLen then
   // exit(-1);
end;


Вот эта строчка не работает
Код: pascal
1.
CurrentByte := TArray<Byte>(@Buffer)[CurrentLen];
...
Рейтинг: 0 / 0
13.06.2021, 15:13
    #40077414
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Ольга2Вот эта строчка не работает

Она в принципе неработоспособна, ищи другой пример. Ну или пиши код самостоятельно, он
примитивный, уровня первого курса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.06.2021, 16:19
    #40077425
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Ольга2,
что-то примерно так:
Код: pascal
1.
2.
3.
4.
var
  BufAsByte: Array of Byte absolute Buffer;
...
  CurrentByte := BufAsByte[CurrentLen];
...
Рейтинг: 0 / 0
13.06.2021, 16:55
    #40077426
Ольга2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Dimitry Sibiryakov

Ольга2Вот эта строчка не работает

Она в принципе неработоспособна, ищи другой пример. Ну или пиши код самостоятельно, он
примитивный, уровня первого курса.

На самом деле полностью код выглядит вот так:
Код: pascal
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.
function Test(var Buffer; BufferLen, Offset: Cardinal): Integer;
var
  CurrentByte: Byte;
  CurrentLen: Cardinal;
begin
  CurrentLen := Offset;
 
  while CurrentLen <= BufferLen do
  begin
    CurrentByte := TArray<Byte>(@Buffer)[CurrentLen];
 
    if (CurrentByte = ord(#9)) or (CurrentByte = ord(#10)) or (CurrentByte = ord(#13)) or (CurrentByte = ord(#32)) then
    begin
      exit(CurrentLen);
    end;
 
    inc(CurrentLen);
  end;
 
  if CurrentLen = BufferLen then
    exit(-1);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Str: PAnsiChar;
begin
  Str := 'Test My Buffer';
 
  ShowMessage(Test(Str[0], Length(Str), 0).ToString);
 
end;
...
Рейтинг: 0 / 0
13.06.2021, 17:19
    #40077428
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Ольга2,

А какая конечная цель? Это какая-то лабораторная или реальный проект? Задача то решается, но хочется понять цель. Потому, что первое, что приходит в голову, это сделать так
Код: pascal
1.
function Test(const Buffer: string; Offset: Cardinal): Integer;
...
Рейтинг: 0 / 0
13.06.2021, 20:50
    #40077433
Ольга2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
_Vasilisk_
Ольга2,

А какая конечная цель? Это какая-то лабораторная или реальный проект? Задача то решается, но хочется понять цель. Потому, что первое, что приходит в голову, это сделать так
Код: pascal
1.
function Test(const Buffer: string; Offset: Cardinal): Integer;


Исходный код взятый с сайта delphisourcesource , пытаюсь разобраться с тем участком кода где ассемблер и переписать на delphi7, я уже нашла разбор примера на другом форуме и пытаюсь переделать под себя, чтобы на delphi7 работала.
Вариант предложенный Cobalt747
Код: pascal
1.
2.
3.
4.
var
  BufAsByte: Array of Byte absolute Buffer;
...
  CurrentByte := BufAsByte[CurrentLen];


подходит, и работает без дженерика.

Только вот еще проблема заключается в несовместимости версий delphi на семерке, код предоставленный ниже не работает.
Код: pascal
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.
function Test(var Buffer; BufferLen, Offset: Cardinal): Integer;
type
  TypeString = char;
var
  CurrentByte: Byte;
  BufAsByte: Array of Byte absolute Buffer;
  CurrentLen: Cardinal;
  SkipDoubleQuotes: Boolean;
begin
  SkipDoubleQuotes := false;
 
  CurrentLen := Offset;
  while CurrentLen <= BufferLen do
  begin
// заменили CurrentByte := TArray<TypeString>(@Buffer)[CurrentLen]; на CurrentByte :=  BufAsByte[CurrentLen];
    CurrentByte :=  BufAsByte[CurrentLen];
    inc(CurrentLen);
 
   if SkipDoubleQuotes then
    begin
      case CurrentByte of
        '"', '''':
          begin
            if TArray<TypeString>(@Buffer)[CurrentLen - 2] = '\' then
              Continue;
 
            SkipDoubleQuotes := false;
          end;
      end;
    end
    else
      case CurrentByte of
        #9, #10, #13, #32:
        begin
          Result:=CurrentLen;
          exit;
        end;
        '"', '''':
          SkipDoubleQuotes := true;
      end;
  end;
  Result:=-1;
  exit;
end;


Там где условие case, выборка происходит ковычек появляется сообщение об ошибке.
1. [Error] Unit1.pas(69): Incompatible types: 'Byte' and 'Char'
2. TArray<TypeString>(@Buffer)[CurrentLen - 2] = '\ выдает сообщение [Error] Unit1.pas(71): Undeclared identifier: 'TArray'
3. #9, #10, #13, #32: - Incompatible types: 'Byte' and 'Char'
4. '"', '''': - выдает Incompatible types: 'Byte' and 'Char'.
Все эти ошибки появляются из-за того что код был написан на более новой версии delphi, у меня семерка. Как переписать на семерку?
...
Рейтинг: 0 / 0
13.06.2021, 23:36
    #40077438
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Ольга2
Исходный код взятый с сайта delphisourcesource , пытаюсь разобраться с тем участком кода где ассемблер и переписать на delphi7
Вы так и не ответили на вопрос
_Vasilisk_
А какая конечная цель?
...
Рейтинг: 0 / 0
13.06.2021, 23:45
    #40077439
Ольга2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
_Vasilisk_,
Я ответила на вопрос, вот он?
Ольга2пытаюсь разобраться с тем участком кода где ассемблер и переписать на delphi7
...
Рейтинг: 0 / 0
14.06.2021, 00:25
    #40077441
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Ольга2Я ответила на вопрос

Повторяю свой предложение перестать гуглить такую примитивную функцию и написать её
самостоятельно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.06.2021, 01:20
    #40077442
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Ольга2

Исходный код взятый с сайта delphisourcesource ,

Они за него ещё и денег хотят?.. Серьёзно?
Dimitry Sibiryakov

Повторяю свой предложение перестать гуглить такую примитивную функцию и написать её
самостоятельно.

Там не примитивная функция, там парсер HTML тегов, как я понял.
...
Рейтинг: 0 / 0
14.06.2021, 09:50
    #40077456
b0rk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
если очень хочется массив
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type
  TByteArray = array[0..3] of Byte;
  PByteArray = ^TByteArray;
var
  i: Integer;
  Buffer: Integer;
begin
  Buffer := $01020304;
  for i := Low(TByteArray) to High(TByteArray) do
    ShowMessage(IntToStr(PByteArray(@Buffer)[i]));
end;



можно и без массива
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  PStart: PByte;
  PEnd: PByte;
begin
  PStart := @Buffer;
  PEnd := Pointer(NativeUInt(PStart) + BufLen);
  while PStart < PEnd do begin
    ShowMessage(IntToStr(PStart^));
    Inc(PStart);
  end;
end;
...
Рейтинг: 0 / 0
14.06.2021, 12:47
    #40077482
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
alekcvpТам не примитивная функция, там парсер HTML тегов, как я понял.

Совершенно всё равно что "там". В этом топике она спрашивает о примитивном FirstDelimiter.

Хотя написать парсер целиком тоже было бы полезно для саморазвития. Он тоже не ахти какая
rocket scence.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.06.2021, 07:14
    #40077562
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
_Vasilisk_
Ольга2,

А какая конечная цель? Это какая-то лабораторная или реальный проект? Задача то решается, но хочется понять цель. Потому, что первое, что приходит в голову, это сделать так
Код: pascal
1.
function Test(const Buffer: string; Offset: Cardinal): Integer;


Начались вредные советы?
При переходе на Юникод будете еще долго вылавливать проблемы
...
Рейтинг: 0 / 0
15.06.2021, 11:48
    #40077602
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
Cobalt747
При переходе на Юникод будете еще долго вылавливать проблемы
Какие, например?
...
Рейтинг: 0 / 0
15.06.2021, 11:51
    #40077603
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив без дженерика?
О пользе чтения документации. ("Инструкции? Кто их читает?!"). Если бы Ольга2 открыла/открыл в справке (документации) по языку Delphi раздел про процедуры и функции и подраздел про параметры, то могла бы в пункте про нетипизированные параметры прочитать решение своей проблемы. Примерно как b0rk написал, но с учетом того, что буфер может быть длиннее, чем 4 байта, то объявить массив размера с запасом.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function Test(var Buffer; BufferLen, Offset: Cardinal): Integer;
type
  TByteArr = array[0 .. MaxInt - 1] of byte;
var
  CurrentByte: Byte;
  CurrentLen: Cardinal;
begin
  CurrentLen := Offset;
 
  while CurrentLen <= BufferLen do
  begin
    CurrentByte := TByteArr(Buffer)[CurrentLen];
 
    if (CurrentByte = ord(#9)) or (CurrentByte = ord(#10)) or (CurrentByte = ord(#13)) or (CurrentByte = ord(#32)) then
    begin
      exit(CurrentLen);
    end;
 
    inc(CurrentLen);
  end;
 
  if CurrentLen = BufferLen then
    exit(-1);
end;



Cobalt747Начались вредные советы?
При переходе на Юникод будете еще долго вылавливать проблемы Чреват проблемами код ТС, т.к. сравнение идет побайтно, а не посимвольно.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как создать массив без дженерика? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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