Przekazanie stringa do funkcji

2011-10-14 16:18
0

Głupia sprawa. Oto definicje dwóch funkcji:

char* KonwertujNaRTF(char *plik_xml);
void OtworzTekst(char *nazwa);

I kod:

char* nazwaplikurtf = KonwertujNaRTF(nazwaplikuxml);
OtworzTekst(nazwaplikurtf);

Idę sobie kroczek po kroczku pod debugerem i widzę, że:

  1. KonwertujNaRTF prawidłowo zwraca do nazwaplikurtf ścieżkę do pliku.
  2. W momencie wejścia do funkcji (gdy strzałeczka debugera jest na linijce nazwą funkcji) OtworzTekst wciąż w nazwa widzę prawidłową ścieżkę.
  3. Krok dalej (czyli pierwsza instrukcja w funkcji) - już nie widzę ścieżki. Adres wskaźnika jest ten sam, ale nagle nie ma tam ścieżki, tylko krzaki.

Pierwsza linijka OtworzTekst nie robi nic z tym tekstem. Coś robię pewnie fundamentalnie źle. Nie lubię się ze stringami w C...

Pozostało 580 znaków

2011-10-14 16:22
1

na pewno zwalniasz gdzieś po drodze pamięć na tego stringa. Musiałabyś pokazać wnętrze funkcji KonwertujNaRTF,

możliwe że w tej funkcji robisz coś takiego:

char nazwa[] = "costcostam";
return nazwa;

wtedy pamięć przydzielona na nazwe zostaje kasowana w momencie wyjścia z funkcji (zdejmuje go ze stosu)


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-10-14 16:22

Pozostało 580 znaków

2011-10-14 17:55
0
char* KonwertujNaRTF(char *plik_xml)
{
    char buf[256];
    char* plik_rtf = buf;

    strncpy(plik_rtf, (const char*)plik_xml, (strstr(plik_xml, ".xml") - plik_xml));
    plik_rtf[strstr(plik_xml, ".xml") - plik_xml] = '\0';
    strcat(plik_rtf, ".rtf");

    HINSTANCE hLib = LoadLibrary ("KONWERT.DLL");
    if (hLib)
    {
        Konwert_Xml2Rtf _Konwert2Rtf = (Konwert_Xml2Rtf)GetProcAddress(hLib, "Konwert_Xml2Rtf");
        _Konwert2Rtf(plik_xml, plik_rtf);
    }

    return plik_rtf;
}

Czyli dokładnie to co napisałeś. Wygląda na to, że muszę oba parametry przekazać jako argumenty funkcji... Eh, paskudztwo :/

Pozostało 580 znaków

2011-10-14 18:12
0

Możesz alokować wewnątrz funkcji i zwracać wskaźnik. Nie zapomnij tylko o free gdzieś później.


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-10-14 19:35
0

wg mnie lepiej skorzystać std::string, bo z tego kodu co napisałaś wnioskuję, że jest to C++ ;)


░█░█░█░█░█░█░█░█░█░█░█░
Skąd ten wniosek? :-o W tagach jest C, kod jest w C. - Endrju 2011-10-14 20:16
bo w C na początku funkcji trzeba zadeklarować zmienne, a ona zadeklarowała zmienne, użyła funkcji a następnie zadeklarowała kolejną zmienną: HINSTANCE hLib = LoadLibrary ("KONWERT.DLL"); - krwq 2011-10-14 20:20
Tak było w C89. Obowiązującym standardem jest C99, w którym jest to dopuszczalne. - Endrju 2011-10-14 20:26

Pozostało 580 znaków

2011-10-14 20:41
0

wg mnie lepiej skorzystać std::string, bo z tego kodu co napisałaś wnioskuję, że jest to C++ ;)

Choć kod znajduje się w plikach .cpp, jego twórca dołożył wszelkich starań, żeby unikać jakichkolwiek powiązań z językiem c++. Całość jest bardzo a'la c, co nie znaczy, że trzyma się standardów. Jak użyję tu stringa, to będzie to jedyne takie miejsce w projekcie... Już nie wspominając o tym, że trzeba będzie wszystko rzutować na stringa a potem z powrotem na char *. Szkoda zachodu ;)

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0