Co zostanie wyświetlone

0

Kod z kolokwium sprzed iluś tam semestrów:

#define PRa(f, x) printf(#x "=%" #f ";   ", (x));
#define NL printf("\n");
#define PRb(x, n, y)        \
    for (p = 0; p < n; p++) \
        printf(x, y[p]);    \
    NL
#include <stdio.h>

typedef struct sklep {
    int dane;
} zbior;

enum NCW { nic,
    cos,
    wiecej,
    duzo,
    moc };
int dodaj_czesc(zbior* wsk, int ile)
{
    static int k = cos;
    realloc(wsk, ++k * ile);
    return (k * ile);
}
int rekur(zbior* wsk, int n)
{
    static int k;
    printf("K2/Z%c; %d-wywol.; arg=>%3d; ", '1', ++k, n);
    printf("rozmiar = %d\n", dodaj_czesc(wsk, (n << 2) & 017));
    if (n <= -duzo)
        return n;
    else
        return (rekur(wsk, n - 8 >> cos) + (n << 1 + 1) | wiecej >> 1);
}

int sorp(int n, int* a)
{
    int i = n - 1, j, k, m, p, x, flag = 0;
    PRa(d, i);
    PRb("%3d ", n, a);
    while (i >= 0) {
        x = a[m = i];
        for (j = i - 1; j >= 0; j--)
            if (a[j] < x) {
                flag++;
                x = a[m = j];
            }
        a[m] = a[i];
        a[i] = x;
        if (flag && (i < 5 && i > 1)) {
            PRa(d, i);
            PRb("%3d ", n, a);
            flag = 0;
        }
        i--;
    }
    i++;
    PRa(d, i);
    PRb("%3d ", n, a);
}
int main(void)
{
    zbior* wsk = malloc(sizeof(zbior));
    int (*ptr)(int, int*), n = 4, a[] = { 33, 67, 45, 12, 56, 65, 41, 89, 25, 9, 73 };
    PRa(o, wiecej + n | 1 + cos);
    PRa(d, sizeof(a) ^ moc);
    NL ptr = sorp;
    PRa(x, (*ptr)(2 * n - 6 << wiecej, a + 2));
    {
        int n = 37 | 24, (*ptr)(zbior *, int);
        PRa(o, 2 + n >> 1 + 2);
        NL ptr = rekur;
        PRa(o, (*ptr)(wsk, n >> nic + 1));
        PRa(x, ~n);
        free(wsk);
    }
}

I co zostanie wyświetlone w linijce

    PRa(x, (*ptr)(2 * n - 6 << wiecej, a + 2));

Tzn. na początek się wyświetli to co jest w funkcji sorp, ale na koniec? Bo kompilator wyświetla a, czyli dyszkę decymalną - ale czemu? Jak dla mnie jeśli funkcja jest typu int, a nic nie zwraca, to jest to jakiś śmieć z pamięci, ale chciałbym się upewnić

1

Nie wiem, kto robi takie kolokwia...? :( Na jakim przedmiocie i w jakim celu? Czego chce nauczyć przez to?

1

@kalwi odpal to pod debugerem i zobacz co sie będzie działo. Generalnie to UB, ale konkretne implementacje coś tam wstawią. To jest kolokwium z jakiegoś reverse engineeringu? ;]

0

Kolokwium z przedmiotu PRM (programowanie), koniec pierwszego semestru, EITI PW.
Co chce osiągnąć i czego nauczyć - nie wiem :P

0
kalwi napisał(a):

I co zostanie wyświetlone w linijce

    PRa(x, (*ptr)(2 * n - 6 << wiecej, a + 2));

Po podstawieniu wartości dostaniesz takie coś.

printf("x = %x", sorp(2 * 4 - 6 << 3, 45 + 2)); 

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