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