Re: Puntatori a Funzione[C]
Allora, sono un principiante e non mi voglio lanciare in cose che so si e no.Come in un post Gila dice che la scanf che dà problemi, ma stiamo scherzando?
in tanti qui dicono che scanf è inutile e si danno interpretazioni errate, esempi banali....
ma la scanf ha anche un argomento di ritorno, che sarebbe int
infatti la definizione di scanf è
Codice: Seleziona tutto
int scanf(const char *format, ...);
Intendevo dire che è un po' deprecata e non sicura.
I problemi era per il fatto che tronca l'input al primo spazio.
Trovo più versatile usare getchar() e costruirmi la stringa.
Ovvio scanf la uso, ma a volte, se unita a getchar, da problemi.
Vero ,ma la qsort, da lo spunto per molte riflessioni e approfondimenti...lascia perdere per ora la qsort, insisti sulle funzioni e sui puntatori, ma questo è un mio consiglio, conta niente, per carità...
io non ne ho trovati, se non chesecondo te che errori ci sono, se ve ne sono...
Codice: Seleziona tutto
int perGila (char **as, size_t l)
{
size_t ciclo = 0;
for (ciclo = 0; ciclo < l; ciclo++)
printf ("[%u] %s\n", ciclo, as[ciclo]);
return (ciclo);
}Direi che non va usata, essendola costante MAXSTRINGHE bisogna usarla? puoi gentilmente spiegare come
Codice: Seleziona tutto
char *astringa[] = { "Gila", "Tex", "Alex", "Anne Marie", "Verbose", "Earth Quake" };Un po' come le stringhe classiche penso, se io scrivo:
Codice: Seleziona tutto
char str[]="Ciao io sono Gila";sarà il compilatore a determinare esattamente la dimensione del vettore.
La riprova ce l'ho facendo il solito:
sizeof (str)/sizeof(char);
E coi vettori di puntatori a stringhe, penso sia uguale,
Se io scrivo char*stringa[10]
vorrebbe dire che "istanzio" dieci puntatori, ma se poi non ho dieci stringhe, a cosa puntano ? A null...dove?
Discorso diverso se avessimo usato array bidimensionali di stringhe
Codice: Seleziona tutto
char mio_array[][10]il codice che hai scritto, ho lasciato più o meno uguale, tranne che ho aggiunto un variabile globale per contare i cicli.
Ho cambiato anche il casting (solo perchè è una forma che conosco un po' meglio)
Codice: Seleziona tutto
int ast_confronto (const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp(*ia, *ib);
}Codice: Seleziona tutto
return strcmp( *( char ** ) a, *( char ** ) b ) ;
Come discusso altrove, non credo che la variabile globale sia una grossa ineleganza (se si può dire...
Ecco il codice:
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void perGila (char **, size_t l);
int ast_confronto (const void *, const void *);
int scambi=0;
int main (void)
{
char *astringa[] = { "Gila", "Tex", "Alex", "Anne Marie", "Verbose", "Earth Quake","Jhonny" };
size_t stringa_lun = sizeof(astringa) / sizeof(char *);
printf ("indici componenti astringa %d\n", stringa_lun);
perGila (astringa, stringa_lun);
qsort(astringa, stringa_lun, sizeof(char *), ast_confronto);
perGila (astringa, stringa_lun);
return (0);
}
void perGila (char **as, size_t l)
{
size_t ciclo = 0;
for (ciclo = 0; ciclo < l; ciclo++)
{
printf ("[%u] %s\n", ciclo, as[ciclo]);
}
printf ("cicli ritornati dalla funzione perGila (char **, size_t): %u\n", scambi);
return ;
}
int ast_confronto (const void *a, const void *b)
{
++scambi;
return strcmp( *( char ** ) a, *( char ** ) b ) ;
}Mi sa che mi sono sbagliato su:
è possibile farlo, ma devo rivedere bene l'esempio.Direi che non va usata, essendola costante MAXSTRINGHE bisogna usarla? puoi gentilmente spiegare come
A prima vista, funziona tutto bene solo se le stringhe sono in numero uguali alla definizione
# define N_STRINGHE 5
ma ci rifletto bene con calma