Newsgroup: it.comp.lang.c++
Titolo: Errore dii facile soluzione immagino...

Ciao a tutti!! Sono alle prime armi.. mi potete dire cosa c'è che non va in
questo codice?? La funzione "inserisci" non funziona... o meglio non mi
modifica il mio stack S1 come vorrei; ogni volta che viene chiamata crea una
nuova istanza di stack S credo. Come devo fare??
Grazie a tutti in anticipo!!!
#include <stdio.h>
#define MAX 10
struct stack
{
 int top;
 int elementi[MAX];
};
void stampa(struct stack S)
{
 int i;
 for (i=0; i<S.top; i++)
 {
  if (i==0)
   printf("Base-->");
  else if (i==(S.top-1))
   printf("Top--> ");
  printf("\t%d\n", S.elementi[i]);
 }
}
void insert(int x, struct stack S)
{
 if (S.top==MAX)
  puts("Lo stack e' pieno!!!");
 else
 {
  S.elementi[S.top]=x;
  S.top++;
 }
}
void main()
{
 int i;
 struct stack S1;
 S1.top=0;
 for (i=0; i<MAX; i++)
  S1.elementi[i]=NULL;
 insert(4, S1);
 insert(2, S1);
 stampa(S1);
}

 questo codice?? 
Qui sei OT.
-- 
Luc.

 Grazie a tutti in anticipo!!!
Ho commentato parte del tuo codice e l'ho riscritto.
L'errore sta nel passaggio dei parametri alle funzioni.
// #include <stdio.h>
#include <iostream>
// #define MAX 10
const int MAX = 10;
struct stack
{
  int top;
  int elementi[MAX];
};
// void stampa(struct stack S)
// anche qui potresti fare void stampa(stack & S)
// vedi la insert per spiegazione
void stampa(stack S)
{
      // int i;
      // for (i=0; i<S.top; i++)
      for (int i=0; i<S.top; ++i)
      {
         if (i==0)
         {
           //printf("Base-->");
           std::cout << "Base--> ";
         }
         else if (i==(S.top-1))
         {
           // printf("Top--> ");
           std::cout << "Top--> ";
         }
         // printf("\t%d\n", S.elementi[i]);
         std::cout << "\t" << S.elementi[i] << std::endl;
      }
}
// void insert(int x, struct stack S)
// se lo passi per copia l'oggetto originale non viene modificato.
// quindi o lavori con i puntatori o (meglio in questo caso)
// con i riferimenti
void insert(int x, stack & S)
{
   if (S.top==MAX)
   {
      // puts("Lo stack e' pieno!!!");
      std::cerr << "Lo stack e' pieno!!!";
   }
   else
   {
      S.elementi[S.top]=x;
      S.top++;
   }
}
// void main()
// il main DEVE restituire un int
int main()
{
   // int i;
   // struct stack S1;
   stack S1;
   S1.top=0;
   // for (i=0; i<MAX; i++)
   for (int i=0; i<MAX; ++i)
      S1.elementi[i]=NULL;
   insert(4, S1);
   insert(2, S1);
   stampa(S1);
}
--
Gerolamo

nuova istanza di stack S credo. Come devo fare??
1) Stai programmando in C, e non in C++ percui sei OT.
2) Alle tue funzioni stai passando delle struct per valore, il che
vuol dire che alla chiamata della funzione viene creata una nuova
struct locale alla funzione sulla quale tu (inutilmente) fai delle
operazioni, e la memoria allocata per la struct viene distrutta quando
si esce dalla funzione.
Quindi, appurato che vuoi modificare i dati della struct dentro la
funzione chiamata, puoi usare il passaggio di parametri tramite
riferimento
void insert(int x, stack &S)  //in c++ non é necessario specificare
che si tratta di una struct.
{
/*........*/
}
Tale soluzione viene osteggiata dallo stesso StrouStrup, in quanto
rende poco chiaro che la funzione ha il permesso di modificare i tuoi
dati, infatti la chiamata avviene allo stesso modo di quella per
valore
stack stk;
insert(1,stk);
ma forse in questo caso si può fare uno strappo, visto che il nome
della funzione é abbastanza indicativo su ciò che essa ha intenzione
di fare con i tuoi dati.
In alternativa puoi utilizzare il passaggio di un puntatore, soluzione
condivisa anche dal C
void insert(int x, stack *S)
{
/*......*/
}
ricordandoti bene però che S é un puntatore e dovrai quindi
redeferenziarlo tramite gli operatori * e ->
per esempio:
S->top=2;
Altrimenti, soluzione che io preferisco e che sicuramente é la più
consona per un linguaggio come il C++ é quella di creare una classe
stack incapsulando tutti i dati che ti servono al suo interno e
gestirla tramite apposite funzioni membro.
class stack
{
private:
    std::vector<int> elementi;
/*........*/
};
void stack::insert(int x)
{
elementi.push_back(x);
/*.....*/
}
in questo modo eviti anche di dover passare alle funzioni dei
parametri importanti che dovrebbero restare nascosti. bye.
Il Ghenio
---------
// TODO: Place your ass here