X



【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
垢版 |
2017/07/18(火) 07:07:27.20ID:vzMDiUgd
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

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

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

前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1478440682/
0846片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/10/14(土) 18:09:28.74ID:WLIJLkzn
C/C++でWebやるなら、Win32API直接叩くか、cURLのような汎用のライブラリーを使うか、SQLiteかMySQLでデータベースにアクセスするくらいかな。
0848片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/10/14(土) 19:05:03.99ID:WLIJLkzn
Cはバッファオーバーフローが起こりやすく基本的に安全じゃない言語であり、バイナリーは、ロックの問題があり、またポータブルじゃないから、サーバー側のアプリではあまり使わない。
0851デフォルトの名無しさん
垢版 |
2017/10/14(土) 20:23:02.85ID:4H9yAKfY
無限ループだけどバッファーの確保領域を突破してアクセスするようなコードを吐き出すことは無い
と思う
0852片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/10/14(土) 20:43:46.00ID:WLIJLkzn
>>850
簡単に分かりやすい例を挙げると、外側から来た任意の長さの文字列でstrcatやsprintfなどを使うと危険。
危険な関数は使用禁止してセキュリティの強化された関数に置き換えないといけない。
0853片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/10/14(土) 20:59:09.10ID:WLIJLkzn
だが、残念ながら、教育現場ではバッファの長さを考慮しないsprintfやstrcatを教えているところが今でもある。
標準のC言語ではセキュリティは低いと考えた方がいい。
0854デフォルトの名無しさん
垢版 |
2017/10/14(土) 20:59:25.10ID:MqT/JM+M
>>850
アクセスして良いメモリ範囲を越えてしまうバッファオーバーフローと、数値型の変数で表現可能な範囲を超えるオーバーフローは別の話。
そのソースで問題になるのは後者。
0856デフォルトの名無しさん
垢版 |
2017/10/14(土) 23:37:16.03ID:q9IpA67V
>>851-854
ということは、255サイズのリングバッファ作りたいときって

unsigned char buffer[255] = {0};
unsigned char head=0, tail=0;

unsigned char pop(){
if(head==255) head = 0;
return buffer[++head];
}

void push(unsigned char data){
if(tail==255) tail = 0;
buffer[++tail]=data;
}

このサイズチェックのif文なくても大丈夫ってことですか?
0857デフォルトの名無しさん
垢版 |
2017/10/14(土) 23:48:06.29ID:oz/gRrlj
お前の例だと255でゼロになるけど
オーバーフローの場合は256でゼロになる
よって必要
0860片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2017/10/15(日) 05:20:33.19ID:3VVV/TO4
>>856
#define BUFSIZE 255
unsigned char buf[BUFSIZE] = {0};
size_t head = 0, tail = 0;

void push(unsigned char data)
{
assert(head < BUFSIZE);
buffer[head] = data;
++head;
if (head >= BUFSIZE) head = 0;
}

unsigned char pop()
{
unsigned char ret;
assert(tail < BUFSIZE);
ret = buf[tail];
++tail;
if (tail >= BUFSIZE) tail = 0;
return ret;
}
0862デフォルトの名無しさん
垢版 |
2017/10/15(日) 10:09:16.14ID:IWZc9Obf
単なる例なんだろうけど、バッファサイズ=255って中途半端だな。
buffer[255]にセンチネル置くんならわかるが。
0863デフォルトの名無しさん
垢版 |
2017/10/15(日) 11:47:13.03ID:uX83yxiA
>>860
片山センセイ!
unsigned char buf[BUFSIZE] = {0};
て書いてある本と
unsigned char buf[BUFSIZE] = {};
て書いてある本があるんですけど同じでしょうか!?
0865デフォルトの名無しさん
垢版 |
2017/10/15(日) 12:04:53.73ID:t/hnbV6s
>>861
というポカをするからif分で書いとけよ。
アンド演算子が使えるならコンパイラが
勝手にやってくれる。
0868デフォルトの名無しさん
垢版 |
2017/10/16(月) 06:49:20.44ID:IzFutT5/
>>856
リングバッファの容量を256バイトにして、
バッファ領域を unsigned char buffer[256] = {0}; と
ちゃんと256バイト分確保すればサイズチェックは不要になるな。

ただし unsigned char の値範囲が 0 - 255 っていう「普通」の環境であること。
char が9ビットとか16ビットの機械/コンパイラもあるんだよね。
0869デフォルトの名無しさん
垢版 |
2017/10/16(月) 07:00:03.02ID:IzFutT5/
それにしても >>856 は何やらモヤモヤするコードだと思ったら…

バッファサイズが 255 と半端な値
リングバッファのアクセス関数が push() / pop() て名前
インデクス操作が前置++
tail と head が互いを追い越す可能性(バッファあふれの可能性)

まだあるかな。
0870デフォルトの名無しさん
垢版 |
2017/10/16(月) 08:04:32.95ID:iBTaJQF1
>char が9ビットとか16ビットの機械/コンパイラもあるんだよね。
え゛?まじで
0872デフォルトの名無しさん
垢版 |
2017/10/16(月) 08:49:21.72ID:IzFutT5/
先に == 255 の判定をして 0 に戻すから
範囲外の buffer[255] にアクセスする危険があるのか。

インデクスに前置++は見慣れなくて気色悪い、じゃ済まない問題だな。
0874デフォルトの名無しさん
垢版 |
2017/10/16(月) 12:59:13.25ID:TeGVYWUh
>>870
俺も実機は見たことないけど

パーソナルコンピューターでは一般に8ビット長だが、DEC PDP-10、IBM 7090、ACOS-6の動作するNECのメインフレームなど、36ビットワードマシンでは1バイトが9ビットであり、charも9ビット長となっている。
http://www.wdic.org/w/TECH/char
0878デフォルトの名無しさん
垢版 |
2017/10/16(月) 21:01:51.62ID:JAGwlDmF
>>877
ほんとに?
0879はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/10/16(月) 21:19:32.17ID:8llzdgRf
>>870
ISO などでは 2008 年に 1 バイトは 8 ビットという定義を決めた。
http://diode.matrix.jp/LEGEND/BYTE.htm
1 バイトが 8 ビットではない (それなりに広く使われている) アーキテクチャが事実上消えたのは決め手のひとつだと思う。

C でこの定義を採用すると明記されているわけではないので、
C の言語仕様としては依然として処理系定義という扱いのはずだし、
何かの用途に特化したプロセッサでは変則的なものはいくらでもありうるんだけど、
自分で書くプログラムでそこまで想定することはまず無いわな。
0880デフォルトの名無しさん
垢版 |
2017/10/16(月) 22:10:25.19ID:7CHwAcHs
処理系を言わないならx86と勝手に解釈していい。charは8bitじゃない処理系もあるとかナンセンス。
0881デフォルトの名無しさん
垢版 |
2017/10/17(火) 00:03:46.71ID:gPfxTVwW
vector<string> a;
for(auto i=0; i<20; ++i) a.push_back(" ");
// vector<string> b;
// b.push_back(" ");
て、なんかおかしな所ある?デバッガで size がやたら大きな値になる…
下2行コメント外すと想定どおりになる…もう、わからん
0882はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/10/17(火) 01:11:42.94ID:xlsZVRp9
>>881
実際いくつになって、
自分はどういうのを想定してるのか書けよ。
俺らはお前が何を想定してるのか知らんがな
0884デフォルトの名無しさん
垢版 |
2017/10/17(火) 04:44:35.63ID:AOvKqYYR
PICはcharが6ビット。
0887デフォルトの名無しさん
垢版 |
2017/10/17(火) 09:15:45.07ID:EtZfCwzt
>>879
いや、組み込みの仕事してれば普通にあるから。
してなければ、普通に無いってのも間違いでは無いが、言い切るものでもない。
0889はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/10/17(火) 10:10:10.17ID:xlsZVRp9
>>887
それは「用途を特化したアーキテクチャ」ではなくて汎用的で広く使われているコンピュータなの?
組込み系って普通は何か用途を特化してるものと思うんだけど。
0890デフォルトの名無しさん
垢版 |
2017/10/17(火) 12:07:40.67ID:XkjDmgw/
VC で Release ビルドでデバッグトレースしてたりして
あれ、ソースレースできちゃうけど、あまりあてになんねーし
0891デフォルトの名無しさん
垢版 |
2017/10/17(火) 12:09:50.70ID:kRPJAKch
コンピューターの定義次第やな

株や証券取引に広く使われているFPGAはどういう扱いなの?
CUDAはどうなの?これらもC言語と称している言語で書くが?

この先は宗教戦争になるから止めれ
0895デフォルトの名無しさん
垢版 |
2017/10/17(火) 21:42:56.86ID:0HMqhgUO
>>889
汎用とか特化に食いついてるのではなくて、「事実上消えた」ってところと、「自分で書くプログラムでそこまで想定することはまず無いわな」の部分に食いついているんだけどね。
0896デフォルトの名無しさん
垢版 |
2017/10/17(火) 21:46:38.99ID:0HMqhgUO
組み込みの世界が特化という点は反論しないし、ぶっちゃけどうでもいい。
でも、特化してるからって、別に消えてないし、仕事で普通に気にしてるし。
0897はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/10/18(水) 02:21:26.88ID:8euWiZGY
>>895-896
「それなりに広く使われているアーキテクチャとしては」と限定して書いているのは、
そうでないアーキテクチャでは残っていることは承知しているという意味だよ。
自分ってのはまさに「私」のことなので実際気にする場面に遭遇したことがないし、
それをどうこう言われても俺に組込み系の仕事をして欲しいというのでもなけりゃ何の意味があるのかわからん。
0900デフォルトの名無しさん
垢版 |
2017/10/18(水) 05:22:14.83ID:Wqkl1Wvb
JavaやC#、その他の高級言語、スクリプト言語で済むならそこにはC/C++の出番はない。
組み込み、OS、ドライバ、ハード寄り専用言語と思っていい。
0903デフォルトの名無しさん
垢版 |
2017/10/18(水) 08:56:09.82ID:at3yxigr
>>897
特化してることと、広く使われてるって事は、互いに背反しないんだけど?
君の中では、特化=狭い、と言う定義なのなら、この話はこれでおしまいでいいよ。
0904デフォルトの名無しさん
垢版 |
2017/10/18(水) 09:00:16.16ID:at3yxigr
>>897
あともう一つ、君の今いる世界が、世間一般とは限らないから。
0905デフォルトの名無しさん
垢版 |
2017/10/18(水) 10:03:33.10ID:NAca40Iu
並行世界か。
0906はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/10/18(水) 11:38:55.90ID:8euWiZGY
>>902
「思う」とか書いてるの、感想以外の何物でもないじゃん。
書いてないことを勝手に読み取るなよ。
0907デフォルトの名無しさん
垢版 |
2017/10/18(水) 11:55:04.11ID:LfPioRS3
8bitでない処理系とかの話になるとすぐ荒れるよな
客観的に見ると、噛み付いてる組み込みの連中の方が支離滅裂だよ
脊髄反射する前に一連のレス読み直した方がいい
0908デフォルトの名無しさん
垢版 |
2017/10/18(水) 12:15:35.97ID:NAca40Iu
VSはよく出来てるからMSから取り上げて国連で管理するべき。
0909デフォルトの名無しさん
垢版 |
2017/10/18(水) 12:16:43.65ID:NAca40Iu
国連移管後のVSは戦略物資として利用者を追跡するべき。
0912デフォルトの名無しさん
垢版 |
2017/10/18(水) 15:39:35.53ID:NAca40Iu
病院に連れて行ったほうが良い。
0914デフォルトの名無しさん
垢版 |
2017/10/18(水) 21:03:18.48ID:lHCL+31V
本気でそう思うからお前らがまず受診してこいよ w
お前らの世間狭すぎるだろ
0915デフォルトの名無しさん
垢版 |
2017/10/18(水) 23:53:45.00ID:oy9jxwBz
>>879
>アーキテクチャが事実上消えた
組み込み系じゃない俺でもさすがに消えてないとは思うが、
まず基本的に1バイトの定義がはっきりして、さらにコンピュータの性能進化とともに
特殊な処理系が減っていくならそれ自体は良いことじゃねーの?
>>868辺りからの流れに対して無意味な罵倒してるのはお前らだろ
特殊な処理系を知ってるのがお前らのアイデンティティなの?ww

あと
>>895
>「自分で書くプログラムでそこまで想定することはまず無いわな」
俺もまず想定しないよ、リトルエンディアンですら気にしたことない
気にするのは必要になってからだ、まず必要にならないのに想定してコスト増やすのはただの給料泥棒
0916デフォルトの名無しさん
垢版 |
2017/10/18(水) 23:59:19.56ID:oy9jxwBz
間違えた、ビッグエンディアンだった
リトルエンディアンの環境でしか書いたことないし、俺の場合は多分今後も無いので。
0917デフォルトの名無しさん
垢版 |
2017/10/19(木) 00:31:08.38ID:4jS9VIw9
Cが使われるような用途ではバイナリレベルの話は必須のはずだが。IF仕様で必ず指定あるだろ。
0921デフォルトの名無しさん
垢版 |
2017/10/19(木) 12:45:12.45ID:hylRky7G
>>919
まあcharが8bitはまだわかるけどx86決め打ちとかあり得んよな
よほど井の中の蛙扱いされたのが悔しかったみたいだ w
0922デフォルトの名無しさん
垢版 |
2017/10/19(木) 13:08:04.36ID:Ka5Awqhg
俺は>>880じゃないし
他人のレス(>>919)を自分の煽りに利用するなクズが

ハードの制約や特殊な環境というのがCPUにしか無いと思ってる辺り、井の中の蛙はお前
手加減してやってるうちに黙るか謝れ
とっくに論破されてるだろ?
0924デフォルトの名無しさん
垢版 |
2017/10/19(木) 21:51:19.20ID:AKvCLhcx
> ハードの制約や特殊な環境というのがCPUにしか無いと思ってる
引っ込みつかなくなって話をそらそうと必死だな w
0926はちみつ餃子 ◆8X2XSCHEME
垢版 |
2017/10/21(土) 00:01:02.62ID:piER3a9b
多くの職をなるべく均等に育成する方針でいたんだけど、
まずはどれでもいいからレベル上げして高レベルの宝の地図をゲットしたら育成なんていくらでも出来るな。
完全に失敗だわ。
仕方がないのでウォルロ北東の高台ではぐれメタル相手にレベル上げしてる。
0931デフォルトの名無しさん
垢版 |
2017/10/27(金) 15:14:51.06ID:BaiBMwP3
typedef size_t size_type;
こういうコードを良く見るんですが、これは何のためにやってるんでしょうか?
0934デフォルトの名無しさん
垢版 |
2017/10/27(金) 16:29:53.23ID:8v9HsLU9
驚きの柔軟剤ふわふわファーファ。
0936デフォルトの名無しさん
垢版 |
2017/10/27(金) 21:06:52.03ID:/LUCvRWS
オブジェクトを横断して共有したい情報の保持
何個実体作ったっけ?ってカウントしたり
0937デフォルトの名無しさん
垢版 |
2017/10/27(金) 21:23:23.67ID:BaiBMwP3
型を抽象化とはsize_tをsize_typeでオーバーライドすると言う意味で
型の切り替えとはsize_tとsize_typeを使い分けるということでしょうか?
型の切り替えの意味が合っているとしたら、中身が同じものを使い分ける事なんてあるんですか?
0938デフォルトの名無しさん
垢版 |
2017/10/27(金) 21:44:14.01ID:M7vRAAca
例えば何かの都合でsize_typeをssize_tにした方がよいとなった場合にtypedefを一行変更するだけで済む
他の部分はsize_typeという型で抽象化されているから簡単に切り替えられるということ
0939デフォルトの名無しさん
垢版 |
2017/10/27(金) 23:53:57.84ID:BaiBMwP3
>>938 >>932
やろうとしてることはある程度理解できました。ありがとうございます。
でもsize_typeをssize_tにするようなことはしてないスクリプトにも、このコードは書かれています。
そういうケースに備えて念のために書いておいたほうがいいということなんでしょうか。
0941デフォルトの名無しさん
垢版 |
2017/10/28(土) 05:57:50.48ID:KtZXeElz
typedef unsigned int Uint;
typedef unsigned int MyResID;
typedef unsigned int MyID;

例えば、Uint だと意味が分からないから、
リソース番号なら、MyResID
自分のID なら、MyID
などと再定義して、用途を分けておくと、見た目にも分かりやすい

「c typedef」で検索!
0944デフォルトの名無しさん
垢版 |
2017/10/28(土) 12:16:56.59ID:5IbYoyZ3
>>941
それは見た目で用途が分かりやすいというだけでなく、ある用途の場合だけ型を変更し易いという利点が主じゃないかな?
例えばMyResIDは当初は整数で良かったけど後で文字列に変更したくなったとか。
0945デフォルトの名無しさん
垢版 |
2017/10/28(土) 12:33:49.13ID:MyIroYJQ
MyResIDは8桁の数字を取り扱うんだけど、
intが16bitの環境に移植することになった…なんて時に便利
レス数が900を超えています。1000を超えると表示できなくなるよ。