Newsgroup: it.comp.lang.c
Titolo: Aiuto malloc

Sono nei guai devo consegnare un lavoro per un corso che sto facendo ma non
ho la piu' pallida idea di come procedere.
Il mio professore ha avuto la bella idea di farci fare dei calcoli
matriciali.
Non ho la piu' pallida idea di come creare una array bidimensionale con
malloc, che mi permetta di gestire una matrice bidimensionale.
In quanto da linea di comando devo fare in modo di creare quante matrici
abbia voglia e la seconda come faccio a darli un nome dinamicamente?
Spero che qualcuno mi aiuti sono proprio nella ....., spero che non si senta
la puzza. (Scherzo).

nome dinamicamente< Non si puň. La tua frase in ogni caso esce dalle regole
del linguaggio "italiano". Riformulala e spiega cosa vuoi, magari con degli
esempi.
--- bye

 esempi.
Devo creare una calcolatrice polinese (Credo che si chiami cosi) in grado di
creare delle matrici
e fare le operazioni su le matrici.
Devo creare un programma in grado di leggere con getchar tutto quello che li
passo per fare dei calcoli
secondo il metodo polinese (almeno credo), non conosco l'esatta traduzione
del nome.
Comunque sono stato in grado di fare i calcoli base (quello era facile).
Ma ora dovrei passareli i seguenti comandi:
3 4 AA MAT per creare una matrice 3 x 4
5.5 1 2 AA per assegnare AA(1,2)=5.5
etc.
Dinamicamente dovrei creare delle matrici (teoricamente infinite) il mio
problema e come crearle.
Poi le varie operazioni dovrebbero essere abbastanza semplici. Il problema
e' come gestirle?
Grazie mille del tuo aiuto

 Grazie mille del tuo aiuto
ciao

 }
qui mi sono perso del tutto
al posto di questa riga
tmp = (struct elelista *)malloc(x*y*sizeof(TIPO_ELEMENTI_MATRICE));
avrei pensato a qualcosa del tipo
tmp = (double *)malloc(x*y*sizeof(double));
e poi avrei detto tmp[0]=0.22;
etc
se hai tempo mi puoi continuare a spiegare, per cercare di ben capire la
cosa.
Grazie di nuovo a tutti che siete gentilissimi


 non ho la piu' pallida idea di cosa sia "struct elelista *next"
Mai fatto liste concatenate? ahi ahi ahi ahi ahi! Questo è un tipico esempio
di lista concatenata. La lista concatenata è un costrutto classico. Se non
sai cos'è, allora è il momento buono per andare a scoprirlo. Se cerchi con
google lo troverai di sicuro.
--- bye

 Grazie di nuovo a tutti che siete gentilissimi
Se non e' chiaro qualcosa chiedi pure.
Ciao

Ti ringrazio sono quasi arrivato alla fine grazie al vostro aiuto.
Ora non so come andare a riprendermi la lista
ho fatto la cosa seguente:
lista = aggEleTesta( lista, 4, 3 );
lista = aggEleTesta( lista, 8, 6 );
che dovrebbe aver aggiunto due elementi alla lista
   show(lista);
void show(struct elelista *lista) {
   if( lista != NULL) {
      printf("->%d",lista->righe);
      if( lista->next != NULL) show(lista->next);
   }
}
Ma non funziona correttamente.
Come faccio per posizionarmi sul primo elemento della lista?
Dato che poi i successivi si trovano con il puntatore next della lista?

 Dato che poi i successivi si trovano con il puntatore next della lista?
Non ho capito la domanda, vuoi stampare le dimensioni degli elementi della
lista ?
Non avevo pensato a terminare la lista, direi di inserire una 
struct elelista * initLista(struct elelista * lista ) {
        if (lista) lista->next=NULL;
}
da applicare dopo la prima chiamata ad aggEleLista() poi per stampare tutte
gli elementi della lista
void stampaLista( struct elelista * lista ) {
        struct elelista * tmp = lista;
        int i=0;
        if (lista) {
                while (tmp) {
                        printf("Matrice numero %d,\trighe %d\tcolonne %d\n"
(i++)+1,tmp->righe,tmp->colonne);
                        tmp = tmp->next;
                }
        }
        return;
}

Questo e' il mio codice finale, che grazie a te funziona, lo postato per due
motivi.
Il primo per verificare che non ho commesso errori
Il secondo per fare in modo se qualcono lo cerca potra' usufruirne
#include <stdlib.h>
struct elelista {
   int righe;
   int colonne;
   int *matr;
   struct elelista *next;
};
struct elelista * aggEleTesta( struct elelista * lista, int r /* righe */ ,
   int c /* colonne */ ) {
   struct elelista *tmp=NULL;
   /*creiamo l'elemento di testa della lista */
   tmp = (struct elelista *)malloc(sizeof(struct elelista));
   /* se l'elemento e' stato allocato con successo */
   if (tmp) {
   /* inizializziamo lo spazio dei dati della matrice */
      tmp->matr = NULL;
      /* proviamo ad allocare lo spazio che occorre */
      tmp->matr = (int *)malloc(c*r*sizeof(double));
      /* se riesce l'allocazione */
      if (tmp->matr) {
         tmp->righe=r;
         tmp->colonne=c;
         /* agganciamo il primo elemento di lista a quello temporaneo */
         tmp->next= lista;
         /* ritorniamo l'indirizzo dell'elemento temporaneo */
         return tmp;
      }
   }
   /* se siamo arrivati qua almeno una delle malloc e' fallita, quindi non
   * tocchiamo la lista */
   return lista;
}
main(){
int *a;
struct elelista *lista;
lista=aggEleTesta( lista, 4, 3 );
if(lista) lista->next=NULL;
lista=aggEleTesta( lista, 8, 6 );
lista=aggEleTesta( lista, 12, 4 );
show(lista);
}
int show(struct elelista *lista) {
struct elelista * tmp = lista;
int i;
   if( lista) {
      while ( tmp != NULL) {
         printf("->%d %d\n",tmp->righe,tmp->colonne);
         tmp=tmp->next;
      }
   }
}

Ultima cosa sulle strutture.
E' possibile fare in modo che la funzione della struttura si accorga se e'
la prima cosi che metta in automatico il puntatore alla prossima struttura
uquale a zero??

Knady wrote:

Si,
in effetti ora che do un'occhiata al codice dovrebbe gia' funzionare perche'
viene allocato il primo elemento e il puntatore alla sua area di memoria
viene messo in tmp, poi tmp->next (che esiste perche' siamo nel ramo true
di "if (tmp)" ) viene messo uguale a lista che alla prima chiamata equivale
a NULL.
Dovrebbe quindi gia' funzionare a patto di definire nel main
struct elelista * lista = NULL;
cosa che io comunque faccio sempre con i puntatori.
CIao!