[過去ログ] 【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
4(3): デフォルトの名無しさん [sage] 2016/11/07(月) 09:27:53.95 ID:vooGYje+(1) AAS
前スレ>>999再掲
class A{
int a[2];
A(int b[])
:a(b) //error
{}
};
この:a(b)ってなにか書き方ありますか?
前スレ>>1000無理でした・・・
16(3): デフォルトの名無しさん [sage] 2016/11/07(月) 19:07:23.45 ID:hOJqMng1(3/4) AAS
要求は固定長の配列であって、動的に増やせるようにしろとは言ってないので
それのコードは非効率にしかならないと思うよ
34(3): デフォルトの名無しさん [sage] 2016/11/10(木) 10:52:07.29 ID:8ULjF/bN(1/8) AAS
独習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が戻り始めるのでしょうか?
あまりに初心者な質問ですみません。
43(3): 40 [sage] 2016/11/10(木) 14:01:09.75 ID:8ULjF/bN(5/8) AAS
>>4141(1): デフォルトの名無しさん [sage] 2016/11/10(木) 12:42:30.91 ID:69ogPHI/(2/4) AAS
再帰呼び出し後に書く 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);
と見えてくると思うよ
>再帰呼び出し後に書く 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からなのはなぜなのでしょうか?
133(4): デフォルトの名無しさん [sage] 2016/12/31(土) 16:11:48.53 ID:8v6iajLL(1/2) AAS
ある本の解答例ですが実行すると先頭文字が消えます。これではダメなんでしょうか?
void str_toupper(char *str)
{
while (*str)
*str++ = toupper(*str);
}
147(4): デフォルトの名無しさん [sage] 2017/01/04(水) 01:18:25.55 ID:frbRBuKj(1) AAS
副作用完了点が2つ以上あると鼻から悪魔
157(3): デフォルトの名無しさん [sage] 2017/01/04(水) 12:32:23.72 ID:xue+qv3N(1/2) AAS
「んなこたーない」
っていつも書き込みする人がいるけど
もっと具体的な回答してほしい。
「んなこたーない」って答えるくらいだから何かしらの反論や回答持ってるんだろうけど
もっと具体的に言ってくれなきゃ分からない。
281(3): デフォルトの名無しさん [sage] 2017/01/29(日) 14:28:58.62 ID:XKehhdE4(1/3) AAS
質問です。
VisualStudio2015でReleaseビルドをしていたところ、生成されたEXEに気になる点がありました
if(false){
printf("hogehoge");
}
という処理を書いたところ、このprintfは到達不可能なのに、EXEの中に"hogehoge"という文字列が含まれていたのです。
※再現コードなのでhogehoeをprintしてなんの意味があるのかというコードですが
到達不能なのが明らかな部分は最適化で削除されるものだと思っていたのですが、何かしらの私の不手際でしょうか?
最適化は /O2オプションです
334(3): デフォルトの名無しさん [sage] 2017/02/04(土) 21:25:32.55 ID:uqEM2LY/(1/2) AAS
int a = 0;
int *b = &(1+a);
これが出来ないのはなぜですか?
1+aの計算結果というのはメモリ上のどこかにあると思うんですが
529(4): デフォルトの名無しさん [sage] 2017/03/30(木) 20:11:34.52 ID:irpIFLVN(1) AAS
>>528528(2): デフォルトの名無しさん [sage] 2017/03/30(木) 10:48:22.67 ID:JHpE2Dpf(1) AAS
>>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の設計が要求にあってないのでそっちを変更する
おまえは質問の意図を理解しよう
>>525525(2): デフォルトの名無しさん [sage] 2017/03/30(木) 03:06:01.35 ID:6sTQLdA2(1) AAS
外部リンク:codepad.org
ポインタをメンバに持たせた場合のget/setの書き方が分かりません
getの方は、ポインタを返すときに返した先で値を変えられないようにconstを付けたのですが、
sizePlus10のような関数を呼びたい場合に、const_castを付けて呼ぶことになってしまいました
値の変更をするのでsetを通してやるのが良いと思うのですが、何か良い書き方ありますか?
また、setの方は、一括で設定させることはできるのですが、
data->id、data->sizeの値を個別に設定したい場合、何か良い書き方はありますか?
コメントの部分のようにsetメンバ関数を何個も書く方法しか思いつきません
そのsetgetでいいんじゃない?ただそのgetは俺だったらreferにするな
ついでにsetget両方使えるようにdata* operator->()みたいなの実装かな。というかむしろそっちでアクセスする方向にするな
あとはattachdetach作っておいてm_dataを置換できるにようにしちゃうな
その手のスマートポインタは至るとこで使われてるからこんなとこで聞かずにどっかのライブラリの参考にしたら?
メンバのコピーはpragma pack1でstructしておいてmemcpy
653(3): デフォルトの名無しさん [sage] 2017/05/23(火) 09:20:18.86 ID:J4YcG+3k(1) AAS
>>651651(2): デフォルトの名無しさん [sage] 2017/05/23(火) 00:42:13.85 ID:9/IkIyOw(1) AAS
ちょっとした確認なんだけどさ、
デストラクタが空っぽ (デフォルトデストラクタ) でもオブジェクトを後始末するための何らかの処理はするよね?
よくあるスライシングの問題で、
・クラス A をクラス B が継承している
・クラス A のデストラクタは virtual が付いていない
・クラス B のデストラクタはデフォルトデストラクタ
・クラス B はメンバ変数を持っていない
・B* を A* にキャストしたものを delete
という状況だと見かけ上はクラス B のオブジェクトには後始末すべきものは何もないように見えるけど、
デストラクタが呼ばれないのはやっぱあかんよな?
はい
規格上もデストラクタがvirtualでないBのオブジェクトをA*に入れてdeleteした場合未定義動作だよ
743(3): デフォルトの名無しさん [] 2017/06/24(土) 15:16:01.77 ID:qquEaJ2M(1) AAS
>>741コピーしようがしまいが結果は一緒でしょ?
単に最適化の結果で余計な処理が動かないだけと考えればいい
744(3): デフォルトの名無しさん [sage] 2017/06/24(土) 18:10:28.98 ID:Ipep7Yd5(1) AAS
>>743
一緒じゃねーよヴァカ乙
リソースはメモリだけと思ってんの?どんだけお花畑なの?
mutex a = {};コピー無しの保証
765(3): デフォルトの名無しさん [sage] 2017/07/02(日) 10:29:07.80 ID:TVPISEnD(1) AAS
質問です
doubleの計算誤差ってちゃんと考慮必要でしょうか?
数桁の四則演算なら誤差なしと考えていいですか?
792(4): デフォルトの名無しさん [sage] 2017/07/02(日) 22:54:19.38 ID:ynDhLM7Z(1) AAS
情報処理資格に受かっていない人が、C/C++ をプログラミングするなど、10年早い
C/C++ は、直接デバイスを扱うから、自作パソコンを作れるぐらいに、
かなりパソコン内部の装置の仕組みを、知っていないと無理
さらに組み込みなら、高度情報処理のエンベッド資格も必要
880(5): デフォルトの名無しさん [] 2017/07/09(日) 16:06:32.28 ID:EeQkMvgZ(1/4) AAS
ポインタそのものにオブジェクトってできるんでしょうか?
例えば、配列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つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか
他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。
894(4): 名無しさん@そうだ選挙に行こう! Go to vote! [sage] 2017/07/10(月) 07:04:04.53 ID:Ols/UzwR(1) AAS
配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている
947(3): デフォルトの名無しさん [sage] 2017/07/14(金) 20:20:31.05 ID:8ghhANnS(1) AAS
えっ
mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ?
少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.071s