質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1889閲覧

visual studioでのC++実行時のエラー

bldtemporal

総合スコア35

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/12/11 11:08

編集2021/12/12 06:24

MinGW-w64でコンパイルして実行して成功しているプログラムをvisual sutudio2022によって実行してみました。すると、
#define M_PI 3.14159265359
(1) const double SSH1=pow(DSH1,2)*M_PI/4;
ような式で、➀式が必要です。②構文エラー:'='、と表示されます。何かおかしいのでしょうか、
一方下記の式では、エラー表示はありません。どこに違いがあるのかわかりません。
(2) const double Bconst=(FB1 - FB2) / ZEND;

(1)のケースでエラーが出る理由を教えて頂けないでしょうか

・ソースの抜粋を貼り付けます。エラーメッセージにつきましては、visual studioからコピペできませんでした。お許し下さい。
#include<cstdio>
#include<cstdlib>
#include <math.h>
#include <time.h>

Subroutine prototype declaration
int main() {
fp=fopen("Mod-Fdsp720_HydDmp.txt", "r");
if((fp = fopen("Mod-Fdsp720_HydDmp.txt", "r")) == NULL) {
printf("\n Mod-Fdsp720_HydDmp file open failure !!\n");
}
double FB1,FB2,ZEND,ZDS,ZD1,ZD2,ZD3,ZD4,FRB1,FRB2;
fscanf(fp, "%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf",FB1,FB2,----);
printf("Mod-Fdsp720_ HydDmp: FB1=%6.0f,FB2=%5.0f,---);
const double Bconst=(FB1-FB2)/ZEND;
const double BRconst=(FRB2-FRB1)/ZEND;
const double SHDP=(pow(DHDP,2)-pow(DHDPROD,2))*M_PI/4;
const double SSH1=pow(DSH1,2)M_PI/4;
----計算が続きます。
return (0);
}

subroutine programが続きます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/12/11 11:46 編集

エラーが再現する最小コードの提示をお願いします。(DSH1,FB1,FB2,ZEND等の定義が不明です。) Visual C++ 2022 で試してみましたが、以下のコードでは特段、エラーにはならないようでした。 ----------------------------------------------- #define M_PI 3.14159265359 #define DSH1 1 const double SSH1=pow(DSH1,2)*M_PI/4; printf("SSH1 = [%lf]\n", SSH1); -----------------------------------------------
cx20

2021/12/11 12:24

可能であればエラーが出ている画面を質問文に貼り付けてもらっても良いでしょうか?(現状、状況が良く分からない為です。)
thkana

2021/12/12 00:20

コンパイル言語の場合、「実行」というのは、ソースコードに書いてある内容を実行している時のエラーのことをいいます。コンパイル時のエラーは実行時のエラーとはいいません。 コンパイル時のエラーと実行時のエラーは原因も対応も異なりますから、ソコを混同してはいけません。 コンパイルもデバッグ実行も「実行ボタンを押す」としか認識していないのかも知れませんが...
itagagaki

2021/12/12 01:15

情報が足りなすぎますが、SSH1がマクロになっていたりしませんか? その行の前に #undef SSH1 を入れてコンパイルしたらエラーの出方が変わったりしませんか?
bldtemporal

2021/12/12 06:01

・cx20様:ご親切なご教示有難うございます。DSH1はあなの直径、FB1,FB2はバネの力、ZENDはストロークエンドの意味です。従って、SSH1は面積を求めているだけです。あまり大きな意味はありません。また、ソースの抜粋とエラーメッセージを編集で貼り付けます(ここに貼り付けたいのですができません)。質問の他にもいろいろエラーが出ています。MinGW-w64でOKだったのをコピペしたのですが全くうけつけられません。ともかく最初に質問の2事項を片付けたいと思います。 ・thkana様:文言は正確でなかったかも知れません。本では「デバック」から「デバック無しに開始する」を選択する。となっていまして、”プログラムの実行”の項に入っています。 itagaki様:ご意見有難うございます。上記の通りで、SSH1は単なる面積です。
thkana

2021/12/12 06:18

「正確でない」ではなく「間違い」です。 コンパイルして(コンパイルが成功すれば)実行する動作を行うボタンを押してエラーになったから「実行エラー」ではありません。 あくまで、「コンパイルという作業の過程でエラーになっている」ということを理解しましょう。 特定のツールの用語の使い方に惑わされてヘンなことを覚えないほうがいいです(そんなことはわかっている人が使う前提でツールの機能の名前付けが甘いと言えば甘いのかも)。 まぁ、今はそれが主題ではないので、心の片隅にでも置いておいてください。
cx20

2021/12/12 06:37

bldtemporal さん> > エラーメッセージにつきましては、visual studioからコピペできませんでした。 質問文の編集画面にある「画像の挿入」を選ぶことで画像として貼り付けられるかと思います。 <手順> ■ teratailで画像を貼る方法 https://teratail.com/questions/31272
bldtemporal

2021/12/12 06:53

thkana様 文言の問題について深く議論する意思はありませんが、Fortranでは、ビルド(コンパイル)、リンク、実行と段階を経ていますので、入門者として、本の説明はちょっと違和感があったことは事実です。しかし、visusl studioの場合、”デバック無しで開始”をクリックすれば、コンパイルから実行まで進み、結果をプリントしますから、著者が実行というのも、あながち間違いではないと解釈しました。 ぜひ本題でのご意見をお願い致します。
itagagaki

2021/12/12 07:18

> SSH1は単なる面積です。 いや、そうではなくて SSH1 という名前のマクロが定義されてはいませんかと尋ねているんです。 私が教えた #undef SSH1 は試したのですか?
itagagaki

2021/12/12 07:21

それから // const double SHDP=(pow(DHDP,2)-pow(DHDPROD,2))*M_PI/4; これをこのようにコメントアウトしてコンパイルしてみて、もしエラーの出方が変わったら、問題は const double SSH1=pow(DSH1,2)*M_PI/4; の行ではなく const double SHDP=(pow(DHDP,2)-pow(DHDPROD,2))*M_PI/4; の行にあります。 これも確認してみるといいです。
bldtemporal

2021/12/12 08:55

itagaki 様:アドバイス有難うございます。#undef SSH1をヘッダーファイルに付け加えて実施してみましたがエラーメッセ-ジは何も変わりませんでした。また、#undef SSH1を入れた状態で、 // const double SHDP=(pow(DHDP,2)-pow(DHDPROD,2))*M_PI/4;としてみたところ、この134行目のエラーメッセージが無くなっただけで、あとのエラーメッセージは全く変わりませんでした。
bldtemporal

2021/12/12 10:59

itagagaki 様 全投稿で名前間違いをお詫び致します。
thkana

2021/12/12 11:35

> ぜひ本題でのご意見をお願い致します。 いやそう言われましても。答えられるだけの情報がないですから。 想像で言うなら、「実行エラー」でも「コンパイルエラー」でもなくて、実はIntelliSenseが警告しているだけじゃないか、あたりじゃないか?とか。 'VisualStudio C++ 式が必要です'でGoogleで検索してまともにヒットするのが"一つも"出てこないんだから、こりゃコンパイルエラーですらないんじゃないか、と疑っています。コピペができないってのはツールチップだから、だったり? そのエラーはVisualStudio IDE画面上の「どこに」出ているのかなぁ? なんてことを考えながら、様子見をしています。
bldtemporal

2021/12/13 00:44

thkana様 ご意見重ね重ね有難うございます。ともかく入り口でつまづいていることは確かです。MinGW-w64での、C言語、C++では問題なく通ていますので不思議です。それらとルールの違いもかなりあるのではないか、とも感じます。例えば、複数行に渡り、\で改行するコマンド(式)の場合、MinGWでは、初行の最初に"//"をつければ、コメント化できますが、visual studioでは全行に"//"をつけないとエラーになります。記載のルールが全然違うのではないかと疑っています。この上は、”Hello world”とか打ち出すサンプルプログラムに式を記載してみて”式が必要です”のエラーが出るか試してみようと思っています。それから私も”式が必要です”のエラーをネットで検索してみました。”~が必要です”のエラーが一杯出る、との例はありましたが、まともなものは一つもありませんでした。
cx20

2021/12/13 02:48

bldtemporal さん> > MinGW-w64での、C言語、C++では問題なく通ていますので不思議です。 gcc/g++ にあまり詳しくないですが、既定のコンパイルオプションだとチェックが緩いようです。 gcc/g++ で「-Wall」オプションを追加してコンパイルを試してもらえますか? > ”式が必要です”のエラー エラーの内容ですが、自分の回答の追記部分(最後尾)の内容のエラーではないでしょうか? 同じエラーコードか確認をお願いします。 また、VC++で「/P」(マクロの展開)オプションを試してもらえると、原因がはっきりするのではないかと思います。
jbpb0

2021/12/13 04:14

c++のコードの一番最初の行のすぐ上に ```c++ だけの行を追加してください また、c++のコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/e378967f71829feb9e6187e5be60349f.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
jbpb0

2021/12/13 04:19

ここの一番上のcx20さんのコメントに書かれてる短いコードをコンパイルしても、そのエラーが出るのでしょうか?
bldtemporal

2021/12/13 05:26

jbpb0様:ご教示有難うございます。 プログラムの最初に'''C++,最後に'''をつける、を実施してみましたが。最後についてはmainの最後 orサブルーチンの最後につけてみました。しかしなら、エラーメッセージに何の変化もありませんでした。
jbpb0

2021/12/13 11:13 編集

違います ここの質問にコードを掲載する際はそうしてください、という意味です 実行するコードにそんなことしてはいけません 上にも書きましたが、現状は質問のコードがとても読み辛いです 質問のコードを、私が書いたように書き直してくれると、読みやすくなるのでありがたいです なお、書き直し方は、 > 最初に'''C++,最後に'''をつける ではありません 付ける文字が違い、「'''」では無く「```」です その文字だから意味があるので、文字が違ったら意味がありませんが、自分でキーボードで入力したらたぶん間違えるので、私のコメントからコピペしてください
bldtemporal

2021/12/14 05:52

jbpb0様, ご回答有難うございます。大変有難いです。コードが見にくい件ですが、ただ貼り付けると、そうなってしまいます。うまいやり方があるのでしょうか、teratail推奨の質問形式を調べてみようと思っています。600行程度のモデルプログラムですので、もう少し内容を掲示して質問すべきと思っています。
bldtemporal

2021/12/14 05:55

jbpb0様、「追伸」質問コードの文頭、文末への印記入の件、次にコードを載せるときには、そうします。
guest

回答1

0

ベストアンサー

状況が良く分からない為、下記を試して頂けますか?
VC++ のコンパイルオプションで「/P」を付けると、#define で定義した箇所が展開され .i ファイルとして出力されます。
.i ファイルの中身を確認して、どのように展開されているか、教えて下さい。

■ /P (プリプロセス出力のファイルへの書き込み)
https://docs.microsoft.com/ja-jp/cpp/build/reference/p-preprocess-to-a-file

<手順>

  1. Visual Studio でプロジェクトのプロパティを開きます。
  2. 構成を「Debug」、プラットフォーム「Win32」を選択します。
  3. [構成のプロパティ] - [C/C++] - [プリプロセッサ] - [ファイルの前処理] で「はい(/P)」を選択します。

イメージ説明
4. ツールバーで「Debug」「x86」を選んでプロジェクトをビルドします。
イメージ説明
→ Debug フォルダ配下に .i のファイルが出力されます。
イメージ説明
5. テキストエディタで .i ファイルを開き const double SSH1 の箇所を検索します。
イメージ説明
→ 赤枠の部分の結果を教えて下さい。


<追記>
同じ事象か分からないですが、以下のようなマクロ定義をした場合に同様のエラーメッセージが表示されることを確認しました。
イメージ説明

投稿2021/12/12 11:55

編集2021/12/12 14:47
cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bldtemporal

2021/12/13 05:27

cx20様:ご教示有難うございます。3までは進みましたが、4つまづきました。メニューのデバッグ、またはツールよりデバッグのところに進みましたが、debag,x86という項目は見当たりませんでした。どこか違うところに進んでいるのかもしれません。それから、赤枠の内容 const double SSH1 = pow(1, 2) * 3.14159265359; は、const double SSH1 = pow(DSH1, 2) * M_PI / 4;ですね。 残りのご教示の件ですが、下記の意述べさせて頂きます。 1)「-WALL」オプションに関しては、gcc/g++のマニアルに乗っていないので実施方法が分かりません。 (2)"式が必要です"のエラーに関してですが、追記部分については試行しましたが効果が無かったと、記載しました。私としては、ヘッダーファイルとか根本的ルールがWinGWと違うように感じます。例としてπ(パイ)について言えば、MinGWではライブラリーにあるようで、#invlude <math.h>としておけば認識されますが、visual studioでは、#define pai=3.14159265359と定義しなければなりませんでした。
jbpb0

2021/12/13 11:39 編集

質問者さん cx20さんは回答の最初のところで、 > VC++ のコンパイルオプションで「/P」を付けると、#define で定義した箇所が展開され .i ファイルとして出力されます。 と説明してますよね 「#define で定義した箇所が展開」とは、下記のように置き換えがされるという意味です 「DSH1」→「1」 「M_PI」→「3.14159265359」 上記の結果、下記のように置き換えられて、「.i ファイル」では赤枠のようになるはずです const double SSH1 = pow(DSH1, 2) * M_PI / 4; ↓ const double SSH1 = pow(1, 2) * 3.14159265359 / 4; それが実際にそうなるのかを、「.i ファイル」を作って、中身を確認してください、という意味です
cx20

2021/12/13 13:03

jbpb0 さん> 説明のフォローありがとうございます。回答の意図を汲んで頂き助かります。
bldtemporal

2021/12/14 05:33

cx20様、現象を再現して下さるなんて、感動です。 jbpb0様、#define _USE_MATH_DEFINESを#exclude<math.h>の前に入れたところ、”式が必要です”が消えた上、#define M_PI = 3.14159265359も不要になりました。 ただ、新しく下記のエラーメッセージが出てきました。(最大行は634ですが、693と出ています。) どうすれば良いかお教え願えれば幸いです。 エラー MSB6001 "CL.exe" のコマンド ライン スイッチが無効です。System.ArgumentException: ソース ファイルの数と対応する出力の数が一致する必要があります。693 以下は表示されていませんが、コピーしたら出てきました。 場所 Microsoft.Build.Shared.ErrorUtilities.ThrowArgument(Exception innerException, String resourceName, Object[] args) 場所 Microsoft.Build.Utilities.CanonicalTrackedOutputFiles.RemoveDependenciesFromEntryIfMissing(ITaskItem[] source, ITaskItem[] correspondingOutputs) 場所 Microsoft.Build.CPPTasks.CL.PostExecuteTool(Int32 exitCode) 場所 Microsoft.Build.CPPTasks.TrackedVCToolTask.ExecuteTool(String pathToTool, String responseFileCommands, String commandLineCommands) 場所 Microsoft.Build.Utilities.ToolTask.Execute() GCB Kaikyoku C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets 693
jbpb0

2021/12/14 06:07

> 新しく下記のエラーメッセージが出てきました。 どうすれば良いか 当初の質問とは全然違う内容なので、別の質問にしてください
bldtemporal

2021/12/14 06:39

jbpb0 様、分かりました。別の質問にしますので宜しくお願い致します。 「解決済」になってしまいました。
cx20

2021/12/14 14:19

> #define M_PI = 3.14159265359も不要になりました。 あぁ、もしかして、経緯としては、 ・VC++ だと「M_PI」が定義されていない、というエラーになった。 ・その為「#define M_PI = 3.14159265359」を追加した。 ・しかし、余分な「=」が入っていた為に別のエラーが出た。 という感じでしょうか。 質問文だと「#define M_PI 3.14159265359」と「=」は入っていなかったので、別の原因かと思ってました。。
bldtemporal

2021/12/17 06:09

cx20様 適切なご回答ありがとうございます。その通りです。”=”が余分でした。但し、 #define _USE_MATH_DEFINESで解決致しました。 既に解決済としてしまっていますが、お礼を兼ねて連絡致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問