IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

CArray ne contient pas ce avec quoi il est rempli


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut CArray ne contient pas ce avec quoi il est rempli
    Bonjour !

    J'ai cherché pendant des heures une solution à un problème qui me semble assez étonnant, sans succès... voici l'histoire :

    J'ai un programme qui doit analyser/découper un fichier texte contenant des commandes, données, etc. J'ai donc développé une fonction qui s'occupe de découper le fichier et de le transformer en CArray, contenant les commandes, les données, etc.
    Je dispose donc d'une collection CArray<char *, char *>. Je parcours le fichier via la méthode ReadString() de CStdioFile et je convertis chacune des chaînes de caractères en char *. Je procède ensuite à l'ajout de la chaîne à ma collection (avec la fonction Add()).
    Le problème est qu'à la fin du traitement, ma collection ne contient pas les valeurs ajoutées auparavant. Je n'en ai toujours pas déterminer la cause.
    Pour le moment, j'ai déjà vérifié pas mal de choses :

    A chaque conversion de chaîne lue dans le fichier, j'écris le contenu du buffer char * dans un autre fichier. Le contenu est le bon. J'ajoute ensuite le buffer à ma collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    // Code simplifié, je passe les vérifications d'ouverture de fichiers //
    FILE * pFile = fopen("resultat.txt", "a");
    FILE * pFile1 = fopen("resultat1.txt", "a");
    int i = 0;
    while(sFile.ReadString(csRead)
    {
           char * buffer = new char[30];
     
           // Je rencontre une commande
           buffer = csRead.GetBuffer(0);
           m_CommandArray.Add(buffer);
           fprintf(pFile, "%s\n", m_CommandArray.GetAt(i);
           i++;
     
           if(!strcmpi(buffer, "ma commande stop"))
           {
                   int n = m_CommandArray.size();
                   for(int k = 0; k < n; k++)
                           fprintf(pFile1, "%s\n", m_CommandArray.GetAt(k);
                   break;
           }
    }
    fclose(pFile);
    fclose(pFile1);
    En sortie j'obtiens exactement ce que je veux dans le fichier resultat.txt. En revanche, le contenu du fichier resultat1.txt est complétement différent. Aucun traitement n'est subi par ma collection mis à part les ajouts entre le moment où j'écris dans resultat.txt et celui où j'écris dans resultat1.txt.

    Quelqu'un aurait t-il déjà rencontré un problème similaire et trouvé sa solution ?

    Par avance merci.

  2. #2
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    [juste comme ça] Il te manque pas mal de parenthèse fermante. Et la méthode est pas size, mais GetSize.
    A par ça, je ne voit aucun défaut. Soit j'ai manqué quelque chose, soit tu n'as pas mis le bout de code problématique. Mais bon, comme Carray, ça sonne MFC... utilise vector ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Citation Envoyé par Lavock Voir le message
    [juste comme ça] Il te manque pas mal de parenthèse fermante. Et la méthode est pas size, mais GetSize.
    Erf, j'ai pas copié-collé mais retapé à la main, mais tu as raison de me le faire remarquer.

    Citation Envoyé par Lavock Voir le message
    A par ça, je ne voit aucun défaut. Soit j'ai manqué quelque chose, soit tu n'as pas mis le bout de code problématique.
    Je n'ai pas écrit l'ensemble du code, mais le principe utilisé est le même tout au long du traitement. Je parse, je convertis, j'ajoute à la collection.

    Citation Envoyé par Lavock Voir le message
    Mais bon, comme Carray, ça sonne MFC... utilise vector ?
    Je n'ai jamais utilisé la classe vector et je préfèrerais ne pas avoir à le faire (La collection est utilisée en aval dans des fonctions déjà écrites).

    Je ne trouve pas la cause du problème : le traitement est tout à fait banal ! Je me contente d'ajouter des char * à un CArray et pourtant, même si à l'instant où je réalise un ajout le contenu est le bon, lorsque je parcours cette collection en fin de traitement, toutes les valeurs sont modifiées et remplacées par des chaînes de caractères à symboles, comme si le contenu du buffer n'avait jamais été initialisé.

    En mode débogage, VS m'indique une erreur : "Windows a déclenché un point d'arrêt dans application.exe. Cela peut-être dû à une défaillance du tas qui indique un bogue dans application.exe ou l'une des DLL chargées."

    [EDIT] Voici le code intégral :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    // DEBUT FONCTION
    {
       if(m_iPosition == 1) 
      {
    	if(m_iPosition > m_iNbDocuments)
    	{
    		AfxMessageBox("FALSE");
    		m_bIsEnought = TRUE;
    		return FALSE;
    	}
    	else 
    	{
    		CString csRead;
    		CStdioFile sFile;
    		if(!sFile.Open(lpszPathName, CFile::modeNoTruncate | CFile::modeRead | CFile::typeText))
    			AfxMessageBox("Le fichier n'a pas pu être ouvert.");
    		if(m_iPosition == 1)
    			m_pos = 0;
    		if(m_mapOfPages.Lookup(m_iPosition,m_pos)) 
    			sFile.Seek(m_pos, CFile::begin);
     
    		CString strTampon;
    		CString csTmp;
    		CString cs1;
    		AfxMessageBox("Passe avant le while(sFile.Read(csRead))");
    		FILE * pR = fopen("test_hugo.txt", "a");
    		char * cBuffer = new char[30];
    		int r = 0;
    		FILE * mc = fopen("Commande.txt", "w");
    		while(sFile.ReadString(csRead))
    		{
    			strTampon = csRead;
    			// Nous débarasse de tous les espaces en début de chaîne.
    			while(strTampon.GetAt(0) == ' ')
    				strTampon = strTampon.Right(strTampon.GetLength() - 1);
     
    			while(strTampon != "")
    			{
    				int indexOfSpace;
     
    				if((indexOfSpace = strTampon.Find(' ')) != -1)
    				{
    					csTmp = strTampon.Left(indexOfSpace);
    					strTampon = strTampon.Right(strTampon.GetLength() - 1 - csTmp.GetLength());
    				}
    				else 
    				{
    					csTmp = strTampon;
    					strTampon = "";
    				}
     
    				cBuffer = csTmp.GetBuffer(0);
     
    				if(csTmp.GetLength() > 12)
    				{
    					char * cBuffer1 = new char[13];
    					char * cBuffer2 = new char[13];
    					int n1;
    					if(cBuffer[0] == '-')
    						n1 = 12;
    					else
    						n1 = 11;
    					for(int k = 0; k<n1 ; k++)
    					{
    						cBuffer1[k] = cBuffer[k];
    					}
    					cBuffer1[n1] = '\0';
    					if(m_iPosition == 1) fprintf(pR, "%s\n", cBuffer1);
    					m_CommandArray.Add(cBuffer1);
    					fprintf(mc, "[%i] %s\n", r, m_CommandArray.GetAt(r));
    					r++;
    					int n = strlen(cBuffer) - n1;
    					for(int k = 0; k < n; k++)
    					{
    						cBuffer2[k] = cBuffer[k+n1];
    					}
    					cBuffer2[n] = '\0';
    					if(m_iPosition == 1) fprintf(pR, "%s\n", cBuffer2);
    					m_CommandArray.Add(cBuffer2);
    					fprintf(mc, "[%i] %s\n", r, m_CommandArray.GetAt(r));
    					r++;
    				}
    				else
    				{
    					// Si la chaîne ou sous-chaîne lue n'est pas DEBDES, elle fait l'objet d'une commande.
    					if(strcmpi(cBuffer, "DEBDES"))
    					{	//TESTER ICI LES VALEURS D ENTREE 
    						if(m_iPosition == 1)
    						{
    							fprintf(pR, "%s\n", cBuffer);
    						}
    						m_CommandArray.Add(cBuffer);
    						fprintf(mc, "[%i] %s\n", r, m_CommandArray.GetAt(r));
    						r++;
    					}
    				}
     
    				if(!strcmpi(cBuffer, "DRTEXT"))
    				{
    					char* F1 = new char[12];
    					sFile.ReadString(csTmp);
     
    					while(csTmp.GetAt(0) == ' ')
    						csTmp = csTmp.Right(csTmp.GetLength() - 1);
    					while(csTmp != "")
    					{
    						if((indexOfSpace = csTmp.Find(' ')) != -1)
    						{
    							cs1 = csTmp.Left(indexOfSpace);
    							csTmp = csTmp.Right(csTmp.GetLength() - 1 - cs1.GetLength());
    							F1 = cs1.GetBuffer(0);
    							if(m_iPosition == 1) fprintf(pR, "%s\n", F1);
    							m_CommandArray.Add(F1);
    							fprintf(mc, "[%i] %s\n", r, m_CommandArray.GetAt(r));
    							r++;
    						}
    						else
    						{
    							F1 = csTmp.GetBuffer(0);
    							if(m_iPosition == 1) fprintf(pR, "%s\n", F1);
    							m_CommandArray.Add(F1);
    							fprintf(mc, "[%i] %s\n", r, m_CommandArray.GetAt(r));
    							r++;
    							csTmp = "";
    						}
    					}
    					sFile.ReadString(csTmp);
    					char * Texte = csTmp.GetBuffer(0);
    					if(m_iPosition == 1) fprintf(pR, "Texte =%s\n", Texte);
    					//
    					m_CommandArray.Add(Texte);
    					fprintf(mc, "[%i] %s\n", r, m_CommandArray.GetAt(r));
    					r++;
    				}
     
    				if(!strcmpi(cBuffer, "FIN") || !strcmpi(cBuffer, "FINDES"))
    				{
    					AfxMessageBox("FIN");
    					sFile.Close();
    					fclose(pR);
    					m_iPosition++;
     
    					fclose(mc);
    					/*for(int i = 0 ; i<m_CommandArray.GetSize(); i++)
    					{
    						FILE * pfile = fopen("cmdHugo.txt", "a");
    						fprintf(pfile, "[%i] %s\n",i, m_CommandArray.ElementAt(i));//GetData());//.GetAt(i));
    						fclose(pfile);
    					}*/
    					return TRUE;
    				}
     
    			} // Fin while strTampon != ""
    		} // Fin lecture sFile
     
     
    		m_bIsEnought = TRUE;
    		fclose(pR);
    		m_iNumber = m_iPosition;
    		m_iPosition++;
    		sFile.Close();
     
    		return FALSE;
    	}
    }
    // FIN FONCTION
    Ce n'est pas forcément écrit proprement étant donné qu'elle est en plein débogage...

  4. #4
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Le problème est tout bête. J'avais pas réaliser, mais ton buffer est un char *, et tu utilise l'opérateur =. Du coup, le pointeur valide à l'occurrence ne l'est plus après.

    Même pour buffer, il faut que tu copie 1 par 1 les caractère. Enfin je crois. Cstring, c'est encore du MFC, et je connais pas trop. Un conseil, évite MFC, c'est pas standard/protable.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 96
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Le problème est tout bête. J'avais pas réaliser, mais ton buffer est un char *, et tu utilise l'opérateur =. Du coup, le pointeur valide à l'occurrence ne l'est plus après.
    Ça signifierait que si je plaçais l'instruction char * cBuffer = new char[30] à l'intérieur de la boucle ça fonctionnerait ? (Au départ, la fonction avait été écrite avec des allocations au sein même de la boucle et tout fonctionnait)


    Citation Envoyé par Lavock Voir le message
    Même pour buffer, il faut que tu copie 1 par 1 les caractère. Enfin je crois. Cstring, c'est encore du MFC, et je connais pas trop. Un conseil, évite MFC, c'est pas standard/protable.
    L'application sur laquelle je travaille utilise les MFC.

  6. #6
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Je ne connais pas cstring. Mais cela m'étonnerait que buffer pointe toujours sur ce qui a été retourné par new après avoir fais buffer = csRead.GetBuffer(0).

    [edit] utilise strcopy, apparemment c'est possible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Fonction Equiv avec un critère du type "ne contient pas"
    Par Sadar007 dans le forum Excel
    Réponses: 4
    Dernier message: 09/06/2014, 23h26
  2. connexion avec le reseau est-elle etablie ou pas? search api
    Par mehdi_swatch dans le forum Windows
    Réponses: 2
    Dernier message: 29/03/2005, 17h54
  3. Comment modifier les .pas fournis avec Delphi ?
    Par prgasp77 dans le forum Langage
    Réponses: 2
    Dernier message: 09/02/2005, 15h12
  4. [CORBA & VB .NET] comment faire et avec quoi ...
    Par zlavock dans le forum CORBA
    Réponses: 1
    Dernier message: 12/01/2005, 09h22
  5. Réponses: 10
    Dernier message: 30/11/2004, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo