Решено: Кроссплатформеность проекта - как ее добиться?

Вопросы программирования и использования среды Lazarus.

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

Re: Кроссплатформеность проекта - как ее добиться?

Сообщение vitaly_l » 18.11.2015 20:35:39

azsx писал(а):почему то не превышает.

Превышает, просто Вы этого не видите. Уберите random и увидите, что: в length(stroka)+1 ===> +1 <=== это лишний код.
azsx писал(а):наверное как в пуре С, нулевой байт на конце строки.

Ага, там ноль. Он Вам нужен? А когда вы читаете стринг stroka[0] ?
Попробуйте посмотрите чего она Вам скажет: на stroka[0]?
У меня ругается а у Вас?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение bormant » 18.11.2015 21:10:28

azsx,
весь проект вокруг одной функции строится?
Код: Выделить всё
function GenPassword(const Chars: String, n: Integer): String;
var i: Integer;
begin
  Result:='';
  if n>0 then begin
    SetLength(Result,n);
    for i:=1 to n do
      Result[i]:=Chars[Random(Length(Chars))+1];
  end;
end;
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение vitaly_l » 18.11.2015 21:49:13

bormant писал(а):function GenPassword(const Chars: String, n: Integer): String;
var i: Integer;
begin
  Result:='';
  if n>0 then begin
    SetLength(Result,n);
    for i:=1 to n do
      Result[i]:=Chars[Random(Length(Chars))+1];
  end;
end;


Ну уж нет... более правильно тогда, вот так:
Код: Выделить всё
function GenPassword(const Chars: String, n: Integer): String;
var i: Integer;
begin 
  if n>0 then begin
    SetLength(Result,n+1);
    for i:=1 to n do
      Result[i]:=Chars[Random(Length(Chars))+1];
  end else Result:='';
end;
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение bormant » 19.11.2015 01:26:31

vitaly_l писал(а):более правильно

а обосновать? чем правильнее-то?
Повторюсь, отличий два:
1) SetLength(Result,n+1)
2) if ... then ... SetLength(Result, ...) ... else Result:=''
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение azsx » 19.11.2015 03:22:51

Попробуйте посмотрите чего она Вам скажет: на stroka[0]?
У меня ругается а у Вас?

если вместо sluhainoe := random (length(stroka) + 1); написать sluhainoe := random (length(stroka)); и погенерировать пароли пачками, то вы увидите эту проблему с 0 байтом. Насчет остального вы правы, в делфи индекс строки начинается с 0, в лазарус с 1.
---
Да, программа простая, вся ее суть в одной функции, генерировать кучу паролей. Вместо моего кода
for t := 1 to chislo_paroley do begin
for i := 1 to razmer_parolya do begin
sluhainoe := random (length(stroka) + 1);
parol_mas[t] := parol_mas[t] + stroka[sluhainoe];
end;
end;

Вы предлагаете код
for t := 1 to chislo_paroley do begin
GenPassword (параметры);
end;

+ ваша функция. По строчкам кода только проиграю. По сокращению одной строчки кода и переменной случайное, круто конечно, зато у вас более запутанная конструкция.
Вопрос в другом, зачем в этой программе вы вообще используете отдельную функцию? В вашем варианте программа становится не линейной, очень простой алгоритм в процедуре генерируй будет иметь ответление на функцию генпассворд. Зачем?

Добавлено спустя 3 часа 54 минуты 11 секунд:
---
Поставьте, наконец, CodeTyphon ( http://www.pilotlogic.com ). Он под убунтами ставится обычно. И там отдельным пунктом инсталлятора устанавливаются необходимые библиотеки.

исходя из этой темы viewtopic.php?f=2&t=10488 большиство против CT.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение SSerge » 19.11.2015 07:52:07

azsx писал(а):исходя из этой темы viewtopic.php?f=2&t=10488 большиство против CT.


Ну а как насчет составить своё мнение? Если уж сравнивать новый CT и Lazarus 1.0.4, которому года три как уж, если не больше, возможно CodeTyphon имеет больше смысла.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 19.11.2015 09:35:24

azsx писал(а): По строчкам кода только проиграю.

количество строчек это не самое главное. Это лишь один, не самый главный, ориентир.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение vitaly_l » 19.11.2015 11:03:53

azsx писал(а):то вы увидите эту проблему с 0 байтом. Насчет остального вы правы, в делфи индекс строки начинается с 0, в лазарус с 1.

bormant сделал Вам правильный код, который одновременно удалял 0 из random и при этом в Result всё было от 1. Если Вам не нравится отдельная функция, то можете его код вставить между for begin end; Но суть примера была именно из-за Вашей ошибки у Вас иногда в коде был запрос string[0], т.к. Вы брали его из окончания string. bormant - это увидел когда я написал про stroka[0] и bormant сделал Вам правильный код. Но Вы ещё не поняли своей ошибки. Поэтому: читайте выше более внимательно.
bormant писал(а):а обосновать? чем правильнее-то?

SetLength(Result,n+1)
Когда Вы говорите SetLength(someArray, 1), то можете записать только someArray[0] := 333. А в цикле, для array при n:=10 говорите for i:=0 to n-1 do...
По аналогии я решил что правильнее добавить 1 и в string, т.к. счёт начинается с 1, но не факт что, SetLength для array работает идентично SetLength для string. Так что, скорее всего Акелла промахнулся.
А касаемо else Result:=''; - это вроде как "дело вкуса", но зачем Вы делаете Result:='' в начале кода? Он именно, там, так важен или же это просто заглушка на случай если ...?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 19.11.2015 11:10:48

vitaly_l писал(а):но зачем Вы делаете Result:='' в начале кода? Он именно, там, так важен или же это просто заглушка на случай если ...?


Это как раз нормально... в этом случае просто результат функции всегда присваивается.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение bormant » 19.11.2015 12:26:09

azsx писал(а): в делфи индекс строки начинается с 0, в лазарус с 1

Если б это было так, то вот этот код в Delphi выводил бы "ello!".
Код: Выделить всё
{$H+}
var s: String; i: Integer;
begin
  s:='Hello!'; for i:=1 to Length(s)-1 do Write(s[i]); WriteLn;
end.
Более того, это полностью ломало бы совместимость с короткими строками...

http://docwiki.embarcadero.com/RADStudio/Seattle/en/String_Types_(Delphi)
String Types (Delphi)
...
Indexing of AnsiString is 1-based.
...
Instances of UnicodeString can index characters. Indexing is 1-based, just as for AnsiString.
...
The WideString type represents a dynamically allocated string of 16-bit Unicode characters. In some respects it is similar to AnsiString.

Но (там же)
Delphi compilers for mobile platforms support only the default string type (UnicodeString). Also, with Delphi compilers for mobile platforms, strings are 0-based and immutable; to manipulate strings, use the TStringHelper functions, which are provided for this purpose.


Добавлено спустя 21 минуту 3 секунды:
azsx,
Код: Выделить всё
{$mode ObjFpc}
function GenPassword(const Chars: String; n: Integer): String;
var i: Integer;
begin
  Result:='';
  if n>0 then begin
    SetLength(Result,n);
    for i:=1 to n do
      Result[i]:=Chars[Random(Length(Chars))+1];
  end;
end;
const
  Numbers = '0123456789';
  UCase =   'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  LCase =   'abcdefghijklmnopqrstuvwxyz';
  Symbols = '!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~';
var
  pLen: Integer = 8;
  pNum: Integer = 10;
  pChr: String = Numbers+UCase+LCase+Symbols;
  i: Integer;
begin
  Randomize;
  for i:=1 to pNum do
    WriteLn(GenPassword(pChr,pLen));
end.

Если на этот скромный "скелет" начать наращивать "мясо", добавив разбор параметров комстроки (uses GetOpts), более "умные" режимы генерации, более надежный источник случайных чисел и т.п., то получится что-то вроде pwgen. :)
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение azsx » 27.11.2015 11:11:44

Integer вообще не рекомендуют использовать из-за того, что он платформозависимый.

вот вернусь к этой теме. Сам в кроссплатформенном программировании 0.
Бывают ли ОС (которые сегодня встречаются на рынке и под которые компилит лазарус) в которых int := 1 байту, то есть имеет 255 символов?
---
т.п., то получится что-то вроде pwgen.

еще бы его запустить, глянуть чо там за супер прога.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 27.11.2015 11:24:08

azsx писал(а):Бывают ли ОС (которые сегодня встречаются на рынке и под которые компилит лазарус) в которых int := 1 байту,


Таковых не встречал. Это, имхо, просто бессмысленно. (для этого всегда был тип Byte).

azsx писал(а): то есть имеет 255 символов?


так как Integer это не символьный (строковой) тип, то данная фраза некорректна. Скорее правильно говорить о диапазоне представляемых типом значений.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение azsx » 27.11.2015 11:30:14

Скорее правильно говорить о диапазоне представляемых типом значений.

ага точно. 255 цифр. (127 если с минусом).
Таковых не встречал. Это, имхо, просто бессмысленно. (для этого всегда был тип Byte).

вы писали в конце
viewtopic.php?f=5&t=10725#p90806
Integer вообще не рекомендуют использовать из-за того, что он платформозависимый.

а как бы на форумах по С говорят, что short <= int. То есть интегер даже на микроконтролерах равен, в остальных случаях больше. При этом не ясно компилит ли лазарус для микроконтролеров...

Добавлено спустя 5 минут 38 секунд:
зы
обратите внимание, это не придирка - мне для себя надо разобраться. Так как у меня бывают проблемы с переменными я стараюсь их минимизировать.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 27.11.2015 11:42:29

azsx писал(а):ага точно. 255 цифр. (127 если с минусом).

тоже неверно -- 256 цифр для беззнакового числа и 255 для знакового.
azsx писал(а):а как бы на форумах по С говорят, что short <= int.


Угу... А чему равен Short int вы не уточняли? он, насколько мне известно, двухбайтный.

Добавлено спустя 1 минуту 34 секунды:
azsx писал(а):При этом не ясно компилит ли лазарус для микроконтролеров...


Lazarus точно нет. FPC возможно.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение azsx » 27.11.2015 11:59:18

спасибо, теперь понятно.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 227

Рейтинг@Mail.ru
cron