bool MCArraysCopyMatrix(MCExecContext& ctxt, MCArrayRef self, matrix_t*& r_matrix) { MCAutoArray<array_extent_t> t_extents; if (!MCArraysCopyExtents(self, t_extents.PtrRef(), t_extents.SizeRef()) || t_extents.Size() != 2) return false; integer_t t_rows = extent_size(t_extents[0]); integer_t t_cols = extent_size(t_extents[1]); integer_t t_row_offset = t_extents[0].min; integer_t t_col_offset = t_extents[1].min; if (MCArrayGetCount(self) != t_rows * t_cols) return false; MCAutoPointer<matrix_t> t_matrix; if (!MCMatrixNew(t_rows, t_cols, t_row_offset, t_col_offset, &t_matrix)) return false; for (integer_t row = 0; row < t_rows; row++) { for (integer_t col = 0; col < t_cols; col++) { MCAutoStringRef t_string; MCNewAutoNameRef t_name; MCValueRef t_value; if (!MCStringFormat(&t_string, "%d,%d", row + t_row_offset, col + t_col_offset) || !MCNameCreate(*t_string, &t_name) || !MCArrayFetchValue(self, true, *t_name, t_value) || !ctxt.ConvertToReal(t_value, MCMatrixEntry(*t_matrix, row, col))) return false; } } t_matrix.Take(r_matrix); return true; }