Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование двойного указателя
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Pasha 111
Всем привет! Пишу такой вот код:

Код
    uint8 array[] = {1, 2, 3, 4, 5, 6, 7};

    uint8 **a = (uint8 **)&array;
    uint8 aaa = a[0][5] // <-- Тут проц выбрасывает в Data Abort


Пробовал писать даже так:

Код
    uint8 array[] = {1, 2, 3, 4, 5, 6, 7};

    uint8 *qqq = array;
    uint8 **bbb = &qqq;
    uint8 *aaa = bbb[0];
    uint8 bbb = aaa[5]; // <-- Тут проц выбрасывает в Data Abort


Как воспользоваться двойным указателем? Что я делаю не так?
condor
Цитата(Pasha 111 @ Aug 10 2007, 17:10) *
Всем привет! Пишу такой вот код:

Код
    uint8 array[] = {1, 2, 3, 4, 5, 6, 7};
    uint8 **a = (uint8 **)&array;
    uint8 aaa = a[0][5] // <-- Тут проц выбрасывает в Data Abort

Вы присваиваете переменной а адрес масива array.
Потом проц берет первый указатель по адресу а (если формат little-endian, то это 0х04030201).
И прибавив к нему 5 пытается прочитать память по адресу 0х04030206.
Конечно это вызовет Data Abort.

Цитата(Pasha 111 @ Aug 10 2007, 17:10) *
Пробовал писать даже так:

Код
    uint8 array[] = {1, 2, 3, 4, 5, 6, 7};

    uint8 *qqq = array;
    uint8 **bbb = &qqq;
    uint8 *aaa = bbb[0];
    uint8 bbb = aaa[5]; // <-- Тут проц выбрасывает в Data Abort

Это работать будет, но зачем здесь двойной указатель?!
Интересно как оно могло скомпилиться? smile.gif Дважды объявлена bbb.

Цитата(Pasha 111 @ Aug 10 2007, 17:10) *
Как воспользоваться двойным указателем? Что я делаю не так?

Объясните для чего вы хотите его использовать?
Pasha 111
Цитата
Интересно как оно могло скомпилиться? Дважды объявлена bbb.

Прошу прощения, там в последней строчке конечно же не bbb, а, например, ggg smile.gif. Но этот код все равно НЕ работает! Там также возникает ошибка Data Abort sad.gif

Цитата
Объясните для чего вы хотите его использовать?

В программе реализуется модуль, который в зависимости от номера, который приходит от компа, должен посылать определённые данные, т.е. число, пришедшее от компа соответствует номеру массива данных. Соответственно и получается два указателя: один на массив, а второй на элементы внутри.

Можно было бы сделать переменные типа data1[] = {...}, data2[] = {...}, data3[] = {...}..... а потом написать что-то типа
switch(num){
case 1: send(data1); break;
case 2: send(data2); break;
case 3: send(data3); break;
}

Но, согласитесь, гораздо проще писать send(data[num]);

Тем более что этот модуль находится в отдельном .cpp файле, в нем реализован алгоритм сапоставления строк и чисел, а данные сами имеют разный смысл и называть их data1...3 совсем не логично.
condor
Цитата(Pasha 111 @ Aug 11 2007, 17:49) *
Прошу прощения, там в последней строчке конечно же не bbb, а, например, ggg smile.gif. Но этот код все равно НЕ работает! Там также возникает ошибка Data Abort sad.gif

Странно. У меня работаетsmile.gif Скопировал прямо из форума. Заменил bbb на ccc и uint8 на char.
Цитата(Pasha 111 @ Aug 11 2007, 17:49) *
В программе реализуется модуль, который в зависимости от номера, который приходит от компа, должен посылать определённые данные, т.е. число, пришедшее от компа соответствует номеру массива данных. Соответственно и получается два указателя: один на массив, а второй на элементы внутри.

Можно было бы сделать переменные типа data1[] = {...}, data2[] = {...}, data3[] = {...}..... а потом написать что-то типа
switch(num){
case 1: send(data1); break;
case 2: send(data2); break;
case 3: send(data3); break;
}

Но, согласитесь, гораздо проще писать send(data[num]);

Тем более что этот модуль находится в отдельном .cpp файле, в нем реализован алгоритм сапоставления строк и чисел, а данные сами имеют разный смысл и называть их data1...3 совсем не логично.

А как у Вас объявлены массывы данных?
Если размеры массивов не сильно отличаются, то просто объявите и заполните двумерный массив
а[][SIZE] = {{},{},{}};
Где SIZE - максимальный размер массива.
И вызывайте себе send(a[num]);

Если размеры отличаются, то ради экономии памяти можно объявить каждый отдельно
Код
char data1[] = {...};
char data2[] = {...};
char data3[] = {...};
char* a[] = {data1, data2, data3};
send(a[num]);
Pasha 111
Странно, в пустом проекте этот код действительно работает.... Наверное сам где-то намудрил 01.gif

Массивы имеют разную длину. В принципе, в программе только в одном месте приходится делать send(), поэтому, имхо, лучше написать

uint8 *Data[] = {data1, data2....};
.............
uint8 *Array = Data[Index];
send(Array);

Так-то, теоретически, должно работать? smile.gif
condor
Цитата(Pasha 111 @ Aug 11 2007, 22:03) *
Странно, в пустом проекте этот код действительно работает.... Наверное сам где-то намудрил 01.gif

Массивы имеют разную длину. В принципе, в программе только в одном месте приходится делать send(), поэтому, имхо, лучше написать

uint8 *Data[] = {data1, data2....};
.............
uint8 *Array = Data[Index];
send(Array);

Так-то, теоретически, должно работать? smile.gif


Да, только не обязательно создавать лишнюю переменную.
Можно ведь просто send(Data[Index]);
Pasha 111
Ура! Все заработало! \всем большое спасибо за помощь!

Видимо есть разница между
uint8 **a = &array;
и
uint8 *a[] = {array};
ибо втором случае компилятор понимают, что от него хотят, а в первом - взятие адреса и просто конвертирование типов данных.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.