2015-11-02 2 views
2

При изучении C++ и D Я пытаюсь сравнить простоту использования, тестируя код на обоих языках.Назначить значение int char

Так, в C++ У меня есть что-то вроде этого (не показывая полный C++ код это только для демонстрации):

char src[] = "some10char"; 
char des[]; 

for (int i=0; i<1000; i++) 
{ 
    src[9] = '0' + i % (126 - '0'); 
    des = src; 
} 

В «псевдо» выше, первая строка в теле для цикла не только присваивает значение int, но также пытается избежать непечатаемых значений.

Как я могу сделать то же самое в D?

До сих пор мне удалось бросить int к char, и я не знаю, если я правильно сделал это:

char[] src = "some10char".dup; 
char[] dst; 

for (int i=0; i<1000; i++) 
{ 
    if (i<15) 
     src[src.length-1] = cast(char)(i+15); 
    else 
     src[src.length-1] = cast(char)(i); 

    dst = src.dup // testing also dst = src; 
} 

ответ

3

Вы можете добавить и вычесть из символов litteral в D, так же, как в ваш C++ образец, например:

import std.stdio; 

char[] str; 

void main(string[] args) 
{ 
    for(int i=0; i<1000; i++) 
    { 
     str ~= cast(char)(i % (0x7F - '0') + '0') ; 
    } 
    writeln(str); 
} 

печатать только символы ASCII над 0 и менее 0x7F. Символ неявно преобразуется в int, а заключительная операция на i (которая сама дает int) затем явно ливается в char (так что modulo/mask by 0xFF).

+0

благодаря @Nt кстати, если я пытаюсь скопировать 'ДСТ = src' это не будет работать в цикле, как я пытаюсь массив структур с' полукоксом [] ' как поле .. но 'dst = src.dup' делает ... поэтому' ~ = 'фактически выполняет' .dup'? –

+0

Нет, оператор __ ~ = __ используется для конкатенации в целевом массиве. Для каждой итерации добавляется символ. –

+0

Спасибо за правильный ответ. –

4

Более идиоматический код D:

char[] source = "some10char".dup; // or cast(char[])"some10char"; 
char[] destination; // = new char[source.length]; 

foreach (i; 0 .. 1000) 
{ 
    source[$ - 1] = cast(char)('0' + i % (126 - '0')); 

    destination = source.dup; // dup will allocate every time 
    //destination[] = source[]; // copying, but destination must have same length as source 
} 
+0

эй сигод. спасибо большое, я просто отметил правильно для @Nested 20 секунд назад ... –

+0

Я думаю, что 'x [] = y []' будет быстрее, но не так безопасно, как 'x = y.dup', и во всех случаях есть не нужно использовать 'free'? – LoneXcoder

+0

@RajFelix Что странно. Поскольку @Nestedtype предлагает использовать '~', в то время как он не имеет смысла в контексте вашего вопроса. – sigod

Смежные вопросы