我的理解是,一般来说,如果从信号处理程序调用非异步信号安全函数,行为是不确定的,但我听说linux允许你安全地调用任何系统调用.这是真的?此外,SIGSEGV处理程序的唯一可移植行为是中止或退出,但我知道如果你返回,linux实际上会恢复执行,是吗?
也许这是不可能的,我误读了cmake 3.2文档,但我创建一个自定义命令会在Makefile中创建一个自定义"目标",这样我就可以通过调用输出文件的名称来构建目标.CMake文档说:
在makefile术语中,这将以下列形式创建一个新目标:
Run Code Online (Sandbox Code Playgroud)OUTPUT: MAIN_DEPENDENCY DEPENDS COMMAND
所以我想我可以跑了make OUTPUT
.也许文档将CMake目标与Makefile目标混淆了?
例如,
add_custom_command(OUTPUT foo_out
COMMAND post_process foo_in > foo_out
DEPENDS foo_in
)
Run Code Online (Sandbox Code Playgroud)
我想要做
make foo_out
Run Code Online (Sandbox Code Playgroud)
它会使foo_out
.但是,如果我这样做,我明白了
make: **** No rule to make target `foo_out`. Stop.
Run Code Online (Sandbox Code Playgroud)
果然,cmake二进制输出目录中的任何文件中都不存在"foo_out"这个词.如果我把它改成这个
add_custom_target(bar DEPENDS foo_out)
add_custom_command(OUTPUT foo_out COMMAND post_process foo_in > foo_out)
Run Code Online (Sandbox Code Playgroud)
然后我就能做到
make bar
Run Code Online (Sandbox Code Playgroud)
我能做到
make foo_in
Run Code Online (Sandbox Code Playgroud)
但我还是做不到
make foo_out
Run Code Online (Sandbox Code Playgroud)
问题make bar
是它不直观,因为实际的文件输出foo_out
不是bar
.
我该怎么做呢?
在我的例子中,我需要对标准可执行目标运行一个特殊的处理步骤,该目标将可选资源插入到ELF文件中.我希望能够将两个可执行文件作为Makefile目标,因此我可以构建裸ELF可执行文件以及注入资源的ELF可执行文件.
如果我正在编写自定义Makefile,这很简单!
foo_in: foo.c
$(CC) $< -o $@
foo_out: foo_in
post_process $< …
Run Code Online (Sandbox Code Playgroud) 有没有办法我可以同时获取Android中的WiFi和蜂窝网络的IP地址.我尝试使用很多例子,但能够获得只有WiFi网络而不是蜂窝网络的地址.我已启用WiFi和蜂窝网络设备可通过WiFi访问Internet.
这是我用来获取IP地址的代码:
String ipAddress = null;
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
ipAddress = inetAddress.getHostAddress().toString();
Log.i("Here is the Address",ipAddress);
}
}
}
} catch (SocketException ex) {
}
Run Code Online (Sandbox Code Playgroud)
当设备连接到WiFi时,是否有可能获得蜂窝网络的IP地址.如果是,那么这是可行的.
我在网上搜索了一个C++ Longest Common Substring实现,但未能找到一个像样的.我需要一个返回子串本身的LCS算法,因此它不仅仅是LCS.
不过,我想知道如何在多个字符串之间做到这一点.
我的想法是检查两个字符串之间的最长字符串,然后检查所有其他字符串,但这是一个非常缓慢的过程,需要在内存上管理许多长字符串,使我的程序非常慢.
知道如何为多个字符串加速这个吗?谢谢.
重要编辑 我给出的一个变量确定了最长公共子串需要的字符串数,因此我可以给出10个字符串,并找到它们的LCS(K = 10)或LCS为4他们,但我不知道哪个4,我必须找到最好的4.
我知道缓冲区溢出是什么.我不知道缓冲区下溢是什么.
我猜它是一个特定的缓冲区接收而不是字节溢出,字节下溢.
char buffer[8];
fgets(buffer, sizeof(buffer), stdin);
Run Code Online (Sandbox Code Playgroud)
以上将不会出错.
char buffer_overflow[8];
fgets(buffer_overflow, 16, stdin);
Run Code Online (Sandbox Code Playgroud)
如果用户输入是例如"deutschland",则上述将导致缓冲区溢出.
我可以在代码中获得一个示例,缓冲区下溢是什么?
我在C++中有一个字符串的问题,它有几个西班牙语单词.这意味着我有很多带有重音符号和波浪号的单词.我想替换他们没有重音的同行.示例:我想替换这个词:哈比亚的"había".我尝试直接替换它,但使用字符串类的替换方法,但我无法让它工作.
我正在使用此代码:
for (it= dictionary.begin(); it != dictionary.end(); it++)
{
strMine=(it->first);
found=toReplace.find_first_of(strMine);
while (found!=std::string::npos)
{
strAux=(it->second);
toReplace.erase(found,strMine.length());
toReplace.insert(found,strAux);
found=toReplace.find_first_of(strMine,found+1);
}
}
Run Code Online (Sandbox Code Playgroud)
dictionary
这样的地图在哪里(有更多条目):
dictionary.insert ( std::pair<std::string,std::string>("á","a") );
dictionary.insert ( std::pair<std::string,std::string>("é","e") );
dictionary.insert ( std::pair<std::string,std::string>("í","i") );
dictionary.insert ( std::pair<std::string,std::string>("ó","o") );
dictionary.insert ( std::pair<std::string,std::string>("ú","u") );
dictionary.insert ( std::pair<std::string,std::string>("ñ","n") );
Run Code Online (Sandbox Code Playgroud)
和toReplace
字符串是:
std::string toReplace="á-é-í-ó-ú-ñ-á-é-í-ó-ú-ñ";
Run Code Online (Sandbox Code Playgroud)
我显然必须遗漏一些东西.我无法弄清楚.有没有我可以使用的图书馆?
谢谢,
我目前正在用C++编写一些类似矢量数学类的glsl,我刚刚实现了abs()
这样的函数:
template<class T>
static inline T abs(T _a)
{
return _a < 0 ? -_a : _a;
}
Run Code Online (Sandbox Code Playgroud)
我将它的速度与默认的C++进行了比较abs
,math.h
如下所示:
clock_t begin = clock();
for(int i=0; i<10000000; ++i)
{
float a = abs(-1.25);
};
clock_t end = clock();
unsigned long time1 = (unsigned long)((float)(end-begin) / ((float)CLOCKS_PER_SEC/1000.0));
begin = clock();
for(int i=0; i<10000000; ++i)
{
float a = myMath::abs(-1.25);
};
end = clock();
unsigned long time2 = (unsigned long)((float)(end-begin) / ((float)CLOCKS_PER_SEC/1000.0));
std::cout<<time1<<std::endl;
std::cout<<time2<<std::endl;
Run Code Online (Sandbox Code Playgroud)
现在默认的abs需要大约25ms而我的需要60.我猜有一些低级优化正在进行中.有人知道math.h
abs …
在C++代码中,我有一个双打变量矩阵,我打印出来.但是因为它们都具有不同的位数,所以输出格式被破坏.一种解决方案是做
cout.precision(5)
但我希望不同的列具有不同的精度.此外,由于在某些情况下存在负值,因此-
符号的存在也会引起问题.如何解决这个问题并生成格式正确的输出?
我正在寻找最有效(以"最快"的方式)用另一个字符串替换字符串中所有出现的子字符串的方法.到目前为止,我想出的就是:
std::string StringReplaceAll(const std::string &cstSearch, const std::string &cstReplace, const std::string &cstSubject)
{
if(cstSearch.length() > cstSubject.length() || cstSearch == cstReplace || cstSubject.empty() || cstSearch.empty() || cstSubject.find(cstSearch) == std::string::npos)
{
return cstSubject;
}
std::ostringstream ossReturn;
std::string::const_iterator ci(cstSubject.cbegin());
const std::string::const_iterator::difference_type ciFindSize(std::distance(cstSearch.cbegin(), cstSearch.cend()));
for(std::string::const_iterator ciNow; (ciNow = std::search(ci, cstSubject.cend(), cstSearch.cbegin(), cstSearch.cend())) != cstSubject.cend(); ci = ciNow)
{
std::copy(ci, ciNow, std::ostreambuf_iterator<char> (ossReturn));
std::copy(cstReplace.cbegin(), cstReplace.cend(), std::ostreambuf_iterator<char> (ossReturn));
std::advance(ciNow, ciFindSize);
}
std::copy(ci, cstSubject.cend(), std::ostreambuf_iterator<char> (ossReturn));
return ossReturn.str();
}
Run Code Online (Sandbox Code Playgroud)
...这个方式(!!!)对我的需求来说太慢了:-(
期待向你们学习!
我想write
在信号处理程序内使用(或任何异步安全函数)将数字打印到日志或终端中.我宁愿不使用缓冲I/O.
是否有一种简单而推荐的方法可以做到这一点?
例如代替printf
,我更喜欢write
(或任何asyn安全功能).
void signal_handler(int sig)
{
pid_t pid;
int stat;
int old_errno = errno;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
printf("child %d terminated\n", pid);
errno = old_errno;
return;
}
Run Code Online (Sandbox Code Playgroud)
打印字符串很容易.代替printf
上面我可以使用(不打印pid
):
write(STDOUT_FILENO, "child terminated", 16);
Run Code Online (Sandbox Code Playgroud) c++ ×5
c ×3
performance ×2
signals ×2
str-replace ×2
string ×2
algorithm ×1
android ×1
async-safe ×1
cmake ×1
function ×1
ip-address ×1
lcs ×1
linux ×1
math ×1
networking ×1
stl ×1
text ×1
underflow ×1