C++ if i zmienne po przecinku

Odpowiedz Nowy wątek
2019-08-01 15:47

Rejestracja: 5 lat temu

Ostatnio: 11 miesięcy temu

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

Pozostało 580 znaków

2019-08-01 15:52

Rejestracja: 7 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Kraków

2

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

Pozostało 580 znaków

2019-08-01 15:55
Moderator

Rejestracja: 13 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Wrocław

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.


edytowany 1x, ostatnio: Patryk27, 2019-08-01 15:56
a ja przerażony usunąłem wpis :D - szweszwe 2019-08-01 15:58
dawej, przywróciłem :-P - Patryk27 2019-08-01 15:58

Pozostało 580 znaków

2019-08-01 16:05

Rejestracja: 3 lata temu

Ostatnio: 9 minut temu

0

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

Pozostało 580 znaków

2019-08-01 16:31

Rejestracja: 5 lat temu

Ostatnio: 11 miesięcy temu

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

Pozostało 580 znaków

2019-08-01 16:35

Rejestracja: 3 lata temu

Ostatnio: 9 minut temu

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;
edytowany 3x, ostatnio: stivens, 2019-08-01 16:37

Pozostało 580 znaków

2019-08-01 16:40

Rejestracja: 5 lat temu

Ostatnio: 11 miesięcy temu

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);
}
edytowany 2x, ostatnio: walle, 2019-08-01 16:54
A to caly kod jaki masz? - stivens 2019-08-01 16:46

Pozostało 580 znaków

2019-08-01 16:48

Rejestracja: 3 lata temu

Ostatnio: 9 minut temu

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

edytowany 3x, ostatnio: stivens, 2019-08-01 16:52

Pozostało 580 znaków

2019-08-01 16:56

Rejestracja: 5 lat temu

Ostatnio: 11 miesięcy temu

0

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

Skad ten kod jest? Czemu go analizujesz? - stivens 2019-08-01 16:59
język polski: bynajmniej != przynajmniej - vpiotr 2019-08-01 18:17

Pozostało 580 znaków

2019-08-01 16:56

Rejestracja: 3 lata temu

Ostatnio: 9 minut temu

1

Update:

goto LABEL_20;

Kto to Panu tak sp..apral :D

Pozostało 580 znaków

2019-08-01 17:05

Rejestracja: 5 lat temu

Ostatnio: 11 miesięcy temu

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

To by wiele tlumaczylo - stivens 2019-08-01 17:10

Pozostało 580 znaków

Odpowiedz

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

Robot: CCBot