There is no help page available for this error
Sorry, we do not have specific information about your error. There are several resources that can help you find a solution:
Related Maplesoft Help Pages
-
6 Procedures
Contents Previous Next Index 6 Procedures A Maple procedure is a sequence of parameter
declarations, variable declarations, and statements that encapsulates a computation … -
Language
Language and System Changes in Maple 6 Linking and Calling External Routines New
and Enhanced Programming Features Examples Changes to the Type System Importing … -
14 Advanced Connectivity
Contents Previous Next Index 14 Advanced Connectivity This chapter describes how
to connect Maple to other applications. Maple can be connected as the main interface …
Related Posts & Questions on MaplePrimes
-
Error, unexpected `local` declaration in procedure body — MaplePrimes
May 7, 2015 … Question:Error, unexpected `local` declaration in procedure body … Could someone help me understand what is happening to this procedure. When I … -
Odd response to use of local in proc definition — MaplePrimes
Jan 27, 2016 … Error, unexpected `local` declaration in procedure body test := proc( ) # local a; a := 3 end proc; Warning, `a` is implicitly declared … -
Question:Why does the colon generate an error when «local» follows?
Jan 19, 2021 … … proc: Error, unexpected `local` declaration in procedure body h := proc(x): y:=x+1 end proc: Warning, `y` is implicitly declared local …
Other Resources
- Review the Error Message Guide Overview
- Frequently Asked Questions
- Contact Maplesoft Technical Support
Hello everyone,
I was looking back to a project I made a while back on Haskell and came across a problem I had a lot. The professor gave me credit for doing the work, so I didn’t do much to it ever since. However, coming back to it I want to know exactly what I did wrong. Can you help me?
Thank you for your time.
Error code:
Haskell 98 mode: Restart with command line option -98 to enable extensions
ERROR "haskellProg1.hs":42 - Syntax error in declaration (unexpected `;', possibly due to bad layout)
Code
{-#####################################################################
haskellProg1.hs
Name
Purpose of script:
-do exercises in order to show I understand how Haskell works.
#####################################################################-}
--Haskell Exercise #1
--Find the maximum of three numbers.
maxThree :: Int -> Int -> Int -> Int
maxThree x y z
| x >= y && x >= z = x
| y >= x && y >= z = y
| otherwise = z
--Haskell Exercise #2
--Find the sum of factorials.
fac :: Int -> Int
fac n
| n == 0 = 1
| n > 0 = fac(n-1) * n
sumFacs :: Int -> Int
sumFacs n
| n == 0 = 1
| n > 0 = sumFacs ( n - 1 ) + fac n
--Haskell Exercise #3
--Sum of functions
fib :: Int -> Int
fib n
| n == 0 = 1
| n == 1 = 1
| n > 0 = fib ( n - 2 ) + fib ( n - 1 )
sumFun f n :: (Int -> Int) -> Int -> Int
sumFun f n --problem lies here
| n == 0 = f 0
| n > 0 = sumFun f ( n - 1 ) + f n
--Haskell Exercise #4
--Add distant pairs if conditions are fulfilled.
minAndMax :: Int -> Int -> (Int,Int)
minAndMax x y
| x >= y = (y,x)
| otherwise = (x,y)
diffTuple :: (Int,Int) -> Int
diffTuple (x,y)
| x >= y = x-y
| otherwise = y - x
addDistantPairs :: Int -> [(Int,Int)] -> [Int]
addDistantPairs x [(y,z)]
| minAndMax y z
| (z-y) >= x = y + z
--Haskell Exercise #5
--applyFuncToPairs :: ((Int->Int)->Int) -> [(Int,Int)]->[Int]
--It would only give a set pair of ints on one list.
--Haskell Exercise #6
--applyFuncToPairs :: ((a->b)->c) -> [(XX,XX)]->[XX]
--a)All have to be a,b, and c respectively.
--b)applyFuncToPairs((a->b)->c) -> [(a,b)]->[c]
--Haskell Exercise #7
--applyToAll :: (Int->Int) -> [Int] -> [Bool]
--Haskell Exercise #8
--Lazy programming is best described as programming a function when it's
--needed, not well-in-advance. This differs from short circuit evaluation
--since it doesn't just evaluate, it does what the program tells it to do.
You should upgrade or use an alternative browser.
-
Forums
-
Other Sciences
-
Programming and Computer Science
Fortran Error Unexpected data declaration statement
- Fortran
-
Thread starter
TamuKevin -
Start date
Mar 4, 2014
- Mar 4, 2014
- #1
Hi all, I’m writing a program to perform a linear inversion on a set of magnetic data. I’m fairly new to Fortran, but I have coded Fourier and wavelet transformation programs in it. I’m having a problem when trying to declare my variable types. I’m using the «dimension» command as I have in previous programs to define the size of multiple arrays at once. For some reason when it compiles I get the error «Unexpected data declaration statement.» The code is more lengthy than this, so I just copied and pasted the parameter declaration into another file, yet the error still exists. Its as if my compiler does not recognize the dimension command, but if I try to compile a previous program that uses it, it does so fine. Also, even if I don’t use the dimension command the compiler still finds errors. I’m sure something simple is wrong, I just cannot seem to find it.
[…~/documents/Assignment2] gfortran A2P1test.f
A2P1test.f:26.72:real, dimension(0:D-1) :: Inp_Data, T, B_obs
1
Error: Unexpected data declaration statement at (1)
A2P1test.f:27.72:real, dimension(0:P-1) :: Bx, Bz
1
Error: Unexpected data declaration statement at (1)
A2P1test.f:28.72:real, dimension(0:D-1,0:P-1) :: A
1
Error: Unexpected data declaration statement at (1)
*This code will perform a linear inversion to a set of magnetic data
*via the use of 2D prisms
*>>>>>>>>>>>>>>>>>>>>>Declare Variable Definitions<<<<<<<<<<<<<<<<<<
*pi= pi
*u_0= permeability of free space
*D= Number of magnetic data
*P= Number of parameters (prisms)
*T= Total field anomaly
*B_obs= Raw data in absolute intensity form
*Bx= Bx to be used in filling matrix A
*Bz= Bz to be used in filling matrix A
*A= Forward problem matrix with physics
*>>>>>>>>>>>>>>>>>>>>>>>>>Declare Variable Types<<<<<<<<<<<<<<<<<<<<<
parameter(pi=3.141592, u_0=1.25663706e-6)
integer D=251
integer P=25
real, dimension(0:D-1) :: Inp_Data, T, B_obs
real, dimension(0:P-1) :: Bx, Bz
real, dimension(0:D-1,0:P-1):: A
*>>>>>>>>>>>>>>>>>>>>>>>Quantify Various Variables<<<<<<<<<<<<<<<<<<
end
Another odd thing to me is if I define P and D in the parameter statement (as I have done in the past) the compiler treating them as real and not integer.
A2P1test.f:28.24:
real, dimension(0:D-1,0:P-1) :: A
1
Error: Expression at (1) must be of INTEGER type, found REAL
A2P1test.f:28.30:
real, dimension(0:D-1,0:P-1) :: A
1
Error: Expression at (1) must be of INTEGER type, found REAL
A2P1test.f:28.39:
real, dimension(0:D-1,0:P-1) :: A
1
Error: The module or main program array 'a' at (1) must have constant shape
A2P1test.f:26.24:
real, dimension(0:D-1) :: Inp_Data, T, B_obs
1
Error: Expression at (1) must be of INTEGER type, found REAL
A2P1test.f:26.50:
real, dimension(0:D-1) :: Inp_Data, T, B_obs
1
Error: The module or main program array 'b_obs' at (1) must have constant shape
A2P1test.f:27.24:
real, dimension(0:P-1) :: Bx, Bz
1
Error: Expression at (1) must be of INTEGER type, found REAL
A2P1test.f:27.34:
real, dimension(0:P-1) :: Bx, Bz
1
Error: The module or main program array 'bx' at (1) must have constant shape
A2P1test.f:27.24:
real, dimension(0:P-1) :: Bx, Bz
1
Error: Expression at (1) must be of INTEGER type, found REAL
A2P1test.f:27.38:
real, dimension(0:P-1) :: Bx, Bz
1
Error: The module or main program array 'bz' at (1) must have constant shape
A2P1test.f:26.24:
real, dimension(0:D-1) :: Inp_Data, T, B_obs
1
Error: Expression at (1) must be of INTEGER type, found REAL
A2P1test.f:26.40:
real, dimension(0:D-1) :: Inp_Data, T, B_obs
1
Error: The module or main program array 'inp_data' at (1) must have constant shape
A2P1test.f:26.24:
real, dimension(0:D-1) :: Inp_Data, T, B_obs
1
Error: Expression at (1) must be of INTEGER type, found REAL
A2P1test.f:26.43:
real, dimension(0:D-1) :: Inp_Data, T, B_obs
1
Error: The module or main program array 't' at (1) must have constant shape
*>>>>>>>>>>>>>>>>>>>>>>>>>Declare Variable Types<<<<<<<<<<<<<<<<<<<<<
parameter(pi=3.141592, u_0=1.25663706e-6, D=251, P=25)
* integer D=251
* integer P=25
real, dimension(0:D-1) :: Inp_Data, T, B_obs
real, dimension(0:P-1) :: Bx, Bz
real, dimension(0:D-1,0:P-1) :: A
Thank you for any insight on these problems,
TamuKevin
Answers and Replies
- Mar 4, 2014
- #2
Hi all, I’m writing a program to perform a linear inversion on a set of magnetic data. I’m fairly new to Fortran, but I have coded Fourier and wavelet transformation programs in it. I’m having a problem when trying to declare my variable types. I’m using the «dimension» command as I have in previous programs to define the size of multiple arrays at once. For some reason when it compiles I get the error «Unexpected data declaration statement.» The code is more lengthy than this, so I just copied and pasted the parameter declaration into another file, yet the error still exists. Its as if my compiler does not recognize the dimension command, but if I try to compile a previous program that uses it, it does so fine. Also, even if I don’t use the dimension command the compiler still finds errors. I’m sure something simple is wrong, I just cannot seem to find it.*This code will perform a linear inversion to a set of magnetic data *via the use of 2D prisms *>>>>>>>>>>>>>>>>>>>>>Declare Variable Definitions<<<<<<<<<<<<<<<<<< *pi= pi *u_0= permeability of free space *D= Number of magnetic data *P= Number of parameters (prisms) *T= Total field anomaly *B_obs= Raw data in absolute intensity form *Bx= Bx to be used in filling matrix A *Bz= Bz to be used in filling matrix A *A= Forward problem matrix with physics *>>>>>>>>>>>>>>>>>>>>>>>>>Declare Variable Types<<<<<<<<<<<<<<<<<<<<< parameter(pi=3.141592, u_0=1.25663706e-6) integer D=251 integer P=25 real, dimension(0:D-1) :: Inp_Data, T, B_obs real, dimension(0:P-1) :: Bx, Bz real, dimension(0:D-1,0:P-1):: A *>>>>>>>>>>>>>>>>>>>>>>>Quantify Various Variables<<<<<<<<<<<<<<<<<< end
Another odd thing to me is if I define P and D in the parameter statement (as I have done in the past) the compiler treating them as real and not integer.
A2P1test.f:28.24: real, dimension(0:D-1,0:P-1) :: A 1 Error: Expression at (1) must be of INTEGER type, found REAL A2P1test.f:28.30: real, dimension(0:D-1,0:P-1) :: A 1 Error: Expression at (1) must be of INTEGER type, found REAL A2P1test.f:28.39: real, dimension(0:D-1,0:P-1) :: A 1 Error: The module or main program array 'a' at (1) must have constant shape A2P1test.f:26.24: real, dimension(0:D-1) :: Inp_Data, T, B_obs 1 Error: Expression at (1) must be of INTEGER type, found REAL A2P1test.f:26.50: real, dimension(0:D-1) :: Inp_Data, T, B_obs 1 Error: The module or main program array 'b_obs' at (1) must have constant shape A2P1test.f:27.24: real, dimension(0:P-1) :: Bx, Bz 1 Error: Expression at (1) must be of INTEGER type, found REAL A2P1test.f:27.34: real, dimension(0:P-1) :: Bx, Bz 1 Error: The module or main program array 'bx' at (1) must have constant shape A2P1test.f:27.24: real, dimension(0:P-1) :: Bx, Bz 1 Error: Expression at (1) must be of INTEGER type, found REAL A2P1test.f:27.38: real, dimension(0:P-1) :: Bx, Bz 1 Error: The module or main program array 'bz' at (1) must have constant shape A2P1test.f:26.24: real, dimension(0:D-1) :: Inp_Data, T, B_obs 1 Error: Expression at (1) must be of INTEGER type, found REAL A2P1test.f:26.40: real, dimension(0:D-1) :: Inp_Data, T, B_obs 1 Error: The module or main program array 'inp_data' at (1) must have constant shape A2P1test.f:26.24: real, dimension(0:D-1) :: Inp_Data, T, B_obs 1 Error: Expression at (1) must be of INTEGER type, found REAL A2P1test.f:26.43: real, dimension(0:D-1) :: Inp_Data, T, B_obs 1 Error: The module or main program array 't' at (1) must have constant shape
*>>>>>>>>>>>>>>>>>>>>>>>>>Declare Variable Types<<<<<<<<<<<<<<<<<<<<< parameter(pi=3.141592, u_0=1.25663706e-6, D=251, P=25) * integer D=251 * integer P=25 real, dimension(0:D-1) :: Inp_Data, T, B_obs real, dimension(0:P-1) :: Bx, Bz real, dimension(0:D-1,0:P-1) :: A
Thank you for any insight on these problems,
TamuKevin
By default, variables whose names start with I, J, K, L, M, or N are considered to be integer-type variables, and variables that start with other letters in the alphabet are considered to be real-type variables.
I haven’t written any Fortran for many years, so I’m a little rusty on the syntax, but I believe your declarations and parameter statements are causing you problems.
Since P and D would by default be floating point variables, to make them integer parameters, I believe that you need to first declare them as integers, and then give them values in a parameter statement, like so:
integer P, D
parameter (P = 25, D = 251)
When you fix these two, that should take care of the error involving the arrays that are described as not having a constant shape.
- Mar 4, 2014
- #3
- Mar 4, 2014
- #4
- Mar 4, 2014
- #5
I haven’t written any Fortran for many years, so I’m a little rusty on the syntax, but I believe your declarations and parameter statements are causing you problems.
I think the OP got caught by one of Fortran’s interesting features («interesting» as in » strange, and not very useful»…)
All whitespace characters in statements are ignored, except in character strings. So the statement
is legal, but it is actually an assignment statement giving a value to the variable named
… which is not what you wanted, of course.
A similar «gotcha» is a typo like
which is legal, and sets the real variable
to 1.1, instead of starting a DO loop.
Suggested for: Fortran Error Unexpected data declaration statement
- Last Post
- Jan 29, 2022
- Last Post
- Jan 18, 2020
- Last Post
- Feb 24, 2022
- Last Post
- Oct 31, 2022
2
- Last Post
- Today, 12:16 AM
- Last Post
- Jan 10, 2023
- Last Post
- Jul 5, 2021
- Last Post
- Nov 20, 2020
- Last Post
- Jul 1, 2022
- Last Post
- Apr 1, 2019
-
Forums
-
Other Sciences
-
Programming and Computer Science
За последние 24 часа нас посетили 11507 программистов и 1160 роботов. Сейчас ищут 239 программистов …
-
- С нами с:
- 2 авг 2017
- Сообщения:
- 5
- Симпатии:
- 0
Выдаётся ошибка, не могу найти ошибку.
syntax error, unexpected ‘{‘ in X:homelocalhostwwwmigrantadd_list_migrants.php on line 52-
include («blocks/bd.php»);
-
if (isset($_POST[‘m_reg_date’])) {$m_reg_date = $_POST [‘m_reg_date’];}
-
if (isset($_POST[‘m_surname’])) {$m_surname = $_POST [‘m_surname’];}
-
if (isset($_POST[‘m_name’])) {$m_name = $_POST [‘m_name’];}
-
if (isset($_POST[‘m_fathername’])) {$m_fathername = $_POST [‘m_fathername’];}
-
if (isset($_POST[‘m_sex’])) {$m_sex = $_POST [‘m_sex’];}
-
if (isset($_POST[‘m_dob’])) {$m_dob = $_POST [‘m_dob’];}
-
if (isset($_POST[‘m_nation’])) {$m_nation = $_POST [‘m_nation’];}
-
if (isset($_POST[‘m_pass_number’])) {$m_pass_number = $_POST [‘m_pass_number’];}
-
if (isset($_POST[‘m_pass_date’])) {$m_pass_date = $_POST [‘m_pass_date’];}
-
if (isset($_POST[‘m_pass_issued’])) {$m_pass_issued = $_POST [‘m_pass_issued’];}
-
if (isset($_POST[‘m_address’])) {$m_address = $_POST [‘m_address’];}
-
if (isset($_POST[‘m_edu_lavel’])) {$m_edu_lavel = $_POST [‘m_edu_lavel’];}
-
if (isset($_POST[‘m_jamoat’])) {$m_jamoat = $_POST [‘m_jamoat’];}
-
if (isset($_POST[‘m_date_leave’])) {$m_date_leave = $_POST [‘m_date_leave’];}
-
if (isset($_POST[‘m_date_arrival’])) {$m_date_arrival = $_POST [‘m_date_arrival’];}
-
if (isset($_POST[‘m_date_worck_start’])) {$m_date_worck_start = $_POST [‘m_date_worck_start’];}
-
if (isset($_POST[‘m_date_worck_end’])) {$m_date_worck_end = $_POST [‘m_date_worck_end’];}
-
<!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «[URL]http://www.w3.org/TR/html4/loose.dtd[/URL]»>
-
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>
-
<title>Обработчик</title>
-
<link href=»style.css» rel=»stylesheet» type=»text/css»>
-
<table width=»690″ align=»center» bordercolor=»#FFFFFF» bgcolor=»#FFFFFF» class=»main_border»>
-
<!—Подключаем шапку сайта—>
-
<? include («blocks/header.php»);?>
-
<!—Подключаем левый блок сайта—>
-
<? include («blocks/lefttd.php»)?>
-
/*Здесь пишем что можно заносить информацию в базу*/
-
$result = mysql_query («INSERT INTO migrant_list(m_reg_date,m_surname,m_name,m_fathername,m_sex,m_dob,m_nation,m_pass_number,m_pass_date, m_pass_issued,m_address,m_edu_lavel,m_jamoat,m_date_leave,m_date_arrival,m_date_worck_start,m_date_worck_end) VALUES (‘$m_reg_date‘, ‘$m_surname‘, ‘$m_name‘, ‘$m_fathername‘, ‘$m_sex‘, ‘$m_dob‘, ‘$m_nation‘, ‘$m_pass_number‘, ‘$m_pass_date‘, ‘$m_pass_issued‘, ‘$m_address‘, ‘$m_edu_lavel‘, ‘$m_jamoat‘, ‘$m_date_leave‘, ‘$m_date_arrival‘, ‘$m_date_worck_start‘, ‘$m_date_worck_end‘)»);
-
if ($result == ‘true’) {echo «<p>Ваши данные успешно добавлены!</p>»;}
-
else {echo «<p>Ваши данные не добавлены!</p>»;}
-
echo «<p> Вы ввели не всю информацию поэтому данные в базу не могут быть добавлены.</p>»;
-
<!—Подключаем нижную часть сайта—>
-
<? include («blocks/footer.php»)?>
-
Команда форума
Модератор- С нами с:
- 11 июн 2010
- Сообщения:
- 10.827
- Симпатии:
- 1.174
- Адрес:
- там-сям
Я отредактировал твоё сообщение: вынес его из чужой темы и заменил, сцуко, ббкод [ b ] на [ php ]
теперь видно и синтаксис, и номера строк. Так ведь лучше, правда?
— Добавлено —
Ошибка «unexpected… траляляля» означает, что ты что-то сделал неправильно ДО указанного места. Пропустил точку с запятой или скобки непарные.Чувак, на каждую открывающую скобку должна быть одна закрывающая. В твоём случае, в строке 49 перед каждым isset ты тупо накопировал открывающую скобку. поэтому фигурная скобка случилась в неожиданном (unexpected) для PHP месте.
-
- С нами с:
- 2 авг 2017
- Сообщения:
- 5
- Симпатии:
- 0
-
Команда форума
Модератор- С нами с:
- 11 июн 2010
- Сообщения:
- 10.827
- Симпатии:
- 1.174
- Адрес:
- там-сям
-
Команда форума
Модератор- С нами с:
- 25 июл 2013
- Сообщения:
- 12.162
- Симпатии:
- 1.770
- Адрес:
- :сердА
А еще в isset можно через запятую передавать переменные..
-
- С нами с:
- 9 мар 2016
- Сообщения:
- 2.993
- Симпатии:
- 759
-
foreach ( $_POST as $k => $v ) {
-
Команда форума
Модератор- С нами с:
- 25 июл 2013
- Сообщения:
- 12.162
- Симпатии:
- 1.770
- Адрес:
- :сердА
Ну, раз пошла такая пьянка, то можно сделать проще:
Васяня и TeslaFeo нравится это.
-
- С нами с:
- 1 апр 2013
- Сообщения:
- 7.562
- Симпатии:
- 1.284
- Адрес:
- Лень
filter_input_array
— Добавлено —а дальше через иссет все переменные дергаем, тобишь снова говнокод
-
- С нами с:
- 2 авг 2017
- Сообщения:
- 5
- Симпатии:
- 0
как ставит код чтоб было видно
как ставит код чтоб было видно синтаксис, и номера строк?
-
- С нами с:
- 2 авг 2017
- Сообщения:
- 5
- Симпатии:
- 0
выдает сообщение что данные обновились, но после обновления главной страницы изменения не сохранились.
-
include («blocks/bd.php»);
-
if (isset($_POST[‘m_reg_date’])) {$m_reg_date = $_POST [‘m_reg_date’]; if ($m_reg_date == ») {unset ($m_reg_date);}}
-
if (isset($_POST[‘m_surname’])) {$m_surname = $_POST [‘m_surname’]; if ($m_surname == ») {unset ($m_surname);}}
-
if (isset($_POST[‘m_name’])) {$m_name = $_POST [‘m_name’]; if ($m_name == ») {unset ($m_name);}}
-
if (isset($_POST[‘m_fathername’])) {$m_fathername = $_POST [‘m_fathername’]; if ($m_fathername == ») {unset ($m_fathername);}}
-
if (isset($_POST[‘m_sex’])) {$m_sex = $_POST [‘m_sex’]; if ($m_sex == ») {unset ($m_sex);}}
-
if (isset($_POST[‘m_dob’])) {$m_dob = $_POST [‘m_dob’]; if ($m_dob == ») {unset ($m_dob);}}
-
if (isset($_POST[‘m_nation’])) {$m_nation = $_POST [‘m_nation’]; if ($m_nation == ») {unset ($m_nation);}}
-
if (isset($_POST[‘m_pass_number’])) {$m_pass_number = $_POST [‘m_pass_number’]; if ($m_pass_number == ») {unset ($m_pass_number);}}
-
if (isset($_POST[‘m_pass_date’])) {$m_pass_date = $_POST [‘m_pass_date’]; if ($m_pass_date == ») {unset ($m_pass_date);}}
-
if (isset($_POST[‘m_pass_issued’])) {$m_pass_issued = $_POST [‘m_pass_issued’]; if ($m_pass_issued == ») {unset ($m_pass_issued);}}
-
if (isset($_POST[‘m_address’])) {$m_address = $_POST [‘m_address’]; if ($m_address == ») {unset ($m_address);}}
-
if (isset($_POST[‘m_edu_lavel’])) {$m_edu_lavel = $_POST [‘m_edu_lavel’]; if ($m_edu_lavel == ») {unset ($m_edu_lavel);}}
-
if (isset($_POST[‘m_jamoat’])) {$m_jamoat = $_POST [‘m_jamoat’]; if ($m_jamoat == ») {unset ($m_jamoat);}}
-
if (isset($_POST[‘m_date_leave’])) {$m_date_leave = $_POST [‘m_date_leave’]; if ($m_date_leave == ») {unset ($m_date_leave);}}
-
if (isset($_POST[‘m_date_arrival’])) {$m_date_arrival = $_POST [‘m_date_arrival’]; if ($m_date_arrival == ») {unset ($m_date_arrival);}}
-
if (isset($_POST[‘m_date_worck_start’])){$m_date_worck_start = $_POST[‘m_date_worck_start’]; if ($m_date_worck_start == ») {unset ($m_date_worck_start);}}
-
if (isset($_POST[‘m_date_worck_end’])) {$m_date_worck_end = $_POST [‘m_date_worck_end’]; if ($m_date_worck_end == »){unset ($m_date_worck_end);}}
-
if (isset($_POST[‘id’])) {$id = $_POST [‘id’];}
-
<!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «http://www.w3.org/TR/html4/loose.dtd»>
-
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>
-
<title>Обработчик</title>
-
<link href=»style.css» rel=»stylesheet» type=»text/css»>
-
<table width=»690″ align=»center» bordercolor=»#FFFFFF» bgcolor=»#FFFFFF» class=»main_border»>
-
<!—Подключаем шапку сайта—>
-
<? include («blocks/header.php»);?>
-
<!—Подключаем левый блок сайта—>
-
<? include («blocks/lefttd.php»)?>
-
/*Здесь пишем что можно заносить информацию в базу*/
-
m_reg_date=’$m_reg_date‘, m_surname=’$m_surname‘, m_name=’$m_name‘, m_fathername=’$m_fathername‘, m_sex=’$m_sex‘, m_dob=’$m_dob‘, m_nation=’$m_nation‘, m_pass_number=’$m_pass_number‘, m_pass_date=’$m_pass_date‘, m_pass_issued=’$m_pass_issued‘, m_address=’$m_address‘,
-
m_edu_lavel=’$m_edu_lavel‘, m_jamoat=’$m_jamoat‘, m_date_leave=’$m_date_leave‘, m_date_arrival=’$m_date_arrival‘,
-
m_date_worck_start=’$m_date_worck_start‘, m_date_worck_end=’$m_date_worck_end‘ WHERE id=’$id‘»);
-
if ($result == ‘true’) {echo «<p>Данные успешно обновлены!</p>»;}
-
else {echo «<p>Данные не обновлены!</p>»;}
-
echo «<p> Вы ввели не всю информацию поэтому данные в базу не могут быть обновлены.</p>»;
-
<!—Подключаем нижную часть сайта—>
-
<? include («blocks/footer.php»)?>
-
- С нами с:
- 1 апр 2013
- Сообщения:
- 7.562
- Симпатии:
- 1.284
- Адрес:
- Лень
Дерьмо а не код
— Добавлено —
прочти про фильтры , не игнорь бл* посты -
- С нами с:
- 2 авг 2017
- Сообщения:
- 5
- Симпатии:
- 0
и именно после WHERE id=’$id’ обновления не происходит, без WHERE id=’$id’ обновления происходить но во всех данных, к примеру если мы изменяем какую та фамилию то это фамилия присваивается к другим фамилиям.
Нужна Ваша помощь. -
xaker01
Активный пользователь- С нами с:
- 16 апр 2016
- Сообщения:
- 210
- Симпатии:
- 34
Для начало код приводить в читабельный вид. хотя это сложно назвать читабельным тоже.
-
include («blocks/bd.php»);
-
if (isset($_POST[‘m_reg_date’])) {
-
$m_reg_date = $_POST [‘m_reg_date’];
-
if (isset($_POST[‘m_surname’])) {
-
$m_surname = $_POST [‘m_surname’];
-
if (isset($_POST[‘m_name’])) {
-
$m_name = $_POST [‘m_name’];
-
if (isset($_POST[‘m_fathername’])) {
-
$m_fathername = $_POST [‘m_fathername’];
-
if ($m_fathername == ») {
-
if (isset($_POST[‘m_sex’])) {
-
$m_sex = $_POST [‘m_sex’];
-
if (isset($_POST[‘m_dob’])) {
-
$m_dob = $_POST [‘m_dob’];
-
if (isset($_POST[‘m_nation’])) {
-
$m_nation = $_POST [‘m_nation’];
-
if (isset($_POST[‘m_pass_number’])) {
-
$m_pass_number = $_POST [‘m_pass_number’];
-
if ($m_pass_number == ») {
-
if (isset($_POST[‘m_pass_date’])) {
-
$m_pass_date = $_POST [‘m_pass_date’];
-
if ($m_pass_date == ») {
-
if (isset($_POST[‘m_pass_issued’])) {
-
$m_pass_issued = $_POST [‘m_pass_issued’];
-
if ($m_pass_issued == ») {
-
if (isset($_POST[‘m_address’])) {
-
$m_address = $_POST [‘m_address’];
-
if (isset($_POST[‘m_edu_lavel’])) {
-
$m_edu_lavel = $_POST [‘m_edu_lavel’];
-
if ($m_edu_lavel == ») {
-
if (isset($_POST[‘m_jamoat’])) {
-
$m_jamoat = $_POST [‘m_jamoat’];
-
if (isset($_POST[‘m_date_leave’])) {
-
$m_date_leave = $_POST [‘m_date_leave’];
-
if ($m_date_leave == ») {
-
if (isset($_POST[‘m_date_arrival’])) {
-
$m_date_arrival = $_POST [‘m_date_arrival’];
-
if ($m_date_arrival == ») {
-
if (isset($_POST[‘m_date_worck_start’])) {
-
$m_date_worck_start = $_POST[‘m_date_worck_start’];
-
if ($m_date_worck_start == ») {
-
unset($m_date_worck_start);
-
if (isset($_POST[‘m_date_worck_end’])) {
-
$m_date_worck_end = $_POST [‘m_date_worck_end’];
-
if ($m_date_worck_end == ») {
-
unset($m_date_worck_end);
-
if (isset($_POST[‘id’])) {
-
<!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «http://www.w3.org/TR/html4/loose.dtd»>
-
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>
-
<title>Обработчик</title>
-
<link href=»style.css» rel=»stylesheet» type=»text/css»>
-
<table width=»690″ align=»center» bordercolor=»#FFFFFF» bgcolor=»#FFFFFF» class=»main_border»>
-
<!—Подключаем шапку сайта—>
-
<? include («blocks/header.php»); ?>
-
<!—Подключаем левый блок сайта—>
-
<? include («blocks/lefttd.php») ?>
-
/* Здесь пишем что можно заносить информацию в базу */
-
m_reg_date=’$m_reg_date‘, m_surname=’$m_surname‘, m_name=’$m_name‘, m_fathername=’$m_fathername‘, m_sex=’$m_sex‘, m_dob=’$m_dob‘, m_nation=’$m_nation‘, m_pass_number=’$m_pass_number‘, m_pass_date=’$m_pass_date‘, m_pass_issued=’$m_pass_issued‘, m_address=’$m_address‘,
-
m_edu_lavel=’$m_edu_lavel‘, m_jamoat=’$m_jamoat‘, m_date_leave=’$m_date_leave‘, m_date_arrival=’$m_date_arrival‘,
-
m_date_worck_start=’$m_date_worck_start‘, m_date_worck_end=’$m_date_worck_end‘ WHERE id=’$id‘»);
-
echo «<p>Данные успешно обновлены!</p>»;
-
echo «<p>Данные не обновлены!</p>»;
-
echo «<p> Вы ввели не всю информацию поэтому данные в базу не могут быть обновлены.</p>»;
-
<!—Подключаем нижную часть сайта—>
-
<? include («blocks/footer.php») ?>
Далее с 1 по 109 строчку сокрашаем до 10 максимум строчек.
Выше тебе уже написали как.Далее строчки начиная с 133
-
/* Здесь пишем что можно заносить информацию в базу */
Опять укоротить.
И смотреть в сторону mysqli/pdo . С подготовленными запросами.И тогда уже может не прийдется помогать, или помочь уже будет намного легче
4.2. Формальные и фактические аргументы Maple—
процедуры
Формальный аргумент процедуры в общем случае имеет вид <Id>::<Тип>, т. е. Id-идентифи- катор с приписанным ему типом, который не является обязательным. В случае определения типированного формального аргумента при передаче процедуре в момент ее вызова фактического аргумента, последний проверяется на соответствие типу формального аргумента. При несовпадении типов идентифицируется ошибочная ситуация с выводом соответствующей диагностики. Совершенно иная ситуация имеет место при несовпадении числа передаваемых процедуре фактических аргументов числу ее формальных аргументов: (1) в случае числа фактических аргументов, меньшего определенного для процедуры числа формальных аргументов, как правило, идентифицируется ошибочная ситуация типа “Error, (in Proc) Proc uses a nth argument <Id>, which is missing”, указывающая на то, что Proc-процедуре было передано меньшее число фактических аргументов, чем имеется формальных аргументов в ее определении; где Id — идентификатор первого недостающего n-го фактического аргумента; (2) в случае числа фактических аргументов, большего определенного для процедуры числа формальных аргументов, ошибочной ситуации не идентифицируется и лишние аргументы игнорируются. Между тем, и в первом случае возможен корректный вызов. Это будет в том случае, когда в теле процедуры не используются формальные аргументы явно. Следующий простой фрагмент хорошо иллюстрирует вышесказанное:
> Proc:= proc(a, b, c) |
nargs, [args] end proc: Proc(5, 6, 7, 8, 9, 10), Proc(5), Proc(), Proc(5, 6, 7); |
6, [5, 6, 7, 8, 9, 10], 1, [5], 0, [], 3, [5, 6, 7] |
|
> Proc:= proc(a, b, c) |
a*b*c end proc: Proc(5, 6, 7), Proc(5, 6, 7, 8, 9, 10); 210, 210 |
> Proc(645); |
Error, (in Proc) Proc uses a 2nd argument, b, which is missing
>AVZ:= proc(x::integer, y, z::float) evalf(sqrt(x^3 + y^3)/(x^2 + y^2)*z) end proc:
>AVZ(20.06, 59, 64);
Error, AVZ expects its 1st argument, x, to be of type integer, but received 20.06
> AVZ(2006, 456);
Error, (in AVZ) AVZ uses a 3rd argument, z (of type float), which is missing
> [AVZ(64, 42, 19.42), AVZ(59, 42, 19.42, 78, 52)]; [1.921636024, 1.957352295]
Вмомент вызова процедуры с передачей ей фактических выражений для ее соответствующих формальных аргументов первые предварительно вычисляются и их значения передаются в тело процедуры для замещения соответствующих им формальных аргументов, после чего производится вычисление составляющих тело Maple-предложений с возвратом значения последнего вычисленного предложения, если не было указано противного. В случае наличия в определении процедуры типированных формальных аргументов элементы последовательности передаваемых при ее вызове фактических значений проверяются на указанный тип и в случае несовпадения инициируется ошибочная ситуация, в противном случае выполнение процедуры продолжается. В качестве типов формальных аргументов процедуры используются любые из допустимых языком и тестируемых функцией type и процедурой whattype. В случае использования нетипированного формального аргумента рекомендуется все же указывать для него anything-тип, информируя других пользователей процедуры о том, что для данного формального аргумента допускаются значения любого типа, например, кодированием заголовка процедуры в виде proc(X::integer, Y::anything).
Вкачестве формальных аргументов могут выступать последовательности допустимыхе Maple— выражений, типированных переменных, либо пустая последовательность. Типированная переменная кодируется в следующем формате:
<Переменная>::<Тип>
171
Тип может быть как простым, так и сложным. При обнаружении в точке вызова процедуры фактического аргумента, типом отличающегося от заданного для соответствующего ему фор— мального аргумента, возникает ошибочная ситуация с возвратом через lasterror-переменную соответствующей диагностики и с выводом ее в текущий документ, например:
> A:=proc(a::integer, b::float) a*b end proc: A(64, 42);
Error, invalid input: A expects its 2nd argument, b, to be of type float, but received 42
> lasterror;
«invalid input: %1 expects its %-2 argument, %3, to be of type %4, but received %5»
Использование типированных формальных аргументов дает возможность контролировать на допустимость передаваемые процедуре фактические аргументы, однако данный подход не совсем удобен при решении вопроса устойчивости процедур. С этой целью рекомендуеся обеспечивать проверку получаемых процедурой фактических аргументов в теле самой процедуры и производить соответствующую программную обработку недопустимых фактических аргументов. В качестве простого примера модифицируем предыдущий фрагмент следующим очевидным образом:
> A1:=proc(a::numeric, b::numeric) local a1, b1; assign(a1=a, b1=b); if not type(a, ‘integer’) then a1:=round(a) end if; if not type(b, ‘float’) then b1:=float(b) end if; a*b end proc: A1(64, 42), 17*A1(10/17, 59); 2688, 590
Большинство процедур нашей библиотеки [103] использует именно подобный подход программной обработки получаемых фактических аргументов на их допустимость и, по возможности, производятся допустимые корректировки. Это существенно повышает устойчивость процедур относительно некорректных фактических аргументов.
При организации процедур роль типированных формальных аргументов не ограничивается только задачами проверки входной информации, но несет и ряд других важных нагрузок. В частности, использование uneval-типа для формального аргумента позволяет вне процедуры проводить его модификацию (т.е. обновлять на «месте» Maple—объект, определенный вне тела процедуры под этим идентификатором) как это иллюстрирует нижеследующий фрагмент:
A := proc (L::list, a::anything ) assign(‘L‘ = subs(a = NULL, L)) end proc
> L:=[64, 59, 39, 44, 10, 17]; A(L, 64); L := [64, 59, 39, 44, 10, 17] Error, (in assign) invalid arguments
A1 := proc (L::uneval, a::anything ) if not type(L, ‘symbol‘) then
error «1st argument must be symbol but had received %1» , whattype(L) elif type(eval(L), {‘list‘, ‘set‘}) then assign(‘L‘ = subs(
[`if`( not type(a, {‘list‘, ‘set‘}), a = NULL, seq(k = NULL, k = a))],
eval(L)))
else error «1st argument must has type {list, set} but had received %1-type» , whattype(eval(L))
end if end proc
> A1(L, 64), L, A1(L, 59), L, A1(L, {59, 39, 44, 10, 17}), L; [59, 39, 44, 10, 17], [39, 44, 10, 17], [] > A1(AVZ, 64), AVZ;
Error, (in A1) 1st argument must has type {list, set} but had received symbol-type
> A1([1, 2, 3, 4, 5, 6], 64);
Error, (in A1) 1st argument must be symbol but had received list
Попытка определить такую операцию для стандартно типированного L-аргумента в А-про- цедуре вызывает ошибку выполнения, тогда как, определив этот же L-аргумент как аргумент uneval-типа и использовав в дальнейшем обращение к нему через eval-функцию, получаем вполне корректную А1-процедуру, обеспечивающую обновление «на месте» списка/множест-
172
ва L путем удаления его элементов, определенных вторым a-аргументом, в качестве которого может выступать как отдельный элемент, так и их список/множество. Проверка же на тип фактического L-аргумента производится уже программного в самой процедуре; при этом, проверяется не только на тип {list, set}, но и на получение идентификатора объекта, а не его значения (т.е. в качестве фактического L-аргумента должно выступать имя списка/множества). Данный прием может оказаться весьма полезным в практическом программировании, именно он используется рядом процедур нашей библиотеки [103].
Для организации процедуры наряду с предложениями, описывающими непосредственный алгоритм решаемой задачи (а в ряде случаев и для обеспечения самого алгоритма), Maple-язык предоставляет ряд важных средств, обеспечивающих функции, управляющие выполнением процедуры. В первую очередь, к ним можно отнести переменные args и nargs, возвращающие соответственно последовательность переданных процедуре фактических аргументов и их коли— чество. Оба эти средства имеют смысл только в рамках процедуры, а по конструкциям вида args{|[n]|[n..m]} можно получать {последовательность фактических аргументов|n—й аргумент|
аргументы с n—го по m—й включительно} соответственно. Тогда как nargs-переменная возвращает количество полученных процедурой фактических аргументов. Назначение данных средств достаточно прозрачно и обусловливает целый ряд их важных приложений при разработке пользовательских процедур. В первую очередь, это относится к обработке получаемых процедурой фактических аргументов. В частности, nargs-переменная необходима с целью обеспечения определенности выполнения вычислений в случае передачи процедуре неопределенного числа аргументов. Следующий простой фрагмент иллюстрирует сказанное:
> SV:= proc() product(args[k], k= 1 .. nargs)/sum(args[k], k= 1 .. nargs) end proc: > 137*SV(42, 47, 62, 67, 89, 96, 350, 39, 44, 59, 64); 22698342960272179200
> GN:= proc() [nargs, [args]] end proc: GN(V, G, S, A, Art, Kr);
[6, [V, G, S, A, Art, Kr]]
> map(whattype, [59, 17/10, ln(x), 9.9, «RANS»]);
[integer, fraction, function, float, string]
>Arg_Type:= proc() map(whattype, [seq(args[k], k= 1 .. nargs)]) end proc:
>Arg_Type(59, 17/10, ln(x), 9.9, «RANS»);
[integer, fraction, function, float, string]
>Arg_Type:= proc() map(whattype, [args[k]$k= 1 .. nargs]) end proc:
>Arg_Type(59, 17/10, ln(x), 9.9, «RANS»);
[integer, fraction, function, float, string]
Приведенный фрагмент достаточно прозрачен и особых пояснений не требует. Более того, как иллюстрирует уже первый пример, число передаваемых процедуре фактических аргументов не обязательно должно соответствовать числу ее формальных аргументов. Данный пример иллюстрирует, что в общем случае Maple-процедуру можно определять, не привязываясь к конкретному списку ее формальных аргументов, но определять формальной функциональной конструкцией следующего общего вида:
proc() <ТЕЛО> {Ψ(args[1], args[2], …, args[n])|n = nargs} end proc {;|:}
что оказывается весьма удобным механизмом для организации процедур, ориентированных, в первую очередь, на задачи символьных вычислений и обработки [9-14,39].
Дополнительно к переменным args и nargs можно отметить еще одну важную переменную procname, возвращающую имя процедуры ее содержащей. В целом ряде случаев данная переменная оказывается весьма полезной, в частности, при возвращении вызова процедуры не— вычисленным. С этой целью используется конструкция формата ‘procname(args)’. Многие пакетные процедуры возвращают результат именно в таком виде, если не могут решить задачу. Ряд процедур и нашей библиотеки [103] поступают аналогичным образом. Между тем, переменная может procname использоваться и в других полезных приложениях. Следующий фрагмент иллюстрирует применение указанной переменной как для организации возврата вызова процедуры невычисленным, так и для вывода соответствующего сообщения:
173
AVZ := proc ()
if nargs ≤ 6 then
WARNING(«%1(%2)=%3», procname , seqstr(args), `+`(args)/nargs ) else ‘procname (args)’
end if end proc
> AVZ(64, 59, 39, 44, 10, 17);
Warning, AVZ(64, 59, 39, 44, 10, 17)=233/6
> AVZ(64, 59, 39, 44, 10, 17, 6); AVZ(64, 59, 39, 44, 10, 17, 6)
Процедура AVZ при получении не более 6 фактических аргументов выводит соответствующее сообщение, описывающее вызов процедуры и его результат, тогда как в противном случае вызов процедуры возвращается невычисленным. Исходные тексты процедур нашей библиотеки, прилагаемой к книге [103], предоставляют неплохой иллюстративный материал по использованию переменных args, nargs и procname процедуры в различных ситуациях.
174
4.3. Локальные и глобальные переменные Maple—
процедуры
Используемые в теле процедуры переменные по области определения делятся на две группы: глобальные (global) и локальные (local). Глобальные переменные определены в рамках всего текущего сеанса работы с ядром пакета и их значения доступны как для использования, так и для модификации в любой момент и в любой Maple-конструкции, где их применение корректно. Для указания переменной глобальной ее идентификатор кодируется в global-секции определения процедуры, обеспечивая процедуре доступ к данной переменной. В этой связи во избежание возможной рассинхронизации вычислений и возникновения ошибочных ситуаций рекомендуется в качестве глобальных использовать в процедурах только те переменные, значения которых ими не модифицируются, а только считываются. В противном случае не исключено возникновение отмеченных ситуаций, включая и непредсказуемые. Следующий пример иллюстрирует некорректность определения в процедуре глобальной х-переменной:
> x:=64: proc(y) global x; x:=0; y^(x+y) end proc(10); evalf(2006/x); 10000000000 Error, numeric exception: division by zero
> x:=64: proc(y) global x; x:=0; y^(x+y) end proc: evalf(2006/x); 31.34375000
вызывающей в дальнейшем ошибочную ситуацию. При этом, следует иметь в виду, что вычисление определения процедуры не изменяет значений содержащихся в ней глобальных переменных, а вычисляются они лишь в момент реального вызова процедуры, как это иллюстрируют оба примера фрагмента.
Если для переменных, используемых в определении процедуры, не определена область их действия (local, global), то Maple-язык классифицирует их следующим образом. Каждая переменная, получающая в теле процедуры определение по (:=)-оператору либо переменная цикла, определяемая функциями {seq, add, mul} полагается локальной (local), остальные полагаются глобальными (global) переменными. При этом, если переменные for-цикла не определены локальными явно, то выводится предупреждающее сообщение вида “Warning, `k` is implicitly declared local to procedure `P`”, где k и P – переменная цикла в процедуре P соответственно. Тогда как для функций sum и product переменные цикла рассматриваются глобаль— ными, не выводя каких-либо сообщений, что предполагает их явное определение в local-сек- ции. Однако вне зависимости от наличия предупреждающих сообщений рекомендуется яв— но указывать локальные и глобальные переменные, что позволит не только избегать ошибок выполнения, но и более четко воспринимать исходный текст процедуры. Следующий фрагмент иллюстрирует вышесказанное:
> G:= 2: A:= proc(n) V:=64: [args, assign(‘G’, 5), assign(‘V’, 9), assign(cat(H, n), `h`)] end proc:
Warning, `V` is implicitly declared local to procedure `A`
> [A(99), G, V, A(10), whattype(H9), H9]; [[99], 5, 9, [10], symbol, H9]
>k:= 64: H:= proc() product(args[k], k=1 .. nargs)/sum(args[k], k=1 .. nargs) end proc:
>[k, H(42, 47, 62, 67, 96, 89, 10, 17, 4), k];
Error, (in H) invalid subscript selector
> k:= 64: H:= proc() local k; product(args[k], k=1 .. nargs)/sum(args[k], k=1 .. nargs) end proc: > [k, H(42, 47, 62, 67, 96, 89, 10, 17, 4), k]; [64, 109772628480, 64]
> G:=proc() [seq(args[k],k=1..nargs), mul(args[n], n=1..nargs)/add(args[p], p=1..nargs)] end proc:
> k:=64: n:= 95: p:= 99: G(1, 2, 3, 4, 5, 6, 7, 8, 9): [k, n, p]; |
[64, 95, 99] |
> k:=64: P:= () -> [seq(args[k], k=1..nargs)]: P(1, 2, 3), k; |
[1, 2, 3], 64 |
> k:=64: P:= () -> [add(args[k], k=1..nargs)]: P(1, 2, 3), k; |
[6], 64 |
> k:=64: P:= () -> [mul(args[k], k=1..nargs)]: P(1, 2, 3), k; |
[6], 64 |
> k:=64: P:= () -> [sum(args[k], k=1..nargs)]: P(1, 2, 3), k; |
|
Error, (in P) invalid subscript selector |
175
> k:=64: P:= () -> [product(args[k], k=1..nargs)]: P(1, 2, 3), k;
Error, (in P) invalid subscript selector
> k:=64: P:=proc() for k to nargs do end do end proc: P(1, 2, 3), k; 64 Warning, `k` is implicitly declared local to procedure `P`
Таким образом, в указанных случаях соответствующие переменные процедуры при ее вычислении неявно декларируются локальными с выводом или без предупреждающих сообщений. С другой стороны, глобальные переменные даже без их явного декларирования в global-сек- ции можно генерировать в рамках процедуры, как это иллюстрирует первый пример предыдущего фрагмента. Делать это позволяет процедура assign. Однако работа с такими глобаль— ными переменными чревата непредсказуемыми последствиями. Таким образом, практика программирования в среде Maple-языка рекомендует следовать следующим двум правилам определения области действия переменных:
(1) глобальными определять переменные лишь используемые в режиме ”чтения”; (2) локальные переменные определять явно в local—секции процедуры.
Использование данных правил позволит избежать многих ошибок, возникающих лишь в момент выполнения Maple-программ, синтаксически и семантически корректных, но не учитывающих специфики механизма использования языком глобальных и локальных переменных. А именно: если глобальная переменная имеет областью определения весь текущий сеанс работы с пакетои, включая тело процедуры (глобально переопределять ее можно внутри любой Maple—кон— струкции), то локальная переменная областью определения имеет лишь тело процедуры и вне процедуры она полагается неопределенной, если до того не была определена вне процедуры глобально переменная с тем же идентификатором. Данный механизм имеет глубокий смысл, ибо позволяет локализовать действия переменных рамками процедуры (в общем случае черного ящика), не влияя на общий вычислительный процесс текущего сеанса работы с пакетом. Примеры предыдущего фрагмента наглядно иллюстрируют практическую реализацию описанного механизма локализации переменных в Maple-процедурах.
По assign-процедуре в теле процедур можно назначать выражения как локальным (заданным явно), так и глобальным (заданным явно либо неявно) переменным. Однако, здесь имеется одно весьма существенное отличие. Как известно, пакет не допускает динамического генерирования имен в левой части (:=)-оператора присваивания, тогда как на основе assign-процедуры это возможно делать. Это действительно существенная возможность, весьма актуальная в целом ряде задач практического программирования [103]. Между тем, если мы по процедуре assign в теле процедуры будем присваивать выражения локальным переменным и сгенерированным одноименным с ними переменным, то во втором случае присвоения производятся именно глобальным переменным, не затрагивая локальных. Нижеследующий пример весьма наглядно иллюстрирует вышесказанное.
> restart; V42, G47:= 10, 17: proc() local V42, G47; assign(V42=64, G47=59); assign(cat(V, 42)=100, cat(G, 47)=200); [V42, G47] end proc(), [V42, G47]; [64, 59], [100, 200]
Таким образом, данное обстоятельство следует учитывать при работе с динамически генерируемыми переменными в теле процедур.
Следует еще раз отметить, что для предложений присвоения в процедурах в целом ряде случаев использование assign-процедуры является единственно возможным подходом. Однако, при таком подходе в общем случае требуется, чтобы левая часть уравнения x=a в assign(x=a) была неопределенным именем, т.е. для нее должно выполняться соотношение type(x, ‘symbol’) = true. И здесь вполне допустимо использование конструкций следующего общего формата:
assign(op([unassign(‘<Имя>‘), <Имя>]) = <Выражение>)
При этом, для таких объектов как процедуры, модули, таблицы и массивы (включая матрицы и векторы в смысле Maple, а не NAG) кодирование их имен в невычисленном формате необяза—
176
тельно, что может существенно облегчать программирование. Следующий весьма простой фрагмент иллюстрирует вышесказанное:
> x:= 64: assign(op([unassign(x), x]) = 59); x; 64
Error, (in unassign) cannot unassign ’64’ (argument must be assignable)
> P:= proc() end proc: M:= module() end module: T:= table([]): A:= array([]): > map(whattype, map(eval, [P, M, T, A])); [procedure, module, table, array]
> seq(assign(op([unassign(k), k])=59), k=[P,M,T,A]); [P,M,T,A], map(type, [P,M,T,A], ‘odd’);
[59, 59, 59, 59], [true, true, true, true]
Вчастности, данный прием оказывается весьма удобным при необходимости присваиваний выражений глобальным переменным или фактическим аргументам процедуры, передаваемым через формальный uneval-аргумент.
Всвязи с вышесказанным следует сделать одно весьма существенное замечание, поясняющее необходимость явного определения локальных переменных в процедуре. Первые два случая нижеследующей схемы отражают классическое определение глобальных и локальных переменных, заключающееся в их явном декларировании.
Процедура |
|||
(1) |
global (x = a) |
global (x = a) |
global (x = a) |
(2) |
global (x = a) |
local (x = b) |
global (x = a) |
(3) |
x true |
local (x = b) |
x::{name|symbol} |
type(x, {‘name|symbol‘}) |
|||
(4) |
(x = a) false |
Error—ситуация |
x = a |
Вслучае (1) явно либо неявно определенная х-переменная процедуры на всем протяжении текущего сеанса сохраняет свое значение до его переопределения вне или в самой процедуре.
Вслучае (2) определенная локально в теле процедуры х-переменная в рамках процедуры может принимать значения, отличные от ее глобальных значений вне ее, т.е. в процедуре временно подавляется действие одноименной с ней глобальной х-переменной. Однако здесь имеют место и особые случаи (3, 4), не охватываемые стандартным механизмом. Для ряда функций, использующих ранжированные переменные (например, sum, product), возможны две ситуации, если такие переменные не декларировались в процедуре явно. Прежде всего, как отмечалось выше, не выводится предупреждающих сообщений о том, что они предполагаются локальны— ми. Следовательно, они согласно трактовке Maple-языка должны рассматриваться глобальны— ми. Между тем, если на момент вызова процедуры, содержащей такие функции, ранжированная х-переменная была неопределенной (случай 3), то получая значения в процессе выполнения процедуры, после выхода из нее она вновь становится неопределенной, т.е. имеет место глобальное поведение переменной. Если же на момент вызова процедуры х-переменная имела значение, то выполнение процедуры инициирует ошибочную ситуацию, а значение х— переменной остается неизменным (случай 4). Рассмотренные ситуации еще раз говорят в пользу явного определения входящих в процедуру переменных.
Наряду со сказанным, локальные переменные могут использоваться в теле процедур в качестве ведущих переменных с неопределенными для них значениями, например:
> y:= 64: GS:= proc(p) local y, F; F:= y -> sum(y^k, k= 0 .. n); diff(F(y), y$p) end proc: > [y, simplify(GS(2))];
y( n + 1 ) n2 − 2 yn n2 + y(n − 1 ) n2 − y(n + 1 ) n + y( n − 1 ) n + 2 yn − 2 |
|||
64, |
|||
3 |
|||
(y − 1) |
|||
Данный фрагмент иллюстрирует использование локальной y-переменной в качестве ведущей переменной F(y)-полинома от одной переменной. Вне области действия процедуры глобаль— ная y-переменная имеет конкретное числовое значение, т.е. их области не пересекаются.
177
Следующий простой фрагмент иллюстрирует взаимосвязь локальных и глобальных переменных, когда вторые определяются как явно в global-секции, так и неявно через assign-процеду- ру. Второй же пример фрагмента иллюстрирует механизм действия uneval-типированного формального аргумента, когда (в отличие от стандарта) ему могут присваиваться выражения на уровне глобальных переменных. Применение подобного весьма полезного приема уже иллюстрировалось в предыдущем разделе.
> P:=proc() local a; global b; x:= 56; assign(‘m’=67); a:= proc(x) m:= 47; assign(‘n’= 89); x end proc; x*a(3) end proc:
Warning, `x` is implicitly declared local to procedure `P` Warning, `m` is implicitly declared local to procedure `a` > n, m:= 100, 100: P(), n, m; 168, 89, 67
> P1:= proc(m::uneval) local a, x; global b; a, x:= 59, 39; b:= 64; assign(‘m’=42) end proc: > m:= 64: P1(m), a, x, b, m; a, x, 64, 42
Еще на одном существенном моменте механизма глобальных и локальных переменных необходимо акцентировать внимание, предварительно пояснив понятие по-уровневого вычисления. Правила вычислений в Maple-языке предполагают нормальными полные вычисления для глобальных переменных и 1-уровневые для локальных. Поясним сказанное первым примером следующего простого фрагмента:
> W:= y^4; |
W := y4 |
(1) |
> y:= z^3; |
y := z3 |
|
> z:= h^2; |
z := h2 |
|
> h:= 3; |
h := 3 |
|
> W; |
282429536481 |
|
> [eval(W, 1), eval(W, 2), eval(W, 3), eval(W, 4)]; [y4, z12, h24, 282429536481] |
(2) |
|
> G:= proc() local W, y, z, h; W:= y^4; y:= z^3; z:= h^2; h:= 2; W end proc: |
(3) |
|
> [G(), eval(G()), evala(G()), evalf(G())]; [y4, 16777216, y4, y4] |
в котором представлена простая рекурсивная цепочка выражений, вычисление которой реализует полностью рекурсивную подстановку и обеспечивает возврат конечного числового значения, т.е. производится полное вычисление для W-выражения, идентификатор которого полагается глобальным. С другой стороны, вызов функции eval(B, n) обеспечивает n—уровневое вычисление заданного ее первым фактическим В-аргументом выражения, что иллюстрирует второй пример фрагмента.
Для полного вычисления произвольного В-выражения используется вызов eval(B)-функции. Однако в первом примере фрагмента W-переменная является глобальной, что и определяет ее полное вычисление, если (как это иллюстрирует второй пример) не определено противного. Наконец, третий пример фрагмента иллюстрирует результат вычисления той же рекурсивной цепочки выражений, но уже составляющих тело процедуры и идентификаторы которых определены в ней локальными. Из примера следует, что если не определено противного, то процедура возвращает только первый уровень вычисления W-выражения и для его полного вычисления требуется использование функции eval, как это иллюстрирует последний пример фрагмента. Данное обстоятельство следует всегда иметь в виду, ибо оно не имеет аналогов в традиционных языках программирования и наряду с требованием особого внимания обеспечивает целый ряд весьма интересных возможностей программирования в различных приложениях.
178
4.4. Определяющие параметры и описания Maple—
процедур
Прежде всего, представим секцию описания (description), завершающую описательную часть определения процедуры и при ее наличии располагающуюся между секциями {local, global, options} и непосредственно телом процедуры. При отсутствии данных секций description— секция располагается непосредственно за заголовком процедуры и кодируется в следующем формате:
description <Строчная конструкция> {:|;}
Определенная в данной секции строчная конструкция не влияет на выполнение процедуры и используется в качестве комментирующей ее компоненты, т.е. она содержит текстовую информацию, предназначенную, как правило, для документирования процедуры. При этом, в отличие от обычного комментария языка, которое игнорируется при чтении процедуры, опи— сание ассоциируется с процедурой при ее выводе даже тогда, когда ее тело не выводится по причине использования рассматриваемой ниже опции Copyright. Более того, определяемый description-секцией комментарий может быть одного из типов {name, string, symbol}, как это иллюстрирует следующий простой фрагмент:
>REA:= proc() description `Average`; sum(args[k], k= 1 .. nargs)/nargs end proc:
>REA(19.42, 19.47, 19.62, 19, 67, 19, 89, 20.06), eval(REA);
34.07125000, proc () description Average; sum(args[k],k = 1 .. nargs)/nargs end proc
>REA:= proc() option Copyright; description «Average of real arguments»; sum(args[k], k= 1 .. nargs)/nargs end proc:
>eval(REA); proc () description «Average of real arguments» … end proc
Данный фрагмент иллюстрирует результат использования description-секции процедуры в случаях как отсутствия, так и наличия в ней дополнительно и Copyright-опции. В примерах фрагмента использовались в description-секции комментарии string-типа. В связи со сказанным, механизм description-секций достаточно прозрачен и особых пояснений не требует. При этом, подавляющее большинство пакетных процедур не содержат description-секций.
Рассмотрев секции local, global и description, несколько детальнее остановимся на {options| option}-секции, которая должна кодироваться непосредственно за двумя первыми (или быть первой при их отсутствии) в описательной части определения процедуры. В качестве параметров (опций) данной секции допускаются следующие: builtin, Copyright, trace, arrow, operator, remember и call_external. При этом, перечень опций может зависеть от релиза пакета.
Пакет располагает тремя типами процедур: встроенными непосредственно в ядро пакета, би— блиотечными и определяемыми самим пользователем. Параметр builtin определяет встроен— ную функцию пакета и при наличии он должен кодироваться первым в списке параметров option-секции. Данный параметр визуализируется при полном вычислении процедуры посредством eval-функции либо по print-функции, например:
> print(eval), eval(readlib);
proc () option builtin; 169 end proc proc () options builtin, remember; 237 end proc
Каждая встроенная функция идентифицируется уникальным номером (зависящим от номера релиза пакета) и пользователь не имеет прямой возможности определять собственные встроенные функции. В приведенном примере первым выводится результат вызова print—функции, а вторым — eval—функции, из чего следует, что встроенные функции eval и readlib имеют соответственно номера 98 и 152 (Maple 8, тогда как уже для Maple 10 эти номера соответственно будут 117 и 274), а вторая процедура имеет дополнительно и remember—опцию.
179
Для проверки процедур могут быть полезны и наши процедуры ParProc, ParProc1 и Sproc [103], обеспечивающие возврат как основных параметров процедур, модулей и пакетов, так и их местоположение в библиотеках Maple, как это иллюстрирует следующий фрагмент:
> ParProc(MkDir), ParProc(came); map(ParProc, [‘add’, march, goto, iostatus, seq]);
Arguments = (F::{symbol, string }) |
Arguments = (E::anything |
) |
|||
locals = (f, h ) |
|||||
, |
|||||
locals = (cd, r, k, h, z, K, L, Λ, t, d, ω, ω1, u, f, s) |
|||||
globals = (__Art_Kr_ ) |
|||||
[builtin function, 91, iolib function, 31, builtin function, 193, iolib function, 13, builtin function, 101] |
> ParProc(DIRAX);
DIRAX is module with exports [new, replace, extract, empty, size, reverse, insert, delete, sortd, printd, conv]
> ParProc(process); inert_function
process is module with exports [popen, pclose, pipe, fork, exec, wait, block, kill, launch]
> ParProc(Int);
Warning, <Int> is inert version of procedure/function <int>
> ParProc1(ParProc1, ‘h’), h;
Warning, procedure ParProc1 is in library [Proc, User, {«c:/program files/maple 8/lib/userlib»}]
Arguments = (M::{procedure , module }) |
||
locals = (a, b, c, d, p, h, t, z, cs, L, R, N, ω, ν) , |
||
globals = (_62, ParProc, Sproc ) |
||
[Proc, User, {«c:/program files/maple 8/lib/userlib» }]
> ParProc1(Sockets, ‘t’), t;
Warning, module Sockets is in library [package, Maple, {«C:\Program Files\Maple 8/lib»}]
[exports = (socketID , Open, Close, Peek, Read, Write, ReadLine , ReadBinary , WriteBinary , Server, Accept, Serve, Address, ParseURL, LookupService , GetHostName , GetLocalHost , GetLocalPort , GetPeerHost , GetPeerPort, GetProcessID , HostInfo , Status , Configure , _pexports )]
[locals = (defun, trampoline , soPath, solib, passign , setup, finalise )]
[options = (package , noimplicit , unload = finalise , load = setup )] [description = («package for connection oriented TCP/IP sockets» )], [package , Maple, {«C:Program FilesMaple 8/lib» }]
>Sproc(MkDir, ‘h’), h; true, [Proc, User, {«c:/program files/maple 9/lib/userlib»}]
>Sproc(`type/package`, ‘h’), h;
true, [Proc, Maple&User, {«C:Program FilesMaple 9/lib», «c:/program files/maple 9/lib/userlib»}]
С описанием данных процедур можно ознакомиться в [103], тогда как сами они находятся в прилагаемой к книге библиотеке. Там же можно получить и их исходные тексты.
Параметр Copyright определяет авторские права процедуры, ограничивая возможности вывода ее определения на печать. В качестве такого параметра пакет рассматривает любую конструкцию option-секции, начинающуюся с Copyright—слова. Все библиотечные Maple-проце- дуры определены с параметром Copyright, требуя для вывода на печать их определений установки опции verboseproc=n (n={2|3}) в interface-процедуре. Типичное содержимое option— секции библиотечных процедур имеет следующий вид:
option `Copyright (c) 1997 Waterloo Maple Inc. All rights reserved.`;
option {system,} `Copyright (c) 1992 by the University of Waterloo. All rights reserved.`;
в зависимости от релиза пакета; при этом, каждый релиз пакета совмещает процедуры и более ранних релизов. Текст любой пакетной процедуры (включая их remember—таблицы), кроме встроенных, можно получать по конструкции следующего простого вида:
interface(verboseproc=3): {print|eval}(<Id—процедуры>);
как это иллюстрирует следующий достаточно простой пример:
180
Соседние файлы в папке Books
- #
- #
18.03.201519.23 Mб35Дьяконов_maple_9.5-10.djvu