C++ if i zmienne po przecinku

0

Witam wszystkich,

Czy ktoś spotkał się kiedyś z taką formą wyrażenia w funkcji if?
Wie może ktoś jak to dokładnie działa?

Przykład:

struct creature
{
	int x;
	int y;
	int z;
};

struct player
{
	int id;
	creature vbase;
};

int main()
{

	int x = 32;
	int y = 33;
	int z = 7;

	int cx = 31;
	int cy = 32;
	int cz = 7;

	creature player;

	player.x = x;
	player.y = y;
	player.z = z;


	**if ((player, cx, cy, cz + 1, 1, 1))** //-> chodzi mi o ten zapis.
	{
		return true;
	}
}
2

Nie zabrakło ci nazwy funkcji przed nawiasem? Pokaż oryginał.

2

W C++ występuje tzw. comma operator, który po kolei ewaluuje każde z wyrażeń i zwraca rezultat tego ostatniego:

int foo = 1;
int bar = 2;
int zar = 3;

cout << (foo, bar, zar); // wyświetli `3`

Przy czym obstawiam to samo co @szweszwe - IMO brakuje tam wywołania funkcji, ponieważ przytoczony przez Ciebie kod nie ma w aktualnej postaci żadnego sensu.

0

A jesli tam byla funkcja to co jesli wyewaluuje sie do false :D

0

Właśnie nie ma odwołanie funkcji, dokładnie jest tak:


struct  TCreature 
{
	int(**_vptr_TCreature)(...);
	int posx;
	int posy;
	int posz;
};

struct TPlayer : TCreature
{
	unsigned int AccountID;
};

int main()
{
	int x = 32;
	int y = 33;
	int z = 7;
	int cx = 31;
	int cy = 32;
	int cz = 7;


	TPlayer* p;
	p->AccountID = 33;
	p->posx = x;
	p->posy = y;
	p->posz = z;


	if( (*(p->_vptr_TCreature + 3))(p, cx, cy, cz+1, 1, 0) )
	{
		return true;
	}
}

0

To jest funkcja

Player dziedziczy po creature a tamten ma pole ze wskaznikiem na funkcje ;)

Inna sprawa ze to chyba nie dziala

TPlayer* p;
p->AccountID = 33;
0

Tak w powinno być TPlayer* p = new TPlayer();, druga sprawa że nie mogę nawet go odpalić bo int(_vptr_TCreature)(...); krzyczy o na ruszczenie pamięci. więc nie rozumiem trochę tego odwołania "int(_vptr_TCreature)(...);" i jak z to działa.

Mam metodę do której przekazuje TCreature + x,y,z;

void TCreature::Go(TCreature *const player, int x, int y, int z)
{
	int v30;

	v30 = 0;
	
	if ( (*(player->_vptr.TCreature + 3))(player, x, y, z, 1, 0) )
		goto LABEL_20;
		
LABEL_20:
   v30 = -1;	

   return Move(player, -1, 0,v30);
}
0
int(**_vptr_TCreature)(...);

W tym polu musi byc zaalokowana tablica wskaznikow na funkcje
Generalnie nie jestem za dobry w C ale wyglada mi to na raka...

https://stackoverflow.com/a/5488718

Ja bym tu lambdy wrzucil jakbym juz musial czy cos

0

Dzięki za pomoc, już bynajmniej mam jakąś wskazówkę do dalszych poszukiwań

1

Update:

goto LABEL_20;

Kto to Panu tak sp..apral :D

0

To kod ślinika gry, z roku 2002 na bazie języka C, a raczej jego zdekompilowana wersja, bo source nie zostały udostępnione a jedynie jego plik wykonywalny ELF. i aby zrozumieć jak działają pewne elementy wtłaczam się w całe rozwiązanie czysto naukowo

1

Rok 2002 niczego nie tłumaczy.
Nadal można spotkać takich co napiszą takie cudo bo się "znają" na rzeczy i trzeba się ze światem podzielić.
Moja rada jest taka: nie wszystko złoto co się świeci. W internecie jest większość kodu jest pokracznie napisana. Na czymś takim po prostu nie należy się wzorować. przyznaję jednak, że to jest przypadek szczególny.

0

Mialem na mysli dekompilacje. Z binarki i tak kodu zrodlowego nie wyciagniesz, mozesz tylko taki o podobnym dzialaniu wypluc ciekawskiemu użytkownikowi

2
   if ( (*(player->_vptr.TCreature + 3))(player, x, y, z, 1, 0) )
       goto LABEL_20;

LABEL_20:

Prawdziwy WTF polega na tym, że to goto jest bez sensu, skoro skacze do bezpośrednio następnej instrukcji.

0

Tutaj chodzi bardziej o zrozumienie procesu niź źródła, a co do goto podejżewam że to program dekompilujacy sobie tak to tłumaczył mapujac skoki z asm

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