char array[cont][20]......

Qualcuno sa dirmi se c'è un modo per avere una serie di array (di numero cont), dove cont è un intero che ho calcolato in predenenza (senza usare la #define)? Se uso questo comando mi da un errore!

O se no qualcuno sa dirmi un modo per ordinare in ordine alfabetico una serie di stringhe (di cui non conosco il numero) contenunte in un file?

Thx

P.S: non mi serve per la scuola, ma per uso personale
In C non si possono allocare array dinamicamente quindi la dichiarazione deve sempre avere limiti di tipo costante.
Se ti serve uno spazio dinamico puoi usare la malloc().
Ad esempio

long *array;
int dim;

dim = 5;
array = malloc(dim * sizeof(long));


Cosi hai allocato un array di long di dimensione "dim".
La malloc potrebbe ritornarti NULL in caso d'errore.

[ 07-06-2001: Message edited by: Herpes ]


Infatti...l'ho appena letto sul mio libro di scuola e su una guida
Sono riuscito a capire come usarla con degli interi, ma non riesco ad applicarla ad un array bidimensionale: io dovrei leggere tutte le stringhe che ho nel file nel vettore bidimensionale e poi da qui ordinarle in ordine alfabetico e rimetterle nel file: il problema è che non riesco a leggerle.....help!

P.S: grazie per i consigli!

P.P.S: forse ho appena capito come fare.......forse però .....ci provo.....

[ 07-06-2001: Message edited by: Dragon83 ]
[QB]
char *servers;
if(!(servers = (char *)malloc(22*sizeof(char)))) //22 è la lunghezza massima di una stringa
printf("\nErrore!\n");
for(i=0; !feof(pf); i++) {
fscanf(pf, "%s", &servers[i]);
printf("\n%s", servers[i]);
}


Stò cercando di leggere le stringhe dal file e di metterle sul vettore, e nello stesso stamparle (per vedere se funziona!).
Così non funge, ho provato anche con la fread usando lo stesso metodo ma niente.....come devo fare(pf è il file che ho aperto precedentemente)?


Abbozzo una possibilità (mancano gli usuali controlli, ecc.):


#include
#include
#include

...

int compara(const void *a, const void *b)
{
char *s1 = *(char **)a;
char *s2 = *(char **)b;

return (strcmp(s1, s2));
}

...

char *nomefile = "nome del file";
char **lines = NULL;
char buffer[128];
int count = 0;
int limit = 10;
FILE *F;

...

lines = (char **)malloc(limit * sizeof (char *));
F = fopen(nomefile, "r");
while (fgets(buffer, sizeof buffer, F)) {
if (count >= limit) {
limit *= 2;
lines = (char **)realloc(lines, limit * sizeof (char *));
}
lines[count++] = (char *)strdup(buffer);
}
fclose(F);
qsort((void *)lines, count, sizeof lines[0], compara);

...



bai baiii

[ 07-06-2001: Message edited by: Duke ]
Scusa la franchezza, ma semplicemente non conosci abbastanza il C.

Ti consiglierei di studiare con attenzione il testo che usi, quando ne saprai di più riuscirai a fare quello che vuoi più facilmente.


bai baiii


Sì è vero, in effetti stò cercando di fare cose che non ho ancora studiato (a scuola)!
Purtroppo da quel poco materiale che ho trovato sull'uso dell'allocazione dinamica della memoria non c'è niente che spieghi bene come si fa a usare un array bidimensionale con dimenzioni definite al momento dell'esecuzione, ho trovato e forse capito come usare un singolo array di interi!

Una cosa: da quello che ho letto sul mio libro di testo, mi sembra che per fare quello che serve a me bisogna usare la funzione calloc e non malloc, mi sbaglio?
Ehm......sono appena riuscito a fare quello che volevo, però boh, non sono molto convinto, non mi sembra molto elegante quello che ho fatto, e cmq non ho ancora capito bene come funziona la calloc...vabbuè


Non so, dipende da quello che vuoi fare. La calloc() inizializza il blocco di memoria a zero, la malloc() no.

Dato


char *str;


sono più o meno equivalenti:

str = calloc(10, 1);


oppure

str = malloc(10);
memset(str, '\0', 10);



bai baiii