【初歩】mac OSXでC言語マスターするスレ【基本】
1 :
名称未設定 :
02/08/31 04:04 ID:ArR7U1d8 cocoaアプリを開発したいけどobject-cどころかC言語もわからない! object-cには興味無いけどC言語はやってみたい そんな人の為のスレです僕も初心者なので皆で頑張りましょう
2 :
1 :02/08/31 04:04 ID:ArR7U1d8
3 :
1 :02/08/31 04:05 ID:ArR7U1d8
4 :
1 :02/08/31 04:05 ID:ArR7U1d8
/Developer/Applications/まで行ってProject Builderをダブルクリック ファイル→新規プロジェクト→toolのStandard Toolをクリックして次へ プロジェクト名と保存場所を適当に決めて完了をクリック Sourceのmain.cを色々いじってみたらいいそうです。 また、日本語は使えませんがターミナルを使うこともできるそうです ↑これは僕にはわかりません。わかる方がいらっしゃったら教えてください では神の降臨も期待しつつ頑張りましょう
5 :
1 :02/08/31 04:06 ID:ArR7U1d8
6 :
1 :02/08/31 04:07 ID:ArR7U1d8
うわぁぁぁん また失敗だよ・・・。 ・Cプログラマ必読 ・プログラミング言語C(通称 K
7 :
1 :02/08/31 04:07 ID:ArR7U1d8
8 :
名称未設定 :02/08/31 04:09 ID:ArR7U1d8
>>3 ,5,6では
Cプログラマ必読 プログラミング言語C 通称 K
9 :
1 :02/08/31 04:11 ID:ArR7U1d8
10 :
名称未設定 :02/08/31 04:18 ID:RMKefBt8
11 :
名称未設定 :02/08/31 04:31 ID:uxy1liz6
>>1 よ、なぜこんなに必死なんだ。プログラム板でやりなさい。
12 :
名称未設定 :02/08/31 06:47 ID:TlIKAtA9
>1 とりあえず、Terminal立ち上げて > man cc ってやってみれ。 純粋にC言語の勉強だけならこれで十分。
13 :
名称未設定 :02/08/31 12:08 ID:EKt0y9ZT
| また、日本語は使えませんがターミナルを使うこともできるそうです そんなことありませんよ。日本語使えます。 ジャガーのTerminalか、JTerminalで。
14 :
名称未設定 :02/08/31 12:49 ID:MLyfthYo
MacJPerlは テキストエディタで書いて 読み込ませて実行させるだけで簡単なんだけど C言語っていうとなんか実行させる段階が難しそうでなあ ビルドって何よって感じ
15 :
名称未設定 :02/08/31 12:59 ID:zwCmpqmX
なんか(・∀・)イイ!な。ココ。 ちょうどC言語勉強してみたかったし。
16 :
名称未設定 :02/08/31 13:01 ID:78Izu6LE
>1 このスレは歓迎だ。 ただ、頼むからObjective-Cと言ってくれ
17 :
名称未設定 :02/08/31 13:02 ID:UnJT/ltd
>>1 12いうとうり調べる。おお、MacOSX10.2からは本当に
man gcc
で説明でるし。
コーディングって文法知ってるとかプログラムしってるとか
って必要だけど、様はサンプルとヘルプが大切で、これを理解
できるなら、自然とコーディングできるさ。
ソースを書くより調べものの時間がかなり長い。
『プログラムする』とは『調べる事』なのか???
って思っちゃうほど時間かかる。
(調べるのがヘタクソってのもあるけど、勘弁してくださいな)
18 :
名称未設定 :02/08/31 13:02 ID:XoLVKDM1
19 :
Undwerworldのチケとれたか? :02/08/31 13:04 ID:TBvUCa0F
Cもいいいけど、JAVAもね。でもC++もやり鯛
20 :
名称未設定 :02/08/31 13:08 ID:MLyfthYo
Perlで組んだものにGUIをつけたりってできるんですかねえ
21 :
名称未設定 :02/08/31 13:10 ID:jj3897l6
22 :
名称未設定 :02/08/31 13:11 ID:UnJT/ltd
ほ、ほんとだ!(ニコ!) object-cになってる(ニヤリ☆) ところで、全然関係ないけど、 MacOSX10.1(だったか?)からObjective-C++って あるけど、これはどんな時にやくにたつの? いろいろ調べてみると、Objective-Cで十分事足りるって ことがよく書いてあるんだけど。じゃ、Objective-C++なんて いらんじゃん、っておもってしまうんだけど。 ま、もともと、俺はWindowsデベロッパだったのでC++知ってて、 途中からObjective-Cはじめたから別段変、って感じる事がないけど、 やっぱ、Objective-C++っていらないのかな、うん。 なにやら面白そうなんだけどなぁ。
23 :
名称未設定 :02/08/31 13:16 ID:UnJT/ltd
>>20 やってできない、ということはないとおもうけど、
それ本気でやりたいなら、WindowsのDCOMか、
.net周りを調べると良いかもよ。
⇒DCOM(C++)
⇒.net(C#)
24 :
名称未設定 :02/08/31 13:18 ID:yQoO1xjc
25 :
名称未設定 :02/08/31 13:21 ID:hcn35oC3
>>1 ありがとう。ときどき来て勉強させてもらいます。
26 :
名称未設定 :02/08/31 13:26 ID:zwCmpqmX
>>1 の考えは、
C言語をマスター → Objective-Cをマスター → Cocoaでアプリ製作 → ?
なのでは?
27 :
名称無設定 :02/08/31 13:27 ID:W7n/B+af
>>22 >MacOSX10.1(だったか?)からObjective-C++って
>あるけど、これはどんな時にやくにたつの?
C++からの移植。
MVCだったら、Modelにラッパをかぶせて、中身はC++のままとか。
ControllerからのModelの呼び出しをC++にしてModelはC++のままとか。
あと、C++のクラスライブラリを使うとかね。
28 :
名称未設定 :02/08/31 13:27 ID:jj3897l6
29 :
名称未設定 :02/08/31 13:32 ID:ksj6iVmE
30 :
名称未設定 :02/08/31 13:34 ID:MLyfthYo
>>28 Thanks,まあCやりたいんですがperlみたいにメモリ領域とかポインタとか気にしない方が楽なんで
31 :
名称未設定 :02/08/31 13:39 ID:ksj6iVmE
32 :
1 :02/08/31 14:08 ID:vNycINLs
本当だ。object-cじゃなくてobjective-cですね 何かこういう間違え多いなぁ・・・・。 この前までputsを”プッツ”って読んだり・・・ 本当は”プットエス”ですよね。 とにかく僕はこれくらいのレベルってことです あー一気に駄スレぽ・・・。頑張ります。
33 :
名称未設定 :02/08/31 14:55 ID:qqId/m2O
34 :
名称未設定 :02/08/31 15:06 ID:8mC+l3BV
>>30 そんなあなたにはJavaがピッタリです♪
CocoaやQTも使えるし。
35 :
名称未設定 :02/08/31 15:10 ID:8mC+l3BV
>>1 ちなみにTerminal を使う場合は
自分の $HOME に test.c という名前でソースファイルを置いてから
Terminal のウインドウを開き、
% cc test.c
(% の入力は不要)
これでコンパイルします。
すると a.out というファイルが生成されるので、
% ./a.out
(% の入力は不要)
これで実行されます。
36 :
1 :02/08/31 18:51 ID:cAWEbSer
今髪を切ってきてついでに大きな本屋でCの本を買ってきました
今までwebをあさっていたけどこれからはこの本を参考にしようと思います
とりあえずこの本に乗ってるソースコードを
>>35 さんの
やりかたで実行してみます
レスを付けてくれた方本当にありがとうございます
頑張ります!
どうやらprintfやscanfを関数と言うみたいですね
そしてprintfは数をモニタに出力する関数で
scanfは入力するための関数ですよね?
とりあえず本を読んでこれくらいは理解できました
37 :
名称未設定 :02/08/31 18:57 ID:SaoktCL1
あと、ccコマンドで出力されるファイルの名前を変えたい場合は-o オプションな。 # cc -o hoge hoge.c でhogeに実行モジュールができる。 実行は./hogeね。 いちいち./をつけるのが嫌なら.tschrcでもいじくってパスにカレントディレクトリを 入れること。
38 :
1 :02/08/31 19:06 ID:cAWEbSer
>>37 すみません 何のことだかさっぱりわからないので今から試してみますね
とりあえず先ほど
>>35 さんに教えて頂いた方法ではちゃんとできました
こんなど素人にかまって頂いてありがとうございます
39 :
1 :02/08/31 19:14 ID:cAWEbSer
とりあえず今試してみました 今までは #include <stdio.h> int main (void) { printf("%n\n", 15 37); return(0); } をhoge.cと言う名前でHOMEに保存してターミナルを開いて cc hoge.cと入力する→a.outと言うファイルが作成される ターミナルで ./a.outと入力すると52と出力されました ↓↓↓↓ それをhoge.cと言う名前で保存した後ターミナルを開き cc -o hoge hoge.cと入力したら hogeと言うファイルが作成されたので ./hogeと入力すると やっぱりちゃんと52と出力されました これはすごい便利ですね ありがとうございます けど\n と入力したらたまに文字化け?することがあるんですよ・・・。 acii配列のキーボード買ってこようかな・・・鬱ぽ
40 :
1 :02/08/31 19:15 ID:cAWEbSer
あれ、”+”が表示されてない・・・cocomonar全然だめぽ・・・
41 :
名称未設定 :02/08/31 19:31 ID:C/cD4d7a
ちなみにTerminal を使う場合は 自分の $HOME に test.c という名前でソースファイルを置いてから Terminal のウインドウを開き、 % cc test.c (% の入力は不要)
42 :
41 :02/08/31 19:32 ID:C/cD4d7a
>>41 ごめんなさい。。間違えて、送信しちゃいました。。
43 :
名称未設定 :02/08/31 19:36 ID:2s+V5GTS
cygwin以下だな…。
44 :
名称未設定 :02/08/31 19:41 ID:9gR50IPl
Oh- 俺が今日からC始めようとしたら、ちょうどこのスレ があったよー。うれしいから記念真紀子
45 :
名称未設定 :02/08/31 19:47 ID:9gR50IPl
46 :
名称未設定 :02/08/31 19:53 ID:cWw3AsiN
取りあえず、
>>1 はここもなスレにバグ報告をして下され。
47 :
名称未設定 :02/08/31 20:06 ID:UnJT/ltd
初めにターミナルで実行できるようなの作ってみてそれをCocoaに移植、 なんてのも良いかもね。 たとえば、数字2つをとってきて、足した結果を出力するようなのね。
48 :
名称未設定 :02/08/31 20:20 ID:UnJT/ltd
たとえば、 #include <stdio.h> int main(void) { int m,n,nAdd; //初期化 m = 0; n = 0; nAdd = 0; //出力と入力 printf("put number1 : "); scanf("%d",&m); printf("put number2 : "); scanf("%d",&n); nAdd = m+n; //結果の出力 printf("%d + %d = %d\n",m,n,nAdd); return 1; } なんてのしてみるとかさ。ソクセキで作ったんで動くかどうかはしらんけど。
49 :
15 :02/08/31 20:25 ID:zwCmpqmX
>>48 おぉ。この程度なら漏れでもワカル!
さっそく、入力してビルドしてみますだ。
50 :
名称未設定 :02/08/31 20:28 ID:UnJT/ltd
で、バグがでたら、どうしてでたかを調べ、バグを潰す、それがコーディング
さぁ!
>>27 27さん、ありがとです。かなりスレ違いな質問に返事もらえてうれしいです。
なるほど、移植のときか。そりゃそうだな。うん。
51 :
名称未設定 :02/08/31 20:33 ID:sEjDIwYb
まだ、Cした事がありません。
52 :
1 ◆ZMVdytmo :02/08/31 20:57 ID:cAWEbSer
トリップつけました 僕はやっとprintf scanf putsを覚えました 今日はもうちょっとやったら寝ます
53 :
15 :02/08/31 21:02 ID:zwCmpqmX
>>50 ちゃんと動きますた〜。
エラーが3度ほど出ましたが、全部自分の入力間違えでした。(汗)
思ったよりおもしろいな。C言語。
54 :
名称未設定 :02/08/31 21:14 ID:yQoO1xjc
す、すごい! 画期的なスレだ。 1000いく頃にはどのくらいのレベルまで達しているか・・・
>>37 氏はわかって書いてるのかもしれんがカレントディレクトリにパス設定す
るのはセキュリティ問題発生させるからやっちゃだめですよ。
初心者はあまりdotfile作成しない方がよいです。
>>45 Emacs最高...と言ってみるテスト
>>53 ちゃきちゃきすすめてみましょうね。
とりあえずC標準関数一覧です。
http://cham.ne.jp/piro/p_stdfunc.html #include <stdio.h>
の意味を理解しとくとよいかも。。
勉強進んできたら一度stdio.h内も覗いてみるとよいよ。
もしかしたらポインタの部分で一度つまずく可能性ありますが、くじけないでくださいね!
>>48 ちなみに移植性を考慮する場合はコメントに // を利用するのは避けるべきで
す。
// はC99というCの最新規格でしか標準でないので。。普通は動作しますので
勉強時にはいいですが配布物および、仕事の時とかは注意しないとだめっすよ。
57 :
名称未設定 :02/08/31 21:26 ID:UnJT/ltd
>>56 へ〜そうなのか。俺、WinとMacしかいじった事ねーから、
気が付かなかったぜ。
/* */
の方がいいのかな?
おぼえとかなきゃ。
58 :
15 :02/08/31 21:38 ID:zwCmpqmX
>>55 少しづつがんばってみますね。
それにしても関数多いなぁ・・・。
とりあえず、今日のところはオヤスミです。
59 :
名称未設定 :02/08/31 21:43 ID:UnJT/ltd
>>55 ポインタ・・・確かにCで大きな山の一つですな。
60 :
名称未設定 :02/08/31 22:21 ID:86IVHTU9
ポインタはアセンブリやった方が理解しやすい。 アドレス0x12345678からshortの値を取り出す。 <asm> lis r3,0x1234 ori r3,r3,0x5678 lhz r3, (0)r3 <C> r3 = 0x12345678; r3 = *(unsigned short *)r3;
61 :
名称未設定 :02/08/31 22:31 ID:0626ywR9
>>60 気持ちは分かるが初心者スレでCじゃない言語持ち出して記述しても混乱させるだけだと思われ
62 :
名称未設定 :02/08/31 22:54 ID:L2nWiNfp
Cのポインタは分かりずらいね。 乗算と同じ記号にしたのは犯罪的、別の文字使ってくれよ。(ベーシックのPOKE、PEEKは分かりやすい。)
63 :
1 ◆ZMVdytmo :02/08/31 23:01 ID:cAWEbSer
さっきもうちょっとで寝るとか言ってましたが もうちょっとやることにしました 先ほど上の方で紹介されていたmiと言うエディタを使ってみました これ結構便利ですね 今までtexteditでしたが早速チェンジしました ただちょっと文字のサイズが小さい・・・設定いじってきますね 僕は8 8が16と出力されて喜んでいる状況です これからprintfの変わりにputsを使ってみます どうやら本によるとprintf関数は多機能らしいです みなさんも頑張ってますか?
64 :
名称未設定 :02/08/31 23:21 ID:ksj6iVmE
cocoaの世界に閉じている限りは 積極的にポインタをいじらなくても生きて行けるんじゃないだろうか。 無理だろうか。 いや、結局は理解してないといつかはハマる事になるんだろうけど。
65 :
名称未設定 :02/08/31 23:32 ID:cFmbqjfd
>(ベーシックのPOKE、PEEKは分かりやすい。) ななな懐かしいなあ
66 :
名称未設定 :02/08/31 23:43 ID:qWm5wp14
明解C言語 入門編 柴田望洋著(ソフトバンクパブリッシング) これが一番オススメの参考書。
67 :
1 ◆ZMVdytmo :02/08/31 23:49 ID:cAWEbSer
>>66 やった!当たりを買いましたよ!
説明がわかりやすくていいですよね。
ところでちょっと疑問が出たので質問させて下さい
#include <stdio.h>
int main(void)
{
int no;
printf("no is ? " );
scanf("%d",
68 :
1 ◆ZMVdytmo :02/08/31 23:50 ID:cAWEbSer
うわ・・・cocomonarだとまた切れてる・・・ ちょっとIEで書き直してきます
69 :
1 ◆ZMVdytmo :02/08/31 23:55 ID:cAWEbSer
すみませんお待たせいたしました #include <stdio.h> int main(void) { int no; printf("no is ? " ); scanf("%d", &no ); printf("no is %d \n", no); return(0); } これを実行すると no is ? 11(←この11は自分で入力) no is 11 (←自分で入力した数が表示されます) と、こうなるんですが、これは int no;と宣言してますよね これと全く同じに動作してなおかつ int no;という宣言なしで printfとscanfだけを使って書けるんですかね? 自分でやってみたらエラーが頻発してできなかったんです やっぱり無理なのかな?
70 :
名称未設定 :02/09/01 00:04 ID:99owantu
>>69 printf("no is %d \n", scanf("%d"));
みたくしたいってことかなぁ?違ってたらごめんね。
この場合だと、scanf()の戻り値がint型だからてっきり、
入力された数字がかえってくるような気がするけど、この
intって別の戻り値だとおもうぜー。
調べてみたらこの戻り値のintは入力された『数字の数』らしい。
こういう意味じゃないとすると、うーん、多分もう知ってるとはおもうけど、noってint型で宣言されてるじゃん。
宣言しないと、データ納める箱がないでしょう。きついような気がするなぁ。
71 :
1 ◆ZMVdytmo :02/09/01 00:11 ID:A+GdAdOW
>>70 えぇと、そうですよね。僕も必死に悩んだけど実は
これ無理っぽいですよね。けど柴田望洋さんの明解C言語には
printf関数やscanf関数は多機能だから少しずつ説明してゆくと
書いてあるんですよ。僕がもっと成長したらこの謎もわかるかもしれません。
とりあえずやっと一歩踏み出したってレベルなので(汁
今 キーボードで入力した数に10足して出力されるプログラムをやっています
72 :
名称未設定 :02/09/01 00:12 ID:DBwDFedT
おいらもmiで書いてTerminalでコンパイルして遊んでます。 だからage!
73 :
名称未設定 :02/09/01 00:15 ID:99owantu
>>71 わりーな、なんかやり方はあるんだろうけど、俺はおもいつかねーわ。
グローバル変数でもつかってんかな。どれどれ調べてみるか。
いいねいいね、どんどん組んでいくってね。
74 :
名称未設定 :02/09/01 00:21 ID:99owantu
>>71 ”<”とか、”>”を使うってことかもしれないな。
俺は、これめったつかわないやー。
ごめんなー。
75 :
名称未設定 :02/09/01 00:33 ID:kECSNG2m
>>69 それはできないと思うけども…。
折れもC完全マスターしてるわけではないんで100%できないとはいえないけどさ。
変数おいた方がデバッグも楽だし、無理して変数使わないでやんない方がいいかも。
76 :
1 ◆ZMVdytmo :02/09/01 00:43 ID:A+GdAdOW
>>74 さん
>>75 さん
ありがとうございます
例えば
printf("PowerMac G4 cube\n");
って言うのは
printf("PowerMac");
printf("G4 cube\n");
ってやっても同じようにモニタに出力されますよね。
つまり同じことをするプログラムにも2種類以上の方法があるって思ったんです。
じゃあさっき↑上にも書いたのも2種類以上の方法があるのかな?
と思ったんです。 ちょっと今日は疲れたので寝ますね。
ありがたい意見ありがとうございます
明日はちょっと用事があるので書き込みの回数が減るかもしれません。
初心者のみんなは頑張って下さい
意見をくれた神の方ありがとうございます
77 :
名称未設定 :02/09/01 00:57 ID:99owantu
>>76 プログラムはやり方は本当にいくらでもあるんだ。
だからコーディングする人によってクセもある。
自分のかいたコードは読みやすくて、他人のは読み図来ってのも
そんなところにあるのかもな。
いいところに気が付いたね。
やり方は幾通りもあるけど、ただ、きれいなコードと汚いコード
とかってのはあるな。だけど、それを今理解しなくても、いずれ
分かる時がくるさ。
78 :
35 :02/09/01 01:17 ID:s8f7cIut
MacOSX のおかげでちょっと興味を持った人が
気軽にプログラミングを始められるようになったのは、素晴らしいことですね。
>>43 亀レスですが、35 の内容にとどめたのは
話が CUI 操作の概念全体に拡大する事を避けただけです。
// C の話では無くなってしまうので。
ちなみに cygwin のシェルは、
UNIX 用のシェルを Win で動かしているだけですよ。
79 :
名称未設定 :02/09/01 03:34 ID:zrLyYWjU
みんなTerminalでコンパイルしてるんだ。 ProjectBuilderでプロジェクトタイプを「Standard Tool」にすれば CのCUIアプリをビルドできるよ。
80 :
名称未設定 :02/09/01 06:58 ID:uFJ/pdkm
>>69 scanfを使う限りは不可能です。
scanfは標準入力から読み込んだ文字列を変換指定子で指定されたとおりに変換して
与えられたアドレスの変数に入れる関数だからです。
変数noの前に&っていう演算子がついてる理由が分かるといいんですが。
scanfとかprintfを使うなら、まず標準入出力の概念を理解しておいて欲しいですね。
81 :
名称未設定 :02/09/01 06:59 ID:DWuraGUb
良スレができたね。 プラットフォームや処理能力から解き放たれた 素敵な世界が堪能できると思う。 あれこれいわれるXだけど、これはまさに恩恵だね。
82 :
名称未設定 :02/09/01 07:03 ID:uFJ/pdkm
>>79 最初はTerminalでもいいんじゃないかな?
せっかくだからパイプとかリダイレクトを操作して標準入出力について
理解しておくほうがいいでしょうし。
83 :
名称未設定 :02/09/01 08:10 ID:uFJ/pdkm
>>81 立派な開発環境が標準でついてくるのはいい事ですね。
全然、スレ違いな話なんですけど、 この『ID:』ハズカシイですけど、なんか変える 方法ないっすか?
85 :
15 :02/09/01 13:07 ID:b0l+33S4
>>84 むしろ、IDカコイイ。
変えたいなら、再起動してみては?
ところで、みなさんに1つ聞きたいんですが、
int main(void)の「void」って何なんですか?
変数の型?サイトによっては「void」と書かずに解説されているサイトもありますね。
>>85 カコイイか。ありがとうです(汗)
>int main(void)の「void」って何なんですか?
この場合のvoidは引数(正確には仮引数)が
ありませんよ、ということで、明確にvoid、と書いているんだよー。
voidが『ありませんよ』ってなるってことは、
例えば,関数の中でvoid test(a , b);ってなってたら、
戻り値(returnする値)がありませんよー、ってことさ。
で、関数どうなってんだろ?っておもってみてみると、
void test(int a , int b)
{
int c;
c = a + b;
return ;
}
とかなっててreturnの後に戻す値が書かれてないのさ。
87 :
名称未設定 :02/09/01 13:17 ID:dDwa6tDw
>>85 voidってのは関数が何も値を返す必要がないときに使う。
void hogehoge();
とか。
88 :
15 :02/09/01 13:29 ID:b0l+33S4
>>86 ,87
うーん。なんとなくですが理解できますた。
戻り値がないってことは・・・常に「0」というか、「何もないヨ」ってことですいいんですよね?
>>88 「0」と「何もない」はプログラムではまったく別なので注意ね。
あとvoidは省略できる事はできるのだが、するとやはり互換性問題が発生する
可能性大です。
極力基本に忠実にめんどくても記述しとく方があとあと楽です。
90 :
15 :02/09/01 13:58 ID:b0l+33S4
>>89 返信ありがとうございますだ。
おっとそうでした。「0」と「何もない」は別物でしたね。スマソ。
なるほど。基本に忠実ですね。
91 :
名称未設定 :02/09/01 14:04 ID:yLpBErSs
hogeってなんですか? 禿頭のhageかと思ったら違うし、ほげ?。
92 :
15 :02/09/01 14:13 ID:b0l+33S4
>>91 hogeっていうのはただの「例」の意味だと思いますが。
今、1さんが使ってた「puts」を使ってみたのですが、
putsの場合、「puts("%d + %d = %d",m,n,nAdd);」のような、
複数の変数の出力はできないのですか?
どうもエラーが出てしまうので・・。
93 :
名称未設定 :02/09/01 14:14 ID:Ai2mj50e
私も知りたい! hogeとかfooとかbarとか何?
94 :
(・∀・) :02/09/01 14:21 ID:h50wcsNM
unix板にいけば、詳しく教えてもらえるかも。ほにゃららのことです。
95 :
1 ◆ZMVdytmo :02/09/01 14:31 ID:FHabgytG
hogeって言うのに深い意味はありませんよ。
別にunkoでもよかったしexでもよかったし、
>>94 さんの言う通りですね。
と言うことはhogeってあんまり普及してないんですかね?
結構メジャーだと思ってました
今日は用事があるのでCの勉強ができません・・・。
ちょっと残念だなぁ
>>92 puts()ってどんな関数ってのは、
http://cham.ne.jp/piro/p_stdfunc.html#puts ここみると、わかるよねー。
で、どう書かれてるかって、
int puts(const char *s)
とかかれてる。
ということは、puts()って関数に渡してあげなくちゃいけないのは
char 型データ(性格には、charで宣言されたデータのアドレス、なんだな)
だよね。
で、
>>「puts("%d + %d = %d",m,n,nAdd);」
をみると、引数一つしかないのに、4つも引数あるでしょう。
だからエラーがでちゃってるのさ。
99 :
麦畑から :02/09/01 16:27 ID:9xWTWaxH
#define sign(x) ( ( ( ((x)>0) << 1 ) | ((x)==0) ) - 1 )
100 :
15 :02/09/01 17:44 ID:b0l+33S4
>>96 うーん・・・char型?引数?わからない事が増えてきたです・・。
とりあえず、もう一度、Webにある解説などを熟読してみます。
102 :
名称未設定 :02/09/01 18:57 ID:99owantu
>>100 intってのはint型の変数の箱を宣言するってことさ。
例)
int nNumber;
なんてのがそうだね。
char szString;
なんてのがchar型の宣言の仕方さ。
これは文字を箱におさめたりできるんだよ!
ま、例としては、
int Math::TEST(void)
{
//char型の宣言
char szString[36];
//szString に文字列をコピー
strcpy(szString, "hogehoge\n");
//出力
printf(szString);
return 1;
}
なんてのさ。例にもれず、動くかどうかわからないけど。
ま、[36]ってはこれから説明するけど、intの箱が36個ひつようなら
int nNumber[36];
なんていって箱を36こ、続けてとれるんだ。
で、charの箱を36個とりたい場合にはさっきしたみたいに、
char szString[36];
なんて具合にしてとるってことだな。
さっきのプログラムしゃ、初期化とかに問題あるけど、今は気にしなくていいからね。
103 :
名称未設定 :02/09/01 18:59 ID:99owantu
わり、プログラムのところもう一度書くわ。 int TEST(void) { //char型の宣言 char szString[36]; //szString に文字列をコピー strcpy(szString, "hogehoge\n"); //出力 printf(szString); return 1; }
104 :
名称未設定 :02/09/01 19:01 ID:99owantu
わり、も一回かきなおすわ。 int TEST(void) { //char型の宣言 char szString[32]; //szString に文字列をコピー strcpy(szString, "hogehoge\n"); //出力 printf(szString); return 1; } 箱の数32個にして。ちょっとしたこだわり。お願いね。
105 :
名称未設定 :02/09/01 19:08 ID:E27QOAN+
>>104 それでどういう処理結果がかえってくるの?
画面に
%hogehoge
ってかえってくるだけだよね?
それだったらはじめのinteger型の変数(TEST)はいらないんじゃないの?
106 :
名称未設定 :02/09/01 19:29 ID:wm3Fp8wk
{ } の前のint TEST(void) TESTという関数の宣言 intは関数の返り値の型、voidは引き数ナシ
107 :
名称未設定 :02/09/01 19:31 ID:wm3Fp8wk
このレベルで人に聞いてる様じゃ先が思いやられるぞ。。。 書籍1時間読めば解るレベルの質問するなとは言わないが プログラミングってあれこれ頭を悩ますのが楽しいんじゃねーか。
108 :
名称未設定 :02/09/01 19:37 ID:99owantu
>>105 わりわり、
int TEST(void)
は変数ではなくってこれは関数の宣言さ。
・関数名 : TEST()
・引数 : void
・戻り値 : int
の関数の宣言さ。
だからよーくみてみると、
int TEST(void);
ってなってないじゃん。(";"がないでしょう)
わかりずらい説明だったね。
>>104 strcpy(szString, "hogehoge");
printf("%s\n", szString);
って書き方するのが一般的だと思われ。
111 :
名称未設定 :02/09/01 19:59 ID:99owantu
112 :
名称未設定 :02/09/01 20:05 ID:99owantu
.
113 :
15 :02/09/01 20:12 ID:b0l+33S4
>>102 何度もお世話になってすいません〜。
char型がイマイチ分からなかったのは、int型との違いが分からなかったんです。
どうやら、文字も入れられるみたいですね。
箱が何個とかは、昔Javaをかじった時にやったので、何となく分かりました。
>>107 ごもっともです。
これからは、なるべく他人に頼らずがんばりますだ。
char→1Byte 1Byteなのでニポンゴ(2Bytesのいわゆる全角)は入らないよ。 「文字も」というよりは本来文字の為の型。 ※strはcharの配列 int→(一般的には)4Bytes 整数の型 -32767〜32768
>>114 -32767〜32768って2バイトでの範囲ではないの?
× -32767〜32768 ○ -32768?
あぁ Mozilla のアホー! × -32767〜32768 ○ -32768〜32767
118 :
15 :02/09/01 21:14 ID:b0l+33S4
>>114 なるほど、cher型は文字用なのですね。
ということは、「cher a = abcd」ということが可能になるのですね。
そして、int型は整数に使うのですか。
勉強になりますた。
119 :
名称未設定 :02/09/01 21:23 ID:dDwa6tDw
>>118 char a = abcdってのはできんよ。
char型の変数は1バイトの変数。
"abcd"のような文字列じゃなくて単なる'A'とかそれしか入らない。
120 :
名称未設定 :02/09/01 21:24 ID:dDwa6tDw
intはOSやコンパイラによってちがうね。 2バイトのときもあれば4バイトの場合もある。 2バイト整数を使いたいときにはshort。 ちなみに、負の数を使わない場合には unsigned intとか宣言する。
いやいや… char … (単一の) 1バイト文字、または -128〜127 の整数。 例: char c = 'a', b = 100; int … (4 バイトの場合) -2147418111〜2147418112 の整数。
122 :
15 :02/09/01 21:38 ID:b0l+33S4
>>119 ,121
何度もスミマセンです。
なるほど。文字列じゃなく、aやbなど一文字分、つまり1byte分の数字や文字が使えるのですね。
そして、intの場合だと4byte分だから、比例して入れられる数字も増えるわけなんですね。
ここまで丁寧に教えて下さるみなさんに感謝しますだ。
123 :
名称未設定 :02/09/01 21:49 ID:+udQk1uf
ちょっと聞いていいかい 世の中にはC#だかC++だかオブジェクトなんたらとかあるが、 普通の「C言語」を学んでからそいつらに移るべきなのかい?旦那
>>123 C++ 覚えたいなら C やっといた方がいいかも。
そうでなければ必要ないでしょう。
教えてる側が時々ミスってるようだが...
>>123 C++に関してはCの知識ないと確実にはまります。
しらなくてもそこそこまではいけますがね。。
Cってのはプログラムする場合はけっこう基本になってくる所があります。
# アセンブラもあるが環境に依存しすぎなのでとりあえずおいとく。。
Javaでもポインタの概念わかってないと理解不能部分ありますし、、、
スパーハカー(w の基礎教養ですよ。
# あとはLisp系言語(Emacs Lisp、Scheme、Common Lisp)あたりも
# 計算機科学での基礎教養だけどね。。それは後でいいやって感じ
126 :
114 :02/09/01 22:41 ID:IRrHv32h
スマンかった。65536は2Bytesだった。。。 ところで折れはPascal→Cとステップアップした口なのだが。 Macの(Classicの)ToolboxもPascal風味だし、 これから始める人にPascalをすすめるのはダメですかね? C++は別に無理して覚えなくてもいいんじゃないすかね?? 個人的な意見ですけど。 9801時代もBC++用の普通のCソースとか多く見かけたし。 もう時代遅れかな・・・
>>100 引数(ひきすう)ってのは「関数を使う時に添えるデータ」の事だよ。
例えば、お馴染みのprintf("hello,world\n"); での「カッコ内のデータ」が「引数」って物なんだ。
じゃ、単純な例を。
int hoge(int a,int b) /*aとbの値を足す関数*/
{
int result;
result = a + b;
return result;
}
この関数を使う時は
piyo = hoge(2,5); /*変数piyoに2と5を足した数字を代入する*/
なんて感じに書いてやる訳だけど、この例でのカッコ内の数字が「引数」なんだ。
(ちなみにこの関数の例の変数aとbは『仮引数』って物で、この関数の中でしか使われないんだ。)
(仮引数は関数の処理が終わると消えてしまう。だから他の関数からaとbにアクセスする事はできないよ。)
あと、引数には「既定義の変数」を指定する事もできるんだ。
int main(void)
{
int first = 4;
int second = 8;
int foo;
foo = hoge(first,second);
return 0;
}
こんな感じにね。
なんかバカにしたような文章かもしれないけど、うやむやにしたままじゃ気持ち悪いしね。
では、健闘を。
128 :
名称未設定 :02/09/01 23:03 ID:gHanc1ID
signed char(8ビット/1バイト/-128〜127) ・ウィザードリィー(FC)の年齢 宿屋で年齢を上げ続けるとマイナスに、そのうち0歳を通り過ぎて若返り成功! unsigned char(8ビット/1バイト/0〜255) ・ドラクエ3(FC)の能力値(だったような…) 255 のときにタネを使って何も起きないが… 能力値が 254 のときに「チカラのたね」を使って +3 したりすると 1 になっちゃう! unsigned short(16ビット/2バイト/0〜65535) ・ドラクエ1(FC)のお金の最大値 一般人には半端な数値(65535)もプログラマには切りのいい数字。
>>126 pascalは教育用にはすぐれた言語やね。
が、、ちょっとお仕事がすくないです(w
わたしゃはFortranとかが最初だったやも、、その後Scheme、C、Python
って感じやね。
Pascalはおぼえても損ではないけど、話しできる人がすくないし、書籍だと
Delphiばかりになってしまってるので、、勉強がしずらいかもしれんです。
C++は必要に応じてですね、便利は便利ですが。、、
勉強のしやすさとか楽するならJavaいった方がよいかも。
ここで質問をしている人は、 C言語の解説書なり解説サイトをまず 内容が分からなくても最初から最後の方まで ざっと読んだ方がいいと思う。 そのあと個々の詳しいところを考えていった方が 良いんじゃないだろうか。
131 :
名称未設定 :02/09/01 23:25 ID:DBwDFedT
TerminalではうまいこといってもProject Buliderでは暴走した。 なんでだろ? CはCでも違うCなんかな?
132 :
名称未設定 :02/09/01 23:26 ID:yv94RPrg
>>130 そういう話のネタを根本から断ち切るようなことをいっちゃダメ
133 :
名称未設定 :02/09/01 23:43 ID:REBpVxC7
>>131 違うね。
Hello,Worldを作ってみたけど動かないしw
このスレ的にネタなのかマジなのか分からないんだが
135 :
名称未設定 :02/09/01 23:55 ID:DBwDFedT
けっこうマジだと思うけど。 ちなみにおいらは大マジです!
136 :
名称未設定 :02/09/02 00:22 ID:FeSlgo4S
> /Developer/Applications/まで行ってProject Builderをダブルクリック >ファイル→新規プロジェクト→toolのStandard Toolをクリックして次へ >プロジェクト名と保存場所を適当に決めて完了をクリック >Sourceのmain.cを色々いじってみたらいいそうです。 main.cいじってビルドして実行しても 「Hello,World」しか出ないのはなぜだああああ
ポインタがわからない人はExel等表計算ソフトを勉強してみましょう。
>>137 なるほど!
全然関係無いけど、昔多次元表計算ソフトってあったよね
139 :
名称未設定 :02/09/02 01:08 ID:fucMiUsc
>>136 文字を
[HogeHogeTextField setString:@"hogehoge\n"];
なりをNSTextViewなりに書いてるかい?
ってこういう事じゃないのかな。
ってHellow,Worldがでるってのはどこにでるのかちょっと教えて!
140 :
名称未設定 :02/09/02 01:11 ID:fucMiUsc
どの言語やるにしてもCは知っておいて損ない気がするな。 偉そうな事いってる俺も初めてプログラムをしはじめたとき あったわけで、そんとき、Cからはじめたもんなぁ。
ボクは BASIC -> Z80 -> C -> Java -> Objective-C の順に学んだYO 本当に基礎的な小さなプログラムでも良いから アセンブラで組んでみるとCも理解しやすいかも というかCをすっ飛ばしても問題無いかも?
>>131 ,133,136
普通に「ビルドと実行(ハンマーとモニタのボタン)」すればいいと思うんだけどなあ。
ちょっと試しにやってみたけど、全然平気ダターヨ。
どんな風にコーディングして、どうやって実行させたのか気になる所。
Terminalから実行させたけど平気だったし。
ん〜、何でだろ。
新規Project作った直後にそのまま「ビルドと実行」してもダメなの?
>>139 Standard Toolかつ"main.cいじって"って言ってるからCocoaは使ってないと思われ。
>>141 ちょっと昔はBASICからだったけど現在はCからだね。時代はすすんでるのだよ
# 微妙におやじギャグくさい、、
>>142 む、、というかTerminalで動作してDevToolsで動作しないってのはかなり頑張
らないとできない気がするのだが、、
>>145 ちなみに現代なら、VisualBasicから入る人も少なく無いかも。
(親が買い与えてくれるんだろうか?)
今は無償配布されてるC開発環境が手軽に入手出来るんだもんね。
ていうかOSXにはIBまで付いてくるんだもんなぁ。
それが動作するハードウェアが高価だったりするんだけど。
iBookやeMacならかなりお買い得なのかな。
147 :
1 ◆ZMVdytmo :02/09/02 13:24 ID:NVn7n5Qf
みなさんお疲れさまです。
僕は昨日から徹夜して学校の宿題全部提出しましたよ。
やっぱり人間やればできますね。もう冷蔵庫にあったリポビタンD2本飲んでますけど。今日は夜まで起きているつもりです。
昨日はC言語ご無沙汰だったので今日はちょっとだけどやることにします。
まだincludeの意味やint main(void)の意味がわからなかったりするんですが、
それもC言語を勉強していくうちにわかってゆくことでしょう。
>>146 本当にこの時代に生まれてよかったと思います。
cubeタンに704MBのメモリ積んで14000円出せばもう
C言語の勉強できてしまっている。(僕の環境)これってすごい恵まれてますよね。
これからの人はeMacに512MBのメモリとjaguar買うだけでいいから
18万円もあれば簡単にプログラミングができてしまう・・・。
正直C言語を学びたいならwinよりmacの方がお手軽なんじゃないかな・・・。
>>147 うーん、「お手軽」の定義にもよるけど、PC/AT機でなら半分以下の予算でCを学べるでしょう。
C言語学習用のポケコン、なんてのもあるんだっけ。
個人的にはcocoa環境でプログラミングを楽しみたいんでOSXマシンの購入を考えてますが、
ハードの選択肢が無くて困ってるところです。(現在Windowsユーザーです。)
149 :
1 ◆ZMVdytmo :02/09/02 14:09 ID:NVn7n5Qf
僕は正直win経験が浅いのですが、winだとOSをインストールした後すぐの 状態だとコンパイルできないじゃないですか。(僕が知らないだけかも) macだったら初期投資はeMacなりiMac及びメモリだけで済むぞ。と言いたかったのです。 けど今ちょこちょこっと調べたらborland C っていうフリーのコンパイラが winにあるんですね・・・。
150 :
名称未設定 :02/09/02 14:19 ID:Y/SSAG14
>>149 > けど今ちょこちょこっと調べたらborland C っていうフリーのコンパイラが
> winにあるんですね・・・。
それは、個人使用のみだけ許されているコンパイラです。
それでフリーウェアとかシェアウェアとか作ることはできません。
そうすると、Winで使うなら、gccかな? www.cygwin.comで、
WinでもUnixの開発環境が手にはいります。
でもやっぱり、OSXは、CDでインストールするだけで、
UnixのPOSIX APIフルに使えるので、
OSXのほうが、Unixプログラミングができるかも。
PC/AT機で動作するOSはWindowsに限りませんしね。 C言語/UNIXを学習したいのなら、Linuxがお勧めじゃないでしょうかね。 お金に余裕の有る境遇の人なら、OSXマシンがお薦めかもしれませんね。
俺も
>>1 に触発されてデベツル入れてみる。
蟹はん&金持ち著のバイブルを持ってた事を思い出したから。
一緒にがんばりませう。
153 :
15 :02/09/02 18:37 ID:Wik044lr
ただいまです。
>>127 おぉ!詳しい説明ありがとうございますだ。
なんとなくですが、理解できました。
96さんのおっしゃってる事もなんとなくわかりました。
「puts関数には、引数にcher型のデータを1つだけ(?)指定すればよい」
こんな感じですか?
154 :
15 :02/09/02 18:38 ID:Wik044lr
間違えてsageてしまいますた。スマソ。
155 :
名称未設定 :02/09/02 18:46 ID:9KI0TR7N
Macでプログラミングスレに行け! ↓ 終了 にならなくてよかったね。
K&Rの事か・・・ 蟹って何の事かずっと悩んでたんだよ。
>>15 今のところは面倒なことは考えないで
puts("うまー");を実行したら
「うまー」と表示されると覚えておけばいい。
勉強していくうちにわかるようになるから。
ちなみに、cherではなくcharだからね。
character(文字)の略ですよ。
158 :
1 ◆ZMVdytmo :02/09/02 20:09 ID:NVn7n5Qf
そういやputs関数って\nって入力しなくてもちゃんと改行されるんですよね。 さっき知ったんですけど、printfとどう違うのかわからない・・・。 \nを入れるか入れないかだけで二つも関数ができる訳無いし・・・。 ちょっと調べてきますね。
>>150 > それは、個人使用のみだけ許されているコンパイラです。
> それでフリーウェアとかシェアウェアとか作ることはできません。
Borland C++ Compilerでフリーウェアの作成・公開は可能だよ。
>>158 printfのfはフォーマットのfね。
最初の引数は出力変換指定子っていって、データをどんなフォーマットで出力するかを
指示するためのものなの。
%で始まる部分でデータをどんな書き方で出力するかを指定します。
それ以外の部分はそのまんま出るのね。
%dなら整数を十進数で出力しろっていう事になるんだわ。
161 :
15 :02/09/02 20:39 ID:Wik044lr
>>157 あ!すいません。cherではなくcharでしたね。
そうですね。とりあえず、あまり深く考えずに、テンポ良く進みますです。
162 :
1 ◆ZMVdytmo :02/09/02 20:49 ID:NVn7n5Qf
>>160 はい、自分で調べたら同じようなことが書いてありました。
回答ありがとうございます。
殆ど需要無いかな?と思って立てたスレだけど意外と需要があるようで
びっくりしてます。僕はちょっと2日程消えますね。
その間はC言語も勉強できない・・・。じゃあみなさん頑張って下さい。
>> 146
VBが最初ってのは個人的には不幸だと思う事もある。
基礎ふっとばしてもプログラムできるっていえばできる部分あるから。。
結局わけわかってない場合も多分にあったりするみたいな感じ。。
>>152 K&Rの事かな?あれで勉強するのはちょっと。。。
今だに参考になるというか基礎というか、、Cの必須本ですが、
本当の初心者には向かない気がしますです。
>>159 バイナリ配布のみ可能だったかな?オープンソースしたい時はだめな気がした。
>>162 1氏が数日いないみたいだが、なんか役にたちそうな初心者向けサイトでもさ
がしてみるかな。。
人の勉強の様子みてると自分のモチベージョンあがるね、、
>蟹飯 イメージでは「蟹のあんかけチャーハン」だな なんか旨そう…
166 :
名称未設定 :02/09/02 22:55 ID:fucMiUsc
>>1 165さんの言ってること本当だね。
どこで英語を使うかって調べる時だったりするんだ。
まぁ、関数の使い方って一度つかったら全部暗記しちゃう
人もいるんかもしれないけど、俺は結構調べるな。
でクラス(C++なんでここじゃあまり関係ないか)なり関数なりの使い方を調べるんだ。
調べる→プログラム書く→バグ潰す→調べる→プログラム書く→バグ潰す→・・・・・
ってのをくり返してコーディングするんだよー。
で、調べる、なんて時に結構英語つかったりするんだぜー。
>>163 K&Rは初心者が一人で読むのは無理がありますが、適切な指導者がいれば理解できるでしょう。
というか、いろんな本を読んでも結局はK&Rに戻って確認することになるから、K&Rくらいは
読めるようになって欲しいと思うんですがねぇ。
英語って日本語化されてないシステムや新しいデバイスの能書き読む時くらいしか必要ないかな 枯れたものは大抵日本語化されてるし...
>>147 >includeの意味
#include <stdio.h>とかの事だね。
この#includeってのは「マクロ」って物の一種で、<>内で指定したファイルを機械的に読み込む
C言語の機能なんだ。
この場合の<>内の"stdio.h"ってのはStandard I/O.h(標準入出力)の略で、このファイルには
>>1 も使ってるprintf関数やputs関数等の宣言(つまり『こういう関数がありますよ〜』とコンパイラに
教えるための情報)が書かれているんだ。もちろん、それ以外の関数もいろいろ宣言されてるよ。
<stdio.h>を#includeしてるからこそ、printf関数なんかが使えるんだ。
マクロの詳しい使い方は学習本に載ってるだろうから、勉強していく過程で解るよ。
だから、今このレスの内容がわからなくても大丈夫。勉強してりゃそのうち解るから。
170 :
名称未設定 :02/09/03 00:50 ID:yKp+CwXK
>>170 そのヘッダファイルがあるのか確認してみ。
その書き方からから察するに
stdio.hとか入ってるディレクトリに「kern」って名のサブディレクトリあるのかな。
その中に「clock.h」があるか確認
172 :
170 :02/09/03 01:47 ID:yKp+CwXK
>171 レスありがとうございます。 clock.hは/System/Library/Frameworks/Kernel.framework/Headers/kern/にありますた。 ちなみに環境設定ー>すばやく開く にも上記のパスがあるましたが、 これは関係ないんでしょうか?
あれ、ほんとだ。 kern以下のファイルはまるで読めないね。 何でだろ?
>>166 調査時案外英語利用しますが、オープンソース関係にかかわるとさらに英語の
比重が増す罠(w
>>167 同意します。ただ、K&Rは註釈必要な部分もけっこうあるかと、、
記述が古い部分があるよ、というのは認識しとかんと問題あるかも。
>>168 そうかな。。。わしちょっと特殊な分野のプログラムしてるから、、
CPU系とか文献英語しかない事がありますです、、
あとオープンソース系にちょっとかかわると英語なしだとぜんぜんついてけま
せんしね。
>>170 /Developer/Documentation/Darwin/General以下に同じ文章はないのだっけ?
今手元にないので。。
>>173 確認できてます??他の方も確認していただけると。。OS 10.2ですか?
わしも後で確認してみますです。
>>170 Kernelフレームワークをプロジェクトに追加していますか?
176 :
170 :02/09/03 15:27 ID:yKp+CwXK
>>174 すみません。環境を書くのを忘れていました。
OSは10.2でデベロッパーツールは付いて来たやつです。
ちなみにこのProjectBuilder(バージョン 2.0.1(July 2002 Developer Tools))は
環境設定でインテンド設定をオンにすると落ちるのですが。。。
私だけでしょうか?
>>175 していませんでした。
で、してみました。
main.c:2: header file 'kern/clock.h' not found
相変わらずのようです。
177 :
173 :02/09/03 15:52 ID:u1UbVLEc
>>174 当方、10.1.5でProjectBuilder2.0ですわ。
sys/kernel.hとかIOkit/IOBSD.hなんかは読めるんですけど、
kern以下のいくつか試してみたけど読めなかったです。
(今OS9.2なんでちょっと確認できませんが)
kernel.frameworkをprojectに追加してもダメだったんで、しょうがないから
clock.hを直接projectに追加して#include "clokc.h"としてみたんですけど、今度は
clock.h内で参照してる別のkern内のヘッダを読めずエラー。
なんでだろ?
178 :
名称未設定 :02/09/03 20:18 ID:DkkGk0D9
#include "kern/clokc.h" ではどう?
むーーこれってKEXT用って事でよいのだろうか。。 どちらにしてもDarwinカーネルはよく知らん(T_T) しばらくわしはほっとく。わからんから。 しっかしFrameworkよくできてるな。。NS付くのがややああれだが。。
>>178 う〜ん、それでもダメですた。clock.hで読めなかったlibkern/OSBase.hも
projectにAdd Fileしてみたりもしたんだけど、やっぱダメ。
>>179 の言う通り「使えない」のかも。
>>170 が何しようとしてたかは知らないけど、別の方法を考えた方がいいかも。
181 :
170 :02/09/04 00:33 ID:2P5WbAf0
>>178 教えて頂いてる身であれなんですが
http://www.eskimo.com/~scs/C-faq/q10.8.html ということで<>と""の違いは""の方がカレントディレクトリを
含めてヘッダファイルを探しに行くという事なので、今回は
関係ないかと思われます。やってみましたができませんでした。
すみません。
何となくスレ違いぽいのでこれにつきましては他の方法でしのぐことにします。
ありがとうございました。
なお、なぜか分かる方がいらっしゃいましたら是非ご教示下さい。
182 :
170 :02/09/04 01:40 ID:2P5WbAf0
また質問です。 関数で乱数の配列を作りたいと思い下記のようにしたのですが 0 5 4 -1610608440 0 1799 となりaが変更されていない模様です。なぜだしょうか? #define N 3 void myrandom(const int* _x){ int x[N]; int i; for(i = 0; i < N; i++){ x[i] = rand() % 10; printf("%d ",x[i]); } printf("エn"); _x = x; } void main(void){ int* a; int i; myrandom(a); for(i = 0; i < N; i++){ printf("%d ",a[i]); } printf("エn"); return 0; }
printf("%d ",a[i]); これってとんでもないアドレスを見ている気が駿河。。。 x[i] = rand() % 10; この書き方も微妙だねぇ。。。
184 :
170 :02/09/04 03:24 ID:2P5WbAf0
あらら。
関数の中身をmainに移してみるとうまくいく事や
デバッガで見るとaのアドレスと_xのアドレスが一致しないので
関数への値の渡し方が問題かと思っていたのですが。
>>183 もう少しコメント頂けるとありがたいです。。
185 :
名称未設定 :02/09/04 03:51 ID:rWlXjFk5
186 :
170 :02/09/04 04:34 ID:2P5WbAf0
>>185 あー、申し訳ないです。constは消し忘れでした。
一応試行錯誤の跡ということで。。。
あと
#include <stdio.h>
#include <stdlib.h>
も抜けてました。重ね重ね申し訳ございません。
URLありがとうございます。よく読んでおきます。
こうでしょ。 void myRand(int* p, int n){ for(int i = 0; i < n; i++){ *p++ = rand() % 10; } } int main(){ const int N = 3; int a[N]; myRand(a, N); for(int i = 0; i < N; i++){ printf("%d ", a[i]); } printf("\n"); return 0; } 柴田望洋先生のポインタの本読んで勉強しる。
>>182 やりたい事はわかるが、ソースきちゃない...
#include <stdio.h>
void nopointer(int a,int b,int c) {
c = a + b;
}
void usepointer(int a,int b,int* c) {
*c = a + b;
}
int main(void) {
int a = 10;
int b = 20;
int c = 100;
nopointer(a,b,c);
printf("%d\n", c);
usepointer(a,b,&c);
printf("%d\n", c);
return(0);
}
とりあえず違い理解してます??
いきなり #defineマクロで変数宣言するのはやめて、、
なんか本参考にしてる?まさか林本とかではないだろうな。。
189 :
170 :02/09/04 08:46 ID:2P5WbAf0
>>187 なるほど、ありがとうございます。
ちゃんと動くのがあるとどこが間違っていたか
分かり、とても勉強になります。
>>188 関数の引数はローカル扱い?(変更しても関数の外側では反映されない)
になるんですよね?
あと配列とポインタの関係とか断片的な知識はおぼろげとあるのですが
それらが理解されておらず、ごっちゃになっていて何がいけないのか
分からなかったです。
示されたような分かりやすい例は分かるのですが、やはり自分で手を
動かして初めて理解できることを痛感しました。
>>183 というわけで指摘されたことは
int* a;と宣言してもaを配列として宣言していないので
怪しいし分かりにくい。
x[]をいじっても_x = x;で反映できない。
と理解してみました。
勉強法は他人のソースを見て分からない所があればwebで検索。
という方法です。しかし本を読むことも大切なのですね。
読書(体系的な学習)は苦手なのですががんばって読んでみます。
>>189 183の指摘
x[i] = rand() % 10
が微妙云々は疑似乱数の質についての言及のはずだけど、
今のレベルでは気にしなくてもいいような。
本に関しては
望洋の本が1冊あればいいと思うけど。
Macのプログラミングは昔に比べたら敷居が低くなったかもなぁ。
170さんくらいの知識があるならまじめにK/Rを読んだほうが 成長早いと思うよ。訳が数学者さんだったりすると和訳本は 理解するのが難しいかもしれないけど、何とかなると思うし。。。 因みに他人のソースって誰の見てるかわからないけど、それ自体 間違ってる事もありえると思うしね。
無理にポインタで渡さなくてもいんじゃないかなー メモリが少なかった9801時代ならともかく 俺はループカウンタとか、ローカルでしか使わないもの以外は 全部グローバルで宣言するじぇー。 10Bytesにも満たないじゃん。その配列&ポインタは。 乱暴なようだけどこれも一つの方法。
デスマーチへの序曲が流れ始めますた。
>>192 >全部グローバルで宣言する
やめてくれ…
195 :
名称未設定 :02/09/04 15:39 ID:zelyA3Su
勉強になったからage!!
196 :
1 ◆ZMVdytmo :02/09/04 16:10 ID:rTDvXsUp
みなさんこんにちは。やっとプログラミングが再会できるようになりました。 何かもう引き離されちゃった予感・・・。 予感って言うよりは確信ですね。僕はやっと足し算プログラムなのに・・・。 人によって成長の仕方も違うだろうし、僕は僕のスピードでやります。 好きな時間に好きなだけやれるのが趣味プログラミングの醍醐味だと思い込みますよ・・・。 今日服を洗おうと思ったらどうやらドライクリーニングしか駄目らしくて クリーニング屋さんに行ったら何か知らないけど高かった・・・。 軽く鬱です 生活どうしようか・・・。 それより柴田望洋さんの本は本当に評判いいらしいですね。 ここでもちらほら書かれていたし。 じゃあプログラミングを楽しんできます。 今日はかけ算プログラムと整数を2つ入力するとその数の加減乗除をしてくれる プログラムにチャレンジしたいと思います。そのうち実用的なものを作りたい・・・。
197 :
名称未設定 :02/09/04 16:13 ID:o78yg2FM
>>192 >全部グローバルで宣言
とりあえず氏ね
198 :
名称未設定 :02/09/04 17:20 ID:snkAQDEY
>>182 ローカル変数は消滅するからそのアドレスを返してはいけない。
> _x = x;
グローバル便利じゃん。 無理に使わないように作って泥沼にはまるより、グローバルにして作りやすくなるんならそれでいい。
>>189 (170)
本は必要だと思われます。
とりあえずこのレベルあるならK&Rで問題ないかと。
あとkernってFramework API用なのかも。。
日付取るだけならsys/time.h でctime利用するとか方法はいくつかありますよ。
>>192 アホ決定てかお仕事した事ないですか??
グローバル変数はいかになくすかってのが安全を保つ秘訣です。
マクロとか極力利用しない方向で...
どうしてもグローバル利用する場合は名前を極力一発で意味が理解できるぐら
い長めにつける事です。
>>196 (1)
170氏はすこしプログラム経験あるっぽい感じ。。なので気にする事はなさげ
です。
>>201 便利...まあ無理やりつかうなとは書いてないですがな。
極力へらす方向でという事です。
# でも一緒にお仕事はしたくないです。
>>201 時により便利だと言うのは分かるんだけど…
グローバル変数使ったほうが泥沼にはまることがあるので、
普通は使わないようなコーディングスタイルで行くんだよね。
205 :
名称未設定 :02/09/04 21:57 ID:171zq3CB
>>192 グローバルで宣言するってのも時には必要なのかもしれないけど、
極力つかわない方向で俺はソース書いてるよー。
グローバル変数をつかっちゃうと、デバッグしずらいとかないか?
(ってかそんな事おもうの俺だけか。。)
ソースを書く仕事ではなるべくグローバル変数使わない方向で
やってたぞー。
まだまだ初歩段階なんだから脳内ネストが深くなる学び方するより
グローバルを積極的に利用するのも一つの方法かと思う。
つか、あっちでもこっちでも利用するものはグルーバルにすべきでしょ。
完全に関数内で完結するものだけローカルにすればよい。
怒らないで聞いてね。
関数の作り方が問題だと思うんだけど。
配列をポインタで宣言したのはサイズが不定の配列を作りたかったからでしょ?
でも#defineがあるし。
それに数やら大きさを指定する引き数もいないし。
そういう面から見ると
>>187 が普通じゃないかと。
使い回しのしにくい関数はあまり意味が無いかと。
あと関数を作っててソースの見通しが悪くなるのは
本末転倒じゃ無いかと。
俺の個人的意見なので聞き流してちょ。
おいおい。。。 なんかとんでもない奴がいるな。 変数(データ)のライフサイクルだとか考えないらしい。。。 まだ初歩段階だからといってネタを仕込むなよ。 って事で最近プログラミングをはじめた(い)皆さん206は 無視してね。必ずよ。
>>206 >グローバルを積極的に利用
(((( ;゚Д゚)))ガクガクブルブル
>>206 > まだまだ初歩段階なんだから脳内ネストが深くなる学び方するより
> グローバルを積極的に利用するのも一つの方法かと思う。
初歩の段階で変なやり方を身につけると、後で矯正できなくなる罠。
グローバルの議論はポインタ理解できない人がデムパッテルだけのようなので 無視の方向でいきましょうか...皆さん >コーディングスタイル もうすこし進捗したらこのあたりの資料も必要だろうか。。 というかなぜマクロ減らすのか、とか理由的資料でよさげな日本語資料ってあ るかな? わしは経験とかが中心で語ってる部分があるから、資料がすぐ引けないじょ.. プログラミング作法とかにも記述あったような気もするが、、あとで確認して みよう。
コーディングスタイルってお作法って事だよね? 確かに必要だよね。 下手にトリッキーなコード書くよりも、きれいなコーディング してあるほうがこいつやるなって思えるしね。
グローバルは一切使うなとは言わないですけど、 const付けてテーブルの置き場所にするくらいしか使いようが思いつきません。 (#ifdefとかで括ってデバッグ用と限定してGlobal変数使うときはあります)
214 :
名称未設定 :02/09/05 22:13 ID:EyJj7lre
age
215 :
名称未設定 :02/09/05 23:13 ID:CMz9/dAB
#include <kern/clock.h> の件について。 1、Kernelフレームワークは追加しない。 2、ターゲットのビルド設定のビルド設定で、 HEADER_SEARCH_PATHに /System/Library/Frameworks/Kernel.framework/Headers を記入。 で、ヘッダーが読み込み可能になります。 なぜか/usr/includeではうまくいきません。
216 :
名称未設定 :02/09/05 23:28 ID:EyJj7lre
>>215 へー、そうなのか。
良い事知った。
メモしとこっと。参考になるな。
217 :
170 :02/09/06 00:16 ID:oz0fb7p8
>>215 ありがとうございます。とりあえずコンパイルしてみてたら
Undefined symbols:_clock_get_uptime
と出ました。とりあえずヘッダは読み込めてるっぽいので
あとは自分でがんばってみます。
あと、1さん、その他の方へ
私のせいでスレの雰囲気が変わってしまったようで申し訳ないです。。
再び「今日はここまで進んだ」「こういう所が分かりにくい」等の
カキコの再開を期待してをります。
うおお、 /System/Library/Frameworks/Kernel.framework/Headers/kern/としてて ダメだった記憶があるが、/Headersまでで良かったとは…
219 :
名称未設定 :02/09/06 09:29 ID:iGBJX3P2
>>189 ちゃんと理解してしているか心配になったので、ちょっと解説します。
関数への引数は常に値渡しです。
つまり、myrandomに渡されたポインタの値は、aのコピーです。
ですので、myrandom内で、_xの値が変わってもmainのaの値は変わりません。
220 :
219 :02/09/06 09:36 ID:iGBJX3P2
「ポインタの値」は誤解するかな。 要はアドレスです。
アドレスと言われてピンとくるのは、アセンブラ経験者とかじゃないかなあ
じゃあ、住所ということで。 で、住所と家の話が・・・
上にも意見が出てたと思うけど、表計算ソフトでもアドレスって使いますよね。 Aの1番地、みたいな。 手の込んだマクロ/関数になると、参照の参照を使ったりするし。 表計算に慣れるのも、なにか役に立つかも。 コンピュータの基礎的な仕組みをビジュアルで理解できる仮想マシンを用いた 機械語入門ソフトとかあると楽しく学べそうに思うけど、どこかにありませんかね。
ストーカータンがあらわれますた。
>>219 > 関数への引数は常に値渡しです。
おそらく「値渡し」っていう言葉も理解できないかも。
226 :
219 :02/09/06 17:17 ID:iGBJX3P2
>>221 >>225 あらら、だとすると説明するのが難しいですね。
でも、あえてmallocしてないところを見ると解っていそうな気もしますけ
ど...。
具体的に書いた方がいいですかね。
mainで宣言したaの値が0x1000だとします。
myrandomを呼ぶと関数内では_x = 0x1000になりますが、_x = xとしても、
_xの値が変わるだけで、mainにあるaの値は変わりません。
つまり、aの値が_xにコピーされた(値渡し)だけで、aそのものが渡された
わけではないということです。
ですから、myrandom側では_xの値を変えるのではなくて、_xが指し示す先
の内容を書き換えるようにします。
もちろん、mallocしてからmyrandomを呼んでください。
くどかったらすいません。
つーかさ、デバッグの使い方教えたほうが良くね? gdb+emacsとかだと難しすぎるから、ProjectBuilderでさ メモリの内容見たほうが直感的じゃないか?
228 :
226 :02/09/06 18:20 ID:iGBJX3P2
そうかもしれません。 でも、デバッガもなぜメモリの内容がそうなっているかまでは教えてくれま せんから、C言語の基本的なところはある程度押さえておかないといけませ んね。
つーかやっぱりアルゴリズムとデータ構造とかそんな本から。。。 は行き過ぎだけど、値私とかの言葉に対してイメージが出来てない とするとやっぱ辛くね?
いや、もうそこまで考えるといっその事アセンブラから、、、ってCの話じゃないね。スマソ
231 :
名称未設定 :02/09/06 20:20 ID:VManN185
ポインタとか使って動かしたいように動いているかどうか確かめながら コーディングしたい、っていったら、やっぱりデバッグ必要だろうし、 そうなると、ProjectBuilderは良いかもしれないね。
メモリ領域の使い方、ポインタに関する疑問だったら 前橋和弥著「C言語ポインタ完全制覇」技術評論社 ってのが個人的にはオススメだったりします。 題名は相当胡散臭いですが、中身はしっかりしてます。 スタンスとしては入門書というよりも補足に近いですが。
ソースコードをウプする前に、terminalひらいて、 expand -t4 | sed 's/ / /g' > pre_upload ってやっておくと、好まれるかもしれません。
235 :
228 :02/09/07 11:23 ID:NkO/TS8e
初心者の人がいなくなりましたね。
236 :
名称未設定 :02/09/07 12:20 ID:LhPV61/o
>>235 それでは初心者の質問を一つさせてください。Cの勉強初めて1〜2ヶ月です。
scanf()とgetchar()について質問です。
どちらもキーボードからの入力を取得するのに使うものだと思っているの
ですが、どう使い分ければいいんでしょう?
例えば。
scanf()を使って次のようにしても
---------------------
?#include<stdio.h>
int main(void)
{
setvbuf(stdout,NULL,_IONBF,0);
int n;
printf("あなたの性別は?\n1:男 2:女");
scanf("%d",&n);
if(n==1)printf("あなたは男です");
else printf("あなたは女です");
return 0;
}
-------------------------
つづく
237 :
名称未設定 :02/09/07 12:20 ID:LhPV61/o
>>236 のつづき
getchar()をつかって次のようにしても
-----------------------
?#include<stdio.h>
int main(void)
{
setvbuf(stdout,NULL,_IONBF,0);
char ch;
printf("あなたの性別は?\nA:男 B:女");
ch=getchar();
if(ch=='A')printf("あなたは男です");
else printf("あなたは女です");
return 0;
}
----------------
どっちも、できることは同じですよね?
どういう風に使い分けるのがいいのでしょうか?
値渡しのイメージはつくが、 mallocっつーのはなんなのかよく分からんな。 値渡しのイメージ コップA(呼び出し側)、コップB(関数)があるとする。 コップAには水(変数 a)が入っていて、コップBにその水を入れるような感じだな。 で、残ったAの水には手はつけれず、Bの水(変数 b)しか操作できない。 そのため、コップAの水、つまり呼び出した変数 a は変わらない、と。 void func(int a) { a=a+1; } つまり、コップAの水(int a)を func()というコップBの中(funcの括弧内)に入れて、 そのBの水をa=a+1している。 というイメージで良いか? 漏れが参考にしてるのは、技術評論社の「はじめてのC」。 OS板で尋ねたら、薦められますたが……。
>>236-237 getchar()は一文字しか読み込めませんが、
scanf()はフォーマットに合わせていろいろ読み込めます。
#scanf論争は止めましょう:-)>識者の方々
>>238 >つまり、コップAの水(int a)を
>func()というコップBの中(funcの括弧内)に入れて、
>そのBの水をa=a+1している。
ちょっと違うかな。
コップAの水と同量の水を水道からコップBに入れる。
func()が終わればコップBの水は捨てる。
当然コップAの水には増減は起きない。
この例からは分りにくいけどコップBに対してコピーが行われている。
コピー(コップB)にイタズラ書きしても原本(コップA)は元のまま。
値渡しについては「変数aとbの値を入れ替える関数」を作ると分りやすいと思う。 void swap(int a,int b) { int tmp; tmp = a; a = b; b = tmp; } これは期待した結果にならない。
241 :
名称未設定 :02/09/07 18:16 ID:pLCuE52B
>>238 >漏れが参考にしてるのは、技術評論社の「はじめてのC」。
>OS板で尋ねたら、薦められますたが……。
俺も技術評論社の「はじめてのC」でプログラムをはじめたな。
いろいろな本あるけど、これもなかなか良かったよ。
242 :
名称未設定 :02/09/07 18:19 ID:EA+b0mUE
はじめてのC・・。
243 :
241 :02/09/07 18:25 ID:pLCuE52B
>>242 なんか、あれ意味してそうだけど(w
ちがうぞ、断じてちがうぞ(W
244 :
238 :02/09/07 20:22 ID:ZxuT8ozS
>>239 なるほど、よく分かったよ。(考える角度とか。)
245 :
名称未設定 :02/09/07 21:29 ID:3hIqdHv3
なるほど、よく分かったよ。(はじめてのCとか。)
246 :
名称未設定 :02/09/08 17:30 ID:C3EDpQLX
ぜんぜん、スレ違いな話だと、最初に断っておきますね。 以前、VBいじってるらしいSEの知り合いがこんな事をいってた。 『ポインタを使うとプログラムわかりずらくなるから、最近は 滅多に使わないんでしょ?』 俺はそんな話聞いた事なかったけど、とりあえず、 『ふ〜ん、そうなんだ。』 といっておいたが、C、C++、Objective-Cなんかをいじってる俺に してみれば、『ど、どうやってプログラム組むんか』とちょっと 疑問になってしまった。 ってか俺は結構ポインタつかったりするもんで。 なるべくgotoとか使わない、とか、なるべくグローバル変数を使わない とかは聞いた事あるけど。ポインタを使わない、って話はあまり聞いた事 なかった。 みんなのまわりではそんな事ある?
Hello C
C/C++/Objective-C 以外ではポインタなんてもの自体ありません。 “ポインタを使うとプログラムわかりずらくなる”というのは、 “それらの言語はさっぱり判らない”と吐露しているんでしょう。
>>246 VB厨の言うことは適当に聞き流しておくのが吉。
おーい1よ。その後はどうだい?
中級者になれない人たちが雑談するスレになりますた。
VBいじっててCをあまり知らない人なんでしょ? そんな人の、ポインタについての意見を参考にするなよ。。。
>>248 〜252
レス、ありがと!
そうだよなぁ〜、そんな事ないよな。
よかった。ほっ。
254 :
名称未設定 :02/09/08 22:12 ID:e76vbX3U
VBって、REALbasicに似てるやつ?ならポインタなんて無いか
>>254 でもREALbasicでも参照渡しをできるわけだし、ポインタの知識を知ってると理解しやすいやね。
まあまあ、他言語の事はいいからCの話しようよ。
257 :
235 :02/09/09 12:25 ID:muZ5psSu
>>236-237 >>239 さんの言うとおりです。
scanfの問題点は、遭遇してから考えることにすればいいでしょう。
>>238 mallocは、メモリ領域を割り当てる関数です。
int *a; (
>>182 )
では、宣言をしただけですから値は不定です(ポインタがどこを指している
か判らないということです)。
mallocしてメモリ領域を割り当てる必要があります。
コップの例えについては、
>>239 さんのたとえでいいと思います。
258 :
1 ◆ZMVdytmo :02/09/09 17:54 ID:qxN6Aw4F
>>1 です。
最近PCをいじる暇がありませんでした。
もちろんプログラミングも・・・。
引越しって大変ですよね。
昔の家はmacからネットできたのに今はOCNのACCAプランだから
windowsからしかネットできないんですよ・・・。
しばらくmacはプログラミング専用機になりそう・・・。
mac & win 両方いけるいいルータってありませんかね?
プログラミングは相変わらず
整数を2つ入力して下さい
整数1:
整数2:
それらの整数の和はhogeです
それらの整数の差はhogeです
それらの整数の積はhogeです
それらの整数の商はhogeです
ってところです(w
マターリいきます。えぇ、マターリいきますとも(泣
259 :
名称未設定 :02/09/09 18:14 ID:rSvB0WN6
偶数or奇数判定、小数点or整数判定、誕生日からの年令判定、 ハイ&ローゲーム、サイコロ、数当て、などで楽しんでください。 テキストのみで3択クイズを作るのは簡単でたのしめます。
260 :
名称未設定 :02/09/09 23:51 ID:B0y7u9jf
小数点、整数判定ってどうやるんですか? ちょこっとヒントを... ヒントだけね。 おねがいします。 こうゆう練習問題っぽいのって面白いですよね? 上達するのがわかるっていうか...。
262 :
名称未設定 :02/09/10 00:50 ID:Y9QqN/3w
しまった言い過ぎた。型変換だけのがよかったか
263 :
名称未設定 :02/09/10 01:06 ID:Tdz5881y
このレスを読んでC言語やTerminalに興味を持って ちょこっとかじり出したんですけど、Terminalに日本語を 表示さすために“shift jis"にしてるんですが。 そうすると”〜”が入力できないんですが、入力できるように することは出来ないんでしょうか? しょうもない質問ですいません。
関数使えよ
265 :
名称未設定 :02/09/10 01:20 ID:Tdz5881y
すいません、もっと詳しく教えてもらえませんか。
267 :
名称未設定 :02/09/10 01:41 ID:Tdz5881y
>>266 そうなんですか?
必死でどうやったらええんか悩んでました。
>>263 なんかTerminalのshift-jisは怪しい。
269 :
名称未設定 :02/09/10 09:55 ID:/08JDRKh
キーボードがアスキーになってるのか?
271 :
名称未設定 :02/09/10 23:17 ID:pvu78DAK
age
272 :
名称未設定 :02/09/12 00:40 ID:i9P6JdI/
初心者の人が居なくなりました。
273 :
名称未設定 :02/09/12 16:53 ID:nqDPkaEA
誰もいない?
274 :
名称未設定 :02/09/12 22:18 ID:XRJDGYvy
>>272 ,273 初心者いますよ。今ポインターを勉強中です。
?#include<stdio.h>
int main(void)
{
setvbuf(stdout,NULL,_IONBF,0);
int **mpa,*pa,a;
mpa=&pa;
pa=&a;
**mpa=10;
printf("%p %d\n",**mpa,**mpa);
printf("%p %d\n",mpa,mpa);
printf("%p %d\n",*pa,*pa);
printf("%p %d\n",pa,pa);
printf("%p %d\n",a,a);
return 0;
}
とすると
0xa 10
0xbffffd44 -1073742524
0xa 10
0xbffffd48 -1073742520
0xa 10
となるのですが、0xaと0xbffffd44はメモリのアドレスでいいんですよね?
でもどうして違う値になるのでしょうか?あと-1073742524と-1073742520
は意味のある値なのでしょうか?
intのポインタのポインタが mpa intのポインタが *mpa, pa intが **mpa, *pa, a
ウーワンワン!
printf("%p %d\n",**mpa,**mpa); printf("%p %d\n",*pa,*pa); printf("%p %d\n",a,a); printf("%p %d\n",*mpa,*mpa); printf("%p %d\n",pa,pa); printf("%p %d\n",mpa,mpa); 複雑化しているな..スタイル的にあまりよくない気がする。
ちなみに int *p: *p = 10; のように代入するのはCでは意味がなく危険な場合が多いです。
int *(*mpa),*(pa),a; a = 30; pa = &(a); mpa = &(pa); こんな感じかな? # カッコ意図的に多くしてみたが、、変だな、、(-_-)
この場合適切なのは間接参照の例か。ぼけてる。 int **mpa,*pa,a; /* aのアドレスを取得 */ pa = &a; /* paのアドレスを取得 */ mpa = &pa; /* 多重間接参照を利用して、aに値を代入する */ **mpa = 10;
281 :
名称未設定 :02/09/13 00:08 ID:b0QeTbIW
ポインタってどういうときに使うの?
>>281 オブジェクトを参照する時、、
構造体は通常ポインタで、、
というか実際にプログラムしてみないと実感わかないと思われる。
# ちなみにJava等のオブジェクト思考言語ではすべてがポインタ(極論 w)です。
# そのため、全操作がポインタ経由でしかできません。
# ポインタしか存在しないため、ポインタ演算子もないです。
>>282 そのネタ、面白いので是非プログラマ板でスレ勃ててやって下さい。
284 :
名称未設定 :02/09/13 00:17 ID:bnau0oU0
int a int *p P=&a aのアドレスをポインタPに入れたとして なんの意味があるんだろうか? まあ、アドレスは関数で飛んだ処理でそのまま値を代入されてしまったり いろいろ複雑ですなぁ。 まっ、printf、scanf、構造体、ポインタ、fscanf、繰り返し、 型を使えればなんとかなるでしょ! いまだにポインタの利用法がわからんけど
>>281 関数に渡せる変数の大きさには制限があるので
大きな変数はポインタでやりとりする。とか
住所氏名でいうな、俺には座標で知らせろ!
>>284 たとえば、その scanf()。
int a, b;
scanf("%d,%d", &a, &b);
関数の戻り値はひとつしかないわけだけんども、ポインタを渡すことで
複数の値を得られる。
>>284 macのメモリ管理がそれだよ。Handleってやつ。
そのポインタ不要論の例のような間違いをする人なんているのか?
>>283 ネタ最高!
# まあ極論だがJavaが参照で成立しておりそれが間接的にポインタの
# 概念を利用しているのは事実だがな
>>284 。。。意味は人のプログラム読むとわかるかも、、
>>288 参照はポインタです。STLはポインタのかたまりです(極論、、)
>>282 いや。だから極論です。
まあ、お腹いっぱいなのは同意しますです。
まあ議論になる問題ではなく「ポインタ」て単語の定義上の問題だけですがね。
>>290 いるから、Wordは不正な処理で終了して、書いた文章が途中できえたりするのです。
いるから、MS Windowsは突然停止したりするのです。 (w
# だめだ、、ネタ職人としての才能はない、、
295 :
257 :02/09/13 07:31 ID:H7L6eBll
>>274 0xaはアドレスじゃなくて、10が16進で表示されているだけです。
また、-1073742524と-1073742520は、それぞれ0xbffffd44と0xbffffd48の
10進表記です。
aのアドレス(= &a = pa)は、0xbffffd48
paのアドレス(= &pa = mpa)は、0xbffffd44
mpaのアドレス(= &mpa)は、表示されていません。
>>290 でも、とりあえずポインタの使用例がいくつか載っている。
297 :
295 :02/09/13 13:03 ID:nM8dGr9Q
>>288 単にC++を使えと言う話ですね。
だったら、Objective-CでもJavaでもいいのでは。
たとえばポインタを使うと int main(void) { /* nNumberA、nNumberBをつくり初期化 */ int nNumberA = 0; int nNumberB = 0; int nNumberC = 0; int nNumberA = 1; int nNumberB = 2; Add(&nNumberA, &nNumberB, &nNumberC); printf("%d", &nNumberC); } void Add(int* pa, int* pb, int* pc) { /* paとpbを足す */ *pc = *pa + *pb ; return; } とかってするとnNumberCは足された結果になるさ。 だけど、こんなのをポインタつかわないでやるとなると、 戻り値を足された結果にしなきゃ、ってなる。だから 関数の戻り値値はvoidからintへ変更しなくてはいけない。 (つづく)
書き直すと、 int main(void) { /* nNumberA、nNumberBをつくり初期化 */ int nNumberA = 0; int nNumberB = 0; int nNumberC = 0; int nNumberC2 = 0;/* nNumberCとnNumberC2の値が等しいか確かめるため追加 */ int nNumberA = 1; int nNumberB = 2; nNumberC2 = Add(nNumberA, nNumberB, nNumberC); printf("%d = %d ???\n", &nNumberC, &nNumberC2); } int Add(int a, int b, int c) { /* paとpbを足す */ c = a + b ; return c ; } とすると、nNumberCとnNumberC2の値が違ってくてるハズだぜー。 (動かしてないから、動く事も保証できないです。) 今はあまり気にならないかもしれないけど、戻り値ってエラーを処理 するような時にも沢山使うんだ。 もちろん、プログラムとしては戻り値に足された値を返しても間違いでは ないと思う。だけど?あとからエラー処理いれる、とかいった場合、どうするんだろ・・。 う〜ん。俺は結構、戻り値はエラー処理のために使ったりする。他の人の 意見は違ったりするかもしれないが。例のごとく、動く事は保証しないっす。
わり、動かんわ。書き直す。
>>298 は以下のように書き直し。
int main(void)
{
/* nNumberA、nNumberBをつくり初期化 */
int nNumberA = 0;
int nNumberB = 0;
int nNumberC = 0;
int nNumberA = 1;
int nNumberB = 2;
Add(&nNumberA, &nNumberB, &nNumberC);
printf("%d", &nNumberC);
return 1:
}
void Add(int* pa, int* pb, int* pc)
{
/* paとpbを足す */
*pc = *pa + *pb ;
return;
}
そして
>>299 は以下のように書き直し。
int main(void)
{
/* nNumberA、nNumberBをつくり初期化 */
int nNumberA = 0;
int nNumberB = 0;
int nNumberC = 0;
int nNumberC2 = 0;/* nNumberCとnNumberC2の値が等しいか確かめるため追加 */
int nNumberA = 1;
int nNumberB = 2;
nNumberC2 = Add(nNumberA, nNumberB, nNumberC);
printf("%d = %d ???\n", &nNumberC, &nNumberC2);
return 1;
}
int Add(int a, int b, int c)
{
/* paとpbを足す */
c = a + b ;
return c ;
}
302 :
初心者 :02/09/13 16:19 ID:Gysqqr6u
>>298-301 質問です。
なぜアドレスを10進数で表示するのですか?
なぜmainで1を返すのですか?
>>302 return 1;としてのはmain(void)の関数の宣言みてみ。
int main(void){}
みたくなってるぜ。これって、値返せってことじゃん?
で、0でもいいけど、これもなんだなぁ、って適当に1を返したって
だけ。あまり気にしなくていいよ。ただ、
return;
となってた場合は値返さないから、この場合、main()関数がエラーになっちゃうさ。
(つづく)
>>302 (つづき)
で、次だけど、
>なぜアドレスを10進数で表示するのですか?
だね。
こう書かれてるけど、int 型の箱のあるアドレスにはint値があるわけさ。で、
int nNumberC
となってたばあい、箱ができるってのは前したよね。で、その箱にはアドレスがある。アドレスをしりたければ、
&nNumber
とするって訳だ。
ということは、Add(int* pa, int* pb, int* pc)
に処理が移ったときにも、pa、pb、pcは元の関数で作られたnNumberA、nNumberB、nNumberCのアドレス見にいってる。で、そのアドレスの実体を書き換えてる具体的にどこかというと、
*pc = *pa + *pb ;
のところさ。で、ポインタではpcってなってるけど、これポインタね。で、実体はどれかって言ったら、main()関数のなかでAdd()の関数みてみ。
Add(&nNumberA,&nNumberB,&nNumberC)
ってなってるね、ってことはpcの実体はnNumberCなのさ。
だってmain()関数のなかでAdd(&nNumberA,&nNumberB,&nNumberC)
を読んだ時、nNumberCのアドレスを引数としてるでしょ?またAdd()関数でもアドレスを引数としてるでしょ?なぜアドレスを10進法で表示するのか?ってのは多分、
nNumberA=1;
nNumberB=2;
とかしたところを言ってるんだと思うけど、これは、箱の実体にint 型の値を入れてるのさ。
で、その箱のアドレス(メモリ上でアドレスが割り振られるんだ)を呼び出した関数に引数として渡してる。処理が移った先では
*pc = *pa + *pb;
として、pcの実体(これを表すには*pcとかく)に*paの実体と*pbの実体を
足したものを入れてる、とか考えればなんとかなるかな。
うーん、わかりづらい説明でごめんよ。。
たびたびのミス、ごめんよ。。 下から3行以下つぎのように修正して。 ---------------------------------------------------- として、pcの実体(これを表すには*pcとかく)に、paの実体*paとpbの実体*pbを足したものを入れてる、とか考えればなんとかなるかな。 うーん、わかりづらい説明でごめんよ。。
306 :
297 :02/09/13 18:30 ID:nM8dGr9Q
>>298-301 >>303-305 printf("%d = %d ???\n", &nNumberC, &nNumberC2);
これだと"0 = 3 ???"とは出ませんが...。
>>297 うそ???
わり、んじゃ、たとえは失敗だ(汗)
あれあれ、しっかりと動かしてみたないとだめだなぁ。
反省反省。
わりわり、intのところでint型、全て再定義してる上に、 printf("%d", nNumberA); みたいでないと、なにやら数字の羅列でるね。。 今度はデバッグ済みだからうごくはずだよー。 int main(void) { /* nNumberA、nNumberBをつくり初期化 */ int nNumberA = 0; int nNumberB = 0; int nNumberC = 0; int nNumberC2 = 0;/* nNumberCとnNumberC2の値が等しいか確かめるため追加 */ nNumberA = 1; nNumberB = 2; nNumberC2 = Add(nNumberA, nNumberB, nNumberC); printf("%d = %d ???\n", nNumberC, nNumberC2); return 1; } int Add(int a, int b, int c) { /* aとbを足す */ c = a + b ; return c ; }
ま、どういうことを知って欲しかったって、例えば Add(nNumberA, nNumberB, nNumberC) でAdd()の引数の一つにnNumberC(実体)を渡しても、 Add()から処理を抜けてきたときに、nNumberCの値は Add()の処理に移るときの値のままだってことさ。 これをAdd()に引数として渡して渡した値が期待どうりに書き換えられて Add()の処理から戻るにはAdd()を void Add(int* pa, int* pb, int* pc) { *pc = *pa + *pb; return; } の要にアドレスを引数としてAdd()を宣言してあげないと、ということに なるのさ。(void Add()って関数を定義してるけど、int Add()とかでも 問題はないよー。戻り値は今の場合気にしないで。)
>>309 せめてプログラムが動くのを確認してから書き込んでくれ。
ここは初心者スレ。
何度も何度も間違った書き込みをされるとわけわからなくなる。初心者なら特に。
しかもなんか理解不足のような…
>>310 うん、動くの確認してから書き込む事にするよ。
>>しかもなんか理解不足のような…
これは煽りですか?
俺は十分、ポインタに関しては理解してるよ。
変数の名前の付け方見ればプログラミングの仕事で使っている
事は理解していただけると思います。
>>311 int* a;
て宣言してる所と変数名の命名規則からまともだって事は了解。
ただ変かも。。ってわしも人の事いえないがな、、
慢心はよくないです。精進しないと、、
>>312 ありがとう。。。分かってもらえる人がいてちょっと嬉しいです。
俺のコーディングにも変なところは沢山あります。。。
他人のコードに目通してるつもりなんだけどね。。。
俺はまだまだ精進必要っす(汗)
314 :
310 :02/09/13 22:44 ID:TG9il/Ef
>>311 すんません、俺が理解不足でした。
nNumberC2 = Add(nNumberA, nNumberB, nNumberC);
printf("%d = %d ???\n", nNumberC, nNumberC2);
return 1;
}
int Add(int a, int b, int c)
{
/* aとbを足す */
c = a + b ;
return c ;
}
を見て、Addの3番目の引数意味ないじゃんと思ってたら、そのような例を示してただけなのね。
俺も前を確認してから書き込むようにします。
>>315 君は部下を持った事がないな。
>>314 わしの例かな?
あれは意図的にわかりやすいかな。。と思い書いたが混乱の元か。
例がなかなかむずかしいのよ。
>>310 いえいえ、気にしないでくださいな。
俺が意図不明瞭なコードかいたからですよー。
かなりの達人でも理解に苦しむ(高度なテクニックという
訳ではなくわかりずらいコード)コードならその時点で初心者には
向いてない説明ということです。
うーん、どうやって説明したらいいんだろうなぁ。うーん。。
>>297 いきなりC++とかObjective Cやるのは悪くないと思う。
オブジェクト指向とか言われると分からなくなっちゃうけど、
便利な標準ライブラリはどんどん使ってもいいんじゃない?
319 :
257 :02/09/14 00:55 ID:ysk5Z6o3
>>317 なんか変に見えるのは、nNumberAとnNumberBを0で初期化したすぐ後に、それ
ぞれ1, 2を代入しているからでしょう。
あと、短いソースですから、変数名も単純で短い方がいいでしょうね。
ポインタの説明なら定番のswap関数あたりでしょうか。
320 :
297 :02/09/14 01:02 ID:ysk5Z6o3
>>318 わたしもいいと思いますよ。
でも、CはCでやっといた方がいいと思います。
>>318 いきなりJavaってのも一つの手なんですが、それもそれで問題があるしな。
だいいちこのスレはCの入門スレなのでそのあたり出していいものかやや疑問。
実際はインタプリタ型言語で勉強した方がプログラムの基礎だけならわかりや
すいかもしれず、、
ほんとうにはじめてプログラミングするならJavaScriptは意外といいです。
あとはpythonかな。
322 :
320 :02/09/14 01:21 ID:ysk5Z6o3
>>321 いやさ、なんつーかみんな微妙なのがC言語の初心者
なのかプログラミングの初心者なのかって所ではないかと。。。
最初はCはやったこと無いけど外の言語はやったことがある
人向けのスレかとおもったーよ。
>>322 文章がまとまってなくてスマソ。
>>288 経由ってのは了解してます。
BASICからスタートは個人的には現在はあまりおすすめしません。
# 好みの問題やもしれず。。
Javaのインタプリタってのもありますが、そもそも強い型言語が
「プログラミング初心者」にいいかどうかはわしもよくわからない。
定説的には弱い型言語の方がいいとされるが、、そうともいいきれんかも、、
>>323 わしはMac板にスレたった段階でプログラミング初心者含むだと思っていた。
というか1氏が完全にプログラミング初心者だったからかもしれず、、、
325 :
322 :02/09/14 01:43 ID:ysk5Z6o3
>>324 いやあ、自分がBASICだったもんで。しかもS-BASIC...。
>>323 わたしも初心者向けかと思ってました。
質問されてるかたもそんな感じでしたから。
326 :
318 :02/09/14 02:07 ID:oGtDmA6q
>>321 >だいいちこのスレはCの入門スレなのでそのあたり出していいものかやや疑問。
ごもっともですね。
済みません。
Mac板でCってことは、Carbonか Cocoa、
ひょっとするとPOSIXかも知れないけど
C++、あるいは Objective Cと交ぜ書きできるから、
別にいいかなー、なんて考えていました。
forでも、for( int i = 0; i < 5; i++ )みたいな書き方
便利ですし。
327 :
名称未設定 :02/09/14 02:59 ID:Rjr2CVYN
俺は独修Cって本が結構よかったよ。
328 :
名称未設定 :02/09/14 07:37 ID:EuyB8xEP
>>327 僕も今、独習Cで勉強中ですが、ProjectBuilderだと(というかmacだとかな?)
getcheが使えないので3章でいきなりつまずきました。
あとポインタのところの説明ががあっさり終わってしまって、個人的には
「もっと説明してよ」って感じなので、ポインタのところだけ、別の本で勉強しよう
かなと思ってます。今日からようやく7章に入ります。
329 :
308 :02/09/14 07:39 ID:QB4qj2e5
>>319 なんであんなわかりずらいまわりっくどい事したかって
ここ見てる初めたての人に、『ポインタがなぜ必要なの?』って事や、
『ポインタを使うとこんな事できるよ、だったら使ってもよいのでは?』
『つかうならこんな使い方もあるよ!』と順を追って言いたかったのです。
言いたかったわには意図が不明瞭で結果混乱しただけでしたね(汗)
swap関数は当然よい説明になる思います。
ポインタ不要論とかでてたので、『ポインタが必要!』とか感じてない
人もいるのかな・・・とか思ったのです。
なので関数の引数としての例を挙げれば、今度『ポインタ必要!』って感じる
かな、と思ったのです。
330 :
325 :02/09/14 10:09 ID:ysk5Z6o3
>>326 ループカウンタにちょっと使いたい時等には便利ですが、私は面倒でも必ず
ブロックの先頭で宣言するようにしています。
CでもC99では問題ありませんが、一般的ではありませんね。
331 :
325 :02/09/14 10:24 ID:ysk5Z6o3
>>328 Macだからというより、getcheはCの標準関数ではないからですね。
ポインタについては、習うより慣れろ的なところがありますので、とにかく
ポインタを使ったプログラムをたくさん作りましょう。
私は本を使わなかったので、いい本をおすすめできませんが、インターネッ
トで例題を探すといいかもしれません。
332 :
325 :02/09/14 11:00 ID:ysk5Z6o3
>>329 不要も糞も(失礼)ポインタを理解しないでCを理解したとは言えませんか
らね。
上にもちょっと書きましたが、個人的な経験からいうとポインタはいずれ
理解できます。
本よりも諦めない理由(仕事だからとか)の方が重要かもしれません。
初心者がこのスレを読むとかえって混乱するおそれがある罠。
>>326 >forでも、for( int i = 0; i < 5; i++ )みたいな書き方
>便利ですし。
ProjectBuilder だと宣言できないよ
なんだかな。
336 :
名称未設定 :02/09/14 15:38 ID:P/LgHNlp
>>12 >>35 Terminalでccって打ってもコマンドが見つからないって言われるんですけど。。
#include <stdio.h> int main(void) { int i; char giko[] = "giko",mona[] = "mona",shii[] = "shii",foon[] = "foon"; char *p, *q; printf("&%s %d\n", giko, giko); printf("&%s %d\n", mona, mona); printf("&%s %d\n", shii, shii); printf("&%s %d\n", foon, foon); printf("&p %d\n", &p); printf("&q %d\n", &q); p = giko; printf("p = giko: &p %d, &(*p) %d, p %s\n", &p, &(*p), p); p = mona; printf("p = mona: &p %d, &(*p) %d, p %s\n", &p, &(*p), p); p = shii; printf("p = shii: &p %d, &(*p) %d, p %s\n", &p, &(*p), p); p = foon; printf("p = foon: &p %d, &(*p) %d, p %s\n", &p, &(*p), p);
for(i=0;foon[i] && giko[i];i++) { foon[i] = giko[i]; } printf("&p %d, &(*p) %d, p %s\n", &p, &(*p), p); for(i=0;*(p + i) && mona[i];i++) { *(p + i) = mona[i]; } printf("&p %d, &(*p) %d, p %s\n", &p, &(*p), p); q = shii; while(*p && *q) { *(p++) = *(q++); } p = foon; printf("&p %d, &(*p) %d, p %s\n", &p, &(*p), p); return 0; }
340 :
三前二後 ◆1CV58ydQ :02/09/14 18:34 ID:XlBIhwPg
C言語体当たり学習徹底入門に載っているやつなのですが… ?#include <stdio.h> int main(void) { intheight; intweight; printf("身長を入力してください>"); scanf("%d", &height); printf("体重を入力してください>"); scanf("%d", &weight); printf("身長は%d\n", height); printf("体重は%d\n", weight); return 0; } ↑これをProject Builder(Standard Tool)でビルドとデバッグを選択すると ↓こうなってしまいます 10 10 身長を入力してください>体重を入力してください>身長は10 体重は10 BMI はステータス 0 で終了しました。 Terminalからでは文字化けはするものの、ちゃんと表示されます。 なぜこうなってしまうのか、何が原因なのでしょうか? Hello world!は、ちゃんとできました!
341 :
332 :02/09/14 18:44 ID:ysk5Z6o3
>>333 そうかもしれません。
が、混乱してみるのも勉強になるかもしれません(ならない?)。
>>334 1. プロジェクトウインドウでターゲットタブをクリック
2. ターゲットを選択
3. 設定 -> シンプルビュー -> GCC コンパイラ設定をクリック
4. その他のCコンパイルオプションに-std=c99を入力
でできます。
342 :
332 :02/09/14 19:06 ID:ysk5Z6o3
>>340 変数の宣言の後に、こんなのを入れてみてください。
setvbuf(stdout, NULL, _IONBF, 0);
うまく行かなかった理由は、setvbufの説明を見ると判ると思います。
>>333 初心者がこのスレを読むとかえって混乱するおそれがある罠
2ちゃんねる初心者は対象ではないので...
このスレに書いてあることが真実かどうかを調査する「努力」ができないと調査能力および本気でマスターする意欲にかけるとおもわれてもしかたないかもしれず。
344 :
名称未設定 :02/09/15 02:16 ID:qWZASH6A
いやさー、いろいろ気になって書き込んできたけど、 Emacsうまうまいる限り平気ね。 あと、このスレは初心者向けには結構いい子とあると思うから。 自分で取捨選択して行けば結構プログラミング上達すると おもわれ。 わざとあげ
>>298 辺りからざっと見の感想です。
人に物を教える場合、特に文章のみで長々となってしまう場合は、
テキストフィールドに書かず、エディターで書いた上で、
1時間から1日辺りほっといて、見直した方が良いかと思います。
幾らプログラムが書け、知識があっても、教える事・物を書くことは別の技術です。
済みません、横槍を入れるようで申し訳ないです。
>>345 正確に記述することは大切ですね。
どころで、
>人に物を教える場合、特に文章のみで長々となってしまう場合は、
>テキストフィールドに書かず、エディターで書いた上で、
>1時間から1日辺りほっといて、見直した方が良いかと思います。
とすることは、重要でとても大切なことです。
しかし、これは『物を書く技術』ではないでしょうか。
『教える技術』とは、どのような物とお考えですか?
スレ違い
>>346 俺は思うんだけどね、プログラムにしてもそうだけど、
丁寧に書くとかきれいに書く、とかとても大切。
『教える技術』では問題点を解決する、とか、違いを示す、
とかでは俺は不十分と考えてる。ポインタと実体はこんなに
違う、とか説明してもやっぱわからないと思うぜ。
相手にポインタを使わせたくなる気持ち、や、ポインタって面白い!
って思わせる気持ち、まとめりゃ、知りたくなる欲求を起こしてあげなきゃ
どんなに詳しく説明しても、『で、なんでポインタって要るの?』って
なるだけだと思うぜ。
以前、2つの数をとってきて、足した結果を表示、なんてのしたらどう?
ってプログラム書いたのは俺だけど、ここに要るはじめたて人が、『それなら俺も
できる』とか、『〜喜んでる(
>>63 )』とか書かれてるところみると、
きっとここのレベルではうまくいってたんだな、とおもうぜ。
で、ポインタあたりでは、俺もどう表現していいやら迷うわけで
混乱してしまったということあなぁ。
にしても、奇麗に書く事はとても大切。ふだんから心掛けなきゃだな。
(スレ違い、すまん)
> スレ違い って書き込まれた後で > (スレ違い、すまん) って正直どうよ?
350 :
238 :02/09/15 17:17 ID:XO2Id0kk
>>348 それほどスレ違いではないと思うんだが。
>>342 ありがとうございました。
>>340 のコードに
setvbuf(stdout, NULL, _IONBF, 0);
↑これをいれたら、ちゃんと表示されました。
setvbuf関数について、関数の説明をしているサイトなどで調べてみました。
自分なりに解釈するとこんな感じなんですけど…。
setvbuf(stream, buf, mode, size)
任意のstreamのバッファリングの制御。
streamに送るすべての指示の前に呼び出す。
bufがNULLのときはmodeだけ変更される。
modeはマクロを使っている。
setvbuf関数にはmodeが3種類ある。
_IONBF 任意のstreamに対しバッファリングなし NがたぶんNoを表す
_IOLBF 任意のstreamに対し一行バッファリング LがたぶんLineを表す bufはsizeよりも大きいものじゃないとだめ
_IOFBF 任意のstreamに対し全部バッファリング FがたぶんFullを表す bufはsizeよりも大きいものじゃないとだめ
マクロは、#define〜と書いて#includeと同じく、コンパイルされる前にプリプロセッサで処理される。
マクロを使えば、条件分岐の条件式の数値などを書き換える手間が省ける。
>>351 の続き
?modeが3種類あるので、modeを入れ替えて実行してみましたところ…
_IONBFは、sizeにどんな数値をいれても、直接表示。
やっぱりバッファリングしてないらしい。
_IOLBFと_IOFBFは、sizeに入れる数値によって表示が変化する。
試しに、いろいろな数値を入れてみました。
_IOLBFは、bufよりもsizeが大きいときも小さいときもちゃんと表示する。
_IOFBFは、bufよりもsizeが大きいと入力を受け付けてから表示して
sizeが小さいときはstreamの文字列÷sizeで割り切れたものは表示して、余りは保持する。
_IOLBFと_IOFBFは、いまいち分かりません…。
REALbasicのReadLineとReadAllと同じかなと思ったんですけど
ファイルを扱うまでは、ほっといてもいいのでしょうか?
setvbuf関数の役割は
「NHKのど自慢」の司会者が、高齢の参加者の横で歌い出しのタイミングを
「はいっ」と小声で言いながら、肩をポンと叩くようなもの…。
でいいでしょうか?
353 :
345 :02/09/16 04:01 ID:UUlYw865
>>346 正直、わかりません。こっちが教えて貰いたいくらいです。
>>348 ちょっと教わった気がします。ありがとう。
学ぶ者の力を引き出す技術。相手の考えを理解し、次の目標へ進む足掛かりになる…。
教える人と学ぶ者の関係は靴と足の関係に思えます。
双方が合えば、ズンズン進みますが、マズいと、足を痛めてしまいます。
学ぶ者の意欲も必要ですが、教える側はそれを伸ばし、
マズいやり方はフォローしなければなりません。
双方を繋ぐのは知識とコミュニケーションだと思います。
対面していれば、すれ違いは直ぐにフォロー出来ますが(でない事も沢山ありますが)、
文章の場合、なかなか難しいです。それは2chを眺めるとわかるように、
ちょっとしたすれ違いで、煽られたり、荒らされたりします。
知識。以前どっかのスレで、「何の為に、変数や関数の頭にアンダーバー
を付けているのか」という質問がありました。
自分は「プライベートな物とパブリックな物を見分ける為に付けている」と答えましたが、
「Cのライブラリに付いているものだから気を付けるように」
(正確に何と言ったか忘れた…ゴメソ)と他人様のフォローが。
間違った知識や遣り取りは命取り。
自分が思った、教える為に必要な事。
自分と相手が何を知っていて、何を知らないか。
(自分と相手の前提条件が違うと大変)
(自分の限界を知る事。Cのライブラリなんてしらね〜)
相手の質問が漠然としていたら、それをハッキリさせる。
(「困ってます」「何があったの?環境は?」みたいな?)
他にも沢山あるんだろな。
今の自分に技術は在りません。ここら辺で手一杯です。
これじゃ、どうやって力を引き出すんだよ。
嗚呼鬱市。すれちがいなのでage
354 :
342 :02/09/16 05:54 ID:QvlrmKrk
>>351-352 _IOLBFの時はnewlineが出力されるまでバッファリングします。
このモードにして、"...ください>\n"のようにnewlineをつけてみてくださ
い。
_IOFBFはバッファが一杯になるまでバッファリングします。
歌で例えるなら、
歌詞を見ながら歌うのが、_IONBF、
1行ずつ憶えて歌うのが、_IOLBF、
憶えられるだけ憶えてから歌うのが、_IOFBF、
という感じでしょうか。
で、途中までしか憶えいないのに、歌わないといけなくなった場合のために
fflush()という関数があります。
これはいままで憶えた(バッファリングした)分を歌って(出力して)しま
います。
setvbufを使うかわりに、printfの後にfflush(stdout);をいれてみてくださ
い。
教える技術で大切なこと。 よけいなことを言わない(教える方がしゃべり過ぎない)。 質問しやすい環境を作る。 以上。
356 :
348 :02/09/16 19:23 ID:0g4Zx+fc
>>353 ,345
私が345さんを見た感じ、『高度なスキルが最高の教材』といった
考え方ではないですし、大変深く考えていると思います。
ここに訪ねにくる人にどんどんアドバイスをすることで、
訪ねにきた人もますます歩みを進める事ができると思います。
すばらしい事ですよ、今まで持ちえない概念を物にしてゆく他人の様は。
project builderでグローバル変数を見るのと、 メモリダンプするのってどうやるの? スコープ内のスタックにある変数は見れるんだけど、 他のは見れないっす。
358 :
348 :02/09/16 22:57 ID:0g4Zx+fc
>>357 ちょっと違ってるかもしれないけど、
[デバッグ]-[式...]
というのが有りますが、これはどう試してみるのもよいでしょう。
>> 357 Consoleからgdbを直接使うしかないかな
360 :
名称未設定 :02/09/17 21:57 ID:aQ5chp3a
age
>>354 お世話になっています。
\nを入れてみて_IOLBFと_IOFBFの違いがわかった様な気がします。
setvbuf関数の代わりにfflush関数を入れてみましたが
全部のprintf関数の後に付けなくては意図した表示はされないんですね。
_IONBFはprintf関数の後に毎回fflush関数を書く手間を省けるもの
_IOLBFは全部の入力のための指示で改行してから入力させるときに使える
_IOFBFはただ表示だけするときに使える
おまえ本当にわかったのか?って思われるような理解のしかたでしょうか?
BMI指数を計るの章は終ったのですがちょっと弄くってみようと思い
BMI指数とは全然関係ないんですが名前を入力する部分を付け足してみました。
>>362 の続き
#include <stdio.h>
int main(void)
{
char name[10];
double height, weight, meter_height, bmi;
setvbuf(stdout, NULL, _IONBF,0);
printf("BMI指数を判定します\n");
printf("あなたの名前を入力してください\n");
scanf("%s", &name);
printf("\n");
printf("%sさんの身長を入力してください(cm)\n", name);
scanf("%lf", &height);
printf("%sさんの体重を入力してください(kg)\n", name);
scanf("%lf", &weight);
meter_height = height / 100.0;
bmi = weight / (meter_height * meter_height);
printf("%sさんのBMI指数は%fですn\n", name, bmi);
>>363 の続き
printf("判定結果:");
if (bmi < 18.5) {
printf("痩せ気味\n\n");
}
else if (bmi < 25) {
printf("標準体重\n\n");
}
else if (bmi < 30) {
printf("やや肥満\n\n");
}
else {
printf("太り過ぎ\n\n");
}
printf("BMI指数・・・判定\n");
printf("18.5未満・・・痩せ気味\n");
printf("18.5以上25未満・・・標準体重\n");
printf("25以上25未満・・・やや肥満\n");
printf("30以上・・・太り過ぎ\n");
return 0;
}
>>364 の続き
BMI指数を判定します
あなたの名前を入力してください
名称未設定
名称未設定さんの身長を入力してください(cm)
193.6
名称未設定さんの体重を入力してください(kg)
78.4
名称未設定さんのBMI指数は20.917287です
判定結果:標準体重
BMI指数・・・判定
18.5未満・・・痩せ気味
18.5以上25未満・・・標準体重
25以上25未満・・・やや肥満
30以上・・・太り過ぎ
BMI はステータス 0 で終了しました。
366 :
三前二後 ◆1CV58ydQ :02/09/17 23:59 ID:BCut4SRI
>>365 の続き
Compiling bmi.c (1 個の警告)
bmi.c:27: warning: char format, different type arg (arg 2)
と出るので↑をクリックするとscanf("%s", &name);
のところに連れて行ってくれました。
この警告は、
「違うタイプなのにcharのフォーマット文字列で表示しようとしてますよ」
でいいのでしょうか?
本の後のほうの章にfgets関数を使うと1行分の入力を取得できるとあったので
charの変数宣言をchar name[1024];
scanf("%s", &name);をfgets(name, 1024, stdin);
に変えたら警告は出なくなりましたが「名称未設定」の次で改行されてしまいます。
ネットで調べたら、gets関数は改行文字かEOFまでの1行を取得できるとありましたが
gets関数はバグがあるので絶対使ってはいけないとありました…。
改行文字を取り除くにはどうしたらいいのでしょうか?
>>366 scanf("%s", &name);
でなくscanf("%s", name);のような。既にメモリアドレスを指してるわけだし。
368 :
三前二後 ◆1CV58ydQ :02/09/18 00:44 ID:S1x0iqCK
>>367 ありがとうございました。
scanf("%s", &name);をscanf("%s", name);に変えたら
警告が出なくなりました。
Cの絵本のキーボード入力のところに
配列名は配列の先頭要素のポインタとなるため&は要らないとありました。
地図の上で目的地のところに印を付けるのが&の役割なんですね。
だから、既に目的地のところに印が付いているのに
また印を付けてなんて指示されたから警告が出たんですね。
コンパイラの気持ちは
「しょうがないな…警告を出しておくけど、やらせたいことはわかるから実行はしてやるよ」
ってところでしょうか。
>>366 今回の場合、改行文字を'\0'にします。
身長に0を入力するとどうなりますか?
370 :
354 :02/09/18 03:00 ID:RqMPW2GL
>>362 今のところは動作の違いが解っていればいいと思います。
>>366 warningの意味は、scanf()の第2引数の型が、第1引数のformatで指定した
変換指定子と異なるということです。
ここでは、変換指定子がsなのに、第2引数がcharの配列へのポインタになっ
ています。
ですので、
>>367 さんが書かれているように、第2引数はnameにします。
fgets()で取り込んだ文字列から改行文字を取り除くのは、定番の演習問題で
すね。
配列を先頭から順に調べて、改行文字が見つかったらそこを'\0'に変えるよ
うにすればいいでしょう。
getsについてはバグというより仕様に問題があると言った方がいいでしょう
が、何にせよ使わない方がいいと思います。
scanfも単独での使用には問題がありますが、それもそのうち判ってくると思
います。
「今のところは」とか「そのうち判る」とか言わないでちゃんと教えろと思
うかもしれませんが、ある程度Cに慣れてからの方が理解しやすいと思います
ので、今は気にせずどんどん先へ進みましょう。
371 :
名称未設定 :02/09/18 22:37 ID:KibWoOIB
コマンドライン引数がわかりません。ProjectBuilderで ?#include<stdio.h> int main(int argc, char *argv[]) { int i; for(i=1;i<argc;i++)printf("%s",argv[i]); return 0; } を実行すると、何も行われません。また、 ?#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; double d; long l; i = atoi(argv[1]); l = atol(argv[2]); d = atof(argv[3]); printf("%d %ld %f", i, l, d); return 0; } を実行すると、「シグナル 10(SIGBUS)により終了しました。」 と返されてしまいます。コマンドライン引数・シグナル 10(SIGBUS) とは何なのでしょうか?
372 :
370 :02/09/18 23:19 ID:RqMPW2GL
>>371 多分引数に何も指定していないのだと思います。
ProjectBuilderで引数を指定するには、
1. ターゲットタブをクリック
2. Executablesから実行ファイルをクリック
3. 引数の欄に、引数を指定
2つめのプログラムは、引数がないのにargv[1]にアクセスすると、Bus error
になります。
ねぇ、char と char * と *char と char* の違いを 教えて下さい。どうかお願いします。
>>373 char *ってchar *moji;ってことか?
*charってなんだ?
むしろこっちが聞きたい。
聞きたいことが曖昧すぎると答える方は大変だw
char * は引数なんかで char 型のポインタの時に書いてありません? *char は単に変数 char のポインタを勘違いしたのかもしれません。 char* は良く分かりません。 "*" が色々な形式で使用されるので、体系的な説明が Web とかでない かなっと思ったのですが、ポインターだけでも教えて下さい。
>>375 基本的にはccはchar* = char * =char型へのポインタ(の宣言)と解釈する。
だからどれも一緒であとは好みとか流派wの違いだと思う。
ニュアンス的にはchar*は「char型へのポインタ」という型って感じで
char *pは「char型の変数*pの宣言」という感じかな?
>>371 setvbuf()を設定しないと何も表示されないかも、このまままだと、
もしくはprintf("%s\n",argv[i]);に変更してみて。
うんでTerminalから cc source.cするとa.outができるので
./a.out This is a pen
てやってみ。
# ProjectBuilderでの設定は370氏が記述してる通りらしい。
シグナルというのはエラー番号ぐらに思とけばいいのでは。
>>373 『*char と char* の違い』って
char szMozi;
&szMozi;
の&szMoziと、
char* pszMozi;
のpszMoziとの違い、ってことなのかなー。
いろいろな解釈できちゃって(つまり文章の意味が良く理解できなくて)
答えに苦しむなぁー。
380 :
372 :02/09/19 09:39 ID:/4Fd05i4
>>371 >>378 setvbuf()はなくてもいいですね。
通常stdoutは、Terminalではline bufferedモード、Project Builderでは
fully bufferedモードになります。
Project Builderでビルドした実行ファイルもコマンドラインから実行できま
すので、buildディレクトリにある実行ファイルをつかってもいいでしょう。
シグナルについては、man signalしてみてください。
ついでに、kill(1)も見るといいでしょう。
Emacsうまうまさんの言うとおり、今はあまり深く追求しないでもいい
と思います。
381 :
三前二後 ◆1CV58ydQ :02/09/19 23:19 ID:9HFlA/oS
いつもお世話になっております。
>>370 C言語の勉強を始めて数日ですが、とても楽しいです。
Hello, world!では
printf()
BMI指数では
printf(),scanf(),setvbuf(),fflush(),fgets(),gets()
gets()は使っていないのですが、Hello, world!のときより5つも関数が増えました。
自転車の補助輪を外して練習していた頃の気分です。
プログラムのコードよりも覚え書きのコメントのほうが多くなっちゃってます…。
>>381 >プログラムのコードよりも覚え書きのコメントのほうが多くなっちゃってます…。
それはとてもすばらしいことです。
コメントも立派なプログラムの一部ですよ。
385 :
371 :02/09/19 23:56 ID:fpX9YE0X
>>372 ,377,378
教えていただいたとおりにやって、思うように動きました。ありがとうございます。
ターゲットタブの中をいじったのはこれが初めてです。ブレークポイントのところ
もまだいじったことありません。このあたりって、Cを一通り理解したあたりで
使えるようになればいいのでしょうか?ProjectBuilderのヘルプでデバッガとか
調べてもまだ理解できませんでした。
386 :
371 :02/09/20 00:03 ID:Bo9zDw2r
>>383 Emacうまうまさん
ビンゴです。いま独習Cで勉強中です。教えていただいたホームページも参考にさせていただきます。
>>376 , 378
ありがとうございます。
char *a と char* a は同じなんですか。カーニハンの P.114 に
double *db, atof(char *);
この char * は atof の引数が char へのポインタであると書いて
ありました。これら仕様は少し分かりにくくないですか?
瑣末な事なので、分かっている人は気にならないのでしょうか。
>>379 済みません。*char は私の勘違いだと思います。でも、変数名に
char と付けるのは良くないですよね。確か何かのサンプルコード
だったと思います。
どうもありがとうございました。
388 :
380 :02/09/20 09:27 ID:RBQcv361
>>381 楽しいのはいいですね。
どんどん先へ進みましょう。
そのうち、原動機がつき、4輪になり、翼が付きますよ。
事故った時のリスクも高くなりますが...。
389 :
380 :02/09/20 09:33 ID:RBQcv361
>>383 フォローありがとうございます。
私は多分初心者には(というか誰にでも)優しくないと思いますので、これ
からも不十分な点がありましたら、よろしくおねがいします。
390 :
380 :02/09/20 09:41 ID:RBQcv361
>>385 デバッガを使うのはCを理解するのにも役立つと思います。
とりあえず、Project Builderヘルプの「デバッグする」->「ブレークポイン
トとウォッチポイントを設定する」と「変数を表示する/設定する」を読ん
でみましょう。
変数の値をチェックできるだけでもずいぶん便利なはずですよ。
>>386 == 371
独習Cは内容ちゃんとしてるけど一部説明がわかりずらいい部分がある感じで
す。
まあどの本でも註釈は必要な部分あるので、検索して不明な場合は質問した方
が速いかもしれません。
>>389 == 380
いえいえ。気付いた所に註釈付加してるだけです。
>>385 380氏と近い意見です。まあ慣れない内は頻繁に利用する必要もないかと思い
ますが、時々りようするとだんだん意味が理解できてくるかと思います。
何事にも王道はありません。最初は「理解する」というより「理解する努力をする」
方が重要だとわしは思うのです。
# 私信だが、、わしやっと夏休み、といっても火曜日だけ、しかし土日月ちゃ
# んとやすめるので旅行でもいってきますわ。まかせた380氏(w
392 :
371 :02/09/22 13:28 ID:6j6ibf9Y
こんどはファイルシステムでつまづきました。 ?#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp; char ch; /* ファイル名の指定を調べる */ if(argc!=2) { printf("ファイル名の指定がありませんn"); exit(1); } if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができませんn"); exit(1); } while((ch=fgetc(fp)) != EOF) putchar(ch); fclose(fp); return 0; } をProjectBiolderで引数をname.txtにして実行しても 「ファイルを開くことができません」になってしまいます。name.txtはmain.cと同じ ディレクトリに作成したのですが、他のところに作らなくてはいけないのでしょうか? あと、同じコードをTerminalでccすると ld: Undefined symbols: ___gxx_personality_v0 となってしまいますが、なんのことだかさっぱりで...。
393 :
392 :02/09/22 16:34 ID:6j6ibf9Y
>392自己レスです。 Terminalで実行すると期待通りname.txtの内容を表示できました。 (さっきと何が違うのか自分でもわかりません) ProjectBuilderではやはり「ファイルを開くことができません] になってしまいました。
394 :
392 :02/09/22 16:54 ID:6j6ibf9Y
>392 またまた自己レスです。 ターゲットタブをクリックし、Excutablesから実行ファイルを ダブルクリック、実行時の欄で作業ディレクトリを選択し直したら ちゃんと動きました。お騒がせしました。
>>392 これでも思ったように動くと思うけど、このプログラムの内容からすると
char ch;
と書くのは間違いだね。。
なぜ間違っていて、どう訂正するのかはとりあえず自分で調べてけれ。
ガンガレー
人がいないのであげてみよう
398 :
名称未設定 :02/09/26 19:51 ID:pRy/IR40
間違えた
...人いないですね(T_T) なんか問題でもだしたらだれか解いたりしてくれるだろうか,,
質問がCの初歩的なことなのでプログラム板で事足りるのでは?
401 :
390 :02/09/27 09:43 ID:SxbbXQMC
>>399 連休中はさすがにみんな遊びに行ってるんだろうと思ってましたが、それだ
けじゃなかったみたいですね。
みなさん自力でがんばってると思っておきましょう。
>>400 それを言っちゃあ...。
でも、Project Builderの話題もありますのであってもいいと思いますよ。
402 :
392 :02/09/27 12:20 ID:KXadaBpf
>396さん char ch;の間違いの件、分かりませんでした。ヒント下さい。 >399 人いますよ(少なくとも1人は)。 超初心者向けの問題だったらがんばって解いてみようと思います。
403 :
401 :02/09/27 13:37 ID:SxbbXQMC
>>402 396さんではありませんが、ヒントはman fgetcです。
ch = fgetc(fp)は...
404 :
392 :02/09/27 14:47 ID:KXadaBpf
fgetcの戻り値はint型であるべきなのに、char型のch=fgetc()としているところが 間違い...でよろしいのでしょうか? ちなみにProjectBuilderでchar ch;をint ch;にしても動きました。
おぃおぃ本当にそれで良いのか? 392がほすぃのはint型の値じゃなくてchar型の値だろ。 だったらchar chじゃ無いとまずいだろ。
406 :
396 :02/09/27 15:53 ID:nGAAdYd5
>>402 まぁ、
>>404 で正しいけど、以下のことを考えてみて。
fgetcはファイルから読み取った文字を返します。
ファイルを最後まで読み終わるとEOFを返します。
さて、ファイル中にもしEOFが存在したらどうなるでしょう?
fgetcは何を返せばいいでしょう?
407 :
403 :02/09/27 16:14 ID:SxbbXQMC
>>405 man putcharもしてみましょう。
408 :
392 :02/09/27 16:21 ID:KXadaBpf
>405 どっちでも動くんですよね、intでもcharでも。他になんか違うところがあるんでしょうか? >406 読み込みファイルに設定したname.txtの内容mynameの間にEOFと入れてmyEOFname としたら、EOFのところで読み込みが止まるのかな?ん〜chをintにしてもcharにしても 問題なくmyEOFnameと表示されました。お〜っと、EOFは負の整数だって独習Cに書いて あったなぁ(通常は-1だって)。じゃあmy-1nameとすると途中で読み込みが止まって myとしか表示されないのかなぁ〜ってやってみたのですが...my-1nameと表示 されました(chをintにしてもcharにしても)。僕は何か根本的な思い違いをしているので しょうか? ちなみに>406さんが指摘されている「ファイル中にEOFが存在したら云々」に関しては ちょっと本を読み進めたら同じような事が指摘されていて、feof(),ferror()でチェックする と書いてありました。この前読んだときは何のことかよく分からなかったのですが、すこし 理解できたような気がします(まだ分かってないかもしれませんが)。
409 :
406 :02/09/27 16:58 ID:nGAAdYd5
>>408 「-1」って書いたら'-'と'1'という二文字になっちゃうよ。
もっと簡単な方法がありそうだけどとりあえず、
#include <stdio.h>
int main() {
FILE *fd;
fd = fopen("testfile", "w");
fprintf(fd, "before%cafter\n", -1);
fclose(fd);
return 0;
}
とかって感じのプログラムを実行すると
-1が内部に入ったtestfileっていうファイルができるよ。
エラーチェックをつけたければ自分でやってくれ。
ターミナルを使うなら、こんなプログラム書かなくても
awk 'BEGIN {printf ("before%cafter\n", -1)}' > testfile
とかってコマンドを実行すればいい。
410 :
392 :02/09/27 17:30 ID:KXadaBpf
>409 確かに、教えていただいた方法でtestfileを作成してfgetc()の戻り値をchar型にすると beforeで読み込みが止まり、int型にするとbefore�afterと最後まで表示されました。なるほど。 fgetcの戻り値をchar型にすると真のEOFと偽物のEOF(こんな表現でいいのかなぁ?)が判別でき ないけどint型ならそれが可能、ということでしょうか? でもそれだと何でfeof()やferrorがあるのかなぁなんて疑問がまた生まれました。
411 :
407 :02/09/27 18:00 ID:SxbbXQMC
>>410 その疑問を解く(一つの)ヒントは、やっぱりman fgetcです。
fgetc()がEOFを返すのは...
412 :
392 :02/09/27 18:52 ID:KXadaBpf
>407 man fgetc()のreturn valuesのところを読むと fgetc()がEOFを返すのは、ファイルの最後に到達したときか、読み込みエラーが生じたとき。 この2つを識別するためにfeof()とferror()が使われる。って書いてありました。 (これはわかるんですが、、、でも同じ事がfgetc()の戻り値をchar型でなくint型にすれば できるんですよね。この理由がわからない...) で、エラーが起こるとグローバル変数のerrnoがエラーを識別するために設定される。 (なんじゃこのerrnoって?man errnoしても何にもでてこない) EOFの状態(本当はエラーかもしれない?errnoのこと?)はとりあえずターミナル上で覚えて おいて、さらに読み込み作業を本当のEOF(ファイルの終わり)に到達するまで続ける。 (ん〜英語に自信が無いなあ、誤訳してそう。) ..すみません結局分かりませんでした。manが使いこなせません。
413 :
411 :02/09/27 22:23 ID:9NMezIFm
>>412 戻り値をcharで受けてもintで受けても、ファイルの終わりなのか、エラーに
なったのかは判断できませんね。
414 :
392 :02/09/27 23:09 ID:KXadaBpf
>412 あっ、やっぱりそうなんですか。でもそうすると>409 >410のように 意図的に途中にEOF(-1)が入ったファイルを作るった場合に、fgetc() の戻り値をcharにした場合とintにした場合で結果が異なるのは何故なんでしょう? 意図的にEOF(-1)を作った場合以外にもエラーになることがあるということなのでしょうか?
415 :
413 :02/09/28 00:21 ID:dsHEaITP
>>414 fgetc()は、unsigned charで読み取った値をintに変換して返すからです。
-1をunsigned charにすると...
>>414 >>392 のプログラムの
putchar(ch);
の部分を
printf("%c:%d:%d ", ch, ch, (char)ch);
とかって書いて実行してみたら?
実行する前に、どういう結果になるのか想像してからね。
>>414 int のサイズが2バイトとすると(最近は4バイトが多いが)
EOF -> 0xFFFF、データ中の -1 -> 0x00FF の違い。
418 :
名称未設定 :02/09/29 20:25 ID:/mjKyy7o
419 :
412 :02/09/29 20:42 ID:NLsBSK/K
>418 ありがとうございます。実は、1週間ぐらい前にjmanインストールしたのですが、 環境変数の設定の仕方もろもろが分からずに使えませんでした。 で、いまはC、Cocoa、Unix(B shell)の勉強を行ったり来たりしています。
420 :
418 :02/09/29 21:26 ID:/mjKyy7o
>>419 PATHのこと?
tcsh使ってるなら、 ~/.cshrc ってファイルを作って、
set path=($path /usr/local/bin)
と書いとくと、幸せになれるかも。
shell の勉強もしているということなので、解説は割愛。
ちなみに、環境変数を設定していなくても
% /usr/local/bin/jman
で使えると思う。
421 :
名称未設定 :02/10/03 11:13 ID:C+ZpC/fs
スレ参加者募集あげ。
数日これない間にさびれぎみ、、(-_-) ム板にいってしまったのかな、、
>>422 みんなある程度すると自分で考え、調べ、学ぶ事が
出来て行くのではないでしょうか?
なんというかある程度はプログラミング(C)についての
道理や筋道が見えてくるというか。。。
とりあえず、新規参加募集age
>>423 そうやね。
ってか自分でできるようにならんとヤバイでしょうし。
しかし新規参加者不足ですな。
ム板にいきなりいってるのかもしれず。
425 :
238 :02/10/09 12:19 ID:8CXNpsst
GUIを絡めた、Cプログラミングってどんな感じなの? PowerPlant + CodeWorrior (C)とか。
ProjectBuilder + InterfaceBuilder じゃないかな。
427 :
238 :02/10/09 14:23 ID:8CXNpsst
>>426 Cプログラミングだと、CW+PPの組み合わせの方が多そうだな、と思ったから。
もう、CプログラミングでもPB+IBの方が多いのかな。
428 :
426 :02/10/10 00:13 ID:ggYyHlG5
>>427 あぁなるほど。仕事でバリバリ組む人はそっちのが多いのかなぁ。
勉強し始めた俺は mi + Terminal だったりします。
RSAの簡単な実験のつもりで以下をterminalでccすると ld: Undefined symbols: _decript _encript とエラーが出ます。どうか間違いやまずい点をご指摘下さい。 #include<stdio.h> #include<math.h> int decryptkey, n,ln; int getPublicKey(void){ n = 11*13; ln = 10*12; decryptkey = 17; return decryptkey; } void encrypt(char* pt, int e){ int buffer,t; t = 0; while(pt[t] == -1){ buffer = (int)pt[t]; pt[t] = (char)(fmod(pow(buffer,e), n)); t++; } }
void decrypt(char* pt){ int buffer,t; t = 0; while(pt[t] == -1){ buffer = (int)pt[t]; pt[t] = (char)(fmod(pow(buffer,decryptkey), n)); t++; } } int main(void){ int encryptkey; char* text="this is plain text."; encryptkey = getPublicKey(); printf("public key is:%d",encryptkey); encript(text, encryptkey); printf("encrypted text is:%s",text); decript(text); printf("decrypted text is:%s",text); return 0; }
cryptとcript
432 :
429 :02/10/10 12:33 ID:Sv5RKon6
>>431 ありがとうございます。タイプミスだったすね。
なんだか恥ずかしいです、とても。
で、直すと無事コンパイルが通りまして
実行するとencryptや、decryptの中の
whileが実行されないようです。
このように文字列を扱うのは間違いなのでしょうか?
while()ってのは 括弧の中が真である時に繰り返される。 -1ってのは文字列の最後に出てくるんだよね? つまりpt[t] == -1が真になるのは・・・。
434 :
415 :02/10/10 14:18 ID:E9qOCXvY
>>432 whileループに入る条件が成立してませんね。
あと、文字列リテラルはナル文字で終わります。
それと、文字列リテラルは書き換えないようにしましょう。
435 :
429 :02/10/10 23:50 ID:Sv5RKon6
>>433 ,434
ご指摘ありがとうございます。
なるほどです。本をよく読めって感じですね。。。
とりあえずwhileのところは
while(pt[t] != '\0'){
とやってみるとうまくいきました。
ただ根本的な部分で間違いをしていまして
それについて考えています。
ユーグリッドの互除法(改)のやりかた。。
436 :
429 :02/10/11 03:44 ID:cGX7Km9y
改変に改変を重ね以下のようになりました。 一応動きますがバグあり、突っ込みどころ満載だと思いますので、ぜひ突っ込んで下さい。 また、ご指摘を頂いた皆様に改めて感謝いたします。ありがとうございます。 #include<stdio.h> #include<math.h> int decryptkey, n,ln; int getPublicKey(void){ n = 11*13;//p*q for p,q is prime ln = 2*2*3*5;//LCM((p-1)*(q-1)) decryptkey = 23;//relatively prime to ln (equals to GCD(dkey,ln)=1) //calculate 1/d mod ln int x, y, z, q, u, v, w; u = 0; v = 1; x = ln; y = decryptkey; do{ z = x % y; q = (x - z) / y; w = u - q * v; x = y; y = z; u = v; v = w; }while(z != 0); if(u < 0) u += ln;//in order to avoid negative index return u; }
void rsacrypt(char* it, int key, char* ot){ int buffer, b, j; int i = 0; while(it[i] != '\0'){ b = (int)it[i]; buffer = b; for( j = 1; j < key; j++){//calculate (it)^key mod n buffer *= b; buffer %= n; } *(ot + i) = (char)buffer; i++; } *(ot + i) = '\0'; } void encrypt(char* in, int e, char* out){ rsacrypt(in, e, out); } void decrypt(char* in, char* out){ rsacrypt(in, decryptkey, out); } int main(void){ int encryptkey; char* ptext="this is plain text."; printf("plain text is: %s\n",ptext); char *etext, *dtext; dtext = (char*)malloc(sizeof(ptext));//without this , BUS ERROR returned... encryptkey = getPublicKey();//maybe etext needs malloc too... printf("public key is:%d\n",encryptkey); encrypt(ptext, encryptkey, etext); printf("encrypted text is: %s\n",etext); decrypt(etext, dtext); printf("decrypted text is: %s\n",dtext); return 0; }
438 :
名称未設定 :02/10/11 10:47 ID:vOgTkuMQ
Perlでもやってたほうがいいのでは。
>>436 うーん、少なくともポインタについては勉強したほうがいいと思う。
もし本を読んでるとしたら、理解が中途半端かor分かってない。
ポインタについてはこのスレの前の方で説明している人がいたはずです。
まず、これらをヒントに間違い探しをしてみましょう。
それと、できれば字下げしてください。
あなたも読みにくいでしょう?
>>438 Cを勉強したい、といっているのだし
Cを学んでからでもいいと思うが。Perlなんて将来どうなるか分からんし。
>>436 ソースが激しくきちゃない、、、
スレに書き込むためなのかもしれないですが、もうすこしなんとかした方がよいです。
個人的意見ですがどんなソースがきれいか判断できるという事は、意味がある程度
わかっているという事に近似だと思います。
ソースきちゃないのはよくわかっていないからだと思われます。
精進してください。
>>438 Perlは、、今から学ぶならPythonの方がいいです。
どこが汚くて、どう書き換えたらいいか、例を出してあげないと たぶん分からないと思われ。それをしないで言いっぱなしだと、 ただの自慢したがりに見えなくもない。 漏れはプログラミング、まったく分からない人なので、 「そういうならお前やれ」はなしね。
>>441 >>440 氏が汚いって言ってるのは確かに、
ポインタに関する作法(それ自体はよく分からんけど)も含まれているだろうけど、
本当に基本的な作法を守っていないからだと思われます。
これは、どんな言語のコードを書く上で、守らなければならないモノで。
まぁ、多分
>>440 氏の言うように、スレに書き込むためかもしれませんが。
漏れ自身も初心者ですが、自分で調べたりなんなりしないと、身に付かないと思ってます。
もし、
>>436 自身が分からなければ、そう言えばいいだけの話だと思うし。
生意気で申し訳ないが。
古いProjectBuilderでコンパイルしてみたんですが、素のままだと通りませんね。 mainだけ字下げしてみました。コメントは冗長ですけど。 最初のprintfは適当なところに動かしてます。 <--?のところがネックですね。まだ問題があるかもしれませんが 時間もありませんのでこのあたりで。 int main(void){ int encryptkey; char* ptext="this is plain text."; char *etext, *dtext; //<--? // initialize dtext = (char*)malloc(sizeof(ptext));//without this , BUS ERROR returned... encryptkey = getPublicKey();//maybe etext needs malloc too... printf("public key is:%d\n",encryptkey); printf("plain text is: %s\n",ptext); // make an encryption for given tokens encrypt(ptext, encryptkey, etext); printf("encrypted text is: %s\n",etext); // make decoded tokens for given encrypted tokens decrypt(etext, dtext); printf("decrypted text is: %s\n",dtext); return 0; }
>>443 cryptの仕組みは分りませんが、ある文字列に対応する文字列を返すものだと思います。
で、問題は
char *etext,*dtext;
は文字列を保存できません。保存してある場所を指し示せるだけです。
さらに
dtext = (char*)malloc(sizeof(ptext));
は無意味です。まだ、
dtext = (char*)malloc(strlen(ptext)+1);
のほうがましでしょう。
この場合でも問題は残ります。rsacrypt(in, decryptkey, out);
で、*outにどれだけの長さの文字列が格納されるかです。
*ptextの文字列長を超える文字列が格納された場合、メモリを破壊します。
また、
>>429 さんの実装もよくありません。一見上手くいっているようですが、
char* ptext="this is plain text."
の直後に
char* hoge="abcdefghijklmnopqrstuvwxyz";
とかやって、rsacrypt実行後
printf(hoge);
でとんでもない文字列が表示される可能性があります。
Cには文字列と言う型は無くて、
プログラマが場所を用意してあげなければならないことを覚えておいてください。
445 :
434 :02/10/12 19:01 ID:QRhvrJFa
>>436-437 1. malloc()のために、stdlib.hをインクルードしましょう。
2. sizeof(ptext)は、4(MacOS Xの場合)になりますので、(
>>444 さんの言
われるように)strlen()を使うか、
char ptext[] = "this is plain text."にしましょう。
あと、一応動くとありますが、ちゃんとdecryptされてます?
446 :
445 :02/10/13 16:44 ID:VvHAy8Li
あ、etextをmalloc()してませんね。 あと、malloc()したらfree()と憶えておきましょう(この場合いらないと言う 人もいるでしょうが)
447 :
443 :02/10/14 19:01 ID:Y8/UodjN
>>445 どうもありがとうです。
元のコードはインデントと変数の宣言部分しかみてません(w
ちゃんと直してあげればよかったですね。
>>446 うーん、いきなりmalloc使わずに
普通に配列で宣言してもいいんじゃないですかね。
あと気になったのは、引数のチェックをどこでしてるのか、ってところですか
この辺りは最初のうちに頭に入れといたほうがいいと思います。
>>441 例ですか。修正してしまった方がはやいのですが、それだと勉強にならない気
がしますし。
なぜきたないかは勉強するうちにわかるかという期待だと思ってほしいです。
>>443 おおきれいや。
ただchar* ptextとchar *etextがまざるのはいかがな物かと。
>>445 氏適切やな、、わし頭さびてきてる(w
>>447 境界チェックとかいわゆる安全なプログラムの作り方の話しされてます?
Cではいろいろそのあたり気をつける事多すぎるやもしれず。
450 :
445 :
02/10/14 22:29 ID:iRkbH5Mi