使用Linux shell,如何从当前工作目录启动具有不同工作目录的程序?
例如,我有一个二进制文件helloworld
,hello-world.txt
在当前目录中创建该文件.该文件位于目录中/a
.目前我在目录中/b
.我想启动我的程序运行../a/helloworld
并hello-world.txt
在第三个目录中的某个位置/c
.
如何在C++中实现no-op宏?
#include <iostream>
#ifdef NOOP
#define conditional_noop(x) what goes here?
#else
#define conditional_noop(x) std::cout << (x)
#endif
int main() {
conditional_noop(123);
}
Run Code Online (Sandbox Code Playgroud)
我希望在定义NOOP时不执行任何操作,并且在未定义NOOP时打印"123".
这是一个带有非ASCII字符的tmp.py:
if __name__ == "__main__":
s = 'ß'
print(s)
Run Code Online (Sandbox Code Playgroud)
运行它我收到以下错误:
Traceback (most recent call last):
File ".\tmp.py", line 3, in <module>
print(s)
File "C:\Python32\lib\encodings\cp866.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xdf' in position 0: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
Python文档说:
默认情况下,Python源文件被视为以UTF-8编码...
我检查编码的方法是使用Firefox(也许有人会建议更明显的东西).我在Firefox中打开tmp.py,如果我选择View-> Character Encoding-> Unicode(UTF-8),它看起来没问题,就像它在这个问题中看到的那样(wthß符号).
如果我把:
# -*- encoding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)
作为tmp.py中的第一个字符串,它不会改变任何内容 - 错误仍然存在.
有人可以帮我弄清楚我做错了什么吗?
我目前正在研究一些使用unittest2模块的代码.我怀疑这段代码是用于python2的.可以使用python3 unittest作为unittest2的替代品吗?两者有什么区别?
compatibility python-module python-2.x python-3.x python-unittest
问题
如果我从主机编译并运行,我能够设置并达到断点,但如果我从docker容器中执行此操作,gdb不会触及已设置的断点.
重现的步骤(所有片段都准备好复制粘贴)
创建一个docker文件:
cat << EOF > Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y build-essential gdb
EOF
Run Code Online (Sandbox Code Playgroud)
构建映像并在其中运行交互式会话:
docker build -t gdb_problem_testing . && docker run --rm -it gdb_problem_testing bash
Run Code Online (Sandbox Code Playgroud)
从容器内部创建小main.cpp,编译并运行gdb:
cat <<EOF > main.cpp && g++ -g main.cpp && gdb -ex 'break 5' -ex 'run' ./a.out
#include <iostream>
int main(int argc, const char *argv[])
{
std::cout << "hi\n";
return 0;
}
EOF
Run Code Online (Sandbox Code Playgroud)
观察gdb输出:
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
[Skipped gdb greeting]
Reading symbols from ./a.out...done. …
Run Code Online (Sandbox Code Playgroud) 当我使用未设置的变量时,有没有办法告诉make抱怨?类似于set -u
bash的东西?
我花了二十分钟调试我的Makefile,因为变量名称中有一个符号拼写错误.
我有一个3D multi_array,我想使用运行时指定的维度制作2D切片.我知道退化维度的索引和我想要在该简并维度中提取的切片的索引.目前丑陋的解决方案看起来像这样:
if (0 == degenerate_dimension)
{
Slice slice = input_array[boost::indices[slice_index][range()][range()]];
}
else if (1 == degenerate_dimension)
{
Slice slice = input_array[boost::indices[range()][slice_index][range()]];
}
else if (2 == degenerate_dimension)
{
Slice slice = input_array[boost::indices[range()][range()][slice_index]];
}
Run Code Online (Sandbox Code Playgroud)
有没有更美观的方法来构造index_gen对象?像这样的东西:
var slicer;
for(int i = 0; i < 3; ++i) {
if (degenerate_dimension == i)
slicer = boost::indices[slice_index];
else
slicer = boost::indices[range()];
}
Slice slice = input_array[slicer];
Run Code Online (Sandbox Code Playgroud)
似乎每次对boost :: indices :: operator []的后续调用都会返回一个不同的类型,具体取决于维度(即先前调用的数量),因此无法使用单个变量来保存临时的index_gen对象.
我有一个枚举类:
class Group(enum.Enum):
user = 0
manager = 1
admin = 2
Run Code Online (Sandbox Code Playgroud)
我有一个 pydantic 模型:
class User(BaseModel):
id: int
username: str
group: Group
Run Code Online (Sandbox Code Playgroud)
它生成序列化为 json 的内容如下:
{
"id": 5,
"username": "admin",
"group": 2
}
Run Code Online (Sandbox Code Playgroud)
但是,我想获取枚举字段的名称而不是其值,所以它应该是:
{
"id": 5,
"username": "admin",
"group": "admin"
}
Run Code Online (Sandbox Code Playgroud)
这有可能吗?如果是这样,怎么办?
鉴于tmp.c:
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
int main(int argc, const char *argv[])
{
struct stat st;
if (stat(argv[1], &st) != 0)
{
perror("Error calling stat");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Error calling stat: Value too large for defined data type
当我在大文件(~2.5 Gb)上运行程序时,我得到了.
我想在集合中存储具有类似签名的函数,以执行以下操作:
f(vector<Order>& orders, vector<Function>& functions) {
foreach(process_orders in functions) process_orders(orders);
}
Run Code Online (Sandbox Code Playgroud)
我想到了函数指针:
void GiveCoolOrdersToBob(Order);
void GiveStupidOrdersToJohn(Order);
typedef void (*Function)(Order);
vector<Function> functions;
functions.push_back(&GiveStupidOrdersToJohn);
functions.push_back(&GiveCoolOrdersToBob);
Run Code Online (Sandbox Code Playgroud)
或多态函数对象:
struct IOrderFunction {
virtual void operator()(Order) = 0;
}
struct GiveCoolOrdersToBob : IOrderFunction {
...
}
struct GiveStupidOrdersToJohn : IOrderFunction {
...
}
vector<IOrderFunction*> functions;
functions.push_back(new GiveStupidOrdersToJohn());
functions.push_back(new GiveCoolOrdersToBob());
Run Code Online (Sandbox Code Playgroud) c++ ×3
c ×2
linux ×2
python ×2
python-3.x ×2
boost ×1
debugging ×1
delegates ×1
docker ×1
encoding ×1
enums ×1
environment ×1
gdb ×1
macros ×1
makefile ×1
model ×1
permissions ×1
posix ×1
pydantic ×1
python-2.x ×1
shell ×1
system-calls ×1
templates ×1
utf-8 ×1