Newsgroup: it.comp.lang.pascal
Titolo: Procedure e passaggio di parametri

Uhmmm...piccolo incasinamento e cervellino fuso.... Ma si può come per una 
funzione passare ad una procedura nel momento in cui la si chiama una o più 
variabili dello stesso tipo di quelle dichiarate?? O__o Accidentaccio io 
pensavo di si ma non mi funziona! :(
Devo scambiare due stringhe e due numeri interi per un certo numero di volte 
e per un certo numero di array così ho scritto queste due procedure:
(******************************)
PROCEDURE ScambiaInteri(VAR int1,int2: integer);
  VAR
   temp: integer;
  BEGIN
   temp:=int1;
   int1:=int2;
   int2:=temp;
  END;
(*******************************)
 PROCEDURE ScambiaStringhe(VAR string1,string2: stringa);
  VAR
   temp: stringa;
  BEGIN
   temp:=string1;
   string1:=string2;
   string2:=temp;
  END;
Ma quando poi scrivo
FOR i:=1 TO 10
 BEGIN
  ScambiaInteri(arrayinteri[i],arrayinteri[i+1]);
  ScambiaStringhe(arraystringhe[i],arraystringhe[i+i]);
 END;
Lo scambio non avviene...Non mi era mai capitato di dover fare una cosa del 
genere e mi ritrovo completamente imbambolata...C'entra qualcosa il fatto di 
usare degli array?? O__o
-- 
#___o(^.-)o____Valefatina©___________________________________________#
  [cit] Ama il tuo prossimo, non questo, il prossimo! [/cit]
 
  # Per rispondere in mail leva una 'b' a caso dall'indirizzo.
  # ICQ: 105400693
  # INVIAMI UN SMS [e già che ci sei firmati :)]
  # 
http://www.smsatme.com/sma/sms.php?auth=:A6:19:E6:DE:A0:87:EB:1E
#____________________________________________________________________#

 ha scritto nel messaggio
news:Xns91CF903DCCFAD...@193.70.192.103...


 END;
Per come e' impostato il ciclo del For l'effetto finale e':
- nei numeri quello di spostare il primo elemento del vettore
all'ultimo posto lasciando tutto il resto inalterato
- idem nelle stringhe ma mi pare anche tu abbia fatto un errore di
battitura (una i per un 1)
Quindi se vuoi scambiare gli elementi a coppie devi usare
FOR i:=0 TO 5
 BEGIN
  ScambiaInteri(arrayinteri[2*i+1],arrayinteri[2*i+2]);
  ScambiaStringhe(arraystringhe[2*i+1],arraystringhe[2*i+2]);
 END;
Inoltre stai attenta che un indice all'interno di un vettore non
diventi piu' grande del suo massimo.
Immagino che le variabile arraystringhe sia dichiarata
  var arraystringhe : array[1..max] of stringa;
Omega e' omega e basta.

  END;
Tavola di traccia per (CASO 1)
1 - 2   (i = 0)
3 - 4   (i = 1)
5 - 6   (i = 2)
----
11 - 12 (i = 5)
Gli effetti sono più catastrofici... in quanto nel caso di fatina richiede
vettori di 11 elementi... qui invece di 12... (+1)
Inoltre i risultati sono completamente diversi. Nel tuo caso scambi i
contenuti delle celle di posto pari con quelle di posto dispari... nel caso
di fatina
il primo elemento con questo ciclo si sposta progressivamente muovendosi
attraverso tutto il vettore fino a giungere all'ultima posizione...
Assomiglia a una sorta di CODA... come principio di funzionamento...  Ora
non so... ma la domanda mia diventa: Che c'entra il tuo con quello di
fatina? essendo due cose completamente diverse? :-P
Ringrazio per il chiarimento :-)
Cooper

 Cooper.
L'array risulta sempre di i-1 elementi perchè i è una variabile che conta di 
quante posizioni è l'array mentre le procedure vengono richiamate in un 
algoritmo sviluppato sulla base del Bubble Sort... Cmq di punto in bianco 
senza aver toccato nulla ha cominciato a funzionare...Mah...misteri del 
compilatore...Deve aver preso vita in quanto ultimente fa un po' i fattacci 
suoi ....io gli scrivo
FOR j:=1 TO i DO
 IF arrayinteri[j]>86 THEN
   writeln(nomi[j]);
e lui non scrive un accidentaccio di niente anzi guardandolo step by step 
lui incrementa j ma si dimentica che l'IF esiste per qualche oscuro 
mistero...mah...
Cmq grazie mille ^__^
Magari al mio compilatore serviva il tuo consiglio.


  IF arrayinteri[j]>86 THEN writeln(arrayinteri[j]);
Poi non so... ripeto non conosco tutto l'algoritmo e per quello che vedo
tutto è sintatticamente corretto.
Cordialmente, Cooper :-)

fatina? essendo due cose completamente diverse? :-P
vero, ma mi era sembrato dal post che volesse fare la prima cosa e non
la seconda, non ho letto bene, sorry
Omega e' omega e basta

 Cordialmente, Cooper :-)
Grassie mille. Ciauz! :o*


 Grassie mille. Ciauz! :o*
Di nulla ^_*
Cooper.

 meglio :) 
Da un file di testo esterno vengono letti i dati circa delle persone:
nome cognome^ g m a
dove g m a sono giorno mese ed anno di nascita. Scrivere un programma che 
abbia come output i nomi dei soggetti di età superiore a 16 anni.
Io ho scritto questo, pensavo fosse giusto finchè stava sulla carta ^__-
{Inizio codice}
PROGRAM Persone (unfile,output);
 USES
   crt;
 TYPE
   intarray= ARRAY[1..10] OF integer;
   stringa=STRING[100];
   stringarray= ARRAY[1..10] OF stringa;
 VAR
  unfile: text;
  ch: char;
  nomi: stringarray;
  anno: intarray;
  i,j,num1,num2: integer;
 BEGIN
  clrscr;
  assign(unfile,'nomi.dat');
  reset(unfile);
  WHILE NOT eof(unfile) DO
   BEGIN
    WHILE NOT eoln(unfile) DO
     BEGIN
      i:=i+1;
      WHILE ch<>'^' DO
        read(unfile,ch);
      read(unfile,ch);
      read(unfile,num1);
      read(unfile,num2);
      read(unfile,anno[i]);
      IF anno[i] > 86 THEN
       writeln(anno[i]);
      readln(unfile);
     END;
   END;
   FOR j:=1 TO i DO
    IF anno[j]>86 THEN
     writeln(nomi[j]);
   readln;
 END.
{Fine codice}
Il tutto si comila quindi sintatticamente è scritto bene ma *ovviamente* 
l'output non esiste :( Ho provato a guardare il tutto con il debug watch e 
ho visto che l'if non lo tocca proprio ma la variabile j continua ad 
incrementarsi...Ufff :(


{Fine codice}
 Non è che ci mancava qualche BEGIN/END ?
Saluti.
P.S.: Ma deve essere maggiore di 16 o di 86 ??? :)
--
    _
 Fa/_)io         A1200 PowerTower, WB 3.9, 060@60, 64MB, FireBall 13GB,
  /__)enedetti   Voodoo3, Digicom-10/100, Philips PCRW1208 - TFT-140/S.
/...solo una parola ci bastava per capire dove il lupo va a guaire/

 abbia come output i nomi dei soggetti di età superiore a 16 anni.
Il problema chiede di visualizzare (sullo schermo) tutti i nominativi
contenuti nel file di testo che dimostrano avere età superiore a 16 anni.
Bisogna ragionare su questa frase intanto:  "dimostrano di avere età
superiore a 16 anni".  A scanso di equivoci nel compito (per semplificare),
puoi scrivere una "clausola" del tipo:
"Poichè il testo non fa alcuna ipotesi circa il grado di errore ammesso...
LIMITO IL CONFRONTO AL SOLO ANNO DI NASCITA"
In tale ipotesi tutto il problema viene enormemente semplicato... (cmq sono
sicuro che il prof... voleva un controllo su tutta la data.. e non solo
sull'anno... azz troppo banale altrimenti.... e in quel caso.... abbastanza
complesso... :P)
In ogni caso, il programma principale risulta essere:
(* ------------------------------------------------ *)
(* Programma Principale *)
Var TFile, PFile: Text;    Line: String;
Begin
  Assign (TFile, 'nomi.dat');
   Reset (TFile);
   While Not SeekEof(TFile) Do
    Begin
     If SeekEoln(TFile) Then Readln;
     Read (TFile, Line);
     Validate (Line);
    End;
  Close (TFile);
End.
(* ------------------------------------------------ *)
Da notare che esso è PRATICAMENTE identico a quello che ho postato
precedentemente... e in sostanza questo programma principale, legge di volta
in volta una riga di testo dal file NOMI.DAT e la passa in formato stringa
alla procedura: VALIDATE attraverso la variabile LINE.
La procedure VALIDATE, può essere codificata nel modo seguente:
(* ------------------------------------------------ *)
Procedure Validate (Line: String);
 Var Err, Counter, Anno: Integer;  Data: String;
 Begin
  Val (Copy (Line, Length (Line)-4, Length (Line)), Anno, Err);
  If (AnnoAttuale - Anno) > 16 Then Writeln (Line);
 End;
(* ------------------------------------------------ *)
E questa in sostanza estrae dalla stringa LINE l'anno di nascita e lo
converte in un intero.
Convertito l'anno in un intero, lo confronta con l'anno attuale e se la
differenza è >16  (ovvero > 16 anni allora stampa la riga di testo come
richiesto. Per completezza:
Const   AnnoAttuale = 2002;
Nel caso invece si fosse resa la necessità di un grado di errore a meno di
un giorno... allora sarebbe stato necessario impostare la procedura VALIDATE
nel modo seguente:
(* ------------------------------------------------ *)
Procedure Validate (Line: String);
 Var Err, Counter, Anno: Integer;  Data: String;
 Begin
  Val (Copy (Line, Length (Line)-4, Length (Line)), Anno, Err);
  If (AnnoAttuale - Anno) > 16 Then Writeln (Line) Else
    Begin
      If AnnoAttuale - Anno = 16 Then
         Begin
            .......
            .......  (* Codice *)
            .......
         End;
    End;
 End;
(* ------------------------------------------------ *)
Dove in CODICE, sarebbe stato necessario estrapolare di volta in volta dalla
stringa LINE la data, quindi convertire i singoli valori che rappresentano i
giorni, mesi, anno  in interi relativi e quindi effettuare un controllo per
mese e anno tenendo conto dei bisestili, delle varianti etc etc (non tutti i
mesi sono di 31 giorni... ce ne sono di 28, di 30 etc etc)
Sarebbe stato in effetti più contorto e complicato... per cui credo che al
tuo prof, tale ipotesi sarebbe stata sufficiente solo a livello di analisi e
non di codifica... giusto per far capire che hai tenuto in considerazione
tutte le ipotesi possibili (BUONA ANALISI DEL PROBLEMA) :P
Spero vivamente di esserti stato di aiuto nel chiarirti la soluzione...
fammi sapere.
Cooper :-)