板検索:
【初心者歓迎】C/C++室 Ver.100【環境依存OK】 (266)
まとめビュー
1
デフォルトの名無しさん[sage]   投稿日:2016/11/06 22:58:02  ID:dU5z27As.net
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

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

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

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】


2
デフォルトの名無しさん[sage]   投稿日:2016/11/06 23:23:55  ID:AHO3vAwR.net
>3-1000は射精魔
コメント1件

3
デフォルトの名無しさん[]   投稿日:2016/11/07 00:30:57  ID:pyn9XiBr.net
>2
訂正しときます
次スレの>3-1000が射精魔
コメント1件

4
デフォルトの名無しさん[sage]   投稿日:2016/11/07 09:27:53  ID:vooGYje+.net
前スレ>999再掲
class A{
int a[2];
A(int b[])
:a(b) //error
{}
};

この:a(b)ってなにか書き方ありますか?

前スレ>1000
無理でした・・・
コメント3件

5
デフォルトの名無しさん[sage]   投稿日:2016/11/07 09:34:35  ID:dSd+kVnH.net(2)
何がしたいのかわからないので回答しようがないな

6
デフォルトの名無しさん[sage]   投稿日:2016/11/07 09:36:19  ID:dSd+kVnH.net(2)
あ、初期化子か
インデントがないから見間違えた

7
デフォルトの名無しさん[sage]   投稿日:2016/11/07 09:38:54  ID:e8hpdnod.net
引数の int b[] って int* b と同じやしなぁ

8
デフォルトの名無しさん[sage]   投稿日:2016/11/07 09:47:42  ID:HQzTq5fm.net
std::array

9
デフォルトの名無しさん[sage]   投稿日:2016/11/07 12:11:29  ID:56hqYy7l.net
C++11以降なら
A(int (&b)[2]) : a{b[0], b[1]} {}

10
デフォルトの名無しさん[sage]   投稿日:2016/11/07 14:52:37  ID:fwwW9lIx.net(2)
だがint b[2][3]はポインタ引数は・・・

11
デフォルトの名無しさん[sage]   投稿日:2016/11/07 14:56:04  ID:6MsAvbZq.net
↑幻覚をみた糖質のつぶやき
コメント1件


12
デフォルトの名無しさん[]   投稿日:2016/11/07 15:00:49  ID:3Xim9e5h.net(2)
>4
C++11以降ならstd::initializer_listが使える

#include <iostream>
#include <initializer_list>
#include <algorithm>

class A {
int a[6];
public:
A(std::initializer_list<int> b) {
std::copy(std::begin(b), std::end(b), a);
}
void print() const {
for (int i : a)
std::cout << i << std::endl;
}
};

int main()
{
A a({10, 4, 2, 8, 5, 66});

a.print();
}
コメント2件

13
デフォルトの名無しさん[sage]   投稿日:2016/11/07 18:18:06  ID:hOJqMng1.net(4)
>12
それinitializer_listに6っこ以上与えたら実行時のアクセス違反になる

>4
C++11以降ならstd::array使うべき
そうすれば普通に書ける

class A{
std::array<int,2> a;
public:
A(const std::array<int,2> &b):a(b)
{
}
};
コメント1件

14
13[sage]   投稿日:2016/11/07 18:21:04  ID:hOJqMng1.net(4)
2行目「6個より多く」だったね

15
デフォルトの名無しさん[sage]   投稿日:2016/11/07 18:44:55  ID:3Xim9e5h.net(2)
>13
いやいくらでも動的に増やせるんだけど初心者スレだから省略した

http://ideone.com/ryEwkt

16
デフォルトの名無しさん[sage]   投稿日:2016/11/07 19:07:23  ID:hOJqMng1.net(4)
要求は固定長の配列であって、動的に増やせるようにしろとは言ってないので
それのコードは非効率にしかならないと思うよ
コメント2件

17
デフォルトの名無しさん[sage]   投稿日:2016/11/07 19:25:01  ID:fwwW9lIx.net(2)
>11
ん?
int b[2][3];をわたせんの?
func(int a[][3]);以外で

18
デフォルトの名無しさん[sage]   投稿日:2016/11/07 19:50:01  ID:Z2RT26Su.net(2)
>16
だからvector使ってないでしょう
unique_ptrのパフォーマンス知らないの?

19
デフォルトの名無しさん[sage]   投稿日:2016/11/07 20:07:47  ID:Z2RT26Su.net(2)
ID:hOJqMng1 の主張の変遷

1.わざと大きい初期化子を与えると実行時にアクセス違反になると主張
→だから動的に対応できるようにした

2.すると今度は非効率的だからarrayを使えという
→arrayが特に効率的なわけではないし、今度は「要求は固定長の配列だ」と言い出す

どう考えても言ってることがコロコロ変わってるんだが
コメント2件

20
デフォルトの名無しさん[]   投稿日:2016/11/07 21:12:34  ID:L762Pvtq.net
!!喧嘩の予感!!

21
デフォルトの名無しさん[sage]   投稿日:2016/11/07 21:25:52  ID:nZ1H9hgf.net
A() : a{b[0], b[1]} {}がダメだった人にC++11を押しつけてどーすんだ
>12に至ってはもとの質問と全然関係ねーし
コメント1件

22
デフォルトの名無しさん[sage]   投稿日:2016/11/07 21:26:20  ID:Rr8tj+hR.net
VC++で、マウスオーバーで色が少し変わって、クリックしたら沈んだみたいになる画像ボタンを作るにはどうしたらいいですか?

23
デフォルトの名無しさん[sage]   投稿日:2016/11/07 22:16:57  ID:hOJqMng1.net(4)
>19
まず効率は動的確保を行うnewとunique_ptrより確実にarrayのほうがいい

そして>4の要求はコードから明らかに固定長でいいと言ってる
これは私の勝手な主張ではなく元の要求がそうなってる
目的を達成するために非効率な動的確保は必要ない

私はアクセス違反になるといったが動的確保にしろとは言っておらず、動的確保にしたのはそっちが勝手にやったこと
アクセス違反を回避するために動的確保にするのは全く割に合わない
だったら長さチェックすればいいだけ

24
デフォルトの名無しさん[sage]   投稿日:2016/11/07 22:20:22  ID:JXtVbtZ4.net
>21で結論でてるじゃねえか
C+11を押し付けてる時点でおまえら全員ダメだ!

25
デフォルトの名無しさん[sage]   投稿日:2016/11/07 23:34:44  ID:lMECrzfj.net
いいぞ、もっとやれ〜♪

26
デフォルトの名無しさん[sage]   投稿日:2016/11/08 00:32:16  ID:t0HdCoBm.net
沸点低すぎワロタw

27
デフォルトの名無しさん[sage]   投稿日:2016/11/08 00:33:05  ID:2SYrs2Uf.net
>アクセス違反を回避するために動的確保にするのは全く割に合わない
こう書かれるべきものが
>16
>それのコードは非効率にしかならないと思うよ
と書かれたため>19が射精した

特に「非効率にしかならない」の「にしか」という表現が前後の繋がりを考えると最悪だ

28
デフォルトの名無しさん[sage]   投稿日:2016/11/08 15:38:54  ID:FW358liz.net(3)
using std;
int main() {
int a;
cout<< "数を入力してください" <<endl;
cin>> a;
cout<<a <<"ですね?" <<endl;
}
aを確実に入力させたくて困っています
ご教授ねがいます
コメント1件

29
デフォルトの名無しさん[sage]   投稿日:2016/11/08 16:03:34  ID:j/2yZvJO.net
まず確実ってなんやねん
数以外だったり未入力は弾くってか

30
デフォルトの名無しさん[sage]   投稿日:2016/11/08 16:26:08  ID:FW358liz.net(3)
そうです
未入力で無限ループみたいに表示されて困っています

31
デフォルトの名無しさん[sage]   投稿日:2016/11/08 16:26:29  ID:Or+T0geg.net
教示ならしてやっても良いが、教授はお断りだ

32
デフォルトの名無しさん[sage]   投稿日:2016/11/08 16:58:49  ID:sBMnjDSh.net
>28
http://ideone.com/dpolU5

一応単なる改行や数字で始まらない文字列は弾くようにした
ただしコメントにも書いてあるけど 123def みたいな数字で始まる文字列を
入力したときは数字だけ返すんでそれが駄目なら自前で作るしかないね
コメント1件

33
デフォルトの名無しさん[sage]   投稿日:2016/11/08 17:22:56  ID:FW358liz.net(3)
>32
getline知りませんでしたが何とかできそうです
ありがとうございます

34
デフォルトの名無しさん[sage]   投稿日:2016/11/10 10:52:07  ID:8ULjF/bN.net(8)
独習C第4版 P197ページの再帰のプログラムなのですが、
#include <stdio.h>

void recurse(int i);

int main(void)
{
recurse(0);

return 0;
}

void recurse(int i)
{
if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}
}

実行結果は
9 8 7 6 5 4 3 2 1 0

の動作がわかりません。10になるまでprintfが実行されずに+1され続けるのはいいのですが、
なぜ10になったらiが戻り始めるのでしょうか?
あまりに初心者な質問ですみません。

35
デフォルトの名無しさん[sage]   投稿日:2016/11/10 11:03:28  ID:6ImFpJhK.net(3)
引数だけ書くと
0+1
1+1
・・・
9+1
ここまではprintfまで来ないまま再帰
9+1でifに入らないからrecurseからリターン
printfがiを表示(9)してリターン
printfがiを表示(8)してリターン
の繰り返し
コメント2件

36
34[sage]   投稿日:2016/11/10 11:07:42  ID:8ULjF/bN.net(8)
>35
早速のレスありがとうございます。

>9+1でifに入らないからrecurseからリターン
ということはmain関数のreturn 0でプログラムは終了してしまうのではないですか?
なぜprintfが呼ばれるのかわからんのですが。(iが減算される理由もわかりません)

37
34[sage]   投稿日:2016/11/10 11:12:33  ID:8ULjF/bN.net(8)
if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}

recurseとprintfは同じifブロックに入っているので、ifが偽なら両方共スキップされると思うのですが、
なぜprintfだけ呼ばれるのでしょうか?
コメント1件

38
デフォルトの名無しさん[sage]   投稿日:2016/11/10 11:20:27  ID:69ogPHI/.net(4)
丁度再帰打ち切り付近の挙動

i=8 で受けた recurse
 recurse(8+1) の呼び出し
 i=9 で受けた recurse
  recurse(9+1) の呼び出し
    i=10 で受けた recurse
    条件合致せず戻る
 printf("%d", i) で 引数の 9 を書く
 i=9 で受けた recurse から戻る
printf("%d", i) で 引数の 8 を書く
i=8 で受けた recurse から戻る

39
デフォルトの名無しさん[sage]   投稿日:2016/11/10 11:28:04  ID:6ImFpJhK.net(3)
>37
9+1で入って偽で抜けたら
8+1で入ってきたif内のrecurseから抜けて次のprintfが実行されて抜ける
8+1で抜けたら7+1で入ってきたif内のrecurseから抜けて次のprintfが実行される
の繰り返し

40
34[sage]   投稿日:2016/11/10 11:40:24  ID:8ULjF/bN.net(8)
>35-39さん
どうも再帰関数とforループがごっちゃになっていたようです。
何となくわかりました。
後は自分で考えてみます。
どうもありがとうございました。

41
デフォルトの名無しさん[sage]   投稿日:2016/11/10 12:42:30  ID:69ogPHI/.net(4)
再帰呼び出し後に書く  recurse(i+1); printf("%d ", i);

書いてから再帰呼び出し printf("%d ", i); recurse(i+1);
の違いとか

呼び出しの出入りを整理する
printf("in:%d\n", i);
recurse(i+1);
printf("out:%d\n", i);
と見えてくると思うよ
コメント1件

42
デフォルトの名無しさん[sage]   投稿日:2016/11/10 13:57:04  ID:gEXUDT4B.net(5)
なんか遠回りな説明ばかりだな
スタックフレームというキーワードを出してやれよ
コメント1件

43
40[sage]   投稿日:2016/11/10 14:01:09  ID:8ULjF/bN.net(8)
>41
>再帰呼び出し後に書く  recurse(i+1); printf("%d ", i);
>と
>書いてから再帰呼び出し printf("%d ", i); recurse(i+1);
>の違いとか

これはこの本の次のページにも書いてありました。
書いてから再帰呼び出しの場合は昇順(1,2,3,4,5,6~)になりますね。

相変わらず曖昧な理解なんですが、
どのiの場合もi=10に達するまではrecurse(i+9)までしか実行されていなくて、
printfは実行されていない待機中の状態だと考えればいいのでしょうか?
それでi=10でif条件文を抜けて、i=9からi=0まで数字が大きい方から順番にまだ実行していなかった
printfを降順で実行していくのでしょうか?

この本(独習C)には
> 引数の値が10に達すると、recurse()の再帰呼び出しから戻りはじめます。関数は、呼び出し元に戻る
>ものなので、recurse()は直前の呼び出し元に戻り、そこでprinf()を文を実行して「9」と表示し、
>さらに前の呼び出し元に戻ります。こうしてrecurse()は、今度は「8」と表示します。 その後も同じ>プロセスが繰り返され、すべての呼び出しから戻った段階でプログラムが終了します。

実行される順番が、最初のi=0からではなく、直近のi=9からなのはなぜなのでしょうか?
コメント2件

44
デフォルトの名無しさん[sage]   投稿日:2016/11/10 14:02:24  ID:69ogPHI/.net(4)
再帰でどう動いてるか理解するのに
スタックフレーム出されても困らないか? 値の保持の実装でそうなってるってだけだし

45
デフォルトの名無しさん[sage]   投稿日:2016/11/10 14:09:10  ID:gEXUDT4B.net(5)
この手の人は、具体的な実装例を見さえすれば、すぐさま疑問が解消されるんだよ
>43でも「待機する」だとか
なんで逆順になるのか分からないとか
言っているが
スタックフレームさえ知れば全ての疑問は解決だし
C/C++するのにスタックフレームさえ知らない状態だと
このさき困難だろう

46
デフォルトの名無しさん[sage]   投稿日:2016/11/10 14:10:50  ID:69ogPHI/.net(4)
おっけー まかせた

47
デフォルトの名無しさん[sage]   投稿日:2016/11/10 14:18:39  ID:gEXUDT4B.net(5)
待機する、って言い方を見るに、何かキューのような物を連想しているようだし
実際、なんで逆順になるか分からないと発言しているわけだが
答えは関数呼び出しはキューではなくスタックだから、と言う他ない
キューやスタックという言葉の意味が分からなかったとしても
どのみちこれらも覚える必要のある最も基本的な事の一つだから
合わせて覚えればよいだろう
コンピュータの基本動作もよくわからないままプログラムを書くということは
多言語ではあり得るのかもしれんが、とりわけここはC/C++スレだからね

48
デフォルトの名無しさん[sage]   投稿日:2016/11/10 14:26:03  ID:gEXUDT4B.net(5)
いや、俺は別に何も説明するつもりはないよ
ただ、スタックフレームというキーワードをだね
そうすれば後は本人が検索するなりなんなり、勝手に調べるだろう
キーワードが分からなきゃ検索も出来ないから、キーワードを出してやれという話
スタックを知らずして再起呼び出しの動作を理解するのは非常に困難というか
質問者は関数呼び出しがキューのようなものであると考えている可能性が高いようだけど
実際にはスタック動作だよ、と
ここを勘違いしていたら、答えにたどりつかないかなぁと

49
デフォルトの名無しさん[sage]   投稿日:2016/11/10 14:29:55  ID:6ImFpJhK.net(3)
>42
最短の説明で教えてあげてくれ任せた

50
40[sage]   投稿日:2016/11/10 14:33:22  ID:8ULjF/bN.net(8)
スタックフレームで検索して見たところ、
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node9.html
このページが一番わかりやすそうです。
LIFOなんで新しい関数と引数が上の方に積み上がっていくと考えれば良いのでしょうか?
first outなんで実効は新しい順(つまり今回の例の場合はi=9)ということですね。

スタックフレームという言葉で検索したらおもしろそうなサイトがたくさん出てきました。
皆さん今回はありがとうございました。

51
デフォルトの名無しさん[sage]   投稿日:2016/11/10 14:51:19  ID:IzCfpVGN.net
>43
まず大前提としてプログラムの流れは1本道で別れたりしないし、待機みたいなことも普通しない

そして再帰関数という特別な関数があるわけではない、recurseは普通の関数と何も変わらない

void recurse(int i)
{
if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}
}

この4行目はrecurseという関数を呼び出している
つまり自分自身を呼ぶのでこの4行目の呼び出し後、recurse関数の最初に戻る
ただし引数iは1大きい値で呼ぶ
これを入れ子のように10回繰り返すことになる
コメント1件

52
43[sage]   投稿日:2016/11/10 15:05:17  ID:8ULjF/bN.net(8)
>51
レスありがとうございます。
https://ipa-zone.info/page-2644/
このページに私が使っている独習Cの再帰の部分が丸ごと転載されているんですが(違法?)、

i=0~10と昇順で増加していく前半部分でも呼び出された関数(recurse(1)など)は終了した訳ではないですよね?
後半のi=10から降順で減少していくときにはじめてprintfが実行されて関数が終了すると思うんですが、
LIFOなんで最後に呼び出されたrecurse(9)からrecurese(0)まで降順で残ったprintfを実行していくということではないんですか?

53
デフォルトの名無しさん[sage]   投稿日:2016/11/10 15:15:27  ID:gEXUDT4B.net(5)
>実行は新しい順(つまり今回の例の場合はi=9)ということですね。

難しく考える必要は無い
関数を呼び出すとき、自分が今何をしていたかをそっくりそのまま保存した状態で
新たにスタックを確保して、呼び出した関数を実行する
関数の実行が終わると、使っていたスタックを開放して
呼び出される前に実行していた処理に復帰する
ちょうど君が
1)ビデオを見ていた時に電話がかかってきたら、ビデオを一時停止して電話に出る
2)電話が終わると、ビデオを再生して続きを見る
のと同じで、ビデオの一時停止機能がスタックに相当している
で、君がこの日のことを日記を書くとき
1)のことを重視すれば、ビデオ→電話、って順になるし
2)のことを重視すれば、電話→ビデオ、って順になる
実際にはビデオ→電話→ビデオ、という順で物事は流れているんだが
どこのタイミングを切り取ってくるかで順番が変わるのだ
下から順番に1,2,3,4,5と積み上げて、上から順番に5,4,3,2,1と取り出すとき
積み上げるとき(積み上げる前)に出力すると1,2,3,4,5だし
取り出すとき(取り出した後)に出力すると5,4,3,2,1になる
実際には1,2,3,4,5,4,3,2,1という順で処理は走っているが(積み上げる→取り出す)
前半に着目すれば1,2,3,4,5だし、後半に着目すれば5,4,3,2,1なのだ
コメント1件

54
デフォルトの名無しさん[sage]   投稿日:2016/11/10 15:18:47  ID:17noS2hU.net
長い。あとビデオ見ながら電話に出れるだろ

55
デフォルトの名無しさん[sage]   投稿日:2016/11/10 15:21:50  ID:3AXwvnI0.net
ポインタを返すラムダをstd::functionで取り扱いたくて調べてるのだが
どうしてどの参考例もintやvoidの例しか示していないのだろう
参考例を示すまでもなく誰でも簡単に記述出来ているのだろうか
コメント2件

56
52[sage]   投稿日:2016/11/10 15:39:54  ID:8ULjF/bN.net(8)
>53
レスありがとうございます。参考になりました。

57
デフォルトの名無しさん[sage]   投稿日:2016/11/10 20:21:43  ID:CLfGjB35.net
>55
特に難しくは無いと思う
例えばどんなことをしたいの?
コメント1件

58
デフォルトの名無しさん[sage]   投稿日:2016/11/10 20:31:23  ID:AQTsjJgJ.net(3)
文盲はお帰りください

59
デフォルトの名無しさん[sage]   投稿日:2016/11/10 21:49:48  ID:cv2N5dvt.net
std::function<int*(const int)> create_array = [](const int n)->int*{ return new int[n]); };

でいいんじゃないの
誰かdeleteすんだよと思うけど
コメント1件

60
デフォルトの名無しさん[sage]   投稿日:2016/11/10 22:03:01  ID:AQTsjJgJ.net(3)
>誰かdeleteすんだよと思うけど

自覚があるならそんな変な例を出さなければいいのに
コメント1件

61
デフォルトの名無しさん[]   投稿日:2016/11/10 23:23:35  ID:wCaAZ9DK.net
>60
じゃあお前が適切な答え書いてやれよ

62
デフォルトの名無しさん[sage]   投稿日:2016/11/10 23:41:59  ID:AQTsjJgJ.net(3)
>55の回答はこんな感じでいいだろう
using ptr_type = void *;
std::function<ptr_type ()> f1{ []{ return ptr_type{}; } };

std::function<void *()> f2{ []{ return static_cast<void *>(nullptr); } };
コメント2件

63
デフォルトの名無しさん[sage]   投稿日:2016/11/11 01:01:22  ID:JQalwGbJ.net(2)
>62
散々煽ってたから聞くけど
static_cast<void *>(nullptr)
このキャスト無駄じゃない?
これは変な例ではないの?
コメント1件

64
デフォルトの名無しさん[sage]   投稿日:2016/11/11 01:15:39  ID:tUBqvL6G.net(2)
う〜んどうだろうね
よく見るとラムダの戻り値の型が省略されているし
こういったことがどの段階のC++のバージョンで出来るようになったのか
俺は知らないが、実際の戻り値の型からラムダの型を推測してくれる便利機能
を使っていると思われる
となれば、キャストなしのnullptrでは型がわからないから
ラムダの戻り値の型の推測もできず、コンパイルエラーになるのではないだろうか

65
デフォルトの名無しさん[sage]   投稿日:2016/11/11 01:36:59  ID:tUBqvL6G.net(2)
もしくは、ひょっとしたらnullptrには何らかな特殊な型が与えられているのかもしれんが
それはしらないが、ともかくvoid*型ではないのは確かなので
その場合でもstd::function<void *()>への代入で問題を起こすんだろう
nullptrに型が有るのか無いのか、俺は知らんし、興味もないんだけどね
コメント1件

66
デフォルトの名無しさん[sage]   投稿日:2016/11/11 01:48:43  ID:v3r+B2af.net(2)
>57>59>62
vsで試してて
std::function<void *()>
のような書き方をするとテンプレートがエラーを出していたので
関数ポインタのような特殊な記述が必要になるのかと思って調べていたのですが
原因が分かりました

仮で書いていたラムダ式の中の返り値を
return NULL;
にしていたのでこれがintなためエラーが出ていたようです
テンプレートの奥のほうで型の不一致を出していたので
<>内の記述ばかり疑っていました

というかNULLって今まで(void *)0だと思ってました・・・
まさかただの0だとは
普段はコンパイラが暗黙に変換してるんだね・・・

67
デフォルトの名無しさん[sage]   投稿日:2016/11/11 01:56:19  ID:v3r+B2af.net(2)
自宅のvs2015communityで実験したところ

std::function<void *(void)> f0 = [](void) { return NULL; };
std::function<void *(void)> f1 = [](void) { return (void *)NULL; };
std::function<void *(void)> f2 = [](void)->void * { return NULL; };
std::function<void *(void)> f3 = [](void) { return nullptr; };

だとf0のみエラーです
gccとかでも同様なんですかね
コメント2件

68
デフォルトの名無しさん[sage]   投稿日:2016/11/11 02:04:25  ID:JQalwGbJ.net(2)
>65
nullptrの型はnullptr_tだよ
だからラムダの戻り値の型はnullptr_tと推論される
ただ問題はvoid *を戻り値としたfunctionに代入できるか

ぶっちゃけ俺も書いてからやっちまったかと思って調べた

規格を調べたところやはり要らなかった
戻り値が暗黙変換できれば代入できると書いてある
つまりラムダの戻り値intでfunctionはdoubleとかもあり
そして当然nullptrはvoid *型に暗黙変換できる
なので要らない

https://ideone.com/EwRvlU

>67の結果とも一致する

69
デフォルトの名無しさん[sage]   投稿日:2016/11/11 07:16:38  ID:hk5EgzxW.net
>63
コンパイルが通るかどうか以前に55は『ポインタを返すラムダを』と言っているのだから、
無いとお題改変になってしまうだろう

>67
当然
int f() {return NULL;}
void *関数() {
 return f();//エラー
}
と同じことなので

70
デフォルトの名無しさん[sage]   投稿日:2016/11/11 08:09:52  ID:JclCvFO1.net(2)
ID:tUBqvL6Gは希にみる健常者

71
デフォルトの名無しさん[sage]   投稿日:2016/11/11 08:32:07  ID:JclCvFO1.net(2)
>nullptrに型が有るのか無いのか
この手の文法で型が無い落とし穴は初期化の { } ぐらいか
int a = {0}; // 「{0}」は式でなく型も無い

72
デフォルトの名無しさん[sage]   投稿日:2016/11/29 23:30:19  ID:7z8mZ0fw.net
さすがにCは時代に取り残された感があるな
新規案件なら埋め込み系を除いて存在意義なし

73
デフォルトの名無しさん[sage]   投稿日:2016/11/30 02:47:51  ID:Ir3oZvjK.net
寂しいですなぁ

74
デフォルトの名無しさん[]   投稿日:2016/11/30 02:56:49  ID:a9ciiDR7.net
う、埋め込み…

75
デフォルトの名無しさん[]   投稿日:2016/11/30 04:02:07  ID:tfyAgmME.net
組み込み系って英語ではembedded なんちゃら だし
よくある間違いでしょ

76
デフォルトの名無しさん[]   投稿日:2016/11/30 05:21:32  ID:sG3uRZRm.net
韓国ではよくあるんだ。

77
デフォルトの名無しさん[sage]   投稿日:2016/11/30 05:53:32  ID:/gnC384r.net
埋めるのは中国の得意とする技術

78
デフォルトの名無しさん[sage]   投稿日:2016/11/30 21:26:32  ID:ncjk4kan.net
linuxのカーネルモジュールてC++で書けるようになったんだっけ?

79
デフォルトの名無しさん[sage]   投稿日:2016/11/30 22:16:09  ID:Yeu32peW.net
ドライバとかはサブシスは普通に書いてるぽい、コアな部分はメンテナがパニクルのでやっぱCかと

80
デフォルトの名無しさん[sage]   投稿日:2016/12/01 11:40:38  ID:OWujHEiH.net
実際ひと目でいいからソース見てみ
一生C++なんか使わねーという主張がにじみ出てるよ

81
デフォルトの名無しさん[sage]   投稿日:2016/12/01 12:49:06  ID:yfw1GD74.net
C++使わなくていいならそれに越したことはないからね

82
デフォルトの名無しさん[sage]   投稿日:2016/12/01 13:16:49  ID:VWu2OAFy.net
c++は個人差が大きすぎるようです。議論も出来ない。
方向がコンフリクトしたら大変なのは ここ見てればわかる。

83
デフォルトの名無しさん[sage]   投稿日:2016/12/03 01:01:12  ID:62YFpmrs.net
C++はマングリングとかややこしいから

84
デフォルトの名無しさん[sage]   投稿日:2016/12/03 20:56:34  ID:nmEGc+VH.net
健全でない言葉が含まれているため表示しません 内容を確認する

85
デフォルトの名無しさん[sage]   投稿日:2016/12/11 20:30:30  ID:CL+E9lTu.net
C++初学者です。

既存のCのライブラリに次のような関数が有るんだけど
bool SendData(uint32_t * txData, uint32_t * rxData, uint16_t length);

ラッパーで引数をuint16_tのポインタに変更したもを作りたいと考えています。
bool SendData(uint16_t * txData, uint16_t * rxData, uint_16_t length);

単にラッパーの中でバッファを持って変換してやれば良いとも思ったけど、
組み込み用途なんで速度や消費メモリ的にそれは避けたいです。
newやdeleteは無しでスタックのみを使用できれば、なお良いのですが、
良い方法が思いつきません。

何かスマートな方法は有りませんか?

86
デフォルトの名無しさん[sage]   投稿日:2016/12/11 20:55:16  ID:Cd8ql2jy.net
元関数の length が uint32_t 単位での個数という仮定
→ uint32_t より小さい粒度は取り扱えない
→ uint16_t で取り扱える個数は偶数個に限定される
→ ポインタのキャストと length を /2 で渡すだけ
コメント2件

87
デフォルトの名無しさん[sage]   投稿日:2016/12/11 21:42:00  ID:74mAoGAM.net
uint16_tの方がラッパーなの?
どちらにしろ元の関数をそのまま使うなら変換は必要だね。

スタックが使われるかどうかはしらないけどClangコンパイラなら
可変長配列(VLA)っていうのがC++でも使えたはず。
サイズが大きすぎるとオーバーフローするけど。newと兼用してみるのも手。
コメント1件

88
85[sage]   投稿日:2016/12/12 22:47:53  ID:lLNqHCIY.net
>86
なるほど、
渡すデータを1つ置きにすれば良いわけですね。
渡すデータを組み立てるときにそうすれば良いですし変換のコストは少なそうです。
多少汚いとこが関数外に出ちゃいますが今回のケースでは現実的な方法だと思います。

>87
残念ながら使用しているコンパイラはclangではないですし、
VLAは今回の用途には重そうですね。
便利そうなので、PC用のプログラムを作るときに使えるかもしれません。

ひとまず>86さんの方向で考えてみます。
お二人ともありがとうございました。

89
デフォルトの名無しさん[sage]   投稿日:2016/12/13 07:43:47  ID:vJwCdf+q.net(2)
組み込みでスタックに可変長のデータ領域確保するとか頭大丈夫?
コメント1件

90
デフォルトの名無しさん[sage]   投稿日:2016/12/13 18:19:51  ID:692Oa1tt.net
>89
組み込みのことは知らないんだけど、サイズチェックして分岐するのはどうなん?

if (length * sizeof(uint32_t) < 32767) {
  uint32_t list[length];
  Test(list, length);
}
else {
  uint32_t list = new uint32_t[length];
  Test(list, length);
}
コメント1件

91
デフォルトの名無しさん[sage]   投稿日:2016/12/13 19:22:51  ID:vJwCdf+q.net(2)
>90
どうなのって言われても好きにしろよとしか言えないけど...
個人的には各々のテストも必要になるその手のコードは書かない

92
デフォルトの名無しさん[sage]   投稿日:2016/12/15 21:00:06  ID:iypiqTM3.net
ガチの初心者でプログラミング勉強したいと思ってるんですが
プログラミング勉強するとなるとどんなものから作り始めればいいですかね?
ちなみにCの基本的なこと(if,for文やファイル入出力)くらいしか知りません
コメント2件

93
デフォルトの名無しさん[sage]   投稿日:2016/12/15 22:16:52  ID:esEF0eVo.net
やっぱり画像が出たら楽しいから画像ビューアとかが良いんじゃないかな
画像が動いたらもっと楽しいって言うんならゲームもよいんじゃない?
音関係も楽しいんだが、サウンドプログラミングは結構専門知識がいるうえ
デバッグが難しいから最初は手を出さないほうが良いよ

ま、画像ビューアや動画プレイヤーが楽しいよ
ちょっとした実用性もあるし
コメント1件

94
デフォルトの名無しさん[sage]   投稿日:2016/12/15 22:22:14  ID:KqXo4C+P.net
Cであることに特に意味がないのなら別の言語の検討をすすめる


95
デフォルトの名無しさん[sage]   投稿日:2016/12/16 06:44:53  ID:cbHo8vE5.net
javaも悪くないと思いますよ。

96
デフォルトの名無しさん[sage]   投稿日:2016/12/16 08:53:37  ID:hCzygT3G.net(2)
>92
プログラミングを習得した延長線上に何を作りたいか決まってる?
コメント1件

97
デフォルトの名無しさん[sage]   投稿日:2016/12/16 08:59:07  ID:2kpKp/Uz.net
>92
作りたいプログラム(今ならアプリケーションというのかな)の
イメージが先にないとアドバイスしにくい時代なのよ。

まずコンソールに hello, world を表示して、続いて標準入出力、
ソートやらリンクド・リストやらのアルゴリズムを習得して…
という順序を踏んでも、「マウスをクリックすると何かしてくれる」ような
今様のプログラムには少しも近づかないんだな、これが。
コメント1件

98
デフォルトの名無しさん[sage]   投稿日:2016/12/16 09:22:43  ID:R8KZSjOU.net(3)
>96
ゆくゆくはカメラを使って画像処理的なものをしてみたいと思ってます
具体的にはまだ決まってませんが…
コメント1件

99
デフォルトの名無しさん[sage]   投稿日:2016/12/16 09:23:43  ID:R8KZSjOU.net(3)
>97
なるほど
将来的にやりたいことをしっかり考えたうえで何を学ぶべきか考えたほうがいいんですね!

100
デフォルトの名無しさん[sage]   投稿日:2016/12/16 09:30:19  ID:R8KZSjOU.net(3)
>93
なるほど!
参考になりますm(__)m
コメント1件

101
デフォルトの名無しさん[sage]   投稿日:2016/12/16 09:52:11  ID:hCzygT3G.net(2)
>98
じゃあとりあえずGUIが必要だから
そこらへんからかな?
コメント1件

102
デフォルトの名無しさん[sage]   投稿日:2016/12/16 11:19:48  ID:O1fw7E0o.net
>101
わかりました!
ありがとうございます!

103
デフォルトの名無しさん[sage]   投稿日:2016/12/18 22:40:31  ID:rTzEq7cO.net
c++でGUIな何かを作るときどうやるのが普通?どうやるのがおすすめ?
趣味嗜好全開でいいから教えてくれ
コメント1件

104
デフォルトの名無しさん[sage]   投稿日:2016/12/18 22:46:05  ID:eNcCSvTp.net
ビルド時間とバイナリサイズが気にならないならwxWidgets

105
デフォルトの名無しさん[sage]   投稿日:2016/12/18 22:56:35  ID:TyHJy95g.net
真面目にその条件なら.NETだけどそれなら言語はC#でやった方がよいと思う
自分は自分用のWIN32APIを使ったGUI用のライブラリ作ったけど完全に時代遅れだとは思ってる

106
デフォルトの名無しさん[sage]   投稿日:2016/12/18 23:56:09  ID:psse/iGW.net
wxWidgetsよさそうやね
クロスプラットフォームってのがいい

107
デフォルトの名無しさん[sage]   投稿日:2016/12/19 08:41:19  ID:K+bb4qm0.net
vcを使うという事ですか

108
デフォルトの名無しさん[sage]   投稿日:2016/12/20 08:43:24  ID:/4ZK922w.net
>103
ターゲットのOSとかPC/ケータイとかライセンスとか軽さとか見比べて
GUIフレームワークを選ぶ

Qt は重いけどマルチプラットフォームかつ見た目がいいから人気
Windowsのみなら C# が迷わなくて済むけどね
時代遅れを気にしないなら VC+MFC の情報は多いw
他にもいろいろある

109
デフォルトの名無しさん[]   投稿日:2016/12/24 19:03:48  ID:Xnn//JuE.net(3)
FILE *fp;をグローバル変数にしてたら落ちまくって、ローカル変数にしたら落ちなくなった現象は何でですかね?
グローバルかローカルか関係ない気がするんですけど。
Windows7、Visual Studio 2015
コメント1件

110
デフォルトの名無しさん[]   投稿日:2016/12/24 19:04:08  ID:Xnn//JuE.net(3)
これで4時間近くハマった。

111
デフォルトの名無しさん[sage]   投稿日:2016/12/24 19:11:41  ID:0UyY/BKM.net
グローバルな FILE *fp の近く(若いアドレス)に置かれた
グローバルな配列の範囲オーバーじゃないかしら。
コメント3件

112
デフォルトの名無しさん[sage]   投稿日:2016/12/24 20:06:31  ID:TihFoldF.net
>109
ファイルの開くのから閉じるのまでが一関数に収まってて、他から呼び出してないなら関係ないと思うけど
閉じ忘れとか?

113
デフォルトの名無しさん[sage]   投稿日:2016/12/24 20:27:17  ID:DNE92dFu.net
fileno とか ferror は確認した?

114
デフォルトの名無しさん[sage]   投稿日:2016/12/24 20:34:23  ID:y7L7nGQ6.net
fp をグローバルにおいたソースで 別のローカル変数をグローバルに置いたら
その変数で副作用起こすんじゃね?

(>111 と同じく範囲突破しての書き込みを疑ってる)

115
デフォルトの名無しさん[sage]   投稿日:2016/12/24 21:00:46  ID:yr6q9nVG.net
fpがどんな値になろうと最悪でもエラー検出するだけだから
落ちるのはまともにエラー判定してないせい

116
109[sage]   投稿日:2016/12/24 21:14:49  ID:Xnn//JuE.net(3)
>111-115
ありがとうございます。

>111さんのおっしゃる通り、メモリの問題でした。
fopenからfreadの間で、
読み込みバッファをmallocで確保してmemsetでゼロクリアしている部分があり、
このクリアするサイズが確保したサイズを上回っていました。
なので、fopen直後のエラーチェックでも問題が起きてないのに落ちていたようです。

//私も一度はこれを疑って確認したんですけどね。
//レスもらってから改めて確認したらこのような状況になってました。

根本的な解決ができて良かったです。

117
デフォルトの名無しさん[sage]   投稿日:2016/12/25 01:18:26  ID:vsDUBYtf.net
気付くだけ立派だわなぁ

118
デフォルトの名無しさん[sage]   投稿日:2016/12/25 07:00:04  ID:iLmpV78q.net
mallocで確保した領域の溢れがグローバルな変数を壊すってのは
ちょいと解せない気もする。

DOSの頃なら互いに影響しあうことも普通だったろうけど、
最近のOSだと別に管理してそう。
内部の詳しいことは知らないけど。
コメント1件

119
デフォルトの名無しさん[sage]   投稿日:2016/12/25 09:26:05  ID:SibbJTGE.net
>118
お前はもう少し勉強してから書き込むべき

120
デフォルトの名無しさん[sage]   投稿日:2016/12/25 09:43:40  ID:CGvp0k11.net
エミュとかアドレスを固定してるけどどうやってんの?
コメント1件

121
デフォルトの名無しさん[]   投稿日:2016/12/25 16:56:04  ID:xlX3oF2t.net(2)
質問です
エラーになってしまいます
教えて下さい
C++11です

int n=0;
string hage="s"+n+".png";
コメント1件

122
デフォルトの名無しさん[sage]   投稿日:2016/12/25 17:03:23  ID:YVZO5C9V.net
"s"と".png"はconst char*型なので+は無理

123
デフォルトの名無しさん[]   投稿日:2016/12/25 17:09:24  ID:xlX3oF2t.net(2)
そうなんですか…
ありがとうございました

124
デフォルトの名無しさん[sage]   投稿日:2016/12/25 22:48:16  ID:oxH1mE2q.net
>120
最初に、すべてのアドレス分のメモリを確保すれば?

その先頭アドレスを、エミュレータの先頭アドレス・0 にすればいい
コメント2件

125
デフォルトの名無しさん[sage]   投稿日:2016/12/26 01:40:19  ID:Us2MOZON.net
>121
標準で用意されているのはstringとstring/char/char*間のみ(operator+)
なので+するのをintでなくstringにすればいける
C++11ならto_stringがあるから次ので問題ない
string hage = "s" + to_string(n) + ".png";

細かい書式設定とかしたいならsstreamかsnprintfあたりで
コメント1件

126
デフォルトの名無しさん[sage]   投稿日:2016/12/26 08:42:54  ID:w1n6Bp69.net
>124
それじゃ起動毎に変わるんじゃね?

127
デフォルトの名無しさん[sage]   投稿日:2016/12/26 09:21:17  ID:5lDUjv3x.net
起動毎にホスト上でのメモリ配置が変わっても
エミュレータの駆動機構で >124 のように
エミュレーションする対象の仮想コードのアドレッシング → ホスト環境の実メモリ
の変換テーブル経由なら問題は発生しないべ
コメント1件

128
デフォルトの名無しさん[sage]   投稿日:2016/12/26 12:36:41  ID:bq11e3Cp.net
>125
ありがとうございます!
あとでやってみます

129
デフォルトの名無しさん[sage]   投稿日:2016/12/26 16:52:23  ID:vHVIx8+p.net
ASLRのことなら、無効にする事が出来る

130
デフォルトの名無しさん[]   投稿日:2016/12/27 00:09:30  ID:hMHSnQwo.net
>127を分かりやすく言うと配列みたいなもんだ。
int foo[5];
と宣言すれば、起動毎に確保されるアドレスは違うが、
例えば3番目のアドレスには必ず&foo[3]でアクセスできる。
これと同じ。

131
デフォルトの名無しさん[]   投稿日:2016/12/28 09:29:29  ID:jHXCJg+4.net
OggVorbisの使い方を教えてください。
動的リンクライブラリとしてリンクして、
WAVEデータをリアルタイムでOggVorbis形式(CBR)に変換したいです。
VS2015です。
一応ググりましたがどこから手を付けてよいか分かりませんでした。


132
デフォルトの名無しさん[sage]   投稿日:2016/12/28 11:23:40  ID:BmYU7N0Q.net
https://xiph.org/doc/
ここから必要な文書を探して読んで理解するのが本筋

133
デフォルトの名無しさん[sage]   投稿日:2016/12/31 16:11:48  ID:8v6iajLL.net(2)
ある本の解答例ですが実行すると先頭文字が消えます。これではダメなんでしょうか?
void str_toupper(char *str)
{
while (*str)
*str++ = toupper(*str);
}
コメント2件

134
デフォルトの名無しさん[sage]   投稿日:2016/12/31 16:20:34  ID:ADMXNhyN.net(2)
*str++ = toupper(*str);

これ鼻から悪魔コード
インクリメント演算子で操作された変数が副作用完了点までに複数回参照するのは動作未定義

*str = toupper(*str);
str++;
と分離しないとまずい
コメント2件

135
デフォルトの名無しさん[sage]   投稿日:2016/12/31 17:17:13  ID:Z7Smo6OK.net
*str++ = toupper(*str); でダメなら
*str = toupper(*str++); で動くんじゃない?

……って真に受けるなよ。別の悪魔が出てくるだけだからな。
たとえ期待通りの動作になったとしても、たまたまだからな。
コメント1件

136
デフォルトの名無しさん[sage]   投稿日:2016/12/31 17:24:22  ID:xodGK7fu.net
ポインタを直接インクリメントするのはどうにも性に合わん

137
デフォルトの名無しさん[sage]   投稿日:2016/12/31 17:38:17  ID:nERH8viD.net
通る道なのでやさしくね

138
デフォルトの名無しさん[sage]   投稿日:2016/12/31 18:30:26  ID:K1FrsN4c.net
>133
その本がダメなコードの例としてそれを挙げてるならいいけど、正解としてそれを書いてるのなら、著者の能力とか校正の正確さとか不安になる。
コメント1件

139
133[sage]   投稿日:2016/12/31 19:18:21  ID:8v6iajLL.net(2)
>138
正解例です
>135
下でダメだったので正解を見たら上になってて、そうかとそうかと思ったのですが…
>134
ありがとうございます
初心者なので更に勉強してみます
コメント1件

140
デフォルトの名無しさん[sage]   投稿日:2016/12/31 20:02:29  ID:RP5GqFRc.net
本の題名晒してもいいと思う...

141
デフォルトの名無しさん[sage]   投稿日:2016/12/31 20:11:53  ID:ADMXNhyN.net(2)
古かったとして、古い規格だとしても処理系依存
(こっちのコンパイラはこうなるけど、あっちのコンパイラでは別の結果になるよ) なので、
正解コードとするのはよろしくない

142
デフォルトの名無しさん[sage]   投稿日:2016/12/31 20:17:55  ID:q3l2oU5w.net
なぜダメなのか何がダメなのか理解しとかないと

143
デフォルトの名無しさん[sage]   投稿日:2017/01/01 01:32:25  ID:LgRst/uw.net(2)
>139
まじすか ちょっとひどいですね。 著者が知りたいです。

144
デフォルトの名無しさん[sage]   投稿日:2017/01/01 12:42:18  ID:/LG195GI.net
str_toupperでググると正しいコードはあるけど >133 は見つからないなあ。結局なんて本?

145
133[sage]   投稿日:2017/01/01 14:53:59  ID:OFpbxODd.net
解きながら学ぶC言語(2006年第5刷)ですが、新版見てみたら >134 のように修正されてました

146
デフォルトの名無しさん[sage]   投稿日:2017/01/01 17:19:11  ID:LgRst/uw.net(2)
望洋先生すか あちゃー

147
デフォルトの名無しさん[sage]   投稿日:2017/01/04 01:18:25  ID:frbRBuKj.net
副作用完了点が2つ以上あると鼻から悪魔
コメント5件

148
デフォルトの名無しさん[sage]   投稿日:2017/01/04 01:40:21  ID:8dyTsCQL.net(3)
んなこたーない

149
1/2[]   投稿日:2017/01/04 02:39:58  ID:9INFfbdp.net(3)
このサイトを参考にコードを書いているのですが、レスポンス中に無反応になります。
助けてください。

http://qiita.com/edo_m18/items/41770cba5c166f276a83

このコードとの差異は以下の通りです。
----------------------------------------------------------
read_size = SSL_read(ssl, buf, buf_size);の前に
memset( buf, 0, buf_size );を挿入

write(1, buf, read_size);を
printf("%s",buf);に変更

close(sock);の後に
printf("OK.\n");を挿入

拡張子をcppとし、C++としてコンパイル。
----------------------------------------------------------

この変更したコードのprintf("%s",buf);で不具合が生じます。
不具合パターンは以下の2通りです。
・ 恐らく受信したHTMLの最終部分と思われる</body></html>を出力後、2行ほどの空行、そして0という数字が出力された後、無反応になる。
・ レスポンスヘッダやHTMLコードの途中で無反応になる。
無反応時にはEnterキーもCtrl+Cも効きません。
しばらくすると、効くようになります。
但し、printf("OK.\n");によるOKが出力されませんので、異常終了している可能性が高いです。
コメント1件

150
2/2[]   投稿日:2017/01/04 02:40:11  ID:9INFfbdp.net(3)
環境は以下の通りです。
OS: CentOS 6.4
コンパイラ: GCC 4.4.7
接続先: https://www.youtube.com/

その他、無反応中にnetstat -tanpコマンドで確認すると、
このアプリケーションはESTABLISHEDとなっています。
また、自宅サーバーのHTTPSのサイトへアクセスした場合、HTMLの最後のほうの</body>が出力された後に数秒の間があり、
その後、</html>が出力されて正常に終了します。
この数秒の間も気になります。

よろしくお願いします。

151
デフォルトの名無しさん[sage]   投稿日:2017/01/04 03:14:24  ID:sO2gccKh.net
>149
> printf("%s",buf);に変更

%sは文字列のアドレスを引数として受けてそれを出力する
C言語で文字列とはNUL終端されたバイト列だが
SSL_readは文字列ではなく只のバイト列を扱うからNUL終端なんてしていない
そのために受信した文字列以上のおそらくbufの領域を越えて偶然にゼロに
出くわすまでprintfが出力しているんだろう

付け加えると、サーバーから送られてくるバイト列中にゼロが含まれていると
文字列として扱おうとしたprintfはそこまでで終わりと見做してしまう
例えば2ちゃんはたまにそんなHTMLを返してくることがあっていい加減な作りの
自作アプリなんかが途中までしか表示しないとかいう不具合を出す
コメント1件

152
149[sage]   投稿日:2017/01/04 03:47:33  ID:9INFfbdp.net(3)
>151
ありがとうございます。
初歩的なミスでお恥ずかしい。
バイナリデータとしてファイルに出力したところ正常に動作しました。(ファイルの内容にも問題ありませんでした)
恐らくマルチバイト文字の途中か何かで切れていたのでしょう。

153
デフォルトの名無しさん[sage]   投稿日:2017/01/04 08:50:07  ID:hKIlPOcN.net
マルチバイトなんか関係ない
> write(1, buf, read_size);を
> printf("%s",buf);に変更
すんなって事だよアホウ

154
デフォルトの名無しさん[sage]   投稿日:2017/01/04 09:47:31  ID:87+T0pXS.net
もしくは1.1sだな

155
デフォルトの名無しさん[sage]   投稿日:2017/01/04 09:53:13  ID:dvUWMEVx.net(3)
printf("%.*s", read_size, buf);  なら少しだけ
それでも read_size に至る途中に \0 あったら駄目だし
標準出力に送りたいんなら fwrite(buf, read_size, 1, stdout); こうなるかな

156
デフォルトの名無しさん[sage]   投稿日:2017/01/04 09:54:39  ID:dvUWMEVx.net(3)
元質問みてなかった わーすーれーてー

157
デフォルトの名無しさん[sage]   投稿日:2017/01/04 12:32:23  ID:xue+qv3N.net(2)
「んなこたーない」
っていつも書き込みする人がいるけど
もっと具体的な回答してほしい。

「んなこたーない」って答えるくらいだから何かしらの反論や回答持ってるんだろうけど
もっと具体的に言ってくれなきゃ分からない。
コメント3件

158
デフォルトの名無しさん[sage]   投稿日:2017/01/04 12:37:37  ID:FLMu+DIB.net
そういうのはとりあえず否定したいだけだからスルーでいいよ
回答なんか持って無いと思うし
コメント1件

159
デフォルトの名無しさん[sage]   投稿日:2017/01/04 13:56:51  ID:x5I82FL9.net
0x00がないと、どこまでもぉ って事だけで。

160
デフォルトの名無しさん[sage]   投稿日:2017/01/04 15:05:14  ID:CkccjIZ7.net
俺はとりあえずこんなのを提案する()


do {

memset( buf, 0, buf_size );
read_size = SSL_read(ssl, buf, buf_size-1);
printf("%s",buf);

} while(read_size > 0);



do {

memset( buf, 0, buf_size );
read_size = SSL_read(ssl, buf, buf_size);

for(int i=0; i < read_size; ++i){ printf("%c",buf[i]); }

} while(read_size > 0);

161
148[sage]   投稿日:2017/01/04 15:11:07  ID:8dyTsCQL.net(3)
>157
さすがにこれは説明要らんだろうと思うよ・・・。

「副作用完了点が2つ以上」って、 str++; str++; こんなのでアウトってことだからね。

162
デフォルトの名無しさん[sage]   投稿日:2017/01/04 17:51:37  ID:ku1IYB1y.net
んなこたーない

163
デフォルトの名無しさん[sage]   投稿日:2017/01/04 18:08:39  ID:issqqmbF.net
do while()って嫌いだから使わん

164
デフォルトの名無しさん[sage]   投稿日:2017/01/04 18:10:34  ID:dvUWMEVx.net(3)
マクロのおまじないでも?

#define FOO() do { あーだこーだ } while(0)

165
デフォルトの名無しさん[]   投稿日:2017/01/04 18:15:56  ID:pxTed+R/.net(2)
>147
言いたいことはわかる気がするが、その文面は明らかに間違っているでしょ。

エスパーすると、
「副作用完了点と副作用完了点の間で、同一の変数を複数回変更する」
と、鼻から悪魔、かな?

166
デフォルトの名無しさん[]   投稿日:2017/01/04 18:17:44  ID:pxTed+R/.net(2)
まだ甘いか。
「ある副作用完了点と、次の副作用完了点の間で、同一の変数を複数回変更する」
かな?

167
片山博文MZ ◆T6xkBnTXz7B0 [sage]   投稿日:2017/01/04 18:21:17  ID:83LRywdJ.net
gotoで地獄へ行くのをdo/break/whileに書き換えることができる。
...
goto hell;
...
goto hell;
...
hell: ...
return 0;
↓↓↓
do {
...
break;
...
break;
...
} while (0);
...
return 0;

168
デフォルトの名無しさん[sage]   投稿日:2017/01/04 19:49:00  ID:wOLmnoYC.net
>157
人としての最低限の知能を持ち合わせて調べ直せば本人なら気付くレベルの時しか言っていないのでいつも本人からの訂正レスを待っているのだが、
何故か絶対に自分の発言を撤回したがらないようだ

169
デフォルトの名無しさん[sage]   投稿日:2017/01/04 21:37:54  ID:lUhJzh+Z.net
言われた方は言われた方で同じこと思ってるんだろ。だから具体的に指摘しなきゃ話が進まない。

170
デフォルトの名無しさん[sage]   投稿日:2017/01/04 22:12:54  ID:zg5YylVI.net
ピンポイントで間違い指摘されてんだから自分こそ根拠を述べろよ。
「副作用完了点が2つ以上」なんてどこにもねーんだから。
わかないよ〜ホレホレって荒らしたいだけ?

171
デフォルトの名無しさん[sage]   投稿日:2017/01/04 22:45:56  ID:by3GIgBn.net
>157
さすがに >147-148 だと >147 の方に説明責任があると思う

172
デフォルトの名無しさん[sage]   投稿日:2017/01/04 23:27:27  ID:6PKdRVzk.net
MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ!

研究会のメンバーでさえ、規格に詳しい人がいないのだから、
日本人では、規格に詳しい人はいない

トヨタでも、MISRA-Cの遵守率が5%しかない。
こういう素人が作る、医療機関・産業機械は怖くて使えない。
アプリのバグで、すぐに人が死ぬ

コンパイラを作る方も、あやふやな解釈をしているから、
紛らわしい書き方を避けて、かなり安全に、コーディングしないと危険

極端に言えば、1文1文、分離して書くこと。
バグが多く出る箇所は主に、マクロ・複合文・型違いの3つ

173
デフォルトの名無しさん[sage]   投稿日:2017/01/04 23:45:39  ID:xue+qv3N.net(2)
> 勘違いしてないか?
とか
> 日本語おかしくないか?
とか言ってあげれば>147も自分の間違いに気づけたんじゃないかなって思う。
コメント2件

174
デフォルトの名無しさん[sage]   投稿日:2017/01/04 23:48:11  ID:NgyPecWp.net
お前らちょっと温泉でも行ってこい

175
デフォルトの名無しさん[sage]   投稿日:2017/01/04 23:48:33  ID:8dyTsCQL.net(3)
>173 ちっとも具体的じゃないが、それでいいの?正直なにが違うのかわからん。
(日本語としてはまったく問題ないしな。)
コメント1件

176
デフォルトの名無しさん[sage]   投稿日:2017/01/05 00:16:26  ID:kU82p3Tw.net
> >147
> 副作用完了点が二つ以上存在すること自体は問題ないだろ。
> 複数の副作用完了点で同じ変数を変更、参照するんのが問題なんだよ。
> 安易な気持ちで書き込みすんな。一生ROMってろ。

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

>175
「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧。
>158みたいに受け取る人もいるし。
>173は具体的じゃないけどまだましなほうでしょ。

177
デフォルトの名無しさん[sage]   投稿日:2017/01/05 07:15:07  ID:Tn1lGUp3.net(2)
副作用完了点が2つ以上あると鼻から悪魔
 ↓
× んなこたーない
○ 勘違いしてないか?

理由:「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧

178
デフォルトの名無しさん[sage]   投稿日:2017/01/05 07:20:28  ID:IruuUmgl.net
一応技術板なので「んなこたーない」って言われたら鼻から悪魔の例を出せばすむ話
まあ例を考えてる時に自分の間違いに気づくと思うが...

179
デフォルトの名無しさん[sage]   投稿日:2017/01/05 07:35:58  ID:Tn1lGUp3.net(2)
嵐かどうかは別として間違いの指摘かどうか曖昧でわからない奴はヤバい

180
デフォルトの名無しさん[sage]   投稿日:2017/01/05 09:10:38  ID:yWb7mDiI.net(4)
if (*str++ && *str++ && *str++)
&& と if の条件式の終わりは副作用完了点だけど問題を起こすコードではない
※ 役にたつコードかはしらんw

181
デフォルトの名無しさん[sage]   投稿日:2017/01/05 11:34:50  ID:nSwRuxqn.net(3)
大学の授業で、client.cというファイルとserver.cのファイルを渡されて
このプログラムを解析して、何でも良いから通信するプログラムを作れと言われたんですが
何をやればいいのかさっぱりです。
サーバとクライアントでファイルが2つに分かれてるってことは
プログラミングのテストをするにも2台PCを持ってないとできないってことでしょうか
何でもいいのでアドバイスください。。。
コメント2件

182
デフォルトの名無しさん[sage]   投稿日:2017/01/05 11:37:47  ID:Xc98514b.net
>181
PC 1台でも出来ます
コメント1件

183
デフォルトの名無しさん[sage]   投稿日:2017/01/05 11:44:42  ID:yWb7mDiI.net(4)
server のプログラムを実行しておいて
接続先を 127.0.0.1 (または localhost) にした client のプログラムを実行すれば桶

後は実行OSの事情次第(FWの警告をスルーする等)

184
デフォルトの名無しさん[sage]   投稿日:2017/01/05 11:51:25  ID:33EuaIzL.net
>181
client.exe server.exe生成
→server.exeを起動し通信待機
→client.exeを起動し通信開始
でいいよ

185
デフォルトの名無しさん[]   投稿日:2017/01/05 11:55:16  ID:nSwRuxqn.net(3)
>182-184
親切にありがとうございます。
Linux環境でプログラムしているのですが
server.cをコンパイル&実行すると待機中のせいか何なのかわからないのですが
コンソール上で他のコマンドが打てなくなってしまうので2台PCが必要なのかと迷っていたのですが、1台でもできるのですね。
どうやったら待機中でもclientのコンパイル済みファイルを実行することができるのでしょうか。。
コメント2件

186
デフォルトの名無しさん[sage]   投稿日:2017/01/05 12:00:04  ID:CkAWate/.net
んなこたーない
って前々から他のC++スレでも使われていたけど、
自分からは何も根拠を示さず、ただ周りからの反論を煽りたいだけのレス
みたいな受け取られ方が少なからずされていたように感じるんだけど。

コミュニケーションって難しいな。

187
デフォルトの名無しさん[sage]   投稿日:2017/01/05 12:06:51  ID:yWb7mDiI.net(4)
>185
bash だったら
末尾に & つけて呼び出すとバックグランドで実行するみたいよー
# server [enter]
 : 待機中でだんまりさんw

# server & [enter]
 : すぐ次の入力待ちになる server は裏で実行中
#
コメント1件

188
デフォルトの名無しさん[sage]   投稿日:2017/01/05 12:25:39  ID:nSwRuxqn.net(3)
>187
できました!
ありがとうございます助かりました

189
デフォルトの名無しさん[sage]   投稿日:2017/01/05 13:10:33  ID:Goea0txf.net
nohup をつけるともっと幸せになれるよ

nohup server &

190
デフォルトの名無しさん[]   投稿日:2017/01/05 13:26:13  ID:NumGywN/.net
馬鹿がnohupなんか付けたらいつまでもプロセス残るだろ
不完全なサーバーアプリケーションのプロセスをいつまでも残すということは
セキュリティ的に問題外

191
デフォルトの名無しさん[]   投稿日:2017/01/05 14:20:26  ID:wksprrkU.net
0xFFFFFFの変数がif(n > 0)で真になるんだがなんだコレ?
クソムカツクな死ねよ
コメント2件

192
デフォルトの名無しさん[sage]   投稿日:2017/01/05 14:25:53  ID:yWb7mDiI.net(4)
64bit (2の補数の)符号付で 00FF FFFF は正なんだけど
48bit の符号付整数での比較を望んでいるんだろうか?

193
デフォルトの名無しさん[sage]   投稿日:2017/01/05 15:39:10  ID:60LIuvs1.net
48bitでも32bitでも正ですが

194
デフォルトの名無しさん[sage]   投稿日:2017/01/05 17:24:14  ID:5KDyH/yc.net
>191
何だこれと言われても言語仕様としか言いようがない
auto n = 0xFFFFFF;
if (n>0)//必ず真

195
デフォルトの名無しさん[sage]   投稿日:2017/01/05 18:52:01  ID:sOp8JEWl.net
逆になぜ偽になると思ったのかが知りたいな。

196
デフォルトの名無しさん[sage]   投稿日:2017/01/05 18:58:22  ID:25Qby3+x.net
auto n = 0xFFFFFF;
*reinterpret_cast<int*>(&n) > 0
コメント1件

197
デフォルトの名無しさん[sage]   投稿日:2017/01/05 19:26:42  ID:ivHnG5Le.net
int が 24bit ってダメなんだっけ?

198
デフォルトの名無しさん[sage]   投稿日:2017/01/05 19:41:33  ID:/zQeSTVL.net
あー あほしたー bit数を数え間違ってるし

199
デフォルトの名無しさん[sage]   投稿日:2017/01/05 21:38:57  ID:AK28m3f5.net
>196のオツムのレベルは>191と同等

200
デフォルトの名無しさん[sage]   投稿日:2017/01/05 23:28:47  ID:sjDvcQUe.net
>185
別の端末・別の仮想デスクトップなどを、起動すればいい

201
デフォルトの名無しさん[]   投稿日:2017/01/08 01:15:08  ID:+QuxnNhY.net(2)
■ 質問概要
ファイルに書き込んでも反映されない。

■ 環境
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
コメント1件

202
デフォルトの名無しさん[sage]   投稿日:2017/01/08 01:21:15  ID:Zdr2NPEX.net
大丈夫だから使え
コメント1件

203
デフォルトの名無しさん[sage]   投稿日:2017/01/08 01:24:31  ID:T3Q1+h8z.net
flushは時間がかかるから頻度が高い場合は気をつけて。

204
201[sage]   投稿日:2017/01/08 01:54:37  ID:+QuxnNhY.net(2)
>202-203
ありがとうございます。
時間がかかるんですね。
では、頻度が高い場合はfputsの度ではなく、
一定時間おきにfflushするように実装したいと思います。

205
デフォルトの名無しさん[]   投稿日:2017/01/08 03:35:33  ID:eh6WgorM.net(2)
A = (framecount / 10) % 4

すみません、上記の式の意味を教えてください。
毎度、Aに入る値がしりたいです。

206
デフォルトの名無しさん[sage]   投稿日:2017/01/08 03:39:14  ID:Nqw0FnK6.net
(framecount を 10 で割って) それの 4で割った余り 0〜3 の値になる

framecount
0〜 9 → 0
10〜19 → 1
20〜29 → 2
30〜39 → 3
40〜49 → 0
50〜59 → 1
:
コメント1件

207
デフォルトの名無しさん[]   投稿日:2017/01/08 03:43:39  ID:eh6WgorM.net(2)
>206
こんな深夜に即レス、感謝
ありがとうございます!

208
デフォルトの名無しさん[sage]   投稿日:2017/01/08 04:24:28  ID:c5pY166L.net(2)
>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
コメント2件

209
デフォルトの名無しさん[sage]   投稿日:2017/01/08 11:20:03  ID:OpAcES4h.net(3)
char buffer[256];
scanf(%s,buffer);
printf(
コメント1件

210
デフォルトの名無しさん[sage]   投稿日:2017/01/08 11:28:02  ID:OpAcES4h.net(3)
すみません、誤送信してしまいました
質問させてください。

char buffer[256];
scanf(%s,buffer);
printf("finish---_n");
という記述で、文字入力をした後、何回リターンキーを押しても
finishが表示されない、つまりscanfが終了しないような状態になっているのですが
何か特別な条件でscanfが終了しないことってあるものなのでしょうか?
ちなみに、コードのscanfの行だけコメントアウトすると普通にfinishが表示される状態です。
あと、新規で.cファイルを作って短いコードにしてコンパイルしても問題なく動いてくれています。
コメント1件

211
デフォルトの名無しさん[sage]   投稿日:2017/01/08 11:43:58  ID:nyR751xv.net(5)
>210
問題が再現できる最少コード書いてみて
コンパイル通るコード
コメント1件

212
デフォルトの名無しさん[sage]   投稿日:2017/01/08 11:52:30  ID:OpAcES4h.net(3)
>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をコメントアウトすると通るみたいです。

213
デフォルトの名無しさん[sage]   投稿日:2017/01/08 12:07:20  ID:nyR751xv.net(5)
server側がnot foundだわ
リンク確認してみて
コメント1件

214
デフォルトの名無しさん[sage]   投稿日:2017/01/08 12:15:37  ID:9g4d0om9.net
>213
アップし直しました
http://codepad.org/ye5GDqp8
確認不足ですみません;;

215
デフォルトの名無しさん[sage]   投稿日:2017/01/08 12:35:39  ID:nyR751xv.net(5)
Wait for Connection...Connected.
s1---------
C->S: %s
Server:

実行結果はここで止まって
s2---------
まで進まないって事?
コメント1件

216
デフォルトの名無しさん[sage]   投稿日:2017/01/08 12:38:46  ID:Cjw+tP2S.net
>215
そうですね
Serverの後にscanfがあるので入力してみると

Server: uuu
aaaaa
iiii
uuu

とかになって、Enterキーを打っても次に進んでくれません

217
デフォルトの名無しさん[sage]   投稿日:2017/01/08 13:15:24  ID:nyR751xv.net(5)
送受信で変数を別々にしてみて
scanf -> sendはbuffer1
recv -> printfはbuffer2
みたいに

38, 39 40行目にブレークポイント置いてやってみて
コメント1件

218
デフォルトの名無しさん[sage]   投稿日:2017/01/08 13:46:50  ID:uGSXn6++.net(2)
サーバをフォアグラウンドにしてから入力すればいいだけな気がする。
いったんCtrl-zでクライアントを停止して「bg」でバックグラウンドで再開、
「jobs」でサーバのジョブIDを調べて「fg %[ジョブID]」してから入力すれば、
反応するんじゃないかな。
コメント1件

219
デフォルトの名無しさん[sage]   投稿日:2017/01/08 15:47:42  ID:/TmTqYIS.net
>217
ありがとうございます
やってみましたがどうもうまくいかなさそうです
>218
ありがとうございます。
いちおうやってみたのですが、ぼくがりしょしんしゃすぎてこうどなれすすぎてりかいできません(^q^)
バックグラウンドとフォアグラウンドの使い分けが良く分からないです。

手順を整理すると、
1. サーバをバックグラウンドで開始
2. クライアントをフォアグラウンドで開始
3. クライアントを停止
4. クライントをバックグラウンドで再開
5. サーバをフォアグラウンドで開始
6. クライントをフォアグラウンドで開始
ということでしょうか???頭がパーン!!
コメント1件

220
デフォルトの名無しさん[sage]   投稿日:2017/01/08 16:06:06  ID:nyR751xv.net(5)
>219
ブレークポイントが39で止まる
→続行して入力しても40のブレークポイントに来ない
こんな状況なの?
コメント1件

221
デフォルトの名無しさん[sage]   投稿日:2017/01/08 16:09:35  ID:uGSXn6++.net(2)
難しいようなら、&で起動するのはやめて、ターミナルを二つ起動して
片方でサーバを、もう片方でクライアントを実行するほうが楽だと思う。
コメント1件

222
デフォルトの名無しさん[sage]   投稿日:2017/01/08 16:24:16  ID:7aUjJ3jB.net
同意

223
デフォルトの名無しさん[sage]   投稿日:2017/01/08 17:02:49  ID:C9GVPqMv.net
>208
それレイヤーが違う話だよ

224
デフォルトの名無しさん[sage]   投稿日:2017/01/08 17:48:30  ID:bwuU6ymI.net
質問者の提示したURLに書かれている注意事項すら読まない奴を相手にレスするとは

225
デフォルトの名無しさん[sage]   投稿日:2017/01/08 19:21:35  ID:d7tAym4Y.net
>220
そんな感じでした
>221-222
ターミナル2つ起動したら簡単にできました。。
ターミナルって2つ開いて操作したりするものだったんですね
Linux初心者すぎて分かってませんでした
助かりましたありがとうございます

226
デフォルトの名無しさん[sage]   投稿日:2017/01/08 22:54:37  ID:c5pY166L.net(2)
端末も複数、起動できる

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

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

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

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

それか、書き込み確認画面が出たら、1度キャンセルすれば、確認画面は出ないようになった
コメント1件

227
デフォルトの名無しさん[sage]   投稿日:2017/01/11 13:06:08  ID:X1FDgEas.net
>208といい>226といい、わざと嘘を書いてるのか?

228
デフォルトの名無しさん[]   投稿日:2017/01/12 04:36:13  ID:8CizHZGj.net
MSVCはいつまで__cplusplusの定義199711Lのままなんだ

229
デフォルトの名無しさん[sage]   投稿日:2017/01/12 07:09:10  ID:edOk7o4H.net
変えると暴動が起きるこら変えない
とライブラリ開発者のSTL氏が言っていた

230
デフォルトの名無しさん[sage]   投稿日:2017/01/12 12:09:34  ID:xegpw56Z.net
1だと思ってた

231
デフォルトの名無しさん[sage]   投稿日:2017/01/15 00:31:14  ID:7/DzGkQz.net(2)
別ファイルで作成した関数を使用するときは、そのヘッダーファイルの
インクルードだけでなくプロトタイプ宣言も必要ですか?
インクルードだけでもコンパイルは通るし実行も出来るのですが、
そういう警告が出てくるので気になりました

232
デフォルトの名無しさん[sage]   投稿日:2017/01/15 00:34:44  ID:H7ag5TAh.net
警告文をコピペしてくれると話が早いような

233
デフォルトの名無しさん[sage]   投稿日:2017/01/15 00:51:14  ID:e3PYrJk6.net
そのヘッダーファイルの中でプロトタイプ宣言はされているんじゃないのか
警告の原因は別のことだろ

234
デフォルトの名無しさん[sage]   投稿日:2017/01/15 01:02:35  ID:7/DzGkQz.net(2)
インクルードするファイルを間違えてたみたいです
お騒がせしました

235
デフォルトの名無しさん[sage]   投稿日:2017/01/19 22:46:56  ID:knltoro2.net
新しくクラスとそれに関連した処理などを実装するとき
ヘッダー側でクラスの定義、ソースファイル側にクラス内のメンバ関数の実装部などを書きますよね
その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか? たとえば

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

処理はたった一行ですけどこの場合もint ReturnNum()の実装部はソースファイル側にint A::ReturnNum()のように移すべきですか?
ネット上のプログラムをいくつか見てみたらこのようにメンバ変数をただ返すだけの処理ならヘッダー側に書いてあるものも少なくなかったのでどっちが好ましいんだろうと気になりました
コメント1件

236
デフォルトの名無しさん[sage]   投稿日:2017/01/19 23:08:04  ID:ipEwSksA.net
プログラムは普通すべて「ソースファイル」に書くものです
「ヘッダー」に書くのはコンパイラー開発者だけです

237
デフォルトの名無しさん[sage]   投稿日:2017/01/19 23:11:24  ID:ydMYZ/gE.net
クラスもヘッダに書きますけどぉ

238
デフォルトの名無しさん[sage]   投稿日:2017/01/19 23:55:32  ID:A0Yl7Ujc.net
> その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか?
別にどんな場合でもソース側に書くというわけではない

ヘッダに書くのもソースに書くのも一長一短はあり絶対的にどっちがいいというものではない
君が違いを理解し何を重視するかを意識すれば
君にとってどっちが好ましいかは自然とはっきりする

239
デフォルトの名無しさん[]   投稿日:2017/01/20 00:23:32  ID:7sj2OAGi.net
なんか禅問答が始まったかと思ったわ

240
デフォルトの名無しさん[sage]   投稿日:2017/01/20 01:12:20  ID:/ixeQkYS.net
短いメソッドなら、ヘッダに、inline 指定して書くと、
関数化せずに、inline にしてくれる可能性が高い

まあ、言語では保証していないけど。コンパイラ依存
コメント1件

241
デフォルトの名無しさん[]   投稿日:2017/01/20 05:11:02  ID:vaOLIJJw.net
クラス定義で定義されたメンバ関数は暗黙に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 は後者の説明だったのね。

242
デフォルトの名無しさん[sage]   投稿日:2017/01/20 07:10:06  ID:Nvso2zBq.net
>235
本体側に書くのが原則 特にシステムが大きくなる場合
よほどの理由がある場合(インライン化して高速化するなど)はヘッダに書くこともある

243
デフォルトの名無しさん[sage]   投稿日:2017/01/20 08:09:40  ID:B05iL6IP.net
『〜のが原則』
『理由がある場合〜こともある』
俺の会社のルールは世界普遍的 思考

244
デフォルトの名無しさん[sage]   投稿日:2017/01/20 16:53:52  ID:abKD9bRi.net(3)
inlineにするのはほとんどその時の気分みたいな?
なんかマクロみたいだな。inlineにすっかみたいな。
コメント1件

245
片山博文MZ ◆T6xkBnTXz7B0 [sage]   投稿日:2017/01/20 17:10:04  ID:XdmbS/hB.net
>244
関数呼び出しのオーバーヘッドの回避と、定数畳み込みなどの最適化が期待できる場合にインライン化する。
コメント2件

246
デフォルトの名無しさん[sage]   投稿日:2017/01/20 17:38:00  ID:abKD9bRi.net(3)
>245
そんな感じ

247
デフォルトの名無しさん[sage]   投稿日:2017/01/20 20:04:23  ID:1c/0Zcpc.net
>245
インラインにしても劇的に速くなった経験が無いんですが、コツは有りますか?

248
デフォルトの名無しさん[sage]   投稿日:2017/01/20 20:57:25  ID:pNkrp0ep.net
効果が出るのは
・小さい
かつ
・短時間に非常に多数呼び出される
関数だけだよ。
しかも、まず劇的ではない。

249
デフォルトの名無しさん[]   投稿日:2017/01/20 21:15:10  ID:esT1VQmf.net(3)
inlineキーワードはヘッダに実装書くときなどに使用するものでインライン展開を狙った最適化の為に書くものではない
コメント2件

250
デフォルトの名無しさん[sage]   投稿日:2017/01/20 21:15:23  ID:abKD9bRi.net(3)
もしかしてコンパイラの方で展開してるとか はないかなぁw

251
デフォルトの名無しさん[sage]   投稿日:2017/01/20 21:57:28  ID:aetIobRP.net
>249
インライン関数の話の途中でinlineキーワードの関数の話を始めて、いきなりどうした

252
デフォルトの名無しさん[sage]   投稿日:2017/01/20 22:07:56  ID:CICAdfuU.net
>249
上にもあるけどヘッダに実装書いたら暗黙でインライン指定されるから、そこにinlineキーワードを使用するのは無意味
やはりinlineは最適化のためでしょう
コメント1件

253
デフォルトの名無しさん[sage]   投稿日:2017/01/20 23:11:34  ID:LsENUQp+.net(2)
ベクトルとか行列のライブラリを使った時は全部インラインにしたな
1/60秒にかなりの回数呼ぶし
ライブラリとかもインラインで書かれてる

254
デフォルトの名無しさん[sage]   投稿日:2017/01/20 23:12:36  ID:LsENUQp+.net(2)
×使った ??作った

255
デフォルトの名無しさん[]   投稿日:2017/01/20 23:27:28  ID:esT1VQmf.net(3)
>252
んなわけない
コメント1件

256
デフォルトの名無しさん[sage]   投稿日:2017/01/20 23:34:20  ID:ITfb1kXg.net
>255
んなこたーない

257
デフォルトの名無しさん[]   投稿日:2017/01/20 23:36:05  ID:esT1VQmf.net(3)
ヘッダに書いたら暗黙でinlineって
#includeの機能しらんとしか思えないんだが

258
デフォルトの名無しさん[sage]   投稿日:2017/01/21 00:40:48  ID:dThE4/1u.net
ちょと混じっちゃったね。
関数を定義されたヘッダーが複数のソースに呼ばれちゃったら、実体が
いっぱい出来ちゃうもんね。

259
デフォルトの名無しさん[sage]   投稿日:2017/01/21 01:48:12  ID:RmTA4cQd.net
江添はなんて言ってる?

260
デフォルトの名無しさん[sage]   投稿日:2017/01/21 07:06:45  ID:5NCJ8rOL.net
forceを信じるのだ

261
デフォルトの名無しさん[sage]   投稿日:2017/01/21 08:35:23  ID:P1/rV56D.net
インライン関数はODR回避のためだと思っていた
C++17(予定)のインライン変数もそんな感じ
コメント1件

262
デフォルトの名無しさん[sage]   投稿日:2017/01/21 11:00:41  ID:wrzS/cSB.net
ODRって何?

263
デフォルトの名無しさん[sage]   投稿日:2017/01/21 11:17:05  ID:J7ipYv9j.net(2)
単一定義則 One Definition Rule の略語

264
263[sage]   投稿日:2017/01/21 19:43:36  ID:J7ipYv9j.net(2)
「単一定義規則」の方が検索にかかりやすい言葉かも。

265
デフォルトの名無しさん[sage]   投稿日:2017/01/22 08:28:10  ID:5o7PrILb.net
>261
そうそう。最適化目的でinline付けても普通無視されるからね。

266
デフォルトの名無しさん[sage]   投稿日:2017/01/22 14:37:23  ID:hBhrTyQG.net
更新情報
・スレッド一覧ページで過去ログのタイトル検索・一覧表示ができるようになりました(2016/1/20)
NGワード登録
登録する
スレッド内検索

プログラム板 タイトル検索

このスレッドが人気です(実況系)
実況 ◆ フジテレビ 82471 (337)フジ実況
白熱ライブ ビビット★1 (878)TBS実況
実況 ◆ テレビ朝日 46605 由美子の投げキッス (973)テレ朝実況
羽鳥慎一モーニングショー★4 (298)テレ朝実況
NHK総合を常に実況し続けるスレ 130280 (473)NHK実況
連続テレビ小説 ベっぴんさん★153 (613)NHK実況
実況 ◆ 日本テレビ 54046 修正 (134)NTV実況
日本サッカー応援宣言 やべっちFC★1 (962)テレ朝実況
このスレッドが人気です(ニュース系)
【ドラマ】キムタク主演「A LIFE」第2話は14・7%!初回上回る好調ぶり (672)音楽・芸能ニュース
【国際】ジャワ高速鉄道、めど立たず=中国が資金出し渋り−インドネシア (362)ニュー速+
【芸能】なんでも鑑定団・国宝級茶碗に陶芸家「どう見てもまがい物」 (443)音楽・芸能ニュース
【輸出経済】「日本の柴犬」が韓国で人気犬種になった理由 (860)ニュー速+
【テレビ】「千と千尋の神隠し」8回目でも18・5%!宮崎アニメ根強い人気 (124)音楽・芸能ニュース
【原発】セシウム値が急激に上昇? 東京湾のコイも福島原発沖のヒラメ以上に汚染されていた! (659)ニュー速+
【社会】重度障害児が子ども用車椅子を使用していると「邪魔だからベビーカーたためよ」と怒られる…対策は? (1000)ニュー速+
【テレビ】カンニング竹山、狩野英孝は"バラエティ界の宝"「ずっと仕事したい」 (229)音楽・芸能ニュース
プログラム板の人気スレ
【統計分析】機械学習・データマイニング11 (1001)
C++相談室 part129 (211)
Excel VBA 質問スレ Part45 (297)
C言語なら俺に聞け 138 (601)
ふらっと C#,C♯,C#(初心者用) Part126 (329)
Xamarin Part3 (269)
スレ立てるまでもない質問はここで 145匹目 (153)
Androidプログラミング質問スレ revision52 (593)
【PHP】下らねぇ質問はここに書き込みやがれ 7 (642)
くだすれPython(超初心者用) その31 (903)
クラス名・変数名に迷ったら書き込むスレ。Part27 (754)
関数型プログラミング言語Haskell Part30 (57)
+ JavaScript(ECMAScript)質問用スレッド vol.122 + (985)
次世代言語議論スレ【Go Rust Haskell Scala Erlang Elixir】 (482)
推薦図書/必読書のためのスレッド 80 (950)
Swift part9 (597)
☆★Java質問・相談スレッド179★★ (598)
Ruby 初心者スレッド Part 59 (563)
人工知能ディープラーニング機械学習のための数学 (105)
テストしにくいコードをテストする方法 その2 (89)
VRプログラム雑談【Unity/UnrealEngine】【HTC Vive/Oculus Rift/その他VR】 (357)
+ JavaScript の質問用スレッド vol.122 + (631)
【JavaScript】スクリプト バトルロワイヤル55【php,py,pl,rb】 (461)
Java入門・初心者質問スレ Part.2 (303)
C#, C♯, C#相談室 Part91 (815)
【初心者歓迎】C/C++室 Ver.100【環境依存OK】 (266)
ディープラーニング (965)
Pythonのお勉強 Part52 (57)
このサイトについて
このサイトは2ちゃんねるからデータを取得し、表示するサービスです。
画像のインライン表示機能について
画像のURLの後ろにある[画像をインライン表示]をクリックすると、URLの下に表示します。
表示される画像は横幅100pxに縮小されていて、クリックすると原寸で表示します。
このサイトの特徴
1)スレッド内検索ができます
2)レス(「>>1」など)のポップアップができます
3)不適切な言葉を含む投稿を表示しません
4)ページ内で画像を直接表示できます
5)2ch他スレッドへのリンクはタイトル・板名つきでリンクします
6)すっきりとしたデザインで表示します
7)最新スレや前スレをチェック・一覧表示します
8)NGワード機能の搭載でイヤな言葉が目に入りません
9)荒らしを自動チェックします
10)スレッド内・同一IDの書き込みだけ表示できます
11)レスの返事をレスされた発言の下に表示する「まとめビュー」が利用できます
12)シリーズ化したスレッドの一覧を表示します
13)最新のスレッドがある場合はお知らせします
削除について
こちらをご覧ください
機能要望について
現在機能要望受付中です。
問い合わせについて
こちらのページからどうぞ
Amazon


このサイトは2ch.scからデータを取得・表示しています。削除などについてはこちらをご覧ください。 アクセスモード:差分取得 - 正常取得 - 25件 - 取得完了