2013-08-27 58 views
0

到system.string我写了一个程序写在不同的基地数(基数为10,二进制,基地53,无论...)焦炭在windowsforms

我inicially写它作为一个Win32控制台应用程序,在视觉C++ 2010,然后将其转换为Windows窗体应用程序(我知道,我知道...)

在原始形式,它的工作完美,但转换后,它停止工作。我缩小的问题这样:

该程序使用,其接收数字,并返回一个字符的函数:

char corresponding_digit(int digit) 
{ 
    char corr_digit[62] = {'0','1','2','3','4','5','6','7','8','9', 
          'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P' ,'Q','R','S' ,'T','U','V','W','X','Y','Z', 
          'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' , 'q','r','s' ,'t','u','v','w','x','y','z'}; 
    return corr_digit[digit]; 
} 

这个函数有数字1到61,并返回对应的字符:0- 9→0-9; 10-35 - > A-Z; 36-61 a-> z。

程序使用这样的功能:

//on a button click 
//base is an integer got from the user 
String^ number_base_n = ""; 
if(base == 10) 
    number_base_n = value.ToString(); 
else if(base==0) 
    number_base_n = "0"; 
else 
{ 
    int digit, power, copy_value; 
    bool number_started = false; 
    copy_value = value; 
    if(copy_value > (int)pow(float(base), MAX_DIGITS)) //cmath was included 
     number_base_n = "Number too big"; 
    else 
    { 
     for(int i = MAX_DIGITS; i >= 0; i--) 
     { 
      power = (int)pow(float(base), i); 
      if(copy_value >= power) 
      { 
       digit = copy_value/power; 
       copy_value -= digit*power; 
       number_started = true; 
       number_base_n += corresponding_digit(digit); 
      } 
      else if (number_started || i==0) 
      { 
       number_base_n += "0"; 
      } 
     } 
    } 
}  
textBox6->Text = number_base_n; 

调试了一下后,我才意识到问题发生时功能corresponding_digit被调用位值“1”,这应该返回“1”,在表达

//number base_n equals "" 
number_base_n += String(corresponding_digit(digit)); 
//number_base_n equals "49" 

number_base_n,起始于“49”,这实际上是1。ASCII值我的在线搜索“结束于”,并且所有我被转换的结果,与字符串(值)或值.ToString(),但显然我不能这样做

number_base_n += corresponding_digit(digit).ToString(); 

我试图用一个附配的变量:

aux = corresponding_digit(digit); 
number_base_n += aux.ToString(); 

,但我得到了完全相同的(错误)结果...(同样的事情字符串(值))

我周围失手有点多,但我相信没有什么值得一提的。 那么......有什么帮助?

另外:基地10和基地0的正常使用

编辑:如果downvoter会照顾发表意见,并解释他为什么downvoted ...建设性的批评,我认为这是项。

回答

1

在C++/CLI中,char与在C++中是一样的:单个字节,表示单个字符。在C#中,char(或System.Char)是一个两字节的Unicode码点。与C#的char等效的C++和C++/CLI是wchar_t。 C++的char等效于C#中的System::Byte

正如您现在所做的那样,尝试使用托管字符串执行操作会导致托管API将C++ char视为C#byte,这是一个数字,而不是字符。这就是为什么你要获得角色的ASCII值,因为它被视为数字而不是角色。

为了明确事情,我建议您将corresponding_digit方法的返回类型切换为System::Char。这样,当您使用受管理的字符串进行操作时,受管理的API将知道相关数据是字符,并且您将获得预期的结果。

System::Char corresponding_digit(int digit) 
{ 
    System::Char corr_digit[62] = {'0','1','2','3','4','5','6','7','8','9', 
          'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 
          'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
    return corr_digit[digit]; 
} 

其他可能发生的变化,你可以做:

  • 使用,而不是附加的字符串StringBuilder的。
  • 将corr_digit切换到托管阵列(array<System::Char>^),并将其存储在某个可重用的位置。由于现在编写代码,因此每次调用方法时,对应的数据方法都必须从头开始重新创建此数组。
+0

您提供的信息量非常大。首先是:改变为System :: Char就像魅力一样工作。问题解决了,非常感谢。一旦完成托管数组,我将查看StringBuilder。之前我曾试图实现它,但由于它是一个小型项目,运行时间很少,数组的使用非常基本,我使用了基本数组。但是,我想,我应该习惯这种更有效的解决方案。再次谢谢你。 – Sampaio