2012-03-16 1 views
-1

Я ищу десятичную буквенно-цифровую библиотеку конвертеров баз данных в Visual Basic, которая не использует рекурсию.Ищите десятичную буквенно-цифровую библиотеку базового конвертера в Visual Basic (или алгоритм псевдокода) БЕЗ рекурсии

я нашел: http://visualstudiomagazine.com/articles/2010/07/20/when-hexadecimal-is-not-enough.aspx

, который включает в себя демо-приложение, но обнаружил, что он использует рекурсию. Проблема с использованием рекурсии стала очевидной, когда я попытался интегрировать библиотеку в свой собственный проект Visual Studio Express 2010 Visual Basic: у меня было исключение переполнения стека.

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

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

Я сделаю больше исследований и попытаюсь написать алгоритм с нуля, но скорее не буду изобретать колесо, если оно уже существует, поэтому отсюда и этот вопрос. Поиск здесь не совсем дал мне то, что я искал.

Можете ли вы указать мне в направлении существующей нерекурсивной десятичной до буквенно-цифровой библиотеки конвертеров в Visual Basic?

+1

У этого есть ссылка на это (не проверено, если он использует рекурсию): http://www.devx.com/vb2themax/Tip/19316 – assylias

+0

+1 @assylias спасибо, это выглядит многообещающим, проверяя его сейчас ... – therobyouknow

+0

Yup, выглядит без рекурсии :) Я просмотрел, это не самый читаемый код и VB, используя имя функции, поскольку возвращаемое значение может ввести в заблуждение, но да, похоже, не рекурсивно. Итак, теперь я собираюсь интегрировать его в проект Visual Studio 2010 Express Visual Basic и протестировать его. Я отправлю отчет и после этого, если ОК @assylias, если вы затем предоставите это как ответ, я должен уметь его принимать и повышать. – therobyouknow

ответ

0

Это решение, которое я предоставляю себе, кажется, работает - так просто! Но это потому, что это одностороннее обращение; другие библиотеки стремятся быть двухсторонним преобразованием, обратно и вперед между базами разницы - но мне не нужны оба пути.


Public Class BaseConverter 


    Public Shared Function ConvertToBase(num As Integer, nbase As Integer) As String 

     Dim retval = "" 

     Dim chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

     ' check if we can convert to another base 
     If (nbase chars.Length) Then 
      retval = "" 
     End If 

     Dim r As Integer 

     Dim newNumber As String = "" 

     ' in r we have the offset of the char that was converted to the new base 
     While num >= nbase 
      r = num Mod nbase 
      newNumber = chars(r) & newNumber 

      'use: num = Convert.ToInt32(num/nbase) 
      '(if available on your system) 
      'otherwise: 
      num = num \ nbase 
      ' notice the back slash \ - this is integer division, i.e the calculation only reports back the whole number of times that 
      ' the divider will go into the number to be divided, e.g. 7 \ 2 produces 3 (contrasted with 7/2 produces 3.5, 
      ' float which would cause the compiler to fail the compile with a type mismatch) 
     End While 

     ' the last number to convert 
     newNumber = chars(num) & newNumber 

     Return newNumber 
    End Function 


End Class 

Я создал приведенный выше код в Visual Basic на основе C# код в следующей ссылке:

КРЕДИТ: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5babf71f-4375-40aa-971a-21c1f0b9762b/ ("преобразование из десятичной (базовый-10) на буквенно-цифровой (базовый 36) «)


public String ConvertToBase(int num, int nbase) 
{ 
    String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    // check if we can convert to another base 
    if(nbase chars.Length) 
     return ""; 

    int r; 
    String newNumber = ""; 

    // in r we have the offset of the char that was converted to the new base 
    while(num >= nbase) 
    { 
     r = num % nbase; 
     newNumber = chars[r] + newNumber; 
     num = num/nbase; 
    } 
    // the last number to convert 
    newNumber = chars[num] + newNumber; 

    return newNumber; 
} 

@assylias Я не мог получить devx.com/vb2themax/Tip/19316 работать - я получил неверное значение обратно. Спасибо, хотя за предложение.

Нет никаких доказательств того, что он работает. Я скорректировал некоторые декларации и поверхностную структуру кода, чтобы получить его для успешного создания в Visual Studio Express 2010 Visual Basic. Затем, пройдя через код в отладчике Visual Studio Express 2010 Visual Basic, код трудно понять: имена переменных не очевидны, нет комментариев относительно того, почему он делает то, что он делает. Из того, что я понял, это делалось, казалось, что это не должно делаться, чтобы сделать базовое преобразование.