Kilka pytań podstawowych pytań co do logiki C++

0

Jako programista .net i js mam niemałe problemy ze zrozumieniem C++ więc pomyślałem, że napisze je w tym wątku aby te kwestie wyjaśnić i ruszyć dalej.


int main ()
{
  wchar_t wcs[] = L"This is a sample wide string";
  wchar_t* pwc;
  pwc = wcsrchr (wcs, L's');
  wprintf (L"Last occurence of L's' found at %d \n", pwc-wcs+1);
  return 0;
}

Rozumiem, że typ* to wskażniki ale nie rozumiem tego do końca jak widać.
a) Dlaczego przypisujemy wynik do wskaźnika zamiast do typowego typu wartościowego (poza wydajnością - interesuje mnie logika tego działania)?
b) Czyli jeśli dobrze rozumiem to trzymamy w tej zmiennej adres miejsca w pamięci, gdzie ten wynik się znajduje?

0
Ulgikkksss napisał(a):

a) Dlaczego przypisujemy wynik do wskaźnika zamiast do typowego typu wartościowego (poza wydajnością - interesuje mnie logika tego działania)?

Zajrzyj do dokumentacji http://www.cplusplus.com/reference/cwchar/wcsrchr/ Po prostu funkcja zwraca wskaźnik do ostatniego wystąpienia substringa i już. Tak ktoś wymyślił i już. Poza tym ta funkcja to jest spadek po czystym C (nagłówek cwchar.h), a w czystym C napisy traktujemy jako tablice znaków i zwrócenie wskaźnika na żądany element jest tam naturalne.

Ulgikkksss napisał(a):

b) Czyli jeśli dobrze rozumiem to trzymamy w tej zmiennej adres miejsca w pamięci, gdzie ten wynik się znajduje?

Tak jest.

0

Proszę o wyjaśnienie poniższego kodu.

Gdzieś w kodzie wywołujemy taka metode.

Funcs::pGetModuleFileNameA(NULL, exePath, MAX_PATH);

Plik cpp

namespace Funs{
Types::T_GetModuleFileName pGetModuleFileNameA;
}

Plik h

typedef DWORD (WINAPI *T_GetModuleFileName)
   (
      HMODULE hModule,
      PCHAR  lpFilename,
      DWORD   nSize
   );

Jak mniemam chodzi tutaj o coś w rodzaju delegaty z C#, czyli

typedef int (*t_somefunc)(int,int);

int product(int u, int v) {
  return u*v;
}

t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456

Jednak nie rozumiem, skad compilator wie że chodzi o funkcje GetModuleFileNameA(). Przecież nigdzie jej nie przypisujemy za pomoca = &GetModuleFileNameA(HMODULE, PCHAR, DWORD)

1

Gdzieś w kodzie musisz mieć przypisanie do pGetModuleFileNameA, prawdopodobnie coś w stylu pGetModuleFileNameA = GetProcAddress(blah, "GetModuleFilenameA");.

Tylko zastanawiam się po co to kombinowanie, przecież można użyć GetModuleFilenameA bezpośrednio.
A tak w ogóle to nie powinieneś polegać na GetModuleFilenameA, bo to się posypie jeśli ścieżka ma dziwne znaki. Raczej powinno się używać unikodowej funkcji GetModuleFileNameW, a właściwie po prostu GetModuleFileName, które jest makrem oznaczającym wersję -W albo -A w zależności od tego czy jest #define UNICODE czy nie.

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