小编bli*_*ppy的帖子

什么是代数数据类型的惯用现代C++?

例如,假设您要在C++中实现电子表格Cell.单元格可以是字符串,数字,也可以是空的.忽略其他情况,例如它是一个公式.

在Haskell中,您可能会执行以下操作:

data Cell = CellStr String | CellDbl Double | None
Run Code Online (Sandbox Code Playgroud)

什么被认为是在C++中实现它的当前"最佳实践"?在带有类型指示符的结构中使用union,还是其他什么?

c++ polymorphism variant algebraic-data-types unions

28
推荐指数
2
解决办法
2956
查看次数

"C++ GSL指南"是什么?

去年,Stroustrup就他的GSL(指南支持图书馆)发表了演讲.Micosoft在https://github.com/Microsoft/GSL上实现了一个实现.我的印象是GSL应该建议糟糕的编码风格,并提出改进建议.

为此,我安装了MSFT的GSL并创建了一个C++文件:

#include <stdio.h>
#include <gsl.h>

int main()
{
        int *i = new int;
        puts("hello world");
} 
Run Code Online (Sandbox Code Playgroud)

并使用Makefile构建它:

msft : msft.cc
        g++ -std=gnu++14 -I ../../src/GSL/include $^ -o $@

.PHONY : clean
clean :
        rm -f msft
Run Code Online (Sandbox Code Playgroud)

显然,由"新"引起的代码中存在资源泄漏.

所以现在我很困惑.

  • 什么是GSL应该实际"做"?
  • 我在哪里可以获得警告指南不合规的源代码检查器?Stroustrup似乎暗示它实际上是作为一种工具存在的,但情况是这样吗?

c++ guideline-support-library

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

调试模板扣除失败

以下为什么不工作:

std::string fn(int i)
{
        sleep(i); // number of seconds to sleep for
        std::cout << "Exiting after pausing " << i << " seconds\n";
        return std::to_string(i+1);
}

template<typename T, typename U>
int simult( std::function<T(U)> f, std::vector<U> args)
{
        return 666;
}


int main()
{

        std::vector<int> args { 6, 5, 7 };        
        int r = simult(fn, args);
}
Run Code Online (Sandbox Code Playgroud)

函数simult显然不完整:我只是想在这个阶段尝试编译.这个想法是你提供了一个函数和一个args列表,而simult将使用线程调用将args分段应用于f.

在这个阶段,我只是想弄清楚编译问题.

simult.cc: In function ‘int main()’:
simult.cc:43:25: error: no matching function for call to ‘simult(std::__cxx11::string (&)(int), std::vector<int>&)’
  int r = simult(fn, args); …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

如何在perl6中编写微语法?

我有兴趣编写微语法.这是解析器不理解语言的完整语法的地方,只是语言的一部分; 有点"m4对酸".

这个想法是解析器读入字符并将它们写入输出,直到它在识别关键字时"唤醒",根据语法进行一些处理,然后再次入睡.

我在构建一个时遇到了麻烦,而且似乎没有任何例子.

grammar parsing perl6

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

我怎么知道我使用的是复制还是移动?

我是否理解 C++14 标准库使用移动语义?换句话说,我是否可以确信我在以下程序中使用的是移动而不是副本:

#include <iostream>
#include <string>
#include <vector>

using namespace std::string_literals;

std::vector<std::string> greeting()
{
    std::vector<std::string> vs {"hello"s, "world"s};
    return vs;
}

int main()
{
    std::vector<std::string> s = greeting();
    std::cout << s[0] << " " << s[1] << "\n" ;
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以检查吗?

在下面的例子中怎么样:

#include <iostream>
#include <string>
#include <vector>

using namespace std::string_literals;

class Greeting {
    public:
    std::string first, second;
    Greeting() { first = "hello"s ; second = "world"s ;};
};

Greeting greetingc()
{
    Greeting g;
    return g;
}

int main() …
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics c++14

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

如何编写perl6宏来引用文本?

我想在P6中创建一个宏,将其参数转换为字符串.这是我的宏:

macro tfilter($expr) {
        quasi {
                my $str = Q ({{{$expr}}});
                filter-sub $str;   
        };
}
Run Code Online (Sandbox Code Playgroud)

以下是我称之为:

my @some = tfilter(age < 50);
Run Code Online (Sandbox Code Playgroud)

但是,当我运行程序时,我得到错误:

Unable to parse expression in quote words; couldn't find final '>'
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

macros perl6

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

如何在perl6中访问语法的可选部分?

作为语法的一部分,我有:

        rule EX1        { <EX2> ( '/' <EX2>)*  }
Run Code Online (Sandbox Code Playgroud)

在我的动作课中,我写了:

    method EX1($/) {
            my @ex2s = map *.made,  $/.<EX2>;
            my $ex1 = @ex2s.join('|');
            #say "EX1 making $ex1";
            $/.make($ex1);
    }
Run Code Online (Sandbox Code Playgroud)

所以基本上我只是试图将所有的连接EX2在一起,并'|'在它们之间而不是一个'/'。但是我的代码有些不对劲,因为它只会拾取第一个EX2而不是随后的代码。我如何找出可选的是什么?

perl6 raku

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

为什么这个perl 6语法不起作用?

我不知道perl 5,但我以为我会玩perl 6.我正在尝试它的语法能力,但到目前为止我没有运气.这是我的代码:

    grammar CopybookGrammar {
        token TOP { {say "at TOP" }  <aword><num>}
        token aword { {say "at word" } [a..z]+ }
        token num { {say "at NUM" } [0..9]+ }
}


sub scanit($contents) {
        my $match1 = CopybookGrammar.parse($contents);
        say $match1;
}

scanit "outline1";
Run Code Online (Sandbox Code Playgroud)

输出如下:

at TOP
at word
(Any)
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它似乎与<num>规则不匹配.有任何想法吗?

perl6

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

使用Posix分叉和管道的NativeCall代码不起作用

好吧,所以我是Perl和Perl 6的新手.我以为我会看到我是否可以分叉和管道工作,但到目前为止一直无法做到.这是我的Perl 6代码:

use NativeCall;

# http://www.perlmonks.org/?node_id=989766
our sub c_close(int32) returns int32 is native is symbol('close') { * }
sub pipe(CArray[int32]) returns int32 is native { ... }
our sub c_read(int32, Str is encoded('utf8'), size_t) returns ssize_t is native is symbol('read') { *}
our sub c_write(int32, Str is encoded('utf8'), size_t) returns ssize_t is native is symbol('write') { *}
our sub c_wait(int32 is rw) is native is symbol('wait') { * }
sub c_puts(Str) is native is symbol("puts") { * }
sub …
Run Code Online (Sandbox Code Playgroud)

c posix process perl6 nativecall

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

stm32 NVIC_EnableIRQ() 裸机等效吗?

我正在使用蓝色药丸,并试图找出中断。我有一个中断处理程序:

void __attribute__ ((interrupt ("TIM4_IRQHandler"))) myhandler()
{
    puts("hi");
    TIM4->EGR |= TIM_EGR_UG; // send an update even to reset timer and apply settings
    TIM4->SR &= ~0x01; // clear UIF
    TIM4->DIER |= 0x01; // UIE
}
Run Code Online (Sandbox Code Playgroud)

我设置了定时器:

    RCC_APB1ENR |= RCC_APB1ENR_TIM4EN;
    TIM4->PSC=7999;
    TIM4->ARR=1000;
    TIM4->EGR |= TIM_EGR_UG; // send an update even to reset timer and apply settings
    TIM4->EGR |= (TIM_EGR_TG | TIM_EGR_UG);
    TIM4->DIER |= 0x01; // UIE enable interrupt
    TIM4->CR1 |= TIM_CR1_CEN;
   
Run Code Online (Sandbox Code Playgroud)

我的计时器似乎没有启动。但我认为我并没有真正启用它。我有没有??

我在很多示例代码命令中看到,例如:

NVIC_EnableIRQ(USART1_IRQn);
Run Code Online (Sandbox Code Playgroud)

NVIC_EnableIRQ() 到底发生了什么?

我用谷歌搜索过,但找不到与我的功能类似的实际裸机代码。

我似乎错过了关键的一步。

更新2020-09-23感谢本问题的回答者。技巧是在 NVIC_ISER 寄存器中设置中断号位。正如我在下面指出的,STM32F101xx …

interrupt bare-metal stm32

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

为什么尝试存储指向函数模糊的指针

这是我的代码:

    #include <functional>
    #include <iostream>
    #include<vector>

    using namespace std;

    // vector iterator
    template <class T> class vit
    {
            private:
            //vector<T>::iterator it;
            vector<T> m_v;
            function<bool (T, T)> m_fptr;
            int len, pos;
            public:
            vit(vector<T> &v) { this->m_v = v; len = v.size(); pos = 0;};
           //       it= v.begin(); };
            bool next(T &i) {
                    //if(it == m_v.end()) return false;
                    if(pos==len) return false;
                    //i = *it;
                    i = m_v[pos];
                    //if(idle) { idle = false ; return true; }
                    //it++;
                    pos++;
                    return true;};
            //bool idle …
Run Code Online (Sandbox Code Playgroud)

c++ function c++11

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

让 distcheck 权限被拒绝

在我的 src 目录中,我有neoleo.iswigneoleo_wrap.c通过规则创建的接口文件:

neoleo_wrap.c : $(srcdir)/neoleo.i neoleo_swig.c neoleo_swig.h
        swig -tcl8 $(srcdir)/neoleo.i
Run Code Online (Sandbox Code Playgroud)

当我输入make dist ; make distcheck它时输出:

swig -tcl8 ../../../src/neoleo.i
Unable to open file ../../../src/neoleo_wrap.c: Permission denied
make[2]: *** [Makefile:1313: neoleo_wrap.c] Error 1
Run Code Online (Sandbox Code Playgroud)

我需要做什么来解决这个问题?

我的一些相关部分Makefile.am

EXTRA_DIST = $(srcdir)/neoleo.i
BUILT_SOURCES = getdate.c parse.c parse.h posixtm.c posixtm.h neoleo_wrap.c
nodist_libneoleo_la_SOURCES = neoleo_wrap.c
neoleo_wrap.c : $(srcdir)/neoleo.i neoleo_swig.c neoleo_swig.h
        swig -tcl8 $(srcdir)/neoleo.i
Run Code Online (Sandbox Code Playgroud)

完整Makefile.am可用在这里:

生成文件

autotools

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

为什么不编译 - 使用未声明的类型名称`thread :: scoped`

我正试图让我的头围绕Rust.我的alpha版本为1.

这是我正在尝试编程的问题:我有一个浮动向量.我想异步设置一些线程.每个线程都应该等待向量的每个元素指定的秒数,并返回元素的值加上10.结果需要按输入顺序排列.

当然,这是一个人为的例子,但我想看看我是否可以在转向更复杂的代码之前实现一些简单的东西.到目前为止,这是我的代码:

use std::thread;
use std::old_io::timer;
use std::time::duration::Duration;

fn main() {
    let mut vin = vec![1.4f64, 1.2f64, 1.5f64];
    let mut guards: Vec<thread::scoped> = Vec::with_capacity(3);
    let mut answers: Vec<f64> = Vec::with_capacity(3);

    for i in 0..3 {
        guards[i] = thread::scoped( move || {
            let ms = (1000.0f64 * vin[i]) as i64;
            let d = Duration::milliseconds(ms);
            timer::sleep(d);
            println!("Waited {}", vin[i]);
            answers[i] = 10.0f64 + (vin[i] as f64);
        })};

    for i in 0..3 {guards[i].join(); };

    for i in 0..3 {println!("{}", vin[i]); }

} …
Run Code Online (Sandbox Code Playgroud)

rust

0
推荐指数
1
解决办法
543
查看次数