Вт июн 13, 2017 21:06:43
Видимо, понял задумку программиста и сам разделил по блокам из 5-ти байтWiseLord писал(а):Кстати, странно, что на саму инициализацию массива не ругается.
Вт июн 13, 2017 22:04:42
const unsigned char *ptr;
void lcd_out (unsigned char row, unsigned char col, unsigned char *text)
{
ptr = lcd_font;
......
}
WiseLord писал(а):Массив-то двумерный, а указатель - на одномерный.
Кстати, странно, что на саму инициализацию массива не ругается.
Вт июн 13, 2017 22:14:04
Zhuk72 писал(а):Массив тоже unsigned char, как и указатель, но тем не менее компилятор ругается: a value of type "const unsigned char (*)[5]" cannot be assigned to an entity of type "unsigned char *"
ptr = lcd_font[0];
ptr = &lcd_font[0][0];
ptr = lcd_font[ch];
for (i = 0; i < 5 ; i++)
{
lcd_send(*(ptr + i), DTA); // или lcd_send(ptr[i]), DTA);
}
for (i = 0; i < 5 ; i++)
{
ptr = &lcd_font[ch][i];
lcd_send(*ptr,DTA);
}
lcd_send(lcd_font[ch][i],DTA);
Вт июн 13, 2017 22:26:11
Пн июн 19, 2017 19:43:56
int var = 0x12345678;
char *ptr = (char*)&var; // указатель будет указывать только на 1 байт переменной var
byte3 = *ptr++; // чтение переменной по указателю и последующий инкремент указателя, передвигая его на следующий байт
byte2 = *ptr++;
byte1 = *ptr++;
byte0 = *ptr;
void *pv = (void*)0; // "нулевой" указатель на void
int a = 0x12345, x;
char b = 'A', y;
pv = &a; // получает адрес переменной любого типа
x = *((int*)pv); // чтение по указателю с приведением указателя к типу читаемой переменной. x = 0x12345
pv = &b;
y = *((char*)pv); // y = 'A'
/* можно пойти еще дальше и объявить указатель непосредственно на char, который будет выражаться через указатель на void с приведением типа */
char *pc;
pc = (char*)pv;
/* и теперь использовать уже его */
char symb;
symb = *pc; // фактически, symb = b непосредственно
*pc = 'B'; // фактически, b = 'B' непосредственно
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
char a;
int x, y;
x = 2;
y = 1;
a = array[y][x];
a = array[y+1][x-2];
char *ptr = &array[0][0]; // создается указатель на элементы массива и ему сразу присваивается адрес начала массива
ptr += 8; // смещение указателя на 8 позиций от начала массива
a = *ptr; // получение элемента 8-го массива
ptr++; // указатель перемещается на следующий элемент массива
a = *ptr; // получение следующего элемента массива
ptr -= 3; // указатель перемещается на 3 позиции назад от текущей
a = *ptr;
a = *ptr++; // получение текущего элемента с последующим смещением указателя на след.элемент
ptr += (1 * 5); // перемещение указателя на следующую строку ниже. 1 - число строк вниз, 5 - ширина массива (X)
a = *ptr; // получение элемента строкой ниже (12-й)
Пн июн 19, 2017 20:56:27
Вт июн 20, 2017 07:17:51
void lcd_out (unsigned char *text) // параметр функции в виде указателя
{
unsigned char ch; // переменная, в которую будет читаться то, что принято по указателю
ch = *text; // собственно, это и есть чтение в переменную по принятому указателю
}
void main(void)
{
unsigned char symbol = 'A'; // переменная с одиночным символом
unsigned char message[] = "whattafaka"; // массив переменных в виде строки, инициализированной последовательностю символов
lcd_out(&symbol); // вызов функции и передача в нее параметра в виде адреса одиночной переменной
lcd_out(message); // вызов функции и передача в нее параметра в виде адреса массива символов.
// Без знака &, поскольку имя одномерного массива - это и есть его адрес,
//адрес первого его элемента
}
void lcd_out (const char *text)
{
char ch;
ch = *text;
}
/---
void main(void)
{
lcd_out("Whattafaka"); // строка символов в качестве параметра
}
Вт июн 20, 2017 07:24:21
Вт июн 20, 2017 10:14:55
void lcd_out (unsigned char row, unsigned char col, unsigned char *text)
{
unsigned char ch, i;
lcd_setxy(row,col*6);
while (*text)
{
ch = *text;
if ((ch >= 32) && (ch <= '~')) ch -= 32;
else if ((ch >= 192) && (ch <= 255)) ch -= 97; // 'А' <= ch <= 'я'
else ch = 255;
for (i = 0; i < 5 ; i++)
{
lcd_send(*(lcd_font[0]+ch * 5 + i),DTA);
}
lcd_send(0,DTA); // Additional space
text++;
}
}
const unsigned char lcd_font[159][5] =
{
0x00, 0x00, 0x00, 0x00, 0x00, // sp - 0
0x00, 0x00, 0x2f, 0x00, 0x00, // ! - 1
0x00, 0x07, 0x00, 0x07, 0x00, // " - 2
.......................................................
}
lcd_out(1,3,"test");
Вт июн 20, 2017 10:42:43
Вт июн 20, 2017 10:57:32
Вт июн 20, 2017 11:12:08
Вт июн 20, 2017 11:19:39
Вт июн 20, 2017 11:41:51
Вт июн 20, 2017 13:48:53
Вт июн 20, 2017 13:55:17
что вы хотели этим сказать? например, как sizeof поможет мне разобраться, на сколько изменится значение указателя по записи *ptr++? sizeof тут не липнет - только просмотр исходника до места описания указателя, чтобы вспомнить, что он long int *ptr и поэтому увеличится на 4.arkhnchul писал(а):sizeof?
Вт июн 20, 2017 14:05:05
что вы хотели этим сказать?arkhnchul писал(а):sizeof?
Вт июн 20, 2017 14:09:38
Вт июн 20, 2017 14:12:16
Вт июн 20, 2017 22:12:38
lcd_out(1,3,"test");
#define LINE_LENGTH (16+1) // длина строки, плюс символ конца строки
char txtbuf[LINE_LENGTH * 2] = {0}; // текстовый буфер длиной в 2 строки по (16+1) элементов
int length; // длина строки
int voltage = 0, current = 0; // переменные для значений напряжения и тока
voltage = 7;
current = 210;
length = sprintf(txtbuf, "Voltage: %2i V", voltage); // первая строка (возвращается число скопированных символов)
length = sprintf(txtbuf + LINE_LENGTH, "Current: %4i mA", current); // вторая строка
/* либо немного иначе, но функция вывода должна распознавать символ переноса строки \n */
length = sprintf(txtbuf, "Voltage: %2i V\nCurrent: %4i mA", voltage, current);
write_to_LCD(txtbuf, LINE_LENGTH * 2 ); // выводятся в дисплей две строки сразу
int write_to_LCD(char *buf, int lehgth)
{
/* это заглушка функции */
}
sprintf(txtbuf + 5, "%i", voltage); // вывод только значения переменной в опред.позиции
sprintf(txtbuf + LINE_LENGTH + 3, "Hello world"); // вывод текста в определенной позиции
strcpy(txtbuf, " "); // затирается строка
const char message[] = {"Main messaga"}; // есть некий массив, инициализованный как строка
strcpy(txtbuf+1, message); // копируем ее в текстовый буфер для вывода
strcpy(txtbuf + LINE_LENGTH, "Waka-Waka-shet"); // или пишем напрямую на второй строчке