2010-12-19 11 views
8

Tengo problemas para traducir estructuras de datos C++ a Scala. Scala es realmente diferente de C++, pero me gusta mucho. Tengo el siguiente fragmento de código en C++:Preguntas sobre Scala desde un programador C++ (estructuras y 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; 

ahora llenar la lista en un bucle while con los datos

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

he intentado crear una clase simple en Scala para contener los datos.

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

Pero esto no funciona porque el punto no está inicializado. ¿Hay alguna forma de evitar esto? Solo quiero definir la variable pero no inicializarla.

Otra cosa rápida. Estoy buscando un equivalente a stl :: lower_bound.

Encuentra la posición correcta para insertar un elemento en un contenedor ordenado para mantener el orden.

Gracias por ayudar a un principiante Scala

+0

No creo que encuentre un equivalente directo de 'std :: lower_bound '. ¿Para qué crees que lo necesitas? –

+0

'Seq.indexWhere' podría ser una posibilidad. – Debilski

+0

Tengo una Lista lista val = Lista (1.0, 2.0, 3.0, 4.0) que representan intervalos. Ahora tengo un punto 2.5 por ejemplo y necesito saber en qué intervalo se encuentra (entre 2.0 y 3.0). Gracias por el indexWhere voy a probarlo. – Radfahrer

Respuesta

3

me acaba de encontrar la respuesta a la intialistion:

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

Puh Scala tiene una gran cantidad de syntx para acostumbrarse a :-)

Alguien tiene una solución para el equivalente low_bound?

3

Es difícil traducir eficazmente, ya que ha dejado una gran cantidad de incógnitas ocultos tras pseudo código, pero me gustaría abogar algo en este sentido:

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

Si puede dar cuerpo a su código de muestra de una un poco más completo, podré dar una mejor traducción.

+0

esto parece interesante (todavía soy nuevo en programación funcional).Aquí está el código completo de C++: http://paste.pocoo.org/show/307014/. Las partes interesantes están en la línea 224-251 – Radfahrer

4

¿Por qué no quieres inicializarlo? Para la eficiencia? Me temo que la JVM no le permite salirse con la suya al azar en sus variables basadas en lo que haya originalmente. Entonces, como tiene que inicializarlo de todos modos, ¿por qué no especifica cuál es su valor "no inicializado"?

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

(Usted podría utilizar Double.NaN y comprobar si hay point.isNaN si más adelante necesita ver si el valor se ha inicializado o no.)

usted podría utilizar _ como la inicialización por defecto, pero menos que lo utilice en el código genérico:

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

entonces estás ocultando lo que el valor de verdad se establecerá en. (O está anunciando "Realmente no me importa lo que vaya aquí, podría ser cualquier cosa", lo cual podría ser útil)

+0

Bueno, en su mayoría por costumbre :-) Gracias por esas opciones. Me gusta el NaN con permite comprobar si se inicializa – Radfahrer