エスケープシーケンスや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
■ このスレッドは過去ログ倉庫に格納されています
2016/11/06(日) 22:58:02.60ID:dU5z27As
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:R8KZSjOU■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ココイチ、カツカレー1000円で遠のく客足 限界近づく外食の値上げ。客が許容できる値上げはどこまでか★3 [Gecko★]
- 2032年、地球に小惑星が衝突する可能性、3.1%に上昇 「アルマゲドン」か ★2 [お断り★]
- 不正確な事実でゼレンスキー氏を個人攻撃するトランプ氏 身内の共和党内からも反発 [蚤の市★]
- 「健康保険料高すぎ!」「もう限界」国民の負担を増やす前に厚労省がやるべき、2~7兆円もの医療費を削減できる3つの医療改革とは [パンナ・コッタ★]
- 英ジョンソン元首相 トランプ大統領発言めぐり 「アメリカが真珠湾で日本を攻撃したというのと同じだ」 ★2 [ごまカンパチ★]
- 【医療】ダウン症の原因の染色体を除去できることが判明と発表 三重大学の研究 [シャチ★]
- 【朗報】コメ農家「25年コメ農家をやってきて赤字ばっかだった、今年は少し利益が出そう」 [833348454]
- この陰キャ女とセックスしたい?
- あのトロッコで5人殺すか1人殺すか好きな方選ぶ問題あるじゃん?あれ結局どっちが正解なの?それとも悩ませたいだけのイジワル問題? [268718286]
- 【悲報】斎藤元彦陣営のネット広報担当会社が投稿したnoteで騒然★471 [931948549]
- 誰か家泊めて(ダメ元)
- 彼女作る難易度高すぎる