我刚刚阅读了PEP0492,谈论了关于协同程序的新方法,但是PEP未能让我理解基于生成器的协同程序和本机协同程序之间的区别.有人可以告诉我差异(也许有例子)?
根据我的理解,他们使用不同的单词(产量/收益率和等待/ async/yield).据我所知,在本地协程结束时,预计会产生收益,但对于基于生成器的协同程序也是如此.
我现在正在玩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 …
我在阅读类的私有数据设计模式, 在这里,我试图了解它能够真正做到.
根据我的理解,私有类数据设计模式是一种结构模式,旨在重现"只读"属性,即使对于类本身:虽然"私有"属性是可见的,只能编辑为类本身,但"私有类数据"中的属性可以根本不会改变(即使偶然).唯一的解决方案是在私有类数据中提供一个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) 我正在使用 Cmake 为我的大学开发一个简单的 C 共享库。目前我正在开发我的 *.so 和我的 .*h 文件的安装程序。
当用户运行著名的时,我应该把 so 和头文件放在哪里sudo make install?据我了解:
/usr/lib,/usr/include因为这些文件夹是为分发包保留的;/lib,/include因为这些文件夹是为操作系统启动包保留的;这给我留下了usr/local/lib和/usr/local/include。但是我无法决定是否应该将我的文件放在子文件夹中:
usr/local/lib,/usr/local/include将使它们直接在系统中可用,但它们将与文件夹中的所有其他文件保持无序。更令人不安的事实是,如果有人安装另一个与我的头文件同名的共享库,可能会发生未知行为;/usr/local/lib/myAwesomeProject/and /usr/local/include/myAwesomeProject) 中将避免上述行为,但会阻止系统自动检测我的库(据我了解,系统会自动非递归地仅在特定目录中查找包含和库):因此,如果系统查看/usr/local/include,由于子文件夹,我的包含不会被找到!为了帮助您,这是我的系统:
感谢您的任何友好回复!
我最近遇到了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.
我的问题是:
asm("MOV something somethingelse")并假设MOV在这个假设的子集中,那么无论平台如何,代码都是正确的吗?我正在尝试开发一个包含REST API和来自定制服务的OSGi WAB的Karaf.然而,由于一些奇怪的原因,OSGi框架抱怨不满意的能力,osgi.component.
我想知道:
osgi.component捆绑?为什么需要?一些其他信息:
一些代码提供其他信息:
整个错误:
执行命令时出错:在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) 我无法在用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)
哪里:
因此,最终的调用是:
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) 我正在尝试使用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) 我现在正在调整,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*)有什么区别。 …
我正在尝试设置Android手机从服务器接收通知的系统:对于此任务,我们选择了Firebase.虽然应用程序在后台运行,但一切正常:在我从firebase控制台推送消息后,系统托盘上会显示一条消息,并且在用户单击消息后,Intent会向其发送一条额外的数据Activity.
当应用程序已经处于前台时,我的问题是唯一的.该火力点通知是相当清楚的:如果应用程序是在前台,无论哪个类型的邮件服务器发送,OnMessageReceived不会被调用 ...那么,为什么它不能与我的简单的应用程序?一些注意事项可以帮助您解决此问题:
您可以在下面找到所有使用的源代码:
主要活动
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
我开始使用C++,我来自C和Java.我知道在C中强烈建议在源代码的头和变量/类型/函数定义中编写变量/类型/函数声明; 所以,当我开始使用C++进行编码时,我认为也遵循相同的约定.
对我来说不幸的是,在C++中,此规则有几个例外,其中包括:
这让我对文件产生了一些困惑:它们中的大多数是*.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文件中(假设我只编写类当然).
谢谢