
レーベンシュタイン距離のコードを考えておりエラーの解決方法を教えていただきたいです。
コードは
#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件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
Visual Studio 2019 はコンパイラーとして MSVC の他 clang が使用できます。
別途 Visual Studio Installer でインストールする必要はありますが、プロジェクトのプロパティでプラットフォーム ツールセットを「LLVM (clang-cl)」に変更すると、可変長配列 (VLA) が使用できます。

No.6
- 回答日時:
> C standards support
> Variable length array (VLA) support isn't planned.
ということで、Visual C を使っている限りは、そのままではコンパイルできません。
対策は次の通り。
・GCC等の対応しているコンパイラを使う
初心者には難易度高
・従来(C99より前)使われてきた手段を使う
・適当に大きは配列を用意する
int d[500][500]; 等
予想を越えてきた場合に問題有り
・mallocやcallocなどのメモリ確保の仕組みを使う
初心者には難易度やや高
No.5
- 回答日時:
VLA は C99 で一度標準になったんだけど C11 ではオプションになっている (C17 でも同様) ので
C11/C17 対応
というだけでは処理できない可能性がある.
実際のところ MS は予定してないって言ってるしね.
No.4
- 回答日時:
もう一回書きますが、Microsoft Visual Studio 2019では
Visual Studio に C11 および C17 サポートをインストールする:
https://docs.microsoft.com/ja-jp/cpp/overview/in …
に従うと、ISO(国際標準化機構)規格でのC言語の最新版に準拠します。
サッサとC11/C17サポートをインストールして古いCを使うのは止めましょう。
No.3
- 回答日時:
ANSI C99に対応したコンパイラに変える。
MSVCは、それ以後には対応してますが C99 には対応していません。
Embarcadero C
とか
gcc
にすればコンパイルは出来ます。
No.1
- 回答日時:
配列の長さはコンパイル時点で決まるので、配列の長さを変数で指定することは基本的にできません。
なので、配列が取りうる最大の長さ(定数)で指定するしかないです。
おそらく、使用しているコンパイラが、配列の括弧([])の中に変数を検知したためのエラーだと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
適切な変換関数が存在しない???
C言語・C++・C#
-
配列の要素数に変数を入れたいときには
C言語・C++・C#
-
char*を初期化したいのですが
C言語・C++・C#
-
-
4
Run-Time Check Failure #3というエラーが出ます。
C言語・C++・C#
-
5
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
6
Debug Assertion Failed?
C言語・C++・C#
-
7
関数から配列を返すには?
C言語・C++・C#
-
8
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
9
C言語 配列の長さの上限
C言語・C++・C#
-
10
読み込み中にアクセス違反が発生しました、と出ます。これを回避することは
C言語・C++・C#
-
11
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
12
定数式とはどういう意味でしょうか。
C言語・C++・C#
-
13
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
14
C言語での引数の省略方法
C言語・C++・C#
-
15
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
16
C++ で、「)」が必要 というエラー
C言語・C++・C#
-
17
傾きと切片
数学
-
18
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
19
「fatal error C1189」を回避するには?
C言語・C++・C#
-
20
既定のコンストラクタがない?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
このカテゴリの人気Q&Aランキング
-
4
ペーパーマリオみたいにドット...
-
5
変数のスコープ
-
6
バッファとは何ですか
-
7
int16_t の _t は何?
-
8
逆ポーランド法の計算について
-
9
C言語初心者の質問失礼します。
-
10
略語の読み方について
-
11
C言語でdouble型の小数点の引き...
-
12
<unistd.h>をVisualStudioでつ...
-
13
C言語 1から20までの逆数の和を...
-
14
関数から配列を返すには?
-
15
C言語 入力した値から0までの数...
-
16
正負を反転させて出力するプロ...
-
17
C言語
-
18
配列を使わずに、変数名を動的...
-
19
セグメントエラー
-
20
0xffffとは?
おすすめ情報
公式facebook
公式twitter