PDA

View Full Version : [C] errore che non capisco in ricorsione


wino_7
29-03-2008, 17:51
Salve ragazzi devo scrivere una funzione ricorsiva che prenda come argomenti un array di char con dimensioni non specificate a tempo di compilazione e un carattere v e vedere se v compare nell'array.


#include <stdio.h>
int ricerca(char a[], int *i, char *v);

int main()
{
int i;
char a[i];
char v;

scanf("%d %s %c", &i, a, &v);

return ricerca(a, &i, &v);
system("PAUSE");
}

int ricerca (char a[], int *i, char *v)
{
if(i == 0) return 0;
if(a[i-1] == v) return 1;
return ricerca(a, i, v);
}


A me è venuto in mente questo ma mi da un errore in fase di compilazione e mi dice 'array subscript is not an integer'.

Cosa vuol dire e poi econdo voi è giusto il ragionamento che ho fatto?

andbin
29-03-2008, 18:02
int i;
char a[i];Non va bene, 'i' deve essere valorizzato prima di dichiarare 'a', non può essere valorizzato dopo pensando di allocare l'array 'a' della giusta dimensione. (e comunque questo tipo di dichiarazione non è "ANSI-C")

int ricerca (char a[], int *i, char *v)
{
if(i == 0) return 0;
if(a[i-1] == v) return 1;
return ricerca(a, i, v);
}
Ma 'i' è un puntatore in questa funzione ... a cosa ti serve?? E comunque non puoi usarlo nell'indice.

Inoltre la tua funzione ricerca() può anche non sapere a priori la lunghezza della stringa, purché essa sia terminata dal nullo finale. Ma devi testarlo nella tua funziona ... altrimenti come fai a sapere quando sei alla fine della stringa??

wino_7
29-03-2008, 20:21
La 'i' mi serve per dare la dimensione dell'array e la prendo dall'input dell'utente con scanf che poi utilizzo per scorrere gli indici dell'array.

So di essere arrivato alla fine della stringa quando arrivo ad a[i] con i uguale a '0'.

Tu dici che la 'i' non serve ma allora tu come faresti ??

andbin
29-03-2008, 21:35
Tu dici che la 'i' non serve ma allora tu come faresti ??int ricerca (char *str, char c)
{
if (*str == '\0')
return 0;
else if (*str == c)
return 1;
else
return ricerca (++str, c);
}
o la forma più compatta (ma equivalente):

int ricerca (char *str, char c)
{
return *str == '\0' ? 0 : *str == c ? 1 : ricerca (++str, c);
}

wino_7
30-03-2008, 11:51
Vedendo il secondo caso che mi hai scritto posso dire che per me sei un genio una forma del genere ancora non l'avevo mai vista, bravo veramente e grazie tanto.

Però la cosa che non riesco a capire e che il progessore mi ha detto che l'array non deve avere dimensione in tempo di compilazione e allora se non gliela passa l'utente dal dos come fa a capire quanto è grande???

andbin
30-03-2008, 13:55
posso dire che per me sei un genioEh ... magaaaari lo fossi. :eek:

Però la cosa che non riesco a capire e che il progessore mi ha detto che l'array non deve avere dimensione in tempo di compilazione e allora se non gliela passa l'utente dal dos come fa a capire quanto è grande???Quando devi chiedere in input una stringa hai sostanzialmente tre possibilità:

1) Stabilire a priori una dimensione massima ed allocare un buffer di tale dimensione. Esempio: char buf[100]; In tal caso non più di 99 caratteri (nullo finale escluso ma da inserire nel buffer) possono essere chiesti in input.

2) Chiedere prima all'utente il numero di caratteri e quindi allocare un buffer della dimensione richiesta (+1 per il nullo finale). Il buffer si può allocare con le funzioni tipo malloc/calloc oppure usando la dichiarazione di array a lunghezza variabile (C99/C++). Esempio: char buf;

3) Non stabilire una dimensione massima e non chiedere la dimensione all'utente ma allocare e riallocare a runtime il buffer man mano che serve. Avevo fatto un esempio di questa tecnica in [U]questa (http://www.hwupgrade.it/forum/showthread.php?t=1397473) discussione in cui avevo postato una funzione che legge una linea di lunghezza "arbitraria" da uno stream FILE*.