Newsgroup: it.comp.lang.c
Titolo: Aiuto sui puntatori son alle prime armi

Ciao a tutti,
mi presento son nuovo mi chiamo Tommy.
è tutt'oggi che son di fronte al compilatore ma nn riesco a tirare fuori un
ragno da un buco...
Devo creare una cosa piuttosto semplice, ma nn per me che devo imparare.
Devo creare una lista di puntatori, una struttura dati fatta in questo modo:
nel 1° campo c'è un intero, nel 2° c'è in puntatore alla strutturadati
uguale successiva.
Mi blocco dopo che ho vreato la struct (perchè nn ho le idee chiare).
Quello che ho fatto è:
 struct lista{
  int dato;
  struct lista *next;
 };
 typedef struct lista nodo;
 typedef nodo *lis;
per come l'ho pensata io lis è una var di una singola cella che punta alla
prima struttura (chiamata nodo), la prima volta dovrebbe puntare a null se
la lista è vuota, giusto?
ma se scrivo: *lis=NULL; mi da errore dicendo che devo controllare *lis...
nn capisco perchè!!!
Come faccio a metterlo a null la prima volta?
Poi dopo come faccio ad inserire il primo elemento dentro la mia var. struct
che ho chiamato nodo?
Aiuto, scusatemi se la domanda è banale x voi ma nn so più dove sbattere la
testa.
Grazie davvero.
Tommy

> ma se scrivo: *lis=NULL; mi da errore dicendo che devo controllare *lis...
Alcuni compilatori vogliono il valore 0, al posto di scrivere NULL, per il
resto io sto raccogliendo delle firme per far togliere i puntatori dalla
programmazione :-((

 programmazione :-((
Spero tu stia scherzando.
Luca


Ok se sei alle prime armi....
La programmazione senza puntatori è per le merdacce

 Grazie davvero.
Beh, essendo cose alquanto di base, ti suggerirei di sbattere la testa 
su un qualunque tutorial di C (visto che mi pare che tu stia scrivendo 
in C, e non in C++, ma visto il crosspost...)
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

 *lis...
"*lis" e' un tipo. non un oggetto. Non si puo' assegnare a un tipo.
Si puo' assegnare solo a oggetti (chiamati anche variabili).
Prima devi definire un oggetto del tuo tipo puntatore.
Per esempio:
  lis l1;
Poi puoi assegnare NULL a tale puntatore:
  l1 = NULL;
Poi, per allocare un oggetto puntato dal tuo puntatore, puoi scrivere:
  l1 = new nodo;
Per impostare i campi dell'oggetto:
  l1->dato = 1;
  l1->next = NULL;
E per disallocare l'oggetto:
  delete l1;
Spero di averti chiarito le idee.
-- 
	Carlo Milanesi
 
http://digilander.libero.it/carlmila

 programmazione :-((
Dopo di che, come direbbe il mio docente di programmazione, potrai anche
darti al VB :D

 "*lis" e' un tipo.
No.
lis  e` un tipo (alias di lista* o di struct lista*)
lis*  e` un altro tipo (lista**)
*lis  e` un errore
      Mauro

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Tux wrote:

Ecco, allora Java non fa per te. A parte questo perche' vuoi toglierli ?
G.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (MingW32)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQE/znsa7UpzwH2SGd4RAm/xAJ4vZzEg0f9mzP5vmZwOcteGPoKAIgCgz0rq
NRDpcSR4lqNUTfSArblB0nM=
=OlJf
-----END PGP SIGNATURE-----

 Ecco, allora Java non fa per te.
?!?
Tommy

 programmazione :-((
ROFL!!!
Io sto proponendo una petizione per eliminare il semaforo rosso, me la
firmi? :-)

 programmazione :-((
Non hai che da passare ad uno degli innumerevoli linguaggi che non li
usano.
Ciao,
Nicola
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 immemorabile e del C++ dalla sua nascita.
Già. Anche perchè 0 e NULL sono due cose molto diverse!
Al massimo lis = (void*) 0;
Deep

 immemorabile e del C++ dalla sua nascita.
Uhm? Si, pero' c'e' una cosetta paco conosciuta del C++ che da qualche
noia...
void * p;
...
int * p_i = p;
E' codice C corretto, ma non e' valido in C++, il g++ ad esempio mi dice: 
invalid conversion from `void*' to `int*'
Per questo in C si scrive spesso:
#define NULL ((void *)0)
Ma in C++ sara' qualcosa di simile a:
#define NULL 0
La cosa carina e' che "int * p_i = 0;" e' lecito, ma "int * p_i = 1;" no!
Credo proprio (ma ci dovrei andare a guardare) che lo Standard del C++
dichiari che il cast (implicito) di int(0) ad un tipo puntatore produca il
puntatore nullo di quel determinato tipo.

...

In entrambe i linguaggi il puntatore nullo e' denotato da qualsiasi
espressione costante intera di valore zero, quindi le seguenti sono
tutte valide:
0
3 - 3
3 * 4 - 2 * 6
ecc.
In C e' altrettanto valido applicare a una simile espressione il cast
a puntatore a void. Questo in C++ non e' valido perche' non esiste
conversione implicita da un puntatore a void ad un puntatore di un
altro tipo.
Ciao,
Nicola

 puntatore nullo di quel determinato tipo.
Dal punto di vista formale (e questo vale per entrambe i linguaggi)
non e' una conversione: l'uso dello zero e' puramente convenzionale.
Ciao,
Nicola