我正在编写一个使用GnuPlot绘制数据的应用程序。我决定使用“二进制”格式,而不是使用文本格式通过管道来通信这两个程序(这很慢,因为vprintf()和大量数据正在传递)。
问题在于,二进制格式的GnuPlot期望EOF(Ctrl + D)结束传输并绘制数据。在UNIX控制台模式下,这很容易。只需按Ctrl + D即可结束数据输入,绘制数据并保持控制台打开以等待更多命令。
但是在我的C ++应用程序中,发送EOF的唯一方法是关闭管道。这将导致gnuplot进程终止,并且不会在屏幕上显示该图。
¿是否有将EOF发送到管道的技巧?¿UNIX终端如何在不关闭正在运行的进程的情况下设法发送EOF?
PD:我无法使用“ -persist”关闭并重新打开GnuPlot,因为它会生成一个新图,而不是更新旧图(这是一个实时系统,因此会在〜inf图窗口附近生成)。
我有一段代码实现了==重载.我不得不在某个否定的地方使用它.但是!(A == B)对于读者而言,写作似乎并不清楚.所以我实现了这个双重重载.这样做有什么缺点吗?效率明智吗?:
struct Foo{
bool operator==(const Foo& other) const{
.... //Something that sometimes produces "return false"
return true;
}
bool operator!=(const Foo& other) const{
return !(*this == other);
}
}
Run Code Online (Sandbox Code Playgroud)
额外:为什么编译器没有!=使用否定的默认实现==?
我有以下代码,我正在使用GCC和C++ 11:
std::string system_call(const char *cmd){
std::string a;
...
return a;
}
std::string st = system_call("whatever code");
Run Code Online (Sandbox Code Playgroud)
那里有隐含的副本吗?我多次调用这个函数,我猜它是从system_call变量的返回值复制st,然后释放临时r值.
有什么方法可以避免副本吗?st.swap(system_call())在编译器中使用throws和error:
错误:没有匹配函数来调用'std :: basic_string :: swap(std :: string)'
我的问题是:
谢谢
编辑: 找到一种方法来进行显式交换工作.但答案正确,没有任何好处,因为编译器已经用返回值替换了st,没有任何副本.
system_call("whatever").swap(st);
Run Code Online (Sandbox Code Playgroud) 我对volatile使用情况有疑问.我通常会尝试跨线程共享的所有变量都有volatile关键字以确保直接内存访问,当然还有互斥锁保护.
但是,volatile如果共享变量以确保一致性,是否真的需要?
我用一个例子来解释:
Thread1: //(affects it behaviour with the variable)
mymutex.lock();
if(variable)
{
...
variable = false;
}
mymutex.unlock();
Run Code Online (Sandbox Code Playgroud)
Thread2:
mymutex.lock();
variable = true;
mymutex.unlock();
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,thread2仅写入和thread1读/写.是否可能variable缓存并且线程不读取新值?即使互斥锁设置正确吗?volatile在这种情况下我需要吗?
我问这个因为而不是变量我有一个std::vector,它不能挥发.如果没有volatile关键字,我不能100%确定这种方法是安全的.
谢谢.
编辑:正确地重新制定问题.
我在初始化这个类时遇到问题:
class Table{
public:
long r;
long c;
int g;
int q;
std::vector<std::vector<long> > data;
//Helper Methods
Table(){r=-1;c=-1;g=-1; q=-1;data.clear();};
double rate(void) const {...};
bool check(void) const {...};
void q_auto(void){q = r / g;};
};
Run Code Online (Sandbox Code Playgroud)
如果我尝试这个:
static Table my_table = {16200, 10800, 360, 30, {{1,3},{2,5}}};
Run Code Online (Sandbox Code Playgroud)
它完全失败了:
error: could not convert ‘{16200, 10800, 360, 30, {{1, 3}, {2, 5}}}’ from ‘<brace-enclosed initializer list>’ to ‘Table’
Run Code Online (Sandbox Code Playgroud)
我有C++ 11.那么,那里有什么问题?我尝试了额外的括号,但没有运气......我正在使用g ++.
这堂课不应该是手写的,但我知道价值是正确的,只是想把桌子作为全球价值.没有任何额外的内部调用来获取最终表值.
我正在尝试编译仅NDK应用程序(命令行应用程序).我在很多方面使用C++ 11,最近我添加了线程:
#include <thread>
Run Code Online (Sandbox Code Playgroud)
现在我的编译不起作用,即使它适用于map/deque/vector/....出现以下错误:
jni/common.h:24:10: fatal error: 'thread' file not found
#include <thread>
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
这是我的Application.mk:
APP_PLATFORM := android-18
APP_CPPFLAGS := -Wall -frtti -fexceptions -fpermissive
APP_ABI := armeabi-v7a
APP_STL:=stlport_static
NDK_TOOLCHAIN_VERSION := clang
APP_OPTIM := release
Run Code Online (Sandbox Code Playgroud)
这是我的Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := XXXX
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/XXXXX
LOCAL_SRC_FILES := ....
LOCAL_C_FLAGS := -O3 -std=c++11
LOCAL_CXX_FLAGS := -O3 -std=c++11
LOCAL_LDLIBS := -llog
include $(BUILD_EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)
我正在使用NDK 10d.