エスケープシーケンスや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/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/
ここから必要な文書を探して読んで理解するのが本筋
ここから必要な文書を探して読んで理解するのが本筋
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★4 [樽悶★]
- 「“なり得る”って言っただけだから…」高市早苗“存立危機”答弁後に漏らした本音 ★2 [Hitzeschleier★]
- 歩道で93歳男性が女子大学生の自転車にはねられ意識不明 坂を下った先「気付いたときには目の前に」 [七波羅探題★]
- 中国外務省局長 「ポケットに手を入れていたのは寒いから」 日本との局長級会談で ★4 [お断り★]
- 中国が水産物の輸入停止、首相答弁撤回を要求…中国共産党機関紙「輸入停止は一つのシグナルにすぎない」 [ぐれ★]
- 「“なり得る”って言っただけだから…」高市早苗“存立危機”答弁後に漏らした本音 ★3 [Hitzeschleier★]
- 【日中激突】高市、完全にナメられる!中国、さらに報復を示唆。尖閣など領海に入られても大して外交的抗議してこなかった結果なのか [219241683]
- 有識者「今は円安辛いかもしれない。しかし、この痛みを乗り越えた先に豊かな日本と強い円が待っている」 [237216734]
- 今年の牡蠣(カキ)、ガチで終わる、広島の牡蠣の9割がとつぜん死滅して終わる [329329848]
- 🍣にゃっはろ🌸~スシろ~🏡
- 中国人観光客のキャンセル率、ついに7割越えwwwwwwwwwwwwwwww [329329848]
- 🏡PUNCHマッチ💥🥊😅🥊💥超重量級決戦🏡
