Newsgroup: it.comp.lang.c++
Titolo: AIUTATEMI, PER FAVORE!!!!

Vi ripropongo il problema.... X favore, spiegatemi, non riesco a capire come
sia possibile...
Allora, la questione è complessa, sto facendo un programma x la tesi della
maturità.....
Il topic è il cellular automa...
Ho un bel programmino in C++, che mi consente di sviluppare le generazioni
di automi cellulari unidimensionali...
Questo è il mio programmino:
#include <iostream.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#define Maxx 640
#define Maxy 480
enum stato {spento,attivo};
stato stati[Maxx];
stato temp[Maxx];
int dim,iterazioni;
short regola;
void Inizializza(stato *x,int &n,short &reg,int &iter)
{
 int i;
 short l;
    char scelta;
    clrscr();
 cout<<"n (max "<<Maxx<<"): ";
 cin>>n;
 cout<<"Iterazioni: ";
 cin>>iter;
 cout<<"Regola: ";
 cin>>reg;
 cout<<"Inizializzazione (m)anuale o (c)asuale? ";
 cin>>scelta;
 randomize();
    if (scelta=='c')
     for (i=0;i<n;i++)
         x[i]=(rand()&1 ? attivo : spento);
    else
    {
  for (i=0;i<n;i++)
      x[i]=spento;
     i=0;
        cout<<"\n\n Inserisci la serie di numeri (max 50) \n da attivare (-1
per terminare)... \n\n";
        do
        {
   i++;
         cout<<i<<"°attivazione: ";
            cin>>l;
            x[l]=attivo;
  }
        while ((l!=-1)&&(i<50));
 }
}
void InizializzaGrafica()
{
 int gDriver=DETECT, gMode, errorCode;
 initgraph(&gDriver,&gMode,"c:\tc\include");
}
void ChiudiGrafica()
{
 getch();
 closegraph();
}
void plot(stato *x,int n, int riga)
{
 int i;
    for (i=0;i<n;i++)
 putpixel(i+1,riga,x[i]? LIGHTRED : BLACK);
}
void copia(stato *v1,stato *v2,int n)
{
 int i;
 for (i=0;i<n;i++)
     v2[i]=v1[i];
}
short num2bit(int pos,stato *v1,int n)
{
 short z;
 z=4*v1[(n+pos-1)%n]+2*v1[pos]+v1[(pos+1)%n];
 return z;
}
stato estraibit(int x,int y)
{
    int i;
    stato b;
    for (i=0;i<x;i++)
     y/=2;
    b=y%2;
    return b;
}
main()
{
 int k,q=1;
    Inizializza(stati,dim,regola,iterazioni);
 InizializzaGrafica();
 plot(stati,dim,q);
 delay(500);
 for (q=1;q<=iterazioni;q++)
  {
  //in questo punto dai watches mi risulta q=201
  copia(stati,temp,dim);
  for (k=0;k<dim;k++)
   stati[k]=estraibit(num2bit(k,temp,dim),regola);
  plot(stati,dim,q);
  delay(100);
  }
ChiudiGrafica();
}
compilo con il turbo c++ della borland (v.1.05) e tutto è ok, ma quando
faccio il debug, mi accorgo che, al momento di entrare nel ciclo in
grassetto, q assume il valore di 201 invece che di 1, come è possibile tutto
ciò?
Vi prego, rispondetemi!!!!!!!!


Ciao Simo,
ho compilato con il turbo c++ della Borland (v. 3.0) e la variabile q cicla
correttamente da 1 al numero massimo di iterazioni, cosa che ho verificato
anche direttamente inserendo una printf. Insomma, il programma fa quello che
penso tu voi che faccia, ossia stampa una riga per iterazione.
Poi ci sarebbe da discutere su qualche punto, ad esempio le variabili
globali "stati", "dim", "regola", "iterazioni",... che vengono passate come
parametri (non è meglio dichiararle localmente ?), l'assegnazione nella
funzione "estraibit"
b = y%2;
che, per coerenza andrebbe sostituita con
b = (y%2 ? attivo : spento);
però ciò non toglie che il programma funzioni. Visto che 201 è il valore
assunto da q una volta uscito dal ciclo (se hai inserito 200 iterazioni) ,
sei sicuro di essere andato a leggere la variabile solo alla prima
iterazione? Prova ad inserire un controllo facendoti stampare direttamente
il valore a video.
Riz

   }
prova a farla diventare cosi':
q =1;
for (  ;q<=iterazioni; q++)
{
  copia(stati,temp,dim);
  for (k=0;k<dim;k++)
            stati[k]=estraibit(num2bit(k,temp,dim),regola);
  plot(stati,dim,q);
  delay(100);
}
Ciao
Gaetano
--
#exclude <windows>
printf("\t\t\b\b\b\b\b\b");.
printf("\t\t\b\b\b\b\b\b");
-- 
Posted from 
nts-03.mm.eutelsat.org
 [194.214.173.15] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Ottimo, cosě funziona....
Ma a che era dovuto....
č  assurdo tutto ciň....
Fai conto che io avevo supplito con un do while, solo che era esteticamente
molto brutto...

 ciò?
A me funziona correttamente compilando col Borland C++ Builder 4
(il compiler e' il 5.4 mi pare)
Se proprio vuoi programmare per Ms-Dos, le FAQ
(le trovi su 
http://cpp.programmazione.it
 ) consigliano il compilatore
DJGPP - 
http://www.delorie.com/djgpp
Penso che sia decisamente piu' aggiornato (e piu' standard) del tuo...
Ciao
--
Gerolamo


X le variabili il problema è che vengo dal Pascal, quindi mi porto dietro
sempre delle cose bruttissime tipo quelle =))) cmq è vero, grazie!!!
Per la storia del q, il mio problema è che al passaggio della prima
iterazione il valore diventava subito 201(per 200 iterazioni assegnate),
come se andasse a coprire l'indirizzo di memoria di qualche altra
variabile....
cmq grazie, adesso ho risolto col metodo di Gaetano!!!
Ciao e Auguri!

 ha scritto nel messaggio
news:p1_W7.1622$24.5...@twister1.libero.it...


 Nessuno di questi include è C++ Standard
math.h e stdlib.h sono standard.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 math.h e stdlib.h sono standard.
ma non sono da sostituire con cmath e cstdlib?
--
Gerolamo

ma non sono da sostituire con cmath e cstdlib?
Possibilmente sě perché il prossimo standard potrebbe non prevedere
piů gli header del c con il .h.
-- 
Marco Barisione (ICQ 84277092)

 ma non sono da sostituire con cmath e cstdlib?
lo standard le prevede entrambe. Come pura questione di stile e` 
preferibile usare cmath & C., ma anche gli header C sono legali.


 preferibile usare cmath & C., ma anche gli header C sono legali.
Ok
Grazie a te e a Marco Barisione per la risposta
Ciao
--
Gerolamo