2010-10-28 3 views
0

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

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. 

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

+0

Можете ли вы показать нам декларацию «расшифрованной» переменной на обоих языках? – Matthieu

+1

vb.net или предыдущее воплощение VB, где массивы основаны на 1 вместо 0? – xcud

+0

байт [] decoded = новый байт [размер * 2]; – Barun

ответ

7

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

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

Добавить заявление checked вокруг вашего кода на C#, чтобы увидеть, что он также не работает.

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

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

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

+0

Мне нужно исправить код vb.net. – Barun

+1

Да, да./Исправить, чтобы остановить переполнение /. Я упоминаю проверенное ключевое слово, потому что вы указываете, что они не ведут себя одинаково. –

+0

Пожалуйста, не возражайте. Но ты не помогаешь мне. – Barun

0

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

Артикул: link text

+0

Но он отлично работает в C# – Barun

+0

Попробуйте понять, что я знаю C#, но не знаю vb.net. Я даже не предполагал, что преобразование вызовет проблему. – Barun

+0

, пожалуйста, дайте мне решение, что будет преобразованным кодом в vb этого кода [decoded [2 * i + 1] = (byte) (muLawToPcmMap [data [i]] >> 8);] – Barun

0

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

+0

Фактически, когда я конвертировал его с конвертером, кастинг там не было. И это тоже давало такое же исключение. – Barun

+0

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

+0

Можете ли вы предоставить образцы данных, которые вы пытаетесь преобразовать? –

1

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

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

является

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

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

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

+0

Да, конвертер изменил его, как вы упомянули. Но в каждом случае это дает исключение. – Barun

Смежные вопросы