Newsgroup: it.comp.lang.c++
Titolo: Ho rimesso mano al codice ma ho dei dubbi ...

velo posto tutto almeno potete provarlo
1) non ho ancora capito come in lettura da terminale capire quando uno mi ha
dato un enter prima della fine delle letture che mi aspettavo ... mi date
una mano in quella parte ???
2) ho messo un commento dove non capisco perche' funziona con il post
incremento invece che con il pre incremento ... ???
ciao
----------------code----------------------
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct lotto
{
 int num[6];
 void inizializza();
 void ceckalldiff();
 bool is_1_zeero();
};
bool lotto::is_1_zeero()
{
    for (int i=0;i<6;i++)
    if (num[i] == 0) return true;
    return false;
}
void lotto::ceckalldiff()
{
    for (int i=0;i<5;)
    {
        if (i==0)
        if (num[0] == num[6]) {inizializza(); break;}
        if (num[i] == num[i++]) {inizializza(); break;} // questa if perche'
funziona con il post incremento invece che con il pre incremento ++i ???
    }
}
void lotto::inizializza()
{
    for (int i=0;i<6;i++) num[i]=0;
}
int main(int argc, char *argv[])
{
 vector<lotto> giocata;
 giocata.reserve(1000);
 lotto estrazione;
 estrazione.inizializza();
 ifstream in;
 char buff[200] = "";
 in.open("enalotto.csv",ios::in);
 if (in.rdstate())
 {
  in.close();
  cerr << "Non trovato enalotto.csv file !" << endl;
  return 1;
 }
 while (!in.eof())
 {
  lotto lettura;
  lettura.inizializza();
  for (int i=0;i<5;i++)
  {
   in.getline(buff,190,';');
   if (in.eof()) break;
   register int a = atoi(buff);
   lettura.num[i] = ((a > 0 && a < 91) ? a : 0 );
   buff[0] = '\0';
  }
  if (in.eof()) break;
  in.getline(buff,190);
  register int a = atoi(buff);
  lettura.num[5] = ((a > 0 && a < 91) ? a : 0 );
  buff[0] = '\0';
  if (lettura.num[0] == 0 ||lettura.num[1] == 0 ||lettura.num[2] == 0 ||
  lettura.num[3] == 0 ||lettura.num[4] == 0 ||lettura.num[5] == 0) break;
  else giocata.push_back(lettura);
 }
 in.close();
 if (!giocata.size()) {cerr << "File enalotto.csv vuoto o corrotto !" <<
endl;return 1;}
 while(estrazione.is_1_zeero())
 {
  cout << "Inserire i numeri dell'estrazione nel formato : n n n n n n , e
devono essere compresi tra 1 e 90\n" << endl;
  for (int i=0;i<5;i++)
  {
   cin.getline(buff,190,' '); // queste letture come faccio a capire che non
ci sono piu' caratteri nello stdin cosi' da richiedere l'inserimento ???
   register int a = atoi(buff);
   estrazione.num[i] = ((a > 0 && a < 91) ? a : 0 );
   buff[0] = '\0';
  }
  cin.getline(buff,190);
  register int a = atoi(buff);
  estrazione.num[5] = ((a > 0 && a < 91) ? a : 0 );
  estrazione.ceckalldiff();
 }
 cout << "\n\n" << endl;
 int trovato = 0;
 for (unsigned int find=0,i=0;i<giocata.size();i++)
 {
  for (int j=0;j<6;j++)
        for (int y=0;y<6;y++)
  {
      if (giocata[i].num[j] > estrazione.num[y]) y++;
      else if (giocata[i].num[j] < estrazione.num[y]) j++;
   if (giocata[i].num[j] == estrazione.num[y]) find++;
  }
  if (find == 3) {cout << "Terno nella giocata : \t"; trovato++;}
  if (find == 4) {cout << "Quaterna nella giocata : \t"; trovato++;}
  if (find > 4) {cout << "Bingo siamo miliardari nella giocata : \t";
trovato++;}
  if (find > 2) {for (int j=0;j<6;j++) cout << giocata[i].num[j] <<
'\t';cout << "\n\n" << endl;}
  find = 0;
 }
 if (trovato == 0) cout << "Mi spiace ritenta la fortuna alla prossima
estrazione !!!\n\n" << endl;
 cout << "Finita la computazione !\n\n" << endl;
 giocata.clear();
 system("PAUSE");
 return 0;
}

funziona con il post incremento invece che con il pre incremento ++i ???
   Scusa se non mi addentro nei dettagli del codice, putroppo il
subject non aiuta molto a capire quali siano i tuoi post precedenti
sull'argomento (e la mia memoria e` particolarmente fallace).
   Comunque direi: potresti definire meglio 'funziona'? (funziona
quando la condizione restituisce 'true', quando restituisce 'false' o
cos'altro?)
   Personalmente, questo mi sembra un esempio classico di ordine di
valutazione indefinito (oppure stasera ho esagerato 8)). Comunque, se
il tuo compilatore, con le opzioni attuali, valuta prima l'operando a
sinistra, allora (possibili traduzioni del tuo codice):
   Postincremento: (condizione sempre vera)
      if (num[i] == num[i]) {i++; inizializza(); break;}
   Preincremento: (dipende dai valori di num[i] e num[i+1])
      if (num[i] == num[i+1]) {i++; inizializza(); break;}
   se invece valuta prima l'operando a destra, allora e` sempre e
comunque:
      if (num[i] == num[i+1]) {i++; inizializza(); break;}
   opzionalmente credo che un compilatore possa fare quello che vuole
in questo caso (anche se mi riesce difficile ipotizzare un
comportamento diverso da questi due, pero` nulla e` garantito). E
anche se fosse garantito, mi sentirei *troppo* dipendente dalla
perfetta conformita` dell'ambiente di sviluppo, per sentirmi sicuro in
un caso simile.
-- 
S.L.

 un caso simile.
bho vedro di sistemarlo ... io cercavo appunto consigli per non fare errori
di legarmi ad un ambiente ... o altri sbagli ...
grazie ciao

 if (num[i] == num[++i])  che testava 0 con 1, 1 con 2, 2 con 3 ...
   Resto dell'idea che sia indefinito. Comunque ho sbagliato
completamente a scrivere il caso in cui venga valutato prima
l'operando a destra, e comunque non sono gli unici due casi possibili.
In definitiva, secondo me, e` indefinito, e comunque farei meglio ad
andare a letto. :)
-- 
S.L.

 ha scritto nel messaggio
news:enm8jvkbfh3nt015c...@4ax.com...

dopo un po di prove con il gcc mi sono trovato a dare i numeri perche' senza
ottimizzazione quindi con -O0 il funzionamento e' quello che mi aspettavo io
del ++i
se invece uso anche solo -O o 1-2-3-s ... si ottiene il risultato sballato
che funziona con i++ ...
ho gia' bello che capito che devo metterlo fuori dall'if ... ma che due
palle non poter usare le scorciatoie del c ...
ciao

riposto il codice che ho fatto alcuni errori ...
e se qualcuno mi sa' dire il perche' di quei due comportamenti con e senza
ottimizzazioni ne sarei veramente grato ... sembra che senza ottimizzazioni
veda le funzioni in un ordine diverso che con tali ottimizzazioni ...
lo standard che dice ??? che sono scemo io che sto facendo roba fuori
standard ???
ciao
---------code -----------
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct lotto
{
 int num[6];
 void inizializza();
 void ceckalldiff();
 bool is_1_zeero();
};
bool lotto::is_1_zeero()
{
 for (int i=0;i<6;i++)
 if (num[i] == 0) return true;
 return false;
}
void lotto::ceckalldiff()
{
 for (int i=0;i<5;)
 {
  if (i==0)
  if (num[0] == num[5]) {inizializza(); break;}
  if (num[i++] == num[i]) {inizializza(); break;}
 }
}
void lotto::inizializza()
{
 for (int i=0;i<6;i++) num[i]=0;
}
int main(int, char *[])

  if (lettura.is_1_zeero()) break;
  else giocata.push_back(lettura);
 }
 in.close();
 if (!giocata.size()) {cerr << "File enalotto.csv vuoto o corrotto !" <<
endl;return 1;}
 while(estrazione.is_1_zeero())
 {
  cout << "Inserire i numeri dell'estrazione nel formato : n n n n n n , e
devono essere compresi tra 1 e 90\n" << endl;
  for (int i=0;i<5;i++)
  {
   cin.getline(buff,190,' ');


 
  [5.4]
  Except where noted, the order of evaluation of operands of
  individual operators and subexpressions of individual expressions, and
  the order in which side effects take place, is unspecified. Between
  the previous and next sequence point a scalar object shall have its
  stored value modified at most once by the evaluation of an expression.
  Furthermore, the prior value shall be accessed only to determine the
  value to be stored. The requirements of this paragraph shall be met
  for each allowable ordering of the subexpressions of a full
  expression; otherwise the behavior is undefined.  [Example:
   i = v[i++];  // the behavior is unspecified
   i = 7, i++, i++;  // i becomes 9
   i = ++i + 1;  // the behavior is unspecified
   i = i + 1;  // the value of i is incremented

    i = i + 1;  // the value of i is incremented
ho cavolo ... suggerimenti per aggirare quel problema ???
forse scrivendo:
if (i++,num[i-1] == num[i]) dovrei risolvere il problema e non dover trovare
vie esterne all'if ???
ciao

vie esterne all'if ???
   Perche` non  metti i++ nell'istruzione for? Poi, guardando meglio
(se ho capito cosa vuol fare la tua funzione), non sarebbe meglio
qualcosa del genere?
bool lotto::ceckalldiff()
{
   for (int i = 0; i < 5; i++)
      for (int j = i+1; j < 6; j++)
         if (num[i] == num[j])
            return false;
   return true;
}
-- 
S.L.

 }
c'hai ragione ... si vede proprio che ho il cervello lesso ... con sto caldo
non riesco a fare 2+2 ... povero me' paio un mongoloide quando vedo le
cazzate che faccio ...
ciao

 palle non poter usare le scorciatoie del c ...
guarda che anche in C il codice che hai scritto tu ha comportamento
indefinito.
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

 indefinito.
si dicevo solo che non avendo l'ordine di esecuzione nel controllo dell'if
non potevo usare la scorciatoia per scrivere quello che mi era venuto in
mente ...