小编bar*_*nos的帖子

标准C函数'localtime'的线程安全版本

我在多线程应用程序中使用localtime.

我必须用一个线程安全的版本替换它,据我所知,这个版本叫做localtime_r.

但是,当我这样做时,由于链接失败,我无法完成构建.

我甚至不确定从哪里开始寻找解决方案.

我的系统组件是:

  • 芯片 - STM32(基于ARM的皮层)
  • IDE - IAR(ST-Microcontrollers的编译器和链接器)
  • 操作系统 - ThreadX

我假设(虽然我不确定),这个函数通常会在随IDE提供的标准库中提供.我对么?

是否有我需要添加到项目中的其他库,还是项目设置中的某些内容?

如果没有可行的方法将此函数"导入"我的代码,我还有什么其他选项可用于本地时间函数的线程安全版本?

更新:

我希望避免使用OS资源(即互斥锁),而是调用一个标准例程,它正好执行'localtime'所做的事情,只是没有它使用的静态结构(使其不安全).

我没有看到为什么localtime会使用静态结构开始的任何原因,所以我假设相应的localtime_r并没有解决任何操作系统资源,而只是避免使用静态结构.

如果没有这样的选择是可行的,那么我不妨自己实现它,只是因为约会系统的"不规则性",我更喜欢使用已经过适当测试的东西.

这里的问题是,如何将localtime_r'链接到我的项目中(而不是如何实现localtime_r).

谢谢

c multithreading stm32 localtime iar

2
推荐指数
1
解决办法
3718
查看次数

Selenium Web-Driver Firefox配置文件 - 禁用弹出窗口和警报窗口

我遇到某些网站的问题导致我的浏览器在尝试切换到其他网址或甚至关闭浏览器时提示警报.一些例子:

为了使用Selenium解决警报问题,我需要切换到该警报,然后有时接受它并有时拒绝它(取决于警报的内容).

我希望避免以这种方式解决这个问题,因为:

  1. 我需要猜测是否应该接受警报或拒绝警报.

  2. 即使存在警报,切换到警报有时也会引发异常.

我需要在Firefox-Profile中设置哪些首选项,以防止浏览器发出此类警报(或任何其他警报)?

Java或Python中的答案将受到高度赞赏.

谢谢

python java selenium selenium-webdriver

2
推荐指数
1
解决办法
9989
查看次数

代码不会编译

我正在使用Microsoft Visual Studio Express 2013并编写了以下代码

#include <iostream>
using namespace std;
int main()
{
    cout << "Hello world!";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

1智能感知:PCH警告:找不到合适的标头停止位置.未生成IntelliSense PCH文件.

2 IntelliSense:预期声明错误3错误C1010:查找预编译头时意外结束文件.你忘了在你的来源添加'#include"stdafx.h"'吗?

我已经尝试添加'#include"stdafx.h"但这没什么区别.我已经预编译了标题,如果我取消它,我会在尝试构建时收到以下消息.

'ConsoleApplication6.exe' (Win32): Loaded 'C:\Users\Justin\Desktop\ConsoleApplication6\Debug\ConsoleApplication6.exe'. Symbols loaded.
'ConsoleApplication6.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Cannot find or open the PDB file.
'ConsoleApplication6.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Cannot find or open the PDB file.
'ConsoleApplication6.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KernelBase.dll'. Cannot find or open the PDB file.
'ConsoleApplication6.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcp120d.dll'. Cannot find or open the PDB file.
'ConsoleApplication6.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcr120d.dll'. …
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
1014
查看次数

为什么VS2013将函数调用编译成两个指令而不是一个?

这是一个简单的程序:

void func()
{
    printf("hello");
}

int main()
{
    printf("%p",func);
    func();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

踩到线printf("%p",func),我00F811AE打印在控制台上.

拆卸线func(),给我call _func (0F811AEh)- 到目前为止一切顺利.

但是拆解内容func,第一条指令出现在地址上00F813C0.

所以我"去看看"地址是什么00F811AE,我找到了jmp func (0F813C0h).

总结一下,似乎函数调用被编译为两个指令:

call _func (0F811AEh)
jmp   func (0F813C0h)
Run Code Online (Sandbox Code Playgroud)

为什么VS2013编译器使用两条指令而不只是一条?

似乎一个人jmp会完成这项工作.我甚至要问这个因为我有一种感觉,其他编译器也以类似的方式进行(当然,取决于底层的HW架构).

谢谢

c c++ compiler-construction compilation function-call

2
推荐指数
1
解决办法
132
查看次数

获取字符串中数值列表的最简洁方法

获取字符串中数值列表的最简洁方法是什么?

例如:

string = 'version_4.11.2-2-1.4'
array  = [4, 11, 2, 2, 1, 4]
Run Code Online (Sandbox Code Playgroud)

您可能理解,我需要比较版本.

"最干净",我的意思是尽可能简单/简短/可读.

另外,如果可能的话,我更喜欢内置函数而不是regexp(import re).

这是我到目前为止所得到的,但我觉得它很笨拙:

array = [int(n) for n in ''.join(c if c.isdigit() else ' ' for c in string).split()]
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我无法在SO上找到答案:

谢谢

python string

2
推荐指数
2
解决办法
244
查看次数

printf如何处理float参数与处理double参数的方式完全相同?

直到最近,我才想到:

  • printf("%f",x) 将尝试从堆栈中读取4字节的浮点值.

  • printf("%lf",x) 会尝试从堆栈中读取一个8字节的浮点值.

但是,下面的代码似乎产生了正确的输出:

float  f = 1234.5;
double d = 12345678.9;
printf("Output = %u %u\n",sizeof(f),sizeof(d)); // Output = 4 8
printf("Output = %.1f %.1f\n",f,d);             // Output = 1234.5 12345678.9
Run Code Online (Sandbox Code Playgroud)

我相信它证明printf("%f",x)从堆栈读取一个8字节的浮点值.

这是因为两个值都正确打印,但12345678.9太大而无法放入4字节变量.

现在我的问题是:当printf使用4字节float变量调用时,编译器如何知道double在将其推入堆栈并调用之前应将其转换为8字节值printf

在调用带浮点参数的函数时,这是标准的一部分吗?

谢谢

c floating-point printf

1
推荐指数
1
解决办法
196
查看次数

将".00"添加到Java中的整数BigDecimal

给定一个整数BigDecimal(即没有小数点),我该如何添加.00它?

我有的是:

BigDecimal Add2Zeros(BigDecimal num)
{
    return num.divide(BigDecimal.ONE,2,RoundingMode.HALF_UP);
}
Run Code Online (Sandbox Code Playgroud)

但它似乎有点笨拙.是否有更好/更简单/更清洁的方法呢?

顺便说一句,除了toString()结果之外,它不应该对论证产生任何影响.

java bigdecimal

1
推荐指数
1
解决办法
1353
查看次数

你可以用'委托'做什么但不能用'动作'或'Func'做什么?

新手提出的问题提前道歉(因为我是C#中的一员):

在研究代表时,在我看来,关键字的整个"功能" 的组合ActionFunc覆盖delegate.

换句话说,您无法对delegate关键字执行任何操作,但无法使用Action或关键字Func.

我尝试过以下示例(工作正常):

Func<int,int,int,int> func = (x,y,z) => (x<<9)|(y<<6)|(z<<3);
Action<int,int,int> action = (x,y,z) => Console.WriteLine(x|y|z);
Run Code Online (Sandbox Code Playgroud)

我错了吗?如果是,那么请您提供一个反例吗?

c# delegates

1
推荐指数
1
解决办法
118
查看次数

我可以依赖'sizeof'来确定我使用的是32位操作系统还是64位操作系统

假设我不确定如何检查我正在运行的操作系统.

所以我想确定使用下面的代码:

#include <limits.h>
...
size_t os_size = sizeof(void*) * CHAR_BIT;
Run Code Online (Sandbox Code Playgroud)

我可以100%依赖它,还是有任何需要注意的警告?

例如:

我是否有可能安装32位操作系统的编译器并在64位操作系统上正常工作?

谢谢

c c++ virtual-memory 32bit-64bit

1
推荐指数
1
解决办法
175
查看次数

Variadic函数在Win32中有效,但在Win64中无效

我已经使用了以下功能很长一段时间了:

void AddRow(int iNumOfColumns,...)
{
    int* pValuePerColumn = (int*)&iNumOfColumns+1;

    for (int i=0; i<iNumOfColumns; i++)
    {
        // Do something with pValuePerColumn[i]
    }
}
Run Code Online (Sandbox Code Playgroud)

现在事实证明它在Win64上为我们的一个客户崩溃了.

我手头没有64位平台,但我假设原因是:

调用该函数时,参数将作为64位值推入堆栈.

在这个假设下,我认为,更换int*size_t*应解决的问题.


我的问题是:

  • 我的分析是否正确?
  • 我的解决方案是否正确
  • 是否有更"常规"的解决方法?

c 64-bit variadic-functions

1
推荐指数
1
解决办法
67
查看次数