Newsgroup: it.comp.lang.c
Titolo: [AIUTO] Problema puntatori

Ciao a tutti,
ho creato una prima struttura contenente i dati, e una seconda che ha
come elementi il dato stesso, e due puntatori al precedente dato, e al
successivo.
Nella funzione inserisci però sembra essere errato "newPtr->prec= *ptr;"
con l'errore "Warning c:\utenti_comune\lcc\bin\david\c.c: 68  assignment
of pointer to incomplete struct vcorrente defined at
c:\utenti_comune\lcc\bin\david\c.c".
Vi inoltro il breve listato, qualcuno sa aiutarmi?
Grazie!
#include <stdio.h>
#include <stdlib.h>
typedef char telefono[20];
typedef struct{
  char nome[20];
  char cognome[20];
  char indirizzo[20];
  telefono numero[4];
} voce;
typedef struct{
	voce persona;
	struct vcorrente *prec;
	struct vcorrente *succ;
} vcorrente;
typedef vcorrente *ptrcorrente;
void stampa(voce x){
    printf("Cognome:%s\n", x.cognome);
    printf("Nome:%s\n", x.nome);
    printf("Indirizzo:%s\n", x.indirizzo);
    for (int i=0; i<4; i=i+1) {
	printf("Numero di telefono %d: %s \n", i+1, x.numero[i]);
            }
}
voce leggi(){
   voce x;
   printf("Inserisci il Cognome:\n");
   scanf("%s",&(x.cognome));
   printf("Inserisci il Nome:\n");
   scanf("%s",&(x.nome));
   printf("Inserisci l'indirizzo:\n");
   scanf("%s",&(x.indirizzo));
  for (int i=0;i<4 ;i=i+1 )
  {
	  printf("Inserisci il %d° numero di telefono\n",i+1);
      scanf("%s",&(x.numero[i]));
	  }
		  return x;
}
void inserisci(ptrcorrente *ptr, voce x){
   ptrcorrente newPtr;
   newPtr = malloc( sizeof( vcorrente ) );
   if (newPtr!=NULL)
   {
   newPtr->persona=x;
   }
   if (ptr==NULL)
   {
   newPtr->prec=NULL;
   newPtr->succ=NULL;
   }
   else
{
    newPtr->prec= *ptr;
	newPtr->succ= NULL;
	ptr->succ = *newPtr;
	*ptr= newPtr;
   }
}
void main(){
voce x;
x = leggi();
stampa(x);
scanf("%s",&(x.indirizzo));
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ptr= newPtr;
Dato ke si ptr è un puntatore a puntatore alla struttura, il tuo codice ke
ho modificato dovrebbe funzionare...però!!! Effettivamente è inutile
utilizzare un doppio puntatore
Modificato come ti ho detto sono riuscito a compilarlo senza errori
--------------------------------
Inviato via 
http://usenet.libero.it

Ho trovato qual'č il problema!!!
Puoi anke utilizzare la tua forma, ma come ti ho detto hai reso piů
complessa la cosa:
newPtr->prec = &(*ptr);
(*ptr)->succ = newPtr;
&(*ptr) = newPtr;
questo č reso necessario perkč stai utilizzando un doppio puntatore e la
tecnica utilizzata da te va bene per un singolo puntatore, questa va bene
per due!


 > void inserisci(ptrcorrente *ptr, voce x){
Forse non ho capito bene come si utilizzano i puntatori (č la mia prima
volta in C), e forse l'errore č in questo:
typedef vcorrente *ptrcorrente;
...
void inserisci(ptrcorrente *ptr, voce x){
Se non ho capito male, con la prima definisco una specie di tipo puntatore,
e nella funzione passo un puntatore di tipo puntatore?!?
Forse se avessi voluto semplicemente definire un puntatore alla mia
struttura vcorrente avrei dovuto scrivere:
vcorrente *ptrcorrente;
E come passare poi questo puntatore alla funzione?
Grazie ancora, e scusami se ho scritto eresie!
CiAO, David.

> Modificato come ti ho detto sono riuscito a compilarlo senza errori
Non riesco a venirne a capo... se non è troppo lavoro per te, mi faresti
vedere come implementare una semplice funzione di inserimento in una lista
biderezionale del tipo:
punt.al
 prec.<-------DATA-------> 
punt.al
 succ.
Se ho scritto delle idiozie non tenerne conto, purtroppo devo svolgere
questi esercizi senza che nessuno mi abbia dato basi di C, e sto tentando
tra manuali e consigli!
Grazie per quello che puoi! David.

Non preoccuparti purtroppo i puntatori sono un argomento molto pesante del
linguaggio...
quando usi typedef struct prova * ptrStruct, hai un nuovo tipo da te
definito che è già un puntatore alla struttura.
Quindi se nella funzione:
inserisci(ptrStruct aa) stai già passando un puntatore alla
struttura...quello ke hai fatto tu è passare un puntatore a puntatore alla
struttura scrivendo inserisci(ptrStruct *aa).
Le liste dinamiche sono cose troppo avanzate per te...dovresti iniziare
prima a capire i puntatori con semplici stringhe e poi cimentarti con cose
avanzate.
Ti consiglio il livro di Addison-Wesley C programmazione e didattica


> Le liste dinamiche sono cose troppo avanzate per te...
Cercherò di capirci qualcosa con la tua ultima spiegazione... ma purtroppo
non posso scegliere, devo farlo e anche piuttosto in fretta!
Grazie, David.

 molto pesante del linguaggio...
Sono riuscito nella funzione inserisci, o almeno ora la compila, ma nella
stampa ho un problema.
Definita la struttura:
typedef struct{
  char nome[20];
  char cognome[20];
  char indirizzo[20];
  telefono numero[4];
} voce;
typedef struct{
 voce persona;
 struct vcorrente *prec;
 struct vcorrente *succ;
} vcorrente;
typedef vcorrente *ptrcorrente;
La funzione di stampa come segue:
void stampaelenco (ptrcorrente ptr){
    if (ptr==NULL)
    {
    printf("Rubrica vuota");
    }
 else
 {
    ptrcorrente newPtr;
 newPtr=ptr;
 voce newx;
 while (newPtr!=NULL)
     newx=newPtr->persona;
  printf("Cognome:%s\n", newx.cognome);
     printf("Nome:%s\n", newx.nome);
     printf("Indirizzo:%s\n", newx.indirizzo);
     for (int i=0; i<4; i=i+1){
   printf("Numero di telefono %d: %s \n", i+1, newx.numero[i]);
     }
  newPtr=newPtr->prec;
 }
}
Come mai il passaggio "newPtr=newPtr->prec;" non va bene?
Come dovrei scorrere la lista?
Grazie ancora, David.

 }
