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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Если памяти для задачи недостаточно, то не принципиально, каким образом она будет исчерпана.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Хотелось бы узнать почему именно 258 при 300 озу, разъясните пожалуйста. Хочется действовать понимая что то, а не просто прописывать цифры потому, что так надо.
«И всё-таки она вертится!»
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Apparatchik писал(а):почему именно 258 при 300 озу
это оценочное мнение. стек в проектах МК расходуется "непредсказуемо" только прерываниями. при входе в обработчик может потребоваться (на глазок) сохранить до 16 рабочих регистров (из практики, на примере AVR), что потребует 34 байта стека. еще немножко в запас - вот и выходит 300.
Мурик писал(а):А если эта функция вызвана из 1500 последовательно вызванных функций, в которых в свою очередь тоже выделялись переменные или массивы в стеке?
дураку стеклянный х#й - не надолго игрушка. такому программисту лучше заняться чем-то другим
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение FreshMan »

Здравствуйте
Подскажите пожалуйста, как узнать в какой dll находится ф-ция round ?
Пишу скрипт на си в среде WinCC.
В данной среде нету возможности подключать хидеры, вместо этого используются вот такие конструкции

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

 #pragma code ("oleaut32.dll")       
  INT SystemTimeToVariantTime(LPSYSTEMTIME  lpSystemTime, DATE *pvtime);
   INT VariantTimeToSystemTime(double vtime, LPSYSTEMTIME IpSystemTime);
  #pragma code () 
Tell Me The Truth
AAX
Опытный кот
Сообщения: 718
Зарегистрирован: Сб ноя 16, 2013 23:34:34

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

Сообщение AAX »

[uquote="FreshMan",url="/forum/viewtopic.php?p=3498476#p3498476"]как узнать в какой dll находится ф-ция round ?[/uquote]Мельком глянул - язычок таксе, канешн :) диалектом C назвать его язык не поворачивается. Из общих соображений функция round должна располагаться в какой-нибудь math.dll (по аналогии с math.h). Если это средство программирования поддерживает макросы и явное приведение типов, можно сделать "функцию" примерно так:

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

#define round(x) (int)(x+0.5)
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

[uquote="AAX",url="/forum/viewtopic.php?p=3498951#p3498951"]Из общих соображений функция round должна располагаться в какой-нибудь math.dll (по аналогии с math.h).[/uquote]
такой вариант не сработал
если можете, прошу внести ясность, так называемые ф-ции Win API сокрыты в dllках ?
Tell Me The Truth
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

Насколько мне известно среди WinAPI нет функции round. Возможно найдется в msvcrt.dll.
AAX
Опытный кот
Сообщения: 718
Зарегистрирован: Сб ноя 16, 2013 23:34:34

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

Сообщение AAX »

[uquote="FreshMan",url="/forum/viewtopic.php?p=3500298#p3500298"]такой вариант не сработал
если можете, прошу внести ясность, так называемые ф-ции Win API сокрыты в dllках ?[/uquote]А вариант с #define? Тоже не работает?
Функции Windows API находятся в dll. На всякий случай - round не имеет отношения к Win API :)
Мурик писал(а):Насколько мне известно среди WinAPI нет функции round. Возможно найдется в msvcrt.dll.
для начала нужно найти msvcrt.dll. Не на каждом компьютере установлена MSVS.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

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

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

Сообщение 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
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

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

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

Сообщение 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. Причём версий древних, как экскременты мамонта. Если бы речь шла о "нормальных" ОС, наверное, данный вопрос вообще бы не возник.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение 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
Опытный кот
Сообщения: 718
Зарегистрирован: Сб ноя 16, 2013 23:34:34

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

Сообщение 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 не достаточно?
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

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

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

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

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

Сообщение AAX »

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

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

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

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

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

Сообщение 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
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

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

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

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

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