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ć