Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Martian »

И это не избавит от мусора, так как strcpy сделает первый элемент пробелом и во второй элемент занесет ноль - признак конца строки. Логичнее тогда уж присвоить 0, и именно 0, не "0". Это и будет пустая строка. А в этом случае не нужна strcpy.
Но вообще, зная адрес массива и его размер, заполнить эту область чем-то можно кучей способов, например, memset. Наверное, надо конкретно по мк/компилятору смотреть, что будет оптимальней.
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

[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
Tell Me The Truth
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

Пустая строка - это "", содержит один завершающий ноль и в таком случае можно просто обнулить весь массив.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Martian »

разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.
FreshMan писал(а):так не работает
компилятор avr-gcc ругается на несоответствие типов incompatible types in assignment
'\0'
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

не совсем то
в таком случае выводится мусор из незаписанных ранее полей
помогает именно пробел

Posted after 3 minutes 15 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4155724#p4155724"]разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.
FreshMan писал(а):так не работает
компилятор avr-gcc ругается на несоответствие типов incompatible types in assignment
'\0'[/uquote]
тоже самое, ругается на несоответствие типов
Tell Me The Truth
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="Martian",url="/forum/viewtopic.php?p=4155724#p4155724"]разве обнулит? мне думается, что просто поместит признак конца строки в начало, остальное не тронет. То есть, мусор-то всё равно будет, если потом какой-то иной доступ будет осуществляться.[/uquote]
Можно самому обнулить заполнил весь массив нулями, при помощи того же memset.

Добавлено after 57 seconds:
[uquote="FreshMan",url="/forum/viewtopic.php?p=4155725#p4155725"]в таком случае выводится мусор из незаписанных ранее полей[/uquote]
Так нужно ошибки исправлять, а не заполнять тем с чем работает :)
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Martian »

ну да, о чем я и говорил.... если уж убивать весь мусор, то это будет самый удобный вариант.

Странно, почему \0 тоже ругает. Но вполне возможно, я как-то подзабыл эти моменты.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

[uquote="FreshMan",url="/forum/viewtopic.php?p=4155683#p4155683"]как элегантней проинициализировать большой массив структур ?[/uquote]Если пишете на плюсах и у полей всех объектов должны быть одни и те же значения, то самый элегантный и правильный способ - это инициализация полей в конструкторе.
Если не плюсы, то пробегаемся по массиву и иним все поля необходимыми значениями. Где-нибудь вначале программы, перед использованием.
Если нужно тупо обнулить всё, то уже выше сказали - memset.

Что касается Вашего кода. Какие-то странные у Вас поля. Особенно поля id и time - зачем они строковые ? Нелогично как-то ... :dont_know:
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="Аlex",url="/forum/viewtopic.php?p=4155749#p4155749"]Если пишете на плюсах и у полей всех объектов должны быть одни и те же значения, то самый элегантный и правильный способ - это инициализация полей в конструкторе.[/uquote]
В таких простых случаях и конструктор не нужен, уже давно можно сами поля инитить.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Reflector писал(а):В таких простых случаях и конструктор не нужен, уже давно можно сами поля инитить.
В принципе, да. Сам я лично так и делаю. Более наглядно получается.
Но, как-то однажды, на Киберфоруме меня отругали за такой подход :)) Посоветовали присваивать значения полям в списке инициализации конструктора. Хотя, на мой взгляд, разницы нет никакой (если не иним константы/ссылки, или более сложные объекты) :dont_know:
SfS
Друг Кота
Сообщения: 19403
Зарегистрирован: Пт янв 12, 2007 11:21:39
Откуда: Томск

Re: Вопросы по С/С++ (СИ)

Сообщение SfS »

[uquote="FreshMan",url="/forum/viewtopic.php?p=4155683#p4155683"]как элегантней проинициализировать большой массив структур ?
имеется массив структур
каждая структура состоит из 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 то сделать это легко а как быть если полей за сотню и более ?[/uquote]

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

memset(racer, 0, sizeof(racer));
Забъет нулем весь массив.

Если вместо 0 поставить 32, то забьет массив пробелами.

http://cppstudio.com/post/673/

Не забудь в начало файла вставить

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

#include <string.h>
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

SfS, да вроде уже несколько раз ему про memset сказали. Думаю, он уже понял :)
SfS писал(а):Если вместо 0 поставить 32, то забьет массив пробелами.
Ага, и без нулей в конце строк :)))
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Вопросы по С/С++ (СИ)

Сообщение jcxz »

[uquote="Аlex",url="/forum/viewtopic.php?p=4155962#p4155962"]Ага, и без нулей в концах строк :)))[/uquote]Там же не указано что все эти id,car,time - в формате ASCIIZ. А значит 0 в конце возможно и не нужен. А если массивы большие (много элементов), то выкидывание ненужных нулей позволяет хорошо экономить память. Я обычно так и делаю.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

jcxz писал(а):Там же не указано что все эти id,car,time - в формате ASCIIZ
Судя по strcpy в коде автора - можно предположить.
Ну, а вообще, там совсем всё как-то мутно. И автор молчит на вопросы :dont_know:
SfS
Друг Кота
Сообщения: 19403
Зарегистрирован: Пт янв 12, 2007 11:21:39
Откуда: Томск

Re: Вопросы по С/С++ (СИ)

Сообщение SfS »

[uquote="Аlex",url="/forum/viewtopic.php?p=4155962#p4155962"]SfS, да вроде уже несколько раз ему про memset сказали. Думаю, он уже понял :)
SfS писал(а):Если вместо 0 поставить 32, то забьет массив пробелами.
Ага, и без нулей в конце строк :)))[/uquote]

Ну это уж как ему угодно. Строки могут храниться и не в asciiz формате:)
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Martian »

Тут, похоже, проблема не в хранении, а в доступе. Раз = "" не помогает, а = " " - да, то это намекает, что в дальнейшем проверка строк идет как-то не совсем так.
Аватара пользователя
Эйлер Леонард
Встал на лапы
Сообщения: 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 ) ;

Максимум вычислений на этапе компиляции и не тратить память по пустякам.
(монстр изрядно покоцан и моя лапа у него на груди) :tea: :sleep:
SfS
Друг Кота
Сообщения: 19403
Зарегистрирован: Пт янв 12, 2007 11:21:39
Откуда: Томск

Re: Вопросы по С/С++ (СИ)

Сообщение SfS »

[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 ) ;

Максимум вычислений на этапе компиляции и не тратить память по пустякам.
(монстр изрядно покоцан и моя лапа у него на груди) :tea: :sleep:[/uquote]

А зачем? Выигрыша в скорости нет. Дефайны и так на этапе препроцессора выполняются.

Разве что для красоты.
Аватара пользователя
Эйлер Леонард
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение Эйлер Леонард »

Гуглил я по этому вопросу. Но честно говоря однозначного ответа не нашел. Напр. здесь(ссылка). Пока оставлю этот вопрос как не столь актуальный.
SfS
Друг Кота
Сообщения: 19403
Зарегистрирован: Пт янв 12, 2007 11:21:39
Откуда: Томск

Re: Вопросы по С/С++ (СИ)

Сообщение SfS »

[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=4156998#p4156998"]Гуглил я по этому вопросу. Но честно говоря однозначного ответа не нашел. Напр. здесь(ссылка). Пока оставлю этот вопрос как не столь актуальный.[/uquote]

constexpr хорош с функциями.

Но в данном случае вроде просто константы и выигрыша от него нет. ИМХО. Могу чегото не доглядеть.
Ответить

Вернуться в «Разные вопросы по МК»