小编Kol*_*dar的帖子

基于生成器的协程与本地协程

我刚刚阅读了PEP0492,谈论了关于协同程序的新方法,但是PEP未能让我理解基于生成器的协同程序和本机协同程序之间的区别.有人可以告诉我差异(也许有例子)?

根据我的理解,他们使用不同的单词(产量/收益率和等待/ async/yield).据我所知,在本地协程结束时,预计会产生收益,但对于基于生成器的协同程序也是如此.

python coroutine async-await python-3.5

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

结构初始化中的const正确性

我现在正在玩C++和const-correctness.假设您具有以下结构

template <typename T>
struct important_structure {
    public:
    T* data;
    int a;
    important_structure(const T& el, int a);
    void change();
};

template <typename T>
void important_structure<T>::change() {
    //alter data field in some way
}

template <typename T>
important_structure <T>::important_structure(const T& el, int a) : data(&el), a(a) //error line {
};


int main() {
    important_structure<int>* s = new important_structure<int>{5, 3};
}
Run Code Online (Sandbox Code Playgroud)

编译时std=c++11,编译器返回以下错误:

从'const int*'到'int*'的无效转换

现在,我知道这是不安全投下const int*int*.问题是我有一个数据结构,我不想把字段data作为常量.

但是,我不想删除const构造函数中的限定符,因为我认为它为未来的开发人员提供了信息:它明确表示el不会被函数修改.仍然data可以通过其中的一些其他功能来修改该字段important_structure …

c++ const-correctness

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

Java中的私有类数据设计模式

我在阅读类的私有数据设计模式, 在这里,我试图了解它能够真正做到.

根据我的理解,私有类数据设计模式是一种结构模式,旨在重现"只读"属性,即使对于类本身:虽然"私有"属性是可见的,只能编辑为类本身,但"私有类数据"中的属性可以根本不会改变(即使偶然).唯一的解决方案是在私有类数据中提供一个setter,尽管(至少在我看来)如果私有类数据具有属性的所有setter,那么我们可能已经打败了模式的目的.

假设我的理解是正确的,这会导致一个问题:即使主类不能更改任何私有类数据属性,它也可以设置私有类数据本身的引用,用它想要更改的变量填充它.

换句话说,一个不关心的开发人员可能会这样做:

public class MainData {
    int foo;
    int bar;
    public MainData(int foo, int bar) {
        this.foo = foo;
        this.bar = bar;
    } 
    public int getFoo() {return foo;}
    public int getBar() {return bar;}
}
public class Main {
    private MainData mainData;
    public Main(int foo, int bar) {
        this.mainData = new MainData(foo, bar);
    }
    public doSomeWork() {
        //correct behaviour
        this.mainData.getFoo() + this.mainData.getBar();
        //now I want to trick the pattern
        this.mainData = new MainData(this.mainData.getFoo(), this.mainData.getBar()+4); …
Run Code Online (Sandbox Code Playgroud)

java design-patterns

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

/usr/local/lib 中的子文件夹?

我正在使用 Cmake 为我的大学开发一个简单的 C 共享库。目前我正在开发我的 *.so 和我的 .*h 文件的安装程序。

当用户运行著名的时,我应该把 so 和头文件放在哪里sudo make install?据我了解:

  1. 我不应该把它们放进去/usr/lib/usr/include因为这些文件夹是为分发包保留的;
  2. 我不应该把它们放进去/lib/include因为这些文件夹是为操作系统启动包保留的;

这给我留下了usr/local/lib/usr/local/include。但是我无法决定是否应该将我的文件放在子文件夹中:

  1. 将文件直接放在里面usr/local/lib/usr/local/include将使它们直接在系统中可用,但它们将与文件夹中的所有其他文件保持无序。更令人不安的事实是,如果有人安装另一个与我的头文件同名的共享库,可能会发生未知行为;
  2. 将文件放在子文件夹 ( /usr/local/lib/myAwesomeProject/and /usr/local/include/myAwesomeProject) 中将避免上述行为,但会阻止系统自动检测我的库(据我了解,系统会自动非递归地仅在特定目录中查找包含和库):因此,如果系统查看/usr/local/include,由于子文件夹,我的包含不会被找到!

为了帮助您,这是我的系统:

  • 操作系统系统:Ubuntu 16.4(64位在Windows 10 64位虚拟化);
  • CPU(不是我认为有用):Intel® Core™ i5-3230M CPU @ 2.60GHz × 2;

感谢您的任何友好回复!

c cmake shared-libraries

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

汇编语言的子集是否与平台无关?

我最近遇到了asmC中的保留字.我想利用它来避免一些C语义规则:特别是我想修改一个函数的变量:

int a = 5;
asm("asm code to change a from 5 to, like, 6")

int main() {
    printf("a equal to %d\n", a);
}
Run Code Online (Sandbox Code Playgroud)

现在,从我的计算机科学课程中我知道程序集依赖于平台,所以它的使用应该非常有限.但是,我已经看过一些经常性的指令,比如MOV或ADD.

我的问题是:

  1. 虽然程序集是全局平台依赖的,但它是否有一个所有汇编程序都能理解的子集?我的意思是,如果我要编写asm("MOV something somethingelse")并假设MOV在这个假设的子集中,那么无论平台如何,代码都是正确的吗?
  2. 如果确实存在该平台独立子集,有人可以将其链接吗?
  3. 如果没有与平台无关的子集,这是最常见的汇编语法?

c assembly inline-assembly

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

未解决的要求:osgi.component

我正在尝试开发一个包含REST API和来自定制服务的OSGi WAB的Karaf.然而,由于一些奇怪的原因,OSGi框架抱怨不满意的能力,osgi.component.

我想知道:

  1. 我该如何解决这个问题?
  2. 什么是osgi.component捆绑?为什么需要?
  3. 为什么maven-bundle-plugin(从而也是bnd),在条目"Require-Capability"中声明它?
  4. 如果我需要在OSGi框架上安装它,我可以在哪里找到它?

一些其他信息:

  • karaf版本:4.0.7;
  • maven bundle插件:3.2.0;
  • 操作系统:Windows 10 64位;
  • IDE:Eclipse Neon;

一些代码提供其他信息:

整个错误:

执行命令时出错:在bundle上执行命令时出错:启动bundle 96时出错:无法解析com.massimobono.karaf.examples.user-fully-rest [96](R 96.0):缺少需求[com.massimobono.karaf.examples.用户完全休息[96](R 96.0)] osgi.extender; (&(osgi.extender = osgi.component)(版本> = 1.3.0)(!(版本> = 2.0.0)))未解决的要求:[[com.massimobono.karaf.examples.user-fully-rest [ [96 96](R 96.0)] osgi.extender; (&(osgi.extender = osgi.component)(版本> = 1.3.0)(!(版本> = 2.0.0)))]

清单文件:

Manifest-Version: 1.0
Bundle-SymbolicName: com.massimobono.karaf.examples.user-fully-rest
Archiver-Version: Plexus Archiver
Built-By: massi
Bnd-LastModified: 1479908575162
Bundle-ActivationPolicy: lazy
Bundle-ManifestVersion: 2
Import-Package: com.massimobono.karaf.examples.user;version="[0.0,1)",
 com.massimobono.karaf.examples.user.service;version="[0.0,1)",javax.w
 s.rs;version="[2.0,3)",javax.ws.rs.core;version="[2.0,3)"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.compo
 nent)(version>=1.3.0)(!(version>=2.0.0)))",osgi.service;filter:="(obj
 ectClass=com.massimobono.karaf.examples.user.service.UserService)";ef
 fective:=active,osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/com.massimobono.karaf.examples.user.ui.ful
 lyrest.UserRest.xml
Tool: Bnd-3.2.0.201605172007
Originally-Created-By: …
Run Code Online (Sandbox Code Playgroud)

osgi maven-bundle-plugin wab osgi-bundle karaf

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

在C++程序中使用C共享库

我无法在用g ++编译的程序中链接用gcc编译的共享库.我有一个使用以下命令通过gcc编译的共享库:

build-library: activate-library-mode activate-debug-mode build-headers build-c-files build-exe-files
@echo -e $(cyan)generating shared library...$(plain)
@for exefile in $(exefiles); do\
    echo "$(CC) $(DEBUG) $(EXELIBFLAG) -o $(BINDIR)lib`basename $$exefile .c`.so $(wildcard $(OBJDIR)*.o)";\
    $(CC) $(DEBUG) $(EXELIBFLAG) -o $(BINDIR)lib`basename $$exefile .c`.so $(wildcard $(OBJDIR)*.o);\
done
Run Code Online (Sandbox Code Playgroud)

哪里:

  • CC = GCC
  • DEBUG = -g
  • EXELIBFLAG = -shared
  • BINDIR =斌/
  • exefiles = SRC/main.c中
  • *.o文件使用-fPIC,-g,-Wall编译-I和-c选项

因此,最终的调用是:

gcc -g -shared -o bin/libmain.so obj/ClassElement.o obj/ClassHashTable.o obj/ClassHTCell.o obj/IdentifierList.o obj/LabelClassType.o obj/LabelHashTable.o obj/LabelHTCell.o obj/Label.o obj/lexer.o obj/lex-tools.o obj/LexVal.o obj/LocalResourceElement.o obj/LocalResourceHashTable.o obj/LocalResourceHTCell.o obj/main.o obj/main-tools.o obj/memory-tools.o obj/NodeType.o obj/parser.o obj/parser-tools.o …
Run Code Online (Sandbox Code Playgroud)

c c++ linux gcc g++

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

命令从exec()失败但在终端上工作

我正在尝试使用Java将pdf转换为txt.我试过Apache PDFBox但是,由于一些奇怪的原因,它没有转换整个文档.出于这个原因,我决定通过执行Runtime.getRuntime().exec()调用来使用pdftotext.问题是,虽然在我的终端上pdftotext运行完美,但exec()调用给出了错误代码1(有时甚至是99).这是电话:

pdftotext "/home/www-data/CANEFS_TEST/Hello/ciao.pdf" "/tmp/ciao.pdf.txt"
Run Code Online (Sandbox Code Playgroud)

这是代码

private static File callPDF2Text(File input,File output){
    assert input.exists();
    assert Utils.getExtension(input).equalsIgnoreCase("pdf");
    assert Utils.getExtension(output).equalsIgnoreCase("txt") : output.getAbsoluteFile().toString();

    Process p=null;

    try {
        System.out.println(String.format(
                PDF2TXT_COMMAND,
                input.getAbsolutePath(),
                output.getAbsolutePath()));
        p=Runtime.getRuntime().exec(String.format(
                PDF2TXT_COMMAND,
                input.getAbsolutePath(),
                output.getAbsolutePath()));
        p.waitFor();
        if (p.exitValue()!=0){
            throw new RuntimeException("exit value for pdftotext is "+p.exitValue());
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return output;
}
Run Code Online (Sandbox Code Playgroud)

这是PDF2TXT_COMMAND字符串定义:

public static final String PDFTXT_COMMAND="pdftotext \"%s\" \"%s\"";
Run Code Online (Sandbox Code Playgroud)

我知道通常这些错误是由权限设置引起的.所以,这是Hello文件夹中ls -l命令的输出:

ls -l /home/www-data/CANEFS_TEST/Hello/
total 136
-rwxrwxr-- 1 www-data www-data 136041 mar 27 16:31 ciao.pdf …
Run Code Online (Sandbox Code Playgroud)

java linux runtime.exec pdftotext

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

缓冲区上的 basename 进入分段错误

我现在正在调整,basename我遇到了一个非常奇怪的案例(至少对我而言)。这是代码:

char buffer[300];
char* p;

strcpy(buffer, "../src/test/resources/constraints_0020_000");
printf("%d\n", strcmp(basename("../src/test/resources/constraints_0020_000"), "constraints_0020_000")); //works as expected
printf("assert testBasename02");
printf("%d\n", strcmp(basename(buffer), "constraints_0020_000") == 0);
printf("done 1\n"); //goes in segmentation fault
printf("%d\n", strcmp(basename(&buffer), "constraints_0020_000") == 0);
printf("done 2\n"); //goes in segmentation fault
printf("%d\n", strcmp(basename(&buffer[0]), "constraints_0020_000") == 0);
printf("done 3\n"); //goes in segmentation fault
p = malloc(strlen("../src/test/resources/constraints_0020_000") +1);
strcpy(p, "../src/test/resources/constraints_0020_000");
printf("%d\n", strcmp(basename(p), "constraints_0020_000") == 0); //works as expected
free(p);
printf("all done\n");
Run Code Online (Sandbox Code Playgroud)

第一个strcmp完全例外;这是第二个让我困惑的问题:为什么缓冲区会出现分段错误?我试图以不同的方式对缓冲区进行编码,但结果是一样的。

我当然可以忍受这种行为,但是......我真的不明白basename如果我给他喂食 aconst char*或缓冲区(最后也是 a char*)有什么区别。 …

c pointers strcmp

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

未调用应用程序处于前台时来自firebase的通知

我正在尝试设置Android手机从服务器接收通知的系统:对于此任务,我们选择了Firebase.虽然应用程序在后台运行,但一切正常:在我从firebase控制台推送消息后,系统托盘上会显示一条消息,并且在用户单击消息后,Intent会向其发送一条额外的数据Activity.

当应用程序已经处于前台时,我的问题是唯一的.该火力点通知是相当清楚的:如果应用程序是在前台,无论哪个类型的邮件服务器发送,OnMessageReceived不会被调用 ...那么,为什么它不能与我的简单的应用程序?一些注意事项可以帮助您解决此问题:

  • 我们正在使用Android Studio 2.1.2;
  • "it.bagozi.ada.tutorial.firebase"包含两个类(正如您可能从pacakge声明中推断出来的那样);

您可以在下面找到所有使用的源代码:

主要活动

package it.bagozi.ada.tutorial.firebase;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();

    private TextView notification;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.notification = (TextView) this.findViewById(R.id.notification_setter);

        Intent i = this.getIntent();
        Log.e(TAG, "Intent from Activity caller: " + i);

        if (getIntent().getExtras() != null) {
            for (String key : getIntent().getExtras().keySet()) …
Run Code Online (Sandbox Code Playgroud)

android firebase firebase-cloud-messaging firebase-notifications

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

我为什么不把所有东西放在标题中?

我开始使用C++,我来自C和Java.我知道在C中强烈建议在源代码的头和变量/类型/函数定义中编写变量/类型/函数声明; 所以,当我开始使用C++进行编码时,我认为也遵循相同的约定.

对我来说不幸的是,在C++中,此规则有几个例外,其中包括:

  • 模板类;
  • 内联函数;
  • constexpr功能;

这让我对文件产生了一些困惑:它们中的大多数是*.cpp包含少量中/大成员函数的文件的标题.

所以我的问题是:假设只使用类进行编码,而不是使用普通的C,为什么我不能只将所有内容放在标题中并且没有cpp文件?(有点Java风格); 澄清:我将主要处理类,模板类,最多模板函数.

例如Foo.hpp:

class Foo {
public:
 foo() {
     //body
 }
 bar() {
     //body
 }
}
Run Code Online (Sandbox Code Playgroud)

而不是在*.hpp和之间划分*.cpp:

//file Foo.hpp
class Foo {
public:
 foo();
 bar();
}

//file Foo.cpp
Foo::foo() {
   //body
}
Foo::bar() {
   //body
}
Run Code Online (Sandbox Code Playgroud)

当然会放入类似静态全局变量的东西.*cpp,但是根据我的理解,它们是唯一需要放入cpps的东西(并且强烈建议不要使用它们).

你能否告诉我这种方法有哪些缺点?作为C++的初学者,我肯定会忽略一些重要的因素.在我天真的观点中,没有什么需要在cpp文件中(假设我只编写类当然).

谢谢

c++

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