И это не избавит от мусора, так как strcpy сделает первый элемент пробелом и во второй элемент занесет ноль - признак конца строки. Логичнее тогда уж присвоить 0, и именно 0, не "0". Это и будет пустая строка. А в этом случае не нужна strcpy. Но вообще, зная адрес массива и его размер, заполнить эту область чем-то можно кучей способов, например, memset. Наверное, надо конкретно по мк/компилятору смотреть, что будет оптимальней.
разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.
FreshMan писал(а):
так не работает компилятор avr-gcc ругается на несоответствие типов incompatible types in assignment
разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.
FreshMan писал(а):
так не работает компилятор avr-gcc ругается на несоответствие типов incompatible types in assignment
разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.
Можно самому обнулить заполнил весь массив нулями, при помощи того же memset.
как элегантней проинициализировать большой массив структур ?
Если пишете на плюсах и у полей всех объектов должны быть одни и те же значения, то самый элегантный и правильный способ - это инициализация полей в конструкторе. Если не плюсы, то пробегаемся по массиву и иним все поля необходимыми значениями. Где-нибудь вначале программы, перед использованием. Если нужно тупо обнулить всё, то уже выше сказали - memset.
Что касается Вашего кода. Какие-то странные у Вас поля. Особенно поля id и time - зачем они строковые ? Нелогично как-то ...
Если пишете на плюсах и у полей всех объектов должны быть одни и те же значения, то самый элегантный и правильный способ - это инициализация полей в конструкторе.
В таких простых случаях и конструктор не нужен, уже давно можно сами поля инитить.
Карма: 90
Рейтинг сообщений: 1443
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4613 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Reflector писал(а):
В таких простых случаях и конструктор не нужен, уже давно можно сами поля инитить.
В принципе, да. Сам я лично так и делаю. Более наглядно получается. Но, как-то однажды, на Киберфоруме меня отругали за такой подход Посоветовали присваивать значения полям в списке инициализации конструктора. Хотя, на мой взгляд, разницы нет никакой (если не иним константы/ссылки, или более сложные объекты)
как элегантней проинициализировать большой массив структур ? имеется массив структур каждая структура состоит из 3 полей перед записью данных я произвожу "обнуление", записывая пробелы, дабы там небыло мусора
Код:
typedef struct{ char id[4]; // номер гонщика char car[10]; // машина гонщика char time[4]; // финишное время } member_t;
member_t racer[30]; // гонщики
for (int i = 0; i < 29; ++i) { strcpy(racer[i].id, " "); strcpy(racer[i].car, " "); strcpy(racer[i].time, " "); }
поскольку поля всего 3 то сделать это легко а как быть если полей за сотню и более ?
Код:
memset(racer, 0, sizeof(racer));
Забъет нулем весь массив.
Если вместо 0 поставить 32, то забьет массив пробелами.
Там же не указано что все эти id,car,time - в формате ASCIIZ. А значит 0 в конце возможно и не нужен. А если массивы большие (много элементов), то выкидывание ненужных нулей позволяет хорошо экономить память. Я обычно так и делаю.
Тут, похоже, проблема не в хранении, а в доступе. Раз = "" не помогает, а = " " - да, то это намекает, что в дальнейшем проверка строк идет как-то не совсем так.
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 104 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Добрый день. В целом с библиотекой от Adafruit Industries разобрался - spi hardware. Далее намерен привести весь код к стандарту С++14. Наперво - дефайны. (их там как тараканов за баней) Т.е. заменить это: #define SSD1306_LCDWIDTH 128 #define SSD1306_LCDHEIGHT 64 #define sizeBuff (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH /8 ) ; на это, с безопасным приведением типов: static constexpr uint8_t SSD1306_LCDWIDTH = 128; static constexpr uint8_t SSD1306_LCDHEIGHT = 64; static constexpr uint8_t sizeBuff = static_cast<uint8_t>(SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH /8 ) ; Максимум вычислений на этапе компиляции и не тратить память по пустякам. (монстр изрядно покоцан и моя лапа у него на груди)
Добрый день. В целом с библиотекой от Adafruit Industries разобрался - spi hardware. Далее намерен привести весь код к стандарту С++14. Наперво - дефайны. (их там как тараканов за баней) Т.е. заменить это: #define SSD1306_LCDWIDTH 128 #define SSD1306_LCDHEIGHT 64 #define sizeBuff (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH /8 ) ; на это, с безопасным приведением типов: static constexpr uint8_t SSD1306_LCDWIDTH = 128; static constexpr uint8_t SSD1306_LCDHEIGHT = 64; static constexpr uint8_t sizeBuff = static_cast<uint8_t>(SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH /8 ) ; Максимум вычислений на этапе компиляции и не тратить память по пустякам. (монстр изрядно покоцан и моя лапа у него на груди)
А зачем? Выигрыша в скорости нет. Дефайны и так на этапе препроцессора выполняются.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения