【初心者歓迎】C/C++室 Ver.105【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
2019/04/25(木) 06:54:38.08ID:6xUIrXDu
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
http://codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.104【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1545944692/
2019/04/25(木) 11:00:25.52ID:/tHSxicf
チンポ体操

チンポを手に持ち しごく運動から
1 2 シコシコ
2 2 シコシコ

チンポを振り回す運動
1 2 ブルンブルン
2 2 ブルンブルン
2019/04/30(火) 16:44:32.44ID:hc3e5D+8
Cを2年間やって最近大学の講義でC++をやりはじめたのですが
C++だけでなくCの勉強も継続したほうがいいのでしょうか?
2019/04/30(火) 16:51:17.25ID:iYYZTFZo
>>3
C89=K&R2 をマスターできたら、C99 など目もくれずC++に進むのがいいでしょう、私はそうしましたし C99 なんかどうでもいいと思っています
2019/04/30(火) 17:08:01.32ID:hc3e5D+8
>>4
レスありがとうございます
競技プログラミングで言うと、C言語はatcoderでA問題とB問題はすぐに書くことが出来てC問題は解けたり解けなかったりというレベルです。構造体とポインタも基本的(C言語ポインタ完全制覇という書籍にあるような難しいことは知りませんが…)な扱いならばできます。
就職のことも視野に入れて考えたいのですが、C++が出来るならばCの知識が問われる機会というのは少ないのでしょうか?
2019/04/30(火) 17:18:00.19ID:iYYZTFZo
>>5
就職の話はよくわかりません
ただ、C89=K&R2 → C99 の改定内容は、C89 の時代に試みられていた拡大解釈を規格に取り込んだ、という部類が多いと私は思いました
それに C99 は、「C++ を見た後で決めたんかい?」という謎な部分が多くいけ好かないのも事実です、あんなものは知らないほうがいい部類でしょう
それよりも日々進化し続ける C++ をフォローするほうが、いろいろな面でお得です、私も p-thread 系マルチコアなプログラムを記述するために C++11 or lator に進み、とても満足しています
2019/04/30(火) 18:05:48.04ID:arIi2u2B
>>5
C++のクラスとかテンプレートとかSTLとかをとりあえず無視して
Cと共通してる基礎的なとこから学べば、わざわざCを個別に学ぶ必要はないとおも

仕事の場合は純粋にCだけ長年使ってるような特殊な職場でなければ問題ない
2019/04/30(火) 18:11:55.63ID:hc3e5D+8
お二人方ありがとうございます
CからC++の勉強に専念する決心が半分くらいつきました
Cのscanf()の仕様(バッファオーバーフローやバッファオーバーランの危険性を回避するいくつかの方法について等)、まだはっきりと把握していないのですが、それでも、C++の勉強に専念してしまっても問題ありませんでしょうか?
2019/04/30(火) 19:25:08.89ID:YvhWBPAF
バッファオーバーランって、この辺の話?
https://ja.wikipedia.org/wiki/Scanf#%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3
2019/04/30(火) 21:07:24.59ID:tJFiug19
C問題は使う言語の問題じゃないな
もちろんc++やJavaの方がC言語よりもスムーズに書けるがC問題はアルゴリズムを知らないと出来ない

それと現代ではC言語のscanfに習熟する意味は無い
それは後回しにした方がいい
2019/04/30(火) 21:38:58.06ID:B5WLnK8N
>>3
C を続ける必要性がゼロなら C++ に専念した方が良いかと
必要性は個々人による
大学の同級生なり、研究室等の先輩なりに相談・確認するのも良いかも知れない
2019/04/30(火) 21:41:18.36ID:B5WLnK8N
_s 系関数でも未定義な挙動を示すコードはいくらでも書けるのでキリがないんじゃね

詳細な資料はあるけれども、入門者が読むもんじゃなし
fgets + sscanf で安全になるわけでもなし
2019/05/02(木) 13:55:59.43ID:USN+R+ig
>>8
まあ他の人の意見も聴いておいたほうがいいでしょうね
個人的には何をやっても C で書けると「思える」感触ができるまで C で書きまくる経験は有用だろうと思います、時間はかかりますけれども何でも自分で実装する、という縛りを課してみる

データ構造(線形リスト、スタックやキュー、二分木やバランス木・K-dimensionなどのデータ構造)
アルゴリズム(ヒープ/クィック/シェル各種ソート、縦横探索やダイクストラ法と枝刈り・バックトラッキング、ナップサック、シンプレックス法、シャノンファノやハフマン)

いやもう、C なら何をやってもいい経験になりますね…
2019/05/03(金) 11:34:54.23ID:Gwp1b6R4
いまどきの環境だと下部に丸投げか
2019/05/03(金) 14:13:46.95ID:xL3yQoTR
関数の引数の書き方について質問があります。
任意のオブジェクトを複数参照する関数f(A& a, B& b, ......)
において、引数の a,b,...を左辺値と右辺値の任意の組み合わせで
使用する場合、関数定義をf(const A& ac, const B& bc, ......){
A &a=const_cast<A&>(ac);
B &b=const_cast<B&>(bc);
:
}
とする方法がベストでしょうか?
2019/05/03(金) 14:32:25.70ID:qNybD7B2
だめ
2019/05/03(金) 14:34:29.48ID:xL3yQoTR
15です。
追記します。

開発系のIDEでオブジェクトのメンバー変数を表示させながら
プログラム作成をしたいので、テンプレート関数化による
ユニバーサル参照の記述は使いたくありません。
2019/05/03(金) 21:34:51.81ID:Oy2+74/H
>>15
控えめに言ってクソ。 本当に const なオブジェクトが渡されたときにエラーにならない。
const なオブジェクトに const でない操作をするのは未定義だぞ。
(const ではないオブジェクトなら途中で const を経由しても書き換えて良いらしい。)

言語の作法の範囲内でなら IDE に対する配慮は工夫として評価されるかもしれないけど、
型システムによる保護を台無しにしてまでやるのはオススメできない。

少なくともこのスレでそういう工夫を是とする人はあんまりいないと思うぞ。
2019/05/03(金) 21:43:10.16ID:16FcdCX4
Arduinoなんだけど多分C一般の話だと思うんでここで

byte counter = 0;
while (true) {
  if (Shori(counter)) { break; } // Shoriの結果によってwhileから脱出
  if (counter < 4) { counter++; }
  else { counter = 0; }
}

または
for (byte counter = 0; counter <= 4; counter++) {
  if (Shori(counter)) { break; } // Shoriの結果によってforから脱出
  if (counter == 4) { counter = 255; }
}

または
for (byte counter = 0; true; counter++) {
  if (Shori(counter % 5)) { break; } // Shoriの結果によってforから脱出
  // これだとcounterが255から0になるときcounter % 5が2回連続して0になるため
  // 0〜5を繰り返し引数にしてShoriしていることにならない
}

または
while (true) {
  for (byte counter = 0; counter <= 4; counter++) {
    if (Shori(counter)) { goto dasshutu; } // Shoriの結果によってforとwhileから脱出
  }
}
dasshutu:

みたいに一定の範囲を繰り返すカウンタを持つ無限ループってどう書くのがシンプルで一般的なんだろう?
無限ループとはいっても256回も回らずに終わる見込みだから3つ目の書き方でいい(仮にそれを越えても処理内容的に致命的な問題はない)とか、念のためwordにしとけば65536回まではいけるとか考えてもいいのかな
2019/05/03(金) 22:05:03.91ID:VZjV/dE9
for (byte counter = 0; ; counter = (counter + 1) % 5) {
 if (Shori(counter)) { break; }
}
とか?
2019/05/03(金) 22:23:08.93ID:16FcdCX4
おおそんな書き方が。ありがたい。
しかも脱出に関して言えば、forの中でifで判定してbreakするのではなく
forの条件式に書いてしまうこともできるな…
2019/05/04(土) 04:03:12.91ID:qzgt3pmZ
オブジェクト指向でなぜつくるのか
って書籍が今Kindleセールで半額だけど良さそうだな
読んだことある人どんな感想ですか?
23デフォルトの名無しさん
垢版 |
2019/05/05(日) 03:51:38.18ID:NRm/lXtt
>>22
じゃんけんゲームを2人(自分対PC)用から(PCを)何人でも増やせる設計に変える例で
構造化プログラミングだとちょっと書き換え多そう。。。オブジェクト指向プログラミングなら〜って感じ。
(そこしか覚えてないとも言う)

第2版は最終章でオブジェクト指向プログラミングの次世代は関数型プログラミングだとか言ってHaskellの紹介が追加された。
2019/05/05(日) 11:14:43.13ID:P7bsB8ff
皆さんが一番勉強になった本を教えてほしいです。
これならわかるC++と、C言語ポインタ完全制覇は持ってるので、基本的なことはわかります。
これ読んで実力がバズった!というのがあればぜひとも。
2019/05/05(日) 11:28:24.38ID:3EWrT4Pn
>>24
C++ ならハーバート・シルトの独習C++ ですね
その真ん中くらいにある「std::string を自分で実装する」というお題が非常によく、OO の教科書でそういうお題を配置しているのも本質を明示している意味でよく、この本より優れている初級C++教科書がみあたりません
2019/05/05(日) 11:43:07.96ID:qZTOu8es
C言語を256倍使うための本
ttps://www.amazon.co.jp/dp/4756100430
2019/05/05(日) 19:46:41.25ID:P7bsB8ff
>>25-26
ありがとうございます。参考にします。
2019/05/05(日) 20:24:31.00ID:TxpPZKKr
>>24
私が学んだのは「詳説 C++ 第2版」だな。
https://www.amazon.co.jp/dp/479732743X
この本の内容は C++03 の時代のものなので C++11 以降のトピックはウェブで学んだ。

Twitter で C++ に強い人が独習C++の間違いを強く批判しているのを見ることがちょいちょいあるので、
自分では読んだことが無いけど独習C++には良い印象がない。
まあ不正確でもわかりやすいことは有りうるのでとりあえずおおざっぱな概略を把握する分には
どれでも割となんとかなる気がしている。
2019/05/05(日) 20:35:10.90ID:3EWrT4Pn
>>28
>独習C++の間違いを強く批判している

話を簡単にするために、一時的に紛らわしいことを言っている=どこを切っていも正しいというわけではない=文脈依存なところがある、という批判はアマゾンレビューにありましたね
しかし強く批判されるほどの欠点があるかどうかは、私にはよくわかりません

よろしければポインタをください
2019/05/05(日) 21:21:05.73ID:TxpPZKKr
>>29
良い評価も悪い評価もあるので単純には言えないけど、批判している代表的な意見としてはこれかな。
https://twitter.com/yumetodo/status/1020966071702966273
ただ、全体として入門書として本当に妥当な本があまりないので、どれが比較的マシなのかというレベルの話だと思う。

私が読んだことがない中で評判を評価するとたぶん江添氏の出している本が (少なくとも日本語の本の中では)
だいぶん良さそうでは有る。
速度のある分野では、単純に古いものはそれだけで価値が低いので、
逆に言えば最新に追い付こうとしているものは高く評価できる。
https://twitter.com/5chan_nel (5ch newer account)
2019/05/05(日) 22:04:35.25ID:vipN53in
俺「競プロ飽きたしC++の勉強でもするか」
isocpp.org「まずはTourofC++で概要をつかむといいよ〜」
ビャーネ「Tourはプログラミングに習熟した人を想定している」
俺「短くて面白いけど難しいな。プログラミング初心者向けのはないかな?」
isocpp「じゃあこれ つ原則と実践(1248ページ)」
俺「ファッ!?」
isocpp「あと勉強するときは少なくとも3冊持っといたほうがいいよ〜」
俺「ウーン…」
2019/05/05(日) 22:17:13.40ID:3EWrT4Pn
>>30
毒臭を有害ゴミと判断した理由が知りたいですね…

個人的には、C++ の中の Java に似た部分を抽出して、初心者(最近は C++ に直接参入する人が多いとか…なんか時代を感じます)にやさしい、できれば分厚くない本がいいなあ
以前は accelerated C++ を薦めたりしたのですが、最近 accelerated c++ の決定的に駄目なところを見つけてしまったので、もう私が薦める本は独習しかないのでした
2019/05/05(日) 22:37:15.85ID:RPhfdkos
>>32
有害ゴミなどど、相手が使ってない言葉に勝手に置き換えて、さも相手が感情的で非論理的な
2019/05/05(日) 22:39:39.67ID:RPhfdkos
途中だった。

有害ゴミなどど、相手が使ってない言葉に勝手に置き換えて、さも相手が感情的で非論理的な発言をしてきたかのような印象操作は卑怯だとは思わないか?
2019/05/05(日) 22:39:39.95ID:3EWrT4Pn
>>33
https://twitter.com/yumetodo/status/1020966071702966273
>言うまでもなく独習C++は時代遅れの化石で有害ゴミ行き。
使っていますが…
https://twitter.com/5chan_nel (5ch newer account)
2019/05/05(日) 22:41:08.48ID:3EWrT4Pn
>>34
https://twitter.com/yumetodo/status/1020966071702966273
>言うまでもなく独習C++は時代遅れの化石で有害ゴミ行き。

印象操作などではありえず、ずばり「有害ゴミ」指定されちゃってますが…
https://twitter.com/5chan_nel (5ch newer account)
2019/05/05(日) 22:42:08.10ID:RPhfdkos
>>36
twitterの方は見てなかった。失礼した。
2019/05/05(日) 23:27:07.88ID:DzyvOKLj
プログラミングの最初の一歩すらわからない状態から始めるのか
Pythonやjsやphpなんかである程度書ける状態から始めるのかで話が変わると思う
後者ならググりながら適当になんか書いてみればいいと思う
2019/05/05(日) 23:43:52.77ID:3EWrT4Pn
>>38
>ググりながら適当になんか書いてみれば
それは C/C++ に関していえば、ちょっと危険な気が… 逆に Python や ruby をやるのなら、それでもいいと思いますが…
2019/05/05(日) 23:57:02.81ID:TxpPZKKr
>>39
それに強く同意。
C++ には未定義の挙動が多すぎるので、
表層的な理解で使うのは大変に危険である。
2019/05/06(月) 01:21:26.82ID:oGUqqIoM
C++に関してググって出てくる情報って適当なの多いよなw
Qなんとかとか特にw
2019/05/06(月) 04:37:01.34ID:z7Cz8mZC
どうも最近は最新のC++の機能を使うべきだとしつつ
自分なりにとりあえず適当に書くのは危険とか言う意見が多いけど
人間もあくまで動物なので手を動かして書かなきゃ覚えないしCの時代から続く古臭い書き方は長年の積み重ねでセオリー確立してんだから
そういう学習方法を否定するのは違うと思うよ

クラス、ひいては最新の機能を正しく使う、なんて初心者がいきなり目指すようなことじゃない
2019/05/06(月) 06:08:09.39ID:Geq8Gq1G
>>42
手を動かして覚えることは誰も否定していないし、むしろそれは強く推奨したい。ただ、C/C++の場合は表面的な理解だけで動いたから良しとして進むのは危険で、基本的な部分は正しく理解しておくことは必要だと思う。
ある程度の基礎がある状態なら、新しい機能やライブラリの関数もググって得られる情報から正しい仕様を理解して習得できるが、基礎ができていない状態でそれは難しい。
初心者がとりあえず適当に切り貼りして動かそうというやり方をするなら、他の言語から入った方がいいと思う。ググって調べた断片的な情報だけでなく入門書等で基礎を押さえつつ、実際に書いて愚直に挙動を確認しながら理解をしていくのが良いと思う。
2019/05/06(月) 11:40:40.36ID:vu8V8zIe
>>42
>人間もあくまで動物なので手を動かして書かなきゃ覚えないし
プログラミングは特に、自分で書いて書いて書きまくって読んでというところは同意
となれば、ちょっと書く気になろうという心の動きを、分厚い教科書で潰したくない、という趣旨は理解
さて、困ったものです、そういうときに使える教科書があればいいのですが、C/C++ の教科書って高くて分厚いですからね…私もメイヤーズはまだ積読だし、いつ読む気になるかな?
2019/05/06(月) 13:27:09.96ID:MWPsBkkn
300ページ未満の入門書…
2019/05/06(月) 13:46:12.30ID:z7Cz8mZC
まぁ確かにサンプルコードの切り貼りとかは危ないだろうしネットの情報だけってのはね
でも独習みたいな古臭い(03以前)入門書なんて初心者にうってつけだと思うんだけど

・・・って、twitterでこき下ろしてる奴のアカウント名に見覚えあるわw
そいつ勘違いの激しい学生ちゃんだから言ってること真に受けない方がいい
2019/05/06(月) 16:16:47.15ID:yQTWUAYp
isocppで推薦されてる原則と実践の前の版がたまたま
近くの図書館にあったから読んでみたけど、意外と面白いな。
2019/05/06(月) 16:19:28.55ID:K/rO19sE
>>46 見つけられなかったので比較的に新しいやつの中から探して一例として出したけど、
そやつひとりだけが言ってるわけじゃないよ。 良いと評価している人も当然いるんだけど、
あくまで私の観測範囲で私が総合的に感じた漠然敵な印象の話なんで。
2019/05/06(月) 16:20:48.53ID:K/rO19sE
今の時点でそれなりに C/C++ をわかるようになっている人の思う「良い本」というのは
「昔に学んだ」という体験だからさ、今から学ぶという人の事情とはやっぱり時代が違うと思う。
自分が読んだ本を言えても、それを強く勧めるほどの自信はないな。

例えば私が最初に買った C++ 本は ARM なんで、これにはいわゆる STL さえ載ってないんだけど、
当時としては妥当な選択肢だったし、十分にわかりやすかった。
でももちろん、今の時代に ARM を勧めるなんて馬鹿馬鹿しくてあり得ないでしょ。

昔の C++ を身に着けてから徐々に知識を更新してきていると昔の C++ と今の C++ が
滑らかに繋がっているように錯覚してしまうけど、昔の C++ を学んでから今の C++ というのは
結構な飛躍があると思うんだよ。
今から学ぶなら C++11 程度は想定している本の方がいいんじゃないかな、と個人的には思う。
2019/05/12(日) 18:12:45.12ID:wqyHUvPG
>>49
> C++11 程度は想定している本の方がいいんじゃないかな

しかし、C++03 までのからくりをしらずして、C++11 のあれこれを理解できるかな?とも思うのです、ranged for の for(auto &item; vec) の & の意味とか…これはあんがい簡単にクリアできるのやもしれませんけど
2019/06/13(木) 17:42:42.66ID:KieG+j09
テンプレート特殊化を前方宣言したいんだけど、
コンパイルエラーが出て詰んでるんですけど、
どうやればいいですか?
例えば以下のようなことがしたいんですが。

template<class T>
struct A {};

template<>
struct A<int>;

template<>
struct A<float> {
A<int> f() { //エラー : 認識できない型A<int>が使われいます。
return A<int>{};
}
};

template<>
struct A<int> {
int value;
};
2019/06/13(木) 23:30:30.78ID:CsiJtfL2
A<float>::fを定義するにはA<int>の定義(classのサイズ)が必要
fの定義をA<int>のあとにすればできる
https://ideone.com/Vv0Psu
5351
垢版 |
2019/06/14(金) 00:54:44.79ID:rrlL2Eyk
>>52
おお!マジで出来たw
ありがとう
54デフォルトの名無しさん
垢版 |
2019/06/18(火) 08:26:42.73ID:YBHtdulC
入門書の入力された文字列が同じかどうかを判断するコードなのですが
https://ideone.com/vaASOS
14行目のif(str1[i]!=str2[i])break;がどういう意味なのかさっぱり理解できません
文字コードが同じじゃなければbreakッて意味ですか?
len+1してるのも意味がわからないです・・・
説明よろしくお願い致しますm(_ _)m
55デフォルトの名無しさん
垢版 |
2019/06/18(火) 09:08:30.02ID:Sq2beh5p
文字コードが同じじゃなければbreakということでいいんじゃない?
len+1しているのはヌル文字があるから
2019/06/18(火) 09:20:54.17ID:R6plNfEa
まず配列について勉強だね
デバッガのステップ実行で追っていくといいよ
57デフォルトの名無しさん
垢版 |
2019/06/18(火) 09:21:46.85ID:3nOE2mBA
プログラム板の精神病コテ 松本卓朗 さん殺害予告!
https://mevius.5ch.net/test/read.cgi/tech/1560808598/
2019/06/18(火) 11:28:13.79ID:uO3416eX
文字列が同じ = 1文字1文字全部同じ = 1文字でも違えば違う
strlenは文字数を返すけど最後の\0を含まない
最後の\0まで比較しないと入力した文字列と先頭部分が一致したら一致してしまうのでlen+1
2019/06/18(火) 11:38:40.31ID:YX5RP0uz
文字列長の短いほうを len としないと突破したところを参照してまうぞ

str1 = asd\0
str2 = asdf\0
で str2 の len+1 まで str1 を参照すると嘔吐
2019/06/18(火) 11:39:47.81ID:YX5RP0uz
まぁ 文字列長がちがったら いきなり不一致って脱出してもいいんだけどね
2019/06/18(火) 11:50:07.19ID:uzZY1452
https://ideone.com/JUWWBr
分かり易くなったゾ

変数を減らせばラク
lenで判定してるイマイチな書き方を排除すればもっとラク
要するに分かりにくく書いてるから分かりにくいだけだよ
2019/06/18(火) 12:00:25.27ID:YX5RP0uz
元々は入門書に書かれてたコードか
むむむ
2019/06/18(火) 12:36:36.95ID:uzZY1452
ループを再帰に直せば終了条件がもっと分かり易くなるゾ
再帰にして時系列の1段階ずつ見せればその1段階ごとにどういう判断してるか分かり易いでしょ

bool scr(char* p, char* q){//string compare recursive
if( *p == '\0' || *q == '\0' ){
if( *p == *q ){
return true;
}
return false;
}
if( *p != *q ){
return false;
}
return scr(p+1, q+1);
}

元のヤツは文字コードと文字列の長さがこんがらがってぐちゃぐちゃになってるから分かりにくいんだなコレ
同じ文字列かどうかを、「文字コードが同じか」と「文字列の長さはどうか」、この二つで判断してるでしょ
判定するのに全く別の二つのものを取り扱ってるから分かりにくいんだよ

forのカウンタのiの取り扱いも分かりにくい
文字列長さの境界の+1の有無も分かりにくい

文字コードが同じじゃなければbreakしてlenで判定、すんごく分かりにくいでしょ
何せ「文字コードが同じじゃなければbreak」、その通りなんだけど「意味が理解できない」と来てる、意味が分かってるのに「分からん」と言ってるワケだ
結局はbreakしてるはiのカウントを止めるためと、lenと比較するためにforのスコープ超えた場所でiの値を参照するため

これ入門書の前段階までにfor文の外側でiの値を参照してる例がないと詰まる箇所だよ
for文の外側でiの値を使う、この意味が分からんと「文字コードが同じじゃなければbreak」まで分かってても全体が分からないようになってる
2019/06/18(火) 12:55:58.74ID:GYXVYwQo
ポインタを知らないであろう初学者にポインタ演算を使って分かりやすいとする鬼畜の所業
2019/06/18(火) 16:53:31.85ID:eB4Ftz1Y
>>57~63回答ありがとうございます
説明下手でスイマセン。このコードが書いてある前のページに文字列の比較は出来ないため
str1==str2と書いて判定は出来ないと書いてあったのに
14行目でstr1[i]!=str2[2]で判定してるのがよくわからないです
strlenは\0返さないのですね。そこはスッキリしました。ありがとうございます
2019/06/18(火) 18:05:58.84ID:U3/WUc9c
>>65
str1==str2はポインタ(それぞれの文字列が格納されている先頭アドレスの値)を比較してるだけ。
str1[i]!=str2[i]は、str1とstr2のi番目の文字を比較している。
2019/06/18(火) 18:50:13.29ID:ujoReLWG
>>66
文字列の中身を比較してるんじゃなくて先頭のアドレスを比較していて
str1[i]!=str2[i]は文字列の中身を比較してるってことなんですね
もやもやが解けました。ありがとうざいます
2019/06/18(火) 19:28:14.92ID:U/JJd+xv
>>59
馬鹿なの?
2019/06/18(火) 20:04:16.08ID:ADibu3ht
きゃー はずかしい><
70デフォルトの名無しさん
垢版 |
2019/06/18(火) 22:39:27.24ID:R4l3qwnJ
int a = b - 1;
if (a < 0){
 a = 0;
}

これのスマートな書き方を教えてください。
2019/06/18(火) 22:45:19.63ID:BC11WozD
ここで聞いていいのかわからないけど
組み込み系で上位割り込みでライト、下位割り込みでリードする場合割り込み禁止する必要ありますか?
2019/06/18(火) 23:11:51.18ID:gZnFDsgJ
>>70
それ以上にスマートな書き方なんてない
素直が一番

>>72
atomicにアクセスできないなら必要
readの途中でwriteが発生したらダメだし、
writeの途中でreadが発生してもダメなんだから、上位/下位は関係無い
2019/06/18(火) 23:13:26.53ID:48k2aFsK
>>70
bの型が不明な場合はスマートな書き方は特に無い
2019/06/18(火) 23:24:05.71ID:f34xyyaF
>>70
int a = b < 1 ? 0 : b - 1;
2019/06/18(火) 23:28:32.54ID:BC11WozD
>>72
何故ダメなのかが理解できてません。
書き忘れてましたが割り込みはタイマで周期的に発生させてます。
リード中にライトが発生しても下位割り込みは一周期遅れて上位割り込みのライト結果をリードするだけではないのですか?
2019/06/18(火) 23:45:23.52ID:gZnFDsgJ
>>75
writeの割り込みが発生するまではreadは進行するんじゃないの?
だから「readの途中で」なんだけど
「2つの割り込みは完全制御下にあり、read中にwriteは発生しない」なら大丈夫だよ、当然
2019/06/19(水) 00:02:23.61ID:/MswhT0Q
>>75
>リード中にライトが発生しても下位割り込みは一周期遅れて
ここがちょっと勘違いを感じる
割り込み処理が終わったら、割り込まれた処理の続きをするのよ
低レベルにDBのrollbackみたいな複雑な仕組みはないのよ
2019/06/19(水) 02:33:40.48ID:v2+76oWz
char型の動作がどうもわからない。
例えば 
char str[] = "abc"; として
cout << &str[0]; ----> abc
になるのはなんで? index 0番だから a がでると思ったんだけど...
初心者ですまん
2019/06/19(水) 03:26:09.45ID:0DgdOBcz
>>78
&str[0]に付いてる&はアドレスを取得する演算子だから、strの最初の文字「a」のアドレスを取得するという意味になり、
結果的には cout << str; と同じことになる。
2019/06/19(水) 05:18:40.21ID:xxgeB2IO
>>78
cout << &str[0] << '\n';
cout << str[0] << '\n';
この2行でソースと実行結果を見比べれば腑に落ちるんじゃないかな。
2019/06/19(水) 08:25:58.04ID:huda4IDC
>>76
>>77
下位割り込みのリードが一命令で完了するなら「リードの途中でライト」が発生しないので割り込み禁止しなくていいということですか?
例えばリードライトの対象が配列なら割り込み禁止要、変数単体なら不要
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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