Строковый тип и указатели
string - особый тип переменных в Tibbo BASIC/C. Не путайте его со стандартным строковым литералом.
В ANSI C строковые литералы используются для инициализации массивов, например unsigned char a[]="Hello World!" (кстати, в Tibbo C это не сработает!). В результате получается вовсе не строка, а массив, инициализированный содержимым строкового литерала. Структура в ОЗУ при этом завершается нулевым символом.
Переменные строкового типа в Tibbo BASIC и C хранят данные строки в особой двоичной структуре:
Длина (1 байт) | Ёмкость (1 байт) | Данные строки (до 255 байт) |
Поскольку в структуре есть поле длины, завершать данные нулевым символом не нужно, и строка может содержать любые значения байта от 0 до 255. А благодаря полю ёмкости код обработки строк в TiOS следит за тем, чтобы ни одна строковая операция не привела к переполнению. Поэтому строки Tibbo BASIC/C безопасны.
Работа со строками
Платформы устройств включают обширный список встроенных функций для работы со строками, таких как left(), instr(), asc(), chr() и других.
При обработке строк помните, что байты (символы) в строке нумеруются с 1. Позиции 0 нет, крайний левый символ - символ №1:
sub on_sys_init
dim s as string="Tibbo BASIC"
s=mid(s,7,255) 'The result will be "BASIC" (notice how "B" is character #7)
end sub
void on_sys_init(){
string s="Tibbo BASIC";
s=mid(s,7,255);
}
Неявные строковые операции
Компиляторы BASIC и C выполняют следующие неявные строковые операции:
- Конкатенация: s=s1+s2+"ABC"
- Сравнение: if s1=s2 then... / if(s1==s2){...
- Преобразование в 16-разрядное значение, эквивалентное явному вызову val():
dim s as string="23Z"
dim c as word=s 'The result in c will be "23"
string s="23Z";
word c=s; //The result in c will be "23"
- Преобразование знаковых и беззнаковых 8/16/32-разрядных и вещественных значений в строку, эквивалентное вызову str(), stri(), lstr(), lstri() или ftostr(). Компиляторы выбирают нужную системную функцию автоматически:
dim i as integer=-123
dim s as string=i 'Compiler will select stri()
unsigned long x=12345678;
string s=x; //Compiler will select lstr()
- В Tibbo BASIC - преобразование в массивы и структуры и обратно. В Tibbo C - преобразование в массивы, структуры и объединения и обратно. Это описано в разделе Преобразование в строки и из строк.
Задание ёмкости строки
Стандартная строка занимает 257 байт, а это много! Память можно сэкономить, задав ёмкость строки:
- Tibbo BASIC: dim s as string(10)
- Tibbo C: string <10>s
dim s as string(10)
string <10>s;
Указатели на строковые типы (только Tibbo C)
Как и для любого другого типа данных, можно создавать указатели на строки:
string s="ABC";
string *s_ptr=&ss;
unsigned char *c_ptr=s; //the pointer will be pointing at the first CHARACTER of the string, not the length field!
Можно создать указатель типа signed char или unsigned char и направить его на строку (без &!). Это показывает последняя строка в примере кода выше.
В результате указатель будет смотреть на первый символ строки ('A'), а не на поле длины!
В Tibbo C типы unsigned char и signed char считаются «носителями символов», поэтому это сработает и для unsigned char *c_ptr, и для signed char &c_ptr;
Эта строка, напротив, направит указатель на настоящее начало структуры строки в памяти (на поле длины):
unsigned char *c_ptr=(unsigned char *)&ss; //will be pointing at the length field