我有一些适用于Xcode 4.5和LLVM 3.0的模板代码,但是使用VS 2010 Express C++工具链(v 10.0.30319.1)失败了.
我正在使用我无法控制的第三方API.它为我的代码提供的值为黑盒'blob',只能由API函数解释:
// API_Secret is a black-box encapsulation of a floating-point number or a boolean value.
// It is provided by a third-party API, with associated access functions.
// For all intents and purposes, it's a complete black box.
// This enum represents the internal 'type' of a secret value.
enum API_SecretTypeEnum {
API_Number,
API_Boolean,
};
// Other API declarations:
API_SecretTypeEnum API_GetType(const API_Secret &value);
double API_AsNumber(const API_Secret &value);
bool API_AsBoolean(const API_Secret &value);
// my …Run Code Online (Sandbox Code Playgroud) 你能帮我理解GTest和struct packing的内容吗?
问题似乎与在GTest中作为值参数化测试中的值使用时如何打包结构有关.采用直接的方法为每个值实例化一个结构会导致与未初始化值相关的valgrind错误.
这是有关的代码:
#include <gtest/gtest.h>
struct TestItem
{
const char * aString;
int anInt0;
int anInt1;
int anInt2;
};
class TestBase : public ::testing::Test, public ::testing::WithParamInterface<TestItem> {};
TEST_P(TestBase, TestAtoi)
{
TestItem item = GetParam();
std::cout << sizeof(TestItem) << std::endl;
ASSERT_FALSE(0); // actual test doesn't matter
}
INSTANTIATE_TEST_CASE_P(
TestBaseInstantiation,
TestBase,
::testing::Values(
TestItem { "0", 0, 0, 0 }
));
Run Code Online (Sandbox Code Playgroud)
当编译和链接时(我使用cmake构建GTest):
g++ gtest_valgrind.c -o gtest_valgrind -I gtest-1.7.0/include -L gtest-1.7.0/build -lgtest -lpthread -lgtest_main -std=c++11
Run Code Online (Sandbox Code Playgroud)
然后执行:
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./gtest_valgrind
Run Code Online (Sandbox Code Playgroud)
生成以下输出:
==17290== …Run Code Online (Sandbox Code Playgroud) 我正在Linux上编写一些入门级的swift代码作为学习练习.
作为一般任务,我希望在我自己的代码中使用第三方Swift模块.我们称这个模块为"Foo".Foo模块有一个Package.swift文件,swift build在该目录中运行后,它已经创建.build/debug/libFoo.so.
现在我想做两件事:
import Foo在REPL中.我觉得这两个任务都是相关的,所以现在它们都是同一个问题.
对于1.,我不明白包裹如何被REPL"找到".我试过,swift -F .build/debug -framework Foo但我得到"没有这样的模块"错误.我也试过swift -I .build/debug了同样的结果.
对于2,我检查swiftc --help并有-L和-l可选项,但我没能找到使用这些正确的方法:
$ swiftc main.swift -L ../foo.git/.build/debug -llibFoo.so
main.swift:1:8: error: no such module 'Foo'
import Foo
^
Run Code Online (Sandbox Code Playgroud)
我正在使用/ Swift 2.2或3.0(使用swim而不是swift build2.2,因为没有swift build- 但它产生相同的输出,我相信).
请注意,我理解swift build可以自动下载和构建第三方模块,但我想知道如何合并磁盘模块,因为它们可能是我自己的工作进度模块.
编辑:我尝试了一个基于发现的swift3的小实验,你可以使用本地路径作为url:Package dependencies:列表中的参数,至少对于本地开发.
我创建了一个目录Bar并Bar/Package.swift:
import PackageDescription
let package = Package(name: …Run Code Online (Sandbox Code Playgroud) 我正在使用pytest-3.7.1,它对日志记录有很好的支持,包括在测试过程中实时记录到stdout。我--log-cli-level=DEBUG经常将所有调试级别的日志记录转储到控制台。
我遇到的问题是--log-cli-level=DEBUG打开测试程序中所有模块的调试日志记录,包括第三方依赖项,并且日志中充满了很多无用的输出。
Python的日志记录模块可以设置每个模块的日志记录级别。这将启用选择性日志记录-例如,在普通的Python程序中,我可以仅对自己的一个或两个模块打开调试,并将日志输出限制为仅这些模块,或者为每个模块设置不同的日志级别。这样可以关闭嘈杂库的调试级别日志记录。
因此,我想做的就是将相同的概念应用于pytest的日志记录-即从命令行为特定的非root日志记录器指定日志记录级别。例如,如果我有一个名为的模块,test_foo.py那么我正在寻找一种从命令行设置该模块的日志级别的方法。
我准备在必要时自行拥有(我知道如何向pytest添加自定义参数),但是在我这样做之前,我只是想确保没有解决方案。有人知道吗?
Docker 支持一个--cpus选项,限制容器使用一定比例的主机计算资源。例如,--cpus 2.5将分配相当于主机CPU能力大约两倍半的计算资源。这种分配似乎有点“逻辑”而不是物理,因为容器运行八个进程,但往往--cpus 1.0在单独的 CPU 上运行每个进程,但限制在大约 12.5%。我想这很好。
问题是我无法找到一种方法让受限容器内的进程确定它有多少个可用的等效 CPU。例如,这对于构建过程特别有用,make -j <n>但是什么是n?无论选项值如何,常用的nproc输出都是主机上的 CPU 数量--cpus,这使得它不适合,因为它太大了。的值/proc/cpuinfo也是主机的视图(与 相同nproc)。
有没有办法让包含的进程确定可用的 CPU 数量?
举个例子,在我的 16 核主机上,我想仅使用docker run ... --cpus 4.0 ...并make -j <something>运行4 个进程,而不是 16 个进程。
FWIW,我将 Docker Executor 与 GitLab-CI 和 一起使用gitlab-runner,这就是为什么--cpuset-cpus=没有真正帮助的原因。执行器应该能够为每个作业在所有主机的 CPU 上分配一定数量的 CPU,而不是特定的子集。虽然我可以为每个显式的四个 CPU 集创建单独的执行程序,但我不知道有什么明显的方法可以将gitlab-runner这些执行程序以平衡的方式分配给传入的作业,而且我想避免将责任推到作业本身上,也许使用标签来选择执行器,因为这需要每个作业对运行器了解太多。
我确实考虑过像NUM_CPUS=4中那样设置相应的环境变量,以便构建作业可以找出要使用的环境变量,但是只能为所有跑步者设置变量,而不是单个跑步者:gitlab-runnerconfig.tomlmake …
我在理解如何使用bjam指定和调用目标时遇到问题.通过这个,我的意思是我想为bjam提供命令行目标来构建(实际上来自Makefile),这些目标对应于构建过程的不同方面,而不仅仅是运行整个事物.
例如,现在当我键入'bjam'时,它会关闭并构建一个python扩展,运行一个单元测试文件,并创建一个单独的'main'可执行文件.我有自定义规则执行每一步,我的Jamfile只是按顺序列出它们:
project-name = example ;
sources =
$(project-name).cpp
$(project-name)_ext.cpp
;
build-ext $(project-name) : $(sources) ;
build-main $(project-name) ;
Run Code Online (Sandbox Code Playgroud)
在我的Jamroot(上一个目录)中我定义了这些规则,这里是不完整的文件:
# A rule to simplify declaration of extension tests:
rule run-test ( test-name : sources + )
{
import testing ;
testing.make-test run-pyd : $(sources) : : $(test-name) ;
}
# A rule to further simply declaration of extension tests:
rule run-ext-test ( project-name )
{
run-test $(project-name) : $(project-name)_ext test_$(project-name)_ext.py ;
}
# A rule to simplify …Run Code Online (Sandbox Code Playgroud) 我有一个函数,它需要一个std::vector双精度,并将它们复制到另一个向量,但在一个特定的偏移量(假设有足够的空间):
void copy_stuff(const std::vector<double> & data,
std::vector<double> & dest,
size_t dest_offset) {
std::copy(data.begin(), data.end(), dest.begin() + dest_offset);
}
Run Code Online (Sandbox Code Playgroud)
这会导致 C++11 clang 编译器-Weverything警告以+ dest_offset零件为中心:
隐式转换改变符号:'size_t'(又名'unsigned long')到'difference_type'(又名'long')。
我不确定应该如何转换表达式dest.begin() + dest_offset以消除此警告。将结果转换为 adouble *不会编译:
std::copy(data, data + data_size, static_cast<double *>(dest.begin() + dest_offset));
Run Code Online (Sandbox Code Playgroud)
无法从类型“std::__1::__wrap_iter”转换为指针类型“double *”。
我曾考虑使用向量索引,然后获取地址:
std::copy(data, data + data_size, &dest[dest_offset]);
Run Code Online (Sandbox Code Playgroud)
这似乎消除了这种情况下的警告,但如果我尝试对源向量使用相同的模式,即与std::copy. 例如:
static void copy_stuff_differently(const std::vector<double> & data,
std::vector<double> & dest,
size_t offset) {
std::copy(data.begin() + offset, data.end(), dest.begin());
}
Run Code Online (Sandbox Code Playgroud)
对+ …
我想知道如何创建两个相互交互的封装类型,而不会将内部实现暴露给其他模块。
举个例子,考虑我的两个模块,Vector.hs和Matrix.hs,包装Linear.V4(一个 4 元素向量)和Linear.M44(一个 4x4 元素矩阵)。我希望编写一个函数,将 aMatrix乘以 a Vector,返回 a Vector,并使用包装的数据类型来执行操作。
在这个例子中,Vector.hs我有:
-- Vector.hs
module Vector (Vector, vector) where
import Linear (V4 (V4))
newtype Vector = Vector (V4 Double) deriving (Eq, Show, Read)
vector :: (Double, Double, Double, Double) -> Vector
vector (x, y, z, w) = Vector (V4 x y z w)
Run Code Online (Sandbox Code Playgroud)
请注意,我仅导出新类型和工厂函数 -Vector未导出数据构造函数。据我了解,这隐藏了 的内部实现Vector(即它实际上是一个V4)。
在Matrix.hs我有类似的东西:
-- …Run Code Online (Sandbox Code Playgroud) 我正在试用 GitLab 的“终极”版本,特别是合并结果管道功能以及相关的合并列车功能。
我为我的项目启用了合并结果管道和合并列车,合并方法设置为合并提交,并且.gitlab-ci.yml根据文档,我的规则有以下规则:
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
Run Code Online (Sandbox Code Playgroud)
这一切似乎都很顺利,但有一件事我不明白。
想象一下,只有一个打开的合并请求,并且main自创建相关分支以来目标分支上没有发生任何更改。当我推送到 MR 分支时,我期望运行“合并结果”管道,据我了解,这是目标分支与我的 MR 分支的抢先合并。管道成功,MR 现在有资格添加到合并列车中。
如果我确实将其添加到合并列车中,它会再次构建,我必须等待它完成才能合并。为什么这是必要的?它已经构建了合并的结果,此后没有任何变化,这是可以检测到的,那么为什么效率低下呢?
这导致我的团队希望使用“立即合并”按钮而不是添加到合并列车,以避免多余的管道(以及由此产生的等待实际合并发生的情况)。我不希望这成为一种习惯,因为它违背了这两个功能的目的。
以前我们只使用仅 FF 的分支管道,尽管不断重新设置或合并目标很痛苦,但至少如果构建是绿色的并且没有任何更改,则合并可以立即发生。
也许我的配置遗漏了一些东西?
如果我使用特定的帮助字符串创建子解析器,则用户运行时不会显示此字符串myprog command --help:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help="sub-command help")
parser_command = subparsers.add_parser("command", help="Issue a command")
parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
顶级帮助显示了此command子命令,并附有描述“发出命令”:
$ python prog.py --help
usage: prog.py [-h] {command} ...
positional arguments:
{command} sub-command help
command Issue a command
optional arguments:
-h, --help show this help message and exit
Run Code Online (Sandbox Code Playgroud)
但是子命令的帮助没有显示这个描述:
$ python prog.py command --help
usage: prog.py command [-h]
optional arguments:
-h, --help show this help message and exit
Run Code Online (Sandbox Code Playgroud)
我期望的是子命令的帮助打印出子命令的实际用途。即我希望在输出中的某处看到文本“发出命令”到python prog.py command --help.
有没有办法在子命令的帮助输出中包含此文本?是否有另一个子解析器属性可用于提供子命令的描述?
c++ ×3
python ×2
vector ×2
argparse ×1
bjam ×1
boost ×1
boost-build ×1
boost-python ×1
c++11 ×1
casting ×1
docker ×1
enums ×1
environment ×1
gitlab ×1
gitlab-ci ×1
googletest ×1
haskell ×1
import ×1
limit ×1
linux ×1
logging ×1
makefile ×1
matrix ×1
merge ×1
offset ×1
packing ×1
performance ×1
pytest ×1
static-cast ×1
struct ×1
swift ×1
valgrind ×1
wrapper ×1