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

■ このスレッドは過去ログ倉庫に格納されています
2016/11/06(日) 22:58:02.60ID:dU5z27As
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

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

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

前スレ
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
2016/11/10(木) 14:10:50.73ID:69ogPHI/
おっけー まかせた
2016/11/10(木) 14:18:39.78ID:gEXUDT4B
待機する、って言い方を見るに、何かキューのような物を連想しているようだし
実際、なんで逆順になるか分からないと発言しているわけだが
答えは関数呼び出しはキューではなくスタックだから、と言う他ない
キューやスタックという言葉の意味が分からなかったとしても
どのみちこれらも覚える必要のある最も基本的な事の一つだから
合わせて覚えればよいだろう
コンピュータの基本動作もよくわからないままプログラムを書くということは
多言語ではあり得るのかもしれんが、とりわけここは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)ということですね。

スタックフレームという言葉で検索したらおもしろそうなサイトがたくさん出てきました。
皆さん今回はありがとうございました。
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回繰り返すことになる
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を実行していくということではないんですか?
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なのだ
2016/11/10(木) 15:18:47.59ID:17noS2hU
長い。あとビデオ見ながら電話に出れるだろ
2016/11/10(木) 15:21:50.96ID:3AXwvnI0
ポインタを返すラムダをstd::functionで取り扱いたくて調べてるのだが
どうしてどの参考例もintやvoidの例しか示していないのだろう
参考例を示すまでもなく誰でも簡単に記述出来ているのだろうか
5652
垢版 |
2016/11/10(木) 15:39:54.19ID:8ULjF/bN
>>53
レスありがとうございます。参考になりました。
2016/11/10(木) 20:21:43.62ID:CLfGjB35
>>55
特に難しくは無いと思う
例えばどんなことをしたいの?
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すんだよと思うけど
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); } };
2016/11/11(金) 01:01:22.47ID:JQalwGbJ
>>62
散々煽ってたから聞くけど
static_cast<void *>(nullptr)
このキャスト無駄じゃない?
これは変な例ではないの?
2016/11/11(金) 01:15:39.30ID:tUBqvL6G
う〜んどうだろうね
よく見るとラムダの戻り値の型が省略されているし
こういったことがどの段階のC++のバージョンで出来るようになったのか
俺は知らないが、実際の戻り値の型からラムダの型を推測してくれる便利機能
を使っていると思われる
となれば、キャストなしのnullptrでは型がわからないから
ラムダの戻り値の型の推測もできず、コンパイルエラーになるのではないだろうか
2016/11/11(金) 01:36:59.83ID:tUBqvL6G
もしくは、ひょっとしたらnullptrには何らかな特殊な型が与えられているのかもしれんが
それはしらないが、ともかくvoid*型ではないのは確かなので
その場合でもstd::function<void *()>への代入で問題を起こすんだろう
nullptrに型が有るのか無いのか、俺は知らんし、興味もないんだけどね
2016/11/11(金) 01:48:43.11ID:v3r+B2af
>>57>>59>>62
vsで試してて
std::function<void *()>
のような書き方をするとテンプレートがエラーを出していたので
関数ポインタのような特殊な記述が必要になるのかと思って調べていたのですが
原因が分かりました

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

というかNULLって今まで(void *)0だと思ってました・・・
まさかただの0だとは
普段はコンパイラが暗黙に変換してるんだね・・・
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とかでも同様なんですかね
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の結果とも一致する
2016/11/11(金) 07:16:38.23ID:hk5EgzxW
>>63
コンパイルが通るかどうか以前に55は『ポインタを返すラムダを』と言っているのだから、
無いとお題改変になってしまうだろう

>>67
当然
int f() {return NULL;}
void *関数() {
 return f();//エラー
}
と同じことなので
2016/11/11(金) 08:09:52.28ID:JclCvFO1
ID:tUBqvL6Gは希にみる健常者
2016/11/11(金) 08:32:07.55ID:JclCvFO1
>nullptrに型が有るのか無いのか
この手の文法で型が無い落とし穴は初期化の { } ぐらいか
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++なんか使わねーという主張がにじみ出てるよ
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は無しでスタックのみを使用できれば、なお良いのですが、
良い方法が思いつきません。

何かスマートな方法は有りませんか?
2016/12/11(日) 20:55:16.41ID:Cd8ql2jy
元関数の length が uint32_t 単位での個数という仮定
→ uint32_t より小さい粒度は取り扱えない
→ uint16_t で取り扱える個数は偶数個に限定される
→ ポインタのキャストと length を /2 で渡すだけ
2016/12/11(日) 21:42:00.21ID:74mAoGAM
uint16_tの方がラッパーなの?
どちらにしろ元の関数をそのまま使うなら変換は必要だね。

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

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

ひとまず>>86さんの方向で考えてみます。
お二人ともありがとうございました。
2016/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);
}
2016/12/13(火) 19:22:51.41ID:vJwCdf+q
>>90
どうなのって言われても好きにしろよとしか言えないけど...
個人的には各々のテストも必要になるその手のコードは書かない
2016/12/15(木) 21:00:06.98ID:iypiqTM3
ガチの初心者でプログラミング勉強したいと思ってるんですが
プログラミング勉強するとなるとどんなものから作り始めればいいですかね?
ちなみに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 を表示して、続いて標準入出力、
ソートやらリンクド・リストやらのアルゴリズムを習得して…
という順序を踏んでも、「マウスをクリックすると何かしてくれる」ような
今様のプログラムには少しも近づかないんだな、これが。
2016/12/16(金) 09:22:43.83ID:R8KZSjOU
>>96
ゆくゆくはカメラを使って画像処理的なものをしてみたいと思ってます
具体的にはまだ決まってませんが…
2016/12/16(金) 09:23:43.35ID:R8KZSjOU
>>97
なるほど
将来的にやりたいことをしっかり考えたうえで何を学ぶべきか考えたほうがいいんですね!
2016/12/16(金) 09:30:19.30ID:R8KZSjOU
>>93
なるほど!
参考になりますm(__)m
2016/12/16(金) 09:52:11.47ID:hCzygT3G
>>98
じゃあとりあえずGUIが必要だから
そこらへんからかな?
2016/12/16(金) 11:19:48.12ID:O1fw7E0o
>>101
わかりました!
ありがとうございます!
2016/12/18(日) 22:40:31.25ID:rTzEq7cO
c++でGUIな何かを作るときどうやるのが普通?どうやるのがおすすめ?
趣味嗜好全開でいいから教えてくれ
2016/12/18(日) 22:46:05.73ID:eNcCSvTp
ビルド時間とバイナリサイズが気にならないならwxWidgets
2016/12/18(日) 22:56:35.56ID:TyHJy95g
真面目にその条件なら.NETだけどそれなら言語はC#でやった方がよいと思う
自分は自分用のWIN32APIを使ったGUI用のライブラリ作ったけど完全に時代遅れだとは思ってる
2016/12/18(日) 23:56:09.22ID:psse/iGW
wxWidgetsよさそうやね
クロスプラットフォームってのがいい
2016/12/19(月) 08:41:19.51ID:K+bb4qm0
vcを使うという事ですか
2016/12/20(火) 08:43:24.96ID:/4ZK922w
>>103
ターゲットの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
110デフォルトの名無しさん
垢版 |
2016/12/24(土) 19:04:08.51ID:Xnn//JuE
これで4時間近くハマった。
2016/12/24(土) 19:11:41.00ID:0UyY/BKM
グローバルな FILE *fp の近く(若いアドレス)に置かれた
グローバルな配列の範囲オーバーじゃないかしら。
2016/12/24(土) 20:06:31.12ID:TihFoldF
>>109
ファイルの開くのから閉じるのまでが一関数に収まってて、他から呼び出してないなら関係ないと思うけど
閉じ忘れとか?
2016/12/24(土) 20:27:17.35ID:DNE92dFu
fileno とか ferror は確認した?
2016/12/24(土) 20:34:23.48ID:y7L7nGQ6
fp をグローバルにおいたソースで 別のローカル変数をグローバルに置いたら
その変数で副作用起こすんじゃね?

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

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

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

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

DOSの頃なら互いに影響しあうことも普通だったろうけど、
最近のOSだと別に管理してそう。
内部の詳しいことは知らないけど。
2016/12/25(日) 09:26:05.12ID:SibbJTGE
>>118
お前はもう少し勉強してから書き込むべき
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";
2016/12/25(日) 17:03:23.30ID:YVZO5C9V
"s"と".png"はconst char*型なので+は無理
123デフォルトの名無しさん
垢版 |
2016/12/25(日) 17:09:24.52ID:xlX3oF2t
そうなんですか…
ありがとうございました
2016/12/25(日) 22:48:16.54ID:oxH1mE2q
>>120
最初に、すべてのアドレス分のメモリを確保すれば?

その先頭アドレスを、エミュレータの先頭アドレス・0 にすればいい
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あたりで
2016/12/26(月) 08:42:54.29ID:w1n6Bp69
>>124
それじゃ起動毎に変わるんじゃね?
2016/12/26(月) 09:21:17.58ID:5lDUjv3x
起動毎にホスト上でのメモリ配置が変わっても
エミュレータの駆動機構で >>124 のように
エミュレーションする対象の仮想コードのアドレッシング → ホスト環境の実メモリ
の変換テーブル経由なら問題は発生しないべ
2016/12/26(月) 12:36:41.62ID:bq11e3Cp
>>125
ありがとうございます!
あとでやってみます
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]でアクセスできる。
これと同じ。
131デフォルトの名無しさん
垢版 |
2016/12/28(水) 09:29:29.21ID:jHXCJg+4
OggVorbisの使い方を教えてください。
動的リンクライブラリとしてリンクして、
WAVEデータをリアルタイムでOggVorbis形式(CBR)に変換したいです。
VS2015です。
一応ググりましたがどこから手を付けてよいか分かりませんでした。
2016/12/28(水) 11:23:40.53ID:BmYU7N0Q
ttps://xiph.org/doc/
ここから必要な文書を探して読んで理解するのが本筋
2016/12/31(土) 16:11:48.53ID:8v6iajLL
ある本の解答例ですが実行すると先頭文字が消えます。これではダメなんでしょうか?
void str_toupper(char *str)
{
while (*str)
*str++ = toupper(*str);
}
2016/12/31(土) 16:20:34.34ID:ADMXNhyN
*str++ = toupper(*str);

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

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

……って真に受けるなよ。別の悪魔が出てくるだけだからな。
たとえ期待通りの動作になったとしても、たまたまだからな。
2016/12/31(土) 17:24:22.85ID:xodGK7fu
ポインタを直接インクリメントするのはどうにも性に合わん
2016/12/31(土) 17:38:17.18ID:nERH8viD
通る道なのでやさしくね
2016/12/31(土) 18:30:26.25ID:K1FrsN4c
>>133
その本がダメなコードの例としてそれを挙げてるならいいけど、正解としてそれを書いてるのなら、著者の能力とか校正の正確さとか不安になる。
139133
垢版 |
2016/12/31(土) 19:18:21.55ID:8v6iajLL
>>138
正解例です
>>135
下でダメだったので正解を見たら上になってて、そうかとそうかと思ったのですが…
>>134
ありがとうございます
初心者なので更に勉強してみます
2016/12/31(土) 20:02:29.25ID:RP5GqFRc
本の題名晒してもいいと思う...
2016/12/31(土) 20:11:53.63ID:ADMXNhyN
古かったとして、古い規格だとしても処理系依存
(こっちのコンパイラはこうなるけど、あっちのコンパイラでは別の結果になるよ) なので、
正解コードとするのはよろしくない
2016/12/31(土) 20:17:55.00ID:q3l2oU5w
なぜダメなのか何がダメなのか理解しとかないと
2017/01/01(日) 01:32:25.83ID:LgRst/uw
>>139
まじすか ちょっとひどいですね。 著者が知りたいです。
2017/01/01(日) 12:42:18.55ID:/LG195GI
str_toupperでググると正しいコードはあるけど >>133 は見つからないなあ。結局なんて本?
145133
垢版 |
2017/01/01(日) 14:53:59.97ID:OFpbxODd
解きながら学ぶC言語(2006年第5刷)ですが、新版見てみたら >>134 のように修正されてました
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況