2012-01-02 12 views
5

I wrote this program in C और भी in erlangइसे लिखने का तरीका क्या है?

मैं डी में फिर से लिखने की कोशिश की एक दोस्त ने भी विकास में लिखा था लेकिन wrote it differently

चरणों सरल हैं अभ्यास करने के लिए। स्यूडोकोड:

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 

मेरे डी प्रयास:

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

ऐसा लगता है मैं सिर्फ आगमन पर fread उपयोग नहीं कर सकते। आकार 16 है और जब मैं घटाना भाग प्राप्त करता हूं तो यह सेगमेंटेशन गलती देता है। मैं एक स्थिर सरणी ऑटो आवंटित नहीं कर सकता, या कम से कम मुझे नहीं पता कि कैसे। मैं malloc का उपयोग भी नहीं कर सकता क्योंकि जब मैं बाइट्स के माध्यम से लूप करता हूं तो जब मैं शून्य को कास्ट करने की कोशिश करता हूं तो यह मुझे त्रुटियां देता है। आप इसे कैसे लिखेंगे, या, मैं बेहतर क्या कर सकता हूं?

+2

क्या आप वाकई 'और arr' सरणी के पहले तत्व को अंक हैं? – hvd

उत्तर

5

फिर आप पूरे खंड में एक ही सरणी में पढ़ने में सक्षम होने की उम्मीद क्यों करते हैं (बाइट्स में आकार 64 बिट लंबा (संभवतः अधिक पालतू जानवरों में अधिक फिट बैठता है) मैंने दूसरे प्रश्न में यह टिप्पणी भी की है मैं rawRead और rawWrite उपयोग कर रहा हूँ पढ़ना और लिखना

उपयोग एक पाश सामग्री

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

कॉपी करने के लिए

3

arr एक सूचक नहीं है, और सी और सी ++ में ऐसा पॉइंटर में परिवर्तित नहीं होता है।

यदि आप सरणी की शुरुआत में पॉइंटर चाहते हैं, तो arr.ptr का उपयोग करें।

एक स्थिर सरणी का आवंटन करने के लिए, आप का उपयोग करें:

ubyte[N] arr; 

हालांकि, N, एक संकलन समय निरंतर (सिर्फ C और C++ में) की तरह होना चाहिए, ताकि यह बहुत उपयोग यहाँ नहीं हो सकता।

संबंधित मुद्दे