Страница 1 из 1

Как инициализировать строку в макросах ?

СообщениеДобавлено: 27 июл 2021, 15:35
8bit
Weintek рекомендует присваивать начальные значения переменным при их объявлении.
Если с числами все понятно и можно даже не инициализировать (объявили переменную, а потом задали ей значение из регистра LW, например), то как инициализировать строку и что будет, если ее начать использовать сразу после объявления ?

Первый вариант, который приходит в голову - это присвоить пустую строку.

Код: Выделить всё

char text[20]=""



Однако, если вы сразу же выведите эту строку в ASCII объект, то увидите мусор (куски слов, различные символы и т.д.), а не пустую строку.
Это происходит потому, что макрос при объявлении массива символов просто резервирует соответствующий объем памяти под эту переменную, никак не очищая её содержимое.

Поэтому, если в коде макроса вы начнете копировать в эту переменную текст, который короче размера этого символьного массива, то пронаблюдаете скверный результат.
Код: Выделить всё
char myText[20] = ""
StringCat("abcd", myText[0])
SetData(myText[0], "Local HMI", LW, 500, 20)



В LW-500 мы увидим "abcd#&Wo,df%D_$#@1h+", где abcd наш текст и #&Wo,df%D_$#@1h+ мусор из оперативной памяти .

Один из вариантов инициализации массива символов можно подсмотреть в макросах демо-проектов самого Weintek.
Код: Выделить всё

    char array_name[array_size] = "                    " // количество пробелов равно размеру массива [array_size]



Но более лаконично и правильно инициализировать так:
Код: Выделить всё

    char array_name[array_size]
    FILL(array_name[0], 0x00, array_size) // функция записывает в массив символы с кодом 0х00 начиная с элемента [0] в количестве array_size