2012-01-02 29 views
5

I wrote this program in C ve ayrıca in erlangBunu yazmanın D yolu nedir?

Ben Bir arkadaşım da D yazdım ama wrote it differently

adımları basit D'de yeniden yazmak çalıştı uygular. Sözdekod:

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 

My D girişimi:

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); 
    } 
} 

Ben sadece arr üzerinde fread kullanamazsınız görünüyor. sizeof 16'dır ve çıkarma kısmına ulaştığımda segmentasyon hatası verir. Otomatik olarak statik bir dizi tahsis edemiyorum ya da en azından nasıl olduğunu bilmiyorum. Ayrıca malloc kullanamıyorum çünkü bayttan geçerken boşluğu atmaya çalıştığımda bana hata veriyor. Bunu nasıl yazarsın, ya da daha iyisini ne yapabilirim?

+2

emin '& arr' dizinin ilk elemana puan musunuz? – hvd

cevap

5

tekrar neden tüm yığın içinde tek bir dizide okuyabileceğinizi umuyorsunuz (bayt cinsinden 64 bit uzunluğa sığdırır (muhtemelen daha fazla petabyte) Bu soruyu diğer soruda da yaptım Ben okuma yazma rawRead ve rawWrite kullanıyorum içeriğini

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; 
} 

kopyalamak için

kullanımı bir döngü

3

arr işaretçi değildir ve C ve C++ gibi bir işaretçiye dönüştürmez.

Dizinin başlangıcına bir işaretçi isterseniz, arr.ptr'u kullanın.

statik bir dizi tahsis etmek için kullanın: burada pek kullanmak olmayabilir bu yüzden

ubyte[N] arr; 

Ancak N, (sadece C ve C++ gibi) bir derleme zamanı sabiti olmalıdır.

İlgili konular