Newsgroup: it.comp.lang.c++
Titolo: problema difficile solo per chi è un mostro del C++!!!

Salve ragazzi è un paio di giorni che sbatto davanti ad un problema che nn
riesco proprio ad individuare.
Vi spiego...ho creato una lista generica utilizzando i template, formata da
"nodi" ognuno dei quali ha 2 proprietà di nome TARGET e LINE e quello che
devo fare e questo:
1)inizializzare la lista con 8 nodi che abbiano sia target che line =
0;//FUNZIONA
2)ricercare un determinato TARGET a seconda della LINE inserito in input e
sostituirlo con quello inserito modificando la proprietà e non creando un
nuovo         componente della lista.
in pratica succede che la lista viene inizializzata esattamente, poi al
primo inserimento TARGET viene sostituito correttamente, al secondo
inserimento però mi viene sostituito sia il secondo TARGET che quello
precedentemente modificato, e così via. In pratica mi modifica non solo il
TARGET che interessa ma anche tutti quelli che erano stati in precedenza
modificati, come mai?? VI riporto tutti i file omettendo i file di
intestazione .h ....Grazie per la Collaborazione...
P:S: volevo precisare che non ci sono errori di sintassi ma solo
procedurali...
//HO BISOGNO URGENTE DI TROVARE UNA SOLUZIONE GRAZIE A TUTTI vi lascio la
mia mail per chi è interessato e vuole ricevere tutto il sorgente per
testarlo --> 
ingu...@inwind.it
//FILE LISTA.CPP
#include "Lista.h"
#include <string>
using namespace std;
// implementazione classe Nodo
template <typename T>
Nodo<T>::Nodo(T linea,T targ,Nodo<T> *p):target(targ),line(linea),psucc(p){}
template <typename T>
Nodo<T> *Nodo<T>::successivo() const
{
 return psucc;
}
template <typename T>
void Nodo<T>::sostituisci(T targ)
{
 target=targ;//QUI DOVREBBE AVVENIRE LA MODIFICA DI TARGET CON TARG
PARAMETRO CHE ARRIVA DA newLine();
}
template <typename T>
T Nodo<T>::getTarget() const
{
 return target;
}
template <typename T>
T Nodo<T>::getLinea() const
{
 return line;
}
//implementazione classe Lista;
template <typename T>
void Lista<T>::push(T s,T targ)
{
 primo=new Nodo<T>(s,targ,primo);
}
template <typename T>
T Lista<T>::pop()
{
  Nodo<T> *tmp=primo;
 T s=tmp->getTarget();
 primo=primo->successivo();
 delete tmp;
 return s;
}
template <typename T>
void Lista<T>::clear()
{
 while(!vuota()) pop();
}
template <typename T>
void Lista<T>::inizializza(T n, T targ)
{
 for(int i=0;i<8;i++)
  push(n+(7-i),targ);//L'OPERATORE + E' STATO RIDEFINITO SULL'OGGETTO
NUMEROBASE e ha il compito di incrementare il suo valore decimale
}
template <typename T>
bool Lista<T>::vuota() const
{
 return(primo==NULL);
}
template <typename T>
bool Lista<T>::piena() const
{
 return false;
}
template <typename T>
bool Lista<T>::esiste(T targ, int numLinea) const
{
 Nodo<T> *p=primo;
 for(int i=0;i<numLinea;i++)
  p=p->successivo();
 if(targ==(p->getTarget()))
  return true;
 else
  return false;
}
template <typename T>
void Lista<T>::stampa()
{
 Nodo<T> *p=primo;
 while(p!=NULL)
  {
  cout << "TARGET: " << p->getTarget() << " LINE: " << p->getLinea();
  cout << endl;
  p=p->successivo();
  }
}
template <typename T>
void Lista<T>::newLine(T targ,T s)
{
 Nodo<T> *tmp=primo;//CREA PUNTATORE A NODO
  while(s!=(tmp->getLinea()))//SFOGLIA LA LISTA FINCHE' LA LINE DI OGNI NODO
NON e' UGUALE A "s" che contiene la LINE DA SELEZIONAR
          tmp=tmp->successivo();
  tmp->sostituisci(targ);//UNA VOLTA SELEZIONATA PER LINE QUI AVVIENE LA
CHIAMATA PER LA SOSTITUZIONE DEL TARGET
}
template <typename T>
Lista<T>::~Lista()
{
clear();
}
//QUESTO INVECE E' LO SPEZZONE DEL FILE CHE UTILIZZA LA CLASSE PRECEDENTE
//DIMENTICAVO: NUMEROBASE E' UN'ALTRA CLASSE CHE CONTIENE TRA LE PROPRIETA'
//UN VETTORE DI BIT, IL METODO ASSOCIATO getDecimal() che troverete
RESTITUISCE il valore decimale
//DELL'INTERO VETTORE BINARIO ESEMPIO se il vettore è 1010 restituisce 10
{
   Lista<NumeroBase> ListaCache;
   NumeroBase n(0,2,3);//UTILIZZA I COSTRUTTORI E CREA UN OGGETTO CHE è un
vettore rappresentante 0 in base 2 con 3 zeri iniziali
   NumeroBase targ(0,2,10);//UTILIZZA I COSTRUTTORI CREA UN OGGETTO CHE è un
vettore rappresentante 0 in base con 10 zeri iniziali
   ListaCache.inizializza(n,targ);
   n.~NumeroBase();
   targ.~NumeroBase();
   ListaCache.stampa();
   cout << "Inserisci la configurazione binaria dell'indirizzo da prelevare
dalla Cache (16 bit)" << endl;
   cout << "^^^^^^^^^^^^^^^^" << endl;
    scanf("%s",config);
   while(config[0]!='*')
    {
    char target[11];
    char line[3];
    int i;
    for(i=0;*(config+i)!='\0';i++);//calcolo del numero di bit della
configurazione inserita
    assert(i==16);//l'indirizzo deve essere di 16 bit
    for(int bit=0;bit<11;bit++)//riempe il vettore target che servirà per
l'assegnamento e la
     target[bit]=config[bit];//verifica della proprietà target della lista
    for(int bit=11;bit<14;bit++)//riempe il vettore line che servirà per
selezionare
     line[bit-11]=config[bit];//la linea della cache
    NumeroBase numLinea(line,2);//CREA UN OGGETTO NUMEROBASE COL VETTORE
LINE IN BASE 2
    NumeroBase Target(target,2););//CREA UN OGGETTO NUMEROBASE COL VETTORE
TARGET IN BASE 2
     int l=numLinea.getDecimal();//calcola in che posizione si trova la
linea
     for(int i=0;i<l;i++);
     ListaCache.newLine(Target,numLinea);//Sostiuisce la nuova linea con la
vecchia che ha
    //}//
    ListaCache.stampa();//lo stesso campo line nella lista.
    cout << "Inserisci la configurazione binaria dell'indirizzo da prelevare
dalla Cache (16 bit)" << endl;
    cout << "^^^^^^^^^^^^^^^^" << endl;
    scanf("%s",config);
    }
   }

 Salve ragazzi č un paio di giorni che sbatto davanti ad un problema che nn
[cut]
Beh.. magari se era piů corto il post ti avrei potuto aiutare!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Neanch'io ho tutto il tempo per guardarmi il codice, cmq un paio di 
suggerimenti te li do lo stesso:
1) non usare subject del genere: io, per lo meno, li trovo alquanto 
indisponenti
2) perche' non usi la libreria standard per avere una lista concatenata?
3) ti assicuro che non sara' certo perche' scrivi "e' urgentissimo!" che 
la gente correra' a leggere un papiro di codice, per di piu' incompleto 
(non e' molto comodo leggersi un'implementazione senza l'header, te 
l'assicuro)
Scusa per la scarsa gentilezza...
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */