我正在尝试从我的主C++程序中调用Python脚本中的函数.python函数接受一个字符串作为参数并且不返回任何内容(ok ..'None').只要前一次调用在再次调用函数之前完成,它就可以很好地工作(从未想过会那么容易......),否则就会出现访问冲突pModule = PyImport_Import(pName).
有很多教程如何在C中嵌入python,反之亦然,但我没有发现任何关于这个问题.
int callPython(TCHAR* title){
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue;
Py_Initialize();
pName = PyUnicode_FromString("Main");
/* Name of Pythonfile */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
pFunc = PyObject_GetAttrString(pModule, "writeLyricToFile");
/* function name. pFunc is a new reference */
if (pFunc && PyCallable_Check(pFunc)) {
pArgs = PyTuple_New(1);
pValue = PyUnicode_FromWideChar(title, -1);
if (!pValue) {
Py_DECREF(pArgs);
Py_DECREF(pModule);
showErrorBox(_T("pValue is false"));
return 1;
}
PyTuple_SetItem(pArgs, 0, pValue);
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if …Run Code Online (Sandbox Code Playgroud) 我有几个包含c或asm文件的子目录的目录,我希望它们全部编译/组装然后链接.我不是特别挑剔目标文件的位置(例如一个特殊的bin文件夹或在src文件夹中),只要make clean将它们全部删除.
结构看起来像这样:
/src
/dir1
/dir1_1
+file1_1.s
+file1_2.s
+file1.s
/dir2
+file2.c
Run Code Online (Sandbox Code Playgroud)
我确信有一些简单的方法来创建一个编译所有文件的makefile而不必指定它应该看的位置(编译一个目录中的所有文件都可以使用通配符,但那么呢?).
我认为应该有一个算法用于此 - 可能在像生物信息学这样的领域(问题提醒我一些序列对齐)所以我希望有人可以帮助我在这里.
问题如下:假设我已经将一些数据分类为两个不同的类X和Y.结果可能如下所示:.. XXX Y XXX ..进一步假设我们对这些类有一些领域知识并且知道连续不到一定数量的实例是极不可能的(即一个序列中不可能有少于4个X或Ys - 最好是每个类可以使用不同的阈值,但这不是必须的).因此,如果我们使用这种领域知识,那么我们希望用X替换中间的单个Y是"显而易见的".
因此,算法应采用一系列分类实例和类的阈值(如果它简化了问题,则为1的阈值),并尝试找到满足属性的序列(没有比给定阈值短的类序列).显然,可能存在极大数量的正确解决方案(例如,在上面的示例中,我们也可以用Y替换所有X),因此我认为合理的优化标准将是最小化替换次数.
我不需要一个特别有效的算法,因为实例的数量会相当小(比如<4k),我们只有两个类.此外,由于这显然只是一种启发式方法,如果它们极大地简化了算法,我可以使用一些不准确的方法.
所以我在一些c代码上运行了一些静态代码分析器,让我惊讶的一件事就是警告:
int val;
scanf("%d", &val);
Run Code Online (Sandbox Code Playgroud)
其中说,对于足够大的输入,这可能会导致段错误.实际上这确实可以实现.现在修复很简单(指定一些宽度;毕竟我们知道有效整数最多可能有多少个位置,具体取决于架构)但我想知道的是为什么这首先发生这种情况以及为什么这不是被认为是libc中的一个错误(还有一个简单的解决方法)?
现在我假设首先出现这种行为的原因是我失踪了?
编辑:好的,因为问题似乎没有那么明确,更多的解释:没有代码分析器一般不会警告scanf,而是关于scanf读取没有特定宽度指定的数字.
所以这是一个最小的工作示例:
#include <stdlib.h>
#include <stdio.h>
int main() {
int val;
scanf("%d", &val);
printf("Number not large enough.\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们可以通过发送一个巨大的数字(使用例如Python)获得段错误:
import subprocess
cmd = "./test"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, shell=True)
p.communicate("9"*50000000000000)
# program will segfault, if not make number larger
Run Code Online (Sandbox Code Playgroud) Windows v7.1 SDK SetEnv.Cmd在其二进制文件夹中有一个脚本,可以正确设置其环境.问题是这个脚本显然只能使用cmd.exe,我无法在任何地方找到powershell的等价物.
所以我被迫使用cmd.exe或有没有办法使用powershell(除了手动重写SetEnv.Cmd脚本 - 如果这样可行吗?).
我实现了一个自定义状态“已阻止”,该状态在满足某些外部要求之后将进入排队状态。
有时,这些外部要求从未得到满足,这导致作业陷入阻塞状态。我想让处于这种状态的作业在经过一段可配置的时间后自动过期。
有这种要求的支持吗?有一个ExpirationDate领域,但是从代码来看,它似乎仅用于final状态。
状态非常简单:
internal sealed class BlockedState : IState
{
internal const string STATE_NAME = "Blocked";
public Dictionary<string, string> SerializeData()
{
return new Dictionary<string, string>();
}
public string Name => STATE_NAME;
public string Reason => "Waiting for external resource";
public bool IsFinal => false;
public bool IgnoreJobLoadException => false;
}
Run Code Online (Sandbox Code Playgroud)
并简单地用作 _hangfireBackgroundJobClient.Create(() => Console.WriteLine("hello world"), new BlockedState());
在稍后的阶段,然后通过 _hangfireBackgroundJobClient.ChangeState(jobId, new EnqueuedState(), BlockedState.STATE_NAME)
以下脚本在 5.1 和 7.4.0 上运行时给出不同的结果。
function foo($x) {
$val = switch ($x){
1 { 5 }
default {
return 10
}
}
Write-Host "Val is $val"
$val + 1
}
Write-Host "foo 1: $(foo 1)"
Write-Host "foo 2: $(foo 2)"
Run Code Online (Sandbox Code Playgroud)
PS 5.1 输出:
Val is 5
foo 1: 6
foo 2: 10
Run Code Online (Sandbox Code Playgroud)
PS 7.4.0 输出:
Val is 5
foo 1: 6
foo 2:
Run Code Online (Sandbox Code Playgroud)
这是 PS Core 中的错误(这对我来说肯定是出乎意料的)还是这是一个记录在案的更改/始终是未定义的行为?
静态解析重载运算符的原因是什么?这对我来说似乎是一个奇怪的选择 - 我能想到的唯一优势是以一些相当不直观的行为为代价的小的性能提升(但 JIT 有时也可以避免这种情况) - 即我基本上必须将操作员转发给一个虚函数来获得想要的行为。
这是刚刚从 C++ 接管还是有其他一些很好的理由?
所以我发现,如果你没有在c ++ 11中持有锁,那么发出一个条件变量是合法的.这似乎打开了一些令人讨厌的竞争条件的大门:
std::mutex m_mutex;
std::condition_variable m_cv;
T1:
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait(lock, []{ return !is_empty(); });
T2:
generate_data();
m_cv.notify();
Run Code Online (Sandbox Code Playgroud)
是否保证T1永远不会在我们首先检查is_empty()(它返回true)的情况下结束,然后被T2抢占,这会创建一些数据并在我们实际等待它之前发出条件变量的信号?
如果这可以保证工作(我猜是这样,否则它看起来像是一个故意错误的API设计),这实际上是如何实现linux和stdlibc++?似乎我们需要另一个锁以避免这种情况.
在 JavaScript 中获取 [0, n) 范围内的随机整数的标准方法 - 或任何其他仅提供 random() 函数返回 [0,1) 范围内浮点数的语言 - 是使用Math.floor(Math.random() * n).
现在,假设我们正在对一组有理数进行运算,那么这背后的数学是微不足道的。问题是:由于 IEEE-754 浮点数的所有复杂性,结果分布实际上真的是均匀的吗?
考虑到一个浮点数和下一个更高的浮点数之间的差距随着它们变大而增加,我认为这应该会引入某种对较小数字的偏见。