Excel-DNA: одномерный массив ограничен 65536 строками

При попытке вызвать следующий метод Excel-DNA-Method в VBA я получаю только массив размером 1 (после 65536 строк размер массива, кажется, изменяется до реального размера массива - 65537). При вызове метода на листе как функции массива все работает.

[ExcelFunction(Description = "Example", Name = "Example", HelpTopic = "")]
        public static object[] example() {
            object[] ret = new object[65537];
            return ret;
        }

Я работаю с Excel 2007, лист представляет собой xlsm-лист, при использовании таких двумерных массивов все работает нормально.

 [ExcelFunction(Description = "Example", Name = "Example", HelpTopic = "")]
        public static object[,] example() {
            object[,] ret = new object[65537,1];
            return ret;
        }

Но использование двумерных массивов в обратном порядке так же, как и в случае одного

[ExcelFunction(Description = "Example", Name = "Example", HelpTopic = "")]
        public static object[,] example() {
            object[,] ret = new object[1,65537];
            return ret;
        }

У кого-нибудь есть идея, как обойти это?

То же самое в VBA работает нормально

Function test()
    Dim ret As Variant
    ReDim ret(65536)
    test = ret
End Function

Sub testSub()
    Dim output
    output = Application.Run("test")
End Sub

вывод имеет размерность 65537 (индексация начинается с 0), также работают числа больше 65537.


person Sebastian Müller    schedule 10.01.2013    source источник
comment
Вы хотели использовать object[] вместо object[,] в первом примере?   -  person CodesInChaos    schedule 10.01.2013
comment
Если вы сделаете функцию VBA, возвращающую такой одномерный массив, а также вызовете ее через Application.Run, возникнет ли у вас такая же проблема?   -  person Govert    schedule 10.01.2013
comment
да, первый пример - это объект []   -  person Sebastian Müller    schedule 11.01.2013
comment
Нет, код в VBA работает нормально, я добавил пример выше   -  person Sebastian Müller    schedule 11.01.2013
comment
Не могли бы вы сравнить объект [65537,1] с объектом [1, 65537]? Я думаю, что последний должен быть таким же, как объект [65537].   -  person Govert    schedule 17.01.2013
comment
вы правы, так как в случае с object[65537] я получаю одномерный вариант в vba с object[1,65537]   -  person Sebastian Müller    schedule 17.01.2013
comment
@Xelluloid могу ли я подтвердить, что вы хотите 1. вернуть индексацию одномерного массива от 0 до 1 или 2. вернуть индексацию двумерного массива от 0 до 1, от 0 до 65537?   -  person bonCodigo    schedule 18.01.2013
comment
Я хочу вернуть одномерный массив с индексацией от 1 до x, где x > 65537, но это не работает, так как размер массива (варианта) в excel ограничен 65536 (поскольку в старых версиях excel это было ограничение строки)   -  person Sebastian Müller    schedule 18.01.2013
comment
В API C Excel нет одномерных массивов. Excel-DNA (использующий C API) маршалирует объект[65537] как объект[1,65537]. Остается только подтвердить, что это действительно ограничение (ошибка?) в C API Excel, создав небольшую надстройку на языке C, которая возвращает тип массива XLOPER12 с правильным содержимым, и проверив наличие такой же проблемы. По крайней мере, это исключило бы возможность использования Excel-DNA.   -  person Govert    schedule 18.01.2013
comment
Интересно посмотреть. Используется для запуска в VB3 (язык, а не Office), где предел размера массива был 16-разрядным целым числом со знаком, он позволял использовать массивы с определяемыми пользователем нижними границами (включая отрицательные числа), но вы все еще не могли иметь размер больше 2^15.   -  person Adrian    schedule 22.01.2013


Ответы (1)


Учитывая, что вы указали разную производительность, используя двумерные массивы и переворачивая размеры, это звучит так, как будто вы работаете с пределом строк и/или столбцов.

Эта страница: http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP010073849.aspx содержит ограничения для Excel 2007. Как вы увидите, количество столбцов на листе ограничено 16 384, что многократно превышает вашу стоимость. С другой стороны, предел строки в 1 048 576 легко может вместить значение 65 537.

Я предполагаю, что когда вы запрашиваете объект с 65537 столбцами, конструктор молча обрабатывает переполнение и разрешает его в 1.

person Christopher J Smith    schedule 16.02.2013
comment
Кстати, 65537 после удаления битов выше 2^13 (16384) равно 1. - person Christopher J Smith; 28.02.2013