エスケープシーケンスや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/
【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
2016/11/06(日) 22:58:02.60ID:dU5z27As
2016/11/06(日) 23:23:55.86ID:AHO3vAwR
>>3-1000は射精魔
2016/11/07(月) 09:27:53.95ID:vooGYje+
2016/11/07(月) 09:34:35.19ID:dSd+kVnH
何がしたいのかわからないので回答しようがないな
2016/11/07(月) 09:36:19.79ID:dSd+kVnH
あ、初期化子か
インデントがないから見間違えた
インデントがないから見間違えた
2016/11/07(月) 09:38:54.66ID:e8hpdnod
引数の int b[] って int* b と同じやしなぁ
2016/11/07(月) 09:47:42.61ID:HQzTq5fm
std::array
2016/11/07(月) 12:11:29.58ID:56hqYy7l
C++11以降なら
A(int (&b)[2]) : a{b[0], b[1]} {}
A(int (&b)[2]) : a{b[0], b[1]} {}
2016/11/07(月) 14:52:37.34ID:fwwW9lIx
だがint b[2][3]はポインタ引数は・・・
2016/11/07(月) 14:56:04.42ID:6MsAvbZq
↑幻覚をみた糖質のつぶやき
12デフォルトの名無しさん
2016/11/07(月) 15:00:49.14ID: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();
}
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();
}
2016/11/07(月) 18:18:06.75ID:hOJqMng1
1413
2016/11/07(月) 18:21:04.82ID:hOJqMng1 2行目「6個より多く」だったね
2016/11/07(月) 18:44:55.40ID:3Xim9e5h
2016/11/07(月) 19:07:23.45ID:hOJqMng1
要求は固定長の配列であって、動的に増やせるようにしろとは言ってないので
それのコードは非効率にしかならないと思うよ
それのコードは非効率にしかならないと思うよ
2016/11/07(月) 19:25:01.70ID:fwwW9lIx
2016/11/07(月) 19:50:01.21ID:Z2RT26Su
2016/11/07(月) 20:07:47.59ID:Z2RT26Su
ID:hOJqMng1 の主張の変遷
1.わざと大きい初期化子を与えると実行時にアクセス違反になると主張
→だから動的に対応できるようにした
2.すると今度は非効率的だからarrayを使えという
→arrayが特に効率的なわけではないし、今度は「要求は固定長の配列だ」と言い出す
どう考えても言ってることがコロコロ変わってるんだが
1.わざと大きい初期化子を与えると実行時にアクセス違反になると主張
→だから動的に対応できるようにした
2.すると今度は非効率的だからarrayを使えという
→arrayが特に効率的なわけではないし、今度は「要求は固定長の配列だ」と言い出す
どう考えても言ってることがコロコロ変わってるんだが
20デフォルトの名無しさん
2016/11/07(月) 21:12:34.93ID:L762Pvtq !!喧嘩の予感!!
2016/11/07(月) 21:25:52.93ID:nZ1H9hgf
A() : a{b[0], b[1]} {}がダメだった人にC++11を押しつけてどーすんだ
>>12に至ってはもとの質問と全然関係ねーし
>>12に至ってはもとの質問と全然関係ねーし
2016/11/07(月) 21:26:20.26ID:Rr8tj+hR
VC++で、マウスオーバーで色が少し変わって、クリックしたら沈んだみたいになる画像ボタンを作るにはどうしたらいいですか?
2016/11/07(月) 22:16:57.66ID:hOJqMng1
2016/11/07(月) 22:20:22.76ID:JXtVbtZ4
>>21で結論でてるじゃねえか
C+11を押し付けてる時点でおまえら全員ダメだ!
C+11を押し付けてる時点でおまえら全員ダメだ!
2016/11/07(月) 23:34:44.46ID:lMECrzfj
いいぞ、もっとやれ〜♪
2016/11/08(火) 00:32:16.33ID:t0HdCoBm
沸点低すぎワロタw
2016/11/08(火) 00:33:05.07ID:2SYrs2Uf
2016/11/08(火) 15:38:54.44ID:FW358liz
using std;
int main() {
int a;
cout<< "数を入力してください" <<endl;
cin>> a;
cout<<a <<"ですね?" <<endl;
}
aを確実に入力させたくて困っています
ご教授ねがいます
int main() {
int a;
cout<< "数を入力してください" <<endl;
cin>> a;
cout<<a <<"ですね?" <<endl;
}
aを確実に入力させたくて困っています
ご教授ねがいます
2016/11/08(火) 16:03:34.41ID:j/2yZvJO
まず確実ってなんやねん
数以外だったり未入力は弾くってか
数以外だったり未入力は弾くってか
2016/11/08(火) 16:26:08.25ID:FW358liz
そうです
未入力で無限ループみたいに表示されて困っています
未入力で無限ループみたいに表示されて困っています
2016/11/08(火) 16:26:29.50ID:Or+T0geg
教示ならしてやっても良いが、教授はお断りだ
2016/11/08(火) 16:58:49.59ID:sBMnjDSh
>>28
http://ideone.com/dpolU5
一応単なる改行や数字で始まらない文字列は弾くようにした
ただしコメントにも書いてあるけど 123def みたいな数字で始まる文字列を
入力したときは数字だけ返すんでそれが駄目なら自前で作るしかないね
http://ideone.com/dpolU5
一応単なる改行や数字で始まらない文字列は弾くようにした
ただしコメントにも書いてあるけど 123def みたいな数字で始まる文字列を
入力したときは数字だけ返すんでそれが駄目なら自前で作るしかないね
2016/11/08(火) 17:22:56.70ID:FW358liz
2016/11/10(木) 10:52:07.29ID: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が戻り始めるのでしょうか?
あまりに初心者な質問ですみません。
#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が戻り始めるのでしょうか?
あまりに初心者な質問ですみません。
2016/11/10(木) 11:03:28.04ID:6ImFpJhK
引数だけ書くと
0+1
1+1
・・・
9+1
ここまではprintfまで来ないまま再帰
9+1でifに入らないからrecurseからリターン
printfがiを表示(9)してリターン
printfがiを表示(8)してリターン
の繰り返し
0+1
1+1
・・・
9+1
ここまではprintfまで来ないまま再帰
9+1でifに入らないからrecurseからリターン
printfがiを表示(9)してリターン
printfがiを表示(8)してリターン
の繰り返し
3634
2016/11/10(木) 11:07:42.28ID:8ULjF/bN >>35
早速のレスありがとうございます。
>9+1でifに入らないからrecurseからリターン
ということはmain関数のreturn 0でプログラムは終了してしまうのではないですか?
なぜprintfが呼ばれるのかわからんのですが。(iが減算される理由もわかりません)
早速のレスありがとうございます。
>9+1でifに入らないからrecurseからリターン
ということはmain関数のreturn 0でプログラムは終了してしまうのではないですか?
なぜprintfが呼ばれるのかわからんのですが。(iが減算される理由もわかりません)
3734
2016/11/10(木) 11:12:33.48ID:8ULjF/bN if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}
で
recurseとprintfは同じifブロックに入っているので、ifが偽なら両方共スキップされると思うのですが、
なぜprintfだけ呼ばれるのでしょうか?
recurse(i + 1);
printf("%d " , i);
}
で
recurseとprintfは同じifブロックに入っているので、ifが偽なら両方共スキップされると思うのですが、
なぜprintfだけ呼ばれるのでしょうか?
2016/11/10(木) 11:20:27.66ID: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 から戻る
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 から戻る
2016/11/10(木) 11:28:04.25ID:6ImFpJhK
>>37
9+1で入って偽で抜けたら
8+1で入ってきたif内のrecurseから抜けて次のprintfが実行されて抜ける
8+1で抜けたら7+1で入ってきたif内のrecurseから抜けて次のprintfが実行される
の繰り返し
9+1で入って偽で抜けたら
8+1で入ってきたif内のrecurseから抜けて次のprintfが実行されて抜ける
8+1で抜けたら7+1で入ってきたif内のrecurseから抜けて次のprintfが実行される
の繰り返し
4034
2016/11/10(木) 11:40:24.95ID:8ULjF/bN2016/11/10(木) 12:42:30.91ID: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);
と見えてくると思うよ
と
書いてから再帰呼び出し printf("%d ", i); recurse(i+1);
の違いとか
呼び出しの出入りを整理する
printf("in:%d\n", i);
recurse(i+1);
printf("out:%d\n", i);
と見えてくると思うよ
2016/11/10(木) 13:57:04.04ID:gEXUDT4B
なんか遠回りな説明ばかりだな
スタックフレームというキーワードを出してやれよ
スタックフレームというキーワードを出してやれよ
4340
2016/11/10(木) 14:01:09.75ID: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からなのはなぜなのでしょうか?
>再帰呼び出し後に書く 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からなのはなぜなのでしょうか?
2016/11/10(木) 14:02:24.39ID:69ogPHI/
再帰でどう動いてるか理解するのに
スタックフレーム出されても困らないか? 値の保持の実装でそうなってるってだけだし
スタックフレーム出されても困らないか? 値の保持の実装でそうなってるってだけだし
2016/11/10(木) 14:09:10.79ID:gEXUDT4B
この手の人は、具体的な実装例を見さえすれば、すぐさま疑問が解消されるんだよ
>>43でも「待機する」だとか
なんで逆順になるのか分からないとか
言っているが
スタックフレームさえ知れば全ての疑問は解決だし
C/C++するのにスタックフレームさえ知らない状態だと
このさき困難だろう
>>43でも「待機する」だとか
なんで逆順になるのか分からないとか
言っているが
スタックフレームさえ知れば全ての疑問は解決だし
C/C++するのにスタックフレームさえ知らない状態だと
このさき困難だろう
2016/11/10(木) 14:10:50.73ID:69ogPHI/
おっけー まかせた
2016/11/10(木) 14:18:39.78ID:gEXUDT4B
待機する、って言い方を見るに、何かキューのような物を連想しているようだし
実際、なんで逆順になるか分からないと発言しているわけだが
答えは関数呼び出しはキューではなくスタックだから、と言う他ない
キューやスタックという言葉の意味が分からなかったとしても
どのみちこれらも覚える必要のある最も基本的な事の一つだから
合わせて覚えればよいだろう
コンピュータの基本動作もよくわからないままプログラムを書くということは
多言語ではあり得るのかもしれんが、とりわけここはC/C++スレだからね
実際、なんで逆順になるか分からないと発言しているわけだが
答えは関数呼び出しはキューではなくスタックだから、と言う他ない
キューやスタックという言葉の意味が分からなかったとしても
どのみちこれらも覚える必要のある最も基本的な事の一つだから
合わせて覚えればよいだろう
コンピュータの基本動作もよくわからないままプログラムを書くということは
多言語ではあり得るのかもしれんが、とりわけここはC/C++スレだからね
2016/11/10(木) 14:26:03.17ID:gEXUDT4B
いや、俺は別に何も説明するつもりはないよ
ただ、スタックフレームというキーワードをだね
そうすれば後は本人が検索するなりなんなり、勝手に調べるだろう
キーワードが分からなきゃ検索も出来ないから、キーワードを出してやれという話
スタックを知らずして再起呼び出しの動作を理解するのは非常に困難というか
質問者は関数呼び出しがキューのようなものであると考えている可能性が高いようだけど
実際にはスタック動作だよ、と
ここを勘違いしていたら、答えにたどりつかないかなぁと
ただ、スタックフレームというキーワードをだね
そうすれば後は本人が検索するなりなんなり、勝手に調べるだろう
キーワードが分からなきゃ検索も出来ないから、キーワードを出してやれという話
スタックを知らずして再起呼び出しの動作を理解するのは非常に困難というか
質問者は関数呼び出しがキューのようなものであると考えている可能性が高いようだけど
実際にはスタック動作だよ、と
ここを勘違いしていたら、答えにたどりつかないかなぁと
2016/11/10(木) 14:29:55.54ID:6ImFpJhK
>>42
最短の説明で教えてあげてくれ任せた
最短の説明で教えてあげてくれ任せた
5040
2016/11/10(木) 14:33:22.38ID:8ULjF/bN スタックフレームで検索して見たところ、
ttp://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node9.html
このページが一番わかりやすそうです。
LIFOなんで新しい関数と引数が上の方に積み上がっていくと考えれば良いのでしょうか?
first outなんで実効は新しい順(つまり今回の例の場合はi=9)ということですね。
スタックフレームという言葉で検索したらおもしろそうなサイトがたくさん出てきました。
皆さん今回はありがとうございました。
ttp://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node9.html
このページが一番わかりやすそうです。
LIFOなんで新しい関数と引数が上の方に積み上がっていくと考えれば良いのでしょうか?
first outなんで実効は新しい順(つまり今回の例の場合はi=9)ということですね。
スタックフレームという言葉で検索したらおもしろそうなサイトがたくさん出てきました。
皆さん今回はありがとうございました。
2016/11/10(木) 14:51:19.03ID:IzCfpVGN
>>43
まず大前提としてプログラムの流れは1本道で別れたりしないし、待機みたいなことも普通しない
そして再帰関数という特別な関数があるわけではない、recurseは普通の関数と何も変わらない
void recurse(int i)
{
if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}
}
この4行目はrecurseという関数を呼び出している
つまり自分自身を呼ぶのでこの4行目の呼び出し後、recurse関数の最初に戻る
ただし引数iは1大きい値で呼ぶ
これを入れ子のように10回繰り返すことになる
まず大前提としてプログラムの流れは1本道で別れたりしないし、待機みたいなことも普通しない
そして再帰関数という特別な関数があるわけではない、recurseは普通の関数と何も変わらない
void recurse(int i)
{
if(i < 10) {
recurse(i + 1);
printf("%d " , i);
}
}
この4行目はrecurseという関数を呼び出している
つまり自分自身を呼ぶのでこの4行目の呼び出し後、recurse関数の最初に戻る
ただし引数iは1大きい値で呼ぶ
これを入れ子のように10回繰り返すことになる
5243
2016/11/10(木) 15:05:17.38ID:8ULjF/bN >>51
レスありがとうございます。
ttps://ipa-zone.info/page-2644/
このページに私が使っている独習Cの再帰の部分が丸ごと転載されているんですが(違法?)、
i=0~10と昇順で増加していく前半部分でも呼び出された関数(recurse(1)など)は終了した訳ではないですよね?
後半のi=10から降順で減少していくときにはじめてprintfが実行されて関数が終了すると思うんですが、
LIFOなんで最後に呼び出されたrecurse(9)からrecurese(0)まで降順で残ったprintfを実行していくということではないんですか?
レスありがとうございます。
ttps://ipa-zone.info/page-2644/
このページに私が使っている独習Cの再帰の部分が丸ごと転載されているんですが(違法?)、
i=0~10と昇順で増加していく前半部分でも呼び出された関数(recurse(1)など)は終了した訳ではないですよね?
後半のi=10から降順で減少していくときにはじめてprintfが実行されて関数が終了すると思うんですが、
LIFOなんで最後に呼び出されたrecurse(9)からrecurese(0)まで降順で残ったprintfを実行していくということではないんですか?
2016/11/10(木) 15:15:27.68ID: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なのだ
難しく考える必要は無い
関数を呼び出すとき、自分が今何をしていたかをそっくりそのまま保存した状態で
新たにスタックを確保して、呼び出した関数を実行する
関数の実行が終わると、使っていたスタックを開放して
呼び出される前に実行していた処理に復帰する
ちょうど君が
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なのだ
2016/11/10(木) 15:18:47.59ID:17noS2hU
長い。あとビデオ見ながら電話に出れるだろ
2016/11/10(木) 15:21:50.96ID:3AXwvnI0
ポインタを返すラムダをstd::functionで取り扱いたくて調べてるのだが
どうしてどの参考例もintやvoidの例しか示していないのだろう
参考例を示すまでもなく誰でも簡単に記述出来ているのだろうか
どうしてどの参考例もintやvoidの例しか示していないのだろう
参考例を示すまでもなく誰でも簡単に記述出来ているのだろうか
2016/11/10(木) 20:21:43.62ID:CLfGjB35
2016/11/10(木) 20:31:23.31ID:AQTsjJgJ
文盲はお帰りください
2016/11/10(木) 21:49:48.84ID:cv2N5dvt
std::function<int*(const int)> create_array = [](const int n)->int*{ return new int[n]); };
でいいんじゃないの
誰かdeleteすんだよと思うけど
でいいんじゃないの
誰かdeleteすんだよと思うけど
2016/11/10(木) 22:03:01.49ID:AQTsjJgJ
>誰かdeleteすんだよと思うけど
自覚があるならそんな変な例を出さなければいいのに
自覚があるならそんな変な例を出さなければいいのに
61デフォルトの名無しさん
2016/11/10(木) 23:23:35.24ID:wCaAZ9DK >>60
じゃあお前が適切な答え書いてやれよ
じゃあお前が適切な答え書いてやれよ
2016/11/10(木) 23:41:59.59ID:AQTsjJgJ
>>55の回答はこんな感じでいいだろう
using ptr_type = void *;
std::function<ptr_type ()> f1{ []{ return ptr_type{}; } };
std::function<void *()> f2{ []{ return static_cast<void *>(nullptr); } };
using ptr_type = void *;
std::function<ptr_type ()> f1{ []{ return ptr_type{}; } };
std::function<void *()> f2{ []{ return static_cast<void *>(nullptr); } };
2016/11/11(金) 01:01:22.47ID:JQalwGbJ
2016/11/11(金) 01:15:39.30ID:tUBqvL6G
う〜んどうだろうね
よく見るとラムダの戻り値の型が省略されているし
こういったことがどの段階のC++のバージョンで出来るようになったのか
俺は知らないが、実際の戻り値の型からラムダの型を推測してくれる便利機能
を使っていると思われる
となれば、キャストなしのnullptrでは型がわからないから
ラムダの戻り値の型の推測もできず、コンパイルエラーになるのではないだろうか
よく見るとラムダの戻り値の型が省略されているし
こういったことがどの段階のC++のバージョンで出来るようになったのか
俺は知らないが、実際の戻り値の型からラムダの型を推測してくれる便利機能
を使っていると思われる
となれば、キャストなしのnullptrでは型がわからないから
ラムダの戻り値の型の推測もできず、コンパイルエラーになるのではないだろうか
2016/11/11(金) 01:36:59.83ID:tUBqvL6G
もしくは、ひょっとしたらnullptrには何らかな特殊な型が与えられているのかもしれんが
それはしらないが、ともかくvoid*型ではないのは確かなので
その場合でもstd::function<void *()>への代入で問題を起こすんだろう
nullptrに型が有るのか無いのか、俺は知らんし、興味もないんだけどね
それはしらないが、ともかくvoid*型ではないのは確かなので
その場合でもstd::function<void *()>への代入で問題を起こすんだろう
nullptrに型が有るのか無いのか、俺は知らんし、興味もないんだけどね
2016/11/11(金) 01:48:43.11ID:v3r+B2af
2016/11/11(金) 01:56:19.58ID: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とかでも同様なんですかね
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とかでも同様なんですかね
2016/11/11(金) 02:04:25.89ID:JQalwGbJ
>>65
nullptrの型はnullptr_tだよ
だからラムダの戻り値の型はnullptr_tと推論される
ただ問題はvoid *を戻り値としたfunctionに代入できるか
ぶっちゃけ俺も書いてからやっちまったかと思って調べた
規格を調べたところやはり要らなかった
戻り値が暗黙変換できれば代入できると書いてある
つまりラムダの戻り値intでfunctionはdoubleとかもあり
そして当然nullptrはvoid *型に暗黙変換できる
なので要らない
https://ideone.com/EwRvlU
>>67の結果とも一致する
nullptrの型はnullptr_tだよ
だからラムダの戻り値の型はnullptr_tと推論される
ただ問題はvoid *を戻り値としたfunctionに代入できるか
ぶっちゃけ俺も書いてからやっちまったかと思って調べた
規格を調べたところやはり要らなかった
戻り値が暗黙変換できれば代入できると書いてある
つまりラムダの戻り値intでfunctionはdoubleとかもあり
そして当然nullptrはvoid *型に暗黙変換できる
なので要らない
https://ideone.com/EwRvlU
>>67の結果とも一致する
2016/11/11(金) 07:16:38.23ID:hk5EgzxW
2016/11/11(金) 08:09:52.28ID:JclCvFO1
ID:tUBqvL6Gは希にみる健常者
2016/11/11(金) 08:32:07.55ID:JclCvFO1
>nullptrに型が有るのか無いのか
この手の文法で型が無い落とし穴は初期化の { } ぐらいか
int a = {0}; // 「{0}」は式でなく型も無い
この手の文法で型が無い落とし穴は初期化の { } ぐらいか
int a = {0}; // 「{0}」は式でなく型も無い
2016/11/29(火) 23:30:19.59ID:7z8mZ0fw
さすがにCは時代に取り残された感があるな
新規案件なら埋め込み系を除いて存在意義なし
新規案件なら埋め込み系を除いて存在意義なし
2016/11/30(水) 02:47:51.57ID:Ir3oZvjK
寂しいですなぁ
74デフォルトの名無しさん
2016/11/30(水) 02:56:49.99ID:a9ciiDR7 う、埋め込み…
75デフォルトの名無しさん
2016/11/30(水) 04:02:07.30ID:tfyAgmME 組み込み系って英語ではembedded なんちゃら だし
よくある間違いでしょ
よくある間違いでしょ
76デフォルトの名無しさん
2016/11/30(水) 05:21:32.16ID:sG3uRZRm 韓国ではよくあるんだ。
2016/11/30(水) 05:53:32.74ID:/gnC384r
埋めるのは中国の得意とする技術
2016/11/30(水) 21:26:32.85ID:ncjk4kan
linuxのカーネルモジュールてC++で書けるようになったんだっけ?
2016/11/30(水) 22:16:09.74ID:Yeu32peW
ドライバとかはサブシスは普通に書いてるぽい、コアな部分はメンテナがパニクルのでやっぱCかと
2016/12/01(木) 11:40:38.39ID:OWujHEiH
実際ひと目でいいからソース見てみ
一生C++なんか使わねーという主張がにじみ出てるよ
一生C++なんか使わねーという主張がにじみ出てるよ
2016/12/01(木) 12:49:06.43ID:yfw1GD74
C++使わなくていいならそれに越したことはないからね
2016/12/01(木) 13:16:49.42ID:VWu2OAFy
c++は個人差が大きすぎるようです。議論も出来ない。
方向がコンフリクトしたら大変なのは ここ見てればわかる。
方向がコンフリクトしたら大変なのは ここ見てればわかる。
2016/12/03(土) 01:01:12.94ID:62YFpmrs
C++はマングリングとかややこしいから
2016/12/03(土) 20:56:34.75ID:nmEGc+VH
マンコリング
2016/12/11(日) 20:30:30.03ID: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は無しでスタックのみを使用できれば、なお良いのですが、
良い方法が思いつきません。
何かスマートな方法は有りませんか?
既存の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は無しでスタックのみを使用できれば、なお良いのですが、
良い方法が思いつきません。
何かスマートな方法は有りませんか?
2016/12/11(日) 20:55:16.41ID:Cd8ql2jy
元関数の length が uint32_t 単位での個数という仮定
→ uint32_t より小さい粒度は取り扱えない
→ uint16_t で取り扱える個数は偶数個に限定される
→ ポインタのキャストと length を /2 で渡すだけ
→ uint32_t より小さい粒度は取り扱えない
→ uint16_t で取り扱える個数は偶数個に限定される
→ ポインタのキャストと length を /2 で渡すだけ
2016/12/11(日) 21:42:00.21ID:74mAoGAM
uint16_tの方がラッパーなの?
どちらにしろ元の関数をそのまま使うなら変換は必要だね。
スタックが使われるかどうかはしらないけどClangコンパイラなら
可変長配列(VLA)っていうのがC++でも使えたはず。
サイズが大きすぎるとオーバーフローするけど。newと兼用してみるのも手。
どちらにしろ元の関数をそのまま使うなら変換は必要だね。
スタックが使われるかどうかはしらないけどClangコンパイラなら
可変長配列(VLA)っていうのがC++でも使えたはず。
サイズが大きすぎるとオーバーフローするけど。newと兼用してみるのも手。
8885
2016/12/12(月) 22:47:53.10ID:lLNqHCIY2016/12/13(火) 07:43:47.25ID:vJwCdf+q
組み込みでスタックに可変長のデータ領域確保するとか頭大丈夫?
2016/12/13(火) 18:19:51.83ID: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);
}
組み込みのことは知らないんだけど、サイズチェックして分岐するのはどうなん?
if (length * sizeof(uint32_t) < 32767) {
uint32_t list[length];
Test(list, length);
}
else {
uint32_t list = new uint32_t[length];
Test(list, length);
}
2016/12/13(火) 19:22:51.41ID:vJwCdf+q
2016/12/15(木) 21:00:06.98ID:iypiqTM3
ガチの初心者でプログラミング勉強したいと思ってるんですが
プログラミング勉強するとなるとどんなものから作り始めればいいですかね?
ちなみにCの基本的なこと(if,for文やファイル入出力)くらいしか知りません
プログラミング勉強するとなるとどんなものから作り始めればいいですかね?
ちなみにCの基本的なこと(if,for文やファイル入出力)くらいしか知りません
2016/12/15(木) 22:16:52.10ID:esEF0eVo
やっぱり画像が出たら楽しいから画像ビューアとかが良いんじゃないかな
画像が動いたらもっと楽しいって言うんならゲームもよいんじゃない?
音関係も楽しいんだが、サウンドプログラミングは結構専門知識がいるうえ
デバッグが難しいから最初は手を出さないほうが良いよ
ま、画像ビューアや動画プレイヤーが楽しいよ
ちょっとした実用性もあるし
画像が動いたらもっと楽しいって言うんならゲームもよいんじゃない?
音関係も楽しいんだが、サウンドプログラミングは結構専門知識がいるうえ
デバッグが難しいから最初は手を出さないほうが良いよ
ま、画像ビューアや動画プレイヤーが楽しいよ
ちょっとした実用性もあるし
2016/12/15(木) 22:22:14.89ID:KqXo4C+P
Cであることに特に意味がないのなら別の言語の検討をすすめる
2016/12/16(金) 06:44:53.82ID:cbHo8vE5
javaも悪くないと思いますよ。
2016/12/16(金) 08:53:37.09ID:hCzygT3G
>>92
プログラミングを習得した延長線上に何を作りたいか決まってる?
プログラミングを習得した延長線上に何を作りたいか決まってる?
2016/12/16(金) 08:59:07.35ID:2kpKp/Uz
>>92
作りたいプログラム(今ならアプリケーションというのかな)の
イメージが先にないとアドバイスしにくい時代なのよ。
まずコンソールに hello, world を表示して、続いて標準入出力、
ソートやらリンクド・リストやらのアルゴリズムを習得して…
という順序を踏んでも、「マウスをクリックすると何かしてくれる」ような
今様のプログラムには少しも近づかないんだな、これが。
作りたいプログラム(今ならアプリケーションというのかな)の
イメージが先にないとアドバイスしにくい時代なのよ。
まずコンソールに hello, world を表示して、続いて標準入出力、
ソートやらリンクド・リストやらのアルゴリズムを習得して…
という順序を踏んでも、「マウスをクリックすると何かしてくれる」ような
今様のプログラムには少しも近づかないんだな、これが。
2016/12/16(金) 09:22:43.83ID:R8KZSjOU
2016/12/16(金) 09:23:43.35ID:R8KZSjOU
100デフォルトの名無しさん
2016/12/16(金) 09:30:19.30ID:R8KZSjOU101デフォルトの名無しさん
2016/12/16(金) 09:52:11.47ID:hCzygT3G102デフォルトの名無しさん
2016/12/16(金) 11:19:48.12ID:O1fw7E0o103デフォルトの名無しさん
2016/12/18(日) 22:40:31.25ID:rTzEq7cO c++でGUIな何かを作るときどうやるのが普通?どうやるのがおすすめ?
趣味嗜好全開でいいから教えてくれ
趣味嗜好全開でいいから教えてくれ
104デフォルトの名無しさん
2016/12/18(日) 22:46:05.73ID:eNcCSvTp ビルド時間とバイナリサイズが気にならないならwxWidgets
105デフォルトの名無しさん
2016/12/18(日) 22:56:35.56ID:TyHJy95g 真面目にその条件なら.NETだけどそれなら言語はC#でやった方がよいと思う
自分は自分用のWIN32APIを使ったGUI用のライブラリ作ったけど完全に時代遅れだとは思ってる
自分は自分用のWIN32APIを使ったGUI用のライブラリ作ったけど完全に時代遅れだとは思ってる
106デフォルトの名無しさん
2016/12/18(日) 23:56:09.22ID:psse/iGW wxWidgetsよさそうやね
クロスプラットフォームってのがいい
クロスプラットフォームってのがいい
107デフォルトの名無しさん
2016/12/19(月) 08:41:19.51ID:K+bb4qm0 vcを使うという事ですか
108デフォルトの名無しさん
2016/12/20(火) 08:43:24.96ID:/4ZK922w >>103
ターゲットのOSとかPC/ケータイとかライセンスとか軽さとか見比べて
GUIフレームワークを選ぶ
Qt は重いけどマルチプラットフォームかつ見た目がいいから人気
Windowsのみなら C# が迷わなくて済むけどね
時代遅れを気にしないなら VC+MFC の情報は多いw
他にもいろいろある
ターゲットのOSとかPC/ケータイとかライセンスとか軽さとか見比べて
GUIフレームワークを選ぶ
Qt は重いけどマルチプラットフォームかつ見た目がいいから人気
Windowsのみなら C# が迷わなくて済むけどね
時代遅れを気にしないなら VC+MFC の情報は多いw
他にもいろいろある
109デフォルトの名無しさん
2016/12/24(土) 19:03:48.07ID:Xnn//JuE FILE *fp;をグローバル変数にしてたら落ちまくって、ローカル変数にしたら落ちなくなった現象は何でですかね?
グローバルかローカルか関係ない気がするんですけど。
Windows7、Visual Studio 2015
グローバルかローカルか関係ない気がするんですけど。
Windows7、Visual Studio 2015
110デフォルトの名無しさん
2016/12/24(土) 19:04:08.51ID:Xnn//JuE これで4時間近くハマった。
111デフォルトの名無しさん
2016/12/24(土) 19:11:41.00ID:0UyY/BKM グローバルな FILE *fp の近く(若いアドレス)に置かれた
グローバルな配列の範囲オーバーじゃないかしら。
グローバルな配列の範囲オーバーじゃないかしら。
112デフォルトの名無しさん
2016/12/24(土) 20:06:31.12ID:TihFoldF113デフォルトの名無しさん
2016/12/24(土) 20:27:17.35ID:DNE92dFu fileno とか ferror は確認した?
114デフォルトの名無しさん
2016/12/24(土) 20:34:23.48ID:y7L7nGQ6115デフォルトの名無しさん
2016/12/24(土) 21:00:46.23ID:yr6q9nVG fpがどんな値になろうと最悪でもエラー検出するだけだから
落ちるのはまともにエラー判定してないせい
落ちるのはまともにエラー判定してないせい
116109
2016/12/24(土) 21:14:49.73ID:Xnn//JuE117デフォルトの名無しさん
2016/12/25(日) 01:18:26.20ID:vsDUBYtf 気付くだけ立派だわなぁ
118デフォルトの名無しさん
2016/12/25(日) 07:00:04.87ID:iLmpV78q mallocで確保した領域の溢れがグローバルな変数を壊すってのは
ちょいと解せない気もする。
DOSの頃なら互いに影響しあうことも普通だったろうけど、
最近のOSだと別に管理してそう。
内部の詳しいことは知らないけど。
ちょいと解せない気もする。
DOSの頃なら互いに影響しあうことも普通だったろうけど、
最近のOSだと別に管理してそう。
内部の詳しいことは知らないけど。
119デフォルトの名無しさん
2016/12/25(日) 09:26:05.12ID:SibbJTGE >>118
お前はもう少し勉強してから書き込むべき
お前はもう少し勉強してから書き込むべき
120デフォルトの名無しさん
2016/12/25(日) 09:43:40.82ID:CGvp0k11 エミュとかアドレスを固定してるけどどうやってんの?
121デフォルトの名無しさん
2016/12/25(日) 16:56:04.10ID:xlX3oF2t 質問です
エラーになってしまいます
教えて下さい
C++11です
int n=0;
string hage="s"+n+".png";
エラーになってしまいます
教えて下さい
C++11です
int n=0;
string hage="s"+n+".png";
122デフォルトの名無しさん
2016/12/25(日) 17:03:23.30ID:YVZO5C9V "s"と".png"はconst char*型なので+は無理
123デフォルトの名無しさん
2016/12/25(日) 17:09:24.52ID:xlX3oF2t そうなんですか…
ありがとうございました
ありがとうございました
124デフォルトの名無しさん
2016/12/25(日) 22:48:16.54ID:oxH1mE2q125デフォルトの名無しさん
2016/12/26(月) 01:40:19.72ID:Us2MOZON >>121
標準で用意されているのはstringとstring/char/char*間のみ(operator+)
なので+するのをintでなくstringにすればいける
C++11ならto_stringがあるから次ので問題ない
string hage = "s" + to_string(n) + ".png";
細かい書式設定とかしたいならsstreamかsnprintfあたりで
標準で用意されているのは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.29ID:w1n6Bp69 >>124
それじゃ起動毎に変わるんじゃね?
それじゃ起動毎に変わるんじゃね?
127デフォルトの名無しさん
2016/12/26(月) 09:21:17.58ID:5lDUjv3x 起動毎にホスト上でのメモリ配置が変わっても
エミュレータの駆動機構で >>124 のように
エミュレーションする対象の仮想コードのアドレッシング → ホスト環境の実メモリ
の変換テーブル経由なら問題は発生しないべ
エミュレータの駆動機構で >>124 のように
エミュレーションする対象の仮想コードのアドレッシング → ホスト環境の実メモリ
の変換テーブル経由なら問題は発生しないべ
128デフォルトの名無しさん
2016/12/26(月) 12:36:41.62ID:bq11e3Cp129デフォルトの名無しさん
2016/12/26(月) 16:52:23.77ID:vHVIx8+p ASLRのことなら、無効にする事が出来る
130デフォルトの名無しさん
2016/12/27(火) 00:09:30.60ID:hMHSnQwo >>127を分かりやすく言うと配列みたいなもんだ。
int foo[5];
と宣言すれば、起動毎に確保されるアドレスは違うが、
例えば3番目のアドレスには必ず&foo[3]でアクセスできる。
これと同じ。
int foo[5];
と宣言すれば、起動毎に確保されるアドレスは違うが、
例えば3番目のアドレスには必ず&foo[3]でアクセスできる。
これと同じ。
131デフォルトの名無しさん
2016/12/28(水) 09:29:29.21ID:jHXCJg+4 OggVorbisの使い方を教えてください。
動的リンクライブラリとしてリンクして、
WAVEデータをリアルタイムでOggVorbis形式(CBR)に変換したいです。
VS2015です。
一応ググりましたがどこから手を付けてよいか分かりませんでした。
動的リンクライブラリとしてリンクして、
WAVEデータをリアルタイムでOggVorbis形式(CBR)に変換したいです。
VS2015です。
一応ググりましたがどこから手を付けてよいか分かりませんでした。
132デフォルトの名無しさん
2016/12/28(水) 11:23:40.53ID:BmYU7N0Q ttps://xiph.org/doc/
ここから必要な文書を探して読んで理解するのが本筋
ここから必要な文書を探して読んで理解するのが本筋
133デフォルトの名無しさん
2016/12/31(土) 16:11:48.53ID:8v6iajLL ある本の解答例ですが実行すると先頭文字が消えます。これではダメなんでしょうか?
void str_toupper(char *str)
{
while (*str)
*str++ = toupper(*str);
}
void str_toupper(char *str)
{
while (*str)
*str++ = toupper(*str);
}
134デフォルトの名無しさん
2016/12/31(土) 16:20:34.34ID:ADMXNhyN *str++ = toupper(*str);
これ鼻から悪魔コード
インクリメント演算子で操作された変数が副作用完了点までに複数回参照するのは動作未定義
*str = toupper(*str);
str++;
と分離しないとまずい
これ鼻から悪魔コード
インクリメント演算子で操作された変数が副作用完了点までに複数回参照するのは動作未定義
*str = toupper(*str);
str++;
と分離しないとまずい
135デフォルトの名無しさん
2016/12/31(土) 17:17:13.63ID:Z7Smo6OK *str++ = toupper(*str); でダメなら
*str = toupper(*str++); で動くんじゃない?
……って真に受けるなよ。別の悪魔が出てくるだけだからな。
たとえ期待通りの動作になったとしても、たまたまだからな。
*str = toupper(*str++); で動くんじゃない?
……って真に受けるなよ。別の悪魔が出てくるだけだからな。
たとえ期待通りの動作になったとしても、たまたまだからな。
136デフォルトの名無しさん
2016/12/31(土) 17:24:22.85ID:xodGK7fu ポインタを直接インクリメントするのはどうにも性に合わん
137デフォルトの名無しさん
2016/12/31(土) 17:38:17.18ID:nERH8viD 通る道なのでやさしくね
138デフォルトの名無しさん
2016/12/31(土) 18:30:26.25ID:K1FrsN4c >>133
その本がダメなコードの例としてそれを挙げてるならいいけど、正解としてそれを書いてるのなら、著者の能力とか校正の正確さとか不安になる。
その本がダメなコードの例としてそれを挙げてるならいいけど、正解としてそれを書いてるのなら、著者の能力とか校正の正確さとか不安になる。
139133
2016/12/31(土) 19:18:21.55ID:8v6iajLL140デフォルトの名無しさん
2016/12/31(土) 20:02:29.25ID:RP5GqFRc 本の題名晒してもいいと思う...
141デフォルトの名無しさん
2016/12/31(土) 20:11:53.63ID:ADMXNhyN 古かったとして、古い規格だとしても処理系依存
(こっちのコンパイラはこうなるけど、あっちのコンパイラでは別の結果になるよ) なので、
正解コードとするのはよろしくない
(こっちのコンパイラはこうなるけど、あっちのコンパイラでは別の結果になるよ) なので、
正解コードとするのはよろしくない
142デフォルトの名無しさん
2016/12/31(土) 20:17:55.00ID:q3l2oU5w なぜダメなのか何がダメなのか理解しとかないと
143デフォルトの名無しさん
2017/01/01(日) 01:32:25.83ID:LgRst/uw >>139
まじすか ちょっとひどいですね。 著者が知りたいです。
まじすか ちょっとひどいですね。 著者が知りたいです。
144デフォルトの名無しさん
2017/01/01(日) 12:42:18.55ID:/LG195GI str_toupperでググると正しいコードはあるけど >>133 は見つからないなあ。結局なんて本?
146デフォルトの名無しさん
2017/01/01(日) 17:19:11.24ID:LgRst/uw 望洋先生すか あちゃー
147デフォルトの名無しさん
2017/01/04(水) 01:18:25.55ID:frbRBuKj 副作用完了点が2つ以上あると鼻から悪魔
148デフォルトの名無しさん
2017/01/04(水) 01:40:21.76ID:8dyTsCQL んなこたーない
1491/2
2017/01/04(水) 02:39:58.96ID: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が出力されませんので、異常終了している可能性が高いです。
助けてください。
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が出力されませんので、異常終了している可能性が高いです。
1502/2
2017/01/04(水) 02:40:11.64ID:9INFfbdp 環境は以下の通りです。
OS: CentOS 6.4
コンパイラ: GCC 4.4.7
接続先: https://www.youtube.com/
その他、無反応中にnetstat -tanpコマンドで確認すると、
このアプリケーションはESTABLISHEDとなっています。
また、自宅サーバーのHTTPSのサイトへアクセスした場合、HTMLの最後のほうの</body>が出力された後に数秒の間があり、
その後、</html>が出力されて正常に終了します。
この数秒の間も気になります。
よろしくお願いします。
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.95ID:sO2gccKh >>149
> printf("%s",buf);に変更
%sは文字列のアドレスを引数として受けてそれを出力する
C言語で文字列とはNUL終端されたバイト列だが
SSL_readは文字列ではなく只のバイト列を扱うからNUL終端なんてしていない
そのために受信した文字列以上のおそらくbufの領域を越えて偶然にゼロに
出くわすまでprintfが出力しているんだろう
付け加えると、サーバーから送られてくるバイト列中にゼロが含まれていると
文字列として扱おうとしたprintfはそこまでで終わりと見做してしまう
例えば2ちゃんはたまにそんなHTMLを返してくることがあっていい加減な作りの
自作アプリなんかが途中までしか表示しないとかいう不具合を出す
> printf("%s",buf);に変更
%sは文字列のアドレスを引数として受けてそれを出力する
C言語で文字列とはNUL終端されたバイト列だが
SSL_readは文字列ではなく只のバイト列を扱うからNUL終端なんてしていない
そのために受信した文字列以上のおそらくbufの領域を越えて偶然にゼロに
出くわすまでprintfが出力しているんだろう
付け加えると、サーバーから送られてくるバイト列中にゼロが含まれていると
文字列として扱おうとしたprintfはそこまでで終わりと見做してしまう
例えば2ちゃんはたまにそんなHTMLを返してくることがあっていい加減な作りの
自作アプリなんかが途中までしか表示しないとかいう不具合を出す
152149
2017/01/04(水) 03:47:33.12ID:9INFfbdp >>151
ありがとうございます。
初歩的なミスでお恥ずかしい。
バイナリデータとしてファイルに出力したところ正常に動作しました。(ファイルの内容にも問題ありませんでした)
恐らくマルチバイト文字の途中か何かで切れていたのでしょう。
ありがとうございます。
初歩的なミスでお恥ずかしい。
バイナリデータとしてファイルに出力したところ正常に動作しました。(ファイルの内容にも問題ありませんでした)
恐らくマルチバイト文字の途中か何かで切れていたのでしょう。
153デフォルトの名無しさん
2017/01/04(水) 08:50:07.15ID:hKIlPOcN マルチバイトなんか関係ない
> write(1, buf, read_size);を
> printf("%s",buf);に変更
すんなって事だよアホウ
> write(1, buf, read_size);を
> printf("%s",buf);に変更
すんなって事だよアホウ
154デフォルトの名無しさん
2017/01/04(水) 09:47:31.23ID:87+T0pXS もしくは1.1sだな
155デフォルトの名無しさん
2017/01/04(水) 09:53:13.47ID:dvUWMEVx printf("%.*s", read_size, buf); なら少しだけ
それでも read_size に至る途中に \0 あったら駄目だし
標準出力に送りたいんなら fwrite(buf, read_size, 1, stdout); こうなるかな
それでも read_size に至る途中に \0 あったら駄目だし
標準出力に送りたいんなら fwrite(buf, read_size, 1, stdout); こうなるかな
156デフォルトの名無しさん
2017/01/04(水) 09:54:39.63ID:dvUWMEVx 元質問みてなかった わーすーれーてー
157デフォルトの名無しさん
2017/01/04(水) 12:32:23.72ID:xue+qv3N 「んなこたーない」
っていつも書き込みする人がいるけど
もっと具体的な回答してほしい。
「んなこたーない」って答えるくらいだから何かしらの反論や回答持ってるんだろうけど
もっと具体的に言ってくれなきゃ分からない。
っていつも書き込みする人がいるけど
もっと具体的な回答してほしい。
「んなこたーない」って答えるくらいだから何かしらの反論や回答持ってるんだろうけど
もっと具体的に言ってくれなきゃ分からない。
158デフォルトの名無しさん
2017/01/04(水) 12:37:37.48ID:FLMu+DIB そういうのはとりあえず否定したいだけだからスルーでいいよ
回答なんか持って無いと思うし
回答なんか持って無いと思うし
159デフォルトの名無しさん
2017/01/04(水) 13:56:51.11ID:x5I82FL9 0x00がないと、どこまでもぉ って事だけで。
160デフォルトの名無しさん
2017/01/04(水) 15:05:14.50ID: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);
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);
161148
2017/01/04(水) 15:11:07.58ID:8dyTsCQL162デフォルトの名無しさん
2017/01/04(水) 17:51:37.32ID:ku1IYB1y んなこたーない
163デフォルトの名無しさん
2017/01/04(水) 18:08:39.09ID:issqqmbF do while()って嫌いだから使わん
164デフォルトの名無しさん
2017/01/04(水) 18:10:34.06ID:dvUWMEVx マクロのおまじないでも?
#define FOO() do { あーだこーだ } while(0)
#define FOO() do { あーだこーだ } while(0)
165デフォルトの名無しさん
2017/01/04(水) 18:15:56.08ID:pxTed+R/166デフォルトの名無しさん
2017/01/04(水) 18:17:44.69ID:pxTed+R/ まだ甘いか。
「ある副作用完了点と、次の副作用完了点の間で、同一の変数を複数回変更する」
かな?
「ある副作用完了点と、次の副作用完了点の間で、同一の変数を複数回変更する」
かな?
167片山博文MZ ◆T6xkBnTXz7B0
2017/01/04(水) 18:21:17.85ID:83LRywdJ gotoで地獄へ行くのをdo/break/whileに書き換えることができる。
...
goto hell;
...
goto hell;
...
hell: ...
return 0;
↓↓↓
do {
...
break;
...
break;
...
} while (0);
...
return 0;
...
goto hell;
...
goto hell;
...
hell: ...
return 0;
↓↓↓
do {
...
break;
...
break;
...
} while (0);
...
return 0;
168デフォルトの名無しさん
2017/01/04(水) 19:49:00.69ID:wOLmnoYC169デフォルトの名無しさん
2017/01/04(水) 21:37:54.73ID:lUhJzh+Z 言われた方は言われた方で同じこと思ってるんだろ。だから具体的に指摘しなきゃ話が進まない。
170デフォルトの名無しさん
2017/01/04(水) 22:12:54.91ID:zg5YylVI ピンポイントで間違い指摘されてんだから自分こそ根拠を述べろよ。
「副作用完了点が2つ以上」なんてどこにもねーんだから。
わかないよ〜ホレホレって荒らしたいだけ?
「副作用完了点が2つ以上」なんてどこにもねーんだから。
わかないよ〜ホレホレって荒らしたいだけ?
171デフォルトの名無しさん
2017/01/04(水) 22:45:56.82ID:by3GIgBn172デフォルトの名無しさん
2017/01/04(水) 23:27:27.83ID:6PKdRVzk MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ!
研究会のメンバーでさえ、規格に詳しい人がいないのだから、
日本人では、規格に詳しい人はいない
トヨタでも、MISRA-Cの遵守率が5%しかない。
こういう素人が作る、医療機関・産業機械は怖くて使えない。
アプリのバグで、すぐに人が死ぬ
コンパイラを作る方も、あやふやな解釈をしているから、
紛らわしい書き方を避けて、かなり安全に、コーディングしないと危険
極端に言えば、1文1文、分離して書くこと。
バグが多く出る箇所は主に、マクロ・複合文・型違いの3つ
研究会のメンバーでさえ、規格に詳しい人がいないのだから、
日本人では、規格に詳しい人はいない
トヨタでも、MISRA-Cの遵守率が5%しかない。
こういう素人が作る、医療機関・産業機械は怖くて使えない。
アプリのバグで、すぐに人が死ぬ
コンパイラを作る方も、あやふやな解釈をしているから、
紛らわしい書き方を避けて、かなり安全に、コーディングしないと危険
極端に言えば、1文1文、分離して書くこと。
バグが多く出る箇所は主に、マクロ・複合文・型違いの3つ
173デフォルトの名無しさん
2017/01/04(水) 23:45:39.23ID:xue+qv3N174デフォルトの名無しさん
2017/01/04(水) 23:48:11.13ID:NgyPecWp お前らちょっと温泉でも行ってこい
175デフォルトの名無しさん
2017/01/04(水) 23:48:33.21ID:8dyTsCQL >>173 ちっとも具体的じゃないが、それでいいの?正直なにが違うのかわからん。
(日本語としてはまったく問題ないしな。)
(日本語としてはまったく問題ないしな。)
176デフォルトの名無しさん
2017/01/05(木) 00:16:26.21ID:kU82p3Tw177デフォルトの名無しさん
2017/01/05(木) 07:15:07.48ID:Tn1lGUp3 副作用完了点が2つ以上あると鼻から悪魔
↓
× んなこたーない
○ 勘違いしてないか?
理由:「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧
↓
× んなこたーない
○ 勘違いしてないか?
理由:「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧
178デフォルトの名無しさん
2017/01/05(木) 07:20:28.53ID:IruuUmgl 一応技術板なので「んなこたーない」って言われたら鼻から悪魔の例を出せばすむ話
まあ例を考えてる時に自分の間違いに気づくと思うが...
まあ例を考えてる時に自分の間違いに気づくと思うが...
179デフォルトの名無しさん
2017/01/05(木) 07:35:58.65ID:Tn1lGUp3 嵐かどうかは別として間違いの指摘かどうか曖昧でわからない奴はヤバい
180デフォルトの名無しさん
2017/01/05(木) 09:10:38.60ID:yWb7mDiI if (*str++ && *str++ && *str++)
&& と if の条件式の終わりは副作用完了点だけど問題を起こすコードではない
※ 役にたつコードかはしらんw
&& と if の条件式の終わりは副作用完了点だけど問題を起こすコードではない
※ 役にたつコードかはしらんw
181デフォルトの名無しさん
2017/01/05(木) 11:34:50.96ID:nSwRuxqn 大学の授業で、client.cというファイルとserver.cのファイルを渡されて
このプログラムを解析して、何でも良いから通信するプログラムを作れと言われたんですが
何をやればいいのかさっぱりです。
サーバとクライアントでファイルが2つに分かれてるってことは
プログラミングのテストをするにも2台PCを持ってないとできないってことでしょうか
何でもいいのでアドバイスください。。。
このプログラムを解析して、何でも良いから通信するプログラムを作れと言われたんですが
何をやればいいのかさっぱりです。
サーバとクライアントでファイルが2つに分かれてるってことは
プログラミングのテストをするにも2台PCを持ってないとできないってことでしょうか
何でもいいのでアドバイスください。。。
182デフォルトの名無しさん
2017/01/05(木) 11:37:47.99ID:Xc98514b >>181
PC 1台でも出来ます
PC 1台でも出来ます
183デフォルトの名無しさん
2017/01/05(木) 11:44:42.65ID:yWb7mDiI server のプログラムを実行しておいて
接続先を 127.0.0.1 (または localhost) にした client のプログラムを実行すれば桶
後は実行OSの事情次第(FWの警告をスルーする等)
接続先を 127.0.0.1 (または localhost) にした client のプログラムを実行すれば桶
後は実行OSの事情次第(FWの警告をスルーする等)
184デフォルトの名無しさん
2017/01/05(木) 11:51:25.19ID:33EuaIzL185デフォルトの名無しさん
2017/01/05(木) 11:55:16.72ID:nSwRuxqn >>182-184
親切にありがとうございます。
Linux環境でプログラムしているのですが
server.cをコンパイル&実行すると待機中のせいか何なのかわからないのですが
コンソール上で他のコマンドが打てなくなってしまうので2台PCが必要なのかと迷っていたのですが、1台でもできるのですね。
どうやったら待機中でもclientのコンパイル済みファイルを実行することができるのでしょうか。。
親切にありがとうございます。
Linux環境でプログラムしているのですが
server.cをコンパイル&実行すると待機中のせいか何なのかわからないのですが
コンソール上で他のコマンドが打てなくなってしまうので2台PCが必要なのかと迷っていたのですが、1台でもできるのですね。
どうやったら待機中でもclientのコンパイル済みファイルを実行することができるのでしょうか。。
186デフォルトの名無しさん
2017/01/05(木) 12:00:04.09ID:CkAWate/ んなこたーない
って前々から他のC++スレでも使われていたけど、
自分からは何も根拠を示さず、ただ周りからの反論を煽りたいだけのレス
みたいな受け取られ方が少なからずされていたように感じるんだけど。
コミュニケーションって難しいな。
って前々から他のC++スレでも使われていたけど、
自分からは何も根拠を示さず、ただ周りからの反論を煽りたいだけのレス
みたいな受け取られ方が少なからずされていたように感じるんだけど。
コミュニケーションって難しいな。
187デフォルトの名無しさん
2017/01/05(木) 12:06:51.34ID:yWb7mDiI >>185
bash だったら
末尾に & つけて呼び出すとバックグランドで実行するみたいよー
# server [enter]
: 待機中でだんまりさんw
# server & [enter]
: すぐ次の入力待ちになる server は裏で実行中
#
bash だったら
末尾に & つけて呼び出すとバックグランドで実行するみたいよー
# server [enter]
: 待機中でだんまりさんw
# server & [enter]
: すぐ次の入力待ちになる server は裏で実行中
#
188デフォルトの名無しさん
2017/01/05(木) 12:25:39.85ID:nSwRuxqn189デフォルトの名無しさん
2017/01/05(木) 13:10:33.43ID:Goea0txf nohup をつけるともっと幸せになれるよ
nohup server &
nohup server &
190デフォルトの名無しさん
2017/01/05(木) 13:26:13.09ID:NumGywN/ 馬鹿がnohupなんか付けたらいつまでもプロセス残るだろ
不完全なサーバーアプリケーションのプロセスをいつまでも残すということは
セキュリティ的に問題外
不完全なサーバーアプリケーションのプロセスをいつまでも残すということは
セキュリティ的に問題外
191デフォルトの名無しさん
2017/01/05(木) 14:20:26.50ID:wksprrkU 0xFFFFFFの変数がif(n > 0)で真になるんだがなんだコレ?
クソムカツクな死ねよ
クソムカツクな死ねよ
192デフォルトの名無しさん
2017/01/05(木) 14:25:53.51ID:yWb7mDiI 64bit (2の補数の)符号付で 00FF FFFF は正なんだけど
48bit の符号付整数での比較を望んでいるんだろうか?
48bit の符号付整数での比較を望んでいるんだろうか?
193デフォルトの名無しさん
2017/01/05(木) 15:39:10.85ID:60LIuvs1 48bitでも32bitでも正ですが
194デフォルトの名無しさん
2017/01/05(木) 17:24:14.22ID:5KDyH/yc195デフォルトの名無しさん
2017/01/05(木) 18:52:01.04ID:sOp8JEWl 逆になぜ偽になると思ったのかが知りたいな。
196デフォルトの名無しさん
2017/01/05(木) 18:58:22.71ID:25Qby3+x auto n = 0xFFFFFF;
*reinterpret_cast<int*>(&n) > 0
*reinterpret_cast<int*>(&n) > 0
197デフォルトの名無しさん
2017/01/05(木) 19:26:42.79ID:ivHnG5Le int が 24bit ってダメなんだっけ?
198デフォルトの名無しさん
2017/01/05(木) 19:41:33.07ID:/zQeSTVL あー あほしたー bit数を数え間違ってるし
199デフォルトの名無しさん
2017/01/05(木) 21:38:57.59ID:AK28m3f5200デフォルトの名無しさん
2017/01/05(木) 23:28:47.82ID:sjDvcQUe >>185
別の端末・別の仮想デスクトップなどを、起動すればいい
別の端末・別の仮想デスクトップなどを、起動すればいい
201デフォルトの名無しさん
2017/01/08(日) 01:15:08.36ID:+QuxnNhY ■ 質問概要
ファイルに書き込んでも反映されない。
■ 環境
CentOS 6.4
GCC 4.4.7
■ 質問詳細
fopenに"r+"を指定して開いたファイルに、fputsでテキストデータを書き込んでも反映されません。
fcloseしていないことが、恐らく原因だと思います。
このアプリケーションは起動時にfopenでファイルを開いて常駐し、
アプリケーション終了時にfcloseするように開発しており、fcloseすると反映されます。
常駐型のアプリケーションで逐次ログ出力するため、
書き込むたびにファイルを開いたり閉じたりしないようにしています。
fcloseしなくても読み取りだけはできるようにしたいのです。
Apacheの挙動を見ると、ログファイルがこうした動作になっているようです。
(Apacheのソースは読んでいません、ログファイルを操作しようとした際の挙動などからによる推測です)
どうすればいいでしょうか。
調べたところ、fflushで希望の動作ができそうですが、
使い慣れてないものを使うのは副作用が怖く、
また、説明に「強制的」等の文言があるため、この文言があるだけでも非常に不安です。
こうした目的でfflushを利用しても問題ないのでしょうか。
そもそもfflushでいいのでしょうか。
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fflush.3.html
ファイルに書き込んでも反映されない。
■ 環境
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.59ID:Zdr2NPEX 大丈夫だから使え
203デフォルトの名無しさん
2017/01/08(日) 01:24:31.77ID:T3Q1+h8z flushは時間がかかるから頻度が高い場合は気をつけて。
204201
2017/01/08(日) 01:54:37.47ID:+QuxnNhY205デフォルトの名無しさん
2017/01/08(日) 03:35:33.42ID:eh6WgorM A = (framecount / 10) % 4
すみません、上記の式の意味を教えてください。
毎度、Aに入る値がしりたいです。
すみません、上記の式の意味を教えてください。
毎度、Aに入る値がしりたいです。
206デフォルトの名無しさん
2017/01/08(日) 03:39:14.61ID:Nqw0FnK6 (framecount を 10 で割って) それの 4で割った余り 0〜3 の値になる
framecount
0〜 9 → 0
10〜19 → 1
20〜29 → 2
30〜39 → 3
40〜49 → 0
50〜59 → 1
:
framecount
0〜 9 → 0
10〜19 → 1
20〜29 → 2
30〜39 → 3
40〜49 → 0
50〜59 → 1
:
207デフォルトの名無しさん
2017/01/08(日) 03:43:39.84ID:eh6WgorM208デフォルトの名無しさん
2017/01/08(日) 04:24:28.51ID:c5pY166L >>201-204
普通は、ファイルを閉じる際、自動的にflushされる
それに何もしなくても、OSのデフォルト設定で、
dirty Page Cache を、5秒ごとにflushして、メモリとディスクを同じ状態に保つ
USB・SSDの書き込み回数を減らしたい人は、書き込み間隔を15〜30秒に設定している人もいる。
commit=15
Linux I/O のお話 write 編
http://d.hatena.ne.jp/naoya/20070523/1179938637
普通は、ファイルを閉じる際、自動的に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.87ID:OpAcES4h char buffer[256];
scanf(%s,buffer);
printf(
scanf(%s,buffer);
printf(
210デフォルトの名無しさん
2017/01/08(日) 11:28:02.93ID:OpAcES4h すみません、誤送信してしまいました
質問させてください。
char buffer[256];
scanf(%s,buffer);
printf("finish---_n");
という記述で、文字入力をした後、何回リターンキーを押しても
finishが表示されない、つまりscanfが終了しないような状態になっているのですが
何か特別な条件でscanfが終了しないことってあるものなのでしょうか?
ちなみに、コードのscanfの行だけコメントアウトすると普通にfinishが表示される状態です。
あと、新規で.cファイルを作って短いコードにしてコンパイルしても問題なく動いてくれています。
質問させてください。
char buffer[256];
scanf(%s,buffer);
printf("finish---_n");
という記述で、文字入力をした後、何回リターンキーを押しても
finishが表示されない、つまりscanfが終了しないような状態になっているのですが
何か特別な条件でscanfが終了しないことってあるものなのでしょうか?
ちなみに、コードのscanfの行だけコメントアウトすると普通にfinishが表示される状態です。
あと、新規で.cファイルを作って短いコードにしてコンパイルしても問題なく動いてくれています。
211デフォルトの名無しさん
2017/01/08(日) 11:43:58.41ID:nyR751xv212デフォルトの名無しさん
2017/01/08(日) 11:52:30.04ID:OpAcES4h >>211
先日も少し教えてもらったのでまた聞きに来てるのが恥ずかしいのあ
ですが、サーバとクライアントでの通信のプログラムです。
server.c
http://codepad.org/epmTQJ0
client.c
http://codepad.org/uhR4zEL3
gcc -o s server.c
gcc -o c client.c
./s&
./c
で実行しています。
サーバ側のscanfで止まってしまうみたいなのですが
サーバ側のscanfをコメントアウトすると通るみたいです。
先日も少し教えてもらったのでまた聞きに来てるのが恥ずかしいのあ
ですが、サーバとクライアントでの通信のプログラムです。
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.20ID:nyR751xv server側がnot foundだわ
リンク確認してみて
リンク確認してみて
214デフォルトの名無しさん
2017/01/08(日) 12:15:37.07ID:9g4d0om9215デフォルトの名無しさん
2017/01/08(日) 12:35:39.21ID:nyR751xv Wait for Connection...Connected.
s1---------
C->S: %s
Server:
実行結果はここで止まって
s2---------
まで進まないって事?
s1---------
C->S: %s
Server:
実行結果はここで止まって
s2---------
まで進まないって事?
216デフォルトの名無しさん
2017/01/08(日) 12:38:46.78ID:Cjw+tP2S217デフォルトの名無しさん
2017/01/08(日) 13:15:24.14ID:nyR751xv 送受信で変数を別々にしてみて
scanf -> sendはbuffer1
recv -> printfはbuffer2
みたいに
38, 39 40行目にブレークポイント置いてやってみて
scanf -> sendはbuffer1
recv -> printfはbuffer2
みたいに
38, 39 40行目にブレークポイント置いてやってみて
218デフォルトの名無しさん
2017/01/08(日) 13:46:50.50ID:uGSXn6++ サーバをフォアグラウンドにしてから入力すればいいだけな気がする。
いったんCtrl-zでクライアントを停止して「bg」でバックグラウンドで再開、
「jobs」でサーバのジョブIDを調べて「fg %[ジョブID]」してから入力すれば、
反応するんじゃないかな。
いったんCtrl-zでクライアントを停止して「bg」でバックグラウンドで再開、
「jobs」でサーバのジョブIDを調べて「fg %[ジョブID]」してから入力すれば、
反応するんじゃないかな。
219デフォルトの名無しさん
2017/01/08(日) 15:47:42.95ID:/TmTqYIS220デフォルトの名無しさん
2017/01/08(日) 16:06:06.04ID:nyR751xv221デフォルトの名無しさん
2017/01/08(日) 16:09:35.63ID:uGSXn6++ 難しいようなら、&で起動するのはやめて、ターミナルを二つ起動して
片方でサーバを、もう片方でクライアントを実行するほうが楽だと思う。
片方でサーバを、もう片方でクライアントを実行するほうが楽だと思う。
222デフォルトの名無しさん
2017/01/08(日) 16:24:16.26ID:7aUjJ3jB 同意
223デフォルトの名無しさん
2017/01/08(日) 17:02:49.06ID:C9GVPqMv >>208
それレイヤーが違う話だよ
それレイヤーが違う話だよ
224デフォルトの名無しさん
2017/01/08(日) 17:48:30.32ID:bwuU6ymI 質問者の提示したURLに書かれている注意事項すら読まない奴を相手にレスするとは
225デフォルトの名無しさん
2017/01/08(日) 19:21:35.50ID:d7tAym4Y226デフォルトの名無しさん
2017/01/08(日) 22:54:37.49ID:c5pY166L 端末も複数、起動できる
仮想デスクトップを知っているか?
デスクトップも、複数起動できる
普通、C/S通信プログラムでは、2つ端末を起動する
>>209-210
2chのバグだろう
書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。
" の代わりに、\" とエスケープすれば、どうだろう?
それか、書き込み確認画面が出たら、1度キャンセルすれば、確認画面は出ないようになった
仮想デスクトップを知っているか?
デスクトップも、複数起動できる
普通、C/S通信プログラムでは、2つ端末を起動する
>>209-210
2chのバグだろう
書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。
" の代わりに、\" とエスケープすれば、どうだろう?
それか、書き込み確認画面が出たら、1度キャンセルすれば、確認画面は出ないようになった
227デフォルトの名無しさん
2017/01/11(水) 13:06:08.85ID:X1FDgEas228デフォルトの名無しさん
2017/01/12(木) 04:36:13.74ID:8CizHZGj MSVCはいつまで__cplusplusの定義199711Lのままなんだ
229デフォルトの名無しさん
2017/01/12(木) 07:09:10.44ID:edOk7o4H 変えると暴動が起きるこら変えない
とライブラリ開発者のSTL氏が言っていた
とライブラリ開発者のSTL氏が言っていた
230デフォルトの名無しさん
2017/01/12(木) 12:09:34.61ID:xegpw56Z 1だと思ってた
231デフォルトの名無しさん
2017/01/15(日) 00:31:14.26ID:7/DzGkQz 別ファイルで作成した関数を使用するときは、そのヘッダーファイルの
インクルードだけでなくプロトタイプ宣言も必要ですか?
インクルードだけでもコンパイルは通るし実行も出来るのですが、
そういう警告が出てくるので気になりました
インクルードだけでなくプロトタイプ宣言も必要ですか?
インクルードだけでもコンパイルは通るし実行も出来るのですが、
そういう警告が出てくるので気になりました
232デフォルトの名無しさん
2017/01/15(日) 00:34:44.37ID:H7ag5TAh 警告文をコピペしてくれると話が早いような
233デフォルトの名無しさん
2017/01/15(日) 00:51:14.06ID:e3PYrJk6 そのヘッダーファイルの中でプロトタイプ宣言はされているんじゃないのか
警告の原因は別のことだろ
警告の原因は別のことだろ
234デフォルトの名無しさん
2017/01/15(日) 01:02:35.94ID:7/DzGkQz インクルードするファイルを間違えてたみたいです
お騒がせしました
お騒がせしました
235デフォルトの名無しさん
2017/01/19(木) 22:46:56.05ID:knltoro2 新しくクラスとそれに関連した処理などを実装するとき
ヘッダー側でクラスの定義、ソースファイル側にクラス内のメンバ関数の実装部などを書きますよね
その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか? たとえば
//ヘッダー側です
class A{
private:
int num;
public:
int ReturnNum(void){
return num;
}
};
処理はたった一行ですけどこの場合もint ReturnNum()の実装部はソースファイル側にint A::ReturnNum()のように移すべきですか?
ネット上のプログラムをいくつか見てみたらこのようにメンバ変数をただ返すだけの処理ならヘッダー側に書いてあるものも少なくなかったのでどっちが好ましいんだろうと気になりました
ヘッダー側でクラスの定義、ソースファイル側にクラス内のメンバ関数の実装部などを書きますよね
その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか? たとえば
//ヘッダー側です
class A{
private:
int num;
public:
int ReturnNum(void){
return num;
}
};
処理はたった一行ですけどこの場合もint ReturnNum()の実装部はソースファイル側にint A::ReturnNum()のように移すべきですか?
ネット上のプログラムをいくつか見てみたらこのようにメンバ変数をただ返すだけの処理ならヘッダー側に書いてあるものも少なくなかったのでどっちが好ましいんだろうと気になりました
236デフォルトの名無しさん
2017/01/19(木) 23:08:04.39ID:ipEwSksA プログラムは普通すべて「ソースファイル」に書くものです
「ヘッダー」に書くのはコンパイラー開発者だけです
「ヘッダー」に書くのはコンパイラー開発者だけです
237デフォルトの名無しさん
2017/01/19(木) 23:11:24.96ID:ydMYZ/gE クラスもヘッダに書きますけどぉ
238デフォルトの名無しさん
2017/01/19(木) 23:55:32.15ID:A0Yl7Ujc > その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか?
別にどんな場合でもソース側に書くというわけではない
ヘッダに書くのもソースに書くのも一長一短はあり絶対的にどっちがいいというものではない
君が違いを理解し何を重視するかを意識すれば
君にとってどっちが好ましいかは自然とはっきりする
別にどんな場合でもソース側に書くというわけではない
ヘッダに書くのもソースに書くのも一長一短はあり絶対的にどっちがいいというものではない
君が違いを理解し何を重視するかを意識すれば
君にとってどっちが好ましいかは自然とはっきりする
239デフォルトの名無しさん
2017/01/20(金) 00:23:32.93ID:7sj2OAGi なんか禅問答が始まったかと思ったわ
240デフォルトの名無しさん
2017/01/20(金) 01:12:20.36ID:/ixeQkYS 短いメソッドなら、ヘッダに、inline 指定して書くと、
関数化せずに、inline にしてくれる可能性が高い
まあ、言語では保証していないけど。コンパイラ依存
関数化せずに、inline にしてくれる可能性が高い
まあ、言語では保証していないけど。コンパイラ依存
241デフォルトの名無しさん
2017/01/20(金) 05:11:02.70ID:vaOLIJJw クラス定義で定義されたメンバ関数は暗黙にinlineになるね。
(『プログラミング言語C++第4版』p.464 16.2.8 クラス内関数定義)
class SomeClass {
public:
int a() {return a_;} // 暗黙のinline指定
private:
int a_;
}
…という話を書くために厚い本を調べてたら
class SomeClass {
public:
int a();
private:
int a_;
}
inline int SomeClass::a() // 明示的にinline指定
{
return a_;
}
と書く方法も載ってた。 >>240 は後者の説明だったのね。
(『プログラミング言語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.09ID:Nvso2zBq243デフォルトの名無しさん
2017/01/20(金) 08:09:40.71ID:B05iL6IP 『〜のが原則』
『理由がある場合〜こともある』
俺の会社のルールは世界普遍的 思考
『理由がある場合〜こともある』
俺の会社のルールは世界普遍的 思考
244デフォルトの名無しさん
2017/01/20(金) 16:53:52.68ID:abKD9bRi inlineにするのはほとんどその時の気分みたいな?
なんかマクロみたいだな。inlineにすっかみたいな。
なんかマクロみたいだな。inlineにすっかみたいな。
245片山博文MZ ◆T6xkBnTXz7B0
2017/01/20(金) 17:10:04.08ID:XdmbS/hB >>244
関数呼び出しのオーバーヘッドの回避と、定数畳み込みなどの最適化が期待できる場合にインライン化する。
関数呼び出しのオーバーヘッドの回避と、定数畳み込みなどの最適化が期待できる場合にインライン化する。
246デフォルトの名無しさん
2017/01/20(金) 17:38:00.40ID:abKD9bRi >>245
そんな感じ
そんな感じ
247デフォルトの名無しさん
2017/01/20(金) 20:04:23.44ID:1c/0Zcpc >>245
インラインにしても劇的に速くなった経験が無いんですが、コツは有りますか?
インラインにしても劇的に速くなった経験が無いんですが、コツは有りますか?
248デフォルトの名無しさん
2017/01/20(金) 20:57:25.59ID:pNkrp0ep 効果が出るのは
・小さい
かつ
・短時間に非常に多数呼び出される
関数だけだよ。
しかも、まず劇的ではない。
・小さい
かつ
・短時間に非常に多数呼び出される
関数だけだよ。
しかも、まず劇的ではない。
249デフォルトの名無しさん
2017/01/20(金) 21:15:10.32ID:esT1VQmf inlineキーワードはヘッダに実装書くときなどに使用するものでインライン展開を狙った最適化の為に書くものではない
250デフォルトの名無しさん
2017/01/20(金) 21:15:23.08ID:abKD9bRi もしかしてコンパイラの方で展開してるとか はないかなぁw
251デフォルトの名無しさん
2017/01/20(金) 21:57:28.38ID:aetIobRP >>249
インライン関数の話の途中でinlineキーワードの関数の話を始めて、いきなりどうした
インライン関数の話の途中でinlineキーワードの関数の話を始めて、いきなりどうした
252デフォルトの名無しさん
2017/01/20(金) 22:07:56.98ID:CICAdfuU253デフォルトの名無しさん
2017/01/20(金) 23:11:34.78ID:LsENUQp+ ベクトルとか行列のライブラリを使った時は全部インラインにしたな
1/60秒にかなりの回数呼ぶし
ライブラリとかもインラインで書かれてる
1/60秒にかなりの回数呼ぶし
ライブラリとかもインラインで書かれてる
254デフォルトの名無しさん
2017/01/20(金) 23:12:36.14ID:LsENUQp+ ×使った ??作った
255デフォルトの名無しさん
2017/01/20(金) 23:27:28.97ID:esT1VQmf >>252
んなわけない
んなわけない
256デフォルトの名無しさん
2017/01/20(金) 23:34:20.48ID:ITfb1kXg >>255
んなこたーない
んなこたーない
257デフォルトの名無しさん
2017/01/20(金) 23:36:05.42ID:esT1VQmf ヘッダに書いたら暗黙でinlineって
#includeの機能しらんとしか思えないんだが
#includeの機能しらんとしか思えないんだが
258デフォルトの名無しさん
2017/01/21(土) 00:40:48.27ID:dThE4/1u ちょと混じっちゃったね。
関数を定義されたヘッダーが複数のソースに呼ばれちゃったら、実体が
いっぱい出来ちゃうもんね。
関数を定義されたヘッダーが複数のソースに呼ばれちゃったら、実体が
いっぱい出来ちゃうもんね。
259デフォルトの名無しさん
2017/01/21(土) 01:48:12.93ID:RmTA4cQd 江添はなんて言ってる?
260デフォルトの名無しさん
2017/01/21(土) 07:06:45.50ID:5NCJ8rOL forceを信じるのだ
261デフォルトの名無しさん
2017/01/21(土) 08:35:23.75ID:P1/rV56D インライン関数はODR回避のためだと思っていた
C++17(予定)のインライン変数もそんな感じ
C++17(予定)のインライン変数もそんな感じ
262デフォルトの名無しさん
2017/01/21(土) 11:00:41.73ID:wrzS/cSB ODRって何?
263デフォルトの名無しさん
2017/01/21(土) 11:17:05.01ID:J7ipYv9j 単一定義則 One Definition Rule の略語
264263
2017/01/21(土) 19:43:36.29ID:J7ipYv9j 「単一定義規則」の方が検索にかかりやすい言葉かも。
265デフォルトの名無しさん
2017/01/22(日) 08:28:10.05ID:5o7PrILb >>261
そうそう。最適化目的でinline付けても普通無視されるからね。
そうそう。最適化目的でinline付けても普通無視されるからね。
266デフォルトの名無しさん
2017/01/22(日) 14:37:23.33ID:hBhrTyQG267デフォルトの名無しさん
2017/01/24(火) 12:50:54.05ID:ZplzBBh2 Windows上で、APIを使わずに、コマンドプロンプト上だけで結果が
ほしいような、C言語のプログラムを作るのに便利な開発環境はありますか?
VIsualStudioは重すぎてあまり使いたくありません。
どうぞよろしくお願いします。
ほしいような、C言語のプログラムを作るのに便利な開発環境はありますか?
VIsualStudioは重すぎてあまり使いたくありません。
どうぞよろしくお願いします。
268デフォルトの名無しさん
2017/01/24(火) 13:20:58.13ID:qjTW56fl msys2
269デフォルトの名無しさん
2017/01/24(火) 13:39:24.94ID:ZplzBBh2 msysって、どういうものですか?
270デフォルトの名無しさん
2017/01/24(火) 13:58:35.63ID:qjTW56fl >>269
コンパイラツールチェインとターミナルとライブラリ管理のパッケージツールを纏めたものです
エディタは無いし ビルドツールはautotoolsとかcmakeとかを使います
ただ単体ファイルをコンパイルして実行するだけなら
gccを叩くだけなので ご要望に沿うかと
コンパイラツールチェインとターミナルとライブラリ管理のパッケージツールを纏めたものです
エディタは無いし ビルドツールはautotoolsとかcmakeとかを使います
ただ単体ファイルをコンパイルして実行するだけなら
gccを叩くだけなので ご要望に沿うかと
271デフォルトの名無しさん
2017/01/24(火) 14:14:08.29ID:tjYeiy24 重いのがイヤなら code::blocks はどうかね
http://demura.net/lecture/12713.html
http://demura.net/lecture/12713.html
272デフォルトの名無しさん
2017/01/24(火) 20:33:35.20ID:bAAm8CCs >>267
自分もvisual studio が重いのと好きなエディタ使いたいのと、
でもGUIでファイル管理とかコンパイルエラー行へのジャンプをしたかったの自分でそういうツールを作った。TTVC Developer っていうのだけど
ネット上に公開してるけど反応無いので本当に良くできてるかどうかは
わからんが、自分的には便利だとは思ってる
自分もvisual studio が重いのと好きなエディタ使いたいのと、
でもGUIでファイル管理とかコンパイルエラー行へのジャンプをしたかったの自分でそういうツールを作った。TTVC Developer っていうのだけど
ネット上に公開してるけど反応無いので本当に良くできてるかどうかは
わからんが、自分的には便利だとは思ってる
273デフォルトの名無しさん
2017/01/24(火) 20:39:04.14ID:2gaKjsEX 俺はqt creator使ってるな
VSよりマシってくらいだが
VSよりマシってくらいだが
274デフォルトの名無しさん
2017/01/24(火) 20:46:07.50ID:HHZbO6eg275デフォルトの名無しさん
2017/01/24(火) 21:22:57.39ID:nvNd8iP1 Bash on Ubuntu on Windws
276デフォルトの名無しさん
2017/01/24(火) 21:41:00.44ID:1ohBhH6C あれβとれたっけ?
277デフォルトの名無しさん
2017/01/27(金) 01:10:08.67ID:c6wkRwWW *p++ って 参照してからインクリメントですよね。
某書に*(p++)と等価って書いてあったけど。
ん 同じか
某書に*(p++)と等価って書いてあったけど。
ん 同じか
278デフォルトの名無しさん
2017/01/27(金) 01:47:57.39ID:JFq0FevS 同じだよ
その括弧かあってもなくても実際にインクリメントがされるタイミングには影響しない
その括弧かあってもなくても実際にインクリメントがされるタイミングには影響しない
279デフォルトの名無しさん
2017/01/27(金) 02:43:45.51ID:c6wkRwWW すまん 評価してからインクリメントは同じだもんね。
280デフォルトの名無しさん
2017/01/28(土) 22:24:20.92ID:fbuNIeJW281デフォルトの名無しさん
2017/01/29(日) 14:28:58.62ID:XKehhdE4 質問です。
VisualStudio2015でReleaseビルドをしていたところ、生成されたEXEに気になる点がありました
if(false){
printf("hogehoge");
}
という処理を書いたところ、このprintfは到達不可能なのに、EXEの中に"hogehoge"という文字列が含まれていたのです。
※再現コードなのでhogehoeをprintしてなんの意味があるのかというコードですが
到達不能なのが明らかな部分は最適化で削除されるものだと思っていたのですが、何かしらの私の不手際でしょうか?
最適化は /O2オプションです
VisualStudio2015でReleaseビルドをしていたところ、生成されたEXEに気になる点がありました
if(false){
printf("hogehoge");
}
という処理を書いたところ、このprintfは到達不可能なのに、EXEの中に"hogehoge"という文字列が含まれていたのです。
※再現コードなのでhogehoeをprintしてなんの意味があるのかというコードですが
到達不能なのが明らかな部分は最適化で削除されるものだと思っていたのですが、何かしらの私の不手際でしょうか?
最適化は /O2オプションです
282デフォルトの名無しさん
2017/01/29(日) 15:19:11.63ID:DfD+S+Qh >>281
/O4とかは?
/O4とかは?
283デフォルトの名無しさん
2017/01/29(日) 15:31:20.39ID:2ZaFXkbr オプションによる不確定なものをどうして不手際と思ったのか謎
/O2 /GF-なら残る可能性高いし
/O2 /GF-なら残る可能性高いし
284デフォルトの名無しさん
2017/01/29(日) 17:04:30.90ID:XKehhdE4285デフォルトの名無しさん
2017/01/29(日) 18:59:23.49ID:K+/fnyLa 何かの理由があって残してるという事はないのかな・・・
286デフォルトの名無しさん
2017/01/29(日) 19:49:35.57ID:6wGEJq5M >>281
普通に削除されて文字列もなくなるけど?
普通に削除されて文字列もなくなるけど?
287デフォルトの名無しさん
2017/01/29(日) 23:12:58.08ID: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を返すだけの結果固定関数になるため、変数の割り当てすらしなくなるから?
ご返答ありがとうございます。
どうも文字列をあれこれ変えて、消えたり消えなかったりとよくわからない状況になってきました。
とりあえず、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.35ID:DuISdTe+ VS2015の環境を持っていないんで見当違いかも知れんが…。
#include <stdio.h> か #include <cstdio> を書いてみる。
char text[] = ... を const char text[] = ... にしてみる。
これらを(独立して)変えてみたら状態が変わらんかな?
printf()による副作用の可能性を考慮してtextを消さないのかも知れん。
もちろんprintf("hogehoge")を呼び出しても
引数になってないtextが読み書きされるはずはないんだけど。
#include <stdio.h> か #include <cstdio> を書いてみる。
char text[] = ... を const char text[] = ... にしてみる。
これらを(独立して)変えてみたら状態が変わらんかな?
printf()による副作用の可能性を考慮してtextを消さないのかも知れん。
もちろんprintf("hogehoge")を呼び出しても
引数になってないtextが読み書きされるはずはないんだけど。
289デフォルトの名無しさん
2017/01/30(月) 00:05:47.51ID:iVXSa+56 >>288
アドバイスありがとうございます
すいません。最小コードといいつつincludeをきちんと書いておりませんでした
#include <stdio.h>を最初に書いております
cstdioに変えてみて、各種パターンやってみましたが、変化は見られませんでした
次に、以下です
const char ではfoofooは消えませんでした
const static char に変えたところ、消えました
printfが、中でスタック消費量でも利用しているのかな…と馬鹿なことを考えて
char text〜をグローバル空間に出してみましたが、foofooは消えずです
アドバイスありがとうございます
すいません。最小コードといいつつincludeをきちんと書いておりませんでした
#include <stdio.h>を最初に書いております
cstdioに変えてみて、各種パターンやってみましたが、変化は見られませんでした
次に、以下です
const char ではfoofooは消えませんでした
const static char に変えたところ、消えました
printfが、中でスタック消費量でも利用しているのかな…と馬鹿なことを考えて
char text〜をグローバル空間に出してみましたが、foofooは消えずです
290デフォルトの名無しさん
2017/01/30(月) 13:26:01.87ID: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
グローバル変数にするのは最適化されにくくなるだけ。
とりあえずこれで
#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.46ID:X+M9ocjS つまり>>281は嘘つきってこと?
292デフォルトの名無しさん
2017/01/30(月) 19:47:42.18ID:p0U51Ig/ exeの中身まで気が回りませんわ
293デフォルトの名無しさん
2017/01/30(月) 22:08:56.31ID:mpXbeHjF exeにビルド時のフルパスが埋め込まれてるとイラっとする
294デフォルトの名無しさん
2017/01/30(月) 22:20:13.70ID:XMGcU10o デバッグビルドなら普通でしょ
295デフォルトの名無しさん
2017/01/31(火) 02:46:33.99ID:SZ8YrWi+ リリースビルドにして、最適化オプションを指定すれば?
296デフォルトの名無しさん
2017/01/31(火) 09:17:11.64ID:r8Cb1+5o デバッグ情報を含めなければいいだけだしな
297デフォルトの名無しさん
2017/02/01(水) 01:15:31.17ID:lC8eLy+G あるクラスに引数で渡されるオブジェクトのconstではない参照を持ちたいんですけどどのようにやればいいでしょうか
ポインタはなるべく使いたくないのですが
class A {
public:
void setParam(Param&);
private:
Param& m_param;
}
状況としては
あるクラスBがクラスAみたいなParamの参照を持つクラスを複数持っていて
クラスBがvector<Param>でParamの実体を持っているという感じです
ポインタはなるべく使いたくないのですが
class A {
public:
void setParam(Param&);
private:
Param& m_param;
}
状況としては
あるクラスBがクラスAみたいなParamの参照を持つクラスを複数持っていて
クラスBがvector<Param>でParamの実体を持っているという感じです
298デフォルトの名無しさん
2017/02/01(水) 01:25:10.63ID:V+KME3Sb ライフタイムと循環参照のもたらす悪夢を
全部避けられるように熟考しながら
shared_ptr / weak_ptr をどうぞ
Welcome to C++ nightmare!!
全部避けられるように熟考しながら
shared_ptr / weak_ptr をどうぞ
Welcome to C++ nightmare!!
299デフォルトの名無しさん
2017/02/01(水) 01:36:32.13ID:nwC60mRJ shared_ptrの何が難しいのか判らん。
shared_ptr程度で悪夢とか言ってたらswiftも使えなくない?
shared_ptr程度で悪夢とか言ってたらswiftも使えなくない?
300デフォルトの名無しさん
2017/02/01(水) 02:15:37.65ID:V+KME3Sb まぁ良く調べて使ってねってのを脅し効かせた程度です
他の言語で参照カウント型のsmart_ptr解ってるなら 確かに大丈夫
他の言語で参照カウント型のsmart_ptr解ってるなら 確かに大丈夫
301デフォルトの名無しさん
2017/02/01(水) 12:17:29.74ID:RxSebrTI Windows10でBluetoothを使ったCOM通信を行いたく、
プログラムのほうはCOMポート通信のつもりで書き、
OSの設定でBluetoothに仮想COMポートを追加しました。
Androidとは問題なく接続・通信できたのですが、
Windows10同士ではうまくいきませんでした。
これは仮想COMポート作成するときに、どちらのPCも「受信」(相手側が接続を開始する)にしていたからだと思い、
片方を「送信」に変更しようとしました。
しかし、この場合は接続先PCを指定しなくてはならないのですが
対象PCが選択リスト内に出てこなくて作成することができません。
ペアリングはできているにもかかわらずです。
どうすればWin10PC同士でBluetoothを介したCOMポート接続・通信ができるでしょうか?
プログラムのほうはCOMポート通信のつもりで書き、
OSの設定でBluetoothに仮想COMポートを追加しました。
Androidとは問題なく接続・通信できたのですが、
Windows10同士ではうまくいきませんでした。
これは仮想COMポート作成するときに、どちらのPCも「受信」(相手側が接続を開始する)にしていたからだと思い、
片方を「送信」に変更しようとしました。
しかし、この場合は接続先PCを指定しなくてはならないのですが
対象PCが選択リスト内に出てこなくて作成することができません。
ペアリングはできているにもかかわらずです。
どうすればWin10PC同士でBluetoothを介したCOMポート接続・通信ができるでしょうか?
302デフォルトの名無しさん
2017/02/01(水) 12:30:13.62ID:HL/HxBhd 直接の解はわからないけど、ぐぐって見つかったので確認
ポート開くとき "\\\\.\\COM○○" (○は数字 \はエスケープ込み)
って開いてる?
ポート番号が1桁の場合に限り "COM○"でも開けるらしいけど、
そのコードの延長で 2桁渡すとそれは開けないから
ポート開くとき "\\\\.\\COM○○" (○は数字 \はエスケープ込み)
って開いてる?
ポート番号が1桁の場合に限り "COM○"でも開けるらしいけど、
そのコードの延長で 2桁渡すとそれは開けないから
303301
2017/02/01(水) 12:49:42.61ID:RxSebrTI >>302
あ、はい。それはやってます。
今、わかったのですが、
一旦ペアリングを解除して、改めて「送信」COMポートを追加しようとすると、
先程までペアリングしていた対象PCが選択できるようになりました。
しかし今度は「選択されたデバイスでシリアルポートサービスが実行されていません。」と出て作成されません。
相手側に「受信」のCOMポートは作成済みなのですが…。
あ、はい。それはやってます。
今、わかったのですが、
一旦ペアリングを解除して、改めて「送信」COMポートを追加しようとすると、
先程までペアリングしていた対象PCが選択できるようになりました。
しかし今度は「選択されたデバイスでシリアルポートサービスが実行されていません。」と出て作成されません。
相手側に「受信」のCOMポートは作成済みなのですが…。
304デフォルトの名無しさん
2017/02/01(水) 13:25:07.55ID:HL/HxBhd ttp://kokufu.blogspot.jp/2014/02/windows-bluetooth-spp-server.html
これとかの雰囲気だと
「受信」で作った側のPCのソフトを先に立ち上げて接続待ちにして(SPPサーバー)
「送信」で作った側のPCを後追いで接続 かなぁ
力になれなくてすまん
これとかの雰囲気だと
「受信」で作った側のPCのソフトを先に立ち上げて接続待ちにして(SPPサーバー)
「送信」で作った側のPCを後追いで接続 かなぁ
力になれなくてすまん
305301
2017/02/01(水) 14:06:25.03ID:RxSebrTI >>304
いえいえ!
色々と調べていただいて参考になりました。
どうもシリアル接続サービスをサポートしていないようです。
今回の条件ではあまり好ましくないのですが、
WiFiを使ったソケット通信で妥協することにします。
ありがとうございました。
いえいえ!
色々と調べていただいて参考になりました。
どうもシリアル接続サービスをサポートしていないようです。
今回の条件ではあまり好ましくないのですが、
WiFiを使ったソケット通信で妥協することにします。
ありがとうございました。
306デフォルトの名無しさん
2017/02/01(水) 14:21:22.91ID:+8V+I8xy307デフォルトの名無しさん
2017/02/01(水) 20:39:39.90ID:3j6uP7e4 >>297
参照をメンバで持ちたい時は、コンストラクタでの初期化以外は無理。
class A {
public:
A(Param& x):m_param(x){}
private:
Param& m_param;
};
参照をメンバで持ちたい時は、コンストラクタでの初期化以外は無理。
class A {
public:
A(Param& x):m_param(x){}
private:
Param& m_param;
};
308デフォルトの名無しさん
2017/02/02(木) 01:04:42.40ID: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に入れた場合どのようにしてオーバーロードされた演算子を利用できますか?
自クラス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.78ID:FXYEZ0RW310デフォルトの名無しさん
2017/02/02(木) 02:04:10.33ID:CAgg+EtY >>309
ありがとうございます
weak_ptrを使っている理由は
funcはあるクラスのメンバ関数で、引数で渡されたポインタの所有権をクラスが持たないこと示すためにweak_ptrを使っているのですが
weak_ptr::expired()な場合は想定していません
ありがとうございます
weak_ptrを使っている理由は
funcはあるクラスのメンバ関数で、引数で渡されたポインタの所有権をクラスが持たないこと示すためにweak_ptrを使っているのですが
weak_ptr::expired()な場合は想定していません
311デフォルトの名無しさん
2017/02/02(木) 02:21:14.81ID:ExAPXdhA312デフォルトの名無しさん
2017/02/02(木) 02:21:18.81ID:EB2HJN86 スマートポインタはポインタのように振る舞うものだから
*や->でポインタの指す値にしなければならないよ
*や->でポインタの指す値にしなければならないよ
313デフォルトの名無しさん
2017/02/02(木) 10:51:03.92ID: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サイズが期待しているよりも小さく、実行時に例外で強制終了します
そういうことはできないのでしょうか?
複数の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.83ID:cH1kwi7M 例外を具体的に
315デフォルトの名無しさん
2017/02/02(木) 13:18:13.30ID:Nq0thOwX >>314
> ハンドルされない例外がスローされました:読み取りアクセス違反。
> xxxxx が nullptr でした。
xxxxxはポインタ変数
exeサイズが小さいからリンクできてるように見えてリンクできてないのかなとは思うけど
libの追加方法を#pragma comment(lib,"")にしてもうまくいかずでどうしたらいいものか
> ハンドルされない例外がスローされました:読み取りアクセス違反。
> xxxxx が nullptr でした。
xxxxxはポインタ変数
exeサイズが小さいからリンクできてるように見えてリンクできてないのかなとは思うけど
libの追加方法を#pragma comment(lib,"")にしてもうまくいかずでどうしたらいいものか
316デフォルトの名無しさん
2017/02/02(木) 18:40:08.32ID:qO0hDPsp317デフォルトの名無しさん
2017/02/02(木) 18:48:07.72ID:S7kpFPUA318デフォルトの名無しさん
2017/02/02(木) 19:11:39.98ID:Eu4e1EaI319デフォルトの名無しさん
2017/02/02(木) 19:16:04.83ID:WkIFQVuy320デフォルトの名無しさん
2017/02/02(木) 19:18:03.73ID:qhXDtbED .c, .cpp から .lib 作るプロジェクト -(A)
そいつをリンクしつつ、 .c, .cpp から実行ファイルを作るプロジェクト -(B)
(参照設定とか依存関係とかで (A) を使うぜ俺 って指定する)
そいつをリンクしつつ、 .c, .cpp から実行ファイルを作るプロジェクト -(B)
(参照設定とか依存関係とかで (A) を使うぜ俺 って指定する)
321デフォルトの名無しさん
2017/02/02(木) 19:38:57.55ID:WkIFQVuy こんな感じだろ
ソースからobj生成: VSプロジェクトでなくていい
VSプロジェクト
1. objからexe作るVSプロジェクト (結果OK)
2. objからlib作るVSプロジェクト (3.がNGで、本当にうまくlib作れたかわからず)
3. 上のlibからexe作るVSプロジェクト (exeが例外でNG)
ソースから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.25ID:Eu4e1EaI323デフォルトの名無しさん
2017/02/02(木) 20:22:53.95ID:k638XiO/ そこまで行ったらDLLに分けるだろう
324313
2017/02/03(金) 13:56:09.01ID: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を作る
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.01ID: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);
}
コンパイル(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.05ID: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
"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.86ID:xVLuMTde328デフォルトの名無しさん
2017/02/03(金) 15:42:48.87ID:3xPmzf3n >>327
使ってるのも使ってないのもある
libの追加方法は二通り試したけどどちらもビルドエラーはでないけど実行時NG
どちらもlibの追加を省略すると外部シンボルが見つからないエラーでビルドが通らない
プロジェクトのプロパティの「追加の依存ファイル」から→実行時NG
ソースファイル中に「#pragma comment(lib,"")」から→実行時NG
使ってるのも使ってないのもある
libの追加方法は二通り試したけどどちらもビルドエラーはでないけど実行時NG
どちらもlibの追加を省略すると外部シンボルが見つからないエラーでビルドが通らない
プロジェクトのプロパティの「追加の依存ファイル」から→実行時NG
ソースファイル中に「#pragma comment(lib,"")」から→実行時NG
329デフォルトの名無しさん
2017/02/04(土) 00:14:20.36ID:z/XsYQOx 何もしていない普通の一般人の自宅に隠しカメラを取り付け
それをネットでリアルタイム配信
仲間という人間に対する盗聴盗撮生ネット配信の会
しかけたカメラの映像
乗っ取っているPCの画像をリアルタイムで生配信中
集団で仲間の私生活を覗いて楽しんでいる
そんなことが今この国では行われています
それをネットでリアルタイム配信
仲間という人間に対する盗聴盗撮生ネット配信の会
しかけたカメラの映像
乗っ取っているPCの画像をリアルタイムで生配信中
集団で仲間の私生活を覗いて楽しんでいる
そんなことが今この国では行われています
330デフォルトの名無しさん
2017/02/04(土) 05:54:43.47ID:/r5Uxr2+ libでリンク解決してもダイナミックリンクにしてれば実行時にパス内に見つからずにエラー
スタティックリンクにしないと
スタティックリンクにしないと
331デフォルトの名無しさん
2017/02/04(土) 09:51:58.52ID:GdM1I4zb 久々にプログラミングしようと思うんですけど
USBカメラがあるからそれを使って監視カメラにしたいんだが
ピクセルデータが取れればあとは簡単だと思うんだけど、その前に
この適当に昔買ったバッファローのUSBからデータ取り出す事って可能なんですか?
USBカメラがあるからそれを使って監視カメラにしたいんだが
ピクセルデータが取れればあとは簡単だと思うんだけど、その前に
この適当に昔買ったバッファローのUSBからデータ取り出す事って可能なんですか?
332デフォルトの名無しさん
2017/02/04(土) 10:24:35.81ID:94H9RTyk333デフォルトの名無しさん
2017/02/04(土) 10:55:19.44ID:GdM1I4zb >>332
ありがとうございますだ
ありがとうございますだ
334デフォルトの名無しさん
2017/02/04(土) 21:25:32.55ID:uqEM2LY/ int a = 0;
int *b = &(1+a);
これが出来ないのはなぜですか?
1+aの計算結果というのはメモリ上のどこかにあると思うんですが
int *b = &(1+a);
これが出来ないのはなぜですか?
1+aの計算結果というのはメモリ上のどこかにあると思うんですが
336デフォルトの名無しさん
2017/02/04(土) 21:31:18.24ID:3pCbKNVT &1 を許すとややこしいことになりそうだ
337デフォルトの名無しさん
2017/02/04(土) 21:38:25.89ID:wIflvrKT >>334
計算結果はレジスタに入っててメモリには入ってないんじゃない?
計算結果はレジスタに入っててメモリには入ってないんじゃない?
338デフォルトの名無しさん
2017/02/04(土) 21:52:37.41ID:uqEM2LY/339デフォルトの名無しさん
2017/02/05(日) 19:35:43.24ID:ktep0Dpi340デフォルトの名無しさん
2017/02/05(日) 22:43:20.73ID:F2ePDpTS >337
レジスタがメモリじゃないかのようなアホレスだな
レジスタがメモリじゃないかのようなアホレスだな
341デフォルトの名無しさん
2017/02/05(日) 23:03:58.60ID:wagcFIA6 レジスタのアドレスって・・・
342デフォルトの名無しさん
2017/02/06(月) 01:31:32.48ID:DI3VdQ+9 アドレスのないレジスタはCでアクセスできないからな
アセンブリでしてねになるからね
アセンブリでしてねになるからね
343デフォルトの名無しさん
2017/02/06(月) 03:41:00.32ID:oG8S/cPb って言うかレジスタ関係なくね?
右辺値に対してアドレス取ろうとしてるから駄目なわけで。
右辺値に対してアドレス取ろうとしてるから駄目なわけで。
344デフォルトの名無しさん
2017/02/06(月) 05:58:55.21ID:GvVdGH4O >>334 の質問に対して「右辺値」を出すのは大げさじゃないかな。
もちろん正しいんだけど、詳細に踏み込みすぎというか、
その話はもっと理解が深まってから、というか。
「過去に自分がこの疑問を持ったときに、どんな説明をされたら
すっきり腑に落ちて先に進めただろうか」と思い返しながら回答してるんだろう。
もちろん正しいんだけど、詳細に踏み込みすぎというか、
その話はもっと理解が深まってから、というか。
「過去に自分がこの疑問を持ったときに、どんな説明をされたら
すっきり腑に落ちて先に進めただろうか」と思い返しながら回答してるんだろう。
345デフォルトの名無しさん
2017/02/06(月) 08:21:18.53ID:87jFG7WV346デフォルトの名無しさん
2017/02/06(月) 08:58:46.99ID:L0zP1ki7 間違った説明で相手を納得させておいて開き直りとはこれいかに
347デフォルトの名無しさん
2017/02/06(月) 13:17:28.90ID:WLH8uv6+348デフォルトの名無しさん
2017/02/06(月) 20:21:28.41ID:VJg+IRhi349デフォルトの名無しさん
2017/02/06(月) 20:22:09.67ID:VJg+IRhi350デフォルトの名無しさん
2017/02/06(月) 20:58:58.36ID:oG8S/cPb >>344
でもさ、レジスタって言語と関係ないじゃん?
でもさ、レジスタって言語と関係ないじゃん?
351デフォルトの名無しさん
2017/02/06(月) 21:52:01.05ID:w07g0Jpo registerは予約語なのに無関係は無いわ
352デフォルトの名無しさん
2017/02/06(月) 22:13:36.15ID:rtwfNknd >registerは予約語なのに無関係は無いわ
規格のどこを読んだら「register」キーワードと「レジスター」との関連が読みとれるんだか
規格のどこを読んだら「register」キーワードと「レジスター」との関連が読みとれるんだか
353デフォルトの名無しさん
2017/02/06(月) 23:29:15.59ID:w07g0Jpo 規格厨には理解しろと言っても無理だ
354デフォルトの名無しさん
2017/02/06(月) 23:45:37.66ID:+fmEnPzx >int a = 0;
>int *b = &(1+a);
っていうのが今intになってるからレジスタがどうとか言えるけど
intじゃなくて自分で定義したクラスとかだったらどうなんだって話だな
レジスタだからアドレスが取れないっていう説明はアレすぎないかい?
そもそもレジスタだけで済ませるかどうかはコンパイラの自由ってのもあるし
>int *b = &(1+a);
っていうのが今intになってるからレジスタがどうとか言えるけど
intじゃなくて自分で定義したクラスとかだったらどうなんだって話だな
レジスタだからアドレスが取れないっていう説明はアレすぎないかい?
そもそもレジスタだけで済ませるかどうかはコンパイラの自由ってのもあるし
355デフォルトの名無しさん
2017/02/06(月) 23:48:30.59ID:tIYhS76V 一生懸命だなあw
356デフォルトの名無しさん
2017/02/07(火) 00:11:08.64ID:STnejiJM 俺が思うにさ
最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは
普通にありふれているわけじゃないですか
で、それらの変数のアドレスを取得するように
コードを書き換えたら、コンパイルエラーになるんですか?ってね
その場合ちゃんとコンパイラはメモリに実体を作るような動作になる
だからレジスタ云々はオプティマイズの話であって本質的に全く関係ないだろうと
レジスタに配置されているからアドレス取得できませんって意味不明で
だったらメモリに実体を作ればいくらでもアドレス取得できるだろって話なんだよ
どちらかというとこれは変数の寿命の関係でそうなっているんだよ
最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは
普通にありふれているわけじゃないですか
で、それらの変数のアドレスを取得するように
コードを書き換えたら、コンパイルエラーになるんですか?ってね
その場合ちゃんとコンパイラはメモリに実体を作るような動作になる
だからレジスタ云々はオプティマイズの話であって本質的に全く関係ないだろうと
レジスタに配置されているからアドレス取得できませんって意味不明で
だったらメモリに実体を作ればいくらでもアドレス取得できるだろって話なんだよ
どちらかというとこれは変数の寿命の関係でそうなっているんだよ
357デフォルトの名無しさん
2017/02/07(火) 00:12:13.25ID:vsDAW+dO 初心者向けの簡易な説明に外野がつまらない茶々入れて大騒ぎするなよ。
358デフォルトの名無しさん
2017/02/07(火) 00:25:30.14ID:pfKer2X+ >最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは
>普通にありふれているわけじゃないですか
本当にありふれてるのか?
>普通にありふれているわけじゃないですか
本当にありふれてるのか?
359デフォルトの名無しさん
2017/02/07(火) 00:48:05.62ID:PI0qtNzz winsock(UDP)を使ったプログラムを作っています。
ほぼできたのですが、数100回繰り返すと徐々に通信が
遅くなっていきます。
通信するたびに、オープンとクローズを繰り返しているのですが、
その辺に原因がありそうでしょうか・・・。
ほぼできたのですが、数100回繰り返すと徐々に通信が
遅くなっていきます。
通信するたびに、オープンとクローズを繰り返しているのですが、
その辺に原因がありそうでしょうか・・・。
360デフォルトの名無しさん
2017/02/07(火) 02:25:04.93ID:e2fTv1VF メモリを解放していないから、使用メモリがドンドン大きくなっていくとか?
プロセスの使用メモリを、チェックすれば?
プロセスの使用メモリを、チェックすれば?
361デフォルトの名無しさん
2017/02/07(火) 07:22:03.04ID:ff698yUf362デフォルトの名無しさん
2017/02/07(火) 07:23:26.33ID:ff698yUf >>359
再現性あるならどこが遅くなってるかを調べたら?
再現性あるならどこが遅くなってるかを調べたら?
363デフォルトの名無しさん
2017/02/07(火) 07:43:41.13ID:AbeSLyAt >その自由さのために言語仕様でできないようにしてるだけでしょ
根拠は俺の「こうだったらいいな」
この理屈で行くとアドレスをとれる変数は
レジスタに乗せてはいけないことになるな
根拠は俺の「こうだったらいいな」
この理屈で行くとアドレスをとれる変数は
レジスタに乗せてはいけないことになるな
364デフォルトの名無しさん
2017/02/07(火) 11:15:58.10ID:bjgueVwS register云々してるやつはCかC++か区別して書け
365デフォルトの名無しさん
2017/02/07(火) 11:47:58.10ID:+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の内部を変えることでアクセスできるようにする方法ない?
{
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.77ID:Ex9Qk6T0 public:
using A::xxx;
using A::xxx;
367デフォルトの名無しさん
2017/02/07(火) 11:57:42.37ID:+LdvU0fQ >>366
おお!yyy()もそれでいけるね。サンクス
おお!yyy()もそれでいけるね。サンクス
368デフォルトの名無しさん
2017/02/07(火) 19:45:06.55ID:R+lISOuU369デフォルトの名無しさん
2017/02/08(水) 19:54:01.02ID:zyGgo9zG 俺,register使ったことないが
register int a = 0;
int *b = &a;
とすると、b経由で割り当てられたCPUレジスタにアクセスできるのか?
register int a = 0;
int *b = &a;
とすると、b経由で割り当てられたCPUレジスタにアクセスできるのか?
370デフォルトの名無しさん
2017/02/08(水) 20:15:16.32ID:x9WXoVQQ cではregister指定された変数のアドレスは取れない
c++では取ってもいいが、取ると普通はレジスタではなくメモリ割り当てになる
そもそもregister指定しても必ずレジスタ割り当てになるわけではない
今のコンパイラの多くはregisterを無視してるらしい
c++では取ってもいいが、取ると普通はレジスタではなくメモリ割り当てになる
そもそもregister指定しても必ずレジスタ割り当てになるわけではない
今のコンパイラの多くはregisterを無視してるらしい
371デフォルトの名無しさん
2017/02/08(水) 20:21:15.44ID:6Dg3FALd >>369
それ面白いけど実装がめちゃくちゃ大変だし、そもそもメリットないだろ
それ面白いけど実装がめちゃくちゃ大変だし、そもそもメリットないだろ
372デフォルトの名無しさん
2017/02/08(水) 20:38:12.66ID:Z1e//95W C++では次のC++17(今年出る予定)から機能削除、かつ将来のためにキーワードは予約だよ
373デフォルトの名無しさん
2017/02/08(水) 20:41:11.49ID:039KZGQ+ register int a = 0;
int *b = &a;
これで b が a を格納してるCPUレジスタをポイントすると、
b++ とかした時に、どのレジスタを指すの? て話で困るんじゃないか。
int& b = a;
という具合に参照で受ければ何とか…。
int *b = &a;
これで b が a を格納してるCPUレジスタをポイントすると、
b++ とかした時に、どのレジスタを指すの? て話で困るんじゃないか。
int& b = a;
という具合に参照で受ければ何とか…。
374デフォルトの名無しさん
2017/02/08(水) 20:43:52.35ID:Z1e//95W >>373
そんなの普通の変数だって未定義動作じゃん
そんなの普通の変数だって未定義動作じゃん
375デフォルトの名無しさん
2017/02/08(水) 20:47:07.07ID:6Dg3FALd376デフォルトの名無しさん
2017/02/08(水) 21:02:48.15ID:x9WXoVQQ なんでx86前提なんだよ
実際出来ないんだから議論の意味ないが、出来たとしても実装依存だろ
実際出来ないんだから議論の意味ないが、出来たとしても実装依存だろ
377デフォルトの名無しさん
2017/02/08(水) 22:06:39.93ID:r8a3b7fC378デフォルトの名無しさん
2017/02/08(水) 22:23:33.67ID:t4XC3Oio p++ が動作未定儀か否かとは関係ない話だと思うが
ポインタの指し先を求めず、ポインタの演算と差分
int a;
int* p = &a;
int* q = p + 1;
q-p;
で 実体の要素数+1 までは正しく差分が取れることを保障している ってどっかであった記憶
ポインタの指し先を求めず、ポインタの演算と差分
int a;
int* p = &a;
int* q = p + 1;
q-p;
で 実体の要素数+1 までは正しく差分が取れることを保障している ってどっかであった記憶
379デフォルトの名無しさん
2017/02/09(木) 02:31:40.69ID:lnTHGhne380デフォルトの名無しさん
2017/02/09(木) 03:48:37.73ID:WRm++DjL int i;
int *ip=&i;
ip+1はほんとにあるんかい?
いやあるんだろうけどw
int *ip=&i;
ip+1はほんとにあるんかい?
いやあるんだろうけどw
381デフォルトの名無しさん
2017/02/09(木) 06:05:01.98ID:4sYnDBFk 同等なレジスタを32個とか内蔵してて番号で区別する
RISCチップだと不自然でもない気がしてきた。
RISCチップだと不自然でもない気がしてきた。
382デフォルトの名無しさん
2017/02/09(木) 06:22:52.94ID:ZHuRANtU383デフォルトの名無しさん
2017/02/09(木) 06:42:00.30ID:RO+sEjyT >>376
> なんでx86前提なんだよ
お前の言うように実装依存なんだから例に決まってるだろ
68k なら d0, d1, ... ってもっと分かりやすいし他のプロセッサでも適当に決めりゃいいだけ
てか、ネタに突っ込むならもっと面白い奴にしてくれ
> なんでx86前提なんだよ
お前の言うように実装依存なんだから例に決まってるだろ
68k なら d0, d1, ... ってもっと分かりやすいし他のプロセッサでも適当に決めりゃいいだけ
てか、ネタに突っ込むならもっと面白い奴にしてくれ
384デフォルトの名無しさん
2017/02/09(木) 07:01:49.92ID:RO+sEjyT >>381
for(register int* r = &_r0; r < &_r32; r++){
*r = 0;
}
で、全レジスタがクリアできるとか便利かも
で r が _r3 辺りに割り当てられててバグるところまでがセットだよな w
for(register int* r = &_r0; r < &_r32; r++){
*r = 0;
}
で、全レジスタがクリアできるとか便利かも
で r が _r3 辺りに割り当てられててバグるところまでがセットだよな w
385デフォルトの名無しさん
2017/02/09(木) 12:57:20.22ID:DuGTx+Z0 レジスタってそう多くないから別に…
SPARCのレジスタウィンドウ合わせて128個とかならまあ
SPARCのレジスタウィンドウ合わせて128個とかならまあ
386デフォルトの名無しさん
2017/02/09(木) 14:24:27.76ID:ZeoIDdik つ ゼロページレジスタ
387デフォルトの名無しさん
2017/02/09(木) 16:59:44.90ID:m9bylyVb register int a = 0;
int *b = &a;
としたとき、Cではアドレスが取れないって話だったが、C++では取れる
が、次期規格でregisterは無視されるようになる・・・って話だよね
ま、仮にアドレスを取ったとしても何も問題ないように思うが
というのも、CPUの演算は通常レジスタに対してしかできないし
一方でアドレスが取れるのはメモリにあるものだけなので
普通の変数もレジスタとメモリの間を最新の値が行ったり来たりしているのが通常で
コンパイラは矛盾が起きないようなコードを吐き出すように出来ている
だからregister指定要らないよねって話になってるだろう
そもそも、可能な限りレジスタに配置する、というのがあいまいで
レジスタは有限個なのでregister指定しても必ずしもレジスタのみに配置されるかどうか
分からないしCPUにもよる
ここで、アドレスを取ったらレジスタのみに配置することが出来ないのだから
register指定であっても、「可能な限りレジスタに配置する」が出来ないということで
普通の変数扱いということで問題ない
int *b = &a;
としたとき、Cではアドレスが取れないって話だったが、C++では取れる
が、次期規格でregisterは無視されるようになる・・・って話だよね
ま、仮にアドレスを取ったとしても何も問題ないように思うが
というのも、CPUの演算は通常レジスタに対してしかできないし
一方でアドレスが取れるのはメモリにあるものだけなので
普通の変数もレジスタとメモリの間を最新の値が行ったり来たりしているのが通常で
コンパイラは矛盾が起きないようなコードを吐き出すように出来ている
だからregister指定要らないよねって話になってるだろう
そもそも、可能な限りレジスタに配置する、というのがあいまいで
レジスタは有限個なのでregister指定しても必ずしもレジスタのみに配置されるかどうか
分からないしCPUにもよる
ここで、アドレスを取ったらレジスタのみに配置することが出来ないのだから
register指定であっても、「可能な限りレジスタに配置する」が出来ないということで
普通の変数扱いということで問題ない
388デフォルトの名無しさん
2017/02/09(木) 17:03:46.90ID:XjHAaCWU >次期規格でregisterは無視されるようになる・・・って話だよね
文盲は去れ
長文で荒らすな
文盲は去れ
長文で荒らすな
389デフォルトの名無しさん
2017/02/09(木) 17:18:48.08ID:m9bylyVb >372 名前:デフォルトの名無しさん[] 投稿日:2017/02/08(水) 20:38:12.66 ID:Z1e//95W [1/2]
>C++では次のC++17(今年出る予定)から機能削除、かつ将来のためにキーワードは予約だよ
は噓ということ?
>C++では次のC++17(今年出る予定)から機能削除、かつ将来のためにキーワードは予約だよ
は噓ということ?
390デフォルトの名無しさん
2017/02/09(木) 17:24:14.08ID:WRm++DjL registerってのを使わなきゃいんでないのw
391デフォルトの名無しさん
2017/02/09(木) 17:31:18.93ID:aUQtcCRM 規格なんて知らんがレスから想像するとこうじゃないのか?
今の規格は「可能ならレジスタに割り当てろ」で、実際のコンパイラは無視してるのが多い
事実上機能してないから次期規格では仕様変えてregister変数やめる
今の規格は「可能ならレジスタに割り当てろ」で、実際のコンパイラは無視してるのが多い
事実上機能してないから次期規格では仕様変えてregister変数やめる
392デフォルトの名無しさん
2017/02/09(木) 17:50:34.94ID:55oKC5Ju C++ではすでにregisterは無視されてて、17からはエラーになるってことだろ
393デフォルトの名無しさん
2017/02/09(木) 18:47:17.89ID:lnTHGhne C++11の時点でdeprecatedになってて
C++17で書いたらエラーになる
キーワードはいつか規格で何かに再利用するかもしれないから予約したまま(ユーザーが関数名などに使用出来ないまま)。
C++17で書いたらエラーになる
キーワードはいつか規格で何かに再利用するかもしれないから予約したまま(ユーザーが関数名などに使用出来ないまま)。
394デフォルトの名無しさん
2017/02/09(木) 19:03:26.16ID:QPpApk6a395デフォルトの名無しさん
2017/02/09(木) 20:05:28.75ID:IuYXl6Zl >>393
registerについては、再利用の可能性というより、混乱の元だから今後は誰も触れてくれるなってところかな。
registerについては、再利用の可能性というより、混乱の元だから今後は誰も触れてくれるなってところかな。
396デフォルトの名無しさん
2017/02/09(木) 20:34:41.55ID:wAatsUnZ 今、キーワードとして問題ないからそのままにしておくってことだろ
一旦キーワードでなくしてしまうと将来また使いたくなった時に大混乱するから
一旦キーワードでなくしてしまうと将来また使いたくなった時に大混乱するから
397デフォルトの名無しさん
2017/02/09(木) 20:46:05.15ID:WRm++DjL C++17なんてもあるのか。 ついてけんわぁ
398デフォルトの名無しさん
2017/02/10(金) 12:36:17.18ID:yPTk9ivW register使うなら今のうち
399デフォルトの名無しさん
2017/02/10(金) 16:29:47.71ID:gDFEqThI C++17以降のregisterは、ガチャガチャチーン!とbeep音を鳴らします
400デフォルトの名無しさん
2017/02/11(土) 17:45:33.84ID: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;
}
#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.59ID:o1zrWG0U registerネタどんだけ続けるんだ
402デフォルトの名無しさん
2017/02/11(土) 18:02:59.72ID:Ka66uAeU >int main(void) {
> register int i;
変数を先頭で宣言しないと精神の安定が保てない病気
> register int i;
変数を先頭で宣言しないと精神の安定が保てない病気
403デフォルトの名無しさん
2017/02/11(土) 18:27:32.77ID:2x1BPms4 っくっだらないとこでも叩いておかないと精神の安定が保てない病気
404デフォルトの名無しさん
2017/02/11(土) 18:51:03.55ID:jl0P82O4 インデントや{}のスペース・改行でも自分のやり方と違うと喚きそうだなw
405デフォルトの名無しさん
2017/02/11(土) 19:53:33.79ID:7HNC8OW9 >>404
違和感がでるよね。
会社でこれがうちのスタイルって強制され、それになじむと
そうじゃないスタイルのものは気持ち悪いって感じるようになった
>for(i=0 ; i <100000000 ; i++);
最近のコンパイラはまじめにやらないで、コンパイル時にiは使ってないあるね
処理省くニダってして実行コード生成してなさそうな気がするが。
違和感がでるよね。
会社でこれがうちのスタイルって強制され、それになじむと
そうじゃないスタイルのものは気持ち悪いって感じるようになった
>for(i=0 ; i <100000000 ; i++);
最近のコンパイラはまじめにやらないで、コンパイル時にiは使ってないあるね
処理省くニダってして実行コード生成してなさそうな気がするが。
406デフォルトの名無しさん
2017/02/11(土) 19:59:07.05ID:nnf0vKBy K&R2 あたりにあわせておけば問題ないのでは?
というか,K&R2 から大幅に変えさせられるのは苦痛だな
というか,K&R2 から大幅に変えさせられるのは苦痛だな
407デフォルトの名無しさん
2017/02/11(土) 21:18:53.92ID:vquAI+Jk 21世紀にもなってK&Rとか何の冗談
変化が苦痛な老人はすっこんでて
変化が苦痛な老人はすっこんでて
408デフォルトの名無しさん
2017/02/11(土) 21:22:09.84ID:e+WRwiZx409デフォルトの名無しさん
2017/02/11(土) 21:51:35.00ID:o1zrWG0U 21世紀に相応しいスタイルを是非教えてくれ
410デフォルトの名無しさん
2017/02/11(土) 22:42:56.52ID:2x1BPms4 可能な限りC/C++使わない
それが21世紀スタイル
それが21世紀スタイル
411デフォルトの名無しさん
2017/02/11(土) 22:58:24.73ID:nOWXV3w9 >>410
おいおい、でも、それが正しいな。
おいおい、でも、それが正しいな。
412デフォルトの名無しさん
2017/02/12(日) 02:53:21.48ID:guRObziH 正しいけど"可能な限り"の範囲がまだまだ足りない
組み込みの世界はC言語が強過ぎて未だにC++すら使えない環境がざらにあるしな
組み込みの世界はC言語が強過ぎて未だにC++すら使えない環境がざらにあるしな
413デフォルトの名無しさん
2017/02/12(日) 08:33:11.98ID:XNCDxJ48 >>407
C/C++ くらいなら,K&R2 に準拠にさせてよー C#, Java も,とはいわないからさー
C/C++ くらいなら,K&R2 に準拠にさせてよー C#, Java も,とはいわないからさー
414デフォルトの名無しさん
2017/02/12(日) 08:43:31.97ID:MRPxQTsD >>413
C++を入れるなよ
C++を入れるなよ
415デフォルトの名無しさん
2017/02/12(日) 10:10:03.29ID:nF2JpTw9 結局C言語で全て済んでしまうからね。他は趣味。はっきりわかんだね
416デフォルトの名無しさん
2017/02/12(日) 14:01:05.04ID:XNCDxJ48 >>414
いっしょだよ,C++ も普通に K&R2 に似せて書くのが一番いい
いっしょだよ,C++ も普通に K&R2 に似せて書くのが一番いい
417デフォルトの名無しさん
2017/02/12(日) 15:47:27.43ID:CF268nsq >>402 の「ブロック先頭で変数を定義するのは時代遅れ」ていう
指摘を受けての流れじゃないかな。
最初の使用の直前まで変数定義を遅らせることができる、
というC++での改良や、それを取り込んだC99以降で
わざわざK&R2版の書き方に制限されるのは困るという話。
おそらく、K&R2に似たスタイルが良いという主張も
「新しく追加された便利機能は使った上でK&R風のスタイル」
という意図なんだと思う。
指摘を受けての流れじゃないかな。
最初の使用の直前まで変数定義を遅らせることができる、
というC++での改良や、それを取り込んだC99以降で
わざわざK&R2版の書き方に制限されるのは困るという話。
おそらく、K&R2に似たスタイルが良いという主張も
「新しく追加された便利機能は使った上でK&R風のスタイル」
という意図なんだと思う。
418デフォルトの名無しさん
2017/02/12(日) 15:59:10.19ID:rZ/K+l3Q >>400はiの宣言を先に、tよりも先にすることで、何を試したのかってのをわかりやすくしてんだろ
K&Rなんかにこだわるよりもこういうソースの方がいいわ
K&Rなんかにこだわるよりもこういうソースの方がいいわ
419デフォルトの名無しさん
2017/02/12(日) 17:25:00.92ID:XNCDxJ48 >>417
当然だ
当然だ
420デフォルトの名無しさん
2017/02/13(月) 00:11:12.09ID:ebN6PGVD 使う直前に変数を宣言してるとたまにgoto出来ないerrorが出るのが面倒くさい
421デフォルトの名無しさん
2017/02/13(月) 11:51:26.73ID:M86uydzz ブロックの違う同名変数の取り違えでトラブってるのを見てから
宣言位置が不揃いなのもよくないと思うようになった
宣言位置が不揃いなのもよくないと思うようになった
422デフォルトの名無しさん
2017/02/14(火) 01:24:51.99ID:xlM9Sf4d それは宣言位置の問題じゃなくて、1ブロックが大き過ぎることが原因じゃないか?
423デフォルトの名無しさん
2017/02/14(火) 08:51:02.57ID:SrPWZnE2 スコープ違う同名の変数を書いたら間違えた
↓
宣言位置をスコープの先頭に揃えておけば俺はきっと気づけたんだ!
これがバカの思考
↓
宣言位置をスコープの先頭に揃えておけば俺はきっと気づけたんだ!
これがバカの思考
424デフォルトの名無しさん
2017/02/14(火) 09:10:51.81ID:MfKEp5BT お前等が宣言位置を先頭に揃えておかなかったから俺が間違えたんだ
とまでいかなければまだ許せる。
とまでいかなければまだ許せる。
425デフォルトの名無しさん
2017/02/14(火) 09:11:22.01ID:H0Zx0irg426デフォルトの名無しさん
2017/02/14(火) 09:16:00.91ID:MfKEp5BT 423じゃないが間違えたことないな
どうやったら間違えるのか教えて欲しいくらい
どうやったら間違えるのか教えて欲しいくらい
427デフォルトの名無しさん
2017/02/14(火) 09:25:27.92ID:he6YB8dM 多分ブロックごとコピペしてたまたまエラーが出なかったんだろ
428デフォルトの名無しさん
2017/02/14(火) 09:37:58.47ID:tRUBGDEd 世の中には1関数が1000行を超える糞コードが存在するからな
そんな糞コードに後から修正入れようとすると信じられないようなミスも起こる
そんな糞コードに後から修正入れようとすると信じられないようなミスも起こる
429デフォルトの名無しさん
2017/02/14(火) 10:07:10.54ID:H0Zx0irg 関数の長さと糞さは別だな
無理に短くしてあちこち飛ぶコードの読みにくさったらありゃしない
無理に短くしてあちこち飛ぶコードの読みにくさったらありゃしない
430デフォルトの名無しさん
2017/02/14(火) 10:25:24.18ID:ze+N1Rxh 短いからといって読みやすいはとは限らないが、
長いと読みにくいのは確実なので無関係ではないな
長いと読みにくいのは確実なので無関係ではないな
431デフォルトの名無しさん
2017/02/14(火) 12:52:20.45ID:8LvI494R >>429
1行目と2行目で矛盾してるぞ
1行目と2行目で矛盾してるぞ
432デフォルトの名無しさん
2017/02/14(火) 15:01:49.07ID:Y4N6R9g2 短く を目標にはしないが、長いと
どうしても何かの力を感じてw
短くしたくなるわなぁ
どうしても何かの力を感じてw
短くしたくなるわなぁ
433デフォルトの名無しさん
2017/02/14(火) 15:19:01.37ID:t9BEI7G/ 必死にprivate関数で小分けにしてた頃を思い出すわ
気にしなくなってprivate関数の存在価値がよく分からなくなった
気にしなくなってprivate関数の存在価値がよく分からなくなった
434デフォルトの名無しさん
2017/02/14(火) 15:31:24.51ID:Y4N6R9g2 privateとその長さは関係ないと思うが
435デフォルトの名無しさん
2017/02/14(火) 17:04:37.50ID:lntB2yLX 俺も429派かなぁ
特に再利用するようなものでもないのに関数に小分けにしてもあまり意味がないし
仮に1000行あったとしても、制御構造が単純で上から下へ逐次実行するだけだったり
プログラムの読みにくさと関数の長さは根本的に関係ないと思う
関数の長さに関係なく単純に、
仕様が複雑で、ややこしいことしている箇所は、やはりややこしい
難しいアルゴリズムを使っている個所は、やはり難しい
特に再利用するようなものでもないのに関数に小分けにしてもあまり意味がないし
仮に1000行あったとしても、制御構造が単純で上から下へ逐次実行するだけだったり
プログラムの読みにくさと関数の長さは根本的に関係ないと思う
関数の長さに関係なく単純に、
仕様が複雑で、ややこしいことしている箇所は、やはりややこしい
難しいアルゴリズムを使っている個所は、やはり難しい
436デフォルトの名無しさん
2017/02/14(火) 17:07:50.38ID:lntB2yLX そうはいっても100行を超える関数はさすがに書いたことないけどな
クラスビューとかでジャンプできなくなるから作業性に問題が出る
クラスビューとかでジャンプできなくなるから作業性に問題が出る
437デフォルトの名無しさん
2017/02/14(火) 17:12:21.40ID:lntB2yLX 100行と書いたけど、それは1000行のまちがいだ
100行を超える関数は普通に書くことがあるな
新しいC++になってからラムダが関数内関数の代わりに使えるようになったから
こういったものを駆使すると長い関数を書いても比較的に問題が出にくくなったってのはある
メソッドにするとクラス空間が汚れるから関数内関数の方がよい場合も多々
100行を超える関数は普通に書くことがあるな
新しいC++になってからラムダが関数内関数の代わりに使えるようになったから
こういったものを駆使すると長い関数を書いても比較的に問題が出にくくなったってのはある
メソッドにするとクラス空間が汚れるから関数内関数の方がよい場合も多々
438デフォルトの名無しさん
2017/02/14(火) 19:47:15.52ID:vv2eSSm9 100行超える関数はほとんど書かないけど、
100行超えるコメントはしょっちゅう書くな。
100行超えるコメントはしょっちゅう書くな。
439デフォルトの名無しさん
2017/02/15(水) 01:17:06.93ID:xbLGAB7Z 名付けに困らないくらいの単位で処理を纏めて上にポイだな
無名ネームスペース大活躍
再利用しなくても処理を分けとくとバグを潰しやすいし
無名ネームスペース大活躍
再利用しなくても処理を分けとくとバグを潰しやすいし
440デフォルトの名無しさん
2017/02/16(木) 04:06:20.95ID:6VkTpxSR ラムダ 入門 で検索しても簡単なサイトが見つかりません。
どこか良いサイトか書籍はありませんか。
どこか良いサイトか書籍はありませんか。
441デフォルトの名無しさん
2017/02/16(木) 04:13:34.86ID:0dItl/ZH 入門しなきゃならん奴が使うもんじゃない
442デフォルトの名無しさん
2017/02/16(木) 04:38:21.71ID:6VkTpxSR443デフォルトの名無しさん
2017/02/16(木) 12:45:23.20ID:SkhlZoRn よくわからんもの
ラムダ式、関数オブジェクト
ラムダ式、関数オブジェクト
444デフォルトの名無しさん
2017/02/17(金) 04:01:51.58ID:/gNkD5d3 #include <iostream>
using namespace std;
int main() {
unsigned char aa=0x31;
cout << hex<<aa <<endl;
return 0;
}
なんで 31 と表示されないのでしょう
using namespace std;
int main() {
unsigned char aa=0x31;
cout << hex<<aa <<endl;
return 0;
}
なんで 31 と表示されないのでしょう
445デフォルトの名無しさん
2017/02/17(金) 05:25:27.96ID:Z2r3IJRX たぶん 1 が表示されるでしょ。
aa が char だから出力ストリームでは文字が出る。
数値を出したければ aa を int で定義するか、
cout のところで int にキャストしてやらないと。
aa が char だから出力ストリームでは文字が出る。
数値を出したければ aa を int で定義するか、
cout のところで int にキャストしてやらないと。
446デフォルトの名無しさん
2017/02/17(金) 07:07:08.11ID:39ud/5Wb >aa が char だから出力ストリームでは文字が出る
因果関係がよくからないのですがcharだとなぜ文字がでるの?
因果関係がよくからないのですがcharだとなぜ文字がでるの?
447デフォルトの名無しさん
2017/02/17(金) 07:22:25.14ID:fOTzzkTG >>446
渡した値の型によって、それをどう表示するかが異なるように作られているから。
printfという関数で出力する場合は、出力したい値のほかにそれをどういう形式で出力するかという情報を別に与えていたけど、iostreamでは、型で自動的に処理してくれる。
渡した値の型によって、それをどう表示するかが異なるように作られているから。
printfという関数で出力する場合は、出力したい値のほかにそれをどういう形式で出力するかという情報を別に与えていたけど、iostreamでは、型で自動的に処理してくれる。
448デフォルトの名無しさん
2017/02/17(金) 07:52:16.70ID:+UDZhFA4 uint8_tとか使ってるとき嵌るんだよなぁ。
449デフォルトの名無しさん
2017/02/17(金) 07:53:27.01ID:Z2r3IJRX 「C++では引数の型や個数が異なる同じ名前の関数をいくつも定義できて
引数の型や個数に応じた別々の動作にできる」
「関数引数の変数値が(Cとは異なり)自動的にはintに格上げされない」
くらいしか説明の文面を思いつかないけど、我ながら分かりにくいな。
coutに対する<<演算子(を実行する関数)が、
charの引数に対しては文字を、intの引数に対しては数値を
出力するよう上手いこと作られている。
ってのは「昔からそう決まっとる」式の押し付けがましい感じだし。
引数の型や個数に応じた別々の動作にできる」
「関数引数の変数値が(Cとは異なり)自動的にはintに格上げされない」
くらいしか説明の文面を思いつかないけど、我ながら分かりにくいな。
coutに対する<<演算子(を実行する関数)が、
charの引数に対しては文字を、intの引数に対しては数値を
出力するよう上手いこと作られている。
ってのは「昔からそう決まっとる」式の押し付けがましい感じだし。
450デフォルトの名無しさん
2017/02/17(金) 15:18:41.50ID:/gNkD5d3451デフォルトの名無しさん
2017/02/17(金) 17:04:51.60ID: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自体はできればマネージにしたくないです。。。
フォームのコントロール(ボタンなど)をアンマネージクラスに保持する方法が知りたいです。
// コンストラクタの引数より、ラベルのコントロールを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.68ID:2DCCXMeS C++の話題そのものではないのですが
バブルソートとか初歩的なアルゴリズム
を優しく解説している書籍はありませんか。
Amazon見てるのですがもう少し情報がほしいです。
バブルソートとか初歩的なアルゴリズム
を優しく解説している書籍はありませんか。
Amazon見てるのですがもう少し情報がほしいです。
453デフォルトの名無しさん
2017/02/20(月) 01:05:36.35ID:aWzwD2VT >>452
ピタゴラスイッチでバブルソートやクイックソートの概念をグラフィカルに紹介してたよ。
それはさておき、本屋の店頭でアルゴリズムとかデータ構造とかがタイトルに含まれる本をパラパラめくって分かり易いのを探すといいかと思う。
ピタゴラスイッチでバブルソートやクイックソートの概念をグラフィカルに紹介してたよ。
それはさておき、本屋の店頭でアルゴリズムとかデータ構造とかがタイトルに含まれる本をパラパラめくって分かり易いのを探すといいかと思う。
454デフォルトの名無しさん
2017/02/21(火) 00:15:43.57ID:OFTvUoLj とあるOSSをとあるシステムに移植していて、
Intel(2013)やGNU(4.9系)ではコンパイルできるのに
そのシステム専用コンパイラではコンパイルできずエラーになります。
ソースコードやヘッダファイルを修正すれば通るだろうというのは経験的にわかっているのですが
どこを修正したらよいかというのを見つけ方がわからないのですが見つけ方のコツみたいなのはあるのでしょうか?
Intel(2013)やGNU(4.9系)ではコンパイルできるのに
そのシステム専用コンパイラではコンパイルできずエラーになります。
ソースコードやヘッダファイルを修正すれば通るだろうというのは経験的にわかっているのですが
どこを修正したらよいかというのを見つけ方がわからないのですが見つけ方のコツみたいなのはあるのでしょうか?
455デフォルトの名無しさん
2017/02/21(火) 00:32:08.81ID:fcoMqi2n エラーメッセージの意味を考えろ
456デフォルトの名無しさん
2017/02/21(火) 01:18:37.30ID:9fQxfYbZ >>454
エラーメッセージを見ないことには回答のしようがないと思うぞ
まぁ、専用のコンパイラという言い回しから察するに、C++03程度しかサポートしていない古いコンパイラでも使ってるんじゃないか?
エラーが出ている行の周辺でC++11以降の言語機能か、ライブラリでも使ってんじゃね?
エラーメッセージを見ないことには回答のしようがないと思うぞ
まぁ、専用のコンパイラという言い回しから察するに、C++03程度しかサポートしていない古いコンパイラでも使ってるんじゃないか?
エラーが出ている行の周辺でC++11以降の言語機能か、ライブラリでも使ってんじゃね?
457デフォルトの名無しさん
2017/02/21(火) 01:18:57.64ID:bFUDo/lz >>454
ともかく、
そのシステム専用コンパイラ提供しているところに、世界標準のIntel(2013)やGNU(4.9系)ではコンパイル
出来るのにお前のものではできないから出来るようにしたコンパイラをよこせと激しくクレーム
ともかく、
そのシステム専用コンパイラ提供しているところに、世界標準のIntel(2013)やGNU(4.9系)ではコンパイル
出来るのにお前のものではできないから出来るようにしたコンパイラをよこせと激しくクレーム
458デフォルトの名無しさん
2017/02/21(火) 01:32:37.44ID:bFUDo/lz >>456
C++11いっぱいのコードをC++03に修正するって大変そうだな
C++11いっぱいのコードをC++03に修正するって大変そうだな
459デフォルトの名無しさん
2017/02/21(火) 06:31:57.51ID:OFTvUoLj460デフォルトの名無しさん
2017/02/21(火) 08:12:09.46ID:9fQxfYbZ461デフォルトの名無しさん
2017/02/21(火) 15:33:32.84ID:rWOcc73c 一般論としてどういうことに注意したらいいですかって質問じゃなくて、具体的に解決してもらいたいってことなのかよw
462デフォルトの名無しさん
2017/02/21(火) 22:19:07.17ID:OFTvUoLj463デフォルトの名無しさん
2017/02/21(火) 22:24:52.45ID:qEEiXXQS HOGEの中にHAGEが紛れ込んでるんだな
464デフォルトの名無しさん
2017/02/22(水) 07:28:41.35ID:F7TE97aZ465デフォルトの名無しさん
2017/02/22(水) 11:11:49.24ID:T1tKwjPz >>459
テンプレートが悪さしてるか const の取りこぼしかデフォルト引数のミスが起きているとエスパー
テンプレートが悪さしてるか const の取りこぼしかデフォルト引数のミスが起きているとエスパー
466デフォルトの名無しさん
2017/02/22(水) 19:03:10.40ID:7bpb3LbA printf("%s",buf);
と
fputs(buf,stdout);
どっちが好き?
と
fputs(buf,stdout);
どっちが好き?
467デフォルトの名無しさん
2017/02/22(水) 19:20:15.64ID:JmFr9wbV 違う処理のコードを並べてどっちと言われても
468デフォルトの名無しさん
2017/02/22(水) 19:49:35.49ID:OuXxGo6B >>467みたいな人が居るのでprintfかな
469デフォルトの名無しさん
2017/02/22(水) 20:00:39.94ID:G8P7P0/x どっちも最後に使ったの20年ほど前かな
470デフォルトの名無しさん
2017/02/22(水) 21:09:01.14ID:T1tKwjPz puts とか使ったことないわ
471デフォルトの名無しさん
2017/02/22(水) 21:30:22.88ID:Z0Pf8P/J >>469
ログ出力・エラー出力がメインでstdoutはあんまり使わないよな
ログ出力・エラー出力がメインでstdoutはあんまり使わないよな
472デフォルトの名無しさん
2017/02/22(水) 21:36:43.56ID:3nEefUGO putsは改行してくれるんで好きだな。fputsも。
474デフォルトの名無しさん
2017/02/22(水) 21:51:09.45ID:3nEefUGO >>473
あ そうだった。 すまん
あ そうだった。 すまん
475デフォルトの名無しさん
2017/02/23(木) 00:12:45.93ID:oHheANLP 細かいのを大量に出したいときはprintfは遅い
476デフォルトの名無しさん
2017/02/23(木) 18:17:55.29ID: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");←ここでエラー。なんで?
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.57ID:sZtROie8 >>476
こんすとらくたがprivateだから
こんすとらくたがprivateだから
478デフォルトの名無しさん
2017/02/23(木) 18:23:56.57ID:2nyak89s そういうことかあ
あざす
あざす
479デフォルトの名無しさん
2017/02/23(木) 21:15:37.70ID:JF3nU8GT 生成出来ないクラスってやつね。
480デフォルトの名無しさん
2017/02/23(木) 21:50:10.15ID:33+Wu0JT >>479
friend なクラスからしか生成しないようにするとかはあるね
friend なクラスからしか生成しないようにするとかはあるね
481デフォルトの名無しさん
2017/02/23(木) 21:52:15.77ID:JF3nU8GT はい そゆ事。
482デフォルトの名無しさん
2017/02/23(木) 21:53:15.53ID:0FbQfq3V staticメソッドで生成するって形の時に使うことが多い
singletonとか
singletonとか
483デフォルトの名無しさん
2017/02/23(木) 22:20:39.38ID:v0zRNZ3l ctorはpri.でメンバーはpub.って
どういうことなんだ?
どういうことなんだ?
484デフォルトの名無しさん
2017/02/23(木) 22:26:42.14ID:I6Uc1mEc 一つ前のレスも読めない文盲
485デフォルトの名無しさん
2017/02/23(木) 22:44:21.27ID:SD8t1ALL 質問
C/C++でランタイムで現在のメモリの状態
とくにプロセスが使える余っているメモリの量って調べ方はありますか?
C/C++でランタイムで現在のメモリの状態
とくにプロセスが使える余っているメモリの量って調べ方はありますか?
486デフォルトの名無しさん
2017/02/24(金) 08:45:12.70ID:SswDvM4l 環境すら書かないと言うことは
(実質)環境非依存での方法を聞いてるんだろうな?
(実質)環境非依存での方法を聞いてるんだろうな?
487デフォルトの名無しさん
2017/02/24(金) 08:54:02.15ID:See/JzpM そんなもん無いけどな
488デフォルトの名無しさん
2017/02/24(金) 09:53:13.79ID:0sr6h+Re 失敗するまでmallocやnewを繰り返せばええんや
489デフォルトの名無しさん
2017/02/24(金) 10:43:32.63ID:See/JzpM >>488
Linuxじゃ失敗しないよ
Linuxじゃ失敗しないよ
490デフォルトの名無しさん
2017/02/24(金) 10:53:37.11ID:See/JzpM もたろん割り当てるアドレス空間自体が足りなくなったとか、予め上限を設定しておいたとかいうケースは覗いてな
491デフォルトの名無しさん
2017/02/24(金) 11:09:14.16ID:9xRtAprE 16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。
それはわかる。
逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
それはわかる。
逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
492デフォルトの名無しさん
2017/02/24(金) 11:41:21.86ID:KhjrQy0g 基本的にでっかくメモリ確保というプログラムは作った事がないな。
今はSTLでほげほげ追加してくイメージ。
今はSTLでほげほげ追加してくイメージ。
493デフォルトの名無しさん
2017/02/24(金) 11:47:17.85ID:See/JzpM >>491
>16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。
そうとは限らない。一般的なLnuxの環境依存ではmallocを搭載メモリ以上行っても失敗しない
swap含めて1GBしか積んでいない環境で2GB分malloc可能。確保した領域に書き込んだタイミングで記憶する領域が足りなくなったら色々なプロセスが殺される。oom killerと言われてるもの。
>
逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
実装による。現代的なコンピューターではページ単位(4KB)とかでカーネルからプロセスへすきなアドレスへメモリを割り当てられるから物理的なアドレスが連続している必要はない。
プロセス内に連続したアドレス空間が残っていない場合は失敗する
>16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。
そうとは限らない。一般的なLnuxの環境依存ではmallocを搭載メモリ以上行っても失敗しない
swap含めて1GBしか積んでいない環境で2GB分malloc可能。確保した領域に書き込んだタイミングで記憶する領域が足りなくなったら色々なプロセスが殺される。oom killerと言われてるもの。
>
逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
実装による。現代的なコンピューターではページ単位(4KB)とかでカーネルからプロセスへすきなアドレスへメモリを割り当てられるから物理的なアドレスが連続している必要はない。
プロセス内に連続したアドレス空間が残っていない場合は失敗する
494デフォルトの名無しさん
2017/02/24(金) 11:52:16.13ID:NAh96dM2 仮想メモリというしくみで色々やってくれるようになって
キャパの限界付近ではややこしくなった印象
キャパの限界付近ではややこしくなった印象
495デフォルトの名無しさん
2017/02/24(金) 12:48:55.46ID:KhjrQy0g 家鯖は6G積んでるけどそれぐらいは行けるね。
てかkvmやってると、9Gコミットされてるもん。
てかkvmやってると、9Gコミットされてるもん。
496デフォルトの名無しさん
2017/02/24(金) 15:10:06.50ID:CcmE3pWB >>488
それスワップエリアのサイズ計ってるだけ
それスワップエリアのサイズ計ってるだけ
497デフォルトの名無しさん
2017/02/24(金) 15:25:25.94ID:nwaeFCKh winならGetProcessMemoryInfoなど
498デフォルトの名無しさん
2017/02/24(金) 17:26:32.84ID:9xRtAprE499デフォルトの名無しさん
2017/02/24(金) 18:02:34.91ID:See/JzpM >>498
望む答えだったみたいで良かったわ
熱があって若干朦朧とした頭で読み返さずに書き込んだから今読み返すと誤字とか予測変換で要らない単語入ってたり(一般的なLinux環境)とか、カッコの位置が違う(4KBとかの部分)とかあったけど。
望む答えだったみたいで良かったわ
熱があって若干朦朧とした頭で読み返さずに書き込んだから今読み返すと誤字とか予測変換で要らない単語入ってたり(一般的なLinux環境)とか、カッコの位置が違う(4KBとかの部分)とかあったけど。
500デフォルトの名無しさん
2017/02/24(金) 18:52:48.08ID:dfRROZm/ 環境依存ならPostMessageのエラーコードかな
俺はあんま理解してないけど
俺はあんま理解してないけど
501デフォルトの名無しさん
2017/02/24(金) 19:06:57.61ID:+aOqx8nq Win32なら信頼のPostMessageだな
503デフォルトの名無しさん
2017/02/24(金) 23:03:49.77ID:TLhS+9k8 はよ10年前のソース出せよ
504デフォルトの名無しさん
2017/02/24(金) 23:06:00.45ID:nwaeFCKh505デフォルトの名無しさん
2017/02/25(土) 07:21:27.70ID:98TUEskp なんで2分ちょいで出てくるかね。
506デフォルトの名無しさん
2017/02/25(土) 08:14:13.74ID:QoR/O5Qa 自演
508デフォルトの名無しさん
2017/02/26(日) 18:42:59.30ID:stmjd5mD 味噌県のクセにコーミソース以外のソースを使う非国民は去れ
509デフォルトの名無しさん
2017/03/06(月) 07:57:48.79ID:NqblWJNK510デフォルトの名無しさん
2017/03/06(月) 08:21:33.22ID:1XvIZqGa 最初の人がコピペで作ったんでしょ。+128に定義し直してるのもあるよ
511デフォルトの名無しさん
2017/03/06(月) 08:30:32.82ID:cJfBjMIV Aが奇数のときの動作が違うね
512デフォルトの名無しさん
2017/03/06(月) 10:33:08.69ID:NqblWJNK A、Bにはuint8を想定してますから、一瞬オーバーフローの関係かなとも思いましたが
そんなことはなく、特に深い意味はなさそうですね
ありがとうございます
そんなことはなく、特に深い意味はなさそうですね
ありがとうございます
513デフォルトの名無しさん
2017/03/13(月) 00:19:03.26ID:ZWBqluXH 仮想関数をオーバーライドするときはどう書くのがいい作法?
void vf()
virtual void vf()
virtual void vf() override
void vf() override
void vf()
virtual void vf()
virtual void vf() override
void vf() override
514デフォルトの名無しさん
2017/03/13(月) 06:06:33.92ID:IkDDkkqX ハゲ先生によると最後の void vf() override が良いみたい。
『プログラミング言語C++ 第4版』p.592
加えてoverride指定の不整合をチェックするコンパイラオプションだね。
GCCのVersion 5から使える -Wsuggest-override とか。
他のコンパイラについては知らん。
『プログラミング言語C++ 第4版』p.592
加えてoverride指定の不整合をチェックするコンパイラオプションだね。
GCCのVersion 5から使える -Wsuggest-override とか。
他のコンパイラについては知らん。
515デフォルトの名無しさん
2017/03/13(月) 10:43:38.74ID:Kr7xjXLG デストラクターに付けてる人はあんま見たこと無いな
class Derived : Base {
public:
~Derived() override {}
};
class Derived : Base {
public:
~Derived() override {}
};
516片山博文MZ ◆T6xkBnTXz7B0
2017/03/13(月) 20:30:08.38ID:VNPYsRzK Bcc55でtypeofを実現するのは不可能なのかな?
517片山博文MZ ◆T6xkBnTXz7B0
2017/03/13(月) 20:57:04.03ID:VNPYsRzK 古いコンパイラを使ってる人居る?
コンパイラの名前教えて下さい。
コンパイラの名前教えて下さい。
518デフォルトの名無しさん
2017/03/14(火) 23:30:09.48ID:wzywZVIy 老人がカセットテープデッキ求めたり
熟女モノのエロ本()を求めるような感じ?
熟女モノのエロ本()を求めるような感じ?
519デフォルトの名無しさん
2017/03/15(水) 01:04:07.22ID:R2Ueow1p 古いコンパイラと自覚しつつも使ってるような人はこのスレには来ないだろ
時代遅れの遺物の話じゃ通じないし
時代遅れの遺物の話じゃ通じないし
520デフォルトの名無しさん
2017/03/17(金) 11:46:00.03ID:pwo5j4El 何でA、Bを()しないんだ?
521デフォルトの名無しさん
2017/03/25(土) 21:37:15.77ID:IRaGixDk いまだに関数マクロ使ってるようでは
()したところで五十歩百歩
()したところで五十歩百歩
522デフォルトの名無しさん
2017/03/25(土) 22:37:56.47ID:9zWIhzFx523デフォルトの名無しさん
2017/03/26(日) 08:58:38.45ID:4rESVRzB ここはお前の日記を垂れる場所じゃない
「サポートによるとコンパイラのバグだった」で済むのに
アレやってコレやってを書くな低能
「サポートによるとコンパイラのバグだった」で済むのに
アレやってコレやってを書くな低能
524デフォルトの名無しさん
2017/03/27(月) 10:03:34.57ID:wSWIgauQ 事後報告あると参考になっていいんだけどな
今回は本人以外に状況がわからないから事後報告されてもw
今回は本人以外に状況がわからないから事後報告されてもw
525デフォルトの名無しさん
2017/03/30(木) 03:06:01.35ID:6sTQLdA2 http://codepad.org/KMQH3TsZ
ポインタをメンバに持たせた場合のget/setの書き方が分かりません
getの方は、ポインタを返すときに返した先で値を変えられないようにconstを付けたのですが、
sizePlus10のような関数を呼びたい場合に、const_castを付けて呼ぶことになってしまいました
値の変更をするのでsetを通してやるのが良いと思うのですが、何か良い書き方ありますか?
また、setの方は、一括で設定させることはできるのですが、
data->id、data->sizeの値を個別に設定したい場合、何か良い書き方はありますか?
コメントの部分のようにsetメンバ関数を何個も書く方法しか思いつきません
ポインタをメンバに持たせた場合のget/setの書き方が分かりません
getの方は、ポインタを返すときに返した先で値を変えられないようにconstを付けたのですが、
sizePlus10のような関数を呼びたい場合に、const_castを付けて呼ぶことになってしまいました
値の変更をするのでsetを通してやるのが良いと思うのですが、何か良い書き方ありますか?
また、setの方は、一括で設定させることはできるのですが、
data->id、data->sizeの値を個別に設定したい場合、何か良い書き方はありますか?
コメントの部分のようにsetメンバ関数を何個も書く方法しか思いつきません
526デフォルトの名無しさん
2017/03/30(木) 07:50:43.79ID:GtG5BmiK getDataの結果を修正したいのだから
杓子定規にgetDataの戻りにconst付けるのを止めればいいのではないか
そう言えばC++17(ドラフト)もstring::dataの戻りが非constに修正されたような
杓子定規にgetDataの戻りにconst付けるのを止めればいいのではないか
そう言えばC++17(ドラフト)もstring::dataの戻りが非constに修正されたような
527デフォルトの名無しさん
2017/03/30(木) 08:08:59.00ID:KJlpKUaR memcpy w
528デフォルトの名無しさん
2017/03/30(木) 10:48:22.67ID:JHpE2Dpf >>525
一般論として形でただ覚えるのではなくて意味を理解しよう
理解があやしいから設計の一貫性がなく混乱してるようにみえる
・Dataをポインタで所有するのはなぜ
・ゲッター/セッターを使ってアクセスするのはなぜ
・ゲッターで返す値にconstをつけるのはなぜ
・sizePlus10がData*を受けとるのはなぜ
MyClassの設計方針にあわせるならsizePlus10をDataではなくMyClassを受けとるようにして
void sizePlus10(MyClass & mc)
{
Data newdata = { mc.getData()->id, mc.getData()->size + 10 };
mc.setData(newdata);
}
あるいは別の関数を作って
void MyClassSizePlus10(MyClass & mc)
{
Data newdata = *mc.getData();
sizePLus10(&newdata);
mc.setData(newdata);
}
これが変だとか非効率だとか思うなら
MyClassの設計が要求にあってないのでそっちを変更する
一般論として形でただ覚えるのではなくて意味を理解しよう
理解があやしいから設計の一貫性がなく混乱してるようにみえる
・Dataをポインタで所有するのはなぜ
・ゲッター/セッターを使ってアクセスするのはなぜ
・ゲッターで返す値にconstをつけるのはなぜ
・sizePlus10がData*を受けとるのはなぜ
MyClassの設計方針にあわせるならsizePlus10をDataではなくMyClassを受けとるようにして
void sizePlus10(MyClass & mc)
{
Data newdata = { mc.getData()->id, mc.getData()->size + 10 };
mc.setData(newdata);
}
あるいは別の関数を作って
void MyClassSizePlus10(MyClass & mc)
{
Data newdata = *mc.getData();
sizePLus10(&newdata);
mc.setData(newdata);
}
これが変だとか非効率だとか思うなら
MyClassの設計が要求にあってないのでそっちを変更する
529デフォルトの名無しさん
2017/03/30(木) 20:11:34.52ID:irpIFLVN530デフォルトの名無しさん
2017/03/30(木) 23:27:09.74ID:O3+3nsIM531デフォルトの名無しさん
2017/03/30(木) 23:45:25.72ID:s+CP+YQd こういえクソみたいな方法を自慢気に語り出す奴が居るところかC++の最もクソな所だよね
532片山博文MZ ◆T6xkBnTXz7B0
2017/03/30(木) 23:51:55.55ID:2hi+y029 デフォルトコピーコンストラクターとか構造体代入とか知らないんだろう。
533デフォルトの名無しさん
2017/03/31(金) 00:14:17.76ID:5j4NF4+Z534デフォルトの名無しさん
2017/03/31(金) 01:59:49.12ID:OFYzpq31 やべえなおい糞コードの臭いがプンプンしやがるぜ
535デフォルトの名無しさん
2017/03/31(金) 02:09:29.70ID:DQgqVTGo >>526-529
ありがとうございます
今まではとりあえずget/setを書いてgetにはconstを付けとけば良いみたいな認識でしたが、
想定されるクラスの使われ方に合わせて適宜変更するべきでした
MyClassのようなget/setの分け方をすると、
sizePlus10のような関数やsetで不便になってしまうので、
constを付けないget/set共用のものにしてそれを通してアクセスさせるのが適切でした
( getData()でアクセスする場合、Data * const getData() const { /**/ } みたいな )
とても参考になりました
ありがとうございます
今まではとりあえずget/setを書いてgetにはconstを付けとけば良いみたいな認識でしたが、
想定されるクラスの使われ方に合わせて適宜変更するべきでした
MyClassのようなget/setの分け方をすると、
sizePlus10のような関数やsetで不便になってしまうので、
constを付けないget/set共用のものにしてそれを通してアクセスさせるのが適切でした
( getData()でアクセスする場合、Data * const getData() const { /**/ } みたいな )
とても参考になりました
536デフォルトの名無しさん
2017/03/31(金) 11:52:48.85ID:xItn/dk+ >>531
くそじゃない方法をおしえて
くそじゃない方法をおしえて
537デフォルトの名無しさん
2017/03/31(金) 12:09:56.69ID:c13jjk6+ C#じゃないからないでしょ
538デフォルトの名無しさん
2017/03/31(金) 13:26:56.75ID:CbPadW0u539デフォルトの名無しさん
2017/03/31(金) 13:38:11.94ID:2wgHKgmk540片山博文MZ ◆T6xkBnTXz7B0
2017/03/31(金) 17:24:06.64ID:tvggMnLQ typedef struct MY_STRUCT
{
int ch;
} MY_STRUCT;
MY_STRUCT a,b;
a.ch = 0;
b = a; //代入できる
{
int ch;
} MY_STRUCT;
MY_STRUCT a,b;
a.ch = 0;
b = a; //代入できる
541デフォルトの名無しさん
2017/03/31(金) 19:17:35.19ID:Xv9Etv1i542片山博文MZ ◆T6xkBnTXz7B0
2017/03/31(金) 19:19:25.80ID:tvggMnLQ 構造体の代入ができなかったのは大昔のことだ。
>>540
それ,K&R1 から堕落したよね
それ,K&R1 から堕落したよね
544片山博文MZ ◆T6xkBnTXz7B0
2017/03/31(金) 19:40:25.86ID:tvggMnLQ 構造体定義を#include <pshpack1.h>と#include <poppack.h>で囲むのは、スピードよりもメモリー効率を優先するときにする。
545片山博文MZ ◆T6xkBnTXz7B0
2017/03/31(金) 19:44:56.93ID:tvggMnLQ あるいは構造体のレイアウトを分かりやすくするときにパッキングを指定する。
547デフォルトの名無しさん
2017/03/31(金) 19:49:13.63ID:RKtYGe+y > スピードよりもメモリー効率を優先するときにする
20年くらい前まではそういう老人もいたね
今はメモリレイアウトを固定したい時にしか使わないけど
20年くらい前まではそういう老人もいたね
今はメモリレイアウトを固定したい時にしか使わないけど
548片山博文MZ ◆T6xkBnTXz7B0
2017/03/31(金) 19:58:28.84ID:tvggMnLQ #pragma 直接指定は礼儀が悪い、昔のやり方だ。
549デフォルトの名無しさん
2017/04/01(土) 02:25:44.35ID:m99QLuku メモリ効率だけの問題なら大抵の場合は順番入れ替えるだけで問題ないしな
551デフォルトの名無しさん
2017/04/01(土) 08:31:33.23ID:AOt54aKT そうそう
スタックに自動変数とかも言語道断
全部staticじゃなきゃね
スタックに自動変数とかも言語道断
全部staticじゃなきゃね
>>551
スタックに自動変数はあたりまえだよ‥static おじさん,じゃないつもりなんだが‥
構造体はポインタで扱うべきもので,実体をコピーするのはなるたけ避けたいね
C++ では void f(const C &arg) って,可能ならば const と参照の縛りをできるだけいれるよね,余計なコンストラクタを走らせないために
K&R1 は教育的な配慮に優れた実装だと思うんだ‥
スタックに自動変数はあたりまえだよ‥static おじさん,じゃないつもりなんだが‥
構造体はポインタで扱うべきもので,実体をコピーするのはなるたけ避けたいね
C++ では void f(const C &arg) って,可能ならば const と参照の縛りをできるだけいれるよね,余計なコンストラクタを走らせないために
K&R1 は教育的な配慮に優れた実装だと思うんだ‥
553デフォルトの名無しさん
2017/04/02(日) 14:13:23.32ID:SQNmFUeK SOCKADDRが一言
>>553
手元のソースをみると
clientSocket = accept(serverSocket, (LPSOCKADDR)&clientSockAddr, &addrLen);
とか
if (connect(destSocket, (LPSOCKADDR)&destSockAddr, sizeof(destSockAddr)) == SOCKET_ERROR) {
とか,構造体のポインタを渡しているね
由緒正しき Berkeley socket では,構造体をコピーするなんて教育的ではない書き方は許していないよ
手元のソースをみると
clientSocket = accept(serverSocket, (LPSOCKADDR)&clientSockAddr, &addrLen);
とか
if (connect(destSocket, (LPSOCKADDR)&destSockAddr, sizeof(destSockAddr)) == SOCKET_ERROR) {
とか,構造体のポインタを渡しているね
由緒正しき Berkeley socket では,構造体をコピーするなんて教育的ではない書き方は許していないよ
555デフォルトの名無しさん
2017/04/02(日) 17:31:42.61ID:QFdfGGyb つまり>>553はK&Rおじさんにも劣る存在
556デフォルトの名無しさん
2017/04/02(日) 18:21:59.15ID:XkKG9LQx K&R1 おじさん,と
K&R2 おじさん
は区別したまえ,若造
K&R2 おじさん
は区別したまえ,若造
557デフォルトの名無しさん
2017/04/02(日) 19:26:19.28ID:QFdfGGyb どっちも時代遅れの老人でしょ
K&Rなんて昔存在したという噂でしか知らない
万葉集とか古事記みたいなもの?
K&Rなんて昔存在したという噂でしか知らない
万葉集とか古事記みたいなもの?
558デフォルトの名無しさん
2017/04/02(日) 20:22:15.39ID:II71H9Zi func1(a, b)
int a;
long b;
{
}
int a;
long b;
{
}
559デフォルトの名無しさん
2017/04/02(日) 22:22:37.63ID:JMz4l+Qd > &destSockAddr,
> sizeof(destSockAddr)
由緒正しきBerkeley Socketも昔はこういう書き方したな
コイツは進歩が20年前で止まってるのか
今この書き方する奴は死刑でいい
> sizeof(destSockAddr)
由緒正しきBerkeley Socketも昔はこういう書き方したな
コイツは進歩が20年前で止まってるのか
今この書き方する奴は死刑でいい
560デフォルトの名無しさん
2017/04/02(日) 23:11:21.74ID:zmcqSa2a 便乗で申し訳ないが、値渡し、参照渡し、ポインタ渡し、の話で
ポインタ渡しといっても、C++の場合はナマポは嫌われて、スマポを使いましょう
ってことになっていると思うんだけど、これはどう渡すのが普通?
スマポを値渡しするのか、参照渡しするのか
はたまたスマポを剥いで、ナマポで渡すのか
個人的に統一しきれないっつーか
所有権やら生存期間やらリソース管理やらが関係してくるなら
スマポで渡すI/Fじゃないとまずいだろうし
逆にそういうのが関係ないなら、スタック上の自動変数を渡したいとかも考えると
ナマポで渡すI/Fのほうが都合が良かったり、どーなんだろ
一度ナマポに戻すと二度とshared_ptrに変換できないって制限がね
言語側でなんとかせずに、ライブラリで解決しようとした弊害かな
ちょうどよいバカよけなんかも知らんが
ポインタ渡しといっても、C++の場合はナマポは嫌われて、スマポを使いましょう
ってことになっていると思うんだけど、これはどう渡すのが普通?
スマポを値渡しするのか、参照渡しするのか
はたまたスマポを剥いで、ナマポで渡すのか
個人的に統一しきれないっつーか
所有権やら生存期間やらリソース管理やらが関係してくるなら
スマポで渡すI/Fじゃないとまずいだろうし
逆にそういうのが関係ないなら、スタック上の自動変数を渡したいとかも考えると
ナマポで渡すI/Fのほうが都合が良かったり、どーなんだろ
一度ナマポに戻すと二度とshared_ptrに変換できないって制限がね
言語側でなんとかせずに、ライブラリで解決しようとした弊害かな
ちょうどよいバカよけなんかも知らんが
561デフォルトの名無しさん
2017/04/02(日) 23:13:25.39ID:6tq4Ne3Z 参照一択
562デフォルトの名無しさん
2017/04/02(日) 23:24:57.32ID:xNqaI0VS >スマポを値渡しするのか、参照渡しするのか
>はたまたスマポを剥いで、ナマポで渡すのか
スマポの値渡しと生保は使い分けが必要だが、スマポの参照渡しだけはアホの所業。
とスコットメイヤーが言っていたような
>はたまたスマポを剥いで、ナマポで渡すのか
スマポの値渡しと生保は使い分けが必要だが、スマポの参照渡しだけはアホの所業。
とスコットメイヤーが言っていたような
563デフォルトの名無しさん
2017/04/02(日) 23:43:46.05ID:yhAnz0vw >>560
shared_ptrはその名の通り所有権を共有する場合のみ使うもの
で、そういう場合は値渡しでもいいよ。中でmoveすれば
所有権を共有しないなら、nullptrを許容するならナマポそうじゃないなら参照
あんまり無いけど所有権を渡した先に移動させるならunique_ptr
shared_ptrはその名の通り所有権を共有する場合のみ使うもの
で、そういう場合は値渡しでもいいよ。中でmoveすれば
所有権を共有しないなら、nullptrを許容するならナマポそうじゃないなら参照
あんまり無いけど所有権を渡した先に移動させるならunique_ptr
564デフォルトの名無しさん
2017/04/02(日) 23:58:32.77ID:TsXu0WT4 所有権渡したくないならunique_ptrで持っている呼び出し元がgetでナマポを渡すかdereferenceして参照渡すかだな
565デフォルトの名無しさん
2017/04/03(月) 00:00:55.90ID:Jbp2gIKE ナマポで渡してもshared_ptrを再取得する方法はあるだろ
まあ前提がいるが
まあ前提がいるが
566デフォルトの名無しさん
2017/04/03(月) 00:34:15.74ID:qQvnlfYK うむむ、なるほど
ポインタらしき物にこれだけ多くの種類があってI/Fで縛ってしまうのは
一見面倒そうで、最近の流行というか静的型言語的には
型安全と見るべきなんだろうかしら
安易なGC言語より良いかもしれん、単純に情報量は多い
また一つC++が好きになった
うっかり循環参照したら怖いとか
コンパイラのバージョン違いでSTLやmallocの実装に
差異が有ることを前提に組まなきゃならないとか、玉にキズもあるけれど
ポインタらしき物にこれだけ多くの種類があってI/Fで縛ってしまうのは
一見面倒そうで、最近の流行というか静的型言語的には
型安全と見るべきなんだろうかしら
安易なGC言語より良いかもしれん、単純に情報量は多い
また一つC++が好きになった
うっかり循環参照したら怖いとか
コンパイラのバージョン違いでSTLやmallocの実装に
差異が有ることを前提に組まなきゃならないとか、玉にキズもあるけれど
>>559
C/C++ で生書きするなら今もおなじだよ
C/C++ で生書きするなら今もおなじだよ
568デフォルトの名無しさん
2017/04/03(月) 07:40:50.83ID:dyU+EMvQ 型に対してじゃないのに括弧つけるの?
569デフォルトの名無しさん
2017/04/03(月) 08:48:24.23ID:WaUkCV9r そこはインデントや{}の位置が人によって違ったりするアレだろ
>>557
K&R2 は C89 準拠だよ‥C89 が時代遅れだというけれども,いろんなことは C89 のときからやってきていて,C99 で追認された,というだけだよ
K&R2 は C89 準拠だよ‥C89 が時代遅れだというけれども,いろんなことは C89 のときからやってきていて,C99 で追認された,というだけだよ
571デフォルトの名無しさん
2017/04/03(月) 20:29:22.04ID:5hra1L5C573571
2017/04/03(月) 22:02:42.26ID:ldINtwle >>572
つまりお主(K&R1おじさん)は
K&R2おじさんが自分と一緒くたにされることを
申し訳ないと感じてるのだな!?
(>543)
> それ,K&R1 から堕落したよね
(>550)
> サイズが無限にのびるかもしれないものをコピーするなんてだめだよ
(>552)
> K&R1 は教育的な配慮に優れた実装だと思うんだ‥
つまりお主(K&R1おじさん)は
K&R2おじさんが自分と一緒くたにされることを
申し訳ないと感じてるのだな!?
(>543)
> それ,K&R1 から堕落したよね
(>550)
> サイズが無限にのびるかもしれないものをコピーするなんてだめだよ
(>552)
> K&R1 は教育的な配慮に優れた実装だと思うんだ‥
574デフォルトの名無しさん
2017/04/03(月) 22:14:40.64ID:Vb9tETQW voidを返す関数には感心したな
生成されるコードは大して変わらないかも知れんけど
生成されるコードは大して変わらないかも知れんけど
575デフォルトの名無しさん
2017/04/04(火) 01:00:11.73ID:jC2xfRDP 関数プロトタイプを除けば、K&R1で十分かもしれないな
voidを返す関数? int でいいんだよ
voidを返す関数? int でいいんだよ
576デフォルトの名無しさん
2017/04/04(火) 15:11:19.04ID:AeH3x9f/ 戻り値をどうするかはcallerの勝手だからな
578デフォルトの名無しさん
2017/04/04(火) 20:27:50.00ID:/PIYb7TP int funca01(...);
int funca02(...);
int funca03(...);
int funca02(...);
int funca03(...);
579デフォルトの名無しさん
2017/04/04(火) 23:08:17.42ID:YUY8Mb54 老人は意味とか概念を理解しようとしないから嫌
「bool? intでいいだろ」
「forループ?本質はgotoと同じ」
「enumなんてintでいいだろ」
ホントもう存在が害悪
「bool? intでいいだろ」
「forループ?本質はgotoと同じ」
「enumなんてintでいいだろ」
ホントもう存在が害悪
580デフォルトの名無しさん
2017/04/05(水) 00:33:27.19ID:DVg/5L4N581デフォルトの名無しさん
2017/04/05(水) 02:38:54.31ID:ZJf7oEgw582デフォルトの名無しさん
2017/04/05(水) 04:30:52.52ID:ni2ET+sb 奴らは#defineだ
583デフォルトの名無しさん
2017/04/05(水) 08:14:48.69ID:Bh5NPBNH マジックナンバー直書きでしょ
584デフォルトの名無しさん
2017/04/05(水) 08:19:06.54ID:qVk1sCwA K&Rだと〜
c89だと〜
過去の異物がまだ現役だと信じて話してけるのがうざい
c89だと〜
過去の異物がまだ現役だと信じて話してけるのがうざい
585デフォルトの名無しさん
2017/04/05(水) 09:06:55.68ID:ncDYJBnp それ言うならC自体が。
いまさらC++と互換性のないCを選ぶ理由がない。
いまさらC++と互換性のないCを選ぶ理由がない。
586デフォルトの名無しさん
2017/04/05(水) 10:35:04.67ID:k0RY104y >>585
C++と互換性のないCってどんなの?
C++と互換性のないCってどんなの?
587デフォルトの名無しさん
2017/04/05(水) 19:40:11.14ID:IM5122PI ベターC的な所全般だな
範囲forとか2進リテラルとかスレッドライブラリとか参照とか
Cにはnullptrすら無いし細かいところでは条件演算子が右辺値とか
ようするに別言語
オーバーロードに対するtgmathとかもう糞の臭いしかしない
範囲forとか2進リテラルとかスレッドライブラリとか参照とか
Cにはnullptrすら無いし細かいところでは条件演算子が右辺値とか
ようするに別言語
オーバーロードに対するtgmathとかもう糞の臭いしかしない
>>580
「K&R1 は構造体は基本的にポインタでしか扱えない」制限なんて,使ってもいなかったらわからないだろう?
「K&R1 は構造体は基本的にポインタでしか扱えない」制限なんて,使ってもいなかったらわからないだろう?
590580
2017/04/05(水) 20:02:06.85ID:DVg/5L4N え?Qちゃんてサンデープログラマじゃないの?
職業プログラマでもないし
プログラミング暦せいぜい10年未満だと思ってた
職業プログラマでもないし
プログラミング暦せいぜい10年未満だと思ってた
>>579
>「forループ?本質はgotoと同じ」
そんなことはいわないとおもうよ,K&R1 の時代から for はあるしね
きがつくと for(;;) { } と break だけで書いてたりするのはあるかもね,while 使いにくいとか,do while なんかマクロの中でしかつかわない,とかさ
enum?
#define でいいとおもうよ‥
>「forループ?本質はgotoと同じ」
そんなことはいわないとおもうよ,K&R1 の時代から for はあるしね
きがつくと for(;;) { } と break だけで書いてたりするのはあるかもね,while 使いにくいとか,do while なんかマクロの中でしかつかわない,とかさ
enum?
#define でいいとおもうよ‥
593デフォルトの名無しさん
2017/04/05(水) 21:26:45.75ID:Kw8eDt7v ニートじゃ分からんことも多いのでは
595デフォルトの名無しさん
2017/04/05(水) 22:10:26.67ID:mGFW5fgT そういうこと言ってるとそのうち技術についていけなくなるよ
596デフォルトの名無しさん
2017/04/05(水) 22:22:23.34ID:ncDYJBnp C99やC11って、新しい技術とかそういうんじゃないじゃん。
597デフォルトの名無しさん
2017/04/05(水) 22:40:44.77ID:mGFW5fgT 規格
598デフォルトの名無しさん
2017/04/06(木) 10:47:58.81ID:jz0x7tjm 企画ものは好きじゃないからな
599デフォルトの名無しさん
2017/04/06(木) 16:35:26.64ID:w+UX2Wix ころころ変わるんだから最新もクソも無いわけだが
pakomamaはガチらしいな
pakomamaはガチらしいな
601デフォルトの名無しさん
2017/04/06(木) 20:16:13.94ID:kFToYptL まず、C#のasyncだのawaitだのはC++にも欲しいところ
というか、取り入れる方向で議論していたような
どのみちQZには使いこなせない機能だから知らなくてもよいけど
知れば発狂することだろう
というか、取り入れる方向で議論していたような
どのみちQZには使いこなせない機能だから知らなくてもよいけど
知れば発狂することだろう
603デフォルトの名無しさん
2017/04/06(木) 22:33:11.66ID:Ao1zg6OQ >>601
coroutineの事なら根本的な所が違うから勘違いしないようにな
coroutineの事なら根本的な所が違うから勘違いしないようにな
604デフォルトの名無しさん
2017/04/07(金) 20:08:34.35ID:cdWiLUH2 馬鹿の特長:目的/機能の違いと実現するための実装の違いの区別がつかない
605デフォルトの名無しさん
2017/04/08(土) 12:56:12.29ID:TFmwEDa6 C#のawaitはGUIのスレッドを意識出来るので有用だが
C++のawaitはただ裏で走らせるだけの機能的には劣化版な気がしてならない
C++のawaitはただ裏で走らせるだけの機能的には劣化版な気がしてならない
606デフォルトの名無しさん
2017/04/08(土) 13:14:20.88ID:bfo0YVHI >>605
c++で標準的なgui使うとすると何になるの?
c++で標準的なgui使うとすると何になるの?
607デフォルトの名無しさん
2017/04/08(土) 13:49:52.49ID:xnWSKOe7 >>605
そりゃ C++ と C# のポリシーの違いだろ
そりゃ C++ と C# のポリシーの違いだろ
608デフォルトの名無しさん
2017/04/09(日) 22:32:13.26ID:nTEmq1X3 C使ってる人で変数宣言を途中に書く人いる?
やめた方がいい?
やめた方がいい?
609デフォルトの名無しさん
2017/04/09(日) 23:00:21.55ID:gthRNL4S むしろそうして欲しいかな
勿論ブロックスコープは意識してる前提で
勿論ブロックスコープは意識してる前提で
610デフォルトの名無しさん
2017/04/14(金) 09:11:56.63ID:ezi5K97R 初期のCはブロック先頭しかコンパイルが通らない
コンストラクタも型推論もないのに途中に置くメリットが少ない
初期化漏れというモンスターの隠れ家になりやすい
コンストラクタも型推論もないのに途中に置くメリットが少ない
初期化漏れというモンスターの隠れ家になりやすい
611デフォルトの名無しさん
2017/04/14(金) 10:33:55.73ID:L6e5ZQwW 一応Cで書くときは関数ブロック直後に書いてるけど、それはそれでforで使うiとかを使い回す事になるから、C++みたくプログラマの良識を信じて(ブロックを意識して変数宣言すると信じて)、好きな場所で宣言出来た方が正解なんだろうな。
612デフォルトの名無しさん
2017/04/14(金) 10:35:17.63ID:L6e5ZQwW 出来た方がと言うか、今は出来るんだから、した方が正解に訂正。
613デフォルトの名無しさん
2017/04/14(金) 12:59:25.70ID:Hdztr2ik 出来ることと乱用していいことはイコールでない
一瞬だけの一時変数を直前で宣言するのならありだけど
関数全体で使うなら頭で宣言すべきだし、そもそも中間で宣言するような長い関数は
短くなるよう見直すべき
一瞬だけの一時変数を直前で宣言するのならありだけど
関数全体で使うなら頭で宣言すべきだし、そもそも中間で宣言するような長い関数は
短くなるよう見直すべき
614デフォルトの名無しさん
2017/04/14(金) 13:04:43.28ID:xSRtCFhF 魔法の言葉
ケースバイケース
ケースバイケース
615デフォルトの名無しさん
2017/04/14(金) 19:32:18.15ID:UiWlchtO スコープは可能な限り狭く
おじいちゃんの遺言
おじいちゃんの遺言
616デフォルトの名無しさん
2017/04/14(金) 19:38:55.23ID:PNQsiXg9 初期化漏れはブロック先頭でしかかけない方が起こしやすいだろう
長い範囲で使う変数でも、変数ははじめて使うところで宣言した方が分かりやすいしバグも減る。
長い範囲で使う変数でも、変数ははじめて使うところで宣言した方が分かりやすいしバグも減る。
617デフォルトの名無しさん
2017/04/14(金) 20:04:35.98ID:Z/bjVn5R 初期化忘れ防止はどこで宣言したってあんま関係ないというか
大差ないだろうな実際
必要になった時点で宣言するってことでよいと思う
さもないと上手くいかない場合もあるし
いちいち使いもしない「ダミーの値」で初期化するのは馬鹿らしいし
余計にバグりそう
大差ないだろうな実際
必要になった時点で宣言するってことでよいと思う
さもないと上手くいかない場合もあるし
いちいち使いもしない「ダミーの値」で初期化するのは馬鹿らしいし
余計にバグりそう
618デフォルトの名無しさん
2017/04/14(金) 20:13:31.25ID:Z/bjVn5R auto result = func();
まぁこういう風にしたいわな
int result = 0;
・・・
result = func();
↑その「0」って初期化値は何なんですか、何を意味した「0」なんですか
では0の代わりに1で初期化したらどうなるんですか
この初期化値の意味は一体何なんですか
ってことになるしな
結局「0」とか「1」とかの初期化値はダミーでありプログラム上なんの意味もなかったりするし
逆に初期化値に意味がある場合もあるから余計にややこしくなる
bool flag = false;
if( func() )
{
flag = true;
}
これらを区別したいから必要になった個所で宣言に一票
まぁこういう風にしたいわな
int result = 0;
・・・
result = func();
↑その「0」って初期化値は何なんですか、何を意味した「0」なんですか
では0の代わりに1で初期化したらどうなるんですか
この初期化値の意味は一体何なんですか
ってことになるしな
結局「0」とか「1」とかの初期化値はダミーでありプログラム上なんの意味もなかったりするし
逆に初期化値に意味がある場合もあるから余計にややこしくなる
bool flag = false;
if( func() )
{
flag = true;
}
これらを区別したいから必要になった個所で宣言に一票
619デフォルトの名無しさん
2017/04/14(金) 21:45:43.28ID:spQE74XB 老人の「昔は良かった」を見て顔真っ赤にして論破しようとマジレス
みっともない
みっともない
620デフォルトの名無しさん
2017/04/14(金) 23:47:26.34ID:9eRQSDOY 必要なものを必要なときに宣言する
それだけの話
それだけの話
621デフォルトの名無しさん
2017/04/15(土) 09:16:54.52ID:RtikNDCG622デフォルトの名無しさん
2017/04/15(土) 09:26:22.77ID:Af1/s0zG もともとが
初期化忘れを防ぐためには関数の先頭で宣言〜
への反論だったからだぜ
初期化忘れを防ぐためには関数の先頭で宣言〜
への反論だったからだぜ
623デフォルトの名無しさん
2017/04/15(土) 09:41:32.48ID:RtikNDCG >622
日本語もわからないチンパンは無理して
コンピュータ使わなくても
祖国でオナニーしてればいいんだぜ
日本語もわからないチンパンは無理して
コンピュータ使わなくても
祖国でオナニーしてればいいんだぜ
624デフォルトの名無しさん
2017/04/15(土) 09:50:31.14ID:Af1/s0zG 君の疑問がどこにあるのか本当にわからないからどうでもよい
625デフォルトの名無しさん
2017/04/15(土) 10:02:51.76ID:Af1/s0zG for(int i = ...; ; ) が書けるようになったのは素直にありがたいな,と感じている
627デフォルトの名無しさん
2017/04/23(日) 23:52:45.18ID:IUq/7GPJ >>626
脳の進化が20年前で止まったチンパンはc89でも使ってろ
脳の進化が20年前で止まったチンパンはc89でも使ってろ
628デフォルトの名無しさん
2017/04/24(月) 20:45:20.10ID:et30sNFg うきー
>>627
C99 or later で便利になったことなんて,そんなにないんだよね‥
C99 or later で便利になったことなんて,そんなにないんだよね‥
630デフォルトの名無しさん
2017/04/25(火) 06:08:12.88ID:X14wy5zc 数値計算とか特殊用途なライブラリ追加ってイメージ。
そりゃ、手間の割に汎用性がなかったら対応コンパイラも出てこないわ。
そりゃ、手間の割に汎用性がなかったら対応コンパイラも出てこないわ。
631デフォルトの名無しさん
2017/04/25(火) 22:55:58.60ID:EbISA0IE インライン関数も行コメントもboolもrestrict も無しで
どうやってプログラム書いてんのか想像もつかない
snprintf無しとか無理ゲーだろ
どうやってプログラム書いてんのか想像もつかない
snprintf無しとか無理ゲーだろ
632デフォルトの名無しさん
2017/04/26(水) 02:18:40.34ID:Kw1ZNGm3 restrict無しが想像つかないってどういうことだろ
633デフォルトの名無しさん
2017/04/26(水) 09:07:13.88ID:bRGeq+mw restrict使ったことないなあ
大きく最適化されるの?
大きく最適化されるの?
634デフォルトの名無しさん
2017/04/26(水) 09:13:52.17ID:rDz6/6sg 最適化はあんま気にしてなくて意味的なものかな
memcpyとmemmoveみたいな
memcpyとmemmoveみたいな
635デフォルトの名無しさん
2017/04/26(水) 09:20:57.15ID:A4NmaPdj そう言う機能はメーカー独自実装でC99決まるずっと前からスタンダードだったから、C99って実感が無い。。。
636デフォルトの名無しさん
2017/04/26(水) 11:36:23.97ID:O9yeoh6Z637デフォルトの名無しさん
2017/05/05(金) 00:51:04.53ID:evlI6rq7 void func(hoge)
int hoge;
{}
こんな書き方があったん?
int hoge;
{}
こんな書き方があったん?
638デフォルトの名無しさん
2017/05/05(金) 01:30:10.63ID:PzvORh1V >>637
詳しくは k&r style とかでググればいいけど今時知る必要はほぼないと思う
詳しくは k&r style とかでググればいいけど今時知る必要はほぼないと思う
639デフォルトの名無しさん
2017/05/05(金) 15:05:47.25ID:9iyukdGg K&R1 だね、引数の型チェックができないから不便かつミスを誘発しやすい
640デフォルトの名無しさん
2017/05/07(日) 00:55:58.17ID:uDdo3knt 使われなくなった過去の異物に優劣語り出すとか
老人やべーな
老人やべーな
641片山博文MZ ◆T6xkBnTXz7B0
2017/05/07(日) 00:58:01.39ID:gTai4K61 ×異物
○遺物
○遺物
642デフォルトの名無しさん
2017/05/07(日) 01:41:21.28ID:zkvqzaCu 誰も優を語ってない訳だが
643デフォルトの名無しさん
2017/05/07(日) 15:54:40.58ID:s2OM55fz ストラウストラップの本って読む価値ありますか?
644デフォルトの名無しさん
2017/05/07(日) 22:28:38.36ID:fUCVOwEA 著書全般の基本的な傾向としては万人向けの価値はない
物事の意味や本質を学び考え悩み理解しようとする人向けの本であって
うわべだけの丸暗記やコピペで即結論や結果を求める人向けの本ではないから
物事の意味や本質を学び考え悩み理解しようとする人向けの本であって
うわべだけの丸暗記やコピペで即結論や結果を求める人向けの本ではないから
645デフォルトの名無しさん
2017/05/07(日) 22:36:06.44ID:f9jMnLHr 読む価値はあるが嘘が多いので騙されない注意が必要
646デフォルトの名無しさん
2017/05/07(日) 23:30:36.93ID:s2OM55fz647デフォルトの名無しさん
2017/05/19(金) 15:26:03.09ID:49hF9eg/ はぁ〜〜〜〜
安易にC++に手を出すんじゃなかった
安易にC++に手を出すんじゃなかった
648デフォルトの名無しさん
2017/05/20(土) 12:15:32.26ID:Niypv3FQ 変人や御用達の言語だからな
馬鹿のくせにプライド高い老害しか使ってないイメージ
馬鹿のくせにプライド高い老害しか使ってないイメージ
649デフォルトの名無しさん
2017/05/20(土) 12:51:51.67ID:Nls5mnQ9 >>648
その手の人らの声が大きいだけだよ。特にこんなところでは。
その手の人らの声が大きいだけだよ。特にこんなところでは。
650デフォルトの名無しさん
2017/05/20(土) 18:23:23.08ID:PYbACk+S みんな黙ってC++だよ
651デフォルトの名無しさん
2017/05/23(火) 00:42:13.85ID:9/IkIyOw ちょっとした確認なんだけどさ、
デストラクタが空っぽ (デフォルトデストラクタ) でもオブジェクトを後始末するための何らかの処理はするよね?
よくあるスライシングの問題で、
・クラス A をクラス B が継承している
・クラス A のデストラクタは virtual が付いていない
・クラス B のデストラクタはデフォルトデストラクタ
・クラス B はメンバ変数を持っていない
・B* を A* にキャストしたものを delete
という状況だと見かけ上はクラス B のオブジェクトには後始末すべきものは何もないように見えるけど、
デストラクタが呼ばれないのはやっぱあかんよな?
デストラクタが空っぽ (デフォルトデストラクタ) でもオブジェクトを後始末するための何らかの処理はするよね?
よくあるスライシングの問題で、
・クラス A をクラス B が継承している
・クラス A のデストラクタは virtual が付いていない
・クラス B のデストラクタはデフォルトデストラクタ
・クラス B はメンバ変数を持っていない
・B* を A* にキャストしたものを delete
という状況だと見かけ上はクラス B のオブジェクトには後始末すべきものは何もないように見えるけど、
デストラクタが呼ばれないのはやっぱあかんよな?
652デフォルトの名無しさん
2017/05/23(火) 04:48:39.03ID:pt6Ia/HA うん
653デフォルトの名無しさん
2017/05/23(火) 09:20:18.86ID:J4YcG+3k654デフォルトの名無しさん
2017/05/23(火) 10:48:08.30ID:Ip/q9ayQ 未定義動作多すぎだなこの言語。
よくここまで生き残れたな。
よくここまで生き残れたな。
655デフォルトの名無しさん
2017/05/23(火) 11:01:35.25ID:3W0XlzKr 未定義部分を各社が好きに定義してたからね。
VC++だとこう動くけど、g++だとこう動く、みたいな。
VC++だとこう動くけど、g++だとこう動く、みたいな。
656デフォルトの名無しさん
2017/05/23(火) 12:45:18.14ID:hcbwXZ+h >>653
横からだけど、それまじ?
出来れば、規格で書かれてる場所教えて欲しい。
不安に思いながらも、一個作っちゃったんだよな…
動作確認済みだから、直ちに問題があるわけではないんだけど、未定義と聞くと将来的には修正しておきたい…
横からだけど、それまじ?
出来れば、規格で書かれてる場所教えて欲しい。
不安に思いながらも、一個作っちゃったんだよな…
動作確認済みだから、直ちに問題があるわけではないんだけど、未定義と聞くと将来的には修正しておきたい…
657デフォルトの名無しさん
2017/05/23(火) 13:25:39.67ID:I6yYOIGb >規格で書かれてる場所教えて欲しい
delete式の説明の最初のページに書かれていることが探せないというのは
場所を教えられたところでそもそも規格を保有していないのではないか
delete式の説明の最初のページに書かれていることが探せないというのは
場所を教えられたところでそもそも規格を保有していないのではないか
658デフォルトの名無しさん
2017/05/23(火) 13:25:57.75ID:YY4qnA2y >>656
意図して作ったの?バグじゃなくて?
意図して作ったの?バグじゃなくて?
659デフォルトの名無しさん
2017/05/23(火) 15:16:19.75ID:0tdmeFKn htmlとその解釈に悩まされるよりはマシ
660653
2017/05/23(火) 15:21:53.55ID:Ek6JChT/ >>656
俺もworking draftしかないけどn3690の5.3.5の3段落目
In the first alternative (delete object), if the static type of the object to be deleted is different from its
dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the
static type shall have a virtual destructor or the behavior is undefined.
俺もworking draftしかないけどn3690の5.3.5の3段落目
In the first alternative (delete object), if the static type of the object to be deleted is different from its
dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the
static type shall have a virtual destructor or the behavior is undefined.
661デフォルトの名無しさん
2017/05/23(火) 17:00:54.34ID:EZJXMIkJ C++があまりに不安な要素をたくさん抱えているお陰で未だに新生言語が多数出てくると
思えばいいじゃん?
思えばいいじゃん?
662デフォルトの名無しさん
2017/05/23(火) 19:47:58.75ID:rsJqfxq0 継承すんなよ
663デフォルトの名無しさん
2017/05/24(水) 00:55:48.61ID:WEdzXALv >>658
意図して作った。
悪しき方法とは思いつつも、stringクラスにsprintf 的な機能のメンバ関数作ったった。
その時、stringクラスの全機能を実装するのがめんどくさかったんで public 継承で。
メモリレイアウトは一切変わらない事を見切った上でだが、未定義だとすると…ヤベ。
意図して作った。
悪しき方法とは思いつつも、stringクラスにsprintf 的な機能のメンバ関数作ったった。
その時、stringクラスの全機能を実装するのがめんどくさかったんで public 継承で。
メモリレイアウトは一切変わらない事を見切った上でだが、未定義だとすると…ヤベ。
664デフォルトの名無しさん
2017/05/24(水) 00:56:49.58ID:WEdzXALv ん、まあ、deleteは使わないからセーフか?
665デフォルトの名無しさん
2017/05/24(水) 01:00:58.95ID:WEdzXALv666デフォルトの名無しさん
2017/05/24(水) 12:01:47.91ID:/RGvDc8r メモリレイアウトが変わらない範囲で既存のクラスを再オープンして機能を追加する方法の提案だけは出てたような気がする。
667デフォルトの名無しさん
2017/05/24(水) 12:06:31.74ID:/RGvDc8r668デフォルトの名無しさん
2017/05/24(水) 13:51:37.65ID:OqDgfclu669デフォルトの名無しさん
2017/05/24(水) 14:15:44.36ID:ttKQmf2U >>668
std::vector<std::string>に入れたら死ぬってことだよね??
std::vector<std::string>に入れたら死ぬってことだよね??
670デフォルトの名無しさん
2017/05/24(水) 14:47:39.17ID:/RGvDc8r >>669
ポインタを std::string* に入れてなおかつそれを std::string* のままで delete したらあかんという話。
値を std::string にキャストする分にはなにも問題はない。
ポインタを std::string* に入れてなおかつそれを std::string* のままで delete したらあかんという話。
値を std::string にキャストする分にはなにも問題はない。
671デフォルトの名無しさん
2017/05/24(水) 15:58:36.11ID:ttKQmf2U >>670
だからstd::vector<std::string>にいれらんないよね?
だからstd::vector<std::string>にいれらんないよね?
672デフォルトの名無しさん
2017/05/24(水) 17:02:32.05ID:/RGvDc8r >>671
何を言いたいのかよくわからんが……。
std::string を継承した型は、レイアウトが変わらないようにしたからと言って (キャストなしで) std::string には入らないよ。
言いたいことを具体的にコードで示してくれんか
何を言いたいのかよくわからんが……。
std::string を継承した型は、レイアウトが変わらないようにしたからと言って (キャストなしで) std::string には入らないよ。
言いたいことを具体的にコードで示してくれんか
673デフォルトの名無しさん
2017/06/03(土) 20:46:07.15ID:/cDPk3Lb674デフォルトの名無しさん
2017/06/04(日) 05:01:25.52ID:a4MXR2y0 テンプレート構造体を作りその配列をクラスのメンバに含めたいのですが上手くいきません。
作りたいクラスはスタックとして使えるもので、
主な作りたいメンバは、二つの型のメンバ変数を持つ上記のテンプレート構造体の配列。
引数としてテンプレート構造体を持ち、上記の配列に順次プッシュしていく関数。
最後にプッシュされた構造体をポップする関数、という3つです。
どのようにすればテンプレート構造体をクラスのメンバにすることが出来るのでしょうか?
もしくは、このような機能を持つクラスを実装するためにはどうすればいいのでしょうか?
よろしくお願いします。
作りたいクラスはスタックとして使えるもので、
主な作りたいメンバは、二つの型のメンバ変数を持つ上記のテンプレート構造体の配列。
引数としてテンプレート構造体を持ち、上記の配列に順次プッシュしていく関数。
最後にプッシュされた構造体をポップする関数、という3つです。
どのようにすればテンプレート構造体をクラスのメンバにすることが出来るのでしょうか?
もしくは、このような機能を持つクラスを実装するためにはどうすればいいのでしょうか?
よろしくお願いします。
675デフォルトの名無しさん
2017/06/04(日) 08:23:07.29ID:7To+hzFq まず
using テンプレート構造体の型 = 構造体テンプレート<型パラメーター>;
をします
using テンプレート構造体の型 = 構造体テンプレート<型パラメーター>;
をします
676デフォルトの名無しさん
2017/06/04(日) 11:02:02.70ID:4s9JqZC9677デフォルトの名無しさん
2017/06/04(日) 11:02:24.41ID:4s9JqZC9678デフォルトの名無しさん
2017/06/04(日) 21:12:43.78ID:0J0aNZ4Z 質問への回答はいいとして
たった100行のコードによくもここまでUNKOを詰め込めるものだと感心
たった100行のコードによくもここまでUNKOを詰め込めるものだと感心
679デフォルトの名無しさん
2017/06/04(日) 21:24:21.29ID:4s9JqZC9 >>678
どこ?教えて
どこ?教えて
680デフォルトの名無しさん
2017/06/04(日) 22:06:48.73ID:0J0aNZ4Z >>679
細かくは見てないがぱっと見て気になったのは、
殆どが「= default」で済むものを自前で定義する所とか
K,Vの左辺値が渡せないunkoコンストラクターとか
左辺値が渡せないpush関数とか
key_value_pair_stackの外で定義されたdefault_max_sizeとか
禁断の「value_type pop()」とか
ムーブ代入だけ何故か無いとか
例外安全を考慮しないswapとか
constexprの付いていない関数が多数とか
constが付いていないsize関数とか
質問者が「テンプレート構造体」と「クラス」の言葉を使い分けているのにわざわざクラステンプレートにする所とか
「value_type::value_type」の二つのvalue_typeの意味が違うとか
スワップする気皆無の「swap(key_value_pair&& other)」とか
あと
何故付いているのかわからない「const auto」のconstとか
キーバリューペアをシーケンシャルコンテナーに詰める例も地味にUNKO
細かくは見てないがぱっと見て気になったのは、
殆どが「= default」で済むものを自前で定義する所とか
K,Vの左辺値が渡せないunkoコンストラクターとか
左辺値が渡せないpush関数とか
key_value_pair_stackの外で定義されたdefault_max_sizeとか
禁断の「value_type pop()」とか
ムーブ代入だけ何故か無いとか
例外安全を考慮しないswapとか
constexprの付いていない関数が多数とか
constが付いていないsize関数とか
質問者が「テンプレート構造体」と「クラス」の言葉を使い分けているのにわざわざクラステンプレートにする所とか
「value_type::value_type」の二つのvalue_typeの意味が違うとか
スワップする気皆無の「swap(key_value_pair&& other)」とか
あと
何故付いているのかわからない「const auto」のconstとか
キーバリューペアをシーケンシャルコンテナーに詰める例も地味にUNKO
681デフォルトの名無しさん
2017/06/04(日) 22:21:08.74ID:4s9JqZC9682デフォルトの名無しさん
2017/06/04(日) 23:59:40.42ID:4s9JqZC9683デフォルトの名無しさん
2017/06/05(月) 07:13:59.57ID:dSqD3vhj >>682
20秒ほど眺めたがとりあえず3つほどなおした方がいい
・key_のメンバー宣言に{}が付いていないと、修正前と同じ動作にならない
・popの戻りはvoidにした方が無難
・clear()しても要素のデストラクターが呼ばれないのでstatic_assert(std::is_trivial_destructible<element_type>::value,"未対応")しとくのが礼儀
20秒ほど眺めたがとりあえず3つほどなおした方がいい
・key_のメンバー宣言に{}が付いていないと、修正前と同じ動作にならない
・popの戻りはvoidにした方が無難
・clear()しても要素のデストラクターが呼ばれないのでstatic_assert(std::is_trivial_destructible<element_type>::value,"未対応")しとくのが礼儀
684デフォルトの名無しさん
2017/06/05(月) 08:02:20.82ID:SbeuyTlX >>683
一つ目だけ意味がわからない…28行目のこと??なんで?
一つ目だけ意味がわからない…28行目のこと??なんで?
685デフォルトの名無しさん
2017/06/05(月) 08:16:13.98ID:dSqD3vhj >>684
その通り28行目
struct X {
some_type m1 /* {} */;
X() = default;
};
ここでsome_typeの初期化{}が無いとm1は未初期化になるし、
some_typeにデフォルトコンストラクターが無ければX()の「=default」が「=delete」扱いになる
その通り28行目
struct X {
some_type m1 /* {} */;
X() = default;
};
ここでsome_typeの初期化{}が無いとm1は未初期化になるし、
some_typeにデフォルトコンストラクターが無ければX()の「=default」が「=delete」扱いになる
686デフォルトの名無しさん
2017/06/05(月) 08:25:22.25ID:CMNJImQI687デフォルトの名無しさん
2017/06/05(月) 12:04:31.71ID:dSqD3vhj >>686
1:Yes, 2:Yes
struct X {string m; X()=default;};
struct X {int m{}; X()=default;};
struct X {int m; X() : m() {}};
はmが初期化される
struct X {int m; X()=default;};
が初期化されない
1:Yes, 2:Yes
struct X {string m; X()=default;};
struct X {int m{}; X()=default;};
struct X {int m; X() : m() {}};
はmが初期化される
struct X {int m; X()=default;};
が初期化されない
688デフォルトの名無しさん
2017/06/05(月) 12:34:51.89ID:CMNJImQI >>687
ありがとう
ありがとう
689デフォルトの名無しさん
2017/06/05(月) 21:07:12.97ID:YRHwBsQU 空のvectorをpop_backした時の仕様がクソ過ぎるC++
690デフォルトの名無しさん
2017/06/05(月) 23:54:31.67ID:vnQWBbWO691デフォルトの名無しさん
2017/06/06(火) 07:02:51.57ID:ueF+TYcD 気にすんな
簡単なことすんのにもこの難易度な言語がおかしい
簡単なことすんのにもこの難易度な言語がおかしい
692デフォルトの名無しさん
2017/06/06(火) 17:35:50.84ID:zF6NOqag というかほとんどがムーブとかconst版とかconstexprとか、とことん丁寧にやろうとした場合の作法まで
含めた突っ込みだから、初心者が気にするような話ではないなw
そもそも、最近右辺値参照使ったコードを「書かないといけない」と誤解してる人が多い気がするんだが
あんなもん「ポインタのすげ替えで済む場合」にそれを出来るようにするための仕組みで、
まず左辺値版を書いた上で、右辺値版も書けば速くなるよ、ってだけだよね?
上記に該当しようがしまいがまず左辺値版は必須だし(左辺値を弾きたいならともかく)
該当する場合に高速化したければ右辺値版も書けばいいというだけで
これまた初心者が気にするような話ではないw
含めた突っ込みだから、初心者が気にするような話ではないなw
そもそも、最近右辺値参照使ったコードを「書かないといけない」と誤解してる人が多い気がするんだが
あんなもん「ポインタのすげ替えで済む場合」にそれを出来るようにするための仕組みで、
まず左辺値版を書いた上で、右辺値版も書けば速くなるよ、ってだけだよね?
上記に該当しようがしまいがまず左辺値版は必須だし(左辺値を弾きたいならともかく)
該当する場合に高速化したければ右辺値版も書けばいいというだけで
これまた初心者が気にするような話ではないw
693デフォルトの名無しさん
2017/06/06(火) 18:16:24.12ID:uCSRK7Ay694デフォルトの名無しさん
2017/06/06(火) 18:58:32.67ID:zF6NOqag 違うというなら例ぐらい挙げてくれよ
695デフォルトの名無しさん
2017/06/06(火) 19:28:29.10ID:+mNKSnZM そういうのはスルーでok
696デフォルトの名無しさん
2017/06/06(火) 22:23:00.44ID:uCSRK7Ay697デフォルトの名無しさん
2017/06/06(火) 23:19:35.94ID:zF6NOqag >>696
ドヤ顔で用語を挙げろなどとは一言も言っていないのだがw
ドヤ顔で用語を挙げろなどとは一言も言っていないのだがw
698デフォルトの名無しさん
2017/06/07(水) 00:10:56.23ID:xZGjq0dG699デフォルトの名無しさん
2017/06/07(水) 00:22:15.23ID:2ipgwMGH 教える側界隈の高度なやり取りだけで終始しないでほしいんですけど、、
700デフォルトの名無しさん
2017/06/07(水) 00:27:13.62ID:gn2mDiBA >>699
ヒント:unique_ptrのムーブは性能目的ではない
ヒント:unique_ptrのムーブは性能目的ではない
701デフォルトの名無しさん
2017/06/07(水) 00:54:38.14ID:CXRZvrBM >>698
こっちは疑問形で書いてんだから普通に指摘してくれりゃいいんじゃねーの?
なんかコンプでも抱えてんのかね
unique_ptrみたいな所有権の移動の実現(を楽に実装する)は確かに気付いてなかったが
初心者が気にするような話ではない&いつも書かなければならないものではない、に対する反論になってないよな
ちょっとした指摘をそこまで煽って書ける神経が理解できん
こっちは疑問形で書いてんだから普通に指摘してくれりゃいいんじゃねーの?
なんかコンプでも抱えてんのかね
unique_ptrみたいな所有権の移動の実現(を楽に実装する)は確かに気付いてなかったが
初心者が気にするような話ではない&いつも書かなければならないものではない、に対する反論になってないよな
ちょっとした指摘をそこまで煽って書ける神経が理解できん
703デフォルトの名無しさん
2017/06/07(水) 08:16:07.46ID:PxDlVTZD >>701
君は概念を理解できないだろうけど
コピーされては困るから「ムーブ」「セマンティクス」
なんだよ
性能に余裕があってもね
右辺値参照がなかったらスマポをvectorに入れることすらままならないよ
君は概念を理解できないだろうけど
コピーされては困るから「ムーブ」「セマンティクス」
なんだよ
性能に余裕があってもね
右辺値参照がなかったらスマポをvectorに入れることすらままならないよ
704デフォルトの名無しさん
2017/06/07(水) 18:47:00.97ID:CXRZvrBM705デフォルトの名無しさん
2017/06/10(土) 17:42:01.48ID:SxYi4azU706デフォルトの名無しさん
2017/06/10(土) 20:12:18.00ID:JqmNS/A3 >>705
topとpop作れってことが言いたいんだろう多分
topとpop作れってことが言いたいんだろう多分
707デフォルトの名無しさん
2017/06/11(日) 22:14:52.88ID:iu5DR0Hy 「なぜなんだ?pop の戻りがナルなら空であることを示せてべんりだろう?」
↓
「topとpop作れ」
これがアスペというやつか
↓
「topとpop作れ」
これがアスペというやつか
708デフォルトの名無しさん
2017/06/11(日) 22:35:45.30ID:q49UmmFG お前アスペ言いたいだけだろ w
709はつみつ餃子 ◆8X2XSCHEME
2017/06/12(月) 01:27:35.05ID:M0cidITY std::queue では pop と front に分けられてるからその習慣に合わせた方がいいってことじゃない?
ただ、 queue のデザインが出来たときはムーブがなかったから先頭要素にアクセスするために
(参照でなく) 値を返すと同時にコンテナから削除するのはコピーが発生して非効率ってこともあってこうなってると思う。
今ならもっと別の選択肢はあっていいと思う。
まあ、古いデザインを引き摺っている部分はあるとは言っても標準ライブラリはすごくよく考えられてるから、
どうしてそうなっているのかを考察したり真似したりするのは良いと思う。
ただ、 queue のデザインが出来たときはムーブがなかったから先頭要素にアクセスするために
(参照でなく) 値を返すと同時にコンテナから削除するのはコピーが発生して非効率ってこともあってこうなってると思う。
今ならもっと別の選択肢はあっていいと思う。
まあ、古いデザインを引き摺っている部分はあるとは言っても標準ライブラリはすごくよく考えられてるから、
どうしてそうなっているのかを考察したり真似したりするのは良いと思う。
710デフォルトの名無しさん
2017/06/12(月) 01:48:34.70ID:E1Ahh3IF はつみつ
711デフォルトの名無しさん
2017/06/12(月) 17:36:41.84ID:t42bNJ0A >>709は健常者
ただ理由は性能でなくて例外安全だろう
ただ理由は性能でなくて例外安全だろう
712デフォルトの名無しさん
2017/06/17(土) 07:59:16.34ID:bupTq8cx クラスの演算子オバーロードの
書き方全種類教えてください。
operator (*)やoperator ""や
operator ->()辺りが特に解説が少なくて
理解するのに困ってます。
よろしくお願いします。
書き方全種類教えてください。
operator (*)やoperator ""や
operator ->()辺りが特に解説が少なくて
理解するのに困ってます。
よろしくお願いします。
713はちゃめちゃ餃子 ◆8X2XSCHEME
2017/06/17(土) 09:10:34.91ID:a/4tSU3I >>712
ユーザー定義リテラルについてはこのあたりが詳しいと思う。
https://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#over.literal
https://cpprefjp.github.io/lang/cpp11/user_defined_literals.html
名前空間名で修飾することができないので、
namespace 内で定義されたものについては using してからでないと使えないという規則が微妙に気持ち悪い。
あまりお勧めしない。
標準ライブラリが提供している complex 型のリテラルや時間のリテラルもそんなに頻繁には使わなさそうだし、
よく使うのは string 型のリテラルくらいかなぁ。
ユーザー定義リテラルについてはこのあたりが詳しいと思う。
https://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#over.literal
https://cpprefjp.github.io/lang/cpp11/user_defined_literals.html
名前空間名で修飾することができないので、
namespace 内で定義されたものについては using してからでないと使えないという規則が微妙に気持ち悪い。
あまりお勧めしない。
標準ライブラリが提供している complex 型のリテラルや時間のリテラルもそんなに頻繁には使わなさそうだし、
よく使うのは string 型のリテラルくらいかなぁ。
714デフォルトの名無しさん
2017/06/17(土) 11:23:50.84ID:cPfPWWru まずウェブブラウザーで
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2017/
をアクセスします。
次に「N4660」のPDFをダウンロードします。
右下に336と書かれたページ(16.5 Overloaded operators)を開きます。
そこから5ページほどスクロールしながら、英文を見ずにコードだけ眺めます。
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2017/
をアクセスします。
次に「N4660」のPDFをダウンロードします。
右下に336と書かれたページ(16.5 Overloaded operators)を開きます。
そこから5ページほどスクロールしながら、英文を見ずにコードだけ眺めます。
715デフォルトの名無しさん
2017/06/17(土) 11:24:51.65ID:cPfPWWru oops...
× N4660
○ N4659
× N4660
○ N4659
>>712
ユーザー定義リテラルについては書かれていないが、それでも演算子オーバーロードについては
http://stlalv.la.coocan.jp/
が詳しいのではないか?はちみつさんがこれに触れないのは不思議‥
ユーザー定義リテラルについては書かれていないが、それでも演算子オーバーロードについては
http://stlalv.la.coocan.jp/
が詳しいのではないか?はちみつさんがこれに触れないのは不思議‥
717デフォルトの名無しさん
2017/06/17(土) 12:24:13.05ID:qMkdrUOQ あ、うんでもなんか、
http://stlalv.la.coocan.jp/HungarianNotation.html
↑のページ読んだだけでもうダメなんじゃないかって
文章もなんか危ないというか危ういし
とおもったらQZか
な〜んだ納得
http://stlalv.la.coocan.jp/HungarianNotation.html
↑のページ読んだだけでもうダメなんじゃないかって
文章もなんか危ないというか危ういし
とおもったらQZか
な〜んだ納得
718デフォルトの名無しさん
2017/06/17(土) 13:21:59.00ID:ir1eTLN6719はちみつ行者 ◆8X2XSCHEME
2017/06/17(土) 14:21:54.44ID:a/4tSU3I720デフォルトの名無しさん
2017/06/17(土) 14:31:32.36ID:bupTq8cx 712です。
短いコードを打ちこんで動作を確認しました。
皆さん有り難うございました。
(ちょっと気になったのは
void operator [](std::initializer_list <int > list);
これがvsc2015では動作しなかったことぐらいです。
)
短いコードを打ちこんで動作を確認しました。
皆さん有り難うございました。
(ちょっと気になったのは
void operator [](std::initializer_list <int > list);
これがvsc2015では動作しなかったことぐらいです。
)
721653
2017/06/17(土) 16:42:18.70ID:YXyzn6OG それ戻り値がvoidだからじゃ
vs2015で試したら添字演算子の結果を使わなければvoidのままでも動いたし
戻り値返すようにしたら普通の使い方もできたよ
vs2015で試したら添字演算子の結果を使わなければvoidのままでも動いたし
戻り値返すようにしたら普通の使い方もできたよ
722はちみつ餃子 ◆8X2XSCHEME
2017/06/17(土) 18:56:32.74ID:a/4tSU3I 話がそれるけど operator[] に initializer_list を渡したいときってどんなとき?
次元が動的に決まるようなコンテナとか?
次元が動的に決まるようなコンテナとか?
723デフォルトの名無しさん
2017/06/18(日) 00:16:25.00ID:sDQUBcQX xyの二つの値を渡したかったんだろ
言わせんな恥ずかしい
言わせんな恥ずかしい
724はちみつ餃子 ◆8X2XSCHEME
2017/06/18(日) 00:50:52.82ID:fX2BYeVR void って C++ の予約語の中ではカッコイイ言葉ナンバーワンだよな!
726デフォルトの名無しさん
2017/06/19(月) 13:14:46.01ID:dXkNDY8/ pascal とか fortran の方が良くね?
727デフォルトの名無しさん
2017/06/19(月) 13:45:34.22ID:LlSBVcNV 後藤
728はちみつ餃子 ◆8X2XSCHEME
2017/06/19(月) 14:29:30.47ID:MatPzd+v >>726
良かろうが悪かろうがこのスレに来てるのはそれでも C/C++ を使うってやつらなんだからその問いかけは無意味
良かろうが悪かろうがこのスレに来てるのはそれでも C/C++ を使うってやつらなんだからその問いかけは無意味
729デフォルトの名無しさん
2017/06/19(月) 15:29:57.68ID:dXkNDY8/ 予約語として他言語から呼べる万能感があるのに :-P
C89では削除されたのだっけ
C89では削除されたのだっけ
>>727
setjmp/longjmp のインパクト!を考えると、いまいちだと思いますぅ
setjmp/longjmp のインパクト!を考えると、いまいちだと思いますぅ
731デフォルトの名無しさん
2017/06/20(火) 00:48:54.33ID:tAZ0INkH longjmpは無理やり過ぎだよな
Cならではとも思うが
Cならではとも思うが
732デフォルトの名無しさん
2017/06/20(火) 00:52:30.35ID:tAZ0INkH リターンアドレスレジスタみたいなの持ってる石だと
ちょいとだけ複雑になるのかすぃら?
ちょいとだけ複雑になるのかすぃら?
733デフォルトの名無しさん
2017/06/20(火) 23:58:21.18ID:f6m5FZzF >>172
>MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ!
>研究会のメンバーでさえ、規格に詳しい人がいないのだから
規格も理解できない奴らが集まって書いた27年前の規格の解説本って
やばすぎだろ
>MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ!
>研究会のメンバーでさえ、規格に詳しい人がいないのだから
規格も理解できない奴らが集まって書いた27年前の規格の解説本って
やばすぎだろ
734デフォルトの名無しさん
2017/06/21(水) 00:16:32.09ID:vvvagSt1 5ヶ月以上前のレスに反応するって
やばすぎだろ
やばすぎだろ
735デフォルトの名無しさん
2017/06/21(水) 04:19:48.48ID:ZaPNA4YS コンパイラやライブラリが腐っていることなんて
良くある事。利用者は配慮してくれないと (AA略)
良くある事。利用者は配慮してくれないと (AA略)
736デフォルトの名無しさん
2017/06/21(水) 11:49:15.08ID:x++JJuQ3 最終的にできたものが使用通りならそれでいい
規格準拠度なんてどうでもいいな
規格準拠度なんてどうでもいいな
737デフォルトの名無しさん
2017/06/21(水) 13:05:32.11ID:sg+bsLqU /* 仕様通り動いたコード */
int Z = 0; // これを消すと動かなくなる
int Z2 = 0; // 2010.1.4. vcバグ回避の追加
char *s, *p;
if (s==p) return 2; //これ必要?
int Z = 0; // これを消すと動かなくなる
int Z2 = 0; // 2010.1.4. vcバグ回避の追加
char *s, *p;
if (s==p) return 2; //これ必要?
738デフォルトの名無しさん
2017/06/23(金) 22:17:07.01ID:U/0DguFU A a = {};
これってコピーコンストラクタ呼ばれる可能性ある?
これってコピーコンストラクタ呼ばれる可能性ある?
739デフォルトの名無しさん
2017/06/24(土) 00:27:16.63ID:PfOqrM0w ない
740デフォルトの名無しさん
2017/06/24(土) 00:27:41.83ID:5MVxspQe741デフォルトの名無しさん
2017/06/24(土) 09:24:07.49ID:AroON3at イコールあるけどコピーしないん?
もう文法わけわからん
もう文法わけわからん
742デフォルトの名無しさん
2017/06/24(土) 13:28:24.19ID:7MOF4v/u 変数宣言のときの=はあくまで初期化であって、たまたま同じ記号を使ってるだけで代入とは違うと思ったほうがいい
同じと思うと他にもC++の参照とかで混乱する
同じと思うと他にもC++の参照とかで混乱する
743デフォルトの名無しさん
2017/06/24(土) 15:16:01.77ID:qquEaJ2M744デフォルトの名無しさん
2017/06/24(土) 18:10:28.98ID:Ipep7Yd5745デフォルトの名無しさん
2017/06/26(月) 12:57:25.63ID:dr/i6/ki >>744
コピー出来るクラスを例に持って来いよ
コピー出来るクラスを例に持って来いよ
746デフォルトの名無しさん
2017/06/28(水) 18:40:34.84ID:lG20CtJa コピー出来ないクラスではコンパイル結果が異なるという>>744の指摘に対して
「コピー出来るクラスを例に持って来い」とはこれ如何に
「コピー出来るクラスを例に持って来い」とはこれ如何に
747デフォルトの名無しさん
2017/06/28(水) 18:53:40.08ID:fwJBxSlX >>746
その元コメントはコピーしようがしまいがと言ってるのにそもそもコピー出来ないクラス持ってきて罵倒とはこれ如何に
その元コメントはコピーしようがしまいがと言ってるのにそもそもコピー出来ないクラス持ってきて罵倒とはこれ如何に
748デフォルトの名無しさん
2017/06/28(水) 20:44:21.28ID:VFMMUwAr749デフォルトの名無しさん
2017/06/28(水) 20:47:16.20ID:VFMMUwAr デフォルトコンストラクタでカレーライスを製造
コピーコンストラクタでラーメンを製造
代入でうどんを製造
同じか?
コピーコンストラクタでラーメンを製造
代入でうどんを製造
同じか?
750デフォルトの名無しさん
2017/06/28(水) 21:08:19.84ID:lG20CtJa751デフォルトの名無しさん
2017/06/28(水) 21:16:03.41ID:VFMMUwAr いや、ちょっとズレてると思うよ
752デフォルトの名無しさん
2017/06/28(水) 22:13:17.29ID:xb2y2Mwj 横から何だけど
どうズレてるかの説明は無いの?
どうズレてるかの説明は無いの?
753デフォルトの名無しさん
2017/06/28(水) 22:25:47.08ID:xMEBWJOX コピーしない保証がC++17でさらに追加されたがそこで最適化でコピーしようが直接構築しようがどちらでもよかったC++14までの規格は彼の頭の中ではヴァカでお花畑らしい
754デフォルトの名無しさん
2017/06/28(水) 23:59:13.87ID:lG20CtJa755デフォルトの名無しさん
2017/06/29(木) 00:23:16.57ID:0BA30UdR756デフォルトの名無しさん
2017/06/29(木) 08:20:56.52ID:J9UCM8ul757デフォルトの名無しさん
2017/06/30(金) 16:06:42.41ID:YTlik2k9 printf("おちんぽじゅぽじゅぽ")
758デフォルトの名無しさん
2017/06/30(金) 23:27:57.21ID:SxEaPPM4 catch のところで例外を再スローすると
再スローされた例外の型は、catchの所に書いたスーパークラスの型に
差し代わってしまうの?
再スローされた例外の型は、catchの所に書いたスーパークラスの型に
差し代わってしまうの?
759デフォルトの名無しさん
2017/06/30(金) 23:50:44.58ID:wfcExao2 式無しのthrow;なら元の型のまま
760デフォルトの名無しさん
2017/07/01(土) 17:28:15.16ID:T5yR4ind 「型に差し代わってしまうの?」
↓
「〜なら元の型のまま」
確かにその通りなのだが、「型」に着目するあたり、
どうも仕様を正しく理解していないのではという気がしてならない
↓
「〜なら元の型のまま」
確かにその通りなのだが、「型」に着目するあたり、
どうも仕様を正しく理解していないのではという気がしてならない
761デフォルトの名無しさん
2017/07/01(土) 22:43:53.34ID:mdEe7tMk c++は難しい分ほかの言語より色々できると聞いたんですがどういうことができるのでしょうか?
762デフォルトの名無しさん
2017/07/01(土) 22:56:09.11ID:qtP/3v2i メモリアクセスができます
763デフォルトの名無しさん
2017/07/01(土) 23:22:20.76ID:sgaEl9jo 難しいからではなく低級言語なのでハードウェアを直接操作するようなプログラムも書ける
764デフォルトの名無しさん
2017/07/02(日) 00:10:04.15ID:kxMmAO7v765デフォルトの名無しさん
2017/07/02(日) 10:29:07.80ID:TVPISEnD 質問です
doubleの計算誤差ってちゃんと考慮必要でしょうか?
数桁の四則演算なら誤差なしと考えていいですか?
doubleの計算誤差ってちゃんと考慮必要でしょうか?
数桁の四則演算なら誤差なしと考えていいですか?
766デフォルトの名無しさん
2017/07/02(日) 12:30:57.68ID:w2e8t6sv 考慮が必要な時もあるし
不要な時もある
不要な時もある
768デフォルトの名無しさん
2017/07/02(日) 14:24:20.03ID:O/UEQvVu 精度保証付きの演算ライブラリ使えば?
769デフォルトの名無しさん
2017/07/02(日) 15:42:45.32ID:1Me6IR2g 4倍精度でも8倍精度でも多倍長でも整数でも有理数でも、使い方を間違えば誤差が問題になる
安直な処理で一番問題が発生しやすいのが整数丸めと比較
ごくごく微妙な誤差は何時でも含んでいると思うと良い
安直な処理で一番問題が発生しやすいのが整数丸めと比較
ごくごく微妙な誤差は何時でも含んでいると思うと良い
770デフォルトの名無しさん
2017/07/02(日) 15:45:50.50ID:1Me6IR2g >>768
大抵の演算ライブラリや演算器は精度の保証がある
大抵の演算ライブラリや演算器は精度の保証がある
771デフォルトの名無しさん
2017/07/02(日) 16:02:14.06ID:O/UEQvVu >>770
いや、そうじゃなくて浮動小数点計算誤差由来の誤差を解決するための分野とライブラリがあるんだよ
解をレンジで持ち続けるみたいな感じ
Accuracy guaranteed numerical calculation でググるとたくさん出てくるよ
いや、そうじゃなくて浮動小数点計算誤差由来の誤差を解決するための分野とライブラリがあるんだよ
解をレンジで持ち続けるみたいな感じ
Accuracy guaranteed numerical calculation でググるとたくさん出てくるよ
772デフォルトの名無しさん
2017/07/02(日) 16:12:27.01ID:1Me6IR2g773デフォルトの名無しさん
2017/07/02(日) 16:13:48.15ID:9wrwY3nx mpir、gmpだろ。これ使えば円周率1万でも1億でも正確に計算できるはず
774デフォルトの名無しさん
2017/07/02(日) 16:15:08.10ID:1Me6IR2g 有理数を有理数のまま保持している分には、四則演算では誤差が発生しない
もちろんオーバーフローしない条件で
もちろんオーバーフローしない条件で
775デフォルトの名無しさん
2017/07/02(日) 16:16:17.16ID:1Me6IR2g >>773
前提条件は数桁の四則演算
前提条件は数桁の四則演算
776デフォルトの名無しさん
2017/07/02(日) 16:18:03.31ID:1Me6IR2g doubleで計算を前提とし、誤差が問題となりやすい場面だけ教えてあげれば十分
777デフォルトの名無しさん
2017/07/02(日) 16:22:01.48ID:9wrwY3nx 実際、浮動小数点型の誤差は無視できないぞ。
float型とか、容量が少ないほど。情報処理の入門書の最初から出てくる話題だろ。
float型とか、容量が少ないほど。情報処理の入門書の最初から出てくる話題だろ。
778デフォルトの名無しさん
2017/07/02(日) 16:22:48.13ID:jIucKliD いい加減スレタイ変えろよ
【初心者姦ゲイ】C/C++室 Ver.100【姦狂依存OK】
【初心者姦ゲイ】C/C++室 Ver.100【姦狂依存OK】
779デフォルトの名無しさん
2017/07/02(日) 16:36:49.35ID:1Me6IR2g780デフォルトの名無しさん
2017/07/02(日) 16:37:57.96ID:1Me6IR2g doubleより前に、整数演算の誤差を学ばなければならないレベルかも
781デフォルトの名無しさん
2017/07/02(日) 16:42:50.35ID:1Me6IR2g782デフォルトの名無しさん
2017/07/02(日) 17:12:26.96ID:ZK/8Emjh コーディング規約で
float、doubleは使用禁止が正解
float、doubleは使用禁止が正解
783デフォルトの名無しさん
2017/07/02(日) 18:20:54.13ID:p749GQFM 1/3の結果に3を掛けても1にならないとか、
0.1を10回足し合わせても1と一致しないとか、
その辺りは分かっているのかな?
0.1を10回足し合わせても1と一致しないとか、
その辺りは分かっているのかな?
784デフォルトの名無しさん
2017/07/02(日) 18:24:15.36ID:p749GQFM785デフォルトの名無しさん
2017/07/02(日) 18:38:08.40ID:FdY2ZCkQ ・同じ計算をするんでも
なるべく精度の高いアルゴリズムを選ぶ
・0との比較では、絶対値と計算機epsilonの比較を用いる
他にある?
なるべく精度の高いアルゴリズムを選ぶ
・0との比較では、絶対値と計算機epsilonの比較を用いる
他にある?
786デフォルトの名無しさん
2017/07/02(日) 18:50:30.43ID:MoO3L/4V >・0との比較では、絶対値と計算機epsilonの比較を用いる
何かとごっちゃになってる気がする。
計算の収束判定等で用いるのは機械イプシロンじゃない。
何かとごっちゃになってる気がする。
計算の収束判定等で用いるのは機械イプシロンじゃない。
787デフォルトの名無しさん
2017/07/02(日) 19:09:48.56ID:MlDTzv8m >>785
0との比較に限らず、比較には絶対値の大きさに応じたεの考慮が必要。
0との比較に限らず、比較には絶対値の大きさに応じたεの考慮が必要。
788デフォルトの名無しさん
2017/07/02(日) 19:18:00.04ID:ttjnRDkm 機械イプシロンはあくまでも最大値だよね
789デフォルトの名無しさん
2017/07/02(日) 20:17:22.84ID:+3axEb/N 初めて知りました
790デフォルトの名無しさん
2017/07/02(日) 20:44:23.29ID:+3axEb/N 数桁のdouble計算で誤差が問題になる場面では「誤差が存在する」ことが問題であって、精度を上げることは(誤差の大小は)本質的な解決でないような
(3.1 - 2.9 > 0.2) != (3.1 > 2.9 + 0.2)みたいな
(3.1 - 2.9 > 0.2) != (3.1 > 2.9 + 0.2)みたいな
791デフォルトの名無しさん
2017/07/02(日) 21:37:11.95ID:9wrwY3nx 計算順序で誤差が違ってくるのは教科書でよくかいてある
792デフォルトの名無しさん
2017/07/02(日) 22:54:19.38ID:ynDhLM7Z 情報処理資格に受かっていない人が、C/C++ をプログラミングするなど、10年早い
C/C++ は、直接デバイスを扱うから、自作パソコンを作れるぐらいに、
かなりパソコン内部の装置の仕組みを、知っていないと無理
さらに組み込みなら、高度情報処理のエンベッド資格も必要
C/C++ は、直接デバイスを扱うから、自作パソコンを作れるぐらいに、
かなりパソコン内部の装置の仕組みを、知っていないと無理
さらに組み込みなら、高度情報処理のエンベッド資格も必要
793デフォルトの名無しさん
2017/07/02(日) 22:59:43.93ID:9wrwY3nx そんなことはない
794デフォルトの名無しさん
2017/07/02(日) 22:59:50.00ID:MoO3L/4V お前は試験に受かってからプログラミング始めるのかw
795デフォルトの名無しさん
2017/07/02(日) 23:03:16.06ID:UYpoTCPe パソコンって、アドレスバスの、メモリ読み書きで、
デバイスを、直接操作するのか?
それとも、アドレスA0000に文字を書き込むのか?
その知識、30年くらい、遅くね?
デバイスを、直接操作するのか?
それとも、アドレスA0000に文字を書き込むのか?
その知識、30年くらい、遅くね?
796デフォルトの名無しさん
2017/07/02(日) 23:32:00.58ID:1Me6IR2g >>782
整数も除算に誤差があるから禁止
整数も除算に誤差があるから禁止
797デフォルトの名無しさん
2017/07/02(日) 23:32:37.56ID:1Me6IR2g >>783
整数でも1/3*3は1にならない
整数でも1/3*3は1にならない
798デフォルトの名無しさん
2017/07/02(日) 23:35:11.82ID:1Me6IR2g799デフォルトの名無しさん
2017/07/02(日) 23:36:02.92ID:iWsKHD5Z 0になるし誤差はないな
800デフォルトの名無しさん
2017/07/02(日) 23:36:20.12ID:1Me6IR2g801デフォルトの名無しさん
2017/07/02(日) 23:36:31.36ID:iWsKHD5Z って触れちゃダメな奴だったかすまん
802デフォルトの名無しさん
2017/07/02(日) 23:38:56.12ID:+3axEb/N 前回、共用体の非アクティブメンバーアクセスが許されるcommon initial sequenceの条件である「型の互換性」に目を付けたレスを見た時は
>>792がもう少し見所の有る奴だと思っていた(過去形)
>>792がもう少し見所の有る奴だと思っていた(過去形)
803デフォルトの名無しさん
2017/07/02(日) 23:51:33.15ID:p749GQFM >>797
すまん、1/3は1.0/3とか書くべきところだったな。
すまん、1/3は1.0/3とか書くべきところだったな。
804デフォルトの名無しさん
2017/07/02(日) 23:53:35.08ID:1Me6IR2g いやいやそこじゃなくて
805デフォルトの名無しさん
2017/07/02(日) 23:55:20.40ID:1Me6IR2g 1.0/3.0*3.0 が 1.0にならないことがある
1/3*3 が 1にならない
小数演算特有ではない
1/3*3 が 1にならない
小数演算特有ではない
806デフォルトの名無しさん
2017/07/02(日) 23:59:40.73ID:1Me6IR2g 0.1を10回足しても1にならないことがあるって言うのも小数特有ではない
0.1は普通のfloatやdoubleでは表現できず、コンパイル時に近似値に変換する
この意味では以下と本質的には同じ
int a = 0.1;
int b = a * 10;
0.1は普通のfloatやdoubleでは表現できず、コンパイル時に近似値に変換する
この意味では以下と本質的には同じ
int a = 0.1;
int b = a * 10;
807デフォルトの名無しさん
2017/07/03(月) 00:01:24.04ID:UYk8Gv77 >>792
自作って高価なプラモデルだぞ。。。
夢見過ぎ。
直接ってもなぁ。。。
昔はx86限定で直接レジスタ弄れる命令あったんだが、その命令は今じゃ優先的にレジスタ使ってね☆って意味に変質してるもんなぁ。。。
今のCは思ってるより下級言語じゃ無いぞ。
普通の言語よりゃハードに近いけどさ。
自作って高価なプラモデルだぞ。。。
夢見過ぎ。
直接ってもなぁ。。。
昔はx86限定で直接レジスタ弄れる命令あったんだが、その命令は今じゃ優先的にレジスタ使ってね☆って意味に変質してるもんなぁ。。。
今のCは思ってるより下級言語じゃ無いぞ。
普通の言語よりゃハードに近いけどさ。
808デフォルトの名無しさん
2017/07/03(月) 00:02:29.57ID:Ds1QZZUB doubleがintに比べて誤差が少ないため、誤差を気にせずに使ってしまいやすい
だから注意の意味を含めて誤差が大袈裟に語られる傾向がある
当然整数の方が(普通は)はるかに誤差が大きい
だから注意の意味を含めて誤差が大袈裟に語られる傾向がある
当然整数の方が(普通は)はるかに誤差が大きい
809デフォルトの名無しさん
2017/07/03(月) 00:03:12.56ID:NRAuceWo >>805
それは知ってるけど元の質問者がdoubleの演算誤差について聞いているのだから、整数の除算の件は話が外れていると思う。
この手のスレに良くあることだけど、元の質問から勝手に話が発散して何を目的に議論しているのかが分からなくなるね。
それは知ってるけど元の質問者がdoubleの演算誤差について聞いているのだから、整数の除算の件は話が外れていると思う。
この手のスレに良くあることだけど、元の質問から勝手に話が発散して何を目的に議論しているのかが分からなくなるね。
810デフォルトの名無しさん
2017/07/03(月) 00:04:40.53ID:Ds1QZZUB811デフォルトの名無しさん
2017/07/03(月) 00:10:25.95ID:Ds1QZZUB よくやりがちな例は、
for (double a = 0; a <= 1 ; a += 0.1)
みたいな比較と
double a = sqrt(3);
double b = a * a;
int c = b;
みたいな整数丸め
for (double a = 0; a <= 1 ; a += 0.1)
みたいな比較と
double a = sqrt(3);
double b = a * a;
int c = b;
みたいな整数丸め
812デフォルトの名無しさん
2017/07/03(月) 00:12:35.84ID:Ds1QZZUB これは、
double に限らす10000桁精度の演算ライブラリでも全く同じ問題がほぼ同じ率で起こる
double に限らす10000桁精度の演算ライブラリでも全く同じ問題がほぼ同じ率で起こる
813デフォルトの名無しさん
2017/07/03(月) 00:14:47.47ID:Ds1QZZUB 前者はループが10回か11回かはバクチで、
後者はcが2になるか3になるかはバクチ
後者はcが2になるか3になるかはバクチ
814デフォルトの名無しさん
2017/07/03(月) 00:19:44.20ID:UYk8Gv77 なんかそんなの読んだことあるな。
計算結果は精度の範囲内だけど、計算途中で精度超えて結果に誤差が出る的な。
なんか対策あったぞ。
計算結果は精度の範囲内だけど、計算途中で精度超えて結果に誤差が出る的な。
なんか対策あったぞ。
815デフォルトの名無しさん
2017/07/03(月) 04:06:04.60ID:yzYakBEJ816デフォルトの名無しさん
2017/07/03(月) 04:57:07.32ID:BlNCaFmm >>792
カーニハンもリッチーも受かっていないようだが?
カーニハンもリッチーも受かっていないようだが?
817デフォルトの名無しさん
2017/07/03(月) 08:32:52.95ID:rvaVDuHz818デフォルトの名無しさん
2017/07/03(月) 11:17:36.99ID:rWGDP/Vn 下限ではない
下限はその半分
下限はその半分
819デフォルトの名無しさん
2017/07/03(月) 19:44:02.70ID:BsrmCust VisualC++とそれ以外用とで別の関数を用意して、プリプロセッサを使用してコンパイル時に選択したいと思っています
この場合、関数全体を#ifdef _MSC_VER〜#endifで囲うことになるのですか?
もう少しきれいな書き方があれば教えてください
よろしくお願いします
この場合、関数全体を#ifdef _MSC_VER〜#endifで囲うことになるのですか?
もう少しきれいな書き方があれば教えてください
よろしくお願いします
820デフォルトの名無しさん
2017/07/03(月) 20:12:56.57ID:oiFj/hKr >>819
機種依存部分をライブラリ化してリンク時に差し替えるとか
機種依存部分をライブラリ化してリンク時に差し替えるとか
821デフォルトの名無しさん
2017/07/03(月) 20:21:04.11ID:tl3oQzgh 関数全体を切り替えたいなら関数全体を複数記述するしかあるまい
部分的に違うだけならその違う部分的だけ切り替えればいい
関数全体を複数記述する方法はいくつかある
部分的に違うだけならその違う部分的だけ切り替えればいい
関数全体を複数記述する方法はいくつかある
822デフォルトの名無しさん
2017/07/04(火) 00:10:04.57ID:2/r2iAfu >>819
別にそれでいいじゃん。大量にあるならファイル分ければいいし
別にそれでいいじゃん。大量にあるならファイル分ければいいし
823デフォルトの名無しさん
2017/07/04(火) 09:38:28.01ID:GKwjzP9N class A {}
int main{
A a; //c++
A a = new A(); //c#
}
このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか?
int main{
A a; //c++
A a = new A(); //c#
}
このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか?
824デフォルトの名無しさん
2017/07/04(火) 10:10:55.61ID:A8K7ipT2825デフォルトの名無しさん
2017/07/04(火) 10:53:00.81ID:GKwjzP9N >>824
スッキリしました。ありがとうございます。
スッキリしました。ありがとうございます。
826デフォルトの名無しさん
2017/07/04(火) 12:24:06.77ID:rriFyG5E いやC++やるならスタックかヒープかは意識しなきゃだめだろ
deleteどうすんの
deleteどうすんの
827デフォルトの名無しさん
2017/07/04(火) 12:53:41.35ID:Tv7aUxog828デフォルトの名無しさん
2017/07/04(火) 16:07:16.69ID:BdJEhj1W ヒープはC#の方だろ、とりあえず意識しないでも
829デフォルトの名無しさん
2017/07/04(火) 17:16:06.09ID:RU97axJ4 C#はdelete書かないんだからC++なら
deleteが不要な「A a;」を同等と捉えるのが筋
配置場所なんかどうでもええ
deleteが不要な「A a;」を同等と捉えるのが筋
配置場所なんかどうでもええ
830デフォルトの名無しさん
2017/07/04(火) 18:37:27.41ID:eP5xPbfu newだとスコープ抜けても残るんじゃ?
831デフォルトの名無しさん
2017/07/04(火) 18:44:00.48ID:xAcMjOR1 C#だとスマポみたいになるんかね
832デフォルトの名無しさん
2017/07/04(火) 19:56:18.89ID:3bDdeHlE c#はGC管理、classは参照型
833デフォルトの名無しさん
2017/07/04(火) 20:17:33.06ID:olJiM2Cb >>829
寿命が全然違うじゃないですかぁ
寿命が全然違うじゃないですかぁ
834デフォルトの名無しさん
2017/07/04(火) 20:31:05.28ID:L7t36fm1 コストも
835デフォルトの名無しさん
2017/07/04(火) 21:02:27.05ID:V6j6UQbw で?
836デフォルトの名無しさん
2017/07/04(火) 21:52:57.05ID:+pBAjacr すげえ考え方の奴が出てきてワロッシュ
837デフォルトの名無しさん
2017/07/04(火) 22:13:30.60ID:kiqPrlXB 寿命だのコストだの言うけど
そんな実相依存どうやって見積もるの?
無意味な揚げ足取りはやめたら?
そんな実相依存どうやって見積もるの?
無意味な揚げ足取りはやめたら?
838デフォルトの名無しさん
2017/07/04(火) 22:14:59.82ID:VwPftttd え?
839デフォルトの名無しさん
2017/07/04(火) 22:17:16.01ID:TrkY+sIz C++ 側は実装依存な部分あるっけ? C#側はよーわからんけど
840デフォルトの名無しさん
2017/07/04(火) 22:19:25.34ID:dCdz+uzl こっちはC++スレだぞ?C++でスタックとヒープのコストや寿命の違いを意識する必要がないってマジでいってるのかよ
841デフォルトの名無しさん
2017/07/04(火) 22:29:39.22ID:kiqPrlXB newの方はC#のって前置きがあるだろうが
よく読め
まあ元々の質問もあれだが
よく読め
まあ元々の質問もあれだが
842デフォルトの名無しさん
2017/07/04(火) 22:42:25.19ID:IS9gvNe4 コストは
c++のnew>>(超えられない壁)>>c#のnew>スタック
全然違うというほどでもないし
c++のnew>>(超えられない壁)>>c#のnew>スタック
全然違うというほどでもないし
843デフォルトの名無しさん
2017/07/04(火) 23:02:36.26ID:olJiM2Cb コストは置いておいたとしても寿命はどうするんだよ
平たく言うと
「マニュアル車の1速は、オートマ車のDと同じ意味ですか?」
って質問だぞ
それに対して
「オートマ車はDで発進するからマニュアル車なら1速と同等ととらえるのが筋
速度が出た後のことなんかどうでもええ」
ってのはなんか違うだろ
メモリ管理に関してはC++はマニュアルでC#はオートなんだから
こういうたとえになるんだよ
平たく言うと
「マニュアル車の1速は、オートマ車のDと同じ意味ですか?」
って質問だぞ
それに対して
「オートマ車はDで発進するからマニュアル車なら1速と同等ととらえるのが筋
速度が出た後のことなんかどうでもええ」
ってのはなんか違うだろ
メモリ管理に関してはC++はマニュアルでC#はオートなんだから
こういうたとえになるんだよ
844デフォルトの名無しさん
2017/07/04(火) 23:10:09.31ID:VgVQ93XC >>837
おまいさん資格持ちじゃないよな?な?な?
おまいさん資格持ちじゃないよな?な?な?
845デフォルトの名無しさん
2017/07/04(火) 23:15:08.21ID:olJiM2Cb あと、C#はJavaと違って構造体が使えてこれは値型になれるから
スタックに確保できる
なんで、C++の A a; はどちらかというと、そちらに該当するんだよ
で、C#のA a = new A(); はというと
delete が必要という一点を除けば C++ の A *a = new A();に相当するんだよ
こんなこと当たり前だろ
スタックに確保できる
なんで、C++の A a; はどちらかというと、そちらに該当するんだよ
で、C#のA a = new A(); はというと
delete が必要という一点を除けば C++ の A *a = new A();に相当するんだよ
こんなこと当たり前だろ
846デフォルトの名無しさん
2017/07/04(火) 23:23:27.06ID:9HpxJyun847デフォルトの名無しさん
2017/07/04(火) 23:33:11.25ID:AVhuZxl1848デフォルトの名無しさん
2017/07/04(火) 23:38:27.02ID:olJiM2Cb >単に「Aのインスタンス生成するコード書いてみ」
ってのはお前が勝手に言ってることだろ
元は
>このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか?
だ
ってのはお前が勝手に言ってることだろ
元は
>このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか?
だ
849デフォルトの名無しさん
2017/07/04(火) 23:38:59.24ID:AKPIjSm8 超えられないかはともかく、newに限って言えばGC言語の方が低コストでもおかしくない。
850デフォルトの名無しさん
2017/07/04(火) 23:39:54.18ID:kiqPrlXB 厳密にどうかじゃないんだよ
初心者がこれから言語を勉強していくのに
より得になる方はどっちだってことよ
GCだからー、ヒープだからーって
そんな答えおよびじゃないっつーの
初心者がこれから言語を勉強していくのに
より得になる方はどっちだってことよ
GCだからー、ヒープだからーって
そんな答えおよびじゃないっつーの
851デフォルトの名無しさん
2017/07/04(火) 23:40:16.44ID:AVhuZxl1 実際に試してから言えよ
852デフォルトの名無しさん
2017/07/04(火) 23:40:38.87ID:AVhuZxl1853デフォルトの名無しさん
2017/07/04(火) 23:43:53.74ID:olJiM2Cb どの程度の初心者かわからないだろ
C#と比べてるってことは既にC#をそこそこマスターしているかもしれないだろ
その状態でC++に手を出そうとしていたとしたら、どうだ?
C#とC++の違いなどを書いたほうが良いだろ
C#と比べてるってことは既にC#をそこそこマスターしているかもしれないだろ
その状態でC++に手を出そうとしていたとしたら、どうだ?
C#とC++の違いなどを書いたほうが良いだろ
854デフォルトの名無しさん
2017/07/04(火) 23:46:31.14ID:tvZqc0j8855デフォルトの名無しさん
2017/07/04(火) 23:47:41.62ID:AVhuZxl1 違うものは違う
856デフォルトの名無しさん
2017/07/04(火) 23:48:12.47ID:VwPftttd もういいよ、まとめると
C++ではインスタンス生成(アドレスの決定)は二種類のやり方がある
A a;
A* pa = new A();
前者はスタックのアドレスが割り当てられ、後者は通常はヒープのアドレスが割り当てられる。
前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。
C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、
A a; //struct A
B b = new B(); //class B
前者はスタックのアドレスが割り当てられ、後者はヒープのアドレスが割り当てられる。
前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。
どれとどれを同じと思うかは人それぞれ。
終了
C++ではインスタンス生成(アドレスの決定)は二種類のやり方がある
A a;
A* pa = new A();
前者はスタックのアドレスが割り当てられ、後者は通常はヒープのアドレスが割り当てられる。
前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。
C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、
A a; //struct A
B b = new B(); //class B
前者はスタックのアドレスが割り当てられ、後者はヒープのアドレスが割り当てられる。
前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。
どれとどれを同じと思うかは人それぞれ。
終了
857デフォルトの名無しさん
2017/07/04(火) 23:50:58.52ID:TrkY+sIz C# の後者の寿命は? delete pa は C++ だよね
858デフォルトの名無しさん
2017/07/04(火) 23:53:27.36ID:VwPftttd859デフォルトの名無しさん
2017/07/05(水) 00:46:01.47ID:EyHtcvE8860デフォルトの名無しさん
2017/07/05(水) 22:56:44.72ID:UhWlQCq1 異なる考えの言語同士であるため対応が自明でないという事実を無視して
自分の考える「同じ意味」の解釈を押し付けるからに相違ない
>C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、
>A a; //struct A
なるほどこうやって言語仕様を確認せず想像をたれ流すので世の中が嘘だらけになるのだな
自分の考える「同じ意味」の解釈を押し付けるからに相違ない
>C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、
>A a; //struct A
なるほどこうやって言語仕様を確認せず想像をたれ流すので世の中が嘘だらけになるのだな
861デフォルトの名無しさん
2017/07/05(水) 23:29:36.43ID:0KIeSgEp862デフォルトの名無しさん
2017/07/06(木) 01:22:17.04ID:AOJFjP+S >異なる考えの言語同士であるため対応が自明でないという事実を無視して
>自分の考える「同じ意味」の解釈を押し付けるからに相違ない
ん?だからそれに基づいてほとんどの人は
「違う意味だよ〜」って言ってたんじゃなかったの?
一部の人が「同じような意味だよ〜」って言ってただけで
それに反論する流れだったでしょ
だから「同じ意味」の解釈の押し付け合いはしてなくて
同じ意味だよ vs 違う意味だよ
だったと思うけど
>自分の考える「同じ意味」の解釈を押し付けるからに相違ない
ん?だからそれに基づいてほとんどの人は
「違う意味だよ〜」って言ってたんじゃなかったの?
一部の人が「同じような意味だよ〜」って言ってただけで
それに反論する流れだったでしょ
だから「同じ意味」の解釈の押し付け合いはしてなくて
同じ意味だよ vs 違う意味だよ
だったと思うけど
863デフォルトの名無しさん
2017/07/06(木) 05:15:51.23ID:5a/RGiY/ わざわざ堅苦しい言葉選んで俺偉いアピール
864デフォルトの名無しさん
2017/07/06(木) 05:29:37.28ID:T7F4pxe5 同じ様な意味と同じ意味は違う
さらっと言葉をすり替えるなよ
まったく卑怯な奴よの
(つーか同じ様な意味とも言っていない)
さらっと言葉をすり替えるなよ
まったく卑怯な奴よの
(つーか同じ様な意味とも言っていない)
865デフォルトの名無しさん
2017/07/06(木) 08:09:44.50ID:TSgBvSRK >>862
>だから「同じ意味」の解釈の押し付け合いはしてなく
「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、
もう少し日本語の字面でなく意味を理解した方がよいのではないか
>「違う意味だよ〜」って言ってたんじゃなかったの?
→Yes
>同じ意味だよ vs 違う意味だよだった
→Yes
>だから「同じ意味」の解釈の押し付け合いはしてなく
「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、
もう少し日本語の字面でなく意味を理解した方がよいのではないか
>「違う意味だよ〜」って言ってたんじゃなかったの?
→Yes
>同じ意味だよ vs 違う意味だよだった
→Yes
866デフォルトの名無しさん
2017/07/06(木) 08:11:58.37ID:rcg+ZZ7N 違うものは違う
867デフォルトの名無しさん
2017/07/06(木) 08:12:32.60ID:TSgBvSRK868デフォルトの名無しさん
2017/07/06(木) 08:18:45.02ID:QfwLuwwY869デフォルトの名無しさん
2017/07/06(木) 14:54:52.15ID:m/Ia1fy1 まだやってんのかよ
おまいらのこだわりはスゲェな
おまいらのこだわりはスゲェな
870デフォルトの名無しさん
2017/07/06(木) 22:06:42.25ID:TSgBvSRK リンク先を見て思ったのだが
こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした
こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした
871デフォルトの名無しさん
2017/07/06(木) 22:08:34.16ID:JPWXM8i2872デフォルトの名無しさん
2017/07/07(金) 11:58:06.67ID:C1hAccX9 俺は、プログラミングなんて存在しない世界で生きたい
873デフォルトの名無しさん
2017/07/07(金) 12:21:24.92ID:2bQkb9bH 生まれてくるのが100年くらい遅かったようだな
874デフォルトの名無しさん
2017/07/07(金) 12:21:27.14ID:xvg52mfm プログラマ辞めれば良いだけやん。
875デフォルトの名無しさん
2017/07/07(金) 13:29:12.14ID:1UwaMcEr c++
英語を読める
btcをトレードしたことがある
仮想通貨の開発に参加してみたい方
レスをお願いします
英語を読める
btcをトレードしたことがある
仮想通貨の開発に参加してみたい方
レスをお願いします
876デフォルトの名無しさん
2017/07/07(金) 15:01:32.91ID:u5D8E4qs877デフォルトの名無しさん
2017/07/07(金) 16:03:32.34ID:1UwaMcEr >>876
お返事ありがとうございます
通貨名
raiblocks
simple
instant
fees 0(送金手数料がかからない)
web
https://raiblockscommunity.net/
slack
https://raiblocks.slack.com
slackに参加
#developmentにて、開発に興味がある旨の書き込みをしてください(英語で)
お返事ありがとうございます
通貨名
raiblocks
simple
instant
fees 0(送金手数料がかからない)
web
https://raiblockscommunity.net/
slack
https://raiblocks.slack.com
slackに参加
#developmentにて、開発に興味がある旨の書き込みをしてください(英語で)
878デフォルトの名無しさん
2017/07/08(土) 21:39:10.74ID:dFvfrYOE プログラミングなんて底辺ドカタの仕事
そのうちAIがやれるようになる
そのうちAIがやれるようになる
879デフォルトの名無しさん
2017/07/08(土) 22:33:35.86ID:lbAgDi9M アドバイスさんくす
880デフォルトの名無しさん
2017/07/09(日) 16:06:32.28ID:EeQkMvgZ ポインタそのものにオブジェクトってできるんでしょうか?
例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
int array[3];
int *p = array;
int **pp = &p;
for(i = 0; i < 3; i++)
{
printf("&array[%d] : %d : %d\n", i, &array[i]);
}
&array[0] : 2293472
&array[1] : 2293476
&array[2] : 2293480
&p[0] : 2293472
&p[1] : 2293476
&p[2] : 2293480
&pp[0] : 2293468
&pp[1] : 2293472
&pp[2] : 2293476
ppが参照しているpのオブジェクトの位置が、arrayのオブジェクトのアドレスと全く同じ位置にあります。
1つのアドレスが2つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか
他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。
例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
int array[3];
int *p = array;
int **pp = &p;
for(i = 0; i < 3; i++)
{
printf("&array[%d] : %d : %d\n", i, &array[i]);
}
&array[0] : 2293472
&array[1] : 2293476
&array[2] : 2293480
&p[0] : 2293472
&p[1] : 2293476
&p[2] : 2293480
&pp[0] : 2293468
&pp[1] : 2293472
&pp[2] : 2293476
ppが参照しているpのオブジェクトの位置が、arrayのオブジェクトのアドレスと全く同じ位置にあります。
1つのアドレスが2つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか
他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。
>>880
その出力を一挙に得られるプログラムを示せ,アドレスはプログラムの実行ごとに変わる可能性がある
その出力を一挙に得られるプログラムを示せ,アドレスはプログラムの実行ごとに変わる可能性がある
882デフォルトの名無しさん
2017/07/09(日) 16:20:52.70ID:v/7piv3Y >>880
pとarrayは異なるオブジェクトだから確認方法が間違ってる
pとarrayは異なるオブジェクトだから確認方法が間違ってる
883デフォルトの名無しさん
2017/07/09(日) 16:25:25.83ID:3Luqddjj 一つのポンタを複数のオブジェなんて当たり前
int z;
int * p = &z;
int * p2 = p;
int * p3 = p2;
int z;
int * p = &z;
int * p2 = p;
int * p3 = p2;
884デフォルトの名無しさん
2017/07/09(日) 16:43:15.93ID:EeQkMvgZ >>881 これでいいでしょうか?
int i;
int array[5];
int *p = array;
int **pp = &p;
printf("array : %d\n", array);
for(i = 0; i < 5; i++) {
printf("&array[%d] : %d\n", i, &array[i]);
}
printf("p : %d\n", p);
for(i = 0; i < 5; i++) {
printf("&p[%d] : %d\n", i, &p[i]);
}
printf("pp : %d\n", pp);
for(i = 0; i < 5; i++) {
printf("&pp[%d] : %d\n", i, &pp[i]);
}
>>882
&ppでpのオブジェクトのアドレスを取得できると思ってたんですが違ったんですか?
>>883
すいませんまだそれを理解するのは難しいです。
int i;
int array[5];
int *p = array;
int **pp = &p;
printf("array : %d\n", array);
for(i = 0; i < 5; i++) {
printf("&array[%d] : %d\n", i, &array[i]);
}
printf("p : %d\n", p);
for(i = 0; i < 5; i++) {
printf("&p[%d] : %d\n", i, &p[i]);
}
printf("pp : %d\n", pp);
for(i = 0; i < 5; i++) {
printf("&pp[%d] : %d\n", i, &pp[i]);
}
>>882
&ppでpのオブジェクトのアドレスを取得できると思ってたんですが違ったんですか?
>>883
すいませんまだそれを理解するのは難しいです。
885デフォルトの名無しさん
2017/07/09(日) 16:44:50.47ID:3Luqddjj 何がわからんのや。ようわかるやんけ
アドレス : オブジェクト : 値 : オブジェクトの型
2293464 : pp : 2293468 : int**型
2293468 : p : 2293472 : int*型
2293472 : array[0] : ? : int型
2293476 : array[1] : ? : int型
2293480 : array[2] : ? : int型
アドレス : オブジェクト : 値 : オブジェクトの型
2293464 : pp : 2293468 : int**型
2293468 : p : 2293472 : int*型
2293472 : array[0] : ? : int型
2293476 : array[1] : ? : int型
2293480 : array[2] : ? : int型
886デフォルトの名無しさん
2017/07/09(日) 16:51:56.41ID:EeQkMvgZ >>885
つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか?
つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか?
887デフォルトの名無しさん
2017/07/09(日) 16:56:52.17ID:3Luqddjj888デフォルトの名無しさん
2017/07/09(日) 17:01:52.64ID:EeQkMvgZ >>887
ありがとうございます!5時間以上つまってたのが一気にクリアになりました!
ありがとうございます!5時間以上つまってたのが一気にクリアになりました!
889デフォルトの名無しさん
2017/07/09(日) 17:16:44.02ID:Uu/MlKNR >>880
> &pp[0] : 2293468
これはpのアドレス
> &pp[1] : 2293472
> &pp[2] : 2293476
pp[1], pp[2]は存在しないからアクセスしちゃダメ
たぶん
2293464: pp
2293468: p
2293472: array[0]
2293476: array[1]
2293480: array[2]
みたいなメモリ割り当てになってるんだろうな
> &pp[0] : 2293468
これはpのアドレス
> &pp[1] : 2293472
> &pp[2] : 2293476
pp[1], pp[2]は存在しないからアクセスしちゃダメ
たぶん
2293464: pp
2293468: p
2293472: array[0]
2293476: array[1]
2293480: array[2]
みたいなメモリ割り当てになってるんだろうな
890デフォルトの名無しさん
2017/07/09(日) 22:31:05.00ID:WeAgIUgc891デフォルトの名無しさん
2017/07/09(日) 23:28:17.80ID:1po+7Ikw >>890
正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。
889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、
例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。
正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。
889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、
例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。
892デフォルトの名無しさん
2017/07/10(月) 06:50:03.40ID:ZgtWUD/x 中身にアクセスしてなくてただのアドレス計算だぞ
C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい
もしかしたらビルド時に警告を出してくれるかも
C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい
もしかしたらビルド時に警告を出してくれるかも
893デフォルトの名無しさん
2017/07/10(月) 06:54:34.99ID:t9ouoliu アドレス計算自体はOKだと思うよ。
2017/07/10(月) 07:04:04.53ID:Ols/UzwR
配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている
2017/07/10(月) 07:05:58.47ID:ZgtWUD/x
無効エリアのアドレス計算
値不定か動作不定かどっちだか忘れた
これらをOKと呼ぶならOKなんでしょう
値不定か動作不定かどっちだか忘れた
これらをOKと呼ぶならOKなんでしょう
2017/07/10(月) 07:13:12.05ID:ZgtWUD/x
>>894
-1も有効だとうれしい事があるけど、-1はダメなんだよね
-1も有効だとうれしい事があるけど、-1はダメなんだよね
897デフォルトの名無しさん
2017/07/10(月) 22:27:20.57ID:WIOZS2V0 >>894
つまり式「&pp[1]」は大丈夫でないと?
つまり式「&pp[1]」は大丈夫でないと?
898デフォルトの名無しさん
2017/07/11(火) 13:12:04.11ID:eWIFW1BW ppは配列じゃないだろ
899デフォルトの名無しさん
2017/07/11(火) 18:17:43.80ID:L5b0rMHK これがアスペいうやつだな
配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で
pは配列じゃないからな→わかる
ppは配列じゃないからな→頭悪いな
ppは配列じゃないだろ→アスペ
配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で
pは配列じゃないからな→わかる
ppは配列じゃないからな→頭悪いな
ppは配列じゃないだろ→アスペ
900デフォルトの名無しさん
2017/07/11(火) 20:17:20.41ID:gS+YojZ9 ん?まったくよくわからんのだが、だれか解説して
>配列でないオブジェクトも要素数1の配列として考える仕様
↑まずこれがよくわからない
配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね
で、下二行の意味も分からない
>配列でないオブジェクトも要素数1の配列として考える仕様
↑まずこれがよくわからない
配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね
で、下二行の意味も分からない
901デフォルトの名無しさん
2017/07/11(火) 22:08:22.53ID:qjau/h5c 配列かどうかは関係なく、オブジェクトの後ろのアドレスは計算も出来るし比較も出来る
902デフォルトの名無しさん
2017/07/11(火) 22:10:11.51ID:qjau/h5c903デフォルトの名無しさん
2017/07/11(火) 22:14:58.67ID:qjau/h5c904デフォルトの名無しさん
2017/07/11(火) 22:28:18.47ID:gS+YojZ9 いや、それは俺も思ったんだが
ppが配列じゃないのは当たり前なんだが(てかポインタだし)
おそらくはそんなことは問うてないって言いたいんだと思う
つまり、ppが指している先が何であるかが問題であるから
配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと
同じことをもう一度言うけど
pp[1]としたとき問題になるのはppの指してる先がどうなっているかで
今回の場合はそれは「p」であるから
正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと
ppが配列じゃないのは当たり前なんだが(てかポインタだし)
おそらくはそんなことは問うてないって言いたいんだと思う
つまり、ppが指している先が何であるかが問題であるから
配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと
同じことをもう一度言うけど
pp[1]としたとき問題になるのはppの指してる先がどうなっているかで
今回の場合はそれは「p」であるから
正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと
905デフォルトの名無しさん
2017/07/11(火) 23:00:18.82ID:634mVLA8 >>901
なら&pp[1]も大丈夫なんじゃね?
なら&pp[1]も大丈夫なんじゃね?
906デフォルトの名無しさん
2017/07/12(水) 07:01:19.46ID:Mf+sZV2C pp[1]の時点で動作不定
正しく動かない環境はもしかしたら存在しないかもしれないけど
正しく動かない環境はもしかしたら存在しないかもしれないけど
>>880
ん、最初にもどってメッセージを書くとすれば、こうなるかな
>ポインタそのものにオブジェクトってできるんでしょうか?
私が意味を取り違えているかもしれないが、「できない」
ポインタを取得したからといって、オブジェクトが生えてくることはない
あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる
>例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。
pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない
&pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない
アドレスを生成できるからといって、その領域が意味のあるものとは限らない
>>881 では意味のないことを求めてしまいごめんなさい
ん、最初にもどってメッセージを書くとすれば、こうなるかな
>ポインタそのものにオブジェクトってできるんでしょうか?
私が意味を取り違えているかもしれないが、「できない」
ポインタを取得したからといって、オブジェクトが生えてくることはない
あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる
>例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、
array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。
pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない
&pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない
アドレスを生成できるからといって、その領域が意味のあるものとは限らない
>>881 では意味のないことを求めてしまいごめんなさい
908デフォルトの名無しさん
2017/07/12(水) 08:20:30.93ID:SNfdy8To909デフォルトの名無しさん
2017/07/12(水) 09:01:11.94ID:6a7v2dDL910デフォルトの名無しさん
2017/07/12(水) 09:10:12.68ID:6a7v2dDL911デフォルトの名無しさん
2017/07/12(水) 13:20:57.39ID:ahqaJGrL >>907
まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは
1.ポインタ自身もポインタというオブジェクトじゃないのか?
2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは
まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは
1.ポインタ自身もポインタというオブジェクトじゃないのか?
2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは
912デフォルトの名無しさん
2017/07/12(水) 13:41:52.51ID:uqOuLEsE そんで俺はちょっと思ったんだけど
Cはポインタを配列のように扱えるのが便利だなぁと
逆に配列名を参照したらポインタ値になるし
あと他、関数ポインタを普通の関数のように扱えたり
逆に関数名を参照したらポインタ値になったり
意味の上で別解釈しようがないからそれでいいだろ、的な
二つに共通しているのは
(1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう
(2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう
というもので、これでシームレスになるしタイプも減るから便利だろう、と
でもそういう方針なんだったら何故我々は「.」と「->」を
使い分けなきゃならないんだ?と思わんこともない
意味の上で別解釈できたり不明瞭だったりは無いのに
ただ、Cの構造体は(1)を満たしていない
もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので
代入演算子で代入したり、関数に値渡ししたりが出来なくなる
ただし、C言語がそのような仕様になっていた可能性は十分にあると思う
というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから
アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで
先頭アドレスからのオフセットでアクセスするのは同じであるから
そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に
なっていた可能性はあると思う
構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある
そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる
で、そうはしなかった代わりに「->」演算子が有る、とも取れる
Cはポインタを配列のように扱えるのが便利だなぁと
逆に配列名を参照したらポインタ値になるし
あと他、関数ポインタを普通の関数のように扱えたり
逆に関数名を参照したらポインタ値になったり
意味の上で別解釈しようがないからそれでいいだろ、的な
二つに共通しているのは
(1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう
(2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう
というもので、これでシームレスになるしタイプも減るから便利だろう、と
でもそういう方針なんだったら何故我々は「.」と「->」を
使い分けなきゃならないんだ?と思わんこともない
意味の上で別解釈できたり不明瞭だったりは無いのに
ただ、Cの構造体は(1)を満たしていない
もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので
代入演算子で代入したり、関数に値渡ししたりが出来なくなる
ただし、C言語がそのような仕様になっていた可能性は十分にあると思う
というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから
アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで
先頭アドレスからのオフセットでアクセスするのは同じであるから
そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に
なっていた可能性はあると思う
構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある
そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる
で、そうはしなかった代わりに「->」演算子が有る、とも取れる
913デフォルトの名無しさん
2017/07/12(水) 13:42:12.78ID:uqOuLEsE 気まぐれか、意図的か、歴史的事情か、生い立ちに由来するものか、知らんが、そうなっている
だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない
C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと
代入したり、関数のreturnで値として返したりができない
となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない
もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう
(実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い
ポインタ相当に勝手に成り下がってしまうので代入ができない)
ただ、このことが本当に良かった事なのかどうなのかは分からない
GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない
他の言語のほとんどがオブジェクトを参照で扱うのを見てると
Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない
C++のクラスは、状況に合わせて、これを選べる、という立場になってるが
もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い
だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない
C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと
代入したり、関数のreturnで値として返したりができない
となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない
もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう
(実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い
ポインタ相当に勝手に成り下がってしまうので代入ができない)
ただ、このことが本当に良かった事なのかどうなのかは分からない
GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない
他の言語のほとんどがオブジェクトを参照で扱うのを見てると
Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない
C++のクラスは、状況に合わせて、これを選べる、という立場になってるが
もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い
914デフォルトの名無しさん
2017/07/12(水) 13:43:43.81ID:uqOuLEsE よくよく考えてみればなかなかに奇妙
まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない
プログラマは基本的に几帳面で、整合性を気にする生き物だから
ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから
&arrayとか&funcとか書かせたくなるのが普通だろう
そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう
ところがCは、レジスタに乗らないもの、演算できないもの、を
勝手にポインタと同等に格下げするというルールを設けたうえで
そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという
ウルトラCをやってのけた
ここまででも俺ではちょっと思いつかないなーと感心するわけだが
逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人
その方が整合性がありそうな気がするから
なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある
だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る
それはそれで奇妙なことだと思ったりもするが、とにもかくにも
この辺がC++の基本方針や特色にものすごく影響が出てる
GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて
C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある
ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも
そして構造体をベースとするC++とCの配列は相性が悪いという
C言語の功罪は凄い
まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない
プログラマは基本的に几帳面で、整合性を気にする生き物だから
ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから
&arrayとか&funcとか書かせたくなるのが普通だろう
そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう
ところがCは、レジスタに乗らないもの、演算できないもの、を
勝手にポインタと同等に格下げするというルールを設けたうえで
そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという
ウルトラCをやってのけた
ここまででも俺ではちょっと思いつかないなーと感心するわけだが
逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人
その方が整合性がありそうな気がするから
なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある
だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る
それはそれで奇妙なことだと思ったりもするが、とにもかくにも
この辺がC++の基本方針や特色にものすごく影響が出てる
GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて
C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある
ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも
そして構造体をベースとするC++とCの配列は相性が悪いという
C言語の功罪は凄い
915デフォルトの名無しさん
2017/07/12(水) 13:48:37.49ID:vq82ZnF5 3行で(´・ω・`)
916デフォルトの名無しさん
2017/07/12(水) 17:58:12.38ID:SNfdy8To 駄レスの関係無いリンク先をまじまじと読んでしまった
日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった
日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった
917デフォルトの名無しさん
2017/07/12(水) 18:07:40.57ID:SNfdy8To918デフォルトの名無しさん
2017/07/12(水) 18:19:22.64ID:Oma/x2r0 ユーザーヘッダーファイルを作って
#include<stdio.h>
#include<math.h>
#define PI 3.14
double r;
void nyuuryoku(void) {
printf("半径を入力してください。\n");
scanf("%fl", &r);
printf("%f\n", r);
return;
}
double keisan(void) {
printf("%f\n", r);
return PI*pow(r, 2);
}
と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。
rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか?
#include<stdio.h>
#include<math.h>
#define PI 3.14
double r;
void nyuuryoku(void) {
printf("半径を入力してください。\n");
scanf("%fl", &r);
printf("%f\n", r);
return;
}
double keisan(void) {
printf("%f\n", r);
return PI*pow(r, 2);
}
と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。
rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか?
919デフォルトの名無しさん
2017/07/12(水) 18:34:20.99ID:+I30gFZ0 void nyuuryoku(void) {
char buf[256];
printf("半径を入力してください。\n");
if(NULL==fgets(buf,sizeof(buf),stdin)){
printf("ちゃんと入力しろやボケ\n");
return;
}
sscanf(buf,"%fl", &r);
printf("%f\n", r);
return;
}
char buf[256];
printf("半径を入力してください。\n");
if(NULL==fgets(buf,sizeof(buf),stdin)){
printf("ちゃんと入力しろやボケ\n");
return;
}
sscanf(buf,"%fl", &r);
printf("%f\n", r);
return;
}
920デフォルトの名無しさん
2017/07/12(水) 18:44:41.01ID:FRCEttse921デフォルトの名無しさん
2017/07/12(水) 18:45:48.34ID:+I30gFZ0 %lfちゃうか?
922デフォルトの名無しさん
2017/07/12(水) 18:46:07.89ID:+I30gFZ0 失礼しますた
923デフォルトの名無しさん
2017/07/12(水) 18:49:05.30ID:Oma/x2r0 oh....
コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;)
ありがとうございました
コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;)
ありがとうございました
924デフォルトの名無しさん
2017/07/12(水) 19:24:59.74ID:iSKiMIM1 -Wallつけるか、clang使え
925デフォルトの名無しさん
2017/07/12(水) 21:38:59.46ID:Q4X+sAyq >>912-914
なんか色々勘違いしてるしどうでもいいから続きはチラウラで頼むわ
なんか色々勘違いしてるしどうでもいいから続きはチラウラで頼むわ
926デフォルトの名無しさん
2017/07/12(水) 23:05:57.46ID:2e79StFo 最近のチラシは両面印刷で困る
927デフォルトの名無しさん
2017/07/13(木) 00:31:49.82ID:/oMuxl/G928デフォルトの名無しさん
2017/07/13(木) 01:06:35.55ID:+2MHjXyv >>912-914は基礎的なところで間違った理解をしていると
そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ
そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ
930デフォルトの名無しさん
2017/07/13(木) 07:12:43.09ID:/oMuxl/G >929
その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある
evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが
6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある
その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある
evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが
6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある
>>930
シンタックスではなくセマンティクスというわけですか‥ありがとう
シンタックスではなくセマンティクスというわけですか‥ありがとう
932デフォルトの名無しさん
2017/07/13(木) 18:16:27.80ID:PDgj9Ebq #include<stdio.h>
#include<string.h>
#define NUM 10
int main(void) {
int length;
char name[NUM * 2 + 1];
char family_name[NUM + 1];
char first_name[NUM + 1];
printf("姓を入力してください\n");
scanf("%s", family_name);
printf("名を入力してください\n");
scanf("%s", first_name);
strcat(name, family_name);
strcat(name, first_name);
length = strlen(name);
printf("名前:%s\n", name);
printf("長さ:%d\n", length);
return 0;
}
このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって
結合結果がフフフフフフフってなります。どうしてでしょうか?
#include<string.h>
#define NUM 10
int main(void) {
int length;
char name[NUM * 2 + 1];
char family_name[NUM + 1];
char first_name[NUM + 1];
printf("姓を入力してください\n");
scanf("%s", family_name);
printf("名を入力してください\n");
scanf("%s", first_name);
strcat(name, family_name);
strcat(name, first_name);
length = strlen(name);
printf("名前:%s\n", name);
printf("長さ:%d\n", length);
return 0;
}
このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって
結合結果がフフフフフフフってなります。どうしてでしょうか?
933デフォルトの名無しさん
2017/07/13(木) 18:29:33.51ID:lX8cJUTX 笑われてんじゃね?
934デフォルトの名無しさん
2017/07/13(木) 18:30:25.16ID:lX8cJUTX マヂレスすると、nameが不定
935デフォルトの名無しさん
2017/07/13(木) 18:34:34.28ID:a0isPZOF >>932
char name[NUM * 2 + 1] = {0};
char name[NUM * 2 + 1] = {0};
936デフォルトの名無しさん
2017/07/13(木) 18:37:48.37ID:PDgj9Ebq ありがとうございました
937デフォルトの名無しさん
2017/07/13(木) 19:34:29.65ID:b1PvI/zl どうでもいいけど、
char name[NUM * 2 + 1] = "";
普通こうじゃね?
char name[NUM * 2 + 1] = {'??0'};
これでも良い
コンパイル結果はたぶん全部同じだけど
char name[NUM * 2 + 1] = "";
普通こうじゃね?
char name[NUM * 2 + 1] = {'??0'};
これでも良い
コンパイル結果はたぶん全部同じだけど
938デフォルトの名無しさん
2017/07/13(木) 20:27:20.55ID:bV5zFMan >>932
俺のところで試してみたらフフフノフフフになった
俺のところで試してみたらフフフノフフフになった
939デフォルトの名無しさん
2017/07/13(木) 20:43:44.17ID:lX8cJUTX Visual Studio のデバッグビルドだと、不定メモリをCCで埋める
だからこれに対応する'フ'が表示される
なぜ途中が'ノ'になるかはわからん
strcatではCCの後の0を探してその後に文字列をコピーするから、0の位置によっては例外が発生したり動作がおかしくなったりするかも
だからこれに対応する'フ'が表示される
なぜ途中が'ノ'になるかはわからん
strcatではCCの後の0を探してその後に文字列をコピーするから、0の位置によっては例外が発生したり動作がおかしくなったりするかも
940デフォルトの名無しさん
2017/07/13(木) 21:06:57.04ID:a0isPZOF >>937
= {'\0'};のタイプミスだよね?
= {'\0'};のタイプミスだよね?
941デフォルトの名無しさん
2017/07/13(木) 21:23:18.88ID:lX8cJUTX942デフォルトの名無しさん
2017/07/13(木) 23:03:34.21ID:xdHlDIka プログラム終了にexit 0とreturn 0がどう違いますか?
944デフォルトの名無しさん
2017/07/14(金) 19:19:48.00ID:TW7O0pB9 というタワゴトで他人を陥れるのであった
945片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 19:26:30.76ID:RoIBY40S exitは死のトラクターが働かない
946片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 19:32:27.26ID:RoIBY40S 異常終了以外でexitを使うヤツは素人
947デフォルトの名無しさん
2017/07/14(金) 20:20:31.05ID:8ghhANnS えっ
mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ?
少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?
mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ?
少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?
948片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 20:52:35.05ID:RoIBY40S #include <iostream>
#include <cstdlib>
struct A {
~A() {
std::cout << "OK" << std::endl;
}
};
int main(void) {
A a;
std::exit(-1);
}
#include <cstdlib>
struct A {
~A() {
std::cout << "OK" << std::endl;
}
};
int main(void) {
A a;
std::exit(-1);
}
950デフォルトの名無しさん
2017/07/14(金) 21:04:08.43ID:TW7O0pB9 今日の>>945は健常者
後始末される例外ケースについて触れていたら完璧だった
後始末される例外ケースについて触れていたら完璧だった
951デフォルトの名無しさん
2017/07/14(金) 21:06:50.82ID:VdC9hBdZ atexit で後始末回収機構走らないの?
953片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 21:46:17.67ID:RoIBY40S atexitはマニュアルに書いてある通りだから、ここでいちいち説明する必要はない。
954片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 21:53:53.48ID:RoIBY40S マニュアルこそが聖書。マニュアルを読まない奴等はノンプレイヤー。
955デフォルトの名無しさん
2017/07/14(金) 22:54:13.51ID:RlDfzlps つまりexit()はバカ発見器ってこと?
956片山博文MZ ◆T6xkBnTXz7B0
2017/07/14(金) 23:01:28.54ID:RoIBY40S C++でexit使うぐらいなら、代わりにC++例外を使った方がいいよ。デバッグしやすいし。
957デフォルトの名無しさん
2017/07/15(土) 05:41:00.21ID:81gh4ly6958デフォルトの名無しさん
2017/07/15(土) 13:25:52.33ID:d+yGYUAe ポインタの作法に慣れないです
読めるけどかけないです
読めるけどかけないです
959デフォルトの名無しさん
2017/07/15(土) 16:38:44.94ID:sZ4h7fLQ ポインタは2段までしか使わないなあ
関数ポインタはstd::functionに入れる癖がついたし
関数ポインタはstd::functionに入れる癖がついたし
960デフォルトの名無しさん
2017/07/15(土) 17:20:33.71ID:d+yGYUAe #include<stdio.h>
int unko(int x);
int aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(&a);
printf("%x\n%x\n", a, &a);
return 0;
}
int unko(int x) {
printf("%x\n", x);
return;
}
int aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}
このとき関数unkoで配列aの中身にアクセスする方法ってありませんか?
アドレスがわかっているからできそうな気もするんですがよく解りません。
int unko(int x);
int aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(&a);
printf("%x\n%x\n", a, &a);
return 0;
}
int unko(int x) {
printf("%x\n", x);
return;
}
int aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}
このとき関数unkoで配列aの中身にアクセスする方法ってありませんか?
アドレスがわかっているからできそうな気もするんですがよく解りません。
961片山博文MZ ◆T6xkBnTXz7B0
2017/07/15(土) 17:27:13.54ID:xLcEZRbh aがint a[5]であるとき、aはint配列の先頭アドレスだ。unkoの引数をポインターにしろ。
962デフォルトの名無しさん
2017/07/15(土) 17:56:11.02ID:d+yGYUAe はい
963デフォルトの名無しさん
2017/07/15(土) 20:48:00.24ID:iuayY/9E そもそもこのソースコンパイルエラーになるんじゃね?
964デフォルトの名無しさん
2017/07/15(土) 21:29:06.16ID:d+yGYUAe >>963
VSだとコンパイラ通るんですが他のだと通りませんか?
あと関数unkoをいろいろ弄ってたんですが
#include<stdio.h>
void unko(int x);
void aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(a);
printf("%x\n%x\n", a, &a);
printf("%d\n",a[4]);
return 0;
}
void unko(int x) {
printf("%x\n", x);
int *p = x;
printf("%d\n%d\n", p[1],*(p+2));
p[4] = 10;
return;
}
void aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}
こんな記述にすれば少なくともVSでは引数をポインタにしなくても配列aの要素を覗いたり操作したりできることがわかりました。
VSだとコンパイラ通るんですが他のだと通りませんか?
あと関数unkoをいろいろ弄ってたんですが
#include<stdio.h>
void unko(int x);
void aho(int *y);
int main(void) {
int a[5] = { 1,2,3,4,5 };
unko(a);
aho(a);
printf("%x\n%x\n", a, &a);
printf("%d\n",a[4]);
return 0;
}
void unko(int x) {
printf("%x\n", x);
int *p = x;
printf("%d\n%d\n", p[1],*(p+2));
p[4] = 10;
return;
}
void aho(int*y) {
printf("%d\n%d\n",*(y+1), y[2]);
return;
}
こんな記述にすれば少なくともVSでは引数をポインタにしなくても配列aの要素を覗いたり操作したりできることがわかりました。
965片山博文MZ ◆T6xkBnTXz7B0
2017/07/15(土) 21:31:54.33ID:18nkvKxh 型がめちゃくちゃだあああ!!!
型が形無し!
型が形無し!
966片山博文MZ ◆T6xkBnTXz7B0
2017/07/15(土) 21:36:49.71ID:18nkvKxh できることとやってもいいことは違うんだよ。
967片山博文MZ ◆T6xkBnTXz7B0
2017/07/15(土) 21:39:23.41ID:18nkvKxh コンパイル時に出て来る度重なる警告を無視したらダメだよ。
968デフォルトの名無しさん
2017/07/15(土) 21:44:11.03ID:d+yGYUAe すみません
969片山博文MZ ◆T6xkBnTXz7B0
2017/07/15(土) 21:46:08.79ID:18nkvKxh お使いの32ビット環境ではintとint*が同じサイズだから、キャストされれば代入できる。sizeof(int) == sizeof(int*)。
しかし、64ビット環境では動かなくなるかもしれない。ポインター型を無視した良くない書き方だ。
しかし、64ビット環境では動かなくなるかもしれない。ポインター型を無視した良くない書き方だ。
970片山博文MZ ◆T6xkBnTXz7B0
2017/07/15(土) 21:54:52.27ID:18nkvKxh おそらく、君の環境では、
sizeof(int) == 4,
sizeof(int*) == 4
のはずだ。
64bit環境では、多分
sizeof(int) == 4,
sizeof(int*) == 8
になる。確認してみたまえ。
sizeof(int) == 4,
sizeof(int*) == 4
のはずだ。
64bit環境では、多分
sizeof(int) == 4,
sizeof(int*) == 8
になる。確認してみたまえ。
971片山博文MZ ◆T6xkBnTXz7B0
2017/07/15(土) 21:57:34.94ID:18nkvKxh int*のサイズがintのサイズより大きいと、ポインター(アドレス)の値が正しく代入できない。これが64bitで失敗する理由だ。
972デフォルトの名無しさん
2017/07/15(土) 22:08:26.63ID:qXQ9KlTo こまけーことをゴチャゴチャと
Cなんて大なり小なり環境依存な場面しか使わん
貴様はintに32767以下しか入れんのか?
Cなんて大なり小なり環境依存な場面しか使わん
貴様はintに32767以下しか入れんのか?
973デフォルトの名無しさん
2017/07/15(土) 22:10:20.05ID:d+yGYUAe 確かめてみたら確かに自分の環境では両方4バイトでした
64bitのプログラムにしたらダメになるんですね・・・
勉強になります。ありがとうございます。
64bitのプログラムにしたらダメになるんですね・・・
勉強になります。ありがとうございます。
974デフォルトの名無しさん
2017/07/15(土) 22:23:44.38ID:vkKq60sj 2レスで失礼します
VC++9Eでruby-opencvのビルドを試みているのですが構文エラーが多発してビルドできません
>C:\dev\ruby-opencv>nmake
>〜
>cl -I. -I. -IC:/dev/ruby-1.8.7-p374/win32/bin/lib/ruby/1.8/i386-mswin32_90 -IC:/dev/ruby-opencv-master/ext/opencv -MD -O2b2xty- /EHsc -IC:/dev/ruby-opencv-master/ext/opencv/ext/opencv
/EHsc -DHAVE_OPENCV2_CORE_CORE_C_H -DHAVE_OPENCV2_CORE_CORE_HPP -DHAVE_OPENCV2_IMGPROC_IMGPROC_C_H -DHAVE_OPENCV2_IMGPROC_IMGPROC_HPP -DHAVE_OPENCV2_VIDEO_TRACKING_HPP
-DHAVE_OPENCV2_FEATURES2D_FEATURES2D_HPP -DHAVE_OPENCV2_FLANN_FLANN_HPP -DHAVE_OPENCV2_CALIB3D_CALIB3D_HPP -DHAVE_OPENCV2_OBJDETECT_OBJDETECT_HPP
-DHAVE_OPENCV2_LEGACY_COMPAT_HPP -DHAVE_OPENCV2_LEGACY_LEGACY_HPP-DHAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H -DHAVE_OPENCV2_HIGHGUI_HIGHGUI_HPP -DHAVE_OPENCV2_PHOTO_PHOTO_HPP
-DHAVE_OPENCV2_NONFREE_NONFREE_HPP -DHAVE_STDARG_H -I/usr/include -IC:\dev\OpenCV2.4\install\include -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c
-TpC:/dev/ruby-opencv-master/ext/opencv/algorithm.cpp
>〜
>algorithm.cpp
>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\istream(699) : warning C4003: マクロ 'read' に指定された実引数の数が少なすぎます。
>C:\〜\istream(699) : error C2059: 構文エラー : ')'
>C:\〜\istream(846) : コンパイルされたクラスの テンプレート のインスタンス化 'std::basic_istream<_Elem,_Traits>' の参照を確認してください
>C:\〜\istream(700) : error C2143: 構文エラー : ')' が '{' の前にありません。
>〜
>C:\〜\xxbind1(320) : warning C4003: マクロ 'bind' に指定された実引数の数が少なすぎます。
>C:\〜\xxbind1(320) : error C2988: 認識できないテンプレートの宣言または定義です。
>C:\〜\xxbind1(320) : error C2059: 構文エラー : ','
VC++9Eでruby-opencvのビルドを試みているのですが構文エラーが多発してビルドできません
>C:\dev\ruby-opencv>nmake
>〜
>cl -I. -I. -IC:/dev/ruby-1.8.7-p374/win32/bin/lib/ruby/1.8/i386-mswin32_90 -IC:/dev/ruby-opencv-master/ext/opencv -MD -O2b2xty- /EHsc -IC:/dev/ruby-opencv-master/ext/opencv/ext/opencv
/EHsc -DHAVE_OPENCV2_CORE_CORE_C_H -DHAVE_OPENCV2_CORE_CORE_HPP -DHAVE_OPENCV2_IMGPROC_IMGPROC_C_H -DHAVE_OPENCV2_IMGPROC_IMGPROC_HPP -DHAVE_OPENCV2_VIDEO_TRACKING_HPP
-DHAVE_OPENCV2_FEATURES2D_FEATURES2D_HPP -DHAVE_OPENCV2_FLANN_FLANN_HPP -DHAVE_OPENCV2_CALIB3D_CALIB3D_HPP -DHAVE_OPENCV2_OBJDETECT_OBJDETECT_HPP
-DHAVE_OPENCV2_LEGACY_COMPAT_HPP -DHAVE_OPENCV2_LEGACY_LEGACY_HPP-DHAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H -DHAVE_OPENCV2_HIGHGUI_HIGHGUI_HPP -DHAVE_OPENCV2_PHOTO_PHOTO_HPP
-DHAVE_OPENCV2_NONFREE_NONFREE_HPP -DHAVE_STDARG_H -I/usr/include -IC:\dev\OpenCV2.4\install\include -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c
-TpC:/dev/ruby-opencv-master/ext/opencv/algorithm.cpp
>〜
>algorithm.cpp
>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\istream(699) : warning C4003: マクロ 'read' に指定された実引数の数が少なすぎます。
>C:\〜\istream(699) : error C2059: 構文エラー : ')'
>C:\〜\istream(846) : コンパイルされたクラスの テンプレート のインスタンス化 'std::basic_istream<_Elem,_Traits>' の参照を確認してください
>C:\〜\istream(700) : error C2143: 構文エラー : ')' が '{' の前にありません。
>〜
>C:\〜\xxbind1(320) : warning C4003: マクロ 'bind' に指定された実引数の数が少なすぎます。
>C:\〜\xxbind1(320) : error C2988: 認識できないテンプレートの宣言または定義です。
>C:\〜\xxbind1(320) : error C2059: 構文エラー : ','
975デフォルトの名無しさん
2017/07/15(土) 22:24:14.08ID:vkKq60sj 何らかのファイルが足りないとかならまだ判るのですがこのファイルはVCに付属の物ですし構文エラーなどと言われても理解できません
algorithm.cppは一番最初のファイルで全く進まない状態です
ちなみにRubyとOpenCVのビルドは一応通っています(本当に問題ないかは未確認)
C/C++は不慣れでVSの使用経験もあまりないため原因の見当も付かず手詰まり状態です。もし何か判る方がいたら教えてもらえると助かります
algorithm.cppは一番最初のファイルで全く進まない状態です
ちなみにRubyとOpenCVのビルドは一応通っています(本当に問題ないかは未確認)
C/C++は不慣れでVSの使用経験もあまりないため原因の見当も付かず手詰まり状態です。もし何か判る方がいたら教えてもらえると助かります
976片山博文MZ ◆T6xkBnTXz7B0
2017/07/15(土) 22:27:42.35ID:18nkvKxh readというマクロが悪さをしているようだ。#include順を変えるか#undefしろ。
977デフォルトの名無しさん
2017/07/15(土) 22:35:18.82ID:Z+b63Gri978974
2017/07/16(日) 12:18:52.82ID:wcmK4agw >>976
すみません。その場所の特定ってどのようにすればいいのでしょうか
比較的規模の大きいライブラリですし、インクルードしているファイルだけでもかなりの数になりそうです
ファイルの検索とテキストエディタだけでは追えそうにありません
追跡を支援してくれるツールとかないんでしょうかね・・・
すみません。その場所の特定ってどのようにすればいいのでしょうか
比較的規模の大きいライブラリですし、インクルードしているファイルだけでもかなりの数になりそうです
ファイルの検索とテキストエディタだけでは追えそうにありません
追跡を支援してくれるツールとかないんでしょうかね・・・
980デフォルトの名無しさん
2017/07/16(日) 15:16:03.75ID:1O/pViqJ マクロ展開したソース吐くオプションあったよな
VCならhttp://d.hatena.ne.jp/nurs/20100516/1274020395
1.ソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒
プロパティ⇒プリプロセッサ⇒前処理済みファイルの生成⇒行番号つきか行番号なしを選択
2.再びソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒コンパイル
これで、cpp が置かれているのと同じファイル階層に、cppと同じ名前だけど拡張子が.iになってる
ファイルができてるからそれがそうだよ
gccなら -E
VCならhttp://d.hatena.ne.jp/nurs/20100516/1274020395
1.ソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒
プロパティ⇒プリプロセッサ⇒前処理済みファイルの生成⇒行番号つきか行番号なしを選択
2.再びソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒コンパイル
これで、cpp が置かれているのと同じファイル階層に、cppと同じ名前だけど拡張子が.iになってる
ファイルができてるからそれがそうだよ
gccなら -E
981デフォルトの名無しさん
2017/07/16(日) 17:55:59.24ID:i1aK64sE class Kitty {
public:
char *str;
Kitty() { str = "Kitty on your lap\n"; }
Kitty(const Kitty &obj) { str = "Di Gi Gharat\n"; }
} g_obj ;
int main() {
Kitty obj = g_obj;
cout << g_obj.str;
cout << obj.str;
return 0;
}
Kittyクラス終わりのセミコロンの間に変数g_objがあるんですがこれはどういう意味なんですか?
public:
char *str;
Kitty() { str = "Kitty on your lap\n"; }
Kitty(const Kitty &obj) { str = "Di Gi Gharat\n"; }
} g_obj ;
int main() {
Kitty obj = g_obj;
cout << g_obj.str;
cout << obj.str;
return 0;
}
Kittyクラス終わりのセミコロンの間に変数g_objがあるんですがこれはどういう意味なんですか?
982デフォルトの名無しさん
2017/07/16(日) 18:11:45.98ID:0XlWr73/ 「int i; のセミコロンの前に変数g_objがあるんですがどういう意味ですか」
と訊いているに等しい
と訊いているに等しい
983デフォルトの名無しさん
2017/07/16(日) 18:13:11.34ID:0XlWr73/ 訂正
誤 変数 g_obj
正 変数 i
誤 変数 g_obj
正 変数 i
984デフォルトの名無しさん
2017/07/16(日) 18:25:45.80ID:dVrh8pbL g_objはKittyのインスタンスだが
あまりこういう書き方はしないかもね
あまりこういう書き方はしないかもね
985デフォルトの名無しさん
2017/07/16(日) 18:31:52.76ID:ZbG5GhXO >>981
Kitty と言うクラス定義とその型を持つ g_obj と言うグローバル変数を同時に定義している
要するに
class Kitty {
...
};
Kitty g_obj;
を一つにまとめてるだけ
Kitty と言うクラス定義とその型を持つ g_obj と言うグローバル変数を同時に定義している
要するに
class Kitty {
...
};
Kitty g_obj;
を一つにまとめてるだけ
986デフォルトの名無しさん
2017/07/16(日) 18:48:37.09ID:i1aK64sE987デフォルトの名無しさん
2017/07/16(日) 22:25:00.23ID:Z5uaiz2p988デフォルトの名無しさん
2017/07/17(月) 00:15:32.26ID:+UBTk6HR >>987
ウンコードは食べるとニガいからな
ウンコードは食べるとニガいからな
989デフォルトの名無しさん
2017/07/18(火) 05:08:40.08ID:gGqeofJB ほ
990デフォルトの名無しさん
2017/07/18(火) 07:08:39.06ID:vzMDiUgd991デフォルトの名無しさん
2017/07/18(火) 19:37:15.43ID:bPzCLpNs おつ
992デフォルトの名無しさん
2017/07/18(火) 22:55:46.66ID:KX2fhuwb ひょっとして2ちゃんのこのスレ
他のC/C++相談所よりハイレベル!?
他のC/C++相談所よりハイレベル!?
993デフォルトの名無しさん
2017/07/19(水) 07:02:25.97ID:Jp1Fyagp うめてんてー
994デフォルトの名無しさん
2017/07/19(水) 07:03:18.13ID:Cx7F+3jm 梅
995デフォルトの名無しさん
2017/07/19(水) 10:27:43.90ID:MRnyPI+k 他のC/C++相談所ってどこ?
996はちみつ餃子 ◆8X2XSCHEME
2017/07/19(水) 16:13:01.49ID:AV+hYp2C SNS の C++ コミュニティとかじゃね?
997デフォルトの名無しさん
2017/07/19(水) 17:00:45.76ID:Si/VL0fD それトリ割れしてるよ
#o%K%H:+O
#o%K%H:+O
999デフォルトの名無しさん
2017/07/19(水) 17:33:56.27ID:bGQD/KSW このスレにはQさんがいるからな
Qさんがいれば安心だ
Qさんがいれば安心だ
10011001
Over 1000Thread このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 254日 18時間 45分 34秒
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 254日 18時間 45分 34秒
10021002
Over 1000Thread 2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/
▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/
▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。