Как записать в массив Array! Ubyte? - PullRequest
2 голосов
/ 21 июня 2019

Несколько дней назад я писал генератор TAP-файлов для ZX Spectrum.Чтобы постепенно записывать байты в вывод, я бы использовал потоки на Delphi или C ++, но потоки D устарели.

Поэтому я выбрал rawWrite.Что касается хранения байтов, это был Array! Uint (исправление: это был Array! Ubyte) из std.containers.Но rawWrite может записывать только традиционные массивы, а не контейнеры.И кажется, что нет простого способа преобразовать массив в массив. (использование .array работало на Array! Uint, но не на Array! Ubyte)

В конце я использовал простой динамический массив, но он оставил ощущение недружественности пользователя.

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Вы всегда можете получить массив из ваших данных Array, используя функцию std.array.array , как показано в коде D ниже:

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

void main() {
  auto fn = "test.dat";
  // scope(exit) std.file.remove(fn);

  auto f = File(fn,"wb");
  Array!ubyte myarr = [ubyte(5), ubyte(4), ubyte(3), ubyte(2), ubyte(1)];
  f.rawWrite(myarr.array);
}

Сохраните его, скажем, в arr2.d, скомпилируйте и запустите:

dmd arr2.d && ./arr2 

Давайте проверим, что он написал то, что мы ожидаем:

hexdump -C test.dat
00000000  05 04 03 02 01                                    |.....|
00000005
1 голос
/ 21 июня 2019

std.containers.array.Array владеет и полностью инкапсулирует свои данные и не обеспечивает прямой доступ к ним. Это связано с тем, что он управляет временем жизни данных, поэтому любая операция на Array сделает недействительными любые указатели на его внутренние данные. Следовательно, единственный способ получить элементы Array в качестве непрерывного вектора - это скопировать их, один за другим, например, в. стандартный массив D Функция std.array.array, которая копирует произвольный диапазон в массив D, помогает в этой задаче:

import std.array;
import std.container.array;


Array!uint ci = [1, 2, 3];
uint[] ai = ci.array;
assert(ai == [1, 2, 3]);

Array!ubyte cb = [ubyte(1), ubyte(2), ubyte(3)];
ubyte[] ab = cb.array;
assert(ab == [ubyte(1), ubyte(2), ubyte(3)]);

На данный момент кажется не слишком выгодным записывать элементы Array непосредственно в файл или полностью исключать использование Array.

...