реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Использование двойного указателя, SAM7S64, IAR
Pasha 111
сообщение Aug 10 2007, 14:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



Всем привет! Пишу такой вот код:

Код
    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


Как воспользоваться двойным указателем? Что я делаю не так?
Go to the top of the page
 
+Quote Post
condor
сообщение Aug 11 2007, 14:11
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 18-06-05
Из: Kyiv, Ukraine
Пользователь №: 6 126



Цитата(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) *
Как воспользоваться двойным указателем? Что я делаю не так?

Объясните для чего вы хотите его использовать?
Go to the top of the page
 
+Quote Post
Pasha 111
сообщение Aug 11 2007, 14:49
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



Цитата
Интересно как оно могло скомпилиться? Дважды объявлена 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 совсем не логично.
Go to the top of the page
 
+Quote Post
condor
сообщение Aug 11 2007, 16:52
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 18-06-05
Из: Kyiv, Ukraine
Пользователь №: 6 126



Цитата(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]);
Go to the top of the page
 
+Quote Post
Pasha 111
сообщение Aug 11 2007, 19:03
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



Странно, в пустом проекте этот код действительно работает.... Наверное сам где-то намудрил 01.gif

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

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

Так-то, теоретически, должно работать? smile.gif
Go to the top of the page
 
+Quote Post
condor
сообщение Aug 11 2007, 20:15
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 18-06-05
Из: Kyiv, Ukraine
Пользователь №: 6 126



Цитата(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]);
Go to the top of the page
 
+Quote Post
Pasha 111
сообщение Aug 11 2007, 21:18
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 6-11-05
Из: Москва
Пользователь №: 10 515



Ура! Все заработало! \всем большое спасибо за помощь!

Видимо есть разница между
uint8 **a = &array;
и
uint8 *a[] = {array};
ибо втором случае компилятор понимают, что от него хотят, а в первом - взятие адреса и просто конвертирование типов данных.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016