Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.107.161] |
|
Сообщ.
#1
,
|
|
|
Добрый день.
В теле функции ShowDigit нужно работать либо с массивом SegMapN1 либо SegMapN2 в зависимости от переданного параметра. Соответственно, чтобы не писать один и тот же код для всех массивов, нужно в зависимости от параметра получить указатель на требуемый массив и уже работать с указателем. Подскажите как правильно это реализовать, поскольку так как это сделал я не работает. Проект компилируется, но при обращении к массиву получается не те значения, что имеются на самом деле в массиве (поскольку условие SegMap[Num][0][i] > 0 ни разу не выполняется). Спасибо. unsigned char SegMapN1[10][2][8] = { // Первый массив { { 4, 3, 2, 3, 2, 1, 0, 0 }, { 1, 1, 1, 2, 2, 1, 0, 0 } }, // 0 { { 3, 2, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 0, 0, 0 } }, // 1 { { 4, 3, 4, 2, 3, 0, 0, 0 }, { 1, 1, 2, 2, 2, 0, 0, 0 } }, // 2 { { 4, 3, 2, 3, 4, 0, 0, 0 }, { 1, 1, 1, 2, 2, 0, 0, 0 } }, // 3 }; unsigned char SegMapN2[10][2][8] = { // Второй массив { { 1, 4, 3, 2, 0, 0, 0, 0 }, { 1, 2, 1, 1, 0, 0, 0, 0 } }, // 4 { { 4, 1, 4, 2, 3, 0, 0, 0 }, { 1, 1, 2, 1, 2, 0, 0, 0 } }, // 5 { { 4, 1, 2, 3, 2, 4, 0, 0 }, { 1, 1, 2, 2, 1, 2, 0, 0 } }, // 6 { { 4, 3, 2, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 0, 0 } }, // 7 { { 1, 4, 3, 4, 2, 3, 2, 0 }, { 1, 1, 1, 2, 2, 2, 1, 0 } }, // 8 { { 4, 1, 4, 3, 2, 3, 0, 0 }, { 2, 1, 1, 1, 1, 2, 0, 0 } } // 9 }; void ShowDigit(unsigned char Num, unsigned char Digit) { unsigned char i; unsigned char ***SegMap; // указатель на массив switch (Digit) //получение указателя в зависимости от параметра Digit { case 1: SegMap = (unsigned char ***)SegMapN1; break; case 2: SegMap = (unsigned char ***)SegMapN2; break; default: SegMap = (unsigned char ***)SegMapN1; break; } for(i = 0; i < 8; i++) // обработка массива через указатель { if (SegMap[Num][0][i] > 0) //пропускать нулевые элементы { PORTC = 1 << (SegMap[Num][0][i] - 1); PORTB = 1 << (SegMap[Num][1][i] - 1); _delay_ms(100); } } } |
Сообщ.
#2
,
|
|
|
Цитата freebits @ Проект компилируется, но при обращении к массиву получается не те значения, что имеются на самом деле в массиве Естественно компилируется - у тебя явное пребразование к неправильному типу (unsigned char ***). Здесь тебе лучше сделать unsigned char *p1; unsigned char *p2; case 1: p1 = SegMap1[Num][0]; p2 = SegMap1[Num][1]; break; |
Сообщ.
#3
,
|
|
|
Цитата Олег М @ Цитата freebits @ Проект компилируется, но при обращении к массиву получается не те значения, что имеются на самом деле в массиве Естественно компилируется - у тебя явное пребразование к неправильному типу (unsigned char ***). Здесь тебе лучше сделать unsigned char *p1; unsigned char *p2; case 1: p1 = SegMap1[Num][0]; p2 = SegMap1[Num][1]; break; Ура, спасибо! Так все работает) |
Сообщ.
#4
,
|
|
|
M freebits, спасибо, что отблагодарил форумчанина, который тебе помог - это правильно! Но, пожалуйста, не забывай пользовать функцию форума "вопрос решен". Будет ваще по фэн-шую. |