Newsgroup: it.comp.lang.c
Titolo: return

Sto seguendo la seconda edizione del K&R e sono arrivato al paragrafo dei
"vettori di caratteri";alla fine del capitolo pensavo di aver capito il
funzionamento del comando return e mi sono cimentato negli esercizi: escluso
il 1-17, dove bastava fare una piccola modifica nel ciclo del programma di
esempio del paragrafo, mi sono bloccato con gli altri tre sull'utilizzo del
suddetto comando, non riesco ad usarlo quando voglio "ritornare" al
chiamante una stringa elaborata nel funzione.
Faccio un esempio:
questa sarebbe la mia soluzione all'esercizio 1-19 (reverse)
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[ ], int maxline);
int reverse(char s[ ], char r[ ]);
main()
{
 char line[MAXLINE], revline[MAXLINE];
 while ((getline(line, MAXLINE)) > 0)
 {
  reverse(line, revline);
  printf("%s", revline);
 }
}
int getline(char s[], int lim)
{
 int c, i;
 for (i = 0; i < lim-1 && (c=getchar()) != EOF && c != '\n' ; ++i)
  s[i] = c;
 if (c == '\n')
 {
  s[i] = c;
  ++i;
 }
 s[i] = '\0';
 return s;
}
int reverse(char s[], char r[])
{
 int i, k;
 for (i = '\0'; i >= 0; --i)        /* sinceramente qui non sapevo come
muovermi */
 {
  for (k = 0; k <='\0'; ++k )  /* idem, dovevo contare precedentemente la
stringa per rendere il tutto + facile? */
     s[i] == r[k];
  }
return r;
}
Il risultato sono una serie infinita di caratteri senza senso, che si
ripetono all'infinito :°°°(
Vorrei sapere, prima di tutto dove sono gli errori nella mia soluzione,
secondo come si utilizza il return, perché credo proprio di non aver capito
nulla :(
grazie mille
¤¤¤¤¤¤¤
Darth
¤¤¤¤¤¤¤

 return r;
         ^
Hai dichiarato le due funzioni come ritornanti un int e le usi per
restituire un char*.
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it


ok, grazie Bianco, questo mio primo errore l'ho capito, ma ora mi rimane un
ultimo ostacolo: la funzione reverse. Alla sua chiamata o non stampa nulla,
termina il programma, oppure mi stampa caratteri a caso; l'errore credo sia
nei due cicli for, ma non capisco come risolverlo.
grazie
¤¤¤¤¤¤¤
Darth
¤¤¤¤¤¤¤

 
Oltre a quanto già segnalato sui valori di ritorno delle funzioni, la funzione
reverse contiene:
- for (i = '\0'; i >= 0; --i) che viene eseguito una sola volta dato che 
  i=-1 dopo la prima esecuzione;
- for (k = 0; k <='\0'; ++k ) che cicla all'infinito dato che k, dopo la
  prima esecuzione, è sempre > 0.
Per rovesciare la stringa serve la lunghezza, che non occorre calcolare visto
che lo fa già getline().
Basta solo correggre return s in return i, e memorizzare il valore in una
variabile intera (lungh nell`esempio) da passare alla funzione reverse.
Infine, K&R chiede di scrivere una funzione che rovescia la stringa sul posto
come si deduce dal prototipo reverse(s). 
Segue il programma modificato, al quale ho aggiunto la funzione 
reverse_in_place() per soddisfare K&R.
Spero che i commenti chiariscano i dettagli del procedimento.
HTH gfb
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[ ], int maxline);
int reverse(char s[],char r[],int lungh);
int reverse_in_place(char s[],int lungh);
int main()  {
char line[MAXLINE],revline[MAXLINE];
int lungh; /* VARIABILE AGGIUNTA */
printf("Inserisci una stringa o Ctrl-Z per terminare\n");
while ( (lungh=getline(line, MAXLINE) ) > 0)  {
   reverse(line,revline,lungh);
   printf("revline : %s", revline);
   reverse_in_place(line,lungh);
   printf("in_place: %s", line);
   }
return 0;
}
int getline(char s[], int lim)   {
 int c, i;
 for (i = 0; (i < lim-1) && (c=getchar()) != EOF && c != '\n' ; ++i)
	     s[i] = c;
 if (c == '\n')
 {
  s[i] = c;
  ++i;
 }
 s[i] = '\0';
 return i; /* ritorna la lunghezza della stringa input */
}
int reverse_in_place(char s[],int lungh)  {
int i, k;
char temp;
/*
rovescia la stringa lasciando '\n' e '\0' nella
posizione originale a fine stringa
*/
for(i=0, k=lungh-2; i < k; ++i,--k)    {
   temp=s[i];
   s[i]=s[k];
   s[k]=temp;
   }
   return 0;
}
int reverse(char s[],char r[],int lungh)     {
int i,k;
/* posiziona '\n' e '\0' a fine r[] */
r[lungh--] = '\0';
r[lungh--] = '\n';
for (i=0,k=lungh; i<=lungh; ++i,--k)
      r[k]=s[i];
return 0;
}

Grazie mille, adesso mi č ancora + chiaro sia l'uso di for (ero ancora
legato al doppio ciclo alla Pascal) sia l'uso di return.