[ 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]