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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

uint8_t volatile *FRAM_send_ptr, *FRAM_recv_ptr;
Тут volatile относится к типу.

PS:

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

[int volatile] [* p1], [* p2];
Реклама
Мудрый кот
Сообщения: 1856
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="uldemir",url="/forum/viewtopic.php?p=4147864#p4147864"]

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

uint8_t volatile *FRAM_send_ptr, *FRAM_recv_ptr;
обявляются два не волатильных указателя, только FRAM_send_ptr - указывает на волатильную переменную, а FRAM_recv_ptr - на обычную?[/uquote]Оба должны указывать на volatile переменную.
В любом случае легко ведь проверить: скомпилить чтение с полной оптимизацией и посмотреть в листинг.
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Всё очень просто - спецификаторы можно менять местами, результат будет одинаков.
uint8_t volatile = volatile uint8_t
Друг Кота
Аватара пользователя
Сообщения: 7385
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Может, подбросите еще идей. Делаю журналироваие в FRAM. Надумал, что буду сбрасывать следующую информацию:

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

    typedef struct data_buffer {
        int16_t setspeedLeft;       // 2
        int16_t setspeedRight;      // 2
        int16_t RealSpeedLeft;      // 2
        int16_t RealSpeedRight;     // 2
        int32_t StepsLeft;          // 4
        int32_t StepsRight;         // 4
        uint32_t Time;              // 4
        uint8_t vbat;
        uint8_t sensors;
    }data_buffer_t;
Ожидалось, что это будет 22 байта на запись, но оказалось, что sizeof() возвращает 24. Похоже что vbat и sensors "выровнены" по четным адресам. Как это упихнуть поплотнее? Я расчитывал, что смогу около 30 секунд записать в 256к (400 записей в секунду), а тут только 27. Вручную OR-ить два байта в 16-битную переменную? Глобальные настройки,типа pack structure, менять нет желания.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

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

typedef struct data_buffer {
.....
} __attribute__((packed)) data_buffer_t ;
Реклама
Мудрый кот
Сообщения: 1856
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

Для IAR:

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

__packed typedef struct data_buffer {
  ...
} data_buffer_t;
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="jcxz",url="/forum/viewtopic.php?p=4150188#p4150188"]Для IAR:[/uquote]IAR поддерживает __attribute__((packed)). Стоит использовать его для совместимости между компиляторами.
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

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

Добрый вечер. Тут на досуге разбираю по запчастям одного монстра.
class Adafruit_SSD1306 : public Adafruit_GFX {...}
Конструкция подобного вида class AХХХ : public BХХX {...}; Вопрос - повадки, свойства, поведение?
В AtmelStudio компилируется уже без ошибок. Но вызвать в main.cpp пока не получается. Там ещё целая свита хидеров прицеплена. Ни кто их них не буянит. Ардуины нигде нет - все приведено к нормальному С++ :)
Вложения
123.png
(54 КБ) 114 скачиваний
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

В ошибке говорится, что в классе от которого наследуешься есть чисто виртуальная функцию, которая выглядит как-то так:

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

virtual void func() = 0;
Фактически это только объявление, но класс Adafruit_GFX ее вызывает, потому она должна быть определена в Adafruit_SSD1306.
Встал на лапы
Аватара пользователя
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

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

Вот-вот. Такие же подозрения. Полиформизм понимаете ли.. Ну да ладно. Сейчас всё закомментировал. И потихоньку раскомментировываю код. Пустой скелет классов работает и по мере его наполнения с скомпиляцией на каждом этапе можно узнать где собака зарыта. Просто хочу переписать эту библиотеку для голого МК на чистом С++.

Добавлено after 10 minutes 29 seconds:
Да, есть такая!

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

// This MUST be defined by the subclass:
	virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;
"Это ДОЛЖНО быть определено подклассом:" (перевод)

Добавлено after 22 minutes 42 seconds:
Подробнее про virtual void func() = 0; тут.(ссылка)
Вложения
456.png
(15.27 КБ) 119 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

как элегантней проинициализировать большой массив структур ?
имеется массив структур
каждая структура состоит из 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 то сделать это легко а как быть если полей за сотню и более ?
Tell Me The Truth
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

Странное у тебя обнуление, строка содержащая один пробел - это типа аналог пустой строки?
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение Reflector »

Пустая строка - это "", содержит один завершающий ноль и в таком случае можно просто обнулить весь массив.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение 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]
Так нужно ошибки исправлять, а не заполнять тем с чем работает :)
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

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

Сообщение Reflector »

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

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

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

Сообщение 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>
Ответить

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