Vb.net Исключение - PullRequest
       1

Vb.net Исключение

0 голосов
/ 28 октября 2010

Я только что преобразовал свой код C # в vb.net. И это дает исключение.

c # код:

private static short[] muLawToPcmMap;

decoded[2 * i + 1] = (byte)(muLawToPcmMap[data[i]] >> 8);

VB код:

decoded(2 * i + 1) = CByte(muLawToPcmMap(data(i)) >> 8)

Исключение:

Arithmetic operation resulted in an overflow.

У меня очень много проблем. Пожалуйста, помогите.

Ответы [ 4 ]

7 голосов
/ 28 октября 2010

Ваш код приводит к переполнению для типа данных, с которым вы работаете.

Поведение по умолчанию в VB.NET - проверка арифметических операций, а в C # - не проверка арифметических операций.

Добавьте оператор флажок вокруг кода C #, чтобы увидеть, что он также не работает.

checked {
   // do all your work here, any overflow will cause an exception
}

Исправьте ваш код, чтобы остановить переполнение. Как отмечают мои комментарии ниже, арифметическое переполнение не обязательно нужно игнорировать. Здесь вы выполняете операции, которые приводят к вероятным неожиданным результатам, и вы должны явно для этого написать код (увеличив размер шрифта или обработав ошибку).

Абсолютно последнее, что вы должны сделать (IMO), это в свойствах вашего проекта, вкладка «Компиляция», кнопка «Дополнительные параметры компилятора», установить флажок «Удалить проверки целочисленного переполнения». Лично я считаю, что это плохая идея, и лично я использую checked в C # всякий раз, когда я делаю вещи, которые переполняют мои переменные. Неудача рано, часто неудача и все.

1 голос
/ 28 октября 2010

Проверьте, если ваш перевод

byte[] decoded = new byte[size*2]; 

есть

Dim decoded As Byte() = New Byte(size * 2 - 1) {}

или нет, как в vb.net, вы объявляете массивы с индексом последнего элемента, а не с самим размером.

В зависимости от того, как вы переводили декодированный, вам нужно проверить остальную часть кода, чтобы адаптировать его к выбранной вами версии.

0 голосов
/ 28 октября 2010

Я заметил, что ваш код C # не содержит приведение к короткому, но ваш код VB.NET содержит. Это возможно приведение вызывает сдвиг бита в бит, что вызывает переполнение. (Не могу сказать, не видя данных.) Удалите его.

0 голосов
/ 28 октября 2010

Скорее всего, число, которое вы пытаетесь преобразовать, находится вне диапазона Byte или Short

Ссылка: текст ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...