小编Fer*_*eak的帖子

初始化二维std :: vector

所以,我有以下内容:

std::vector< std::vector <int> > fog;
Run Code Online (Sandbox Code Playgroud)

我非常天真地初始化它:

    for(int i=0; i<A_NUMBER; i++)
    {
            std::vector <int> fogRow;
            for(int j=0; j<OTHER_NUMBER; j++)
            {
                 fogRow.push_back( 0 );
            }
            fog.push_back(fogRow);
    }
Run Code Online (Sandbox Code Playgroud)

感觉非常错误......有没有另一种方法来初始化这样的矢量?

c++ vector

97
推荐指数
7
解决办法
19万
查看次数

这是什么 (( ))?

浏览gcc编译器源代码(gcc/c-family/c-pragma.c)时,我看到:

typedef struct GTY(()) align_stack {
  int                  alignment;
  tree                 id;
  struct align_stack * prev;
} align_stack;
Run Code Online (Sandbox Code Playgroud)

而且无论我有多少C编程年,我(())都知道这些:我还完全不知道.有人可以解释一下他们的意思吗?谷歌似乎没有找到它.

c c++

90
推荐指数
2
解决办法
4246
查看次数

编译器优化未使用字符串的行为不一致

我很好奇为什么下面的代码:

#include <string>
int main()
{
    std::string a = "ABCDEFGHIJKLMNO";
}
Run Code Online (Sandbox Code Playgroud)

当使用编译时,将-O3产生以下代码:

main:                                   # @main
    xor     eax, eax
    ret
Run Code Online (Sandbox Code Playgroud)

(我完全理解不需要多余的,a因此编译器可以从生成的代码中完全忽略它)

但是以下程序:

#include <string>
int main()
{
    std::string a = "ABCDEFGHIJKLMNOP"; // <-- !!! One Extra P 
}
Run Code Online (Sandbox Code Playgroud)

产量:

main:                                   # @main
        push    rbx
        sub     rsp, 48
        lea     rbx, [rsp + 32]
        mov     qword ptr [rsp + 16], rbx
        mov     qword ptr [rsp + 8], 16
        lea     rdi, [rsp + 16]
        lea     rsi, [rsp + 8]
        xor …
Run Code Online (Sandbox Code Playgroud)

c++ gcc compilation clang compiler-optimization

69
推荐指数
2
解决办法
2894
查看次数

CMake检查是否存在本地文件

在我的CMake脚本中,我想看看我的系统上是否有文件,如果有文件,请使用默认文件.这是代码:

find_file(
          ${project_name}_${customer}_config 
          ${ROOT}/configuration/${customer}/configuration.${project_name}.xml
)

if(NOT ${${project_name}_${customer}_config} STREQUAL
   ${project_name}_${customer}_config-NOTFOUND )
        configure_file(${ROOT}/configuration/${customer}/configuration.${project_name}.xml
                       ${CMAKE_CURRENT_BINARY_DIR}/conf/configuration.xml)
else()
    configure_file(${FAPP_ROOT}/configuration/Default/configuration.${project_name}.xml
                   ${CMAKE_CURRENT_BINARY_DIR}/conf/configuration.xml)
endif()
Run Code Online (Sandbox Code Playgroud)

但似乎这不起作用.

检查CMake中是否存在文件的正确方法是什么?

file cmake file-exists

56
推荐指数
4
解决办法
5万
查看次数

C++ cout自动分隔符

我想知道是否有std::cout自动在打印序列之间插入一些预定义值的方法.

例如:

std::cout << 2 << 3 << 33 << 45 << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出

233345
Run Code Online (Sandbox Code Playgroud)

我希望它输出

2 3 33 45
Run Code Online (Sandbox Code Playgroud)

我知道,这很容易:

std::cout << 2 << " " << 3 <<  " " << 33 <<  " " << 45 << std::endl;
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有办法实现自动化,例如:

std::cout << set_some_separator(" ") << 2 << 3 << 33 << 45 << std::endl;
Run Code Online (Sandbox Code Playgroud)

任何人都知道这样的事情可能吗?

c++

46
推荐指数
5
解决办法
5576
查看次数

C++ getter应该返回什么?

C++ getter方法的最佳实践是什么,它应该返回一个非平凡类型,但是类型为class或struct的成员.

  1. 按值返回,例如: MyType MyClass::getMyType() { return mMyType; }
  2. 通过const引用返回: const MyType& MyClass::getMyType() { return mMyType; }
  3. 按地址返回: MyType* MyClass::getMyType() { return &mMyType; }

哪里

class MyType { /* ... */ };

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

我特别担心这种方法的以下用法.你能否详细说明这可能会如何影响复制对象,以及悬挂引用和疯狂指针的危险,如果function()想保存它以供进一步使用.

MyType* savedPointer;

SomeType function(MyType* pointer) { savedPointer = pointer; };
Run Code Online (Sandbox Code Playgroud)

一个.有效期为1和2.

{
  MyType t = myClass.getMyType();
  function(&t);
}

// is savedPointer still valid here?
Run Code Online (Sandbox Code Playgroud)

湾 有效期为1和2.

{
  const MyType& t = myClass.getMyType();
  function(&t);
}

// is savedPointer still …
Run Code Online (Sandbox Code Playgroud)

c++ getter

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

C硬编码数组作为memcpy参数

我想传入一个硬编码的char数组作为sourcememcpy 的参数...像这样:

memcpy(dest, {0xE3,0x83,0xA2,0xA4,0xCB} ,5);
Run Code Online (Sandbox Code Playgroud)

使用clang编译时会出现以下错误:

cccc.c:28:14: error: expected expression
Run Code Online (Sandbox Code Playgroud)

如果我修改它(参见额外的括号):

memcpy(dest,({0xAB,0x13,0xF9,0x93,0xB5}),5);
Run Code Online (Sandbox Code Playgroud)

clang给出的错误是:

cccc.c:26:14: warning: incompatible integer to pointer
              conversion passing 'int' to parameter of
              type 'const void *' [-Wint-conversion]

cccc.c:28:40: error: expected ';' after expression
memcpy(c+110,({0xAB,0x13,0xF9,0x93,0xB5}),5);
Run Code Online (Sandbox Code Playgroud)

那么,问题是:

如何传入硬编码数组作为memcpy(http://www.cplusplus.com/reference/cstring/memcpy/)的源参数

我试过了:

(void*)(&{0xAB,0x13,0xF9,0x93,0xB5}[0])  - syntax error
{0xAB,0x13,0xF9,0x93,0xB5}               - syntax error
({0xAB,0x13,0xF9,0x93,0xB5})             - see above
(char[])({0xE3,0x83,0xA2,0xA4,0xCB})     - error: cast to incomplete type 'char []' (clang)
Run Code Online (Sandbox Code Playgroud)

和一些更疯狂的组合我很惭愧写在这里......

请记住:我希望创建一个新的变量来保存阵列.

c arrays hardcoded

38
推荐指数
4
解决办法
4157
查看次数

使用libavcodec在mpegts容器中生成H264帧

我非常感谢以下问题的一些帮助:

我有一个带摄像头的小工具,生成H264压缩视频帧,这些帧正在发送到我的应用程序.这些框架不在容器中,只是原始数据.

我想使用ffmpeg和libav函数来创建一个视频文件,以后可以使用.

如果我解码帧,然后编码它们,一切正常,我得到一个有效的视频文件.(解码/编码步骤是通常的libav命令,这里没什么花哨的,我把它们从万能的互联网上取下来,它们坚如磐石)......但是,我通过解码和编码浪费了大量时间,所以我想跳过此步骤并直接将帧放在输出流中.现在,问题来了.

这是我提出的用于生成编码的代码:

AVFrame* picture;

avpicture_fill((AVPicture*) picture, (uint8_t*)frameData, 
                 codecContext->pix_fmt, codecContext->width,
                 codecContext->height);
int outSize = avcodec_encode_video(codecContext, videoOutBuf, 
                 sizeof(videoOutBuf), picture);
if (outSize > 0) 
{
    AVPacket packet;
    av_init_packet(&packet);
    packet.pts = av_rescale_q(codecContext->coded_frame->pts,
                  codecContext->time_base, videoStream->time_base);
    if (codecContext->coded_frame->key_frame) 
    {
        packet.flags |= PKT_FLAG_KEY;
    }
    packet.stream_index = videoStream->index;
    packet.data =  videoOutBuf;
    packet.size =  outSize;

    av_interleaved_write_frame(context, &packet);
    put_flush_packet(context->pb);
}
Run Code Online (Sandbox Code Playgroud)

变量的位置如下:

frameData是来自摄像机的解码帧数据,它是在前一步骤中解码的,videoOutBuf是用于保存数据的普通uint8_t缓冲区

我修改了应用程序以便不解码帧,而只是简单地传递数据:

    AVPacket packet;
    av_init_packet(&packet);

    packet.stream_index = videoStream->index;
    packet.data = (uint8_t*)frameData;
    packet.size = currentFrameSize;

    av_interleaved_write_frame(context, &packet);
    put_flush_packet(context->pb);
Run Code Online (Sandbox Code Playgroud)

哪里

frameData是原始的H264帧,currentFrameSize是原始H264帧的大小,即.我从每个框架的小工具中获得的字节数.

然后,应用程序突然无法正常工作,生成的视频无法播放.这很明显,因为我没有为数据包设置正确的PTS.我做的是以下(我很绝望,你可以从这种方法看到:)) …

c h.264 libavcodec libavformat

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

postgres:在数据库中创建表

我试图在postgres中创建一个表,但它最终在错误的数据库中.

这是我的工作:在我的sql脚本中,我最初创建了一个用户和一个数据库,然后是一个表.代码将解释更多:

drop database if exists sinfonifry;
drop role if exists sinfonifry;

-- create the requested sinfonifry user

create user sinfonifry createdb createuser password 'some_password';

-- create a sinfonifry database
create database sinfonifry owner sinfonifry;

DROP TABLE if exists sinf01_host;

CREATE TABLE sinf01_host
(
  host_id bigserial NOT NULL, -- The primary key
  host_ip inet NOT NULL, -- The IP of the host
  host_name character varying(255) NOT NULL, -- The name of the host
  CONSTRAINT "PK_host" PRIMARY KEY (host_id )
) …
Run Code Online (Sandbox Code Playgroud)

postgresql create-table

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

C++(14)和手动内存管理

我刚收到一条评论,比如说

问题是手动内存管理.delete在用户代码中没有位置,从C++ 14开始,也没有new

有人可以解释一下为什么吗?

c++ memory-management c++14

30
推荐指数
1
解决办法
3552
查看次数