|
|
  |
Использование двойного указателя, SAM7S64, IAR |
|
|
|
Aug 10 2007, 14:10
|

Частый гость
 
Группа: Свой
Сообщений: 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 Как воспользоваться двойным указателем? Что я делаю не так?
|
|
|
|
|
Aug 11 2007, 14:11
|

Частый гость
 
Группа: Свой
Сообщений: 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 Это работать будет, но зачем здесь двойной указатель?! Интересно как оно могло скомпилиться?  Дважды объявлена bbb. Цитата(Pasha 111 @ Aug 10 2007, 17:10)  Как воспользоваться двойным указателем? Что я делаю не так? Объясните для чего вы хотите его использовать?
|
|
|
|
|
Aug 11 2007, 14:49
|

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

|
Цитата Интересно как оно могло скомпилиться? Дважды объявлена bbb. Прошу прощения, там в последней строчке конечно же не bbb, а, например, ggg  . Но этот код все равно НЕ работает! Там также возникает ошибка Data Abort  Цитата Объясните для чего вы хотите его использовать? В программе реализуется модуль, который в зависимости от номера, который приходит от компа, должен посылать определённые данные, т.е. число, пришедшее от компа соответствует номеру массива данных. Соответственно и получается два указателя: один на массив, а второй на элементы внутри. Можно было бы сделать переменные типа 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 совсем не логично.
|
|
|
|
|
Aug 11 2007, 16:52
|

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

|
Цитата(Pasha 111 @ Aug 11 2007, 17:49)  Прошу прощения, там в последней строчке конечно же не bbb, а, например, ggg  . Но этот код все равно НЕ работает! Там также возникает ошибка Data Abort  Странно. У меня работает  Скопировал прямо из форума. Заменил 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]);
|
|
|
|
|
Aug 11 2007, 19:03
|

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

|
Странно, в пустом проекте этот код действительно работает.... Наверное сам где-то намудрил  Массивы имеют разную длину. В принципе, в программе только в одном месте приходится делать send(), поэтому, имхо, лучше написать uint8 *Data[] = {data1, data2....}; ............. uint8 *Array = Data[Index]; send(Array); Так-то, теоретически, должно работать?
|
|
|
|
|
Aug 11 2007, 20:15
|

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

|
Цитата(Pasha 111 @ Aug 11 2007, 22:03)  Странно, в пустом проекте этот код действительно работает.... Наверное сам где-то намудрил  Массивы имеют разную длину. В принципе, в программе только в одном месте приходится делать send(), поэтому, имхо, лучше написать uint8 *Data[] = {data1, data2....}; ............. uint8 *Array = Data[Index]; send(Array); Так-то, теоретически, должно работать?  Да, только не обязательно создавать лишнюю переменную. Можно ведь просто send(Data[Index]);
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|