個人事業主の方必見!確定申告のお悩み解決

最近、コンピュータシミュレーションもWindows環境でされることが多くなっているみたいで、MPIの環境もマイクロソフトが提供したりしているようです。
そのような前提で、makeによってコンパイルするように指示されているプログラムのセットがあります。makeコマンドはmakefileに書いてある内容に従ってコンパイルしていくことになりますが、makeコマンドはWindows環境ではどこから提供されるのが一般的なのでしょうか。Linuxの場合は1つしかありませんが、Windowsの場合は、Gowとかcygwinなど自分がどういう環境を作っているかに依存すると思います。visual studioもmakeを持っているのではないかと思います。今、コマンドプロンプトでwhich makeとするとGowが提供していることになっています。どのmakeでも同じ、ということになるのでしょうか。MS-DOSではnmakeなんてのもあったと思います。
また、makeとは結局、コマンドをキーボードで入力する手間を省くものであり、キーボードマクロのようなものなのだろうか?とも思いますが(ユーザ側の印象)。Windowsのバッチのようなものか?ということなのですが。unixではmakeはシステムとかシェルによって違う?というようなことがあったと思います。makefileの書式もいろいろとあって空白とかタブとかの違いとかもあったような?
そのあたりをまず、ざっくりと理解しておきたいと思っているのですが。
ケースバイケース(一般論がない)だから、自分の環境でやるというよりも、指定された?makeに従って操作すべき、ということになるでしょうか。
よろしくお願いします。

A 回答 (3件)

それを見る限り、次の通りです。


・Makefile の書式は、標準的なもので、大抵のmakeコマンドで使用できる
・使われているコマンドやオプションが、UNIX系のもの。

よってWindowsで使うには
・UNIX系コマンドが使える状態にして、UNIX系のmakeコマンドを使う。
 GOWが使えるなら、多分使える
・Windows標準のコマンドに書き換える。
のどちらか、となります。

使うコンパイラによっては
・オプションの書式を変える
・使われている拡張子を変える(.o→.obj等)
が必要かもしれません。


Fortranはそれほど詳しくないんで、これ以上はわかりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。Windowsでunix環境を実現するというソフトはいくつかありますが、それらは環境変数などを始め前提条件がunixにどこまで合わせられているかということにも依存するような気がしています。とにかくプログラム実行環境について悩やむということはプログラムアルゴリズムに頭をひねる前の問題であり、正直、辟易するところではありますが。お付き合いいただきありがとうございました。

お礼日時:2017/09/29 13:49

> make.exeがPCの中に複数ある場合、どれを使うようになっているかを判別する方法が分かればありがたいのですが



どのmakeに対応したものか、は、そのMakefileの中で使われている変数や関数、ルールの書式に、特定のmake独自のものが含まれているか、を調べます。
標準のものだったら、大抵のmakeコマンドで利用できるはずです。

どの環境に対応しているかは、使われているファイル名やコマンド名から判断します。
.c→.o→ 拡張子無し というルールなら、Windowsでの nmake+Visual C用ではない、と予想できます。

判断できなかったら、実際にやってエラーが出ないか確かめてみるのもよいでしょう。


一般論で言えるのは、せいぜいこれくらいです。
これ以上は、実際のソースコード一式を見ないことにはわかりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。提供されているmakefileを抜粋したものは以下のようです。
---

# Makefile
#
LOAD = xxx.out

FC = mpif90
#COPT = -O3 -xHost -fpconstant -zero
#COPT = -O0 -C -fpe0 -traceback -warn all -nogen-interfaces
COPT = -O
LOPT = $(COPT)
# Source files
SRCS = typeDef.f90 \
xxx.f90 \
yyy.f90 \
zzz.f90
# Object files
OBJS = $(SRCS:.f90=.o)
# Module files
MODS = typedef.mod \
zzz.mod
# Make LOAD
$(LOAD): $(OBJS) $(MODS)
$(FC) -o $@ $(OBJS) $(LOPT)
# Suffixes
.SUFFIXES: .f90 .o .mod
# General rules
%.o: %.f90
$(FC) -c $(COPT) $< -o $@
%.mod: %.f90 %.o
@:
# Utility targets
clean:
rm -f $(OBJS) $(MODS) $(LOAD)
#
allocMemory.mod: typedef.mod
commSendRecv.mod: typedef.mod aaa.mod
kernel.mod: ccc.mod
commDecmp.mod: typedef.mod xxx.mod
2,3行省略
main.mod: typedef.mod allocmemory.mod \
aaa.mod
comm_debug.o: typedef.mod
sssSubs.o: aaa.mod jjj.mod \
 ccc.mod
---
fortran90のソースであり、モジュール(mod)が多く見られます。コンパイラmpif90が必要で、rmコマンドですからLinuxでしょうか。Windowsでもできなくはないですが。これらから読み取れる環境の情報があるでしょうか。

お礼日時:2017/09/27 17:27

make は、UNIX用として作られたものが基になっています。



Makefileの内容には
・標準規格に準拠したもの(UNIX等には POSIXという規格があります)
・そのmakeコマンドで独自に拡張されたもの
の2つがあります。

また、組込まれてるルールに違いがあります。
(.cファイルからオブジェクトファイルを作るときに、どのコンパイラを使うのか、オブジェクトファイルの拡張子は、等)

Makefileには、コンパイル以外のコマンドも記述されています。
(make clean で中間ファイルを消去するためのコマンド等)
また、外部コマンドを実行する際に、シェルを使用することもあります。

なので、Makefileの内容を確認して、使用されるコンパイラや他コマンドの種類を確認し、それらに合うもの、ということになります。


元のMakefileがUNIXで使用しているものならば、UNIXに近い環境を一通り用意するのが確実性が高くなります。
今なら、 MSYS2 + MinGW でしょうか。


Windowsでは、Visual StudioやSDK等についてくる nmake コマンドがあります。
これは、若干UNIXのMakefileとは書式が違いますし、組込まれているルールもWindowsのものが(Cコンパイラはcl 等)になっています。
内容次第では、共通で使えることもあります。
使えなかったときは、nmake 用に修正することになります。


このような差を解消するため、昨今の公開されているパッケージでは、Makefile( や、それに相当するもの、例えば、Visual Studioのプロジェクト等)を作るための仕組みを用意しています。
そのプログラムに付いてくるファイルを確認してみましょう。
Windowsでのコンパイル方法が書いてあるかもしれません。



makeコマンドは、バッチファイルのように、コマンドを順番に実行します。
最大の違いは、make は ファイルの依存関係を使って、必要なコマンドを実行する、ということです。

a1.c a2.c a3.c という3つのファイルから a0.exe を作るとき、
バッチファイルでは 実行するコマンドを全部書く、というのが普通です。
この場合、 例えば a1.cだけ更新した場合でも、a2.c,a3.cもコンパイルしなおします。

make では、
a0.exe を作るには a1.obj a2.obj a3.obj が必要
→ a1.obj を作るには a1.c が必要
 → a1.cが更新されているのでコンパイル実行
→ a2.obj を作るには a2.c が必要
 → a2.cは更新されていないので、何もする必要はない

→ 更新されたので、a1.obj a2.obj a3.objを使ってa0.exeを作成

といったように、コンパイルの必要性を確認して、必要なところだけ実行します。
    • good
    • 0
この回答へのお礼

懇篤な回答をありがとうございます。まず分かっていることはLinuxなどのunix環境で開発されたものではなく、Windowsをベースに作成されたものであるということです。unixでも環境によって書き方が違っていたと思いますが、その差はではないと思います(System Vなどいろいろ)。そうしますと、makefileの差異はコンパイラ呼び出しのコマンド名でわかるということになるでしょうか。また、make.exeがPCの中に複数ある場合、どれを使うようになっているかを判別する方法が分かればありがたいのですが。
makeはmakefileなどを参照しながらコンパイルに必要な情報を集めるのだろうと思いますが、それはmakeを実行する前の環境変数などで整えておくということになるのでしょうか。結局は人間がPCの前でキー入力していることを自動でやっているだけであり、makeコマンドが特別に何かを作り出しているわけではない、という理解でよいのでしょうか。
いずれにしましても、makeはコンパイル補助、プログラム開発補助をやっているのであり、それ自体で悩むのはナンセンスなのにと感じているのですが。

お礼日時:2017/09/25 07:51

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

このQ&Aと関連する良く見られている質問

QC#プログラミング、少数の取り扱い方がわかりません

説明のしかたが下手で申し訳ないのですが

double型の数値で0.999999999999......と続く数値があったとして、この数値が1.0として扱われるのは小数第何位からですか?

また、1.0に近似してほしくないときはどうしたらいいですか?
C#でプログラミングをしています

Aベストアンサー

やろうとしていることは
lim_(x→0) f(x) = 1
で、 xを0に近付けつつ、f(x) を計算する、という感じなのでしょうか。


方法は3つあります。
(1) 計算式を工夫する。
0.999... だと 10^-15程度までしか正しくありませんが
0.000 .... 1 → 1.0 * 10^-n だと、10^-nの桁から15桁程度までの精度があります。
式を工夫して、計算結果が1ではなく、0に向うようにすることで、精度よく計算できるかもしれません
例)
g(x)=1-f(x) を求める。 ※「桁落ち」に注意


(2)十分な精度のある型を使う
https://ja.wikipedia.org/wiki/%E4%BB%BB%E6%84%8F%E7%B2%BE%E5%BA%A6%E6%BC%94%E7%AE%97
自作するか、既存のものを使う


(3)計算自体に意味があるのか、考えてみる。

QCのプログラムに無性にイライラするのはおかしいですか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  hn[ p[0] ]++;
 }
}

3重にするならせめて、y,x,i の順にしてp[0]への代入は1回で済ませればと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  for( i=0; i<256; i++){
     if(p[0]==i){hn[i]++;}
  }
 }
}

最近のコンパイラの最適化では、私の書いたようなコーディング(修正?)は無意味なのでしょうか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++)...続きを読む

Aベストアンサー

利点を考えてみました


これを並列処理したときに
スレッド0: hn[0] に p[0] = 0 をカウント
スレッド1: hn[1] に p[0] = 1 をカウント
...
とすれば、
・img -> imageData は読み出すだけなので衝突しない
・hn[i] でアクセスする領域は、スレッド毎に i が違うので、同じ箇所に書き込まれることはない。
となり、排他処理が不要となります。
(もちろん、x,y,i,p[0]はスレッドでローカルな変数とします)

ただ、並列処理のオーバーヘッドや同時並列処理数等を考えると、こんな並列処理はしない方が効率的です。


あるいは、hn[]がシークに時間がかかる領域の場合、
hn[p[0]) で毎回違う位置を探しに行って、その時間が無視できないほどだったら、
先にhnを決めてしまった方が速くなるでしょう。

こちらも、非現実的です。

QDOS窓の大きさについて

早速ですが、コマンドプロンプトで使用されるDOS窓ですが、コマンドプロンプトを起動して、プロパティを開き行数を変更して1500行にしました。円周率の計算をVBとC#の2種類でやって見ました。VBの方は20000桁表示されますが、C#の方は溢れて、15000桁しか表示されません。
 どうもC#の方では元の行数300行がそのままになってるようです。どうすればC#の方でも、全桁表示されるでしょうか?
 実行画面ではC#ではデバッグ無しで実行してます。VBの方はデバッグ無しが無いのでデバッグをしてのことです。

Aベストアンサー

処理結果をファイルへリダイレクトしてそれをエディタで表示してみてはいかがでしょうか。

Q最も高い身長を表示するプログラム

5人分の身長から最も高い身長を表示するプログラムをつくったのですが、エラーがでて実行できません。改善すべきところを教えてください。お願いします。
int main(void)
{
double a[5], max = 0;
int i;

for (i = 1; i <= 5; i++)
{
a[i] = 0;
}
printf("数値を5つ入力してください。\n");

for (i = 1; i <= 5; i++)
{
scanf("%lf", &a[i]);
}

for (i = 1; i <= 5; i++)
{
if (a[i] > max)
max = a[i];
}

printf("最も高い身長は%fです\n", max);

return 0;
}

Aベストアンサー

double a[5] ;
と宣言したら、安全に使えるのは a[0] 〜 a[4] です。

なので、このプログラムを安全なものにするなら
・double a[5]はそのまま、 i=0;i<5;i++ にして、 i=0〜4 の範囲で使う
・「i = 1; i <= 5; i++は変えない」 のなら
 ・ i=1〜5を、 0〜4 に対応させて使う
   単純明快なのは、 a[i-1] とすること
 ・double a[5+1] と宣言して、a[5] を安全に使えるようにする。
   a[0] が無駄になるけど気にしない

Qc言語は独学で、どこまで出来ますか?

大学生です。初歩的なc言語を学ぶ講義があるのですが、訳あって受けられなくなったので、独学でいこうかなと思っています。

初心者の大学生が1年程度受ける講義の内容は、独学でも難しいですか?

独学経験者、プログラミングに詳しい方の意見を伺いたいです。

Aベストアンサー

それは大丈夫でしょう。
最初はC言語入門的な書籍から入ってもいいし、真髄を学びたければカーニハン&リッチーの定番から読むのもいいし、プライマーから入ってもいいし。

ただ、コードを書くだけではダメなので、構造化プログラミングとか、コンパイラとか、ゆくゆくはオブジェクト指向とかに入っていかないといけません。

QC言語のうるう年に関するプログラムの作成

C言語(閏年)の質問です。

任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成方法を教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。)
なお、閏年の判定方法は以下のとおりである。
条件1 西暦年が4で割り切れる年は閏年である
条件2 条件1を満たしていても、西暦年が100で割り切れるときは閏年でない
条件3 条件2を満たしていても、西暦年が400で割り切れるならば閏年である

実行例1
西暦を入力:2000
西暦を入力:2009
2000年
2004年
2008年
閏年は3回あります。

実行例2
西暦を入力:2100
西暦を入力:2000
2000年
2004年
2008年
2012年
2016年
2020年
(省略)
2096年
閏年は25回あります。

実行例3
西暦を入力:2090
西暦を入力:2110
2092年
2096年
2104年
2108年
閏年は4回あります。

C言語(閏年)の質問です。

任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成方法を教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。)
なお、閏年の判定方法は以下のとおりである。
条件1 西暦年が4で割り切れる年は閏年である
条件2 条件1を満たしていても、西暦年が10...続きを読む

Aベストアンサー

こんな感じでしょうか。
(体裁上、各行先頭のスペースは全角スペースにしてあるので、コピペするとコンパイルできないと思います)

#include <stdio.h>

static int
checkYear (int year)
{
 if ((year % 4) == 0)
 {
  if ((year % 100) == 0)
  {
   if ((year % 400) == 0)
    return (1);
  }
  else
   return (1);
 }

 return (0);
}

int
main (int argc, char * argv[])
{
 int count = 0;
 int year, start, end;

 printf ("西暦を入力:");
 scanf ("%d", &start);
 printf ("西暦を入力:");
 scanf ("%d", &end);

 if (start > end)
 {
  year = end;
  end = start;
  start = year;
 }

 for (year = start; year <= end; year++)
 {
  if (checkYear (year) == 1)
  {
   printf ("%d年\n", year);
   count++;
  }
 }
 if (count != 0)
  printf ("閏年は%d回あります。\n", count);
 else
  printf ("閏年はありません。\n");

 return;
}

こんな感じでしょうか。
(体裁上、各行先頭のスペースは全角スペースにしてあるので、コピペするとコンパイルできないと思います)

#include <stdio.h>

static int
checkYear (int year)
{
 if ((year % 4) == 0)
 {
  if ((year % 100) == 0)
  {
   if ((year % 400) == 0)
    return (1);
  }
  else
   return (1);
 }

 return (0);
}

int
main (int argc, char * argv[])
{
 int count = 0;
 int year, start, end;

 printf ("西暦を入力:");
 scanf ("%d", &start);
 print...続きを読む

QC言語でのUTF-8の文字列の処理は例えば、比較とかstrtokとかはどうするのか

大量のhtmlファイルを処理をする様になってから今迄はperlを使って来
たが処理が遅いのでC言語を使って早くしようと思って要るが。肝心の
日本語コードの扱いで詰まっている。

例えば、
<!--コメントヘッダーのはじまり-->
.
.
.
<!--コメントヘッダーのおわり-->
と言った場合に、<と>に囲まれた色んなタグが現れて来る。strtokで文
字列を拾って対処をするとしても、文字コードが処理出来なければ何も
進まない。

例えば、上記の場合でhtmlファイルを読んでコメントヘッダーのはじまり
とおわり迄に関しては、出力をしない。他のは全て出力すると言う様な場
合のC言語のソースはどの様に成るのでしょうか。

済みません。未だ、始めたばかりでC言語での記述が出来ません。宜し
く回答願います。

回答はヒントでは無くて直接のC言語のソースを提示願います。宜しく
お願いします。

Aベストアンサー

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られたバッファでやりくりしようとするなら(ネットワークからダウンロードしながら処理する際にはこのやり方が必須)、バッファ読み込みの際のタグ文字列の泣き別れなどを考慮する必要がありちょっと凝ったテクニックが必要になります。

それとも、UTF-8で書かれたHTMLの"<!--コメントヘッダーのはじまり-->"~"<!--コメントヘッダーのおわり-->"を全削除ですか?だったら、コードをUTF-8で書いて、strstr()で"<!--コメントヘッダーのはじまり-->”を見つけて・・・でいけると思います。文字コードの処理というよりか、見る人が見れば日本語に見えるかもしれない「ただのデータの列」とみなして処理するだけです。

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られた...続きを読む

Q100個の要素を持つ1次元配列に1からはじまる奇数を順に格納するプログラムがかけません。 教えてくだ

100個の要素を持つ1次元配列に1からはじまる奇数を順に格納するプログラムがかけません。
教えてください

Aベストアンサー

>for文のところがよく理解できないので、教えていただけますか?
読んだままですけど・・
まず、n = 0, m = 1 を代入します
n < 100のであれば、for文の直後の文 dt[n] = m; を実行します。
n++, m += 2 を実行してから、再度n < 100をチェックする部分に飛びます

QC++で大量のエラーが出る

下記で、大量のエラーが出る。
//C:/Users/usui/perl/LWP/170220-Iterative_processing/html/01.cpp {{{
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>

using namespace std; // }}}

class filter{
private:
int ret;
DIR *dir;
struct dirent *dp;
char path[]=".";
int ret;
string name;
public:
// コンストラクター
filter(string s){
name = s;
const char* cstr = name.c_str();
ret=chdir(cstr);
if(ret!=0){
cout << "chdirに失敗\n" << name <<endl;
exit(1);
}
//ret=chdir(path);
if((dir=opendir(path))==NULL){
perror("opendir");
exit(-1);
}

for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
if(strlen(dp->d_name)>10){
printf("<target>%s</target>\n",dp->d_name);
read_file(dp->d_name);
}
}
};
int main(){
filter dekita("C:/Users/usui/perl/LWP/170220-Iterative_processing/html");
}

// vim:set ft=cpp fdm=marker:

エラーの内容は下記。

01.cpp:12:2: error: 'DIR' does not name a type
DIR *dir;
^
01.cpp:14:15: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
char path[]=".";
^
01.cpp:15:6: error: redeclaration of 'int filter::ret'
int ret;
^
01.cpp:11:6: note: previous declaration 'int filter::ret'
int ret;
^
01.cpp:42:2: error: expected '}' at end of input
}
^
01.cpp:14:15: error: initializer-string for array of chars is too long [-fpermissive]
char path[]=".";
^
01.cpp: In constructor 'filter::filter(std::string)':
01.cpp:19:19: error: array used as initializer
filter(string s){
^
01.cpp:28:6: error: 'dir' was not declared in this scope
if((dir=opendir(path))==NULL){
^
01.cpp:28:22: error: 'opendir' was not declared in this scope
if((dir=opendir(path))==NULL){
^
01.cpp:29:19: error: 'perror' was not declared in this scope
perror("opendir");
^
01.cpp:33:17: error: 'dir' was not declared in this scope
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
^
01.cpp:33:20: error: 'readdir' was not declared in this scope
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
^
01.cpp:34:15: error: invalid use of incomplete type 'struct dirent'
if(strlen(dp->d_name)>10){
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:34:23: error: 'strlen' was not declared in this scope
if(strlen(dp->d_name)>10){
^
01.cpp:35:38: error: invalid use of incomplete type 'struct dirent'
printf("<target>%s</target>\n",dp->d_name);
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:35:46: error: 'printf' was not declared in this scope
printf("<target>%s</target>\n",dp->d_name);
^
01.cpp:36:16: error: invalid use of incomplete type 'struct dirent'
read_file(dp->d_name);
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:36:24: error: 'read_file' was not declared in this scope
read_file(dp->d_name);
^
01.cpp: At global scope:
01.cpp:42:2: error: expected unqualified-id at end of input
}
^
どうも、CとC++では、関数の名前とかが違う様だが。済みません。間違いの
指摘をお願いします。

下記で、大量のエラーが出る。
//C:/Users/usui/perl/LWP/170220-Iterative_processing/html/01.cpp {{{
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>

using namespace std; // }}}

class filter{
private:
int ret;
DIR *dir;
struct dirent *dp;
char path[]=".";
int ret;
string name;
public:
// コンストラクター
filter(string s){
name = s;
const char* cstr = name.c_str();
ret=chdir(cstr);
if(ret!=0){
cout...続きを読む

Aベストアンサー

基本的には、コンストラクタの中で、static でない変数を初期化することは禁止されています(最初のメッセージは、警告メッセージで、C++11 の新規格なら許されると言うことです)

あと、C++であてtも、char path[] という配列を初期化することはできません。

ということです。

QVisual Sutdio 2017 でのC言語のプログラミングについて困っていることがあります

こんにちは。
Visual Studio 2017のことについて教えていただきたいことがあります。
以下のC++のプログラムを作成し、実行するとあとちょっとというところで「(ファイル名)は動作を停止しました。問題が発生したためプログラムが正しく動作しなくなりました。解決策がある場合は、Windowsから通知されます」と出て先へ進めなくて困っています。

プログラムは、
i#nclude <stdio.h>

int main(void) {
int a, b;

printf("整数aを入力してください\n");
scanf("%d", &a);

printf("整数bを入力してください\n");
scanf("%d, &b");

printf("a+b=%d\n", a + b);


return 0;
}
です。
デバッグを行うと、「例外はハンドルされていません。 ハンドルされない例外が 0x569ED4A2 (ucrtbased.dll) で発生しました(C言語.exe 内): 0xC0000005: 場所 0x009C1046 への書き込み中にアクセス違反が発生しました。 」

と表示されます。
このサイトのほかの質問者の方のページを見たり、Microsoftのページを見たりしましたが、それでもわかりませんでした。初歩的なことだとは思いますが、ご教授お願いいたします、

Windows10で、機種はNECのhybrid-zeroを使用しています。

こんにちは。
Visual Studio 2017のことについて教えていただきたいことがあります。
以下のC++のプログラムを作成し、実行するとあとちょっとというところで「(ファイル名)は動作を停止しました。問題が発生したためプログラムが正しく動作しなくなりました。解決策がある場合は、Windowsから通知されます」と出て先へ進めなくて困っています。

プログラムは、
i#nclude <stdio.h>

int main(void) {
int a, b;

printf("整数aを入力してください\n");
scanf("%d", &a);

printf("整数bを入...続きを読む

Aベストアンサー

とりあえず、変な箇所

>i#nclude <stdio.h>
#include <stdio.h>

>scanf("%d, &b");
scanf("%d", &b);


人気Q&Aランキング