小编Dar*_*ros的帖子

在管道中发送EOF而不关闭它

我正在编写一个使用GnuPlot绘制数据的应用程序。我决定使用“二进制”格式,而不是使用文本格式通过管道来通信这两个程序(这很慢,因为vprintf()和大量数据正在传递)。

问题在于,二进制格式的GnuPlot期望EOF(Ctrl + D)结束传输并绘制数据。在UNIX控制台模式下,这很容易。只需按Ctrl + D即可结束数据输入,绘制数据并保持控制台打开以等待更多命令。

但是在我的C ++应用程序中,发送EOF的唯一方法是关闭管道。这将导致gnuplot进程终止,并且不会在屏幕上显示该图。

¿是否有将EOF发送到管道的技巧?¿UNIX终端如何在不关闭正在运行的进程的情况下设法发送EOF?

PD:我无法使用“ -persist”关闭并重新打开GnuPlot,因为它会生成一个新图,而不是更新旧图(这是一个实时系统,因此会在〜inf图窗口附近生成)。

gnuplot pipe eof

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

重载!= as ==否定

我有一段代码实现了==重载.我不得不在某个否定的地方使用它.但是!(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)

额外:为什么编译器没有!=使用否定的默认实现==

c++ operator-overloading

5
推荐指数
0
解决办法
112
查看次数

使用函数返回值初始化std :: string,是否有副本?

我有以下代码,我正在使用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)'

我的问题是:

  1. 如果有问题
  2. 如果有的话,如何避免它

谢谢

编辑: 找到一种方法来进行显式交换工作.但答案正确,没有任何好处,因为编译器已经用返回值替换了st,没有任何副本.

system_call("whatever").swap(st);
Run Code Online (Sandbox Code Playgroud)

c++ swap c++11

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

多线程应用程序上的易失性C/C++

我对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%确定这种方法是安全的.

谢谢.

编辑:正确地重新制定问题.

c++ multithreading volatile

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

类括号括起初始化列表失败

我在初始化这个类时遇到问题:

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 ++.

这堂课不应该是手写的,但我知道价值是正确的,只是想把桌子作为全球价值.没有任何额外的内部调用来获取最终表值.

c++ initialization c++11

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

Android NDK:"致命错误:未找到'thread'文件"

我正在尝试编译仅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.

c++ android android-ndk c++11

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