[C] Aiuto ricorsione e strutture

di il
5 risposte

[C] Aiuto ricorsione e strutture

Salve, dovrei svolgere il seguente esercizio:

Scrivere la funzione C
int length(BinSeq* bin_seq);
che, data in ingresso una sequenza binaria bin_seq, calcoli e restituisca in modo ricorsivo la lunghezza della sequenza binaria.

La struttura BinSeq è questa:
typedef struct BinSeq {
  char* data;    // la sequenza binaria è rappresentata come un array di caratteri '0' e '1'
  int dimension; // dimensione dell'array contenente la sequenza binaria, non è la lunghezza della sequenza
} BinSeq;
Questo è il mio codice:
int length(BinSeq* bin_seq){
	if ((*bin_seq)[0].data=='\0') //se il carattere è il terminatore di linea
		return 0;
	else
		return 1+str_length(bin_seq->data+1);	//altrimenti passa al carattere successivo e incrementa il contatore
}
Però non funziona, quando lo compilo con gcc ottengo questo errore:
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Cosa sbaglio?
Grazie

5 Risposte

  • Re: [C] Aiuto ricorsione e strutture

    wrugg25 ha scritto:


    Ma voi tutti lo leggete, il codice che scrivete, oppure buttate lì cose a caso sperando che funzioni?

    Hai chiamato la funzione:
    int length(BinSeq* bin_seq)

    Ma nella chiamata ricorsiva hai scritto un altro nome:

    Jacksparrow2013 ha scritto:


    
    		return 1+str_length(bin_seq->data+1);
    
    Ciao, hai ragione, nella domanda mi sono dimenticato di copiare il codice che c'era prima:
    Avevo scritto la funzione ausiliaria str_lenght che conta i caratteri di una stringa:
    int str_length(char* s) {
    	if (*s=='\0')
    		return 0;
    	else
    	return 1+str_length(s+1);
    }
    Comunque non funziona nemmeno mettendo
    return 1+length(bin_seq->data+1);	
    Ritorna sempre errore.
  • Re: [C] Aiuto ricorsione e strutture

    Secondo me devi ripensare la cosa.
    Il dato su cui lavorare è la "stringa binaria" terminata da NULL.
    La dimensione presente nella struttura non ti serve a niente dal momento che ti devi fermare quando incontri il terminatore di stringa nella "stringa binaria".
    Pertanto secondo me la funzione ricorsiva sarà la seguente:
    int length(char* binstr)
    Cosa ci devi scrivere dentro?
    una semplice if:
    - se binstr[0] == 0 allora ritorna 1
    - altrimenti ritorna length(binstr+1)+1
  • Re: [C] Aiuto ricorsione e strutture

    candaluar ha scritto:


    Secondo me devi ripensare la cosa.
    Il dato su cui lavorare è la "stringa binaria" terminata da NULL.
    La dimensione presente nella struttura non ti serve a niente dal momento che ti devi fermare quando incontri il terminatore di stringa nella "stringa binaria".
    Hai ragione, ma la stringa binaria è contenuta nel campo data della struttura, quindi penso che devo accedere al campo per poter contare gli elementi. Sbaglio? (La struttura è questa)
     typedef struct BinSeq {
      char* data;    // la sequenza binaria è rappresentata come un array di caratteri '0' e '1'
      int dimension; // dimensione dell'array contenente la sequenza binaria, non è la lunghezza della sequenza
    } BinSeq;
    Pertanto secondo me la funzione ricorsiva sarà la seguente:
    int length(char* binstr)
    Cosa ci devi scrivere dentro?
    una semplice if:
    - se binstr[0] == 0 allora ritorna 1
    - altrimenti ritorna length(binstr+1)+1
    La funziona ricorsiva deve prendere in input una variabile di tipo BinSeq* e non char* , quindi quello che hai suggerito non funziona
    Grazie comunque
  • Re: [C] Aiuto ricorsione e strutture

    Se il "compito" è questo:
    Scrivere la funzione C
    int length(BinSeq* bin_seq);
    che, data in ingresso una sequenza binaria bin_seq, calcoli e restituisca in modo ricorsivo la lunghezza della sequenza binaria.
    non c'è scritto che length() deve essere LEI ricorsiva.
    La funzione che ti ho suggerito nel mio precedente post la puoi rinomire in
    int length_rec(char* binstr)
    quindi la funzione length() puoi scriverla così:
    int length(BinSeq* bin_seq)
    {
    	return length_rec( bin_seq->data );
    }
    Penso non ci possano essere ulteriori dubbi, e non dire che non funziona!!!
  • Re: [C] Aiuto ricorsione e strutture

    candaluar ha scritto:


    Se il "compito" è questo:
    Scrivere la funzione C
    int length(BinSeq* bin_seq);
    che, data in ingresso una sequenza binaria bin_seq, calcoli e restituisca in modo ricorsivo la lunghezza della sequenza binaria.
    non c'è scritto che length() deve essere LEI ricorsiva.
    La funzione che ti ho suggerito nel mio precedente post la puoi rinomire in
    int length_rec(char* binstr)
    quindi la funzione length() puoi scriverla così:
    int length(BinSeq* bin_seq)
    {
    	return length_rec( bin_seq->data );
    }
    Penso non ci possano essere ulteriori dubbi, e non dire che non funziona!!!
    Ok, grazie mille, funziona.
    Scusa, ma non avevo capito
Devi accedere o registrarti per scrivere nel forum
5 risposte