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

 
 
> Использование двойного указателя, 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
 
Start new topic
Ответов
Pasha 111
сообщение Aug 11 2007, 14:49
Сообщение #2


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

Группа: Свой
Сообщений: 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
Сообщение #3


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

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:14
Рейтинг@Mail.ru


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