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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="pokk",url="/forum/viewtopic.php?p=3446429#p3446429"]И то и то :)[/uquote]
pokk
,
da-nie писал(а):компилятор может её выровнять чуть по другому, и восстановление произойдет не правильно, даже если CRC совпадет.
С очень большой вероятностью ничего он (компилятор) по-другому выравнивать не будет. Потенциально такое возможно, если Вы поменяете компилятор/версию компилятора. Но это маловероятно, и кто мешает Вам проверить после компиляции новой ревизии, что размер структуры не изменился?

pokk, а вообще отделяйте "мух от котлет": у Вас есть отдельная задача сохранение/восстановление конфигурационных параметров. Структура c параметрами для работы - это одно, напрмер

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

struct _device_config_t {
   int param_1;
   int param_2;
};
Есть функции чтения/записи конфигурации:

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

int device_config_save (struct _device_config_t *cfg);
int device_config_restore (struct _device_config_t *cfg);
void device_config_default (struct _device_config_t *cfg);
А во флеше/eeprom/файле/сети... формат данных может быть совершенно другой. Хоть в тексте, в вида пар параметр=значение, хоть в xml, хоть в бинарном виде.... Все зависит от того, что Вам необходимо. Можно реализовать все, что угодно: резервные копии, на случай повреждения (например, если при записи конфигурации было отключено питание), ...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

pokk писал(а):Так вот как правильно выравнять структуру что бы её можно было считать, что бы потом её можно было КОРРЕКТНО восстановить.
Вам нужно чтобы эти данные лежали всегда в одном месте, чтобы после перепрошивки можно было эти данные залить тем же проограмматором в ту же память или что?

Создайте в скрипте линкера отдельный регион и ничего не размещайте там кроме этой структуры. В принципе можно и другие данные туда же добавит (другие структуры или переменные). Все определения переменных для этого региона делайте в одном файле и добавление новых переменных в этот регион дописывайте после ранее определенных. Наверное надо наругаться на оптимизатор словом volatile. После компиляции проверять в map файле что куда улеглось.

Вот еще. Где-то видел в настройках что при прошивке можно не стирать все страницы флеша.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Ему нужно чтобы упаковка не менялась. Но pack(1) не любо.
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

Тогда может попробовать так:

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

typedef struct
{
   int param_1;
   int param_2;
} _device_config_t;

_device_config_t cfg[1];

...
cfg[0].param_1 = 55;
Вряд ли компилятор будет менять последовательность элементов в массиве
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Вычистил весь срач, начиная от первого провакационного вопроса про goto и до конца.
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 20
Зарегистрирован: Ср май 17, 2017 08:34:57
Откуда: Никополь

Сообщение 2sandro »

Здравствуйте товарищи!
Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:

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

uint8_t rtext[100];
f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile);
uint8_t len = rtext[0];
Естественно в len получаю "4" но в коде ASCII, т.е. 52
Вопрос: Как 52 перевести конкретно в 4, что бы использовать это значение как переменную, например здесь:

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

for (int i=0; i<len; i++) {
    f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile);
}
Исходя из этого мне нужно прочитать 4 строки, а не 52... :))
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

есть функция sscanf для этого - самый простой, но ресурсоемкий вариант.
есть функция atoi - вариант попроще и менее ресурсоемкий.
если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение :))
то есть

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

uint8_t number = rtext[0] - '0';
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="2sandro",url="/forum/viewtopic.php?p=3463709#p3463709"]Здравствуйте товарищи!
Немножко информации: На мк STM32 читаю файл построчно, есть строка в текстовом файле со значением "4", читаю эту строку в массив из uint8_t:

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

uint8_t rtext[100];
f_gets((TCHAR*)rtext, sizeof(rtext), &MyFile);
uint8_t len = rtext[0];
Естественно в len получаю "4" но в коде ASCII, т.е. 52[/uquote]

Всегда конвертилось туда-сюда добавлением/вычитанием кода '0' (48dec 30hex)

"4" это строка, один символ '4'

И сразу - а если в ваших манипуляциях будут числа больше 9????????
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 20
Зарегистрирован: Ср май 17, 2017 08:34:57
Откуда: Никополь

Сообщение 2sandro »

[uquote="dosikus",url="/forum/viewtopic.php?p=3463734#p3463734"]И сразу - а если в ваших манипуляциях будут числа больше 9????????[/uquote]
Хороший вопрос...
ARV писал(а): если слишком сложно, то просто используйте тот факт, что если от кода ЦИФРОВГО символа отнять код символа НОЛЬ, получится числовое значение :))
Спасибо.
Да, вот по поводу >9-ти немного озадачен... Но попробую решить, основной ответ на вопрос получил...
ЗЫ.: да, я не знал про "0" :)) ибо никогда не работал с ascii, поэтому то и спросил...
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

2sandro писал(а):ибо никогда не работал с ascii
Так Вы же сами написали - код 52.
А нужно 4. Значит разница - 48. Вот и вся арифметика :)

По поводу выхода символа из диапазона. Просто сделайте проверку обычным условием.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="Аlex",url="/forum/viewtopic.php?p=3463763#p3463763"]По поводу выхода символа из диапазона. Просто сделайте проверку обычным условием.[/uquote]


Проще пусть озвучит что за строки парсит...
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Можно ли c помощью #error выдать define ?
В общем есть define который рассчитываться, и хотелось бы после компиляции по смотреть что он там насчитал, и как округлил.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

pokk, а почему бы и нет ? :roll:
Или не получается ? Покажите как делаете.
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

C #error я погорячился лучше скорее #warning подойдет
Как ему задать что бы он TEST посчитал а потом заменил

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

#define TEST	(uint16_t)(2*30*3)
#warning "VarTest=TEST"
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Походу не получится так сделать. Директива warning игнорит макросы и тупо выводит то, что идёт за этой директивой, символ в символ.
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Думаю, никак
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="pokk",url="/forum/viewtopic.php?p=3470652#p3470652"]Можно ли c помощью #error выдать define ?[/uquote]
Ответ ради ответа:
#define __STR(x) #x
#define __STR2(x) __STR(x)
#pragma message __STR2(__LINE__)

Но есть нюанс:
[uquote="pokk",url="/forum/viewtopic.php?p=3470652#p3470652"]В общем есть define который рассчитываться, и хотелось бы после компиляции по смотреть что он там насчитал, и как округлил.[/uquote]
Препроцессор - это подстановщик - он ничего не считает и не округляет - он подставляет выражение по месту использования определения. Кстати, он также ничего и не компилирует - лишь передаёт компилятору С-файл с уже развёрнутыми #define #include директивами. Включите в проекте опцию "не удалять промежуточные файлы компиляции" и поищите среди временных файлов эти самые развёрнутые С-файлы. Могут называться *.i, *.ii, *.pre или как нибудь ещё - очень полезно на будущее при разборках с препроцессором.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

никогда раньше не сталкивался с применением оператора "запятая", кроме как в списках полей инициализации переменных и в операторе for.
а тут, знакомясь с темами на форуме, увидел, что практикуется код типа

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

if(condition) var1=a, var2=b, var3=c;
может мне кто-нибудь объяснить, в чем смысл такой записи, а так же вообще в чем смысл оператора "запятая" в подобных случаях?
т.е. в чем разница между разделением отдельных операторов точкой с запятой и только запятой?
что-то у меня возникает полная уверенность, что это очередной способ выстрелить себе в ногу...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Сообщения: 18
Зарегистрирован: Чт авг 06, 2015 09:38:22
Откуда: Москва

Сообщение Const14 »

Вы немного "плаваете" в понятиях оператор (statement), операция (operator), выражение (expression).
Выражение (expression) завершённое символом ";" является оператором (statement). То есть - это выражение (expression) - это оператор (statement)

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

var1=a, var2=b
- это тоже выражение
а

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

var1=a, var2=b;
- оператор.

пример использования выражения, содержащего запятую:

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

for(i=0; i<10; i++, j++)
   arr1[i] = arr2[j];
здесь

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

i++, j++
- выражение.
Пример использования оператора вы привели сами. Вместо применения составного оператора, состоящего из трёх отдельных операторов

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

{ var1=a; var2=b; var3 =c; }
применён один оператор

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

var1=a, var2=b, var3 =c;
То есть, симол "," в выражении является такой же (почти такой же:) ) операцией (operator), как и "+","-","=";
Последний раз редактировалось Const14 Пт окт 05, 2018 08:54:48, всего редактировалось 3 раза.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Синтаксисом языка разрешено? Разрешено. Значит имеет право быть. Сейчас даже вот так разрешено

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

if(uint32_t x=10; condition) var1 = x, var2 = x*x, var3 = x*x+x;
Ответить

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