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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2019, 10:24   #1
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию [РЕШЕНО] Функции в Delphi

Был уверен, что результатом выполнения функции является скалярная переменная. Потом заинтересовало: а так ли это? В описании - результат любого типа, кроме файлового. Решил попробовать с record. Работает!
Но вот с элементом массива record. подружить мою функцию не получилось. Is it possible ? Не для практического применения, чисто по теории.
Среда - D7 .
Код:
type
  Tr = Record
    Name : string[20];
    Val : integer ;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  TrMas: array[0..10] of Tr ;
  TrTr: Tr ;
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
Function Tr_Fun (i:integer): Tr ;
begin
   Tr_Fun.Name := 'Name' ; Tr_Fun.Val := i
end;

Begin
  TrTr := Tr_Fun(5) ;
  Edit1.Text := (TrTr.Name + ' ' + IntToStr(TrTr.Val))
end;

end.

Последний раз редактировалось digitalis; 02.07.2019 в 10:27.
digitalis вне форума Ответить с цитированием
Старый 02.07.2019, 10:45   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Но вот с элементом массива record. подружить мою функцию не получилось.
простите, а что Вы имели в виду?
поясните примером. можно даже тем, что не работает.
просто понять логику.

для затравки
Код:
procedure TForm1.Button1Click(Sender: TObject);
  Function Tr_Fun (nm:string;i:integer): Tr ;
  begin
     Tr_Fun.Name := nm ; Tr_Fun.Val := i
  end;
var i:integer;
Begin
  TrMas[0] := Tr_Fun('name',5) ;
  TrMas[1] := Tr_Fun('second',2) ;

  Edit1.Text := '';
  for i := 0 to 1 do
    Edit1.Text := Edit1.Text + (TrMas[i].Name + ' ' + IntToStr(TrMas[i].Val)+' ')
end;

Последний раз редактировалось Serge_Bliznykov; 02.07.2019 в 10:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.07.2019, 12:13   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Действительно, работает. Видимо, ошибся где-то со скобкой - ночь, жара...
Thanks.
Вопрос закрыт.
digitalis вне форума Ответить с цитированием
Старый 03.07.2019, 02:07   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Действительно, работает. Видимо, ошибся где-то со скобкой - ночь, жара...
Дело не в скобке. И не в ночи, жаре и т.п.
Скажите спасибо оптимизатору Дельфи, что выбросил вашу функцию на помойку проигнорировав её как функцию. Ибо ваша функция не возвращает никакого результата! Она лишь меняет значение некоей глобальной переменной.
И тут повторно вопрос
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
простите, а что Вы имели в виду?
поясните примером. можно даже тем, что не работает.
просто понять логику.
northener вне форума Ответить с цитированием
Старый 03.07.2019, 08:46   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Вот этот пост был совершенно лишним - во_первых, мы с Serge_Bliznykov все детально разобрали и вопрос закрыт, во-вторых, суждение в нем неверное.
Цитата:
лишь меняет значение некоей глобальной переменной
было бы в том случае, если бы в теле функции было присваивание этой глобальной переменной (т.нз. "побочный эффект", о котором много говорилось во второй половине прошлого века), а не вычисление выражения и присваивание его элементу массива, индекс которого на момент компиляции неизвестен.
Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tr = Record
    Name : string[20];
    Val : integer ;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  TrMas: array[0..10] of Tr ;
  TrTr: Tr ;
  st: string ;
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var ii: integer ; s_s: string ;

Function Tr_Fun (st:string;i:integer): Tr ;
begin
   Tr_Fun.Name := st ; Tr_Fun.Val := i
end;

Begin
  s_s := Edit1.Text ;
  ii := StrToInt (Copy(s_s,1,1)) ;
  s_s := Copy(s_s,2,64) ;
  TrMas[ii] := Tr_Fun(s_s,ii) ;
  Form1.Caption := (TrMas[ii].Name + ' = ' + IntToStr(TrMas[ii].Val)) ;
end;

end.
Как видим, никто никого никуда не выбросил, функция жива и работает штатно. А причина не работы первичного примера - где-то описка.
Вопрос закрыт. Ещё раз.
Изображения
Тип файла: jpg 7.JPG (10.2 Кб, 43 просмотров)

Последний раз редактировалось digitalis; 03.07.2019 в 09:11.
digitalis вне форума Ответить с цитированием
Старый 03.07.2019, 11:36   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ибо ваша функция не возвращает никакого результата!
Не согласен в корне
Код:
function Foo: string;
begin
  Result := 'BAR';
end;
Тоже самое что и
Код:
function Foo: string;
begin
  Foo := 'BAR';
end;

Последний раз редактировалось Человек_Борща; 03.07.2019 в 11:38.
Человек_Борща вне форума Ответить с цитированием
Старый 03.07.2019, 15:01   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Ну невнимательно человек прочитал исходник. Не верится, чтоб человек с таким рейтингом был не осведомлен об синтаксисе функции.
http://www.delphibasics.ru/Function.php
Изображения
Тип файла: jpg Fun.JPG (14.1 Кб, 33 просмотров)
digitalis вне форума Ответить с цитированием
Старый 03.07.2019, 15:05   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я за northener могу поручиться чем угодно!
Он просто невнимательно посмотрел на код.
Вот и всё.
А Вы сразу начали ему синтаксис Паскаля объяснять. Он его и так знает.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2019, 15:10   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Мы же не в суде, чтоб брать на поруки Просто обмен мнениями.
А вот конструкция вроде
Код:
   Result.Val := i
не работает. тоже работает, оказывается !
Если бы я сразу этот вариант проверил, и сыр-бор бы не разгорелся.
Но это все - пустяки. Только бы мой рыжий котик полностью выздоровел.

Последний раз редактировалось digitalis; 04.07.2019 в 07:34.
digitalis вне форума Ответить с цитированием
Старый 04.07.2019, 01:22   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Ну невнимательно человек прочитал исходник.
Это точно. Посыпаю голову.
northener вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО] Prolog: Вычислить значеник функции y=x^2+6*x-5 в промежутке от N до 2*N с шагом 2 . N - натуральное число, вводимое с клавиатуры AnnaSub Помощь студентам 2 22.05.2019 10:52
[РЕШЕНО][Delphi] Графика Vitalik81311 Помощь студентам 1 03.01.2019 00:06
[РЕШЕНО] возвращаемое значение функции может быть неопределенным Necker Помощь студентам 2 18.12.2018 19:08
[РЕШЕНО] Delphi 7, if then и else DarkMorfius Помощь студентам 3 05.11.2017 16:07
[РЕШЕНО][Delphi] Активная ссылка в DBText.Delphi Anastasea_ Помощь студентам 0 19.06.2017 22:45