2010-12-19 11 views
8

मुझे स्कैला में सी ++ डेटा संरचनाओं का अनुवाद करने में समस्याएं आ रही हैं। स्कैला सी ++ से वास्तव में अलग है, लेकिन मुझे इसमें बहुत पसंद है।सी ++ प्रोग्रामर (structs और stl) से स्कैला पर प्रश्न

struct Output 
{ 
    double point; 
    double solution[6]; 
}; 

struct Coeff 
{ 
    double rcont1[6]; 
    double rcont2[6]; 
    double rcont3[6]; 
    double rcont4[6]; 
    double rcont5[6]; 
    double rcont6[6]; 
}; 
std::list<Output> output; 
std::list<Coeff> coeff; 

मैं अब डेटा

while(n<nmax) { 
    if step successfull 
     Output out; 
     out.point = some values; 
     out.solution[0] = some value; 
     output.push_back(out); 
} 

मैं स्काला में एक साधारण वर्ग बनाने डेटा रखने के लिए करने की कोशिश की के साथ थोड़ी देर के पाश में सूची को भरने: मैं C++ निम्नलिखित कोड टुकड़ा है।

class Output 
{ 
    var point: Double 
    var solution: Array[Double] = new Array(6) 
} 

लेकिन यह काम शुरू नहीं होने के बाद से काम नहीं करता है। क्या इसके चारों ओर एक रास्ता है? मैं बस चर को परिभाषित करना चाहता हूं लेकिन इसे प्रारंभ नहीं करना चाहता हूं।

एक और त्वरित बात। मैं stl :: lower_bound के बराबर की तलाश में हूं।

आदेश को बनाए रखने के लिए एक क्रमबद्ध कंटेनर में तत्व डालने का सही स्थान पाता है। :-) के लिए इस्तेमाल किया पाने के लिए

class Output 
{ 
    var point: Double = _ 
    var solution: Array[Double] = Array(6) 
} 

Puh स्काला syntx का एक बहुत है

किसी को भी है:

एक स्काला शुरुआत मदद के लिए धन्यवाद

+0

मुझे नहीं लगता कि आपको 'std :: lower_bound का प्रत्यक्ष समकक्ष मिलेगा '। आपको क्या लगता है कि आपको इसकी आवश्यकता है? –

+0

'Seq.indexWhere' एक संभावना हो सकती है। – Debilski

+0

मेरे पास एक सूची मूल्य सूची = सूची (1.0, 2.0, 3.0, 4.0) है जो अंतराल का प्रतिनिधित्व करती है। मेरे पास अब उदाहरण के लिए एक बिंदु 2.5 है और यह जानने की जरूरत है कि यह किस अंतराल में है (2.0 और 3.0 के बीच)। इंडेक्स के लिए धन्यवाद जहां मैं इसे आज़माउंगा। – Radfahrer

उत्तर

3

मैं सिर्फ intialistion का जवाब मिल गया निचले_बाउंड समकक्ष के लिए एक समाधान?

3

यह प्रभावी ढंग से अनुवाद करने के लिए के रूप में आप छद्म कोड के पीछे छिपा हुआ अज्ञात का एक बहुत छोड़ दिया है कठिन है, लेकिन मैं इन पंक्तियों के साथ कुछ की वकालत चाहते हैं:

// type alias 
type Coeff = Seq[Seq[Double]] 

// parameters passed to a case class become member fields 
case class Output (point: Double, solution: Seq[Double]) 

val outputs = (0 to nmax) map { n => 
    Output(generatePoint(n), generateSolution(n)) 
} 

आप अपने नमूना कोड एक शरीर से बाहर कर सकते हैं थोड़ा और पूरी तरह से, मैं एक बेहतर अनुवाद देने में सक्षम हो जाएगा।

+0

यह दिलचस्प लग रहा है (मैं अभी भी कार्यात्मक प्रोग्रामिंग के लिए नया हूँ)।यहां पूरा सी ++ कोड है: http://paste.pocoo.org/show/307014/। दिलचस्प भाग फॉर्म लाइन 224-251 – Radfahrer

4

आप इसे क्यों शुरू नहीं करना चाहते हैं? दक्षता के लिए? मुझे डर है कि जेवीएम आपको मूल रूप से जो कुछ भी था, उसके आधार पर आपके चर में यादृच्छिक जंक होने से दूर नहीं जाने देता है। इसलिए जब भी आपको इसे प्रारंभ करना होगा, तो क्यों न निर्दिष्ट करें कि आपका "प्रारंभिक" मान क्या है?

class Output { 
    var point = 0.0 
    var solution = new Array[Double](6) 
} 

(आप Double.NaN इस्तेमाल कर सकते हैं और point.isNaN के लिए जाँच आप बाद में देखने के लिए कि मूल्य प्रारंभ कर दिया गया है या नहीं की जरूरत है।)

आप डिफ़ॉल्ट प्रारंभ के रूप में इस्तेमाल कर सकते हैं _, लेकिन जब तक आप इसका इस्तेमाल जेनेरिक कोड में:

class Holder[T] { 
    var held: T = _ 
} 

तो आप बस अस्पष्ट कर रहे हैं कि मूल्य वास्तव में क्या सेट किया जाएगा। (या आप घोषणा कर रहे हैं "मुझे वास्तव में परवाह नहीं है कि यहां क्या है, यह कुछ भी हो सकता है" - जो उपयोगी हो सकता है।)

+0

अधिकतर आदत से बाहर हैं :-) उन विकल्पों के लिए धन्यवाद। मुझे NaN पसंद है, यह जांचने की अनुमति देता है कि यह प्रारंभ हो गया है या नहीं – Radfahrer

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