Newsgroup: it.comp.lang.c
Titolo: Mi serve un suggerimento

Ciao a tutti,
ho fatto il seguente esercizio . A questo punto il mio insegnante mi chiede di
fare due cose sulle quali vi chiedo
un aiuto: 
1) Devo fare il free pArray. Io l'ho messo in fondo al codice, ma mi da errore.
Perchè?
2) Adesso devo modificare il codice stesso in modo che gestisca delle stringhe.
Invece che interi
l'array conterrà puntatori a stringhe che devono successivamente essere
popolate nel ciclo e
successivamente stampate. 
Per ora ho pensato quanto segue. pArray anzichè essere un vettore di int ovvero
int* è un vettore di
char*  (puntatori a carattere) char** pArray; 
nel ciclo di lettura anzichè la scanf devo chiamare una funzione
LeggiStringa(pComodo);
tale funzione dovrà allocare memoria e copiare una stringa e poi si deve fare
una funzione
StampaStringa ed infine LiberaStringa. 
Se non avete tempo per fare  l'intero codice 
mi basta  suggerimento su come proseguire. 
Ciao e Grazie 
//PopolaArray del 22 Ottobre 2001 
 
#include <stdio.h> 
#include <malloc.h> 
#include <conio.h> 
#include <stdlib.h> 
 
void main (void) { 
 int nElem = 0; 
 int *pArray; 
 int *pComodo; 
 int nI; 
 printf("Inserisci il numero di elementi dell'array\n"); 
 scanf ("%d", &nElem); 
 pArray = (int*) malloc(nElem); 
 pComodo = pArray; 
 for( nI=0; nI < nElem;nI++, pComodo++){ 
  printf("Prego inserire il valore numero %d\n", nI); 
  scanf("%d",pComodo); 
 
 } 
 
 pComodo = pArray; 
 for (nI=0; nI < nElem; nI++, pComodo++){ 
 
  printf("Alla posizione %d ho il valore %d\n", nI , *pComodo); 
 } 
 
free(pArray); //MI DA UN DEBUG ERROR !!!
}
-- 
Posted from 
squid.spin.it
 [147.123.1.111] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 pArray = (int*) malloc(nElem); 
   E` troppo piccolo l'array, l'errore lo ottieni perche` il tuo
codice corrompe lo heap. Dovresti scrivere:
pArray = malloc(nElem * sizeof(int));
   Poiche` malloc restituisce un void *, non e` necessario il cast
esplicito (e di fatto non c'e` alcun vantaggio nel farlo). Di solito
io scrivo:
pArray = malloc(nElem * sizeof(*pArray));
   Questa versione non ha bisogno di modifiche anche se cambi il tipo
a cui pArray punta.
   Per le stringhe hai ragione, pArray deve essere char ** e devi
allocare anche lo spazio per ogni stringa (pArray[i] = malloc(...)),
puoi leggerle con fgets (a differenza di gets, con fgets puoi
specificare la dimensione del buffer di destinazione). Magari mettici
anche un controllo sul valore (if (pArray[i] == NULL) errore()).
   Quando termini devi ricordarti di liberare lo spazio allocato per
ogni stringa, prima di rilasciare pArray, qualcosa come:
for (i = 0; i < nElem; i++)
   free(pArray[i]);
free(pArray);
-- 
Totuccio.

   scanf("%d",pComodo);
                      ^^^^^^^^^^
Oltre che agli errori relevati da totuccio devi dereferenziare pComodo nella
linea sopra :
scanf("%d", *pComodo);
..ma forse era solo un errore di trascrizione, ciao.

scanf("%d", *pComodo);
   No, quello e` giusto, scanf("%d"...) vuole un int *.
-- 
Totuccio.

 }
Per l'acquisizione di stringhe dovrai usare fgets (non scanf("%s", &str)
perche` non permette un controllo sull'overflow:
char **array;
int nElem;
int const max_len = 100;
int i;
...
array = malloc(nElem * sizeof(char *));
for (i = 0; i < nElem; i++) {
	array[i] = malloc(max_len);
	fgets(array[i], max_len, stdin);
	if (array[i] == NULL)
		fprintf(stderr, "Errore nella lettura del'elemento %d\n", i);
}
...
for (i = 0; i < nElem; i++) 
	free(array[i]);
free(array);
 
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La somma dell'intelligenza sulla terra e` una costante.
La popolazione e` in aumento.

  * interi devi usare malloc(n * sizeof(int)); il cast non serve.
Oppure calloc(n, sizeof(int));
-- 
"Windows 95 is a 32-bit shell for a 16-bit extension to an 8-bit
operating system designed for a 4-bit microprocessor by a 2-bit
company that can't stand one bit of competition."
La mia (penosa, per ora) homepage: 
http://digilander.iol.it/burton666