小编era*_*ros的帖子

如何在.h中转发typedef'd结构

我有Preprocessor.h

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

typedef struct Preprocessor Prepro;

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}
Run Code Online (Sandbox Code Playgroud)

我意识到我必须将声明与定义分开.所以我创建了Preprocessor.c:

#define MAX_FILES 15

struct Preprocessor {
    FILE fileVector[MAX_FILES];
    int currentFile;
};

typedef struct Preprocessor Prepro;
Run Code Online (Sandbox Code Playgroud)

而Preprocessor.h现在是:

void Prepro_init(Prepro* p) {
    (*p).currentFile = 0;
}
Run Code Online (Sandbox Code Playgroud)

显然,这是行不通的,因为Pr..h不知道Prepro类型.我已经尝试过几种组合,但都没有.我找不到解决方案.

c typedef forward-declaration

23
推荐指数
2
解决办法
4万
查看次数

如何在块排序中对数组后缀进行排序

我正在阅读Burrows和Wheeler论文中的块排序算法.这是算法的一个步骤:

假设S = abracadabra

初始化N个字W [0,...,N-1]的数组W,使得W [i]包含排列的字符S'[i,...,i + k-1],以便进行整数比较.这些词同意对k字符串的词典比较.将字符打包成单词有两个好处:它允许使用对齐的内存访问一次比较两个前缀k个字节,并且它允许消除许多慢速情况

(注意:S'是附加S了k个EOF字符的原件,k是适合机器字的字符数(我是32位机器,所以k=4)

EOF = '$'
Run Code Online (Sandbox Code Playgroud)

如我错了请纠正我:

S'= abracadabra$$$$  
W= abra brac raca acad cada adab dabr abra bra$ ra$$ a$$$
Run Code Online (Sandbox Code Playgroud)

然后,算法说你必须S通过索引到数组W来对后缀数组(名为V)进行排序.

我不完全明白你如何通过索引来排序后缀W.例如:在分选的某一点,假设你得到两个后缀,i并且j,你必须对它们进行比较.由于您正在编入索引W,因此您当时要检查4个字符.
假设它们具有相同的前4个字符.然后,您必须检查每个后缀的下4个字符,并通过从每个后缀的第4个位置访问来完成W.这是正确的吗?这种"将字符包装成文字"真的能加快速度吗?

sorting algorithm suffix-array burrows-wheeler-transform

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

如何截断C char*?

就如此容易.我正在使用C++ btw.我已经阅读了cplusplus.com的cstdlib库函数,但是我找不到一个简单的函数.我知道char的长度,我只需要删除它的最后三个字符.我可以使用C++字符串,但这是用于处理使用char*的文件,我不想从字符串转换为C char.

c string char

10
推荐指数
3
解决办法
5万
查看次数

在应用了位移运算符后,为什么我的变量没有改变?

int main()
{
    int i=3;
    (i << 1);
    cout << i; //Prints 3
}
Run Code Online (Sandbox Code Playgroud)

由于左移一位,我预计会得到6分.为什么不起作用?

c++ bitwise-operators

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

使用缓冲区读取未知大小的文件

我正在尝试从文件中读取块,但我遇到了问题.

char* inputBuffer = new char[blockSize]
while (inputFile.read(inputBuffer, blockSize)) {
    int i = inputFile.gcount();
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)

假设我们的块大小是1024 bytes,文件是24,3 KiB.在阅读了第23个街区之后,将会有0,3 KiB阅读.我也想读一下0,3 KiB,实际上我gcount()稍后使用,所以我可以知道有多少缓冲区read(...)修改了(如果它更少).
但是当它访问第24个块时,read(...)返回一个值,使程序不进入循环,显然是因为文件中剩余未读字节的大小小于缓冲区大小.我该怎么办?

c++ file-io buffer

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

这个Valgrind错误的原因是什么?

Valgrind抱怨一个substr调用.

string Message::nextField(string& input) {
    int posSeparator = input.find_first_of(SEPARATOR);
    string temp;
    temp = input.substr(0, posSeparator); //Error points to this line
    input.erase(0, posSeparator + 1);
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

错误:
12个块中的290个字节肯定在丢失记录1中丢失1
该函数的作用基本上是解析输入,返回由SEPARATOR字符分隔的字符串部分.使用下一个定义从另一个类的方法调用此函数:

void doSomething(string input) {
    input.erase(0,2);
    string temp = nextField(input);
    this->room = atoi(temp.c_str());
    temp = input;
    this->money = atoi(temp.c_str());
}
Run Code Online (Sandbox Code Playgroud)

没有别的奇怪或重要的东西可以包含在这里.我使用Eclipse Indigo的Valgrind分析中的Valgrind的默认设置.有任何想法吗?

c++ string valgrind

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

Vim自动缩进私有关键字

我正在学习Vim(我正在使用gVim)
我需要做以下事情:假设我键入了这个:

class MyClass {
    private
}
Run Code Online (Sandbox Code Playgroud)

输入:私有后,结果应为:

class MyClass {
private:
}
Run Code Online (Sandbox Code Playgroud)

如何自动执行该行为?
我试过了

:imap private: <Home><Delete>
Run Code Online (Sandbox Code Playgroud)

但我觉得这根本不是一个优雅的解决方案.我已经安装了Fritz Mehner的c.vim.

c++ vim

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

C++读取缓冲区大小

假设这个文件长2和1/2块,块大小为1024.

aBlock = 1024;
char* buffer = new char[aBlock];
while (!myFile.eof()) {
    myFile.read(buffer,aBlock);
    //do more stuff
}
Run Code Online (Sandbox Code Playgroud)

它第三次读取时,它将写入缓冲区的一半,而另一半则写入无效数据.有没有办法知道它实际写入缓冲区的字节数?

c++ file-io buffer

3
推荐指数
2
解决办法
3209
查看次数

来自glade文件的gtkmm构建器不起作用

我的gtkmm程序不会显示任何窗口.编译工作正常.这些是我在运行时得到的消息:

(process:2312): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.24.1/gobject    
/gtype.c:2706: You forgot to call g_type_init()
(process:2312): GLib-CRITICAL **: g_once_init_leave: assertion 
`initialization_value != 0' failed
(process:2312): GLib-GObject-CRITICAL **: g_object_newv: assertion 
`G_TYPE_IS_OBJECT (object_type)' failed
Run Code Online (Sandbox Code Playgroud)

代码是:

int main(int argc, char** argv) {
    Glib::RefPtr<Gtk::Builder> builder =   
         Gtk::Builder::create_from_file("basic.glade");
    Gtk::Window* pMyWindow = 0;
    builder->get_widget("window1", pMyWindow);
    pMyWindow->show();
}
Run Code Online (Sandbox Code Playgroud)

如果basic.glade是有效文件或不存在则无关紧要.我尝试使用整个路径文件而不是basic.glade.
当我调试它时,我意识到该程序永远不会脱离该构建器的第一行.它就像它一直在运行,所以当我暂停唯一的过程时,要么处于g_once_init_enter_impl()或处于g_slist_find()(由前者调用).所以我没有看到任何窗口(因为它永远不会到达那条pMyWindow->show()线)

c++ glade gtkmm

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

如何在不使用矩阵的情况下对字符串旋转进行排序

我想对字符串的旋转进行排序.
例如:

因为S = 'abaeb',轮换可以'baeba'

我需要获取索引列表S,按字典顺序排序.
在我们的例子中:V = 02413.

答案必须排除琐碎的矩阵行排序.

sorting string algorithm

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