wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 2

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Mon algorithme n'a pas l'air de fonctionner ...
Conversation : Mon algorithme n'a pas l'air de fonctionner ...
31-08-2008 20:00:53  Mon algorithme n'a pas l'air de fonctionner ... #1
At0mIkS (Membre)
Inscrit le : 20-11-2007
Messages: 255
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour,
Je voudrais supprimer une ligne dans un fichier. Pour cela je le ré-écris sans la ligne que je ne veux plus :

Code wxWidgets:

wxFile file( _T("shares.csv"), wxFile::write );
for ( size_t i = 0; i < m_shares.size(); i++ )
{
    //Delete in the file by don't re-write it
    if ( m_shares[ i ]->IndexInTheList( m_list ) != m_indexLastItemClicked )
        file.Write( m_shares[ i ]->TextToFile() + _T("\n") );
}
file.Close();


Et voila les méthodes nécessaires :

Code wxWidgets:

long Share::IndexInTheList( wxListCtrl *listCtrl )
{
    for ( long index = 0; index < (long) listCtrl->GetItemCount(); index++ )
    {
        //The check is built on only certain elements of each item
        //Which are :
        //  - URL           ( 9 )
        //  - Date          ( 1 )
        //  - Quantity      ( 2 )
        //  - BuyingPrice   ( 4 )
        int colomnToCheck[] = { 9, 1, 2, 4 };
        vector< wxString > valuesRequired;
        valuesRequired.push_back( m_url );
        valuesRequired.push_back( GetDate() );
        valuesRequired.push_back( wxString::Format( _T("%ld"), m_quantity ) );
        valuesRequired.push_back( wxString::Format( _T("%.2f"), m_buyingPrice ) );
 
        bool isInTheListCtrl = true;
        wxListItem item;
        item.SetId( index );
        item.SetMask(wxLIST_MASK_TEXT);
 
        for ( size_t i = 0; i < valuesRequired.size(); i++ )
        {
            item.SetColumn( colomnToCheck[ i ] );
            listCtrl->GetItem( item );
 
            if( item.GetText() != valuesRequired[ i ] )
            {
                isInTheListCtrl = false;
                break;
            }
        }
 
        //If all the nessessaries elements are similar
        //Then remember the item index
        if( isInTheListCtrl )
            return index;
    }
 
    return -1;
}
 
wxString Share::TextToFile()
{
    return wxString::Format( _T("%s;%s;%.2f;%ld"), m_url.c_str(), GetDate().c_str(), m_buyingPrice, m_quantity );
}


m_indexLastItemClicked correspond à l'index de l'item précédemment sélectionné.


Bon et pour le comportement c'est que des fois il me ré-écrit ce qu'il faut et des fois il m'en supprime 2 (autre que celle visée d'ailleur xD)


Si vous avez une solution ou des critiques sur le code je suis preneur.
Merci d'avance
31-08-2008 21:21:15  Re: Mon algorithme n'a pas l'air de fonctionner ... #2
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 123
Snippets: 3
Tutoriels: 0
Hors ligne
J'ai pas très bien compris ce que fait la fonction IndexInTheList ^^ Mais c'est sûrement dans cette fonction que se trouve l'erreur...
Ce que tu peux faire, c'est afficher dans la console la valeur de m_indexLastItemClicked et m_shares[ i ]->IndexInTheList( m_list ) à chaque tour de boucle pour savoir si cela renvoie bien ce que tu espérais...
Après tu peux savoir d'où vient l'erreur.
31-08-2008 22:18:34  Re: Mon algorithme n'a pas l'air de fonctionner ... #3
At0mIkS (Membre)
Inscrit le : 20-11-2007
Messages: 255
Snippets: 0
Tutoriels: 0
Hors ligne
Oui j'avais déjà testé les résultats, y sont bons.
C'est étrange ...
----------
De plus le code qui suit ( pour supprimer la valeur du vector marche parfaitement )

Code wxWidgets:

for ( size_t i = 0; i < m_shares.size(); i++ )
{
    if ( m_shares[ i ]->IndexInTheList( m_list ) == m_indexLastItemClicked )
    {
        //Delete in the vector
        m_shares.erase( m_shares.begin() + i );
        break;
    }
}

----------
Et encore un test :

Code wxWidgets:

    for ( size_t i = 0; i < m_shares.size(); i++ )
        if ( m_shares[ i ]->IndexInTheList( m_list ) != m_indexLastItemClicked )
            cout << m_shares[ i ]->TextToFile().mb_str() << endl;
    }

M'affiche exactement ce qu'il devrait ...

Dernière modification par At0mIkS (01-09-2008 00:00:37)

01-09-2008 05:31:04  Re: Mon algorithme n'a pas l'air de fonctionner ... #4
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 544
Snippets: 0
Tutoriels: 0
Site web
Hors ligne
Tu stockes les lignes dans un vecteur donc? Ca ne serait pas soit l'ouverture, soit le remplacement qui deconnerai par hasard?

Itérer est humain, récurser est divin
01-09-2008 11:00:23  Re: Mon algorithme n'a pas l'air de fonctionner ... #5
At0mIkS (Membre)
Inscrit le : 20-11-2007
Messages: 255
Snippets: 0
Tutoriels: 0
Hors ligne
Qu'entends tu par la ?
----------
J'ai refais des test :

Code wxWidgets:

    //Delete in the file ( by don't re-write it )
    wxFile file( _T("shares.csv"), wxFile::write );
    for ( size_t i = 0; i < m_shares.size(); i++ )
    {
        if ( m_shares[ i ]->IndexInTheList( m_list ) != m_indexLastItemClicked )
            file.Write( m_shares[ i ]->TextToFile() + _T("\n") );
    }
    file.Close();

Cela à l'air de marche maintenant o.O
Bizarre

Dernière modification par At0mIkS (01-09-2008 11:09:38)

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Mon algorithme n'a pas l'air de fonctionner ...