Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2021, 16:39   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию Пустая функция

Существует ли какая-то "пустая фукция", которая возвращает введенную в нее переменную?
Или надо ее сооружать самому?

Зачем это нужно?

Чтобы была переменная типа функция, которая иногда принимает значение какой-то функции от переменной, а иногда напрямую возвращала переменную
Kronos913 вне форума Ответить с цитированием
Старый 14.05.2021, 17:57   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,537
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
которая иногда принимает значение какой-то функции от переменной, а иногда напрямую возвращала переменную
... как когда ей на ум взбредёт.
Никакая функция переменную не возвращает, равно как и не отбирает. Функция возвращает значение, которое в операторе, вызвавшем эту функцию, присваивается переменной. Например: функция вычислила значение, положила его в стек и закончила работу. Управление передаётся оператору, вызвавшему эту функцию, который забирает из стека вычисленное значение и присваивает его переменной.
Код:
function afedron(arg,ivar:integer) : integer ;
begin
    if ivar <> 0 then Result := arg*3 + 1 else Result := arg
end;

Последний раз редактировалось digitalis; 14.05.2021 в 18:19.
digitalis вне форума Ответить с цитированием
Старый 14.05.2021, 21:25   #3
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

От жаль прекращена поддержка одобрения постов.
Высказывание
Цитата:
Сообщение от digitalis Посмотреть сообщение
функция вычислила значение, положила его в стек и закончила работу. Управление передаётся оператору, вызвавшему эту функцию, который забирает из стека вычисленное значение и присваивает его переменной.
многого стоит.
Плюсую.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 15.05.2021, 00:09   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Суть задачи такая:
Переменной типа функции в зависимости от параметров присвоить функцию

И в случаи одного из вариантов нужно чтобы функция была равна введенной переменной. И можно ли это сделать напрямую, не создавая самую функцию result:=a, чтобы не было двух перемещений одной и той же переменной? Или только так?
Kronos913 вне форума Ответить с цитированием
Старый 15.05.2021, 01:07   #5
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Похоже что после дополнительной вводной информации стало только хуже.
что значит
Цитата:
Сообщение от Kronos913 Посмотреть сообщение
И в случаи одного из вариантов нужно чтобы функция была равна введенной переменной.
?

Вы либо дословно печатайте со всеми знаками препинания задание полученное от преподавателя ...
иначе
если это не возможно
свяжитесь с преподавателем и уточните поставленную задачу...
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 15.05.2021, 02:27   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Первый вариант - напишите уж свою функцию, которая возвращает переменную как есть. Не экономьте на спичках:
Код:
function f1(const a: Integer): Integer;
begin
  Result := a;
end;

function f2(const a: Integer): Integer;
begin
  Result := -a;
end;

procedure TForm1.btn1Click(Sender: TObject);
type
  TFunc = function(const a: Integer): Integer;
var
  f: TFunc;
begin
  if Random(2) = 0 then
    f := f1
  else
    f := f2;
  ShowMessage(IntToStr(f(10)));
end;
Второй вариант - подход просто неверен, и можно сразу считать результат:
Код:
function f2(const a: Integer): Integer;
begin
  Result := -a;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  a, f: Integer;
begin
  a := 10;
  if Random(2) = 0 then
    f := a
  else
    f := f2(a);
  ShowMessage(IntToStr(f));
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.05.2021, 17:17   #7
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Вот для чего это нужно
Код:
type
  string1=string[1];
Код:
Function ClipboardToLowerString(var s:string; const c:string1): boolean;
var
 ss:TStrings;
 i:word;
 j: byte;
begin
 ss:=TstringList.Create;
 ss.Text:=Clipboard.asText;
 {1}
 If ss.Count>0 then begin
  {2}
  s:=LowerCase(ss[0]);
  i:=1;
  while i<ss.Count do begin
   If length(s)+length(c)<256 then begin
    s:=s+c;
    If length(s)+length(ss[i])>255 then begin
     j:=0;
     while length(s)<255 do begin
      inc(j);
      s:=s+LowerCase(ss[i][j]);
     end;
     i:=ss.Count
    end else begin
     s:=s+LowerCase(ss[i]);
     inc(i);
    end;
   end else i:=ss.Count;
  end;
  {2}
  Result:=(length(s)>0);
 end else begin
  s:='';
  Result:=false;
 end;
 {1}
 ss.Free;
end;
Конкретно для этой программы нужно использовать функцию LowerCase
Однако чтобы сделать функцию универсальной, хотелось бы добавить возможность с помощью дополнительного булеана сделать возможным выбирать использовать LowerCase или напрямую использовать переменную
Kronos913 вне форума Ответить с цитированием
Старый 30.05.2021, 05:05   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Само имя функции говорит, что результат будет "уменьшенной" строкой. Почему для "c" не использовать char? Очевидные изменения (вместо внешнего while - for; вместо внутреннего while - copy).
Код:
function ClipboardToLowerString(var s: string; const c: char): boolean;
var
  ss: TStringList;
  i: word;
begin
  ss := TStringList.Create;
  ss.Text := Clipboard.asText;
  {1}
  if ss.Count > 0 then
  begin
    {2}
    s := LowerCase(ss[0]);
    for i := 1 to ss.Count - 1 do
    begin
      if length(s) < 255 then
      begin
        s := s + c;
        if length(s) + length(ss[i]) > 255 then
        begin
          s := s + LowerCase(Copy(ss[i], 1, 255 - length(s)));
          Break;
        end
        else
          s := s + LowerCase(ss[i]);
      end
      else
        Break;
    end;
    {2}
    Result := (length(s) > 0);
  end
  else
  begin
    s := '';
    Result := false;
  end;
  {1}
  ss.Free;
end;
Если хочется универсальности. Можно по флагу применять LowerCase к Clipboard.asText (но там может быть много текста), а если есть гарантия, что значение "c" не восприимчиво к LowerCase, то после формирования строки "s" применить LowerCase к ней (там где в коде {2}). И последнее замечание: так ли необходим TStringList, может быть, самому анализировать строку будет "дешевле"?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пустая страница natter Microsoft Office Word 0 05.11.2020 10:56
Пустая ячейка не воспринимается как пустая SvetlanaF Microsoft Office Excel 3 24.02.2014 05:34
Пустая строка в Си приправыч Помощь студентам 1 08.12.2012 15:13
Страница пустая, но "не пустая"... неподьемный файл. Snekich Microsoft Office Excel 20 17.12.2011 14:16
Пустая строка ForzaJuve Общие вопросы C/C++ 3 13.10.2010 15:41