2017-01-22 1 views
1

Я столкнулся с вышеуказанной проблемой. Имея int8_t массив:Ansi C int16_t ссылка на массив int8_t

int8_t i8array[3]; 
i8array[0] = 10; 
i8array[1] = 15; 
i8array[2] = 100; 

И я хочу, чтобы не только преобразовать, но и ссылаться на int16_t на i8array [1]. Так что я хочу новую переменную i16var, которая является int16_t со значением 15 < < 8 + 100 = 3940.

И если я изменю i16var в 3941, он должен изменить i8array в пункт № 2 от 100 до 101.

Есть ли у ansi C этот объект? Я пробовал много вещей, и даже здесь, я только что нашел ответы на перевод между этими типами.

+0

Во избежание недоразумений, i8array может иметь другие детали после # 2, который не интересен для i16var. – Daniel

+0

Вы говорите, что вы многое пробовали. Что вы пробовали? Добавьте это к своему вопросу. –

+4

То, что вы пытаетесь сделать, не выполнимо надежно. Кроме всего прочего, существуют машины, в которых '& i8array [1]' не будут правильно выровнены, чтобы обрабатываться как указатель 'int16_t'. Вы предполагаете, что в памяти имеется большой размер шрифта; возможно, это не так, как работает ваш процессор. Кроме того, вы хотите, чтобы две переменные ссылались на одни и те же местоположения; вы можете сделать это только с помощью «union» или с указателями. Вы можете попробовать использовать 'int16_t * i16p = (int16_t *) & i8array [1];', а затем читать с использованием 'int16_t i16 = * i16p;' и писать с помощью '* i16p = 3941;', но это может быть или не быть аварийно может или не может дать желаемый результат. –

ответ

1

Выравнивание и конец - ключевые вопросы. Нижеследующее должно обрабатывать проблему выравнивания, а может быть и endian. Удачи. Не рекомендуется применять кодирование.

int main(void) { 
    union { 
    struct { 
     int8_t dummy; 
     int8_t i8array[3]; 
    } view1; 
    struct { 
     int16_t dummy; 
     int16_t i16var; 
    } view2; 
    } u; 

    u.view1.i8array[0] = 10; 
    u.view1.i8array[1] = 15; 
    u.view1.i8array[2] = 100; 
    printf("%d\n", htons(u.view2.i16var)); 
    u.view2.i16var = htons(3941); 
    printf("%d\n", u.view1.i8array[2]); 
    return 0; 
} 

Выход

3940 
101 
Смежные вопросы