Не могу понять, как вызывать функцию в функции на паскале. Ну чтобы уж не занимать ни у кого времени, простая задача по типу: написать прогу которая возводит число в квадрат, и прогу которая содержит эту прогу и удваивает это число?
Вот мой код, скиньте свой, или поверьте мой пж, ломаю второй час голову. Как функцию в функции вызывать
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.
Другие языки программирования и технологии
Срочно!!! Не займет много времени!!! Ломаю голову над вопросом, Помогите!!! Программа. Pascal. Паскаль
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 объявлен, но не использован!
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 объявлен, но не использован!
Оно?
cyberforum.ru/turbo-pascal/thread699020.html
cyberforum.ru/turbo-pascal/thread699020.html
Гулжайна Мырзакулова
Разобрался, Спасиб)
Все выглядит вполне кошерно, кроме вот этого:
c : = T(f,b);
Сдается мне, здесь нужно поиграться с указателями, что-то вроде c : = T(@f,b);, иначе компилятор захочет вызвать f. В общем, копай в этом направлении.
c : = T(f,b);
Сдается мне, здесь нужно поиграться с указателями, что-то вроде c : = T(@f,b);, иначе компилятор захочет вызвать f. В общем, копай в этом направлении.
Гулжайна Мырзакулова
Хорошо, Спасибо)
Под вопрос даже заглядывать не решаюсь.
Вдруг давно ломаешь?
Вдруг давно ломаешь?
Гулжайна Мырзакулова
Ломка происходит в идее, а не в предложенном задании
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)
;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)
Похожие вопросы
- Нужно написать программы в Паскале! Массивы! Срочно! Помогите!
- Программа на паскале! Помогите(бесплатно)
- Время работы программы в Паскаль
- Помогите с программой в Паскале, срочно!
- Помогите пожалуйста, с составлением программы в паскале, очень срочно! Только пожалуйста, вставьте данные, которые ниже
- Помогите составить программу на паскале!
- помогите с программами в паскале
- Помогите пожалуйста создать программу на Паскале. Заранее всем благодарен
- Помогите решить программу в паскале)
- помогите плиз написать программу на паскале...тема массивы...нужно использовать поиск деления пополам!!!нужно срочно!
function T (f1 : TFx; b: real):real;
begin
Result := f1( b )*2;
end;
Здесь имя “b” принадлежит локальной переменной (параметру).
readln(a);
c : = T(f, a );
writeln (c);
end.
* Здесь a — внешняя переменная, сначала вводится с клавиатуры, потом её значение передаётся в функцию.
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 почему -то
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.
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
{$+}