Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在编译时连接字符串_Arrays_String_D_Ctfe - Fatal编程技术网

Arrays 在编译时连接字符串

Arrays 在编译时连接字符串,arrays,string,d,ctfe,Arrays,String,D,Ctfe,我想在编译时加入文件名和图像格式。 下面的示例不起作用,因为我想字符串[]不能在编译时计算 immutable imageFormats = ["bmp", "jpg", "gif", "png"]; template fileNamesWithImageFormat(string[] fileNames) { string[] fileNamesWithImageFormat() { string[] ret; ret.length = imageFo

我想在编译时加入文件名和图像格式。 下面的示例不起作用,因为我想字符串[]不能在编译时计算

immutable imageFormats = ["bmp", "jpg", "gif", "png"];

template fileNamesWithImageFormat(string[] fileNames)
{
    string[] fileNamesWithImageFormat() {
        string[] ret;
        ret.length = imageFormats.length * fileNames.length;

        for (int j = 0; j < fileNames.length) {
            for (int i = 0; i < imageFormats.length; ++i) {
                ret[j * fileNames.length + i] = fileNames[j] ~ "." ~ imageFormats[i];
            }
        }

        return ret;
    }
}

我需要把这个输入到进口。如何解决该错误?

进一步搜索后,它出现了。
从DMD2.061开始,这是一个bug,解决方法是将文件名声明为别名。

进一步搜索后,它出现了。
从DMD2.061开始,这是一个bug,一个解决方法是将文件名声明为别名。

这有点过于复杂了

CTFE编译时函数执行应该适合这里。您可以编写处理字符串[]输入的常用函数,并在编译时表达式中使用它。有一些限制,但是您的代码已经准备好CTFE了,所以不需要模板

您的索引中还有一个小错误。编译时工作的已更正版本:

import std.algorithm, std.array, std.range;
import std.stdio;

string[] modify(string[] names)
{
    if (!__ctfe)
        assert(false);

    immutable string[] imageFormats = ["bmp", "jpg", "gif", "png"];

    string[] ret;
    ret.length = imageFormats.length * names.length;

    for (int j = 0; j < names.length; ++j) {
        for (int i = 0; i < imageFormats.length; ++i) {
            ret[j * imageFormats.length + i] = names[j] ~ "." ~ imageFormats[i];
        }
    }

    return ret;
}

enum string[] input = ["one", "two"];

pragma(msg, modify(input));

void main() {}
或者在DPaste上查看:


如果提供的代码中有不清楚的地方,或者您坚持使用其他方法,请在此处留下评论。D有很多不同的工具用于编译时任务。

这有点过于复杂了

CTFE编译时函数执行应该适合这里。您可以编写处理字符串[]输入的常用函数,并在编译时表达式中使用它。有一些限制,但是您的代码已经准备好CTFE了,所以不需要模板

您的索引中还有一个小错误。编译时工作的已更正版本:

import std.algorithm, std.array, std.range;
import std.stdio;

string[] modify(string[] names)
{
    if (!__ctfe)
        assert(false);

    immutable string[] imageFormats = ["bmp", "jpg", "gif", "png"];

    string[] ret;
    ret.length = imageFormats.length * names.length;

    for (int j = 0; j < names.length; ++j) {
        for (int i = 0; i < imageFormats.length; ++i) {
            ret[j * imageFormats.length + i] = names[j] ~ "." ~ imageFormats[i];
        }
    }

    return ret;
}

enum string[] input = ["one", "two"];

pragma(msg, modify(input));

void main() {}
或者在DPaste上查看:


如果提供的代码中有不清楚的地方,或者您坚持使用其他方法,请在此处留下评论。D为编译时任务提供了很多不同的工具。

实际上阻止我使用正常函数的原因是,最初我在正文中也使用了import,我想这在常规函数中不起作用。感谢facepalm时刻。导入确实在函数中工作,但这是几个版本之前的一个新功能。实际上,阻止我使用正常函数的原因是,最初我在身体中也使用了导入,我想这在常规函数中不起作用。不过感谢facepalm时刻。虽然导入在函数中可以工作,但这是几个版本之前推出的新功能。