Newsgroup: it.comp.lang.c++
Titolo: Dove posso trovare un compilatore C++ che mi compili questo?

/****
   Ridux : the reducer
***/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdarg.h>
#define STRSIZE 200
#define MAXCOLS 6
#define DEFAULT_NUM 50
#define DEFAULT_OUTCOL 6
#define DEFAULT_MIN 3
int nProno=DEFAULT_NUM;
int outCols=DEFAULT_OUTCOL;
int minRis=DEFAULT_MIN;
char outFilename[STRSIZE];
int localEcho=0;
FILE *outFilehandle;
int zprintf (char *fmt, ... )
{
va_list ap;
   va_start(ap,fmt);
   if (localEcho) vprintf (fmt,ap);
   if (outFilehandle) vfprintf (outFilehandle,fmt,ap);
   va_end(ap);
}
#define MAXROWS 1000    /** piu' di 800 sacchi nun se gioca !! **/
int outputCol[MAXROWS][MAXCOLS];
int nrRow;
int savecol (int *panel)
{
int i;
   if (nrRow==MAXROWS){
      zprintf ("Troppe colonne nel ridotto\n");
      exit(1);
   }
   for (i=0;i<outCols;i++) outputCol[nrRow][i] = panel[i];
   nrRow++;
}
/**
   controlla , tra le colonne emesse,se ce ne e' almeno una
**/
int checkPanel (int *current)
{
int score,i,j,k;
   for (k=0;k<nrRow;k++) {
      score=0;
      for (i=0;i<outCols;i++) {
      int nr;
         nr=outputCol[k][i];
         for (j=0;j<outCols;j++){
            if (nr==current[j]) score++;
         }
      }
      if (score>=minRis) {
         return 1;
      }
   }
   return 0;
}
/** genera le colonne ridotte **/
/** quante saranno ? **/
long int genera()
{
int counter[MAXCOLS];
int pronocount;
int i,live,idx,j;
long cols=0;
long rid=0;
int counterlimit;
int prev[MAXCOLS];
int emit=0;
int score;
/** inizializza i contatori **/
   for (i=0;i<outCols;i++) {
      counter[i]=i;
      prev[i]=0;
   }
   do {
      live=1;
     ++cols;
/*
      zprintf ("\n#%ld ",cols);
      for (i=0;i<outCols;i++) zprintf ("%d ",counter[i]);
*/
   /** se con la colonna previsione faccio almeno minRis **/
   /** espelle la colonna corrente ( solo la prima volta ) **/
vaimo:;
      score=0;
      for (i=0;i<outCols;i++) {
      int nr;
         nr=prev[i];
         for (j=0;j<outCols;j++){
            if (nr==counter[j]) score++;
         }
      }
      if (score>=minRis) {
    /** la colonna soddisfa le condizioni **/
    /** va pero' verificato se e' stata gia' emessa un'altra colonna che
soddisfa **/
    /** le stesse condizioni **/
         if (!checkPanel(counter)){
         if (!emit){
            savecol (counter);
            rid++;
            zprintf ("\n#%5.5ld ",rid);for (i=0;i<outCols;i++) zprintf
("%.2d ",counter[i]);
         }
         emit++;
         }
      } else {
      /** con la colonna in esame non faccio minRis **/
      /** ne cerco un'altra partendo da quella corrente **/
         for(i=0;i<outCols;i++){
            prev[i]=counter[i];
         }
         emit=0;
         goto vaimo;
      }
     /** incrementa array di counter **/
      idx=outCols-1;
      counterlimit=nProno-1;
retry:;
      if ( counter[idx] == counterlimit){
         if (idx){
            --idx;
            --counterlimit;
            goto retry;
         } else {
            live=0;
         }
      } else {
         counter[idx]++;
         if (idx!=outCols-1){
            for (i=idx;i<(outCols-1);i++) {
               counter[i+1]=counter[i]+1;
            }
         }
      }
   } while (live);
   zprintf ("\n\nColonne totali : %ld , ridotte : %ld\n",cols,rid);
   return cols;
}
void usage (void)
{
   printf ("ridux version 1.0 (compilation date : %s)\n",__DATE__);
   printf ("Usage :  ridux [flags]\n");
   printf ("flags :  -? display Usage\n");
   printf ("         -p <numeri del sistema (default=%d)>\n",DEFAULT_NUM);
   printf ("         -m <minimo garantito (default=%d)>\n",DEFAULT_MIN);
   printf ("         -o <colonne di uscita (default=%d)>\n",DEFAULT_OUTCOL);
   printf ("         -f <file di uscita (default=stdout)>\n");
   printf ("         -e <abilita echo su stdout>\n");
   exit (1);
}
void main (int argc,char *argv[])
{
int c;
/** per getopt **/
extern int optind;
extern char *optarg;
   *outFilename=0;
   outFilehandle=NULL;
   while ( (c=getopt (argc,argv,"?p:o:m:f:e"))!=EOF){
      switch (c){
      case '?':
         usage();
      case 'p':
         sscanf (optarg,"%d",&nProno);
         break;
      case 'f':
         sscanf (optarg,"%s",outFilename);
         break;
      case 'o':
         sscanf (optarg,"%d",&outCols);
         break;
      case 'm':
         sscanf (optarg,"%d",&minRis);
         break;
      case 'e':
         localEcho++;
      } /* end-switch */
   }
   if (*outFilename==0 && !localEcho) {
      printf ("No outfile defined : setting localEcho\n");
      localEcho=1;
   }
   if (*outFilename) {
      outFilehandle=fopen (outFilename,"w+");
      if (!outFilehandle){
         printf ("file creation error\n");
         exit(1);
      }
   }
   zprintf ("Ridux Started ....\n");
   zprintf ("Total numbers : %d\n",nProno);
   zprintf ("Minimun       : %d\n",minRis);
   zprintf ("Colums        : %d\n",outCols);
   genera();
}

Ovunque, se devi compilarlo sotto win togli l'include unistd.h (linux),
correggi le due funzioni
int zprintf (char *fmt, ... )
e
int savecol (int *panel)
che non ritornano nulla
tutto qui.