- 1 名前:デフォルトの名無しさん [2012/01/13(金) 22:05:06.14 ]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 94 toro.2ch.net/test/read.cgi/tech/1324648274/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 155代目 toro.2ch.net/test/read.cgi/tech/1325685876/ ★C++言語については避けてください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 長くなりそうなコードはcodepadに貼り付けてもいいでしょう codepad.org/
- 756 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 02:11:23.51 ]
- >>755
ありがとうございました
- 757 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 07:11:53.75 ]
- >>753
>pが新しいアドレスに移っているということですね この表現の意味がわからない。 ポインタといっても通常の変数と変わらない。 mallocの戻り値を保持しているだけだよ。 ついでにリスト構造について、根本的に理解ができていないと思われる。 ポインタpに対してp++すると、pが指しているオブジェクトサイズ分値が増える。 配列の場合はメモリ上に稠密にデータが確保されているため、配列の次の要素を 指すことになる。リストで次の要素を指すためにはp = p->next;とすることになる。
- 758 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 17:45:05.28 ]
- #include <stdio.h>
char strput(char *str){ while(*str){ putchar(*str); *str++; } } int main(void){ char str[20]; scanf("%s", str); strput(str); } これは入力した文字を出力するプログラムなのですが、 6行目の「*str++」について疑問があります もちろん、コンパイルすればエラーも出ずに結果も正常なのですが 「*」がない「str++」にしても同様にできました そこで「*」がいるのかいらないのか分かりません つける必要はないんでしょうか?
- 759 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 17:46:21.32 ]
- ない
- 760 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 17:48:00.12 ]
- 何のためにつけるか、考えようね
- 761 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 01:22:28.75 ]
- 整数は大丈夫だろうけど、
浮動小数点数の演算結果って、 CPUによって違ったりしたりする? i7, i5 と比べて ATOM とか、 FX, A と比べて E, C とか、 後者は演算ユニットが128ビットと64ビットで差があったりするんだが。
- 762 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 01:26:59.68 ]
- >>758
#include <stdio.h> // printfなどの定義 char strput(char *str) // *は、strがポインターであることをコンパイラに指示する { while(*str) { // *strは、strが指す位置の文字データ内容 putchar(*str); // 文字を出力 str++; // ポインターの値を+1する。データを書き換えるわけではないので*は不要 } } int main(void) { char str[20]; scanf("%s", str); strput(str); }
- 763 名前:デフォルトの名無しさん [2012/01/29(日) 01:50:14.07 ]
- C言語に詳しい人に質問です。
p は構造体へのポインタです。 *((int *)((char *)p - sizeof(int))) だとか *((char *)p - sizeof(int)) といったかんじのコードをみかけるのですが、 これって何を意味しているのですか?
- 764 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 03:28:13.08 ]
- *((char *)p - sizeof(int))の場合。
pには構造体の配置されてるアドレスが入っている。それをたとえば123456番地とする。 sizeof(int)は4バイトとすると 123452=123456-4番地を文字としてみたときの0-255のいずれかの値を表す。
- 765 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 03:32:51.06 ]
- 初心者っぽいので。
char p[]="abcxyz";とすると、p+3は文字列"xyz"の先頭アドレスだったり、*(p+3)はxを表したりする。 この操作と同じ。これがわかり無くそうになってだけで同じだ。
- 766 名前:763です [2012/01/29(日) 04:37:03.22 ]
- 764さん, 765さん
ありがとうございます。 構造体の配置されているアドレスであるpからtypeof(int)を 引いたアドレスにはどんな意味があるのでしょうか? ここを参照してintやcharとしての値を取得する目的があるのでは ないかと思うのですが...
- 767 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 05:01:34.61 ]
- >>766
それはその通りだけど、その場所に何が入っているかなんてCでは決まっていない。 環境またはそのプログラムが何かを入れているのだろうとしか言えないな。
- 768 名前:763です [2012/01/29(日) 05:15:59.87 ]
- >>767
たとえば、 C++の例ですが ttp://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=287 には、 int sz= *(((char *) p)-sizeof (int)); がnew XXX [size] したときのsize と関係があるようなことが 書いてあります。 環境依存かもしれませんが。
- 769 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 05:37:50.44 ]
- 一部しか読んでないけど。
new された配列 char p[N] について。 C++ では new された配列は delete [] p; といったように書く。 delete [] のようにした場合、その配列の要素分だけメモリから開放するわけだが、 その要素数は、p の sizeof(int) 分手前に格納されている。(環境依存のはず)
- 770 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 05:49:41.03 ]
- 【中国BBS】2030年に韓国が日本を抜く? 反対意見が多数
中国大手検索サイト百度の掲示板に、「2030年に韓国のGDPは日本を追い越すって本当?」というスレッドが立てられた。 これに対して反対意見が多数寄せられている。 ● スレ主:八戒窘6 アジア開発銀行のデータによれば、2030年に韓国のGDPは日本を追い越すらしい。 ● せんとう どんな予測も多少なりとも正確ではない所があるが、今回の話はあり得なさ過ぎる。 ● satay醤 本当にデタラメだな。アジア開発銀行によるレポートだって?じゃあバンク・オブ・アメリカや欧州の銀行の結論はどうなのよ? ● 佚名野菜地 アジア開発銀行ってのは、韓国人が開いているのか? ● Joseph19969 俺の妄想では、2100年日本人の1人当たりのGDPは46万ドル、韓国は8万だな! ● o落葉不知秋o その頃までに韓国という国が残っているかどうかも分からないぞ。 ● 梨花陰凉 死んでも信じない。 ● MakiのLove なんか最近、韓国のニュースが多くね? news.searchina.ne.jp/disp.cgi?y=2012&d=0128&f=national_0128_091.shtml
- 771 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 06:57:55.48 ]
- >>768
その記事にも「典型的な実装では」て断って書いてあるだろうが。
- 772 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 07:19:31.51 ]
- >>768
念のため、配列の先頭よりも前をさすような減算を行ったばあいの動作は未定義 あと、配列の最終要素の次をさすまでは合法だけど、内容を取得しようとしたときの動作は未定義
- 773 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 10:53:23.43 ]
- >>759,760,762
意味を理解しながら勉強していこうと思います ありがとうございました
- 774 名前:763です [2012/01/29(日) 11:49:16.47 ]
- >>769,771,772
ありがとうございます。
- 775 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 16:16:16.16 ]
- オレC言語だけど今日は忙しいのでもう閉店ね。
また明日来て下さい。
- 776 名前:デフォルトの名無しさん [2012/01/31(火) 16:32:48.21 ]
- aとbは真偽値を取る変数なんですが、
!(a && b) という式を||の式に変換すると、 (a == 0 || b == 0) という式で合ってますでしょうか? ド・モルガンの法則でぐぐって一応確認しました
- 777 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 16:36:40.26 ]
- あってるけどなんで( !a || !b )にしないんだろう
- 778 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 16:39:46.26 ]
- >>776
NANDゲートか。 www.allaboutcircuits.com/vol_4/chpt_3/5.html
- 779 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 18:17:39.94 ]
- ありがとうございました
!aだとよくわかんないので、 他人のソースを書きなおす作業をしてます
- 780 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 18:19:49.06 ]
- たまにそういうやついるよね。
なんか間抜け。
- 781 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 18:54:03.42 ]
- fuckな話をすれば、
0とか1とかアフォなことは書かず、FALSEとかTRUEとかにしろ
- 782 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:00:17.31 ]
- どちらかというと後者の方がアホに見えるけどな。
- 783 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:40:46.96 ]
- >>776
わざわざなんちゃらの法則だしたり2ちゃんできかないと答えに自信が持てないような難易度か?
- 784 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:44:35.50 ]
- こんな質問で俺様理論を展開するお前らにあきれた
- 785 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:50:27.65 ]
- ん?俺様理論てのは>>781だけじゃないのか?
- 786 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:29:47.10 ]
- >>781
Cの場合、FALSEは0のみだからいいにしても、TRUEは0以外があてはまるから そんなことするとわけのわからないバグに悩まされるだけだよ。 >>783 わざわざ出すとか以前に、ド・モルガンの法則なんて基本中の基本だろ。
- 787 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:33:08.92 ]
- TRUEが0のばあい
FALSEは-1じゃなかったっけ なんかどっかでみたことあるよw
- 788 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:34:26.93 ]
- hoge_p() == TRUEとかやってバグったことあるよな。
- 789 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:36:58.60 ]
- これがmalloc/free論争と対を成すboolean論争か
- 790 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:38:47.89 ]
- >>787
違う。 >>789 論争にもなっていない。
- 791 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:39:10.55 ]
- C言語ならゼロか非ゼロしかねーよ
- 792 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:39:50.47 ]
- #undef TRUE
#undef FALSE #define TRUE 0 #define FALSE (!TRUE)
- 793 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:40:02.15 ]
- ((!!(a=2))==true)が絶対trueに成ればいいんだけど
そもそもCに即値trueなんて無いしな
- 794 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:40:53.55 ]
- どんどんわけのわからないレスが増えていくなw
- 795 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:41:49.09 ]
- >>776みたいに0と比較するのは良かったはず
- 796 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:42:29.40 ]
- なぁ、自信がないならわざわざ発言しなくていいんだぞ?
- 797 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:43:06.48 ]
- 絶対大丈夫だよ(俺の脳内世界では)
- 798 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:43:19.44 ]
- >>792
こいつ殺したくなった。コード見て殺意がわいたのは ↓これ書いた奴についで二人目だ。 #define void int
- 799 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:44:24.02 ]
- 通報した。
- 800 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:44:36.06 ]
- 昔はしょうがなかったんだよ
voidなんてハイソな予約語なんか無かった
- 801 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:45:23.72 ]
- #define TRUE (1==1)
#define FALSE !TRUE
- 802 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:47:01.44 ]
- 正解書いとくか
#define TRUE (!0) #define FALSE (!TRUE)
- 803 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:49:52.46 ]
- 正解なんてないんだよ。
何か型を導入したいならそのルール前提記述するしかない。 ルールを強制するならこれでいい。 typedef enum { false, true } bool;
- 804 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:57:41.07 ]
- !aとか!bとか書くことになるなら、a,bに入れるときに真偽値を反転させとくのがよい
a=(1==1)だったのならa=(1!=1)にする でそのまま条件式に使えば真偽値の値がなんなのかなんて気にしなくて済む
- 805 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:59:44.13 ]
- >>803
普通に整数書いてもコンパイル通るからあんまりありがたくない
- 806 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:00:07.89 ]
- !aは別にいいんじゃね
個人てきにはa==0より!aのほうが分かりやすいと思う
- 807 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:01:35.73 ]
- >>805
だからCならルールを強制するしかないと言ってるだろ。 defineでも同じだろ。
- 808 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:02:57.15 ]
- そして僕はそっとタブを閉じた
- 809 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:31:12.05 ]
- そこで私はブラウザのトップ画面をこのスレにしておいた。
- 810 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 22:03:47.30 ]
- a==0の方がわかりやすいが、自分でコードを書くなら!aかな。
- 811 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 22:06:45.51 ]
- !810
- 812 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 22:09:36.68 ]
- 論理値で扱うものなら!、そうでなければ==0。
それだけだろ。
- 813 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 22:22:54.15 ]
- そのとおり
- 814 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 22:31:12.11 ]
- C言語の仕事なんてほとんどないってほんと?
- 815 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 22:52:21.60 ]
- 組み込み系はガチC全盛なんじゃないか?
他はC++なら聞くがCってのは聞かないな
- 816 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 23:07:03.26 ]
- 組み込みでCで仕事してるよ
今のところC以外に移りそうな様子は微塵もないな
- 817 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 23:07:48.32 ]
- ああ、でもCのコードを自動生成する方向には向かうかも
- 818 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 23:26:15.60 ]
- >>816
組み込みって何? TVだと思いっきりC++だったな。
- 819 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 01:36:38.40 ]
- 「携帯電話や自動販売機などの組み込み機器(中略)
組み込みシステムのソフトウェア開発には、C言語が主に使われています」 H8で学ぶマイコン開発入門(2):組み込みソフトウェア開発はC言語が主流だ (1/3) - @IT MONOist monoist.atmarkit.co.jp/mn/articles/0610/12/news142.html
- 820 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 08:16:11.14 ]
- >>818
携帯もC++でやったことがある。
- 821 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 10:26:44.02 ]
- >>818
組込みってもPICマイコンの電子工作から産業機械の制御まで幅広いからな。。。
- 822 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 10:53:03.24 ]
- 組込系おもしろそう。どこで求人してるんだ?ないよ?
- 823 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 11:09:21.30 ]
- 組み込み 求人 でググレカス
- 824 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 11:34:15.45 ]
- 結局組み込み以外、Cの使い道はないんですね。
- 825 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 11:45:01.82 ]
- 2chで世間が判った気になるなよw
- 826 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 11:47:10.58 ]
- >>819
ちょっwww それ2006年の記事じゃんw 古っ
- 827 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 11:47:16.09 ]
- >>824
高級言語の拡張とかにも使われる
- 828 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 11:52:28.64 ]
- マイコン用にCで書いてるけど、
プロトタイプ無しで呼べるとか 違う型のポインタが暗黙に変換できるとか 負の資産を感じる。 classとかtemplateとか使いたい訳じゃないが CソースもC++コンパイラでコンパイルしたい。
- 829 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 12:44:39.39 ]
- >>828
コンパイラが使いにくいとかの理由?
- 830 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 12:55:16.29 ]
- C++じゃなくて純Cの環境だからC++の環境でコンパイルしたいってことだろ
純Cの仕様はかなり緩いところがあるから、ミスを誘発する…と
- 831 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 13:00:50.75 ]
- それじゃあそういうコンパイラをCとかで書けばいいじゃん
Cにこだわらなくてもいいな、lispやらperlやらでもかけるぞ
- 832 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 13:43:55.29 ]
- gccで最も厳しいチェックをするようにして凌いでた事もあったが、最新の組み込みは複雑化してるんだろうなあ。
- 833 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:12:53.12 ]
- VisualStudio でCのソースをビルドすると、入出力関数を_s付きのセキュアな関数に
置き換えることを検討しろって出るんですけど、標準入出力関数って、あぶないの?
- 834 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:15:11.72 ]
- とっても。
- 835 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:17:19.17 ]
- 文字列用のバッファに起因する脆弱性をついたものとか結構あったじゃないか
- 836 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:26:42.38 ]
- (σ・∀・)σゲッツ!!
- 837 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:28:52.87 ]
- なんで標準の関数を安全にしないの?
- 838 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:29:44.43 ]
- またまたまた ホモキタ━━━━━━(゚∀゚)━━━━━━ !!
- 839 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:37:32.19 ]
- 標準の関数を安全にしようとすると、今までのコードを変更させなければならなくなる
- 840 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:41:30.54 ]
- セキュア関数は脆弱性を減らすだけだから、攻撃への対処はやはり必要。
- 841 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:43:38.68 ]
- ナイフをむき出しで売ってて取り扱い注意だったのが
鞘付きのバージョンが用意された、くらいだな。 ちゃんとした使い方しないと危ないことに変わりは無い。
- 842 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 15:09:04.31 ]
- わかったようなこと書くなw
- 843 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 16:50:08.80 ]
- 低能のたとえ話は意味不明だな。自分ではうまい事言ったつもりなんだろうな。
- 844 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 16:58:40.68 ]
- 841ではないが、意味不明ではないだろ。塚、理解力ないのか?
- 845 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 17:04:36.96 ]
- 意味が通じるのはすでにわかってる人だろう
すでにわかってるんだから意味が無い
- 846 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 17:08:20.21 ]
- じゃあなんで脆弱な標準関数を放置してるんですか?
- 847 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 17:09:31.60 ]
- >>846
別の言語使えや
- 848 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 17:11:32.51 ]
- >>846
>>839
- 849 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 17:12:49.76 ]
- C# って、(C++)++ってことなんですか?
- 850 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 17:55:17.44 ]
- ちがうよ
++をくっつけてちょっとおしゃれに斜めに配置しただけじゃないの? もしくは音楽で#は半音上げるだからそこからきてるなかも だとすると++は1上がるけど#は0.5しか上がらないから C<<<<C#<<<<<C++ つまりC++には敵いませんという意味の謙虚なネーミングだな
- 851 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 17:57:04.36 ]
- >>846
脆弱性があるだけで使っちゃダメなわけじゃない 勝手にかえられて勝手に速度が下がるとか勘弁願いたい
- 852 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 18:07:13.92 ]
- g++を移植する、とか
- 853 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 19:43:11.75 ]
- ウィンドウズの旗のイメージね
■■ ■■
- 854 名前:デフォルトの名無しさん [2012/02/01(水) 20:07:54.57 ]
- C++-1+2 てとこかな、現状
- 855 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 20:25:42.76 ]
- それはc+2になると思うが、何の話だ。
- 856 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 20:27:11.30 ]
- もう 起動言語C+++ トリプルインクリメント とかいうアニメでも作っちゃえよ
|

|