Другие языки программирования и технологии

Срочно!!! Не займет много времени!!! Ломаю голову над вопросом, Помогите!!! Программа. Pascal. Паскаль

Не могу понять, как вызывать функцию в функции на паскале. Ну чтобы уж не занимать ни у кого времени, простая задача по типу: написать прогу которая возводит число в квадрат, и прогу которая содержит эту прогу и удваивает это число?
Вот мой код, скиньте свой, или поверьте мой пж, ломаю второй час голову. Как функцию в функции вызывать
program projectpas;
uses math;
type
TFx = function (x: real):real;
var
a,b,c : real;
function f (x: real):real;
begin
Result := x*x;
end;

function T (f1 : TFx; b: real):real;
begin
Result := f1(a)*2;
end;
begin
readln(a);
c : = T(f,b);
writeln (c);
end.
begin
readln(a);
c : = T(f,b);

Откуда Вы берёте переменную b в главном блоке?

У Вас объявлена переменная с именем b, но она не инициализирована.

function T (f1 : TFx; b: real):real;
begin
Result := f1(a)*2; // а здесь обращение к внешней переменной “a”
end;

* Внутри функции локальная переменная “a” не объявлена, поэтому имя ”a” ссылается на внешнюю переменную.
* А вот параметр b объявлен, но не использован!
Николай Двоеглазов
Николай Двоеглазов
16 172
Лучший ответ
Николай Двоеглазов По смыслу задачи:

function T (f1 : TFx; b: real):real;
begin
Result := f1( b )*2;
end;

Здесь имя “b” принадлежит локальной переменной (параметру).
Николай Двоеглазов begin
readln(a);
c : = T(f, a );
writeln (c);
end.

* Здесь a — внешняя переменная, сначала вводится с клавиатуры, потом её значение передаётся в функцию.
Николай Двоеглазов ☀    Пожалуйста, учитесь записывать программы красиво!!! Не жалейте пробелов после знаков препинания, отступов и прочего! Избегайте одинаковых имён!
Гулжайна Мырзакулова program project;
uses math;
type
TFx = function (x: real):real;
var
a,b : real;
{$F+}
function f (x: real):real;
begin
Result := x*x;
readln;
end;
{$F-}
procedure T (f1 : TFx; x, y: real);
begin
y:=0;
readln;
y := f1(x)*2;
writeln(y:3:3);
end;
begin
readln(a);
readln(b);
T(@f,a, b);
writeln (b:3:3);
readln;
end.
А вот если так я записал, вроде правиьно, но все равно не преобразует b почему -то
Гулжайна Мырзакулова правда я не совсем понимаю что такое {$F+-} @
Гулжайна Мырзакулова Я сделал все как вы написали: не выполняется прогга c : = T(f,a); ошибка на этой строчке.
program project;
uses math;
type
TFx = function (x: real):real;
var
a,c: real;
function f (x: real):real;
begin
Result := x*x;
end;

function T (f1 : TFx; b: real):real;
begin
Result := f1(b)*2;
end;
begin
readln(a);
c : = T(f,a);
writeln (c);

end.
Гулжайна Мырзакулова с магическими f+ f- @ $ тоже
Николай Двоеглазов    Смотрите, как используется операция взятия адреса вместе с процедурным типом.

function T (f1 : ^TFx; b: real):real;
begin
Result := f1^(b)*2;
end;

begin
readln(a);
c : = T(@f, a);
writeln (c);
end.

   В объявлении функции T первый параметр имеет тип «указатель на TFx», что обозначено символом “^” перед именем типа TFx. В теле функции T требуется вызвать соответствующую функцию (f), но для этого применяется разыменование указателя (справа от имени переменной вставляется символ “^”). Поэтому вызов функции записан как f1^(b).

   В главном блоке программы функция T вызывается с параметрами, но нужно, чтобы тип фактического параметра при вызове совпадал с типом формального параметра при объявлении. Для этого от имени функции берется адрес — @f
Гулжайна Мырзакулова { $F+ } вот эта штука меня напрягала. Хорошо, понял, Спасибо за подробное разъяснение, последний вопрос, получается @ перед функцией нужно если необходимо ставить только в теле прогги. А вот допустим если я создал функцию вызывающую функцию содержащую еще одну функцию, то в данном случае @ ставить не надо, надеюсь вопрос получился понятным)
Гулжайна Мырзакулова Хотя не, проверил, понял, вопрос отпал, Спасибо еще раз за помощь!)
Николай Двоеглазов Пробую обмануть парсер

{$+}
Оно?
cyberforum.ru/turbo-pascal/thread699020.html
Гулжайна Мырзакулова Разобрался, Спасиб)
Все выглядит вполне кошерно, кроме вот этого:

c : = T(f,b);

Сдается мне, здесь нужно поиграться с указателями, что-то вроде c : = T(@f,b);, иначе компилятор захочет вызвать f. В общем, копай в этом направлении.
Гулжайна Мырзакулова Хорошо, Спасибо)
Под вопрос даже заглядывать не решаюсь.
Вдруг давно ломаешь?
Олег Злодеев
Олег Злодеев
21 790
Гулжайна Мырзакулова Ломка происходит в идее, а не в предложенном задании
program JDMasFuck
;mPageErase equ $40
;mByteProg equ $20
mFACCERR equ $10
mFPVIOL equ $20
mFCBEF equ $80
; variable/data section
MY_ZEROPAGE: SECTION SHORT
; Insert here your data definition. For demonstration, temp_byte is used.
; temp_byte ds.b 1
; code section
MyCode: SECTION
;**************************************************************
; this assembly routine is called the C/C++ application
DoOnStack: pshx
pshh ;save pointer to flash
psha ;save command on stack
ldhx #SpSubEnd ;point at last byte to move to stack;
SpMoveLoop: lda, x ;read from flash
psha ;move onto stack
aix #-1 ;next byte to move
cphx #SpSub-1 ;past end?
bne SpMoveLoop ;loop till whole sub on stack
tsx ;point to sub on stack
tpa ;move CCR to A for testing
and #$08 ;check the I mask
bne I_set ;skip if I already set
sei ;block interrupts while FLASH busy
lda SpSubSize+6,sp ;preload data for command
jsr, x ;execute the sub on the stack
cli ;ok to clear I mask now
bra I_cont ;continue to stack de-allocation
I_set: lda SpSubSize+6,sp ;preload data for command
jsr, x ;execute the sub on the stack
I_cont: ais #SpSubSize+3 ;deallocate sub body + H:X + command
;H:X flash pointer OK from SpSub
lsla ;A=00 & Z=1 unless PVIOL or ACCERR
rts ;to flash where DoOnStack was called
;**************************************************************
SpSub: ldhx LOW(SpSubSize+4),sp ;get flash address from stack
sta 0,x ;write to flash; latch addr and data
lda SpSubSize+3,sp ;get flash command
sta FCMD ;write the flash command
lda #mFCBEF ;mask to initiate command
sta FSTAT ;[pwpp] register command
nop ;[p] want min 4~ from w cycle to r
ChkDone: lda FSTAT ;[prpp] so FCCF is valid
lsla ;FCCF now in MSB
bpl ChkDone ;loop if FCCF = 0
SpSubEnd: rts ;back into DoOnStack in flash
SpSubSize: equ (*-SpSub)