【初心者歓迎】C/C++室 Ver.100【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.100【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
16/11/06 22:58:02.60 dU5z27As.net
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(codepad.org) (コンパイルもできるし出力結果も得られる[]privateをチェック)
URLリンク(ideone.com) (時間帯によってはcodepadが重い事があるのでここも利用)
前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
スレリンク(tech板)

2:デフォルトの名無しさん
16/11/06 23:23:55.86 AHO3vAwR.net
>>3-1000は射精魔

3:デフォルトの名無しさん
16/11/07 00:30:57.27 pyn9XiBr.net
>>2
訂正しときます
次スレの>>3-1000が射精魔

4:デフォルトの名無しさん
16/11/07 09:27:53.95 vooGYje+.net
前スレ>>999再掲
class A{
int a[2];
A(int b[])
:a(b) //error
{}
};
この:a(b)ってなにか書き方ありますか?
前スレ>>1000
無理でした・・・

5:デフォルトの名無しさん
16/11/07 09:34:35.19 dSd+kVnH.net
何がしたいのか


6:わからないので回答しようがないな



7:デフォルトの名無しさん
16/11/07 09:36:19.79 dSd+kVnH.net
あ、初期化子か
インデントがないから見間違えた

8:デフォルトの名無しさん
16/11/07 09:38:54.66 e8hpdnod.net
引数の int b[] って int* b と同じやしなぁ

9:デフォルトの名無しさん
16/11/07 09:47:42.61 HQzTq5fm.net
std::array

10:デフォルトの名無しさん
16/11/07 12:11:29.58 56hqYy7l.net
C++11以降なら
A(int (&b)[2]) : a{b[0], b[1]} {}

11:デフォルトの名無しさん
16/11/07 14:52:37.34 fwwW9lIx.net
だがint b[2][3]はポインタ引数は・・・

12:デフォルトの名無しさん
16/11/07 14:56:04.42 6MsAvbZq.net
↑幻覚をみた糖質のつぶやき

13:デフォルトの名無しさん
16/11/07 15:00:49.14 3Xim9e5h.net
>>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();
}

14:デフォルトの名無しさん
16/11/07 18:18:06.75 hOJqMng1.net
>>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)
{
}
};

15:13
16/11/07 18:21:04.82 hOJqMng1.net
2行目「6個より多く」だったね

16:デフォルトの名無しさん
16/11/07 18:44:55.40 3Xim9e5h.net
>>13
いやいくらでも動的に増やせるんだけど初心者スレだから省略した
URLリンク(ideone.com)

17:デフォルトの名無しさん
16/11/07 19:07:23.45 hOJqMng1.net
要求は固定長の配列であって、動的に増やせるようにしろとは言ってないので
それのコードは非効率にしかならないと思うよ

18:デフォルトの名無しさん
16/11/07 19:25:01.70 fwwW9lIx.net
>>11
ん?
int b[2][3];をわたせんの?
func(int a[][3]);以外で

19:デフォルトの名無しさん
16/11/07 19:50:01.21 Z2RT26Su.net
>>16
だからvector使ってないでしょう
unique_ptrのパフォーマンス知らないの?

20:デフォルトの名無しさん
16/11/07 20:07:47.59 Z2RT26Su.net
ID:hOJqMng1 の主張の変遷
1.わざと大きい初期化子を与えると実行時にアクセス違反になると主張
→だから動的に対応できるようにした
2.すると今度は非効率的だからarrayを使えという
→arrayが特に効率的なわけではないし、今度は「要求は固定長の配列だ」と言い出す
どう考えても言ってることがコロコロ変わってるんだが

21:デフォルトの名無しさん
16/11/07 21:12:34.93 L762Pvtq.net
!!喧嘩の予感!!

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

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

24:デフォルトの名無しさん
16/11/07 22:16:57.66 hOJqMng1.net
>>19
まず効率は動的確保を行うnewとunique_ptrより確実にarrayのほうがいい
そして>>4の要求はコードから明らかに固定長でいいと言ってる
これは私の勝手な主張ではなく元の要求がそうなってる
目的を達成するために非効率な動的確保は必要ない
私はアクセス違反になるといったが動的確保にしろとは言っておらず、動的確保にしたのはそっちが勝手にやったこと
アクセス違反を回避するために動的確保にするのは全く割に合わない
だったら長さチェックすればいいだけ

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

26:デフォルトの名無しさん
16/11/07 23:34:44.46 lMECrzfj.net
いいぞ、もっとやれ~♪

27:デフォルトの名無しさん
16/11/08 00:32:16.33 t0HdCoBm.net
沸点低すぎワロタw

28:デフォルトの名無しさん
16/11/08 00:33:05.07 2SYrs2Uf.net
>アクセス違反を回避するために動的確保にするのは全く割に合わない
こう書かれるべきものが
>>16
>それのコードは非効率にしかならないと思うよ
と書かれたため>>19が射精した
特に「非効率にしかならない」の「にしか」という表現が前後の繋がりを考えると最悪だ

29:デフォルトの名無しさん
16/11/08 15:38:54.44 FW358liz.net
using std;
int main() {
int a;
cout<< "数を入力してください" <<endl;
cin>> a;
cout<<a <<"ですね?" <<endl;
}
aを確実に入力させたくて困っています
ご教授ねがいます

30:デフォルトの名無しさん
16/11/08 16:03:34.41 j/2yZvJO.net
まず確実ってなんやねん
数以外だったり未入力は弾くってか

31:デフォルトの名無しさん
16/11/08 16:26:08.25 FW358liz.net
そうです
未入力で無限ループみたいに表示されて困っています

32:デフォルトの名無しさん
16/11/08 16:26:29.50 Or+T0geg.net
教示ならしてやっても良いが、教授はお断りだ

33:デフォルトの名無しさん
16/11/08 16:58:49.59 sBMnjDSh.net
>>28
URLリンク(ideone.com)
一応単なる改行や数字で始まらない文字列は弾くようにした
ただしコメントにも書いてあるけど 123def みたいな数字で始まる文字列を
入力したときは数字だけ返すんでそれが駄目なら自前で作るしかないね

34:デフォルトの名無しさん
16/11/08 17:22:56.70 FW358liz.net
>>32
getline知りませんでしたが何とかできそうです
ありがとうございます

35:デフォルトの名無しさん
16/11/10 10:52:07.29 8ULjF/bN.net
独習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が戻り始めるのでしょうか?
あまりに初心者な質問ですみません。

36:デフォルトの名無しさん
16/11/10 11:03:28.04 6ImFpJhK.net
引数だけ書くと
0+1
1+1
・・・
9+1
ここまではprintfまで来ないまま再帰
9+1でifに入らないからrecurseからリターン
printfがiを表示(9)してリターン
printfがiを表示(8)してリターン
の繰り返し

37:34
16/11/10 11:07:42.28 8ULjF/bN.net
>>35
早速のレスありがとうございます。
>9+1でifに入らないからrecurseからリターン
ということはmain関数のreturn 0でプログラムは終了してしまうのではないですか?
なぜprintfが呼ばれるのかわからんのですが。(iが減算される理由もわかりません)

38:34
16/11/10 11:12:33.48 8ULjF/bN.net
if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}

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

39:デフォルトの名無しさん
16/11/10 11:20:27.66 69ogPHI/.net
丁度再帰打ち切り付近の挙動
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 から戻る

40:デフォルトの名無しさん
16/11/10 11:28:04.25 6ImFpJhK.net
>>37
9+1で入って偽で抜けたら
8+1で入ってきたif内のrecurseから抜けて次のprintfが実行されて抜ける
8+1で抜けたら7+1で入ってきたif内のrecurseから抜けて次のprintfが実行される
の繰り返し

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

42:デフォルトの名無しさん
16/11/10 12:42:30.91 69ogPHI/.net
再帰呼び出し後に書く  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);
と見えてくると思うよ

43:デフォルトの名無しさん
16/11/10 13:57:04.04 gEXUDT4B.net
なんか遠回りな説明ばかりだな
スタックフレームというキーワードを出してやれよ

44:40
16/11/10 14:01:09.75 8ULjF/bN.net
>>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からなのはなぜなのでしょうか?

45:デフォルトの名無しさん
16/11/10 14:02:24.39 69ogPHI/.net
再帰でどう動いてるか理解するのに
スタックフレーム出されても困らないか? 値の保持の実装でそうなってるってだけだし

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

47:デフォルトの名無しさん
16/11/10 14:10:50.73 69ogPHI/.net
おっけー まかせた

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

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

50:デフォルトの名無しさん
16/11/10 14:29:55.54 6ImFpJhK.net
>>42
最短の説明で教えてあげてくれ任せた

51:40
16/11/10 14:33:22.38 8ULjF/bN.net
スタックフレームで検索して見たところ、
URLリンク(brain.cc.kogakuin.ac.jp)
このページが一番わかりやすそうです。
LIFOなんで新しい関数と引数が上の方に積み上がっていくと考えれば良いのでしょうか?
first outなんで実効は新しい順(つまり今回の例の場合はi=9)ということですね。
スタックフレームという言葉で検索したらおもしろそうなサイトがたくさん出てきました。
皆さん今回はありがとうございました。

52:デフォルトの名無しさん
16/11/10 14:51:19.03 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回繰り返すことになる

53:43
16/11/10 15:05:17.38 8ULjF/bN.net
>>51
レスありがとうございます。
URLリンク(ipa-zone.info)
このページに私が使っている独習Cの再帰の部分が丸ごと転載されているんですが(違法?)、
i=0~10と昇順で増加していく前半部分でも呼び出された関数(recurse(1)など)は終了した訳ではないですよね?
後半のi=10から降順で減少していくときにはじめてprintfが実行されて関数が終了すると思うんですが、
LIFOなんで最後に呼び出されたrecurse(9)からrecurese(0)まで降順で残ったprintfを実行していくということではないんですか?

54:デフォルトの名無しさん
16/11/10 15:15:27.68 gEXUDT4B.net
>実行は新しい順(つまり今回の例の場合は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なのだ

55:デフォルトの名無しさん
16/11/10 15:18:47.59 17noS2hU.net
長い。あとビデオ見ながら電話に出れるだろ

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

57:52
16/11/10 15:39:54.19 8ULjF/bN.net
>>53
レスありがとうございます。参考になりました。

58:デフォルトの名無しさん
16/11/10 20:21:43.62 CLfGjB35.net
>>55
特に難しくは無いと思う
例えばどんなことをしたいの?

59:デフォルトの名無しさん
16/11/10 20:31:23.31 AQTsjJgJ.net
文盲はお帰りください

60:デフォルトの名無しさん
16/11/10 21:49:48.84 cv2N5dvt.net
std::function<int*(const int)> create_array = [](const int n)->int*{ return new int[n]); };
でいいんじゃないの
誰かdeleteすんだよと思うけど

61:デフォルトの名無しさん
16/11/10 22:03:01.49 AQTsjJgJ.net
>誰かdeleteすんだよと思うけど
自覚があるならそんな変な例を出さなければいいのに

62:デフォルトの名無しさん
16/11/10 23:23:35.24 wCaAZ9DK.net
>>60
じゃあお前が適切な答え書いてやれよ

63:デフォルトの名無しさん
16/11/10 23:41:59.59 AQTsjJgJ.net
>>55の回答はこんな感じでいいだろう
using ptr_type = void *;
std::function<ptr_type ()> f1{ []{ return ptr_type{}; } };
std::function<void *()> f2{ []{ return static_cast<void *>(nullptr); } };

64:デフォルトの名無しさん
16/11/11 01:01:22.47 JQalwGbJ.net
>>62
散々煽ってたから聞くけど
static_cast<void *>(nullptr)
このキャスト無駄じゃない?
これは変な例ではないの?

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

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

67:デフォルトの名無しさん
16/11/11 01:48:43.11 v3r+B2af.net
>>57>>59>>62
vsで試してて
std::function<void *()>
のような書き方をするとテンプレートがエラーを出していたので
関数ポインタのような特殊な記述が必要になるのかと思って調べていたのですが
原因が分かりました
仮で書いていたラムダ式の中の返り値を
return NULL;
にしていたのでこれがintなためエラーが出ていたようです
テンプレートの奥のほうで型の不一致を出していたので
<>内の記述ばかり疑っていました
というかNULLって今まで(void *)0だと思ってました・・・
まさかただの0だとは
普段はコンパイラが暗黙に変換してるんだね・・・

68:デフォルトの名無しさん
16/11/11 01:56:19.58 v3r+B2af.net
自宅の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とかでも同様なんですかね

69:デフォルトの名無しさん
16/11/11 02:04:25.89 JQalwGbJ.net
>>65
nullptrの型はnullptr_tだよ
だからラムダの戻り値の型はnullptr_tと推論される
ただ問題はvoid *を戻り値としたfunctionに代入できるか
ぶっちゃけ俺も書いてからやっちまったかと思って調べた
規格を調べたところやはり要らなかった
戻り値が暗黙変換できれば代入できると書いてある
つまりラムダの戻り値intでfunctionはdoubleとかもあり
そして当然nullptrはvoid *型に暗黙変換できる
なので要らない
URLリンク(ideone.com)
>>67の結果とも一致する

70:デフォルトの名無しさん
16/11/11 07:16:38.23 hk5EgzxW.net
>>63
コンパイルが通るかどうか以前に55は『ポインタを返すラムダを』と言っているのだから、
無いとお題改変になってしまうだろう
>>67
当然
int f() {return NULL;}
void *関数() {
 return f();//エラー
}
と同じことなので

71:デフォルトの名無しさん
16/11/11 08:09:52.28 JclCvFO1.net
ID:tUBqvL6Gは希にみる健常者

72:デフォルトの名無しさん
16/11/11 08:32:07.55 JclCvFO1.net
>nullptrに型が有るのか無いのか
この手の文法で型が無い落とし穴は初期化の { } ぐらいか
int a = {0}; // 「{0}」は式でなく型も無い

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

74:デフォルトの名無しさん
16/11/30 02:47:51.57 Ir3oZvjK.net
寂しいですなぁ

75:デフォルトの名無しさん
16/11/30 02:56:49.99 a9ciiDR7.net
う、埋め込み…

76:デフォルトの名無しさん
16/11/30 04:02:07.30 tfyAgmME.net
組み込み系って英語ではembedded なんちゃら だし
よくある間違いでしょ

77:デフォルトの名無しさん
16/11/30 05:21:32.16 sG3uRZRm.net
韓国ではよくあるんだ。

78:デフォルトの名無しさん
16/11/30 05:53:32.74 /gnC384r.net
埋めるのは中国の得意とする技術

79:デフォルトの名無しさん
16/11/30 21:26:32.85 ncjk4kan.net
linuxのカーネルモジュールてC++で書けるようになったんだっけ?

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

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

82:デフォルトの名無しさん
16/12/01 12:49:06.43 yfw1GD74.net
C++使わなくていいならそれに越したことはないからね

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

84:デフォルトの名無しさん
16/12/03 01:01:12.94 62YFpmrs.net
C++はマングリングとかややこしいから

85:デフォルトの名無しさん
16/12/03 20:56:34.75 nmEGc+VH.net
マンコリング

86:デフォルトの名無しさん
16/12/11 20:30:30.03 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は無しでスタックのみを使用できれば、なお良いのですが、
良い方法が思いつきません。
何かスマートな方法は有りませんか?

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

88:デフォルトの名無しさん
16/12/11 21:42:00.21 74mAoGAM.net
uint16_tの方がラッパーなの?
どちらにしろ元の関数をそのまま使うなら変換は必要だね。
スタックが使われるかどうかはしらないけどClangコンパイラなら
可変長配列(VLA)っていうのがC++でも使えたはず。
サイズが大きすぎるとオーバーフローするけど。newと兼用してみるのも手。

89:85
16/12/12 22:47:53.10 lLNqHCIY.net
>>86
なるほど、
渡すデータを1つ置きにすれば良いわけですね。
渡すデータを組み立てるときにそうすれば良いですし変換のコストは少なそうです。
多少汚いとこが関数外に出ちゃいますが今回のケースでは現実的な方法だと思います。
>>87
残念ながら使用しているコンパイラはclangではないですし、
VLAは今回の用途には重そうですね。
便利そうなので、PC用のプログラムを作るときに使えるかもしれません。
ひとまず>>86さんの方向で考えてみます。
お二人ともありがとうございました。

90:デフォルトの名無しさん
16/12/13 07:43:47.25 vJwCdf+q.net
組み込みでスタックに可変長のデータ領域確保するとか頭大丈夫?

91:デフォルトの名無しさん
16/12/13 18:19:51.83 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);
}

92:デフォルトの名無しさん
16/12/13 19:22:51.41 vJwCdf+q.net
>>90
どうなのって言われても好きにしろよとしか言えないけど...
個人的には各々のテストも必要になるその手のコードは書かない

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

94:デフォルトの名無しさん
16/12/15 22:16:52.10 esEF0eVo.net
やっぱり画像が出たら楽しいから画像ビューアとかが良いんじゃないかな
画像が動いたらもっと楽しいって言うんならゲームもよいんじゃない?
音関係も楽しいんだが、サウンドプログラミングは結構専門知識がいるうえ
デバッグが難しいから最初は手を出さないほうが良いよ
ま、画像ビューアや動画プレイヤーが楽しいよ
ちょっとした実用性もあるし

95:デフォルトの名無しさん
16/12/15 22:22:14.89 KqXo4C+P.net
Cであることに特に意味がないのなら別の言語の検討をすすめる

96:デフォルトの名無しさん
16/12/16 06:44:53.82 cbHo8vE5.net
javaも悪くないと思いますよ。

97:デフォルトの名無しさん
16/12/16 08:53:37.09 hCzygT3G.net
>>92
プログラミングを習得した延長線上に何を作りたいか決まってる?

98:デフォルトの名無しさん
16/12/16 08:59:07.35 2kpKp/Uz.net
>>92
作りたいプログラム(今ならアプリケーションというのかな)の
イメージが先にないとアドバイスしにくい時代なのよ。
まずコンソールに hello, world を表示して、続いて標準入出力、
ソートやらリンクド・リストやらのアルゴリズムを習得して…
という順序を踏んでも、「マウスをクリックすると何かしてくれる」ような
今様のプログラムには少しも近づかないんだな、これが。

99:デフォルトの名無しさん
16/12/16 09:22:43.83 R8KZSjOU.net
>>96
ゆくゆくはカメラを使って画像処理的なものをしてみたいと思ってます
具体的にはまだ決まってませんが…

100:デフォルトの名無しさん
16/12/16 09:23:43.35 R8KZSjOU.net
>>97
なるほど
将来的にやりたいことをしっかり考えたうえで何を学ぶべきか考えたほうがいいんですね!

101:デフォルトの名無しさん
16/12/16 09:30:19.30 R8KZSjOU.net
>>93
なるほど!
参考になりますm(__)m

102:デフォルトの名無しさん
16/12/16 09:52:11.47 hCzygT3G.net
>>98
じゃあとりあえずGUIが必要だから
そこらへんからかな?

103:デフォルトの名無しさん
16/12/16 11:19:48.12 O1fw7E0o.net
>>101
わかりました!
ありがとうございます!

104:デフォルトの名無しさん
16/12/18 22:40:31.25 rTzEq7cO.net
c++でGUIな何かを作るときどうやるのが普通?どうやるのがおすすめ?
趣味嗜好全開でいいから教えてくれ

105:デフォルトの名無しさん
16/12/18 22:46:05.73 eNcCSvTp.net
ビルド時間とバイナリサイズが気にならないならwxWidgets

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

107:デフォルトの名無しさん
16/12/18 23:56:09.22 psse/iGW.net
wxWidgetsよさそうやね
クロスプラットフォームってのがいい

108:デフォルトの名無しさん
16/12/19 08:41:19.51 K+bb4qm0.net
vcを使うという事ですか

109:デフォルトの名無しさん
16/12/20 08:43:24.96 /4ZK922w.net
>>103
ターゲットのOSとかPC/ケータイとかライセンスとか軽さとか見比べて
GUIフレームワークを選ぶ
Qt は重いけどマルチプラットフォームかつ見た目がいいから人気
Windowsのみなら C# が迷わなくて済むけどね
時代遅れを気にしないなら VC+MFC の情報は多いw
他にもいろいろある

110:デフォルトの名無しさん
16/12/24 19:03:48.07 Xnn//JuE.net
FILE *fp;をグローバル変数にしてたら落ちまくって、ローカル変数にしたら落ちなくなった現象は何でですかね?
グローバルかローカルか関係ない気がするんですけど。
Windows7、Visual Studio 2015

111:デフォルトの名無しさん
16/12/24 19:04:08.51 Xnn//JuE.net
これで4時間近くハマった。

112:フォルトの名無しさん
16/12/24 19:11:41.00 0UyY/BKM.net
グローバルな FILE *fp の近く(若いアドレス)に置かれた
グローバルな配列の範囲オーバーじゃないかしら。

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

114:デフォルトの名無しさん
16/12/24 20:27:17.35 DNE92dFu.net
fileno とか ferror は確認した?

115:デフォルトの名無しさん
16/12/24 20:34:23.48 y7L7nGQ6.net
fp をグローバルにおいたソースで 別のローカル変数をグローバルに置いたら
その変数で副作用起こすんじゃね?
(>>111 と同じく範囲突破しての書き込みを疑ってる)

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

117:109
16/12/24 21:14:49.73 Xnn//JuE.net
>>111-115
ありがとうございます。
>>111さんのおっしゃる通り、メモリの問題でした。
fopenからfreadの間で、
読み込みバッファをmallocで確保してmemsetでゼロクリアしている部分があり、
このクリアするサイズが確保したサイズを上回っていました。
なので、fopen直後のエラーチェックでも問題が起きてないのに落ちていたようです。
//私も一度はこれを疑って確認したんですけどね。
//レスもらってから改めて確認したらこのような状況になってました。
根本的な解決ができて良かったです。

118:デフォルトの名無しさん
16/12/25 01:18:26.20 vsDUBYtf.net
気付くだけ立派だわなぁ

119:デフォルトの名無しさん
16/12/25 07:00:04.87 iLmpV78q.net
mallocで確保した領域の溢れがグローバルな変数を壊すってのは
ちょいと解せない気もする。
DOSの頃なら互いに影響しあうことも普通だったろうけど、
最近のOSだと別に管理してそう。
内部の詳しいことは知らないけど。

120:デフォルトの名無しさん
16/12/25 09:26:05.12 SibbJTGE.net
>>118
お前はもう少し勉強してから書き込むべき

121:デフォルトの名無しさん
16/12/25 09:43:40.82 CGvp0k11.net
エミュとかアドレスを固定してるけどどうやってんの?

122:デフォルトの名無しさん
16/12/25 16:56:04.10 xlX3oF2t.net
質問です
エラーになってしまいます
教えて下さい
C++11です
int n=0;
string hage="s"+n+".png";

123:デフォルトの名無しさん
16/12/25 17:03:23.30 YVZO5C9V.net
"s"と".png"はconst char*型なので+は無理

124:デフォルトの名無しさん
16/12/25 17:09:24.52 xlX3oF2t.net
そうなんですか…
ありがとうございました

125:デフォルトの名無しさん
16/12/25 22:48:16.54 oxH1mE2q.net
>>120
最初に、すべてのアドレス分のメモリを確保すれば?
その先頭アドレスを、エミュレータの先頭アドレス・0 にすればいい

126:デフォルトの名無しさん
16/12/26 01:40:19.72 Us2MOZON.net
>>121
標準で用意されているのはstringとstring/char/char*間のみ(operator+)
なので+するのをintでなくstringにすればいける
C++11ならto_stringがあるから次ので問題ない
string hage = "s" + to_string(n) + ".png";
細かい書式設定とかしたいならsstreamかsnprintfあたりで

127:デフォルトの名無しさん
16/12/26 08:42:54.29 w1n6Bp69.net
>>124
それじゃ起動毎に変わるんじゃね?

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

129:デフォルトの名無しさん
16/12/26 12:36:41.62 bq11e3Cp.net
>>125
ありがとうございます!
あとでやってみます

130:デフォルトの名無しさん
16/12/26 16:52:23.77 vHVIx8+p.net
ASLRのことなら、無効にする事が出来る

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

132:デフォルトの名無しさん
16/12/28 09:29:29.21


133:jHXCJg+4.net



134:デフォルトの名無しさん
16/12/28 11:23:40.53 BmYU7N0Q.net
URLリンク(xiph.org)
ここから必要な文書を探して読んで理解するのが本筋

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

136:デフォルトの名無しさん
16/12/31 16:20:34.34 ADMXNhyN.net
*str++ = toupper(*str);
これ鼻から悪魔コード
インクリメント演算子で操作された変数が副作用完了点までに複数回参照するのは動作未定義
*str = toupper(*str);
str++;
と分離しないとまずい

137:デフォルトの名無しさん
16/12/31 17:17:13.63 Z7Smo6OK.net
*str++ = toupper(*str); でダメなら
*str = toupper(*str++); で動くんじゃない?
……って真に受けるなよ。別の悪魔が出てくるだけだからな。
たとえ期待通りの動作になったとしても、たまたまだからな。

138:デフォルトの名無しさん
16/12/31 17:24:22.85 xodGK7fu.net
ポインタを直接インクリメントするのはどうにも性に合わん

139:デフォルトの名無しさん
16/12/31 17:38:17.18 nERH8viD.net
通る道なのでやさしくね

140:デフォルトの名無しさん
16/12/31 18:30:26.25 K1FrsN4c.net
>>133
その本がダメなコードの例としてそれを挙げてるならいいけど、正解としてそれを書いてるのなら、著者の能力とか校正の正確さとか不安になる。

141:133
16/12/31 19:18:21.55 8v6iajLL.net
>>138
正解例です
>>135
下でダメだったので正解を見たら上になってて、そうかとそうかと思ったのですが…
>>134
ありがとうございます
初心者なので更に勉強してみます

142:デフォルトの名無しさん
16/12/31 20:02:29.25 RP5GqFRc.net
本の題名晒してもいいと思う...

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

144:デフォルトの名無しさん
16/12/31 20:17:55.00 q3l2oU5w.net
なぜダメなのか何がダメなのか理解しとかないと

145:デフォルトの名無しさん
17/01/01 01:32:25.83 LgRst/uw.net
>>139
まじすか ちょっとひどいですね。 著者が知りたいです。

146:デフォルトの名無しさん
17/01/01 12:42:18.55 /LG195GI.net
str_toupperでググると正しいコードはあるけど >>133 は見つからないなあ。結局なんて本?

147:133
17/01/01 14:53:59.97 OFpbxODd.net
解きながら学ぶC言語(2006年第5刷)ですが、新版見てみたら >>134 のように修正されてました

148:デフォルトの名無しさん
17/01/01 17:19:11.24 LgRst/uw.net
望洋先生すか あちゃー

149:デフォルトの名無しさん
17/01/04 01:18:25.55 frbRBuKj.net
副作用完了点が2つ以上あると鼻から悪魔

150:デフォルトの名無しさん
17/01/04 01:40:21.76 8dyTsCQL.net
んなこたーない

151:1/2
17/01/04 02:39:58.96 9INFfbdp.net
このサイトを参考にコードを書いているのですが、レスポンス中に無反応になります。
助けてください。
URLリンク(qiita.com)
このコードとの差異は以下の通りです。
----------------------------------------------------------
read_size = SSL_read(ssl, buf, buf_size);の前に
memset( buf, 0, buf_size


152: );を挿入 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が出力されませんので、異常終了している可能性が高いです。



153:2/2
17/01/04 02:40:11.64 9INFfbdp.net
環境は以下の通りです。
OS: CentOS 6.4
コンパイラ: GCC 4.4.7
接続先: URLリンク(www.youtube.com)
その他、無反応中にnetstat -tanpコマンドで確認すると、
このアプリケーションはESTABLISHEDとなっています。
また、自宅サーバーのHTTPSのサイトへアクセスした場合、HTMLの最後のほうの</body>が出力された後に数秒の間があり、
その後、</html>が出力されて正常に終了します。
この数秒の間も気になります。
よろしくお願いします。

154:デフォルトの名無しさん
17/01/04 03:14:24.95 sO2gccKh.net
>>149
> printf("%s",buf);に変更
%sは文字列のアドレスを引数として受けてそれを出力する
C言語で文字列とはNUL終端されたバイト列だが
SSL_readは文字列ではなく只のバイト列を扱うからNUL終端なんてしていない
そのために受信した文字列以上のおそらくbufの領域を越えて偶然にゼロに
出くわすまでprintfが出力しているんだろう
付け加えると、サーバーから送られてくるバイト列中にゼロが含まれていると
文字列として扱おうとしたprintfはそこまでで終わりと見做してしまう
例えば2ちゃんはたまにそんなHTMLを返してくることがあっていい加減な作りの
自作アプリなんかが途中までしか表示しないとかいう不具合を出す

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

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

157:デフォルトの名無しさん
17/01/04 09:47:31.23 87+T0pXS.net
もしくは1.1sだな

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

159:デフォルトの名無しさん
17/01/04 09:54:39.63 dvUWMEVx.net
元質問みてなかった わーすーれーてー

160:デフォルトの名無しさん
17/01/04 12:32:23.72 xue+qv3N.net
「んなこたーない」
っていつも書き込みする人がいるけど
もっと具体的な回答してほしい。
「んなこたーない」って答えるくらいだから何かしらの反論や回答持ってるんだろうけど
もっと具体的に言ってくれなきゃ分からない。

161:デフォルトの名無しさん
17/01/04 12:37:37.48 FLMu+DIB.net
そういうのはとりあえず否定したいだけだからスルーでいいよ
回答なんか持って無いと思うし

162:デフォルトの名無しさん
17/01/04 13:56:51.11 x5I82FL9.net
0x00がないと、どこまでもぉ って事だけで。

163:デフォルトの名無しさん
17/01/04 15:05:14.50 CkccjIZ7.net
俺はとりあえずこんなのを提案する(


164:) 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);



165:148
17/01/04 15:11:07.58 8dyTsCQL.net
>>157
さすがにこれは説明要らんだろうと思うよ・・・。
「副作用完了点が2つ以上」って、 str++; str++; こんなのでアウトってことだからね。

166:デフォルトの名無しさん
17/01/04 17:51:37.32 ku1IYB1y.net
んなこたーない

167:デフォルトの名無しさん
17/01/04 18:08:39.09 issqqmbF.net
do while()って嫌いだから使わん

168:デフォルトの名無しさん
17/01/04 18:10:34.06 dvUWMEVx.net
マクロのおまじないでも?
#define FOO() do { あーだこーだ } while(0)

169:デフォルトの名無しさん
17/01/04 18:15:56.08 pxTed+R/.net
>>147
言いたいことはわかる気がするが、その文面は明らかに間違っているでしょ。
エスパーすると、
「副作用完了点と副作用完了点の間で、同一の変数を複数回変更する」
と、鼻から悪魔、かな?

170:デフォルトの名無しさん
17/01/04 18:17:44.69 pxTed+R/.net
まだ甘いか。
「ある副作用完了点と、次の副作用完了点の間で、同一の変数を複数回変更する」
かな?

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

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

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

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

175:デフォルトの名無しさん
17/01/04 22:45:56.82 by3GIgBn.net
>>157
さすがに >>147-148 だと >>147 の方に説明責任があると思う

176:デフォルトの名無しさん
17/01/04 23:27:27.83 6PKdRVzk.net
MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ!
研究会のメンバーでさえ、規格に詳しい人がいないのだから、
日本人では、規格に詳しい人はいない
トヨタでも、MISRA-Cの遵守率が5%しかない。
こういう素人が作る、医療機関・産業機械は怖くて使えない。
アプリのバグで、すぐに人が死ぬ
コンパイラを作る方も、あやふやな解釈をしているから、
紛らわしい書き方を避けて、かなり安全に、コーディングしないと危険
極端に言えば、1文1文、分離して書くこと。
バグが多く出る箇所は主に、マクロ・複合文・型違いの3つ

177:デフォルトの名無しさん
17/01/04 23:45:39.23 xue+qv3N.net
> 勘違いしてないか?
とか
> 日本語おかしくないか?
とか言ってあげれば>>147も自分の間違いに気づけたんじゃないかなって思う。

178:デフォルトの名無しさん
17/01/04 23:48:11.13 NgyPecWp.net
お前らちょっと温泉でも行ってこい

179:デフォルトの名無しさん
17/01/04 23:48:33.21 8dyTsCQL.net
>>173 ちっとも具体的じゃないが、それでいいの?正直なにが違うのかわからん。
(日本語としてはまったく問題ないしな。)

180:デフォルトの名無しさん
17/01/05 00:16:26.21 kU82p3Tw.net
> >>147
> 副作用完了点が二つ以上存在すること自体は問題ないだろ。
> 複数の副作用完了点で同じ変数を変更、参照するんのが問題なんだよ。
> 安易な気持ちで書き込みすんな。一生ROMってろ。
ネラーならこれくらい言えないとな。
>>175
「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧。
>>158みたいに受け取る人もいるし。
>>173は具体的じゃないけどまだましなほうでしょ。

181:デフォルトの名無しさん
17/01/05 07:15:07.48 Tn1lGUp3.net
副作用完了点が2つ以上あると鼻から悪魔
 ↓
× んなこたーない
○ 勘違いしてないか?
理由:「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧

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

183:デフォルトの名無しさん
17/01/05 07:35:58.65 Tn1lGUp3.net
嵐かどうかは別として間違いの指摘かどうか曖昧でわからない奴はヤバい

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

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

186:デフォルトの名無しさん
17/01/05 11:37:47.99 Xc98514b.net
>>181
PC 1台でも出来ます

187:デフォルトの名無しさん
17/01/05 11:44:42.65 yWb7mDiI.net
server のプログラムを実行しておいて
接続先を 127.0.0.1 (または localhost) にした client のプログラムを実行すれば桶
後は実行OSの事情次第(FWの警告をスルーする等)

188:デフォルトの名無しさん
17/01/05 11:51:25.19 33EuaIzL.net
>>181
client.exe server.exe生成
→server.exeを起動し通信待機
→client.exeを起動し通信開始
でいいよ

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

190:デフォルトの名無しさん
17/01/05 12:00:04.09 CkAWate/.net
んなこたーない
って前々から他のC++スレでも使われていたけど、
自分からは何も根拠を示さず、ただ周りからの反論を煽りたいだけのレス
みたいな受け取られ方が少なからずされていたように感じるんだけど。
コミュニケーションって難しいな。

191:デフォルトの名無しさん
17/01/05 12:06:51.34 yWb7mDiI.net
>>185
bash だったら
末尾に & つけて呼び出すとバックグランドで実行するみたいよー
# server [enter]
 : 待機中でだんまりさんw
# server & [enter]
 : すぐ次の入力待ちになる server は裏で実行中
#

192:デフォルトの名無しさん
17/01/05 12:25:39.85 nSwRuxqn.net
>>187
できました!
ありがとうございます助かりました

193:デフォルトの名無しさん
17/01/05 13:10:33.43 Goea0txf.net
nohup をつけるともっと幸せになれるよ
nohup server &

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

195:デフォルトの名無しさん
17/01/05 14:20:26.50 wksprrkU.net
0xFFFFFFの変数がif(n > 0)で真になるんだがなんだコレ?
クソムカツクな死ねよ

196:デフォルトの名無しさん
17/01/05 14:25:53.51 yWb7mDiI.net
64bit (2の補数の)符号付で 00FF FFFF は正なんだけど
48bit の符号付整数での比較を望んでいるんだろうか?

197:デフォルトの名無しさん
17/01/05 15:39:10.85 60LIuvs1.net
48bitでも32bitでも正ですが

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

199:デフォルトの名無しさん
17/01/05 18:52:01.04 sOp8JEWl.net
逆になぜ偽になると思ったのかが知りたいな。

200:デフォルトの名無しさん
17/01/05 18:58:22.71 25Qby3+x.net
auto n = 0xFFFFFF;
*reinterpret_cast<int*>(&n) > 0

201:デフォルトの名無しさん
17/01/05 19:26:42.79 ivHnG5Le.net
int が 24bit ってダメなんだっけ?

202:デフォルトの名無しさん
17/01/05 19:41:33.07 /zQeSTVL.net
あー あほしたー bit数を数え間違ってるし

203:デフォルトの名無しさん
17/01/05 21:38:57.59 AK28m3f5.net
>>196のオツムのレベルは>>191と同等

204:デフォルトの名無しさん
17/01/05 23:28:47.82 sjDvcQUe.net
>>185
別の端末・別の仮想デスクトップなどを、起動すればいい

205:デフォルトの名無しさん
17/01/08 01:15:08.36 +QuxnNhY.net
■ 質問概要
ファイルに書き込んでも反映されない。
■ 環境
CentOS 6.4
GCC 4.4.7
■ 質問詳細
fopenに"r+"を指定して開いたファイルに、fputsでテキストデータを書き込んでも反映されません。
fcloseしていないことが、恐らく原因だと思います。
このアプリケーションは起動時にfopenでファイルを開いて常駐し、
アプリケーション終了時にfcloseするように開発しており、fcloseすると反映されます。
常駐型のアプリケーションで逐次ログ出力するため、
書き込むたびにファイルを開いたり閉じたりしないようにしています。
fcloseしなくても読み取りだけはできるようにしたいのです。
Apacheの挙動を見ると、ログファイルがこうした動作になっているようです。
(Apacheのソースは読んでいません、ログファイルを操作しようとした際の挙動などからによる推測です)
どうすればいいでしょうか。
調べたところ、fflushで希望の動作ができそうですが、
使い慣れてないものを使うのは副作用が怖く、
また、説明に「強制的」等の文言があるため、この文言があるだけでも非常に不安です。
こうした目的でfflushを利用しても問題ないのでしょうか。
そもそもfflushでいいのでしょうか。
URLリンク(linuxjm.osdn.jp)

206:デフォルトの名無しさん
17/01/08 01:21:15.59 Zdr2NPEX.net
大丈夫だから使え

207:デフォルトの名無しさん
17/01/08 01:24:31.77 T3Q1+h8z.net
flushは時間がかかるから頻度が高い場合は気をつけて。

208:201
17/01/08 01:54:37.47 +QuxnNhY.net
>>202-203
ありがとうございます。
時間がかかるんですね。
では、頻度が高い場合はfputsの度ではなく、
一定時間おきにfflushするように実装したいと思います。

209:デフォルトの名無しさん
17/01/08 03:35:33.42 eh6WgorM.net
A = (framecount / 10) % 4
すみません、上記の式の意味を教えてください。
毎度、Aに入る値がしりたいです。

210:デフォルトの名無しさん
17/01/08 03:39:14.61 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
:

211:デフォルトの名無しさん
17/01/08 03:43:39.84 eh6WgorM.net
>>206
こんな深夜に即レス、感謝
ありがとうございます!

212:デフォルトの名無しさん
17/01/08 04:24:28.51 c5pY166L.net
>>201-204
普通は、ファイルを閉じる際、自動的にflushされる
それに何もしなくても、OSのデフォルト設定で、
dirty Page Cache を、5秒ごとにflushして、メモリとディスクを同じ状態に保つ
USB・SSDの書き込み回数を減らしたい人は、書き込み間隔を15~30秒に設定している人もいる。
commit=15
Linux I/O のお話 write 編
URLリンク(d.hatena.ne.jp)

213:デフォルトの名無しさん
17/01/08 11:20:03.87 OpAcES4h.net
char buffer[256];
scanf(%s,buffer);
printf(

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

215:デフォルトの名無しさん
17/01/08 11:43:58.41 nyR751xv.net
>>210
問題が再現できる最少コード書いてみて
コンパイル通るコード

216:デフォルトの名無しさん
17/01/08 11:52:30.04 OpAcES4h.net
>>211
先日も少し教えてもらったのでまた聞きに来てるのが恥ずかしいのあ
ですが、サーバとクライアントでの通信のプログラムです。
server.c
URLリンク(codepad.org)
client.c
URLリンク(codepad.org)
gcc -o s server.c
gcc -o c client.c
./s&
./c
で実行しています。
サーバ側のscanfで止まってしまうみたいなのですが
サーバ側のscanfをコメントアウトすると通るみたいです。

217:デフォルトの名無しさん
17/01/08 12:07:20.20 nyR751xv.net
server側がnot foundだわ
リンク確認してみて

218:デフォルトの名無しさん
17/01/08 12:15:37.07 9g4d0om9.net
>>213
アップし直しました
URLリンク(codepad.org)
確認不足ですみません;;

219:デフォルトの名無しさん
17/01/08 12:35:39.21 nyR751xv.net
Wait for Connection...Connected.
s1---------
C->S: %s
Server:
実行結果はここで止まって
s2---------
まで進まないって事?

220:デフォルトの名無しさん
17/01/08 12:38:46.78 Cjw+tP2S.net
>>215
そうですね
Serverの後にscanfがあるので入力してみると
Server: uuu
aaaaa
iiii
uuu
とかになって、Enterキーを打っても次に進んでくれません

221:デフォルトの名無しさん
17/01/08 13:15:24.14 nyR751xv.net
送受信で変数を別々にしてみて
scanf -> sendはbuffer1
recv -> printfはbuffer2
みたいに
38, 39 40行目にブレークポイント置いてやってみて

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

223:デフォルトの名無しさん
17/01/08 15:47:42.95 /TmTqYIS.net
>>217
ありがとうございます
やってみましたがどうもうまくいかなさそうです
>>218
ありがとうございます。
いちおうやってみたのですが、ぼくがりしょしんしゃすぎてこうどなれすすぎてりかいできません(^q^)
バックグラウンドとフォアグラウンドの使い分けが良く分からないです。
手順を整理すると、
1. サーバをバックグラウンドで開始
2.


224: クライアントをフォアグラウンドで開始 3. クライアントを停止 4. クライントをバックグラウンドで再開 5. サーバをフォアグラウンドで開始 6. クライントをフォアグラウンドで開始 ということでしょうか???頭がパーン!!



225:デフォルトの名無しさん
17/01/08 16:06:06.04 nyR751xv.net
>>219
ブレークポイントが39で止まる
→続行して入力しても40のブレークポイントに来ない
こんな状況なの?

226:デフォルトの名無しさん
17/01/08 16:09:35.63 uGSXn6++.net
難しいようなら、&で起動するのはやめて、ターミナルを二つ起動して
片方でサーバを、もう片方でクライアントを実行するほうが楽だと思う。

227:デフォルトの名無しさん
17/01/08 16:24:16.26 7aUjJ3jB.net
同意

228:デフォルトの名無しさん
17/01/08 17:02:49.06 C9GVPqMv.net
>>208
それレイヤーが違う話だよ

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

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

231:デフォルトの名無しさん
17/01/08 22:54:37.49 c5pY166L.net
端末も複数、起動できる
仮想デスクトップを知っているか?
デスクトップも、複数起動できる
普通、C/S通信プログラムでは、2つ端末を起動する
>>209-210
2chのバグだろう
書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。
" の代わりに、\" とエスケープすれば、どうだろう?
それか、書き込み確認画面が出たら、1度キャンセルすれば、確認画面は出ないようになった

232:デフォルトの名無しさん
17/01/11 13:06:08.85 X1FDgEas.net
>>208といい>>226といい、わざと嘘を書いてるのか?

233:デフォルトの名無しさん
17/01/12 04:36:13.74 8CizHZGj.net
MSVCはいつまで__cplusplusの定義199711Lのままなんだ

234:デフォルトの名無しさん
17/01/12 07:09:10.44 edOk7o4H.net
変えると暴動が起きるこら変えない
とライブラリ開発者のSTL氏が言っていた

235:デフォルトの名無しさん
17/01/12 12:09:34.61 xegpw56Z.net
1だと思ってた

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

237:デフォルトの名無しさん
17/01/15 00:34:44.37 H7ag5TAh.net
警告文をコピペしてくれると話が早いような

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

239:デフォルトの名無しさん
17/01/15 01:02:35.94 7/DzGkQz.net
インクルードするファイルを間違えてたみたいです
お騒がせしました

240:デフォルトの名無しさん
17/01/19 22:46:56.05 knltoro2.net
新しくクラスとそれに関連した処理などを実装するとき
ヘッダー側でクラスの定義、ソースファイル側にクラス内のメンバ関数の実装部などを書きますよね
その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか? たとえば
//ヘッダー側です
class A{
private:
 int num;
public:
 int ReturnNum(void){
  return num;
 }
};
処理はたった一行ですけどこの場合もint ReturnNum()の実装部はソースファイル側にint A::ReturnNum()のように移すべきですか?
ネット上のプログラムをいくつか見てみたらこのようにメンバ変数をただ返すだけの処理ならヘッダー側に書いてあるものも少なくなかったのでどっちが好ましいんだろうと気になりました

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

242:デフォルトの名無しさん
17/01/19 23:11:24.96 ydMYZ/gE.net
クラスもヘッダに書きますけどぉ

243:デフォルトの名無しさん
17/01/19 23:55:32.15 A0Yl7Ujc.net
> その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか?
別にどんな場合でもソース側に書くというわけではない
ヘッダに書くのもソースに書くのも一長一短はあり絶対的にどっちがいいというものではない
君が違いを理解し何を重視するかを意識すれば
君にとってどっちが好ましいかは自然とはっきりする

244:デフォルトの名無しさん
17/01/20 00:23:32.93 7sj2OAGi.net
なんか禅問答が始まったかと思ったわ

245:デフォルトの名無しさん
17/01/20 01:12:20.36 /ixeQkYS.net
短いメソッドなら、ヘッダに、inline 指定して書くと、
関数化せずに、inline にしてくれる可能性が高い
まあ、言語では保証していないけど。コンパイラ依存

246:デフォルトの名無しさん
17/01/20 05:11:02.70 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 は後者の説明だったのね。

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

248:デフォルトの名無しさん
17/01/20 08:09:40.71 B05iL6IP.net
『~のが原則』
『理由がある場合~こともある』
俺の会社のルールは世界普遍的 思考

249:デフォルトの名無しさん
17/01/20 16:53:52.68 abKD9bRi.net
inlineにするのはほとんどその時の気分みたいな?
なんかマクロみたいだな。inlineにすっかみたいな。

250:片山博文MZ ◆T6xkBnTXz7B0
17/01/20 17:10:04.08 XdmbS/hB.net
>>244
関数呼び出しのオーバーヘッドの回避と、定数畳み込みなどの最適化が期待できる場合にインライン化する。

251:デフォルトの名無しさん
17/01/20 17:38:00.40 abKD9bRi.net
>>245
そんな感じ

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

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

254:デフォルトの名無しさん
17/01/20 21:15:10.32 esT1VQmf.net
inlineキーワードはヘッダに実装書くときなどに使用するものでインライン展開を狙った最適化の為に書くものではない

255:デフォルトの名無しさん
17/01/20 21:15:23.08 abKD9bRi.net
もしかしてコンパイラの方で展開してるとか はないかなぁw

256:デフォルトの名無しさん
17/01/20 21:57:28.38 aetIobRP.net
>>249
インライン関数の話の途中でinlineキーワードの関数の話を始めて、いきなりどうした

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

258:デフォルトの名無しさん
17/01/20 23:11:34.78 LsENUQp+.net
ベクトルとか行列のライブラリを使った時は全部インラインにしたな
1/60秒にかなりの回数呼ぶし
ライブラリとかもインラインで書かれてる

259:デフォルトの名無しさん
17/01/20 23:12:36.14 LsENUQp+.net
×使った ??作った

260:デフォルトの名無しさん
17/01/20 23:27:28.97 esT1VQmf.net
>>252
んなわけない

261:デフォルトの名無しさん
17/01/20 23:34:20.48 ITfb1kXg.net
>>255
んなこたーない

262:デフォルトの名無しさん
17/01/20 23:36:05.42 esT1VQmf.net
ヘッダに書いたら暗黙でinlineって
#includeの機能しらんとしか思えないんだが

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

264:デフォルトの名無しさん
17/01/21 01:48:12.93 RmTA4cQd.net
江添はなんて言ってる?

265:デフォルトの名無しさん
17/01/21 07:06:45.50 5NCJ8rOL.net
forceを信じるのだ

266:デフォルトの名無しさん
17/01/21 08:35:23.75 P1/rV56D.net
インライン関数はODR回避のためだと思っていた
C++17(予定)のインライン変数もそんな感じ

267:デフォルトの名無しさん
17/01/21 11:00:41.73 wrzS/cSB.net
ODRって何?

268:デフォルトの名無しさん
17/01/21 11:17:05.01 J7ipYv9j.net
単一定義則 One Definition Rule の略語

269:263
17/01/21 19:43:36.29 J7ipYv9j.net
「単一定義規則」の方が検索にかかりやすい言葉かも。

270:デフォルトの名無しさん
17/01/22 08:28:10.05 5o7PrILb.net
>>261
そうそう。最適化目的でinline付けても普通無視されるからね。

271:デフォルトの名無しさん
17/01/22 14:37:23.33 hBhrTyQG.net
URLリンク(chrome.google.com)

272:デフォルトの名無しさん
17/01/24 12:50:54.05 ZplzBBh2.net
Windows上で、APIを使わずに、コマンドプロンプト上だけで結果が
ほしいような、C言語のプログラムを作るのに便利な開発環境はありますか?
VIsualStudioは重すぎてあまり使いたくありません。
どうぞよろしくお願いします。

273:デフォルトの名無しさん
17/01/24 13:20:58.13 qjTW56fl.net
msys2

274:デフォルトの名無しさん
17/01/24 13:39:24.94 ZplzBBh2.net
msysって、どういうものですか?

275:デフォルトの名無しさん
17/01/24 13:58:35.63 qjTW56fl.net
>>269
コンパイラツールチェインとターミナルとライブラリ管理のパッケージツールを纏めたものです
エディタは無いし ビルドツールはautotoolsとかcmakeとかを使います
ただ単体ファイルをコンパイルして実行するだけなら
gccを叩くだけなので ご要望に沿うかと

276:デフォルトの名無しさん
17/01/24 14:14:08.29 tjYeiy24.net
重いのがイヤなら code::blocks はどうかね
URLリンク(demura.net)

277:デフォルトの名無しさん
17/01/24 20:33:35.20 bAAm8CCs.net
>>267
自分もvisual studio が重いのと好きなエディタ使いたいのと、
でもGUIでファイル管理とかコンパイルエラー行へのジャンプをしたかったの自分でそういうツールを作った。TTVC Developer っていうのだけど
ネット上に公開してるけど反応無いので本当に良くできてるかどうかは
わからんが、自分的には便利だとは思ってる

278:デフォルトの名無しさん
17/01/24 20:39:04.14 2gaKjsEX.net
俺はqt creator使ってるな
VSよりマシってくらいだが

279:デフォルトの名無しさん
17/01/24 20:46:07.50 HHZbO6eg.net
>>267
notepad.exe
cl.exe
link.exe

280:デフォルトの名無しさん
17/01/24 21:22:57.39 nvNd8iP1.net
Bash on Ubuntu on Windws

281:デフォルトの名無しさん
17/01/24 21:41:00.44 1ohBhH6C.net
あれβとれたっけ?

282:デフォルトの名無しさん
17/01/27 01:10:08.67 c6wkRwWW.net
*p++ って 参照してからインクリメントですよね。
某書に*(p++)と等価って書いてあったけど。
ん 同じか

283:デフォルトの名無しさん
17/01/27 01:47:57.39 JFq0FevS.net
同じだよ
その括弧かあってもなくても実際にインクリメントがされるタイミングには影響しない

284:デフォルトの名無しさん
17/01/27 02:43:45.51 c6wkRwWW.net
すまん 評価してからインクリメントは同じだもんね。

285:デフォルトの名無しさん
17/01/28 22:24:20.92 fbuNIeJW.net
>>279
いいってことよ
何気に愉快なIDだな

286:デフォルトの名無しさん
17/01/29 14:28:58.62 XKehhdE4.net
質問です。
VisualStudio2015でReleaseビルドをしていたところ、生成されたEXEに気になる点がありました
if(false){
printf("hogehoge");
}
という処理を書いたところ、このprintfは到達不可能なのに、EXEの中に"hogehoge"という文字列が含まれていたのです。
※再現コードなのでhogehoeをprintしてなんの意味があるのかというコードですが
到達不能なのが明らかな部分は最適化で削除されるものだと思っていたのですが、何かしらの私の不手際でしょうか?
最適化は /O2オプションです

287:デフォルトの名無しさん
17/01/29 15:19:11.63 DfD+S+Qh.net
>>281
/O4とかは?

288:デフォルトの名無しさん
17/01/29 15:31:20.39 2ZaFXkbr.net
オプションによる不確定なものをどうして不手際と思ったのか謎
/O2 /GF-なら残る可能性高いし

289:デフォルトの名無しさん
17/01/29 17:04:30.90 XKehhdE4.net
アドバイスありがとうございます
>>282
VisualStudioには無いようです。GCCにはあるようですが、ぐぐった限りだと効果はないようなことが散見されました
>>283
「不要なコードを削る」というのは、一番単純で効果が高そうなので、まっさきに確実に全除去してくれるだろうと思い込んでいたためです
この手のコードが最適化で消えないと、ifdefだらけになりそうなのですが、何か対策はないものでしょうか?

290:デフォルトの名無しさん
17/01/29 18:59:23.49 K+/fnyLa.net
何かの理由があって残してるという事はないのかな・・・

291:デフォルトの名無しさん
17/01/29 19:49:35.57 6wGEJq5M.net
>>281
普通に削除されて文字列もなくなるけど?

292:デフォルトの名無しさん
17/01/29 23:12:58.08 XKehhdE4.net
>>285-286
ご返答ありがとうございます。
どうも文字列をあれこれ変えて、消えたり消えなかったりとよくわからない状況になってきました。
とりあえず、VS2015での最小コードを作れましたので貼り付けます
int main()
{
char text[] = "foofoo";
printf("hogehoge");
if (false) { printf(text); }
return 0;
}
こうすると以下の挙動になります。
このまま: exeにhogehoge, foofooの両方が含まれているのを確認できる
printf("hogehoge");を削除: hogehoge, foofooの両方がEXEから消える
※単に0を返すだけの結果固定関数になるため、変数の割り当てすらしなくなるから?

293:デフォルトの名無しさん
17/01/29 23:42:21.35 DuISdTe+.net
VS2015の環境を持っていないんで見当違いかも知れんが…。
#include <stdio.h> か #include <cstdio> を書いてみる。
char text[] = ... を const char text[] = ... にしてみる。
これらを(独立して)変えてみたら状態が変わらんかな?
printf()による副作用の可能性を考慮してtextを消さないのかも知れん。

もちろんprintf(&quot;hogehoge&quot;)を呼び出しても
引数になってないtextが読み書きされるはずはないんだけど。

294:デフォルトの名無しさん
17/01/30 00:05:47.51 iVXSa+56.net
>>288
アドバイスありがとうございます
すいません。最小コードといいつつincludeをきちんと書いておりませんでした
#include <stdio.h>を最初に書いております
cstdioに変えてみて、各種パターンやってみましたが、変化は見られませんでした
次に、以下です
const char ではfoofooは消えませんでした
const static char に変えたところ、消えました
printfが、中でスタック消費量でも利用しているのかな…と馬鹿なことを考えて
char text~をグローバル空間に出してみましたが、foofooは消えずです

295:デフォルトの名無しさん
17/01/30 13:26:01.87 NFw8h2uH.net
>>289
グローバル変数にするのは最適化されにくくなるだけ。
とりあえずこれで
#include <stdio.h>
int main(){
printf("hogehoge");
if(false){
printf("foofoo");
}
return 0;
}
データセグメントが消えるかどうかは最適化の
目的じゃないと思うが、"foofoo"が残るか見てみると
VS2015
cl /Ox /Fa hoge.cpp きえない
cl /O1 /Fa hoge.cpp きえた
cl /O2 /Fa hoge.cpp きえた
GCC-3.4.5
gcc -S hoge.cpp きえた
まあ所詮VC

296:デフォルトの名無しさん
17/01/30 17:50:38.46 X+M9ocjS.net
つまり>>281は嘘つきってこと?

297:デフォルトの名無しさん
17/01/30 19:47:42.18 p0U51Ig/.net
exeの中身まで気が回りませんわ

298:デフォルトの名無しさん
17/01/30 22:08:56.31 mpXbeHjF.net
exeにビルド時のフルパスが埋め込まれてるとイラっとする

299:デフォルトの名無しさん
17/01/30 22:20:13.70 XMGcU10o.net
デバッグビルドなら普通でしょ

300:デフォルトの名無しさん
17/01/31 02:46:33.99 SZ8YrWi+.net
リリースビルドにして、最適化オプションを指定すれば?

301:デフォルトの名無しさん
17/01/31 09:17:11.64 r8Cb1+5o.net
デバッグ情報を含めなければいいだけだしな

302:デフォルトの名無しさん
17/02/01 01:15:31.17 lC8eLy+G.net
あるクラスに引数で渡されるオブジェクトのconstではない参照を持ちたいんですけどどのようにやればいいでしょうか
ポインタはなるべく使いたくないのですが
class A {
public:
void setParam(Param&);
private:
Param& m_param;
}
状況としては
あるクラスBがクラスAみたいなParamの参照を持つクラスを複数持っていて
クラスBがvector<Param>でParamの実体を持っているという感じです

303:デフォルトの名無しさん
17/02/01 01:25:10.63 V+KME3Sb.net
ライフタイムと循環参照のもたらす悪夢を
全部避けられるように熟考しながら
shared_ptr / weak_ptr をどうぞ
Welcome to C++ nightmare!!

304:デフォルトの名無しさん
17/02/01 01:36:32.13 nwC60mRJ.net
shared_ptrの何が難しいのか判らん。
shared_ptr程度で悪夢とか言ってたらswiftも使えなくない?

305:デフォルトの名無しさん
17/02/01 02:15:37.65 V+KME3Sb.net
まぁ良く調べて使ってねってのを脅し効かせた程度です 
他の言語で参照カウント型のsmart_ptr解ってるなら 確かに大丈夫

306:デフォルトの名無しさん
17/02/01 12:17:29.74 RxSebrTI.net
Windows10でBluetoothを使ったCOM通信を行いたく、
プログラムのほうはCOMポート通信のつもりで書き、
OSの設定でBluetoothに仮想COMポートを追加しました。
Androidとは問題なく接続・通信できたのですが、
Windows10同士ではうまくいきませんでした。
これは仮想COMポート作成するときに、どちらのPCも「受信」(相手側が接続を開始する)にしていたからだと思い、
片方を「送信」に変更しようとしました。
しかし、この場合は接続先PCを指定しなくてはならないのですが
対象PCが選択リスト内に出てこなくて作成することができません。
ペアリングはできているにもかかわらずです。
どうすればWin10PC同士でBluetoothを介したCOMポート接続・通信ができるでしょうか?

307:デフォルトの名無しさん
17/02/01 12:30:13.62 HL/HxBhd.net
直接の解はわからないけど、ぐぐって見つかったので確認
ポート開くとき "\\\\.\\COM○○" (○は数字 \はエスケープ込み)
って開いてる?
ポート番号が1桁の場合に限り "COM○"でも開けるらしいけど、
そのコードの延長で 2桁渡すとそれは開けないから

308:301
17/02/01 12:49:42.61 RxSebrTI.net
>>302
あ、はい。それはやってます。
今、わかったのですが、
一旦ペアリングを解除して、改めて「送信」COMポートを追加しようとすると、
先程までペアリングしていた対象PCが選択できるようになりました。
しかし今度は「選択されたデバイスでシリアルポートサービスが実行されていません。」と出て作成されません。
相手側に「受信」のCOMポートは作成済みなのですが…。

309:デフォルトの名無しさん
17/02/01 13:25:07.55 HL/HxBhd.net
URLリンク(kokufu.blogspot.jp)
これとかの雰囲気だと
「受信」で作った側のPCのソフトを先に立ち上げて接続待ちにして(SPPサーバー)
「送信」で作った側のPCを後追いで接続 かなぁ
力になれなくてすまん

310:301
17/02/01 14:06:25.03 RxSebrTI.net
>>304
いえいえ!
色々と調べていただいて参考になりました。
どうもシリアル接続サービスをサポートしていないようです。
今回の条件ではあまり好ましくないのですが、
WiFiを使ったソケット通信で妥協することにします。
ありがとうございました。

311:デフォルトの名無しさん
17/02/01 14:21:22.91 +8V+I8xy.net
>>298-300
ありがとうございます
帰ったら勉強してみます

312:デフォルトの名無しさん
17/02/01 20:39:39.90 3j6uP7e4.net
>>297
参照をメンバで持ちたい時は、コンストラクタでの初期化以外は無理。
class A {
public:
A(Param& x):m_param(x){}
private:
Param& m_param;
};

313:デフォルトの名無しさん
17/02/02 01:04:42.40 CAgg+EtY.net
shared_ptr,weak_ptrのことで質問なのですが
自クラス2つを引数に取る+演算子をオーバーロードしているクラスMatrixを使って
func(std::weak_ptr<Matrix> m1, std::weak_ptr<Matrix> m2){
mat = m1 * m2;

}
みたいにやりたいんですが、オペランドに一致する演算子がないと言われます
shared_ptr,weak_ptrに入れた場合どのようにしてオーバーロードされた演算子を利用できますか?

314:デフォルトの名無しさん
17/02/02 01:27:35.78 FXYEZ0RW.net
>>308
weak_ptr から shared_ptr を作って、それを通して参照すればいい
・・・んだけど、それ weak_ptr::expired() な場合にどうするつもりなん?

315:デフォルトの名無しさん
17/02/02 02:04:10.33 CAgg+EtY.net
>>309
ありがとうございます
weak_ptrを使っている理由は
funcはあるクラスのメンバ関数で、引数で渡されたポインタの所有権をクラスが持たないこと示すためにweak_ptrを使っているのですが
weak_ptr::expired()な場合は想定していません

316:デフォルトの名無しさん
17/02/02 02:21:14.81 ExAPXdhA.net
>>310
なんか根本的に勘違いしてる感が
const referenceの関数見たら中でポインタ持ち続けちゃう心配とかしてんの?

317:デフォルトの名無しさん
17/02/02 02:21:18.81 EB2HJN86.net
スマートポインタはポインタのように振る舞うものだから
*や->でポインタの指す値にしなければならないよ

318:デフォルトの名無しさん
17/02/02 10:51:03.92 335RX4F5.net
VS2015で.objを.libに変換してリンクできなくて悩んでいます
そういうことはできないのでしょうか?

複数のC++ファイルをビルド→.objが複数できる
新しいEXEプロジェクト作る→main()を用意→そこの.vcxprojを編集して複数の.objをincludeする→ビルドで正常な.exeできる(exeサイズ10MB)
 include方法は<Object Include="abc1.obj" /> <Object Include="abc2.obj" />・・・
新しいスタティックライブラリプロジェクト作る→そこの.vcxprojを編集して複数の.objをincludeする→ビルドで.libができる(libサイズ100MB)
→新しいEXEプロジェクト作る→main()を用意→追加のライブラリで.libをリンクする→ビルドで動かない.exeできる(exeサイズ1MB)
動かない.exeのビルド時はリンカーエラーなど出ません
exeサイズが期待しているよりも小さく、実行時に例外で強制終了します

319:デフォルトの名無しさん
17/02/02 12:49:56.83 cH1kwi7M.net
例外を具体的に

320:デフォルトの名無しさん
17/02/02 13:18:13.30 Nq0thOwX.net
>>314
> ハンドルされない例外がスローされました:読み取りアクセス違反。
> xxxxx が nullptr でした。
xxxxxはポインタ変数
exeサイズが小さいからリンクできてるように見えてリンクできてないのかなとは思うけど
libの追加方法を#pragma comment(lib,"")にしてもうまくいかずでどうしたらいいものか

321:デフォルトの名無しさん
17/02/02 18:40:08.32 qO0hDPsp.net
>>313
> vcxprojを編集して複数の.objをincludeする
なんか色々勘違いしてないか?

322:デフォルトの名無しさん
17/02/02 18:48:07.72 S7kpFPUA.net
>>316
そういう実験してるんでしょ。
それを他人に聞いて何か返ってくると思ってるのが間違ってる感があるけど。

323:デフォルトの名無しさん
17/02/02 19:11:39.98 Eu4e1EaI.net
>>316
objからlibを作って動くならそれがいいのだけどその方法が分からない
lib.exeでobjからlibを作って使っても同じ状況

324:デフォルトの名無しさん
17/02/02 19:16:04.83 WkIFQVuy.net
>>317
普通とは違うことをしているなと思ったが、実験しているのか
vcxprojを編集してソースコードではなくobjを用いるVSプロジェクトを作りたいのかな

325:デフォルトの名無しさん
17/02/02 19:18:03.73 qhXDtbED.net
.c, .cpp から .lib 作るプロジェクト -(A)
そいつをリンクしつつ、 .c, .cpp から実行ファイルを作るプロジェクト -(B)
(参照設定とか依存関係とかで (A) を使うぜ俺 って指定する)

326:デフォルトの名無しさん
17/02/02 19:38:57.55 WkIFQVuy.net
こんな感じだろ
ソースからobj生成: VSプロジェクトでなくていい
VSプロジェクト
1. objからexe作るVSプロジェクト (結果OK)
2. objからlib作るVSプロジェクト (3.がNGで、本当にうまくlib作れたかわからず)
3. 上のlibからexe作るVSプロジェクト (exeが例外でNG)

327:デフォルトの名無しさん
17/02/02 19:51:53.25 Eu4e1EaI.net
>>321
まさにその状態
>>320の(A)が作れればいいけど、objファイルは数百プロジェクトの600ファイルぐらいあるから試そうにも数日かかりそうで避けたい
今は全プロジェクトまとめたソリューションあるけどリビルドだけで1時間以上かかる。簡単にexe作れるようにしたいというのが原点

328:デフォルトの名無しさん
17/02/02 20:22:53.95 k638XiO/.net
そこまで行ったらDLLに分けるだろう

329:313
17/02/03 13:56:09.01 3xPmzf3n.net
4番をやってみましたが結果OKでした
1. objからexe作るVSプロジェクト (結果OK)
2. objからlib作るVSプロジェクト (3.がNGで、本当にうまくlib作れたかわからないが、4がOKで作れてる可能性高い)
3. 2のlibからexe作るVSプロジェクト (exeが例外でNG)
4. 2のlibからobjを抽出して、そのobjからexe作るVSプロジェクト (結果OK)
作業の前提条件として下の2つは意味が同じと思っているのですが、違いがあるのでしょうか?
cppをコンパイルしてobjにし、objをリンクしてexeを作る
cppをコンパイルしてobjにし、objをlibに変換してからリンクしてexeを作る

330:デフォルトの名無しさん
17/02/03 13:56:30.01 OeN1TpCU.net
Ubuntu16.04,gcc5.4.0で,書籍を参考に下記のプログラムを
コンパイル(gcc program.c -lalut -s -o program)したところ,
「'nullptr' was not declared in this scope」というエラーになりました
何が間違っているのか教えてください
---program---
#include<AL/al.h>
#include<AL/alc.h>
int main() {
//OpenAlの初期化
//デバイスを開く
ALCdevice* device = alcOpenDevice(nullptr);
//コンテキストを生成
ALCcontext* context = alcCreateContext(device, nullptr);
//生成したコンテキストを操作対象にする
alcMakeContextCurrent(context);
//OpenALの後始末
//操作対象のコンテキストを解除
alcMakeContextCurrent(nullptr);
//コンテキストを破棄
alcDestroyContext(context);
//デバイスを閉じる
alcCloseDevice(device);
}

331:デフォルトの名無しさん
17/02/03 14:06:26.05 S9UE3yae.net
nullptrはC++11からの機能だからですね
"gcc" -> "g++ --std=c++11"を使ってください
元のコンパイルは-lalutを指定していますが
そのプログラムならOpenALだけで大丈夫なので 下記で通ります
ライブラリをpkg-configに探させてるだけです
g++ --std=c++11 program.c `pkg-config openal --libs` -o program

332:デフォルトの名無しさん
17/02/03 14:55:43.86 xVLuMTde.net
>>324
一般論で言えば同じはず。
ファイルサイズが小さいのなら正常にリンクできてない。
使ってない関数やクラスをリンクしてるわけじゃないよね

333:デフォルトの名無しさん
17/02/03 15:42:48.87 3xPmzf3n.net
>>327
使ってるのも使ってないのもある
libの追加方法は二通り試したけどどちらもビルドエラーはでないけど実行時NG
どちらもlibの追加を省略すると外部シンボルが見つからないエラーでビルドが通らない
プロジェクトのプロパティの「追加の依存ファイル」から→実行時NG
ソースファイル中に「#pragma comment(lib,"")」から→実行時NG

334:デフォルトの名無しさん
17/02/04 00:14:20.36 z/XsYQOx.net
何もしていない普通の一般人の自宅に隠しカメラを取り付け
それをネットでリアルタイム配信
仲間という人間に対する盗聴盗撮生ネット配信の会
しかけたカメラの映像
乗っ取っているPCの画像をリアルタイムで生配信中
集団で仲間の私生活を覗いて楽しんでいる
そんなことが今この国では行われています

335:デフォルトの名無しさん
17/02/04 05:54:43.47 /r5Uxr2+.net
libでリンク解決してもダイナミックリンクにしてれば実行時にパス内に見つからずにエラー
スタティ


336:ックリンクにしないと



337:デフォルトの名無しさん
17/02/04 09:51:58.52 GdM1I4zb.net
久々にプログラミングしようと思うんですけど
USBカメラがあるからそれを使って監視カメラにしたいんだが
ピクセルデータが取れればあとは簡単だと思うんだけど、その前に
この適当に昔買ったバッファローのUSBからデータ取り出す事って可能なんですか?

338:デフォルトの名無しさん
17/02/04 10:24:35.81 94H9RTyk.net
>>330
lib作るときのプロジェクトタイプはスタティックライブラリにしているけど、それとは別に設定であるのでしょうか?
>>331
「usbカメラ キャプチャ c++」で検索すると色々な方法が見つかるよ。よほど変なカメラ出ない限り仕様は同じだから使える

339:デフォルトの名無しさん
17/02/04 10:55:19.44 GdM1I4zb.net
>>332
ありがとうございますだ

340:デフォルトの名無しさん
17/02/04 21:25:32.55 uqEM2LY/.net
int a = 0;
int *b = &(1+a);
これが出来ないのはなぜですか?
1+aの計算結果というのはメモリ上のどこかにあると思うんですが

341:片山博文MZ ◆T6xkBnTXz7B0
17/02/04 21:28:28.23 sK4bvJ1n.net
>>334
CPUのレジスタには物理アドレスが無い。

342:デフォルトの名無しさん
17/02/04 21:31:18.24 3pCbKNVT.net
&1 を許すとややこしいことになりそうだ

343:デフォルトの名無しさん
17/02/04 21:38:25.89 wIflvrKT.net
>>334
計算結果はレジスタに入っててメモリには入ってないんじゃない?

344:デフォルトの名無しさん
17/02/04 21:52:37.41 uqEM2LY/.net
>>335-337
なるほど、勘違いしてました
ありがとうございます

345:デフォルトの名無しさん
17/02/05 19:35:43.24 ktep0Dpi.net
>>326
遅くなりすいません
できました
ありがとうございました

346:デフォルトの名無しさん
17/02/05 22:43:20.73 F2ePDpTS.net
>337
レジスタがメモリじゃないかのようなアホレスだな

347:デフォルトの名無しさん
17/02/05 23:03:58.60 wagcFIA6.net
レジスタのアドレスって・・・

348:デフォルトの名無しさん
17/02/06 01:31:32.48 DI3VdQ+9.net
アドレスのないレジスタはCでアクセスできないからな
アセンブリでしてねになるからね

349:デフォルトの名無しさん
17/02/06 03:41:00.32 oG8S/cPb.net
って言うかレジスタ関係なくね?
右辺値に対してアドレス取ろうとしてるから駄目なわけで。

350:デフォルトの名無しさん
17/02/06 05:58:55.21 GvVdGH4O.net
>>334 の質問に対して「右辺値」を出すのは大げさじゃないかな。
もちろん正しいんだけど、詳細に踏み込みすぎというか、
その話はもっと理解が深まってから、というか。
「過去に自分がこの疑問を持ったときに、どんな説明をされたら
すっきり腑に落ちて先に進めただろうか」と思い返しながら回答してるんだろう。

351:デフォルトの名無しさん
17/02/06 08:21:18.53 87jFG7WV.net
そもそも >>338 で本人納得してるのに
> レジスタがメモリじゃないかのようなアホレスだな
とか
> 右辺値に対してアドレス取ろうとしてるから駄目なわけで。
とかは知ったか自慢にしか見えない

352:デフォルトの名無しさん
17/02/06 08:58:46.99 L0zP1ki7.net
間違った説明で相手を納得させておいて開き直りとはこれいかに

353:デフォルトの名無しさん
17/02/06 13:17:28.90 WLH8uv6+.net
>>345
本人の納得は無関係
その二つどっちも誤り

354:デフォルトの名無しさん
17/02/06 20:21:28.41 VJg+IRhi.net
>>345
> その二つどっちも誤り
でもどう誤ってるかは書けないんだよね w

355:デフォルトの名無しさん
17/02/06 20:22:09.67 VJg+IRhi.net
>>348>>347 宛だったわ

356:デフォルトの名無しさん
17/02/06 20:58:58.36 oG8S/cPb.net
>>344
でもさ、レジスタって言語と関係ないじゃん?

357:デフォルトの名無しさん
17/02/06 21:52:01.05 w07g0Jpo.net
registerは予約語なのに無関係は無いわ

358:デフォルトの名無しさん
17/02/06 22:13:36.15 rtwfNknd.net
>registerは予約語なのに無関係は無いわ
規格のどこを読んだら「register」キーワードと「レジスター」との関連が読みとれるんだか

359:デフォルトの名無しさん
17/02/06 23:29:15.59 w07g0Jpo.net
規格厨には理解しろと言っても無理だ

360:デフォルトの名無しさん
17/02/06 23:45:37.66 +fmEnPzx.net
>int a = 0;
>int *b = &(1+a);
っていうのが今intになってるからレジスタがどうとか言えるけど
intじゃなくて自分で定義したクラスとかだったらどうなんだって話だな
レジスタだからアドレスが取れないっていう説明はアレすぎないかい?
そもそもレジスタだけで済ませるかどうかはコンパイラの自由ってのもあるし

361:デフォルトの名無しさん
17/02/06 23:48:30.59 tIYhS76V.net
一生懸命だなあw

362:デフォルトの名無しさん
17/02/07 00:11:08.64 STnejiJM.net
俺が思うにさ
最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは
普通にありふれているわけじゃないですか
で、それらの変数のアドレスを取得するように
コードを書き換えたら、コンパイルエラーになるんですか?ってね
その場合ちゃんとコンパイラはメモリに実体を作るような動作になる
だからレジスタ云々はオプティマイズの話であって本質的に全く関係ないだろうと
レジスタに配置されているからアドレス取得できませんって意味不明で
だったらメモリに実体を作ればいくらでもアドレス取得できるだろって話なんだよ
どちらかというとこれは変数の寿命の関係でそうなっているんだよ

363:デフォルトの名無しさん
17/02/07 00:12:13.25 vsDAW+dO.net
初心者向けの簡易な説明に外野がつまらない茶々入れて大騒ぎするなよ。

364:デフォルトの名無しさん
17/02/07 00:25:30.14 pfKer2X+.net
>最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは
>普通にありふれているわけじゃないですか
本当にありふれてるのか?

365:デフォルトの名無しさん
17/02/07 00:48:05.62 PI0qtNzz.net
winsock(UDP)を使ったプログラムを作っています。
ほぼできたのですが、数100回繰り返すと徐々に通信が
遅くなっていきます。
通信するたびに、オープンとクローズを繰り返しているのですが、
その辺に原因がありそうでしょうか・・・。

366:デフォルトの名無しさん
17/02/07 02:25:04.93 e2


367:fTv1VF.net



368:デフォルトの名無しさん
17/02/07 07:22:03.04 ff698yUf.net
>>354
> そもそもレジスタだけで済ませるかどうかはコンパイラの自由ってのもあるし
その自由さのために言語仕様でできないようにしてるだけでしょ

369:デフォルトの名無しさん
17/02/07 07:23:26.33 ff698yUf.net
>>359
再現性あるならどこが遅くなってるかを調べたら?

370:デフォルトの名無しさん
17/02/07 07:43:41.13 AbeSLyAt.net
>その自由さのために言語仕様でできないようにしてるだけでしょ
根拠は俺の「こうだったらいいな」
この理屈で行くとアドレスをとれる変数は
レジスタに乗せてはいけないことになるな

371:デフォルトの名無しさん
17/02/07 11:15:58.10 bjgueVwS.net
register云々してるやつはCかC++か区別して書け

372:デフォルトの名無しさん
17/02/07 11:47:58.10 +LdvU0fQ.net
class A
{
 public:
  int xxx;
  void yyy();
};
class B : protected A  ←protectedのままにしたい
{
 public:
  void yyy() {  __super::yyy();  }
};
B bbb;
bbb.xxx = 0;   ←アクセスできない
bbb.yyy();    ←使える
xxxをclassBの内部を変えることでアクセスできるようにする方法ない?

373:デフォルトの名無しさん
17/02/07 11:52:35.77 Ex9Qk6T0.net
public:
using A::xxx;

374:デフォルトの名無しさん
17/02/07 11:57:42.37 +LdvU0fQ.net
>>366
おお!yyy()もそれでいけるね。サンクス

375:デフォルトの名無しさん
17/02/07 19:45:06.55 R+lISOuU.net
>>364
register変数のアドレスを取る話をしてるわけじゃないのに
いきなりどうした

376:デフォルトの名無しさん
17/02/08 19:54:01.02 zyGgo9zG.net
俺,register使ったことないが
register int a = 0;
int *b = &a;
とすると、b経由で割り当てられたCPUレジスタにアクセスできるのか?

377:デフォルトの名無しさん
17/02/08 20:15:16.32 x9WXoVQQ.net
cではregister指定された変数のアドレスは取れない
c++では取ってもいいが、取ると普通はレジスタではなくメモリ割り当てになる
そもそもregister指定しても必ずレジスタ割り当てになるわけではない
今のコンパイラの多くはregisterを無視してるらしい


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch