I pointer nel linguaggio Pascal

Programmazione, algoritmica, teoria dell'informazione, ...
Rispondi
Avatar utente
Tess
Messaggi: 272
Iscritto il: 15 set 2009, 14:20
Località: Maserada s. P.

I pointer nel linguaggio Pascal

Messaggio da Tess »

Sono solito programmare in linguaggio Pascal, ma è da un pezzo,da quando li ho visti in qualche esempio, che non riesco a capire come fuzionano i pointer.

Conosco già qualcosa a riguardo, ad esempio le definizioni, ma ogni volta che cerco di scrivere un programma con questi c'è sempre qualcosa che non torna, qualche errore (non solo run-time error).

Qualcuno sa come usarli?
Tibor Gallai
Messaggi: 1776
Iscritto il: 17 nov 2007, 19:12

Messaggio da Tibor Gallai »

Io so come usarli. Sono un po' come i puntatori void del C, solo che non credo siano isomorfi come strutture algebriche. D'altra parte non scrivo in Pascal da una decina d'anni circa e potrei ricordare male.
[quote="Pigkappa"]Penso che faresti un favore al mondo se aprissi un bel topic di bestemmie da qualche parte in modo che ti bannino subito.[/quote]
Avatar utente
kn
Messaggi: 508
Iscritto il: 23 lug 2007, 22:28
Località: Sestri Levante (Genova)
Contatta:

Messaggio da kn »

Tibor Gallai ha scritto:Sono un po' come i puntatori void del C
Perché? Hanno il tipo dell'oggetto puntato anche in Pascal, quindi che differenza c'è con i puntatori del C?

@Tess: qui trovi qualche esempio, ma perché non scrivi/alleghi direttamente qui il codice dei programmi che ti danno dei problemi?
Viviamo intorno a un mare come rane intorno a uno stagno. (Socrate)
Tibor Gallai
Messaggi: 1776
Iscritto il: 17 nov 2007, 19:12

Messaggio da Tibor Gallai »

kn ha scritto:Perché? Hanno il tipo dell'oggetto puntato anche in Pascal, quindi che differenza c'è con i puntatori del C?
Un conto è dire che esistono i puntatori tipati in Pascal, cosa vera ma irrilevante in questo thread.
Un altro conto è dire che le variabili di tipo pointer siano puntatori tipati, che è falso. Poiché Tess ha detto "pointer" in un post in Italiano, e non "puntatori", ho dato per scontato che si riferisse alle variabili pointer del Pascal, e non ai puntatori del Pascal in genere.

Comunque sia, fortunatamente il tuo link non funziona, quindi ne approfitto per lanciare un appello:
EVITATE MANUALI SCRITTI IN ITALIANO COME LA PESTE!
[quote="Pigkappa"]Penso che faresti un favore al mondo se aprissi un bel topic di bestemmie da qualche parte in modo che ti bannino subito.[/quote]
Avatar utente
SkZ
Messaggi: 3333
Iscritto il: 03 ago 2006, 21:02
Località: Concepcion, Chile
Contatta:

Messaggio da SkZ »

alcuni sono tradotti bene (come il Kernighan & Ritchie mi pare).
Cmq in effetti e' meglio o affidarsi a edizioni sicure come traduzioni o prendere quelli in inglese dato che quasi tutti i linguaggi sono di origine USA
impara il [tex]~\LaTeX[/tex] e mettilo da par[tex]\TeX~[/tex]

Software is like sex: it's better when it's free (Linus T.)
membro: Club Nostalgici
Non essere egoista, dona anche tu! http://fpv.hacknight.org/a8.php
Avatar utente
Tess
Messaggi: 272
Iscritto il: 15 set 2009, 14:20
Località: Maserada s. P.

Messaggio da Tess »

Intanto devo dire che i tipi definiti come
nome_tipo=pointer;
non ho assolutamente capito come funzionano;
quelli definiti come puntatori ad altri tipi (es: nome_tipo1=^nome_tipo2) non ho capito il funzionamento che ha nell'eseguzione del programma poichè non corrisponde a quello che pensavo.
Un programma esempio che avevo trascritto da un manuale (lo so che era italiano) non è il seguente:

Program puntatore_prova;
uses crt;

type
punt=^tc;
tc=record
cont:char;
succ:punt;
end;

var p, inizio:punt; i:integer; x:char;

procedure crealista(var tp:punt);
var i:byte; ult:punt; n:byte;
begin
write('Quanti caratteri? ');
readln(n);
new(tp);
write('Scrivili ');
tp^.cont:=readkey;
write(tp^.cont);
ult:=tp;
for i:=2 to n do
begin
new(ult^.succ);
ult:=ult^.succ;
ult^.cont:=readkey;
write(ult^.cont);
end;
ult^.succ:=nil;
end;

procedure stampa(tp:punt);
begin
writeln;
write('Caratteri contenuti: ');
repeat
write(tp^.cont,' ');
tp:=tp^.succ;
until tp=nil;
writeln;
end;

procedure resto(var tp:punt);
var ap:punt;
begin
if tp=nil
then write('lista vuota')
else
begin
ap:=tp;
tp:=tp^.succ;
if ap=nil then exit;
dispose(ap);
end;
end;

procedure canc(var tp:punt; x:char);
var k, d:punt; ok :boolean;
begin
if tp=nil
then write('lista vuota')
else
begin
k:=tp;
d:=tp^.succ;
ok:=false;
repeat
if k^.cont=x
then ok:=true
else
begin
k:=d;
d:=d^.succ;
end;
until (k=nil) or ok;
if ok
then resto(k^.succ)
else writeln('elemento non presente');
end;
end;

begin
crealista(p);
stampa(p);
repeat
write('Scrivi un carattere da eliminare - ');
x:=readkey;
if ord(x)<32 then halt;
writeln(x);
canc(p, x);
stampa(p);
until (x=#27) or (p^.cont=#0);
end.


L'eseguzione di questo sembra corretta fino a che non gli dico di eliminare un un carattere. A volte ne elimina uno che non centra niente, altre volte crea una lista con dei caratteri che non ho immesso! :shock:

Se riuscite a capire dove stanno gli errori vi ringrazio. :lol:

P.s. non so niente di niente del linguaggio C.
Tibor Gallai
Messaggi: 1776
Iscritto il: 17 nov 2007, 19:12

Messaggio da Tibor Gallai »

Tess ha scritto:Un programma esempio che avevo trascritto da un manuale (lo so che era italiano) non è il seguente:
E meno male! :shock:
Sarebbe stato un po' lunghino da leggere e da copiare...

Come saprai, conviene imparare i fondamentali su esempi drasticamente più semplici.
[quote="Pigkappa"]Penso che faresti un favore al mondo se aprissi un bel topic di bestemmie da qualche parte in modo che ti bannino subito.[/quote]
Rispondi