Przekazanie stringa do funkcji

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...

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)

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 :/

0

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

0

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

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 ;)

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