Newsgroup: it.comp.lang.c++
Titolo: Aiuto!

questo programma è stato scritto in classe dal prof ed è scritto in C: le
mie modifiche sono state minime, ho solo sostituito
printf con cout. Uso il C++ anche se so di complicarmi inutilemte la vita
perchè ho visual c++ e dopotutto spero che gli adattamenti da fare non siano
poi così difficili.
Quando il prof scrive malloc e free come lo devo "tradurre"? io ho scritto
new e il free l'ho lasciato, è giusto?
Allora i miei problemi sono tanti che non so da dove cominciare:
innanzitutto lo scopo dovrebbe essere quello di costruire una "classe" per
gestire un array di code che abbia come metodi l'inserimento in testa di un
elemento, l'estrazione, la rimozione di un'intera coda,ecc.
fino a qui mi è abbastanza chiaro il concetto, in un ipotetico programma io
dovrei poter fare una cosa del genere:
#include "queue.h"
typedef struct cardTAG
 {
  int num;
  int seed;
 } card;
 card C[40];
 q1 = Queue.constr(); // questi q1 e q2 non sono stati definiti ma
potrebbere presumibilmente essere delle "persone"
 q2 = Queue.constr(); // ma che significa fare q1 = Queue.constr(), mah???
 // .....
 //
 Queue.insert(&C[3],q1);  // questo mi è chiaro, io voglio assegnare ad ogni
persona delle carte, poterle rimuovere, ecc
 Queue.insert(&C[32],q2); // senza dovermi preoccupare di come sia fatto
queest'oggetto carta
*************** "queue.h"  **************
ifndef _QUEUE_H
#define _QUEUE_H
#define MAX_QUEUE 10
int  Queue_Constr(void);
void Queue_Destru(int q);
int  Queue_Insert(char *i, int q);
char *Queue_Extract(int q);
char *Queue_Read(int i, int q);
int  Queue_Count(int q);
#endif
**************** queue.cpp **********************
vorrei dire ma se io compilo un programma queue.cpp e queue.h poi dopo, per
poter usare i metodi definiti nel
file queue.cpp in un altro programma ad esempio poker.cpp basta che
inserisca #include "queue.h"???
non c'è bisogno che leggiate tutto il programma, dato che oltretutto ci sono
miliardi di errori:
le mie domande sono in fondo....
#include "queue.h"
using namespace std;
#define N 8
typedef struct qelemTAG
{
   struct qelemTAG *next;
   struct qelemTAG *prev;
   char *info;
} qelem;
typedef struct QueueTAG
{
   qelem *head;
   int items;
} Queue;
static Queue Q[N];
int Queue_Constr(void)
{
   int q;
   for (q = 0; q < N; ++q) {
      /* Initialize q-th queue */
      Q[q].head = NULL;
      Q[q].items = 0;
   }
   cout << " ------Liste inizializzate------" << endl;;
   return (0);
}
void ExitProg()
{
 cout << "Errore ";
}
// Inserisce in testa
int Queue_Insert(char *i, int q)
{
   qelem *temp = new (qelem);
   /* Sanity check */
   if (temp == NULL) ExitProg();
   /* Initialize queue element */
   temp->info = i;
   temp->next = NULL;
   temp->prev = NULL;
   /* Update queue data */
   ++Q[q].items;
   if (Q[q].head)
   {
   temp -> prev = Q[q].head;
      Q[q].head->prev = temp;
      temp -> next = Q[q].head;
      Q[q].head = temp;
   }
   else
   {
      Q[q].head = temp;
      temp -> prev = Q[q].head;
   }
   return (0);
}
char *Queue_Extract(int q)
{
   char *r = NULL;
   if (Q[q].head)
   {
      qelem *temp = Q[q].head;
   qelem *t1;
      while (temp ->next) {
    t1=temp;
    temp = temp->next;
   }
   r = temp -> info;
   t1 -> next = NULL;
   free(temp);
   }
   else
   {
      ExitProg();
   }
   --Q[q].items;
   return (r);
}
1) vabbè a parte gli errori ma se io scrivo un programma così poi
Queue.insert mica c'è! cioè Queue ha un campo items
per contare quanti elementi ci sono nella coda e un campo head per puntare
al rpimo elemento ma non ha NESSUN
METODO!
2) Queue.head è un puntatore a qelem ma anch'esso ha la stessa forma di
quelem, cioè ha un campo info, prev e next...
ma è giusto ciò?
3) questo programma sarebbe stato scritto per il C, ma in C è possibile
usare gli oggetti e definire metodi?
o si puo fare solo in C++?
4) l'ultima domanda e poi basta: come faccio a ripulire lo schermo (come
"clrscr" nel pascal)

questo programma è stato scritto in classe dal prof ed è scritto in C: le
mie modifiche sono state minime, ho solo sostituito
printf con cout. Uso il VC++ anche se so di complicarmi inutilemte la vita



Dipende dal compilatore che usi.
Una tale funzione non č prevista dello Standard per il C++.
Comunque ti do due consigli.
1) Se vuoi passare al C++ (che č superiore al C) devi
   procurarti un buon manuale.
   Inoltre ricorda che il C++ č *molto* piů vasto del
   C, ma molto piů flessibile.
2) Se vuoi restare al C, hai sbagliato newsgroup.
   Per il C c'č it.comp.lang.c.
   Ricorda che nonosatante il nome (VC++), il compilatore
   della Microsoft (come tutti gli altri) č anche un
   compilatore C.
   I files terminanti con .c sono compilati in C, i files
   terminanti in .cpp sono compilati in C++.
Manlio Perillo

   C, ma molto piů flessibile.
Ah... se solo il mondo fosse cosi' semplice... questo e' meglio di
quello... quest'altro e' meglio ancora... basterebbe prendere il
meglio in assoluto e tutto si risolverebbe.
Purtroppo a mio parere non esiste un ordinamento totale dei
linguaggi e moltissimo (se non tutto) dipende dal contesto.
E' vero che il "C" e' incluso nel "C++" ma ci sono casi in cui
la scrittura in filosofia "C++ purista" non e' affatto superiore
e significa semplicemente maggiori costi e prestazioni inferiori.
Questo non toglie che il C++ sia un ottimo linguaggio in molti
contesti e permetta di ottenere un livello di astrazione maggiore
rispetto al C.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff


In parte hai ragione, ma mi devi spiegare che cosa significa
"la scrittura in filosofia 'C++ purista'".
Solo per farti un esempio, dando una occhiata alle varie librerie
GNU si nota che i nomi delle funzioni cominciano con il nome
della libreria (o qualcosa di simile).
Questo per evitare il name clash e per fornire una 'interfaccia'
comune alle funzioni.
In C++ semplicemente basta usare i namespace per risolvere
la cosa in modo più elegante (e di certo l'efficienza non
viene toccata).
La maggiore flessibilità del C++ è evidente anche per quanto
riguarda l'esempio specifico della Queue.
Queue è meglio rappresentata da una classe che da un insieme
di funzioni.
Manlio Perillo

e significa semplicemente maggiori costi e prestazioni inferiori.
Casi in cui probabilmente il progetto non si adatta bene alla
programmazione oop, ed usarla diventerebbe un'inutile complicazione.I
programmi scritti ad oggetti sono molto più facili da modificare
rispetto a quelli scritti in modo procedurale, che spesso e volentieri
hanno bisogno di pesanti adattamenti anche solo per aggiungere
pochissime funzionalità(questo non vale solo per il C, ma anche per le
ciofeche in VB che spesso capita di vedere o per qualsiasi altro
linguaggi non orientato agli oggetti) e questo significa sicuramente
una maggiore perdita di tempo(e di costi quindi). Quanto alla maggiori
prestazioni del C, io sinceramente faccio fatica ad apprezzarle.
Il Ghenio
-----------
LOVELY SARA
Dal lunedi'al venerdi'su Italia Uno alle 8:10
Non perdetevelo...
-----------

di funzioni.
Sicuramente. Ma anche una interfaccia definita da:
  typedef struct ML_STACK_TAG ML_Stack;
  Stack *ML_NewStack(void);
  void  ML_DeleteStack(Stack *s);
  void  ML_Push(Stack *s,int value);
  int   ML_Pop(Stack *s);
non e' poi cosi' terribile... e se stai scrivendo una
libreria generica e' preferibile a una classe C++ (chi
volesse trasformarla in una classe ci mette poco a farsi
un wrapper).
Fra qualche tempo, quando spero si sara' diradato il
fumo su questo argomento, forse si potra' ottenere lo
stesso livello di portabilita' anche con classi C++.
HTH


prestazioni del C, io sinceramente faccio fatica ad apprezzarle.
Il C++ comprende il C: dire che il C e' piu' veloce del C++
e' un controsenso. Io ho detto che la soluzione "C++ purista"
(ovvero che si basa in modo essenziale su "C++ - C") e' a volte
meno adatta o indecentemente meno performante (e inutilmente grossa).
Una facility di logging basata sugli stream non solo e' inutilmente
lenta e grossa... ma anche piu' difficile da scrivere (e da
manutenere), meno leggibile e con meno funzionalita' (pensa al
multithreading).
La cosa che mi stupisce molto (e mi intristisce un poco) e' che
questo non appaia evidente.



Sono d'accordissimo su questo.
Ma se ricordi io proposi anche si usare la classe
num_get e num_put che servono apposta per questo
(con il KAI C++ questa soluzione era 3 volte
più lenta che atoi(str.c_str()), ma non è detto
che non possa migliorare).
Inoltre se uno vuole la massima efficienza può sempre
usare le funzioni C, resta il fatto che conosce delle
alternative che potrebbero risultare migliori in altri
contesti.
Infine a cosa ti riferisci con le facility di loggin?
Ciao
Manlio Perillo