我正在使用gnu Make 3.82并且有一个恼人的问题.
我有一个规则设置目录之间的依赖关系.
OBJDIR=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
Run Code Online (Sandbox Code Playgroud)
为此,obj目录必须存在.我想将mkdir目录作为先决条件
$(objdir)/%.o: %.C $(objdir)
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
$(objdir):
mkdir $(objdir)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它在目录存在时失败然后make停止我尝试shell
if [ ! -d $(objdir) ] ; then \
mkdir $(objdir) \
fi
Run Code Online (Sandbox Code Playgroud)
但显然我有些不对劲.这样做的最佳方法是什么?
在当前的g ++中,我通常包含所有模板化函数,它们将模板参数作为参数,因为必须为每个实例编译它们.
template<typename T>
class A {
public:
void f() { ... }
};
Run Code Online (Sandbox Code Playgroud)
所以在不同的来源中,我会写:
#include <A.hh>
A<int> a1;
a1.f();
A<double> a2;
a2.f();
Run Code Online (Sandbox Code Playgroud)
有时,当我一直急于不内联大方法时,我已经手动指定了哪些类将在源文件中使用,但它确实令人讨厌:
template<typename T>
A::A() { ... }
template<typename T>
void A::f() { ... }
A<int>; // manually trigger code generation for int and double
A<double>;
Run Code Online (Sandbox Code Playgroud)
显然,不同的IDE和编译器都有支持这一点的机制.是否有任何标准强制要求,和/或g ++是否支持这样的事情?
我正在为Java中的数据结构编写一组可视化接口.我们的想法是这些类应该是算法的高性能实现,但是使用嵌入式钩子,以便可以交互地显示算法.
这样做有很多原因,但是如果你接受这个面值的请求,我想在算法中嵌入调用来识别刚刚完成的特定子部分.例如,排序算法的一次通过.
我希望图书馆既高效又允许这样做.在C++中,我会插入两个不同的模板或使用条件编译,并且可以合理地生成两个版本的代码.有没有办法在Java中实现这一点?我希望别人可以拿出一个,因为我做不到.
新闻快讯.我试过这个实际的代码.
对于n = 100,000,插入排序大约需要9800毫秒,其中VISUALIZE作为静态变量但不是最终的,而大约3100表示已注释掉.因此性能损失是不可接受的.
通过可视化为静态最终,优化器确实检测到它并将其删除,但鉴于它是最终的,我可以用它做什么?我不能动态打开和关闭可视化!
public class TestSort {
private static boolean VISUALIZE = false;
private static ArrayObserver ao;
public static void insertionSort(int[] x) {
for (int i = 1; i < x.length; i++) {
int temp = x[i];
int j = i - 1;
if (x[j] > temp) {
do {
x[j+1] = x[j];
/* if (VISUALIZE) {
ao.compare(i-1, i);
ao.copy(i-1, i);
}*/
} while (--j >= 0 && x[j] > temp);
x[j+1] = temp;
} …Run Code Online (Sandbox Code Playgroud) 我有一台装有mingw的Windows8计算机,它在c:\ mingw中安装了Eclipse可以成功编译程序,但是它认为行包含的错误在编译时可以正常进行。Eclipse找不到库本身。
当我第一次使用CDT组件在eclipse中构建项目时,它会在使用对象的每个#include和每一行上显示错误。
例:
#include <iostream>
using namespace std;
int main() {
cout << "hello\n";
}
Run Code Online (Sandbox Code Playgroud)
上面的代码显示了include,using和cout <<行上的错误。我可以通过以下方法消除错误:project-> properties C ++ / General Preprocessor Include然后在providers选项卡上,我可以检查“ CDT Build output parser”并按照下面的第一个答案所述修复错误,即向上检查。但这仅适用于该项目。我每次都要这样做。如何在每次构建新项目而无需重新配置每个项目时让Eclipse仅仅接受标准C ++?
通过进入项目设置并添加目录,我已经能够停止包含中的错误:
c:/ bin / mingw / lib / gcc / include ...
这样就使使用对象的错误仍然存在。
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
string s = "this is a test.";
regex e("est");
smatch m;
Run Code Online (Sandbox Code Playgroud)
带有正则表达式的行仍显示错误:即使代码已编译且可识别正则表达式包含,“无法解析正则表达式类型”。
此外,在安装了Mingw的运行Windows 8.1的另一台计算机上,eclipse不会调试。是否有一些有关如何将Eclipse CDT连接到库的文档?
我能够通过记录 onselect 并每次存储开头和结尾来从文本区域中获取突出显示的文本。然后,当我单击按钮时,我自己构建子字符串。是否有更简单的方法来简单地查询选择?
我有点期待 html5 dom 中会有用于所有这些事情的方法,例如:
textarea.getSelectedStart() textarea.getSelectedEnd(); textArea.setSelected(开始,结束);
另外,是否有一种方法可以以编程方式取消选择文本区域中的文本?
我正在根据下面的第一个解决方案输入代码。这种方法可行,但有一个奇怪的问题:
<script language=javascript>
function replaceCLOZE(code, questionType) {
var v = code.value;
var s = code.selectionStart;
var e = code.selectionEnd;
var t = v.substr(s, e-s);
var rep = "{:" + questionType + ":="+t+"}";
code.value = v.substr(0,s) + rep + v.substr(e,v.length-e+1);
}
function shortAnswer(code) {
replaceCLOZE(code, "SA");
}
function shortAnswerCaseSensitive(code) {
replaceCLOZE(code, "SAC");
}
function multipleChoice(code) {
replaceCLOZE(code, "MC");
}
Run Code Online (Sandbox Code Playgroud)
文本区域实际上具有属性 code.selectionStart 和 code.selectionEnd。但上面的代码现在可以工作,将屏幕上突出显示的文本设置为文本区域中的第一个单词。请注意,selectionStart 仍然是正确的,但 Firefox 中实际突出显示的内容是错误的。
在 Chrome 中它工作得很好。也许这只是 Firefox …
这是一个以下问题:
由于mercurial具有处理压缩文件的能力,因此它可能能够处理word文档.但如果它嵌入了改变文本,那么这个词就会爆炸.
在mercurial中,有没有办法合并文件,或报告它需要手动合并而不实际获取文件并在其中注入坏字符?
在C ++中,模块被标准化以解决#include膨胀等问题。C ++中的编译器必须解析太多。
而且,由于C ++可以高效地内联存储数据,因此即使调用者也必须知道对象的内存布局。
即将发布的模块标准是否解决了这个问题?
例:
class GLWin {
private:
GLFWwindow* win;
glm::mat4 projection;
...
};
Run Code Online (Sandbox Code Playgroud)
包含指向内部实现的指针的对象可以通过空声明来解耦,即:
GLFWwindow类;
但是,如果出于性能考虑,我们将mat4对象包含在窗口内,那么我们需要知道大小(当前意味着包含定义),并引入一个头文件,该头文件通常由于级联包括而非常大。模块中是否有任何机制可以隐藏细节并允许为对象保留正确的空间,同时又使它像指针一样不透明?
为了不用记住删除,我们使用unique_ptr来管理内存。我们的印象是我们可以在内存中写入和读取,只是删除取决于智能指针。但是,以下代码在 i=7220 上崩溃并出现段错误。
怎么了?
#include <memory>
using namespace std;
int main() {
const uint32_t n = 40000000;
uint64_t*p = new uint64_t[n]; // this works, but we have to delete the memory or leak
for (int i = 0; i < n; i++)
p[i] = i;
unique_ptr<uint64_t> mem = make_unique<uint64_t>(n);
uint64_t* p1 = mem.get();
for (int i = 0; i < n; i++) // this crashes at i=7220
p1[i] = i;
return 0;
}
Run Code Online (Sandbox Code Playgroud) Java 有 StringBuilder 用于生成不断增长的字符串,但不幸的是,大多数 API 使用 String,因此一切都需要转换,并伴随着复制开销。
在编译器上,假设有一个 char 数组。是否有任何类可以提供只读 StringView (如 C++17 string_view)?如果没有,我可以轻松地编写诸如类之类的内容,但问题是由于其他所有内容都处理字符串,因此会失去一些好处。这个想法是提供一些看起来像字符串的东西,其中构造函数只是:
StringView(char[] bigBuffer, int start, int len) {}
Run Code Online (Sandbox Code Playgroud)
并在任何需要使用字符串的地方使用该类。
每个操作系统都有不同的方案来更改键盘或鼠标的语言.Java中是否有任何API支持以编程方式更改语言?
我想要的是一个带有两个JTextField对象的翻译器.如果我输入一个,我会自动输入英文,如果我输入另一个,我想自动切换到另一种语言.如果该语言是日语或中文,我希望操作系统在进入该组件时自动切换到该语言,而无需每次都手动切换.下面是一些使用Locale和InputContext的示例代码.它表明它成功设置了上下文,但我输入并且英语出来了.与我手动切换到日语相比,键入将导致日语字符.我做错了什么?
public class TestLocale extends JFrame {
public TestLocale() {
super("TestLocale");
setSize(600,600);
JTextField a = new JTextField("English");
JTextField b = new JTextField("Japanese");
Locale loc =Locale.JAPANESE;
System.out.println("Script: " + loc.getScript());
System.out.println("Language: " + loc.getLanguage());
b.setLocale(loc);
b.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
InputContext c = InputContext.getInstance();
boolean b = c.selectInputMethod(Locale.JAPANESE);
System.out.println("Trying to request Japanese: " + b);
}
} );
add(BorderLayout.NORTH, a);
add(BorderLayout.SOUTH, b);
setVisible(true);
}
public static void main(String[] a) {
TestLocale t = new TestLocale();
}
} …Run Code Online (Sandbox Code Playgroud) c++ ×3
java ×3
c++-modules ×1
c++11 ×1
c++20 ×1
compile-time ×1
directory ×1
eclipse ×1
eclipse-cdt ×1
g++ ×1
html ×1
immutability ×1
javascript ×1
jtextfield ×1
locale ×1
makefile ×1
mercurial ×1
merge ×1
ms-word ×1
onselect ×1
performance ×1
string ×1
swing ×1
textarea ×1
unique-ptr ×1