前提・実現したいこと
VisualStudio Codeで、C言語のコードを実行したい
- コードは、新・明解 C言語で学ぶアルゴリズムとデータ構造(柴田望洋・著)に記載されているものを使用
- コンパイル手順:空のフォルダを作成 -> 『新規ファイル』で下記のコードを記述 -> そのままF5『デバッグの開始』で実行 -> その際に.vscodeフォルダとexeファイルが自動で作成
エラーメッセージ(消えました)
発生場所 行:1 文字:3 + i & 'c:\Users\si910.vscode\extensions\ms-vscode.cpptools-1.1.0-insid ... アンパサンド (&) 文字は許可されていません。& 演算子は、今後使用するために予約され ています。アンパサンドを二重引用符で囲み ("&")、文字列の一部として渡 してください。 + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : AmpersandNotAllowed
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3 4// a < b: -1, a > b: 1, a = b: 0 5int int_cmp(const int *a, const int *b) 6{ 7 if (*a < *b) 8 return -1; 9 else if (*a > *b) 10 return 1; 11 else 12 return 0; 13} 14 15int main(void) 16{ 17 int i, nx, ky; 18 int *x; 19 int *p; 20 21 puts("bsearch関数による探索"); 22 printf("要素数:"); 23 scanf("%d", &nx); 24 x = calloc(nx, sizeof(int)); 25 26 printf("昇順に入力してください。\n"); 27 printf("x[0]: "); 28 scanf("%d", &x[0]); 29 30 for (i = 1; i < nx; i++) { 31 do { 32 printf("x[%d]: ", i); 33 scanf("%d", &x[i]); 34 } while(x[i] < x[i - 1]); 35 } 36 37 printf("探す値: "); 38 scanf("%d", &ky); 39 40 p = bsearch(&ky, x, nx, sizeof(int), (int (*)(const void *, const void *))int_cmp); 41 42 if (p == NULL) 43 puts("探索に失敗しました。"); 44 else 45 printf("%dはx[%d]にあります。\n", ky, (int)(p - x)); 46 free(x); 47 48 return 0; 49}
試したこと
- エラーメッセージ通りに、
scanf("%d", "&"nx)
のように、コード中の&演算子を全て""で囲んでみましたが、当然というか、エラーでした。
- 拡張機能のC/C++をアンインストール&再インストールしてみました。エラーは出なくなりましたが、本来出力されるはずの
「bsearch関数による探索
要素数:」
がいつまでたっても出ないので、停止させました。ターミナルやデバッグコンソールなどチェックしましたが、どのタブにも形跡はありませんでした。
- F5キーで自動生成されたexeファイルを、VScodeのターミナルから、
./bsearch01.exe
で実行すると、あっさり成功しました。
つまり、vscodeの実行機能(F5、またはF5+ctrl)では止まってしまうが、ターミナルからのコマンド実行は問題ないことになります。
成功?
コンパイラはmingwを使用していたのですが、64bitであればmingw-w64の方が良いと書かれていたので、インストールしてみました。すると、なぜかF5でちゃんと動くようになり、期待通りの結果がターミナルに表示されました。
しかし、ひとつ気になる点ができました。
デバッグコンソールに、
Thread 1 hit Breakpoint 1, main () at c:\Users"ユーザー名"\Desktop\HelloWorld_c\bsearch01.c:21
21 puts("bsearch関数による探索");
と表示されます。文字通りに解釈するなら、ブレイクポイントに行きあたったということなのでしょうが、今回はブレイクポイント(あの赤い〇)を設定していないので、どこか誤作動しているのではないかと思います。
試したこと
- mingw-w64のセットアップでスレッドや例外処理を変えてみました。試した組み合わせは、win32/seh, posix/sjlj, posix/sehの3種類をインストールしました。しかし、表示は変わりません。
補足情報(FW/ツールのバージョンなど)
VisualStudio Code: 1.50.1(user setup)
OS: Windows_NT x64 10.0.18363
コンパイラ: gcc.exe (MinGW.org GCC Build-2) 9.2.0
コンパイラ(変更後): gcc.exe (mingw-w64版)
回答1件
あなたの回答
tips
プレビュー