Newsgroup: it.comp.lang.c
Titolo: New Entry e Prima Domanda: ciclo in loop su AIX

Salve a tutti.
Il seguente modulo va in loop su AIX (sistema operativo ver.4 rel.1, 
compilatore di base), mentre il problema non si manifesta su altri 
sistemi operativi.
int  n;
unsigned char lv;
 lv =0;
 for (n=0;n<lv*2-1;n++) printf("%d",n);
Credo di avere individuato praticamente la causa, ma
gradirei conoscere un parere teorico al problema.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Non ho ben capito cosa dovresti fare: lv vale sempre 0, quindi tanto valeva 
scrivere:
  for (n=0;n<-1;n++) printf("%d",n);
il che non ha un gran senso...

 il che non ha un gran senso...
Scusate ma era una semplificazione del problema, 
lv nel sorgente completo è un parametro che arriva
dall'esterno e tra i valori che può assumere c'è anche 0.
La semplificazione sensata o no che sia riproduce il 
problema che non è l'uscita immediata dal for ma un ciclo
infinito.
Grazie a chi volesse darmi delle informazioni teoriche al


 infinito.
Direi che e` un problema del tuo compilatore. Prova riscrivere il ciclo
come:
lv = 0;
n = 0;
while(n < lv - 1) {
	printf("%d", n);
	n++;
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Mi piace avere amici rispettabili;
Mi piace essere il peggiore della compagnia.

 dall'esterno e tra i valori che può assumere c'è anche 0.
Hai mai pensato di definire "lv" come "volatile" ?
Il problema e' capire che cosa intendi con "esterno".
Il compilatore potrebbe compiere delle ottimizzazioni tali da
calcolare a priori il valore relativo alla condizione di uscita.
Se lv vale inzialmente 0, anche se il suo valore cambia
durante l'esecuzione del loop, il tuo programma 
non lo sentira' mai e continuera' a ciclare all'infinito.


 .....
Mi rendo conto di non essere stato chiaro,il 
modulo scritto di seguito dovrebbe chiarire il problema.
Cmq il modulo va in loop perche il compilatore trasforma
l'espressione di (lv*2-1) in un unsigned int, che negativo
diventa il massimo dei valori positivi, mentre n è un int.
Da qui spiegato praticamente il loop, ma mi chiedevo se questo 
è un comportamento nello standard o anomalo.
Con VC++ 6.0 va bene, su aix va in loop, vedrò di provare con 
AS400 ed MVS.
void main() {
  prova(1);  //OK
  prova(0);  //in loop
}
void prova(unsigned char lv) {
 int n;
  for (n=0;n<lv*2-1;n++) printf("%d",n);
}
Ciao
Emanuele


gradirei conoscere un parere teorico al problema.
Potrebbe essere un problema dovuto al fatto che hai dichiarato lv
unsigned. Quando vai a fare il confronto n<l*2-1 il C dovrebbe
trasformare tutto in unsigned int, quindi lv*2-1 (che non vale -1 come
potrebbe sembrare) varrà come l'intero senza segno più grosso, valore
che non potrà mai essere raggiunto da n che è un intero con segno.
La soluzione del problema è dichiarare lv come char (o qualsiasi altro
valore con segno).
---
Massimilino Iannotta
Università degli studi del Sannio
Informatic Engineering in progress ...

   for (n=0;n<lv*2-1;n++) printf("%d",n);
Nel caso in cui lv sia 0, il ciclo termina quando n assume un valore
inferiore a -1, ma n viene incrementato ad ogni ciclo a partire da zero, da
cui deriva un ciclo infinito.
Ciao,
Cecco

 ha scritto nel messaggio
news:Jh3d8.2186$Ns4....@news2.tin.it...

Scusa, ho detto una cavolata, se lv = 0 non entra nemmeno nel ciclo.
Ciao,
Cecco