Newsgroup: it.comp.programmare
Titolo: Quiz :-)

In 30 sec. d'orologio ditemi se notate un errore (*non* sintattico) in
questo codice:
Func()
{
  for (unsigned i = 0; i < 10; i++)
  {
   num[i] = rand();
   Insert(&list, num[i]);
  }
  for (i = 9; i >= 0; i--)
  {
   Delete(&list, num[i]);
  }
}
Kiuhnm

 wrote in message
news:L8d1a.151833$0v.42...@news1.tin.it...

Eheheh il trappolone!
Mi hai quasi ingannato...
Vedo un bel ciclo infinito o sbaglio....?
Maurus

 Vedo un bel ciclo infinito o sbaglio....?
Bravo! L'ho postato appena l'ho scovato nel mio codice...mamma mia...dovevo
essere proprio stanco quando l'ho scritto! :-)))
Kiuhnm


In effetti non era immediato, stavo quasi per sospettare che sottointendessi
un errore nella rand() senza avere chiamato la srand(time( NULL ) ); che ti
causava la generazione di numeri non casuali, poi mi sono accorto
dell'inghippo!
Maurus

 casuali, poi mi sono accorto dell'inghippo!
La srand la chiamo in WinMain una sola volta (cosě sono sicuro che time(t) č
diverso dalla volta precedente).
Kiuhnm


Bello! :-)
Comunque occhio che 'i' č definito solo nel primo for e non
nel secondo, a norma di standard.
Credo che il tuo codice compili sul VC6, ma non credo lo
faccia altrove.
Tra l'altro se avessi ridefinito 'i' nel secondo ciclo (come
chiede lo standard), l'errore sarebbe stato piů evidente.
--
Gerolamo
E' in corso la votazione di it.comp.software.webserver
Se sei interessato alla creazione di questo NG, leggi il messaggio:
news:MK.it.comp.softw...@news.nic.it

 faccia altrove.
Indefinito?
All'uscita dal primo ciclo è tutto fuorchè indefinito.
E comunque 'i' non è dichiarato all'interno del for (cioè tra le graffe), ma
nella "sezione di controllo".
Ridichiarare 'i' una seconda volta è un errore.
Kiuhnm

 Ridichiarare 'i' una seconda volta è un errore.
no ...
se fai una piccola ricerca su google c'è anche un piccolo trucco che risolva
questo problema della dichiarazione  non standard di VC
se non ricordo male si risolve con una macro : #define for if.....
il resto cercalo tu :))
ciao

 Ridichiarare 'i' una seconda volta è un errore.
Nel C++ standard e (mi pare) nel C99 quella variabile è locale. Su alcuni 
compilatori compila, su altri no.
Per far comportare correttamente VC6 e altri compilatori non standard si 
può usare il trucco (bruttino ma funzionante) di mettere un:
#define for if(0);else for
In VC++.Net si può rendere il comportamento standard con un'opzione del 
compilatore che però (almeno nelle versioni beta, non so se il problema sia 
stato risolto) creava degli altri problemi (non era possibile includere 
<windows.h>...).
-- 
Marco Barisione


Mi spiace dirtelo, ma in C++ ti sbagli di grosso.
Chiedi pure su it.comp.lang.c++
Se invece è C le mie certezze diminuiscono, ma mi pare
proprio che sia la stessa cosa.


 #define for if(0);else for
Io avrei usato:
#define for if(1) for
:-)))
Comunque penso che dichiarerò la variabile esterna ai due if, perchè la
define (specialmente di una parola chiave) non è molto elegante.
Grazie per le informazioni.
Kiuhnm
P.S. Questo post contiene un altro piccolo quiz :-)
Quanto varrà 'a' alla fine di questo codice?
#define for if(1) for
int a = 4;
for (int i = 0; i < 3; i++)
    a++;
if (a == 3)
    for (int i = 0; i < 3; i++)
        int i = i;
else a = 8;
E che cosa stamperanno le seguenti 4 righe di codice?
for (int i = 0; i < 3; i++)
{
    int i = i;
    printf("%d\n", i);
}

 :-)))
Non ricordo bene, ma c'era un motivo valido per usare
l'altra forma.
Se nessun altro lo spiega prima, appena ho tempo ti cerco
il perchč.
ciao
--
Gerolamo

 l'altra forma.
guarda l'esempio di Kiuhnm :)
Maurizio
-- 
The last thing one knows in constructing a work is what to put first.
                -- Blaise Pascal

 guarda l'esempio di Kiuhnm :)
ehm... ok :-)
Le faccine dovevano mettermi in allarme...
p.s. Comunque non compila! :-P
--
Gerolamo

 in questo codice:
ne ho trovati tre:
 - la condizione del secondo ciclo for è sempre vera (unsigned maggiore
   o uguale a zero)
 - stai compilando senza -Wall ("warning C4296: [...]") [1]
 - stai usando un compilatore non standard (scoping di i)
[1] a proposito, dall'help di C++ Builder:
"[...]
Whenever the compiler encounters a constant comparison that (due to the 
nature of the value being compared) is always true or false, it issues 
this warning and evaluates the condition at compile time.
For example:
  void proc(unsigned x){
    if (x >= 0)        /* always 'true' */
    {
       ...
    }
  }"
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.0. C, C++ and ASM developers
                               and beta testers are welcome!