|
[ stargazer @ 28.03.2006. 22:39 ] @
| Code:
case CTRL_IZMENI:
{
char * dir = (char *)malloc((MAX_PATH+20) * sizeof(char));
GetCurrentDirectory(MAX_PATH, dir);
strcat(dir, "\\pera.txt");
FILE * fAjl = fopen(dir, "r");
free(dir);
fseek(fAjl, 0, SEEK_END);
int size = ftell(fAjl);
rewind(fAjl);
char * Bafer = (char *)malloc(size * sizeof(char));
int i=0;
while ((*(Bafer+i) = fgetc(fAjl)) != EOF) i++;
fclose(fAjl);
MessageBox(hWnd,Bafer,"Procitao",MB_OK);
free(Bafer);
break;
}
Dakle, ovo je obrada poruke WM_COMMAND mog cenjenog dugmeta CTRL_IZMENI i pri izvršavanju linije :
free(Bafer);
dolazi do "Debug Error"-a i kada traceujem, odvede me u neki dbgheap.c fajl gde puca funkcija CheckBytes. UBI ME!!
Ako neko ima neku ideju, neka proba... |
[ peka @ 29.03.2006. 02:35 ] @
pokusaj da posle svakog malloc-a provjeris da li ti je vratio null pointer
[ ljube @ 29.03.2006. 14:14 ] @
da li stvarno postoji fajl pera.txt u direktoriju?
Evo primjera funkcije koja provjerava da li postoji fajl ili direktorij:
Code:
BOOL Exist (char *szFilePath)
{
if(strchr(szFilePath, '*') || strchr(szFilePath, '?'))
return Exist_A (szFilePath);
return Exist_B (szFilePath);
}
BOOL Exist_A (char *szFilePath)
{
WIN32_FIND_DATA W32FindData;
HANDLE rc;
rc = FindFirstFile(szFilePath, &W32FindData);
if(rc == INVALID_HANDLE_VALUE) return FALSE;
FindClose(rc);
return TRUE;
}
BOOL Exist_B (char *szFilePath)
{
DWORD ret;
ret = GetFileAttributes(szFilePath);
if (ret != 0xffffffff) return TRUE;
return FALSE;
}
[ reject @ 29.03.2006. 15:53 ] @
@stargazer: Mali savet, izbegavaj nazive kao sto su fAjl, napravice ti haos
i oduzeti mnogo vremena. Na primer pFile je mnogo jasnije i bice ti jasnije
i ako se posle x meseci vratis na neki deo koda gde si ga koristio.
[Ovu poruku je menjao reject dana 29.03.2006. u 16:55 GMT+1]
[ stargazer @ 29.03.2006. 17:34 ] @
Citat:
da li stvarno postoji fajl pera.txt u direktoriju?
Toliko nenormalan nisam....
Citat:
@stargazer: Mali savet, izbegavaj nazive kao sto su fAjl, napravice ti haos
i oduzeti mnogo vremena. Na primer pFile je mnogo jasnije i bice ti jasnije
i ako se posle x meseci vratis na neki deo koda gde si ga koristio.
Hvala na savetu, ali kod koji sam dao gore je samo privremen, i služi za isporbavanje čitanja iz fajla.
Citat:
pokusaj da posle svakog malloc-a provjeris da li ti je vratio null pointer
malloc je u redu.
Hvala svima na pokušaju, ali problem je mnogo ozbiljniji. Sinoć sam ovo postovao i otišao na spavanje besan.
Danas imam još neke informacije o problemu:
Naime, kada ga debugujem, izvršavanje programa se zaustavlja na liniji spomenutoj gore. Kada program pokrenem normalno, van MSVS-a, dobijem sledeću RUNTIME grešku :
Debug assertion failed!
file : fseek.c
Line: 149
expressions : str != NULL
i tu me je jutros zakucao.
Probao sam i sa new/delete, isto izbaci kao i sa malloc/free.
Takođe sam probao i sa LocalAlloc/LocalFree kombinacijom. Tu mi za RUNTIME izbaci isto, ali u MSVS-u dobijem sledeću poruku :
User breakpoint
Unhandled exception at address ...
tako da , 
[ kurt.hectic @ 29.03.2006. 18:12 ] @
Evo par mogucih problema pa ti vidi da li pomaze.
- ne proveravas sta je vratio malloc
- ne proveravas sta je vratio fopen ni fseek
- oslobadjas 'dir' (free(dir)) dok ga 'fAjl' mozda jos koristi
- ftell vraca long a ti pamtis u int
- fgetc vraca int, to pamtis u char, kog uporedjujes onda sa intom). ovaj uslov nikad nije ispunjen.
[ zkaiser @ 29.03.2006. 18:21 ] @
pise se ubijte me, ;)
[ NastyBoy @ 29.03.2006. 18:26 ] @
char * Bafer = (char *)malloc((size + 1) * sizeof(char));
int i=0;
while ((*(Bafer+i) = fgetc(fAjl)) != EOF) i++;
Obrati pazhnju na boldovan deo. Sa tim ce raditi.
Ti uchitavash iz fajla jedan vishe bajt od onog shto si alocirao (tj. upisujesh i jedno 0xff PREKO granice bafera)
[ stargazer @ 29.03.2006. 18:53 ] @
Citat: pise se ubijte me, ;)
Što volim ove likove...
Evo lepote :
Stavio sam GlobalAlloc i proveru fajla i pod MSVS-om izbacuje User breakpoint pri pozivu GlobalFree. Ali više ne izbacuje RUNTIME greške.
Naravno, bilo je problema sa postojanjem pera.txt fajla. Radi se o tome što pod MSVS-om GetCurrentDirectory vraća ProjectDir, gde sam napravio fajl, a ne ProjectDir\Debug gde stoji program. Tu je išla RUNTIME greška, jer pre toga nisam proveravao da li je fAjl pokazivač dobar.
[ ljube @ 29.03.2006. 22:16 ] @
Citat: Toliko nenormalan nisam....
Ipak ...
Nisam ti dzabe poslao kod da provjeris da li fajl ili dir postoji.
[ stargazer @ 29.03.2006. 22:27 ] @
Da, nepristojni ja, nisam ti zahvalio za to.
Ali i dalje imam grešku u debug modu, pod MSVS-om.
Šta ću sa time?
[ yooyo @ 29.03.2006. 23:19 ] @
A da li znas kog je tipa taj file? Mislim..dali je tekstelni ili binarni? Ako je tekstualni, onda se CR LF racunaju kao jedan ili dva karaktera u zavisnosti od moda, pa dobijas pogresnu duzinu. Ukratko... fajlove otvaraj sa "rb" ili "rt" i uvek ces biti siguran u kom modu ces procitati file.
Code:
...
FILE* f = fopen(dir, "rb");
fseek(f, 0, SEEK_END);
int size = ftell(f);
fseek(f,0,SEEK_SET);
chat* buffer = (char*)calloc(size+1, sizeof(char)); //Allocates an array in memory with elements initialized to 0
fread(buffer, sizeof(char), size, f);
fclose(f);
// uradi nesto sa bufferom
free(buffer);
[ z@re @ 29.03.2006. 23:46 ] @
Sad sam upravo taj tvoj kod pokrenuo u DevCpp-u, s dvije modifikacije : naravno, nije unutar switch petlje, i nema MessageBox poziva. Sve prolazi ok, na kraju sam samo sa puts funkcijom ispisao sadrzaj "Bafer"-a, u kojem je cijeli pera.txt file iz tekuceg direktorija. Dakle, ovo sve radi, nema nigdje greske. Jedino je mozda neka caka do MessageBox-a.
[ stargazer @ 29.03.2006. 23:57 ] @
fajl te tekstualni i probao sam i sa "rt", ali isto
Evo šta izbaci kao grešku pri oslobađanju bafera sa GlobalFree :
Unhandled exception at 0x7c901230 in Task Doer.exe: User breakpoint.
Nebuloza čista i napominjem da ne prijavljuje grešku van MSVS-a!
[Ovu poruku je menjao stargazer dana 30.03.2006. u 01:00 GMT+1]
[ z@re @ 30.03.2006. 00:01 ] @
Dev-C++ v4.9.9.1. Windows project. Includani windows.h, stdlib.h i stdio.h.
Code:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char *dir, *Bafer; int size, i=0; FILE *fAjl;
switch (message)
{
case WM_CREATE:
{
dir = (char *)malloc((MAX_PATH+20) * sizeof(char));
GetCurrentDirectory(MAX_PATH, dir);
strcat(dir, "\\pera.txt");
fAjl = fopen(dir, "r");
free(dir);
fseek(fAjl, 0, SEEK_END);
size = ftell(fAjl);
rewind(fAjl);
Bafer = (char *)malloc(size * sizeof(char));
while ((*(Bafer+i) = fgetc(fAjl)) != EOF) i++;
fclose(fAjl);
MessageBox(hwnd,Bafer,"Procitao",MB_OK);
free(Bafer);
break;
}
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
Tvoj kod ubacen u handler forme pri WM_CREATE eventu. Samo deklaracije varijabli izbacene van switch statementa. Sve radi najnormalnije, tj. odma prilikom podizanja programa prikaze MessageBox naziva "Procitao", u kojem je ispisan sadrzaj ove pera.txt datoteke iz tekuceg direktorija.
Dakle ne znam sta da napravis osim da izbacis deklaracije negdje direktno u funkciju (ovo po zdravoj logici uopce ne bi trebalo pomoc, jer meni radi i sa deklaracijama unutar case-a). Ili batalis to smece od Visual C++-a.
A mozda si i negdje prije u programu krivo mallocirao memoriju ili nesto tog stila, pa sad imas sranja radi toga. Provjeri sve skupa.
[Ovu poruku je menjao z@re dana 30.03.2006. u 01:04 GMT+1]
[ yooyo @ 30.03.2006. 01:03 ] @
A koji MSVC koristis? Ako je pitanju MSVC 6 onda instaliraj service pack 6 za njega. Ume da pravi gluposti ako ga ne "servisiras".
yooyo
[ NastyBoy @ 30.03.2006. 01:10 ] @
Pft...
Taj kod sam pokrenuo pod VS.2003.
Kod puca tamo gde si rekao, jer imash memory stomp, ochigledan - za fajl sadrzhaja recimo "1234567" tvoja petlja upisuje 8 bajtova u bafer velichine 7 bajtova (pogledaj memory window ako ne verujesh).
(size+1) radi posao (kad jednom uchitash fajl).... to je i yooyo napisao u onom snipetu.
Ako ti se ne svidja (size+1) onda promeni switch petlju da ne upisuje jedan element vishe nego shto treba
Ne znam oko chega je tolika rasprava, posebno ne razumem izjave tipa "VisualC++ smece"
[Ovu poruku je menjao NastyBoy dana 30.03.2006. u 02:10 GMT+1]
[ stargazer @ 30.03.2006. 10:56 ] @
da, to je rešilo problem
nisam u startu stavio size+1, jer sam tako video u primeru dokumentacije ftell funkcije na :
http://www.cplusplus.com/ref/
a posle mi uopšte nije palo na pamet da proverim da li je do toga
u nekom postu ovde sam stavio čoveku čak da tako treba, posle nisam mogao da nađem taj post da ispravim ( bolje )
hvala svima u svakom slučaju
[Ovu poruku je menjao stargazer dana 30.03.2006. u 11:56 GMT+1]
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|