【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスや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/ >>784
初心者歓迎スレだし可能性は少なくない
GC言語で育ったならポインタをスマポのような何かと勘違いしてるかもしれない
さらにその文章から思い込みだけで検証していないのは明らかだし 可能性を言い出したらなんでもあり
不毛なレスは止めようよ >>785
>関数内のstatic変数みたいな実装してた気が
んなわきゃない shared_ptrを戻すメンバ関数があるんですが
引数の条件に一致する物が無い場合、空というのが分かるshared_ptrを返したいんです。
どう書けばいいですか? std::optional を使った方がよくない? >>788
いちいち古いVC入れ直すのめんどいから覚えてるんなら書いてほしいんだが
あと>>765が解決したのかどうかも知りたい 初心者的質問で申し訳ないですが、libファイルの検索仕方を教えて下さい。
includeファイルはgrepかければ見つかりますが、リンクするとき、静的ライブラリ、libファイルの検索はどうすればいいか分かりません。
とりあえず、怪しい奴を片っ端からリンクしますが、それもどうかと思います。
マニュアルに書いてある訳でもないので皆さまどうされてるのか気になります。 >>795
bgrep使え。リンク方法が書かれているマニュアルを買え。 ありがとうございます。
ネットで調べるのがメインなので、つい、本はケチってしまいました
bgrepは入れられないので-aでなんとかしてみます >>794
string s1, s2;のc_str()が共用なわけあるかドアホ
VC++6の時からインスタンスのメモリ返すわ いちいちけなさんと会話も出来んのかゴミクズが
へー、じゃあ寿命は保証されてるわけか、そんなことはなかったはずだが
>>765の問題は寿命の問題だと思うが、ケチつけるなら正確に書いてくれる?
混乱を招くだけのイチャモンとか何の役にも立たんわ c_strは実態をさすけど変更するなって書いてなかったっけ? 03以前は変更された後にc_str()を使うのも、そもそも内部で連続してる保証も無かったはず
今調べたけどdata(), c_str()の呼び出しでも変更される可能性があるらしい(11は大丈夫 ポインターを覚えたけど、使いどころが思い付かない
誰か教えて…… >>802
一個のサイズが10KBほどある構造体のソートにでも使えよ ポインタと整数じゃ概念が違う
整数をアドレスを指し示す用途で使いますよってのがポインタだし 変数とポインターでメモリをずっと使うか取り除くかの違い? >>802
mallocの戻り値とかsprintfの引数とかで使えばええねん みなさんありがとうございます
規模の大きいデータで使うみたいですね
後は他の関数を飛び越えてアクセスしたい時とか >>805
配列のソートだったらアドレスよりインデックスの方が概念的に適切だろ? p==p_rgh + rho*gh;
とあるのですが意味がわかりません。
p=p_rgh+rho*gh;であるべきと思うのですが、==と=が使い分けされているので
タイプミスではなさそうです。どなたかよろしくお願いします。 >>810
「p==p_rgh」は、pとp_rghが等しいとき1 (true)になり、等しくないときゼロ (false)になる。 >>810
演算子「==」より演算子「+」の方が結合が強いんだった。
「p==p_rgh + rho*gh」は、pとp_rgh + rho*ghが等しいときtrueになる。 >>810
問題のその式が、if文のカッコの中ではなく、普通に式文としてセミコロンで終わる1行として書かれているなら、ただの誤記の可能性が高いと思うよ。 >>812
ご回答ありがとうございます。が、やはりわかりません。
たとえば、
if (p==p_rgh + rho*gh)
{
…
}
や、q=p==p_rgh + rho*gh;とかならわかるのですが、
…
p==p_rgh + rho*gh;
…
と独立しているのでどんな処理をしているのか・・・ >>814
そのように独立していれば何もしない。何もしない文をわざわざ複雑に書くことは意味がないので、代入を間違って書かれたと考えられる。 operator== をオーバーロードしてたらなんかすることもあるのでは。 そのコードでググったら流体シミュレーション系のライブラリが出てきたけど
=の誤植っぽいな >>817
あるかもしれんが、それを書いた奴は底意地が悪いにもほどがあるなw パズルとか頭の体操みたいな意味では
キチガイじみた演算子オーバーロードも面白いんだけどね。
これを業界用語で
"Proving Grounds of the Mad Overload" と呼んだりする。 >>817
#define p if(0
#define gh 1) printf("あるわけねーだろ、ぼけ\n")
って定義されてるかもね >>823
常識的にはやるはずのないことを可能ではあると指摘した私への皮肉だよ >>414 の最後のコード部分からの文脈なんだけど…。
この式が何を計算するプログラムか情報が欲しいってことかな。
あるいは "pgr" や "ggrks" みたいなネットスラングと思ったのかも。 いかんいかん、重要なアンカーを間違えたわ。
もちろん 414 は誤りで 814 と書くつもりだった。
「一連の流れでの p や gh は >>814 に出てる識別子」ってことね。 http://webings.net/c/cal/
ここのソースコードをバーチャルスタジオにコピペしてビルドして実行してもHTML形式で表示してくれないんですが
HTML形式で表示するには何が必要なんですか? >>831
拡張子が.htmlまたは.htmのテキストファイルとウェブブラウザー。 >>831
そのプログラムは、ウェブサーバー側で実行されることを想定している。 >>835
ローカルでウェブサーバーを動かせばいい。 苦Cまでは勉強したんですがどういう本読めばそういうの勉強できますか? ウェブサーバーのインストールくらいは本を読まずに小学生でもできる。
ウェブサーバーについて知りたいなら「ウェブサーバーとは」で検索。
ウェブサーバー側のプログラムは、標準出力にHTMLを出力するただのコンソールプログラムか、スクリプトプログラムだ。
ブラウザーでウェブサーバーにアクセスすると、ウェブサーバー経由で出力されたHTMLが見れる。 "Content-type: text/html\n\n"
これは、httpヘッダーというものだ。これはHTMLテキスト以外にブラウザーと対話するためのデータだ。
httpヘッダーは、二つの改行コード("\n\n")で終わる決まりになっている。 ウェブについてはウェブ技術関連だから、C/C++とは別の話になる。スレ違いだから、ウェブ技術板へ行った方がいいかも知れない。 スレ違いのため、誘導します。
インターネット質問スレ64 [無断転載禁止]??2ch.net
http://mevius.2ch.net/test/read.cgi/internet/1500505753/
ここのスレでウェブサーバーとHTTPの仕組みについて質問するといいよ。 いい加減に書き込みで文字化けするブラウザなんて捨てろよ >>839
>>840
>>841
>>842
ありがとうございます
web関連の知識になるんですね
他の分野とC言語を結ぶ知識の仕入れ方って難しいですね・・・
最近DBの本を読んでますがこれと何らかの言語を結びつけるような知識の仕入れ方もよく解りません
苦C読んでさぁつぎ何読めばいいのって感じになります >>844
Web関係をやりたいのかい? WebではCはあまり使わないよ。使うなら、JavaScript, Java, PHP, Python, RoR, SQLぐらいかな。 C/C++でWebやるなら、Win32API直接叩くか、cURLのような汎用のライブラリーを使うか、SQLiteかMySQLでデータベースにアクセスするくらいかな。 >>845
webやりたいって言うか上のサイト見たいな事をC言語でもできることにびっくりしたんです Cはバッファオーバーフローが起こりやすく基本的に安全じゃない言語であり、バイナリーは、ロックの問題があり、またポータブルじゃないから、サーバー側のアプリではあまり使わない。 int c=0;
for(;;) c++;
これだけでバッファオーバーフローって起きるんですか? 無限ループだけどバッファーの確保領域を突破してアクセスするようなコードを吐き出すことは無い
と思う >>850
簡単に分かりやすい例を挙げると、外側から来た任意の長さの文字列でstrcatやsprintfなどを使うと危険。
危険な関数は使用禁止してセキュリティの強化された関数に置き換えないといけない。 だが、残念ながら、教育現場ではバッファの長さを考慮しないsprintfやstrcatを教えているところが今でもある。
標準のC言語ではセキュリティは低いと考えた方がいい。 >>850
アクセスして良いメモリ範囲を越えてしまうバッファオーバーフローと、数値型の変数で表現可能な範囲を超えるオーバーフローは別の話。
そのソースで問題になるのは後者。 ちっ、俺がstrsafeを移植しないといけないか。 >>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文なくても大丈夫ってことですか? お前の例だと255でゼロになるけど
オーバーフローの場合は256でゼロになる
よって必要 >>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;
} >>856
head &= 255; でチェック不要 単なる例なんだろうけど、バッファサイズ=255って中途半端だな。
buffer[255]にセンチネル置くんならわかるが。 >>860
片山センセイ!
unsigned char buf[BUFSIZE] = {0};
て書いてある本と
unsigned char buf[BUFSIZE] = {};
て書いてある本があるんですけど同じでしょうか!? >>861
というポカをするからif分で書いとけよ。
アンド演算子が使えるならコンパイラが
勝手にやってくれる。 >>856
リングバッファの容量を256バイトにして、
バッファ領域を unsigned char buffer[256] = {0}; と
ちゃんと256バイト分確保すればサイズチェックは不要になるな。
ただし unsigned char の値範囲が 0 - 255 っていう「普通」の環境であること。
char が9ビットとか16ビットの機械/コンパイラもあるんだよね。 それにしても >>856 は何やらモヤモヤするコードだと思ったら…
バッファサイズが 255 と半端な値
リングバッファのアクセス関数が push() / pop() て名前
インデクス操作が前置++
tail と head が互いを追い越す可能性(バッファあふれの可能性)
まだあるかな。 >char が9ビットとか16ビットの機械/コンパイラもあるんだよね。
え゛?まじで >>869
buffer[1] 〜 buffer[255] を使う
っていう大きな問題がある 先に == 255 の判定をして 0 に戻すから
範囲外の buffer[255] にアクセスする危険があるのか。
インデクスに前置++は見慣れなくて気色悪い、じゃ済まない問題だな。 >>871
buffer[1] 〜 buffer[254] までじゃね?
まあそれはそれでもやもやするけど w >>870
俺も実機は見たことないけど
パーソナルコンピューターでは一般に8ビット長だが、DEC PDP-10、IBM 7090、ACOS-6の動作するNECのメインフレームなど、36ビットワードマシンでは1バイトが9ビットであり、charも9ビット長となっている。
http://www.wdic.org/w/TECH/char >>872
危険ていうか
一周すれば確実にアクセスする
>>873
え? >>874
char16bitならもうちょっと身近に >>870
DSPとかだと40bitなんてのもあるよ >>870
ISO などでは 2008 年に 1 バイトは 8 ビットという定義を決めた。
http://diode.matrix.jp/LEGEND/BYTE.htm
1 バイトが 8 ビットではない (それなりに広く使われている) アーキテクチャが事実上消えたのは決め手のひとつだと思う。
C でこの定義を採用すると明記されているわけではないので、
C の言語仕様としては依然として処理系定義という扱いのはずだし、
何かの用途に特化したプロセッサでは変則的なものはいくらでもありうるんだけど、
自分で書くプログラムでそこまで想定することはまず無いわな。 処理系を言わないならx86と勝手に解釈していい。charは8bitじゃない処理系もあるとかナンセンス。 vector<string> a;
for(auto i=0; i<20; ++i) a.push_back(" ");
// vector<string> b;
// b.push_back(" ");
て、なんかおかしな所ある?デバッガで size がやたら大きな値になる…
下2行コメント外すと想定どおりになる…もう、わからん >>881
実際いくつになって、
自分はどういうのを想定してるのか書けよ。
俺らはお前が何を想定してるのか知らんがな >>881
size関数のアドレスを表示しているとエスパーしてみる ■ このスレッドは過去ログ倉庫に格納されています