Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/20: Рейтинг темы: голосов - 20, средняя оценка - 4.70
Miymfromi
0 / 0 / 0
Регистрация: 15.09.2012
Сообщений: 159
1

Обращение к элементам двумерного массива через указатели

18.05.2014, 11:18. Просмотров 3757. Ответов 6
Метки нет (Все метки)

Собсно, гуглил, вроде всё просто, но что-то плохо воспринимается.

Код
Имеется 2d массив.
data1[0] =  number1 [value % 10][0];
data1[1] =  number1 [value % 10][1];
Но так не работает ../measure_durationAVR.c:73:42: error: subssripted value is neither array nor pointer

Хотя раньше с одномерным было так
Код
data1[0] =  number1 [value % 10];
data1[1] =  number1 [value / 10];
И всё прекрасно работало.

Пример с интернетаМногомерные массивы
Язык С допускает использование многомерных массивов, то есть массивов, элементами которых являются массивы. Примеры объявления таких массивов:
int a2[10][2]; //Двухмерный массив 10x2
int аЗ[3] [2] [5]; //Трехмерный массив 3x2x5
Фактически, все элементы многомерного массива хранятся в памяти последо*вательно, поэтому представленные ниже примеры инициализации аналогичны:
int а[2][3] = { {1, 2, 3},
{4, 5, 6} };
и
int а[2] [3] = { 1, 2, 3, 4, 5, 6 } ;
Для доступа к элементам многомерного массива используются индексы по каждой из размерностей или операции разыменования указателя. Например, что*бы извлечь в некоторую переменную n цифру 4 из представленного выше массива а, можно воспользоваться одним из двух вариантов:
n = а[1][0]; //Извлекаем элемент из "строки" 1 (вторая), //"столбца" 0 (первый), то есть - цифру 4
n = *(а+3); //а- указатель на первый элемент массива, //следовательно а + 3 - указатель на 4-й элемент.
Разжуйте если не трудно.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2014, 11:18
Ответы с готовыми решениями:

Обращение к регистрам через адреса (ASM, AVR Studio)
Здравствуйте, есть такой вопрос: к примеру у меня в SRAM хранятся реальные...

Обращение к элементам массива через указатели
Хочу разобраться,как обращаться к элементам двумерного массива через указатели....

Обращение к элементам динамического массива через указатели
Само задание написано внизу в коментарии! Заранее спасибо! #include...

Обращение к элементам динамического двумерного массива
Есть файл, записанный с помощью _write значениями типа float, пытаюсь забирать...

Доступ к элементам массива через указатели
Пишу программу для сортировки массива указателей // сортировка объектов...

6
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
18.05.2014, 11:25 2
Сам массив у вас как описан? Как
Код
char number1[10][2]
?

Но вообще двумерные масивы в Си, считайте, не существуют. Одна из самых корявых частей языка, проще не пользоваться вообще.
0
Miymfromi
0 / 0 / 0
Регистрация: 15.09.2012
Сообщений: 159
18.05.2014, 11:32 3
uint8_t number1[] = {0b1111110,0b00000001,0b1000010,0b00000001,0b1110111,0b00000000,0b1100111,
0b00000001,0b1001011,0b00000001,0b1101101,0b00000001,0b1111101,0b00000001,0b1000110,0b00000001,
0b1111111,0b00000001,0b1101111};//Массив для вывода на 7-сегметный индиктор символов(десятков)
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
18.05.2014, 11:39 4
Что-то у вас корявая какая-то реализация...

*.h

Код
//========================================================================
#ifndef SEVEN_SEGM_LED_IND_H

#define SEVEN_SEGM_LED_IND_H

#include "sivim_segm_tid_ind.h"
//========================================================================

//========================================================================
#include <ioavr.h>

#include "avrlibtypes.h"
//========================================================================

//========================================================================
#define ANODS_PORT         PORTA
#define ANODS_PIN          PINA
#define ANODS_DDR          DDRA

//#define ANODS_2_PORT       PORTA
//#define ANODS_2_PIN        PINA
//#define ANODS_2_DDR        DDRA

#define KATODS_PORT        PORTC
#define KATODS_PIN         PINC
#define KATODS_DDR         DDRC
//========================================================================

//========================================================================
#define ANOD_HANDRED_1     1<<3
#define ANOD_TEN_1         1<<4
#define ANOD_ONE_1         1<<5

#define ANOD_TEN_2         1<<4
#define ANOD_ONE_2         1<<5
//------------------------------------------------------------------------
#define A                  1<<6
#define B                  1<<7 //     A
#define C                  1<<3 //   F   B
#define D                  1<<2 //     G
#define E                  1<<1 //   E   C
#define F                  1<<5 //     D
#define G                  1<<4
#define H                  1<<0
//------------------------------------------------------------------------
#define ZERO               (A | B | C | D | E | F)
#define ONE                (B | C)
#define TWO                (A | B | D | E | G)
#define THREE              (A | B | C | D | G)
#define FOUR               (B | C | F | G)
#define FIVE               (A | C | D | F | G)
#define SIX                (A | C | D | E | F | G)
#define SEVEN              (A | B | C)
#define EIGHT              (A | B | C | D | E | F | G)
#define NINE               (A | B | C | D | F | G)
//========================================================================

//========================================================================
#define MAX_LED_INDS       4

#define ANODS_MASK         (ANOD_HANDRED_1 | ANOD_TEN_1 | ANOD_ONE_1 | ANOD_TEN_2 | ANOD_ONE_2)
#define KATODS_MASK        (A | B | C | D | E | F | G)
//========================================================================

//========================================================================
extern u08 dsp_buf [];

void clr_dsp_buf (void);
//========================================================================

//========================================================================
typedef struct index_omods
{
u08 i;
u08 omod;
} index_omods;
//========================================================================

//========================================================================
void proc_7_segm_ind (void);
//========================================================================

//========================================================================
#endif
//========================================================================
*.c

Код
//========================================================================
#include "sivim_segm_tid_ind.h"
//========================================================================

//========================================================================
struct index_omods __flash tab_index_omods [] =
{
{0x01,   ANOD_HANDRED_1},
{0x02,   ANOD_TEN_1},
{0x03,   ANOD_ONE_1},
{0x04,   ANOD_TEN_2},
{0x00,   ANOD_ONE_2},
};

u08 __flash table_7_segm_char [10] =
{
ZERO,    ONE,
TWO,     THREE,
FOUR,    FIVE,
SIX,     SEVEN,
EIGHT,   NINE,
};
//========================================================================

//========================================================================
u08 dsp_buf [MAX_LED_INDS];
//------------------------------------------------------------------------
// I?enoea aooa?a oimieay.

u08 dsp_buf [MAX_LED_INDS];

void clr_dsp_buf (void)
{
u08 i;

for (i=0; i<MAX_LED_INDS; i++)
dsp_buf[i] = 0x00;
}
//========================================================================

//========================================================================
void proc_7_segm_ind (void)
{
static u08 CNT_7_SEGM_IND;

u08 cnt = CNT_7_SEGM_IND;

//   volatile u08 omods;
//   volatile u08 katods;

u08 omods;
u08 katods;

ANODS_PORT = 0;
KATODS_DDR = 0;

CNT_7_SEGM_IND = tab_index_omods [cnt].i;
omods = tab_index_omods [cnt].omod;

katods = table_7_segm_char [dsp_buf [cnt]];

ANODS_PORT = omods;
KATODS_DDR = katods;
}
//========================================================================
0
Miymfromi
0 / 0 / 0
Регистрация: 15.09.2012
Сообщений: 159
18.05.2014, 11:45 5
Цитата Сообщение от dymyurk1978
Что-то у вас корявая какая-то реализация...

*.h
Код
//========================================================================
#ifndef SEVEN_SEGM_LED_IND_H

#define SEVEN_SEGM_LED_IND_H

#include "sivim_segm_tid_ind.h"
//========================================================================

//========================================================================
#include <ioavr.h>

#include "avrlibtypes.h"
//========================================================================

//========================================================================
#define ANODS_PORT         PORTA
#define ANODS_PIN          PINA
#define ANODS_DDR          DDRA

//#define ANODS_2_PORT       PORTA
//#define ANODS_2_PIN        PINA
//#define ANODS_2_DDR        DDRA

#define KATODS_PORT        PORTC
#define KATODS_PIN         PINC
#define KATODS_DDR         DDRC
//========================================================================

//========================================================================
#define ANOD_HANDRED_1     1<<3
#define ANOD_TEN_1         1<<4
#define ANOD_ONE_1         1<<5

#define ANOD_TEN_2         1<<4
#define ANOD_ONE_2         1<<5
//------------------------------------------------------------------------
#define A                  1<<6
#define B                  1<<7 //     A
#define C                  1<<3 //   F   B
#define D                  1<<2 //     G
#define E                  1<<1 //   E   C
#define F                  1<<5 //     D
#define G                  1<<4
#define H                  1<<0
//------------------------------------------------------------------------
#define ZERO               (A | B | C | D | E | F)
#define ONE                (B | C)
#define TWO                (A | B | D | E | G)
#define THREE              (A | B | C | D | G)
#define FOUR               (B | C | F | G)
#define FIVE               (A | C | D | F | G)
#define SIX                (A | C | D | E | F | G)
#define SEVEN              (A | B | C)
#define EIGHT              (A | B | C | D | E | F | G)
#define NINE               (A | B | C | D | F | G)
//========================================================================

//========================================================================
#define MAX_LED_INDS       4

#define ANODS_MASK         (ANOD_HANDRED_1 | ANOD_TEN_1 | ANOD_ONE_1 | ANOD_TEN_2 | ANOD_ONE_2)
#define KATODS_MASK        (A | B | C | D | E | F | G)
//========================================================================

//========================================================================
extern u08 dsp_buf [];

void clr_dsp_buf (void);
//========================================================================

//========================================================================
typedef struct index_omods
{
u08 i;
u08 omod;
} index_omods;
//========================================================================

//========================================================================
void proc_7_segm_ind (void);
//========================================================================

//========================================================================
#endif
//========================================================================
*.c

Код
//========================================================================
#include "sivim_segm_tid_ind.h"
//========================================================================

//========================================================================
struct index_omods __flash tab_index_omods [] =
{
{0x01,   ANOD_HANDRED_1},
{0x02,   ANOD_TEN_1},
{0x03,   ANOD_ONE_1},
{0x04,   ANOD_TEN_2},
{0x00,   ANOD_ONE_2},
};

u08 __flash table_7_segm_char [10] =
{
ZERO,    ONE,
TWO,     THREE,
FOUR,    FIVE,
SIX,     SEVEN,
EIGHT,   NINE,
};
//========================================================================

//========================================================================
u08 dsp_buf [MAX_LED_INDS];
//------------------------------------------------------------------------
// I?enoea aooa?a oimieay.

u08 dsp_buf [MAX_LED_INDS];

void clr_dsp_buf (void)
{
u08 i;

for (i=0; i<MAX_LED_INDS; i++)
dsp_buf[i] = 0x00;
}
//========================================================================

//========================================================================
void proc_7_segm_ind (void)
{
static u08 CNT_7_SEGM_IND;

u08 cnt = CNT_7_SEGM_IND;

//   volatile u08 omods;
//   volatile u08 katods;

u08 omods;
u08 katods;

ANODS_PORT = 0;
KATODS_DDR = 0;

CNT_7_SEGM_IND = tab_index_omods [cnt].i;
omods = tab_index_omods [cnt].omod;

katods = table_7_segm_char [dsp_buf [cnt]];

ANODS_PORT = omods;
KATODS_DDR = katods;
}
//========================================================================
Просто двухсимвольный семисегментный индикатор разведён на два порта...десятки(С и Д), а единицы только ПортД. Вот откуда двумерный массив.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
18.05.2014, 11:54 6
Если вы посмотрите на мой пример, то увидите, что у меня нет привязанности к пинам. По поводу разных портов (просто мне это не требовалось), тогда делать по маскам. Так что не городите сложностей.
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
18.05.2014, 11:58 7
Надо uint8_t number1[10][2] или uint8_t number1[][2], иначе компилятор не поймёт, что массив двумерный (ему надо как минимум знать все размеры массива, кроме первого, иначе он не сможет найти адрес нужного элемента).
Ну и инициализация у вас что-то странная - почему 19 чисел, а не 20?

Кстати, в вашем случае я бы наоборот индексы расположил: uint8_t number1[2][10] - чтобы данные для каждого знакоместа шли подряд. Но это так, привычка.
0
18.05.2014, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2014, 11:58

Найти минимальный элемент массива (через указатели, запрещено обращаться к элементам массива по индексам)
Написать программу, создающую массив из 10 случайных целых чисел из ...

Обращение к элементам массива через биты некоторого числа
Пусть есть массив Mass из 10 элементов и число А = 510 = 0...0 01012. Мне надо...

Обращение к элементам линейного списка через элементы массива указателей
Вот полная версия программы. Компилятор не выдаёт ошибок, но при выполнении,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru