我有一个最初针对英特尔编译器的大型 Fortran 代码库。我现在正准备用 gfortran 进行编译。不幸的是,代码中充斥着 Intel 风格的预处理指令,例如:
!DEC$ IF DEFINED (MYDIRECTIVE)
REAL, DIMENSION(:,:,:), ALLOCATABLE :: my_real_var
!DEC$ ENDIF
Run Code Online (Sandbox Code Playgroud)
从我通过谷歌搜索和 gfortran 文档可以看出,除了 C 风格的预处理之外,没有内部 gfortran 支持,例如:
#if defined MYDIRECTIVE
REAL, DIMENSION(:,:,:), ALLOCATABLE :: my_real_var
#endif
Run Code Online (Sandbox Code Playgroud)
有没有其他人遇到过这个问题并提出了一个优雅的解决方案?显然,我可以编写一个 shell 脚本,在将代码传递给 gfortran 进行编译之前调用外部预处理器,但这对我来说似乎不是一个很好的解决方案。
有什么想法吗?谢谢大师!
我知道有一种方法可以预处理我的 info.plist 文件,但是是否有类似的方法来处理我的 Settings.bundle 中的字符串文件?
我的问题:我有一个 iPhone 应用程序,我希望用户知道当前安装的版本。我通过在应用程序设置中显示它来做到这一点。现在,每当我在我的info.plist改变捆绑版本时我也有更改的版本Root.strings中 Settings.bundle。我可以运行一个脚本操作来更新它,但是使用预处理器会很好,因为我可以用它做更多有趣的事情。
谢谢!
我想在 Pandoc 中的图像中添加诸如“图 1:废话”之类的标题,并能够像查看@Figure1 一样引用它们。我正在使用 gpp(一个预处理器)为我的图像添加标题并执行各种奇特的操作,例如更改大小、格式等。但是,我无法为图 1、图 2 等图像实现计数器。
我在我的 gpp 脚本中定义了以下函数:
\define{\counter}{0}
\defeval{count}{\eval{\counter+ 1}
Run Code Online (Sandbox Code Playgroud)
我在我的脚本中这样称呼它: \count
但是,\counter在我的 gpp 脚本中没有得到评估,我看到以下内容error: unfinished macro
我应该如何实现这个计数器?我在 gpp 中使用 -T (tex) 模式
我创建并应用了一个简单的 .xcconfig 文件,其中包含
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = FOODEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = FOORELEASE
Run Code Online (Sandbox Code Playgroud)
和 main.cpp 包含
#include <iostream>
// This warning IS shown
#if DEBUG
#warning DEBUG is set to 1
#endif
// This warning IS NOT shown
#ifdef FOODEBUG
#warning FOODEBUG is set
#endif
// This warning IS NOT shown
#ifdef FOORELEASE
#warning FOORELEASE is set
#endif
int main(int argc, const char * argv[])
{
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道为什么在 main.cpp 中,既没有定义 FOODEBUG 也没有定义 FOORELEASE ??! …
我正在编写一个在运行时使用 NVRTC(CUDA 9.2 版和 NVRTC 7.5 版)编译的 CUDA 内核,它需要stdint.h头文件,以便拥有int32_t等类型。
如果我编写没有包含的内核源代码,它可以正常工作。例如内核
extern "C" __global__ void f() { ... }
Run Code Online (Sandbox Code Playgroud)
编译为 PTX 代码,其中 f 定义为.visible .entry f.
但是如果内核源代码是
#include <stdint.h>
extern "C" __global__ void f() { ... }
Run Code Online (Sandbox Code Playgroud)
它报告A function without execution space annotations (__host__/__device__/__global__) is considered a host function, and host functions are not allowed in JIT mode.(也没有extern "C")。
传递-default-device使 PTX 代码.visible .func f,因此无法从主机调用该函数。
有没有办法在源代码中包含标题,并且仍然具有__global__入口功能?或者,一种知道 …
因此,我有一个 DataFrame,其中包含当前12345按行排列的分类值和数值值171。
我在分类变量和数值变量中都缺少值,我想在其中估算值。对于数字列,我正在执行以下操作;
import pandas as pd
import numpy as np
data = pd.read_csv('filepath')
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=np.nan, strategy='mean', axis=0)
data = imp.fit_transform(data)
Run Code Online (Sandbox Code Playgroud)
然后我收到以下错误
ValueError:无法将字符串转换为浮点数:'USD'
我理解这是因为我使用的 sci-kit learns imputer 与strategy='mean'分类变量不兼容。我宁愿不必遍历每一列并手动提取数值,因此我正在寻找一种只能在数值列上执行此插补的方法。
我必须在 .S 文件中包含 .h 中的一些宏。.h 还包含 c 声明。因此我使用了定义
gcc -E -dM header.h > generated_header.h
generated_header.h还具有所有预定义的宏和标准符号。
现在 gcc -Iinclude/ asm.S -o asm.o 给出以下警告的数量
warning: "__GCC_ATOMIC_LLONG_LOCK_FREE" redefined
warning: "__GCC_ATOMIC_SHORT_LOCK_FREE" redefined
warning: "__STDC__" redefined ETC...
这是因为我们通过在asm.S中包含generated_header.h再次重新定义相同的宏
我检查了所有预处理器选项以仅提取本地定义。但没有任何帮助。有没有其他方法可以解决这个问题。有没有其他方法可以让 asm.S 知道这些宏?
C++ 知道assert()哪个允许运行时检查,根据NDEBUG.
我想使用编译器代码替换该宏并避免使用预处理器。我需要执行以下操作:
falseNDEBUG放弃构建的检查和传递的表达式中断/终止应用程序很容易。
在 C++20 中,std::experimental::source_location我可以使用它来获取断言的代码位置。
编译时条件可以使用requires或完成constexpr if
但是我不知道如何避免对表达式的求值。当myAssert(expression)作为函数实现时,我需要将表达式结果作为函数参数传递,这意味着即使该参数未在函数内部使用,它仍然会被计算。
C++20 有没有办法解决这个问题?
编辑:模板化示例:
template <typename T> requires (gDebug)
void assertTrue(const T& pResult, const std::experimental::source_location& pLocation) noexcept
{
if (!static_cast<bool>(pResult))
{
// error handling
}
}
template <typename T> requires (!gDebug)
void assertTrue(const T&) noexcept
{
}
Run Code Online (Sandbox Code Playgroud) 我看到很多建议使用 re (正则表达式)或 python 中的 .join 删除句子中连续重复的字母,但我想对特殊单词有例外。
例如:
我想要这句话>sentence = 'hello, join this meeting heere using thiis lllink'
像这样>'hello, join this meeting here using this link'
知道我有这个单词列表要保留并忽略重复的字母检查:keepWord = ['Hello','meeting']
我发现有用的两个脚本是:
使用.join:
import itertools
sentence = ''.join(c[0] for c in itertools.groupby(sentence))
Run Code Online (Sandbox Code Playgroud)
使用正则表达式:
import re
sentence = re.compile(r'(.)\1{1,}').sub(r'\1', sentence)
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案,但我认为还有一个更紧凑、更高效的解决方案。我现在的解决方案是:
import itertools
sentence = 'hello, join this meeting heere using thiis lllink'
keepWord = ['hello','meeting']
new_sentence = ''
for word in sentence.split():
if word not in keepWord:
new_word = …Run Code Online (Sandbox Code Playgroud) 我的问题:我想获得一个带有 N_DIGITS 数字的 id,并且我希望 N_DIGITS 在预处理时可以自定义。我的 id 是一个整数,所以我想定义 10^N_DIGITS 作为这个数字的最大值。
换句话说:是否可以用宏作为指数预处理数字?
这是我的终极尝试:
#include <stdio.h>
#define N_DIGITS 5
#define MAX_N 10e ## N_DIGITS
int main()
{
printf("%d\n", MAX_N);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,错误是error: exponent has no digits. 我不明白为什么这个原则不能实现,因为编译器知道一切,但我可能是错的。
无论如何我的语法不正确,我可以在这里得到一些帮助吗?