【问题标题】:Why Visual Studio do not support variables for array size?为什么 Visual Studio 不支持数组大小的变量?
【发布时间】:2017-02-07 00:19:51
【问题描述】:

所以这是 CodeLeet 的问题陈述,用于查找最长回文子串。

在 codeleet 界面中,此解决方案有效:

class Solution {
public:
string longestPalindrome(string s) {
     int len = s.size();  
        int P[len][len];  
 memset(P, 0, len*len*sizeof(int));  
        int maxL=0, start=0, end=0;  
        for(int i =0; i< s.size(); i++){  
             for(int j =0; j<i; j++){  
                  P[j][i] = (s[j] == s[i] && (i-j<2 || P[j+1][i-1]));  
                  if(P[j][i] && maxL < (i-j+1))  
                  {  
                       maxL = i-j+1;  
                       start = j;  
                       end = i;  
                  }  
             }  
             P[i][i] =1;  
        }  
        return s.substr(start, end-start +1); 
   }
};

但是当在 Visual Studio 中编写与函数相同的东西时:

string User::longestPalindromeStr(string s) {
int len = s.size();
int P[len][len];
memset(P, 0, len*len * sizeof(int));
int maxL = 0, start = 0, end = 0;
for (int i = 0; i< s.size(); i++)
{
    for (int j = 0; j<i; j++)
    {
        P[j][i] = (s[j] == s[i] && (i - j<2 || P[j + 1][i - 1]));
        if (P[j][i] && maxL < (i - j + 1))
        {
            maxL = i - j + 1;
            start = j;
            end = i;
        }
    }
    P[i][i] = 1;
}
return s.substr(start, end - start + 1);
}

它对 len 变量说:表达式必须有一个常量值? VIsual studio ide有问题吗?我该如何解决这个问题?

【问题讨论】:

标签: c++11 palindrome visual-studio-2015


【解决方案1】:

VS 编译器没有问题。在 C++ 中,您可以使用 new int[] 创建运行时定义长度的一维数组,但 new int[][] 不可用,除非第二维是常量表达式。 以下尝试给出了编译器错误,即第二维必须是常量表达式:

int len = 10;
int **P = new int[len][len]; // error: non-constant expression as array bound (on 2nd dimension)

此链接提供了一个很好的解决方法Copy 2D array using memcpy?

【讨论】:

    【解决方案2】:

    因为可变长度数组(使用非constexpr 变量的数组声明)是 C99 功能,不是 C++ 功能。没有任何版本的 C++ 提供它们,也没有任何版本的 Visual Studio 提供特定的 C99 功能。

    如果您的代码在其他 C++ 编译器上编译,那是因为它们在 C++ 标准之上提供了 C++ 语言扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-18
      • 2011-04-16
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多