
レーベンシュタイン距離のコードを考えておりエラーの解決方法を教えていただきたいです。
コードは
#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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー 添字が付けられた値が、...
-
「指定されたキャストは有効で...
-
C言語で分からないところがあり...
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
std::set<int> で、ある値が何...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
systemの戻り値を取得する方法
-
if と配列の組み合わせ
-
acceptをalarmでタイムアウトさ...
-
(マルチスレッド)_beginthrea...
-
比較回数と交換回数表示について
-
整数データの配列から同じ値の...
-
C言語で三目並べをするプログラ...
-
式は定数値が必要です」という...
-
system関数がうまくいかない
-
リッチテキストへの行ごとの背...
-
HANDLEて何ですか?
-
CStringの配列要素を関数で受け...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
(int *)の意味
-
ColorをRGBで指定する方法
-
未解決の外部シンボル _printf...
-
構造体の勉強中です 合計点の高...
-
商と剰余を同時に求める(C言語)
-
C言語で分からないところがあり...
-
式は定数値が必要です」という...
-
C言語での奇数の和
-
std::set<int> で、ある値が何...
-
課題でつまってます・・・
-
int16_t の _t は何?
-
比較回数と交換回数表示について
おすすめ情報