Error unexpected local declaration in procedure body

Sorry, we do not have specific information about your error. There are several resources that can help you find a solution:

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 are using an out of date browser. It may not display this or other websites correctly.
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
Fortran Error «Unexpected data declaration statement»

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
Mark, you nailed it. I knew it was something silly. Thank you for your help, I really appreciate it.

  • 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. :redface:

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 программистов …


  1. prog

    С нами с:
    2 авг 2017
    Сообщения:
    5
    Симпатии:
    0

    Выдаётся ошибка, не могу найти ошибку.
    syntax error, unexpected ‘{‘ in X:homelocalhostwwwmigrantadd_list_migrants.php on line 52

    1. include («blocks/bd.php»);
    2. if (isset($_POST[‘m_reg_date’]))           {$m_reg_date = $_POST            [‘m_reg_date’];}
    3. if (isset($_POST[‘m_surname’]))            {$m_surname = $_POST             [‘m_surname’];}
    4. if (isset($_POST[‘m_name’]))               {$m_name = $_POST                [‘m_name’];}
    5. if (isset($_POST[‘m_fathername’]))         {$m_fathername = $_POST          [‘m_fathername’];}
    6. if (isset($_POST[‘m_sex’]))                {$m_sex = $_POST                 [‘m_sex’];}
    7. if (isset($_POST[‘m_dob’]))                {$m_dob = $_POST                 [‘m_dob’];}
    8. if (isset($_POST[‘m_nation’]))             {$m_nation = $_POST              [‘m_nation’];}
    9. if (isset($_POST[‘m_pass_number’]))        {$m_pass_number = $_POST         [‘m_pass_number’];}
    10. if (isset($_POST[‘m_pass_date’]))          {$m_pass_date = $_POST           [‘m_pass_date’];}
    11. if (isset($_POST[‘m_pass_issued’]))        {$m_pass_issued = $_POST         [‘m_pass_issued’];}
    12. if (isset($_POST[‘m_address’]))            {$m_address = $_POST             [‘m_address’];}
    13. if (isset($_POST[‘m_edu_lavel’]))          {$m_edu_lavel = $_POST           [‘m_edu_lavel’];}
    14. if (isset($_POST[‘m_jamoat’]))             {$m_jamoat = $_POST              [‘m_jamoat’];}
    15. if (isset($_POST[‘m_date_leave’]))         {$m_date_leave = $_POST          [‘m_date_leave’];}
    16. if (isset($_POST[‘m_date_arrival’]))       {$m_date_arrival = $_POST        [‘m_date_arrival’];}
    17. if (isset($_POST[‘m_date_worck_start’]))   {$m_date_worck_start = $_POST    [‘m_date_worck_start’];}
    18. if (isset($_POST[‘m_date_worck_end’]))     {$m_date_worck_end = $_POST      [‘m_date_worck_end’];}
    19. <!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «[URL]http://www.w3.org/TR/html4/loose.dtd[/URL]»>
    20. <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>
    21. <title>Обработчик</title>
    22. <link href=»style.css» rel=»stylesheet» type=»text/css»>
    23. <table width=»690″ align=»center» bordercolor=»#FFFFFF» bgcolor=»#FFFFFF» class=»main_border»>
    24. <!—Подключаем шапку сайта—>
    25. <? include («blocks/header.php»);?>
    26.       <!—Подключаем левый блок сайта—>
    27.         <? include («blocks/lefttd.php»)?>
    28. /*Здесь пишем что можно заносить информацию в базу*/
    29. $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‘)»);
    30. if ($result == ‘true’) {echo «<p>Ваши данные успешно добавлены!</p>»;}
    31. else {echo «<p>Ваши данные не добавлены!</p>»;}
    32. echo «<p> Вы ввели не всю информацию поэтому данные в базу не могут быть добавлены.</p>»;
    33.   <!—Подключаем нижную часть сайта—>
    34.    <?  include («blocks/footer.php»)?>


  2. artoodetoo

    Команда форума
    Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.827
    Симпатии:
    1.174
    Адрес:
    там-сям

    Я отредактировал твоё сообщение: вынес его из чужой темы и заменил, сцуко, ббкод [ b ] на [ php ]
    теперь видно и синтаксис, и номера строк. Так ведь лучше, правда?
    — Добавлено —
    Ошибка «unexpected… траляляля» означает, что ты что-то сделал неправильно ДО указанного места. Пропустил точку с запятой или скобки непарные.

    Чувак, на каждую открывающую скобку должна быть одна закрывающая. В твоём случае, в строке 49 перед каждым isset ты тупо накопировал открывающую скобку. поэтому фигурная скобка случилась в неожиданном (unexpected) для PHP месте.


  3. prog

    С нами с:
    2 авг 2017
    Сообщения:
    5
    Симпатии:
    0


  4. artoodetoo

    Команда форума
    Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.827
    Симпатии:
    1.174
    Адрес:
    там-сям


  5. Fell-x27

    Команда форума
    Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.162
    Симпатии:
    1.770
    Адрес:
    :сердА

    А еще в isset можно через запятую передавать переменные..


  6. TeslaFeo

    С нами с:
    9 мар 2016
    Сообщения:
    2.993
    Симпатии:
    759

    1. foreach ( $_POST as $k => $v ) {


  7. Fell-x27

    Команда форума
    Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.162
    Симпатии:
    1.770
    Адрес:
    :сердА

    Ну, раз пошла такая пьянка, то можно сделать проще:


    Васяня и TeslaFeo нравится это.


  8. MouseZver

    С нами с:
    1 апр 2013
    Сообщения:
    7.562
    Симпатии:
    1.284
    Адрес:
    Лень

    filter_input_array
    — Добавлено —

    а дальше через иссет все переменные дергаем, тобишь снова говнокод


  9. prog

    С нами с:
    2 авг 2017
    Сообщения:
    5
    Симпатии:
    0

    как ставит код чтоб было видно

    как ставит код чтоб было видно синтаксис, и номера строк?


  10. prog

    С нами с:
    2 авг 2017
    Сообщения:
    5
    Симпатии:
    0

    выдает сообщение что данные обновились, но после обновления главной страницы изменения не сохранились.

    1. include («blocks/bd.php»);
    2. if (isset($_POST[‘m_reg_date’]))        {$m_reg_date = $_POST       [‘m_reg_date’];          if ($m_reg_date == ») {unset ($m_reg_date);}}  
    3. if (isset($_POST[‘m_surname’]))         {$m_surname = $_POST        [‘m_surname’];          if ($m_surname == ») {unset ($m_surname);}}
    4. if (isset($_POST[‘m_name’]))            {$m_name = $_POST           [‘m_name’];             if ($m_name == ») {unset ($m_name);}}
    5. if (isset($_POST[‘m_fathername’]))      {$m_fathername = $_POST     [‘m_fathername’];       if ($m_fathername == ») {unset ($m_fathername);}}
    6. if (isset($_POST[‘m_sex’]))             {$m_sex = $_POST            [‘m_sex’];             if ($m_sex == ») {unset ($m_sex);}}
    7. if (isset($_POST[‘m_dob’]))             {$m_dob = $_POST            [‘m_dob’];              if ($m_dob == ») {unset ($m_dob);}}
    8. if (isset($_POST[‘m_nation’]))          {$m_nation = $_POST         [‘m_nation’];           if ($m_nation == ») {unset ($m_nation);}}
    9. if (isset($_POST[‘m_pass_number’]))     {$m_pass_number = $_POST    [‘m_pass_number’];      if ($m_pass_number == ») {unset ($m_pass_number);}}
    10. if (isset($_POST[‘m_pass_date’]))       {$m_pass_date = $_POST      [‘m_pass_date’];        if ($m_pass_date == ») {unset ($m_pass_date);}}
    11. if (isset($_POST[‘m_pass_issued’]))     {$m_pass_issued = $_POST    [‘m_pass_issued’];      if ($m_pass_issued == ») {unset ($m_pass_issued);}}
    12. if (isset($_POST[‘m_address’]))         {$m_address = $_POST        [‘m_address’];          if ($m_address == ») {unset ($m_address);}}
    13. if (isset($_POST[‘m_edu_lavel’]))       {$m_edu_lavel = $_POST      [‘m_edu_lavel’];        if ($m_edu_lavel == ») {unset ($m_edu_lavel);}}
    14. if (isset($_POST[‘m_jamoat’]))          {$m_jamoat = $_POST         [‘m_jamoat’];           if ($m_jamoat == ») {unset ($m_jamoat);}}
    15. if (isset($_POST[‘m_date_leave’]))      {$m_date_leave = $_POST     [‘m_date_leave’];       if ($m_date_leave == ») {unset ($m_date_leave);}}
    16. if (isset($_POST[‘m_date_arrival’]))    {$m_date_arrival = $_POST   [‘m_date_arrival’];  if ($m_date_arrival == ») {unset ($m_date_arrival);}}
    17. 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);}}
    18. 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);}}
    19. if (isset($_POST[‘id’]))                {$id = $_POST [‘id’];}
    20. <!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «http://www.w3.org/TR/html4/loose.dtd»>
    21. <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>
    22. <title>Обработчик</title>
    23. <link href=»style.css» rel=»stylesheet» type=»text/css»>
    24. <table width=»690″ align=»center» bordercolor=»#FFFFFF» bgcolor=»#FFFFFF» class=»main_border»>
    25. <!—Подключаем шапку сайта—>
    26. <? include («blocks/header.php»);?>
    27.       <!—Подключаем левый блок сайта—>
    28.         <? include («blocks/lefttd.php»)?>
    29. /*Здесь пишем что можно заносить информацию в базу*/
    30. 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‘,
    31. m_edu_lavel=’$m_edu_lavel‘, m_jamoat=’$m_jamoat‘, m_date_leave=’$m_date_leave‘, m_date_arrival=’$m_date_arrival‘,
    32. m_date_worck_start=’$m_date_worck_start‘, m_date_worck_end=’$m_date_worck_end‘ WHERE id=’$id‘»);
    33. if ($result == ‘true’) {echo «<p>Данные успешно обновлены!</p>»;}
    34. else {echo «<p>Данные не обновлены!</p>»;}
    35. echo «<p> Вы ввели не всю информацию поэтому данные в базу не могут быть обновлены.</p>»;
    36.   <!—Подключаем нижную часть сайта—>
    37.    <?  include («blocks/footer.php»)?>


  11. MouseZver

    С нами с:
    1 апр 2013
    Сообщения:
    7.562
    Симпатии:
    1.284
    Адрес:
    Лень

    Дерьмо а не код
    — Добавлено —
    прочти про фильтры , не игнорь бл* посты


  12. prog

    С нами с:
    2 авг 2017
    Сообщения:
    5
    Симпатии:
    0

    и именно после WHERE id=’$id’ обновления не происходит, без WHERE id=’$id’ обновления происходить но во всех данных, к примеру если мы изменяем какую та фамилию то это фамилия присваивается к другим фамилиям.
    Нужна Ваша помощь.


  13. xaker01

    xaker01
    Активный пользователь

    С нами с:
    16 апр 2016
    Сообщения:
    210
    Симпатии:
    34

    Для начало код приводить в читабельный вид. хотя это сложно назвать читабельным тоже.

    1. include («blocks/bd.php»);
    2. if (isset($_POST[‘m_reg_date’])) {
    3.     $m_reg_date = $_POST [‘m_reg_date’];
    4. if (isset($_POST[‘m_surname’])) {
    5.     $m_surname = $_POST [‘m_surname’];
    6. if (isset($_POST[‘m_name’])) {
    7.     $m_name = $_POST [‘m_name’];
    8. if (isset($_POST[‘m_fathername’])) {
    9.     $m_fathername = $_POST [‘m_fathername’];
    10.     if ($m_fathername == ») {
    11. if (isset($_POST[‘m_sex’])) {
    12.     $m_sex = $_POST [‘m_sex’];
    13. if (isset($_POST[‘m_dob’])) {
    14.     $m_dob = $_POST [‘m_dob’];
    15. if (isset($_POST[‘m_nation’])) {
    16.     $m_nation = $_POST [‘m_nation’];
    17. if (isset($_POST[‘m_pass_number’])) {
    18.     $m_pass_number = $_POST [‘m_pass_number’];
    19.     if ($m_pass_number == ») {
    20. if (isset($_POST[‘m_pass_date’])) {
    21.     $m_pass_date = $_POST [‘m_pass_date’];
    22.     if ($m_pass_date == ») {
    23. if (isset($_POST[‘m_pass_issued’])) {
    24.     $m_pass_issued = $_POST [‘m_pass_issued’];
    25.     if ($m_pass_issued == ») {
    26. if (isset($_POST[‘m_address’])) {
    27.     $m_address = $_POST [‘m_address’];
    28. if (isset($_POST[‘m_edu_lavel’])) {
    29.     $m_edu_lavel = $_POST [‘m_edu_lavel’];
    30.     if ($m_edu_lavel == ») {
    31. if (isset($_POST[‘m_jamoat’])) {
    32.     $m_jamoat = $_POST [‘m_jamoat’];
    33. if (isset($_POST[‘m_date_leave’])) {
    34.     $m_date_leave = $_POST [‘m_date_leave’];
    35.     if ($m_date_leave == ») {
    36. if (isset($_POST[‘m_date_arrival’])) {
    37.     $m_date_arrival = $_POST [‘m_date_arrival’];
    38.     if ($m_date_arrival == ») {
    39. if (isset($_POST[‘m_date_worck_start’])) {
    40.     $m_date_worck_start = $_POST[‘m_date_worck_start’];
    41.     if ($m_date_worck_start == ») {
    42.         unset($m_date_worck_start);
    43. if (isset($_POST[‘m_date_worck_end’])) {
    44.     $m_date_worck_end = $_POST [‘m_date_worck_end’];
    45.     if ($m_date_worck_end == ») {
    46.         unset($m_date_worck_end);
    47. if (isset($_POST[‘id’])) {
    48. <!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «http://www.w3.org/TR/html4/loose.dtd»>
    49.         <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>
    50.         <title>Обработчик</title>
    51.         <link href=»style.css» rel=»stylesheet» type=»text/css»>
    52.         <table width=»690″ align=»center» bordercolor=»#FFFFFF» bgcolor=»#FFFFFF» class=»main_border»>
    53.             <!—Подключаем шапку сайта—>
    54. <? include («blocks/header.php»); ?>
    55.                             <!—Подключаем левый блок сайта—>
    56. <? include («blocks/lefttd.php») ?>
    57.     /* Здесь пишем что можно заносить информацию в базу */
    58. 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‘,
    59. m_edu_lavel=’$m_edu_lavel‘, m_jamoat=’$m_jamoat‘, m_date_leave=’$m_date_leave‘, m_date_arrival=’$m_date_arrival‘,
    60. m_date_worck_start=’$m_date_worck_start‘, m_date_worck_end=’$m_date_worck_end‘ WHERE id=’$id‘»);
    61.         echo «<p>Данные успешно обновлены!</p>»;
    62.         echo «<p>Данные не обновлены!</p>»;
    63.     echo «<p> Вы ввели не всю информацию поэтому данные в базу не могут быть обновлены.</p>»;
    64.                 <!—Подключаем нижную часть сайта—>
    65. <? include («blocks/footer.php») ?>

    Далее с 1 по 109 строчку сокрашаем до 10 максимум строчек.
    Выше тебе уже написали как.

    Далее строчки начиная с 133

    1.     /* Здесь пишем что можно заносить информацию в базу */

    Опять укоротить.
    И смотреть в сторону 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

Понравилась статья? Поделить с друзьями:
  • Error unexpected exception this is probably a bug failed to detect selinux python bindings at
  • Error unexpected exception in schema registry group processing thread
  • Error unexpected exception file already protected compressed protection stopped
  • Error unexpected exception exiting abnormally org apache zookeeper server zookeeperservermain
  • Error unexpected error in launching an agent this is probably a bug in jenkins