Uczę się C i zastanawiam się jak działa ten kod.

1. Zdaję się że rozumiem jak działa komparator- w przypadku sortowania zwraca informację czy zmienna z danym indeksem ma być przesunięta czy też nie (poprawcie mnie jeżeli się mylę) 

2. Ale mam problem ze zrozumieniem zapisu (int)a - o co w tym chodzi? Dlaczego tutaj jest zadeklarowany wskaźnik dwa razy? I w jaki sposób to działa? 

int cmpfunc (const void * a,
Kochani, poddaje się. Przebrnąłem przez kila materiałów, ale się poddaje.

Jak w C++ stworzyć dynamiczną tablicę 2D (bez użycia vecotor) przy użyciu new
Chodzi mi o coś takiego:

int ** wsk = new int[x][y]
Proszę o w miarę łopatologiczne wytłumaczenie.

#programowanie #wskazniki
@I_am_not_Even: przy okazji (być może to nie jest dla ciebie rozwiązanie, ale może przyda się w przyszłości):

niemal zawsze zamiast n-wymiarowej tablicy możesz użyć tablicy jednowymiarowej. Przykładowo zamiast deklarować tablicę

int ** wsk = new int[x][y];
możesz

int* wsk = new int[x * y];
Potem trzymasz gdzieś "szerokość" tablicy (rozmiar pierwszego wymiaru - w twoim przypadku x) i zamiast odwołać się do tablicy wsk[a][b], odwołujesz się wsk[x * a
  • Odpowiedz
@alibi_m: Wiem, ale chciałem pobrać multum różnych wskaźników, nie tylko oscylatorów i obliczanie wszystkiego gdzies tam w excelu bylo by po prostu mega niewygodne, dlatego pytam o stronkę, gdzie mogę dostać takie dane.
  • Odpowiedz
@Roballo: Szczerze współczuję. Ale moƶesz mu powiedzieć potem, ƶe zawodowi programiści uwaƶają jego pytania za kretyńskie. Jak komis to komis :D
  • Odpowiedz
Następny etap nauki wskaźników, zaraz po tablicach wskaźników, jest odwołanie wskaźników? Chodzi o to żeby wskaźnik wskazywał wskaźnik. Wytłumaczy mi ktoś jakim cudem to działa,

int main()
{
char tab[10],**wdw,*w; // działający przykład
w=&tab
wdw=&w

gets(*wdw);
printf(tab);
return 0;
}
A jak bym chciał użyć za pomocą jednego wskaźnika to już nie działa?

int main()
{
char tab[10] , *w; // Ten niedziałający
w=&tab

gets(*w);
printf(tab);
return 0;
}
#naukaprogramowania #jezykc #
@Hertesus: możesz zrobić gets(tab); nie do końca rozumiem problem. Może poćwicz wskaźniki np. na intach, bez tablic? Tablice w C są... dziwne, bo są bardzo blisko wskaźników, ale łatwo się poplątać.

BTW: char* w = &tab wygląda kiepsko -- tu chyba jest niezgodność typów. Być może zależy od standardu C - dawno nie pisałem w tym języku. Wg. mnie w = tab, lub w = &tab[0] wyglądają lepiej. Co nie znaczy,
  • Odpowiedz
Ciąg dalszy nauki wskaźników, Otóż przypisałem wskaźnikom zmienne czy jak to tam się nazywa,
Ale do rzeczy, jak już odpaliłem ten program, to on mi zwrócił takie coś
0xb757ee55,(nil),0xbeee3a50, O ile się orintuję to 1 i 3 to są adresy zmiennych w pamięci zapisane w systemie szesnastowym, Ale co to jest te (nil)? A drugie pytanie co w ogóle robi "%p"?

int main()
{
int *c,ch;
float *x,xh;
double *m,mh;

m=&mh
x=&xh
@Hertesus: Nie pomyl się przy definiowaniu zmiennych, bo czuję że ten zapis mógł Cię zmylić.
int *c,ch; - ta linia nie deklaruje wskaźnika c i integera ch, tylko dwa wskaźniki. Gwiazdka jakby "należy" do typu zmiennej a nie jej nazwy. Dlatego ja preferuję zapisywać to tak, wtedy jest wszystko jasne.
int* c, ch;

W tym programie deklarujesz więc 6 pustych wskaźników na int. I teraz tak:
* to operator wyłuskania, więc
  • Odpowiedz
@Hertesus: to zależy co chcesz osiągnąć.
Jeśli chodzi o funkcję printf oraz %p, no to wypisuje to wartość zmiennej w postaci przeznaczonej dla adresów zmiennych.
Jeśli sobie zadeklarowałeś 3 zmienne: ch, xh, mh i następnie przypisałeś ich adresy (za pomocą operatora uzyskania adresu &) do wskaźników c, x, m i:
- chcesz wyświetlić ich wartości mając do dyspozycji tylko wskaźniki:
to źle wpisujesz do funkcji printf, ponieważ zamiast %p powinno być
  • Odpowiedz
@Hertesus: Polecam poczytać książkę Stephena Praty o C, tam są dobrze opisane wskaźniki. I uważaj ze wskaźnikami. Łatwo sobie oko takim wskaźnikiem wybić.
  • Odpowiedz
Cześć miraski, robię coś podobnego tanków na zaliczenie i mam problem z prawdopodobnie wyciekiem pamięci. Siedzę na tym już od kilku dni i nadal nie wiem co robię nie tak. Prawdopodobnie coś się #!$%@? przy usuwaniu Tanka. Dołączam kod.:

*Metoda w game wyglada tak metoda w game

*Metoda checkShoot wyglada tak: metoda w klasie collision

*Destruktor EnemyTanka jest pusty, bo dziedziczy po klasie Tank, ale destruktor Tanka wyglada tak(posiada od wektory wskaznikow
Destruktor EnemyTanka jest pusty, bo dziedziczy po klasie Tank


@lmrocks: destruktor EnemyTanka powinien być wirtualny (nie wiem czy jest).

enemies[i] = NULL;

delete enemies[i];

i znowu to samo.
  • Odpowiedz
@lmrocks: Nie jedyne, wyzej masz ze dwie podpowiedzi co mozna robic. Ale jest to jedyne, ktore wprowadzi lad w twoj kod. Gdy przestaniesz uzywac golych wskaznikow tam gdzie jest to niepotrzebne i sprytnych wskaznikow tam gdzie jednak musisz miec wskaznik, to wycieki znikna.
  • Odpowiedz
@Ajdont: Jeżeli oba wskaźniki wskazują na tę samą tablicę (lub jeden element za nią) to wynikiem odejmowania będzie ptrdiff_t. W przeciwnym wypadku to undefined behavior. Jego wielkość jest oczywiście implementation defined i zależy od wielkości pointera. W twoim przypadku ma on zapewne taki sam rozmiar co int, więc nie jest generowane żadne ostrzeżenie.
  • Odpowiedz