我有一个Git存储库,里面有几个子模块.如何git submodule init
在运行后列出所有子模块的名称?
该git submodule foreach
命令可以回显子模块的名称,但只有在检出后才能使用,这在init步骤之后没有发生.链中有更多的步骤需要在签出之前发生,我不希望将子模块的名称硬连接到脚本中.
那么是否有一个Git命令来获取所有当前已注册但尚未检出的子模块的名称?
我有一个没有默认构造函数或赋值运算符的类,因此它根据另一个函数的结果在if/else语句中声明和初始化.但后来它表示它超出了范围,即使条件的两个路由都会创建一个实例.
考虑以下示例(int
仅用于说明这一点):
#include <iostream>
int main()
{
if(1) {
int i = 5;
} else {
int i = 0;
}
std::cout << i << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在条件结束时,条件中声明的变量是否超出范围?处理没有默认构造函数但构造函数的参数依赖于某些条件的情况的正确方法是什么?
编辑
根据给出的答案,情况更复杂,因此可能必须改变方法.有一个抽象的基类A和两个从A派生的B和C类.如下所示:
if(condition) {
B obj(args);
} else {
C obj(args);
}
Run Code Online (Sandbox Code Playgroud)
改变方法?由于A是抽象的,我不能只声明A* obj
并创建适当的类型new
.
我们有一个CFD求解器,在运行模拟时,发现它在某些机器上运行速度非常慢,而在其他机器上却运行得非常慢.使用英特尔VTune,发现以下行是问题(在Fortran中):
RHOV= RHO_INF*((1.0_wp - COEFF*EXP(F0)))**(1.0_wp/(GAMM - 1.0_wp))
Run Code Online (Sandbox Code Playgroud)
使用VTune进行钻取,问题可以追溯到call pow
装配线,当跟踪堆栈时,它显示它正在使用__slowpow()
.经过一番搜索,这个页面出现了抱怨同样的事情.
在具有libc版本2.12的机器上,模拟花了18秒.在libc版本为2.14的机器上,模拟耗时0秒.
基于上述页面的信息,当基数pow()
接近1.0 时出现问题.所以我们做了另一个简单的测试,我们在之前用任意数字缩放基数pow()
,然后除以在pow()
调用之后提升到指数的数字.使用libc 2.12时,运行时间从18秒减少到0秒.
但是,将这些全部放在我们所做的代码上是不切实际的a**b
.如何更换pow()
libc中的函数?例如,我希望call pow
Fortran编译器生成的装配线调用pow()
我们编写的自定义函数来执行缩放,调用libc pow()
然后除以缩放.如何创建一个对编译器透明的中间层?
编辑
为了澄清,我们正在寻找类似(伪代码)的东西:
double pow(a,b) {
a *= 5.0
tmp = pow_from_libc(a,b)
return tmp/pow_from_libc(5.0, b)
}
Run Code Online (Sandbox Code Playgroud)
是否可以加载pow
libc并在我们的自定义函数中重命名以避免命名冲突?如果customPow.o
文件可以pow
从libc 重命名,如果其他东西仍然需要libc会发生什么?这会导致libc pow
中customPow.o
和pow
libc 之间的命名冲突吗?
使用Python的etree创建XML文件时,如果我们使用文件写入空标记SubElement
,我会得到:
<MyTag />
Run Code Online (Sandbox Code Playgroud)
不幸的是,我们在Fortran中使用的XML解析器库虽然它是一个正确的标签,却无法处理它.它需要看到:
<MyTag></MyTag>
Run Code Online (Sandbox Code Playgroud)
有没有办法改变格式规则或etree中的某些东西使其工作?
假设我有两个不是由我构建的静态库,我无法控制它们的内容.
库1具有以下功能:
A()
B()
C()
Run Code Online (Sandbox Code Playgroud)
图书馆2有以下功能:
A()
D()
E()
Run Code Online (Sandbox Code Playgroud)
两者都需要链接到调用应用程序,但A()
抛出错误的命名冲突.
有没有办法在使用gcc和ld在linux中链接时"忽略库1中的A()".
也许有一个简单的方法,我没有看到,所以希望有人可以向我解释.
假设我有一节课:
class A {
public:
const double parameter;
const std::string name;
const std:: string fileName;
A(const double parameter, const std::string name, const std::string fileName) :
parameter(parameter), name(name), fileName(fileName) {};
};
Run Code Online (Sandbox Code Playgroud)
那个类的生成器是:
class AReader {
public:
ifstream dataFile;
AReader(const std::string filename);
A* readObject(const std::string objectName);
};
Run Code Online (Sandbox Code Playgroud)
我想boost::flyweight
用来处理这些A
对象,因为它们可能有数百万个引用,实际上它们包含大量数据.他们将在哈希name
和fileName
在一起.
我需要做什么才能做到这一点?我需要boost::flyweight
调用AReader.readObject
并散列/存储生成的A
类.
是否AReader
需要成为一个完整的工厂并用作定制工厂?或者是否可以使用flyweight中的默认工厂并以某种方式用于AReader
生成A
实例(而不是实现工厂所需的整个存储模式),可能通过使AReader
实例成为flyweight中的某个参数?或者是否可以const
从外部数据源获取公共变量(即,一旦设置,它们不会更改)而无需诉诸第二类?
编辑
我也对不使用Boost的其他建议持开放态度.我当然可以编写我自己的flyweight实现,或任何其他模式,如果一个更适合.但如果我可以使用已经存在的东西,那将是最好的.无论什么最小化我需要编写的代码量,因为一如既往,截止日期很短.
两点 - 首先,示例是在Fortran中,但我认为它应该适用于任何语言; 第二,内置的随机数生成器并不是真正随机的,而且存在其他生成器,但我们对于将它们用于我们正在做的事情并不感兴趣.
关于随机种子的大多数讨论都承认,如果程序在运行时没有播种,那么种子将在编译时生成.因此,每次运行程序时都会生成相同的数字序列,这对随机数不利.克服这个问题的一种方法是使用系统时钟为随机数发生器播种.
但是,当在多核机器上与MPI并行运行时,我们的系统时钟方法产生了同样的问题.当序列从运行变为运行时,所有处理器都获得相同的系统时钟,因此具有相同的随机种子和相同的序列.
请考虑以下示例代码:
PROGRAM clock_test
IMPLICIT NONE
INCLUDE "mpif.h"
INTEGER :: ierr, rank, clock, i, n, method
INTEGER, DIMENSION(:), ALLOCATABLE :: seed
REAL(KIND=8) :: random
INTEGER, PARAMETER :: OLD_METHOD = 0, &
NEW_METHOD = 1
CALL MPI_INIT(ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
CALL RANDOM_SEED(SIZE=n)
ALLOCATE(seed(n))
DO method = 0, 1
SELECT CASE (method)
CASE (OLD_METHOD)
CALL SYSTEM_CLOCK(COUNT=clock)
seed = clock + 37 * (/ (i - 1, i = 1, n) /)
CALL RANDOM_SEED(put=seed)
CALL RANDOM_NUMBER(random)
WRITE(*,*) …
Run Code Online (Sandbox Code Playgroud) 我想operator()
基于类中的选项设置一个类实现几种不同的方法.因为这将被调用很多次,我不想使用任何分支.理想情况下,它operator()
是一个可以用方法设置的函数指针.但是,我不确定这实际上会是什么样子.我试过了:
#include <iostream>
class Test {
public:
int (*operator())();
int DoIt1() {
return 1;
}
int DoIt2() {
return 2;
}
void SetIt(int i) {
if(i == 1) {
operator() = &Test::DoIt1;
} else {
operator() = &Test::DoIt2;
}
}
};
int main()
{
Test t1;
t1.SetIt(1);
std::cout << t1() << std::endl;
t1.SetIt(2);
std::cout << t1() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道如果我创建另一个函数指针并从operator()
函数调用它,它将工作.但是有可能让operator()
函数本身成为函数指针吗?我发布的东西(不编译)的东西?
上面的代码给出:
test.cxx:5:21:错误:将'operator()'声明为非函数
test.cxx:在成员函数'void Test :: SetIt(int)'中:
test.cxx:17:16:错误:'operator()'未定义
test.cxx:19:16:错误:'operator()'未定义
test.cxx:在函数'int main()'中: …
在linux程序上,在控制台上(如没有xorg等),我正在使用/ dev/input/event*来读取键盘和鼠标,但是我需要root才能读取它们.是否有另一种形式来读取这些东西而不需要root权限(无需更改permisons和配置文件等)?
我理解为什么它默认情况下无需解释.
在python我试图访问一个实例变量,我需要使用另一个变量的值来确定名称:示例实例变量:user.remote.directory其中它指向'servername:/ mnt/..的值...'和用户部分包含用户的用户标识,例如joe.remote.directory
从另一个类我需要能够使用包含joe用户ID的变量访问joe.remote.directory.我尝试过variable.remote.directory但它不起作用,有什么建议吗?