C言語なら俺に聞け(入門篇) Part 9

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 8
http://pc11.2ch.net/test/read.cgi/tech/1171946674/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 http://pc10.2ch.net/test/read.cgi/tech/1170064980/

関連スレ
C/C++の宿題を片付けます 84代目
http://pc11.2ch.net/test/read.cgi/tech/1172981618/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1171888583/

【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
2デフォルトの名無しさん:2007/03/08(木) 01:18:40
立てた
3デフォルトの名無しさん:2007/03/08(木) 01:29:10
4デフォルトの名無しさん:2007/03/08(木) 01:48:39
前スレの最後のほうのヤツら、プロプロってなんだよ?
プリプロだよ、馬鹿!
5デフォルトの名無しさん:2007/03/08(木) 02:06:12
プロプロワロタ
6デフォルトの名無しさん:2007/03/08(木) 03:21:45
プリプリのほうがいい
7デフォルトの名無しさん:2007/03/08(木) 08:20:00
全部日本語にすると前処理指令だな。
Turbo C++ のヘルプにはプリプロセッサ指令と書いてあった気がする。
いつの間にか全部横文字にするのが広まったみたいだが、長過ぎて良くない。
8デフォルトの名無しさん:2007/03/08(木) 08:34:17
プリプロ プロプラ ポリモル ポリゴン
9デフォルトの名無しさん:2007/03/08(木) 10:08:15
ヒヤヒヤドキッチョの
10デフォルトの名無しさん:2007/03/08(木) 10:10:37
C言語を覚えるにあたって

参考書を読破するのが先ですか

読みながらソース書くのがいいですか?

自分は後者なんですが、この調子だと、終わるのがいつになるのか・・・
最終的にはネットワークプログラミングをしたいです。

一応TCP(UDP)/IP、IPv6、VoIP関係の本は何冊か読破してパケットキャプチャ
やsyslogに出てくるログは理解できます。

WinXPとDebian使っています。

どなたかご教授を。
1110:2007/03/08(木) 10:11:56
追記

Cにこだわらなくてもいいでしょうか?

12デフォルトの名無しさん:2007/03/08(木) 10:17:02
>>10
最終的にはネットワークプログラミングをしたいなら
C にこだわらないほうが良い

ソケットとか文字列処理とかが楽な言語をオススメする
13デフォルトの名無しさん:2007/03/08(木) 10:19:28
手順について
読破し終わってどっこいしょと手を動かし始めるよりは、動かして
引っかかりながら覚えた方がいいと思う。

言語について
どんな言語でプログラムを書くにせよ、TCP/IPはもちろん、
ファイルディスクリプタとかUNIXシステムコールの知識はあったほうがいい。
言語としてのCの知識もあることが前提になってるし。

14デフォルトの名無しさん:2007/03/08(木) 11:56:17
難しくてもCを触っておいて損はしないと思うよ。
15デフォルトの名無しさん:2007/03/08(木) 12:33:24
まさか、英語をマスターするまでは一言も喋りません、なんて阿呆はいないだろ。
英文法を覚えるよりも片言ででも喋った方が上達するのは蓋し当然だ。
16デフォルトの名無しさん:2007/03/08(木) 14:19:20
makeでコンパイルしたときにコンパイルが通らなくて、
objファイルとか実行ファイルを削除した上でmakeしなおすと
うまくいくということを何度も経験するんですが、
これは何が原因でこういうことになっていますか?
17デフォルトの名無しさん:2007/03/08(木) 14:21:27
>>16
makefile が正しく書かれていない可能性大
18デフォルトの名無しさん:2007/03/08(木) 14:24:58
おそらくヘッダファイルの依存性が正しくない
19デフォルトの名無しさん:2007/03/08(木) 14:31:03
PCのタイマーがくるってる場合も
20デフォルトの名無しさん:2007/03/08(木) 16:54:53
int から int にマップするのに一番いい方法はなんでしょうか?

C++ならstd::map がありますが、こういうことをgccでやりたいのですが...
int map[MAX_MAP];
b = map[a];
だと早いのですがaの値が-32768〜32767の範囲で100個くらいの値をとるので
メモリ効率を考えるとムリポです。
21デフォルトの名無しさん:2007/03/08(木) 16:58:49
>>20
100個程度なら配列の中身と逐次比較していけばおk
登録回数に比べて検索回数が多いならソートしてから bsearch でおk
22デフォルトの名無しさん:2007/03/08(木) 17:07:36
一度ハッシュテーブルを自分で実装してみるのも勉強になるぞ。
23デフォルトの名無しさん:2007/03/08(木) 17:13:26
>>21 >>22
うほ。さっそくdクスです。
ハッシュテーブルむずかしす(;´Д`)
bsearchでやってみます。
ありがとうございまぷ。
24デフォルトの名無しさん:2007/03/08(木) 17:36:34
>>20
別にgccでもstd::mapを使えばよいのでは?
25デフォルトの名無しさん:2007/03/08(木) 17:41:46
gccであってg++ではない(Cで書かなければならない)ということだろ。
26デフォルトの名無しさん:2007/03/08(木) 17:53:58
>>23
std::mapはRed-Blackツリーとかの高度なアルゴリズムでマップを
作ってるはずなので、最初は見て理解しようとしなくていいからな。
27デフォルトの名無しさん:2007/03/08(木) 17:58:46
スレ違いだが
Cとコマンドプロンプトどっちを先にやったらいいですかね?
2820:2007/03/08(木) 18:05:28
>>25
そのとおりです。
g++が使えれば楽なのですがgccでC言語がりがり書いてます...

オープンソースとか、いまでもgccなものが多いですよね?
サーバソフトなどであまりg++が使われないのはパフォーマンスの問題でしょうか?
29デフォルトの名無しさん:2007/03/08(木) 18:19:23
いやだから、gccはcコンパイラじゃなくてコンパイラコレクションなんだが。
30デフォルトの名無しさん:2007/03/08(木) 18:20:35
>>29
どっちも真だよ
31デフォルトの名無しさん:2007/03/08(木) 18:20:53
>>27
kwsk
32デフォルトの名無しさん:2007/03/08(木) 19:11:46
>>27
気になるwww
33デフォルトの名無しさん:2007/03/08(木) 19:36:51
>>29
コンパイラコレクションのことを指すときには
大文字でGCCと書いていることが多い気がする。
3410:2007/03/08(木) 20:39:01
>>12-15さん

参考になりました。
まずCを参考書を読みながら勉強することにします。
それから違う言語に行きます。

>>15さんのアドバイス、理にかなっています。
そういわれると「なるほど」と(よい意味で)納得できます。

皆さんありがとうございました。
35デフォルトの名無しさん:2007/03/08(木) 20:41:33
がんばれ超がんばれ
誰も言ってないようなんで、言っとくと
C言語の一番の上達は、「良い指導者を見つける事」だったりする
なかなか居ないけどね
36デフォルトの名無しさん:2007/03/08(木) 20:43:00
#include <stdio.h>
#include <string.h>

struct seiseki {
char no[10];
char name[20];
};

void main(void){
struct seiseki seito[2];
seito[0].no = "111A001";
seito[0].name = "山田";

seito[1].no ="111A002";
seito[1].name = "鈴木";

printf("学籍番号|氏名");
printf("%s|",seito[0].no);
printf("%s|",seito[0].name);
}

コンパイルできません・・・。seito[0].no = "111A001";seito[0].name = "山田";
seito[1].no ="111A002";seito[1].name = "鈴木";のところで、左辺の値が必要
とでるのですが、どういうことでしょう?
37デフォルトの名無しさん:2007/03/08(木) 20:45:22
"111A001"はポインタだから配列には代入できん。
strcpyを使いな。
38デフォルトの名無しさん:2007/03/08(木) 20:45:48
>>36
strcpy
3910:2007/03/08(木) 20:51:16
間違い承知で言わせてください(すみません)

char は1バイトしか記憶できないのでは?

ごめんなさいごめんなさいごめんなさい
40デフォルトの名無しさん:2007/03/08(木) 20:52:15
やっぱり違いましたか。
すみません
41デフォルトの名無しさん:2007/03/08(木) 20:52:52
>>39
合ってます。大正解です。

おめでとうおめでとうおめでとう
4210:2007/03/08(木) 21:03:56
え?

立て続けにもう一つだけお願いします

winXPとDebianでCの勉強はどちらが良いと思いますか?
43デフォルトの名無しさん:2007/03/08(木) 21:11:16
36です。。
>>37
まだポインタまで勉強してないもので・・・。構造体配列の勉強の途中でした。
strcpyもまだ勉強してないっす・・・・・。ほんと初歩の初歩しかまだやって
いないので。。調べてやってみます。
貴重なアドバイスありがとうございました。
44デフォルトの名無しさん:2007/03/08(木) 21:12:05
>>42
個人的な感想
WinXP ならコンパイラに bcc 使うとコンパイル時のエラーメッセージが分かりやすいと思う(但し、最初の設定でつまづく人が多い)
VisualC++Expressは使ったこと無いのでコメントできない

Debian だと OS のインストール時にコンパイラがインストールされてる(されてないかも知れない^^;)
ので、いきなり使えて余計なことを考えなくても済む
45デフォルトの名無しさん:2007/03/08(木) 21:21:57
>>44
>但し、最初の設定でつまづく人が多い

決して難しい設定ではないんだけどねぇ。
でも、うっかり半角スペースを含むパスにインストールしちゃったら
プログラミング自体が初めてって人は問題の原因がわかんなくて
確実に挫折するだろうね。
46デフォルトの名無しさん:2007/03/08(木) 21:24:27
C言語を習得することによって、どのような職業で有利になるのでしょうか?

というのは、最近、何気なくC言語に関するサイトを見ていたら面白そうに感じてしまい、
今実際に勉強している最中なのですが(と言ってもまだ2日目)
47デフォルトの名無しさん:2007/03/08(木) 21:27:43
>43
普通文字列処理一通り済ませてから構造体に行かない?
48デフォルトの名無しさん:2007/03/08(木) 21:31:29
>>46
職業の種類の割に役立つのはC言語よりもExcelVBAだと思う
C言語はたしかに面白いけど、職業のメインに据えるのは止めたほうがいい
簡単なツールを作るくらいはするが、ほとんど趣味でやってる
49デフォルトの名無しさん:2007/03/09(金) 01:07:35
http://doiob.net/doiob/uploader/src/up0999.txt

c:\source>buf
'buf' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

c:\source>bcc32 buf.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
buf.c:
警告 W8065 buf.c 32: プロトタイプ宣言のない関数 'openFile' の呼び出し(関数 main
)
警告 W8065 buf.c 33: プロトタイプ宣言のない関数 'saveFile' の呼び出し(関数 main
)
警告 W8065 buf.c 34: プロトタイプ宣言のない関数 'listLines' の呼び出し(関数 main
)
警告 W8065 buf.c 35: プロトタイプ宣言のない関数 'gotoLine' の呼び出し(関数 main
)
警告 W8065 buf.c 36: プロトタイプ宣言のない関数 'insertString' の呼び出し(関数 m
ain )
警告 W8065 buf.c 37: プロトタイプ宣言のない関数 'deleteString' の呼び出し(関数 m
ain )
警告 W8065 buf.c 38: プロトタイプ宣言のない関数 'showHelp' の呼び出し(関数 main
)
警告 W8065 buf.c 42: プロトタイプ宣言のない関数 'clearBuffer' の呼び出し(関数 ma
in )
警告 W8070 buf.c 43: 関数は値を返すべき(関数 main )
警告 W8065 buf.c 82: プロトタイプ宣言のない関数 'enterFileName' の呼び出し(関数
openFile )
5049:2007/03/09(金) 01:08:20
警告 W8065 buf.c 84: プロトタイプ宣言のない関数 'countLines' の呼び出し(関数 ope
nFile )
警告 W8065 buf.c 92: プロトタイプ宣言のない関数 'clearBuffer' の呼び出し(関数 op
enFile )
警告 W8060 buf.c 109: おそらく不正な代入(関数 closeFile )
警告 W8065 buf.c 110: プロトタイプ宣言のない関数 'saveFile' の呼び出し(関数 clos
eFile )
警告 W8065 buf.c 111: プロトタイプ宣言のない関数 'clearBuffer' の呼び出し(関数 c
loseFile )
警告 W8065 buf.c 120: プロトタイプ宣言のない関数 'enterFileName' の呼び出し(関数
saveFile )
警告 W8065 buf.c 133: プロトタイプ宣言のない関数 'ptintf' の呼び出し(関数 listLi
nes )
警告 W8065 buf.c 142: プロトタイプ宣言のない関数 'ptintf' の呼び出し(関数 gotoLn
inss )
警告 W8019 buf.c 196: コードは効果を持たない(関数 deleteString )
警告 W8066 buf.c 199: 実行されないコード(関数 deleteString )
警告 W8066 buf.c 200: 実行されないコード(関数 deleteString )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_gotoLine' が未解決(C:\SOURCE\BUF.OBJ が参照)
Error: 外部シンボル '_showHelp' が未解決(C:\SOURCE\BUF.OBJ が参照)
Error: 外部シンボル '_enterFileName' が未解決(C:\SOURCE\BUF.OBJ が参照)
Error: 外部シンボル '_ptintf' が未解決(C:\SOURCE\BUF.OBJ が参照)

ご指摘、宜しくお願い致します。
51デフォルトの名無しさん:2007/03/09(金) 01:19:37
void openFile(); // 前方参照
void openFile(void); // プロトタイプ宣言
52デフォルトの名無しさん:2007/03/09(金) 01:19:44
デバッグは自分でやれ
53デフォルトの名無しさん:2007/03/09(金) 01:21:19
>>49
行数書いてあるんだから一つずつつぶして池よアホ
54デフォルトの名無しさん:2007/03/09(金) 01:22:22
scanfでもなんでも入力はいいけど、
数字の入力を求めて、下3桁を取るにはどうしたら良いのでしょう?
55デフォルトの名無しさん:2007/03/09(金) 01:22:40
%1000
56デフォルトの名無しさん:2007/03/09(金) 01:31:46
%1000?
57デフォルトの名無しさん:2007/03/09(金) 01:32:16
パーセン
58デフォルトの名無しさん:2007/03/09(金) 01:35:22
剰余
59デフォルトの名無しさん:2007/03/09(金) 01:36:39
なるほど、ありがとうございました
60デフォルトの名無しさん:2007/03/09(金) 01:37:35
サーセンw
61デフォルトの名無しさん:2007/03/09(金) 01:39:34
取るが取り出すなのか取り除くなのかわからん。
6249:2007/03/09(金) 01:39:44
レス、ありがとうございます。

c:\source>bcc32 buf.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
buf.c:
警告 W8070 buf.c 43: 関数は値を返すべき(関数 main )
警告 W8060 buf.c 109: おそらく不正な代入(関数 closeFile )
警告 W8019 buf.c 196: コードは効果を持たない(関数 deleteString )
警告 W8066 buf.c 199: 実行されないコード(関数 deleteString )
警告 W8066 buf.c 200: 実行されないコード(関数 deleteString )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_gotoLine' が未解決(C:\SOURCE\BUF.OBJ が参照)
Error: 外部シンボル '_showHelp' が未解決(C:\SOURCE\BUF.OBJ が参照)
Error: 外部シンボル '_enterFileName' が未解決(C:\SOURCE\BUF.OBJ が参照)

これらが、どうしてもわかりません・・・ので
ご指摘、お願い致します。
63デフォルトの名無しさん:2007/03/09(金) 01:41:48
>62
エラーはプロトタイプ宣言の関数名と実際の関数名が違ってるんだろ。
64デフォルトの名無しさん:2007/03/09(金) 01:45:14
>>62
何だこの変なインデントは
mainの}が見つからないかと思った。

> 警告 W8070 buf.c 43: 関数は値を返すべき(関数 main ) 

main()て書いたらとりあえず
int main()て思われてしまうので
return int型;
が必要でしょう。

というか省略しないようにしましょう。

65デフォルトの名無しさん:2007/03/09(金) 01:47:38
>>62
>警告 W8060 buf.c 109: おそらく不正な代入(関数 closeFile ) 
どこが109行目かわからないので推測だ。

if(ans[0] = 'y')
比較する式じゃないからわろうな。
if(ans[0] == 'y')
のまちがえじゃないのか。



66デフォルトの名無しさん:2007/03/09(金) 01:49:55
>>62
警告 W8019 buf.c 196: コードは効果を持たない(関数 deleteString ) 
警告 W8066 buf.c 199: 実行されないコード(関数 deleteString ) 
警告 W8066 buf.c 200: 実行されないコード(関数 deleteString ) 

実行しないから効果ないといっているのだろうか?
判りません。

Error: 外部シンボル '_gotoLine' が未解決(C:\SOURCE\BUF.OBJ が参照) 
Error: 外部シンボル '_showHelp' が未解決(C:\SOURCE\BUF.OBJ が参照) 
Error: 外部シンボル '_enterFileName' が未解決(C:\SOURCE\BUF.OBJ が参照) 

gotoLineが宣言されているし使用しているが存在しない。
showHelpが宣言されているし使用しているが存在しない。
enterFileNameが宣言されているし使用しているが存在しない。
67デフォルトの名無しさん:2007/03/09(金) 01:54:46
FILE *fpl,*fps

この*fplと*fpsってどのような命令なのでしょうか?
ググっても出てこなかったのでどなたか教えていただけると幸いです
6849:2007/03/09(金) 01:55:39
皆さんのお陰で
警告 W8019 buf.c 197: コードは効果を持たない(関数 deleteString )
警告 W8066 buf.c 200: 実行されないコード(関数 deleteString )
警告 W8066 buf.c 201: 実行されないコード(関数 deleteString )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_gotoLine' が未解決(C:\SOURCE\BUF.OBJ が参照)
Error: 外部シンボル '_showHelp' が未解決(C:\SOURCE\BUF.OBJ が参照)
Error: 外部シンボル '_enterFileName' が未解決(C:\SOURCE\BUF.OBJ が参照)

まで減らせましたが、
>>66さんの仰る通り、それが解決できませんので
どうすれば解決しますでしょうか?入門書の解説には
このサンプルソースしかありません・・・・・
69デフォルトの名無しさん:2007/03/09(金) 01:56:48
>>68
お前が関数定義のところでtypoしてるんだって。
よく見直せよ
70デフォルトの名無しさん:2007/03/09(金) 01:59:00
>>67
FILE * fpl;
FILE * fps;

両方ともFILE構造体へのポインタという変数ですね。
71デフォルトの名無しさん:2007/03/09(金) 02:01:19
>>68
他人のプログラムの無い物までは私にはわかりません。
showHelpとShowHelpがあやしい。
72デフォルトの名無しさん:2007/03/09(金) 02:11:02
>>70
回答ありがとうございます。
ファイルポインタは分かるんですが、lとsが付く事で何が変わるのでしょうか?
ド素人で申し訳ありません。
73デフォルトの名無しさん:2007/03/09(金) 02:12:18
int il;
int is;
lとsが付く事で何が変わるのでしょうか?
74デフォルトの名無しさん:2007/03/09(金) 02:14:14
>>67
ファイルストリームでググレ
75デフォルトの名無しさん:2007/03/09(金) 02:14:34
>>73
なるほど。
回答本当にありがとうございます。感謝です。
76デフォルトの名無しさん:2007/03/09(金) 02:15:06
>>73
lとsがつかなかったら
int i; 
int i; 
iが2つあるのでコンパイルエラーになる。

変数名の最後の文字lとsに特別な意味はないし、
変数名の最初の文字iにも特別な意味はない。
77デフォルトの名無しさん:2007/03/09(金) 02:16:01
>>74
ありがとうございます。
参考にさせていただきます。
78デフォルトの名無しさん:2007/03/09(金) 02:16:08
あはははh
79デフォルトの名無しさん:2007/03/09(金) 02:16:09
>>73
i1もisも名前だからなんも変わらん。データを格納する箱を任意で付けてるだけだから。
80デフォルトの名無しさん:2007/03/09(金) 02:17:39
>>70
今でもFILE*をfplとかfpsなんて変数名にしてる例があるのか。
81デフォルトの名無しさん:2007/03/09(金) 02:18:55
算法の参考書では*fp *fp1 ...*fpnがスタンダードっしょ
8249:2007/03/09(金) 02:22:15
http://doiob.net/doiob/uploader/src/up1002.txt

c:\source>bcc32 buf.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
buf.c:
警告 W8019 buf.c 197: コードは効果を持たない(関数 deleteString )
警告 W8066 buf.c 200: 実行されないコード(関数 deleteString )
警告 W8066 buf.c 201: 実行されないコード(関数 deleteString )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_gotoLine' が未解決(C:\SOURCE\BUF.OBJ が参照)
Error: 外部シンボル '_enterFileName' が未解決(C:\SOURCE\BUF.OBJ が参照)

格闘していますが、これが限界です。外部ソースなんてないし・・・・
あとは、翔泳社の参考書のなので、そこに問い合わせてみるべきですかね?
ありがとございました。。。あと、一歩なのに悔しいorz
83デフォルトの名無しさん:2007/03/09(金) 02:24:07
>>82
だからお前がタイプミスしてんだと何度言えば分かるんだ
84デフォルトの名無しさん:2007/03/09(金) 02:24:53
それじゃあ悪いハンガリアンと間違った変数名の付け方の例じゃないか。
アルゴリズムに夢中でそれ以外は手抜き。
俺は手抜きばかりなので判らなくもないけどね。
8549:2007/03/09(金) 02:26:33
なんとか探してみます、サンクスでした
86デフォルトの名無しさん:2007/03/09(金) 02:27:26
>>82
まあ、gotoLineがありませんとか、enterFileNameがありませんとかは、
他人のプログラムなので俺にはわからないよ。

enterFileNameとentrFilenameがよく似てるね。
87デフォルトの名無しさん:2007/03/09(金) 02:28:03
197 のステートメントはなんだ?if文に処理が無いじゃないか。
88デフォルトの名無しさん:2007/03/09(金) 02:29:47
何がうざいかって中途半端な気持ち悪いインデントがムカつくな。
mainのみとか、()として(void)ときちんと書かないのも許せないが。
89デフォルトの名無しさん:2007/03/09(金) 02:30:27
197行目のif文の未解決>ステートメントが意味不明。
gotoLineとentertFilenameの関数を作ってないんじゃないの?

以上
90デフォルトの名無しさん:2007/03/09(金) 02:31:12
 gotoLninssって使ってないね。
91デフォルトの名無しさん:2007/03/09(金) 02:32:28
今のままでもエラーじゃないのかもしれんけど
せめて
int main()
かな
92デフォルトの名無しさん:2007/03/09(金) 02:35:20
void main にしとくとreturnとかexit(0)入れなくてもプログラムの実行処理後、コンパイラが自然に
コマンドプロントを閉じてくれる。
93デフォルトの名無しさん:2007/03/09(金) 02:38:11
void mainは規格違反だろ…
94デフォルトの名無しさん:2007/03/09(金) 02:42:02
とりあえず、gotoLineとenterFileNameの定義部分で関数名間違えてる。
あとは、意味を成さないコードがあるので優しいbccが警告してるだけ

ところで、こんな不思議な書き方始めて見た・・・関数の閉じ括弧にインテンドとか・・・
95デフォルトの名無しさん:2007/03/09(金) 03:05:00
・∀・)っ-○◎● は x64でのデータ型の定義も知らずに何をほえているのか?
なんかVisualC++に挫折経験があるみたいだけどw
delphi 厨の典型だな
9649:2007/03/09(金) 03:19:38
http://www.321side.com/321/src/321_0700.txt_UpM0yuXdmh4MFSOPtCTk/321_0700.txt
ようやく起動に成功しました!!!
ですが、問題発生です・・・

test.txt
内容
abcde
efghijk
lmnop

を開くとエラーを起こしてしまいます
どうすれば、ちゃんと動く様になるでしょうか?
9749:2007/03/09(金) 03:27:59
c:\source>buf
command:fopen
filename:test.txt

command入力でfopenし
test.txtを実行するとエラーで止まってしまいます
考えられる原因の助言、宜しくお願い致します。
98デフォルトの名無しさん:2007/03/09(金) 03:34:52
デバッグは自分でやれ
99デフォルトの名無しさん:2007/03/09(金) 04:09:40
>scanf("%s, fname");
新手法ですか?

100デフォルトの名無しさん:2007/03/09(金) 04:23:48
exit(1)やexit(-1)というのは意味合いとしては変わらないですよね?
使い分ける意味はやはりソースを分かりやすくするためでしょうか?
101デフォルトの名無しさん:2007/03/09(金) 04:49:31
>>100
ヒント EXIT_SUCCESS
102デフォルトの名無しさん:2007/03/09(金) 04:49:47
UNIX等のシェルスクリプト環境で複数のツールをチェインしたりするときに使うことがある
関数の返値と同じように、プロセスのリターンコードも条件判断に使えるのさ
103デフォルトの名無しさん:2007/03/09(金) 04:50:09
異常終了という点では同じだけど、返り値でエラーの種類を伝えたりする場合もあるはず。
例えばgzipが、成功 : 0,エラー : 1,警告 : 2 とやってるみたいに。
104デフォルトの名無しさん:2007/03/09(金) 05:26:27
>>101,103
ありがとうございます。
105デフォルトの名無しさん:2007/03/09(金) 08:16:13
すっ飛ばされた>>102カワイソス
106デフォルトの名無しさん:2007/03/09(金) 08:19:12
次スレ
デバッグなら俺を使え(ガチレス篇)Part10
107質問:2007/03/09(金) 09:16:47
ヘッダー he.h
struct inu {
int ip;
int mac;
};
メイン she.c
#include <stdio.h>
#include "he.h"
int main(void) {
struct inu tao;
tao.ip = 123;
tao.mac = 456;
printf("%d\n",ip);
printf("%d\n",mac);
}
なにがいけないんでしょうか?
108デフォルトの名無しさん:2007/03/09(金) 09:20:08
>107
>printf("%d\n",ip);
>printf("%d\n",mac);
109質問:2007/03/09(金) 09:22:59
びっくりしました。
アハ体験できました。ありがとうw
110デフォルトの名無しさん:2007/03/09(金) 09:40:54
アハ体験って・・・
111デフォルトの名無しさん:2007/03/09(金) 10:30:37
アホ体験だろ
112デフォルトの名無しさん:2007/03/09(金) 10:57:50
だれがうま
113デフォルトの名無しさん:2007/03/09(金) 11:04:19
なみ
114デフォルトの名無しさん:2007/03/09(金) 11:21:11
なのね
115デフォルトの名無しさん:2007/03/09(金) 13:49:06
あなた
116デフォルトの名無しさん:2007/03/09(金) 13:50:36
とっても
117デフォルトの名無しさん:2007/03/09(金) 13:52:21
ラッキーマン
118デフォルトの名無しさん:2007/03/09(金) 13:54:06
コーヒー
119デフォルトの名無しさん:2007/03/09(金) 13:55:41
あなた
120デフォルトの名無しさん:2007/03/09(金) 13:55:49
len = strlen(string) + 1;
p = malloc(len);

len = strlen(string);
p = malloc(len+1);

どう考えても後者だよな? 普通後者だよな?
121デフォルトの名無しさん:2007/03/09(金) 13:56:52
>>120
あなたとってもうまなみなのね
122デフォルトの名無しさん:2007/03/09(金) 14:02:38
p + len が末尾の\0を指すべき。
後者だな
123デフォルトの名無しさん:2007/03/09(金) 14:05:25
俺こう言葉を使い分けている。
size = strlen(string) + 1;
p = malloc(size);

len = strlen(string);
p = malloc(len+1);
124デフォルトの名無しさん:2007/03/09(金) 14:07:02
mallocで文字列領域確保するってどんな状況なんだ?
大量に文字列読むにしても効率悪くない?
125デフォルトの名無しさん:2007/03/09(金) 14:07:03
データ長か文字長かなんて"len"の一言でわからないんだから
126デフォルトの名無しさん:2007/03/09(金) 15:21:38
p = malloc( strlen(string) + 1 );でつ
127デフォルトの名無しさん:2007/03/09(金) 15:23:00
っ strdup
128デフォルトの名無しさん:2007/03/09(金) 15:23:47
標準関数じゃないやん
129デフォルトの名無しさん:2007/03/09(金) 15:33:47
if(p==NULL || p -> data >= n)
をstrcmp()で表すことって可能ですか?
130デフォルトの名無しさん:2007/03/09(金) 15:37:29
無茶を言うな。
131デフォルトの名無しさん:2007/03/09(金) 15:42:09
意味が分かりませんまさお
132デフォルトの名無しさん:2007/03/09(金) 15:50:38
>>126
char *string=NULL;
の時もがんばれ
133初心者12号:2007/03/09(金) 16:30:50
この早さなら言えるぬるぽ


すいません初心者です。
関数宣言で、
static void myfunc(void);

void myfunc(void);

何が違ってくるのでしょうかわかりません><
134デフォルトの名無しさん:2007/03/09(金) 16:57:18
#include <stdio.h>
#include <string.h>
struct seiseki {
char no[10];
char name[20];
};
void main(void) {
struct seiseki seito[2];
int i ;
printf("NoとNameの入力\n");
for( i = 0 ; i < 2 ; i ++) {
printf("No入力\n");
scanf("%s",seito[i].no);
printf("Name入力\n");
scanf("%s",seito[i].name);
}
for( i = 0 ; i < 2 ; i++) {
printf("%s",seito[i].no);
printf("%s",seito[i].name);
}
ファイルの扱い方かたがわかりません。scanfを使わずに
一気に読み込ませていくにはどうしたらいいのですか?
まだ、ポインタの勉強はしていなにので、ポインタを使って
のファイルの取り扱いもわかりません。
とにかく何か標準入出力のプログラムのコード書いてください!!
明日までであせっています。
135デフォルトの名無しさん:2007/03/09(金) 16:59:26
>>133
staticつけるとファイル内のみしか参照できない。
ファイル内でしか使わない関数なら付けるといいお( ^ω^)
詳しくはGoogleで、static 静的 関数 でぐぐるとよろし
136デフォルトの名無しさん:2007/03/09(金) 17:03:45
>>134
C/C++の宿題を片付けます 84代目
http://pc11.2ch.net/test/read.cgi/tech/1172981618/
137デフォルトの名無しさん:2007/03/09(金) 17:04:22
>>134
いちおー、scanf から移行するなら、fscanf や sscanf 使う手がある。
まあfscanfよりfreadのが扱いやすいが、まずはFILE* の使い方覚えとけ。
138デフォルトの名無しさん:2007/03/09(金) 17:14:44
エクセルファイルからデータを読み込むプログラムをC言語でしたいのですが
どうすればいいでしょうか?
おそらくエクセルファイルをバイナリで読み込むことにはなると思うのですが…
具体的いうと、Sheet1のA1に書かれてる文字列又は数値を読み込むプログラムを
したいのですが、全く分かりませんでした。
エクセルファイルをバイナリエディタ等でみてもよく分かりませんでした。
きっとエクセルファイルがどういう形式(規格)で作られてるかが分からないと
できないと思うのですが、誰かそのあたり分かる方いらっしゃいますでしょうか?
長々と申し訳ございません(´・ω・`)
139デフォルトの名無しさん:2007/03/09(金) 17:28:00
エクセルのファイルを読むライブラリがあるからそれ使え
140デフォルトの名無しさん:2007/03/09(金) 17:31:30
>>135
理解しました。ありがとうございます。
141デフォルトの名無しさん:2007/03/09(金) 18:20:05
>>138
ExcelそのものもExcelのファイルを読み書きするための
ライブラリ(というよりコンポーネント)として使える。
普段の1アプリケーションとしてのExcelは言わば表の顔。

Excelのファイル形式に拘る必要が無ければ、
ExcelでCSVやタブ区切りテキストで保存すればよい。
こうすると単なるテキストファイルになる。
142デフォルトの名無しさん:2007/03/09(金) 18:21:52
Excelを扱うためのC言語のライブラリってどこにあるの?
143デフォルトの名無しさん:2007/03/09(金) 19:43:07
for(pI = 0;pI < sD->pen;pI++) {
 for(i = 0;i < 360;i++) {
  //pX=0;pY=0;
   pX = (int)(sin(i * (MPI / 180))*pI);
   pY = (int)(cos(i * (MPI / 180))*pI);
  //保存した
   if(sD->hozonX == x+pX && sD->hozonY == x+pY) {}
   else {
   SetBPixel(sD,x,y,pX,pY,pI);
   sD->xyYouso+=4;
   }
    sD->hozonX = x+pX;
    sD->hozonY = x+pY;
  }
 }
sin、cosで円を描くコードなんですが、判定が二度ないようにしようと思っています。
しかし上記のコードでは何度かして同じ座標にくるみたいです。
何ででしょうか?頼みます。
144デフォルトの名無しさん:2007/03/09(金) 20:11:59
>>142
強いて言うなら141のいうとおりExcelの中。
COMで公開されているので、まずはそれについて勉強するといい。
でもCOMはCよりもC++からのほうが扱いやすいので、(ry
更にCOMはMSの技術だからVisual C++の独自拡張を使ったほうが(ry
145デフォルトの名無しさん:2007/03/09(金) 20:35:44
変数名をどうつけるか、その変数の効能を英語にしてもなんか味気無いのですが、
皆さんはどうやってるのですか?
146デフォルトの名無しさん:2007/03/09(金) 20:47:11
>>145
味気なんか必要ない

それが嫌なら女の名前でも付けとけばいい
女の数が増えると修羅場になるけどなw
147デフォルトの名無しさん:2007/03/09(金) 21:05:05
この女はいつもバグを起こすから嫌いだ
148デフォルトの名無しさん:2007/03/09(金) 21:37:42
後置インクリメントで質問です。

aを前置インクリメントすると結果が1と出るのですが
後置にすると、bに値が入っていないとエラーが出ます。
ですが、やさしいC第2版のP86では結果は0となっています
WinXP,コンパイラはボーランドの無償版を使っています。

周りで教えてくれる人がいないので、ここでしばらくお願いします。


#include <stdio.h>

int main(void)

{
int a=0;

int b=0;

b = a++;

printf("%d",b);

return 0;

}
149デフォルトの名無しさん:2007/03/09(金) 21:41:44
エラーになる理由が分からん
150デフォルトの名無しさん:2007/03/09(金) 21:43:33
>>148
エラーなんか出ないだろ。
正確にメッセージを書いてくれ。
151デフォルトの名無しさん:2007/03/09(金) 21:44:48
試してみたが警告は出るな。

警告 W8004 10: 'a' に代入した値は使われていない(関数 main )
警告 W8004 8: 'b' に代入した値は使われていない(関数 main )

>bに値が入っていないとエラーが出ます。
エラーメッセージ貼ってみて
152デフォルトの名無しさん:2007/03/09(金) 21:50:21
printf ("%s %s\n", func(), func())
で、func()は
char *func()
{
static char buf[適当な長さ];
\\なにかbufに処理
return(buf)
}
とします。printfされる文字列は常に引数の左から順にfunc()を処理して得られる
結果でしょうか?それとも最適化、あるいはプロセッサアーキテクチャ依存でしょうか?
153デフォルトの名無しさん:2007/03/09(金) 21:52:34
>>152
引数区切りの , の前後のどちらから評価されるかは実装依存。
154148:2007/03/09(金) 21:53:37
エラーメッセージはります。
お願いします


------ コンパイル開始 ------
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
lesson25.c:
警告 W8004 lesson25.c 15: 'a' に代入した値は使われていない(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
155デフォルトの名無しさん:2007/03/09(金) 21:54:58
>>152
関数の実引数が評価される順序は規定されていないので、コンパイラ依存。
156デフォルトの名無しさん:2007/03/09(金) 21:55:14
順序が保証されているのは、&& || (演算子の), ?:
これらは必ず左から順に評価される。
157デフォルトの名無しさん:2007/03/09(金) 21:55:31
>>154
それは警告で、エラーじゃない。
158デフォルトの名無しさん:2007/03/09(金) 21:58:23
>>157

つまり変数が代入されていないということですか?

後置だから、bにaを代入しプラス1?

b=++

と同じことなんでしょうか。
これならエラーの意味がわかります。
159デフォルトの名無しさん:2007/03/09(金) 21:58:31
>>152
どっちにしたってその場合は同じ結果になりそうなもんだが。
160デフォルトの名無しさん:2007/03/09(金) 21:58:45
>>153,155,156
おお。たいへんありがとうございます。非常に助かりましたです。
161デフォルトの名無しさん:2007/03/09(金) 21:58:52
b=a+1;
にしてみるテスツ
162デフォルトの名無しさん:2007/03/09(金) 21:59:18
「代入したはいいが使ってないみたいだけど、いいの?」と聞かれてる。
163デフォルトの名無しさん:2007/03/09(金) 21:59:47
>>159
buf の最後の一文字を '\0' に置き換える処理とかあるじゃん
164148=158:2007/03/09(金) 22:02:14
>>161

結果は1と出ました。
165デフォルトの名無しさん:2007/03/09(金) 22:03:55
>>164
実行結果なんて話題にしてない
コンパイル結果はどうなんだ?
166158:2007/03/09(金) 22:05:34
>>165

すみません

------ コンパイル開始 ------
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
lesson25.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
------ コンパイル終了 ------

です
167デフォルトの名無しさん:2007/03/09(金) 22:06:05
>>163
それなら同じになるだろ。
168デフォルトの名無しさん:2007/03/09(金) 22:08:43
>>166
先ほどはコンパイル結果以上の考察である実行結果を述べたのに、今回は真実結果のみだけの報告?
質問内容はどうなったの?
169163:2007/03/09(金) 22:12:49
>>167
間違えた
buf の最後の一文字じゃなくて
下みたいなこと
if(buf[0]!='\0') buf[strlen(buf)-1]='\0';
170158:2007/03/09(金) 22:15:54
え、あの、意味がわかりません

148のコンパイルエラーメッセージが154で
161さんの結果が1、コンパイルめーセージが166なんですが

どうして b=a++ で0にならないんだろう?という質問です。
171デフォルトの名無しさん:2007/03/09(金) 22:16:37
>>169
bufそのものの値を変えない限り同じになるって。

printf ("%s %s\n", buf, buf);
172163:2007/03/09(金) 22:29:11
>>171
何か勘違いしてたスマソ orz
173148:2007/03/09(金) 22:30:08
>>148>>154>>158>>164>>166>>170

は僕です。

質問内容は>>148なのですが、>>168さんの意味がわかりません。
(勉強不足ですみません)

僕の問題は>>158の解釈で良いということでしょうか?

174デフォルトの名無しさん:2007/03/09(金) 22:37:43
>>173

>>148のエラーですって話は
エラーじゃなかったんだから改めて判らないことを質問しなおして欲しいな。
175148:2007/03/09(金) 22:38:10
申し訳ありませんm(_ _)m!

b=a++

コンパイルしてメッセージが出ましたが、実行できました。

結果は0と出ました。

自分が馬鹿だと気づきました。
本当にすみませんでした。
176デフォルトの名無しさん:2007/03/09(金) 22:39:40
>>173
前置だと1
後置だと0
正しいけど?

177デフォルトの名無しさん:2007/03/09(金) 22:40:24
エラーと警告は違うと言ったら何度(ry
178デフォルトの名無しさん:2007/03/09(金) 22:40:44
実行してなかったとは
こりゃ一本取られた
179デフォルトの名無しさん:2007/03/09(金) 22:41:21
>>170
エラー(実際は警告)の質問なのか、前置/後置インクリメントの質問なのか、
複合的なのかそれ以外なのか分からなくなってきた
とりあえずどれに焦点当てているのか明確に述べなおしてちょ

ちなみに折れんところのgcc(cygwin)さんでコンパイルして実行したら
int main(void){
    int a, b;
    a=b=0;
    
    b=a++;
    printf("%d\n", b);
}
の実行結果が 0 って表示される(あたりまえだが)
180148:2007/03/09(金) 22:48:35
>>174

自分の反省点です。

コンパイル時にメッセージが出ると実行できないと思っていました。

後置インクリメントなので、bにaを代入しそれからプラスするという
ところまではわかるんですが、何では1にならないのだろう

b=++

という理屈は通らないんでしょうか?
でもなぜか実行できる。

という新たな疑問が出てきました。
181デフォルトの名無しさん:2007/03/09(金) 22:50:38
>>180
> b=++ 

> という理屈
人にこの3行を示して、理屈を理解してもらえると?
182デフォルトの名無しさん:2007/03/09(金) 22:53:57
プラスするのはaであってbじゃないから。
183デフォルトの名無しさん:2007/03/09(金) 22:53:59
>>180

b = a++; これは
b = a; が終わってから ++a; を行うという意味だ。

それが後置インクリメント



b = ++a; これは
++a; が終わってから b = a; を行うという意味だ。

それが前置インクリメント
184デフォルトの名無しさん:2007/03/09(金) 23:00:05
なんかそういう意味に捉えると、作用完了店とかが
もういいや
http://www.kouno.jp/home/c_faq/
185デフォルトの名無しさん:2007/03/09(金) 23:02:35
皆さんから見て僕はアホですか?

前置と後置、本ではfor文で使うので、と書いてあるので
そこで、何で前置と後置があるのかがわかってくるんじゃないかと

>>182-183

意味はわかります。
ただ、概念というか何で前と後ろに?、それも後でわかると思います。

「実行する」ということを忘れていました。

実社会でもわかっていても「実行」してないことたくさんあります。

ありがとうございました。

186デフォルトの名無しさん:2007/03/09(金) 23:03:51
無謀に見えるだけ
アホとはまた性質が違う
187デフォルトの名無しさん:2007/03/09(金) 23:04:51
学ぼうとする意欲は感じる。ただちょっと空回りしているだけ。気にするな。
188デフォルトの名無しさん:2007/03/09(金) 23:06:29
>185
意味わかってない。
わかってないことを素直に認められないと成長しないよ。
189148:2007/03/09(金) 23:18:10
前置

b=++a

++aを処理してからbに代入する


後置

bにa代入してから++を処理する。


本当は後置で何で1にならないのかわかってないです。
でも結果として、前置が1、後置が0なんです。

ウザかったらスルーしてください。
190デフォルトの名無しさん:2007/03/09(金) 23:22:53
>>189
hm…
本気ならば一度アセンブリ言語で出力させてみるといい
逆アセンブルしてもいいが


C言語の正体は誰が何と言おうと、高級アセンブラだ
良くも悪くも特定のコンピュータアーキテクチャのネイティブコードに依存する
逆に考えれば、Cのソースコード全体はあるネイティブコードに変換されているということだ
Cの背景を知るためにアセンブラを学べといわれる所以はここにある
191デフォルトの名無しさん:2007/03/09(金) 23:25:40
>>190
>hm…
192デフォルトの名無しさん:2007/03/09(金) 23:27:06
http://hp.vector.co.jp/authors/VA003720/lpproj/special/borland/bcc32opt.htm
-S オプションでアセンブリソースを出力してくれるらしいな
193デフォルトの名無しさん:2007/03/09(金) 23:27:57
>189
だから++で処理するのはaであってbじゃないからだって言ってんだろ。
前置は
a++;//aが1になる
b = a;//bに1が代入される
後置は
b = a;//bに0が代入される
a++;//aが1になる
って書き直せば理解できるか?
194デフォルトの名無しさん:2007/03/09(金) 23:30:02
>本当は後置で何で1にならないのかわかってないです。
>でも結果として、前置が1、後置が0なんです。
>ウザかったらスルーしてください。
正直に感想を言うと
日本語にもやや難あり、ってとこか?
195デフォルトの名無しさん:2007/03/09(金) 23:40:32
いや、>>148

1+1=2

これはわかってる。

でも、1と1をたすとなぜ2になるのかと考えるタイプだ。

数学の勉強ですらすら解けるけど、解に導くまでに疑問を持たない奴いるだろ?
これはこの方法だからこれでやれ、では納得できないんだよ。

まず、それが決まりだからそれでやって、使いこなせるようになったら
改めて考えてみるとよい。

つまり、常に書かれていること以上のことを考えながら勉強するタイプだ。
おそらく常識人ではないな。
196デフォルトの名無しさん:2007/03/09(金) 23:44:37
>>195
>でも、1と1をたすとなぜ2になるのかと考えるタイプだ。

これって原理主義的な数学者の間で、いまだに解けてない問題のひとつだったっけ?
197デフォルトの名無しさん:2007/03/09(金) 23:45:58
そこまでは知らない
198デフォルトの名無しさん:2007/03/09(金) 23:46:11
1+1=2 は定義じゃないの?
199デフォルトの名無しさん:2007/03/09(金) 23:46:15
原理主義的な数学者って何?だけど
近代数学ではなんかこう、ペアノの公理系で定義されてたはずだ。
200デフォルトの名無しさん:2007/03/09(金) 23:50:47
ブルバキだったかラッセルだったが証明したんじゃなかった?1+1=2。
201デフォルトの名無しさん:2007/03/09(金) 23:53:50
あーそういうことか、言いたかったのは。
悪かったな、きつい言い方して。

まず、Cがんばって覚えろ。

たたかうきみのうたを〜たたかわないやつらがわらうだろ〜

202デフォルトの名無しさん:2007/03/09(金) 23:54:16
>>189
> 前置 

> b=++a 

> ++aを処理してからbに代入する 

> 後置 

> bにa代入してから++を処理する。 

> 本当は後置で何で1にならないのかわかってないです。 
> でも結果として、前置が1、後置が0なんです。 

プログラムの意味がわかってほっとするのは人間、プログラムの意味を理解するのも人間
プログラムを読むのは誰?実行するのは誰?
プログラムを読むのはコンパイラ、実行するのはコンピュータ
コンパイラは意味をしらない、コンピュータは意味を知らないばかりかもっと大雑把
意味を理解して満足する人はコンピュータからもっとも遠いところにいる人
あなたはコンピュータを理解している人?それとも時代錯誤な言語学者?
203デフォルトの名無しさん:2007/03/09(金) 23:55:20
えらい詩的な文章ですことw
204デフォルトの名無しさん:2007/03/09(金) 23:55:49
詩人だな
205デフォルトの名無しさん:2007/03/09(金) 23:56:15
こりゃもう日本語でおk
206デフォルトの名無しさん:2007/03/09(金) 23:57:09
女にはわからんだろ?wwこのたぐいは
207デフォルトの名無しさん:2007/03/09(金) 23:58:16
周りにC言語を教えてくれる人を探せ!
208デフォルトの名無しさん:2007/03/10(土) 00:00:05
どうでもいいことだがC言語の関数において仮引数を
int f(int a,b,c){
・・・・・・・・・
}
みたいにできたら便利なんだが・・・
209148:2007/03/10(土) 00:00:43
いろいろとレスありがとうございます。
そんな高尚な人間じゃないです。
次の代入演算子に進んでいました。

ありがとうございました。
またよろしくお願いします。
210デフォルトの名無しさん:2007/03/10(土) 00:01:31
>>208
f(a,b,c)でもおk
それとも型:名前を1:Nにしたいのか?
新しい構文入れないと、結構バグの元なんだぜそれ
211デフォルトの名無しさん:2007/03/10(土) 00:02:42
int f(a,b,c)
int a,b,c;
{
...
}
212デフォルトの名無しさん:2007/03/10(土) 00:13:21
>>210-211サンクス
型:名前を1:Nのあたりをkwsk
213デフォルトの名無しさん:2007/03/10(土) 00:22:57
>>212
ただし>>211の構文は型チェックというCコンパイラの
大変ありがたい機能を殺すことになるのでお勧めできない。

移植性の問題はもうほぼクリアになっているだろうから、
積極的にこの構文を使う理由はないと思う。
タイプ量を減らしたいという理由も弱いとは思う。
214デフォルトの名無しさん:2007/03/10(土) 00:28:11
なんで?
int f(int, int, int);
でプロトタイプ宣言かいとけばええやん。
215デフォルトの名無しさん:2007/03/10(土) 00:29:29
>>213
確かに・・・
216デフォルトの名無しさん:2007/03/10(土) 00:30:46
>>214
そんなのでいいのか?
217デフォルトの名無しさん:2007/03/10(土) 00:31:21
>>214
ちょwww、それ本末転倒
218デフォルトの名無しさん:2007/03/10(土) 00:36:13
>>214
関数の定義とプロトタイプ宣言とで型が合ってるかチェックできないと無意味
219デフォルトの名無しさん:2007/03/10(土) 00:36:29
となると後は一つ。
・構造体に押し込む
・なんか奇跡を起こす
220デフォルトの名無しさん:2007/03/10(土) 00:38:34
自作プリプロセッサをコンパイル前に通すとか
221デフォルトの名無しさん:2007/03/10(土) 00:39:12
>>220
もうプロプロって言わないの?
222デフォルトの名無しさん:2007/03/10(土) 00:39:48
それはそれで、

#define BEGIN {
#define END }

みたいでいやだなあw
223デフォルトの名無しさん:2007/03/10(土) 00:43:09
なんで車輪を再発名するの?
protoizeすれば解決。
224デフォルトの名無しさん:2007/03/10(土) 00:45:41
>214
int f(char,char,char);
int f(a,b,c)
int a,b,c;
{return printf("%d %d %d", a,b,c);}
まあだまされたと思って、コンパイルしてみてよ。
プロトタイプミスマッチの警告・エラーでるから。
225デフォルトの名無しさん:2007/03/10(土) 00:46:06
間違えた。218宛だた
226デフォルトの名無しさん:2007/03/10(土) 01:19:44
パスカルでもやってろ
227デフォルトの名無しさん:2007/03/10(土) 04:39:13
#include <stdio.h>
#define PRIME_MAX 50 /*素数の最大値*/

main(){
char num[PRIME_MAX];
int j,i;

/*配列の初期化*/
for(i = 0; i <= PRIME_MAX; i++)
num[i] = 0;

/*素数かどうかを判定*/
for(i = 2; i <= PRIME_MAX; i++){
if(num[i] == 0){
printf("%d", i);
for(j = 2*i; j<= PRIME_MAX; j += i)
num[j] = 1;
}
}
printf("\n");

return 0;
}

for(j = 2*i; j<= PRIME_MAX; j += i) のj += iの
+= iはなんなのでしょうか?解説お願い致します。
228デフォルトの名無しさん:2007/03/10(土) 05:13:45
j=j+i
229デフォルトの名無しさん:2007/03/10(土) 05:41:12
+= は2項演算子。
C言語の本とか解説見たら結構頭の方に載っているはずだが?
230デフォルトの名無しさん:2007/03/10(土) 06:19:15
多分、プログラムの内容に頭抱えてるんじゃないかな
231デフォルトの名無しさん:2007/03/10(土) 06:42:05
関数fread, fwriteで読み/書きした場合、読み/書きしたデータサイズに応じて、
ファイル中の読み込み/書き込み位置がインクリメントされることは
保証されていますか。それとも、処理系や環境に依存しますか?
232デフォルトの名無しさん:2007/03/10(土) 07:29:42
正常に読み書きされた場合は保証される
233デフォルトの名無しさん:2007/03/10(土) 07:39:44
>>232
ありがとうございます。
某サイトには「ファイル位置表示子(定義されていれば)」とあって
C言語の仕様なのかどうか迷っていました。
234デフォルトの名無しさん:2007/03/10(土) 08:20:56
いかにも、某サイトの書き方が悪いみたいな書き方だな。
235デフォルトの名無しさん:2007/03/10(土) 08:50:32
そりゃそうだ、自分の頭の悪さに気付くほど頭があればこんな質問なんてするもんか。
236デフォルトの名無しさん:2007/03/10(土) 09:10:55
>>235
隠そうとしても隠し切れない知性が溢れ出る深遠な書き込みだな。
237デフォルトの名無しさん:2007/03/10(土) 09:32:59
はじめまして。
現在、ファイルの読み書きで苦戦しているものです。
今まではscanfを使って一々入力して実行していたのですが、非常に面倒です。
そこで、ファイルに一気に書き込みまた読み込むようにしたいのですが、ファイル
に書き込むときにもscanfを使わなければならないのでしょうか?fscanfがあること
は本で分かったのですが、これも結局一つ一つしかできないですよね?

void main(void){
int a[10];
int i;
printf("値の入力");
for(i=0;i<10;i++){
printf("%d番目の値入力:"&i);
scanf("%d",&i);
}
printf("終了");
}
例えば上のやつだとどんな方法がありますか?1文字だけとかをファイルに読み書き
できるようにするのではなく、文字列なども読み書きできるようにするには?
238デフォルトの名無しさん:2007/03/10(土) 09:47:54
言いたいことがよくわからないが、とりあえず文字列の読み書きと言えばfgets/fputs
239デフォルトの名無しさん:2007/03/10(土) 09:53:31
>>237
一つ一つ入力することには変わりないけど
繰り返し自体はコンピュータにやらせるから問題無い

#include<stdio.h>
int main(void){
  char *filename=__FILE__;
  char word[256];
  FILE *fp;
  fp=fopen(filename, "r");
  if(fp==NULL) return 1;
  while(!feof(fp)){
    fscanf(fp, "%s", word);
    fprintf(stdout, "%s\n", word);
  }
  fclose(fp);
  return 0;
}
240239:2007/03/10(土) 09:56:25
間違えた ^^;
  while(fscanf(fp, "%s", word)==1)
    fprintf(stdout, "%s\n", word);
241デフォルトの名無しさん:2007/03/10(土) 10:03:36
>237
はじめましてじゃねーだろw
242デフォルトの名無しさん:2007/03/10(土) 10:16:44
scanfもfscanfも一つ一つではなく、一度の複数の値を読める。
243デフォルトの名無しさん:2007/03/10(土) 10:49:40
条件分岐で
ifのはしご使うのとブール関数の簡単化使うのとどちらが良いかな?
前者は追ってけば何やってるかはわかるんだけど、
後者はぱっと見じゃ論理演算の嵐で何やってるかわかんね
あと、これをさらにループでまわす時の事を考えて、どちらが速いかも知りたい
単純な比較ならifの方が速いらしいし
244デフォルトの名無しさん:2007/03/10(土) 10:53:34
保守しやすいifにしとけ
ループで多少速くなったとしても
保守する人が替わった時解読するのに時間がかかったら意味がない
245デフォルトの名無しさん:2007/03/10(土) 11:19:07
とは言え、これはこれで投げ捨てたくなる。

if (cond1 < 0) {
if (cond2 < 0) {
var1 = -para1;
var2 = -para2;
} else {
var1 = -para1;
var2 = para2;
}
} else {
if (cond2 < 0) {
var1 = para1;
var2 = -para2;
} else {
var1 = para1;
var2 = para2;
}
}
これ、実際のコードを模式化した一部だけど、この調子で5段も続かれるともうね(苦笑)。
246デフォルトの名無しさん:2007/03/10(土) 11:26:53
abs
247デフォルトの名無しさん:2007/03/10(土) 11:29:39
>>245
上のコードを見る限りは入れ子にする必要がないような。
248デフォルトの名無しさん:2007/03/10(土) 11:46:48
何十秒もの間に数億回とか実行するなら速いほうにするだろうけど
最近の俺は
そうじゃないなら簡単なほうを選ぶ様に心がけるように意識している。

気分的な自故意満足であって
C言語では速さ重視でプログラムを書かなければいけない風潮は
役に立たないからな。

ブール関数の簡単化とか論理演算の嵐ってのが
どんなものなのか想像つかないけど。
249デフォルトの名無しさん:2007/03/10(土) 11:48:39
>>248
自故意満足
間にi打ってしまったのか
あはははh
250デフォルトの名無しさん:2007/03/10(土) 12:24:03
最近のコンパイラやプロセッサの最適化はすばらしいから、
人間の一番読みやすい方法で書けばいいよ。

どっちが速いかなんて対象のCPUでベンチとってみないとわからん。
251デフォルトの名無しさん:2007/03/10(土) 12:35:46
多変数のオンオフの組み合わせで処理を分ける場合、ifだと何度もネストする羽目になるけど
判定式に論理演算式使えば上手く行けばネストなしで書けます(最初に知った時素で感動しました)
ただ判定式がぱっと見ただけじゃ慣れてない人には何やってるのかわからない
式を導出する過程を示した図を用意して、コメントに図へのURLでも添えとくようにする方向で行くことにします
252デフォルトの名無しさん:2007/03/10(土) 12:57:08
まとめられるなら、判定部を意味のある名前の一関数にして
関数の冒頭コメントに解説を書こう。
253245:2007/03/10(土) 13:05:15
>>246
残念ながら、絶対値ではない。

>>247
そそ、なんでネストにしているのか不思議でしょうがない。
というわけで、そのコードは5*32行の代入文が10行に収まったのでした。
#最終的には更に減ったけど。
254デフォルトの名無しさん:2007/03/10(土) 13:06:49
>>251
具体的なサンプルが無いから何とも言えないけど、導出過程を絵にしないと理解できないような条件式は流石にやめた方がいい気もす。
255デフォルトの名無しさん:2007/03/10(土) 13:50:02
ifにしてドキュメントを詳しくした方がいいんじゃね?
ifなら小学生プログラマでも理解できるし
256デフォルトの名無しさん:2007/03/10(土) 14:33:07
>>245
適度に条件まとめた方がいいな。
コメントを付けながら。
if , 論理演算は、3重くらいを限度にして
それ以上複雑になりそうだったら関数を分けてみるというのも手だ。
意味が分かりやすく整理できたら不要な処理とかが見えてきたりもするし
後でマクロで書き直してもよい
257デフォルトの名無しさん:2007/03/10(土) 15:07:25
質問です。

typedef struct particle{
float x;
float y;
float z;
}PARTICLE[1000000];

例えばこういう3次元座標をもったパーティクル群があったとして
ウニョンウニョン動いているのですが
1個のパーティクルから、その隣接する(距離1程度)のパーティクルを比較したいとき
どうやればスパッと見つけることができるでしょうか…

総当りで1000000×1000000回探すのはどうにも効率が悪くて…
258デフォルトの名無しさん:2007/03/10(土) 15:10:27
>>257
適当な検索範囲に絞るくらいしかないよなぁ (つまり何らかのヒューリスティクス使う)
何が適当かは俺は知らん
259デフォルトの名無しさん:2007/03/10(土) 15:14:32
>>257
総数 N = 1,000,000
として
自分と既に比較済みははずすから
N*Nじゃないでしょ。
for(i=0;i<N;++i) for(j=i+1;j<N;++j) iとjの比較
260デフォルトの名無しさん:2007/03/10(土) 15:15:59
距離1だけなら単純にパーティクル毎に一つのセルに収まっているとして考えれば
1個のパーティクルが含まれるセルの隣接セルだけを比較してやるようにすればいいと思うけど・・・
それだとサイコロの上下左右前後の6回×パーティクル数ってのになるし
距離が増えても2や3ぐらいならそんなに計算量増えないと思うし
261デフォルトの名無しさん:2007/03/10(土) 15:16:21
>>258
ヒューリスティクスという言葉を初めて知りました。

一度これをintに落として(小数点以下を切り捨てて)
例えば
grid[256][256][256]
に収まる程度であればgrid[x][y][z]として、グリッドに落とし込んで
隣接上下左右で比較をしようかとも思ったのですが

grid[256][256][256]を越えたときにもうダメなのと
それなら始めからgrid[x][y][z]に落とせばいいのではとも…

はじめは1次元で xyz xyz xyz… と座標を入れていたのですがこれだと総当り検索しかできないので
262デフォルトの名無しさん:2007/03/10(土) 15:19:50
>>259
その通りですね。すみません、よく考えずに書き込んでしまいました。

>>260
仰るとおりです。ただ、空白セルが出来てしまうので
ループの際に空白部分も検討しなくてはならないので効率が出せなくて。。。
263デフォルトの名無しさん:2007/03/10(土) 15:24:04
grid[x][y][z]にそこに存在する構造体へのアドレスを保存するのは無理かな
空間そのものをオブジェクトとして扱っちゃうという考えで
264デフォルトの名無しさん:2007/03/10(土) 15:26:45
あー、精度落とすのは駄目なのかスマンコ
265デフォルトの名無しさん:2007/03/10(土) 15:27:31
x座標だけ1000000匹のウニョンをスキャンして
-2000以下、-2000〜-1000、-1000〜0、略、2000以上ってグループ分けて
-2000以下と(-2000以下、-2000〜-1000)との比較をする。

こういうのはlogなんとか的に重くなるから
逆に比較する数を減らせれば
すごく軽くなることを期待してみたりする。

でもやっぱめんどくせ〜〜〜〜
266デフォルトの名無しさん:2007/03/10(土) 15:29:39
>>265
数が少ないときヒャ
工夫せず比較したほうが速いかも知れないってのも
悩ましいな。
267デフォルトの名無しさん:2007/03/10(土) 15:44:32
>>263
じつはポインタが苦手でアドレス関係から逃げていたのですが
なんとなく出てきたイメージでは
○=パーティクルありでアドレス ×=NULL

○×○○××

○を見たときに、左右のポインタのパーティクル距離が1なら比較 出なければ次のパーティクル
といったリストみたいなイメージが出てきました。
ただ上下・奥行きはどうしたらいいのか、疑問が出てきました。。。。もうちょっと頑張ればいけそうな気が。。。

>>265
空間を線的に分割するという感じですね

みなさん、色々アドバイスありがとうございます。本当にありがたいです
268デフォルトの名無しさん:2007/03/10(土) 17:04:43
これなんですが、今までは
#include <stdio.h>
#include <string.h>

int main(void) { ←void main(void)と書いてきた
int c;      ←文字を扱いたいのになぜintなの? char cとかじゃないの?
printf("入力");
while((c=getchar())!=EOF){
putchar(ch);
retrun 0;   ←なんで必要??
}
}
これじゃいけないのですか?↓
void main(void) {
char c;
printf("入力");
while((c=getchar())!=EOF){
putchar(c);
}
}
269デフォルトの名無しさん:2007/03/10(土) 17:10:20
ちゃんとした入門書を1冊読めよ。そうすりゃ疑問点はすべて説明されていると思うが。
270デフォルトの名無しさん:2007/03/10(土) 17:14:05
>>268
> int main(void) { ←void main(void)と書いてきた

main() の型は int と規格で定められている
void にしてしまった場合は未定義動作

> int c;      ←文字を扱いたいのになぜintなの? char cとかじゃないの?

getchar() が返す値が int 型だから
EOF の値は大抵の処理系で -1 だが char 型の変数で受けてしまうと 0xFF が
入力されたのか EOF なのかが区別できない

> retrun 0;   ←なんで必要??

main() の型が int なので何か値を返さなくてはならないから

> これじゃいけないのですか?↓

char c; については前述の問題がある
あとは動けばそれでいいならにそれでいいし他の環境に互換性を持たせたい
なら規格に沿った記述をしなければならない
271デフォルトの名無しさん:2007/03/10(土) 17:19:11
>>269
その「ちゃんとした入門書」を1つでもいいから挙げてもらいたい。
>270の内容を説明した入門書は見たことが無い
272デフォルトの名無しさん:2007/03/10(土) 17:20:20
独習Cでは説明されてたと思うけど
あれって入門じゃなかったのか
273デフォルトの名無しさん:2007/03/10(土) 17:20:51
やっぱり説明されてませんでしたすいません><
274デフォルトの名無しさん:2007/03/10(土) 17:24:03
作ってわかるC(ry
275デフォルトの名無しさん:2007/03/10(土) 17:25:41
> retrun 0;

return 0; だな
276デフォルトの名無しさん:2007/03/10(土) 17:27:30
よほど酷い入門書しか読んだことがないんだな。
277デフォルトの名無しさん:2007/03/10(土) 17:27:49
getchar()のリターン値を入れる変数がintの理由は、だいたい書いてあるんじゃないの?
手元に入門書がないからチェックできないけど。

あとmain()のreturn 0;は必ずしも必要でない。
278デフォルトの名無しさん:2007/03/10(土) 17:31:54
現実的なCプログラミングには書いてあるな。

main()のリターン値がどういう意味かと、fgetc()のリターン値がintの理由。
279デフォルトの名無しさん:2007/03/10(土) 17:33:27
>>277
getchar()のリターン値を入れる変数がintの理由は、>270の内容の一部であって
全部ではない

> あとmain()のreturn 0;は必ずしも必要でない。

これは失念してた
280デフォルトの名無しさん:2007/03/10(土) 17:34:26
268です。
みなさんありがとうございます。とりあえずもう一度本を読んでみます。
ちなみに、自分の読んでいる本は「やさしいC」です。細かなところまでは
確かにのってないです。。
また疑問に思うことがあったら質問させて下さい。今、急いでCを勉強している
もので、変な質問することがあると思いますが、そのときはご勘弁を!!
281デフォルトの名無しさん:2007/03/10(土) 17:42:03
急いで勉強する必要があるということは四月入社か・・・?
282デフォルトの名無しさん:2007/03/10(土) 17:52:36
がくがくぶるぶる
283デフォルトの名無しさん:2007/03/10(土) 17:56:58
280、280です。
>>281
もう入社前の研修を受けています。。やヴぁいです。。。
284デフォルトの名無しさん:2007/03/10(土) 18:00:10
上司や同僚に当たった人はご愁傷様です
285デフォルトの名無しさん:2007/03/10(土) 18:00:13
こんなレベルの奴をプログラマとして雇うところがあるのか。
将来に備えて一生懸命勉強している自分がアホらしくなってきた。
286デフォルトの名無しさん:2007/03/10(土) 18:01:33
スキル持ってるヤツを採用すればいいのに・・・
大学まで行って何をみんな身につけてるんだろう・・・・・
287デフォルトの名無しさん:2007/03/10(土) 18:02:12
マ板でやれ
288デフォルトの名無しさん:2007/03/10(土) 18:02:31
国立大学とかじゃねーの?気を抜いているとあっという間に抜かれるぞ。
289デフォルトの名無しさん:2007/03/10(土) 18:21:19
大学中退の俺でもマ(コーダー)には成れますから^^
290デフォルトの名無しさん:2007/03/10(土) 18:21:59
>>286
休日の有効な使い方
マはそれができない
下手すると休日までぷr(ry
291デフォルトの名無しさん:2007/03/10(土) 18:25:00
>>286 新卒でスキル持っている奴なんて少数だろ。
292デフォルトの名無しさん:2007/03/10(土) 18:29:38
仕事でコード打ち
趣味で立案解析設計実装運用
これが正しきマ(コーダー)の姿
293デフォルトの名無しさん:2007/03/10(土) 18:31:50
今このスレがアツいと聞いて飛んできました
294デフォルトの名無しさん:2007/03/10(土) 18:33:33
(プログラマとしての)登大遊ぐらいのスキルがあれば十分です
295デフォルトの名無しさん:2007/03/10(土) 18:41:05
登大遊がどれくらいのスキルなのか分からん
296デフォルトの名無しさん:2007/03/10(土) 18:41:40
マ板でやれと言っておろうが
297デフォルトの名無しさん:2007/03/10(土) 18:47:53
マ板のどこで?
298デフォルトの名無しさん:2007/03/10(土) 18:49:00
キーワード【 main BUF buf プロトタイプ int 警告 Borland 】
299デフォルトの名無しさん:2007/03/10(土) 18:59:23
コンパイルして実行してると「問題が発生したため、d.exe を終了します。 ご不便をおかけして申し訳ありません。」
とでて来てエラーを送信しますか?という画面がでてくるのですが・・・何で?
#include <stdio.h>
#include <string.h>
struct seiseki {
char no[10];
char name[20];};
void main(void) {
FILE *fp;
struct seiseki seito[2];
int i;
fp = fopen("test.txt","w");
if(fp == NULL) {
printf("erro\n");
}else{
printf("open\n");}
printf("NOとNAMEの入力\n");
for(i = 0 ; i < 2 ; i++) {
printf("NOの入力:");
scanf("%s",seito[i]);
printf("NAMEの入力:");
scanf("%s",seito[i]);}
for(i = 0 ; i < 2 ; i++) {
fprintf(fp , "%s\n", seito[i]);}
printf("ファイル書き込み終了\n");
fclose(fp);
printf("file colse\n");}

300デフォルトの名無しさん:2007/03/10(土) 19:02:03
>scanf("%s",seito[i]);
>fprintf(fp , "%s\n", seito[i]);
こいつらがおかしい
301デフォルトの名無しさん:2007/03/10(土) 19:04:27
302デフォルトの名無しさん:2007/03/10(土) 19:09:10
scanf %sなんて使うなよ…
303デフォルトの名無しさん:2007/03/10(土) 19:13:03
>>300
どういうことでしょう?
304デフォルトの名無しさん:2007/03/10(土) 19:18:53
>>303

残念だけど構造体を自動的に解釈して
適切な変換を自動的にしてくれることはない。

いくらなんでも
printf("NOの入力:"); 
scanf("%s",seito[i]); 
printf("NAMEの入力:"); 
scanf("%s",seito[i]);} 
は無理でしょ。
両方同じ指定でscanfがnoとnameが区別出来ると思うのか。

それに
scanfはseiseki.noがchar [10]であることなんて知らない。
scanfはseiseki.nameがchar [10]であることなんて知らない。
だから入力した文字が長すぎるとメモリ破壊起こすぞ。

fprintfは、たとえば以下のようにしないといけない。
fprintf(fp , "%s,%s\n", seito[i].no, seito[i].name);
 
305デフォルトの名無しさん:2007/03/10(土) 19:30:35
今の新入社員って>>280みたいにすぐ逆ギレすんのか・・?
306デフォルトの名無しさん:2007/03/10(土) 19:34:19
>>305
逆切れのうちに入らんだろ
307デフォルトの名無しさん:2007/03/10(土) 19:36:35
>>304
ありがとうございました。実行できました!!しかし、ファイルができていないのですが
何ででしょう?

>>302
scanfを使わないとしたらどのようにすれば・・・?
上の方にも書いてあったかもしれませんが、購入した入門書が
糞だったようです・・・・・。
308デフォルトの名無しさん:2007/03/10(土) 19:38:20
入門書なんだから別にscanfでいいだろ
309デフォルトの名無しさん:2007/03/10(土) 19:39:05
少しは考えろよ
310デフォルトの名無しさん:2007/03/10(土) 19:39:45
いや、gets使ってるような入門書があれば投げ捨てるべきだろ。
311デフォルトの名無しさん:2007/03/10(土) 19:40:49
std::cinを使うと良いよ^^
312デフォルトの名無しさん:2007/03/10(土) 19:43:18
>>307
どうすりゃいいんだろ。
scanfで直読みはよくないって知っているけど
だからといってどうすればいいか考えてないや。

ファイルができていない理由はわかりません。
 
313デフォルトの名無しさん:2007/03/10(土) 19:43:43
入門書のせいにして自分を棚に上げる
大馬鹿者のレスが最近多い気がする。
314デフォルトの名無しさん:2007/03/10(土) 19:55:34
fgets()使えばいいじゃん。
315デフォルトの名無しさん:2007/03/10(土) 19:57:39
配列の宣言で
i=100;
int num[i];

みたいな感じでやってエラーが出るのですが
原因がわからなくて困ってます。助けてください
316デフォルトの名無しさん:2007/03/10(土) 19:59:53
>>315

変数に出来ない。
即値じゃないとだめなんだ。

#define MAXSIZE 100
int num[MAXSIZE]; 
317デフォルトの名無しさん:2007/03/10(土) 20:00:59
C99のコンパイラに変えるとか。
318デフォルトの名無しさん:2007/03/10(土) 20:01:37
>>316
ありがとうございます。
というか、マジですか

ファイルの行数数えて、その分の配列確保したかったのですが
これじゃ先に進むことが出来ない
319デフォルトの名無しさん:2007/03/10(土) 20:06:17
おいおい
320デフォルトの名無しさん:2007/03/10(土) 20:11:07
>>318

int * num = NULL;

num = (int*)malloc( i * sizeof(int) );
if(num == NULL)
{
    めもりぶそくだよ〜ん
}

つかいおわったら
free(num);
num = NULL;

なお、動作確認するきはありません。
多少のミスがあるでしょうけどあしからず。
321デフォルトの名無しさん:2007/03/10(土) 20:20:06
使い終わったポインタをクリアするのは間違ったお作法。
322デフォルトの名無しさん:2007/03/10(土) 20:30:48
えぇ、マ、マジ
323デフォルトの名無しさん:2007/03/10(土) 20:32:12
そんなことはない
324デフォルトの名無しさん:2007/03/10(土) 20:34:40
構造体のメンバーの値をある関数からだけとってくるように
するにはどうすればいいですか?
325デフォルトの名無しさん:2007/03/10(土) 20:36:46
>>322
そうだよ。
326デフォルトの名無しさん:2007/03/10(土) 20:39:25
>>324
言ってることがよく分からんが、
Cにメンバプロテクションの概念はない
327デフォルトの名無しさん:2007/03/10(土) 20:42:22
>>324
ファイルを分割しないとできない
328デフォルトの名無しさん:2007/03/10(土) 20:42:26
こうだな。
if(num != NULL) free(num); 
num = NULL;
329デフォルトの名無しさん:2007/03/10(土) 20:43:42
>>324
C++のprotectみたいなことか。
小細工してやる価値があるかどうかだな。
330デフォルトの名無しさん:2007/03/10(土) 20:44:17
>>328
free(NULL); は何もしないことになってるからそんなチェックは要らない。
331デフォルトの名無しさん:2007/03/10(土) 20:44:35
>>328
それでも同じだろ。
332デフォルトの名無しさん:2007/03/10(土) 20:46:47
そんな作法なんて何の役にも多々ねーだろ。
num = NULL;をしないことを守ることにより
バグが減るわけでも
プログラムがわかりやすくなるわけでもない。
333デフォルトの名無しさん:2007/03/10(土) 20:48:27
>>332
バグも減るし、プログラムもわかりやすくなるよ。
334デフォルトの名無しさん:2007/03/10(土) 20:49:12
num = NULL;をするとなんかバグが減ったりプログラムがわかりやすくなったりするの?
335デフォルトの名無しさん:2007/03/10(土) 20:50:11
num = NULL;がないだけでプログラムがわかりやすくなるなんてよっぽど馬鹿なんじゃねーの
336デフォルトの名無しさん:2007/03/10(土) 20:51:24
>>334
誰もnum = NULL;をするとプログラムがわかりやすくなったりするなんていってないだろ
337デフォルトの名無しさん:2007/03/10(土) 20:52:36
メモリが割り当てられているときには何もしない
メモリが割り当てられていないときにはメモリを割り当てたい時ってどうすればいいの?
338デフォルトの名無しさん:2007/03/10(土) 20:53:12
>>335
いや、めちゃくちゃ重要。
あるなしじゃ、だいぶ違う。
339デフォルトの名無しさん:2007/03/10(土) 20:53:35
そうです。プロテクトみたいなことです。
ファイルを分割するとは具体的にはどのようにするのでしょうか?
340デフォルトの名無しさん:2007/03/10(土) 20:54:03
num = NULLしとけば間違ってfree後にその領域を使ってしまった場合に素直にヌルポしてくれるが、
そうじゃない場合は何とか動いてしまうことが多いのでバグが発覚しにくいといったところかな。
341デフォルトの名無しさん:2007/03/10(土) 20:56:33
入門書が糞だ?
そんな糞な入門書なんか買うお前の方が糞なんだよ!!!

ちゃんと、内容を確かめてから買うようにね。
342デフォルトの名無しさん:2007/03/10(土) 20:57:30
>>334は、>>332に対するレスか。

num = NULL;をしない作法がどう役に立つのかって話であって
num = NULL;をすることが役に立つと主張しているわけじゃない。
343デフォルトの名無しさん:2007/03/10(土) 21:00:40
>>342
そこまでわかってるならもう一息だ。
なぜいけないか頑張って考えろ。
344デフォルトの名無しさん:2007/03/10(土) 21:01:06
毎回freeしてmallocしないで
前回のサイズのままでよかったら前回mallocしたのを使いまわしたり
でもやっぱり毎回freeしてmallocしちゃおっかなって気が変わることもあるし。

プログラムが複雑になると『使い終わったとき解放する』が曖昧で
プログラムが終わる直前に解放することもあれば
途中でデータエラーとかになったら中断して早くfreeしたいって思ったりすると
if(num != NULL) free(num);  
num = NULL;
ってするかな(本当は嘘です)。
345デフォルトの名無しさん:2007/03/10(土) 21:01:52
どっちでもいいだろ
結局は主張してる奴らの会社のコーディング規約に従わなくちゃいけないわけだし
346デフォルトの名無しさん:2007/03/10(土) 21:03:37
>>343
まったくわからん。

>>345
だとしたら無意味なコーディング規約あるいは間違ったコーディング規約だ。
ほっとけません。
347デフォルトの名無しさん:2007/03/10(土) 21:03:43
>>339
分割コンパイル
348デフォルトの名無しさん:2007/03/10(土) 21:04:02
349デフォルトの名無しさん:2007/03/10(土) 21:05:33
>>343
わかった。
num = NULL;が書いてあるだけでプログラムがわからなくなってしまう人のために配慮する作法だ。
350デフォルトの名無しさん:2007/03/10(土) 21:07:09
いずれ誰でもNULL埋めするようになるってw
351デフォルトの名無しさん:2007/03/10(土) 21:08:53
>>348 で a.c からは構造体のメンバにアクセスできない
必ず関数を通してアクセスすることになる

利点
構造体内部の実装をまるまる隠蔽できる
352デフォルトの名無しさん:2007/03/10(土) 21:13:15
>>349
いや、作法どうこう以前に、当たり前の話だから。
353デフォルトの名無しさん:2007/03/10(土) 21:18:09
「バグがあった時にNULLアクセスしてキッチリ落ちる」
ってのは結構大事だと思うんだけどな

ヘタになんとなくメモリぶっ壊される方がやっかい
354デフォルトの名無しさん:2007/03/10(土) 21:29:28
>>344
みたいな変数やバッファを使いまわすような組み方が常態化してるPGは、ちょっと考えたほうがいい。
355デフォルトの名無しさん:2007/03/10(土) 21:35:55
デバッガ相手にのうのうと生きている俺はきっと神に違いない
356デフォルトの名無しさん:2007/03/10(土) 21:40:10
使い終わったポインタをNULLにしない奴なんかいるんだ・・・
「俺は解放したポインタを使ってしまうような馬鹿じゃないから
 NULLにしなくていい」って理論は通じない
357デフォルトの名無しさん:2007/03/10(土) 21:41:58
コーディングスタイルの話になると必ず>>356みたいなこと言い出す奴が現れるからいやだわ
358デフォルトの名無しさん:2007/03/10(土) 21:43:19
/*      ここまで俺の自作自演        */
359デフォルトの名無しさん:2007/03/10(土) 21:45:59
>>347
>>348
>>351
ありがとうございます。
さっそく見てみます。
osの内部構造はそうなってんのかな?と思ったりしたんですが
そんなことやってんのかなできんのかなと思い質問しました。
みなさんありがとうございました。
360デフォルトの名無しさん:2007/03/10(土) 21:47:05
>>356
Cが参照使えるような言語ならまだその概念は一部通用したかもしれないけど、
実体を委譲したりするのが常で、実体を運用してるのが一箇所でない場合がよくある(参照が散在してる)
確かに部分部分で、使い終わったらNULLに初期化するのも一つの手だが、まぁ力説するモンじゃないからいいや
(゚パ
361デフォルトの名無しさん:2007/03/10(土) 21:57:00
ところでNULLで初期化すんとなんかいいことあるのか?
362デフォルトの名無しさん:2007/03/10(土) 21:58:14
>>361
「不正なポインタ」であるかどうかが分かるようになる
363デフォルトの名無しさん:2007/03/10(土) 22:00:01
解放したらNULLを即代入するようにすれば。
NULLか否かでヒープ使ってるかどうかの判定ができる。
別に変数を持つよりエレガント。
364デフォルトの名無しさん:2007/03/10(土) 22:02:44
初期化した後すぐmalloc使ってたら意味ないけどね
365デフォルトの名無しさん:2007/03/10(土) 22:04:42
freeしてすぐにスコープを抜けるようなときにはNULLの代入なんてやらないよ。
366デフォルトの名無しさん:2007/03/10(土) 22:08:19
なんという詭弁
367デフォルトの名無しさん:2007/03/10(土) 22:12:38
みんな、これで静まってくれ
#define free(ptr) (free(ptr),ptr=NULL)
368・∀・)っ-○◎●:2007/03/10(土) 22:14:32
MSのDirectXサンプルで同じようなことはやってたな



DELETE(p)とかってマクロだったが
369デフォルトの名無しさん:2007/03/10(土) 22:21:51
SAFE_RELEASE
370デフォルトの名無しさん:2007/03/10(土) 22:28:33
>>359
MS-Windows のいわゆるハンドルってやつがそう
何をするにも API がハンドルしかくれない
内部の実装は闇の中
371デフォルトの名無しさん:2007/03/10(土) 22:29:22
>>363
使いまわしてる変数以外は意味ないですね。
372デフォルトの名無しさん:2007/03/10(土) 22:40:04
free()したポインタは必ずNULLを入れようって薦めてる本とか、そういうスタイルのプロダクトって、どんなのがある?

>>368 まずDirectXね。
373デフォルトの名無しさん:2007/03/10(土) 22:46:07
>>354
同じ処理するときいやでも使うだろ?
まったく同じ処理を2回するとき変数名とか関数名かえるのか?
同じ変数を別の目的に使うとかじゃないよ。

頻繁にメモリ確保と解放しないで
最初に一括して確保しておくとかあるだろ。
(速度重視のプログラムが多いのでよく言われる。
聞き流して俺は結局やらないけど。)

というより
むしろ間違って使わないようにNULLにするという
意味があるんだけど。

>>357
コーディングスタイルの話じゃない。
作法の話だ。
374デフォルトの名無しさん:2007/03/10(土) 22:50:19
>>372
postgresは、してないね。
(生のfreeは使ってないけど)

本だと、プログラミング作法とコードコンプリートもそういうのはたしかそういうのは薦めてなかったと思う。
375デフォルトの名無しさん:2007/03/10(土) 22:56:36
C++だとdeleteしたあとにNULLを入れようとかって話は聞かないような。
376デフォルトの名無しさん:2007/03/10(土) 22:58:08
C++だとboost::shared_ptrやboost::scoped_ptr使ったりするから、
そもそもdelete自体お出ましにならない。
377・∀・)っ-○◎●:2007/03/10(土) 23:03:53
DirectXでもATLのスマートポインタ使ったソースでは原則必要ないな
378デフォルトの名無しさん:2007/03/10(土) 23:07:41
>>376
スマートポインタが定着したから、delete後のnullクリアは必要ないって言われだしたってわけじゃないだろ。
379デフォルトの名無しさん:2007/03/10(土) 23:07:57
やっぱauto_ptrじゃなくてスマートポインタだな。
なんでスマートポインタが標準装備じゃないんだか。
C言語カワイソ
380デフォルトの名無しさん:2007/03/10(土) 23:09:28
言語思想にないから
381デフォルトの名無しさん:2007/03/10(土) 23:10:01
ファイルポインタとかOSからもらった各種ハンドルを入れた変数とかも、使い終わったらクリアしましょうみたいな話は聞かないよな。
382デフォルトの名無しさん:2007/03/10(土) 23:10:47
>>379
auto_ptrもスマートポインタであることに違いは無いぞ。

>>381
freeと同等程度には聞く気がする。
383デフォルトの名無しさん:2007/03/10(土) 23:11:09
std::vector と boost::shared_ptr は俺の中の世界を変えたな
384デフォルトの名無しさん:2007/03/10(土) 23:12:45
>>382
>freeと同等程度には聞く気がする。

どのあたりで?

fclose(fp);
fp = NULL;

みたいなソースは見た記憶がないけど。
385デフォルトの名無しさん:2007/03/10(土) 23:15:30
>>381
OSからもらった各種ハンドルは
一度確保してプログラム最後まで持ってたりするからな。
boost::shared_ptr使いてーみたいな場面じゃないし。

ファイルポインタはわからん。
386デフォルトの名無しさん:2007/03/10(土) 23:16:49
結局NULLしないにこと関してはメリットなんて誰も言ってないな。
387・∀・)っ-○◎●:2007/03/10(土) 23:17:08
ファイルと関連づけられてないofstreamオブジェクト対して書き込み
やっても安全(ただしどこのストリームにも書き込まれない)なのはかなり楽だな。
388デフォルトの名無しさん:2007/03/10(土) 23:17:27
そのポインタやハンドルがクラスメンバのひとつだったらNULL入れるけど
389デフォルトの名無しさん:2007/03/10(土) 23:17:54
if(fp != NULL) fclose(fp); 
fp = NULL;
だな。

// fpって変数名がダサいけど。
390デフォルトの名無しさん:2007/03/10(土) 23:17:59
>>386
いや、言ってるやつはいるぞ。
オレは教えてないけど。
391デフォルトの名無しさん:2007/03/10(土) 23:18:27
起動されている特定のスレッドを停止する関数を作りたいんですが、
何のシステムコールを使えばいいんですかね?
pthread_join()は起動しているスレッドが自分で終了するまで待ってる関数だから
無限ループしているスレッドを終了できなし。
pthred_exit()はpthread_join()の戻り値を引数に使うからpthread_join()使わないと無理だし。

誰かお願いします。
392・∀・)っ-○◎●:2007/03/10(土) 23:18:35
永続性があるかどうかだな。
多スレッドで参照するようなのは特に気を遣う。
393デフォルトの名無しさん:2007/03/10(土) 23:19:02
>>389
また、使いまわし前提の話が。
394デフォルトの名無しさん:2007/03/10(土) 23:20:51
結局NULLしないにこと関してはメリットなんて誰も言ってないな。
395デフォルトの名無しさん:2007/03/10(土) 23:21:49
>>391
pthredかあ
俺知らね。
それって便利?
396デフォルトの名無しさん:2007/03/10(土) 23:23:02
>>394
よく読めよ。
上のほうででてるだろ。
397391:2007/03/10(土) 23:23:54
>>392
停止するスレッドの順番が決まってるんで、
とくに他のスレッドで参照されているかとかは気にしなくていいみたいです。
起動されているスレッドは全て無限ループしているスレッドです。
単純に指定したスレッドを停止するようなシステムコールはなさそうですよね
398デフォルトの名無しさん:2007/03/10(土) 23:24:14
>>391
ブッツリ殺したら問題あるかどうかが
399391:2007/03/10(土) 23:25:22
>>395
Linuxでサーバプログラム作るときにはデフォみたいな感じです。
400・∀・)っ-○◎●:2007/03/10(土) 23:25:28
Win32のTerminateThread相当のもの作りたいんだろ。
リソースリークするから強制終了はお奨めしない。
スレッドから参照できるメモリ空間にフラグを外部から立てて、
スレッド自身で自分で終了させる設計にしたほうがいい。
401デフォルトの名無しさん:2007/03/10(土) 23:25:41
排他制御したフラグを云々でいいんじゃね

スレ違いか
402391:2007/03/10(土) 23:26:33
>>398
ブッツリ殺しても問題はないです。
403デフォルトの名無しさん:2007/03/10(土) 23:27:30
だんごって案外普通なんだな。
404デフォルトの名無しさん:2007/03/10(土) 23:32:16
>>337 遅レスだけど
方法 1:
ポインタはあらかじめ NULL で初期化しておく。
メモリ確保時に if で NULL かどうか調べて、NULL だったら malloc() を呼ぶようにする。

char *p = NULL;
あんな事やこんな事など;
if(p == NULL)
p = (char *)malloc(256);
あんな事やこんな事など;

方法 2:
realloc() の第 1 引数に NULL を指定すると malloc() と同じ動作をする。
realloc() は呼ばれても指定するメモリサイズが変わらなければ何もしない。
この性質を利用して、あなたの望む通りの事ができる。

char *newbuf, *p = NULL;
for(; ; )
{
newbuf = (char *)realloc(p, 256);
if(newbuf == NULL)
{
perror("メモリ不足");
exit(1);
}
p = newbuf;
あんな事やこんな事など;
}
free(p);

方法 1 のほうが簡単だが方法 2 のほうが柔軟性は高い。
405デフォルトの名無しさん:2007/03/10(土) 23:33:11
>>396
ないじゃん。
406・∀・)っ-○◎●:2007/03/10(土) 23:34:31
reallocとはReal Rockでありその生き様はお塩先生だぜファッキンライト
407391:2007/03/10(土) 23:37:59
>>400
なるほど。
その方が簡単そうですね。
ありがとうございます。
スレッド処理作成側に言ってみます。
408デフォルトの名無しさん:2007/03/10(土) 23:38:52
最近はselect()使わなくなったのか?
409デフォルトの名無しさん:2007/03/11(日) 00:17:45
え?freeしたらその確保した所ってNULLに置き換えられるんじゃないの?
410デフォルトの名無しさん:2007/03/11(日) 00:24:22
>>409
にほんごでおk
411デフォルトの名無しさん:2007/03/11(日) 00:37:17
>>409
え?
412デフォルトの名無しさん:2007/03/11(日) 00:41:30
>>409
確保した所の意味が分からないが

freeに渡した引数ならならない
開放したメモリ領域もならない
413デフォルトの名無しさん:2007/03/11(日) 00:45:22
知らなかった、、、
まだ始めて間もない者です。許してください
414デフォルトの名無しさん:2007/03/11(日) 01:02:48
配列や構造体のテーブルの初期化なんですが、
int a[10] = { 1, 2, }
とした場合a[2]〜a[10]には0が設定されると考えていいですか?

同じように構造体では、
typedef struct seito
{
void* name,
int a,
int b
} seito;

seito seito_tbl[5] =
{
{ tanaka, 1, 1},
}
とした場合seito_tbl[1]〜seito_tbl[5]は0が設定されると考えていいでしょうか?
415デフォルトの名無しさん:2007/03/11(日) 01:04:17
1) はい。
2) seito_tbl[1]からseito_tbl[5]は {0, 0, 0} に初期化される。
416デフォルトの名無しさん:2007/03/11(日) 01:06:14
>>414,415
一個多いよ
417414:2007/03/11(日) 01:23:43
>>415
どうもです。
>>416
ほんとだ。間違えました。すんません
418デフォルトの名無しさん:2007/03/11(日) 10:17:18
関数テーブルに登録されてる関数をループを
使ってコールしていく処理を作りたいんですが、
★の部分どうすればいいんでしょうか?どなたかお願いします。
#include <stdio.h>

void a_func(void)
{
printf("a_func\n");
}

void b_func(void)
{
printf("b_func\n");
}

void* func_tbl[2] =
{
a_func,
b_func
};

int main(void)
{
int i =0;
for(i=0;i<2;i++)
{
func_tbl[i](); ★
}
return 0;
}
419デフォルトの名無しさん:2007/03/11(日) 10:32:46
void*の配列に関数ポインタを格納してるのが問題だと思うんだ。
420デフォルトの名無しさん:2007/03/11(日) 10:35:30
typedef void(*func)(void);

int main(void){
  int i;
  func func_table[2]={a_func, b_func};
  
  for(i=0;i<2;i++) (*func_table[i])();
}

で動いたら奇跡
421デフォルトの名無しさん:2007/03/11(日) 10:44:42
そこはfunc_table[i]();で十分だろ
422418:2007/03/11(日) 10:54:09
>>419,420,421
関数テーブルを
void (*func_tbl[2])(void) =
{
a_func,
b_func
};
に変えて、
int main(void)
{
int i =0;
for(i=0;i<2;i++)
{
(*func_tbl[i])();
}
return 0;
}
としたら動きました。
うーん、何でこうしたら動くようになったかいまいち理解できない・・・
みなさんありがとうございました。
423デフォルトの名無しさん:2007/03/11(日) 11:01:51
>>421
文法的にはそう書くことが認められているが、
厳密には (* ... ) だな。
シンタックスシュガーってやつ?
424デフォルトの名無しさん:2007/03/11(日) 11:10:41
厳密も糞もないだろ。
標準化以前の処理系との互換性を考慮しなければどっちでも構わん。
425デフォルトの名無しさん:2007/03/11(日) 11:31:19
動的な構造体配列を作るにはどうやればいいのでしょうか
struct hoge{
int orz;
int or2;
} hogehoge;

こんな感じの構造体を入力した数にあわせて作るっていうのをしたいのですが

void main(){
 値を入力してほしいお
 scanf(%d,num)

 int *p = malloc(??????)
}

どうもわからんのです。助けてください。。。動的なメモリ確保がさっぱりというのもありますが
426デフォルトの名無しさん:2007/03/11(日) 11:32:26
hogehoge[入力分]
を作りたいだけなのです。
427デフォルトの名無しさん:2007/03/11(日) 11:37:37
hogehoge *arr;
arr = malloc(sizeof(*arr)*num);
428デフォルトの名無しさん:2007/03/11(日) 11:39:33
>>426
struct hoge* p = (struct hoge*)malloc(sizeof(struct hoge) * num);

これ以降、p[n].orz とか使える。 (p + n)->orz でもいい
429デフォルトの名無しさん:2007/03/11(日) 11:40:14
>>427 みたいにしたけりゃ、 struct の前に typedef
430デフォルトの名無しさん:2007/03/11(日) 11:42:29
>>425

hogehoge *arr はポインタで
arrにmallocでnum分作れるということですか?

この作った後のarrのorzにアクセスするにはどうやるのでしょうか?
numが3だったとき、1番目にアクセスしたいときは
arr[0].orz
という風にできるのでしょうか?
431デフォルトの名無しさん:2007/03/11(日) 11:43:41
ああああ
読み込まずに書き込んでしまいました

>>427-429の皆さん、ありがとうございますだ
試してみますだ
432デフォルトの名無しさん:2007/03/11(日) 12:22:12
|-`).。oO(・・・・何か、ポインタ論争見ててGoslingとHejlsbergの気持ちが分かったよ・・・・・)
433デフォルトの名無しさん:2007/03/11(日) 12:22:51
431です。
出来ました!ありがとうございます!

もう一つ別件なのですが
数を指定して、その分確保するのはわかったのですが
継ぎ足して、順次値を挿入していくようなもののやり方も必要で。

1次元配列で
int hoge[値不明];
int input;
int i;

while(1){
 printf("値を入力しる >> ");
 scanf("%d",input);

 for(i=0;i<hogeの大きさ;i++)
   printf("%d\n",hoge[i]);
}

といったことをしたいのです。
順次入力に伴い配列が増えていくようなメモリの取り方がしたいのです
malloc allocの説明を見てもどうもわからず。何度も何度もすんません
434デフォルトの名無しさん:2007/03/11(日) 12:27:31
realloc
435デフォルトの名無しさん:2007/03/11(日) 12:38:30
reallocについても観ていたのですが
フラグメンテーションがひどいということで。。。上のような小さいのならよいのだけど
数が増えたときを基準に考えてやらないといかんのです

C++のvectorでは上のはあっさりやってくれたのだけど
Cじゃないといかんので
436デフォルトの名無しさん:2007/03/11(日) 12:43:17
437デフォルトの名無しさん:2007/03/11(日) 12:45:31
だったら始めに大きめに余裕を持ってメモリを確保しておけ。
足りなくなったらまた余裕を持って更に多くのメモリを確保しなおせ。

C++のstd::vectorもそういう戦略を取っている。
438デフォルトの名無しさん:2007/03/11(日) 12:46:00
リンクトリスト使って自前でメモリ管理すればいいじゃん。
439デフォルトの名無しさん:2007/03/11(日) 12:51:01
メモリの動的確保もろくにできないのに
フラグメンテーションなんか気にすんなよ・・・
440デフォルトの名無しさん:2007/03/11(日) 12:51:24
float型とlong型の計算によって発生する誤差を確認するために、
次のプログラムを組みました。

#include <stdio.h>

int main(void)
{
  long l;
  float f;
  long big = 1234567890;
  float lten = 10.0f;

  l = (big / lten) * lten;
  f = (big / lten) * lten;
  printf("l : %ld\n", l);
  printf("f : %f\n", f);

  return 0;
}

実行すると、

a : 1234567890
f : 1234567936.000000

となりました。
計算結果をlong型の変数aに代入した場合に誤差が発生しないのは、なぜでしょうか。
441デフォルトの名無しさん:2007/03/11(日) 12:56:45
(big / lten) * lten
これが内部的にdouble型やそれ以上の精度で計算されている可能性がある。
例えばx86の浮動小数点数演算はみんな80bit拡張倍精度で行われ、
レジスタを使いまわすとそういうことになる。
442デフォルトの名無しさん:2007/03/11(日) 12:58:46
すいません、質問させてください
#include <stdio.h>
#include <unistd.h>
int main(void)
{
fputs("World!!", stdout);
write(1, "Hello!", 6);
putchar(0x0a);
return 0;
}

これを実行するとHello!!World!!の順で出力されるのですが,何故なのでしょうか
443デフォルトの名無しさん:2007/03/11(日) 13:00:47
Cのstdioでの入出力はバッファリングされているため
444デフォルトの名無しさん:2007/03/11(日) 13:00:53
stdioがバッファリングするから。fflushしろ。
445デフォルトの名無しさん:2007/03/11(日) 13:10:37
>>441
ありがとうございます。
ということは、float型に代入した値の誤差は、計算時ではなく代入時に
発生したということですか?
446デフォルトの名無しさん:2007/03/11(日) 13:21:59
>>444
低水準と高水準をごっちゃに使うな、と言う方が良いと思う
447デフォルトの名無しさん:2007/03/11(日) 14:55:56
433ですたびたびすんません。reallocでとりあえず作ってみたのですが
上手く値が入りません。観てやってもらえませんか
int main(void)
{
int *p1,*p2;
int i,count=0;
int input;

p1 = (int*)calloc(1 , sizeof(int)); /* int型で要素数1の配列 */

while(1){
p1 = (int*)realloc(p1,sizeof(int)); /* int型1つの領域を再取得 */

if( p1 == NULL ) /* 成功したかどうか調べる */
{
free( p1 ); /* 再取得に失敗した場合には、元の領域は有効なままなので、自分で解放する */
printf("memory error");
return 0;
}
printf("input some number >> ");
scanf("%d",&input);
p1[count]=input;

for(i=0;i<=count;i++)
printf("p[%d]=%d\n",i,p1[i]);
count++;
}

free( p1 );
return 0;
}
448デフォルトの名無しさん:2007/03/11(日) 14:57:11
input some number >> 7
p[0]=3
p[1]=-33686019
p[2]=1
p[3]=5
p[4]=7

値を入力した5回目でこうなります。2のところがどうしても変な値が入ってしまって
449デフォルトの名無しさん:2007/03/11(日) 15:02:11
int 1個分しか取ってないのに、何で添字は増えていくんだ?
450デフォルトの名無しさん:2007/03/11(日) 15:03:46
>>447
長さ変わらないんだったらreallocする意味ないだろ。

if( p1 == NULL )
free( p1 ); /* p1はNULLだから元の領域を開放できてない */
451デフォルトの名無しさん:2007/03/11(日) 15:05:00
reallocが追加で取得するとか勘違いしてんのかな。
sizeof(int) * (count + 1) だけ realloc しよう。
452デフォルトの名無しさん:2007/03/11(日) 15:11:50
433です
>>451
>>reallocが追加で取得するとか勘違いしてんのかな。
勘違いしてました('A`)

>>450
p1が確保できていないときの処理だと思っていたのですが、違うのですか

>>449
すみません、意味が…理解できないです
453デフォルトの名無しさん:2007/03/11(日) 15:14:08
で、お礼が遅れましたが
>>451でアドバイスいただいたとおりで出来ますた!

ありがとうございます、ほんとに
やりたかったのはファイルの数字を連続で可変長の配列に組み込むことだったんですが
これだと、メモリがばらばらになるというのを聞いて、まだ改善しないと…だと思うのですが
目星つけることが出来ました。
454デフォルトの名無しさん:2007/03/11(日) 15:17:08
>>449

 ○ | ○| ○| ○ ←p全体
p[0] p[1] p[2] p[3]

だと思っていて
reallocすると

 ○ | ○| ○| ○ | ● realloc分+
p[0] p[1] p[2] p[3]

だと考えてしまっているのですが…どういう勘違いをしているのでしょうか
455デフォルトの名無しさん:2007/03/11(日) 15:19:18
>>452
reallocの戻り値は別の変数に確保して、NULLチェックをしてから元の変数に代入する。

tmp = realloc(size);
if(tmp == NULL ) {
free(p1);
return 0;
}
p1 = tmp;
456デフォルトの名無しさん:2007/03/11(日) 15:19:26
reallocが追加だと思ってたってことは、そのメモリブロック単体でバラバラだと思ってたんだなw
reallocはその領域で拡張しきれないときは、別の場所に確保して元の内容をコピーしてくれるだけ
457デフォルトの名無しさん:2007/03/11(日) 15:20:16
>  ○ | ○| ○| ○ | ● realloc分+
#  ● | ●| ●| ● | ● realloc分+
じゃないか?
458デフォルトの名無しさん:2007/03/11(日) 15:20:49
457は忘れて
459デフォルトの名無しさん:2007/03/11(日) 15:33:22
433です。

>>455
なるほど。理解が出来ました!

>>456
ためしにこうやってみました
p1 = (int*)calloc(1 , sizeof(int)); /* int型で要素数1の配列 */

for(i=0;i<150;i++){
p1[i]=i;
printf("p[%d]=%d\n",i,p1[i]);
}
出力---
p[0]=0
p[1]=1

p[150]=150
---
p1 = (int*)calloc(1 , sizeof(int))

この時点で、ものすっごい長い配列みたいなのが出来てるってことですか?

私がやっていたのは

○ | …まだまだ入る | callocで確保したp
p[0]

realloc
○| ○|…まだまだ入る|← これを何回も整理整頓してる ということでしょうか…
p[0] p[1]
460デフォルトの名無しさん:2007/03/11(日) 15:38:32
reallocしたアドレス表示させてみ。
あと、最初のallocの後に別のメモリをダミーでallocしたときと比べてみ
461デフォルトの名無しさん:2007/03/11(日) 15:57:38
>>460
先ほどのソースでこうやってみました

callocでint型を一つとって 4つに値を入れたアドレス
p[0]=431ff0 値 0
p[1]=431ff4 値 1
p[2]=431ff8 値 2
p[3]=431ffc 値 3

以下 reallocで 値を1個ずつ入力して、再度reallocでやっていく
input some number >> 5
p[0]=431ff0 値 5
input some number >> 1
p[0]=431fb0 値 5
p[1]=431fb4 値 1
input some number >> 4
p[0]=431fb0 値 5
p[1]=431fb4 値 1
p[2]=431fb8 値 4

すんません…混乱してきました(ノ_・、)
462デフォルトの名無しさん:2007/03/11(日) 16:30:07
>>461
だだっ広い新大陸に入植者が沢山やってきて、各々に土地を割り当てたとするだろ
土地を拡張するためにrealloc()を使って再登録するんだけど、管理者は

モウ秋田
463デフォルトの名無しさん:2007/03/11(日) 17:22:22
その説明だとreallocした後の領域は前に指していた領域を伸ばしたものとは限らないから余計手間かかりそうな
464デフォルトの名無しさん:2007/03/11(日) 17:43:40
実際reallocは前に指していた領域を伸ばしたものとは限らないのだが
465デフォルトの名無しさん:2007/03/11(日) 17:50:41
開拓民が土地に納まらなかったら別の土地を探すんだよ
466デフォルトの名無しさん:2007/03/11(日) 18:17:19
>>459
reallocは void *realloc(void *block, size_t size);
blockが元のメモリ、sizeが再割り当てするのメモリサイズ
reallocによる再割り当ては前のメモリに追加して割り当てるわけではなく
sizeで指定したサイズに拡張すると言うこと
たとえばcallocで40バイト分確保していたときに
realloc(p1,80); とした場合 メモリ全体のサイズは120バイトではなく
reallocで指定した80バイトにしかならない

467デフォルトの名無しさん:2007/03/11(日) 19:43:53
std::vector使ってるから再配置とか全然気にしてない
468デフォルトの名無しさん:2007/03/11(日) 19:48:43
スレタイも読めないアホ
469デフォルトの名無しさん:2007/03/11(日) 21:19:54
>>443>>444ありがとうございました
470デフォルトの名無しさん:2007/03/11(日) 21:32:42
>>469
いや、低水準と高水準とまぜて使うなよ。。
471デフォルトの名無しさん:2007/03/11(日) 21:49:34
上の>>127,128でstrdupは標準関数じゃないという話が出てますが、
標準関数以外は使わない方がいいですか?大抵使えると思って
strdupしまくりなんですがまずいでしょうか?
472デフォルトの名無しさん:2007/03/11(日) 21:50:59
別にかまわんだろ。
無くたって簡単に用意できる。
473デフォルトの名無しさん:2007/03/11(日) 21:54:12
使いまくれ
474デフォルトの名無しさん:2007/03/11(日) 22:10:25
>>471
# strdup() は SVr4, 4.3BSD, POSIX.1-2001 準拠である。 
らしい、VCにもあったよな?
475デフォルトの名無しさん:2007/03/11(日) 22:19:37
>>474
VCのはアンダーバーがついてない?
476デフォルトの名無しさん:2007/03/11(日) 23:01:45
>>472-475
ありがとうございます。安心しました。windowsにはないかもしれないんですね。
うーん。やっぱまずいかも。
477デフォルトの名無しさん:2007/03/12(月) 03:31:29
VCの話してんのに何でWindowsには無いって結論になるんだ
478デフォルトの名無しさん:2007/03/12(月) 03:38:44
そらMSVCRT依存だからだろ
MinGWにせよBorlandにせよ
479デフォルトの名無しさん:2007/03/12(月) 11:49:20
昨日mallocについて質問したものです。レスありがとうございました。
一晩考えたのですが、どうにもなっとくが出来ず…再度質問させてください。

やりたいのは可変長に値を確保できる配列です。たとえば値を入力したら、それに合わせてピッタリと配列が大きくなるような
○|○|○ に ●を入れると ○|○|○|●となるような
mallocについて色々見ていたら、mallocでメモリ確保するのと、配列で初めに宣言するのとそれほど代わらないのではと思ってしまいました。

ptr = (int *)malloc( sizeof(int));
if(ptr == NULL){
perror("ptr");
exit(1);
}
for(i=0; i<15; i++)
ptr[i] = i ;
for(i=0; i<15; i++)
printf("ptr[%d] = %d\n", i, ptr[i]);
free(ptr);

これでループを15回やると、15個表示されますが、表示を16にするとエラーになりますよね
これだと初めに配列でptr[15]とするのと代わらないんじゃないかと…

それで足りなくなったらreallocするんですよね?
上のに16個目の入力する要素を加えるとなるとどうなるのでしょうか…
何度もすみませんが教えてください
480デフォルトの名無しさん:2007/03/12(月) 11:53:49
すみません
ptr = (int *)malloc( 15*sizeof(int));
ですね。
481デフォルトの名無しさん:2007/03/12(月) 12:03:45
>>479
> 配列でptr[15]とするのと代わらないんじゃないかと…
スタックとヒープの違いは知っている?ググってみて

> 上のに16個目の入力する要素を加えるとなるとどうなるのでしょうか…
未定義です(malloc()で確保した領域以外の領域に対する読み書きは未定義のはず)
鼻から悪魔が出てきても何らおかしくはないです
482デフォルトの名無しさん:2007/03/12(月) 12:26:34
>>481
ありがとうございます
スタックとヒープの違いを、はじめて知りました

ただ、どうしてもstatic ptr[15]みたいなものとの違いが…

>> 16個目
16個目以降を、入力に合わせて順次領域と一緒に追加していくためには
どうやればいいのでしょうか…
483デフォルトの名無しさん:2007/03/12(月) 13:17:07
>ptr = (int *)malloc( 15*sizeof(int));
これを例にすると、、

ptr2 = (int *)malloc( 16*sizeof(int));
memcpy(ptr2, ptr, 15*sizeof(int));
free(ptr);
ptr = ptr2;

これがreallocと同じ動作(の、一部)
ptr の後ろがまだ使えるなら後ろも使えるようにするだけで、コピーとかしないが
484デフォルトの名無しさん:2007/03/12(月) 13:25:30
あと>>482がやりたいのは、もしかしてリストじゃないの?
リストを自前で作るとヒープやらポインタの扱いはうまくなるよ
485デフォルトの名無しさん:2007/03/12(月) 14:24:30
>>482
static の変数はプログラム実行開始から終了までの寿命がある。
auto の変数 (関数のブロックの始めなどで宣言する変数) は関数
開始から終了までの寿命がある。malloc() で確保した領域は
free() するまでの寿命がある。またこれは realloc() で長さを
変えられる。(更に OS のある環境で動かす場合は free() せずに
プログラムを終了してもその後全部開放されるのが普通)。

という風に覚えておけば良いんじゃないだろうか。

実際にどのメモリ領域に確保されるかは実装によって違う可能性がある。
486デフォルトの名無しさん:2007/03/12(月) 16:06:08
fgets(buf, sizeof(buf), stdin);のsizeofというのはなんでしょう?
また、何のために書くのでしょうか?
487デフォルトの名無しさん:2007/03/12(月) 16:09:31
>>486
sizeof はググれ

【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
488デフォルトの名無しさん:2007/03/12(月) 16:20:24 BE:77640285-2BP(222)
sizeofは演算子なのでmanでは出てこない希ガス。
489デフォルトの名無しさん:2007/03/12(月) 16:41:37
soreha
c++
490デフォルトの名無しさん:2007/03/12(月) 16:45:36
Cでも演算子だぞ。
491デフォルトの名無しさん:2007/03/12(月) 16:46:25
質問です

2つの数字の四則演算を行うというプログラムを授業で製作したのですが
次に128文字まで入力可能にして計算できるようにプログラムを変更しろと言われました。

100桁を超える数字の計算なんて普通しないだろ・・・とか愚痴りつつ
計算方法を考えていたのですが、全く分かりません。

どうすれば100桁を超える数字の計算が可能か教えてください
492デフォルトの名無しさん:2007/03/12(月) 16:49:38
>>491
普通しないけど、お前できる?
できるならその通りに作ればいいし、出来ないなら脳ミソ疑え
493デフォルトの名無しさん:2007/03/12(月) 16:52:13
>>491
宿題は宿題スレに行け。
てか小学校の時に習った筆算のアルゴリズムで解けるよ。
494デフォルトの名無しさん:2007/03/12(月) 16:52:34
多倍長整数演算
495デフォルトの名無しさん:2007/03/12(月) 16:53:03
>>491
可能です
496491:2007/03/12(月) 17:13:52
何型に入れればちゃんと計算結果出してくれるんだろとか考えてました。

>>494
多倍長整数演算でぐぐってみたら色々出たのでがんばってみます
無理そうだったら宿題スレへ・・・
497デフォルトの名無しさん:2007/03/12(月) 20:54:52
498デフォルトの名無しさん:2007/03/12(月) 21:03:06
>>479
>これでループを15回やると、15個表示されますが、表示を16にするとエラーになりますよね
>これだと初めに配列でptr[15]とするのと代わらないんじゃないかと…
たしかに変わりません.ただ>>481さんぎ言うように確保される領域が違う場合がありますから

>それで足りなくなったらreallocするんですよね?
そうです

>上のに16個目の入力する要素を加えるとなるとどうなるのでしょうか…
???

>>496
文字配列を使って筆算の要領で計算するとか
499デフォルトの名無しさん:2007/03/12(月) 21:25:27
>>480
てめーこの野郎。レスポップアップで見てるこっちの身にもなれや。
500デフォルトの名無しさん:2007/03/12(月) 21:27:54
亀乙
501デフォルトの名無しさん:2007/03/12(月) 22:07:54
次のようなプログラムを作りたいです。
実行すると、コマンドプロンプトを開き、実行されたディレクトリまで移動し、特定のコマンドライン引数付きで
特定の実行ファイルを実行する、というものです。
この流れは自動で一瞬で終わるようにしたいです。
どのように組めば良いでしょうか?
502デフォルトの名無しさん:2007/03/12(月) 22:10:38
>>501
( ・ω・)やりたいことは分かってる

(・ω・ )やらなきゃいけないことも分かってる

( ・ω・ )なんでやらないの?
503デフォルトの名無しさん:2007/03/12(月) 22:14:59
ディレクトリを知る → GetCurrentDirectory とか gwtcwd とか
プログラムを実行する → CreateProcess とか systemとか。
504デフォルトの名無しさん:2007/03/12(月) 22:16:47
今勉強しないといけない言語って、

C,C++と、Javaと、Perlくらいですか?
505デフォルトの名無しさん:2007/03/12(月) 22:18:36
JAVAScript。
506デフォルトの名無しさん:2007/03/12(月) 22:19:18
【強迫観念にとらわれています】
507デフォルトの名無しさん:2007/03/12(月) 22:20:03
>>501
cmd.exeの遠隔操作?
508デフォルトの名無しさん:2007/03/12(月) 22:21:11
>>501
コンソールアプリで別のプロセス起動させるってことか?
>コマンドプロンプトを開き、実行されたディレクトリまで移動し
意味が分からない
>特定のコマンドライン引数付きで特定の実行ファイルを実行する
exec群
509デフォルトの名無しさん:2007/03/12(月) 22:21:25
510デフォルトの名無しさん:2007/03/12(月) 23:22:35
479です。
色々回答ありがとうございます。返信遅れてすみませんでした。

回答いただいて、ようやく自分の中で噛み砕けました。
Cだと順次、値を入れて、次の領域を確保するような操作は難しいのですね

ありがとうございました。
511デフォルトの名無しさん:2007/03/12(月) 23:30:47
それCじゃなくてバッチだよなあ


と思ってたら、>>509がちゃんと書いてた。
512デフォルトの名無しさん:2007/03/12(月) 23:45:37
>>510
なんでそういう結論になるんだよ…
513デフォルトの名無しさん:2007/03/12(月) 23:49:06
きっと世界の救世主になったんだろ
彼が難しければ万人が難しいんだよ

おれは べっせかい の にんげん だから かんけい ないヨ \(^o^)/
514デフォルトの名無しさん:2007/03/12(月) 23:51:06
彼はC++の世界に飛び立ったのさ・・・
515デフォルトの名無しさん:2007/03/12(月) 23:54:25
こんな低レイヤ処理には見切りをつけてなぜかPythonへ・・・
516デフォルトの名無しさん:2007/03/13(火) 00:03:00
>>510
とりあえずmalloc,realloc.freeあたりの仕様をよく読めよ
517デフォルトの名無しさん:2007/03/13(火) 00:04:30
>>516
> 仕様
・・・!!!
518デフォルトの名無しさん:2007/03/13(火) 00:46:19
typedef struct _STRLIST{
char name[128];
struct _STRLIST *next;
} STRLIST;

STRLIST *listtop = NULL;

listtop = (STRLIST *)malloc(sizeof(STRLIST));
strcpy(listtop->name, "Ichiro");
listtop->next = NULL;

リンクリストについて質問なのですが
上のソースに於いて、
>>STRLIST *listtop = NULL; はname, "Ichiro"が入っている
構造体のnextメンバを、予め指しているのでしょうか?
519デフォルトの名無しさん:2007/03/13(火) 00:49:00
何言ってんの
STRLIST *listtop = NULL; はリストの要素は何も無い状態だろう
520デフォルトの名無しさん:2007/03/13(火) 00:49:21
指してないよ
見たまんま、NULL を指している
521デフォルトの名無しさん:2007/03/13(火) 00:53:19
NULLで明示的に初期化してから、mallocで領域確保した後、nameとnextメンバに代入してる
522518:2007/03/13(火) 00:55:00
>>519->>520
では、一番最初の要素(listtop)には、何も入っていないとの事でしょうか?
そしたら、要素1を指せないですよね???
ですが、解説の図には先ず最初の要素に要素1を指す物を入れるとか・・・

523デフォルトの名無しさん:2007/03/13(火) 01:01:44
要素1ってなんだよ
524デフォルトの名無しさん:2007/03/13(火) 01:03:23
>>522
listtop = (STRLIST *)malloc(sizeof(STRLIST));
ここで最初の要素が listtop に入る
525デフォルトの名無しさん:2007/03/13(火) 01:07:39
LISTで詰まったら図を描くんだ
頭を整理しろ
526518:2007/03/13(火) 01:10:11
本に依ると
listtopと言う箱があり、それが要素1と言うものをさしています
listtopは&(要素1)、要素1は&(&要素1)、要素2は&(要素3)・・・・・要素5は&(要素6)
要素6はNULL ってな感じです・・・
527518:2007/03/13(火) 01:11:13
訂正
要素1は(&要素2)
528デフォルトの名無しさん:2007/03/13(火) 01:12:20
>listtop = NULL;

listtop → (あさっての方向

>listtop = malloc(〜

listtop → [   ]

>strcpy

listtop → [ Ichiro ]
529518:2007/03/13(火) 01:12:50
>>524
もし、このlisttopがNULLなら
最初の(&要素1)を指せませんよね
530デフォルトの名無しさん:2007/03/13(火) 01:14:28
このlisttopが最初の要素1を指してる
531デフォルトの名無しさん:2007/03/13(火) 01:16:05
>>529
listtop = NULL; の「時点では」 listtop は NULL だ

ずっと NULL ってわけじゃないだろ
listtop = malloc(〜) の時点で listtop は要素1を指す



532デフォルトの名無しさん:2007/03/13(火) 01:16:48
プログラムを書くにあたって、頭が固いのは
物を知らない事より邪魔な要素
533デフォルトの名無しさん:2007/03/13(火) 01:17:43
>>526
絶対何か勘違いしてるだろ。

要素1は listtop
要素2は listtop->next
要素3は listtop->next->next
534デフォルトの名無しさん:2007/03/13(火) 01:19:42
それにしてもポインタを箱と言うか・・・俺のイメージはアドレスの書かれた矢印型看板なんだけどな
535デフォルトの名無しさん:2007/03/13(火) 01:20:18
以前もいたよ。

a=1;
printf("%d",a);
a=2;
printf("%d",a);

これでどうして、2つの printf で違うものが出てくるのかが分からないって人。
プログラムは上から順に実行されるんだってことが分からないらしい。
536518:2007/03/13(火) 01:20:50
>>528->>530->>531
listtopは最初は明後日の方向(何処も指していない)
でlisttop = malloc[ ]ができて、listtopに(&要素1)が入るのでしょうか?
537デフォルトの名無しさん:2007/03/13(火) 01:23:25
listtop = malloc[ ]って打ち間違いだよな?
mallocで作った領域へのポインタ(mallocの戻り値)がlisttopに入る
538デフォルトの名無しさん:2007/03/13(火) 01:23:31
入るとか言うからややこしいんだよ

listtop は要素1を指している、でいいんだよ
>>528 でわざわざ「矢印」を書いてくれてるだろ
539デフォルトの名無しさん:2007/03/13(火) 01:24:17
俺のポインタのイメージは参照先へ線が付いてるタグ
プログラムは3Dマッピング
540デフォルトの名無しさん:2007/03/13(火) 01:27:08
俺のポインタのイメージは

┌─┐
│  ┼→
└─┘
541518:2007/03/13(火) 01:27:12
皆さん、ありがとうございます
listtop = malloc()でした

もうわけわかめなので、出直してきますが
では、"Ichiro"が要素2は listtop->next に
入ってる事になりますでしょうか?
542デフォルトの名無しさん:2007/03/13(火) 01:28:39
要素1とか要素2とか言うからわけわからんようになるんだろうが。
もうちょっとちゃんと構造体を意識しろ。
543デフォルトの名無しさん:2007/03/13(火) 01:29:17
>>541

>listtop = NULL;

listtop → (あさっての方向

>listtop = malloc(〜

listtop → [   ]

>strcpy

listtop → [ Ichiro ]

この図を見ても、「要素2」に「Ichiro」が入ってるように見えるか?
544デフォルトの名無しさん:2007/03/13(火) 01:33:36
listtop → STRLIST構造体1
         メンバ name = "Ichiro"
         メンバ next → STRLIST構造体2(この時点ではまだNULL)
                         メンバ name = "Ichiro"
                         メンバ next → STRLIST構造体3
545518:2007/03/13(火) 01:37:46
>>543
>>544
では、整理させてください。
最初はNULLで指している構造体ができてから
その前の所にできた構造体のアドレス(ポインタが入ると言うことでしょうか?)
546518:2007/03/13(火) 01:41:34
使っている本は絵本シリーズです・・・
547デフォルトの名無しさん:2007/03/13(火) 01:41:35
>>545
>最初は
「最初」というのはどこでしょう

>NULLで指している構造体
意味が分かりません

>その前の
どの?
548518:2007/03/13(火) 01:47:32
自分でもよくわからなくなってしまっているので
最後に再度質問です

STRLIST *listtop = NULL;
が、いつ要素1にかわるのでしょうか?
549デフォルトの名無しさん:2007/03/13(火) 01:48:47
>>548

531 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/13(火) 01:16:05
>>529
listtop = NULL; の「時点では」 listtop は NULL だ

ずっと NULL ってわけじゃないだろ
listtop = malloc(〜) の時点で listtop は要素1を指す
550518:2007/03/13(火) 01:49:57
ありがとうございました。
551デフォルトの名無しさん:2007/03/13(火) 01:50:41
デバッグして動きを見てけば分かりやすい
百聞は一見に如かず
552デフォルトの名無しさん:2007/03/13(火) 01:53:47
質問するのはいいことだけどさ、
返ってきたレス読んでないだろ?

たった10個前のレスコピペしただけでありがとうとか
つまりそのレスを読んでない証拠。

図を描けって言っても描かないし
要素1要素2ってやめろって言ってもやめないし
入るじゃなくて指すって言っても指すって言わないし

もっと頼れよ
何しに聞きにきてるんだよ
自分ひとりで解決しようとすんなよ
553デフォルトの名無しさん:2007/03/13(火) 01:55:04
リバースエンジニアリングスレってどこだ?
ちょい報告しようかと思ったんだが。
2chブラウザには面白いもん内蔵されてんだよね。
ちょいビビった。
このスレの住人は知ってる人多そうな、既出ネタっぽいが…。
(こりゃ儲かるよなあ、内蔵されてれば、でもシークレット???)
554デフォルトの名無しさん:2007/03/13(火) 02:04:12
ポインタはアドレスと言う概念で理解するより
唯単に指す物的なイメージで覚える方がいいでしょうか?
555デフォルトの名無しさん:2007/03/13(火) 02:33:37
>>553
雑談スレとか
いや、他の板で扱うネタな気もする

>>554
抽象的に捉らえておいて、
実際に使いながら理解するって感じかなぁ
アドレスと覚えるとインクリメントとかでつまづくかも
556デフォルトの名無しさん:2007/03/13(火) 02:36:41
>>534
おれのイメージは変数名が書いてある紙にひもがぶら下がっていて、
そのひもの先に何か括り付けられている感じ。
557デフォルトの名無しさん:2007/03/13(火) 04:13:17
>>555
アドレス的概念だけでは理解しない方がいいみたいですね

>>556
やっぱし、皆イメージは付けてるのね
558デフォルトの名無しさん:2007/03/13(火) 04:22:56
ポインタは型の情報のついたアドレスだと思ってる。
アドレスとして捉えないと、配列などで連続したメモリブロックにある場合のイメージが曖昧になる。
559デフォルトの名無しさん:2007/03/13(火) 05:02:05
動的メモリ操作に関する質問です。
どんなときメモリ確保&解放するべきかよくわかりません。

例えば単に配列を読み込んで表示する場合と、メモリ確保してから
配列の読み込み&表示して解放するのではどう違ってくるのでしょう?
560デフォルトの名無しさん:2007/03/13(火) 05:04:43
文字を逆に表示するプログラムを考えています
本来はファイルの内容を1行ずつ逆にするのですが
基本的なことからわかってないようなので
以下のプログラムのどこがいけないか教えていただきたいです

#include <stdio.h>

int main(void){

  char str[]="abcdefg";
  int i;

    for(i=10;i>=0;i--){

      if(str[i]!=0){

        putchar(str[i]);
      }
    }

  return 0;
}

実行結果は最初の数文字が文字化けで表れ
「g」は表示されず「fedcba」は表示されます
for文のiを文字数と同じ「7」にすると上手くいくのですが
文字数がわからない場合でも対応したいので「10」にしています
(本来は1024にするつもりですが、現段階では結果がものすごいことになるので減らしています)
561デフォルトの名無しさん:2007/03/13(火) 05:21:53
>>560
10を((sizeof(str))/sizeof(str[0]))-1に置き換えてみたらうまくいくと思います。
562デフォルトの名無しさん:2007/03/13(火) 05:24:18
固定配列とは限らないんだtったら
長さは strlen() で数えよう
563デフォルトの名無しさん:2007/03/13(火) 05:25:10
>>559
長さが事前にわからない場合は動的にやるだろ
564デフォルトの名無しさん:2007/03/13(火) 05:34:35
>>559
「配列を読み込む」とは具体的にどういう操作のことを言ってるの?

>>460
if(str[i]!=0){
  putchar(str[i]);
}
これは、strが
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0, 0, 0, 0
であることを前提にしている(ASCIIだったとして)。
でも実際には9番目と10番目と11番目は何が入ってるかわからない。ゼロであるとは限らない。
だから、putcharのループは、確実に終端文字'\0'の一つ手前から始まるようにしないといけない。
文字数が固定でないなら、最初に開始位置を確定する操作を置くべし。
565560:2007/03/13(火) 05:37:40
質問に答えていただいてありがとうございます
stdio.hの標準ライブラリ関数だけでは
この内容のプログラムは不可能だったり、無駄に複雑になったりしますか?

できればstdio.hだけで処理したいんですが
566デフォルトの名無しさん:2007/03/13(火) 05:38:45
エクセルやワードが使えないのにC言語やってます、皆から順序が変と
言われます…この前、エクセルの参考書を見たら関数や引数がCやってるせいか
理解しやすそうでした
567560:2007/03/13(火) 05:42:06
>>564
なるほど、9番目以降はデータが入っていないのではなく
何が入ってるかわからない状態なんですね
ありがとうございます

う〜ん、文字数が固定でない状態で確実に終端文字の一つ手前から始まる操作。。。
今のところ思いつきませんが考えてみます
568デフォルトの名無しさん:2007/03/13(火) 05:48:56
>>565
じゃあこれで(ファイルからの読み取りだと>>561ってワケにはいかなそうだし)。

char *cp = str;
while(*cp)cp++;
while(cp != str)putchar(*--cp);
569デフォルトの名無しさん:2007/03/13(火) 06:33:03
ポインタ地獄
570デフォルトの名無しさん:2007/03/13(火) 06:39:09
これくらいは楽に読めるようになっては欲しいけど、まあ複雑だあねw
571デフォルトの名無しさん:2007/03/13(火) 07:04:47
スキャナのヘッドを読み取りたい領域まで持っていってから
紙を物理的に逆さにするわけにはいかないから、反対側の紙の外まで持っていって
そこからまた紙の外に出るまで戻しながら読み取っていく
って感じか
演算子の優先順位とか調べながら変数に初期値与えて紙の上でこちゃこちゃしてたらなんとなくわかった
でもこういうの見た瞬間に理解できるようになりたいなぁ
572デフォルトの名無しさん:2007/03/13(火) 07:38:07
>>564
説明が下手だな。コードで説明しなくても文字で説明すれば済むだろ。
573デフォルトの名無しさん:2007/03/13(火) 07:39:00
>>565
string.hを使わない積極的な理由が無いなら、使うべき。
574デフォルトの名無しさん:2007/03/13(火) 07:39:39
>>566
確かに順序が変だね。もっと日本語をやるべきだ。
575デフォルトの名無しさん:2007/03/13(火) 07:48:13
>>566
独り言ならチラシの裏にでも書いとけ
576560:2007/03/13(火) 07:52:23
正直言って、授業の課題をやってるわけですが
この授業ではstdio.hしかやっていないのです
ポインタも後回しで、「ファイル操作の時にはこうやるんだ」とだけ。

私は他の授業でstring.hもポインタも習っていますが
授業の進め方がこうである以上、ポインタを使わずかつstdio.hだけでやるやり方を探しています
今のところ思いつきませんが
577デフォルトの名無しさん:2007/03/13(火) 07:53:56
string.hの関数を自分で実装すればいいじゃないか
578デフォルトの名無しさん:2007/03/13(火) 08:03:17
ポインタ無しのstdioだけ?
int i=1;
fseek( fp, i, SEEK_END)
while( ftell(infp) != 0 ){
fputc( fgetc(infp), outfp);
i++;
fseek( fp, i, SEEK_END);
}
こんな感じ?
579デフォルトの名無しさん:2007/03/13(火) 08:03:47
ざんねんながらfpはポインタだ
580560:2007/03/13(火) 08:32:35
みなさんありがとうございました
自分で配列の長さを測る関数を作ってやりたいと思います
もう考えるのも面倒だし
581デフォルトの名無しさん:2007/03/13(火) 08:35:49
最後まで無視され続けた >>561
582デフォルトの名無しさん:2007/03/13(火) 08:40:06
趣味でネット麻雀代打プログラムを作っています。

思考ルーチンが走っている間であっても、ユーザ入力(一時停止や、思考ルーチンの強さ指定、
攻撃・守備モード切替等)を受け付けることができるようにしたいのですが、
マルチスレッドにする必要はあるのでしょうか?
583デフォルトの名無しさん:2007/03/13(火) 08:40:16
そりゃぁ、論外だし。
584デフォルトの名無しさん:2007/03/13(火) 08:40:54
>>580
#include <stdio.h>
int main(void)
{
char str[] = "abcdefg";
int i;
for (i=0; str[i] != '\0'; i++);
for (i-=1; i>=0; i--) putchar(str[i]);
return(0);
}
585デフォルトの名無しさん:2007/03/13(火) 08:44:09
思考ルーチンの最中で、ときどきメッセージループをまわしてあげるのはどうだろ?

思考ルーチンからループアウトしてまわすのは大変だけど、
思考ルーチンの途中で呼び出すイメージ

// 思考ルーチン
while (〜){
 // いろいろ考えて
 CallMessageLoop();
 // いろいろ考えて
 CallMessageLoop();
}
586デフォルトの名無しさん:2007/03/13(火) 10:36:07
>>584
ちょっとすっきり。
#include <stdio.h>
int main(void)
{
char s[] = "abcdefg";
int i;
for (i = 0; s[i]; ++i);
while (--i >= 0) putchar(s[i]);
return 0;
}

再帰版はこんな感じか。
#include <stdio.h>
void rev(char s[], int p)
{
if (s[p]) {
rev(s, p + 1);
putchar(s[p]);
}
}
int main(void)
{
rev("abcdefg", 0);
return 0;
}
587デフォルトの名無しさん:2007/03/13(火) 10:38:50
ポインタアリなら再帰ですっきりだな。(無駄な感じするけど)
#include <stdio.h>
void rev(char *p)
{
if (*p) {
rev(p + 1);
putchar(*p);
}
}
int main(void)
{
rev("abcdefg");
}
588501:2007/03/13(火) 10:38:54
>>503
>>508
ありがとうございます!
>>507
自作ソフトに付属するdllファイルをregsvr32で登録させるインストーラーを作りたいと思いまして。
>>511
あ、そうです!
バッチって言われてるような、一瞬プロンプトが出て消えるけど、作業がされてるみたいなのにしたかったんです。
>>509
誘導ありがとうございます!
589デフォルトの名無しさん:2007/03/13(火) 10:53:07
>>580
ところで、もし大学ならば講義でやってないことを宿題に書いて出しても
普通は問題ないと思うよ。あえてそれをやるなと言われているのでなければね。

590501:2007/03/13(火) 10:55:41
バッチファイルで、めちゃくちゃ簡単にできましたw
ありがとうございました。
591デフォルトの名無しさん:2007/03/13(火) 11:47:27
void main()
{
void func(); ←ここの意味
i = func(a,b);
}

int func( a, b )
{
}

かなり省略形ですいません><

UNIXからの移植なんですが func() があるとVCじゃC2660出ちゃうし
安易に消していいものか?分からなくて
意味を教えてください、お願いします。
592デフォルトの名無しさん:2007/03/13(火) 11:49:04
関数プロトタイプ
593デフォルトの名無しさん:2007/03/13(火) 11:49:33
挨拶もせず、いきなり乗せて失礼しました。
3行目 int func(); でお願いします><
594デフォルトの名無しさん:2007/03/13(火) 11:51:15
まだ省略してるだろ

int func(int a, int b) とかじゃないのか。
そしたらプロトタイプもああおれにあわせろ
595デフォルトの名無しさん:2007/03/13(火) 11:52:34
分からないなら※アウトすればイイじゃない

っていうか、そこに書いてある理由が思いつかない
596デフォルトの名無しさん:2007/03/13(火) 11:55:39
>>592 即レスありです。
関数プロトタイプっの引数無しって事ですか?

VCじゃ、ちゃんと宣言しとかないとC2660が出る気がして
宣言しなおしてるんで必要なしって事ですかね

もうちょっとゴソゴソしてみます、ありがとうございました。
597デフォルトの名無しさん:2007/03/13(火) 11:56:19
C2660なんて書かれてもVCもってなければ意味が分からんわけだが。
ぐぐって調べたぜ。

mainの中のvoid func();は、funcという関数は引数を取らず、
値を返さない関数であるというプロトタイプ宣言。

関数呼び出し前にプロトタイプ宣言もしくは関数の定義そのものがないと、
その関数はintを返す引数のない関数であると仮定される。引数については、
Cでは引数の数はチェックされなくなり、C++では引数なしの関数であると
仮定される。

でもって実際にはfuncの定義を見ると引数が2つある。

598デフォルトの名無しさん:2007/03/13(火) 11:57:27
あんぎゃー。CとC++の違いを書こうとして推敲せずに出したら間違えた。
2段落目の引数のとこは無視。3段落目の文が正しい。
599デフォルトの名無しさん:2007/03/13(火) 11:57:36
そのコードでコンパイルエラーになるとしたら、
それはVCだからではなく、C++としてコンパイルしているからだと思う。
600デフォルトの名無しさん:2007/03/13(火) 11:59:12
……慌てるとダメだな。

>>598のほうを無視だ。
2段落目はプロトタイプ宣言自体の説明で3段落目は省略時の話だわい。
601デフォルトの名無しさん:2007/03/13(火) 12:00:05
落ち着けよわけわかんねーよ
602デフォルトの名無しさん:2007/03/13(火) 12:03:57
訳もわからず消すのはやめてCのソースとしてコンパイルすべき。
603デフォルトの名無しさん:2007/03/13(火) 12:04:16
プロトタイプを省略すると戻り値はintと仮定、引数についてはチェックしない
(Cの場合)

プロトタイプを書いた場合は、呼び出し形式や定義がその通りになっていないと
怒られる。

これでよいかな。
604デフォルトの名無しさん:2007/03/13(火) 12:20:14
>>591は古いC言語なら正しいソースだよ。
普通にコンパイル通る。
605デフォルトの名無しさん:2007/03/13(火) 12:23:10
便乗して質問おながいします。

b.h で定義してある
typedef struct {
:
} TYPEB;

というのがあるとき、b.hをincludeしてない別のヘッダファイル内で
TYPEBを引数に持つ関数の宣言はどうやるのが正しいのでしょうか?

/* in a.h */
struct TYPEB; /* プロトタイプ宣言 これがないと次の行でTYPEBが未定義と怒られる? */
struct TYPEB* func (struct TYPEB* arg);

これであってます?
606デフォルトの名無しさん:2007/03/13(火) 12:32:25
>>605
b.h で
 typedef struct typeB { } TYPEB;
 /*
  struct typeB { };
  typedef struct typeB TYPEB;
 */
としているのならば、a.h では
 struct typeB* func(struct typeB* arg);
という宣言が可能。

元記述だと名前なし構造体なので
b.h を include するなりして、TYPEB を確定させるしかない。
607605:2007/03/13(火) 12:38:15
>>606
すばやいご回答ありがとうございます。

typedef struct name { } TYPEB;

のnameをつけるのとつけないのは何が違うのか良くわからなかったのですが
よくわかりました。ありがとうございます。
608デフォルトの名無しさん:2007/03/13(火) 13:45:44
printf関数等で画面に文字を出力する時、最終的にはそのOSのAPI(WindowsならTextout関数等)を呼び出して表示してるわけですか?
609デフォルトの名無しさん:2007/03/13(火) 13:48:57
はい。
610608:2007/03/13(火) 13:53:35
>>609
すっきりしました、即レスありがとうございます
611デフォルトの名無しさん:2007/03/13(火) 14:05:37
VC8SDKで現在開発しているのですが、APIをゴリゴリ書いていくのに
疲れてしまいました。そこでMFCかC++Builderか悩んでいます。

調べた感じC++Builderが開発効率が良さそうなのですが、実際のところはどうでしょう
みなさん、どのような環境で開発してるんですか?
612デフォルトの名無しさん:2007/03/13(火) 14:55:08
abc,123,456
tako,23,134,2345,
hoge,344,11,

このようなカンマで区切られた、1行のデータ数が適当だったり
カンマの個数がまちまちだったりするデータを読み込んで

data[1].name data[1].score1

に入力していきたいのですが。
fscanfを使わないでやりたいのです
613デフォルトの名無しさん:2007/03/13(火) 15:00:48
普通に切り分けていけばいいじゃないか。

何が知りたいの?
614デフォルトの名無しさん:2007/03/13(火) 15:02:46
その組み方がわからなくて
fgets strtokあたりの使い方を
615デフォルトの名無しさん:2007/03/13(火) 15:08:18
普通に切り分けるサンプルのようなものありませんか
616デフォルトの名無しさん:2007/03/13(火) 15:11:32
617デフォルトの名無しさん:2007/03/13(火) 15:11:32
>>612
%100[^,\n]
とかの書式指定はできるけど
fscanf がダメな理由はあるの?
618デフォルトの名無しさん:2007/03/13(火) 15:15:32
>>617
fscanfだと
%s,%d,%d,%d, みたいに書式が分かっていないとだめですよね。
カンマと「 (スペース)」が混在したりもしているので。

カンマとスペースで区切って、任意の変数にファイルから読み込むというのを
最終的にやりたいのですが、カンマの時点で突っかかりました
619デフォルトの名無しさん:2007/03/13(火) 15:22:05
普通に前から一文字ずつ読んでいって、カンマならそこまでコピーすればいいんでないの?
620デフォルトの名無しさん:2007/03/13(火) 15:22:28
>>616
strtokでみてみて、いまいち意味がわからないのが

int main(void)
{
char str[] = "ABCD ef.1234.G";
char *tp;

/* スペース.を区切りに文字列を抽出 */
tp = strtok( str, " ." ); //←ここはなんのため?
puts( tp );
//strを分割するだけなら↓からだけで十分じゃないの?
while ( tp != NULL ) {
tp = strtok( NULL," ." );
if ( tp != NULL ) puts( tp );
}

return 0;
}

といった疑問が。あとfgetsの動きもよくわかりません
621デフォルトの名無しさん:2007/03/13(火) 15:23:09
>>619
最終的に行数=人数も吐き出したいので、1文字ずつより1行ずついきたいのです
622デフォルトの名無しさん:2007/03/13(火) 15:23:16
1行分をばっさり読み込む fgets → buf
top = tail = buf;
カンマ, スペースが来るまで tail を進める。 (*)
top から tail までがトークン 適当に切り出す。 strncpy(dst, top, tail-top);
top = tail+1;
(カンマ, スペースが続く間 top を進める)
* 最後まで繰り返し
623デフォルトの名無しさん:2007/03/13(火) 15:23:36
624デフォルトの名無しさん:2007/03/13(火) 15:28:34
strtokは自分専用の文字列ポインタを持ってて、NULLでない
引数がわたってきたときはそれで専用ポインタを初期化する。
NULLがきたら、既に覚えてるはずの専用ポインタの値を使う。
625デフォルトの名無しさん:2007/03/13(火) 15:30:34
>>622
やってみます。というか似たようなことで詰まってる人他にもいるだろうに

>>623manページは伝えわるような文じゃないので、わかんないっす
626デフォルトの名無しさん:2007/03/13(火) 15:32:48
>>612
読み込むデータをリダイレクトでこれに流し込んでみて

#include <stdio.h>

int main(void){
    FILE *fp=stdin;
    int row, line_count=1;
    char buf[256];

    while(!feof(fp)){
        if(fscanf(fp, "%1[\n]", buf)==1)
            line_count++;
        row=0;
        while(1){
            fscanf(fp, "%*[ \t,]");
            if(fscanf(fp, "%250[^ \t\n,]", buf)==1)
                printf("Line:%d Row:%d %s\n", line_count, ++row, buf);
            else
                break;
        }
    }
    return 0;
}
627デフォルトの名無しさん:2007/03/13(火) 15:34:38
man読めないって重症だと思うんだが
628デフォルトの名無しさん:2007/03/13(火) 15:37:11
>>627
同意
629デフォルトの名無しさん:2007/03/13(火) 15:44:19
>>626
理想どおりの動きをしました…ただ、自分の読解力の無さのためfscanfの項で何をしているのかがわからないです
ほんとすんません
630デフォルトの名無しさん:2007/03/13(火) 15:45:57
>>629
man くらいは読めないとな

っ 【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
631デフォルトの名無しさん:2007/03/13(火) 15:46:53
>>629
それはつまり逐一解説しろってこと?
632デフォルトの名無しさん:2007/03/13(火) 15:47:41
コードを読めない
日本語を読めない


……どうするんだろう。
633デフォルトの名無しさん:2007/03/13(火) 15:58:31
英語か何かなら読めるんだろう。
634デフォルトの名無しさん:2007/03/13(火) 16:19:22
>>611
C++Builderは使ったこと無いのでわかりませんが
MFCはVC++との相性がよいので比較的ラクだと思います。
ただMFCには使ってはいけないといわれるクラス(CSocketとか)がいくつかあるので、
そういう地雷を踏まないように経験を積む必要はありますが。

TreeViewとかListViewとかWebBrowserとか、
Windowsのコンポーネントを使うにはMFCは便利なので、
MFCは使えるように初期化だけしておいて、必要なクラスだけ使う、
のがいいんじゃないでしょうか。

と言ってみるテスト
635デフォルトの名無しさん:2007/03/13(火) 17:09:55
しかし scanf のマニュアルの読みにくさは最上位レベル
636582:2007/03/13(火) 17:15:31
>>585
なるほど・・・ご回答ありがとうございます。
思考ルーチン部そのものがイベントドリブンな感じなので(自分のターンがきたときや、
ポン・チーの問い合わせ時のみ思考関数を呼び出しています)、
それ以外の暇なときに、ユーザ入力部に相当する、チェックボックスやラジオボタンの変更を
チェックする関数を呼び出す、みたいな感じでやってみようと思います。
637デフォルトの名無しさん :2007/03/13(火) 17:44:27
manって何かと思い、リンク踏んだら
おもいっきり日本語解説文じゃねーか
てっきり「きっと、英語の難しい解説文なんだろうな」
と思って損した。
638デフォルトの名無しさん:2007/03/13(火) 17:48:30
manを知らない人間がいるとは驚愕。
639デフォルトの名無しさん:2007/03/13(火) 17:52:29
それを知ってて理解できるやつは入門を超えてるだろう
640デフォルトの名無しさん:2007/03/13(火) 18:10:24
mankoマンド
641デフォルトの名無しさん:2007/03/13(火) 18:54:08
int main(int argc,char *argv[]) とするのは、
何かコマンドを取るプログラムを作る時のみで構いませんよね?
642デフォルトの名無しさん:2007/03/13(火) 18:54:56
はい。
643デフォルトの名無しさん:2007/03/13(火) 19:34:36
fseek(fp, 10L, SEEK_SET); で
10Lの"L"とは一体何なんでしょうか?

ただの10でも動くのですが、必要なのでしょうか?
644デフォルトの名無しさん:2007/03/13(火) 19:36:40
>>643
C 長整数型 リテラル
645デフォルトの名無しさん:2007/03/13(火) 19:58:28
>>641
引数を必要としない、かつ呼び出し元に何も通知する必要が無ければ
void main(void)
でおk

>>643
Lがlongですよーって明示的に言ってる。必要か不要化?
最近のコンパイラは頭が良いので付けなくても良いけど、
自分や後からコードを見た人にとっては有った方が嬉しいね。
646デフォルトの名無しさん:2007/03/13(火) 20:01:05
>>645が叩かれる悪寒
647デフォルトの名無しさん:2007/03/13(火) 20:05:41
>>645が叩かれる悪寒
648デフォルトの名無しさん:2007/03/13(火) 20:07:24
ご期待に応えて:
「main関数の返値をvoidにするのは規格違反」
649デフォルトの名無しさん:2007/03/13(火) 20:09:37
>>646
把握した

>>645
コンパイラは頭が良いので

プロトタイプ宣言があれば(この場合は関数呼び出しより前に #include<stdio.h> があれば、でも可)
650デフォルトの名無しさん:2007/03/13(火) 20:14:26 BE:62112948-2BP(222)
昔は組込環境とかでエントリポイントがvoid main()固定というのがたまにあったが
ANSI準拠でないことは確かだな。
651645:2007/03/13(火) 20:15:06
東ア+より食いつきが良いなー
652デフォルトの名無しさん:2007/03/13(火) 20:23:16
高々数千回の比較分岐代入操作に、ちっちゃな構造体(数10bytes程度)を
関数にconst参照で渡す処理を行うんですが
値渡しでなく、const参照渡しを使うことによる目に見えるほどのデメリットが生じる可能性はあるでしょうか?
653デフォルトの名無しさん:2007/03/13(火) 20:27:11
>>650
自立環境(フリースタンディング)では、
エントリポイントが処理系定義となっていたはず。
それならANSI準拠を名乗れる。
654デフォルトの名無しさん:2007/03/13(火) 21:49:16
C言語を独学で勉強して一年以上経つし、その間わからないことは色々ググったりしたけど、
manなんてものは全然知らなかった。
>>638の驚愕に驚愕した。

文章は日本語だけど画面構成が見づらいね。
個人的にはMSDNの方が見やすい。
655デフォルトの名無しさん:2007/03/13(火) 21:51:58
初期の頃"strlen"とか調べなかったの?
一番最初に出て来るジャマイカ
656デフォルトの名無しさん:2007/03/13(火) 21:58:05
>>654
unix 系OSには man というコマンドがあって
man fopen
とかすると解説が出てくるんだ (マニュアルがインストールされていれば)
>>630 の URL は linux の man を翻訳したもの
なので ls (dir みたいなもの) のヘルプとかも調べられる
657デフォルトの名無しさん:2007/03/13(火) 22:08:50
>>654
そりゃ、コンソール上に表示するための画面構成だから
658デフォルトの名無しさん:2007/03/13(火) 22:12:24
linuxくらい経験しとけ
659デフォルトの名無しさん:2007/03/13(火) 22:12:30
>645
はいはいクマクマ
660デフォルトの名無しさん:2007/03/13(火) 22:14:37
もうcygwinでいいよー
/dev/dspつかえるし
661654:2007/03/13(火) 22:16:47
そういうことか。

linuxな人ってああいうのが多いんだ?
662デフォルトの名無しさん:2007/03/13(火) 22:18:10
おまえの世界観が狭いだけだよ
663デフォルトの名無しさん:2007/03/13(火) 22:22:55
manをHTMLで見るのは本来想定されていた見方ではないがな。
664デフォルトの名無しさん:2007/03/13(火) 22:26:17
>>652
そんな気にするような欠点は無いと思ってよい。
それよりもここはC++のスレでないから、
スレ違いであることを気にしろ。

>>654
MSDNライブラリはオフラインならいいけど、
オンラインはいいと思えない。その点manとどっちもどっち。
665デフォルトの名無しさん:2007/03/13(火) 22:33:37
>>662
そりゃ独学で一年の奴の「世界観」とやらが広いわけはないが、
お前の性格が少々アレな感じなのはそれとは全く独立の事象だ。
666デフォルトの名無しさん:2007/03/13(火) 22:35:37
匿名相手に性格云々ぬかすのはナンセンスだ
667デフォルトの名無しさん:2007/03/13(火) 22:37:45
どっから性格の話が出てくるんだよ

これだからゆとりは…
668デフォルトの名無しさん:2007/03/13(火) 22:38:01
>>654
Windowsプログラマの癖にMSDNを知らなかったらビックリするだろ? そんな感じ。
でも Linux/Unix を触ったことがないヤツなら別に知らなくてもフツー。
>>638 が驚愕してるのは >>638 が偏見と先入観に満ちてる馬鹿だから。
669デフォルトの名無しさん:2007/03/13(火) 22:39:06
どーでもいいよ
670デフォルトの名無しさん:2007/03/13(火) 22:39:36
これだからすぐ「これだからゆとりは」っていう奴は・・・
671デフォルトの名無しさん:2007/03/13(火) 22:40:13
>>670
ゆとり乙
672デフォルトの名無しさん:2007/03/13(火) 22:43:39
>>666
世界観云々を言うのはナンセンスじゃないのか?
673デフォルトの名無しさん:2007/03/13(火) 22:43:52
よく考えたら初心者向けのスレだから
別にman知らなくてもゆとりでもOKだな
674デフォルトの名無しさん:2007/03/13(火) 23:28:41
むしろ UNIX 触ってなかったら、どこで man なんて存在を知るんだ
675デフォルトの名無しさん:2007/03/13(火) 23:32:34
MSDNオフラインリファレンスくらいExpress Edition入れれば入るんだけどね。
676デフォルトの名無しさん:2007/03/13(火) 23:37:49
MSDNライブラリはExpressとは関係なく単独でダウンロードできる

そもそもExpressに付いてくるMSDNライブラリはExpress仕様で、
CRT関数や.NET Frameworkのクラスライブラリのリファレンスなんかが
すっぽり抜け落ちていて使い物にならなかったはず。
677デフォルトの名無しさん:2007/03/13(火) 23:43:47
include
678デフォルトの名無しさん:2007/03/13(火) 23:52:04
>Express仕様
要するに_s付きの関数が標準で用意されてると思いこませる仕様ってことか。
679デフォルトの名無しさん:2007/03/13(火) 23:52:43
理系の大学なら大抵ワークステーションがあって
Sun、Solarisあたり触ってると思うんだけど
man知らない人って文系でプログラミングやってるの?
680デフォルトの名無しさん:2007/03/13(火) 23:56:31
おいら8年前大学生で理系だっったけど、NT4.0でVCとか動いてたよ。
681デフォルトの名無しさん:2007/03/13(火) 23:57:29
LinuxOS入ったPCなら大量にあるけど、皆VMwareからWindows使ってます
682デフォルトの名無しさん:2007/03/13(火) 23:59:40
>>678
いや、そういう関数リファレンスみたいなものは一切無かったはず。
コンパイラオプションとかチュートリアル程度だった気がする。
今はもうMSDN ライブラリExpressはインストールしていないから、詳しくは忘れたが。

もっとも、普通のMSDNライブラリでも_s付き関数は非標準だとどこにも書いていないが。
683デフォルトの名無しさん:2007/03/14(水) 00:00:02
スレ違いですが教えて下さい
msdnライブラリのオフライン版には API のマニュアルもついているんでしょうか?

今2G超のイメージファイルをダウンロード中ですがあと7時間ほどかかりそうなので
もし API のマニュアルが含まれていないなら中断しようかと思っています
684デフォルトの名無しさん:2007/03/14(水) 00:06:14
Windows APIのことなら当然入っている。
ただし英語で良いならPlatform SDK/Windows SDKのドキュメントにも同じものが入っている。
685デフォルトの名無しさん:2007/03/14(水) 00:07:12
理系がみんなプログラミングやるわけじゃないだろ。
UNIXもそう。

在学中はプレゼン資料作成以外にコンピュータは使わず、
卒業後に趣味でプログラミング始めた俺みたいなのもいる。
686デフォルトの名無しさん:2007/03/14(水) 00:11:34
>>684
ありがとうございます
粘ってダウンロードすることにします
687デフォルトの名無しさん:2007/03/14(水) 00:23:07
>>682
ECMA規格化されたC++/CLIの規格に入ってるから
非標準というわけでもないんだよな。

それでなくともCRTのセキュア化は必要だし
688デフォルトの名無しさん:2007/03/14(水) 00:38:46
俺、理系だったけど大学linux乗せているのはなかった
研究室にはあったかもしれないが
授業とかの環境もボーランドC++3だったし
689デフォルトの名無しさん:2007/03/14(水) 03:44:51
#include <stdio.h>

void swap(int *, int *);
void printDate(int *);

main(){
int a[] = {2,4,3,5};
int n = 4;
int j, i;

printDate(a);

for(j=0; j <= n-2; j++){
for(i = j+1; i <= n-1; i++){
if(a[j] < a[i]){
swap(a+i, a+j);
printf("[%d]と[%d]を入れ替え\n",i, j);
printDate(a);
}
}
}
}

void swap(int *y, int *z){
int t;
t = *y;
*y = *z;
*z = t;
}

690689:2007/03/14(水) 03:46:34
void printDate(int *a){
int i;
for(i = 0; i < 4; i++)
printf("%2d", a[i]);
printf("\n");

return 0;
}

このソースでわからない事があります
for(j=0; j <= n-2; j++){
for(i = j+1; i <= n-1; i++){
if(a[j] < a[i]){
swap(a+i, a+j);

これらを解説お願い致します。
691689:2007/03/14(水) 03:52:54
n-2; と n-1が特にりかいできません
692デフォルトの名無しさん:2007/03/14(水) 03:56:16
>>690

3 4 2 5 (はじめ)

4 3 2 5 j=0 i=1
4 3 2 5 j=0 i=2
5 3 2 4 j=0 i=3
5 3 2 4 j=1 i=0
5 3 2 4 j=1 i=2
5 4 2 3 j=1 i=3
5 4 3 2 j=2 i=3
693689:2007/03/14(水) 03:58:34
n-1とはa[0]の事でしょうか?そしてn-2はa[1]の事でしょうか?
694689:2007/03/14(水) 04:06:24
>>692
ありがとうございました、何となく理解できました
695デフォルトの名無しさん:2007/03/14(水) 04:08:40
3 4 2 5 (はじめ)  <−最初は2 3 4 5だったねスマン

4 3 2 5 j=0 i=1
4 3 2 5 j=0 i=2
5 3 2 4 j=0 i=3 ※i=3の3がn-1
5 3 2 4 j=1 i=0
5 3 2 4 j=1 i=2
5 4 2 3 j=1 i=3 ※i=3の3がn-1
5 4 3 2 j=2 i=3 ※j=2の2がn-2 ※i=3の3がn-1
696689:2007/03/14(水) 04:11:14
>>695
実行すると始めは、2,4,3,5あのですが・・・・
697689:2007/03/14(水) 04:27:17
ひ〜もうわけがわからんです。
{2,4,3,5};に於いて、nは2、n-1とは4でn-2は3、n-3が5なのでしょうか?
そして、jとは基準値との事ですが、j+1とは何なのでしょうか?
698デフォルトの名無しさん:2007/03/14(水) 04:36:51
これだな!

2 4 3 5 (はじめ)

4 2 3 5 j=0 i=1
4 2 3 5 j=0 i=2
5 2 3 4 j=0 i=3 ※i=3の3がn-1
5 4 2 3 j=1 i=2
5 4 2 3 j=1 i=3 ※i=3の3がn-1
5 4 3 2 j=2 i=3 ※j=2の2がn-2 ※i=3の3がn-1

5 4 3 2 (結果)
699デフォルトの名無しさん:2007/03/14(水) 04:56:23
>>697
> {2,4,3,5};に於いて、nは2、n-1とは4でn-2は3、n-3が5なのでしょうか?
nは配列aの大きさで4
n-1は4-1=3, n-2=4-2=2, n-3=4-3=1
ここではそれぞれ配列aのインデックスをしめしている
a[4]={2,4,3,5}だと;
a[n-1]=a[3]=5、a[n-2]=a[2]=3、a[n-3]=a[1]=4

> そして、jとは基準値との事ですが、j+1とは何なのでしょうか?
すべての配列要素a[j] j=0, 1, 2, 3=n-1と後ろの配列要素a[j] i=j+1, j+2, ・・・n-1
を比較しa[j] < a[i]なら、つまりa[i]がa[i]より大きければa[i]とa[j]えお入れ替えるという処理
をここでしているわけです
だから、j+1というのはjのつぎ、つまりうしろという意味です

わかった?
700689:2007/03/14(水) 04:59:26
ありがとうございます、何とか理解できてはできてきましたが
nとは因みに、どの事をさすのでしょうか?要素が4つですよね?
701689:2007/03/14(水) 05:03:51
>>699
あー!更にわかってきました!あとは深く考えてみて理解を深めます

皆さん、黎明までつきあって戴き、ありがとうございました。
702デフォルトの名無しさん:2007/03/14(水) 05:05:38
>>700
ループを一回ずつ追って、配列の中身がどのように変わるか
それを机上でやってみてください
703689:2007/03/14(水) 05:10:10
もう一つ確認の質問なのですが、>>698さんの>>※i=3の3はnー1
とは、4ー1=3と考えて宜しいでしょうか?又、他のも然りですかね?
704689:2007/03/14(水) 05:11:29
>>702
はい、そうしてみまふ
705デフォルトの名無しさん:2007/03/14(水) 05:12:43
>>703
そうです
706689:2007/03/14(水) 05:17:10
更にわかったのが、ー1とはインデクスと要素を合わせる為に必要だった
んですね
707デフォルトの名無しさん:2007/03/14(水) 05:42:35
>>706
然り。
配列扱うとき個数がNなら、N-1 ってだいたい出てくる。そういう意味


(以下は余計なお節介かも試練が)

一見ややこしい i, j の範囲はこれが一番ムダがないから。
例えば 「5 と 5 を比べて、もし 5 が 5 より大きいなら……」 という無駄な処理はやりたくないっしょ?
for (j=0; j<=n-1; j++)
 for (i=j; i<=n-1; i++)
  if (a[j] < a[i]) swap...  // i=j のとき無駄な処理
708689:2007/03/14(水) 05:45:42
やはり、仕組みは理解できましたがソースで見ると、ややこしく
ちんぷんかんぷんで今一わからない…
709689:2007/03/14(水) 05:47:07
>>707
iやjがわけわからなくなってきます
710デフォルトの名無しさん:2007/03/14(水) 05:58:01
float の有効数字を小さくすることはできますか?

例えば

float f = 0.123456;
float g = 0.987654

に対して、0.123と0.988を返して欲しいんですが。
711デフォルトの名無しさん:2007/03/14(水) 06:01:30
浮動小数点と有効数字の違いが微妙なのですが、上記の例に追加すると、

float h = 98.7654;

については、98.8 にしたいです。

712デフォルトの名無しさん:2007/03/14(水) 06:20:02
sprintfで有効桁数3桁の文字列に変換して
その文字列をatofでfloatにする

float f1, f2;
char s[128];

f1 = 98.7654;
sprintf(s, "%.3g\n" , f1); /* 98.7654は文字列の"98.8"になる */
f2 = atof(s);
713710:2007/03/14(水) 06:58:27
>>712
ありがとうございました。
あやうくめんどくさい関数を自作するところでした。
714デフォルトの名無しさん:2007/03/14(水) 23:29:45
ファイルの入出力のあたりを勉強したのでファイルに文字を書き込むプログラムを
作ってみた。以下のソースはその一部でとりあえずファイルをオープンしてNULL
チェックもして以下のように処理させた。
r:;
printf("何行入力しますか?:");
scanf("%d",&j);
printf("それでは文字を入力してください。\n");
for(i=0;i<=j;i++){

gets(a);
fputs(a,fp2);
fprintf(fp2,"\n");
if(i==j&&j!=0){
printf("\t終了しますか?\n");
printf("1.はい2.続行する\n");
printf("番号:");
scanf("%d",&q);
if(q==1){
break;
}
else{
goto r;
}
}
}
とりあえずコンパイルしてもエラーは見られなかったが、scanf関数に万が一でも文字を
いれると無限にこの関数が実行してしまう。このバグを回避する方法とかを何とか・・・。
715デフォルトの名無しさん:2007/03/14(水) 23:32:43
gets!?goto!?
716デフォルトの名無しさん:2007/03/14(水) 23:34:58
gotoは構わんだろ
getsは氏ね
717デフォルトの名無しさん:2007/03/14(水) 23:38:21
fgets(buf, sizeof(buf), stdin)で文字列として受け取ってから整数に変換でおk
718デフォルトの名無しさん:2007/03/14(水) 23:40:47
別にgoto使うなとまではいわないけど、714の使い方は死すべきレベル。
ただ死んで終わるものではなく、又吉イエスによって火の中に投げ込まれるレベル。
719デフォルトの名無しさん:2007/03/14(水) 23:46:15
終了しますかの部分は、for 文から出すべきだろ
for の条件式が意味を成してない

scanf なんて使うのは、個人での練習段階だけだろうから
文字を入れられるとかは気にしなくていいんじゃない?
720デフォルトの名無しさん:2007/03/14(水) 23:58:55
何故かFORTRANを思い出した。

gotoってネストしたループ&switchからの脱出以外で、必要性ってあったっけ?
721デフォルトの名無しさん:2007/03/15(木) 00:00:41
delete やら fclose やらの終了処理を最後にまとめて、
エラーが出ればそこにすっとぶってやってる人もいるな
722デフォルトの名無しさん:2007/03/15(木) 00:01:22
do{
if(A()) break;
if(B()) break;
// :
} while(0);

なんていう汚いプログラムを書かなくてすむようになる。
723デフォルトの名無しさん:2007/03/15(木) 00:05:17
>>714
for(;;)
{
  printf(("何行入力しますか?:");
  fgets(buf, sizeof(buf), stdin);
  j = atoi(buf);
  if(j <= 0) break;
  printf("それでは文字を入力してください。\n");
  for(i=0;i<j;i++)
  {
    fgets(buf, sizeof(buf), stdin);
    fputs(buf, fp2);
  }
  printf(  "\t終了しますか?\n"
        "1.はい\t2.続行する\n"
        "番号:"
  );
  fgets(buf, sizeof(buf), stdin);
  q = atoi(buf);
  if(q != 2) break;
}
724デフォルトの名無しさん:2007/03/15(木) 00:14:31
scanfは指定した書式以外の入力は、入力バッファそのままで返ってくる
その入力をクリアしないでまたscanf呼ぶと、また同じことになる
scanfの是非以前にこの挙動は把握するべき
725714:2007/03/15(木) 00:15:43
いろいろとレスサンクス。俺がまだ未熟だったよ。
ところで俺はコマンドライン引数というのを最近勉強して知ったんだがそれを応用した実用性のあるソースをまだみたことがない。急にすまないがそのソースの例を示してくれないか?
726デフォルトの名無しさん:2007/03/15(木) 00:17:28
linuxのコマンドのソースでもみとけ
727デフォルトの名無しさん:2007/03/15(木) 00:17:38
dir c:\
728デフォルトの名無しさん:2007/03/15(木) 00:18:12
shutdown -s -t 0
729デフォルトの名無しさん:2007/03/15(木) 00:24:00
format c:
730デフォルトの名無しさん:2007/03/15(木) 00:36:17
>>725
それよりもメモリと代入を応用したソースってあるの?
731デフォルトの名無しさん:2007/03/15(木) 00:38:17
kill you
732714:2007/03/15(木) 00:41:31
>>729
それ危険w

質問の意味を取り違えているような…。例えば
int main(int argc,char *argv[]){…}
みたいにコマンドライン引数を応用した実用性のある例を示してくれないだろうか。
733デフォルトの名無しさん:2007/03/15(木) 00:44:58
#include <stdio.h>
int main(int argc, char **argc) {
for(;*argc;argc++) if(!remove(*argc)) return 1;
return 0;
}
734デフォルトの名無しさん:2007/03/15(木) 00:46:24
735デフォルトの名無しさん:2007/03/15(木) 00:50:58
>>732
たとえば、別のプロセスから起動させるときとか
実行ファイルのアイコンに処理するファイルをD&Dしたときとか
指定したスイッチによって処理方法変えたいときとか
736デフォルトの名無しさん:2007/03/15(木) 00:52:00
>>732
いや、>>729 とかがまさにそれじゃないのか?

format だってプログラムだ、
"fotmar c:" で、argc に 2 が、argv[1] には "c:" が入ってるだろう
737714:2007/03/15(木) 01:12:34
なるほどw
じゃあ、bcc32_○○.cみたいにコンパイルするのもそれってことなのか?
738デフォルトの名無しさん:2007/03/15(木) 01:20:58
気づかなかったのか・・・
739デフォルトの名無しさん:2007/03/15(木) 01:26:03
これはなんというか・・・
可哀想に見えてくるのは禁じえない
740デフォルトの名無しさん:2007/03/15(木) 03:30:53
include <stdio.h>

void printDate(int *);

main(){
int a = {9,6,5,1,2};
int n = 5;
int i,j,h,t;

printDate(a);

for(h = 1; h <= n; h = 3*h + 1)
;
h /= 3;

while(h >= 1){
for(i = h; i < n; i++){
t = a[i];
for(j = i-h; j >= 0; j-=h){
if(a[j] > t)
a[j+h] = a[j];
else
break;
}
741デフォルトの名無しさん:2007/03/15(木) 03:32:52
a[j+h] = t;
if(j+h != i){
printf("[%d]の位置に[%d]を挿入\n", j+h, i);
printDate(a);
}
}
h /= 3;
}
}

void printDate(int *a){
int i;
for(i = 0; i < 5; i++)
printf("%2d", a[i]);
printf("\n");


}
742デフォルトの名無しさん:2007/03/15(木) 03:33:59
エラー E2291 sehell.c 6: } が必要(関数 main )
エラー E2141 sehell.c 6: 宣言の構文エラー(関数 main )
エラー E2139 sehell.c 6: 宣言に ; がない(関数 main )
警告 W8070 sehell.c 6: 関数は値を返すべき(関数 main )
警告 W8004 sehell.c 6: 'a' に代入した値は使われていない(関数 main )
エラー E2190 sehell.c 6: 不要な }
エラー E2356 sehell.c 10: 'printDate' の再宣言で型が一致していない
エラー E2344 sehell.c 3: 一つ前の 'printDate' の定義位置
エラー E2258 sehell.c 10: ここには宣言が必要だが見つからない(関数 printDate )
エラー E2258 sehell.c 12: ここには宣言が必要だが見つからない(関数 printDate )
エラー E2258 sehell.c 12: ここには宣言が必要だが見つからない(関数 printDate )
エラー E2258 sehell.c 12: ここには宣言が必要だが見つからない(関数 printDate )
エラー E2258 sehell.c 14: ここには宣言が必要だが見つからない(関数 printDate )
エラー E2258 sehell.c 16: ここには宣言が必要だが見つからない(関数 printDate )
エラー E2342 sehell.c 16: パラメータ 'a' は int * 型として定義されているので und
efined は渡せない(関数 printDate )
エラー E2062 sehell.c 18: 無効な間接参照(関数 printDate )
エラー E2062 sehell.c 20: 無効な間接参照(関数 printDate )
エラー E2062 sehell.c 21: 無効な間接参照(関数 printDate )
エラー E2062 sehell.c 21: 無効な間接参照(関数 printDate )
エラー E2062 sehell.c 25: 無効な間接参照(関数 printDate )
エラー E2342 sehell.c 28: パラメータ 'a' は int * 型として定義されているので int
は渡せない(関数 printDate )
警告 W8070 sehell.c 32: 関数は値を返すべき(関数 printDate )
警告 W8057 sehell.c 32: パラメータ 'a' は一度も使用されない(関数 printDate )
エラー E2190 sehell.c 33: 不要な }
エラー E2238 sehell.c 35: 'printDate' の宣言が複数見つかった
エラー E2344 sehell.c 10: 一つ前の 'printDate' の定義位置
*** 22 errors in Compile ***

どうしても、参考書のソースと比較しても解決しませんので、ご指摘お願い致します。
743デフォルトの名無しさん:2007/03/15(木) 03:41:57
>>740
>int a = {9,6,5,1,2};
>>742
>どうしても、参考書のソースと比較しても解決しませんので、ご指摘お願い致します。

新しい参考書かメガネ買ってこい。
744デフォルトの名無しさん:2007/03/15(木) 03:45:29
>>743
できました!!サンkすです

あまり良いソースではないのでしょうか?
745デフォルトの名無しさん:2007/03/15(木) 04:09:25
何コレ……

>int a = {9,6,5,1,2};
もし、↑以外が参考書の通りだっていうのなら
まずはその著者を教えてくれ。
746デフォルトの名無しさん:2007/03/15(木) 04:27:47
高橋誠
747デフォルトの名無しさん:2007/03/15(木) 04:29:19
あとは参考書通りだし実行できます、著者は3人です
一人が今挙げた人ともう一人が渡辺さんです
748デフォルトの名無しさん:2007/03/15(木) 04:30:52
本のを描写してますし、初心者なので、こんな難しいソースは書けません
因みに解説もあまりなく全然わかりませんし…
749デフォルトの名無しさん:2007/03/15(木) 04:38:06
ソートをしてるっぽいってのは分かるんだが…

for(h = 1; h <= n; h = 3*h + 1)
;
h /= 3;

この辺り高度すぎて俺には理解不能
750748:2007/03/15(木) 04:40:21
僕にもさっぱりです
しかも途中に;が付くなんて初めて見ました
皆さんサンクスでしたノシ
751デフォルトの名無しさん:2007/03/15(木) 05:27:27
>>750
参考書丸写しする前に、もっと簡単な本で文法の基礎から勉強しろ。
752デフォルトの名無しさん:2007/03/15(木) 06:06:25
2次元配列についての質問です!

たくさんの2次元配列を使いたいときは、どうすればいいのでしょうか?
それとも、扱える配列の最大数は決まっているんでしょうか?

私の環境では、
double a[359][359];
までしか宣言できないんです。
もっと大きな配列、例えば、
a[0][0]〜a[1000][1000]
とかを使えるとうれしいのですが。
753デフォルトの名無しさん:2007/03/15(木) 06:33:07
double** a = (double**)malloc(sizeof(double*) * 1000 );
for(int i = 0; i < 1000; i++ ) a[i] = (double*)malloc(sizeof(double) * 1000 );

// 配列を用いた処理
・・・
・・・
・・・

// 配列を使い終わったら、
for(int i = 0; i < 1000; i++ ) free(a[i]);
free(a);
754752:2007/03/15(木) 06:54:16
>>753
うおっ!
それでできるんすかっ!
うはーやっぱ人に聞いてみるもんですねぇ。
まじで、まじで、ありがとうございました!
755デフォルトの名無しさん:2007/03/15(木) 07:58:37
やめた方がいいけどね。
756デフォルトの名無しさん:2007/03/15(木) 09:15:24
>>747
なんて参考書なのか教えて
757デフォルトの名無しさん:2007/03/15(木) 09:40:38
いまどき時代遅れのC言語なんてやっても意味ないの?
好きなのに・・・・
758デフォルトの名無しさん:2007/03/15(木) 11:35:45
>>757
ぃゃ、Cはすべての基本です。
OSはもちろん、サーバなどのプログラムは今でもほとんどC(C++ではない)で書かれています。
なのでCができるならそれにこしたことはないでしょう。

CというのはアセンブラなみのCPU直接操作に近いことから、
高級言語並みの隠蔽処理までできますが、
その分プログラマーの力加減で完成度が激しく変わってくる難しい言語です。
759デフォルトの名無しさん:2007/03/15(木) 11:35:57
あー、単純に1.3で割った余りを使うより効率がいいってことか、多分
760デフォルトの名無しさん:2007/03/15(木) 11:43:11
商でしたorz
761デフォルトの名無しさん:2007/03/15(木) 11:46:18
なぜ >>752 が宣言できなくて >>753 が宣言できるかわかりますか?

>>752 で宣言するとスタックエリアに配列領域を確保しようとするので、
スタックサイズを超える領域は確保できないのです。
スタックサイズはプロセス起動時にOSによって割り当てられますが
通常は1MB程度と考えたほうがよいでしょう。
WIN32の場合は1MBです(プロセス作成時にデフォルトスタックサイズを変更できますが)

この領域はさらに関数呼び出しなどで利用されるので、
ローカル変数で使える領域は更に狭く数10KB程度が上限と考えるべきです。

double変数が4バイトと仮定しても(正確には環境によって違う)
4 x 359 x 359 = 503KBとなり、スタックの約半分が消費されてしまいますから
致命的なメモリエラー(スタック不足)の元になります。
762デフォルトの名無しさん:2007/03/15(木) 12:06:24
Linuxのスタックサイズってどの程度なんでしょ?
763デフォルトの名無しさん:2007/03/15(木) 12:11:26
getrlimit
764デフォルトの名無しさん:2007/03/15(木) 12:26:34
>>763
ありがd
765デフォルトの名無しさん:2007/03/15(木) 12:36:17
>>758
サーバーのプログラムってなんですか?
766デフォルトの名無しさん:2007/03/15(木) 12:36:53
#include<stdio.h>

int main(void)
{
int no;

printf("正の整数を入力してください:");
scanf("%d", &no);

while(no>=0)
printf("%d", no--);
putchar('\n');

return(0);
}
これで改行が入らないのは何故でしょうか?
うんこな質問ですいません
767デフォルトの名無しさん:2007/03/15(木) 12:41:33
>>766
改行をどこに入れたいの?
各数字ごとなら、
printf("%d\n", no--);
とするか、
while(no>=0)
{
 printf("%d", no--);
 putchar('\n');
}
768デフォルトの名無しさん:2007/03/15(木) 12:41:39
>>766
while(no>=0)
{
printf("%d", no--);
putchar('\n');
}

769デフォルトの名無しさん:2007/03/15(木) 12:49:34
>>766
>これで改行が入らないのは何故でしょうか?

while(no>=0)
printf("%d", no--);
putchar('\n');



while(no>=0)
{
printf("%d", no--);
}
putchar('\n');

と実行されてるからだよ
770デフォルトの名無しさん:2007/03/15(木) 12:50:12
どうでもいいけどreturnは関数じゃないから ()はいらない。
付けてもいいけど、個人的には勧めない。

771デフォルトの名無しさん:2007/03/15(木) 12:53:53
return にはつけないけど、sizeof はつけちゃうんだよなあ。
関数以外で () つける場合は、空白入れるようにしてるけど。
772デフォルトの名無しさん:2007/03/15(木) 12:55:26
>>765
少なくともapache (httpサーバー) はC言語だね。
良く使われてるメールサーバも、データベースサーバもみんなC言語ですね。

過去の遺産を引き継いでいるから?それともC++に移行できない理由(パフォーマンス?)があるのでしょうか?
教えてエロイひと
773デフォルトの名無しさん:2007/03/15(木) 12:59:10
apacheがCでできてるからってC憶えたらなにかできるの?
774デフォルトの名無しさん:2007/03/15(木) 13:05:21
仕事できるんじゃない?
775デフォルトの名無しさん:2007/03/15(木) 13:06:27
>>773
こちらへ

初心者のためのプログラミング言語ガイド Part3
http://pc11.2ch.net/test/read.cgi/tech/1152778344/
776デフォルトの名無しさん:2007/03/15(木) 13:11:04 BE:15528724-2BP(222)
>>714
getsとgotoとscanfを窓から投げ捨てろ
777デフォルトの名無しさん:2007/03/15(木) 13:23:20
ダンディー坂野
778デフォルトの名無しさん:2007/03/15(木) 13:46:40
>>773
C覚えたら何かできるか、というよりも、
サーバーみたいなものを作っている人達と一緒に仕事をするなら
Cはできなきゃ話にならん、ということなんでしょうな。

普通にWEBプログラマーやってるだけならC言語知らなくても何とかなるけどね。
rubyとかphpの簡単さ加減を覚えるとCなんてマンドクセ、てなる。
779デフォルトの名無しさん:2007/03/15(木) 14:05:24
今流行のオープンソースってことでapacheをカスタマイズするってことでしょうか
780デフォルトの名無しさん:2007/03/15(木) 14:05:55
オプソ系の仕事はCのソースコード読めないとだめだろ。
781デフォルトの名無しさん:2007/03/15(木) 19:56:02
C言語は組み込みマシン用プログラムとOSとかを作るためにしぶとく生き残ると思う。
しかしOS上で動くアプリとしては段々と使われなくなっていくと思う。
782デフォルトの名無しさん:2007/03/15(木) 20:12:34
お勧めのサイトとか本とか教えてください。
783デフォルトの名無しさん:2007/03/15(木) 20:14:08
まるでOSとはGUIであるかのようなすっとこどっこいなことを……
784デフォルトの名無しさん:2007/03/15(木) 20:49:23
Cができるからって、10数年前からあるウンコプロダクトの保守要員にまわされてた。
去年一年間。
785714:2007/03/15(木) 21:04:14
>>776
gotoやscanfなら捨てられそうだが、getsはすてられそうもない。とりあえずgetsがダメな理由を。

文字をキーボードから入力し、その文字列をファイルに出力できる方法が別にあるならそれでもいいが…。
786デフォルトの名無しさん:2007/03/15(木) 21:07:29
>>785
バッファ長以上の長さの入力があったら死ぬから。

fgets(... stdin);を使う。
787デフォルトの名無しさん:2007/03/15(木) 21:17:14
                 _____
               /ミミ\\\\ \
             /ミミミ\\\\\\\
            /彡ミミミ\\\\\\\\
            |彡ミミ/\\\\\\\\|
              |彡 |   \\\\\\\|
             ヽ |へ、_  _,へ\\\\/
              | __   __  | / )    ゲッツ!!
              |           |/ ノ
              |   ( / _ )      /
              ヽ       ヽ   |
               ヽ ヽー‐‐‐ァ   /\
              //ヽ ヽ-‐'  / /\ \
            / /   ヽ_ /   / /   \
          /   \  |\  /|  /\      \
   (⌒\  /     (⌒ヽ |二| | /  \      \
 __ゝ  ヽ    ___ ゝ \  \| /   /       |
(        ヽ─ ( l )     ヽヽ  /  /   /     |
  ̄ ̄( ̄丿  |    ̄ ̄( ̄ ゝ  \ /    /       |
    ( ̄ノ  |      ( ̄ ゝ   | ̄ ̄ ̄ ̄        |
    ( ̄ノ  |       ( ̄ ゝ   |
788デフォルトの名無しさん:2007/03/15(木) 21:25:00
>>786
そういうのが標準ってあたりC言語って恐いな。
789デフォルトの名無しさん:2007/03/15(木) 21:38:58
Trust the programmer.
790デフォルトの名無しさん:2007/03/15(木) 21:39:52
レスに感謝する
>>786
getsってこわいな。とりあえずstdinでバッファオーバーランを避けられてよかったよ。
791デフォルトの名無しさん:2007/03/15(木) 21:43:19
>>789
getsはプログラマではなくユーザの信頼性の問題だろうが。こいつらは絶対に信じられないが
792デフォルトの名無しさん:2007/03/15(木) 21:48:56
>>791
C言語って怖いな、への(ネタ)レスであってgetsどうこう言いたいんじゃなかとです…
793デフォルトの名無しさん:2007/03/15(木) 21:56:32
信頼したいけど信頼できないよね。
794デフォルトの名無しさん:2007/03/15(木) 23:07:54
>>783
Cはアプリ作成用言語としては廃れて行ってるだろう。
UNIX系OSはかなり前からその傾向強かったしな。CGIが
Perlばかりだったのはそのせいでもある。ちょっとした
プログラムならわざわざCで作らずにシェルスクリプトや
sed, awk, perl などのスクリプトで作るというのがUNIX系
OSでは普通だった。Cで作るとしたら高速に動かしたい
とか効率良く動かしたい場合、あるいはソースを見せ
たくない場合だ。(GUIはスクリプトが対応していなくて
Cでしか作れないという場合もあったが)
795デフォルトの名無しさん:2007/03/15(木) 23:12:02
なんか話しずれてね?
796デフォルトの名無しさん:2007/03/15(木) 23:24:10
はなししどころか、認識もずれているようだ。
Unix系で「ソースを見せたくないからC」なんて有り得ない。
797デフォルトの名無しさん:2007/03/15(木) 23:27:35
>>794
>GUIはスクリプトが対応していなくて
つ Tcl/Tk
798デフォルトの名無しさん:2007/03/15(木) 23:28:59
昔もプロプリなUNIXでは結構あったんじゃないの。
今ではLinux界隈でもバイナリのみ配布とかあるし。
799デフォルトの名無しさん:2007/03/15(木) 23:30:15
スクリプト言語でもソースを見せたくなければどうにでもなるのがUnix流。
800デフォルトの名無しさん:2007/03/16(金) 03:58:21
>>794
むしろWinのほうがCの使用はすたれてるだろ。
sed、awkでは普通文字列処理しかできんし。
ていうかUN*Xのプログラムは今でもかなり多くがCだぞ
>GUIはスクリプトが対応していなくて
つ pygtk

とネタにマジレスてみるテスト
801デフォルトの名無しさん:2007/03/16(金) 06:37:06
CのほうがJavaより使ってて面白いと思いませんか?
802デフォルトの名無しさん:2007/03/16(金) 08:46:42
プログラミング暦が浅いんだけど、Cでろくに複雑なプログラムを書いたことがないまま
オブジェクト指向に慣れてコードの拡張性あげていくのが楽しくなってきたので
いまからC流でコードを書けといわれてもどうしていいかわからない
803デフォルトの名無しさん:2007/03/16(金) 11:12:31
そりゃあろくにプログラム書いてないだけだよ
804デフォルトの名無しさん:2007/03/16(金) 15:29:09
C++がある
805デフォルトの名無しさん:2007/03/16(金) 15:47:33
girl?
806デフォルトの名無しさん:2007/03/16(金) 19:16:56
VC++ & MFCで地獄めぐり!
807デフォルトの名無しさん:2007/03/16(金) 21:21:08
BCCでbyte型を右シフトしたりすると
変換によって有効桁が失われるって警告出るんですが、
わざと消すためにやってるわけで
出ないようにする方法はありませんか?
808デフォルトの名無しさん:2007/03/16(金) 21:25:52
>>807
#if defined(__BORLANDC__)
#pragma warn -????
#endif

BYTE hoge = ...
hoge >>= n;

#if defined(__BORLANDC__)
#pragma warn .????
#endif

????にはその警告とやらの番号を当てはめてくれ。
809デフォルトの名無しさん:2007/03/16(金) 21:37:35
>>807
多分、その警告はシフト演算の際に byte 型とやらが int に昇格され、
演算後に再びその byte 型に代入される際に出ている警告。
明示的に

BYTE hoge = ...
hoge = (BYTE)(hoge >> n);

とかやってやると警告はでなくなると思う。
810デフォルトの名無しさん:2007/03/16(金) 22:36:15
質問です。system()関数でcopy aaa.txt+bbb.txt sum.txtのような
もののファイル名の指定をchar配列で指定したいのですがいい方法は
ありませんでしょうか。例えばsystem("copy hairetu +sum.txt sum.txt");
みたいにしたいのですがやり方がわかりません。どなたかご教授ください。
811デフォルトの名無しさん:2007/03/16(金) 22:38:22
っstrcat
812デフォルトの名無しさん:2007/03/16(金) 22:39:15
>>810
ファイル名部分を可変にしたいってことならsprintf。
813デフォルトの名無しさん:2007/03/16(金) 22:39:22
sprintfと言って欲しいのかコノヤロウ。
814デフォルトの名無しさん:2007/03/16(金) 22:41:13
あいう<>ほげ<>123
というような、ありがちな<>で区切られたデータを
構造体に格納したいですが、どういう風にすればよいのか
いまいちよくわかりません。 教えてください
815デフォルトの名無しさん:2007/03/16(金) 22:44:43
>>814
つ[sscanf(string, "%[^<]<>%[^<]<>%d", ...)]
816デフォルトの名無しさん:2007/03/16(金) 22:44:43
左から順に読んでいって '<', '>' の並びを見つけたらそこまでをコピーする。
817デフォルトの名無しさん:2007/03/16(金) 23:02:30
>>815-816
ありがとうございました。

また、sscanfの知らない使い方があったみたいなので
それについて調べてみます。
818デフォルトの名無しさん:2007/03/16(金) 23:12:00
char d[3][256];
sscanf("1<2<>2<>3", "%[^<]<>%[^<]<>%s",d[0], d[1], d[2] );
printf("%s\n%s\n%s\n", d[0], d[1], d[2]);
$./a.out
1


$
819デフォルトの名無しさん:2007/03/16(金) 23:48:45
>>808-809
dクスです。
820デフォルトの名無しさん:2007/03/17(土) 01:47:18
>>815
バグだらけでした<>
821デフォルトの名無しさん:2007/03/17(土) 06:10:08
char *gettok (char **line)
{
char *new;
if(s=strstr(*line,"<>")){
new = calloc(1, s-*line+2);
strncpy(new, *line, s-*line+1);
*line = s+2;
return new;
} else {
return NULL;
}
}
main()
{
//line に読みこむ
while (token = gettok(&line)){
//token をどうにかする
}
}
822デフォルトの名無しさん:2007/03/17(土) 09:35:44
#include <stdio.h>
int main(void) {
int a[10] = {1,2,3,4,5,6,7,8,9};
int i;
FILE *fp;
fp = fopen("test2.txt","wb");
if(fp == NULL){
return 1;
}else{
printf("open\n");
}
for(i = 0; i < 10; i++){
fwrite(&a[i],sizeof(a[i]),1,fp);
}
fclose(fp);
return 0;
}
fwrite()の部分なのですが、a[i]とするとコンパイルエラーで、パーラメター'_ptr'
はconst void * 型として定義されているのでint型は渡せないと出ます。
配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
&をつけるのでしょうか?
823デフォルトの名無しさん:2007/03/17(土) 10:26:11
なぜ
1 % 10が1になり2 % 10が2になり これをfor文で25になるまで繰り返すとすると
123456789012345678912345となるのでしょうか?
もしかして算数ですか?悔しい・・・

#include<stdio.h>

int main(void)
{
int no, i;

printf("整数を入力");
scanf("%d", &no);

for(i=1;i<=no;i++)
printf("%d", i%10);
putchar('\n');

return 0;
}
824デフォルトの名無しさん:2007/03/17(土) 10:27:12
>>822
a ← アドレス
a[i] ← 値
&a[i] ← アドレス
825デフォルトの名無しさん:2007/03/17(土) 10:29:10
>>823
なぜも何も、それが % 演算子だ
% って何か知ってる?
826デフォルトの名無しさん:2007/03/17(土) 10:34:15
割った数の剰余を表示する
827それはBasic:2007/03/17(土) 11:11:16
えっ、%って整数除算じゃないんですか?
828デフォルトの名無しさん:2007/03/17(土) 11:12:58
除算は /
829それはBasic:2007/03/17(土) 11:16:24
>>828
だからそれは実数除算でしょ。
830デフォルトの名無しさん:2007/03/17(土) 11:18:43
831デフォルトの名無しさん:2007/03/17(土) 11:26:27
>>829
Cでは、整数を整数で割るだけで整数除算になるので専用の演算子はない。

832デフォルトの名無しさん:2007/03/17(土) 11:26:27
>>829
生きるがよい
833デフォルトの名無しさん:2007/03/17(土) 13:23:07
ライブラリによく使われている
*dest  *src  はそれぞれ何の略なのか教えて欲しい
834デフォルトの名無しさん:2007/03/17(土) 13:23:43
destination
source
835デフォルトの名無しさん:2007/03/17(土) 13:26:26
*srcはsourceだったのか orz
ありがとうございました
836デフォルトの名無しさん:2007/03/17(土) 13:29:58
勢いよく答えたのはいいが合ってんのかどうか自信ないや
837デフォルトの名無しさん:2007/03/17(土) 13:46:53
あってるお。
838デフォルトの名無しさん:2007/03/17(土) 17:05:17
間違ってないお
839デフォルトの名無しさん:2007/03/17(土) 22:03:33
キャリア20年以上の人に同じような事聞かれてビビった記憶がある
840デフォルトの名無しさん:2007/03/18(日) 03:11:08
mallocとcallocという関数があるが、
個人的にはcallocの0クリアがされてた方が
バグもあまり発生せず、なんだか扱いやすい気がするんだけど、

なんか考え方が間違ってます?
841デフォルトの名無しさん:2007/03/18(日) 03:16:53
だれも人の心まで干渉することはできない
決まりごとでもない限りどーでもいい部分だな
842デフォルトの名無しさん:2007/03/18(日) 03:24:31
ちゃんと設計していれば0クリアされていようがいまいが
バグにはならんような気がする。

0クリアされている必要なんて無い場合も多いし。
843・∀・)っ-○◎●:2007/03/18(日) 03:25:24
逆にいうと、callocを使わないとバグが発生し、
その原因となる箇所がよくわかってないってことだろ?
むしろそれが問題だ

ちなみにcallocは内部でmallocでメモリ確保したものをmemsetで
ゼロクリアしてから返してる。
メモリアロケーションの方法は1種類じゃないんだから、むしろゼロクリアが
必要なときに的確にする癖をつけたほうがいい。
844デフォルトの名無しさん:2007/03/18(日) 04:03:03
わからないけどこうすればOK!で
オカルトな法則やルールができていくんだよなー
845デフォルトの名無しさん:2007/03/18(日) 04:32:47
mallocとcallocで一方が0クリアとかが迷惑なんじゃね。
static変数とか
846デフォルトの名無しさん:2007/03/18(日) 09:16:08
callocの0クリアとstatic変数の0が入っているのは全く意味が異なる。
847810:2007/03/18(日) 11:14:08
ありがとございます!!
848デフォルトの名無しさん:2007/03/18(日) 11:36:05
二次元配列の大きさを取得したいのですがどうしたらいいのでしょうか?
test[6][7] だったら、「7」を取得したいのですが、

int l
l=strlen(test[0])
printf("%d",l);

ではうまくいきません
849デフォルトの名無しさん:2007/03/18(日) 11:40:34
>>848
それが本当に二次元配列なら、sizeof(test) / 6。
まぁ、定数か変数で覚えておけと。
850デフォルトの名無しさん:2007/03/18(日) 11:41:04
sizeof test[0]
851デフォルトの名無しさん:2007/03/18(日) 11:44:42
>>848
マジックナンバーであることが根本的に問題じゃないか?
852デフォルトの名無しさん:2007/03/18(日) 11:45:55
>>849
sizeofで解決できました ありがとうございました
853デフォルトの名無しさん:2007/03/18(日) 11:46:14
>>851
例として出してるだけだろ
854デフォルトの名無しさん:2007/03/18(日) 11:48:11
じゃあ別の解決も望めるわけだな
855デフォルトの名無しさん:2007/03/18(日) 12:00:13
int a[6][7];
assert(sizeof a[0] / sizeof a[0][0] == 7);
assert(sizeof a / sizeof[0] == 6);

856デフォルトの名無しさん:2007/03/18(日) 12:00:15
C言語でお勧め本ありますか?ポインタや構造体あたりを基礎からしっかりやりたいもので。
現在は、やさしいCを使ってるのですが、正直微妙ですね。ほとんど「おまじない」とかで
なんでこうなるかということが書かれていない。
独習Cが結構評判いいみたいなのですが、中身をみたら文字だらけでメモリのこと
など載っていないかんじでしたけど、どうですか?初心者にとっては理解しやすいものですかね??
なにかお勧めあったら教えて下さい。
857デフォルトの名無しさん:2007/03/18(日) 12:02:20
アセンブラの勉強でもしとけ
858デフォルトの名無しさん:2007/03/18(日) 12:06:33
oreillyにアセンブラの本なさそうだな
859デフォルトの名無しさん:2007/03/18(日) 12:08:15
>>856
K&Rプログラミング言語C第2版
これ以外読まなくていい
860デフォルトの名無しさん:2007/03/18(日) 12:10:01
ポインタや構造体の基礎って言っても、入門書に書いてある以上の基礎なんていらないだろ。
861デフォルトの名無しさん:2007/03/18(日) 12:26:41
みなおしたら、へんなこと書いてた。
assert(sizeof a / sizeof[0] == 6); は
assert(sizeof a / sizeof a[0] == 6); の間違い。
862デフォルトの名無しさん:2007/03/18(日) 12:49:47
#define numof(a) (sizeof(a) / sizeof((a)[0]))
...
l = numof(test[0]);

↑でもいいけど、↓こっちのほうがいいよな

#define WIDTH 7
#define HEIGHT 6
..
int test[HEIGHT][WIDTH];
..
l = WIDTH;
863デフォルトの名無しさん:2007/03/18(日) 13:08:06
WIDTHって何て読むんですか?うぃどす?
864デフォルトの名無しさん:2007/03/18(日) 13:08:58
widθ
865デフォルトの名無しさん:2007/03/18(日) 13:11:28
俺は 0 が気持ち悪いから

#define numof(array) (sizeof (array) / sizeof *(array))

ってしてる。

>>862
> こっちのほうがいいよな
まあ、一長一短だな。
866デフォルトの名無しさん:2007/03/18(日) 13:19:18
場合にもよるが、

#define lengthof(a) (sizeof (a) / sizeof *(a))
#define WIDTH 7
#define HEIGHT 6

int test[HEIGHT][WIDTH]; /* testはHEIGHTとWIDTHの2次元配列。*/

/* コードの意図がHEIGHTとWIDTH分表示なら */
 for (i = 0; i < WIDTH; i++) {
  for (j = 0; j < HEIGHT; j++) {
   printf("%d\n", test[i][j]);
  }
 }

/* testの全要素表示という意図なら、*/
 for (i = 0; i < lengthof(test); i++) {
  for (j = 0; j < lengthof(test[i]); j++) {
   printf("%d\n", test[i][j]);
  }
 }

設計意図をコードに直接反映させることが重要かと思う。
867デフォルトの名無しさん:2007/03/18(日) 13:25:41
>>866
> testの全要素表示という意図なら
こんな状況、Cならありえないんじゃない?
コンパイル時にスコープの届かない範囲の配列はポインタと等値になるわけだから、要素長を伝えないといけない(=sizeof は使えない)
そうではなく、スコープの届く範囲の配列は WIDTH と HEIGHT が分かっているんだから sizeof を使う必要はない

やっぱり配列に対して sizeof するのは、コンパイル時に要素長が解決する場合かなと思う
868デフォルトの名無しさん:2007/03/18(日) 13:36:11
上のコードだと、int test[WIDTH][HEIGHT]を見て初めて全部というのがわかる。
下のコードだと、見なくても全部ということがわかる。

なんていっても、結局はtestが2次元配列なのかどうかもtestの定義をみて
初めてわかるからどっちでもいいかといえば、どっちでもいいかもね。
869デフォルトの名無しさん:2007/03/18(日) 14:12:00
問題は、固定長配列のまま使うケースが実務では少ないことだ。
870デフォルトの名無しさん:2007/03/18(日) 16:37:07
void Function(unsigned char (*Layer)[20*20]);

int main(void)
{
unsigned char[10][20*20];

}

void Function(unsigned char (*Layer)[20*20])
{

Layer[0][5]=123;//値の代入が出来る

}

2次元配列の関数渡しはこれで出来るんですが疑問があります。
今、ここで2次元配列の大きさは[10][20*20]だったのですが、
この[20*20]をユーザーが入力した値で確保したいのですが
その場合の関数渡しはどうしたらよいのでしょうか?。
画像処理プログラミングで、縦と横の長さが20*20で表現しています。
固定されていれば[4167*4167]でもいいのですがここがユーザーの入力で
変わってしまうときどうやって関数で渡したらいいかということです。
871デフォルトの名無しさん:2007/03/18(日) 16:38:34
void Function(unsigned char (*Layer)[20*20]);

int main(void)
{
unsigned char Layer[10][20*20];

}

void Function(unsigned char (*Layer)[20*20])
{

Layer[0][5]=123;//値の代入が出来る

}

すいません こうでした
872デフォルトの名無しさん:2007/03/18(日) 16:46:35
void Function(unsigned char**);
873デフォルトの名無しさん:2007/03/18(日) 16:53:54
>>872かもしくは自分で構造体とそれのアクセサを定義する
874デフォルトの名無しさん:2007/03/18(日) 17:04:38
1次元配列にしてまうというのも無難。
875デフォルトの名無しさん:2007/03/18(日) 17:10:52
C言語をある程度理解すれば、プログラマとしてそれなりにやっていけますか?

基本情報技術者合格すればまあまあですか?
876デフォルトの名無しさん:2007/03/18(日) 17:14:45
>>874
それに賛成。
というかサイズが固定ではない場合それ以外の方法ある?

void Function(unsigned char * Layer, int width, int height);

1次元配列でも2次元配列でも
それは1つの連続したメモリであることを利用する。
877デフォルトの名無しさん:2007/03/18(日) 17:15:16
>>875
> C言語をある程度理解すれば、プログラマとしてそれなりにやっていけますか?
NO
> 基本情報技術者合格すればまあまあですか?
NO

次の患者さんどうぞ〜
878デフォルトの名無しさん:2007/03/18(日) 17:16:17
あれ、関係ないけど
int a[1][1]
の時のaって、int*だっけ?int**だっけ?
879デフォルトの名無しさん:2007/03/18(日) 17:17:27
>>877

ソフトウェア開発技術者くらいになれば、プログラマとしてやっていけますか?

どれくらいできればやっていけるのでしょうか?
880デフォルトの名無しさん:2007/03/18(日) 17:21:41
>>875

プログラマって職業あるのかな。
情報処理の試験と実際の仕事は違うしな。

いまどきC言語が少々程度判った程度ゴロゴロいるだろうし。

他人の作ったプログラムのバグ取したり
機能拡張したりしなければいけない。
その際元あるコードがスパゲッティーで納得いかなくても
自分の付け足したコードが悪いのか元あるコードが悪いのか示すため
元あるコードを消さずに残しておかなければいけないとか。

何かよくわからない説明でプログラムを作らなければいけないとか。

テストを数百件やったとか
バグ発見した件数を毎日数えて
日々少しずつバグが減っているグラフを見せて仕事していることを主張したり。
881デフォルトの名無しさん:2007/03/18(日) 17:21:56
>>878
最外周の配列がポインタになる。
そう書けばわかりやすいが、Cの宣言の構文がアレなんで、int (*)[1]。
882デフォルトの名無しさん:2007/03/18(日) 17:23:01
>>881
thx
883デフォルトの名無しさん:2007/03/18(日) 17:25:05
>>879

プログラマになってから日々勉強じゃないの。
今すぐプログラマになっていいよ。

ちなみに俺はソフトウェア開発技術者試験はまったくだめだ。
さっぱりわからん。
884デフォルトの名無しさん:2007/03/18(日) 17:29:40
>>879
面倒だからといって変数名が全部
1文字で意味わかんないようなプログラムを書いちゃ駄目とかそういうことが大事だな。
int a,b,c,d,e,f;

経験積んでメモリ破壊や解放漏れを起こしにくいように心がけたり
テストやデバッグの効率を上げるとかだな。

じゃないとデスマーチで体壊すよ。
885デフォルトの名無しさん:2007/03/18(日) 17:29:40
>>879
上司がまともならその人の能力に合わせた仕事をくれるよ
C言語以外にも言語ができる奴には、幅広い仕事くれるし
テストしかできないやつは一生テスト要員
当然評価=給料にも差がつくし、出世にも差がつく
早い話が毎日勉強

ちなみに新入社員をみてる感じこの業界に馴染めない奴は、
一年持たずに辞めていく。一年持てば大丈夫やっていけるよ
886デフォルトの名無しさん:2007/03/18(日) 17:31:56
>>876
配列のポインタ配列という形なら、可能といえば可能。
887デフォルトの名無しさん:2007/03/18(日) 18:02:27
>>883
>>884
>>885
なんていうか。丁寧にありがとうね。

試験と実際の仕事は違うってよく聞くけどさ。
じゃあ、アプリケーションエンジニアって資格を取ったら、それはどれくらいの価値あるの・
これくらいの資格だとやはり凄いの?
888デフォルトの名無しさん:2007/03/18(日) 18:06:51
C言語の事を聞けよ
889デフォルトの名無しさん:2007/03/18(日) 18:09:28
じゃ、C言語の質問です。

基本情報れべるの学習が終わったあとは

独習Cで勉強するか、共立出版から出てる聖書で勉強するか悩んでるんですが、
どっちで勉強するのがいいでしょうか?
正直いって、基本情報レベルのCって簡単ですね
890デフォルトの名無しさん:2007/03/18(日) 18:11:47
神よ、この愚かなものをもお導きください
アーメン
891デフォルトの名無しさん:2007/03/18(日) 18:12:33
>>889
どっちがいいかは個人の好みがあるからなんとも言えないね
2,3ページ読んで判りやすい方で勉強するのがいいよ
ちなみに自分だったら両方読むかな(良書だし)
892デフォルトの名無しさん:2007/03/18(日) 18:16:00
C,Python,C++,C#,Java,Perl,JavaScript,JSP,EJP,サーブレット,Ruby,PHP,COBOL,アセンブラ,VB


こんなにたくさんの言語を勉強しないといけないのですか?この中から大事なのを選ぶとしたら何ですか?
893デフォルトの名無しさん
>>892
LISPはどーした?
Prologは?
そんなに似通ったパラダイムの言語したって面白くないよ?