2012-01-02 27 views
5

I wrote this program in C và cũng in erlangCách D để viết điều này là gì?

Để thực hành tôi đã cố gắng để viết lại trong D. Một người bạn cũng đã viết nó trong D nhưng wrote it differently

Các bước thực hiện đơn giản. Giả:

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 

nỗ lực D của tôi:

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

Dường như tôi không thể chỉ cần sử dụng fread trên arr. sizeof là 16 và nó cho lỗi phân đoạn khi tôi đến phần trừ. Tôi không thể tự động phân bổ một mảng tĩnh, hoặc ít nhất là tôi không biết làm thế nào. Tôi cũng không thể sử dụng malloc vì nó mang lại cho tôi lỗi khi tôi cố gắng bỏ khoảng trống * khi tôi lặp qua các byte. Làm thế nào bạn sẽ viết này, hoặc, những gì tôi có thể làm tốt hơn?

+2

bạn có chắc chắn '& arr' điểm tới phần tử đầu tiên của mảng? – hvd

Trả lời

5

một lần nữa tại sao bạn mong muốn có thể đọc toàn bộ đoạn văn vào một mảng đơn (kích thước theo byte phù hợp với 64 bit (có thể nhiều hơn một vài petabyte) mà tôi đã đưa ra nhận xét đó trong câu hỏi khác

sử dụng một vòng lặp để sao chép nội dung

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

tôi đang sử dụng rawReadrawWrite để đọc và viết

3

arr không phải là con trỏ và không chuyển đổi thành con trỏ như trong C và C++.

Nếu bạn muốn con trỏ bắt đầu mảng, hãy sử dụng arr.ptr.

Để phân bổ một mảng tĩnh, bạn sử dụng:

ubyte[N] arr; 

Tuy nhiên, N phải là một hằng số thời gian biên dịch (giống như trong C và C++), vì vậy nó có thể không được sử dụng nhiều ở đây.

Các vấn đề liên quan