【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2016/11/06(日) 22:58:02.60ID:dU5z27As
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
2017/01/05(木) 00:16:26.21ID:kU82p3Tw
> >>147
> 副作用完了点が二つ以上存在すること自体は問題ないだろ。
> 複数の副作用完了点で同じ変数を変更、参照するんのが問題なんだよ。
> 安易な気持ちで書き込みすんな。一生ROMってろ。

ネラーならこれくらい言えないとな。

>>175
「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧。
>>158みたいに受け取る人もいるし。
>>173は具体的じゃないけどまだましなほうでしょ。
2017/01/05(木) 07:15:07.48ID:Tn1lGUp3
副作用完了点が2つ以上あると鼻から悪魔
 ↓
× んなこたーない
○ 勘違いしてないか?

理由:「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧
2017/01/05(木) 07:20:28.53ID:IruuUmgl
一応技術板なので「んなこたーない」って言われたら鼻から悪魔の例を出せばすむ話
まあ例を考えてる時に自分の間違いに気づくと思うが...
2017/01/05(木) 07:35:58.65ID:Tn1lGUp3
嵐かどうかは別として間違いの指摘かどうか曖昧でわからない奴はヤバい
2017/01/05(木) 09:10:38.60ID:yWb7mDiI
if (*str++ && *str++ && *str++)
&& と if の条件式の終わりは副作用完了点だけど問題を起こすコードではない
※ 役にたつコードかはしらんw
2017/01/05(木) 11:34:50.96ID:nSwRuxqn
大学の授業で、client.cというファイルとserver.cのファイルを渡されて
このプログラムを解析して、何でも良いから通信するプログラムを作れと言われたんですが
何をやればいいのかさっぱりです。
サーバとクライアントでファイルが2つに分かれてるってことは
プログラミングのテストをするにも2台PCを持ってないとできないってことでしょうか
何でもいいのでアドバイスください。。。
2017/01/05(木) 11:37:47.99ID:Xc98514b
>>181
PC 1台でも出来ます
2017/01/05(木) 11:44:42.65ID:yWb7mDiI
server のプログラムを実行しておいて
接続先を 127.0.0.1 (または localhost) にした client のプログラムを実行すれば桶

後は実行OSの事情次第(FWの警告をスルーする等)
2017/01/05(木) 11:51:25.19ID:33EuaIzL
>>181
client.exe server.exe生成
→server.exeを起動し通信待機
→client.exeを起動し通信開始
でいいよ
185デフォルトの名無しさん
垢版 |
2017/01/05(木) 11:55:16.72ID:nSwRuxqn
>>182-184
親切にありがとうございます。
Linux環境でプログラムしているのですが
server.cをコンパイル&実行すると待機中のせいか何なのかわからないのですが
コンソール上で他のコマンドが打てなくなってしまうので2台PCが必要なのかと迷っていたのですが、1台でもできるのですね。
どうやったら待機中でもclientのコンパイル済みファイルを実行することができるのでしょうか。。
2017/01/05(木) 12:00:04.09ID:CkAWate/
んなこたーない
って前々から他のC++スレでも使われていたけど、
自分からは何も根拠を示さず、ただ周りからの反論を煽りたいだけのレス
みたいな受け取られ方が少なからずされていたように感じるんだけど。

コミュニケーションって難しいな。
2017/01/05(木) 12:06:51.34ID:yWb7mDiI
>>185
bash だったら
末尾に & つけて呼び出すとバックグランドで実行するみたいよー
# server [enter]
 : 待機中でだんまりさんw

# server & [enter]
 : すぐ次の入力待ちになる server は裏で実行中
#
2017/01/05(木) 12:25:39.85ID:nSwRuxqn
>>187
できました!
ありがとうございます助かりました
2017/01/05(木) 13:10:33.43ID:Goea0txf
nohup をつけるともっと幸せになれるよ

nohup server &
190デフォルトの名無しさん
垢版 |
2017/01/05(木) 13:26:13.09ID:NumGywN/
馬鹿がnohupなんか付けたらいつまでもプロセス残るだろ
不完全なサーバーアプリケーションのプロセスをいつまでも残すということは
セキュリティ的に問題外
191デフォルトの名無しさん
垢版 |
2017/01/05(木) 14:20:26.50ID:wksprrkU
0xFFFFFFの変数がif(n > 0)で真になるんだがなんだコレ?
クソムカツクな死ねよ
2017/01/05(木) 14:25:53.51ID:yWb7mDiI
64bit (2の補数の)符号付で 00FF FFFF は正なんだけど
48bit の符号付整数での比較を望んでいるんだろうか?
2017/01/05(木) 15:39:10.85ID:60LIuvs1
48bitでも32bitでも正ですが
2017/01/05(木) 17:24:14.22ID:5KDyH/yc
>>191
何だこれと言われても言語仕様としか言いようがない
auto n = 0xFFFFFF;
if (n>0)//必ず真
2017/01/05(木) 18:52:01.04ID:sOp8JEWl
逆になぜ偽になると思ったのかが知りたいな。
2017/01/05(木) 18:58:22.71ID:25Qby3+x
auto n = 0xFFFFFF;
*reinterpret_cast<int*>(&n) > 0
2017/01/05(木) 19:26:42.79ID:ivHnG5Le
int が 24bit ってダメなんだっけ?
2017/01/05(木) 19:41:33.07ID:/zQeSTVL
あー あほしたー bit数を数え間違ってるし
2017/01/05(木) 21:38:57.59ID:AK28m3f5
>>196のオツムのレベルは>>191と同等
2017/01/05(木) 23:28:47.82ID:sjDvcQUe
>>185
別の端末・別の仮想デスクトップなどを、起動すればいい
201デフォルトの名無しさん
垢版 |
2017/01/08(日) 01:15:08.36ID:+QuxnNhY
■ 質問概要
ファイルに書き込んでも反映されない。

■ 環境
CentOS 6.4
GCC 4.4.7

■ 質問詳細
fopenに"r+"を指定して開いたファイルに、fputsでテキストデータを書き込んでも反映されません。
fcloseしていないことが、恐らく原因だと思います。
このアプリケーションは起動時にfopenでファイルを開いて常駐し、
アプリケーション終了時にfcloseするように開発しており、fcloseすると反映されます。
常駐型のアプリケーションで逐次ログ出力するため、
書き込むたびにファイルを開いたり閉じたりしないようにしています。
fcloseしなくても読み取りだけはできるようにしたいのです。
Apacheの挙動を見ると、ログファイルがこうした動作になっているようです。
(Apacheのソースは読んでいません、ログファイルを操作しようとした際の挙動などからによる推測です)
どうすればいいでしょうか。

調べたところ、fflushで希望の動作ができそうですが、
使い慣れてないものを使うのは副作用が怖く、
また、説明に「強制的」等の文言があるため、この文言があるだけでも非常に不安です。
こうした目的でfflushを利用しても問題ないのでしょうか。
そもそもfflushでいいのでしょうか。
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fflush.3.html
2017/01/08(日) 01:21:15.59ID:Zdr2NPEX
大丈夫だから使え
2017/01/08(日) 01:24:31.77ID:T3Q1+h8z
flushは時間がかかるから頻度が高い場合は気をつけて。
204201
垢版 |
2017/01/08(日) 01:54:37.47ID:+QuxnNhY
>>202-203
ありがとうございます。
時間がかかるんですね。
では、頻度が高い場合はfputsの度ではなく、
一定時間おきにfflushするように実装したいと思います。
205デフォルトの名無しさん
垢版 |
2017/01/08(日) 03:35:33.42ID:eh6WgorM
A = (framecount / 10) % 4

すみません、上記の式の意味を教えてください。
毎度、Aに入る値がしりたいです。
2017/01/08(日) 03:39:14.61ID:Nqw0FnK6
(framecount を 10 で割って) それの 4で割った余り 0〜3 の値になる

framecount
0〜 9 → 0
10〜19 → 1
20〜29 → 2
30〜39 → 3
40〜49 → 0
50〜59 → 1
:
207デフォルトの名無しさん
垢版 |
2017/01/08(日) 03:43:39.84ID:eh6WgorM
>>206
こんな深夜に即レス、感謝
ありがとうございます!
2017/01/08(日) 04:24:28.51ID:c5pY166L
>>201-204
普通は、ファイルを閉じる際、自動的にflushされる

それに何もしなくても、OSのデフォルト設定で、
dirty Page Cache を、5秒ごとにflushして、メモリとディスクを同じ状態に保つ

USB・SSDの書き込み回数を減らしたい人は、書き込み間隔を15〜30秒に設定している人もいる。
commit=15

Linux I/O のお話 write 編
http://d.hatena.ne.jp/naoya/20070523/1179938637
2017/01/08(日) 11:20:03.87ID:OpAcES4h
char buffer[256];
scanf(%s,buffer);
printf(
2017/01/08(日) 11:28:02.93ID:OpAcES4h
すみません、誤送信してしまいました
質問させてください。

char buffer[256];
scanf(%s,buffer);
printf("finish---_n");
という記述で、文字入力をした後、何回リターンキーを押しても
finishが表示されない、つまりscanfが終了しないような状態になっているのですが
何か特別な条件でscanfが終了しないことってあるものなのでしょうか?
ちなみに、コードのscanfの行だけコメントアウトすると普通にfinishが表示される状態です。
あと、新規で.cファイルを作って短いコードにしてコンパイルしても問題なく動いてくれています。
2017/01/08(日) 11:43:58.41ID:nyR751xv
>>210
問題が再現できる最少コード書いてみて
コンパイル通るコード
2017/01/08(日) 11:52:30.04ID:OpAcES4h
>>211
先日も少し教えてもらったのでまた聞きに来てるのが恥ずかしいのあ
ですが、サーバとクライアントでの通信のプログラムです。

server.c
http://codepad.org/epmTQJ0
client.c
http://codepad.org/uhR4zEL3

gcc -o s server.c
gcc -o c client.c
./s&
./c
で実行しています。
サーバ側のscanfで止まってしまうみたいなのですが
サーバ側のscanfをコメントアウトすると通るみたいです。
2017/01/08(日) 12:07:20.20ID:nyR751xv
server側がnot foundだわ
リンク確認してみて
2017/01/08(日) 12:15:37.07ID:9g4d0om9
>>213
アップし直しました
http://codepad.org/ye5GDqp8
確認不足ですみません;;
2017/01/08(日) 12:35:39.21ID:nyR751xv
Wait for Connection...Connected.
s1---------
C->S: %s
Server:

実行結果はここで止まって
s2---------
まで進まないって事?
2017/01/08(日) 12:38:46.78ID:Cjw+tP2S
>>215
そうですね
Serverの後にscanfがあるので入力してみると

Server: uuu
aaaaa
iiii
uuu

とかになって、Enterキーを打っても次に進んでくれません
2017/01/08(日) 13:15:24.14ID:nyR751xv
送受信で変数を別々にしてみて
scanf -> sendはbuffer1
recv -> printfはbuffer2
みたいに

38, 39 40行目にブレークポイント置いてやってみて
2017/01/08(日) 13:46:50.50ID:uGSXn6++
サーバをフォアグラウンドにしてから入力すればいいだけな気がする。
いったんCtrl-zでクライアントを停止して「bg」でバックグラウンドで再開、
「jobs」でサーバのジョブIDを調べて「fg %[ジョブID]」してから入力すれば、
反応するんじゃないかな。
2017/01/08(日) 15:47:42.95ID:/TmTqYIS
>>217
ありがとうございます
やってみましたがどうもうまくいかなさそうです
>>218
ありがとうございます。
いちおうやってみたのですが、ぼくがりしょしんしゃすぎてこうどなれすすぎてりかいできません(^q^)
バックグラウンドとフォアグラウンドの使い分けが良く分からないです。

手順を整理すると、
1. サーバをバックグラウンドで開始
2. クライアントをフォアグラウンドで開始
3. クライアントを停止
4. クライントをバックグラウンドで再開
5. サーバをフォアグラウンドで開始
6. クライントをフォアグラウンドで開始
ということでしょうか???頭がパーン!!
2017/01/08(日) 16:06:06.04ID:nyR751xv
>>219
ブレークポイントが39で止まる
→続行して入力しても40のブレークポイントに来ない
こんな状況なの?
2017/01/08(日) 16:09:35.63ID:uGSXn6++
難しいようなら、&で起動するのはやめて、ターミナルを二つ起動して
片方でサーバを、もう片方でクライアントを実行するほうが楽だと思う。
2017/01/08(日) 16:24:16.26ID:7aUjJ3jB
同意
2017/01/08(日) 17:02:49.06ID:C9GVPqMv
>>208
それレイヤーが違う話だよ
2017/01/08(日) 17:48:30.32ID:bwuU6ymI
質問者の提示したURLに書かれている注意事項すら読まない奴を相手にレスするとは
2017/01/08(日) 19:21:35.50ID:d7tAym4Y
>>220
そんな感じでした
>>221-222
ターミナル2つ起動したら簡単にできました。。
ターミナルって2つ開いて操作したりするものだったんですね
Linux初心者すぎて分かってませんでした
助かりましたありがとうございます
2017/01/08(日) 22:54:37.49ID:c5pY166L
端末も複数、起動できる

仮想デスクトップを知っているか?
デスクトップも、複数起動できる

普通、C/S通信プログラムでは、2つ端末を起動する

>>209-210
2chのバグだろう

書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。
" の代わりに、\" とエスケープすれば、どうだろう?

それか、書き込み確認画面が出たら、1度キャンセルすれば、確認画面は出ないようになった
2017/01/11(水) 13:06:08.85ID:X1FDgEas
>>208といい>>226といい、わざと嘘を書いてるのか?
228デフォルトの名無しさん
垢版 |
2017/01/12(木) 04:36:13.74ID:8CizHZGj
MSVCはいつまで__cplusplusの定義199711Lのままなんだ
2017/01/12(木) 07:09:10.44ID:edOk7o4H
変えると暴動が起きるこら変えない
とライブラリ開発者のSTL氏が言っていた
2017/01/12(木) 12:09:34.61ID:xegpw56Z
1だと思ってた
2017/01/15(日) 00:31:14.26ID:7/DzGkQz
別ファイルで作成した関数を使用するときは、そのヘッダーファイルの
インクルードだけでなくプロトタイプ宣言も必要ですか?
インクルードだけでもコンパイルは通るし実行も出来るのですが、
そういう警告が出てくるので気になりました
2017/01/15(日) 00:34:44.37ID:H7ag5TAh
警告文をコピペしてくれると話が早いような
2017/01/15(日) 00:51:14.06ID:e3PYrJk6
そのヘッダーファイルの中でプロトタイプ宣言はされているんじゃないのか
警告の原因は別のことだろ
2017/01/15(日) 01:02:35.94ID:7/DzGkQz
インクルードするファイルを間違えてたみたいです
お騒がせしました
2017/01/19(木) 22:46:56.05ID:knltoro2
新しくクラスとそれに関連した処理などを実装するとき
ヘッダー側でクラスの定義、ソースファイル側にクラス内のメンバ関数の実装部などを書きますよね
その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか? たとえば

//ヘッダー側です
class A{
private:
 int num;
public:
 int ReturnNum(void){
  return num;
 }
};

処理はたった一行ですけどこの場合もint ReturnNum()の実装部はソースファイル側にint A::ReturnNum()のように移すべきですか?
ネット上のプログラムをいくつか見てみたらこのようにメンバ変数をただ返すだけの処理ならヘッダー側に書いてあるものも少なくなかったのでどっちが好ましいんだろうと気になりました
2017/01/19(木) 23:08:04.39ID:ipEwSksA
プログラムは普通すべて「ソースファイル」に書くものです
「ヘッダー」に書くのはコンパイラー開発者だけです
2017/01/19(木) 23:11:24.96ID:ydMYZ/gE
クラスもヘッダに書きますけどぉ
2017/01/19(木) 23:55:32.15ID:A0Yl7Ujc
> その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか?
別にどんな場合でもソース側に書くというわけではない

ヘッダに書くのもソースに書くのも一長一短はあり絶対的にどっちがいいというものではない
君が違いを理解し何を重視するかを意識すれば
君にとってどっちが好ましいかは自然とはっきりする
239デフォルトの名無しさん
垢版 |
2017/01/20(金) 00:23:32.93ID:7sj2OAGi
なんか禅問答が始まったかと思ったわ
2017/01/20(金) 01:12:20.36ID:/ixeQkYS
短いメソッドなら、ヘッダに、inline 指定して書くと、
関数化せずに、inline にしてくれる可能性が高い

まあ、言語では保証していないけど。コンパイラ依存
241デフォルトの名無しさん
垢版 |
2017/01/20(金) 05:11:02.70ID:vaOLIJJw
クラス定義で定義されたメンバ関数は暗黙にinlineになるね。
(『プログラミング言語C++第4版』p.464 16.2.8 クラス内関数定義)

class SomeClass {
public:
  int a() {return a_;} // 暗黙のinline指定
private:
  int a_;
}


…という話を書くために厚い本を調べてたら

class SomeClass {
public:
  int a();
private:
  int a_;
}

inline int SomeClass::a() // 明示的にinline指定
{
  return a_;
}

と書く方法も載ってた。 >>240 は後者の説明だったのね。
2017/01/20(金) 07:10:06.09ID:Nvso2zBq
>>235
本体側に書くのが原則 特にシステムが大きくなる場合
よほどの理由がある場合(インライン化して高速化するなど)はヘッダに書くこともある
2017/01/20(金) 08:09:40.71ID:B05iL6IP
『〜のが原則』
『理由がある場合〜こともある』
俺の会社のルールは世界普遍的 思考
2017/01/20(金) 16:53:52.68ID:abKD9bRi
inlineにするのはほとんどその時の気分みたいな?
なんかマクロみたいだな。inlineにすっかみたいな。
2017/01/20(金) 17:10:04.08ID:XdmbS/hB
>>244
関数呼び出しのオーバーヘッドの回避と、定数畳み込みなどの最適化が期待できる場合にインライン化する。
2017/01/20(金) 17:38:00.40ID:abKD9bRi
>>245
そんな感じ
2017/01/20(金) 20:04:23.44ID:1c/0Zcpc
>>245
インラインにしても劇的に速くなった経験が無いんですが、コツは有りますか?
2017/01/20(金) 20:57:25.59ID:pNkrp0ep
効果が出るのは
・小さい
かつ
・短時間に非常に多数呼び出される
関数だけだよ。
しかも、まず劇的ではない。
249デフォルトの名無しさん
垢版 |
2017/01/20(金) 21:15:10.32ID:esT1VQmf
inlineキーワードはヘッダに実装書くときなどに使用するものでインライン展開を狙った最適化の為に書くものではない
2017/01/20(金) 21:15:23.08ID:abKD9bRi
もしかしてコンパイラの方で展開してるとか はないかなぁw
2017/01/20(金) 21:57:28.38ID:aetIobRP
>>249
インライン関数の話の途中でinlineキーワードの関数の話を始めて、いきなりどうした
2017/01/20(金) 22:07:56.98ID:CICAdfuU
>>249
上にもあるけどヘッダに実装書いたら暗黙でインライン指定されるから、そこにinlineキーワードを使用するのは無意味
やはりinlineは最適化のためでしょう
2017/01/20(金) 23:11:34.78ID:LsENUQp+
ベクトルとか行列のライブラリを使った時は全部インラインにしたな
1/60秒にかなりの回数呼ぶし
ライブラリとかもインラインで書かれてる
2017/01/20(金) 23:12:36.14ID:LsENUQp+
×使った ??作った
255デフォルトの名無しさん
垢版 |
2017/01/20(金) 23:27:28.97ID:esT1VQmf
>>252
んなわけない
2017/01/20(金) 23:34:20.48ID:ITfb1kXg
>>255
んなこたーない
257デフォルトの名無しさん
垢版 |
2017/01/20(金) 23:36:05.42ID:esT1VQmf
ヘッダに書いたら暗黙でinlineって
#includeの機能しらんとしか思えないんだが
2017/01/21(土) 00:40:48.27ID:dThE4/1u
ちょと混じっちゃったね。
関数を定義されたヘッダーが複数のソースに呼ばれちゃったら、実体が
いっぱい出来ちゃうもんね。
2017/01/21(土) 01:48:12.93ID:RmTA4cQd
江添はなんて言ってる?
2017/01/21(土) 07:06:45.50ID:5NCJ8rOL
forceを信じるのだ
2017/01/21(土) 08:35:23.75ID:P1/rV56D
インライン関数はODR回避のためだと思っていた
C++17(予定)のインライン変数もそんな感じ
2017/01/21(土) 11:00:41.73ID:wrzS/cSB
ODRって何?
2017/01/21(土) 11:17:05.01ID:J7ipYv9j
単一定義則 One Definition Rule の略語
264263
垢版 |
2017/01/21(土) 19:43:36.29ID:J7ipYv9j
「単一定義規則」の方が検索にかかりやすい言葉かも。
2017/01/22(日) 08:28:10.05ID:5o7PrILb
>>261
そうそう。最適化目的でinline付けても普通無視されるからね。
2017/01/22(日) 14:37:23.33ID:hBhrTyQG
https://chrome.google.com/webstore/detail/%E3%81%AF%E3%81%A6%E3%81%AAng/mbgdnfmdelffjdhkdggilmphfdihnmcj?hl=ja
267デフォルトの名無しさん
垢版 |
2017/01/24(火) 12:50:54.05ID:ZplzBBh2
Windows上で、APIを使わずに、コマンドプロンプト上だけで結果が
ほしいような、C言語のプログラムを作るのに便利な開発環境はありますか?
VIsualStudioは重すぎてあまり使いたくありません。
どうぞよろしくお願いします。
2017/01/24(火) 13:20:58.13ID:qjTW56fl
msys2
269デフォルトの名無しさん
垢版 |
2017/01/24(火) 13:39:24.94ID:ZplzBBh2
msysって、どういうものですか?
2017/01/24(火) 13:58:35.63ID:qjTW56fl
>>269
コンパイラツールチェインとターミナルとライブラリ管理のパッケージツールを纏めたものです
エディタは無いし ビルドツールはautotoolsとかcmakeとかを使います
ただ単体ファイルをコンパイルして実行するだけなら
gccを叩くだけなので ご要望に沿うかと
2017/01/24(火) 14:14:08.29ID:tjYeiy24
重いのがイヤなら code::blocks はどうかね
http://demura.net/lecture/12713.html
2017/01/24(火) 20:33:35.20ID:bAAm8CCs
>>267
自分もvisual studio が重いのと好きなエディタ使いたいのと、
でもGUIでファイル管理とかコンパイルエラー行へのジャンプをしたかったの自分でそういうツールを作った。TTVC Developer っていうのだけど
ネット上に公開してるけど反応無いので本当に良くできてるかどうかは
わからんが、自分的には便利だとは思ってる
2017/01/24(火) 20:39:04.14ID:2gaKjsEX
俺はqt creator使ってるな
VSよりマシってくらいだが
2017/01/24(火) 20:46:07.50ID:HHZbO6eg
>>267
notepad.exe
cl.exe
link.exe
275デフォルトの名無しさん
垢版 |
2017/01/24(火) 21:22:57.39ID:nvNd8iP1
Bash on Ubuntu on Windws
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況