Newsgroup: it.comp.lang.c
Titolo: AUITO URGENTE PER ESAME

Programmo un pò in pascal, c'è qualcuno che mi sa spiegare in analogiaal
pascal come si dichiarano le procedure e le funzioni nel linguaggio C?

pascal come si dichiarano le procedure e le funzioni nel linguaggio C?
Punto 1.
Il pascal prevede due tipi di subroutine : le FUNCTION (funzioni) e le
PROCEDURE (procedure). La differenza tra le prime e le seconde e' che
le prime restituiscono un valore, le seconde no.
In C esistono solo le funzioni.
Una dichiarazione Pascal del tipo :
FUNCTION mia_funzione( p : tipo_p ) : tipo_valore_restituito ;
corrisponde in C a
tipo_valore_restituito mia_funzione( tipo_p p )
Es.:
FUNCTION minimo( a, b : integer ) : integer ; 
corrisponde in C a
int minimo( int a, int b )
----------------------------------------------------
Punto 2.
Il pascal consente due tipi di passaggio di parametri : per VALORE e
per RIFERIMENTO. La differenza tra il primo e il secondo e' che il
primo non consente di modificare il parametro passato originariamente,
il secondo si'.
In C esiste solo il passaggio per valore.
----------------------------------------------------
ANALOGIE per il Punto 1. :
In C e' possibile definire delle funzioni che si comportano allo
stesso modo delle PROCEDURE del pascal, ovvero non restituiscono alcun
valore. Dato che il C possiede solo funzioni, si adopera, a questo
proposito, un tipo di valore restituito particolare che si chiama
"void".
"Void" sta per "vuoto" (mancante) ed indica appunto la mancanza di un
valore restituito.
Es.: 
Scrivere in Pascal :
PROCEDURE scrivi( n : integer ) ;
equivale in C a 
void scrivi( int n )
----------------------------------------------------
ANALOGIE per il punto 2. :
In C e' possibile simulare il passaggio per riferimento adoperando i
puntatori. Lo stesso principio e' applicato nel Pascal in modo
implicito (trasparente al programmatore) mediante l'uso della keyword
"var" nella lista dei parametri della procedura/funzione.
Il C, possedendo solo il passaggio per valore dei parametri, copia
l'indirizzo del parametro originario nella lista di parametri, passati
a una funzione. Tramite l'operatore di indirezione "*" (asterisco, che
significa "il valore puntato da ...") si fa quindi riferimento al
valore puntato da quel puntatore e quindi si accede in modo indiretto
al valore del parametro originario.
Es.:
In Pascal :
procedure swap( var a, b : integer ) ;
var t : integer ;
begin
  t = a ;
  a = b ;
  b = t ;
end ;   
corrisponde in C a :
void swap( int *a, int *b ) 
         /*     a contiene un indirizzo, b contiene un indirizzo */
{
     int t ;    /* t e' una variabile di tipo int (intero) locale */
 
     t = *a ;   /* in t si salva il valore puntato da a (*a) */ 
     *a = *b ;  /* il valore puntato da a (*a) viene modificato con 
                   il valore puntato da b (*b) */
     *b = t ;   /* il valore puntato da b viene ora scambiato con
                   il valore di a originario */
}
Andrea Laforgia        (
andrea_...@bigfoot.com
)
----------------------------------------------------
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Il mio indirizzo di posta elettronica e' momentanea-
mente fuori uso...
----------------------------------------------------
There is nothing better for understanding a kangaroo
than seeing it jump.
----------------------------------------------------

pascal come si dichiarano le procedure e le funzioni nel linguaggio C?
In C esistono solo le funzioni.
Una funzione viene dichiarata prima della definizione e prima dell'uso
(Chiamata a funzione)
Es:
float calcola(int,float);
Una funzione viene definita con la scrittura del corpo (Codice della
funzione)
Es:
float calcola(int a,float b){
    float Var;
    <Codice>
    return Var;
}
Certo che quanto ti ho detto non ti servirà a nulla, ti saluto.
Ciao
Carlini Alessio

----------------------------------------------------
Aggiungerei:
Punto 3: in C hai solo funzioni di livello 1.
In pascal puoi fare
var    xx:integer;
procedure pluto(z:integer);
begin
    xx = xx + z;
end;
procedure pippo(a:integer);
var    xx:integer;
  procedure pluto(z:integer);
  begin
     xx = xx+z;
  end;
begin
    pluto(z);
end;
begin
    pippo(1);    {questa fa una cosa}
    pluto(1);      {e questa ne fa un'altra}
end.

    pluto(1);
     e' equivalente...


}
Per essere precisi, l'istruzione "return" restituisce o meno un
valore, ma in dipendenza da una espressione, che puo' anche non essere
costituita da una variabile.
es.:
float fnmul(float a, float b)
{
      return a * b ;


>var    xx:integer;
xx globale, quindi, non viene toccata...


         ^^^ occhio, l'assegnazione in pascal si compie con :=
Gia'. Sono anni che non tocco il pascal, si vede? :-))
Marco

 In C esiste solo il passaggio per valore.
Un'altra differenza è che in C, attualmente, non si possono definire
funzioni all'interno di altre funzioni.
EMG

 Questo e' vero in C++, in C non e' strettamente necessario.
Non mi risulta che il C++ sia diverso dal C sotto questo aspetto.
Sbaglio?
EMG



Aspetta, mi riferisco all'obbligatorieta' della dichiarazione.



Ciao, non conosco il pascal ma posso dirti ciò che sò su procedure e
funzioni.
Le funzioni a differenza delle procedure che non restituiscono nulla (void)
passano un parametro al "chiamante" .
PROCEDURA                   void Nomeprocedura ( tipo_parametro1 ,
tipo_parametro2, ...);
           Esempio:                           void MENU ( int );
FUNZIONE                       tipo_parametro_restituito  NomeFunzione
 tipo_parametro_ricevuto1, tipo_parametro_recevuto2 , ...);
          Esempio:                           int  RADDOPPIA ( float, int,
int[3] );
Nella dichiarazione vanno specificati il tipo del parametro ricevuto, il
nome del sottoprogramma (sia esso funzione o procedura) e  tra parentesi il
tipo dei parametri che riceveranno.Il tutto chiuso dal ";"
Nel caso di array vanno specificate le dimensioni (se pluridimensionali
facoltativa la prima, obbligatorie le altre)........                 int MAT
(int [3], int[][3]);
Questo per ciò che riguarda la dichiarazione...spero ti sia d'aiuto, in
bocca al lupo per l'esame !
bazz...@hotmail.com