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

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

Сообщение FreshMan »

Ок, завтра попробую применить ваши советы
спасибо за отклики :)
в свете вышеизложенного спрошу вот еще что, как вычислить в моем случае разницу между двумя датами зная локальное и системное время ?
В VBS есть спец.фция, там жизнь проще :)
Tell Me The Truth
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Вообще, универсальный round можно сделать так;

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

#include <stdint.h>

//----------------------------------------------------------------------------------------------------
//округление до заданного количества цифр после запятой
//----------------------------------------------------------------------------------------------------
double Round(double value,uint32_t digit)
{
 double d=1;
 for(uint32_t n=0;n<digit;n++) d*=10;
 if (value>=0) return(floor(value*d+0.5)/d);
 return(ceil(value*d-0.5)/d);
}
Последний раз редактировалось da-nie Чт ноя 08, 2018 06:22:28, всего редактировалось 1 раз.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

AAX писал(а):для начала нужно найти msvcrt.dll
Входит в комплект поставки ОС начиная с Windows 95 OSR2.
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

посмотрел на код, приведённый da-nie, и понял, что я забыл про существование отрицательных чисел :facepalm: Мой первый #define неправильный, правильный теперь такой:

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

#define round(x) (int)(x>0?(x+0.5):(x-0.5))
только я сомневаюсь, что этот winCC осилит такой синтаксис (приведение типов, и Элвиса :) )
[uquote="Мурик",url="/forum/viewtopic.php?p=3500391#p3500391"]
AAX писал(а):для начала нужно найти msvcrt.dll
Входит в комплект поставки ОС начиная с Windows 95 OSR2.[/uquote]С очень большой вероятностью эта программа будет работать под WinCE либо Embedded. Причём версий древних, как экскременты мамонта. Если бы речь шла о "нормальных" ОС, наверное, данный вопрос вообще бы не возник.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

[uquote="AAX",url="/forum/viewtopic.php?p=3500445#p3500445"]посмотрел на код, приведённый da-nie, и понял, что я забыл про существование отрицательных чисел :facepalm: Мой первый #define неправильный, правильный теперь такой:

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

#define round(x) (int)(x>0?(x+0.5):(x-0.5))
только я сомневаюсь, что этот winCC осилит такой синтаксис (приведение типов, и Элвиса :) )[/uquote]
дефайн сработал :)
немного допилил его для отрицательных чисел

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

#define round(x) (long int)(x>=0?( floor(x+0.5)):( ceil(x-0.5) ) )
Tell Me The Truth
Реклама
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

[uquote="FreshMan",url="/forum/viewtopic.php?p=3500789#p3500789"]немного допилил его для отрицательных чисел

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

#define round(x) (long int)(x>=0?( floor(x+0.5)):( ceil(x-0.5) ) )
[/uquote]т.е. floor и ceil в этом языке есть из коробки? А round - отсутствует? Ну, и floor с ceil-ом лишние же тут. Мой вариант должен справляться с округлением без модификаций. А в этом языке обязательно писать long int? Просто long не достаточно?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

FreshMan писал(а):т.е. floor и ceil в этом языке есть из коробки?
да
FreshMan писал(а):А round - отсутствует?
да
попробовал так

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

#define round(x) (long)(x>0?(x+0.5):(x-0.5) )
все ок
подскажите как в моем случае работать с датой ?
мне надо вычислить разницу между системным и локальным временем в часах
Tell Me The Truth
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

я не знаю ничего про winCC, а макрос на стройке нашёл :)
могу сказать, как на обычном С сделать. Но для этого нужно задачу понимать. Фраза "разница между системным и локальным временем" вызывает у меня странные ассоциации. Типа, как понять, насколько врут часы в компе :) Системное время и есть локальное.
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Видимо речь идет о времени по Гринвичу и локальном.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

А round - отсутствует?
В моей Visual Studio 2010 я его тоже не нашёл.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

[uquote="Мурик",url="/forum/viewtopic.php?p=3500950#p3500950"]Видимо речь идет о времени по Гринвичу и локальном.[/uquote]
совершенно верно ! :)
Tell Me The Truth
AAX
Опытный кот
Сообщения: 721
Зарегистрирован: Сб ноя 16, 2013 23:34:34

Сообщение AAX »

1) экономный, но сложный для восприятия невооружённым глазом путь:

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

	float hours_timezone_diff = 0;
	time_t time_now = time(NULL);
	char *as_string_timezone = malloc(11 * sizeof(char));
	strftime(as_string_timezone, 10, "%z", localtime(&time_now));
	short converted_timezone= atoi(as_string_timezone);
	short timezone_round_hours = converted_timezone / 100.;
	hours_timezone_diff = timezone_round_hours + (converted_timezone - timezone_round_hours * 100)/60.;
2) легко читаемый, но требующий чуть больше ресурсов:

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

	float hours_timezone_diff = 0;
   time_t time1, time2;
   time1 = time(NULL);
   time2 = mktime(gmtime(&time1));
   long seconds_timezone_diff = time1 - time2;
	hours_timezone_diff = seconds_timezone_diff / 3600.;
0) самый лучший вариант, но я не знаю, как это сделать подвендой - просто взять константу timezone из системных настроек ;)
da-nie писал(а):
А round - отсутствует?
В моей Visual Studio 2010 я его тоже не нашёл.
floor, ceil и random живут в библиотеке math. В winCC этом floor и ceil по дефолту доступны (как если бы библиотека math была подключена), но random отсутствует.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а разве время не в unsigned long хранится? просто принудительно привести к целочисленному типу, вычислить разность, а результат потом разбить на секунды-минуты... не?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Доброе утро! Бьюсь на одной проблемой второй день.
Пишу на СИ в IAR.
Есть у меня некая структура:

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

typedef struct
{
  int32_t       power;
  int32_t       energy;
  uint32_t      voltage;
  uint32_t      current;
} ChannelData_t;
Затем я создал еще одну, в которую была включена предыдущая структура:

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

typedef struct
{
  ChannelData_t ChannelData[8];
} All_ChannelData_t;
Как мне теперь присвоить значения всем четырем элементам каждой из восьми структур?
Пробовал кучу вариантов, в том числе и такой в СИшном файле (который, как мне кажется, должен был работать):

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

All_ChannelData_t All_ChannelData = {
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
{
  1000,
  1000,
  1000,
  1000,
},
};

но вываливается ошибка о том, что указано слишком много значений.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

запятая последняя в каждой структуре и последняя в массиве - не лишняя ли?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Если их убрать (в любой комбинации), то ничего не меняется, хотя по логике, лишняя только одна в конце массива.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Должно быть 32 целых числа и между ними 31 запятая. Считай.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

кстати, зачем еще одна структура, если в ней только одно поле - массив? чем массив плох?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение WiseLord »

Если речь о GCC, можно так:

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

All_ChannelData_t All_ChannelData = { .ChannelData[0 ... 7] = { 1000, 1000, 1000, 1000 }};
ARV писал(а):запятая последняя в каждой структуре и последняя в массиве - не лишняя ли?
VladislavS писал(а):Должно быть 32 целых числа и между ними 31 запятая. Считай.
От этих якобы лишних запятых хуже не будет. Я предпочитаю ставить запятую и для последнего поля в структуре - потом, при добавлении новых полей, и дифф выглядит "чище" и копипастить проще.
Контактная информация:
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3501367#p3501367"]Должно быть 32 целых числа и между ними 31 запятая.[/uquote]
То есть, дополнительные разделительные фигурные скобки не нужны?
ARV писал(а):кстати, зачем еще одна структура, если в ней только одно поле - массив? чем массив плох?
В будущем, возможно расширение второй структуры.
WiseLord писал(а):All_ChannelData_t All_ChannelData = { .ChannelData[0 ... 7] = { 1000, 1000, 1000, 1000 }};
Это получается будет восемь строк (в каждой по одной структуре)?
Ответить

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