Erreur incompréhensible et insoluble pour moi....

cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008 - 4 oct. 2004 à 00:25
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008 - 6 oct. 2004 à 18:43
Voilà, je vais inscrire le source que j'ai tapé (une partie du source plutôt). J'ai l'impression que tout est correct, mais le compilo me fait une erreur... (visual c++ 7)

#include "stdafx.h"
#include "resource.h"
#define MAX_LOADSTRING 100
#define MAXPOINT 500
#define nBytesToRead 1000 //le pas de lecture de fichier (exemple 1000 octets par 1000 octets)

// Variables globales :
HINSTANCE hInst; // instance actuelle
TCHAR szTitle[MAX_LOADSTRING]; // Le texte de la barre de titre
TCHAR szWindowClass[MAX_LOADSTRING]; // le nom de la classe de fenêtre principale

//Mes variables globales
POINT pt[250];

// Pré-déclarations des fonctions incluses dans ce module de code :
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

//Mes declarations de fichiers
BOOL LectureFichier(HANDLE);

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO : placez ici le code.
MSG msg;
HACCEL hAccelTable;

// Initialise les chaînes globales
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TEST_TRANSFORMEEDEFOURIER, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Effectue l'initialisation de l'application :
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TEST_TRANSFORMEEDEFOURIER);

// Boucle de messages principale :
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}

//
// FONCTION : MyRegisterClass()
//
// BUT : inscrit la classe de fenêtre.
//
// COMMENTAIRES :
//
// Cette fonction et son utilisation sont nécessaires uniquement si vous souhaitez que ce code
// soit compatible avec les systèmes Win32 avant la fonction 'RegisterClassEx'
// qui a été ajoutée à Windows 95. Il est important d'appeler cette fonction
// afin que l'application dispose des petites icônes correctes qui lui sont
// associées.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TEST_TRANSFORMEEDEFOURIER);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCTSTR)IDC_TEST_TRANSFORMEEDEFOURIER;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);
}

//
// FONCTION : InitInstance(HANDLE, int)
//
// BUT : enregistre le handle de l'instance et crée une fenêtre principale
//
// COMMENTAIRES :
//
// Dans cette fonction, nous enregistrons le handle de l'instance dans une variable globale, puis
// créons et affichons la fenêtre principale du programme.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // Stocke le handle d'instance dans la variable globale

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// FONCTION : WndProc(HWND, unsigned, WORD, LONG)
//
// BUT : traite les messages pour la fenêtre principale.
//
// WM_COMMAND - traite le menu de l'application
// WM_PAINT - dessine la fenêtre principale
// WM_DESTROY - génère un message d'arrêt et retourne
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static HANDLE hFile;
LPCTSTR csFileName="sommes.txt";

switch (message)
{
case WM_CREATE:
if ((hFile=CreateFile(csFileName,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))==INVALID_HANDLE_VALUE)
{
MessageBox(hWnd,TEXT("Le fichier sommes.txt n'est pas présent dans le répertoire, créez le avant de lancer l'application"),TEXT("Attention !!!"),MB_OK|MB_ICONEXCLAMATION);
return 0;
}
else
{
LectureFichier(hFile);
}
break;

case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Analyse les sélections de menu :
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;

case IDM_EXIT:
DestroyWindow(hWnd);
break;

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO : ajoutez ici le code de dessin...
for (int i=0;i<250;i++) SetPixel(hdc,i,pt[i].y,RGB(255,0,0));
EndPaint(hWnd, &ps);
break;

case WM_DESTROY:
CloseHandle(hFile);
PostQuitMessage(0);
break;

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Gestionnaire de messages pour la boîte de dialogue À propos de.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:if (LOWORD(wParam) IDOK || LOWORD(wParam) IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}

BOOL LectureFichier(HANDLE hFile)
{
BOOL bRelire=TRUE;
TCHAR iOctetsTemp[nBytesToRead], j=0;
BOOL isTrue;
DWORD nBytesRead, nFileLenght;
TCHAR buffer[20];
for (int i=0;i<20;i++) buffer[i]='\0';
TCHAR ConstantText[500];

nFileLenght=GetFileSize(hFile,NULL);
TCHAR *iOctets = new TCHAR[nFileLenght];

for (int i=0;i<(int)nFileLenght;i++) *(iOctets+i)='\0';

while (bRelire==TRUE)
{
isTrue=ReadFile(hFile,&iOctetsTemp,nBytesToRead,&nBytesRead,NULL);
if (isTrue == TRUE)
{
if (nBytesRead >= 0)
{
for (int i=0;i<(int)nBytesRead;i++)
{
if (nBytesRead==nBytesToRead)
*(iOctets+(i+(nBytesRead*j)))=iOctetsTemp[i];
else
{
*(iOctets+(i+(nBytesToRead*j)+nBytesRead))=iOctetsTemp[i];
bRelire=FALSE;
}
}
j++;
}
else if (nBytesRead < 0)
{
MessageBox(NULL,TEXT("Erreur lors de la lecture des données du ficier sommes.txt..."),TEXT("Erreur"),MB_OK);
return FALSE;
}
}//fin du if (isTrue==TRUE)
}//fin du while

sprintf(ConstantText,"nombre d'octets du fichier (calculé par GetFileSize) = %d",nFileLenght);
MessageBox(NULL,ConstantText,"info",MB_OK);

int k=0;
for (int i=0;i<(int)nFileLenght;i++)
{
if (*(iOctets+i)=='\t')
{
MessageBox(NULL,"tabulation","info",MB_OK);
if (k!=0)
{
pt[atoi((LPCTSTR) buffer)].y=pt[atoi((LPCTSTR) buffer)].y+1;
k=0;
for (int i=0;i<20;i++) buffer[i]='\0';
}
}
else
{
if (*(iOctets+i)=='\r')
{
MessageBox(NULL,"retour chariot","info",MB_OK);
if (k!=0)
{
pt[atoi((LPCTSTR) buffer)].y=pt[atoi((LPCTSTR) buffer)].y+1;
k=0;
for (int i=0;i<20;i++) buffer[i]='\0';
}
}
else
{
if (*(iOctets+i)=='\n')
{
MessageBox(NULL,"nouvelle ligne","info",MB_OK);
;
}
else
{
if (*(iOctets+i)==32)
{
MessageBox(NULL,"espace","info",MB_OK);
;
}
else
{
{
buffer[k]=*(iOctets+i);
k++;
}
}
}
}
}
} //fin du for
sprintf(ConstantText,TEXT("valeur de x %i, y %i"),0, pt[0].y);
MessageBox(NULL,ConstantText,TEXT("Info"),MB_OK);
delete [] iOctets;
return TRUE;
}

Franchement je n'y comprends rien, si quelqu'un peu me donner un petit tuyau ça serait cool.
En fait, ce que je veux faire doit être relativement simple, mais je dois certainement me compliquer la vie!
Je voudrais simplment placer tous les octets d'un fichier dans un tableau (a ce point mon code doit marcher) puis, lire une série d'entiers séparés par des tabulations ou des retours chariots, nouvelle ligne de ce tableau. Cs valeurs sont ensuite stockées dans une série de 250 points, les abscisses allant de 0 à 249 et les y étant les nombres de fois que chacun est sorti. Par exemple, l'entier 152 est sorti 24 fois dans le fichier.
Je crois que ce que j'ai fait est pas mal, et je ne trouve ps l'erreur. Même l'erreur que me renvoie le compilo, je ne la comprends pas. Si quelqu'un peut essayer de compiler chez lui et de voir le problème, ca serait super sympa de sa part.

En vous remerciant d'avance.

JB

9 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
4 oct. 2004 à 01:28
c'est quoi l'erreur que tu comprends pas ?

en testant sous VC 6, j'ai les erreurs suivante :

- au niveau des 'case', il faut mettre le code dans un bloc s'il y a des variables locales déclarées :
...
case WM_PAINT :
{
for(int i ...)
}
...

- il y a des redéfinitions de variable dans les boucles for au sein d'un même bloc :
for(int i...);
for(int i...);

=> la 2ème boucle for ne doit pas redéfinir i.
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
4 oct. 2004 à 11:20
- il y a des redéfinitions de variable dans les boucles for au sein d'un même bloc :
for(int i...);
for(int i...);

C géré par VC7

et C ds les normes, le pb ne doit po venir de là...

Magic Nono: l'informagicien! 8-)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 oct. 2004 à 18:33
S'il ne choisi pas un option précise du compilateur de VC7, les 2 déclarations de i vont générer une erreur; mieux vaut déclarer un i pour tout le bloc directemement supérieur.
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
4 oct. 2004 à 18:58
L'erreur est la suivante:

Debug erreur!
Program: c:\.....\PointsPMU_Papa.exe
DAMAGE: after Normal Block (#40) at 0x00880850.

(Press retry to debug the application)
Abandonner, Recommencer, Ignorer

Voilà, je ne pense pas que ce soit du au fait que les i soient déclarés les uns à la suite des autres, car je les ai redefinis avec d'autres lettres, et l'erreur subsiste toujours...
C'est trop dur le c++....
lol

JB
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 oct. 2004 à 10:09
Ouais enfin la c'est pas le compilo qui te fait une erreur...
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 oct. 2004 à 12:20
Ca c'est une erreur d'exécution, pas de compilation, causes possibles :
- libération d'un pointeur non valide,
- dépassement de buffer qui écrase la zone voisine qui lorsqu'elle tente d'être libérée échoue.
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
5 oct. 2004 à 18:31
OK, je n'avais pas vu la subtilité...
Je vais regarder ce que je peux faire, mais en fait, j'avais déjà pensé à ça, mais je n'ai pas trouvé ni le pointeur non valide, ni le dépassement de buffer...

Si quelqu'un le voit dans mon code source, ça m'aiderait vachement, ou sinon, quelqu'un pourrait peut être me donner un petit source valide sur la récupération d'entiers séparés par des tabulations et/ou des retour chariot (\r\n) à partir d'un fichier texte.

Merci.

JB
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
6 oct. 2004 à 12:22
pour essayer de traquer le pb, vérifie les indices avant chaque accès au tableaux :
par ex :
avant d'essayer :
*(iOctets+(i+(nBytesToRead*j)+nBytesRead))
tester
if((i+(nBytesToRead*j)+nBytesRead >=nFileLenght)
{
// erreur
}

et mettre un point d'arrêt si erreur, en lancant en mode debug tu drvrait trouver la ligne incriminée
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
6 oct. 2004 à 18:43
Ok,

Je vous remercie tous, mais en fait, j'ai trouvé le problème....
En fait, les indices que j'avais mis (justement ceux dont tu parles ymca2003) pouvaient dépasser la taille du tableau que j'avais alloué.
J'ai remplacé par un indice plus simple, et là c'est bon.

Merci à tous pour votre aide.

JB
0
Rejoignez-nous