Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
И это не избавит от мусора, так как strcpy сделает первый элемент пробелом и во второй элемент занесет ноль - признак конца строки. Логичнее тогда уж присвоить 0, и именно 0, не "0". Это и будет пустая строка. А в этом случае не нужна strcpy.
Но вообще, зная адрес массива и его размер, заполнить эту область чем-то можно кучей способов, например, memset. Наверное, надо конкретно по мк/компилятору смотреть, что будет оптимальней.
Но вообще, зная адрес массива и его размер, заполнить эту область чем-то можно кучей способов, например, memset. Наверное, надо конкретно по мк/компилятору смотреть, что будет оптимальней.
- Реклама
Re: Вопросы по С/С++ (СИ)
[uquote="Reflector",url="/forum/viewtopic.php?p=4155707#p4155707"]Странное у тебя обнуление, строка содержащая один пробел - это типа аналог пустой строки?[/uquote]
да
Posted after 4 minutes 37 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4155711#p4155711"]Логичнее тогда уж присвоить 0, и именно 0, не "0". Это и будет пустая строка.[/uquote]
так не работает
компилятор avr-gcc ругается на несоответствие типов incompatible types in assignment
да
Posted after 4 minutes 37 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4155711#p4155711"]Логичнее тогда уж присвоить 0, и именно 0, не "0". Это и будет пустая строка.[/uquote]
так не работает
компилятор avr-gcc ругается на несоответствие типов incompatible types in assignment
Tell Me The Truth
Re: Вопросы по С/С++ (СИ)
Пустая строка - это "", содержит один завершающий ноль и в таком случае можно просто обнулить весь массив.
Re: Вопросы по С/С++ (СИ)
разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.
'\0'FreshMan писал(а):так не работает
компилятор avr-gcc ругается на несоответствие типов incompatible types in assignment
Re: Вопросы по С/С++ (СИ)
не совсем то
в таком случае выводится мусор из незаписанных ранее полей
помогает именно пробел
Posted after 3 minutes 15 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4155724#p4155724"]разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.
тоже самое, ругается на несоответствие типов
в таком случае выводится мусор из незаписанных ранее полей
помогает именно пробел
Posted after 3 minutes 15 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4155724#p4155724"]разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.
'\0'[/uquote]FreshMan писал(а):так не работает
компилятор avr-gcc ругается на несоответствие типов incompatible types in assignment
тоже самое, ругается на несоответствие типов
Tell Me The Truth
- Реклама
Re: Вопросы по С/С++ (СИ)
[uquote="Martian",url="/forum/viewtopic.php?p=4155724#p4155724"]разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.[/uquote]
Можно самому обнулить заполнил весь массив нулями, при помощи того же memset.
Добавлено after 57 seconds:
[uquote="FreshMan",url="/forum/viewtopic.php?p=4155725#p4155725"]в таком случае выводится мусор из незаписанных ранее полей[/uquote]
Так нужно ошибки исправлять, а не заполнять тем с чем работает
Можно самому обнулить заполнил весь массив нулями, при помощи того же memset.
Добавлено after 57 seconds:
[uquote="FreshMan",url="/forum/viewtopic.php?p=4155725#p4155725"]в таком случае выводится мусор из незаписанных ранее полей[/uquote]
Так нужно ошибки исправлять, а не заполнять тем с чем работает
Re: Вопросы по С/С++ (СИ)
ну да, о чем я и говорил.... если уж убивать весь мусор, то это будет самый удобный вариант.
Странно, почему \0 тоже ругает. Но вполне возможно, я как-то подзабыл эти моменты.
Странно, почему \0 тоже ругает. Но вполне возможно, я как-то подзабыл эти моменты.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="FreshMan",url="/forum/viewtopic.php?p=4155683#p4155683"]как элегантней проинициализировать большой массив структур ?[/uquote]Если пишете на плюсах и у полей всех объектов должны быть одни и те же значения, то самый элегантный и правильный способ - это инициализация полей в конструкторе.
Если не плюсы, то пробегаемся по массиву и иним все поля необходимыми значениями. Где-нибудь вначале программы, перед использованием.
Если нужно тупо обнулить всё, то уже выше сказали - memset.
Что касается Вашего кода. Какие-то странные у Вас поля. Особенно поля id и time - зачем они строковые ? Нелогично как-то ...
Если не плюсы, то пробегаемся по массиву и иним все поля необходимыми значениями. Где-нибудь вначале программы, перед использованием.
Если нужно тупо обнулить всё, то уже выше сказали - memset.
Что касается Вашего кода. Какие-то странные у Вас поля. Особенно поля id и time - зачем они строковые ? Нелогично как-то ...
Re: Вопросы по С/С++ (СИ)
[uquote="Аlex",url="/forum/viewtopic.php?p=4155749#p4155749"]Если пишете на плюсах и у полей всех объектов должны быть одни и те же значения, то самый элегантный и правильный способ - это инициализация полей в конструкторе.[/uquote]
В таких простых случаях и конструктор не нужен, уже давно можно сами поля инитить.
В таких простых случаях и конструктор не нужен, уже давно можно сами поля инитить.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
В принципе, да. Сам я лично так и делаю. Более наглядно получается.Reflector писал(а):В таких простых случаях и конструктор не нужен, уже давно можно сами поля инитить.
Но, как-то однажды, на Киберфоруме меня отругали за такой подход
Re: Вопросы по С/С++ (СИ)
[uquote="FreshMan",url="/forum/viewtopic.php?p=4155683#p4155683"]как элегантней проинициализировать большой массив структур ?
имеется массив структур
каждая структура состоит из 3 полей
перед записью данных я произвожу "обнуление", записывая пробелы, дабы там небыло мусора
поскольку поля всего 3 то сделать это легко а как быть если полей за сотню и более ?[/uquote]
Забъет нулем весь массив.
Если вместо 0 поставить 32, то забьет массив пробелами.
http://cppstudio.com/post/673/
Не забудь в начало файла вставить
имеется массив структур
каждая структура состоит из 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, " ");
}
Код: Выделить всё
memset(racer, 0, sizeof(racer));
Если вместо 0 поставить 32, то забьет массив пробелами.
http://cppstudio.com/post/673/
Не забудь в начало файла вставить
Код: Выделить всё
#include <string.h>- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
SfS, да вроде уже несколько раз ему про memset сказали. Думаю, он уже понял

Ага, и без нулей в конце строкSfS писал(а):Если вместо 0 поставить 32, то забьет массив пробелами.
Re: Вопросы по С/С++ (СИ)
[uquote="Аlex",url="/forum/viewtopic.php?p=4155962#p4155962"]Ага, и без нулей в концах строк
[/uquote]Там же не указано что все эти id,car,time - в формате ASCIIZ. А значит 0 в конце возможно и не нужен. А если массивы большие (много элементов), то выкидывание ненужных нулей позволяет хорошо экономить память. Я обычно так и делаю.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Судя по strcpy в коде автора - можно предположить.jcxz писал(а):Там же не указано что все эти id,car,time - в формате ASCIIZ
Ну, а вообще, там совсем всё как-то мутно. И автор молчит на вопросы
Re: Вопросы по С/С++ (СИ)
[uquote="Аlex",url="/forum/viewtopic.php?p=4155962#p4155962"]SfS, да вроде уже несколько раз ему про memset сказали. Думаю, он уже понял
[/uquote]
Ну это уж как ему угодно. Строки могут храниться и не в asciiz формате:)
Ага, и без нулей в конце строкSfS писал(а):Если вместо 0 поставить 32, то забьет массив пробелами.
Ну это уж как ему угодно. Строки могут храниться и не в asciiz формате:)
Re: Вопросы по С/С++ (СИ)
Тут, похоже, проблема не в хранении, а в доступе. Раз = "" не помогает, а = " " - да, то это намекает, что в дальнейшем проверка строк идет как-то не совсем так.
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: Вопросы по С/С++ (СИ)
Добрый день. В целом с библиотекой от 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 ) ;
Максимум вычислений на этапе компиляции и не тратить память по пустякам.
(монстр изрядно покоцан и моя лапа у него на груди)

#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 ) ;
Максимум вычислений на этапе компиляции и не тратить память по пустякам.
(монстр изрядно покоцан и моя лапа у него на груди)
Re: Вопросы по С/С++ (СИ)
[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4156716#p4156716"]Добрый день. В целом с библиотекой от 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 ) ;
Максимум вычислений на этапе компиляции и не тратить память по пустякам.
(монстр изрядно покоцан и моя лапа у него на груди)
[/uquote]
А зачем? Выигрыша в скорости нет. Дефайны и так на этапе препроцессора выполняются.
Разве что для красоты.
#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 ) ;
Максимум вычислений на этапе компиляции и не тратить память по пустякам.
(монстр изрядно покоцан и моя лапа у него на груди)
А зачем? Выигрыша в скорости нет. Дефайны и так на этапе препроцессора выполняются.
Разве что для красоты.
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: Вопросы по С/С++ (СИ)
Гуглил я по этому вопросу. Но честно говоря однозначного ответа не нашел. Напр. здесь(ссылка). Пока оставлю этот вопрос как не столь актуальный.
Re: Вопросы по С/С++ (СИ)
[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4156998#p4156998"]Гуглил я по этому вопросу. Но честно говоря однозначного ответа не нашел. Напр. здесь(ссылка). Пока оставлю этот вопрос как не столь актуальный.[/uquote]
constexpr хорош с функциями.
Но в данном случае вроде просто константы и выигрыша от него нет. ИМХО. Могу чегото не доглядеть.
constexpr хорош с функциями.
Но в данном случае вроде просто константы и выигрыша от него нет. ИМХО. Могу чегото не доглядеть.


