小编Tom*_*a17的帖子

C++模块 - 为什么它们从C++ 0x中删除?他们以后会回来吗?

我刚刚发现关于C++ 0x中模块的旧C++ 0x草案.

我们的想法是通过只编写.cpp文件退出当前的.h/.cpp系统,然后在编译过程中生成模块文件,然后由其他.cpp文件使用.

这看起来非常棒.

但我的问题是:为什么他们从C++ 0x删除它?是因为太多的技术难题?时间不够?你是否认为他们会考虑使用它来获得一个不可思议的C++版本?

c++ standards module language-extension c++11

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

如何使用CSS将表格单元格限制为一行文本?

我有一个用户表,每行包含他们的姓名,电子邮件地址等.对于一些用户来说,这一行是一行文本行,有些是另外两行等等.但是我希望表中的每一行都是一行文本行,截断其余部分.

我看到了这两个问题:

事实上,我的问题与第一个问题完全相似,但由于链接已经死亡,我无法研究它.两个答案都说使用white-space: nowrap.然而,这不起作用,也许我错过了一些东西.

由于我无法向您展示代码,我转载了问题:

<style type="text/css">
td {
    white-space: nowrap;
    overflow: hidden;
    width: 125px;
    height: 25px;
}
</style>

<div style="width:500px">
<table>
    <tr>
        <td>lorem ipsum here... blablablablablablablablablabla</td>
        <td>lorem ipsum here... blablablablablablablablablabla</td>
        <td>lorem ipsum here... blablablablablablablablablabla</td>
        <td>lorem ipsum here... blablablablablablablablablabla</td>
    </tr>
</table>
</div>
Run Code Online (Sandbox Code Playgroud)

没有white-space表是500px宽,文本需要多行.

但是white-space: nowrap让浏览器只是忽略width指令并增加表的宽度,直到所有数据都适合一行.

我究竟做错了什么?

css html-table overflow

36
推荐指数
3
解决办法
7万
查看次数

使用libavformat读取位于内存中的文件

我目前正在尝试阅读从服务器发送的小型视频文件

为了使用libavformat读取文件,您应该调用

av_open_input_file(&avFormatContext, "C:\\path\\to\\video.avi", 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

问题是在这种情况下,文件不在磁盘上,而是在内存中.

我现在正在做的是下载文件,使用临时名称将其写入磁盘,然后av_open_input_file使用临时文件名调用,这不是一个非常干净的解决方案.

事实上我想要的是一个功能,av_open_custom(&avFormatContext, &myReadFunction, &mySeekFunction);但我没有在文档中找到任何.我想这在技术上是可行的,因为文件的名称不能帮助库确定它使用的格式.

那么有这样的函数,还是av_open_input_file的替代品?

c c++ file libavcodec libavformat

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

缓冲区溢出导致安全漏洞的示例

我阅读了许多关于strcpy,memcpy等不安全函数的文章,这些函数在处理外部数据时可能会导致安全问题,例如文件内容或来自套接字的数据.这可能听起来很愚蠢,但我写了一个易受攻击的程序,但我没有设法"破解"它.

我理解缓冲区溢出的问题.以此示例代码为例:

int main() {
   char buffer[1];
   int var = 0;

   scan("%s", &buffer);
   printf("var = 0x%x\n", var);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我执行程序并输入"abcde"时,程序输出0x65646362,它是十六进制+ little-endian中的"edcb".但是我读到你可以修改在堆栈上推送的eip值,以使程序执行一些不需要的代码(例如,在调用system()函数之前).

但是函数的程序集开始如下:

push %ebp
mov %ebp, %esp
and $0xfffffff0, %esp
sub $0x20, %esp
Run Code Online (Sandbox Code Playgroud)

由于%esp的值在函数开始时是随机的,并且由于这个"和",似乎没有可靠的方法将精确值写入推入的eip值.

此外,我读到可以执行你在缓冲区中编写的代码(这里缓冲区只有1个字节长,但实际上它足够大,可以存储一些代码)但是你会给依次提供什么值的eip这样做(考虑到缓冲区的位置是随机的)?

那么为什么开发人员如此担心安全问题(除了程序可能崩溃)?你有一个易受攻击的程序的例子,以及如何"破解"它来执行不需要的代码?我在linux上试过这个,Windows不太安全吗?

c security buffer overflow

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

将SQLite与std :: iostream一起使用

有人知道一个允许SQLite从中加载数据的包装器std::iostream吗?

更明确一点:

std::fstream dataStream("database.sqlite");
...
sqlite3_open(...something using dataStream...);
Run Code Online (Sandbox Code Playgroud)

我想使用流,因为它们的模块性:能够在仍然从网络下载文件时加载文件,即时解压缩数据等.

注册自己的VFS后,应该可以使用sqlite3_open_v2.经过一个小时的实现(记录错误的)函数,我的第一次尝试让我从SQLite得到一个奇怪的"内存不足"错误,我想我会问这里是否有人知道现有的实现,然后花几个小时调试我的.

c++ sqlite iostream

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

用C++读取文件的奇特方法:奇怪的性能问题

在C++中读取文件的常用方法是:

std::ifstream file("file.txt", std::ios::binary | std::ios::ate);
std::vector<char> data(file.tellg());
file.seekg(0, std::ios::beg);
file.read(data.data(), data.size());
Run Code Online (Sandbox Code Playgroud)

读取1.6 MB文件几乎是即时的.

但是最近,我发现了std :: istream_iterator并且想要尝试它以编码一个漂亮的单行方式来读取文件的内容.像这样:

std::vector<char> data(std::istream_iterator<char>(std::ifstream("file.txt", std::ios::binary)), std::istream_iterator<char>());
Run Code Online (Sandbox Code Playgroud)

代码很好,但慢.读取相同的1.6 MB文件大约需要2/3秒.我知道它可能不是读取文件的最佳方式,但为什么它这么慢?

以经典方式读取文件是这样的(我只谈论读取函数):

  • istream包含一个filebuf,其中包含文件中的数据块
  • read函数从filebuf 调用sgetn,它将chars从内部缓冲区逐个复制(无memcpy)到"data"的缓冲区
  • 当完全读取filebuf中的数据时,filebuf从文件中读取下一个块

当您使用istream_iterator读取文件时,它如下所示:

  • 向量调用*iterator来获取下一个char(这只是读取一个变量),将它添加到结尾并增加它自己的大小
  • 如果向量的已分配空间已满(不常发生),则执行重定位
  • 然后它调用++ iterator从流中读取下一个char(operator >> with char参数,当然只调用filebuf的sbumpc函数)
  • 最后它将迭代器与结束迭代器进行比较,这是通过比较两个指针来完成的

我必须承认,第二种方式效率不高,但它比第一种方式慢至少200倍,这怎么可能?

我认为性能杀手是重定位或插入,但我尝试创建一个完整的向量并调用std :: copy,它同样慢.

// also very slow:
std::vector<char> data2(1730608);
std::copy(std::istream_iterator<char>(std::ifstream("file.txt", std::ios::binary)), std::istream_iterator<char>(), data2.begin());
Run Code Online (Sandbox Code Playgroud)

c++ performance iterator file

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

C++ 0x:是否允许元组元组?

我目前正在开发一个有很多模板的类,能够构建元组元组会让它变得容易多了

但我在MSVC++ 2010中尝试了这个简单的代码:

#include <tuple>

void main() {
     auto x = std::make_tuple(std::make_tuple(5, true));
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误.如果我不使用std :: make_tuple但直接使用std :: tuple的构造函数,则会出现同样的问题

它是MSVC的错误还是标准不允许的元组元组?

谢谢

c++ tuples visual-studio visual-c++ c++11

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

在变量初始化期间使用C++ lambda函数

我想很多人都有这样的代码:

int foo;
switch (bar) {
  case SOMETHING: foo = 5;  break;
  case STHNELSE:  foo = 10; break;
  ...
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码有一些缺点:

  • 你很容易忘记"休息"
  • foo变量不是const的,而应该是
  • 它不漂亮

所以我开始想知道是否有办法"改进"这种代码,我得到了这个小小的想法:

const int foo = [&]() -> int {
  switch (bar) {
    case SOMETHING: return 5;
    case STHNELSE:  return 10;
    ...
  }
}();
Run Code Online (Sandbox Code Playgroud)

注意:第一对括号不是强制性的,但MSVC++尚不支持

您可以使用if-else使用相同的技巧,其中三元运算符太复杂,需要通过指针传递的变量进行初始化(如DirectX函数)等.

我的问题是:

  • 我没看到这个代码有什么问题吗?
  • 你觉得它比上面的更好吗?
  • g ++似乎内联函数,但你认为所有编译器都会这样做吗?

编辑:这就是我所说的"DirectX功能"

_xAudio2 = [&]() -> std::shared_ptr<IXAudio2> {
    IXAudio2* ptr = nullptr;
    if (FAILED(XAudio2Create(&ptr, xAudioFlags, XAUDIO2_DEFAULT_PROCESSOR)))
        throw std::runtime_error("XAudio2Create failed");
    return std::shared_ptr<IXAudio2>(ptr, [](IUnknown* ptr) { …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

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

有没有办法不在PHP匿名函数中捕获$ this?

我有一个PHP代码,如下所示:

class A {
    public function __construct() {
        $this->b = new B(function($x) { return $x + 1; });
    }
};

class B {
    public function __construct($dataProcessingFunction) {
        $this->dataProcessingFunction = $dataProcessingFunction;
    }

    public function processData($data) {
        $f = $this->dataProcessingFunction;
        return $f($data);
    }
};
Run Code Online (Sandbox Code Playgroud)

但是有一个问题:我绝对需要在A的析构函数之前调用B的析构函数.你可以看到,这似乎是合理的.B对象不需要任何A,所以应该没有问题.

但是从PHP 5.4.0开始,闭包似乎会自动隐藏$ this.因此,我传递给B并由B存储的lambda函数包含对A的引用.

这意味着A包含指向B的指针,B包含指向A的指针(通过闭包).在这种情况下,PHP文档说只有垃圾收集和随机顺序调用析构函数.猜猜看:B的析构函数总是在A之前被调用.

有没有办法以优雅的方式解决这个问题?

php closures this anonymous-function

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

为什么PHP的iconv需要setlocale?

我正在尝试从UTF-8字符串中删除所有特殊字符和重音符号,如果可能的话将它们转换为等效的ASCII字符.

所以我只是使用这段代码:

$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Run Code Online (Sandbox Code Playgroud)

问题是例如单词"début"变成"dbut"而不是"debut".为了使它工作,我需要添加对setlocale的调用,如下所示:

setlocale(LC_ALL, 'en_US.UTF8');
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么.我认为UTF-8和ASCII总是相同的,无论你使用哪种语言环境.

编辑:我不是说UTF-8等于ASCII,我的意思是UTF-8总是等于UTF-8,ASCII总是等于ASCII

php locale iconv

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

C++ 0x:使用函数迭代元组

我有一个名为的函数_push,它可以处理不同的参数,包括元组,并且应该返回推送元素的数量.

例如,_push(5)应该在堆栈上推送'5'(lua堆栈)并返回1(因为推送了一个值),同时_push(std::make_tuple(5, "hello"))应该按'5'和'hello'并返回2.

我不能简单地替换它_push(5, "hello")因为我有时使用_push(foo())并且我想允许foo()返回一个元组.

无论如何,我无法使它与元组一起工作:

template<typename... Args, int N = sizeof...(Args)>
int _push(const std::tuple<Args...>& t, typename std::enable_if<(N >= 1)>::type* = nullptr) {
 return _push<Args...,N-1>(t) + _push(std::get<N-1>(t));
}

template<typename... Args, int N = sizeof...(Args)>
int _push(const std::tuple<Args...>& t, typename std::enable_if<(N == 0)>::type* = nullptr) {
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

假设你想推动一个tuple<int,bool>.这就是我期望它的工作方式:

  • _push<{int,bool}, 2> 被称为(第一个定义)
  • _push<{int,bool}, 1> 被称为(第一个定义)
  • _push<{int,bool}, 0> 被称为(第二个定义)

但是对于g ++ 4.5(我唯一支持可变参数模板的编译器),我得到一个错误_push<Args...,N-1>(t) …

c++ tuples c++11

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

MSVC++ 2010中C++ 0x的<thread>标头的占位符

我已经在Visual C++ 2010中使用了C++ 0x的一些新功能,比如正则表达式或lambda函数.但有一个重要的特征是缺少:<thread>.

你知道任何代码可以作为替代品吗?

目前我正在使用boost的线程,但它与标准不完全相同,它给了我巨大的编译时间.我也发现只是:: thread,但作为一个业余爱好者,我不想花钱.

我认为代码不会太难(虽然我可能错了)但我不知道Win32 API是否足够.

c++ visual-c++ c++11

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

XMLWriter(PHP)的编码问题

拿这个简单的PHP代码:

$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'utf-8');

$xmlWriter->writeElement('test', $data);

$xmlWriter->endDocument();
$xmlWriter->flush();
Run Code Online (Sandbox Code Playgroud)

XMLWriter类有一个很好的特性:它会将您提供给它的任何数据转换为输出编码.例如,它将转换$data为UTF-8,因为我传入'utf-8'了该startDocument函数.

问题是在我的情况下,内容$data来自数据库,其输出格式为UTF-8,因此已经是UTF-8.XMLWriter 可能认为数据是在ISO-8859-1中并再次转换为UTF-8,我得到了奇怪的符号,我应该得到重音.

目前我使用utf8_decode围绕每一个字符串从数据库中,这意味着我从UTF-8转换为ISO-8859-1,然后XMLWriter的把它放回UTF-8的到来.

这有效但不干净:

$xmlWriter->writeElement('test', utf8_decode($data));
Run Code Online (Sandbox Code Playgroud)

有更清洁的解决方案吗?

编辑:显示一个完整的例子

$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'utf-8');
$xmlWriter->startElement('usersList');

$database = new PDO('mysql:host=localhost;dbname=xxxxx', 'xxxxx', 'xxxxx');
$database->exec('SET CHARACTER SET UTF8');
$database->exec('SET NAMES UTF8');
foreach ($database->query('SELECT name FROM usersList') as $user)
   $xmlWriter->writeElement('user', $user[0]);   // if the user's name is 'hervé' in the database, it will print 'hervé' instead …
Run Code Online (Sandbox Code Playgroud)

php xmlwriter utf-8

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