2ちゃんねる★スマホ版★■掲示板に戻る■全部1-最新50

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

1 :
2016/11/06(日) 22:58:02.60 ID:dU5z27As
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

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

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

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
2 :
2016/11/06(日) 23:23:55.86 ID:AHO3vAwR
>>3-1000は射精魔
3 :
デフォルトの名無しさん
2016/11/07(月) 00:30:57.27 ID:pyn9XiBr
>>2
訂正しときます
次スレの>>3-1000が射精魔
4 :
2016/11/07(月) 09:27:53.95 ID:vooGYje+
前スレ>>999再掲
class A{
int a[2];
A(int b[])
:a(b) //error
{}
};

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

前スレ>>1000
無理でした・・・
5 :
2016/11/07(月) 09:34:35.19 ID:dSd+kVnH
何がしたいのかわからないので回答しようがないな
6 :
2016/11/07(月) 09:36:19.79 ID:dSd+kVnH
あ、初期化子か
インデントがないから見間違えた
7 :
2016/11/07(月) 09:38:54.66 ID:e8hpdnod
引数の int b[] って int* b と同じやしなぁ
8 :
2016/11/07(月) 09:47:42.61 ID:HQzTq5fm
std::array
9 :
2016/11/07(月) 12:11:29.58 ID:56hqYy7l
C++11以降なら
A(int (&b)[2]) : a{b[0], b[1]} {}
10 :
2016/11/07(月) 14:52:37.34 ID:fwwW9lIx
だがint b[2][3]はポインタ引数は・・・
11 :
2016/11/07(月) 14:56:04.42 ID:6MsAvbZq
↑幻覚をみた糖質のつぶやき
12 :
デフォルトの名無しさん
2016/11/07(月) 15:00:49.14 ID:3Xim9e5h
>>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();
}
13 :
2016/11/07(月) 18:18:06.75 ID:hOJqMng1
>>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)
{
}
};
14 :
2016/11/07(月) 18:21:04.82 ID:hOJqMng1
2行目「6個より多く」だったね
15 :
2016/11/07(月) 18:44:55.40 ID:3Xim9e5h
>>13
いやいくらでも動的に増やせるんだけど初心者スレだから省略した

http://ideone.com/ryEwkt
16 :
2016/11/07(月) 19:07:23.45 ID:hOJqMng1
要求は固定長の配列であって、動的に増やせるようにしろとは言ってないので
それのコードは非効率にしかならないと思うよ
17 :
2016/11/07(月) 19:25:01.70 ID:fwwW9lIx
>>11
ん?
int b[2][3];をわたせんの?
func(int a[][3]);以外で
18 :
2016/11/07(月) 19:50:01.21 ID:Z2RT26Su
>>16
だからvector使ってないでしょう
unique_ptrのパフォーマンス知らないの?
19 :
2016/11/07(月) 20:07:47.59 ID:Z2RT26Su
ID:hOJqMng1 の主張の変遷

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

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

どう考えても言ってることがコロコロ変わってるんだが
20 :
デフォルトの名無しさん
2016/11/07(月) 21:12:34.93 ID:L762Pvtq
!!喧嘩の予感!!
21 :
2016/11/07(月) 21:25:52.93 ID:nZ1H9hgf
A() : a{b[0], b[1]} {}がダメだった人にC++11を押しつけてどーすんだ
>>12に至ってはもとの質問と全然関係ねーし
22 :
2016/11/07(月) 21:26:20.26 ID:Rr8tj+hR
VC++で、マウスオーバーで色が少し変わって、クリックしたら沈んだみたいになる画像ボタンを作るにはどうしたらいいですか?
23 :
2016/11/07(月) 22:16:57.66 ID:hOJqMng1
>>19
まず効率は動的確保を行うnewとunique_ptrより確実にarrayのほうがいい

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

私はアクセス違反になるといったが動的確保にしろとは言っておらず、動的確保にしたのはそっちが勝手にやったこと
アクセス違反を回避するために動的確保にするのは全く割に合わない
だったら長さチェックすればいいだけ
24 :
2016/11/07(月) 22:20:22.76 ID:JXtVbtZ4
>>21で結論でてるじゃねえか
C+11を押し付けてる時点でおまえら全員ダメだ!
25 :
2016/11/07(月) 23:34:44.46 ID:lMECrzfj
いいぞ、もっとやれ〜♪
26 :
2016/11/08(火) 00:32:16.33 ID:t0HdCoBm
沸点低すぎワロタw
27 :
2016/11/08(火) 00:33:05.07 ID:2SYrs2Uf
>アクセス違反を回避するために動的確保にするのは全く割に合わない
こう書かれるべきものが
>>16
>それのコードは非効率にしかならないと思うよ
と書かれたため>>19が射精した

特に「非効率にしかならない」の「にしか」という表現が前後の繋がりを考えると最悪だ
28 :
2016/11/08(火) 15:38:54.44 ID:FW358liz
using std;
int main() {
int a;
cout<< "数を入力してください" <<endl;
cin>> a;
cout<<a <<"ですね?" <<endl;
}
aを確実に入力させたくて困っています
ご教授ねがいます
29 :
2016/11/08(火) 16:03:34.41 ID:j/2yZvJO
まず確実ってなんやねん
数以外だったり未入力は弾くってか
30 :
2016/11/08(火) 16:26:08.25 ID:FW358liz
そうです
未入力で無限ループみたいに表示されて困っています
31 :
2016/11/08(火) 16:26:29.50 ID:Or+T0geg
教示ならしてやっても良いが、教授はお断りだ
32 :
2016/11/08(火) 16:58:49.59 ID:sBMnjDSh
>>28
http://ideone.com/dpolU5

一応単なる改行や数字で始まらない文字列は弾くようにした
ただしコメントにも書いてあるけど 123def みたいな数字で始まる文字列を
入力したときは数字だけ返すんでそれが駄目なら自前で作るしかないね
33 :
2016/11/08(火) 17:22:56.70 ID:FW358liz
>>32
getline知りませんでしたが何とかできそうです
ありがとうございます
34 :
2016/11/10(木) 10:52:07.29 ID:8ULjF/bN
独習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 :
2016/11/10(木) 11:03:28.04 ID:6ImFpJhK
引数だけ書くと
0+1
1+1
・・・
9+1
ここまではprintfまで来ないまま再帰
9+1でifに入らないからrecurseからリターン
printfがiを表示(9)してリターン
printfがiを表示(8)してリターン
の繰り返し
36 :
2016/11/10(木) 11:07:42.28 ID:8ULjF/bN
>>35
早速のレスありがとうございます。

>9+1でifに入らないからrecurseからリターン
ということはmain関数のreturn 0でプログラムは終了してしまうのではないですか?
なぜprintfが呼ばれるのかわからんのですが。(iが減算される理由もわかりません)
37 :
2016/11/10(木) 11:12:33.48 ID:8ULjF/bN
if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}

recurseとprintfは同じifブロックに入っているので、ifが偽なら両方共スキップされると思うのですが、
なぜprintfだけ呼ばれるのでしょうか?
38 :
2016/11/10(木) 11:20:27.66 ID:69ogPHI/
丁度再帰打ち切り付近の挙動

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 :
2016/11/10(木) 11:28:04.25 ID:6ImFpJhK
>>37
9+1で入って偽で抜けたら
8+1で入ってきたif内のrecurseから抜けて次のprintfが実行されて抜ける
8+1で抜けたら7+1で入ってきたif内のrecurseから抜けて次のprintfが実行される
の繰り返し
40 :
2016/11/10(木) 11:40:24.95 ID:8ULjF/bN
>>35-39さん
どうも再帰関数とforループがごっちゃになっていたようです。
何となくわかりました。
後は自分で考えてみます。
どうもありがとうございました。
41 :
2016/11/10(木) 12:42:30.91 ID:69ogPHI/
再帰呼び出し後に書く  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);
と見えてくると思うよ
42 :
2016/11/10(木) 13:57:04.04 ID:gEXUDT4B
なんか遠回りな説明ばかりだな
スタックフレームというキーワードを出してやれよ
43 :
2016/11/10(木) 14:01:09.75 ID:8ULjF/bN
>>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からなのはなぜなのでしょうか?
44 :
2016/11/10(木) 14:02:24.39 ID:69ogPHI/
再帰でどう動いてるか理解するのに
スタックフレーム出されても困らないか? 値の保持の実装でそうなってるってだけだし
45 :
2016/11/10(木) 14:09:10.79 ID:gEXUDT4B
この手の人は、具体的な実装例を見さえすれば、すぐさま疑問が解消されるんだよ
>>43でも「待機する」だとか
なんで逆順になるのか分からないとか
言っているが
スタックフレームさえ知れば全ての疑問は解決だし
C/C++するのにスタックフレームさえ知らない状態だと
このさき困難だろう
46 :
2016/11/10(木) 14:10:50.73 ID:69ogPHI/
おっけー まかせた
47 :
2016/11/10(木) 14:18:39.78 ID:gEXUDT4B
待機する、って言い方を見るに、何かキューのような物を連想しているようだし
実際、なんで逆順になるか分からないと発言しているわけだが
答えは関数呼び出しはキューではなくスタックだから、と言う他ない
キューやスタックという言葉の意味が分からなかったとしても
どのみちこれらも覚える必要のある最も基本的な事の一つだから
合わせて覚えればよいだろう
コンピュータの基本動作もよくわからないままプログラムを書くということは
多言語ではあり得るのかもしれんが、とりわけここはC/C++スレだからね
48 :
2016/11/10(木) 14:26:03.17 ID:gEXUDT4B
いや、俺は別に何も説明するつもりはないよ
ただ、スタックフレームというキーワードをだね
そうすれば後は本人が検索するなりなんなり、勝手に調べるだろう
キーワードが分からなきゃ検索も出来ないから、キーワードを出してやれという話
スタックを知らずして再起呼び出しの動作を理解するのは非常に困難というか
質問者は関数呼び出しがキューのようなものであると考えている可能性が高いようだけど
実際にはスタック動作だよ、と
ここを勘違いしていたら、答えにたどりつかないかなぁと
49 :
2016/11/10(木) 14:29:55.54 ID:6ImFpJhK
>>42
最短の説明で教えてあげてくれ任せた
50 :
2016/11/10(木) 14:33:22.38 ID:8ULjF/bN
スタックフレームで検索して見たところ、
ttp://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node9.html
このページが一番わかりやすそうです。
LIFOなんで新しい関数と引数が上の方に積み上がっていくと考えれば良いのでしょうか?
first outなんで実効は新しい順(つまり今回の例の場合はi=9)ということですね。

スタックフレームという言葉で検索したらおもしろそうなサイトがたくさん出てきました。
皆さん今回はありがとうございました。
51 :
2016/11/10(木) 14:51:19.03 ID:IzCfpVGN
>>43
まず大前提としてプログラムの流れは1本道で別れたりしないし、待機みたいなことも普通しない

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

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

この4行目はrecurseという関数を呼び出している
つまり自分自身を呼ぶのでこの4行目の呼び出し後、recurse関数の最初に戻る
ただし引数iは1大きい値で呼ぶ
これを入れ子のように10回繰り返すことになる
52 :
2016/11/10(木) 15:05:17.38 ID:8ULjF/bN
>>51
レスありがとうございます。
ttps://ipa-zone.info/page-2644/
このページに私が使っている独習Cの再帰の部分が丸ごと転載されているんですが(違法?)、

i=0~10と昇順で増加していく前半部分でも呼び出された関数(recurse(1)など)は終了した訳ではないですよね?
後半のi=10から降順で減少していくときにはじめてprintfが実行されて関数が終了すると思うんですが、
LIFOなんで最後に呼び出されたrecurse(9)からrecurese(0)まで降順で残ったprintfを実行していくということではないんですか?
53 :
2016/11/10(木) 15:15:27.68 ID:gEXUDT4B
>実行は新しい順(つまり今回の例の場合は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なのだ
54 :
2016/11/10(木) 15:18:47.59 ID:17noS2hU
長い。あとビデオ見ながら電話に出れるだろ
55 :
2016/11/10(木) 15:21:50.96 ID:3AXwvnI0
ポインタを返すラムダをstd::functionで取り扱いたくて調べてるのだが
どうしてどの参考例もintやvoidの例しか示していないのだろう
参考例を示すまでもなく誰でも簡単に記述出来ているのだろうか
56 :
2016/11/10(木) 15:39:54.19 ID:8ULjF/bN
>>53
レスありがとうございます。参考になりました。
57 :
2016/11/10(木) 20:21:43.62 ID:CLfGjB35
>>55
特に難しくは無いと思う
例えばどんなことをしたいの?
58 :
2016/11/10(木) 20:31:23.31 ID:AQTsjJgJ
文盲はお帰りください
59 :
2016/11/10(木) 21:49:48.84 ID:cv2N5dvt
std::function<int*(const int)> create_array = [](const int n)->int*{ return new int[n]); };

でいいんじゃないの
誰かdeleteすんだよと思うけど
60 :
2016/11/10(木) 22:03:01.49 ID:AQTsjJgJ
>誰かdeleteすんだよと思うけど

自覚があるならそんな変な例を出さなければいいのに
61 :
デフォルトの名無しさん
2016/11/10(木) 23:23:35.24 ID:wCaAZ9DK
>>60
じゃあお前が適切な答え書いてやれよ
62 :
2016/11/10(木) 23:41:59.59 ID:AQTsjJgJ
>>55の回答はこんな感じでいいだろう
using ptr_type = void *;
std::function<ptr_type ()> f1{ []{ return ptr_type{}; } };

std::function<void *()> f2{ []{ return static_cast<void *>(nullptr); } };
63 :
2016/11/11(金) 01:01:22.47 ID:JQalwGbJ
>>62
散々煽ってたから聞くけど
static_cast<void *>(nullptr)
このキャスト無駄じゃない?
これは変な例ではないの?
64 :
2016/11/11(金) 01:15:39.30 ID:tUBqvL6G
う〜んどうだろうね
よく見るとラムダの戻り値の型が省略されているし
こういったことがどの段階のC++のバージョンで出来るようになったのか
俺は知らないが、実際の戻り値の型からラムダの型を推測してくれる便利機能
を使っていると思われる
となれば、キャストなしのnullptrでは型がわからないから
ラムダの戻り値の型の推測もできず、コンパイルエラーになるのではないだろうか
65 :
2016/11/11(金) 01:36:59.83 ID:tUBqvL6G
もしくは、ひょっとしたらnullptrには何らかな特殊な型が与えられているのかもしれんが
それはしらないが、ともかくvoid*型ではないのは確かなので
その場合でもstd::function<void *()>への代入で問題を起こすんだろう
nullptrに型が有るのか無いのか、俺は知らんし、興味もないんだけどね
66 :
2016/11/11(金) 01:48:43.11 ID:v3r+B2af
>>57>>59>>62
vsで試してて
std::function<void *()>
のような書き方をするとテンプレートがエラーを出していたので
関数ポインタのような特殊な記述が必要になるのかと思って調べていたのですが
原因が分かりました

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

というかNULLって今まで(void *)0だと思ってました・・・
まさかただの0だとは
普段はコンパイラが暗黙に変換してるんだね・・・
67 :
2016/11/11(金) 01:56:19.58 ID:v3r+B2af
自宅の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とかでも同様なんですかね
68 :
2016/11/11(金) 02:04:25.89 ID:JQalwGbJ
>>65
nullptrの型はnullptr_tだよ
だからラムダの戻り値の型はnullptr_tと推論される
ただ問題はvoid *を戻り値としたfunctionに代入できるか

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

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

https://ideone.com/EwRvlU

>>67の結果とも一致する
69 :
2016/11/11(金) 07:16:38.23 ID:hk5EgzxW
>>63
コンパイルが通るかどうか以前に55は『ポインタを返すラムダを』と言っているのだから、
無いとお題改変になってしまうだろう

>>67
当然
int f() {return NULL;}
void *関数() {
 return f();//エラー
}
と同じことなので
70 :
2016/11/11(金) 08:09:52.28 ID:JclCvFO1
ID:tUBqvL6Gは希にみる健常者
71 :
2016/11/11(金) 08:32:07.55 ID:JclCvFO1
>nullptrに型が有るのか無いのか
この手の文法で型が無い落とし穴は初期化の { } ぐらいか
int a = {0}; // 「{0}」は式でなく型も無い
72 :
2016/11/29(火) 23:30:19.59 ID:7z8mZ0fw
さすがにCは時代に取り残された感があるな
新規案件なら埋め込み系を除いて存在意義なし
73 :
2016/11/30(水) 02:47:51.57 ID:Ir3oZvjK
寂しいですなぁ
74 :
デフォルトの名無しさん
2016/11/30(水) 02:56:49.99 ID:a9ciiDR7
う、埋め込み…
75 :
デフォルトの名無しさん
2016/11/30(水) 04:02:07.30 ID:tfyAgmME
組み込み系って英語ではembedded なんちゃら だし
よくある間違いでしょ
76 :
デフォルトの名無しさん
2016/11/30(水) 05:21:32.16 ID:sG3uRZRm
韓国ではよくあるんだ。
77 :
2016/11/30(水) 05:53:32.74 ID:/gnC384r
埋めるのは中国の得意とする技術
78 :
2016/11/30(水) 21:26:32.85 ID:ncjk4kan
linuxのカーネルモジュールてC++で書けるようになったんだっけ?
79 :
2016/11/30(水) 22:16:09.74 ID:Yeu32peW
ドライバとかはサブシスは普通に書いてるぽい、コアな部分はメンテナがパニクルのでやっぱCかと
80 :
2016/12/01(木) 11:40:38.39 ID:OWujHEiH
実際ひと目でいいからソース見てみ
一生C++なんか使わねーという主張がにじみ出てるよ
81 :
2016/12/01(木) 12:49:06.43 ID:yfw1GD74
C++使わなくていいならそれに越したことはないからね
82 :
2016/12/01(木) 13:16:49.42 ID:VWu2OAFy
c++は個人差が大きすぎるようです。議論も出来ない。
方向がコンフリクトしたら大変なのは ここ見てればわかる。
83 :
2016/12/03(土) 01:01:12.94 ID:62YFpmrs
C++はマングリングとかややこしいから
84 :
2016/12/03(土) 20:56:34.75 ID:nmEGc+VH
マンコリング
85 :
2016/12/11(日) 20:30:30.03 ID:CL+E9lTu
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 :
2016/12/11(日) 20:55:16.41 ID:Cd8ql2jy
元関数の length が uint32_t 単位での個数という仮定
→ uint32_t より小さい粒度は取り扱えない
→ uint16_t で取り扱える個数は偶数個に限定される
→ ポインタのキャストと length を /2 で渡すだけ
87 :
2016/12/11(日) 21:42:00.21 ID:74mAoGAM
uint16_tの方がラッパーなの?
どちらにしろ元の関数をそのまま使うなら変換は必要だね。

スタックが使われるかどうかはしらないけどClangコンパイラなら
可変長配列(VLA)っていうのがC++でも使えたはず。
サイズが大きすぎるとオーバーフローするけど。newと兼用してみるのも手。
88 :
2016/12/12(月) 22:47:53.10 ID:lLNqHCIY
>>86
なるほど、
渡すデータを1つ置きにすれば良いわけですね。
渡すデータを組み立てるときにそうすれば良いですし変換のコストは少なそうです。
多少汚いとこが関数外に出ちゃいますが今回のケースでは現実的な方法だと思います。

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

ひとまず>>86さんの方向で考えてみます。
お二人ともありがとうございました。
89 :
2016/12/13(火) 07:43:47.25 ID:vJwCdf+q
組み込みでスタックに可変長のデータ領域確保するとか頭大丈夫?
90 :
2016/12/13(火) 18:19:51.83 ID:692Oa1tt
>>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);
}
91 :
2016/12/13(火) 19:22:51.41 ID:vJwCdf+q
>>90
どうなのって言われても好きにしろよとしか言えないけど...
個人的には各々のテストも必要になるその手のコードは書かない
92 :
2016/12/15(木) 21:00:06.98 ID:iypiqTM3
ガチの初心者でプログラミング勉強したいと思ってるんですが
プログラミング勉強するとなるとどんなものから作り始めればいいですかね?
ちなみにCの基本的なこと(if,for文やファイル入出力)くらいしか知りません
93 :
2016/12/15(木) 22:16:52.10 ID:esEF0eVo
やっぱり画像が出たら楽しいから画像ビューアとかが良いんじゃないかな
画像が動いたらもっと楽しいって言うんならゲームもよいんじゃない?
音関係も楽しいんだが、サウンドプログラミングは結構専門知識がいるうえ
デバッグが難しいから最初は手を出さないほうが良いよ

ま、画像ビューアや動画プレイヤーが楽しいよ
ちょっとした実用性もあるし
94 :
2016/12/15(木) 22:22:14.89 ID:KqXo4C+P
Cであることに特に意味がないのなら別の言語の検討をすすめる
95 :
2016/12/16(金) 06:44:53.82 ID:cbHo8vE5
javaも悪くないと思いますよ。
96 :
2016/12/16(金) 08:53:37.09 ID:hCzygT3G
>>92
プログラミングを習得した延長線上に何を作りたいか決まってる?
97 :
2016/12/16(金) 08:59:07.35 ID:2kpKp/Uz
>>92
作りたいプログラム(今ならアプリケーションというのかな)の
イメージが先にないとアドバイスしにくい時代なのよ。

まずコンソールに hello, world を表示して、続いて標準入出力、
ソートやらリンクド・リストやらのアルゴリズムを習得して…
という順序を踏んでも、「マウスをクリックすると何かしてくれる」ような
今様のプログラムには少しも近づかないんだな、これが。
98 :
2016/12/16(金) 09:22:43.83 ID:R8KZSjOU
>>96
ゆくゆくはカメラを使って画像処理的なものをしてみたいと思ってます
具体的にはまだ決まってませんが…
99 :
2016/12/16(金) 09:23:43.35 ID:R8KZSjOU
>>97
なるほど
将来的にやりたいことをしっかり考えたうえで何を学ぶべきか考えたほうがいいんですね!
100 :
2016/12/16(金) 09:30:19.30 ID:R8KZSjOU
>>93
なるほど!
参考になりますm(__)m
101 :
2016/12/16(金) 09:52:11.47 ID:hCzygT3G
>>98
じゃあとりあえずGUIが必要だから
そこらへんからかな?
102 :
2016/12/16(金) 11:19:48.12 ID:O1fw7E0o
>>101
わかりました!
ありがとうございます!
103 :
2016/12/18(日) 22:40:31.25 ID:rTzEq7cO
c++でGUIな何かを作るときどうやるのが普通?どうやるのがおすすめ?
趣味嗜好全開でいいから教えてくれ
104 :
2016/12/18(日) 22:46:05.73 ID:eNcCSvTp
ビルド時間とバイナリサイズが気にならないならwxWidgets
105 :
2016/12/18(日) 22:56:35.56 ID:TyHJy95g
真面目にその条件なら.NETだけどそれなら言語はC#でやった方がよいと思う
自分は自分用のWIN32APIを使ったGUI用のライブラリ作ったけど完全に時代遅れだとは思ってる
106 :
2016/12/18(日) 23:56:09.22 ID:psse/iGW
wxWidgetsよさそうやね
クロスプラットフォームってのがいい
107 :
2016/12/19(月) 08:41:19.51 ID:K+bb4qm0
vcを使うという事ですか
108 :
2016/12/20(火) 08:43:24.96 ID:/4ZK922w
>>103
ターゲットのOSとかPC/ケータイとかライセンスとか軽さとか見比べて
GUIフレームワークを選ぶ

Qt は重いけどマルチプラットフォームかつ見た目がいいから人気
Windowsのみなら C# が迷わなくて済むけどね
時代遅れを気にしないなら VC+MFC の情報は多いw
他にもいろいろある
109 :
デフォルトの名無しさん
2016/12/24(土) 19:03:48.07 ID:Xnn//JuE
FILE *fp;をグローバル変数にしてたら落ちまくって、ローカル変数にしたら落ちなくなった現象は何でですかね?
グローバルかローカルか関係ない気がするんですけど。
Windows7、Visual Studio 2015
110 :
デフォルトの名無しさん
2016/12/24(土) 19:04:08.51 ID:Xnn//JuE
これで4時間近くハマった。
111 :
2016/12/24(土) 19:11:41.00 ID:0UyY/BKM
グローバルな FILE *fp の近く(若いアドレス)に置かれた
グローバルな配列の範囲オーバーじゃないかしら。
112 :
2016/12/24(土) 20:06:31.12 ID:TihFoldF
>>109
ファイルの開くのから閉じるのまでが一関数に収まってて、他から呼び出してないなら関係ないと思うけど
閉じ忘れとか?
113 :
2016/12/24(土) 20:27:17.35 ID:DNE92dFu
fileno とか ferror は確認した?
114 :
2016/12/24(土) 20:34:23.48 ID:y7L7nGQ6
fp をグローバルにおいたソースで 別のローカル変数をグローバルに置いたら
その変数で副作用起こすんじゃね?

(>>111 と同じく範囲突破しての書き込みを疑ってる)
115 :
2016/12/24(土) 21:00:46.23 ID:yr6q9nVG
fpがどんな値になろうと最悪でもエラー検出するだけだから
落ちるのはまともにエラー判定してないせい
116 :
2016/12/24(土) 21:14:49.73 ID:Xnn//JuE
>>111-115
ありがとうございます。

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

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

根本的な解決ができて良かったです。
117 :
2016/12/25(日) 01:18:26.20 ID:vsDUBYtf
気付くだけ立派だわなぁ
118 :
2016/12/25(日) 07:00:04.87 ID:iLmpV78q
mallocで確保した領域の溢れがグローバルな変数を壊すってのは
ちょいと解せない気もする。

DOSの頃なら互いに影響しあうことも普通だったろうけど、
最近のOSだと別に管理してそう。
内部の詳しいことは知らないけど。
119 :
2016/12/25(日) 09:26:05.12 ID:SibbJTGE
>>118
お前はもう少し勉強してから書き込むべき
120 :
2016/12/25(日) 09:43:40.82 ID:CGvp0k11
エミュとかアドレスを固定してるけどどうやってんの?
121 :
デフォルトの名無しさん
2016/12/25(日) 16:56:04.10 ID:xlX3oF2t
質問です
エラーになってしまいます
教えて下さい
C++11です

int n=0;
string hage="s"+n+".png";
122 :
2016/12/25(日) 17:03:23.30 ID:YVZO5C9V
"s"と".png"はconst char*型なので+は無理
123 :
デフォルトの名無しさん
2016/12/25(日) 17:09:24.52 ID:xlX3oF2t
そうなんですか…
ありがとうございました
124 :
2016/12/25(日) 22:48:16.54 ID:oxH1mE2q
>>120
最初に、すべてのアドレス分のメモリを確保すれば?

その先頭アドレスを、エミュレータの先頭アドレス・0 にすればいい
125 :
2016/12/26(月) 01:40:19.72 ID:Us2MOZON
>>121
標準で用意されているのはstringとstring/char/char*間のみ(operator+)
なので+するのをintでなくstringにすればいける
C++11ならto_stringがあるから次ので問題ない
string hage = "s" + to_string(n) + ".png";

細かい書式設定とかしたいならsstreamかsnprintfあたりで
126 :
2016/12/26(月) 08:42:54.29 ID:w1n6Bp69
>>124
それじゃ起動毎に変わるんじゃね?
127 :
2016/12/26(月) 09:21:17.58 ID:5lDUjv3x
起動毎にホスト上でのメモリ配置が変わっても
エミュレータの駆動機構で >>124 のように
エミュレーションする対象の仮想コードのアドレッシング → ホスト環境の実メモリ
の変換テーブル経由なら問題は発生しないべ
128 :
2016/12/26(月) 12:36:41.62 ID:bq11e3Cp
>>125
ありがとうございます!
あとでやってみます
129 :
2016/12/26(月) 16:52:23.77 ID:vHVIx8+p
ASLRのことなら、無効にする事が出来る
130 :
デフォルトの名無しさん
2016/12/27(火) 00:09:30.60 ID:hMHSnQwo
>>127を分かりやすく言うと配列みたいなもんだ。
int foo[5];
と宣言すれば、起動毎に確保されるアドレスは違うが、
例えば3番目のアドレスには必ず&foo[3]でアクセスできる。
これと同じ。
131 :
デフォルトの名無しさん
2016/12/28(水) 09:29:29.21 ID:jHXCJg+4
OggVorbisの使い方を教えてください。
動的リンクライブラリとしてリンクして、
WAVEデータをリアルタイムでOggVorbis形式(CBR)に変換したいです。
VS2015です。
一応ググりましたがどこから手を付けてよいか分かりませんでした。
132 :
2016/12/28(水) 11:23:40.53 ID:BmYU7N0Q
ttps://xiph.org/doc/
ここから必要な文書を探して読んで理解するのが本筋
133 :
2016/12/31(土) 16:11:48.53 ID:8v6iajLL
ある本の解答例ですが実行すると先頭文字が消えます。これではダメなんでしょうか?
void str_toupper(char *str)
{
while (*str)
*str++ = toupper(*str);
}
134 :
2016/12/31(土) 16:20:34.34 ID:ADMXNhyN
*str++ = toupper(*str);

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

*str = toupper(*str);
str++;
と分離しないとまずい
135 :
2016/12/31(土) 17:17:13.63 ID:Z7Smo6OK
*str++ = toupper(*str); でダメなら
*str = toupper(*str++); で動くんじゃない?

……って真に受けるなよ。別の悪魔が出てくるだけだからな。
たとえ期待通りの動作になったとしても、たまたまだからな。
136 :
2016/12/31(土) 17:24:22.85 ID:xodGK7fu
ポインタを直接インクリメントするのはどうにも性に合わん
137 :
2016/12/31(土) 17:38:17.18 ID:nERH8viD
通る道なのでやさしくね
138 :
2016/12/31(土) 18:30:26.25 ID:K1FrsN4c
>>133
その本がダメなコードの例としてそれを挙げてるならいいけど、正解としてそれを書いてるのなら、著者の能力とか校正の正確さとか不安になる。
139 :
2016/12/31(土) 19:18:21.55 ID:8v6iajLL
>>138
正解例です
>>135
下でダメだったので正解を見たら上になってて、そうかとそうかと思ったのですが…
>>134
ありがとうございます
初心者なので更に勉強してみます
140 :
2016/12/31(土) 20:02:29.25 ID:RP5GqFRc
本の題名晒してもいいと思う...
141 :
2016/12/31(土) 20:11:53.63 ID:ADMXNhyN
古かったとして、古い規格だとしても処理系依存
(こっちのコンパイラはこうなるけど、あっちのコンパイラでは別の結果になるよ) なので、
正解コードとするのはよろしくない
142 :
2016/12/31(土) 20:17:55.00 ID:q3l2oU5w
なぜダメなのか何がダメなのか理解しとかないと
143 :
2017/01/01(日) 01:32:25.83 ID:LgRst/uw
>>139
まじすか ちょっとひどいですね。 著者が知りたいです。
144 :
2017/01/01(日) 12:42:18.55 ID:/LG195GI
str_toupperでググると正しいコードはあるけど >>133 は見つからないなあ。結局なんて本?
145 :
2017/01/01(日) 14:53:59.97 ID:OFpbxODd
解きながら学ぶC言語(2006年第5刷)ですが、新版見てみたら >>134 のように修正されてました
146 :
2017/01/01(日) 17:19:11.24 ID:LgRst/uw
望洋先生すか あちゃー
147 :
2017/01/04(水) 01:18:25.55 ID:frbRBuKj
副作用完了点が2つ以上あると鼻から悪魔
148 :
2017/01/04(水) 01:40:21.76 ID:8dyTsCQL
んなこたーない
149 :
1/2
2017/01/04(水) 02:39:58.96 ID:9INFfbdp
このサイトを参考にコードを書いているのですが、レスポンス中に無反応になります。
助けてください。

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が出力されませんので、異常終了している可能性が高いです。
150 :
2/2
2017/01/04(水) 02:40:11.64 ID:9INFfbdp
環境は以下の通りです。
OS: CentOS 6.4
コンパイラ: GCC 4.4.7
接続先: https://www.youtube.com/

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

よろしくお願いします。
151 :
2017/01/04(水) 03:14:24.95 ID:sO2gccKh
>>149
> printf("%s",buf);に変更

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

付け加えると、サーバーから送られてくるバイト列中にゼロが含まれていると
文字列として扱おうとしたprintfはそこまでで終わりと見做してしまう
例えば2ちゃんはたまにそんなHTMLを返してくることがあっていい加減な作りの
自作アプリなんかが途中までしか表示しないとかいう不具合を出す
152 :
2017/01/04(水) 03:47:33.12 ID:9INFfbdp
>>151
ありがとうございます。
初歩的なミスでお恥ずかしい。
バイナリデータとしてファイルに出力したところ正常に動作しました。(ファイルの内容にも問題ありませんでした)
恐らくマルチバイト文字の途中か何かで切れていたのでしょう。
153 :
2017/01/04(水) 08:50:07.15 ID:hKIlPOcN
マルチバイトなんか関係ない
> write(1, buf, read_size);を
> printf("%s",buf);に変更
すんなって事だよアホウ
154 :
2017/01/04(水) 09:47:31.23 ID:87+T0pXS
もしくは1.1sだな
155 :
2017/01/04(水) 09:53:13.47 ID:dvUWMEVx
printf("%.*s", read_size, buf);  なら少しだけ
それでも read_size に至る途中に \0 あったら駄目だし
標準出力に送りたいんなら fwrite(buf, read_size, 1, stdout); こうなるかな
156 :
2017/01/04(水) 09:54:39.63 ID:dvUWMEVx
元質問みてなかった わーすーれーてー
157 :
2017/01/04(水) 12:32:23.72 ID:xue+qv3N
「んなこたーない」
っていつも書き込みする人がいるけど
もっと具体的な回答してほしい。

「んなこたーない」って答えるくらいだから何かしらの反論や回答持ってるんだろうけど
もっと具体的に言ってくれなきゃ分からない。
158 :
2017/01/04(水) 12:37:37.48 ID:FLMu+DIB
そういうのはとりあえず否定したいだけだからスルーでいいよ
回答なんか持って無いと思うし
159 :
2017/01/04(水) 13:56:51.11 ID:x5I82FL9
0x00がないと、どこまでもぉ って事だけで。
160 :
2017/01/04(水) 15:05:14.50 ID:CkccjIZ7
俺はとりあえずこんなのを提案する()


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 :
2017/01/04(水) 15:11:07.58 ID:8dyTsCQL
>>157
さすがにこれは説明要らんだろうと思うよ・・・。

「副作用完了点が2つ以上」って、 str++; str++; こんなのでアウトってことだからね。
162 :
2017/01/04(水) 17:51:37.32 ID:ku1IYB1y
んなこたーない
163 :
2017/01/04(水) 18:08:39.09 ID:issqqmbF
do while()って嫌いだから使わん
164 :
2017/01/04(水) 18:10:34.06 ID:dvUWMEVx
マクロのおまじないでも?

#define FOO() do { あーだこーだ } while(0)
165 :
デフォルトの名無しさん
2017/01/04(水) 18:15:56.08 ID:pxTed+R/
>>147
言いたいことはわかる気がするが、その文面は明らかに間違っているでしょ。

エスパーすると、
「副作用完了点と副作用完了点の間で、同一の変数を複数回変更する」
と、鼻から悪魔、かな?
166 :
デフォルトの名無しさん
2017/01/04(水) 18:17:44.69 ID:pxTed+R/
まだ甘いか。
「ある副作用完了点と、次の副作用完了点の間で、同一の変数を複数回変更する」
かな?
167 :
2017/01/04(水) 18:21:17.85 ID:83LRywdJ
gotoで地獄へ行くのをdo/break/whileに書き換えることができる。
...
goto hell;
...
goto hell;
...
hell: ...
return 0;
↓↓↓
do {
...
break;
...
break;
...
} while (0);
...
return 0;
168 :
2017/01/04(水) 19:49:00.69 ID:wOLmnoYC
>>157
人としての最低限の知能を持ち合わせて調べ直せば本人なら気付くレベルの時しか言っていないのでいつも本人からの訂正レスを待っているのだが、
何故か絶対に自分の発言を撤回したがらないようだ
169 :
2017/01/04(水) 21:37:54.73 ID:lUhJzh+Z
言われた方は言われた方で同じこと思ってるんだろ。だから具体的に指摘しなきゃ話が進まない。
170 :
2017/01/04(水) 22:12:54.91 ID:zg5YylVI
ピンポイントで間違い指摘されてんだから自分こそ根拠を述べろよ。
「副作用完了点が2つ以上」なんてどこにもねーんだから。
わかないよ〜ホレホレって荒らしたいだけ?
171 :
2017/01/04(水) 22:45:56.82 ID:by3GIgBn
>>157
さすがに >>147-148 だと >>147 の方に説明責任があると思う
172 :
2017/01/04(水) 23:27:27.83 ID:6PKdRVzk
MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ!

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

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

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

極端に言えば、1文1文、分離して書くこと。
バグが多く出る箇所は主に、マクロ・複合文・型違いの3つ
173 :
2017/01/04(水) 23:45:39.23 ID:xue+qv3N
> 勘違いしてないか?
とか
> 日本語おかしくないか?
とか言ってあげれば>>147も自分の間違いに気づけたんじゃないかなって思う。
174 :
2017/01/04(水) 23:48:11.13 ID:NgyPecWp
お前らちょっと温泉でも行ってこい
175 :
2017/01/04(水) 23:48:33.21 ID:8dyTsCQL
>>173 ちっとも具体的じゃないが、それでいいの?正直なにが違うのかわからん。
(日本語としてはまったく問題ないしな。)
176 :
2017/01/05(木) 00:16:26.21 ID:kU82p3Tw
> >>147
> 副作用完了点が二つ以上存在すること自体は問題ないだろ。
> 複数の副作用完了点で同じ変数を変更、参照するんのが問題なんだよ。
> 安易な気持ちで書き込みすんな。一生ROMってろ。

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

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

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

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

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

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

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

■ 環境
CentOS 6.4
GCC 4.4.7

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

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

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

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

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

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

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

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

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

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

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

Server: uuu
aaaaa
iiii
uuu

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

何気に愉快なIDだな
281 :
2017/01/29(日) 14:28:58.62 ID:XKehhdE4
質問です。
VisualStudio2015でReleaseビルドをしていたところ、生成されたEXEに気になる点がありました

if(false){
printf("hogehoge");
}

という処理を書いたところ、このprintfは到達不可能なのに、EXEの中に"hogehoge"という文字列が含まれていたのです。
※再現コードなのでhogehoeをprintしてなんの意味があるのかというコードですが

到達不能なのが明らかな部分は最適化で削除されるものだと思っていたのですが、何かしらの私の不手際でしょうか?
最適化は /O2オプションです
282 :
2017/01/29(日) 15:19:11.63 ID:DfD+S+Qh
>>281
/O4とかは?
283 :
2017/01/29(日) 15:31:20.39 ID:2ZaFXkbr
オプションによる不確定なものをどうして不手際と思ったのか謎
/O2 /GF-なら残る可能性高いし
284 :
2017/01/29(日) 17:04:30.90 ID:XKehhdE4
アドバイスありがとうございます

>>282
VisualStudioには無いようです。GCCにはあるようですが、ぐぐった限りだと効果はないようなことが散見されました

>>283
「不要なコードを削る」というのは、一番単純で効果が高そうなので、まっさきに確実に全除去してくれるだろうと思い込んでいたためです
この手のコードが最適化で消えないと、ifdefだらけになりそうなのですが、何か対策はないものでしょうか?
285 :
2017/01/29(日) 18:59:23.49 ID:K+/fnyLa
何かの理由があって残してるという事はないのかな・・・
286 :
2017/01/29(日) 19:49:35.57 ID:6wGEJq5M
>>281
普通に削除されて文字列もなくなるけど?
287 :
2017/01/29(日) 23:12:58.08 ID:XKehhdE4
>>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を返すだけの結果固定関数になるため、変数の割り当てすらしなくなるから?
288 :
2017/01/29(日) 23:42:21.35 ID:DuISdTe+
VS2015の環境を持っていないんで見当違いかも知れんが…。

#include <stdio.h> か #include <cstdio> を書いてみる。
char text[] = ... を const char text[] = ... にしてみる。

これらを(独立して)変えてみたら状態が変わらんかな?
printf()による副作用の可能性を考慮してtextを消さないのかも知れん。


もちろんprintf(&quot;hogehoge&quot;)を呼び出しても
引数になってないtextが読み書きされるはずはないんだけど。
289 :
2017/01/30(月) 00:05:47.51 ID:iVXSa+56
>>288
アドバイスありがとうございます
すいません。最小コードといいつつincludeをきちんと書いておりませんでした
#include <stdio.h>を最初に書いております
cstdioに変えてみて、各種パターンやってみましたが、変化は見られませんでした

次に、以下です
const char ではfoofooは消えませんでした
const static char に変えたところ、消えました

printfが、中でスタック消費量でも利用しているのかな…と馬鹿なことを考えて
char text〜をグローバル空間に出してみましたが、foofooは消えずです
290 :
2017/01/30(月) 13:26:01.87 ID:NFw8h2uH
>>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
291 :
2017/01/30(月) 17:50:38.46 ID:X+M9ocjS
つまり>>281は嘘つきってこと?
292 :
2017/01/30(月) 19:47:42.18 ID:p0U51Ig/
exeの中身まで気が回りませんわ
293 :
2017/01/30(月) 22:08:56.31 ID:mpXbeHjF
exeにビルド時のフルパスが埋め込まれてるとイラっとする
294 :
デフォルトの名無しさん
2017/01/30(月) 22:20:13.70 ID:XMGcU10o
デバッグビルドなら普通でしょ
295 :
2017/01/31(火) 02:46:33.99 ID:SZ8YrWi+
リリースビルドにして、最適化オプションを指定すれば?
296 :
2017/01/31(火) 09:17:11.64 ID:r8Cb1+5o
デバッグ情報を含めなければいいだけだしな
297 :
2017/02/01(水) 01:15:31.17 ID:lC8eLy+G
あるクラスに引数で渡されるオブジェクトのconstではない参照を持ちたいんですけどどのようにやればいいでしょうか
ポインタはなるべく使いたくないのですが
class A {
public:
void setParam(Param&);
private:
Param& m_param;
}
状況としては
あるクラスBがクラスAみたいなParamの参照を持つクラスを複数持っていて
クラスBがvector<Param>でParamの実体を持っているという感じです
298 :
2017/02/01(水) 01:25:10.63 ID:V+KME3Sb
ライフタイムと循環参照のもたらす悪夢を
全部避けられるように熟考しながら
shared_ptr / weak_ptr をどうぞ
Welcome to C++ nightmare!!
299 :
デフォルトの名無しさん
2017/02/01(水) 01:36:32.13 ID:nwC60mRJ
shared_ptrの何が難しいのか判らん。
shared_ptr程度で悪夢とか言ってたらswiftも使えなくない?
300 :
2017/02/01(水) 02:15:37.65 ID:V+KME3Sb
まぁ良く調べて使ってねってのを脅し効かせた程度です 
他の言語で参照カウント型のsmart_ptr解ってるなら 確かに大丈夫
301 :
2017/02/01(水) 12:17:29.74 ID:RxSebrTI
Windows10でBluetoothを使ったCOM通信を行いたく、
プログラムのほうはCOMポート通信のつもりで書き、
OSの設定でBluetoothに仮想COMポートを追加しました。

Androidとは問題なく接続・通信できたのですが、
Windows10同士ではうまくいきませんでした。
これは仮想COMポート作成するときに、どちらのPCも「受信」(相手側が接続を開始する)にしていたからだと思い、
片方を「送信」に変更しようとしました。
しかし、この場合は接続先PCを指定しなくてはならないのですが
対象PCが選択リスト内に出てこなくて作成することができません。
ペアリングはできているにもかかわらずです。

どうすればWin10PC同士でBluetoothを介したCOMポート接続・通信ができるでしょうか?
302 :
2017/02/01(水) 12:30:13.62 ID:HL/HxBhd
直接の解はわからないけど、ぐぐって見つかったので確認
ポート開くとき "\\\\.\\COM○○" (○は数字 \はエスケープ込み)
って開いてる?

ポート番号が1桁の場合に限り "COM○"でも開けるらしいけど、
そのコードの延長で 2桁渡すとそれは開けないから
303 :
2017/02/01(水) 12:49:42.61 ID:RxSebrTI
>>302
あ、はい。それはやってます。

今、わかったのですが、
一旦ペアリングを解除して、改めて「送信」COMポートを追加しようとすると、
先程までペアリングしていた対象PCが選択できるようになりました。

しかし今度は「選択されたデバイスでシリアルポートサービスが実行されていません。」と出て作成されません。
相手側に「受信」のCOMポートは作成済みなのですが…。
304 :
2017/02/01(水) 13:25:07.55 ID:HL/HxBhd
ttp://kokufu.blogspot.jp/2014/02/windows-bluetooth-spp-server.html
これとかの雰囲気だと
「受信」で作った側のPCのソフトを先に立ち上げて接続待ちにして(SPPサーバー)
「送信」で作った側のPCを後追いで接続 かなぁ
力になれなくてすまん
305 :
2017/02/01(水) 14:06:25.03 ID:RxSebrTI
>>304
いえいえ!
色々と調べていただいて参考になりました。

どうもシリアル接続サービスをサポートしていないようです。
今回の条件ではあまり好ましくないのですが、
WiFiを使ったソケット通信で妥協することにします。

ありがとうございました。
306 :
2017/02/01(水) 14:21:22.91 ID:+8V+I8xy
>>298-300
ありがとうございます
帰ったら勉強してみます
307 :
デフォルトの名無しさん
2017/02/01(水) 20:39:39.90 ID:3j6uP7e4
>>297
参照をメンバで持ちたい時は、コンストラクタでの初期化以外は無理。

class A {
public:
A(Param& x):m_param(x){}
private:
Param& m_param;
};
308 :
2017/02/02(木) 01:04:42.40 ID:CAgg+EtY
shared_ptr,weak_ptrのことで質問なのですが
自クラス2つを引数に取る+演算子をオーバーロードしているクラスMatrixを使って
func(std::weak_ptr<Matrix> m1, std::weak_ptr<Matrix> m2){
mat = m1 * m2;

}
みたいにやりたいんですが、オペランドに一致する演算子がないと言われます
shared_ptr,weak_ptrに入れた場合どのようにしてオーバーロードされた演算子を利用できますか?
309 :
2017/02/02(木) 01:27:35.78 ID:FXYEZ0RW
>>308
weak_ptr から shared_ptr を作って、それを通して参照すればいい
・・・んだけど、それ weak_ptr::expired() な場合にどうするつもりなん?
310 :
2017/02/02(木) 02:04:10.33 ID:CAgg+EtY
>>309
ありがとうございます
weak_ptrを使っている理由は
funcはあるクラスのメンバ関数で、引数で渡されたポインタの所有権をクラスが持たないこと示すためにweak_ptrを使っているのですが
weak_ptr::expired()な場合は想定していません
311 :
デフォルトの名無しさん
2017/02/02(木) 02:21:14.81 ID:ExAPXdhA
>>310
なんか根本的に勘違いしてる感が
const referenceの関数見たら中でポインタ持ち続けちゃう心配とかしてんの?
312 :
2017/02/02(木) 02:21:18.81 ID:EB2HJN86
スマートポインタはポインタのように振る舞うものだから
*や->でポインタの指す値にしなければならないよ
313 :
2017/02/02(木) 10:51:03.92 ID:335RX4F5
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サイズが期待しているよりも小さく、実行時に例外で強制終了します
314 :
2017/02/02(木) 12:49:56.83 ID:cH1kwi7M
例外を具体的に
315 :
2017/02/02(木) 13:18:13.30 ID:Nq0thOwX
>>314
> ハンドルされない例外がスローされました:読み取りアクセス違反。
> xxxxx が nullptr でした。
xxxxxはポインタ変数

exeサイズが小さいからリンクできてるように見えてリンクできてないのかなとは思うけど
libの追加方法を#pragma comment(lib,"")にしてもうまくいかずでどうしたらいいものか
316 :
2017/02/02(木) 18:40:08.32 ID:qO0hDPsp
>>313
> vcxprojを編集して複数の.objをincludeする
なんか色々勘違いしてないか?
317 :
デフォルトの名無しさん
2017/02/02(木) 18:48:07.72 ID:S7kpFPUA
>>316
そういう実験してるんでしょ。
それを他人に聞いて何か返ってくると思ってるのが間違ってる感があるけど。
318 :
2017/02/02(木) 19:11:39.98 ID:Eu4e1EaI
>>316
objからlibを作って動くならそれがいいのだけどその方法が分からない
lib.exeでobjからlibを作って使っても同じ状況
319 :
2017/02/02(木) 19:16:04.83 ID:WkIFQVuy
>>317
普通とは違うことをしているなと思ったが、実験しているのか
vcxprojを編集してソースコードではなくobjを用いるVSプロジェクトを作りたいのかな
320 :
2017/02/02(木) 19:18:03.73 ID:qhXDtbED
.c, .cpp から .lib 作るプロジェクト -(A)
そいつをリンクしつつ、 .c, .cpp から実行ファイルを作るプロジェクト -(B)
(参照設定とか依存関係とかで (A) を使うぜ俺 って指定する)
321 :
2017/02/02(木) 19:38:57.55 ID:WkIFQVuy
こんな感じだろ
ソースからobj生成: VSプロジェクトでなくていい
VSプロジェクト
1. objからexe作るVSプロジェクト (結果OK)
2. objからlib作るVSプロジェクト (3.がNGで、本当にうまくlib作れたかわからず)
3. 上のlibからexe作るVSプロジェクト (exeが例外でNG)
322 :
2017/02/02(木) 19:51:53.25 ID:Eu4e1EaI
>>321
まさにその状態
>>320の(A)が作れればいいけど、objファイルは数百プロジェクトの600ファイルぐらいあるから試そうにも数日かかりそうで避けたい
今は全プロジェクトまとめたソリューションあるけどリビルドだけで1時間以上かかる。簡単にexe作れるようにしたいというのが原点
323 :
2017/02/02(木) 20:22:53.95 ID:k638XiO/
そこまで行ったらDLLに分けるだろう
324 :
2017/02/03(金) 13:56:09.01 ID:3xPmzf3n
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を作る
325 :
2017/02/03(金) 13:56:30.01 ID:OeN1TpCU
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);
}
326 :
2017/02/03(金) 14:06:26.05 ID:S9UE3yae
nullptrはC++11からの機能だからですね
"gcc" -> "g++ --std=c++11"を使ってください

元のコンパイルは-lalutを指定していますが
そのプログラムならOpenALだけで大丈夫なので 下記で通ります
ライブラリをpkg-configに探させてるだけです

g++ --std=c++11 program.c `pkg-config openal --libs` -o program
327 :
2017/02/03(金) 14:55:43.86 ID:xVLuMTde
>>324
一般論で言えば同じはず。
ファイルサイズが小さいのなら正常にリンクできてない。
使ってない関数やクラスをリンクしてるわけじゃないよね
328 :
2017/02/03(金) 15:42:48.87 ID:3xPmzf3n
>>327
使ってるのも使ってないのもある

libの追加方法は二通り試したけどどちらもビルドエラーはでないけど実行時NG
どちらもlibの追加を省略すると外部シンボルが見つからないエラーでビルドが通らない

プロジェクトのプロパティの「追加の依存ファイル」から→実行時NG
ソースファイル中に「#pragma comment(lib,"")」から→実行時NG
329 :
デフォルトの名無しさん
2017/02/04(土) 00:14:20.36 ID:z/XsYQOx
何もしていない普通の一般人の自宅に隠しカメラを取り付け
それをネットでリアルタイム配信

仲間という人間に対する盗聴盗撮生ネット配信の会

しかけたカメラの映像
乗っ取っているPCの画像をリアルタイムで生配信中
集団で仲間の私生活を覗いて楽しんでいる

そんなことが今この国では行われています
330 :
2017/02/04(土) 05:54:43.47 ID:/r5Uxr2+
libでリンク解決してもダイナミックリンクにしてれば実行時にパス内に見つからずにエラー
スタティックリンクにしないと
331 :
2017/02/04(土) 09:51:58.52 ID:GdM1I4zb
久々にプログラミングしようと思うんですけど
USBカメラがあるからそれを使って監視カメラにしたいんだが
ピクセルデータが取れればあとは簡単だと思うんだけど、その前に
この適当に昔買ったバッファローのUSBからデータ取り出す事って可能なんですか?
332 :
2017/02/04(土) 10:24:35.81 ID:94H9RTyk
>>330
lib作るときのプロジェクトタイプはスタティックライブラリにしているけど、それとは別に設定であるのでしょうか?

>>331
「usbカメラ キャプチャ c++」で検索すると色々な方法が見つかるよ。よほど変なカメラ出ない限り仕様は同じだから使える
333 :
2017/02/04(土) 10:55:19.44 ID:GdM1I4zb
>>332
ありがとうございますだ
334 :
2017/02/04(土) 21:25:32.55 ID:uqEM2LY/
int a = 0;
int *b = &(1+a);
これが出来ないのはなぜですか?
1+aの計算結果というのはメモリ上のどこかにあると思うんですが
335 :
2017/02/04(土) 21:28:28.23 ID:sK4bvJ1n
>>334
CPUのレジスタには物理アドレスが無い。
336 :
2017/02/04(土) 21:31:18.24 ID:3pCbKNVT
&1 を許すとややこしいことになりそうだ
337 :
2017/02/04(土) 21:38:25.89 ID:wIflvrKT
>>334
計算結果はレジスタに入っててメモリには入ってないんじゃない?
338 :
2017/02/04(土) 21:52:37.41 ID:uqEM2LY/
>>335-337
なるほど、勘違いしてました
ありがとうございます
339 :
2017/02/05(日) 19:35:43.24 ID:ktep0Dpi
>>326
遅くなりすいません
できました
ありがとうございました
340 :
2017/02/05(日) 22:43:20.73 ID:F2ePDpTS
>337
レジスタがメモリじゃないかのようなアホレスだな
341 :
2017/02/05(日) 23:03:58.60 ID:wagcFIA6
レジスタのアドレスって・・・
342 :
2017/02/06(月) 01:31:32.48 ID:DI3VdQ+9
アドレスのないレジスタはCでアクセスできないからな
アセンブリでしてねになるからね
343 :
デフォルトの名無しさん
2017/02/06(月) 03:41:00.32 ID:oG8S/cPb
って言うかレジスタ関係なくね?
右辺値に対してアドレス取ろうとしてるから駄目なわけで。
344 :
2017/02/06(月) 05:58:55.21 ID:GvVdGH4O
>>334 の質問に対して「右辺値」を出すのは大げさじゃないかな。
もちろん正しいんだけど、詳細に踏み込みすぎというか、
その話はもっと理解が深まってから、というか。

「過去に自分がこの疑問を持ったときに、どんな説明をされたら
すっきり腑に落ちて先に進めただろうか」と思い返しながら回答してるんだろう。
345 :
2017/02/06(月) 08:21:18.53 ID:87jFG7WV
そもそも >>338 で本人納得してるのに
> レジスタがメモリじゃないかのようなアホレスだな
とか
> 右辺値に対してアドレス取ろうとしてるから駄目なわけで。
とかは知ったか自慢にしか見えない
346 :
2017/02/06(月) 08:58:46.99 ID:L0zP1ki7
間違った説明で相手を納得させておいて開き直りとはこれいかに
347 :
2017/02/06(月) 13:17:28.90 ID:WLH8uv6+
>>345
本人の納得は無関係
その二つどっちも誤り
348 :
2017/02/06(月) 20:21:28.41 ID:VJg+IRhi
>>345
> その二つどっちも誤り
でもどう誤ってるかは書けないんだよね w
349 :
2017/02/06(月) 20:22:09.67 ID:VJg+IRhi
>>348>>347 宛だったわ
350 :
デフォルトの名無しさん
2017/02/06(月) 20:58:58.36 ID:oG8S/cPb
>>344
でもさ、レジスタって言語と関係ないじゃん?
351 :
2017/02/06(月) 21:52:01.05 ID:w07g0Jpo
registerは予約語なのに無関係は無いわ
352 :
2017/02/06(月) 22:13:36.15 ID:rtwfNknd
>registerは予約語なのに無関係は無いわ
規格のどこを読んだら「register」キーワードと「レジスター」との関連が読みとれるんだか
353 :
2017/02/06(月) 23:29:15.59 ID:w07g0Jpo
規格厨には理解しろと言っても無理だ
354 :
2017/02/06(月) 23:45:37.66 ID:+fmEnPzx
>int a = 0;
>int *b = &(1+a);

っていうのが今intになってるからレジスタがどうとか言えるけど
intじゃなくて自分で定義したクラスとかだったらどうなんだって話だな
レジスタだからアドレスが取れないっていう説明はアレすぎないかい?
そもそもレジスタだけで済ませるかどうかはコンパイラの自由ってのもあるし
355 :
2017/02/06(月) 23:48:30.59 ID:tIYhS76V
一生懸命だなあw
356 :
2017/02/07(火) 00:11:08.64 ID:STnejiJM
俺が思うにさ
最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは
普通にありふれているわけじゃないですか
で、それらの変数のアドレスを取得するように
コードを書き換えたら、コンパイルエラーになるんですか?ってね
その場合ちゃんとコンパイラはメモリに実体を作るような動作になる
だからレジスタ云々はオプティマイズの話であって本質的に全く関係ないだろうと
レジスタに配置されているからアドレス取得できませんって意味不明で
だったらメモリに実体を作ればいくらでもアドレス取得できるだろって話なんだよ

どちらかというとこれは変数の寿命の関係でそうなっているんだよ
357 :
2017/02/07(火) 00:12:13.25 ID:vsDAW+dO
初心者向けの簡易な説明に外野がつまらない茶々入れて大騒ぎするなよ。
358 :
2017/02/07(火) 00:25:30.14 ID:pfKer2X+
>最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは
>普通にありふれているわけじゃないですか

本当にありふれてるのか?
359 :
デフォルトの名無しさん
2017/02/07(火) 00:48:05.62 ID:PI0qtNzz
winsock(UDP)を使ったプログラムを作っています。
ほぼできたのですが、数100回繰り返すと徐々に通信が
遅くなっていきます。
通信するたびに、オープンとクローズを繰り返しているのですが、
その辺に原因がありそうでしょうか・・・。
360 :
2017/02/07(火) 02:25:04.93 ID:e2fTv1VF
メモリを解放していないから、使用メモリがドンドン大きくなっていくとか?

プロセスの使用メモリを、チェックすれば?
361 :
2017/02/07(火) 07:22:03.04 ID:ff698yUf
>>354
> そもそもレジスタだけで済ませるかどうかはコンパイラの自由ってのもあるし
その自由さのために言語仕様でできないようにしてるだけでしょ
362 :
2017/02/07(火) 07:23:26.33 ID:ff698yUf
>>359
再現性あるならどこが遅くなってるかを調べたら?
363 :
2017/02/07(火) 07:43:41.13 ID:AbeSLyAt
>その自由さのために言語仕様でできないようにしてるだけでしょ

根拠は俺の「こうだったらいいな」
この理屈で行くとアドレスをとれる変数は
レジスタに乗せてはいけないことになるな
364 :
2017/02/07(火) 11:15:58.10 ID:bjgueVwS
register云々してるやつはCかC++か区別して書け
365 :
2017/02/07(火) 11:47:58.10 ID:+LdvU0fQ
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の内部を変えることでアクセスできるようにする方法ない?
366 :
2017/02/07(火) 11:52:35.77 ID:Ex9Qk6T0
public:
using A::xxx;
367 :
2017/02/07(火) 11:57:42.37 ID:+LdvU0fQ
>>366
おお!yyy()もそれでいけるね。サンクス
368 :
2017/02/07(火) 19:45:06.55 ID:R+lISOuU
>>364
register変数のアドレスを取る話をしてるわけじゃないのに
いきなりどうした
369 :
2017/02/08(水) 19:54:01.02 ID:zyGgo9zG
俺,register使ったことないが
register int a = 0;
int *b = &a;
とすると、b経由で割り当てられたCPUレジスタにアクセスできるのか?
370 :
2017/02/08(水) 20:15:16.32 ID:x9WXoVQQ
cではregister指定された変数のアドレスは取れない
c++では取ってもいいが、取ると普通はレジスタではなくメモリ割り当てになる

そもそもregister指定しても必ずレジスタ割り当てになるわけではない
今のコンパイラの多くはregisterを無視してるらしい
371 :
2017/02/08(水) 20:21:15.44 ID:6Dg3FALd
>>369
それ面白いけど実装がめちゃくちゃ大変だし、そもそもメリットないだろ
372 :
デフォルトの名無しさん
2017/02/08(水) 20:38:12.66 ID:Z1e//95W
C++では次のC++17(今年出る予定)から機能削除、かつ将来のためにキーワードは予約だよ
373 :
2017/02/08(水) 20:41:11.49 ID:039KZGQ+
register int a = 0;
int *b = &a;
これで b が a を格納してるCPUレジスタをポイントすると、
b++ とかした時に、どのレジスタを指すの? て話で困るんじゃないか。

int& b = a;
という具合に参照で受ければ何とか…。
374 :
デフォルトの名無しさん
2017/02/08(水) 20:43:52.35 ID:Z1e//95W
>>373
そんなの普通の変数だって未定義動作じゃん
375 :
2017/02/08(水) 20:47:07.07 ID:6Dg3FALd
>>373
> b++ とかした時に、どのレジスタを指すの? て話で困るんじゃないか。
ax 指してたら bx を指すようになる
dx 指してる時に b++ したらお約束の鼻から悪魔でいいだろ
376 :
2017/02/08(水) 21:02:48.15 ID:x9WXoVQQ
なんでx86前提なんだよ
実際出来ないんだから議論の意味ないが、出来たとしても実装依存だろ
377 :
2017/02/08(水) 22:06:39.93 ID:r8a3b7fC
>>374
おい馬鹿
int aho{};
int *p{&aho};
p++;
これが未定義動作などと規格のどこに書いてある?
378 :
2017/02/08(水) 22:23:33.67 ID:t4XC3Oio
p++ が動作未定儀か否かとは関係ない話だと思うが

ポインタの指し先を求めず、ポインタの演算と差分
 int a;
 int* p = &a;
 int* q = p + 1;
 q-p;

で 実体の要素数+1 までは正しく差分が取れることを保障している ってどっかであった記憶
379 :
デフォルトの名無しさん
2017/02/09(木) 02:31:40.69 ID:lnTHGhne
>>377
>>378
んなこた知っとるわ。どのレジスタを指すのかって言ってんだからポインタの先を参照する事前提だろ?
そうじゃなきゃ単に無理やり割り当てたアドレスに+1にすればいいだけ。指し示す先に何があるかなんて関係ない。
380 :
2017/02/09(木) 03:48:37.73 ID:WRm++DjL
int i;
int *ip=&i;
ip+1はほんとにあるんかい?
いやあるんだろうけどw
381 :
2017/02/09(木) 06:05:01.98 ID:4sYnDBFk
同等なレジスタを32個とか内蔵してて番号で区別する
RISCチップだと不自然でもない気がしてきた。
382 :
2017/02/09(木) 06:22:52.94 ID:ZHuRANtU
>>379
>>374 については?
普通の変数だって(指し先参照してないのに)未定儀動作とか言っちゃってるんですけど
383 :
2017/02/09(木) 06:42:00.30 ID:RO+sEjyT
>>376
> なんでx86前提なんだよ
お前の言うように実装依存なんだから例に決まってるだろ
68k なら d0, d1, ... ってもっと分かりやすいし他のプロセッサでも適当に決めりゃいいだけ
てか、ネタに突っ込むならもっと面白い奴にしてくれ
384 :
2017/02/09(木) 07:01:49.92 ID:RO+sEjyT
>>381
for(register int* r = &_r0; r < &_r32; r++){
*r = 0;
}
で、全レジスタがクリアできるとか便利かも
で r が _r3 辺りに割り当てられててバグるところまでがセットだよな w
385 :
2017/02/09(木) 12:57:20.22 ID:DuGTx+Z0
レジスタってそう多くないから別に…
SPARCのレジスタウィンドウ合わせて128個とかならまあ
386 :
2017/02/09(木) 14:24:27.76 ID:ZeoIDdik
つ ゼロページレジスタ
387 :
2017/02/09(木) 16:59:44.90 ID:m9bylyVb
register int a = 0;
int *b = &a;
としたとき、Cではアドレスが取れないって話だったが、C++では取れる
が、次期規格でregisterは無視されるようになる・・・って話だよね

ま、仮にアドレスを取ったとしても何も問題ないように思うが
というのも、CPUの演算は通常レジスタに対してしかできないし
一方でアドレスが取れるのはメモリにあるものだけなので
普通の変数もレジスタとメモリの間を最新の値が行ったり来たりしているのが通常で
コンパイラは矛盾が起きないようなコードを吐き出すように出来ている
だからregister指定要らないよねって話になってるだろう

そもそも、可能な限りレジスタに配置する、というのがあいまいで
レジスタは有限個なのでregister指定しても必ずしもレジスタのみに配置されるかどうか
分からないしCPUにもよる
ここで、アドレスを取ったらレジスタのみに配置することが出来ないのだから
register指定であっても、「可能な限りレジスタに配置する」が出来ないということで
普通の変数扱いということで問題ない
388 :
2017/02/09(木) 17:03:46.90 ID:XjHAaCWU
>次期規格でregisterは無視されるようになる・・・って話だよね

文盲は去れ
長文で荒らすな
389 :
2017/02/09(木) 17:18:48.08 ID:m9bylyVb
>372 名前:デフォルトの名無しさん[] 投稿日:2017/02/08(水) 20:38:12.66 ID:Z1e//95W [1/2]
>C++では次のC++17(今年出る予定)から機能削除、かつ将来のためにキーワードは予約だよ

は噓ということ?
390 :
2017/02/09(木) 17:24:14.08 ID:WRm++DjL
registerってのを使わなきゃいんでないのw
391 :
2017/02/09(木) 17:31:18.93 ID:aUQtcCRM
規格なんて知らんがレスから想像するとこうじゃないのか?

今の規格は「可能ならレジスタに割り当てろ」で、実際のコンパイラは無視してるのが多い
事実上機能してないから次期規格では仕様変えてregister変数やめる
392 :
2017/02/09(木) 17:50:34.94 ID:55oKC5Ju
C++ではすでにregisterは無視されてて、17からはエラーになるってことだろ
393 :
デフォルトの名無しさん
2017/02/09(木) 18:47:17.89 ID:lnTHGhne
C++11の時点でdeprecatedになってて
C++17で書いたらエラーになる
キーワードはいつか規格で何かに再利用するかもしれないから予約したまま(ユーザーが関数名などに使用出来ないまま)。
394 :
デフォルトの名無しさん
2017/02/09(木) 19:03:26.16 ID:QPpApk6a
395 :
2017/02/09(木) 20:05:28.75 ID:IuYXl6Zl
>>393
registerについては、再利用の可能性というより、混乱の元だから今後は誰も触れてくれるなってところかな。
396 :
2017/02/09(木) 20:34:41.55 ID:wAatsUnZ
今、キーワードとして問題ないからそのままにしておくってことだろ
一旦キーワードでなくしてしまうと将来また使いたくなった時に大混乱するから
397 :
2017/02/09(木) 20:46:05.15 ID:WRm++DjL
C++17なんてもあるのか。 ついてけんわぁ
398 :
2017/02/10(金) 12:36:17.18 ID:yPTk9ivW
register使うなら今のうち
399 :
2017/02/10(金) 16:29:47.71 ID:gDFEqThI
C++17以降のregisterは、ガチャガチャチーン!とbeep音を鳴らします
400 :
2017/02/11(土) 17:45:33.84 ID:B6KA1QDA
Mingwのgccでこんなのためしたら結構はやくなるのね。C++だと速度変わらんかったけど。
#include <windows.h>
#include <stdio.h>
int main(void) {
register int i;
DWORD t;
t = GetTickCount();
for(i=0 ; i <100000000 ; i++);
printf("%d\n",(int)(GetTickCount()-t));
return 0;
}
401 :
2017/02/11(土) 17:50:28.59 ID:o1zrWG0U
registerネタどんだけ続けるんだ
402 :
2017/02/11(土) 18:02:59.72 ID:Ka66uAeU
>int main(void) {
> register int i;

変数を先頭で宣言しないと精神の安定が保てない病気
403 :
2017/02/11(土) 18:27:32.77 ID:2x1BPms4
っくっだらないとこでも叩いておかないと精神の安定が保てない病気
404 :
2017/02/11(土) 18:51:03.55 ID:jl0P82O4
インデントや{}のスペース・改行でも自分のやり方と違うと喚きそうだなw
405 :
2017/02/11(土) 19:53:33.79 ID:7HNC8OW9
>>404
違和感がでるよね。
会社でこれがうちのスタイルって強制され、それになじむと
そうじゃないスタイルのものは気持ち悪いって感じるようになった

>for(i=0 ; i <100000000 ; i++);
最近のコンパイラはまじめにやらないで、コンパイル時にiは使ってないあるね
処理省くニダってして実行コード生成してなさそうな気がするが。
406 :
2017/02/11(土) 19:59:07.05 ID:nnf0vKBy
K&R2 あたりにあわせておけば問題ないのでは?
というか,K&R2 から大幅に変えさせられるのは苦痛だな
407 :
2017/02/11(土) 21:18:53.92 ID:vquAI+Jk
21世紀にもなってK&Rとか何の冗談
変化が苦痛な老人はすっこんでて
408 :
2017/02/11(土) 21:22:09.84 ID:e+WRwiZx
409 :
2017/02/11(土) 21:51:35.00 ID:o1zrWG0U
21世紀に相応しいスタイルを是非教えてくれ
410 :
2017/02/11(土) 22:42:56.52 ID:2x1BPms4
可能な限りC/C++使わない
それが21世紀スタイル
411 :
2017/02/11(土) 22:58:24.73 ID:nOWXV3w9
>>410
おいおい、でも、それが正しいな。
412 :
2017/02/12(日) 02:53:21.48 ID:guRObziH
正しいけど"可能な限り"の範囲がまだまだ足りない
組み込みの世界はC言語が強過ぎて未だにC++すら使えない環境がざらにあるしな
413 :
2017/02/12(日) 08:33:11.98 ID:XNCDxJ48
>>407
C/C++ くらいなら,K&R2 に準拠にさせてよー C#, Java も,とはいわないからさー
414 :
デフォルトの名無しさん
2017/02/12(日) 08:43:31.97 ID:MRPxQTsD
>>413
C++を入れるなよ
415 :
2017/02/12(日) 10:10:03.29 ID:nF2JpTw9
結局C言語で全て済んでしまうからね。他は趣味。はっきりわかんだね
416 :
2017/02/12(日) 14:01:05.04 ID:XNCDxJ48
>>414
いっしょだよ,C++ も普通に K&R2 に似せて書くのが一番いい
417 :
2017/02/12(日) 15:47:27.43 ID:CF268nsq
>>402 の「ブロック先頭で変数を定義するのは時代遅れ」ていう
指摘を受けての流れじゃないかな。

最初の使用の直前まで変数定義を遅らせることができる、
というC++での改良や、それを取り込んだC99以降で
わざわざK&R2版の書き方に制限されるのは困るという話。

おそらく、K&R2に似たスタイルが良いという主張も
「新しく追加された便利機能は使った上でK&R風のスタイル」
という意図なんだと思う。
418 :
2017/02/12(日) 15:59:10.19 ID:rZ/K+l3Q
>>400はiの宣言を先に、tよりも先にすることで、何を試したのかってのをわかりやすくしてんだろ
K&Rなんかにこだわるよりもこういうソースの方がいいわ
419 :
2017/02/12(日) 17:25:00.92 ID:XNCDxJ48
>>417
当然だ
420 :
2017/02/13(月) 00:11:12.09 ID:ebN6PGVD
使う直前に変数を宣言してるとたまにgoto出来ないerrorが出るのが面倒くさい
421 :
2017/02/13(月) 11:51:26.73 ID:M86uydzz
ブロックの違う同名変数の取り違えでトラブってるのを見てから
宣言位置が不揃いなのもよくないと思うようになった
422 :
2017/02/14(火) 01:24:51.99 ID:xlM9Sf4d
それは宣言位置の問題じゃなくて、1ブロックが大き過ぎることが原因じゃないか?
423 :
2017/02/14(火) 08:51:02.57 ID:SrPWZnE2
スコープ違う同名の変数を書いたら間違えた
 ↓
宣言位置をスコープの先頭に揃えておけば俺はきっと気づけたんだ!

これがバカの思考
424 :
デフォルトの名無しさん
2017/02/14(火) 09:10:51.81 ID:MfKEp5BT
お前等が宣言位置を先頭に揃えておかなかったから俺が間違えたんだ

とまでいかなければまだ許せる。
425 :
2017/02/14(火) 09:11:22.01 ID:H0Zx0irg
スコープ違う同名の変数を書いたら間違えた
 ↓
次から気をつけよう!
 ↓
またミス

>>423はこのタイプ
426 :
デフォルトの名無しさん
2017/02/14(火) 09:16:00.91 ID:MfKEp5BT
423じゃないが間違えたことないな
どうやったら間違えるのか教えて欲しいくらい
427 :
2017/02/14(火) 09:25:27.92 ID:he6YB8dM
多分ブロックごとコピペしてたまたまエラーが出なかったんだろ
428 :
2017/02/14(火) 09:37:58.47 ID:tRUBGDEd
世の中には1関数が1000行を超える糞コードが存在するからな
そんな糞コードに後から修正入れようとすると信じられないようなミスも起こる
429 :
2017/02/14(火) 10:07:10.54 ID:H0Zx0irg
関数の長さと糞さは別だな
無理に短くしてあちこち飛ぶコードの読みにくさったらありゃしない
430 :
デフォルトの名無しさん
2017/02/14(火) 10:25:24.18 ID:ze+N1Rxh
短いからといって読みやすいはとは限らないが、
長いと読みにくいのは確実なので無関係ではないな
431 :
2017/02/14(火) 12:52:20.45 ID:8LvI494R
>>429
1行目と2行目で矛盾してるぞ
432 :
2017/02/14(火) 15:01:49.07 ID:Y4N6R9g2
短く を目標にはしないが、長いと
どうしても何かの力を感じてw
短くしたくなるわなぁ
433 :
2017/02/14(火) 15:19:01.37 ID:t9BEI7G/
必死にprivate関数で小分けにしてた頃を思い出すわ
気にしなくなってprivate関数の存在価値がよく分からなくなった
434 :
2017/02/14(火) 15:31:24.51 ID:Y4N6R9g2
privateとその長さは関係ないと思うが
435 :
2017/02/14(火) 17:04:37.50 ID:lntB2yLX
俺も429派かなぁ
特に再利用するようなものでもないのに関数に小分けにしてもあまり意味がないし
仮に1000行あったとしても、制御構造が単純で上から下へ逐次実行するだけだったり
プログラムの読みにくさと関数の長さは根本的に関係ないと思う
関数の長さに関係なく単純に、
仕様が複雑で、ややこしいことしている箇所は、やはりややこしい
難しいアルゴリズムを使っている個所は、やはり難しい
436 :
2017/02/14(火) 17:07:50.38 ID:lntB2yLX
そうはいっても100行を超える関数はさすがに書いたことないけどな
クラスビューとかでジャンプできなくなるから作業性に問題が出る
437 :
2017/02/14(火) 17:12:21.40 ID:lntB2yLX
100行と書いたけど、それは1000行のまちがいだ
100行を超える関数は普通に書くことがあるな
新しいC++になってからラムダが関数内関数の代わりに使えるようになったから
こういったものを駆使すると長い関数を書いても比較的に問題が出にくくなったってのはある
メソッドにするとクラス空間が汚れるから関数内関数の方がよい場合も多々
438 :
2017/02/14(火) 19:47:15.52 ID:vv2eSSm9
100行超える関数はほとんど書かないけど、
100行超えるコメントはしょっちゅう書くな。
439 :
2017/02/15(水) 01:17:06.93 ID:xbLGAB7Z
名付けに困らないくらいの単位で処理を纏めて上にポイだな
無名ネームスペース大活躍

再利用しなくても処理を分けとくとバグを潰しやすいし
440 :
2017/02/16(木) 04:06:20.95 ID:6VkTpxSR
ラムダ 入門 で検索しても簡単なサイトが見つかりません。
どこか良いサイトか書籍はありませんか。
441 :
2017/02/16(木) 04:13:34.86 ID:0dItl/ZH
入門しなきゃならん奴が使うもんじゃない
442 :
2017/02/16(木) 04:38:21.71 ID:6VkTpxSR
443 :
2017/02/16(木) 12:45:23.20 ID:SkhlZoRn
よくわからんもの
ラムダ式、関数オブジェクト
444 :
2017/02/17(金) 04:01:51.58 ID:/gNkD5d3
#include <iostream>
using namespace std;
int main() {
unsigned char aa=0x31;
cout << hex<<aa <<endl;
return 0;
}
なんで 31 と表示されないのでしょう
445 :
2017/02/17(金) 05:25:27.96 ID:Z2r3IJRX
たぶん 1 が表示されるでしょ。
aa が char だから出力ストリームでは文字が出る。
数値を出したければ aa を int で定義するか、
cout のところで int にキャストしてやらないと。
446 :
2017/02/17(金) 07:07:08.11 ID:39ud/5Wb
>aa が char だから出力ストリームでは文字が出る

因果関係がよくからないのですがcharだとなぜ文字がでるの?
447 :
2017/02/17(金) 07:22:25.14 ID:fOTzzkTG
>>446
渡した値の型によって、それをどう表示するかが異なるように作られているから。
printfという関数で出力する場合は、出力したい値のほかにそれをどういう形式で出力するかという情報を別に与えていたけど、iostreamでは、型で自動的に処理してくれる。
448 :
2017/02/17(金) 07:52:16.70 ID:+UDZhFA4
uint8_tとか使ってるとき嵌るんだよなぁ。
449 :
2017/02/17(金) 07:53:27.01 ID:Z2r3IJRX
「C++では引数の型や個数が異なる同じ名前の関数をいくつも定義できて
引数の型や個数に応じた別々の動作にできる」
「関数引数の変数値が(Cとは異なり)自動的にはintに格上げされない」
くらいしか説明の文面を思いつかないけど、我ながら分かりにくいな。

coutに対する<<演算子(を実行する関数)が、
charの引数に対しては文字を、intの引数に対しては数値を
出力するよう上手いこと作られている。
ってのは「昔からそう決まっとる」式の押し付けがましい感じだし。
450 :
2017/02/17(金) 15:18:41.50 ID:/gNkD5d3
>>445
ども 書いた後、すぐintでやったらわかった。
"<<" 系の入出力演算子とビットシフトの問題も同じ理由か。
451 :
2017/02/17(金) 17:04:51.60 ID:xoJSqgdl
VC++の質問です。
フォームのコントロール(ボタンなど)をアンマネージクラスに保持する方法が知りたいです。

// コンストラクタの引数より、ラベルのコントロールをprivateに保存し、setLabelTextでラベルのテキストを変更するクラス
class LineController
{
private:
  System::Windows::Forms::Label^* label_;
public:
  LineControllerSystem::Windows::Forms::Label^% label);
  void setLabelText(System::String^ str); // label_のTextに引数strを設定。
};


最初に表示されるフォームのコンストラクタにて上記のクラスをnewし、そのクラスインスタンスをアンマネージクラスのシングルトンに保存しています。
シングルトンに保存直後に、シングルトン経由でsetLabelTextメソッドを実行した場合は正常label_のTextを変更可能でした。
しかしボタンクリックイベント内にて、同様にシングルトン経由でsetLabelTextをコールするとlabel_へアクセスしたタイミングで「オブジェクト参照がオブジェクト インスタンスに設定されていません。」が発生してしまいます。

本エラーを回避するにはどのような手法をとればよいでしょうか?
追跡参照(%)などを調べているのですが現状解決の糸口が見えません。
シングルトン及び上記LineController自体はできればマネージにしたくないです。。。
452 :
2017/02/19(日) 11:23:25.68 ID:2DCCXMeS
C++の話題そのものではないのですが
バブルソートとか初歩的なアルゴリズム
を優しく解説している書籍はありませんか。

Amazon見てるのですがもう少し情報がほしいです。
453 :
2017/02/20(月) 01:05:36.35 ID:aWzwD2VT
>>452
ピタゴラスイッチでバブルソートやクイックソートの概念をグラフィカルに紹介してたよ。
それはさておき、本屋の店頭でアルゴリズムとかデータ構造とかがタイトルに含まれる本をパラパラめくって分かり易いのを探すといいかと思う。
454 :
2017/02/21(火) 00:15:43.57 ID:OFTvUoLj
とあるOSSをとあるシステムに移植していて、
Intel(2013)やGNU(4.9系)ではコンパイルできるのに
そのシステム専用コンパイラではコンパイルできずエラーになります。
ソースコードやヘッダファイルを修正すれば通るだろうというのは経験的にわかっているのですが
どこを修正したらよいかというのを見つけ方がわからないのですが見つけ方のコツみたいなのはあるのでしょうか?
455 :
2017/02/21(火) 00:32:08.81 ID:fcoMqi2n
エラーメッセージの意味を考えろ
456 :
2017/02/21(火) 01:18:37.30 ID:9fQxfYbZ
>>454
エラーメッセージを見ないことには回答のしようがないと思うぞ

まぁ、専用のコンパイラという言い回しから察するに、C++03程度しかサポートしていない古いコンパイラでも使ってるんじゃないか?
エラーが出ている行の周辺でC++11以降の言語機能か、ライブラリでも使ってんじゃね?
457 :
2017/02/21(火) 01:18:57.64 ID:bFUDo/lz
>>454
ともかく、
そのシステム専用コンパイラ提供しているところに、世界標準のIntel(2013)やGNU(4.9系)ではコンパイル
出来るのにお前のものではできないから出来るようにしたコンパイラをよこせと激しくクレーム
458 :
2017/02/21(火) 01:32:37.44 ID:bFUDo/lz
>>456
C++11いっぱいのコードをC++03に修正するって大変そうだな
459 :
2017/02/21(火) 06:31:57.51 ID:OFTvUoLj
>>456
>>457
メッセージは
「オーバーロードされた関数"HOGE"のインスタンスが引数リストと一致しません。」
みたいな感じです
一応C++11準拠でGNU4.9一部互換とされてるコンパイラですが。。。
460 :
2017/02/21(火) 08:12:09.46 ID:9fQxfYbZ
>>459
HOGEが想定している引数型と実際に渡している引数の型を確認
違うやつが犯人

これ以上は情報少なすぎてわからん
461 :
2017/02/21(火) 15:33:32.84 ID:rWOcc73c
一般論としてどういうことに注意したらいいですかって質問じゃなくて、具体的に解決してもらいたいってことなのかよw
462 :
2017/02/21(火) 22:19:07.17 ID:OFTvUoLj
>>460
intelコンパイラで作ったオブジェクトをnmコマンドで中見て
こうあるべきという形がわかったんであとは頑張ってみる
463 :
2017/02/21(火) 22:24:52.45 ID:qEEiXXQS
HOGEの中にHAGEが紛れ込んでるんだな
464 :
2017/02/22(水) 07:28:41.35 ID:F7TE97aZ
>>453
有難うございます。
田舎ですので大きな書店には距離があります
が、行ってみます。
465 :
2017/02/22(水) 11:11:49.24 ID:T1tKwjPz
>>459
テンプレートが悪さしてるか const の取りこぼしかデフォルト引数のミスが起きているとエスパー
466 :
2017/02/22(水) 19:03:10.40 ID:7bpb3LbA
printf("%s",buf);

fputs(buf,stdout);

どっちが好き?
467 :
2017/02/22(水) 19:20:15.64 ID:JmFr9wbV
違う処理のコードを並べてどっちと言われても
468 :
2017/02/22(水) 19:49:35.49 ID:OuXxGo6B
>>467みたいな人が居るのでprintfかな
469 :
2017/02/22(水) 20:00:39.94 ID:G8P7P0/x
どっちも最後に使ったの20年ほど前かな
470 :
2017/02/22(水) 21:09:01.14 ID:T1tKwjPz
puts とか使ったことないわ
471 :
2017/02/22(水) 21:30:22.88 ID:Z0Pf8P/J
>>469
ログ出力・エラー出力がメインでstdoutはあんまり使わないよな
472 :
2017/02/22(水) 21:36:43.56 ID:3nEefUGO
putsは改行してくれるんで好きだな。fputsも。
473 :
2017/02/22(水) 21:39:49.82 ID:mKcPOHkg
>>472
fputsは改行を追加しない
474 :
2017/02/22(水) 21:51:09.45 ID:3nEefUGO
>>473
あ そうだった。 すまん
475 :
2017/02/23(木) 00:12:45.93 ID:oHheANLP
細かいのを大量に出したいときはprintfは遅い
476 :
デフォルトの名無しさん
2017/02/23(木) 18:17:55.29 ID:2nyak89s
class CL{
CL(int _d, string _s) : d(_d), s(_s)
{

}
public:
int d;
string s;

};
int _tmain(int argc, _TCHAR* argv[])
{
CL *cl = new CL(555, "a");←ここでエラー。なんで?
477 :
デフォルトの名無しさん
2017/02/23(木) 18:23:14.57 ID:sZtROie8
>>476
こんすとらくたがprivateだから
478 :
デフォルトの名無しさん
2017/02/23(木) 18:23:56.57 ID:2nyak89s
そういうことかあ
あざす
479 :
2017/02/23(木) 21:15:37.70 ID:JF3nU8GT
生成出来ないクラスってやつね。
480 :
2017/02/23(木) 21:50:10.15 ID:33+Wu0JT
>>479
friend なクラスからしか生成しないようにするとかはあるね
481 :
2017/02/23(木) 21:52:15.77 ID:JF3nU8GT
はい そゆ事。
482 :
2017/02/23(木) 21:53:15.53 ID:0FbQfq3V
staticメソッドで生成するって形の時に使うことが多い
singletonとか
483 :
2017/02/23(木) 22:20:39.38 ID:v0zRNZ3l
ctorはpri.でメンバーはpub.って
どういうことなんだ?
484 :
2017/02/23(木) 22:26:42.14 ID:I6Uc1mEc
一つ前のレスも読めない文盲
485 :
2017/02/23(木) 22:44:21.27 ID:SD8t1ALL
質問
C/C++でランタイムで現在のメモリの状態
とくにプロセスが使える余っているメモリの量って調べ方はありますか?
486 :
2017/02/24(金) 08:45:12.70 ID:SswDvM4l
環境すら書かないと言うことは
(実質)環境非依存での方法を聞いてるんだろうな?
487 :
デフォルトの名無しさん
2017/02/24(金) 08:54:02.15 ID:See/JzpM
そんなもん無いけどな
488 :
2017/02/24(金) 09:53:13.79 ID:0sr6h+Re
失敗するまでmallocやnewを繰り返せばええんや
489 :
デフォルトの名無しさん
2017/02/24(金) 10:43:32.63 ID:See/JzpM
>>488
Linuxじゃ失敗しないよ
490 :
デフォルトの名無しさん
2017/02/24(金) 10:53:37.11 ID:See/JzpM
もたろん割り当てるアドレス空間自体が足りなくなったとか、予め上限を設定しておいたとかいうケースは覗いてな
491 :
2017/02/24(金) 11:09:14.16 ID:9xRtAprE
16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。

それはわかる。

逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
492 :
2017/02/24(金) 11:41:21.86 ID:KhjrQy0g
基本的にでっかくメモリ確保というプログラムは作った事がないな。
今はSTLでほげほげ追加してくイメージ。
493 :
デフォルトの名無しさん
2017/02/24(金) 11:47:17.85 ID:See/JzpM
>>491
>16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。
そうとは限らない。一般的なLnuxの環境依存ではmallocを搭載メモリ以上行っても失敗しない
swap含めて1GBしか積んでいない環境で2GB分malloc可能。確保した領域に書き込んだタイミングで記憶する領域が足りなくなったら色々なプロセスが殺される。oom killerと言われてるもの。
>
逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
実装による。現代的なコンピューターではページ単位(4KB)とかでカーネルからプロセスへすきなアドレスへメモリを割り当てられるから物理的なアドレスが連続している必要はない。
プロセス内に連続したアドレス空間が残っていない場合は失敗する
494 :
2017/02/24(金) 11:52:16.13 ID:NAh96dM2
仮想メモリというしくみで色々やってくれるようになって
キャパの限界付近ではややこしくなった印象
495 :
2017/02/24(金) 12:48:55.46 ID:KhjrQy0g
家鯖は6G積んでるけどそれぐらいは行けるね。
てかkvmやってると、9Gコミットされてるもん。
496 :
2017/02/24(金) 15:10:06.50 ID:CcmE3pWB
>>488
それスワップエリアのサイズ計ってるだけ
497 :
2017/02/24(金) 15:25:25.94 ID:nwaeFCKh
winならGetProcessMemoryInfoなど
498 :
2017/02/24(金) 17:26:32.84 ID:9xRtAprE
>>493
> 物理的なアドレスが連続している必要はない
なるほど、長年の疑問が解消した。
493の読解力に感謝。
499 :
デフォルトの名無しさん
2017/02/24(金) 18:02:34.91 ID:See/JzpM
>>498
望む答えだったみたいで良かったわ
熱があって若干朦朧とした頭で読み返さずに書き込んだから今読み返すと誤字とか予測変換で要らない単語入ってたり(一般的なLinux環境)とか、カッコの位置が違う(4KBとかの部分)とかあったけど。
500 :
2017/02/24(金) 18:52:48.08 ID:dfRROZm/
環境依存ならPostMessageのエラーコードかな
俺はあんま理解してないけど
501 :
2017/02/24(金) 19:06:57.61 ID:+aOqx8nq
Win32なら信頼のPostMessageだな
502 :
2017/02/24(金) 22:16:12.34 ID:4ewDjGBZ
またその話題ですか‥
503 :
2017/02/24(金) 23:03:49.77 ID:TLhS+9k8
はよ10年前のソース出せよ
504 :
2017/02/24(金) 23:06:00.45 ID:nwaeFCKh
505 :
2017/02/25(土) 07:21:27.70 ID:98TUEskp
なんで2分ちょいで出てくるかね。
506 :
2017/02/25(土) 08:14:13.74 ID:QoR/O5Qa
自演
507 :
2017/02/25(土) 08:21:08.89 ID:Jm21gNIW
>>503>>504 だ。すまんなw
508 :
2017/02/26(日) 18:42:59.30 ID:stmjd5mD
味噌県のクセにコーミソース以外のソースを使う非国民は去れ
509 :
2017/03/06(月) 07:57:48.79 ID:NqblWJNK
#define ChannelBlend_SoftLight(A,B) ((uint8)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A>>1)+64))*(float)(255-B)/255))))
このマクロの
(2*((A>>1)+64))
この部分なんですが
なんで(A+128)じゃないんですかね?
510 :
2017/03/06(月) 08:21:33.22 ID:1XvIZqGa
最初の人がコピペで作ったんでしょ。+128に定義し直してるのもあるよ
511 :
2017/03/06(月) 08:30:32.82 ID:cJfBjMIV
Aが奇数のときの動作が違うね
512 :
2017/03/06(月) 10:33:08.69 ID:NqblWJNK
A、Bにはuint8を想定してますから、一瞬オーバーフローの関係かなとも思いましたが
そんなことはなく、特に深い意味はなさそうですね
ありがとうございます
513 :
2017/03/13(月) 00:19:03.26 ID:ZWBqluXH
仮想関数をオーバーライドするときはどう書くのがいい作法?
void vf()
virtual void vf()
virtual void vf() override
void vf() override
514 :
2017/03/13(月) 06:06:33.92 ID:IkDDkkqX
ハゲ先生によると最後の void vf() override が良いみたい。
『プログラミング言語C++ 第4版』p.592

加えてoverride指定の不整合をチェックするコンパイラオプションだね。
GCCのVersion 5から使える -Wsuggest-override とか。
他のコンパイラについては知らん。
515 :
2017/03/13(月) 10:43:38.74 ID:Kr7xjXLG
デストラクターに付けてる人はあんま見たこと無いな
class Derived : Base {
public:
 ~Derived() override {}
};
516 :
2017/03/13(月) 20:30:08.38 ID:VNPYsRzK
Bcc55でtypeofを実現するのは不可能なのかな?
517 :
2017/03/13(月) 20:57:04.03 ID:VNPYsRzK
古いコンパイラを使ってる人居る?
コンパイラの名前教えて下さい。
518 :
2017/03/14(火) 23:30:09.48 ID:wzywZVIy
老人がカセットテープデッキ求めたり
熟女モノのエロ本()を求めるような感じ?
519 :
2017/03/15(水) 01:04:07.22 ID:R2Ueow1p
古いコンパイラと自覚しつつも使ってるような人はこのスレには来ないだろ
時代遅れの遺物の話じゃ通じないし
520 :
2017/03/17(金) 11:46:00.03 ID:pwo5j4El
何でA、Bを()しないんだ?
521 :
2017/03/25(土) 21:37:15.77 ID:IRaGixDk
いまだに関数マクロ使ってるようでは
()したところで五十歩百歩
522 :
2017/03/25(土) 22:37:56.47 ID:9zWIhzFx
>>460
>>465
宣言とかいろいろ確認してやっぱソースはおかしくないよねってことで
サポートに調べてもらったら理由はわからないけど正しく動作する修正方法がわかったって連絡があって
最終的には詳細は書けないけどコンパイラのバグだった
523 :
2017/03/26(日) 08:58:38.45 ID:4rESVRzB
ここはお前の日記を垂れる場所じゃない
「サポートによるとコンパイラのバグだった」で済むのに
アレやってコレやってを書くな低能
524 :
2017/03/27(月) 10:03:34.57 ID:wSWIgauQ
事後報告あると参考になっていいんだけどな
今回は本人以外に状況がわからないから事後報告されてもw
177KB

新着レスの表示

★スマホ版★■掲示板に戻る■全部前100次100最新50

名前:E-mail: