I wrote this program in C a także in erlangJaki jest sposób, aby to napisać?
Aby praktykować Próbowałem przerobić w D. Znajomy napisał też go w D ale wrote it differently
Kroki są proste. Pseudokod:
While not end of file:
X = Read ulong from file and covert to little endian
Y = Read X bytes from file into ubyte array
subtract 1 from each byte in Y
save Y as an ogg file
D Moja próba:
import std.file, std.stdio, std.bitmanip, std.conv, core.stdc.stdio : fread;
void main(){
auto file = File("./sounds.pk", "r+");
auto fp = file.getFP();
ulong x;
int i,cnt;
while(fread(&x, 8, 1, fp)){
writeln("start");
x=swapEndian(x);
writeln(x," ",cnt++,"\n");
ubyte[] arr= new ubyte[x];
fread(&arr, x, 1, fp);
for(i=0;i<x;i++) arr[i]-=1;
std.file.write("/home/fold/wak_oggs/"~to!string(cnt)~".ogg",arr);
}
}
Wydaje się, że nie można po prostu użyć fread na arr. sizeof wynosi 16 i daje błąd segmentacji, gdy dojdę do części odejmującej. Nie mogę automatycznie przydzielić tablicy statycznej lub przynajmniej nie wiem jak. Nie mogę również używać malloc, ponieważ daje mi błędy, gdy próbuję rzucić void *, gdy przechodzę przez bajty. Jak byś to napisał, czy co mógłbym zrobić lepiej?
Czy jesteś pewien, '& arr' punkty do pierwszego elementu tablicy? – hvd