Newsgroup: it.comp.lang.c
Titolo: Array di strutture da passare a funzione

Ciao a tutti :)
Sto impazzendo da due giorni su un programma.
Ho una struttura di questo tipo:
	struct lista { // struttura dati
		char *cognome;
		char *nome;
		int hash_cognome;
	}array[100],*q;
che riempio con i dati prelevati da un file d testo.
Dovrei realizzare una libreria esterna che utilizza questi dati. Anzi,
dovrei realizzare anche una funzione init che carichi i dati nella struct.
Il problema e` che non riesco in nessun modo a passare l'array alle funzioni
che creo.
Fino a che e` una struttura normale riesco a farlo, passando la stuct
attraverso un puntatore.
Ma un array di struct come lo passo?? Su google non ho trovato niente.
Help :(
Deep
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Deep
Gav

 Ma un array di struct come lo passo?? Su google non ho trovato niente.
Un array di strutture è pur sempre un array, quindi il nome dell'array (di 
strutture) stesso è il puntatore all'indirizzo base == indirizzo del primo 
elemento.
Se devi passare un vettore ad una funzione, come lo passeresti? Il vettore è 
un puntatore, quindi passi un puntatore alla funzione stessa.
-- 
asettico (aka Roberto) [
http://www.rossomaltese.it/
]
GPG fingerprint [ BA20 8C8D 7712 9D9A 57F3  A96A A7BE 905C 1CB9 26BA ]
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS/IT/O d++(-) s:+>: a34 C++$ ULAVH*++$>++++ P+ L+>++++ E--- W++(-) N(++)
o? K-? w(---) !O M@ V@ PS+@ PE- Y? PGP->++ t+++ 5? X++ R tv+ b+ DI(+)
D++(---) G(-)>-- e>++++ h---() r++ y+++*
------END GEEK CODE BLOCK------

 che creo.
#include <stdio.h>
#include <stdlib.h>
struct lista {
char *cognome;
char *nome;
int hash_cognome;
} array[100], *q;
void funzione(struct lista a[], int n)
{
     int i;
     for (i = 0; i < n; i++) {
         a[i].cognome = malloc(50);
         a[i].nome = malloc(50);
         sprintf(a[i].cognome, "paolino%d", i);
         sprintf(a[i].nome, "paperino%d", i);
     }
}
int main(int argc, char *argv[])
{
    int i;
    funzione(array, 5);
    for (i = 0; i < 5; i++) {
        printf("array[%d]: cognome = \"%s\", nome = \"%s\"\n",
               i, array[i].cognome, array[i].nome);
    }
    return 0;
}

 un puntatore, quindi passi un puntatore alla funzione stessa.
I vettori NON sono puntatori.  I nomi degli array DECADONO in
puntatori.
Tuttavia, all'atto della definizione dei parametri formali delle
funzioni, la notazione array o puntatore identifica la stessa cosa e
cioè un puntatore.

 cioè un puntatore.
scusate l'intromissione,
supponendo di avere un vettore di strutture e di passare in ingresso ad
una funzione il puntatore al vettore
void funzione (vettore_strutture *v)
la giusta sinatssi per accedere ai campi delle strutture all'interno del
vettore dovrebbe essere questa, oppure è errata?
((*v)[i]).campo1
Gianni
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

> ((*v)[i]).campo1
Se v è un puntatore al vettore, allora *v è il vettore.
Quindi (*v)[i] è una struttura (bada che la priorità maggiore
dell'operatore parentesi quadre rispetto all'asterisco richiede le
parentesi attorno a *v, per non essere confuso con *v[i], che per
default corrisponde a *(v[i])).
Essendo (*v)[i] una struttura, l'accesso al membro della struttura è
(*v)[i].campo1 (non servono, cioè, le parentesi attorno a (*v)[i]).

 > ((*v)[i]).campo1



thanks :-)


 ((*v)[i]).campo1
Devi passare alla funzione l'indirizzo del puntatore al vettore strutture.
void funzione (vettore_strutture **v)
Allora la giusta sintassi č quella che ti ha suggerito Andrea.
#include <stdio.h>
#include <stdlib.h>
struct lista
  {
    char *cognome;
    char *nome;
    int hash_cognome;
  } array[100], *aPtr;
typedef struct lista LISTA;
typedef LISTA *LISTAPTR;
void funzione (LISTAPTR *vPtrPtr, int n)
{
     int i;
     for (i = 0; i < n; i++)
       {
         (*vPtrPtr)[i].cognome = malloc(50);
         (*vPtrPtr)[i].nome = malloc(50);
         sprintf((*vPtrPtr)[i].cognome, "paolino%d", i);
         sprintf((*vPtrPtr)[i].nome, "paperino%d", i);
       }
}
int main()
{
    int i;
    aPtr = array;
    funzione(&aPtr, 5);
    for (i = 0; i < 5; i++)
      {
        printf("array[%d]: cognome = \"%s\", nome = \"%s\"\n",
               i, array[i].cognome, array[i].nome);
      }
    return 0;
}
Marcello
---
--
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.560 / Virus Database: 352 - Release Date: 08/01/2004

> Devi passare alla funzione l'indirizzo del puntatore al vettore
strutture.
No, non serve, v è già un puntatore.

 Cos'è una strutture normale?
Hai ragione, mi sono espresso da cani: intendevo una struttura e non un
array di strutture.
Sorry
Deep

"Andrea Laforgia" wrote..:
[cut]
Ringrazio tutti per le puntuali risposte, ma ieri mi devo essere espresso un
po' male.
Il mio problema era che la funzione era dichiarata in una funzione esterna.
Ho risolto dichiarando una typedef della struttura nel file della libreria.
Ad ogni modo ora il problema è un altro: non capisco perché ho un
segmentation dump.
Allora la mia struct è così fatta:
/* nel file lib.c*/
typedef struct  {
 char *cognome;
 char *nome;
 int hash_cognome;
} lista;
poi ho dichiarato un "lista array[100]"  (nel file main.c) che riempio con i
dati di un file (e
il caricamento dati va a buon fine).
Poi ho una funziona hash così dichiarata:
/*nel file lib.c*/
unsigned int hash (char *v) {
  const int M=133;
  const int a=127;
  int h=0;
  for(; *v != '\0'; v++)
       h=(a*h + *v) % M;
  return h;   // ritorna il valore di hash
 }
e poi una funzione find (sempre in lib.c)
char *find (char *nuovo_cognome, lista *arr){
  int i;
  lista *z;
  for(z=arr, i=0; z<&arr[dim]; z++, i++){
   z->hash_cognome= hash(z->cognome);         // calcolo e salvo l'hash del
cognome
   tabella[z->hash_cognome]=&arr[i];                // salvo nella hashtable
il corrispondente indirizzo
  }
  z=tabella[hash(nuovo_cognome)];
       return z->nome;
 }
*tabella[132] è una variabile globale dichiarata sia nel main sia nel file
lib.c
Ma ogni volta che lancio una find() mi si pianta tutto. Ho identificato il
problema nel ciclo di for, ma non riesco davvero a capire cosa ci sia che
non va.
Forse avrei bisogno di una pausa (e magari di una ripassata :( )
Deep

 No, non serve, v è già un puntatore.
Rettifico...
Se invoco la funzione passandole il vettore "v", questa accederà ai membri
del vettore (le struct) con l'espressione:
 "v[i].campo"
Se invoco la funzione passandole il puntatore al vettore "vPtr", questa
accederà ai membri del vettore (le struct) con l'espressione:
"(*vPtr)[i].campo"
Se, invece, invoco la funzione passandole l'indirizzo del puntatore al
vettore "&vPtr", questa accederà ai membri del vettore (le struct) con
l'espressione:
 "(**vPtrPtr)[i].campo"
Mi scuso per il malinteso.


 Ho risolto dichiarando una typedef della struttura nel file della libreria.
Curioso... hai modificato un header file della libreria standard? E l'hai 
ricompilata?


 ricompilata?
No, mi riferivo alla libreria che ho creato io :(


Cmq ho risolto tutto, tnx :)
