2012-01-02 14 views
5

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?

+2

Czy jesteś pewien, '& arr' punkty do pierwszego elementu tablicy? – hvd

Odpowiedz

5

Ponownie, dlaczego spodziewasz się móc odczytać cały fragment w jedną tablicę (której rozmiar w bajtach mieści się w 64-bitowej długości (prawdopodobnie więcej niż kilka petabajtów). W drugim pytaniu również

użyć pętli, aby skopiować zawartość

writeln("start"); 
x=swapEndian(x); 
writeln(x," ",cnt++,"\n"); 
ubyte[1024*8] arr=void; //the buffer 
      //initialized with void to avoid auto init (or declare above the for) 
ubyte b; //temp buff 
File out = File("/home/fold/wak_oggs/"~to!string(cnt)~".ogg", "wb"); 

b=fp.rawRead(arr[0..x%$]);//make it so the buffer can be fully filled each loop 
foreach(ref e;b)e-=1;//the subtract 1 each byte loop 
out.rawWrite(b); 
x-=b.length; 
while(x>0 && (b=fp.rawRead(arr[])).length>0){//loop until x becomes 0 
    foreach(ref e;b)e-=1; 
    out.rawWrite(b); 
    x-=b.length; 
} 

Używam rawRead i rawWrite czytać i pisać

3

arr nie jest wskaźnikiem i nie konwertuje na wskaźnik taki jak w C i C++.

Jeśli chcesz wskaźnik na początek tablicy, użyj arr.ptr.

Aby przydzielić statyczną tablicę, możesz użyć:

ubyte[N] arr; 

Jednak N kompilacji musi być stała czasowa (podobnie jak w C i C++), więc to nie może być dużo wykorzystania tutaj.

Powiązane problemy