Newsgroup: it.comp.lang.c
Titolo: Dubbio Amletico

Vi sottopongo una porzione di codice e poi vi spiego il problema:
char* scrivi(char c,int n){
char temp[65];
int numero=c;
short i,resto;
for(i=0,resto=0;numero>=n;i++){
resto=numero%n;
numero=(int)numero/n;
temp[i]=abc(resto);
}
temp[i]=abc(numero);
temp[++i]='\0';
inverti(temp,i);
return temp;}
in cui inverti inverte l'ordine della stringa lasciando \0 al suo posto e
abc restituisce un carattere diverso per ogni cifra tra 0 e 35.
il tutto funzionerebbe, se non che, se n č <=4 (c'č un controllo precedente
per impedire che sia <0 o >36) il tutto crasha.
Facendo un debug ho notato che alla funzione inverti al primo ciclo viene
passato l'indirizzo giusto della array temp, al secondo un indirizzo
casuale, faciendo ovviamente saltare il prog, tutto ciň č possibile? Puň
essere che a tiramento di culo, se n (che non viene neanche passato lě) ha
certi valori salti tutto, mentre con altri no.
Ho pensato dipenda dalla lunghezza di temp, ma non so come ovviare.

 temp[++i]='\0';
           ^^^^^^^
ma questi non assegna prima a temp[i] '\0' e poi incrementa?
Potrebbe anche dipendere da questo sai!?
Salut
  Ashesh

 }
Stai ritornando l'indirizzo di un  array locale alla funzione. Una volta
terminata la funzione  l'indirizzo di temp non  e` piu` valido. Esistono
diverse soluzioni, valuta tu la migliore per il tuo caso:
1) Array statico
char* scrivi(char c, int n) {
	static char temp[65];
	....
	return temp;
}
2) Array allocato dinamicamente
char *scrivi(char c, int n) {
	char *temp;
	temp = malloc(65);
	assert(temp);
	....
	return temp;
}
3) Array fornito dal chiamante
char *scrivi(char *temp, char c, int n) {
	....
	return temp;
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Software is like sex; it's better when it's free.
Linus Torvalds

 ma questi non assegna prima a temp[i] '\0' e poi incrementa?
L'istruzione  e` corretta.  temp[i] viene  inizializzato nell'istruzione
prima  e con  questa  la stringa  viene terminata. L'operatore  prefisso
*prima* incrementa l'operando, *poi* restituisce il valore:
a = ++b;
diventa:
{
	b = b + 1;
	a = b;
}
temp[++i] = '\0';	----->		i++; temp[i] = '0';
Al contrario l'operatore postfisso  resitituisce il valore dell'operando
prima dell'incremento:
a = b++;
diventa:
{
	T tmp;
	tmp = b;
	b = b + 1;
	a = tmp;
}
temp[i++] = '\0';	----->		temp[i] = '0'; i++;
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Mi piace avere amici rispettabili;
Mi piace essere il peggiore della compagnia.

 wrote in message
a4go2d$2io$1...@dreamland.darkstar.net...


 wrote in message a4il4p$j3p$1...@ctonet.it...


 temp=35425 "@òç#°§+"
Come ti ha risposto Kronos, nel pezzo di codice c'e' un errore, pertanto
e' possibile che errori simili siano sparsi anche nel resto del codice.
Il comportamento che hai descritto, normalmente, e' dovuto ad accessi
scorretti in memoria. Se il casino lo noti all'uscita della funzione
inverti(), forse, il casino e' li'.
Il codice inviato, per quanto mi riguarda, non consente di capire dove
e' l'errore. Se non e' troppo lungo prova a postarlo tutto.
Se usi Linux prova ad usare qualche libreria, tipo efence, che effettua
il check degli accessi in memoria.
Spero di essere stato utile.
C:\>iao Angelo.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
dd0885fe6cd223c9700...@mygate.mailgate.org...


 strcpy(temp,a);
C.V.D. Ma che fai copi una stringa senza allocare?
proca a fare 
   temp = malloc(strlen(a)+1);
   strcpy(temp, a);
e poi vedi :-)
C:\>iao Angelo.
P.S. Ovviamente metti qualche controllo al codice che ho postato.


 > void inverti(char a[],int i){
il char a[] era completamente diverso da quello che gli ho passato in
scrivi.
è questo che mi infastidisce.

 casuale, 
Questo e' un comportamento che generalmente e' dovuto ad
accessi scorretti alla memoria, tipo quello che ti ho descritto.
Se scrivendo a in strP vai a sovrascrivere la zona di memoria dove
e' memorizzato il valore passato a pInvStr, la prossima volta che
accedi a quell'indirizzo trovi solo immondizia.
Questo non significa che dipende sicuramente da quello, ma sicuramente
e' un candidato molto plausibile.
Senza il codice completo, di piu' non so dire.
C:\>iao Angelo
P.S. Anche dare alle variabili un nome piu' significativo si "a"
     serve ad evitare errori. :-)


 > č questo che mi infastidisce.


bé se proprio dobbiamo dirla tutta un problemino c'č:
le lettere accentate me le legge come dei numeri negativi con ovvii effetti
nefasti.
č normale che ä sia letto come \204 e da qui come -124?
Thanks