2011-02-10 9 views
6

tengo un código que se parece a (más o menos):No se puede convertir de doble [] [] para duplicar [*, *]

public void INeedHolidaysNow(double[,]){ 
    //... Code to take a break from coding and fly to Hawaii 
} 

double[][] WageLossPerVacationDay = new double[10][5]; 

INeedHolidays(WageLossPerVacationDay); // >>throws the Exception in the Title 

he encontrado la solución en this post que consiste en un bucle en lugar thant probando un reparto salvaje

Así que mi pregunta es: ¿POR QUÉ? ¿Qué sucede detrás de las escenas en la asignación de memoria que impide lo que puede parecer, al menos a primera vista, ser un modelo viable? Quiero decir estructuralmente, ambas expresiones parecen ser bastante idénticas. ¿Qué es lo que me falta aquí?

EDIT: Tengo que usar "double [] []" como lo proporciona una biblioteca externa.

Respuesta

10

Una es una matriz dentada, la otra es un bloque grande.

double[][] es una matriz que contiene matrices de doble. Su forma no es necesariamente rectangular. En términos c es similar a double**

double[,] es solo un gran bloque de memoria, y siempre es rectangular. En términos c es solo un doble * donde usa myArray[x+y*width] para acceder a un elemento.

+0

CodeInChaos stroke Again ;-) Siempre precisa y relevante en cuestiones de memoria. Gracias –

2

En pocas palabras, [,] matrices (matrices 2D) y [][] matrices (matrices irregulares) no son lo mismo.

Una matriz [,] se puede representar visualmente mediante un rectángulo (de ahí que también se le conozca como una matriz rectangular), mientras que una matriz [][] es una matriz 1D que contiene otras matrices 1D.

No tendría mucho sentido ser capaz de transmitir el uno al otro.

0

debe definir su matriz doble de esta manera:

double[,] WageLossPerVacationDay = new double[3, 5]; 

entonces debería funcionar!

hth

+0

Gracias. Ese no era mi punto, ya que el código era solo un ejemplo, tengo que usar una matriz de matrices en realidad –

Cuestiones relacionadas