プロが教えるわが家の防犯対策術!

レーベンシュタイン距離のコードを考えておりエラーの解決方法を教えていただきたいです。
コードは
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare_int(const void *a, const void *b) {
 return *(int*)a - *(int*)b;
}

int minimum(int n0, int n1, int n2) {
 int d[] = {n0, n1, n2};
 qsort(d, 3, sizeof(int), compare_int);
 return d[0];
}

int LevenshteinDistance(char str1[], char str2[]) {
 int cost;
 int lenStr1 = strlen(str1);
 int lenStr2 = strlen(str2);
 int d[lenStr1 + 1][lenStr2 + 1];

 for (int i1 = 0; i1 <= lenStr1; i1++) { d[i1][0] = i1; }
 for (int i2 = 0; i2 <= lenStr2; i2++) { d[0][i2] = i2; }

 for (int i1 = 1; i1 <= lenStr1; i1++) {
  for (int i2 = 1; i2 <= lenStr2; i2++) {
   cost = (str1[i1] == str2[i2]) ? 0 : 1;
   d[i1][i2] = minimum(
             d[i1-1][i2] + 1,   /* 文字の削除 */
             d[i1][i2-1] + 1,   /* 文字の挿入 */
             d[i1-1][i2-1] + cost /* 文字の置換 */
             );
  }
 }
 return d[lenStr1][lenStr2];
}

int main(void) {
 int p = LevenshteinDistance("JAPAN", "JPAN");
 printf("%d ", p);
 printf("\n");
 return EXIT_SUCCESS;
}
という風になっており、19行目のint d[lenStr1 + 1][lenStr2 + 1];の部分で
エラー C2131 式は定数に評価されませんでした というエラーが起こりました。少し調べたところ配列の中に変数は使えないということだったのですが何か解決方法はないのでしょうか?よろしくお願いします。

A 回答 (7件)

Visual Studio 2019 はコンパイラーとして MSVC の他 clang が使用できます。


別途 Visual Studio Installer でインストールする必要はありますが、プロジェクトのプロパティでプラットフォーム ツールセットを「LLVM (clang-cl)」に変更すると、可変長配列 (VLA) が使用できます。
「式は定数値が必要です」というエラー」の回答画像7
    • good
    • 0

https://docs.microsoft.com/en-us/cpp/build/refer …
> C standards support
> Variable length array (VLA) support isn't planned.

ということで、Visual C を使っている限りは、そのままではコンパイルできません。
対策は次の通り。

・GCC等の対応しているコンパイラを使う
 初心者には難易度高
・従来(C99より前)使われてきた手段を使う
 ・適当に大きは配列を用意する
 int d[500][500]; 等
  予想を越えてきた場合に問題有り
 ・mallocやcallocなどのメモリ確保の仕組みを使う
 初心者には難易度やや高
    • good
    • 0

VLA は C99 で一度標準になったんだけど C11 ではオプションになっている (C17 でも同様) ので


C11/C17 対応
というだけでは処理できない可能性がある.

実際のところ MS は予定してないって言ってるしね.
    • good
    • 0

もう一回書きますが、Microsoft Visual Studio 2019では



Visual Studio に C11 および C17 サポートをインストールする:
https://docs.microsoft.com/ja-jp/cpp/overview/in …

に従うと、ISO(国際標準化機構)規格でのC言語の最新版に準拠します。
サッサとC11/C17サポートをインストールして古いCを使うのは止めましょう。
    • good
    • 0

ANSI C99に対応したコンパイラに変える。


MSVCは、それ以後には対応してますが C99 には対応していません。
Embarcadero C
とか
gcc
にすればコンパイルは出来ます。
    • good
    • 0

処理系を変える.

    • good
    • 0

配列の長さはコンパイル時点で決まるので、配列の長さを変数で指定することは基本的にできません。


なので、配列が取りうる最大の長さ(定数)で指定するしかないです。

おそらく、使用しているコンパイラが、配列の括弧([])の中に変数を検知したためのエラーだと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています