#include <stdio.h>
struct dblarr {
double *data;
size_t len;
struct dblarr *next;
};
double *fetch(const struct dblarr *arr, size_t index) {
if (arr == NULL) return NULL;
if (index < arr->len) return arr->data + index;
return fetch(arr->next, index - arr->len);
}
int main(void) {
double a1[2] = {1, 2};
double a2[3] = {1, 2, 3};
double a3[1] = {1};
struct dblarr x1, x2, x3;
x1.data = a1; x1.len = sizeof a1 / sizeof *a1; x1.next = &x2;
x2.data = a2; x2.len = sizeof a2 / sizeof *a2; x2.next = &x3;
x3.data = a3; x3.len = sizeof a3 / sizeof *a3; x3.next = NULL;
printf("before %f\n", *fetch
(&x1
, 5)); *fetch(&x1, 5) = 0.42;
printf(" after %f\n", *fetch
(&x1
, 5));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdHJ1Y3QgZGJsYXJyIHsKICAgIGRvdWJsZSAqZGF0YTsKICAgIHNpemVfdCBsZW47CiAgICBzdHJ1Y3QgZGJsYXJyICpuZXh0Owp9OwoKZG91YmxlICpmZXRjaChjb25zdCBzdHJ1Y3QgZGJsYXJyICphcnIsIHNpemVfdCBpbmRleCkgewogICAgaWYgKGFyciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgIGlmIChpbmRleCA8IGFyci0+bGVuKSByZXR1cm4gYXJyLT5kYXRhICsgaW5kZXg7CiAgICByZXR1cm4gZmV0Y2goYXJyLT5uZXh0LCBpbmRleCAtIGFyci0+bGVuKTsKfQoKaW50IG1haW4odm9pZCkgewogICAgZG91YmxlIGExWzJdID0gezEsIDJ9OwogICAgZG91YmxlIGEyWzNdID0gezEsIDIsIDN9OwogICAgZG91YmxlIGEzWzFdID0gezF9OwogICAgc3RydWN0IGRibGFyciB4MSwgeDIsIHgzOwoKICAgIHgxLmRhdGEgPSBhMTsgeDEubGVuID0gc2l6ZW9mIGExIC8gc2l6ZW9mICphMTsgeDEubmV4dCA9ICZ4MjsKICAgIHgyLmRhdGEgPSBhMjsgeDIubGVuID0gc2l6ZW9mIGEyIC8gc2l6ZW9mICphMjsgeDIubmV4dCA9ICZ4MzsKICAgIHgzLmRhdGEgPSBhMzsgeDMubGVuID0gc2l6ZW9mIGEzIC8gc2l6ZW9mICphMzsgeDMubmV4dCA9IE5VTEw7CgogICAgcHJpbnRmKCJiZWZvcmUgJWZcbiIsICpmZXRjaCgmeDEsIDUpKTsKICAgICpmZXRjaCgmeDEsIDUpID0gMC40MjsKICAgIHByaW50ZigiIGFmdGVyICVmXG4iLCAqZmV0Y2goJngxLCA1KSk7CgogICAgcmV0dXJuIDA7Cn0=