C++ Ismeretlen hiba

C++ Ismeretlen hiba
2013-09-08T14:15:04+02:00
2013-09-09T06:32:06+02:00
2022-08-17T14:05:35+02:00
Unc3nZureD
Kizárásos alapon megtaláltam hogy a hiba itt található:


BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) { char class_name[255]; char title[255]; char text[255]; char texttmp[255]; char titletmp[255]; GetClassName( hwnd, class_name, sizeof(class_name) ); GetWindowText( hwnd, title, sizeof(title) ); SendMessage( hwnd, WM_GETTEXT, 255, (LPARAM) text ); strcpy_s( titletmp, sizeof(toLowerCase(title)), toLowerCase(title)); strcpy_s( texttmp, sizeof(toLowerCase(text)), toLowerCase(text));

a toLowerCase-nek pedig itt a függvénye:

char* toLowerCase(char* str) { int differ = 'A'-'a'; char ch; int ii = strlen(str); for (int i=0; i <ii;i++) { strncpy_s(&ch, sizeof(ch), str+i,1); if (ch>='A' && ch<='Z') { ch = ch-differ; memcpy(str+i, &ch, 1); } } return str; }

Ha nem használom a két strcpy_s részt, akkor tökéletesen megy. Hol ronthattam el? A VC++ nem ír hibát, viszont ha hívom a DLL-t (hiszen ez egy DLL egy része) akkor összeomlik az exe.
Mutasd a teljes hozzászólást!
ááá télleg, igaz, akkor már a spanyolviaszt se találjuk fel újra:
std::transform(title, title+strlen(title), title, ::tolower);


[reply to all]
Mutasd a teljes hozzászólást!

  • ez így nemjó,

    char ch; ... strncpy_s(&ch, sizeof(ch), str+i,1);
    ez C-sztringet fog másolni, tehát
    sizeof(ch)==1, tehát az &ch-ra csak a termináló 0 fog beférni

    másfelől csak 1db char-t akarsz átmásolni str[ i ]-ből ch-ba,
    erre feljesen felesleges egy eljárást meghívni:
    ch = str[i];
    memcpy-t is feleslegesnek találom:
    str[i] = ch;

    az első eljárásban pedig:
    strcpy_s( titletmp, sizeof(toLowerCase(title)), toLowerCase(title));
    ez kétszer fogja neked a toLowerCase-t megcsinálni ami felesleges,
    ráadásul a sizeof(toLowerCase(title)) eljárásra nem az fog visszajönni mint amire te gondolsz, ez mindig (32bites rendszeren):
    sizeof(toLowerCase(title))==4bájt lesz ugyanis a char* tipus ennyin tárolódik le

    de ha már C++ használsz, akkor inkább használj std:string-et
    Mutasd a teljes hozzászólást!
  • char* toLowerCase(char* str) { int differ = 'A'-'a'; char ch; int ii = strlen(str); for (int i=0; i <ii;i++) { ch = *(str+i); if ((ch>='A') && (ch<='Z')) { ch = ch-differ; *(str+i) = ch; } } return str; }

    Nem kell:
    strncpy_s
    Mutasd a teljes hozzászólást!
  • Köszi mindkét hozzászólást, C++ terén eléggé kezdő vagyok, megpróbálom átnézni amit javasoltatok és ha gond van akkor írok!
    Mutasd a teljes hozzászólást!
  • std::tolower? :)
    Mutasd a teljes hozzászólást!
  • Nézd meg ezt is.

    // Itt egy egyszerubb es joval gyorsabb toLowerCase: // amikor meghivod vigyazz, nehogy str erteke NULL legyen! char* toLowerCase(char* str) { int differ = 'A'-'a'; char *p = str; for ( ; *p != '\0'; ++p ) { if( *p >= 'A' && *p <= 'Z' ) { *p = *p - differ; } } return str; } BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) { char class_name[255]; char title[255]; char text[255]; char texttmp[255]; char titletmp[255]; GetClassName( hwnd, class_name, sizeof(class_name) ); GetWindowText( hwnd, title, sizeof(title) ); SendMessage( hwnd, WM_GETTEXT, sizeof( text ), (LPARAM) text ); // ^ a 255-ot, helyettesitsd sizeof()-fal! // ez a ket sor helyett: //strcpy_s( titletmp, sizeof(toLowerCase(title)), toLowerCase(title)); //strcpy_s( texttmp, sizeof(toLowerCase(text)), toLowerCase(text)); // legyen ez a 4: strcpy_s( titletmp, title ); strcpy_s( texttmp, text ); toLowerCase( titletmp ); toLowerCase( texttmp );
    Mutasd a teljes hozzászólást!
  • Ha már pointerezünk, akkor kell a fg. elején egy:

    if (str == NULL) return NULL;

    A paraméter str = 0 (NULL), utána jön a crash.

    Még valami...
    Az eredeti kódban a
    int differ = 'A'-'a';
    látható.
    Legyen inkább:
    char differ = 'A'-'a';
    Mutasd a teljes hozzászólást!
  • Ha már pointerezünk, akkor kell a fg. elején egy:
    ...

    Miért kell?
    Direkt oda van írva:
    // amikor meghivod vigyazz, nehogy str erteke NULL legyen!


    A 2013.09.08. 15:14 -es hsz-ban nem kell?
    Mutasd a teljes hozzászólást!
  • ááá télleg, igaz, akkor már a spanyolviaszt se találjuk fel újra:
    std::transform(title, title+strlen(title), title, ::tolower);


    [reply to all]
    Mutasd a teljes hozzászólást!
  • Mindig levédem a programjaimban a futó ágakat, főleg a helper, utils fg-ekben , amit bárhol felhasználhat a programozó..
    Talán ez azért van mert embedded programozásnál alap feltétel. Nem teszed meg, akkor napokat lehet szívi egy hardveres crash-el.


    Mutasd a teljes hozzászólást!
abcd