我正在使用g ++ 4.4.7进行编译(当前不能更高),并使用-std=gnu++0x编译器开关,它应该允许第三行的语法.
typedef std::vector<CI_RecordInfo_Pair> CI_RecordInfo_Vector;
typedef std::vector<std::pair<std::string, CI_RecordInfo_Vector*> > MgrBlks;
MgrBlks mgr_n_blks { {"T2M_NAME", NULL} }; // <--- line 59
Run Code Online (Sandbox Code Playgroud)
但是,编译器抱怨如下:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h: In constructor 'std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[9], _U2 = long int, _T1 = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = CI_RecordInfo_Vector*]':
tom.cpp:59: instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_pair.h:90: error: invalid conversion from 'long int' to 'CI_RecordInfo_Vector*'
Run Code Online (Sandbox Code Playgroud)
我假设"long int"是NULL,并且由于某种原因我无法将其转换为指针.然而在结构图的其他地方,我能够编译类似的东西
foo["X"] = { NULL, "bar", 12 }; // first element is a pointer
Run Code Online (Sandbox Code Playgroud)
有什么不同?
我试图在JButton上放一行两行文字; 例如
+----------+
| READER |
| STOP |
+----------+
Run Code Online (Sandbox Code Playgroud)
但是我无法将它集中在按钮上.我去属性编辑器对JButton,并输入<html><center>READER<br>STOP了文本属性.这导致两个单词相对于彼此居中,但是它们一起看起来仍然朝向按钮面的右侧移动,如:
+----------+
| READER|
| STOP |
+----------+
Run Code Online (Sandbox Code Playgroud)
还有水平和垂直对齐和文本位置属性,我将它们全部设置为CENTER,但这没有任何我能看到的效果.
编辑:这里是一个例子,说明当我<center>完全省略时它是如何布局的,以防任何人对我的描述感到困惑"读者和停止是相互尊重的左对齐,但在按钮上右对齐":
+----------+
| READER|
| STOP |
+----------+
Run Code Online (Sandbox Code Playgroud)
编辑:这是NetBeans生成的代码:
readerStopButton_.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.light"));
readerStopButton_.setFont(new java.awt.Font("Geneva", 0, 12)); // NOI18N
readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
readerStopButton_.setToolTipText("<html><b>Stop</b> button is currently inactive. ");
readerStopButton_.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
readerStopButton_.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
readerStopButton_ActionPerformed(evt);
}
});
operationButtons_.add(readerStopButton_);
Run Code Online (Sandbox Code Playgroud)
编辑:这是按钮对我的看法的屏幕截图.有很多我不知道做布局,所以我很可能省略一些关键信息.但基本上我让NetBeans完成所有工作,除了提供HTML文本.
编辑:打开一个显示所有按钮的替换屏幕截图.请注意,不使用HTML的单词(单字单词)正确对齐,而使用HTML的两个正在搞乱.

我只是难以置信地看着这个序列:
my $line;
$rc = getline($line); # read next line and store in $line
Run Code Online (Sandbox Code Playgroud)
我一直都知道Perl参数是通过值传递的,所以每当我需要传入一个大型结构,或者传入一个变量来进行更新时,我都通过了一个ref.
但是,在perldoc中读取精细打印,我已经知道@_由参数列表中提到的变量的别名组成.读取下一位数据后,getline()返回$ _ [0] = $ data; ,将$数据直接存储到$ line.
我喜欢这个 - 就像在C++中通过引用传递一样.但是,我还没有找到为$ _ [0]分配更有意义的名称的方法.有没有?
我需要维护日志文件的压缩存档.日志文件名是唯一的,归档文件一旦展开,就只是一个包含所有日志文件的目录.
当前的解决方案不能很好地扩展,因为它涉及一个gzip压缩文件.每次添加日志文件时,它们首先解压缩整个存档,添加文件并重新gzip.
是否有Unix归档工具可以添加到压缩归档而无需完全展开和重新压缩?或者,如果正确的参数组合,gzip可以执行此操作吗?
我花了很长时间试图找出以下不能编译的原因:
enum IPC_RC {OK, EOF, ERROR, NEW };
Run Code Online (Sandbox Code Playgroud)
错误消息只表示它不期望看到一个开括号.直到我尝试在我学到的更现代的编译器上编译它:
/usr/include/stdio.h:201:13: note: expanded from macro 'EOF'
#define EOF (-1)
Run Code Online (Sandbox Code Playgroud)
所以我终于被一个宏烧了!:)
我的代码没有#include <stdio.h>(我没有包含.h后缀的任何内容),但显然我包含的内容导致包含<stdio.h>.是否有任何方法(命名空间?)来保护自己,而不是追溯它包含在哪里?
我有一个要在Perl中处理的多GB文件.逐行读取文件需要几分钟; 通过File :: Slurp将其读入标量需要几秒钟.好.现在,处理标量的每个"线"的最有效方法是什么?我想我应该避免修改标量,例如在处理它时切断每个连续的行,以避免重新分配标量.
我试过这个:
use File::Slurp;
my $file_ref = read_file( '/tmp/tom_timings/tom_timings_15998', scalar_ref => 1 ) ;
for my $line (split /\n/, $$file_ref) {
# process line
}
Run Code Online (Sandbox Code Playgroud)
这是分钟:足够但不是很好.有更快的方法吗?(我的记忆比上帝多.)
有一个称为flock()进程可用于获取资源的共享("读取")访问或独占("写入")访问的Unix函数.问题是它会使那些请求独占访问的进程匮乏.这样的请求保持排队,直到没有进程持有共享锁; 同时,新的共享锁请求被"授权"在等待独占锁定的进程之前.
显然,请求共享锁的进程越多,编写器就必须等待没有未完成的共享锁的偶然时间窗口.
我寻求的行为是这样的:一旦作家请求了一个独占锁,后来请求共享锁的读者将排在作者后面.我被告知,这种类型的锁的名称是"编写器更喜欢读/写锁".
有几个职位(这个特别),解决了这个问题,但在线程级.我需要的是一个面向Unix/Linux的解决方案,用于以这种方式协调进程.
更新:我需要通过自动删除锁来解决参与进程在保持锁定时崩溃的可能性.
我喜欢将invokeLater()工作单元发送到AWT EDT 的简单性.有一个类似的机制可以将工作请求发送到后台线程(例如SwingWorker),但据我所知,这些机制没有任何类型的事件排队和调度机制,这是invokeLater()所依赖的.
所以相反,我最终给我的后台线程一个阻塞队列,其他线程向其发送消息,并且该线程实际上运行一个接收循环,阻塞直到消息到达.
事实上,这可能正是人们如何在后台线程中实现类似EDT的行为(或者它会是什么?).另一方面,我喜欢简单地悬挂在那里的线程的简单性,只要碰巧从天空中的一些看不见的事件调度队列发送到它就处理"工作水滴".Java是否提供了创建这种"事件驱动的工作线程"的方法?或者是消息排队正确的方法来执行此操作吗?而且相关的是invokeLater(),消息传递技术有缺点吗?
我正在尝试优化我编写的一些代码来处理应用程序协议的多个层。我自由地使用了该类std::string,并力求简单而不是过早的优化。该应用程序太慢了,并且valgrind和gprof显示,当缓冲区在堆栈中向上移动时,我花费了大量时间来复制构造字符串。
在我看来,将字符从系统缓冲区复制到最低的应用程序缓冲区后,我应该能够避免再复制数据:毕竟,它在向上移动堆栈时不会发生变化。
我的协议格式是一种“传输”,由一个或多个换行符终止的记录组成,每个记录由多个制表符分隔的字段组成,并以特殊标记终止。例如
RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n
Run Code Online (Sandbox Code Playgroud)
这将被组装在一个std::string名为 input_buffer 的单个缓冲区中。
传输的处理包括从缓冲区中提取记录并将其传递到下一层;从记录中提取字段向量并将其传递到下一层;将字段存储到映射中。在每个阶段,当分配新的 std::string 时,都会复制数据。
是否可以将一个 const 字符串从索引分配到 input_buffer 中,并分配一个长度...而不进行任何复制?例如,RECORD 2 从偏移量 26 开始,长度为 24 个字符:
const std:string record (substr(input_buffer, 26), 24 );
Run Code Online (Sandbox Code Playgroud)
我不熟悉字符串对象的内部结构,但它的性能保证似乎意味着某个地方有一个简单的字符序列,并且几乎毫无疑问有一个指向这些字符内存的指针。该指针是否可以初始化为属于另一个字符串的内存?
(我的编译器是 g++ 4.7,但如果这需要 4.8,我也很乐意了解这一点。)
我有一些从无线电广播流中捕获的 .m4a 文件。它们可以使用mpd(*nix 的开源音乐播放守护进程)来播放,但 iTunes 不会打开它们(其他几个应该能够播放 .m4a 文件的音乐播放器也不会打开它们)。当我查看十六进制格式的文件并将其与 iTunes 中的 .m4a 文件进行比较时,发现广播流中的文件没有任何标头信息。
所以我想我应该尝试在文件中添加一些标题信息,看看是否可以让其他播放器播放。
我尝试阅读有关 .m4a 文件格式的技术文档,以了解标头的结构,但它对我来说太复杂了(大部分文档是关于编码的,与此无关) 。从概念上讲,标头似乎相当简单 - 我可以看到 4 字符标签、可变长度数据,并且可能有一些长度代码允许将它们分开。它似乎不包含有关实际音频数据的任何重要数据(例如其总长度),这让我希望通过简单地从 .m4a 文件复制标头并将其添加到这些无标头文件中来解决问题。
不过,我无法手动解析(即逆向工程)标头,以便对此进行实验。有人可以描述如何识别 .m4a 文件前面的完整标头吗?
c++ ×3
java ×2
perl ×2
pointers ×2
unix ×2
append ×1
archive ×1
arguments ×1
compression ×1
constants ×1
file-format ×1
fileslurp ×1
html ×1
interprocess ×1
invokelater ×1
jbutton ×1
linux ×1
locking ×1
m4a ×1
macros ×1
metadata ×1
null ×1
parameters ×1
split ×1
std-pair ×1
string ×1
subroutine ×1
swing ×1
worker ×1