Преобразование строки D в символ C*

Ну в общем вот что мне нужно:

  • У меня есть переменная extern(al) char *
  • Я хочу присвоить значение строки D

Код:

import std.stdio;
import std.string;
import core.stdc.stdlib;

extern (C) int yyparse();
extern (C) extern __gshared FILE* yyin;
extern (C) extern __gshared char* yyfilename;

void main(string[] args)
{
    string filename = args[1];

    auto file = File(filename, "r");

    yyfilename = toStringz(filename);
    yyin = file.getFP();

    yyparse();
}

Однако функция toStringz возвращает эту ошибку:

main.d(15): Error: cannot implicitly convert expression (toStringz(filename)) of type immutable(char)* to char*

Любая идея, что происходит не так?


person Dr.Kameleon    schedule 14.03.2014    source источник
comment
Я вообще не знаю D, но неизменяемая часть предполагает, что хорошо поставленное const может это исправить. Может extern (C) extern __gshared const char* yyfilename?   -  person ruakh    schedule 14.03.2014
comment
const(char)* yyfilename — это синтаксис, который вам здесь понадобится — изменяемый указатель на константные данные.   -  person Adam D. Ruppe    schedule 14.03.2014
comment
@AdamD.Ruppe Да, это тоже сработало! ;-)   -  person Dr.Kameleon    schedule 14.03.2014


Ответы (2)


Проблема в том, что yyfilename и возвращаемое значение toStringz при передаче строки имеют разные квалификаторы const. filename является неизменяемым (D string является псевдонимом immutable(char)[]), однако yyfilename не имеет квалификатора const и, таким образом, является изменчивым.

У вас есть два варианта:

  1. Если вы знаете, что yyfilename не будет изменено нигде в вашей программе, вы должны объявить его как const(char)* вместо char*.
  2. В противном случае вам следует создать копию filename при конвертации: toUTFz!(char*)(filename).
person Vladimir Panteleev    schedule 14.03.2014
comment
Большое спасибо. Я решил выбрать этот ответ в качестве ответа, так как (хотя оба работают) это более эффективное решение основной проблемы. ;-) - person Dr.Kameleon; 15.03.2014

Вы можете использовать:

import std.utf;

void main()
{
    string filename;
    char* yyfilename;
    yyfilename = toUTFz!(char*)(filename);
    // yyfilename = filename.toUTFz!(char*);  // or with UFCS syntax
}
person Andrej Mitrović    schedule 14.03.2014
comment
Да, да, да! Вот оно. (Ну, очевидно, мне нужно освежить свои скромные навыки D...) Большое спасибо! :-) - person Dr.Kameleon; 14.03.2014