【初歩】mac OSXでC言語マスターするスレ【基本】

このエントリーをはてなブックマークに追加
1名称未設定
cocoaアプリを開発したいけどobject-cどころかC言語もわからない!
object-cには興味無いけどC言語はやってみたい
そんな人の為のスレです僕も初心者なので皆で頑張りましょう
21:02/08/31 04:04 ID:ArR7U1d8
■■ M a c で プ ロ グ ラ ミ ン グ ■■
http://pc.2ch.net/test/read.cgi/mac/1001404151/l50

MacOS XをUNIXとして使ってる人の為のスレ
http://pc.2ch.net/test/read.cgi/mac/1001930035/l50

新・ProjectBuilder
http://pc.2ch.net/test/read.cgi/mac/972679127/l50

Macでゲームを作るスレ
http://game.2ch.net/test/read.cgi/gamedev/1005722214/l50

◆◆◆◆◆◆MacでJava◆◆◆◆◆◆
http://pc.2ch.net/test/read.cgi/mac/991194610/l50


31:02/08/31 04:05 ID:ArR7U1d8
・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html

・Cプログラマ必読 ・プログラミング言語C(通称 K
41:02/08/31 04:05 ID:ArR7U1d8

/Developer/Applications/まで行ってProject Builderをダブルクリック
ファイル→新規プロジェクト→toolのStandard Toolをクリックして次へ
プロジェクト名と保存場所を適当に決めて完了をクリック
Sourceのmain.cを色々いじってみたらいいそうです。

また、日本語は使えませんがターミナルを使うこともできるそうです
↑これは僕にはわかりません。わかる方がいらっしゃったら教えてください

では神の降臨も期待しつつ頑張りましょう
51:02/08/31 04:06 ID:ArR7U1d8
>>3はミスです
訂正版↓
・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html

・Cプログラマ必読 ・プログラミング言語C(通称 K
61:02/08/31 04:07 ID:ArR7U1d8
うわぁぁぁん また失敗だよ・・・。
・Cプログラマ必読 ・プログラミング言語C(通称 K
71:02/08/31 04:07 ID:ArR7U1d8
・中学生のためのCスレッド
http://pc3.2ch.net/test/read.cgi/tech/1021726216

プログラム板で発見した推薦図書のサイト
初心者が読むべきC言語の本が書いてあります
Cの入門/初心者向けと言うところです
http://tito.fc2web.com/2ch/tech/index.html
8名称未設定:02/08/31 04:09 ID:ArR7U1d8
>>3,5,6では
Cプログラマ必読 プログラミング言語C 通称 K
91:02/08/31 04:11 ID:ArR7U1d8
・Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

cocomonarのバカ・・・・・ぐすんぐすん
最初からこんなですがみんなで良すれにしましょう
ていうかこんなにしちゃったから僕が責任持って一番頑張ります
10名称未設定:02/08/31 04:18 ID:RMKefBt8
で、>>1のレベルはどれくらいな訳?
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
19Undwerworldのチケとれたか?: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
2の関連スレはおかしい。

Macでプログラミング{2}
http://pc.2ch.net/test/read.cgi/mac/1025998843/l50

MacOS XをUNIXとして使ってる人の為のスレ その2
http://pc.2ch.net/test/read.cgi/mac/1019020530/l50

Cocoaはさっぱり!
http://pc.2ch.net/test/read.cgi/mac/1007632025/l50

Terminal初心者質問スレ
http://pc.2ch.net/test/read.cgi/mac/1012636223/l50
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
>>1
ありがとう!
こんなスレを待っていた!
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
ここをCのスレにするなら20も22もスレ違いになるのか。

>>20
PerlでGUIアプリを作る、ならこんなのあるけど。
http://perl.infoware.ne.jp/documents/Dekiru_CamelBones.html

>>22
Objective-C
http://pc3.2ch.net/test/read.cgi/tech/990574267/l50
29名称未設定:02/08/31 13:32 ID:ksj6iVmE
object-cって記述からすると、
http://pc.2ch.net/test/read.cgi/mac/1025998843/83
この人の立てたスレ?と思ったら
>もともと、俺はWindowsデベロッパ
だったそうで、別人ですかね?
(ニコ!)(ニコ!)(ニコ!)
気持ち悪いよ〜助けて〜

Objective-CとC++はある程度知ってるつもりだけど、
Objective-C++って知らないや、勉強しよっと!
30名称未設定:02/08/31 13:34 ID:MLyfthYo
>>28
Thanks,まあCやりたいんですがperlみたいにメモリ領域とかポインタとか気にしない方が楽なんで
31名称未設定:02/08/31 13:39 ID:ksj6iVmE
>>30
C#が良いんじゃないだろうか
321:02/08/31 14:08 ID:vNycINLs
本当だ。object-cじゃなくてobjective-cですね
何かこういう間違え多いなぁ・・・・。
この前までputsを”プッツ”って読んだり・・・
本当は”プットエス”ですよね。

とにかく僕はこれくらいのレベルってことです
あー一気に駄スレぽ・・・。頑張ります。
33名称未設定:02/08/31 14:55 ID:qqId/m2O
>>29
多分>>22>>1じゃないので>>1はやっぱりそのスレの人だと思う。
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
(% の入力は不要)

これで実行されます。
361: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でもいじくってパスにカレントディレクトリを
入れること。
381:02/08/31 19:06 ID:cAWEbSer
>>37
すみません 何のことだかさっぱりわからないので今から試してみますね
とりあえず先ほど>>35さんに教えて頂いた方法ではちゃんとできました
こんなど素人にかまって頂いてありがとうございます
391: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配列のキーボード買ってこようかな・・・鬱ぽ
401: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
(% の入力は不要)
4241: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
mi
http://www.asahi-net.or.jp/~gf6d-kmym/

知ってる人多いと思うけど、ソース書くのに便利ですコレ
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;
}

なんてのしてみるとかさ。ソクセキで作ったんで動くかどうかはしらんけど。
4915: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した事がありません。
521 ◆ZMVdytmo :02/08/31 20:57 ID:cAWEbSer
トリップつけました
僕はやっとprintf scanf putsを覚えました
今日はもうちょっとやったら寝ます
5315:02/08/31 21:02 ID:zwCmpqmX
>>50
ちゃんと動きますた〜。
エラーが3度ほど出ましたが、全部自分の入力間違えでした。(汗)
思ったよりおもしろいな。C言語。
54名称未設定:02/08/31 21:14 ID:yQoO1xjc
す、すごい!
画期的なスレだ。
1000いく頃にはどのくらいのレベルまで達しているか・・・
55デフォルトの名無しさん:02/08/31 21:15 ID:GEyXJYLt
>>37氏はわかって書いてるのかもしれんがカレントディレクトリにパス設定す
るのはセキュリティ問題発生させるからやっちゃだめですよ。
初心者はあまりdotfile作成しない方がよいです。

>>45
Emacs最高...と言ってみるテスト

>>53
ちゃきちゃきすすめてみましょうね。

とりあえずC標準関数一覧です。
http://cham.ne.jp/piro/p_stdfunc.html

#include <stdio.h>
の意味を理解しとくとよいかも。。
勉強進んできたら一度stdio.h内も覗いてみるとよいよ。

もしかしたらポインタの部分で一度つまずく可能性ありますが、くじけないでくださいね!


56デフォルトの名無しさん:02/08/31 21:20 ID:GEyXJYLt
>>48
ちなみに移植性を考慮する場合はコメントに // を利用するのは避けるべきで
す。
// はC99というCの最新規格でしか標準でないので。。普通は動作しますので
勉強時にはいいですが配布物および、仕事の時とかは注意しないとだめっすよ。

57名称未設定:02/08/31 21:26 ID:UnJT/ltd
>>56
へ〜そうなのか。俺、WinとMacしかいじった事ねーから、
気が付かなかったぜ。
/* */
の方がいいのかな?
おぼえとかなきゃ。
5815: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は分かりやすい。)
631 ◆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言語 入門編 柴田望洋著(ソフトバンクパブリッシング)

これが一番オススメの参考書。
671 ◆ZMVdytmo :02/08/31 23:49 ID:cAWEbSer
>>66
やった!当たりを買いましたよ!
説明がわかりやすくていいですよね。
ところでちょっと疑問が出たので質問させて下さい

#include <stdio.h>
int main(void)
{
int no;

printf("no is ? " );
scanf("%d",
681 ◆ZMVdytmo :02/08/31 23:50 ID:cAWEbSer
うわ・・・cocomonarだとまた切れてる・・・
ちょっとIEで書き直してきます
691 ◆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型で宣言されてるじゃん。
宣言しないと、データ納める箱がないでしょう。きついような気がするなぁ。
711 ◆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%できないとはいえないけどさ。
変数おいた方がデバッグも楽だし、無理して変数使わないでやんない方がいいかも。
761 ◆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
プログラムはやり方は本当にいくらでもあるんだ。
だからコーディングする人によってクセもある。
自分のかいたコードは読みやすくて、他人のは読み図来ってのも
そんなところにあるのかもな。

いいところに気が付いたね。
やり方は幾通りもあるけど、ただ、きれいなコードと汚いコード
とかってのはあるな。だけど、それを今理解しなくても、いずれ
分かる時がくるさ。
7835: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

立派な開発環境が標準でついてくるのはいい事ですね。
8499owantu:02/09/01 12:54 ID:99owantu
全然、スレ違いな話なんですけど、
この『ID:』ハズカシイですけど、なんか変える
方法ないっすか?
8515:02/09/01 13:07 ID:b0l+33S4
>>84
むしろ、IDカコイイ。
変えたいなら、再起動してみては?


ところで、みなさんに1つ聞きたいんですが、
int main(void)の「void」って何なんですか?
変数の型?サイトによっては「void」と書かずに解説されているサイトもありますね。
8699owantu:02/09/01 13:15 ID:99owantu
>>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();

とか。
8815:02/09/01 13:29 ID:b0l+33S4
>>86,87
うーん。なんとなくですが理解できますた。
戻り値がないってことは・・・常に「0」というか、「何もないヨ」ってことですいいんですよね?
89デフォルトの名無しさん:02/09/01 13:49 ID:OOyU4Bxr
>>88
「0」と「何もない」はプログラムではまったく別なので注意ね。

あとvoidは省略できる事はできるのだが、するとやはり互換性問題が発生する
可能性大です。
極力基本に忠実にめんどくても記述しとく方があとあと楽です。
9015:02/09/01 13:58 ID:b0l+33S4
>>89
返信ありがとうございますだ。
おっとそうでした。「0」と「何もない」は別物でしたね。スマソ。
なるほど。基本に忠実ですね。
91名称未設定:02/09/01 14:04 ID:yLpBErSs
hogeってなんですか?
禿頭のhageかと思ったら違うし、ほげ?。
9215: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板にいけば、詳しく教えてもらえるかも。ほにゃららのことです。
951 ◆ZMVdytmo :02/09/01 14:31 ID:FHabgytG
hogeって言うのに深い意味はありませんよ。
別にunkoでもよかったしexでもよかったし、
>>94さんの言う通りですね。

と言うことはhogeってあんまり普及してないんですかね?
結構メジャーだと思ってました

今日は用事があるのでCの勉強ができません・・・。
ちょっと残念だなぁ
9699owantu:02/09/01 14:44 ID:99owantu
>>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つも引数あるでしょう。

だからエラーがでちゃってるのさ。
97デフォルトの名無しさん:02/09/01 16:12 ID:bU7Nc1c2
hoo,hoge,barなどは
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1448&forum=12
なんか参照してみてくださいな。

ほにゃららの意味でUnix系プログラマはほとんど知ってるはずです。
どれを主に利用するかでプログラマの利用してきたプラットフォームや
プログラム言語がわかったりする事もあります。

MacやWin専門のプログラマはほとんどこれ利用しませんね。。

98デフォルトの名無しさん:02/09/01 16:23 ID:bU7Nc1c2
ほげ学サイト消えてたので参考にはっときます。
http://web.archive.org/web/20011031102620/http://www.selab.tutkie.tut.ac.jp/~yoshida/hoge.html
99麦畑から:02/09/01 16:27 ID:9xWTWaxH
#define sign(x) ( ( ( ((x)>0) << 1 ) | ((x)==0) ) - 1 )
10015:02/09/01 17:44 ID:b0l+33S4
>>96
うーん・・・char型?引数?わからない事が増えてきたです・・。
とりあえず、もう一度、Webにある解説などを熟読してみます。

101名称未設定:02/09/01 17:51 ID:Ai2mj50e
>>98
面白そうなサイトのご紹介ありがと!
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);
ってなってないじゃん。(";"がないでしょう)

わかりずらい説明だったね。
109名称未設定:02/09/01 19:38 ID:E3cqjSy3
ラウンジにあったC言語勉強スレッド。
http://corn.2ch.net/entrance/kako/1011/10119/1011975646.html
110名称未設定:02/09/01 19:52 ID:H48C/c3D
>>104
strcpy(szString, "hogehoge");
printf("%s\n", szString);
って書き方するのが一般的だと思われ。
111名称未設定:02/09/01 19:59 ID:99owantu
>>110
そうですね。
112名称未設定:02/09/01 20:05 ID:99owantu
.
11315:02/09/01 20:12 ID:b0l+33S4
>>102
何度もお世話になってすいません〜。
char型がイマイチ分からなかったのは、int型との違いが分からなかったんです。
どうやら、文字も入れられるみたいですね。
箱が何個とかは、昔Javaをかじった時にやったので、何となく分かりました。

>>107
ごもっともです。
これからは、なるべく他人に頼らずがんばりますだ。
114名称未設定:02/09/01 20:22 ID:KYfoHPmo
char→1Byte
1Byteなのでニポンゴ(2Bytesのいわゆる全角)は入らないよ。
「文字も」というよりは本来文字の為の型。
※strはcharの配列

int→(一般的には)4Bytes
整数の型
-32767〜32768
115名称未設定:02/09/01 20:25 ID:kECSNG2m
>>114
-32767〜32768って2バイトでの範囲ではないの?
116名称未設定:02/09/01 21:11 ID:wbnMJuw6
× -32767〜32768
○ -32768?
117名称未設定:02/09/01 21:12 ID:wbnMJuw6
あぁ Mozilla のアホー!
× -32767〜32768
○ -32768〜32767
11815: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とか宣言する。
121名称未設定:02/09/01 21:25 ID:wbnMJuw6
いやいや…
char … (単一の) 1バイト文字、または -128〜127 の整数。
    例:
       char c = 'a', b = 100;
int … (4 バイトの場合) -2147418111〜2147418112 の整数。
12215: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言語」を学んでからそいつらに移るべきなのかい?旦那
124名称未設定:02/09/01 22:00 ID:wbnMJuw6
>>123
C++ 覚えたいなら C やっといた方がいいかも。
そうでなければ必要ないでしょう。
125デフォルトの名無しさん:02/09/01 22:11 ID:3H97CMRy
教えてる側が時々ミスってるようだが...

>>123
C++に関してはCの知識ないと確実にはまります。
しらなくてもそこそこまではいけますがね。。

Cってのはプログラムする場合はけっこう基本になってくる所があります。
# アセンブラもあるが環境に依存しすぎなのでとりあえずおいとく。。
Javaでもポインタの概念わかってないと理解不能部分ありますし、、、

スパーハカー(w の基礎教養ですよ。
# あとはLisp系言語(Emacs Lisp、Scheme、Common Lisp)あたりも
# 計算機科学での基礎教養だけどね。。それは後でいいやって感じ

126114:02/09/01 22:41 ID:IRrHv32h
スマンかった。65536は2Bytesだった。。。

ところで折れはPascal→Cとステップアップした口なのだが。
Macの(Classicの)ToolboxもPascal風味だし、
これから始める人にPascalをすすめるのはダメですかね?

C++は別に無理して覚えなくてもいいんじゃないすかね??
個人的な意見ですけど。
9801時代もBC++用の普通のCソースとか多く見かけたし。

もう時代遅れかな・・・
127名称未設定:02/09/01 22:56 ID:YJIdADfU
>>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)もプログラマには切りのいい数字。
129デフォルトの名無しさん:02/09/01 23:10 ID:3H97CMRy
>>126
pascalは教育用にはすぐれた言語やね。
が、、ちょっとお仕事がすくないです(w
わたしゃはFortranとかが最初だったやも、、その後Scheme、C、Python
って感じやね。

Pascalはおぼえても損ではないけど、話しできる人がすくないし、書籍だと
Delphiばかりになってしまってるので、、勉強がしずらいかもしれんです。

C++は必要に応じてですね、便利は便利ですが。、、
勉強のしやすさとか楽するならJavaいった方がよいかも。
130名称未設定:02/09/01 23:18 ID:5E/oGVrN
ここで質問をしている人は、
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
134名称未設定:02/09/01 23:54 ID:jyrmKEWJ
このスレ的にネタなのかマジなのか分からないんだが
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」しか出ないのはなぜだああああ
137名称未設定:02/09/02 00:45 ID:LPU8zn/p
ポインタがわからない人はExel等表計算ソフトを勉強してみましょう。
138名称未設定:02/09/02 00:47 ID:qH/R/Msw
>>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からはじめたもんなぁ。
141名称未設定:02/09/02 01:28 ID:qH/R/Msw
ボクは BASIC -> Z80 -> C -> Java -> Objective-C
の順に学んだYO
本当に基礎的な小さなプログラムでも良いから
アセンブラで組んでみるとCも理解しやすいかも
というかCをすっ飛ばしても問題無いかも?
142名称未設定:02/09/02 01:36 ID:LvqE3CXH
>>131,133,136
普通に「ビルドと実行(ハンマーとモニタのボタン)」すればいいと思うんだけどなあ。
ちょっと試しにやってみたけど、全然平気ダターヨ。
どんな風にコーディングして、どうやって実行させたのか気になる所。
Terminalから実行させたけど平気だったし。
ん〜、何でだろ。
新規Project作った直後にそのまま「ビルドと実行」してもダメなの?

>>139
Standard Toolかつ"main.cいじって"って言ってるからCocoaは使ってないと思われ。
143名称未設定:02/09/02 02:30 ID:rlGKMzuX
>>138 Lotus Improvのことかな?
144名称未設定:02/09/02 03:07 ID:1WNMntmR
>>142
ほんとだよ…どういじったんだよ>>136
145デフォルトの名無しさん:02/09/02 07:22 ID:OtBTZRiA
>>141
ちょっと昔はBASICからだったけど現在はCからだね。時代はすすんでるのだよ
# 微妙におやじギャグくさい、、

>>142
む、、というかTerminalで動作してDevToolsで動作しないってのはかなり頑張
らないとできない気がするのだが、、
146名称未設定:02/09/02 12:52 ID:qH/R/Msw
>>145
ちなみに現代なら、VisualBasicから入る人も少なく無いかも。
(親が買い与えてくれるんだろうか?)
今は無償配布されてるC開発環境が手軽に入手出来るんだもんね。
ていうかOSXにはIBまで付いてくるんだもんなぁ。
それが動作するハードウェアが高価だったりするんだけど。
iBookやeMacならかなりお買い得なのかな。
1471 ◆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の方がお手軽なんじゃないかな・・・。
148名称未設定:02/09/02 13:43 ID:qH/R/Msw
>>147
うーん、「お手軽」の定義にもよるけど、PC/AT機でなら半分以下の予算でCを学べるでしょう。
C言語学習用のポケコン、なんてのもあるんだっけ。

個人的にはcocoa環境でプログラミングを楽しみたいんでOSXマシンの購入を考えてますが、
ハードの選択肢が無くて困ってるところです。(現在Windowsユーザーです。)
1491 ◆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プログラミングができるかも。
151名称未設定:02/09/02 14:25 ID:qH/R/Msw
PC/AT機で動作するOSはWindowsに限りませんしね。
C言語/UNIXを学習したいのなら、Linuxがお勧めじゃないでしょうかね。

お金に余裕の有る境遇の人なら、OSXマシンがお薦めかもしれませんね。
152名称未設定:02/09/02 14:29 ID:ng1CTJH4
俺も>>1に触発されてデベツル入れてみる。
蟹はん&金持ち著のバイブルを持ってた事を思い出したから。

一緒にがんばりませう。
15315:02/09/02 18:37 ID:Wik044lr
ただいまです。

>>127
おぉ!詳しい説明ありがとうございますだ。
なんとなくですが、理解できました。
96さんのおっしゃってる事もなんとなくわかりました。
「puts関数には、引数にcher型のデータを1つだけ(?)指定すればよい」
こんな感じですか?
15415:02/09/02 18:38 ID:Wik044lr
間違えてsageてしまいますた。スマソ。
155名称未設定:02/09/02 18:46 ID:9KI0TR7N
Macでプログラミングスレに行け!

終了

にならなくてよかったね。
156名称未設定:02/09/02 18:57 ID:DooaWzjV
K&Rの事か・・・
蟹って何の事かずっと悩んでたんだよ。
157名称未設定:02/09/02 19:53 ID:wqCgwFjr
>>15
今のところは面倒なことは考えないで
puts("うまー");を実行したら
「うまー」と表示されると覚えておけばいい。
勉強していくうちにわかるようになるから。

ちなみに、cherではなくcharだからね。
character(文字)の略ですよ。
1581 ◆ZMVdytmo :02/09/02 20:09 ID:NVn7n5Qf
そういやputs関数って\nって入力しなくてもちゃんと改行されるんですよね。
さっき知ったんですけど、printfとどう違うのかわからない・・・。
\nを入れるか入れないかだけで二つも関数ができる訳無いし・・・。
ちょっと調べてきますね。
159名称未設定:02/09/02 20:09 ID:R9w/q6F9
>>150
> それは、個人使用のみだけ許されているコンパイラです。
> それでフリーウェアとかシェアウェアとか作ることはできません。

Borland C++ Compilerでフリーウェアの作成・公開は可能だよ。
160名称未設定:02/09/02 20:20 ID:eSxjNU6S
>>158

printfのfはフォーマットのfね。
最初の引数は出力変換指定子っていって、データをどんなフォーマットで出力するかを
指示するためのものなの。

%で始まる部分でデータをどんな書き方で出力するかを指定します。
それ以外の部分はそのまんま出るのね。

%dなら整数を十進数で出力しろっていう事になるんだわ。
16115:02/09/02 20:39 ID:Wik044lr
>>157
あ!すいません。cherではなくcharでしたね。
そうですね。とりあえず、あまり深く考えずに、テンポ良く進みますです。
1621 ◆ZMVdytmo :02/09/02 20:49 ID:NVn7n5Qf
>>160
はい、自分で調べたら同じようなことが書いてありました。
回答ありがとうございます。

殆ど需要無いかな?と思って立てたスレだけど意外と需要があるようで
びっくりしてます。僕はちょっと2日程消えますね。
その間はC言語も勉強できない・・・。じゃあみなさん頑張って下さい。
163Emacsばっかり:02/09/02 22:16 ID:avT/IE6i
>> 146
VBが最初ってのは個人的には不幸だと思う事もある。
基礎ふっとばしてもプログラムできるっていえばできる部分あるから。。
結局わけわかってない場合も多分にあったりするみたいな感じ。。

>>152
K&Rの事かな?あれで勉強するのはちょっと。。。
今だに参考になるというか基礎というか、、Cの必須本ですが、
本当の初心者には向かない気がしますです。

>>159
バイナリ配布のみ可能だったかな?オープンソースしたい時はだめな気がした。

>>162
1氏が数日いないみたいだが、なんか役にたちそうな初心者向けサイトでもさ
がしてみるかな。。
人の勉強の様子みてると自分のモチベージョンあがるね、、

164名称未設定:02/09/02 22:20 ID:1VvE8cVq
>蟹飯
イメージでは「蟹のあんかけチャーハン」だな
なんか旨そう…
165Emacsばっかり:02/09/02 22:34 ID:avT/IE6i
C言語入門講座
http://cham.ne.jp/piro/p_cc.html
C言語 標準関数一覧
http://cham.ne.jp/piro/p_stdfunc.html
初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/
チャット式C言語入門
http://www.pp.iij4u.or.jp/~nabe/c/
C言語FAQ日本語訳
http://www.catnet.ne.jp/kouno/c_faq/

本日はこんな所。
あと上を目指すなら英語は必須になってきます。
英語できるかできないかの差がそのまま神と凡人の差になったりする事もある。。
166名称未設定:02/09/02 22:55 ID:fucMiUsc
>>1
165さんの言ってること本当だね。
どこで英語を使うかって調べる時だったりするんだ。
まぁ、関数の使い方って一度つかったら全部暗記しちゃう
人もいるんかもしれないけど、俺は結構調べるな。

でクラス(C++なんでここじゃあまり関係ないか)なり関数なりの使い方を調べるんだ。

調べる→プログラム書く→バグ潰す→調べる→プログラム書く→バグ潰す→・・・・・

ってのをくり返してコーディングするんだよー。
で、調べる、なんて時に結構英語つかったりするんだぜー。
167名称未設定:02/09/02 23:12 ID:eSxjNU6S
>>163

K&Rは初心者が一人で読むのは無理がありますが、適切な指導者がいれば理解できるでしょう。

というか、いろんな本を読んでも結局はK&Rに戻って確認することになるから、K&Rくらいは
読めるようになって欲しいと思うんですがねぇ。
168名称未設定:02/09/03 00:17 ID:snDhevHm
英語って日本語化されてないシステムや新しいデバイスの能書き読む時くらいしか必要ないかな
枯れたものは大抵日本語化されてるし...
169名称未設定:02/09/03 00:39 ID:u1UbVLEc
>>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
プロジェクトビルダーで

#include <kern/clock.h>
#include <stdio.h>

int main(void)
{
uint64_t* t;
clock_get_uptime(t);
printf("%d\n",t);

return 0;
}

とやってみたのですが

main.c:2: header file 'kern/clock.h' not found

とエラーが出てしまいます。
なぜなのでしょうか?

http://developer.apple.com/techpubs/macosx/Darwin/General/KernelProgramming/services/Obtaining_T_Information.html
171名称未設定:02/09/03 01:32 ID:nNKQd+pt
>>170
そのヘッダファイルがあるのか確認してみ。
その書き方からから察するに
stdio.hとか入ってるディレクトリに「kern」って名のサブディレクトリあるのかな。
その中に「clock.h」があるか確認
172170:02/09/03 01:47 ID:yKp+CwXK
>171
レスありがとうございます。
clock.hは/System/Library/Frameworks/Kernel.framework/Headers/kern/にありますた。

ちなみに環境設定ー>すばやく開く にも上記のパスがあるましたが、
これは関係ないんでしょうか?
173名称未設定:02/09/03 04:11 ID:u1UbVLEc
あれ、ほんとだ。
kern以下のファイルはまるで読めないね。
何でだろ?
174Emacsうまうま:02/09/03 06:40 ID:HysQYbbz
>>166
調査時案外英語利用しますが、オープンソース関係にかかわるとさらに英語の
比重が増す罠(w

>>167
同意します。ただ、K&Rは註釈必要な部分もけっこうあるかと、、
記述が古い部分があるよ、というのは認識しとかんと問題あるかも。

>>168
そうかな。。。わしちょっと特殊な分野のプログラムしてるから、、
CPU系とか文献英語しかない事がありますです、、
あとオープンソース系にちょっとかかわると英語なしだとぜんぜんついてけま
せんしね。

>>170
/Developer/Documentation/Darwin/General以下に同じ文章はないのだっけ?
今手元にないので。。

>>173
確認できてます??他の方も確認していただけると。。OS 10.2ですか?
わしも後で確認してみますです。
175名称無設定:02/09/03 08:40 ID:O4RyNukK
>>170
Kernelフレームワークをプロジェクトに追加していますか?
176170: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
相変わらずのようです。
177173: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"
ではどう?
179Emacsうまうま:02/09/03 23:13 ID:zc1gavLk
むーーこれってKEXT用って事でよいのだろうか。。

どちらにしてもDarwinカーネルはよく知らん(T_T)
しばらくわしはほっとく。わからんから。

しっかしFrameworkよくできてるな。。NS付くのがややああれだが。。
180名称未設定:02/09/04 00:27 ID:zelyA3Su
>>178
う〜ん、それでもダメですた。clock.hで読めなかったlibkern/OSBase.hも
projectにAdd Fileしてみたりもしたんだけど、やっぱダメ。
>>179の言う通り「使えない」のかも。
>>170が何しようとしてたかは知らないけど、別の方法を考えた方がいいかも。
181170:02/09/04 00:33 ID:2P5WbAf0
>>178
教えて頂いてる身であれなんですが
http://www.eskimo.com/~scs/C-faq/q10.8.html
ということで<>と""の違いは""の方がカレントディレクトリを
含めてヘッダファイルを探しに行くという事なので、今回は
関係ないかと思われます。やってみましたができませんでした。
すみません。

何となくスレ違いぽいのでこれにつきましては他の方法でしのぐことにします。
ありがとうございました。
なお、なぜか分かる方がいらっしゃいましたら是非ご教示下さい。
182170: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;
}

183名称未設定:02/09/04 01:55 ID:Irx1mRo/
printf("%d ",a[i]);
これってとんでもないアドレスを見ている気が駿河。。。

x[i] = rand() % 10;
この書き方も微妙だねぇ。。。
184170:02/09/04 03:24 ID:2P5WbAf0
あらら。
関数の中身をmainに移してみるとうまくいく事や
デバッガで見るとaのアドレスと_xのアドレスが一致しないので
関数への値の渡し方が問題かと思っていたのですが。

>>183
もう少しコメント頂けるとありがたいです。。
185名称未設定:02/09/04 03:51 ID:rWlXjFk5
折れプロジェクトビルダ持って無いから
そんなオプションあるか知らないけど
コンパイル時のエラーチェック厳しくしてみたら?

ポインタに関するconst修飾ってこんがらかる・・・

ttp://tsugu.no-ip.com:8080/sotuken/const/
186170:02/09/04 04:34 ID:2P5WbAf0
>>185
あー、申し訳ないです。constは消し忘れでした。
一応試行錯誤の跡ということで。。。
あと
#include <stdio.h>
#include <stdlib.h>
も抜けてました。重ね重ね申し訳ございません。
URLありがとうございます。よく読んでおきます。
187名称未設定:02/09/04 04:44 ID:ZEzsB94u
こうでしょ。

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;
}

柴田望洋先生のポインタの本読んで勉強しる。
188Emacsうまうま:02/09/04 07:19 ID:KKCEsf3p
>>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マクロで変数宣言するのはやめて、、
なんか本参考にしてる?まさか林本とかではないだろうな。。
189170:02/09/04 08:46 ID:2P5WbAf0
>>187
なるほど、ありがとうございます。
ちゃんと動くのがあるとどこが間違っていたか
分かり、とても勉強になります。

>>188
関数の引数はローカル扱い?(変更しても関数の外側では反映されない)
になるんですよね?
あと配列とポインタの関係とか断片的な知識はおぼろげとあるのですが
それらが理解されておらず、ごっちゃになっていて何がいけないのか
分からなかったです。
示されたような分かりやすい例は分かるのですが、やはり自分で手を
動かして初めて理解できることを痛感しました。

>>183
というわけで指摘されたことは
int* a;と宣言してもaを配列として宣言していないので
怪しいし分かりにくい。
x[]をいじっても_x = x;で反映できない。
と理解してみました。

勉強法は他人のソースを見て分からない所があればwebで検索。
という方法です。しかし本を読むことも大切なのですね。
読書(体系的な学習)は苦手なのですががんばって読んでみます。
190名称未設定:02/09/04 11:03 ID:s7cwEia+
>>189
183の指摘
x[i] = rand() % 10
が微妙云々は疑似乱数の質についての言及のはずだけど、
今のレベルでは気にしなくてもいいような。
本に関しては
望洋の本が1冊あればいいと思うけど。

Macのプログラミングは昔に比べたら敷居が低くなったかもなぁ。
191名称未設定:02/09/04 11:12 ID:/Q2JuUda
170さんくらいの知識があるならまじめにK/Rを読んだほうが
成長早いと思うよ。訳が数学者さんだったりすると和訳本は
理解するのが難しいかもしれないけど、何とかなると思うし。。。
因みに他人のソースって誰の見てるかわからないけど、それ自体
間違ってる事もありえると思うしね。
192名称未設定:02/09/04 13:33 ID:SK5FItby
無理にポインタで渡さなくてもいんじゃないかなー
メモリが少なかった9801時代ならともかく
俺はループカウンタとか、ローカルでしか使わないもの以外は
全部グローバルで宣言するじぇー。
10Bytesにも満たないじゃん。その配列&ポインタは。
乱暴なようだけどこれも一つの方法。
193名称未設定:02/09/04 13:47 ID:/Q2JuUda
デスマーチへの序曲が流れ始めますた。
194名称未設定:02/09/04 13:55 ID:bs28yInl
>>192
>全部グローバルで宣言する
やめてくれ…
195名称未設定:02/09/04 15:39 ID:zelyA3Su
勉強になったからage!!
1961 ◆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
mallocしてないし。
199名称未設定:02/09/04 17:31 ID:/EsFt9ac
>>182
ローカル変数は消滅するからそのアドレスを返してはいけない。
> _x = x;
200名称未設定:02/09/04 18:00 ID:mgLf5pE2
>>192
ヴァカ。
>>196
192は反面教師。無視。
201名称未設定:02/09/04 21:41 ID:aXsuwRTV
グローバル便利じゃん。
無理に使わないように作って泥沼にはまるより、グローバルにして作りやすくなるんならそれでいい。
202Emacsうまうま:02/09/04 21:48 ID:csl22UGH
>>189(170)
本は必要だと思われます。
とりあえずこのレベルあるならK&Rで問題ないかと。

あとkernってFramework API用なのかも。。
日付取るだけならsys/time.h でctime利用するとか方法はいくつかありますよ。

>>192
アホ決定てかお仕事した事ないですか??

グローバル変数はいかになくすかってのが安全を保つ秘訣です。
マクロとか極力利用しない方向で...

どうしてもグローバル利用する場合は名前を極力一発で意味が理解できるぐら
い長めにつける事です。

>>196(1)
170氏はすこしプログラム経験あるっぽい感じ。。なので気にする事はなさげ
です。
203Emacsうまうま:02/09/04 21:51 ID:csl22UGH
>>201
便利...まあ無理やりつかうなとは書いてないですがな。
極力へらす方向でという事です。

# でも一緒にお仕事はしたくないです。
204名称未設定:02/09/04 21:52 ID:mZuyt+da
>>201
時により便利だと言うのは分かるんだけど…
グローバル変数使ったほうが泥沼にはまることがあるので、
普通は使わないようなコーディングスタイルで行くんだよね。
205名称未設定:02/09/04 21:57 ID:171zq3CB
>>192
グローバルで宣言するってのも時には必要なのかもしれないけど、
極力つかわない方向で俺はソース書いてるよー。

グローバル変数をつかっちゃうと、デバッグしずらいとかないか?
(ってかそんな事おもうの俺だけか。。)

ソースを書く仕事ではなるべくグローバル変数使わない方向で
やってたぞー。
206名称未設定:02/09/04 22:00 ID:i8SHg1WF
まだまだ初歩段階なんだから脳内ネストが深くなる学び方するより
グローバルを積極的に利用するのも一つの方法かと思う。
つか、あっちでもこっちでも利用するものはグルーバルにすべきでしょ。
完全に関数内で完結するものだけローカルにすればよい。

怒らないで聞いてね。
関数の作り方が問題だと思うんだけど。
配列をポインタで宣言したのはサイズが不定の配列を作りたかったからでしょ?
でも#defineがあるし。
それに数やら大きさを指定する引き数もいないし。
そういう面から見ると>>187が普通じゃないかと。

使い回しのしにくい関数はあまり意味が無いかと。
あと関数を作っててソースの見通しが悪くなるのは
本末転倒じゃ無いかと。

俺の個人的意見なので聞き流してちょ。
207名称未設定:02/09/04 22:13 ID:dGYaRgE8
おいおい。。。
なんかとんでもない奴がいるな。
変数(データ)のライフサイクルだとか考えないらしい。。。
まだ初歩段階だからといってネタを仕込むなよ。
って事で最近プログラミングをはじめた(い)皆さん206は
無視してね。必ずよ。
208名称未設定:02/09/04 22:28 ID:bs28yInl
>>206
>グローバルを積極的に利用
(((( ;゚Д゚)))ガクガクブルブル
209名称未設定:02/09/04 22:43 ID:ITE3+C10
>>206
> まだまだ初歩段階なんだから脳内ネストが深くなる学び方するより
> グローバルを積極的に利用するのも一つの方法かと思う。

初歩の段階で変なやり方を身につけると、後で矯正できなくなる罠。
210Emacsうまうま:02/09/04 23:00 ID:3dTdox1N
グローバルの議論はポインタ理解できない人がデムパッテルだけのようなので
無視の方向でいきましょうか...皆さん

>コーディングスタイル
もうすこし進捗したらこのあたりの資料も必要だろうか。。
というかなぜマクロ減らすのか、とか理由的資料でよさげな日本語資料ってあ
るかな?
わしは経験とかが中心で語ってる部分があるから、資料がすぐ引けないじょ..
プログラミング作法とかにも記述あったような気もするが、、あとで確認して
みよう。
211名称未設定:02/09/04 23:15 ID:dGYaRgE8
コーディングスタイルってお作法って事だよね?
確かに必要だよね。
下手にトリッキーなコード書くよりも、きれいなコーディング
してあるほうがこいつやるなって思えるしね。
212名称未設定:02/09/04 23:55 ID:0J+LsPhH
グローバルは一切使うなとは言わないですけど、
const付けてテーブルの置き場所にするくらいしか使いようが思いつきません。
(#ifdefとかで括ってデバッグ用と限定してGlobal変数使うときはあります)
213Emacsうまうま:02/09/05 06:51 ID:CgjKcCjv
>>211
作法ですね。基本的な事だけでいいけど知ってるのと知らんのでは違うので。。
# あまり細かい事書くと宗教戦争になるがね(w

>>212
わしは
http://cunit.sourceforge.net/
http://sourceforge.net/projects/log4c/
などを利用してデバッグ文をソース中に極力含めない方向にしてる。
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
へー、そうなのか。
良い事知った。

メモしとこっと。参考になるな。
217170:02/09/06 00:16 ID:oz0fb7p8
>>215
ありがとうございます。とりあえずコンパイルしてみてたら
Undefined symbols:_clock_get_uptime
と出ました。とりあえずヘッダは読み込めてるっぽいので
あとは自分でがんばってみます。

あと、1さん、その他の方へ
私のせいでスレの雰囲気が変わってしまったようで申し訳ないです。。
再び「今日はここまで進んだ」「こういう所が分かりにくい」等の
カキコの再開を期待してをります。
218名称未設定:02/09/06 00:16 ID:IJbcWc1P
うおお、 /System/Library/Frameworks/Kernel.framework/Headers/kern/としてて
ダメだった記憶があるが、/Headersまでで良かったとは…
219名称未設定:02/09/06 09:29 ID:iGBJX3P2
>>189
ちゃんと理解してしているか心配になったので、ちょっと解説します。
関数への引数は常に値渡しです。
つまり、myrandomに渡されたポインタの値は、aのコピーです。
ですので、myrandom内で、_xの値が変わってもmainのaの値は変わりません。

220219:02/09/06 09:36 ID:iGBJX3P2
「ポインタの値」は誤解するかな。
要はアドレスです。
221名称未設定:02/09/06 10:58 ID:+tOR0ede
アドレスと言われてピンとくるのは、アセンブラ経験者とかじゃないかなあ
222名称未設定:02/09/06 13:39 ID:A5KaP4Sw
じゃあ、住所ということで。

で、住所と家の話が・・・
223名称未設定:02/09/06 13:42 ID:wYuxUdGZ
上にも意見が出てたと思うけど、表計算ソフトでもアドレスって使いますよね。
Aの1番地、みたいな。
手の込んだマクロ/関数になると、参照の参照を使ったりするし。
表計算に慣れるのも、なにか役に立つかも。

コンピュータの基礎的な仕組みをビジュアルで理解できる仮想マシンを用いた
機械語入門ソフトとかあると楽しく学べそうに思うけど、どこかにありませんかね。
224名称未設定:02/09/06 13:43 ID:Ku6mtdOY
ストーカータンがあらわれますた。
225名称未設定:02/09/06 16:54 ID:1jByZouo
>>219
> 関数への引数は常に値渡しです。

おそらく「値渡し」っていう言葉も理解できないかも。
226219: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を呼んでください。

くどかったらすいません。
227名称未設定:02/09/06 17:46 ID:d9/VH7Q/
つーかさ、デバッグの使い方教えたほうが良くね?
gdb+emacsとかだと難しすぎるから、ProjectBuilderでさ
メモリの内容見たほうが直感的じゃないか?
228226:02/09/06 18:20 ID:iGBJX3P2
そうかもしれません。
でも、デバッガもなぜメモリの内容がそうなっているかまでは教えてくれま
せんから、C言語の基本的なところはある程度押さえておかないといけませ
んね。
229名称未設定:02/09/06 18:29 ID:Ku6mtdOY
つーかやっぱりアルゴリズムとデータ構造とかそんな本から。。。
は行き過ぎだけど、値私とかの言葉に対してイメージが出来てない
とするとやっぱ辛くね?
230名称未設定:02/09/06 20:03 ID:cTLSK+NK
いや、もうそこまで考えるといっその事アセンブラから、、、ってCの話じゃないね。スマソ
231名称未設定:02/09/06 20:20 ID:VManN185
ポインタとか使って動かしたいように動いているかどうか確かめながら
コーディングしたい、っていったら、やっぱりデバッグ必要だろうし、
そうなると、ProjectBuilderは良いかもしれないね。
232名称未設定:02/09/06 21:16 ID:zRV/UHjD
メモリ領域の使い方、ポインタに関する疑問だったら
前橋和弥著「C言語ポインタ完全制覇」技術評論社
ってのが個人的にはオススメだったりします。
題名は相当胡散臭いですが、中身はしっかりしてます。
スタンスとしては入門書というよりも補足に近いですが。
233名称未設定:02/09/06 21:27 ID:gmabXeEY
ソースコードをウプする前に、terminalひらいて、
expand -t4 | sed 's/ /&nbsp;/g' > pre_upload
ってやっておくと、好まれるかもしれません。
234Emacsうまうま:02/09/06 22:15 ID:ISKEWxxL
スタイル(作法)や、テスト手法、デバッグの方法は
プログラミング作法
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3649-4.html
に記述ある事確認。しかし初心者向きとは言えないですな。。

とりあえず柴田本の内容以上になったら初心者と言えるのかやや疑問
# しかし中級とも言えないが、、
235228: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;
}
----------------
どっちも、できることは同じですよね?
どういう風に使い分けるのがいいのでしょうか?
238名称未設定:02/09/07 12:47 ID:ZxuT8ozS
値渡しのイメージはつくが、
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板で尋ねたら、薦められますたが……。
239名称無設定:02/09/07 14:23 ID:tKT0Cywr
>>236-237

getchar()は一文字しか読み込めませんが、
scanf()はフォーマットに合わせていろいろ読み込めます。

#scanf論争は止めましょう:-)>識者の方々

>>238
>つまり、コップAの水(int a)を
>func()というコップBの中(funcの括弧内)に入れて、
>そのBの水をa=a+1している。

ちょっと違うかな。
コップAの水と同量の水を水道からコップBに入れる。
func()が終わればコップBの水は捨てる。
当然コップAの水には増減は起きない。

この例からは分りにくいけどコップBに対してコピーが行われている。
コピー(コップB)にイタズラ書きしても原本(コップA)は元のまま。
240名称未設定:02/09/07 16:03 ID:M+6MV1Ra
値渡しについては「変数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・・。
243241:02/09/07 18:25 ID:pLCuE52B
>>242
なんか、あれ意味してそうだけど(w
ちがうぞ、断じてちがうぞ(W
244238: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とか使わない、とか、なるべくグローバル変数を使わない
とかは聞いた事あるけど。ポインタを使わない、って話はあまり聞いた事
なかった。

みんなのまわりではそんな事ある?

247名称未設定:02/09/08 17:38 ID:7iR+/ijj
Hello C
248名称未設定:02/09/08 17:43 ID:aJPVoAKU
C/C++/Objective-C 以外ではポインタなんてもの自体ありません。
“ポインタを使うとプログラムわかりずらくなる”というのは、
“それらの言語はさっぱり判らない”と吐露しているんでしょう。
249名称未設定:02/09/08 18:05 ID:48JbQEzf
>>246
VB厨の言うことは適当に聞き流しておくのが吉。
250名称未設定:02/09/08 18:32 ID:B9ju3M4k
おーい1よ。その後はどうだい?
251名称未設定:02/09/08 18:53 ID:igy9lGjd
中級者になれない人たちが雑談するスレになりますた。
252名称未設定:02/09/08 19:18 ID:1NVWhQQH
VBいじっててCをあまり知らない人なんでしょ?
そんな人の、ポインタについての意見を参考にするなよ。。。
253C3EDpQLX:02/09/08 19:43 ID:C3EDpQLX
>>248〜252
レス、ありがと!
そうだよなぁ〜、そんな事ないよな。
よかった。ほっ。
254名称未設定:02/09/08 22:12 ID:e76vbX3U
VBって、REALbasicに似てるやつ?ならポインタなんて無いか
255名称未設定:02/09/08 22:17 ID:BPl4wNFI
>>254
でもREALbasicでも参照渡しをできるわけだし、ポインタの知識を知ってると理解しやすいやね。
256名称未設定:02/09/08 22:23 ID:54TSCjM3
まあまあ、他言語の事はいいからCの話しようよ。
257235:02/09/09 12:25 ID:muZ5psSu
>>236-237
>>239さんの言うとおりです。
scanfの問題点は、遭遇してから考えることにすればいいでしょう。

>>238
mallocは、メモリ領域を割り当てる関数です。
int *a; (>>182)
では、宣言をしただけですから値は不定です(ポインタがどこを指している
か判らないということです)。
mallocしてメモリ領域を割り当てる必要があります。

コップの例えについては、>>239さんのたとえでいいと思います。
2581 ◆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
小数点、整数判定ってどうやるんですか?
ちょこっとヒントを... ヒントだけね。
おねがいします。

こうゆう練習問題っぽいのって面白いですよね?
上達するのがわかるっていうか...。
261名称未設定:02/09/10 00:47 ID:Y9QqN/3w
>>260
型変換して引くんじゃないかな?
262名称未設定:02/09/10 00:50 ID:Y9QqN/3w
しまった言い過ぎた。型変換だけのがよかったか
263名称未設定:02/09/10 01:06 ID:Tdz5881y
このレスを読んでC言語やTerminalに興味を持って
ちょこっとかじり出したんですけど、Terminalに日本語を
表示さすために“shift jis"にしてるんですが。
そうすると”〜”が入力できないんですが、入力できるように
することは出来ないんでしょうか?
しょうもない質問ですいません。
264名称未設定:02/09/10 01:15 ID:5TtzGgn/
関数使えよ
265名称未設定:02/09/10 01:20 ID:Tdz5881y
すいません、もっと詳しく教えてもらえませんか。
266名称未設定:02/09/10 01:34 ID:i/os6ZjL
>>264>>260へのレスだ
267名称未設定:02/09/10 01:41 ID:Tdz5881y
>>266
そうなんですか?
必死でどうやったらええんか悩んでました。
268名称未設定:02/09/10 02:29 ID:/mSsfQ4a
>>263
なんかTerminalのshift-jisは怪しい。
269名称未設定:02/09/10 09:55 ID:/08JDRKh
270名称未設定:02/09/10 12:43 ID:VY/1KfWC
キーボードがアスキーになってるのか?
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
は意味のある値なのでしょうか?
275名称未設定:02/09/12 22:25 ID:CWBXgfSp
intのポインタのポインタが mpa
intのポインタが *mpa, pa
intが **mpa, *pa, a
276名称未設定:02/09/12 22:27 ID:Q1D2ErtU
ウーワンワン!
277Emacsうまうま:02/09/12 23:22 ID:siT977Pp
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);

複雑化しているな..スタイル的にあまりよくない気がする。
278Emacsうまうま:02/09/12 23:30 ID:siT977Pp
ちなみに
int *p:

*p = 10;

のように代入するのはCでは意味がなく危険な場合が多いです。

279Emacsうまうま:02/09/12 23:44 ID:siT977Pp
int *(*mpa),*(pa),a;

a = 30;
pa = &(a);
mpa = &(pa);

こんな感じかな?
# カッコ意図的に多くしてみたが、、変だな、、(-_-)
280Emacsうまうま:02/09/12 23:55 ID:siT977Pp
この場合適切なのは間接参照の例か。ぼけてる。

int **mpa,*pa,a;

/* aのアドレスを取得 */
pa = &a;
/* paのアドレスを取得 */
mpa = &pa;
/* 多重間接参照を利用して、aに値を代入する */
**mpa = 10;
281名称未設定:02/09/13 00:08 ID:b0QeTbIW
ポインタってどういうときに使うの?
282Emacsうまうま:02/09/13 00:13 ID:8TuBnjPU
>>281
オブジェクトを参照する時、、

構造体は通常ポインタで、、

というか実際にプログラムしてみないと実感わかないと思われる。

# ちなみにJava等のオブジェクト思考言語ではすべてがポインタ(極論 w)です。
# そのため、全操作がポインタ経由でしかできません。
# ポインタしか存在しないため、ポインタ演算子もないです。


283名称未設定:02/09/13 00:16 ID:dquV75nX
>>282
そのネタ、面白いので是非プログラマ板でスレ勃ててやって下さい。
284名称未設定:02/09/13 00:17 ID:bnau0oU0
int a
int *p
P=&a
aのアドレスをポインタPに入れたとして
なんの意味があるんだろうか?
まあ、アドレスは関数で飛んだ処理でそのまま値を代入されてしまったり
いろいろ複雑ですなぁ。
まっ、printf、scanf、構造体、ポインタ、fscanf、繰り返し、
型を使えればなんとかなるでしょ!
いまだにポインタの利用法がわからんけど
285名称未設定:02/09/13 00:21 ID:iYVj39pB
>>281
関数に渡せる変数の大きさには制限があるので
大きな変数はポインタでやりとりする。とか
286名称未設定:02/09/13 00:25 ID:y3JolAz5
住所氏名でいうな、俺には座標で知らせろ!
287名称未設定:02/09/13 00:39 ID:dquV75nX
>>284
たとえば、その scanf()。

  int a, b;
  scanf("%d,%d", &a, &b);

関数の戻り値はひとつしかないわけだけんども、ポインタを渡すことで
複数の値を得られる。
288名称未設定:02/09/13 00:46 ID:7IqdbKGC
>>284

 ポインタ不要論
 http://www.tomozo.ne.jp/yamazaki/download/doc_without_pointer.htm

ポインタの利用法はいくつもあるけど、
逆にそれらを別の方法で提供すれば要らないって
アプローチをしているみたい。
289名称未設定:02/09/13 00:53 ID:6X0TsO8P
>>284
macのメモリ管理がそれだよ。Handleってやつ。
290名称未設定:02/09/13 01:38 ID:Gysqqr6u
そのポインタ不要論の例のような間違いをする人なんているのか?
291Emacsうまうま:02/09/13 06:25 ID:/W29C4MN
>>283
ネタ最高!
# まあ極論だがJavaが参照で成立しておりそれが間接的にポインタの
# 概念を利用しているのは事実だがな

>>284
。。。意味は人のプログラム読むとわかるかも、、

>>288
参照はポインタです。STLはポインタのかたまりです(極論、、)

292名称未設定:02/09/13 06:48 ID:7BlPVvOn
>>291
> 参照はポインタです。

> Javaが参照で成立しておりそれが間接的にポインタの概念を
は矛盾しているような?

>>282
Javaとポインタの話は2chでも
http://www2.gihyo.co.jp/books/bookinfo.asp?ID=1190
第2章 Javaはポインタの言語だ ーJavaにはポインタ「しか」ない
が出たあたりをピークに散々議論されてるし、正直もうお腹いっぱいです。
293Emacsうまうま:02/09/13 07:14 ID:/W29C4MN
>>282
いや。だから極論です。
まあ、お腹いっぱいなのは同意しますです。
まあ議論になる問題ではなく「ポインタ」て単語の定義上の問題だけですがね。

294Emacsうまうま:02/09/13 07:17 ID:/W29C4MN
>>290
いるから、Wordは不正な処理で終了して、書いた文章が途中できえたりするのです。
いるから、MS Windowsは突然停止したりするのです。 (w

# だめだ、、ネタ職人としての才能はない、、
295257: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)は、表示されていません。
296名称未設定:02/09/13 12:52 ID:xtWS7Ddr
>>290
でも、とりあえずポインタの使用例がいくつか載っている。
297295:02/09/13 13:03 ID:nM8dGr9Q
>>288
単にC++を使えと言う話ですね。
だったら、Objective-CでもJavaでもいいのでは。
298名称未設定:02/09/13 13:11 ID:HJSZlWAs
たとえばポインタを使うと
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へ変更しなくてはいけない。
(つづく)

299名称未設定:02/09/13 13:22 ID:HJSZlWAs
書き直すと、
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の値が違ってくてるハズだぜー。
(動かしてないから、動く事も保証できないです。)
今はあまり気にならないかもしれないけど、戻り値ってエラーを処理
するような時にも沢山使うんだ。
もちろん、プログラムとしては戻り値に足された値を返しても間違いでは
ないと思う。だけど?あとからエラー処理いれる、とかいった場合、どうするんだろ・・。
う〜ん。俺は結構、戻り値はエラー処理のために使ったりする。他の人の
意見は違ったりするかもしれないが。例のごとく、動く事は保証しないっす。
300名称未設定:02/09/13 13:25 ID:HJSZlWAs
わり、動かんわ。書き直す。>>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;
}
301名称未設定:02/09/13 13:27 ID:HJSZlWAs
そして>>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を返すのですか?
303名称未設定:02/09/13 16:36 ID:HJSZlWAs
>>302
return 1;としてのはmain(void)の関数の宣言みてみ。
int main(void){}
みたくなってるぜ。これって、値返せってことじゃん?
で、0でもいいけど、これもなんだなぁ、って適当に1を返したって
だけ。あまり気にしなくていいよ。ただ、
return;
となってた場合は値返さないから、この場合、main()関数がエラーになっちゃうさ。
(つづく)
304名称未設定:02/09/13 16:37 ID:HJSZlWAs
>>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の実体を
足したものを入れてる、とか考えればなんとかなるかな。
うーん、わかりづらい説明でごめんよ。。
305名称未設定:02/09/13 16:43 ID:HJSZlWAs
たびたびのミス、ごめんよ。。
下から3行以下つぎのように修正して。
----------------------------------------------------
として、pcの実体(これを表すには*pcとかく)に、paの実体*paとpbの実体*pbを足したものを入れてる、とか考えればなんとかなるかな。
うーん、わかりづらい説明でごめんよ。。
306297:02/09/13 18:30 ID:nM8dGr9Q
>>298-301
>>303-305
printf("%d = %d ???\n", &nNumberC, &nNumberC2);
これだと"0 = 3 ???"とは出ませんが...。
307名称未設定:02/09/13 18:54 ID:HJSZlWAs
>>297
うそ???
わり、んじゃ、たとえは失敗だ(汗)
あれあれ、しっかりと動かしてみたないとだめだなぁ。
反省反省。
308名称未設定:02/09/13 19:23 ID:HJSZlWAs
わりわり、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 ;
}
309名称未設定:02/09/13 19:56 ID:HJSZlWAs
ま、どういうことを知って欲しかったって、例えば
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()とかでも
問題はないよー。戻り値は今の場合気にしないで。)
310名称未設定:02/09/13 20:48 ID:TG9il/Ef
>>309
せめてプログラムが動くのを確認してから書き込んでくれ。
ここは初心者スレ。
何度も何度も間違った書き込みをされるとわけわからなくなる。初心者なら特に。
しかもなんか理解不足のような…
311名称未設定:02/09/13 20:58 ID:HJSZlWAs
>>310
うん、動くの確認してから書き込む事にするよ。

>>しかもなんか理解不足のような…
これは煽りですか?

俺は十分、ポインタに関しては理解してるよ。

変数の名前の付け方見ればプログラミングの仕事で使っている
事は理解していただけると思います。
312Emacsうまうま:02/09/13 22:11 ID:+ShzHV+e
>>311
int* a;
て宣言してる所と変数名の命名規則からまともだって事は了解。

ただ変かも。。ってわしも人の事いえないがな、、
慢心はよくないです。精進しないと、、
313名称未設定:02/09/13 22:41 ID:HJSZlWAs
>>312
ありがとう。。。分かってもらえる人がいてちょっと嬉しいです。

俺のコーディングにも変なところは沢山あります。。。
他人のコードに目通してるつもりなんだけどね。。。
俺はまだまだ精進必要っす(汗)
314310: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名称未設定:02/09/13 22:45 ID:COSznpA3
>>311
煽りもなにも、半人前としか思えんが…
316Emacsうまうま:02/09/13 23:08 ID:+ShzHV+e
>>315
君は部下を持った事がないな。

>>314
わしの例かな?
あれは意図的にわかりやすいかな。。と思い書いたが混乱の元か。
例がなかなかむずかしいのよ。
317名称未設定:02/09/13 23:24 ID:HJSZlWAs
>>310
いえいえ、気にしないでくださいな。
俺が意図不明瞭なコードかいたからですよー。

かなりの達人でも理解に苦しむ(高度なテクニックという
訳ではなくわかりずらいコード)コードならその時点で初心者には
向いてない説明ということです。

うーん、どうやって説明したらいいんだろうなぁ。うーん。。
318名称未設定:02/09/14 00:44 ID:oGtDmA6q
>>297
いきなりC++とかObjective Cやるのは悪くないと思う。
オブジェクト指向とか言われると分からなくなっちゃうけど、
便利な標準ライブラリはどんどん使ってもいいんじゃない?
319257:02/09/14 00:55 ID:ysk5Z6o3
>>317
なんか変に見えるのは、nNumberAとnNumberBを0で初期化したすぐ後に、それ
ぞれ1, 2を代入しているからでしょう。
あと、短いソースですから、変数名も単純で短い方がいいでしょうね。

ポインタの説明なら定番のswap関数あたりでしょうか。
320297:02/09/14 01:02 ID:ysk5Z6o3
>>318
わたしもいいと思いますよ。
でも、CはCでやっといた方がいいと思います。
321Emacsうまうま:02/09/14 01:10 ID:t99Yg5kx
>>318
いきなりJavaってのも一つの手なんですが、それもそれで問題があるしな。
だいいちこのスレはCの入門スレなのでそのあたり出していいものかやや疑問。

実際はインタプリタ型言語で勉強した方がプログラムの基礎だけならわかりや
すいかもしれず、、
ほんとうにはじめてプログラミングするならJavaScriptは意外といいです。
あとはpythonかな。
322320:02/09/14 01:21 ID:ysk5Z6o3
>>321
この流れは、>>288から来てるので。

あと、C/C++インタプリタもあるみたいです(お宝より)。
http://www.softintegration.com/company/press/20020910.html

はじめてなら、BASICはどうでしょうか。
323名称未設定:02/09/14 01:24 ID:DzlWy5Yq
>>321
いやさ、なんつーかみんな微妙なのがC言語の初心者
なのかプログラミングの初心者なのかって所ではないかと。。。
最初はCはやったこと無いけど外の言語はやったことがある
人向けのスレかとおもったーよ。
324Emacsうまうま:02/09/14 01:37 ID:t99Yg5kx
>>322
文章がまとまってなくてスマソ。>>288経由ってのは了解してます。

BASICからスタートは個人的には現在はあまりおすすめしません。
# 好みの問題やもしれず。。
Javaのインタプリタってのもありますが、そもそも強い型言語が
「プログラミング初心者」にいいかどうかはわしもよくわからない。
定説的には弱い型言語の方がいいとされるが、、そうともいいきれんかも、、

>>323
わしはMac板にスレたった段階でプログラミング初心者含むだと思っていた。
というか1氏が完全にプログラミング初心者だったからかもしれず、、、
325322:02/09/14 01:43 ID:ysk5Z6o3
>>324
いやあ、自分がBASICだったもんで。しかもS-BASIC...。

>>323
わたしも初心者向けかと思ってました。
質問されてるかたもそんな感じでしたから。
326318: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章に入ります。
329308:02/09/14 07:39 ID:QB4qj2e5
>>319
なんであんなわかりずらいまわりっくどい事したかって
ここ見てる初めたての人に、『ポインタがなぜ必要なの?』って事や、
『ポインタを使うとこんな事できるよ、だったら使ってもよいのでは?』
『つかうならこんな使い方もあるよ!』と順を追って言いたかったのです。
言いたかったわには意図が不明瞭で結果混乱しただけでしたね(汗)

swap関数は当然よい説明になる思います。

ポインタ不要論とかでてたので、『ポインタが必要!』とか感じてない
人もいるのかな・・・とか思ったのです。
なので関数の引数としての例を挙げれば、今度『ポインタ必要!』って感じる
かな、と思ったのです。
330325:02/09/14 10:09 ID:ysk5Z6o3
>>326
ループカウンタにちょっと使いたい時等には便利ですが、私は面倒でも必ず
ブロックの先頭で宣言するようにしています。

CでもC99では問題ありませんが、一般的ではありませんね。
331325:02/09/14 10:24 ID:ysk5Z6o3
>>328
Macだからというより、getcheはCの標準関数ではないからですね。

ポインタについては、習うより慣れろ的なところがありますので、とにかく
ポインタを使ったプログラムをたくさん作りましょう。

私は本を使わなかったので、いい本をおすすめできませんが、インターネッ
トで例題を探すといいかもしれません。
332325:02/09/14 11:00 ID:ysk5Z6o3
>>329
不要も糞も(失礼)ポインタを理解しないでCを理解したとは言えませんか
らね。
上にもちょっと書きましたが、個人的な経験からいうとポインタはいずれ
理解できます。
本よりも諦めない理由(仕事だからとか)の方が重要かもしれません。
333名称未設定:02/09/14 11:12 ID:QZa7bE97
初心者がこのスレを読むとかえって混乱するおそれがある罠。
334名称未設定:02/09/14 13:10 ID:TtUNxNXg
>>326
>forでも、for( int i = 0; i < 5; i++ )みたいな書き方
>便利ですし。

ProjectBuilder だと宣言できないよ
335名称未設定:02/09/14 13:17 ID:SEVZ6f4z
なんだかな。
336名称未設定:02/09/14 15:38 ID:P/LgHNlp
>>12
>>35
Terminalでccって打ってもコマンドが見つからないって言われるんですけど。。
337名称未設定:02/09/14 15:45 ID:EKTPNA2d
#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);
338名称未設定:02/09/14 15:46 ID:EKTPNA2d
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;
}
339名称未設定:02/09/14 16:28 ID:pWKlMUob
>>336
デベツールをインストールしる
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!は、ちゃんとできました!
341332:02/09/14 18:44 ID:ysk5Z6o3
>>333
そうかもしれません。
が、混乱してみるのも勉強になるかもしれません(ならない?)。

>>334
1. プロジェクトウインドウでターゲットタブをクリック
2. ターゲットを選択
3. 設定 -> シンプルビュー -> GCC コンパイラ設定をクリック
4. その他のCコンパイルオプションに-std=c99を入力
でできます。
342332:02/09/14 19:06 ID:ysk5Z6o3
>>340
変数の宣言の後に、こんなのを入れてみてください。
setvbuf(stdout, NULL, _IONBF, 0);

うまく行かなかった理由は、setvbufの説明を見ると判ると思います。
343Emacsうまうま:02/09/15 02:06 ID:xBThkYrz
>>333初心者がこのスレを読むとかえって混乱するおそれがある罠

2ちゃんねる初心者は対象ではないので...
このスレに書いてあることが真実かどうかを調査する「努力」ができないと調査能力および本気でマスターする意欲にかけるとおもわれてもしかたないかもしれず。
344名称未設定:02/09/15 02:16 ID:qWZASH6A
いやさー、いろいろ気になって書き込んできたけど、
Emacsうまうまいる限り平気ね。
あと、このスレは初心者向けには結構いい子とあると思うから。
自分で取捨選択して行けば結構プログラミング上達すると
おもわれ。
わざとあげ
345名称未設定:02/09/15 06:57 ID:GiyJidqk
>>298辺りからざっと見の感想です。

人に物を教える場合、特に文章のみで長々となってしまう場合は、
テキストフィールドに書かず、エディターで書いた上で、
1時間から1日辺りほっといて、見直した方が良いかと思います。
幾らプログラムが書け、知識があっても、教える事・物を書くことは別の技術です。

済みません、横槍を入れるようで申し訳ないです。
346名称未設定:02/09/15 08:25 ID:NGgn2Hec
>>345
正確に記述することは大切ですね。

どころで、
>人に物を教える場合、特に文章のみで長々となってしまう場合は、
>テキストフィールドに書かず、エディターで書いた上で、
>1時間から1日辺りほっといて、見直した方が良いかと思います。
とすることは、重要でとても大切なことです。
しかし、これは『物を書く技術』ではないでしょうか。

『教える技術』とは、どのような物とお考えですか?
347名称未設定:02/09/15 12:17 ID:+1AxGGVN
スレ違い
348名称未設定:02/09/15 16:39 ID:guMR2lhT
>>346
俺は思うんだけどね、プログラムにしてもそうだけど、
丁寧に書くとかきれいに書く、とかとても大切。

『教える技術』では問題点を解決する、とか、違いを示す、
とかでは俺は不十分と考えてる。ポインタと実体はこんなに
違う、とか説明してもやっぱわからないと思うぜ。

相手にポインタを使わせたくなる気持ち、や、ポインタって面白い!
って思わせる気持ち、まとめりゃ、知りたくなる欲求を起こしてあげなきゃ
どんなに詳しく説明しても、『で、なんでポインタって要るの?』って
なるだけだと思うぜ。

以前、2つの数をとってきて、足した結果を表示、なんてのしたらどう?
ってプログラム書いたのは俺だけど、ここに要るはじめたて人が、『それなら俺も
できる』とか、『〜喜んでる(>>63)』とか書かれてるところみると、
きっとここのレベルではうまくいってたんだな、とおもうぜ。

で、ポインタあたりでは、俺もどう表現していいやら迷うわけで
混乱してしまったということあなぁ。

にしても、奇麗に書く事はとても大切。ふだんから心掛けなきゃだな。
(スレ違い、すまん)
349名称未設定:02/09/15 17:11 ID:UTNnFIwR
> スレ違い

って書き込まれた後で

> (スレ違い、すまん)

って正直どうよ?
350238:02/09/15 17:17 ID:XO2Id0kk
>>348
それほどスレ違いではないと思うんだが。
351三前二後 ◆1CV58ydQ :02/09/15 19:42 ID:DO0Eh4HU
>>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と同じく、コンパイルされる前にプリプロセッサで処理される。
マクロを使えば、条件分岐の条件式の数値などを書き換える手間が省ける。
352三前二後 ◆1CV58ydQ :02/09/15 19:43 ID:DO0Eh4HU
>>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のど自慢」の司会者が、高齢の参加者の横で歌い出しのタイミングを
「はいっ」と小声で言いながら、肩をポンと叩くようなもの…。
でいいでしょうか?
353345:02/09/16 04:01 ID:UUlYw865
>>346 正直、わかりません。こっちが教えて貰いたいくらいです。
>>348 ちょっと教わった気がします。ありがとう。

学ぶ者の力を引き出す技術。相手の考えを理解し、次の目標へ進む足掛かりになる…。

教える人と学ぶ者の関係は靴と足の関係に思えます。
双方が合えば、ズンズン進みますが、マズいと、足を痛めてしまいます。
学ぶ者の意欲も必要ですが、教える側はそれを伸ばし、
マズいやり方はフォローしなければなりません。

双方を繋ぐのは知識とコミュニケーションだと思います。
対面していれば、すれ違いは直ぐにフォロー出来ますが(でない事も沢山ありますが)、
文章の場合、なかなか難しいです。それは2chを眺めるとわかるように、
ちょっとしたすれ違いで、煽られたり、荒らされたりします。
知識。以前どっかのスレで、「何の為に、変数や関数の頭にアンダーバー
を付けているのか」という質問がありました。
自分は「プライベートな物とパブリックな物を見分ける為に付けている」と答えましたが、
「Cのライブラリに付いているものだから気を付けるように」
(正確に何と言ったか忘れた…ゴメソ)と他人様のフォローが。
間違った知識や遣り取りは命取り。

自分が思った、教える為に必要な事。
自分と相手が何を知っていて、何を知らないか。
(自分と相手の前提条件が違うと大変)
(自分の限界を知る事。Cのライブラリなんてしらね〜)
相手の質問が漠然としていたら、それをハッキリさせる。
(「困ってます」「何があったの?環境は?」みたいな?)
他にも沢山あるんだろな。

今の自分に技術は在りません。ここら辺で手一杯です。
これじゃ、どうやって力を引き出すんだよ。
嗚呼鬱市。すれちがいなのでage
354342:02/09/16 05:54 ID:QvlrmKrk
>>351-352
_IOLBFの時はnewlineが出力されるまでバッファリングします。
このモードにして、"...ください>\n"のようにnewlineをつけてみてくださ
い。

_IOFBFはバッファが一杯になるまでバッファリングします。

歌で例えるなら、
歌詞を見ながら歌うのが、_IONBF、
1行ずつ憶えて歌うのが、_IOLBF、
憶えられるだけ憶えてから歌うのが、_IOFBF、
という感じでしょうか。

で、途中までしか憶えいないのに、歌わないといけなくなった場合のために
fflush()という関数があります。
これはいままで憶えた(バッファリングした)分を歌って(出力して)しま
います。
setvbufを使うかわりに、printfの後にfflush(stdout);をいれてみてくださ
い。
355名称未設定:02/09/16 12:19 ID:ptMvii80
教える技術で大切なこと。

よけいなことを言わない(教える方がしゃべり過ぎない)。
質問しやすい環境を作る。

以上。
356348:02/09/16 19:23 ID:0g4Zx+fc
>>353,345
 私が345さんを見た感じ、『高度なスキルが最高の教材』といった
考え方ではないですし、大変深く考えていると思います。
ここに訪ねにくる人にどんどんアドバイスをすることで、
訪ねにきた人もますます歩みを進める事ができると思います。
 すばらしい事ですよ、今まで持ちえない概念を物にしてゆく他人の様は。
357名称未設定:02/09/16 21:23 ID:kDnAf3j6
project builderでグローバル変数を見るのと、
メモリダンプするのってどうやるの?

スコープ内のスタックにある変数は見れるんだけど、
他のは見れないっす。
358348:02/09/16 22:57 ID:0g4Zx+fc
>>357
ちょっと違ってるかもしれないけど、
[デバッグ]-[式...]
というのが有りますが、これはどう試してみるのもよいでしょう。
359名称未設定:02/09/16 23:04 ID:vmZycgO3
>> 357
Consoleからgdbを直接使うしかないかな
360名称未設定:02/09/17 21:57 ID:aQ5chp3a
age
361Emacsうまうま:02/09/17 22:58 ID:0fohiDYF
>>344
いや、、わしたいしてすごくない。コテハンだからめだつだけ、、

>>357
project builderでのやり方はしらない(ほとんど利用してないため)
gdbであればできる。
man gdb

こことか、他にも参考になる場所ある。
http://www-ise3.ise.eng.osaka-u.ac.jp/miura/programLecture/lecture5.html

362三前二後 ◆1CV58ydQ :02/09/17 23:51 ID:BCut4SRI
>>354
お世話になっています。
\nを入れてみて_IOLBFと_IOFBFの違いがわかった様な気がします。

setvbuf関数の代わりにfflush関数を入れてみましたが
全部のprintf関数の後に付けなくては意図した表示はされないんですね。

_IONBFはprintf関数の後に毎回fflush関数を書く手間を省けるもの
_IOLBFは全部の入力のための指示で改行してから入力させるときに使える
_IOFBFはただ表示だけするときに使える

おまえ本当にわかったのか?って思われるような理解のしかたでしょうか?
BMI指数を計るの章は終ったのですがちょっと弄くってみようと思い
BMI指数とは全然関係ないんですが名前を入力する部分を付け足してみました。
363三前二後 ◆1CV58ydQ :02/09/17 23:53 ID:BCut4SRI
>>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);
364三前二後 ◆1CV58ydQ :02/09/17 23:54 ID:BCut4SRI
>>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;
}
365三前二後 ◆1CV58ydQ :02/09/17 23:58 ID:BCut4SRI
>>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関数はバグがあるので絶対使ってはいけないとありました…。
改行文字を取り除くにはどうしたらいいのでしょうか?
367名称未設定:02/09/18 00:09 ID:fXdIFLxX
>>366
scanf("%s", &name);
でなくscanf("%s", name);のような。既にメモリアドレスを指してるわけだし。
368三前二後 ◆1CV58ydQ :02/09/18 00:44 ID:S1x0iqCK
>>367
ありがとうございました。
scanf("%s", &name);をscanf("%s", name);に変えたら
警告が出なくなりました。

Cの絵本のキーボード入力のところに
配列名は配列の先頭要素のポインタとなるため&は要らないとありました。

地図の上で目的地のところに印を付けるのが&の役割なんですね。
だから、既に目的地のところに印が付いているのに
また印を付けてなんて指示されたから警告が出たんですね。
コンパイラの気持ちは
「しょうがないな…警告を出しておくけど、やらせたいことはわかるから実行はしてやるよ」
ってところでしょうか。
369名称未設定:02/09/18 02:29 ID:ORKM41Hm
>>366
今回の場合、改行文字を'\0'にします。

身長に0を入力するとどうなりますか?
370354: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)
とは何なのでしょうか?
372370:02/09/18 23:19 ID:RqMPW2GL
>>371
多分引数に何も指定していないのだと思います。

ProjectBuilderで引数を指定するには、
1. ターゲットタブをクリック
2. Executablesから実行ファイルをクリック
3. 引数の欄に、引数を指定

2つめのプログラムは、引数がないのにargv[1]にアクセスすると、Bus error
になります。
373名無しさん@Emacs:02/09/19 03:26 ID:EFyv1rVY
ねぇ、char と char * と *char と char* の違いを
教えて下さい。どうかお願いします。
374名称未設定:02/09/19 03:54 ID:Fi69VpYx
>>373
char *ってchar *moji;ってことか?
*charってなんだ?
むしろこっちが聞きたい。
聞きたいことが曖昧すぎると答える方は大変だw
375名無しさん@Emacs:02/09/19 04:14 ID:EFyv1rVY
char * は引数なんかで char 型のポインタの時に書いてありません?
*char は単に変数 char のポインタを勘違いしたのかもしれません。
char* は良く分かりません。

"*" が色々な形式で使用されるので、体系的な説明が Web とかでない
かなっと思ったのですが、ポインターだけでも教えて下さい。
376名称未設定:02/09/19 04:33 ID:Fi69VpYx
>>375
基本的にはccはchar* = char * =char型へのポインタ(の宣言)と解釈する。
だからどれも一緒であとは好みとか流派wの違いだと思う。
ニュアンス的にはchar*は「char型へのポインタ」という型って感じで
char *pは「char型の変数*pの宣言」という感じかな?
377Emacsうまうま:02/09/19 06:08 ID:0GEmTg0h
>>371
setvbuf()を設定しないと何も表示されないかも、このまままだと、
もしくはprintf("%s\n",argv[i]);に変更してみて。

うんでTerminalから cc source.cするとa.outができるので
./a.out This is a pen
てやってみ。
# ProjectBuilderでの設定は370氏が記述してる通りらしい。

シグナルというのはエラー番号ぐらに思とけばいいのでは。
378Emacsうまうま:02/09/19 06:13 ID:0GEmTg0h
>>371
追加
Win用の説明だが以下参考
http://homepage1.nifty.com/toshio-k/prog/c/cmdline.html

>>373
(1)char a;
(2)char *b;
(3)char* c;
の違いって意味でよろしいか?
(1)は変数宣言、(2)(3)は宣言スタイル違うだけでポインタ変数の宣言。

(2)にするか(3)にするかは趣味の問題です。
379名称未設定:02/09/19 06:21 ID:VQRIUbgC
>>373
『*char と char* の違い』って
char szMozi;
&szMozi;
の&szMoziと、
char* pszMozi;
のpszMoziとの違い、ってことなのかなー。
いろいろな解釈できちゃって(つまり文章の意味が良く理解できなくて)
答えに苦しむなぁー。
380372: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つも関数が増えました。
自転車の補助輪を外して練習していた頃の気分です。

プログラムのコードよりも覚え書きのコメントのほうが多くなっちゃってます…。
382名称未設定:02/09/19 23:23 ID:Fi69VpYx
>>381
>プログラムのコードよりも覚え書きのコメントのほうが多くなっちゃってます…。

それはとてもすばらしいことです。
コメントも立派なプログラムの一部ですよ。
383Emacsうまうま:02/09/19 23:30 ID:Lnl5v/+7
>>371
どこかで見た気がすると思って会社の書棚の本の索引で探したら独習Cの例題
だね。
やや説明がわかりずらい章だった。

>>380
モードに関してはProject Builderの事はまったくしらないので勉強になります。

kill(1)などの(1)の意味がわからない人のための追加参考
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/073mannum.html

英語は読める必要はありません。しかし読む努力をしてください。
384Emacsうまうま:02/09/19 23:35 ID:Lnl5v/+7
>>382
同意です。

参考に、
わしの場合はDoxygen形式で大量のコメント記述します。
http://www.fides.dti.ne.jp/~oka-t/doxygen.html
生成したドキュメントを納品の元にした事もあります。
# そのままでは納品不可だった、、Excelを強要された、、鬱

複雑な物であれば、コメントはかなりの量になります。
385371:02/09/19 23:56 ID:fpX9YE0X
>>372,377,378
教えていただいたとおりにやって、思うように動きました。ありがとうございます。
ターゲットタブの中をいじったのはこれが初めてです。ブレークポイントのところ
もまだいじったことありません。このあたりって、Cを一通り理解したあたりで
使えるようになればいいのでしょうか?ProjectBuilderのヘルプでデバッガとか
調べてもまだ理解できませんでした。
386371:02/09/20 00:03 ID:Bo9zDw2r
>>383 Emacうまうまさん
ビンゴです。いま独習Cで勉強中です。教えていただいたホームページも参考にさせていただきます。
387名無しさん@Emacs:02/09/20 02:14 ID:3wahd1Bt
>>376, 378
ありがとうございます。
char *a と char* a は同じなんですか。カーニハンの P.114 に

double *db, atof(char *);

この char * は atof の引数が char へのポインタであると書いて
ありました。これら仕様は少し分かりにくくないですか?
瑣末な事なので、分かっている人は気にならないのでしょうか。

>>379
済みません。*char は私の勘違いだと思います。でも、変数名に
char と付けるのは良くないですよね。確か何かのサンプルコード
だったと思います。

どうもありがとうございました。
388380:02/09/20 09:27 ID:RBQcv361
>>381
楽しいのはいいですね。
どんどん先へ進みましょう。

そのうち、原動機がつき、4輪になり、翼が付きますよ。
事故った時のリスクも高くなりますが...。
389380:02/09/20 09:33 ID:RBQcv361
>>383
フォローありがとうございます。
私は多分初心者には(というか誰にでも)優しくないと思いますので、これ
からも不十分な点がありましたら、よろしくおねがいします。
390380:02/09/20 09:41 ID:RBQcv361
>>385
デバッガを使うのはCを理解するのにも役立つと思います。

とりあえず、Project Builderヘルプの「デバッグする」->「ブレークポイン
トとウォッチポイントを設定する」と「変数を表示する/設定する」を読ん
でみましょう。

変数の値をチェックできるだけでもずいぶん便利なはずですよ。
391Emacsうまうま:02/09/20 19:58 ID:/AsfQZ6P
>>386 == 371
独習Cは内容ちゃんとしてるけど一部説明がわかりずらいい部分がある感じで
す。
まあどの本でも註釈は必要な部分あるので、検索して不明な場合は質問した方
が速いかもしれません。

>>389 == 380
いえいえ。気付いた所に註釈付加してるだけです。

>>385
380氏と近い意見です。まあ慣れない内は頻繁に利用する必要もないかと思い
ますが、時々りようするとだんだん意味が理解できてくるかと思います。

何事にも王道はありません。最初は「理解する」というより「理解する努力をする」
方が重要だとわしは思うのです。

# 私信だが、、わしやっと夏休み、といっても火曜日だけ、しかし土日月ちゃ
# んとやすめるので旅行でもいってきますわ。まかせた380氏(w
392371: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
となってしまいますが、なんのことだかさっぱりで...。
393392:02/09/22 16:34 ID:6j6ibf9Y
>392自己レスです。
Terminalで実行すると期待通りname.txtの内容を表示できました。
(さっきと何が違うのか自分でもわかりません)
ProjectBuilderではやはり「ファイルを開くことができません]
になってしまいました。
394392:02/09/22 16:54 ID:6j6ibf9Y
>392
またまた自己レスです。
ターゲットタブをクリックし、Excutablesから実行ファイルを
ダブルクリック、実行時の欄で作業ディレクトリを選択し直したら
ちゃんと動きました。お騒がせしました。
395名称未設定:02/09/22 22:17 ID:H5bMuecd
>>394
。。。ガンガレー
396名称未設定:02/09/22 22:56 ID:CbI0p4ge
>>392
これでも思ったように動くと思うけど、このプログラムの内容からすると
char ch;
と書くのは間違いだね。。
なぜ間違っていて、どう訂正するのかはとりあえず自分で調べてけれ。
ガンガレー
397名称未設定:02/09/26 19:51 ID:pRy/IR40
人がいないのであげてみよう
398名称未設定:02/09/26 19:51 ID:pRy/IR40
間違えた
399Emacsうまうま:02/09/27 00:13 ID:FcjcWa57
...人いないですね(T_T)
なんか問題でもだしたらだれか解いたりしてくれるだろうか,,
400名称未設定:02/09/27 00:39 ID:pQNTLVpc
質問がCの初歩的なことなのでプログラム板で事足りるのでは?
401390:02/09/27 09:43 ID:SxbbXQMC
>>399
連休中はさすがにみんな遊びに行ってるんだろうと思ってましたが、それだ
けじゃなかったみたいですね。
みなさん自力でがんばってると思っておきましょう。

>>400
それを言っちゃあ...。
でも、Project Builderの話題もありますのであってもいいと思いますよ。
402392:02/09/27 12:20 ID:KXadaBpf
>396さん
char ch;の間違いの件、分かりませんでした。ヒント下さい。

>399
人いますよ(少なくとも1人は)。
超初心者向けの問題だったらがんばって解いてみようと思います。


403401:02/09/27 13:37 ID:SxbbXQMC
>>402
396さんではありませんが、ヒントはman fgetcです。
ch = fgetc(fp)は...
404392:02/09/27 14:47 ID:KXadaBpf
fgetcの戻り値はint型であるべきなのに、char型のch=fgetc()としているところが
間違い...でよろしいのでしょうか?
ちなみにProjectBuilderでchar ch;をint ch;にしても動きました。
405名称未設定:02/09/27 14:57 ID:IOoGYOVP
おぃおぃ本当にそれで良いのか?
392がほすぃのはint型の値じゃなくてchar型の値だろ。
だったらchar chじゃ無いとまずいだろ。
406396:02/09/27 15:53 ID:nGAAdYd5
>>402
まぁ、>>404で正しいけど、以下のことを考えてみて。
fgetcはファイルから読み取った文字を返します。
ファイルを最後まで読み終わるとEOFを返します。
さて、ファイル中にもしEOFが存在したらどうなるでしょう?
fgetcは何を返せばいいでしょう?
407403:02/09/27 16:14 ID:SxbbXQMC
>>405
man putcharもしてみましょう。
408392: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()でチェックする
と書いてありました。この前読んだときは何のことかよく分からなかったのですが、すこし
理解できたような気がします(まだ分かってないかもしれませんが)。
409406: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
とかってコマンドを実行すればいい。
410392:02/09/27 17:30 ID:KXadaBpf
>409
確かに、教えていただいた方法でtestfileを作成してfgetc()の戻り値をchar型にすると
beforeで読み込みが止まり、int型にするとbefore�afterと最後まで表示されました。なるほど。
fgetcの戻り値をchar型にすると真のEOFと偽物のEOF(こんな表現でいいのかなぁ?)が判別でき
ないけどint型ならそれが可能、ということでしょうか?
でもそれだと何でfeof()やferrorがあるのかなぁなんて疑問がまた生まれました。
411407:02/09/27 18:00 ID:SxbbXQMC
>>410
その疑問を解く(一つの)ヒントは、やっぱりman fgetcです。
fgetc()がEOFを返すのは...
412392: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が使いこなせません。
413411:02/09/27 22:23 ID:9NMezIFm
>>412
戻り値をcharで受けてもintで受けても、ファイルの終わりなのか、エラーに
なったのかは判断できませんね。
414392:02/09/27 23:09 ID:KXadaBpf
>412
あっ、やっぱりそうなんですか。でもそうすると>409 >410のように
意図的に途中にEOF(-1)が入ったファイルを作るった場合に、fgetc()
の戻り値をcharにした場合とintにした場合で結果が異なるのは何故なんでしょう?
意図的にEOF(-1)を作った場合以外にもエラーになることがあるということなのでしょうか?
415413:02/09/28 00:21 ID:dsHEaITP
>>414
fgetc()は、unsigned charで読み取った値をintに変換して返すからです。
-1をunsigned charにすると...
416名称未設定:02/09/28 23:36 ID:SP4EnSXl
>>414
>>392のプログラムの
putchar(ch);
の部分を
printf("%c:%d:%d ", ch, ch, (char)ch);
とかって書いて実行してみたら?
実行する前に、どういう結果になるのか想像してからね。
417名称未設定:02/09/29 18:58 ID:GQdLvuN8
>>414
int のサイズが2バイトとすると(最近は4バイトが多いが)
EOF -> 0xFFFF、データ中の -1 -> 0x00FF の違い。
418名称未設定:02/09/29 20:25 ID:/mjKyy7o
>>412
ttp://www.fan.gr.jp/~sakai/jman.html

% jman getc
% jman ferror
% jman errno
419412:02/09/29 20:42 ID:NLsBSK/K
>418
ありがとうございます。実は、1週間ぐらい前にjmanインストールしたのですが、
環境変数の設定の仕方もろもろが分からずに使えませんでした。
で、いまはC、Cocoa、Unix(B shell)の勉強を行ったり来たりしています。
420418: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
スレ参加者募集あげ。
422Emacsうまうま:02/10/08 23:50 ID:anwF+JbT
数日これない間にさびれぎみ、、(-_-)

ム板にいってしまったのかな、、
423名称未設定:02/10/09 00:53 ID:8ouTcHb2
>>422
みんなある程度すると自分で考え、調べ、学ぶ事が
出来て行くのではないでしょうか?
なんというかある程度はプログラミング(C)についての
道理や筋道が見えてくるというか。。。

とりあえず、新規参加募集age
424Emacsうまうま:02/10/09 06:55 ID:mJ2sQ+oY
>>423
そうやね。
ってか自分でできるようにならんとヤバイでしょうし。

しかし新規参加者不足ですな。
ム板にいきなりいってるのかもしれず。
425238:02/10/09 12:19 ID:8CXNpsst
GUIを絡めた、Cプログラミングってどんな感じなの?
PowerPlant + CodeWorrior (C)とか。
426名称未設定:02/10/09 12:57 ID:9HFJZVR5
ProjectBuilder + InterfaceBuilder じゃないかな。
427238:02/10/09 14:23 ID:8CXNpsst
>>426
Cプログラミングだと、CW+PPの組み合わせの方が多そうだな、と思ったから。
もう、CプログラミングでもPB+IBの方が多いのかな。
428426:02/10/10 00:13 ID:ggYyHlG5
>>427
あぁなるほど。仕事でバリバリ組む人はそっちのが多いのかなぁ。
勉強し始めた俺は mi + Terminal だったりします。
429質問です。:02/10/10 03:03 ID:Sv5RKon6
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++;
}
}
430429続き:02/10/10 03:04 ID:Sv5RKon6
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;
}
431名称未設定:02/10/10 03:58 ID:y8tmBRM6
cryptとcript
432429:02/10/10 12:33 ID:Sv5RKon6
>>431
ありがとうございます。タイプミスだったすね。
なんだか恥ずかしいです、とても。

で、直すと無事コンパイルが通りまして
実行するとencryptや、decryptの中の
whileが実行されないようです。
このように文字列を扱うのは間違いなのでしょうか?
433名称未設定:02/10/10 13:09 ID:TJ2o8Ii8
while()ってのは
括弧の中が真である時に繰り返される。

-1ってのは文字列の最後に出てくるんだよね?
つまりpt[t] == -1が真になるのは・・・。
434415:02/10/10 14:18 ID:E9qOCXvY
>>432
whileループに入る条件が成立してませんね。

あと、文字列リテラルはナル文字で終わります。
それと、文字列リテラルは書き換えないようにしましょう。
435429:02/10/10 23:50 ID:Sv5RKon6
>>433,434
ご指摘ありがとうございます。
なるほどです。本をよく読めって感じですね。。。

とりあえずwhileのところは
while(pt[t] != '\0'){
とやってみるとうまくいきました。
ただ根本的な部分で間違いをしていまして
それについて考えています。
ユーグリッドの互除法(改)のやりかた。。
436429: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;
}
437429続き:02/10/11 03:47 ID:cGX7Km9y
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でもやってたほうがいいのでは。
439名称未設定:02/10/11 18:30 ID:dxlld3+G
>>436
うーん、少なくともポインタについては勉強したほうがいいと思う。
もし本を読んでるとしたら、理解が中途半端かor分かってない。
ポインタについてはこのスレの前の方で説明している人がいたはずです。
まず、これらをヒントに間違い探しをしてみましょう。
それと、できれば字下げしてください。
あなたも読みにくいでしょう?

>>438
Cを勉強したい、といっているのだし
Cを学んでからでもいいと思うが。Perlなんて将来どうなるか分からんし。
440Emacsうまうま:02/10/11 23:35 ID:D3K4wBGA
>>436
ソースが激しくきちゃない、、、
スレに書き込むためなのかもしれないですが、もうすこしなんとかした方がよいです。

個人的意見ですがどんなソースがきれいか判断できるという事は、意味がある程度
わかっているという事に近似だと思います。

ソースきちゃないのはよくわかっていないからだと思われます。
精進してください。

>>438
Perlは、、今から学ぶならPythonの方がいいです。
441名称未設定:02/10/11 23:56 ID:7ILM8oEP
どこが汚くて、どう書き換えたらいいか、例を出してあげないと
たぶん分からないと思われ。それをしないで言いっぱなしだと、
ただの自慢したがりに見えなくもない。
漏れはプログラミング、まったく分からない人なので、
「そういうならお前やれ」はなしね。
442名称未設定:02/10/12 00:47 ID:cug6SGxj
>>441
>>440氏が汚いって言ってるのは確かに、
ポインタに関する作法(それ自体はよく分からんけど)も含まれているだろうけど、
本当に基本的な作法を守っていないからだと思われます。
これは、どんな言語のコードを書く上で、守らなければならないモノで。
まぁ、多分>>440氏の言うように、スレに書き込むためかもしれませんが。

漏れ自身も初心者ですが、自分で調べたりなんなりしないと、身に付かないと思ってます。
もし、>>436自身が分からなければ、そう言えばいいだけの話だと思うし。
生意気で申し訳ないが。
443名称未設定:02/10/12 01:20 ID:mPnxXiHx
古い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;
}
444名称無設定:02/10/12 08:50 ID:KLGSCDT/
>>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には文字列と言う型は無くて、
プログラマが場所を用意してあげなければならないことを覚えておいてください。
445434: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されてます?
446445:02/10/13 16:44 ID:VvHAy8Li
あ、etextをmalloc()してませんね。
あと、malloc()したらfree()と憶えておきましょう(この場合いらないと言う
人もいるでしょうが)
447443:02/10/14 19:01 ID:Y8/UodjN
>>445
どうもありがとうです。
元のコードはインデントと変数の宣言部分しかみてません(w
ちゃんと直してあげればよかったですね。
>>446
うーん、いきなりmalloc使わずに
普通に配列で宣言してもいいんじゃないですかね。
あと気になったのは、引数のチェックをどこでしてるのか、ってところですか
この辺りは最初のうちに頭に入れといたほうがいいと思います。
448Emacsうまうま:02/10/14 21:10 ID:aCYxR+PI
>>441
例ですか。修正してしまった方がはやいのですが、それだと勉強にならない気
がしますし。

なぜきたないかは勉強するうちにわかるかという期待だと思ってほしいです。

>>443
おおきれいや。
ただchar* ptextとchar *etextがまざるのはいかがな物かと。

>>445氏適切やな、、わし頭さびてきてる(w

>>447
境界チェックとかいわゆる安全なプログラムの作り方の話しされてます?
Cではいろいろそのあたり気をつける事多すぎるやもしれず。

449Emacsうまうま:02/10/14 21:53 ID:UbbmMpwQ
今回の場合RSAそのものはしらないでもいいですが、参考までに。
http://www.faireal.net/articles/5/24/#d20524
http://www.maitou.gr.jp/rsa/
などを読むとためになるかもしれません。

450445
ソースの書き方については、この辺のページを読むといいと思います。
http://www.st.rim.or.jp/~phinloda/cprog.html

>>447
まあ、最初(というか練習プログラムのうち)はそこそこでいいんじゃ
ないでしょうか。