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

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

18.05.2014, 11:18. Просмотров 4083. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2014, 11:18
Ответы с готовыми решениями:

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

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

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

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

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

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
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2014, 11:58

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

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

Передача двумерного массива через указатели
Подскажите пожалуйста как передать статический двумерный массив в функцию через указатели. Я начал...


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

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

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