Newsgroup: it.comp.lang.c
Titolo: Array di puntatori

Devo allocare un array di puntatori a una struttura che si chiama edificio
ed è caratterizzata da 3 long e un puntatore a edificio.
Mi serve perché devo ordinare l'array senza toccare la lista di edifici.
vorrei sapere se è giusto allocare in questo modo l'array:
a=(edificio**)calloc(numeroedifici,sizeof(edificio*));
Inoltre quando uso a vorrei sapere se è corretta questa espressione:
(*(a[10])).altezza=75;
Cioè voglio il valore del campo altezza puntato dal decimo puntatore
dell'array a e assegnargli 75.
C'è qualcosa che non va o è corretto?
Vi ringrazio anticipatamente,
giovann...@libero.it

(*(a[10])).altezza=75;
Si, ma sarebbe piu' leggibile :
a[10]->altezza = 75 ;
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------

 dell'array a e assegnargli 75.
A parte la ridondanza delle parentesi più interne, sarebbe corretto se a
fosse, appunto, un array di puntatori mentre invece non lo è.
Ti consiglio di studiarti il seguente esempio di allocazione dinamica di
una matrice di interi. L'esempio andrebbe inserito anche nella FAQ in
quanto mancava tra i metodi di allocazione (cioè entrambe le dimensioni
disponibili solo in run-time).
#include <stdio.h>
#include <stdlib.h>
int main()
{
    const int righe   = 20;
    const int colonne = 10;
    int i, j;
    int **Matrice = malloc( righe * sizeof( int * ) );
    for ( i = 0; i < righe; i++ )
        Matrice[ i ] = malloc( colonne * sizeof( int ) );
    for ( i = 0; i < righe; i++ )
        for ( j = 0; j < colonne; j++ )
            Matrice[ i ][ j ] = ( i + 1 ) * ( j + 1 );
    for ( i = 0; i < righe; i++ )
    {
        for ( j = 0; j < colonne; j++ )
            printf( "%3d ", Matrice[ i ][ j ] );
        printf( "\n" );
    }
    for ( i = 0; i < righe; i++ )
        free( Matrice[ i ] );
    free( Matrice );
    return 0;
}
EMG


Cosi' formalmente tu stai allocando 'a' come puntatore a(puntatore a
puntatatore);
per allocarlo come puntatore a(puntatore) la sintassi formalmente piu' leggibile
e corretta( se la size del puntatore differisse in base al tipo puntato :-) )
a=calloc(numeroedifici,sizeof(struct edificio*));
cosi' a e' un puntatore ad un area di (puntatori a (struct edificio) ).
Ivan Molella

Vi ringrazio per le dritte sugli array a puntatori.
Ho passato un pomeriggio d'inferno a non capire dove fossero i miei errori.
Grazie di nuovo,
giovann...@libero.it

Il fatto è che io non so a priori quanto sarà lungo l'array di puntatori.
Cioè:
ho una lista di edifici che si alloca dinamicamente in base agli input.
Devo ordinare questa lista rispetto a un determinato campo, però non voglio
toccare la lista in sè, voglio conservarne il suo ordine.
Quindi voglio creare un array di puntatori, ognuno dei quali punti ad un
elemento della lista in modo tale da ordinare questo array.
Come faccio ad allocare questo array sulla base della lunghezza della lista?
grazie di nuovo,
giovann...@libero.it

a=calloc(numeroedifici,sizeof(struct edificio**));
Ehm... sizeof(struct edificio*)


grazie di nuovo,
Conta i nodi della lista.
Alloca l'array.
Assegna ad ogni elemento un nodo della lista.
Ordina l'array.


 puntatatore);
Hai ragione anche qui. Ma dove avevo la testa?
EMG

 Come faccio ad allocare questo array sulla base della lunghezza della lista?
Esattamente come ti abbiamo mostrato in precedenza.
EMG

 Ehm... sizeof(struct edificio*)
Lo so, mi cospargo il capo di cenere...
EMG