C言語なら俺に聞け(入門篇) Part 9
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/03/08(木) 01:16:57・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
0002デフォルトの名無しさん
2007/03/08(木) 01:18:400003デフォルトの名無しさん
2007/03/08(木) 01:29:100004デフォルトの名無しさん
2007/03/08(木) 01:48:39プリプロだよ、馬鹿!
0005デフォルトの名無しさん
2007/03/08(木) 02:06:120006デフォルトの名無しさん
2007/03/08(木) 03:21:450007デフォルトの名無しさん
2007/03/08(木) 08:20:00Turbo C++ のヘルプにはプリプロセッサ指令と書いてあった気がする。
いつの間にか全部横文字にするのが広まったみたいだが、長過ぎて良くない。
0008デフォルトの名無しさん
2007/03/08(木) 08:34:170009デフォルトの名無しさん
2007/03/08(木) 10:08:150010デフォルトの名無しさん
2007/03/08(木) 10:10:37参考書を読破するのが先ですか
読みながらソース書くのがいいですか?
自分は後者なんですが、この調子だと、終わるのがいつになるのか・・・
最終的にはネットワークプログラミングをしたいです。
一応TCP(UDP)/IP、IPv6、VoIP関係の本は何冊か読破してパケットキャプチャ
やsyslogに出てくるログは理解できます。
WinXPとDebian使っています。
どなたかご教授を。
001110
2007/03/08(木) 10:11:56Cにこだわらなくてもいいでしょうか?
0012デフォルトの名無しさん
2007/03/08(木) 10:17:02最終的にはネットワークプログラミングをしたいなら
C にこだわらないほうが良い
ソケットとか文字列処理とかが楽な言語をオススメする
0013デフォルトの名無しさん
2007/03/08(木) 10:19:28読破し終わってどっこいしょと手を動かし始めるよりは、動かして
引っかかりながら覚えた方がいいと思う。
言語について
どんな言語でプログラムを書くにせよ、TCP/IPはもちろん、
ファイルディスクリプタとかUNIXシステムコールの知識はあったほうがいい。
言語としてのCの知識もあることが前提になってるし。
0014デフォルトの名無しさん
2007/03/08(木) 11:56:170015デフォルトの名無しさん
2007/03/08(木) 12:33:24英文法を覚えるよりも片言ででも喋った方が上達するのは蓋し当然だ。
0016デフォルトの名無しさん
2007/03/08(木) 14:19:20objファイルとか実行ファイルを削除した上でmakeしなおすと
うまくいくということを何度も経験するんですが、
これは何が原因でこういうことになっていますか?
0017デフォルトの名無しさん
2007/03/08(木) 14:21:27makefile が正しく書かれていない可能性大
0018デフォルトの名無しさん
2007/03/08(木) 14:24:580019デフォルトの名無しさん
2007/03/08(木) 14:31:030020デフォルトの名無しさん
2007/03/08(木) 16:54:53C++ならstd::map がありますが、こういうことをgccでやりたいのですが...
int map[MAX_MAP];
b = map[a];
だと早いのですがaの値が-32768〜32767の範囲で100個くらいの値をとるので
メモリ効率を考えるとムリポです。
0021デフォルトの名無しさん
2007/03/08(木) 16:58:49100個程度なら配列の中身と逐次比較していけばおk
登録回数に比べて検索回数が多いならソートしてから bsearch でおk
0022デフォルトの名無しさん
2007/03/08(木) 17:07:360023デフォルトの名無しさん
2007/03/08(木) 17:13:26うほ。さっそく�dクスです。
ハッシュテーブルむずかしす(;´Д`)
bsearchでやってみます。
ありがとうございまぷ。
0024デフォルトの名無しさん
2007/03/08(木) 17:36:34別にgccでもstd::mapを使えばよいのでは?
0025デフォルトの名無しさん
2007/03/08(木) 17:41:460026デフォルトの名無しさん
2007/03/08(木) 17:53:58std::mapはRed-Blackツリーとかの高度なアルゴリズムでマップを
作ってるはずなので、最初は見て理解しようとしなくていいからな。
0027デフォルトの名無しさん
2007/03/08(木) 17:58:46Cとコマンドプロンプトどっちを先にやったらいいですかね?
002820
2007/03/08(木) 18:05:28そのとおりです。
g++が使えれば楽なのですがgccでC言語がりがり書いてます...
オープンソースとか、いまでもgccなものが多いですよね?
サーバソフトなどであまりg++が使われないのはパフォーマンスの問題でしょうか?
0029デフォルトの名無しさん
2007/03/08(木) 18:19:230030デフォルトの名無しさん
2007/03/08(木) 18:20:35どっちも真だよ
0031デフォルトの名無しさん
2007/03/08(木) 18:20:53kwsk
0032デフォルトの名無しさん
2007/03/08(木) 19:11:46気になるwww
0033デフォルトの名無しさん
2007/03/08(木) 19:36:51コンパイラコレクションのことを指すときには
大文字でGCCと書いていることが多い気がする。
003410
2007/03/08(木) 20:39:01参考になりました。
まずCを参考書を読みながら勉強することにします。
それから違う言語に行きます。
>>15さんのアドバイス、理にかなっています。
そういわれると「なるほど」と(よい意味で)納得できます。
皆さんありがとうございました。
0035デフォルトの名無しさん
2007/03/08(木) 20:41:33誰も言ってないようなんで、言っとくと
C言語の一番の上達は、「良い指導者を見つける事」だったりする
なかなか居ないけどね
0036デフォルトの名無しさん
2007/03/08(木) 20:43:00#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 = "鈴木";のところで、左辺の値が必要
とでるのですが、どういうことでしょう?
0037デフォルトの名無しさん
2007/03/08(木) 20:45:22strcpyを使いな。
0038デフォルトの名無しさん
2007/03/08(木) 20:45:48strcpy
003910
2007/03/08(木) 20:51:16char は1バイトしか記憶できないのでは?
ごめんなさいごめんなさいごめんなさい
0040デフォルトの名無しさん
2007/03/08(木) 20:52:15すみません
0041デフォルトの名無しさん
2007/03/08(木) 20:52:52合ってます。大正解です。
おめでとうおめでとうおめでとう
004210
2007/03/08(木) 21:03:56立て続けにもう一つだけお願いします
winXPとDebianでCの勉強はどちらが良いと思いますか?
0043デフォルトの名無しさん
2007/03/08(木) 21:11:16>>37
まだポインタまで勉強してないもので・・・。構造体配列の勉強の途中でした。
strcpyもまだ勉強してないっす・・・・・。ほんと初歩の初歩しかまだやって
いないので。。調べてやってみます。
貴重なアドバイスありがとうございました。
0044デフォルトの名無しさん
2007/03/08(木) 21:12:05個人的な感想
WinXP ならコンパイラに bcc 使うとコンパイル時のエラーメッセージが分かりやすいと思う(但し、最初の設定でつまづく人が多い)
VisualC++Expressは使ったこと無いのでコメントできない
Debian だと OS のインストール時にコンパイラがインストールされてる(されてないかも知れない^^;)
ので、いきなり使えて余計なことを考えなくても済む
0045デフォルトの名無しさん
2007/03/08(木) 21:21:57>但し、最初の設定でつまづく人が多い
決して難しい設定ではないんだけどねぇ。
でも、うっかり半角スペースを含むパスにインストールしちゃったら
プログラミング自体が初めてって人は問題の原因がわかんなくて
確実に挫折するだろうね。
0046デフォルトの名無しさん
2007/03/08(木) 21:24:27というのは、最近、何気なくC言語に関するサイトを見ていたら面白そうに感じてしまい、
今実際に勉強している最中なのですが(と言ってもまだ2日目)
0047デフォルトの名無しさん
2007/03/08(木) 21:27:43普通文字列処理一通り済ませてから構造体に行かない?
0048デフォルトの名無しさん
2007/03/08(木) 21:31:29職業の種類の割に役立つのはC言語よりもExcelVBAだと思う
C言語はたしかに面白いけど、職業のメインに据えるのは止めたほうがいい
簡単なツールを作るくらいはするが、ほとんど趣味でやってる
0049デフォルトの名無しさん
2007/03/09(金) 01:07:35c:\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 )
005049
2007/03/09(金) 01:08:20nFile )
警告 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 が参照)
ご指摘、宜しくお願い致します。
0051デフォルトの名無しさん
2007/03/09(金) 01:19:37void openFile(void); // プロトタイプ宣言
0052デフォルトの名無しさん
2007/03/09(金) 01:19:440053デフォルトの名無しさん
2007/03/09(金) 01:21:19行数書いてあるんだから一つずつつぶして池よアホ
0054デフォルトの名無しさん
2007/03/09(金) 01:22:22数字の入力を求めて、下3桁を取るにはどうしたら良いのでしょう?
0055デフォルトの名無しさん
2007/03/09(金) 01:22:400056デフォルトの名無しさん
2007/03/09(金) 01:31:460057デフォルトの名無しさん
2007/03/09(金) 01:32:160058デフォルトの名無しさん
2007/03/09(金) 01:35:220059デフォルトの名無しさん
2007/03/09(金) 01:36:390060デフォルトの名無しさん
2007/03/09(金) 01:37:350061デフォルトの名無しさん
2007/03/09(金) 01:39:34006249
2007/03/09(金) 01:39:44c:\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 が参照)
これらが、どうしてもわかりません・・・ので
ご指摘、お願い致します。
0063デフォルトの名無しさん
2007/03/09(金) 01:41:48エラーはプロトタイプ宣言の関数名と実際の関数名が違ってるんだろ。
0064デフォルトの名無しさん
2007/03/09(金) 01:45:14何だこの変なインデントは
mainの}が見つからないかと思った。
> 警告 W8070 buf.c 43: 関数は値を返すべき(関数 main )
main()て書いたらとりあえず
int main()て思われてしまうので
return int型;
が必要でしょう。
というか省略しないようにしましょう。
0065デフォルトの名無しさん
2007/03/09(金) 01:47:38>警告 W8060 buf.c 109: おそらく不正な代入(関数 closeFile )
どこが109行目かわからないので推測だ。
if(ans[0] = 'y')
比較する式じゃないからわろうな。
if(ans[0] == 'y')
のまちがえじゃないのか。
0066デフォルトの名無しさん
2007/03/09(金) 01:49:55警告 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が宣言されているし使用しているが存在しない。
0067デフォルトの名無しさん
2007/03/09(金) 01:54:46この*fplと*fpsってどのような命令なのでしょうか?
ググっても出てこなかったのでどなたか教えていただけると幸いです
006849
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さんの仰る通り、それが解決できませんので
どうすれば解決しますでしょうか?入門書の解説には
このサンプルソースしかありません・・・・・
0069デフォルトの名無しさん
2007/03/09(金) 01:56:48お前が関数定義のところでtypoしてるんだって。
よく見直せよ
0070デフォルトの名無しさん
2007/03/09(金) 01:59:00FILE * fpl;
FILE * fps;
両方ともFILE構造体へのポインタという変数ですね。
0071デフォルトの名無しさん
2007/03/09(金) 02:01:19他人のプログラムの無い物までは私にはわかりません。
showHelpとShowHelpがあやしい。
0072デフォルトの名無しさん
2007/03/09(金) 02:11:02回答ありがとうございます。
ファイルポインタは分かるんですが、lとsが付く事で何が変わるのでしょうか?
ド素人で申し訳ありません。
0073デフォルトの名無しさん
2007/03/09(金) 02:12:18int is;
lとsが付く事で何が変わるのでしょうか?
0074デフォルトの名無しさん
2007/03/09(金) 02:14:14ファイルストリームでググレ
0075デフォルトの名無しさん
2007/03/09(金) 02:14:34なるほど。
回答本当にありがとうございます。感謝です。
0076デフォルトの名無しさん
2007/03/09(金) 02:15:06lとsがつかなかったら
int i;
int i;
iが2つあるのでコンパイルエラーになる。
変数名の最後の文字lとsに特別な意味はないし、
変数名の最初の文字iにも特別な意味はない。
0077デフォルトの名無しさん
2007/03/09(金) 02:16:01ありがとうございます。
参考にさせていただきます。
0078デフォルトの名無しさん
2007/03/09(金) 02:16:080079デフォルトの名無しさん
2007/03/09(金) 02:16:09i1もisも名前だからなんも変わらん。データを格納する箱を任意で付けてるだけだから。
0080デフォルトの名無しさん
2007/03/09(金) 02:17:39今でもFILE*をfplとかfpsなんて変数名にしてる例があるのか。
0081デフォルトの名無しさん
2007/03/09(金) 02:18:55008249
2007/03/09(金) 02:22:15c:\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
0083デフォルトの名無しさん
2007/03/09(金) 02:24:07だからお前がタイプミスしてんだと何度言えば分かるんだ
0084デフォルトの名無しさん
2007/03/09(金) 02:24:53アルゴリズムに夢中でそれ以外は手抜き。
俺は手抜きばかりなので判らなくもないけどね。
008549
2007/03/09(金) 02:26:330086デフォルトの名無しさん
2007/03/09(金) 02:27:26まあ、gotoLineがありませんとか、enterFileNameがありませんとかは、
他人のプログラムなので俺にはわからないよ。
enterFileNameとentrFilenameがよく似てるね。
0087デフォルトの名無しさん
2007/03/09(金) 02:28:030088デフォルトの名無しさん
2007/03/09(金) 02:29:47mainのみとか、()として(void)ときちんと書かないのも許せないが。
0089デフォルトの名無しさん
2007/03/09(金) 02:30:27gotoLineとentertFilenameの関数を作ってないんじゃないの?
以上
0090デフォルトの名無しさん
2007/03/09(金) 02:31:120091デフォルトの名無しさん
2007/03/09(金) 02:32:28せめて
int main()
かな
0092デフォルトの名無しさん
2007/03/09(金) 02:35:20コマンドプロントを閉じてくれる。
0093デフォルトの名無しさん
2007/03/09(金) 02:38:110094デフォルトの名無しさん
2007/03/09(金) 02:42:02あとは、意味を成さないコードがあるので優しいbccが警告してるだけ
ところで、こんな不思議な書き方始めて見た・・・関数の閉じ括弧にインテンドとか・・・
0095デフォルトの名無しさん
2007/03/09(金) 03:05:00なんかVisualC++に挫折経験があるみたいだけどw
delphi 厨の典型だな
009649
2007/03/09(金) 03:19:38ようやく起動に成功しました!!!
ですが、問題発生です・・・
test.txt
内容
abcde
efghijk
lmnop
を開くとエラーを起こしてしまいます
どうすれば、ちゃんと動く様になるでしょうか?
009749
2007/03/09(金) 03:27:59command:fopen
filename:test.txt
command入力でfopenし
test.txtを実行するとエラーで止まってしまいます
考えられる原因の助言、宜しくお願い致します。
0098デフォルトの名無しさん
2007/03/09(金) 03:34:520099デフォルトの名無しさん
2007/03/09(金) 04:09:40新手法ですか?
0100デフォルトの名無しさん
2007/03/09(金) 04:23:48使い分ける意味はやはりソースを分かりやすくするためでしょうか?
0101デフォルトの名無しさん
2007/03/09(金) 04:49:31ヒント EXIT_SUCCESS
0102デフォルトの名無しさん
2007/03/09(金) 04:49:47関数の返値と同じように、プロセスのリターンコードも条件判断に使えるのさ
0103デフォルトの名無しさん
2007/03/09(金) 04:50:09例えばgzipが、成功 : 0,エラー : 1,警告 : 2 とやってるみたいに。
0104デフォルトの名無しさん
2007/03/09(金) 05:26:27ありがとうございます。
0105デフォルトの名無しさん
2007/03/09(金) 08:16:130106デフォルトの名無しさん
2007/03/09(金) 08:19:12デバッグなら俺を使え(ガチレス篇)Part10
0107質問
2007/03/09(金) 09:16:47struct 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);
}
なにがいけないんでしょうか?
0108デフォルトの名無しさん
2007/03/09(金) 09:20:08>printf("%d\n",ip);
>printf("%d\n",mac);
0109質問
2007/03/09(金) 09:22:59アハ体験できました。ありがとうw
0110デフォルトの名無しさん
2007/03/09(金) 09:40:540111デフォルトの名無しさん
2007/03/09(金) 10:30:370112デフォルトの名無しさん
2007/03/09(金) 10:57:500113デフォルトの名無しさん
2007/03/09(金) 11:04:190114デフォルトの名無しさん
2007/03/09(金) 11:21:110115デフォルトの名無しさん
2007/03/09(金) 13:49:060116デフォルトの名無しさん
2007/03/09(金) 13:50:360117デフォルトの名無しさん
2007/03/09(金) 13:52:210118デフォルトの名無しさん
2007/03/09(金) 13:54:060119デフォルトの名無しさん
2007/03/09(金) 13:55:410120デフォルトの名無しさん
2007/03/09(金) 13:55:49p = malloc(len);
len = strlen(string);
p = malloc(len+1);
どう考えても後者だよな? 普通後者だよな?
0121デフォルトの名無しさん
2007/03/09(金) 13:56:52あなたとってもうまなみなのね
0122デフォルトの名無しさん
2007/03/09(金) 14:02:38後者だな
0123デフォルトの名無しさん
2007/03/09(金) 14:05:25size = strlen(string) + 1;
p = malloc(size);
len = strlen(string);
p = malloc(len+1);
0124デフォルトの名無しさん
2007/03/09(金) 14:07:02大量に文字列読むにしても効率悪くない?
0125デフォルトの名無しさん
2007/03/09(金) 14:07:030126デフォルトの名無しさん
2007/03/09(金) 15:21:380127デフォルトの名無しさん
2007/03/09(金) 15:23:000128デフォルトの名無しさん
2007/03/09(金) 15:23:470129デフォルトの名無しさん
2007/03/09(金) 15:33:47をstrcmp()で表すことって可能ですか?
0130デフォルトの名無しさん
2007/03/09(金) 15:37:290131デフォルトの名無しさん
2007/03/09(金) 15:42:090132デフォルトの名無しさん
2007/03/09(金) 15:50:38char *string=NULL;
の時もがんばれ
0133初心者12号
2007/03/09(金) 16:30:50すいません初心者です。
関数宣言で、
static void myfunc(void);
と
void myfunc(void);
何が違ってくるのでしょうかわかりません><
0134デフォルトの名無しさん
2007/03/09(金) 16:57:18#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を使わずに
一気に読み込ませていくにはどうしたらいいのですか?
まだ、ポインタの勉強はしていなにので、ポインタを使って
のファイルの取り扱いもわかりません。
とにかく何か標準入出力のプログラムのコード書いてください!!
明日までであせっています。
0135デフォルトの名無しさん
2007/03/09(金) 16:59:26staticつけるとファイル内のみしか参照できない。
ファイル内でしか使わない関数なら付けるといいお( ^ω^)
詳しくはGoogleで、static 静的 関数 でぐぐるとよろし
0136デフォルトの名無しさん
2007/03/09(金) 17:03:45C/C++の宿題を片付けます 84代目
http://pc11.2ch.net/test/read.cgi/tech/1172981618/
0137デフォルトの名無しさん
2007/03/09(金) 17:04:22いちおー、scanf から移行するなら、fscanf や sscanf 使う手がある。
まあfscanfよりfreadのが扱いやすいが、まずはFILE* の使い方覚えとけ。
0138デフォルトの名無しさん
2007/03/09(金) 17:14:44どうすればいいでしょうか?
おそらくエクセルファイルをバイナリで読み込むことにはなると思うのですが…
具体的いうと、Sheet1のA1に書かれてる文字列又は数値を読み込むプログラムを
したいのですが、全く分かりませんでした。
エクセルファイルをバイナリエディタ等でみてもよく分かりませんでした。
きっとエクセルファイルがどういう形式(規格)で作られてるかが分からないと
できないと思うのですが、誰かそのあたり分かる方いらっしゃいますでしょうか?
長々と申し訳ございません(´・ω・`)
0139デフォルトの名無しさん
2007/03/09(金) 17:28:000140デフォルトの名無しさん
2007/03/09(金) 17:31:30理解しました。ありがとうございます。
0141デフォルトの名無しさん
2007/03/09(金) 18:20:05ExcelそのものもExcelのファイルを読み書きするための
ライブラリ(というよりコンポーネント)として使える。
普段の1アプリケーションとしてのExcelは言わば表の顔。
Excelのファイル形式に拘る必要が無ければ、
ExcelでCSVやタブ区切りテキストで保存すればよい。
こうすると単なるテキストファイルになる。
0142デフォルトの名無しさん
2007/03/09(金) 18:21:520143デフォルトの名無しさん
2007/03/09(金) 19:43:07for(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で円を描くコードなんですが、判定が二度ないようにしようと思っています。
しかし上記のコードでは何度かして同じ座標にくるみたいです。
何ででしょうか?頼みます。
0144デフォルトの名無しさん
2007/03/09(金) 20:11:59強いて言うなら141のいうとおりExcelの中。
COMで公開されているので、まずはそれについて勉強するといい。
でもCOMはCよりもC++からのほうが扱いやすいので、(ry
更にCOMはMSの技術だからVisual C++の独自拡張を使ったほうが(ry
0145デフォルトの名無しさん
2007/03/09(金) 20:35:44皆さんはどうやってるのですか?
0146デフォルトの名無しさん
2007/03/09(金) 20:47:11味気なんか必要ない
それが嫌なら女の名前でも付けとけばいい
女の数が増えると修羅場になるけどなw
0147デフォルトの名無しさん
2007/03/09(金) 21:05:050148デフォルトの名無しさん
2007/03/09(金) 21:37:42aを前置インクリメントすると結果が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;
}
0149デフォルトの名無しさん
2007/03/09(金) 21:41:440150デフォルトの名無しさん
2007/03/09(金) 21:43:33エラーなんか出ないだろ。
正確にメッセージを書いてくれ。
0151デフォルトの名無しさん
2007/03/09(金) 21:44:48警告 W8004 10: 'a' に代入した値は使われていない(関数 main )
警告 W8004 8: 'b' に代入した値は使われていない(関数 main )
>bに値が入っていないとエラーが出ます。
エラーメッセージ貼ってみて
0152デフォルトの名無しさん
2007/03/09(金) 21:50:21で、func()は
char *func()
{
static char buf[適当な長さ];
\\なにかbufに処理
return(buf)
}
とします。printfされる文字列は常に引数の左から順にfunc()を処理して得られる
結果でしょうか?それとも最適化、あるいはプロセッサアーキテクチャ依存でしょうか?
0153デフォルトの名無しさん
2007/03/09(金) 21:52:34引数区切りの , の前後のどちらから評価されるかは実装依存。
0154148
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
0155デフォルトの名無しさん
2007/03/09(金) 21:54:58関数の実引数が評価される順序は規定されていないので、コンパイラ依存。
0156デフォルトの名無しさん
2007/03/09(金) 21:55:14これらは必ず左から順に評価される。
0157デフォルトの名無しさん
2007/03/09(金) 21:55:31それは警告で、エラーじゃない。
0158デフォルトの名無しさん
2007/03/09(金) 21:58:23つまり変数が代入されていないということですか?
後置だから、bにaを代入しプラス1?
b=++
と同じことなんでしょうか。
これならエラーの意味がわかります。
0159デフォルトの名無しさん
2007/03/09(金) 21:58:31どっちにしたってその場合は同じ結果になりそうなもんだが。
0160デフォルトの名無しさん
2007/03/09(金) 21:58:45おお。たいへんありがとうございます。非常に助かりましたです。
0161デフォルトの名無しさん
2007/03/09(金) 21:58:52にしてみるテスツ
0162デフォルトの名無しさん
2007/03/09(金) 21:59:180163デフォルトの名無しさん
2007/03/09(金) 21:59:47buf の最後の一文字を '\0' に置き換える処理とかあるじゃん
0164148=158
2007/03/09(金) 22:02:14結果は1と出ました。
0165デフォルトの名無しさん
2007/03/09(金) 22:03:55実行結果なんて話題にしてない
コンパイル結果はどうなんだ?
0166158
2007/03/09(金) 22:05:34すみません
------ コンパイル開始 ------
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
lesson25.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
------ コンパイル終了 ------
です
0167デフォルトの名無しさん
2007/03/09(金) 22:06:05それなら同じになるだろ。
0168デフォルトの名無しさん
2007/03/09(金) 22:08:43先ほどはコンパイル結果以上の考察である実行結果を述べたのに、今回は真実結果のみだけの報告?
質問内容はどうなったの?
0169163
2007/03/09(金) 22:12:49間違えた
buf の最後の一文字じゃなくて
下みたいなこと
if(buf[0]!='\0') buf[strlen(buf)-1]='\0';
0170158
2007/03/09(金) 22:15:54148のコンパイルエラーメッセージが154で
161さんの結果が1、コンパイルめーセージが166なんですが
どうして b=a++ で0にならないんだろう?という質問です。
0171デフォルトの名無しさん
2007/03/09(金) 22:16:37bufそのものの値を変えない限り同じになるって。
printf ("%s %s\n", buf, buf);
0173148
2007/03/09(金) 22:30:08は僕です。
質問内容は>>148なのですが、>>168さんの意味がわかりません。
(勉強不足ですみません)
僕の問題は>>158の解釈で良いということでしょうか?
0174デフォルトの名無しさん
2007/03/09(金) 22:37:43>>148のエラーですって話は
エラーじゃなかったんだから改めて判らないことを質問しなおして欲しいな。
0175148
2007/03/09(金) 22:38:10b=a++
コンパイルしてメッセージが出ましたが、実行できました。
結果は0と出ました。
自分が馬鹿だと気づきました。
本当にすみませんでした。
0176デフォルトの名無しさん
2007/03/09(金) 22:39:40前置だと1
後置だと0
正しいけど?
0177デフォルトの名無しさん
2007/03/09(金) 22:40:240178デフォルトの名無しさん
2007/03/09(金) 22:40:44こりゃ一本取られた
0179デフォルトの名無しさん
2007/03/09(金) 22:41:21エラー(実際は警告)の質問なのか、前置/後置インクリメントの質問なのか、
複合的なのかそれ以外なのか分からなくなってきた
とりあえずどれに焦点当てているのか明確に述べなおしてちょ
ちなみに折れんところのgcc(cygwin)さんでコンパイルして実行したら
int main(void){
int a, b;
a=b=0;
b=a++;
printf("%d\n", b);
}
の実行結果が 0 って表示される(あたりまえだが)
0180148
2007/03/09(金) 22:48:35自分の反省点です。
コンパイル時にメッセージが出ると実行できないと思っていました。
後置インクリメントなので、bにaを代入しそれからプラスするという
ところまではわかるんですが、何では1にならないのだろう
b=++
という理屈は通らないんでしょうか?
でもなぜか実行できる。
という新たな疑問が出てきました。
0181デフォルトの名無しさん
2007/03/09(金) 22:50:38> b=++
>
> という理屈
人にこの3行を示して、理屈を理解してもらえると?
0182デフォルトの名無しさん
2007/03/09(金) 22:53:570183デフォルトの名無しさん
2007/03/09(金) 22:53:59b = a++; これは
b = a; が終わってから ++a; を行うという意味だ。
それが後置インクリメント
b = ++a; これは
++a; が終わってから b = a; を行うという意味だ。
それが前置インクリメント
0184デフォルトの名無しさん
2007/03/09(金) 23:00:05もういいや
http://www.kouno.jp/home/c_faq/
0185デフォルトの名無しさん
2007/03/09(金) 23:02:35前置と後置、本ではfor文で使うので、と書いてあるので
そこで、何で前置と後置があるのかがわかってくるんじゃないかと
>>182-183
意味はわかります。
ただ、概念というか何で前と後ろに?、それも後でわかると思います。
「実行する」ということを忘れていました。
実社会でもわかっていても「実行」してないことたくさんあります。
ありがとうございました。
0186デフォルトの名無しさん
2007/03/09(金) 23:03:51アホとはまた性質が違う
0187デフォルトの名無しさん
2007/03/09(金) 23:04:510188デフォルトの名無しさん
2007/03/09(金) 23:06:29意味わかってない。
わかってないことを素直に認められないと成長しないよ。
0189148
2007/03/09(金) 23:18:10b=++a
++aを処理してからbに代入する
後置
bにa代入してから++を処理する。
本当は後置で何で1にならないのかわかってないです。
でも結果として、前置が1、後置が0なんです。
ウザかったらスルーしてください。
0190デフォルトの名無しさん
2007/03/09(金) 23:22:53hm…
本気ならば一度アセンブリ言語で出力させてみるといい
逆アセンブルしてもいいが
C言語の正体は誰が何と言おうと、高級アセンブラだ
良くも悪くも特定のコンピュータアーキテクチャのネイティブコードに依存する
逆に考えれば、Cのソースコード全体はあるネイティブコードに変換されているということだ
Cの背景を知るためにアセンブラを学べといわれる所以はここにある
0191デフォルトの名無しさん
2007/03/09(金) 23:25:40>hm…
0192デフォルトの名無しさん
2007/03/09(金) 23:27:06-S オプションでアセンブリソースを出力してくれるらしいな
0193デフォルトの名無しさん
2007/03/09(金) 23:27:57だから++で処理するのはaであってbじゃないからだって言ってんだろ。
前置は
a++;//aが1になる
b = a;//bに1が代入される
後置は
b = a;//bに0が代入される
a++;//aが1になる
って書き直せば理解できるか?
0194デフォルトの名無しさん
2007/03/09(金) 23:30:02>でも結果として、前置が1、後置が0なんです。
>ウザかったらスルーしてください。
正直に感想を言うと
日本語にもやや難あり、ってとこか?
0195デフォルトの名無しさん
2007/03/09(金) 23:40:321+1=2
これはわかってる。
でも、1と1をたすとなぜ2になるのかと考えるタイプだ。
数学の勉強ですらすら解けるけど、解に導くまでに疑問を持たない奴いるだろ?
これはこの方法だからこれでやれ、では納得できないんだよ。
まず、それが決まりだからそれでやって、使いこなせるようになったら
改めて考えてみるとよい。
つまり、常に書かれていること以上のことを考えながら勉強するタイプだ。
おそらく常識人ではないな。
0196デフォルトの名無しさん
2007/03/09(金) 23:44:37>でも、1と1をたすとなぜ2になるのかと考えるタイプだ。
これって原理主義的な数学者の間で、いまだに解けてない問題のひとつだったっけ?
0197デフォルトの名無しさん
2007/03/09(金) 23:45:580198デフォルトの名無しさん
2007/03/09(金) 23:46:110199デフォルトの名無しさん
2007/03/09(金) 23:46:15近代数学ではなんかこう、ペアノの公理系で定義されてたはずだ。
0200デフォルトの名無しさん
2007/03/09(金) 23:50:470201デフォルトの名無しさん
2007/03/09(金) 23:53:50悪かったな、きつい言い方して。
まず、Cがんばって覚えろ。
たたかうきみのうたを〜たたかわないやつらがわらうだろ〜
0202デフォルトの名無しさん
2007/03/09(金) 23:54:16> 前置
>
> b=++a
>
> ++aを処理してからbに代入する
>
> 後置
>
> bにa代入してから++を処理する。
>
> 本当は後置で何で1にならないのかわかってないです。
> でも結果として、前置が1、後置が0なんです。
プログラムの意味がわかってほっとするのは人間、プログラムの意味を理解するのも人間
プログラムを読むのは誰?実行するのは誰?
プログラムを読むのはコンパイラ、実行するのはコンピュータ
コンパイラは意味をしらない、コンピュータは意味を知らないばかりかもっと大雑把
意味を理解して満足する人はコンピュータからもっとも遠いところにいる人
あなたはコンピュータを理解している人?それとも時代錯誤な言語学者?
0203デフォルトの名無しさん
2007/03/09(金) 23:55:200204デフォルトの名無しさん
2007/03/09(金) 23:55:490205デフォルトの名無しさん
2007/03/09(金) 23:56:150206デフォルトの名無しさん
2007/03/09(金) 23:57:090207デフォルトの名無しさん
2007/03/09(金) 23:58:160208デフォルトの名無しさん
2007/03/10(土) 00:00:05int f(int a,b,c){
・・・・・・・・・
}
みたいにできたら便利なんだが・・・
0209148
2007/03/10(土) 00:00:43そんな高尚な人間じゃないです。
次の代入演算子に進んでいました。
ありがとうございました。
またよろしくお願いします。
0210デフォルトの名無しさん
2007/03/10(土) 00:01:31f(a,b,c)でもおk
それとも型:名前を1:Nにしたいのか?
新しい構文入れないと、結構バグの元なんだぜそれ
0211デフォルトの名無しさん
2007/03/10(土) 00:02:42int a,b,c;
{
...
}
0212デフォルトの名無しさん
2007/03/10(土) 00:13:21型:名前を1:Nのあたりをkwsk
0213デフォルトの名無しさん
2007/03/10(土) 00:22:57ただし>>211の構文は型チェックというCコンパイラの
大変ありがたい機能を殺すことになるのでお勧めできない。
移植性の問題はもうほぼクリアになっているだろうから、
積極的にこの構文を使う理由はないと思う。
タイプ量を減らしたいという理由も弱いとは思う。
0214デフォルトの名無しさん
2007/03/10(土) 00:28:11int f(int, int, int);
でプロトタイプ宣言かいとけばええやん。
0215デフォルトの名無しさん
2007/03/10(土) 00:29:29確かに・・・
0216デフォルトの名無しさん
2007/03/10(土) 00:30:46そんなのでいいのか?
0217デフォルトの名無しさん
2007/03/10(土) 00:31:21ちょwww、それ本末転倒
0218デフォルトの名無しさん
2007/03/10(土) 00:36:13関数の定義とプロトタイプ宣言とで型が合ってるかチェックできないと無意味
0219デフォルトの名無しさん
2007/03/10(土) 00:36:29・構造体に押し込む
・なんか奇跡を起こす
0220デフォルトの名無しさん
2007/03/10(土) 00:38:340221デフォルトの名無しさん
2007/03/10(土) 00:39:12もうプロプロって言わないの?
0222デフォルトの名無しさん
2007/03/10(土) 00:39:48#define BEGIN {
#define END }
みたいでいやだなあw
0223デフォルトの名無しさん
2007/03/10(土) 00:43:09protoizeすれば解決。
0224デフォルトの名無しさん
2007/03/10(土) 00:45:41int f(char,char,char);
int f(a,b,c)
int a,b,c;
{return printf("%d %d %d", a,b,c);}
まあだまされたと思って、コンパイルしてみてよ。
プロトタイプミスマッチの警告・エラーでるから。
0225デフォルトの名無しさん
2007/03/10(土) 00:46:060226デフォルトの名無しさん
2007/03/10(土) 01:19:440227デフォルトの名無しさん
2007/03/10(土) 04:39:13#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はなんなのでしょうか?解説お願い致します。
0228デフォルトの名無しさん
2007/03/10(土) 05:13:450229デフォルトの名無しさん
2007/03/10(土) 05:41:12C言語の本とか解説見たら結構頭の方に載っているはずだが?
0230デフォルトの名無しさん
2007/03/10(土) 06:19:150231デフォルトの名無しさん
2007/03/10(土) 06:42:05ファイル中の読み込み/書き込み位置がインクリメントされることは
保証されていますか。それとも、処理系や環境に依存しますか?
0232デフォルトの名無しさん
2007/03/10(土) 07:29:420233デフォルトの名無しさん
2007/03/10(土) 07:39:44ありがとうございます。
某サイトには「ファイル位置表示子(定義されていれば)」とあって
C言語の仕様なのかどうか迷っていました。
0234デフォルトの名無しさん
2007/03/10(土) 08:20:560235デフォルトの名無しさん
2007/03/10(土) 08:50:320236デフォルトの名無しさん
2007/03/10(土) 09:10:55隠そうとしても隠し切れない知性が溢れ出る深遠な書き込みだな。
0237デフォルトの名無しさん
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文字だけとかをファイルに読み書き
できるようにするのではなく、文字列なども読み書きできるようにするには?
0238デフォルトの名無しさん
2007/03/10(土) 09:47:540239デフォルトの名無しさん
2007/03/10(土) 09:53:31一つ一つ入力することには変わりないけど
繰り返し自体はコンピュータにやらせるから問題無い
#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;
}
0240239
2007/03/10(土) 09:56:25while(fscanf(fp, "%s", word)==1)
fprintf(stdout, "%s\n", word);
0241デフォルトの名無しさん
2007/03/10(土) 10:03:36はじめましてじゃねーだろw
0242デフォルトの名無しさん
2007/03/10(土) 10:16:440243デフォルトの名無しさん
2007/03/10(土) 10:49:40ifのはしご使うのとブール関数の簡単化使うのとどちらが良いかな?
前者は追ってけば何やってるかはわかるんだけど、
後者はぱっと見じゃ論理演算の嵐で何やってるかわかんね
あと、これをさらにループでまわす時の事を考えて、どちらが速いかも知りたい
単純な比較ならifの方が速いらしいし
0244デフォルトの名無しさん
2007/03/10(土) 10:53:34ループで多少速くなったとしても
保守する人が替わった時解読するのに時間がかかったら意味がない
0245デフォルトの名無しさん
2007/03/10(土) 11:19:07if (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段も続かれるともうね(苦笑)。
0246デフォルトの名無しさん
2007/03/10(土) 11:26:530247デフォルトの名無しさん
2007/03/10(土) 11:29:39上のコードを見る限りは入れ子にする必要がないような。
0248デフォルトの名無しさん
2007/03/10(土) 11:46:48最近の俺は
そうじゃないなら簡単なほうを選ぶ様に心がけるように意識している。
気分的な自故意満足であって
C言語では速さ重視でプログラムを書かなければいけない風潮は
役に立たないからな。
ブール関数の簡単化とか論理演算の嵐ってのが
どんなものなのか想像つかないけど。
0249デフォルトの名無しさん
2007/03/10(土) 11:48:39自故意満足
間にi打ってしまったのか
あはははh
0250デフォルトの名無しさん
2007/03/10(土) 12:24:03人間の一番読みやすい方法で書けばいいよ。
どっちが速いかなんて対象のCPUでベンチとってみないとわからん。
0251デフォルトの名無しさん
2007/03/10(土) 12:35:46判定式に論理演算式使えば上手く行けばネストなしで書けます(最初に知った時素で感動しました)
ただ判定式がぱっと見ただけじゃ慣れてない人には何やってるのかわからない
式を導出する過程を示した図を用意して、コメントに図へのURLでも添えとくようにする方向で行くことにします
0252デフォルトの名無しさん
2007/03/10(土) 12:57:08関数の冒頭コメントに解説を書こう。
0253245
2007/03/10(土) 13:05:15残念ながら、絶対値ではない。
>>247
そそ、なんでネストにしているのか不思議でしょうがない。
というわけで、そのコードは5*32行の代入文が10行に収まったのでした。
#最終的には更に減ったけど。
0254デフォルトの名無しさん
2007/03/10(土) 13:06:49具体的なサンプルが無いから何とも言えないけど、導出過程を絵にしないと理解できないような条件式は流石にやめた方がいい気もす。
0255デフォルトの名無しさん
2007/03/10(土) 13:50:02ifなら小学生プログラマでも理解できるし
0256デフォルトの名無しさん
2007/03/10(土) 14:33:07適度に条件まとめた方がいいな。
コメントを付けながら。
if , 論理演算は、3重くらいを限度にして
それ以上複雑になりそうだったら関数を分けてみるというのも手だ。
意味が分かりやすく整理できたら不要な処理とかが見えてきたりもするし
後でマクロで書き直してもよい
0257デフォルトの名無しさん
2007/03/10(土) 15:07:25typedef struct particle{
float x;
float y;
float z;
}PARTICLE[1000000];
例えばこういう3次元座標をもったパーティクル群があったとして
ウニョンウニョン動いているのですが
1個のパーティクルから、その隣接する(距離1程度)のパーティクルを比較したいとき
どうやればスパッと見つけることができるでしょうか…
総当りで1000000×1000000回探すのはどうにも効率が悪くて…
0258デフォルトの名無しさん
2007/03/10(土) 15:10:27適当な検索範囲に絞るくらいしかないよなぁ (つまり何らかのヒューリスティクス使う)
何が適当かは俺は知らん
0259デフォルトの名無しさん
2007/03/10(土) 15:14:32総数 N = 1,000,000
として
自分と既に比較済みははずすから
N*Nじゃないでしょ。
for(i=0;i<N;++i) for(j=i+1;j<N;++j) iとjの比較
0260デフォルトの名無しさん
2007/03/10(土) 15:15:591個のパーティクルが含まれるセルの隣接セルだけを比較してやるようにすればいいと思うけど・・・
それだとサイコロの上下左右前後の6回×パーティクル数ってのになるし
距離が増えても2や3ぐらいならそんなに計算量増えないと思うし
0261デフォルトの名無しさん
2007/03/10(土) 15:16:21ヒューリスティクスという言葉を初めて知りました。
一度これをintに落として(小数点以下を切り捨てて)
例えば
grid[256][256][256]
に収まる程度であればgrid[x][y][z]として、グリッドに落とし込んで
隣接上下左右で比較をしようかとも思ったのですが
grid[256][256][256]を越えたときにもうダメなのと
それなら始めからgrid[x][y][z]に落とせばいいのではとも…
はじめは1次元で xyz xyz xyz… と座標を入れていたのですがこれだと総当り検索しかできないので
0262デフォルトの名無しさん
2007/03/10(土) 15:19:50その通りですね。すみません、よく考えずに書き込んでしまいました。
>>260
仰るとおりです。ただ、空白セルが出来てしまうので
ループの際に空白部分も検討しなくてはならないので効率が出せなくて。。。
0263デフォルトの名無しさん
2007/03/10(土) 15:24:04空間そのものをオブジェクトとして扱っちゃうという考えで
0264デフォルトの名無しさん
2007/03/10(土) 15:26:450265デフォルトの名無しさん
2007/03/10(土) 15:27:31-2000以下、-2000〜-1000、-1000〜0、略、2000以上ってグループ分けて
-2000以下と(-2000以下、-2000〜-1000)との比較をする。
こういうのはlogなんとか的に重くなるから
逆に比較する数を減らせれば
すごく軽くなることを期待してみたりする。
でもやっぱめんどくせ〜〜〜〜
0266デフォルトの名無しさん
2007/03/10(土) 15:29:39数が少ないときヒャ
工夫せず比較したほうが速いかも知れないってのも
悩ましいな。
0267デフォルトの名無しさん
2007/03/10(土) 15:44:32じつはポインタが苦手でアドレス関係から逃げていたのですが
なんとなく出てきたイメージでは
○=パーティクルありでアドレス ×=NULL
○×○○××
○を見たときに、左右のポインタのパーティクル距離が1なら比較 出なければ次のパーティクル
といったリストみたいなイメージが出てきました。
ただ上下・奥行きはどうしたらいいのか、疑問が出てきました。。。。もうちょっと頑張ればいけそうな気が。。。
>>265
空間を線的に分割するという感じですね
みなさん、色々アドバイスありがとうございます。本当にありがたいです
0268デフォルトの名無しさん
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);
}
}
0269デフォルトの名無しさん
2007/03/10(土) 17:10:200270デフォルトの名無しさん
2007/03/10(土) 17:14:05> 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; については前述の問題がある
あとは動けばそれでいいならにそれでいいし他の環境に互換性を持たせたい
なら規格に沿った記述をしなければならない
0271デフォルトの名無しさん
2007/03/10(土) 17:19:11その「ちゃんとした入門書」を1つでもいいから挙げてもらいたい。
>270の内容を説明した入門書は見たことが無い
0272デフォルトの名無しさん
2007/03/10(土) 17:20:20あれって入門じゃなかったのか
0273デフォルトの名無しさん
2007/03/10(土) 17:20:510274デフォルトの名無しさん
2007/03/10(土) 17:24:030275デフォルトの名無しさん
2007/03/10(土) 17:25:41return 0; だな
0276デフォルトの名無しさん
2007/03/10(土) 17:27:300277デフォルトの名無しさん
2007/03/10(土) 17:27:49手元に入門書がないからチェックできないけど。
あとmain()のreturn 0;は必ずしも必要でない。
0278デフォルトの名無しさん
2007/03/10(土) 17:31:54main()のリターン値がどういう意味かと、fgetc()のリターン値がintの理由。
0279デフォルトの名無しさん
2007/03/10(土) 17:33:27getchar()のリターン値を入れる変数がintの理由は、>270の内容の一部であって
全部ではない
> あとmain()のreturn 0;は必ずしも必要でない。
これは失念してた
0280デフォルトの名無しさん
2007/03/10(土) 17:34:26みなさんありがとうございます。とりあえずもう一度本を読んでみます。
ちなみに、自分の読んでいる本は「やさしいC」です。細かなところまでは
確かにのってないです。。
また疑問に思うことがあったら質問させて下さい。今、急いでCを勉強している
もので、変な質問することがあると思いますが、そのときはご勘弁を!!
0281デフォルトの名無しさん
2007/03/10(土) 17:42:030282デフォルトの名無しさん
2007/03/10(土) 17:52:360283デフォルトの名無しさん
2007/03/10(土) 17:56:58>>281
もう入社前の研修を受けています。。やヴぁいです。。。
0284デフォルトの名無しさん
2007/03/10(土) 18:00:100285デフォルトの名無しさん
2007/03/10(土) 18:00:13将来に備えて一生懸命勉強している自分がアホらしくなってきた。
0286デフォルトの名無しさん
2007/03/10(土) 18:01:33大学まで行って何をみんな身につけてるんだろう・・・・・
0287デフォルトの名無しさん
2007/03/10(土) 18:02:120288デフォルトの名無しさん
2007/03/10(土) 18:02:310289デフォルトの名無しさん
2007/03/10(土) 18:21:190290デフォルトの名無しさん
2007/03/10(土) 18:21:59休日の有効な使い方
マはそれができない
下手すると休日までぷr(ry
0291デフォルトの名無しさん
2007/03/10(土) 18:25:000292デフォルトの名無しさん
2007/03/10(土) 18:29:38趣味で立案解析設計実装運用
これが正しきマ(コーダー)の姿
0293デフォルトの名無しさん
2007/03/10(土) 18:31:500294デフォルトの名無しさん
2007/03/10(土) 18:33:330295デフォルトの名無しさん
2007/03/10(土) 18:41:050296デフォルトの名無しさん
2007/03/10(土) 18:41:400297デフォルトの名無しさん
2007/03/10(土) 18:47:530298デフォルトの名無しさん
2007/03/10(土) 18:49:000299デフォルトの名無しさん
2007/03/10(土) 18:59:23とでて来てエラーを送信しますか?という画面がでてくるのですが・・・何で?
#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");}
0300デフォルトの名無しさん
2007/03/10(土) 19:02:03>fprintf(fp , "%s\n", seito[i]);
こいつらがおかしい
0301デフォルトの名無しさん
2007/03/10(土) 19:04:270302デフォルトの名無しさん
2007/03/10(土) 19:09:100303デフォルトの名無しさん
2007/03/10(土) 19:13:03どういうことでしょう?
0304デフォルトの名無しさん
2007/03/10(土) 19:18:53残念だけど構造体を自動的に解釈して
適切な変換を自動的にしてくれることはない。
いくらなんでも
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);
0305デフォルトの名無しさん
2007/03/10(土) 19:30:350306デフォルトの名無しさん
2007/03/10(土) 19:34:19逆切れのうちに入らんだろ
0307デフォルトの名無しさん
2007/03/10(土) 19:36:35ありがとうございました。実行できました!!しかし、ファイルができていないのですが
何ででしょう?
>>302
scanfを使わないとしたらどのようにすれば・・・?
上の方にも書いてあったかもしれませんが、購入した入門書が
糞だったようです・・・・・。
0308デフォルトの名無しさん
2007/03/10(土) 19:38:200309デフォルトの名無しさん
2007/03/10(土) 19:39:050310デフォルトの名無しさん
2007/03/10(土) 19:39:450311デフォルトの名無しさん
2007/03/10(土) 19:40:490312デフォルトの名無しさん
2007/03/10(土) 19:43:18どうすりゃいいんだろ。
scanfで直読みはよくないって知っているけど
だからといってどうすればいいか考えてないや。
ファイルができていない理由はわかりません。
0313デフォルトの名無しさん
2007/03/10(土) 19:43:43大馬鹿者のレスが最近多い気がする。
0314デフォルトの名無しさん
2007/03/10(土) 19:55:340315デフォルトの名無しさん
2007/03/10(土) 19:57:39i=100;
int num[i];
みたいな感じでやってエラーが出るのですが
原因がわからなくて困ってます。助けてください
0316デフォルトの名無しさん
2007/03/10(土) 19:59:53変数に出来ない。
即値じゃないとだめなんだ。
#define MAXSIZE 100
int num[MAXSIZE];
0317デフォルトの名無しさん
2007/03/10(土) 20:00:590318デフォルトの名無しさん
2007/03/10(土) 20:01:37ありがとうございます。
というか、マジですか
ファイルの行数数えて、その分の配列確保したかったのですが
これじゃ先に進むことが出来ない
0319デフォルトの名無しさん
2007/03/10(土) 20:06:170320デフォルトの名無しさん
2007/03/10(土) 20:11:07int * num = NULL;
num = (int*)malloc( i * sizeof(int) );
if(num == NULL)
{
めもりぶそくだよ〜ん
}
つかいおわったら
free(num);
num = NULL;
なお、動作確認するきはありません。
多少のミスがあるでしょうけどあしからず。
0321デフォルトの名無しさん
2007/03/10(土) 20:20:060322デフォルトの名無しさん
2007/03/10(土) 20:30:480323デフォルトの名無しさん
2007/03/10(土) 20:32:120324デフォルトの名無しさん
2007/03/10(土) 20:34:40するにはどうすればいいですか?
0325デフォルトの名無しさん
2007/03/10(土) 20:36:46そうだよ。
0326デフォルトの名無しさん
2007/03/10(土) 20:39:25言ってることがよく分からんが、
Cにメンバプロテクションの概念はない
0327デフォルトの名無しさん
2007/03/10(土) 20:42:22ファイルを分割しないとできない
0328デフォルトの名無しさん
2007/03/10(土) 20:42:26if(num != NULL) free(num);
num = NULL;
0329デフォルトの名無しさん
2007/03/10(土) 20:43:42C++のprotectみたいなことか。
小細工してやる価値があるかどうかだな。
0330デフォルトの名無しさん
2007/03/10(土) 20:44:17free(NULL); は何もしないことになってるからそんなチェックは要らない。
0331デフォルトの名無しさん
2007/03/10(土) 20:44:35それでも同じだろ。
0332デフォルトの名無しさん
2007/03/10(土) 20:46:47num = NULL;をしないことを守ることにより
バグが減るわけでも
プログラムがわかりやすくなるわけでもない。
0333デフォルトの名無しさん
2007/03/10(土) 20:48:27バグも減るし、プログラムもわかりやすくなるよ。
0334デフォルトの名無しさん
2007/03/10(土) 20:49:120335デフォルトの名無しさん
2007/03/10(土) 20:50:110336デフォルトの名無しさん
2007/03/10(土) 20:51:24誰もnum = NULL;をするとプログラムがわかりやすくなったりするなんていってないだろ
0337デフォルトの名無しさん
2007/03/10(土) 20:52:36メモリが割り当てられていないときにはメモリを割り当てたい時ってどうすればいいの?
0338デフォルトの名無しさん
2007/03/10(土) 20:53:12いや、めちゃくちゃ重要。
あるなしじゃ、だいぶ違う。
0339デフォルトの名無しさん
2007/03/10(土) 20:53:35ファイルを分割するとは具体的にはどのようにするのでしょうか?
0340デフォルトの名無しさん
2007/03/10(土) 20:54:03そうじゃない場合は何とか動いてしまうことが多いのでバグが発覚しにくいといったところかな。
0341デフォルトの名無しさん
2007/03/10(土) 20:56:33そんな糞な入門書なんか買うお前の方が糞なんだよ!!!
ちゃんと、内容を確かめてから買うようにね。
0342デフォルトの名無しさん
2007/03/10(土) 20:57:30num = NULL;をしない作法がどう役に立つのかって話であって
num = NULL;をすることが役に立つと主張しているわけじゃない。
0343デフォルトの名無しさん
2007/03/10(土) 21:00:40そこまでわかってるならもう一息だ。
なぜいけないか頑張って考えろ。
0344デフォルトの名無しさん
2007/03/10(土) 21:01:06前回のサイズのままでよかったら前回mallocしたのを使いまわしたり
でもやっぱり毎回freeしてmallocしちゃおっかなって気が変わることもあるし。
プログラムが複雑になると『使い終わったとき解放する』が曖昧で
プログラムが終わる直前に解放することもあれば
途中でデータエラーとかになったら中断して早くfreeしたいって思ったりすると
if(num != NULL) free(num);
num = NULL;
ってするかな(本当は嘘です)。
0345デフォルトの名無しさん
2007/03/10(土) 21:01:52結局は主張してる奴らの会社のコーディング規約に従わなくちゃいけないわけだし
0346デフォルトの名無しさん
2007/03/10(土) 21:03:37まったくわからん。
>>345
だとしたら無意味なコーディング規約あるいは間違ったコーディング規約だ。
ほっとけません。
0347デフォルトの名無しさん
2007/03/10(土) 21:03:43分割コンパイル
0348デフォルトの名無しさん
2007/03/10(土) 21:04:02http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3741.lzh
0349デフォルトの名無しさん
2007/03/10(土) 21:05:33わかった。
num = NULL;が書いてあるだけでプログラムがわからなくなってしまう人のために配慮する作法だ。
0350デフォルトの名無しさん
2007/03/10(土) 21:07:090351デフォルトの名無しさん
2007/03/10(土) 21:08:53必ず関数を通してアクセスすることになる
利点
構造体内部の実装をまるまる隠蔽できる
0352デフォルトの名無しさん
2007/03/10(土) 21:13:15いや、作法どうこう以前に、当たり前の話だから。
0353デフォルトの名無しさん
2007/03/10(土) 21:18:09ってのは結構大事だと思うんだけどな
ヘタになんとなくメモリぶっ壊される方がやっかい
0354デフォルトの名無しさん
2007/03/10(土) 21:29:28みたいな変数やバッファを使いまわすような組み方が常態化してるPGは、ちょっと考えたほうがいい。
0355デフォルトの名無しさん
2007/03/10(土) 21:35:550356デフォルトの名無しさん
2007/03/10(土) 21:40:10「俺は解放したポインタを使ってしまうような馬鹿じゃないから
NULLにしなくていい」って理論は通じない
0357デフォルトの名無しさん
2007/03/10(土) 21:41:580358デフォルトの名無しさん
2007/03/10(土) 21:43:190359デフォルトの名無しさん
2007/03/10(土) 21:45:59>>348
>>351
ありがとうございます。
さっそく見てみます。
osの内部構造はそうなってんのかな?と思ったりしたんですが
そんなことやってんのかなできんのかなと思い質問しました。
みなさんありがとうございました。
0360デフォルトの名無しさん
2007/03/10(土) 21:47:05Cが参照使えるような言語ならまだその概念は一部通用したかもしれないけど、
実体を委譲したりするのが常で、実体を運用してるのが一箇所でない場合がよくある(参照が散在してる)
確かに部分部分で、使い終わったらNULLに初期化するのも一つの手だが、まぁ力説するモンじゃないからいいや
(゚パ
0361デフォルトの名無しさん
2007/03/10(土) 21:57:000362デフォルトの名無しさん
2007/03/10(土) 21:58:14「不正なポインタ」であるかどうかが分かるようになる
0363デフォルトの名無しさん
2007/03/10(土) 22:00:01NULLか否かでヒープ使ってるかどうかの判定ができる。
別に変数を持つよりエレガント。
0364デフォルトの名無しさん
2007/03/10(土) 22:02:440365デフォルトの名無しさん
2007/03/10(土) 22:04:420366デフォルトの名無しさん
2007/03/10(土) 22:08:190367デフォルトの名無しさん
2007/03/10(土) 22:12:38#define free(ptr) (free(ptr),ptr=NULL)
0368・∀・)っ-○◎●
2007/03/10(土) 22:14:32DELETE(p)とかってマクロだったが
0369デフォルトの名無しさん
2007/03/10(土) 22:21:510370デフォルトの名無しさん
2007/03/10(土) 22:28:33MS-Windows のいわゆるハンドルってやつがそう
何をするにも API がハンドルしかくれない
内部の実装は闇の中
0371デフォルトの名無しさん
2007/03/10(土) 22:29:22使いまわしてる変数以外は意味ないですね。
0372デフォルトの名無しさん
2007/03/10(土) 22:40:04>>368 まずDirectXね。
0373デフォルトの名無しさん
2007/03/10(土) 22:46:07同じ処理するときいやでも使うだろ?
まったく同じ処理を2回するとき変数名とか関数名かえるのか?
同じ変数を別の目的に使うとかじゃないよ。
頻繁にメモリ確保と解放しないで
最初に一括して確保しておくとかあるだろ。
(速度重視のプログラムが多いのでよく言われる。
聞き流して俺は結局やらないけど。)
というより
むしろ間違って使わないようにNULLにするという
意味があるんだけど。
>>357
コーディングスタイルの話じゃない。
作法の話だ。
0374デフォルトの名無しさん
2007/03/10(土) 22:50:19postgresは、してないね。
(生のfreeは使ってないけど)
本だと、プログラミング作法とコードコンプリートもそういうのはたしかそういうのは薦めてなかったと思う。
0375デフォルトの名無しさん
2007/03/10(土) 22:56:360376デフォルトの名無しさん
2007/03/10(土) 22:58:08そもそもdelete自体お出ましにならない。
0377・∀・)っ-○◎●
2007/03/10(土) 23:03:530378デフォルトの名無しさん
2007/03/10(土) 23:07:41スマートポインタが定着したから、delete後のnullクリアは必要ないって言われだしたってわけじゃないだろ。
0379デフォルトの名無しさん
2007/03/10(土) 23:07:57なんでスマートポインタが標準装備じゃないんだか。
C言語カワイソ
0380デフォルトの名無しさん
2007/03/10(土) 23:09:280381デフォルトの名無しさん
2007/03/10(土) 23:10:010382デフォルトの名無しさん
2007/03/10(土) 23:10:47auto_ptrもスマートポインタであることに違いは無いぞ。
>>381
freeと同等程度には聞く気がする。
0383デフォルトの名無しさん
2007/03/10(土) 23:11:090384デフォルトの名無しさん
2007/03/10(土) 23:12:45>freeと同等程度には聞く気がする。
どのあたりで?
fclose(fp);
fp = NULL;
みたいなソースは見た記憶がないけど。
0385デフォルトの名無しさん
2007/03/10(土) 23:15:30OSからもらった各種ハンドルは
一度確保してプログラム最後まで持ってたりするからな。
boost::shared_ptr使いてーみたいな場面じゃないし。
ファイルポインタはわからん。
0386デフォルトの名無しさん
2007/03/10(土) 23:16:490387・∀・)っ-○◎●
2007/03/10(土) 23:17:08やっても安全(ただしどこのストリームにも書き込まれない)なのはかなり楽だな。
0388デフォルトの名無しさん
2007/03/10(土) 23:17:270389デフォルトの名無しさん
2007/03/10(土) 23:17:54fp = NULL;
だな。
// fpって変数名がダサいけど。
0390デフォルトの名無しさん
2007/03/10(土) 23:17:59いや、言ってるやつはいるぞ。
オレは教えてないけど。
0391デフォルトの名無しさん
2007/03/10(土) 23:18:27何のシステムコールを使えばいいんですかね?
pthread_join()は起動しているスレッドが自分で終了するまで待ってる関数だから
無限ループしているスレッドを終了できなし。
pthred_exit()はpthread_join()の戻り値を引数に使うからpthread_join()使わないと無理だし。
誰かお願いします。
0392・∀・)っ-○◎●
2007/03/10(土) 23:18:35多スレッドで参照するようなのは特に気を遣う。
0393デフォルトの名無しさん
2007/03/10(土) 23:19:02また、使いまわし前提の話が。
0394デフォルトの名無しさん
2007/03/10(土) 23:20:510395デフォルトの名無しさん
2007/03/10(土) 23:21:49pthredかあ
俺知らね。
それって便利?
0396デフォルトの名無しさん
2007/03/10(土) 23:23:02よく読めよ。
上のほうででてるだろ。
0397391
2007/03/10(土) 23:23:54停止するスレッドの順番が決まってるんで、
とくに他のスレッドで参照されているかとかは気にしなくていいみたいです。
起動されているスレッドは全て無限ループしているスレッドです。
単純に指定したスレッドを停止するようなシステムコールはなさそうですよね
0398デフォルトの名無しさん
2007/03/10(土) 23:24:14ブッツリ殺したら問題あるかどうかが
0400・∀・)っ-○◎●
2007/03/10(土) 23:25:28リソースリークするから強制終了はお奨めしない。
スレッドから参照できるメモリ空間にフラグを外部から立てて、
スレッド自身で自分で終了させる設計にしたほうがいい。
0401デフォルトの名無しさん
2007/03/10(土) 23:25:41スレ違いか
0403デフォルトの名無しさん
2007/03/10(土) 23:27:300404デフォルトの名無しさん
2007/03/10(土) 23:32:16方法 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 のほうが柔軟性は高い。
0405デフォルトの名無しさん
2007/03/10(土) 23:33:11ないじゃん。
0406・∀・)っ-○◎●
2007/03/10(土) 23:34:310408デフォルトの名無しさん
2007/03/10(土) 23:38:520409デフォルトの名無しさん
2007/03/11(日) 00:17:450410デフォルトの名無しさん
2007/03/11(日) 00:24:22にほんごでおk
0411デフォルトの名無しさん
2007/03/11(日) 00:37:17え?
0412デフォルトの名無しさん
2007/03/11(日) 00:41:30確保した所の意味が分からないが
freeに渡した引数ならならない
開放したメモリ領域もならない
0413デフォルトの名無しさん
2007/03/11(日) 00:45:22まだ始めて間もない者です。許してください
0414デフォルトの名無しさん
2007/03/11(日) 01:02:48int 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が設定されると考えていいでしょうか?
0415デフォルトの名無しさん
2007/03/11(日) 01:04:172) seito_tbl[1]からseito_tbl[5]は {0, 0, 0} に初期化される。
0416デフォルトの名無しさん
2007/03/11(日) 01:06:14一個多いよ
0418デフォルトの名無しさん
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;
}
0419デフォルトの名無しさん
2007/03/11(日) 10:32:460420デフォルトの名無しさん
2007/03/11(日) 10:35:30int main(void){
int i;
func func_table[2]={a_func, b_func};
for(i=0;i<2;i++) (*func_table[i])();
}
で動いたら奇跡
0421デフォルトの名無しさん
2007/03/11(日) 10:44:420422418
2007/03/11(日) 10:54:09関数テーブルを
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;
}
としたら動きました。
うーん、何でこうしたら動くようになったかいまいち理解できない・・・
みなさんありがとうございました。
0423デフォルトの名無しさん
2007/03/11(日) 11:01:51文法的にはそう書くことが認められているが、
厳密には (* ... ) だな。
シンタックスシュガーってやつ?
0424デフォルトの名無しさん
2007/03/11(日) 11:10:41標準化以前の処理系との互換性を考慮しなければどっちでも構わん。
0425デフォルトの名無しさん
2007/03/11(日) 11:31:19struct hoge{
int orz;
int or2;
} hogehoge;
こんな感じの構造体を入力した数にあわせて作るっていうのをしたいのですが
void main(){
値を入力してほしいお
scanf(%d,num)
int *p = malloc(??????)
}
どうもわからんのです。助けてください。。。動的なメモリ確保がさっぱりというのもありますが
0426デフォルトの名無しさん
2007/03/11(日) 11:32:26を作りたいだけなのです。
0427デフォルトの名無しさん
2007/03/11(日) 11:37:37arr = malloc(sizeof(*arr)*num);
0428デフォルトの名無しさん
2007/03/11(日) 11:39:33struct hoge* p = (struct hoge*)malloc(sizeof(struct hoge) * num);
これ以降、p[n].orz とか使える。 (p + n)->orz でもいい
0429デフォルトの名無しさん
2007/03/11(日) 11:40:140430デフォルトの名無しさん
2007/03/11(日) 11:42:29hogehoge *arr はポインタで
arrにmallocでnum分作れるということですか?
この作った後のarrのorzにアクセスするにはどうやるのでしょうか?
numが3だったとき、1番目にアクセスしたいときは
arr[0].orz
という風にできるのでしょうか?
0431デフォルトの名無しさん
2007/03/11(日) 11:43:41読み込まずに書き込んでしまいました
>>427-429の皆さん、ありがとうございますだ
試してみますだ
0432デフォルトの名無しさん
2007/03/11(日) 12:22:120433デフォルトの名無しさん
2007/03/11(日) 12:22:51出来ました!ありがとうございます!
もう一つ別件なのですが
数を指定して、その分確保するのはわかったのですが
継ぎ足して、順次値を挿入していくようなもののやり方も必要で。
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の説明を見てもどうもわからず。何度も何度もすんません
0434デフォルトの名無しさん
2007/03/11(日) 12:27:310435デフォルトの名無しさん
2007/03/11(日) 12:38:30フラグメンテーションがひどいということで。。。上のような小さいのならよいのだけど
数が増えたときを基準に考えてやらないといかんのです
C++のvectorでは上のはあっさりやってくれたのだけど
Cじゃないといかんので
0436デフォルトの名無しさん
2007/03/11(日) 12:43:170437デフォルトの名無しさん
2007/03/11(日) 12:45:31足りなくなったらまた余裕を持って更に多くのメモリを確保しなおせ。
C++のstd::vectorもそういう戦略を取っている。
0438デフォルトの名無しさん
2007/03/11(日) 12:46:000439デフォルトの名無しさん
2007/03/11(日) 12:51:01フラグメンテーションなんか気にすんなよ・・・
0440デフォルトの名無しさん
2007/03/11(日) 12:51:24次のプログラムを組みました。
#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に代入した場合に誤差が発生しないのは、なぜでしょうか。
0441デフォルトの名無しさん
2007/03/11(日) 12:56:45これが内部的にdouble型やそれ以上の精度で計算されている可能性がある。
例えばx86の浮動小数点数演算はみんな80bit拡張倍精度で行われ、
レジスタを使いまわすとそういうことになる。
0442デフォルトの名無しさん
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!!の順で出力されるのですが,何故なのでしょうか
0443デフォルトの名無しさん
2007/03/11(日) 13:00:470444デフォルトの名無しさん
2007/03/11(日) 13:00:530445デフォルトの名無しさん
2007/03/11(日) 13:10:37ありがとうございます。
ということは、float型に代入した値の誤差は、計算時ではなく代入時に
発生したということですか?
0446デフォルトの名無しさん
2007/03/11(日) 13:21:59低水準と高水準をごっちゃに使うな、と言う方が良いと思う
0447デフォルトの名無しさん
2007/03/11(日) 14:55:56上手く値が入りません。観てやってもらえませんか
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;
}
0448デフォルトの名無しさん
2007/03/11(日) 14:57:11p[0]=3
p[1]=-33686019
p[2]=1
p[3]=5
p[4]=7
値を入力した5回目でこうなります。2のところがどうしても変な値が入ってしまって
0449デフォルトの名無しさん
2007/03/11(日) 15:02:110450デフォルトの名無しさん
2007/03/11(日) 15:03:46長さ変わらないんだったらreallocする意味ないだろ。
if( p1 == NULL )
free( p1 ); /* p1はNULLだから元の領域を開放できてない */
0451デフォルトの名無しさん
2007/03/11(日) 15:05:00sizeof(int) * (count + 1) だけ realloc しよう。
0452デフォルトの名無しさん
2007/03/11(日) 15:11:50>>451
>>reallocが追加で取得するとか勘違いしてんのかな。
勘違いしてました('A`)
>>450
p1が確保できていないときの処理だと思っていたのですが、違うのですか
>>449
すみません、意味が…理解できないです
0453デフォルトの名無しさん
2007/03/11(日) 15:14:08>>451でアドバイスいただいたとおりで出来ますた!
ありがとうございます、ほんとに
やりたかったのはファイルの数字を連続で可変長の配列に組み込むことだったんですが
これだと、メモリがばらばらになるというのを聞いて、まだ改善しないと…だと思うのですが
目星つけることが出来ました。
0454デフォルトの名無しさん
2007/03/11(日) 15:17:08○ | ○| ○| ○ ←p全体
p[0] p[1] p[2] p[3]
だと思っていて
reallocすると
○ | ○| ○| ○ | ● realloc分+
p[0] p[1] p[2] p[3]
だと考えてしまっているのですが…どういう勘違いをしているのでしょうか
0455デフォルトの名無しさん
2007/03/11(日) 15:19:18reallocの戻り値は別の変数に確保して、NULLチェックをしてから元の変数に代入する。
tmp = realloc(size);
if(tmp == NULL ) {
free(p1);
return 0;
}
p1 = tmp;
0456デフォルトの名無しさん
2007/03/11(日) 15:19:26reallocはその領域で拡張しきれないときは、別の場所に確保して元の内容をコピーしてくれるだけ
0457デフォルトの名無しさん
2007/03/11(日) 15:20:16# ● | ●| ●| ● | ● realloc分+
じゃないか?
0458デフォルトの名無しさん
2007/03/11(日) 15:20:490459デフォルトの名無しさん
2007/03/11(日) 15:33:22>>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]
0460デフォルトの名無しさん
2007/03/11(日) 15:38:32あと、最初のallocの後に別のメモリをダミーでallocしたときと比べてみ
0461デフォルトの名無しさん
2007/03/11(日) 15:57:38先ほどのソースでこうやってみました
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
すんません…混乱してきました(ノ_・、)
0462デフォルトの名無しさん
2007/03/11(日) 16:30:07だだっ広い新大陸に入植者が沢山やってきて、各々に土地を割り当てたとするだろ
土地を拡張するためにrealloc()を使って再登録するんだけど、管理者は
モウ秋田
0463デフォルトの名無しさん
2007/03/11(日) 17:22:220464デフォルトの名無しさん
2007/03/11(日) 17:43:400465デフォルトの名無しさん
2007/03/11(日) 17:50:410466デフォルトの名無しさん
2007/03/11(日) 18:17:19reallocは void *realloc(void *block, size_t size);
blockが元のメモリ、sizeが再割り当てするのメモリサイズ
reallocによる再割り当ては前のメモリに追加して割り当てるわけではなく
sizeで指定したサイズに拡張すると言うこと
たとえばcallocで40バイト分確保していたときに
realloc(p1,80); とした場合 メモリ全体のサイズは120バイトではなく
reallocで指定した80バイトにしかならない
0467デフォルトの名無しさん
2007/03/11(日) 19:43:530468デフォルトの名無しさん
2007/03/11(日) 19:48:430469デフォルトの名無しさん
2007/03/11(日) 21:19:540470デフォルトの名無しさん
2007/03/11(日) 21:32:42いや、低水準と高水準とまぜて使うなよ。。
0471デフォルトの名無しさん
2007/03/11(日) 21:49:34標準関数以外は使わない方がいいですか?大抵使えると思って
strdupしまくりなんですがまずいでしょうか?
0472デフォルトの名無しさん
2007/03/11(日) 21:50:59無くたって簡単に用意できる。
0473デフォルトの名無しさん
2007/03/11(日) 21:54:120474デフォルトの名無しさん
2007/03/11(日) 22:10:25# strdup() は SVr4, 4.3BSD, POSIX.1-2001 準拠である。
らしい、VCにもあったよな?
0475デフォルトの名無しさん
2007/03/11(日) 22:19:37VCのはアンダーバーがついてない?
0476デフォルトの名無しさん
2007/03/11(日) 23:01:45ありがとうございます。安心しました。windowsにはないかもしれないんですね。
うーん。やっぱまずいかも。
0477デフォルトの名無しさん
2007/03/12(月) 03:31:290478デフォルトの名無しさん
2007/03/12(月) 03:38:44MinGWにせよBorlandにせよ
0479デフォルトの名無しさん
2007/03/12(月) 11:49:20一晩考えたのですが、どうにもなっとくが出来ず…再度質問させてください。
やりたいのは可変長に値を確保できる配列です。たとえば値を入力したら、それに合わせてピッタリと配列が大きくなるような
○|○|○ に ●を入れると ○|○|○|●となるような
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個目の入力する要素を加えるとなるとどうなるのでしょうか…
何度もすみませんが教えてください
0480デフォルトの名無しさん
2007/03/12(月) 11:53:49ptr = (int *)malloc( 15*sizeof(int));
ですね。
0481デフォルトの名無しさん
2007/03/12(月) 12:03:45> 配列でptr[15]とするのと代わらないんじゃないかと…
スタックとヒープの違いは知っている?ググってみて
> 上のに16個目の入力する要素を加えるとなるとどうなるのでしょうか…
未定義です(malloc()で確保した領域以外の領域に対する読み書きは未定義のはず)
鼻から悪魔が出てきても何らおかしくはないです
0482デフォルトの名無しさん
2007/03/12(月) 12:26:34ありがとうございます
スタックとヒープの違いを、はじめて知りました
ただ、どうしてもstatic ptr[15]みたいなものとの違いが…
>> 16個目
16個目以降を、入力に合わせて順次領域と一緒に追加していくためには
どうやればいいのでしょうか…
0483デフォルトの名無しさん
2007/03/12(月) 13:17:07これを例にすると、、
ptr2 = (int *)malloc( 16*sizeof(int));
memcpy(ptr2, ptr, 15*sizeof(int));
free(ptr);
ptr = ptr2;
これがreallocと同じ動作(の、一部)
ptr の後ろがまだ使えるなら後ろも使えるようにするだけで、コピーとかしないが
0484デフォルトの名無しさん
2007/03/12(月) 13:25:30リストを自前で作るとヒープやらポインタの扱いはうまくなるよ
0485デフォルトの名無しさん
2007/03/12(月) 14:24:30static の変数はプログラム実行開始から終了までの寿命がある。
auto の変数 (関数のブロックの始めなどで宣言する変数) は関数
開始から終了までの寿命がある。malloc() で確保した領域は
free() するまでの寿命がある。またこれは realloc() で長さを
変えられる。(更に OS のある環境で動かす場合は free() せずに
プログラムを終了してもその後全部開放されるのが普通)。
という風に覚えておけば良いんじゃないだろうか。
実際にどのメモリ領域に確保されるかは実装によって違う可能性がある。
0486デフォルトの名無しさん
2007/03/12(月) 16:06:08また、何のために書くのでしょうか?
0487デフォルトの名無しさん
2007/03/12(月) 16:09:31sizeof はググれ
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0489デフォルトの名無しさん
2007/03/12(月) 16:41:37c++
0490デフォルトの名無しさん
2007/03/12(月) 16:45:360491デフォルトの名無しさん
2007/03/12(月) 16:46:252つの数字の四則演算を行うというプログラムを授業で製作したのですが
次に128文字まで入力可能にして計算できるようにプログラムを変更しろと言われました。
100桁を超える数字の計算なんて普通しないだろ・・・とか愚痴りつつ
計算方法を考えていたのですが、全く分かりません。
どうすれば100桁を超える数字の計算が可能か教えてください
0492デフォルトの名無しさん
2007/03/12(月) 16:49:38普通しないけど、お前できる?
できるならその通りに作ればいいし、出来ないなら脳ミソ疑え
0493デフォルトの名無しさん
2007/03/12(月) 16:52:13宿題は宿題スレに行け。
てか小学校の時に習った筆算のアルゴリズムで解けるよ。
0494デフォルトの名無しさん
2007/03/12(月) 16:52:340495デフォルトの名無しさん
2007/03/12(月) 16:53:03可能です
0496491
2007/03/12(月) 17:13:52>>494
多倍長整数演算でぐぐってみたら色々出たのでがんばってみます
無理そうだったら宿題スレへ・・・
0497デフォルトの名無しさん
2007/03/12(月) 20:54:520498デフォルトの名無しさん
2007/03/12(月) 21:03:06>これでループを15回やると、15個表示されますが、表示を16にするとエラーになりますよね
>これだと初めに配列でptr[15]とするのと代わらないんじゃないかと…
たしかに変わりません.ただ>>481さんぎ言うように確保される領域が違う場合がありますから
>それで足りなくなったらreallocするんですよね?
そうです
>上のに16個目の入力する要素を加えるとなるとどうなるのでしょうか…
???
>>496
文字配列を使って筆算の要領で計算するとか
0499デフォルトの名無しさん
2007/03/12(月) 21:25:27てめーこの野郎。レスポップアップで見てるこっちの身にもなれや。
0500デフォルトの名無しさん
2007/03/12(月) 21:27:540501デフォルトの名無しさん
2007/03/12(月) 22:07:54実行すると、コマンドプロンプトを開き、実行されたディレクトリまで移動し、特定のコマンドライン引数付きで
特定の実行ファイルを実行する、というものです。
この流れは自動で一瞬で終わるようにしたいです。
どのように組めば良いでしょうか?
0502デフォルトの名無しさん
2007/03/12(月) 22:10:38( ・ω・)やりたいことは分かってる
(・ω・ )やらなきゃいけないことも分かってる
( ・ω・ )なんでやらないの?
0503デフォルトの名無しさん
2007/03/12(月) 22:14:59プログラムを実行する → CreateProcess とか systemとか。
0504デフォルトの名無しさん
2007/03/12(月) 22:16:47C,C++と、Javaと、Perlくらいですか?
0505デフォルトの名無しさん
2007/03/12(月) 22:18:360506デフォルトの名無しさん
2007/03/12(月) 22:19:180507デフォルトの名無しさん
2007/03/12(月) 22:20:03cmd.exeの遠隔操作?
0508デフォルトの名無しさん
2007/03/12(月) 22:21:11コンソールアプリで別のプロセス起動させるってことか?
>コマンドプロンプトを開き、実行されたディレクトリまで移動し
意味が分からない
>特定のコマンドライン引数付きで特定の実行ファイルを実行する
exec群
0509デフォルトの名無しさん
2007/03/12(月) 22:21:25つ http://pc11.2ch.net/test/read.cgi/tech/1148485555/1-
0510デフォルトの名無しさん
2007/03/12(月) 23:22:35色々回答ありがとうございます。返信遅れてすみませんでした。
回答いただいて、ようやく自分の中で噛み砕けました。
Cだと順次、値を入れて、次の領域を確保するような操作は難しいのですね
ありがとうございました。
0511デフォルトの名無しさん
2007/03/12(月) 23:30:47と思ってたら、>>509がちゃんと書いてた。
0512デフォルトの名無しさん
2007/03/12(月) 23:45:37なんでそういう結論になるんだよ…
0513デフォルトの名無しさん
2007/03/12(月) 23:49:06彼が難しければ万人が難しいんだよ
おれは べっせかい の にんげん だから かんけい ないヨ \(^o^)/
0514デフォルトの名無しさん
2007/03/12(月) 23:51:060515デフォルトの名無しさん
2007/03/12(月) 23:54:250516デフォルトの名無しさん
2007/03/13(火) 00:03:00とりあえずmalloc,realloc.freeあたりの仕様をよく読めよ
0517デフォルトの名無しさん
2007/03/13(火) 00:04:30> 仕様
・・・!!!
0518デフォルトの名無しさん
2007/03/13(火) 00:46:19char 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メンバを、予め指しているのでしょうか?
0519デフォルトの名無しさん
2007/03/13(火) 00:49:00STRLIST *listtop = NULL; はリストの要素は何も無い状態だろう
0520デフォルトの名無しさん
2007/03/13(火) 00:49:21見たまんま、NULL を指している
0521デフォルトの名無しさん
2007/03/13(火) 00:53:190522518
2007/03/13(火) 00:55:00では、一番最初の要素(listtop)には、何も入っていないとの事でしょうか?
そしたら、要素1を指せないですよね???
ですが、解説の図には先ず最初の要素に要素1を指す物を入れるとか・・・
0523デフォルトの名無しさん
2007/03/13(火) 01:01:440524デフォルトの名無しさん
2007/03/13(火) 01:03:23listtop = (STRLIST *)malloc(sizeof(STRLIST));
ここで最初の要素が listtop に入る
0525デフォルトの名無しさん
2007/03/13(火) 01:07:39頭を整理しろ
0526518
2007/03/13(火) 01:10:11listtopと言う箱があり、それが要素1と言うものをさしています
listtopは&(要素1)、要素1は&(&要素1)、要素2は&(要素3)・・・・・要素5は&(要素6)
要素6はNULL ってな感じです・・・
0527518
2007/03/13(火) 01:11:13要素1は(&要素2)
0528デフォルトの名無しさん
2007/03/13(火) 01:12:20listtop → (あさっての方向
>listtop = malloc(〜
listtop → [ ]
>strcpy
listtop → [ Ichiro ]
0529518
2007/03/13(火) 01:12:50もし、このlisttopがNULLなら
最初の(&要素1)を指せませんよね
0530デフォルトの名無しさん
2007/03/13(火) 01:14:280531デフォルトの名無しさん
2007/03/13(火) 01:16:05listtop = NULL; の「時点では」 listtop は NULL だ
ずっと NULL ってわけじゃないだろ
listtop = malloc(〜) の時点で listtop は要素1を指す
0532デフォルトの名無しさん
2007/03/13(火) 01:16:48物を知らない事より邪魔な要素
0533デフォルトの名無しさん
2007/03/13(火) 01:17:43絶対何か勘違いしてるだろ。
要素1は listtop
要素2は listtop->next
要素3は listtop->next->next
0534デフォルトの名無しさん
2007/03/13(火) 01:19:420535デフォルトの名無しさん
2007/03/13(火) 01:20:18a=1;
printf("%d",a);
a=2;
printf("%d",a);
これでどうして、2つの printf で違うものが出てくるのかが分からないって人。
プログラムは上から順に実行されるんだってことが分からないらしい。
0536518
2007/03/13(火) 01:20:50listtopは最初は明後日の方向(何処も指していない)
でlisttop = malloc[ ]ができて、listtopに(&要素1)が入るのでしょうか?
0537デフォルトの名無しさん
2007/03/13(火) 01:23:25mallocで作った領域へのポインタ(mallocの戻り値)がlisttopに入る
0538デフォルトの名無しさん
2007/03/13(火) 01:23:31listtop は要素1を指している、でいいんだよ
>>528 でわざわざ「矢印」を書いてくれてるだろ
0539デフォルトの名無しさん
2007/03/13(火) 01:24:17プログラムは3Dマッピング
0540デフォルトの名無しさん
2007/03/13(火) 01:27:08┌─┐
│ ┼→
└─┘
0541518
2007/03/13(火) 01:27:12listtop = malloc()でした
もうわけわかめなので、出直してきますが
では、"Ichiro"が要素2は listtop->next に
入ってる事になりますでしょうか?
0542デフォルトの名無しさん
2007/03/13(火) 01:28:39もうちょっとちゃんと構造体を意識しろ。
0543デフォルトの名無しさん
2007/03/13(火) 01:29:17>listtop = NULL;
listtop → (あさっての方向
>listtop = malloc(〜
listtop → [ ]
>strcpy
listtop → [ Ichiro ]
この図を見ても、「要素2」に「Ichiro」が入ってるように見えるか?
0544デフォルトの名無しさん
2007/03/13(火) 01:33:36メンバ name = "Ichiro"
メンバ next → STRLIST構造体2(この時点ではまだNULL)
メンバ name = "Ichiro"
メンバ next → STRLIST構造体3
0545518
2007/03/13(火) 01:37:46>>544
では、整理させてください。
最初はNULLで指している構造体ができてから
その前の所にできた構造体のアドレス(ポインタが入ると言うことでしょうか?)
0546518
2007/03/13(火) 01:41:340547デフォルトの名無しさん
2007/03/13(火) 01:41:35>最初は
「最初」というのはどこでしょう
>NULLで指している構造体
意味が分かりません
>その前の
どの?
0548518
2007/03/13(火) 01:47:32最後に再度質問です
STRLIST *listtop = NULL;
が、いつ要素1にかわるのでしょうか?
0549デフォルトの名無しさん
2007/03/13(火) 01:48:47531 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/13(火) 01:16:05
>>529
listtop = NULL; の「時点では」 listtop は NULL だ
ずっと NULL ってわけじゃないだろ
listtop = malloc(〜) の時点で listtop は要素1を指す
0550518
2007/03/13(火) 01:49:570551デフォルトの名無しさん
2007/03/13(火) 01:50:41百聞は一見に如かず
0552デフォルトの名無しさん
2007/03/13(火) 01:53:47返ってきたレス読んでないだろ?
たった10個前のレスコピペしただけでありがとうとか
つまりそのレスを読んでない証拠。
図を描けって言っても描かないし
要素1要素2ってやめろって言ってもやめないし
入るじゃなくて指すって言っても指すって言わないし
もっと頼れよ
何しに聞きにきてるんだよ
自分ひとりで解決しようとすんなよ
0553デフォルトの名無しさん
2007/03/13(火) 01:55:04ちょい報告しようかと思ったんだが。
2chブラウザには面白いもん内蔵されてんだよね。
ちょいビビった。
このスレの住人は知ってる人多そうな、既出ネタっぽいが…。
(こりゃ儲かるよなあ、内蔵されてれば、でもシークレット???)
0554デフォルトの名無しさん
2007/03/13(火) 02:04:12唯単に指す物的なイメージで覚える方がいいでしょうか?
0555デフォルトの名無しさん
2007/03/13(火) 02:33:37雑談スレとか
いや、他の板で扱うネタな気もする
>>554
抽象的に捉らえておいて、
実際に使いながら理解するって感じかなぁ
アドレスと覚えるとインクリメントとかでつまづくかも
0556デフォルトの名無しさん
2007/03/13(火) 02:36:41おれのイメージは変数名が書いてある紙にひもがぶら下がっていて、
そのひもの先に何か括り付けられている感じ。
0558デフォルトの名無しさん
2007/03/13(火) 04:22:56アドレスとして捉えないと、配列などで連続したメモリブロックにある場合のイメージが曖昧になる。
0559デフォルトの名無しさん
2007/03/13(火) 05:02:05どんなときメモリ確保&解放するべきかよくわかりません。
例えば単に配列を読み込んで表示する場合と、メモリ確保してから
配列の読み込み&表示して解放するのではどう違ってくるのでしょう?
0560デフォルトの名無しさん
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にするつもりですが、現段階では結果がものすごいことになるので減らしています)
0561デフォルトの名無しさん
2007/03/13(火) 05:21:5310を((sizeof(str))/sizeof(str[0]))-1に置き換えてみたらうまくいくと思います。
0562デフォルトの名無しさん
2007/03/13(火) 05:24:18長さは strlen() で数えよう
0563デフォルトの名無しさん
2007/03/13(火) 05:25:10長さが事前にわからない場合は動的にやるだろ
0564デフォルトの名無しさん
2007/03/13(火) 05:34:35「配列を読み込む」とは具体的にどういう操作のことを言ってるの?
>>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'の一つ手前から始まるようにしないといけない。
文字数が固定でないなら、最初に開始位置を確定する操作を置くべし。
0565560
2007/03/13(火) 05:37:40stdio.hの標準ライブラリ関数だけでは
この内容のプログラムは不可能だったり、無駄に複雑になったりしますか?
できればstdio.hだけで処理したいんですが
0566デフォルトの名無しさん
2007/03/13(火) 05:38:45言われます…この前、エクセルの参考書を見たら関数や引数がCやってるせいか
理解しやすそうでした
0567560
2007/03/13(火) 05:42:06なるほど、9番目以降はデータが入っていないのではなく
何が入ってるかわからない状態なんですね
ありがとうございます
う〜ん、文字数が固定でない状態で確実に終端文字の一つ手前から始まる操作。。。
今のところ思いつきませんが考えてみます
0568デフォルトの名無しさん
2007/03/13(火) 05:48:56じゃあこれで(ファイルからの読み取りだと>>561ってワケにはいかなそうだし)。
char *cp = str;
while(*cp)cp++;
while(cp != str)putchar(*--cp);
0569デフォルトの名無しさん
2007/03/13(火) 06:33:030570デフォルトの名無しさん
2007/03/13(火) 06:39:090571デフォルトの名無しさん
2007/03/13(火) 07:04:47紙を物理的に逆さにするわけにはいかないから、反対側の紙の外まで持っていって
そこからまた紙の外に出るまで戻しながら読み取っていく
って感じか
演算子の優先順位とか調べながら変数に初期値与えて紙の上でこちゃこちゃしてたらなんとなくわかった
でもこういうの見た瞬間に理解できるようになりたいなぁ
0572デフォルトの名無しさん
2007/03/13(火) 07:38:07説明が下手だな。コードで説明しなくても文字で説明すれば済むだろ。
0573デフォルトの名無しさん
2007/03/13(火) 07:39:00string.hを使わない積極的な理由が無いなら、使うべき。
0574デフォルトの名無しさん
2007/03/13(火) 07:39:39確かに順序が変だね。もっと日本語をやるべきだ。
0575デフォルトの名無しさん
2007/03/13(火) 07:48:13独り言ならチラシの裏にでも書いとけ
0576560
2007/03/13(火) 07:52:23この授業ではstdio.hしかやっていないのです
ポインタも後回しで、「ファイル操作の時にはこうやるんだ」とだけ。
私は他の授業でstring.hもポインタも習っていますが
授業の進め方がこうである以上、ポインタを使わずかつstdio.hだけでやるやり方を探しています
今のところ思いつきませんが
0577デフォルトの名無しさん
2007/03/13(火) 07:53:560578デフォルトの名無しさん
2007/03/13(火) 08:03:17int i=1;
fseek( fp, i, SEEK_END)
while( ftell(infp) != 0 ){
fputc( fgetc(infp), outfp);
i++;
fseek( fp, i, SEEK_END);
}
こんな感じ?
0579デフォルトの名無しさん
2007/03/13(火) 08:03:470580560
2007/03/13(火) 08:32:35自分で配列の長さを測る関数を作ってやりたいと思います
もう考えるのも面倒だし
0581デフォルトの名無しさん
2007/03/13(火) 08:35:490582デフォルトの名無しさん
2007/03/13(火) 08:40:06思考ルーチンが走っている間であっても、ユーザ入力(一時停止や、思考ルーチンの強さ指定、
攻撃・守備モード切替等)を受け付けることができるようにしたいのですが、
マルチスレッドにする必要はあるのでしょうか?
0583デフォルトの名無しさん
2007/03/13(火) 08:40:160584デフォルトの名無しさん
2007/03/13(火) 08:40:54#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);
}
0585デフォルトの名無しさん
2007/03/13(火) 08:44:09思考ルーチンからループアウトしてまわすのは大変だけど、
思考ルーチンの途中で呼び出すイメージ
// 思考ルーチン
while (〜){
// いろいろ考えて
CallMessageLoop();
// いろいろ考えて
CallMessageLoop();
}
0586デフォルトの名無しさん
2007/03/13(火) 10:36:07ちょっとすっきり。
#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;
}
0587デフォルトの名無しさん
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");
}
0588501
2007/03/13(火) 10:38:54>>508
ありがとうございます!
>>507
自作ソフトに付属するdllファイルをregsvr32で登録させるインストーラーを作りたいと思いまして。
>>511
あ、そうです!
バッチって言われてるような、一瞬プロンプトが出て消えるけど、作業がされてるみたいなのにしたかったんです。
>>509
誘導ありがとうございます!
0589デフォルトの名無しさん
2007/03/13(火) 10:53:07ところで、もし大学ならば講義でやってないことを宿題に書いて出しても
普通は問題ないと思うよ。あえてそれをやるなと言われているのでなければね。
0590501
2007/03/13(火) 10:55:41ありがとうございました。
0591デフォルトの名無しさん
2007/03/13(火) 11:47:27{
void func(); ←ここの意味
i = func(a,b);
}
int func( a, b )
{
}
かなり省略形ですいません><
UNIXからの移植なんですが func() があるとVCじゃC2660出ちゃうし
安易に消していいものか?分からなくて
意味を教えてください、お願いします。
0592デフォルトの名無しさん
2007/03/13(火) 11:49:040593デフォルトの名無しさん
2007/03/13(火) 11:49:333行目 int func(); でお願いします><
0594デフォルトの名無しさん
2007/03/13(火) 11:51:15int func(int a, int b) とかじゃないのか。
そしたらプロトタイプもああおれにあわせろ
0595デフォルトの名無しさん
2007/03/13(火) 11:52:34っていうか、そこに書いてある理由が思いつかない
0596デフォルトの名無しさん
2007/03/13(火) 11:55:39関数プロトタイプっの引数無しって事ですか?
VCじゃ、ちゃんと宣言しとかないとC2660が出る気がして
宣言しなおしてるんで必要なしって事ですかね
もうちょっとゴソゴソしてみます、ありがとうございました。
0597デフォルトの名無しさん
2007/03/13(火) 11:56:19ぐぐって調べたぜ。
mainの中のvoid func();は、funcという関数は引数を取らず、
値を返さない関数であるというプロトタイプ宣言。
関数呼び出し前にプロトタイプ宣言もしくは関数の定義そのものがないと、
その関数はintを返す引数のない関数であると仮定される。引数については、
Cでは引数の数はチェックされなくなり、C++では引数なしの関数であると
仮定される。
でもって実際にはfuncの定義を見ると引数が2つある。
0598デフォルトの名無しさん
2007/03/13(火) 11:57:272段落目の引数のとこは無視。3段落目の文が正しい。
0599デフォルトの名無しさん
2007/03/13(火) 11:57:36それはVCだからではなく、C++としてコンパイルしているからだと思う。
0600デフォルトの名無しさん
2007/03/13(火) 11:59:12>>598のほうを無視だ。
2段落目はプロトタイプ宣言自体の説明で3段落目は省略時の話だわい。
0601デフォルトの名無しさん
2007/03/13(火) 12:00:050602デフォルトの名無しさん
2007/03/13(火) 12:03:570603デフォルトの名無しさん
2007/03/13(火) 12:04:16(Cの場合)
プロトタイプを書いた場合は、呼び出し形式や定義がその通りになっていないと
怒られる。
これでよいかな。
0604デフォルトの名無しさん
2007/03/13(火) 12:20:14普通にコンパイル通る。
0605デフォルトの名無しさん
2007/03/13(火) 12:23:10b.h で定義してある
typedef struct {
:
} TYPEB;
というのがあるとき、b.hをincludeしてない別のヘッダファイル内で
TYPEBを引数に持つ関数の宣言はどうやるのが正しいのでしょうか?
/* in a.h */
struct TYPEB; /* プロトタイプ宣言 これがないと次の行でTYPEBが未定義と怒られる? */
struct TYPEB* func (struct TYPEB* arg);
これであってます?
0606デフォルトの名無しさん
2007/03/13(火) 12:32:25b.h で
typedef struct typeB { } TYPEB;
/*
struct typeB { };
typedef struct typeB TYPEB;
*/
としているのならば、a.h では
struct typeB* func(struct typeB* arg);
という宣言が可能。
元記述だと名前なし構造体なので
b.h を include するなりして、TYPEB を確定させるしかない。
0607605
2007/03/13(火) 12:38:15すばやいご回答ありがとうございます。
typedef struct name { } TYPEB;
のnameをつけるのとつけないのは何が違うのか良くわからなかったのですが
よくわかりました。ありがとうございます。
0608デフォルトの名無しさん
2007/03/13(火) 13:45:440609デフォルトの名無しさん
2007/03/13(火) 13:48:570611デフォルトの名無しさん
2007/03/13(火) 14:05:37疲れてしまいました。そこでMFCかC++Builderか悩んでいます。
調べた感じC++Builderが開発効率が良さそうなのですが、実際のところはどうでしょう
みなさん、どのような環境で開発してるんですか?
0612デフォルトの名無しさん
2007/03/13(火) 14:55:08tako,23,134,2345,
hoge,344,11,
このようなカンマで区切られた、1行のデータ数が適当だったり
カンマの個数がまちまちだったりするデータを読み込んで
data[1].name data[1].score1
に入力していきたいのですが。
fscanfを使わないでやりたいのです
0613デフォルトの名無しさん
2007/03/13(火) 15:00:48何が知りたいの?
0614デフォルトの名無しさん
2007/03/13(火) 15:02:46fgets strtokあたりの使い方を
0615デフォルトの名無しさん
2007/03/13(火) 15:08:180616デフォルトの名無しさん
2007/03/13(火) 15:11:320617デフォルトの名無しさん
2007/03/13(火) 15:11:32%100[^,\n]
とかの書式指定はできるけど
fscanf がダメな理由はあるの?
0618デフォルトの名無しさん
2007/03/13(火) 15:15:32fscanfだと
%s,%d,%d,%d, みたいに書式が分かっていないとだめですよね。
カンマと「 (スペース)」が混在したりもしているので。
カンマとスペースで区切って、任意の変数にファイルから読み込むというのを
最終的にやりたいのですが、カンマの時点で突っかかりました
0619デフォルトの名無しさん
2007/03/13(火) 15:22:050620デフォルトの名無しさん
2007/03/13(火) 15:22:28strtokでみてみて、いまいち意味がわからないのが
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の動きもよくわかりません
0621デフォルトの名無しさん
2007/03/13(火) 15:23:09最終的に行数=人数も吐き出したいので、1文字ずつより1行ずついきたいのです
0622デフォルトの名無しさん
2007/03/13(火) 15:23:16top = tail = buf;
カンマ, スペースが来るまで tail を進める。 (*)
top から tail までがトークン 適当に切り出す。 strncpy(dst, top, tail-top);
top = tail+1;
(カンマ, スペースが続く間 top を進める)
* 最後まで繰り返し
0623デフォルトの名無しさん
2007/03/13(火) 15:23:36http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
manでも読んどけ
0624デフォルトの名無しさん
2007/03/13(火) 15:28:34引数がわたってきたときはそれで専用ポインタを初期化する。
NULLがきたら、既に覚えてるはずの専用ポインタの値を使う。
0625デフォルトの名無しさん
2007/03/13(火) 15:30:34やってみます。というか似たようなことで詰まってる人他にもいるだろうに
>>623manページは伝えわるような文じゃないので、わかんないっす
0626デフォルトの名無しさん
2007/03/13(火) 15:32:48読み込むデータをリダイレクトでこれに流し込んでみて
#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;
}
0627デフォルトの名無しさん
2007/03/13(火) 15:34:380628デフォルトの名無しさん
2007/03/13(火) 15:37:11同意
0629デフォルトの名無しさん
2007/03/13(火) 15:44:19理想どおりの動きをしました…ただ、自分の読解力の無さのためfscanfの項で何をしているのかがわからないです
ほんとすんません
0630デフォルトの名無しさん
2007/03/13(火) 15:45:57man くらいは読めないとな
っ 【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0631デフォルトの名無しさん
2007/03/13(火) 15:46:53それはつまり逐一解説しろってこと?
0632デフォルトの名無しさん
2007/03/13(火) 15:47:41日本語を読めない
……どうするんだろう。
0633デフォルトの名無しさん
2007/03/13(火) 15:58:310634デフォルトの名無しさん
2007/03/13(火) 16:19:22C++Builderは使ったこと無いのでわかりませんが
MFCはVC++との相性がよいので比較的ラクだと思います。
ただMFCには使ってはいけないといわれるクラス(CSocketとか)がいくつかあるので、
そういう地雷を踏まないように経験を積む必要はありますが。
TreeViewとかListViewとかWebBrowserとか、
Windowsのコンポーネントを使うにはMFCは便利なので、
MFCは使えるように初期化だけしておいて、必要なクラスだけ使う、
のがいいんじゃないでしょうか。
と言ってみるテスト
0635デフォルトの名無しさん
2007/03/13(火) 17:09:550636582
2007/03/13(火) 17:15:31なるほど・・・ご回答ありがとうございます。
思考ルーチン部そのものがイベントドリブンな感じなので(自分のターンがきたときや、
ポン・チーの問い合わせ時のみ思考関数を呼び出しています)、
それ以外の暇なときに、ユーザ入力部に相当する、チェックボックスやラジオボタンの変更を
チェックする関数を呼び出す、みたいな感じでやってみようと思います。
0637デフォルトの名無しさん
2007/03/13(火) 17:44:27おもいっきり日本語解説文じゃねーか
てっきり「きっと、英語の難しい解説文なんだろうな」
と思って損した。
0638デフォルトの名無しさん
2007/03/13(火) 17:48:300639デフォルトの名無しさん
2007/03/13(火) 17:52:290640デフォルトの名無しさん
2007/03/13(火) 18:10:240641デフォルトの名無しさん
2007/03/13(火) 18:54:08何かコマンドを取るプログラムを作る時のみで構いませんよね?
0642デフォルトの名無しさん
2007/03/13(火) 18:54:560643デフォルトの名無しさん
2007/03/13(火) 19:34:3610Lの"L"とは一体何なんでしょうか?
ただの10でも動くのですが、必要なのでしょうか?
0644デフォルトの名無しさん
2007/03/13(火) 19:36:40C 長整数型 リテラル
0645デフォルトの名無しさん
2007/03/13(火) 19:58:28引数を必要としない、かつ呼び出し元に何も通知する必要が無ければ
void main(void)
でおk
>>643
Lがlongですよーって明示的に言ってる。必要か不要化?
最近のコンパイラは頭が良いので付けなくても良いけど、
自分や後からコードを見た人にとっては有った方が嬉しいね。
0646デフォルトの名無しさん
2007/03/13(火) 20:01:050647デフォルトの名無しさん
2007/03/13(火) 20:05:410648デフォルトの名無しさん
2007/03/13(火) 20:07:24「main関数の返値をvoidにするのは規格違反」
0649デフォルトの名無しさん
2007/03/13(火) 20:09:37把握した
>>645
コンパイラは頭が良いので
↓
プロトタイプ宣言があれば(この場合は関数呼び出しより前に #include<stdio.h> があれば、でも可)
ANSI準拠でないことは確かだな。
0651645
2007/03/13(火) 20:15:060652デフォルトの名無しさん
2007/03/13(火) 20:23:16関数にconst参照で渡す処理を行うんですが
値渡しでなく、const参照渡しを使うことによる目に見えるほどのデメリットが生じる可能性はあるでしょうか?
0653デフォルトの名無しさん
2007/03/13(火) 20:27:11自立環境(フリースタンディング)では、
エントリポイントが処理系定義となっていたはず。
それならANSI準拠を名乗れる。
0654デフォルトの名無しさん
2007/03/13(火) 21:49:16manなんてものは全然知らなかった。
>>638の驚愕に驚愕した。
文章は日本語だけど画面構成が見づらいね。
個人的にはMSDNの方が見やすい。
0655デフォルトの名無しさん
2007/03/13(火) 21:51:58一番最初に出て来るジャマイカ
0656デフォルトの名無しさん
2007/03/13(火) 21:58:05unix 系OSには man というコマンドがあって
man fopen
とかすると解説が出てくるんだ (マニュアルがインストールされていれば)
>>630 の URL は linux の man を翻訳したもの
なので ls (dir みたいなもの) のヘルプとかも調べられる
0657デフォルトの名無しさん
2007/03/13(火) 22:08:50そりゃ、コンソール上に表示するための画面構成だから
0658デフォルトの名無しさん
2007/03/13(火) 22:12:240659デフォルトの名無しさん
2007/03/13(火) 22:12:30はいはいクマクマ
0660デフォルトの名無しさん
2007/03/13(火) 22:14:37/dev/dspつかえるし
0661654
2007/03/13(火) 22:16:47linuxな人ってああいうのが多いんだ?
0662デフォルトの名無しさん
2007/03/13(火) 22:18:100663デフォルトの名無しさん
2007/03/13(火) 22:22:550664デフォルトの名無しさん
2007/03/13(火) 22:26:17そんな気にするような欠点は無いと思ってよい。
それよりもここはC++のスレでないから、
スレ違いであることを気にしろ。
>>654
MSDNライブラリはオフラインならいいけど、
オンラインはいいと思えない。その点manとどっちもどっち。
0665デフォルトの名無しさん
2007/03/13(火) 22:33:37そりゃ独学で一年の奴の「世界観」とやらが広いわけはないが、
お前の性格が少々アレな感じなのはそれとは全く独立の事象だ。
0666デフォルトの名無しさん
2007/03/13(火) 22:35:370667デフォルトの名無しさん
2007/03/13(火) 22:37:45これだからゆとりは…
0668デフォルトの名無しさん
2007/03/13(火) 22:38:01Windowsプログラマの癖にMSDNを知らなかったらビックリするだろ? そんな感じ。
でも Linux/Unix を触ったことがないヤツなら別に知らなくてもフツー。
>>638 が驚愕してるのは >>638 が偏見と先入観に満ちてる馬鹿だから。
0669デフォルトの名無しさん
2007/03/13(火) 22:39:060670デフォルトの名無しさん
2007/03/13(火) 22:39:360671デフォルトの名無しさん
2007/03/13(火) 22:40:13ゆとり乙
0672デフォルトの名無しさん
2007/03/13(火) 22:43:39世界観云々を言うのはナンセンスじゃないのか?
0673デフォルトの名無しさん
2007/03/13(火) 22:43:52別にman知らなくてもゆとりでもOKだな
0674デフォルトの名無しさん
2007/03/13(火) 23:28:410675デフォルトの名無しさん
2007/03/13(火) 23:32:340676デフォルトの名無しさん
2007/03/13(火) 23:37:49そもそもExpressに付いてくるMSDNライブラリはExpress仕様で、
CRT関数や.NET Frameworkのクラスライブラリのリファレンスなんかが
すっぽり抜け落ちていて使い物にならなかったはず。
0677デフォルトの名無しさん
2007/03/13(火) 23:43:470678デフォルトの名無しさん
2007/03/13(火) 23:52:04要するに_s付きの関数が標準で用意されてると思いこませる仕様ってことか。
0679デフォルトの名無しさん
2007/03/13(火) 23:52:43Sun、Solarisあたり触ってると思うんだけど
man知らない人って文系でプログラミングやってるの?
0680デフォルトの名無しさん
2007/03/13(火) 23:56:310681デフォルトの名無しさん
2007/03/13(火) 23:57:290682デフォルトの名無しさん
2007/03/13(火) 23:59:40いや、そういう関数リファレンスみたいなものは一切無かったはず。
コンパイラオプションとかチュートリアル程度だった気がする。
今はもうMSDN ライブラリExpressはインストールしていないから、詳しくは忘れたが。
もっとも、普通のMSDNライブラリでも_s付き関数は非標準だとどこにも書いていないが。
0683デフォルトの名無しさん
2007/03/14(水) 00:00:02msdnライブラリのオフライン版には API のマニュアルもついているんでしょうか?
今2G超のイメージファイルをダウンロード中ですがあと7時間ほどかかりそうなので
もし API のマニュアルが含まれていないなら中断しようかと思っています
0684デフォルトの名無しさん
2007/03/14(水) 00:06:14ただし英語で良いならPlatform SDK/Windows SDKのドキュメントにも同じものが入っている。
0685デフォルトの名無しさん
2007/03/14(水) 00:07:12UNIXもそう。
在学中はプレゼン資料作成以外にコンピュータは使わず、
卒業後に趣味でプログラミング始めた俺みたいなのもいる。
0686デフォルトの名無しさん
2007/03/14(水) 00:11:34ありがとうございます
粘ってダウンロードすることにします
0687デフォルトの名無しさん
2007/03/14(水) 00:23:07ECMA規格化されたC++/CLIの規格に入ってるから
非標準というわけでもないんだよな。
それでなくともCRTのセキュア化は必要だし
0688デフォルトの名無しさん
2007/03/14(水) 00:38:46研究室にはあったかもしれないが
授業とかの環境もボーランドC++3だったし
0689デフォルトの名無しさん
2007/03/14(水) 03:44:51void 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;
}
0690689
2007/03/14(水) 03:46:34int 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);
これらを解説お願い致します。
0691689
2007/03/14(水) 03:52:540692デフォルトの名無しさん
2007/03/14(水) 03:56:163 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
0693689
2007/03/14(水) 03:58:340694689
2007/03/14(水) 04:06:24ありがとうございました、何となく理解できました
0695デフォルトの名無しさん
2007/03/14(水) 04:08:404 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
0696689
2007/03/14(水) 04:11:14実行すると始めは、2,4,3,5あのですが・・・・
0697689
2007/03/14(水) 04:27:17{2,4,3,5};に於いて、nは2、n-1とは4でn-2は3、n-3が5なのでしょうか?
そして、jとは基準値との事ですが、j+1とは何なのでしょうか?
0698デフォルトの名無しさん
2007/03/14(水) 04:36:512 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 (結果)
0699デフォルトの名無しさん
2007/03/14(水) 04:56:23> {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のつぎ、つまりうしろという意味です
わかった?
0700689
2007/03/14(水) 04:59:26nとは因みに、どの事をさすのでしょうか?要素が4つですよね?
0701689
2007/03/14(水) 05:03:51あー!更にわかってきました!あとは深く考えてみて理解を深めます
皆さん、黎明までつきあって戴き、ありがとうございました。
0702デフォルトの名無しさん
2007/03/14(水) 05:05:38ループを一回ずつ追って、配列の中身がどのように変わるか
それを机上でやってみてください
0703689
2007/03/14(水) 05:10:10とは、4ー1=3と考えて宜しいでしょうか?又、他のも然りですかね?
0704689
2007/03/14(水) 05:11:29はい、そうしてみまふ
0705デフォルトの名無しさん
2007/03/14(水) 05:12:43そうです
0706689
2007/03/14(水) 05:17:10んですね
0707デフォルトの名無しさん
2007/03/14(水) 05:42:35然り。
配列扱うとき個数が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 のとき無駄な処理
0708689
2007/03/14(水) 05:45:42ちんぷんかんぷんで今一わからない…
0709689
2007/03/14(水) 05:47:07iやjがわけわからなくなってきます
0710デフォルトの名無しさん
2007/03/14(水) 05:58:01例えば
float f = 0.123456;
float g = 0.987654
に対して、0.123と0.988を返して欲しいんですが。
0711デフォルトの名無しさん
2007/03/14(水) 06:01:30float h = 98.7654;
については、98.8 にしたいです。
0712デフォルトの名無しさん
2007/03/14(水) 06:20:02その文字列をatofでfloatにする
float f1, f2;
char s[128];
f1 = 98.7654;
sprintf(s, "%.3g\n" , f1); /* 98.7654は文字列の"98.8"になる */
f2 = atof(s);
0714デフォルトの名無しさん
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関数に万が一でも文字を
いれると無限にこの関数が実行してしまう。このバグを回避する方法とかを何とか・・・。
0715デフォルトの名無しさん
2007/03/14(水) 23:32:430716デフォルトの名無しさん
2007/03/14(水) 23:34:58getsは氏ね
0717デフォルトの名無しさん
2007/03/14(水) 23:38:210718デフォルトの名無しさん
2007/03/14(水) 23:40:47ただ死んで終わるものではなく、又吉イエスによって火の中に投げ込まれるレベル。
0719デフォルトの名無しさん
2007/03/14(水) 23:46:15for の条件式が意味を成してない
scanf なんて使うのは、個人での練習段階だけだろうから
文字を入れられるとかは気にしなくていいんじゃない?
0720デフォルトの名無しさん
2007/03/14(水) 23:58:55gotoってネストしたループ&switchからの脱出以外で、必要性ってあったっけ?
0721デフォルトの名無しさん
2007/03/15(木) 00:00:41エラーが出ればそこにすっとぶってやってる人もいるな
0722デフォルトの名無しさん
2007/03/15(木) 00:01:22if(A()) break;
if(B()) break;
// :
} while(0);
なんていう汚いプログラムを書かなくてすむようになる。
0723デフォルトの名無しさん
2007/03/15(木) 00:05:17for(;;)
{
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;
}
0724デフォルトの名無しさん
2007/03/15(木) 00:14:31その入力をクリアしないでまたscanf呼ぶと、また同じことになる
scanfの是非以前にこの挙動は把握するべき
0725714
2007/03/15(木) 00:15:43ところで俺はコマンドライン引数というのを最近勉強して知ったんだがそれを応用した実用性のあるソースをまだみたことがない。急にすまないがそのソースの例を示してくれないか?
0726デフォルトの名無しさん
2007/03/15(木) 00:17:280727デフォルトの名無しさん
2007/03/15(木) 00:17:380728デフォルトの名無しさん
2007/03/15(木) 00:18:120729デフォルトの名無しさん
2007/03/15(木) 00:24:000730デフォルトの名無しさん
2007/03/15(木) 00:36:17それよりもメモリと代入を応用したソースってあるの?
0731デフォルトの名無しさん
2007/03/15(木) 00:38:170732714
2007/03/15(木) 00:41:31それ危険w
質問の意味を取り違えているような…。例えば
int main(int argc,char *argv[]){…}
みたいにコマンドライン引数を応用した実用性のある例を示してくれないだろうか。
0733デフォルトの名無しさん
2007/03/15(木) 00:44:58int main(int argc, char **argc) {
for(;*argc;argc++) if(!remove(*argc)) return 1;
return 0;
}
0734デフォルトの名無しさん
2007/03/15(木) 00:46:24>>726
0735デフォルトの名無しさん
2007/03/15(木) 00:50:58たとえば、別のプロセスから起動させるときとか
実行ファイルのアイコンに処理するファイルをD&Dしたときとか
指定したスイッチによって処理方法変えたいときとか
0736デフォルトの名無しさん
2007/03/15(木) 00:52:00いや、>>729 とかがまさにそれじゃないのか?
format だってプログラムだ、
"fotmar c:" で、argc に 2 が、argv[1] には "c:" が入ってるだろう
0737714
2007/03/15(木) 01:12:34じゃあ、bcc32_○○.cみたいにコンパイルするのもそれってことなのか?
0738デフォルトの名無しさん
2007/03/15(木) 01:20:580739デフォルトの名無しさん
2007/03/15(木) 01:26:03可哀想に見えてくるのは禁じえない
0740デフォルトの名無しさん
2007/03/15(木) 03:30:53void 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;
}
0741デフォルトの名無しさん
2007/03/15(木) 03:32:52if(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");
}
0742デフォルトの名無しさん
2007/03/15(木) 03:33:59エラー 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 ***
どうしても、参考書のソースと比較しても解決しませんので、ご指摘お願い致します。
0743デフォルトの名無しさん
2007/03/15(木) 03:41:57>int a = {9,6,5,1,2};
>>742
>どうしても、参考書のソースと比較しても解決しませんので、ご指摘お願い致します。
新しい参考書かメガネ買ってこい。
0744デフォルトの名無しさん
2007/03/15(木) 03:45:29できました!!サンkすです
あまり良いソースではないのでしょうか?
0745デフォルトの名無しさん
2007/03/15(木) 04:09:25>int a = {9,6,5,1,2};
もし、↑以外が参考書の通りだっていうのなら
まずはその著者を教えてくれ。
0746デフォルトの名無しさん
2007/03/15(木) 04:27:470747デフォルトの名無しさん
2007/03/15(木) 04:29:19一人が今挙げた人ともう一人が渡辺さんです
0748デフォルトの名無しさん
2007/03/15(木) 04:30:52因みに解説もあまりなく全然わかりませんし…
0749デフォルトの名無しさん
2007/03/15(木) 04:38:06for(h = 1; h <= n; h = 3*h + 1)
;
h /= 3;
この辺り高度すぎて俺には理解不能
0750748
2007/03/15(木) 04:40:21しかも途中に;が付くなんて初めて見ました
皆さんサンクスでしたノシ
0751デフォルトの名無しさん
2007/03/15(木) 05:27:27参考書丸写しする前に、もっと簡単な本で文法の基礎から勉強しろ。
0752デフォルトの名無しさん
2007/03/15(木) 06:06:25たくさんの2次元配列を使いたいときは、どうすればいいのでしょうか?
それとも、扱える配列の最大数は決まっているんでしょうか?
私の環境では、
double a[359][359];
までしか宣言できないんです。
もっと大きな配列、例えば、
a[0][0]〜a[1000][1000]
とかを使えるとうれしいのですが。
0753デフォルトの名無しさん
2007/03/15(木) 06:33:07for(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);
0755デフォルトの名無しさん
2007/03/15(木) 07:58:370756デフォルトの名無しさん
2007/03/15(木) 09:15:24なんて参考書なのか教えて
0757デフォルトの名無しさん
2007/03/15(木) 09:40:38好きなのに・・・・
0758デフォルトの名無しさん
2007/03/15(木) 11:35:45ぃゃ、Cはすべての基本です。
OSはもちろん、サーバなどのプログラムは今でもほとんどC(C++ではない)で書かれています。
なのでCができるならそれにこしたことはないでしょう。
CというのはアセンブラなみのCPU直接操作に近いことから、
高級言語並みの隠蔽処理までできますが、
その分プログラマーの力加減で完成度が激しく変わってくる難しい言語です。
0759デフォルトの名無しさん
2007/03/15(木) 11:35:570760デフォルトの名無しさん
2007/03/15(木) 11:43:110761デフォルトの名無しさん
2007/03/15(木) 11:46:18>>752 で宣言するとスタックエリアに配列領域を確保しようとするので、
スタックサイズを超える領域は確保できないのです。
スタックサイズはプロセス起動時にOSによって割り当てられますが
通常は1MB程度と考えたほうがよいでしょう。
WIN32の場合は1MBです(プロセス作成時にデフォルトスタックサイズを変更できますが)
この領域はさらに関数呼び出しなどで利用されるので、
ローカル変数で使える領域は更に狭く数10KB程度が上限と考えるべきです。
double変数が4バイトと仮定しても(正確には環境によって違う)
4 x 359 x 359 = 503KBとなり、スタックの約半分が消費されてしまいますから
致命的なメモリエラー(スタック不足)の元になります。
0762デフォルトの名無しさん
2007/03/15(木) 12:06:240763デフォルトの名無しさん
2007/03/15(木) 12:11:260764デフォルトの名無しさん
2007/03/15(木) 12:26:34ありが�d
0765デフォルトの名無しさん
2007/03/15(木) 12:36:17サーバーのプログラムってなんですか?
0766デフォルトの名無しさん
2007/03/15(木) 12:36:53int main(void)
{
int no;
printf("正の整数を入力してください:");
scanf("%d", &no);
while(no>=0)
printf("%d", no--);
putchar('\n');
return(0);
}
これで改行が入らないのは何故でしょうか?
うんこな質問ですいません
0767デフォルトの名無しさん
2007/03/15(木) 12:41:33改行をどこに入れたいの?
各数字ごとなら、
printf("%d\n", no--);
とするか、
while(no>=0)
{
printf("%d", no--);
putchar('\n');
}
で
0768デフォルトの名無しさん
2007/03/15(木) 12:41:39while(no>=0)
{
printf("%d", no--);
putchar('\n');
}
0769デフォルトの名無しさん
2007/03/15(木) 12:49:34>これで改行が入らないのは何故でしょうか?
while(no>=0)
printf("%d", no--);
putchar('\n');
が
while(no>=0)
{
printf("%d", no--);
}
putchar('\n');
と実行されてるからだよ
0770デフォルトの名無しさん
2007/03/15(木) 12:50:12付けてもいいけど、個人的には勧めない。
0771デフォルトの名無しさん
2007/03/15(木) 12:53:53関数以外で () つける場合は、空白入れるようにしてるけど。
0772デフォルトの名無しさん
2007/03/15(木) 12:55:26少なくともapache (httpサーバー) はC言語だね。
良く使われてるメールサーバも、データベースサーバもみんなC言語ですね。
過去の遺産を引き継いでいるから?それともC++に移行できない理由(パフォーマンス?)があるのでしょうか?
教えてエロイひと
0773デフォルトの名無しさん
2007/03/15(木) 12:59:100774デフォルトの名無しさん
2007/03/15(木) 13:05:210775デフォルトの名無しさん
2007/03/15(木) 13:06:27こちらへ
初心者のためのプログラミング言語ガイド Part3
http://pc11.2ch.net/test/read.cgi/tech/1152778344/
getsとgotoとscanfを窓から投げ捨てろ
0777デフォルトの名無しさん
2007/03/15(木) 13:23:200778デフォルトの名無しさん
2007/03/15(木) 13:46:40C覚えたら何かできるか、というよりも、
サーバーみたいなものを作っている人達と一緒に仕事をするなら
Cはできなきゃ話にならん、ということなんでしょうな。
普通にWEBプログラマーやってるだけならC言語知らなくても何とかなるけどね。
rubyとかphpの簡単さ加減を覚えるとCなんてマンドクセ、てなる。
0779デフォルトの名無しさん
2007/03/15(木) 14:05:240780デフォルトの名無しさん
2007/03/15(木) 14:05:550781デフォルトの名無しさん
2007/03/15(木) 19:56:02しかしOS上で動くアプリとしては段々と使われなくなっていくと思う。
0782デフォルトの名無しさん
2007/03/15(木) 20:12:340783デフォルトの名無しさん
2007/03/15(木) 20:14:080784デフォルトの名無しさん
2007/03/15(木) 20:49:23去年一年間。
0785714
2007/03/15(木) 21:04:14gotoやscanfなら捨てられそうだが、getsはすてられそうもない。とりあえずgetsがダメな理由を。
文字をキーボードから入力し、その文字列をファイルに出力できる方法が別にあるならそれでもいいが…。
0786デフォルトの名無しさん
2007/03/15(木) 21:07:29バッファ長以上の長さの入力があったら死ぬから。
fgets(... stdin);を使う。
0787デフォルトの名無しさん
2007/03/15(木) 21:17:14/ミミ\\\\ \
/ミミミ\\\\\\\
/彡ミミミ\\\\\\\\
|彡ミミ/\\\\\\\\|
|彡 | \\\\\\\|
ヽ |へ、_ _,へ\\\\/
| __ __ | / ) ゲッツ!!
| |/ ノ
| ( / _ ) /
ヽ ヽ |
ヽ ヽー‐‐‐ァ /\
//ヽ ヽ-‐' / /\ \
/ / ヽ_ / / / \
/ \ |\ /| /\ \
(⌒\ / (⌒ヽ |二| | / \ \
__ゝ ヽ ___ ゝ \ \| / / |
( ヽ─ ( l ) ヽヽ / / / |
 ̄ ̄( ̄丿 |  ̄ ̄( ̄ ゝ \ / / |
( ̄ノ | ( ̄ ゝ | ̄ ̄ ̄ ̄ |
( ̄ノ | ( ̄ ゝ |
0788デフォルトの名無しさん
2007/03/15(木) 21:25:00そういうのが標準ってあたりC言語って恐いな。
0789デフォルトの名無しさん
2007/03/15(木) 21:38:580790デフォルトの名無しさん
2007/03/15(木) 21:39:52>>786
getsってこわいな。とりあえずstdinでバッファオーバーランを避けられてよかったよ。
0791デフォルトの名無しさん
2007/03/15(木) 21:43:19getsはプログラマではなくユーザの信頼性の問題だろうが。こいつらは絶対に信じられないが
0792デフォルトの名無しさん
2007/03/15(木) 21:48:56C言語って怖いな、への(ネタ)レスであってgetsどうこう言いたいんじゃなかとです…
0793デフォルトの名無しさん
2007/03/15(木) 21:56:320794デフォルトの名無しさん
2007/03/15(木) 23:07:54Cはアプリ作成用言語としては廃れて行ってるだろう。
UNIX系OSはかなり前からその傾向強かったしな。CGIが
Perlばかりだったのはそのせいでもある。ちょっとした
プログラムならわざわざCで作らずにシェルスクリプトや
sed, awk, perl などのスクリプトで作るというのがUNIX系
OSでは普通だった。Cで作るとしたら高速に動かしたい
とか効率良く動かしたい場合、あるいはソースを見せ
たくない場合だ。(GUIはスクリプトが対応していなくて
Cでしか作れないという場合もあったが)
0795デフォルトの名無しさん
2007/03/15(木) 23:12:020796デフォルトの名無しさん
2007/03/15(木) 23:24:10Unix系で「ソースを見せたくないからC」なんて有り得ない。
0797デフォルトの名無しさん
2007/03/15(木) 23:27:35>GUIはスクリプトが対応していなくて
つ Tcl/Tk
0798デフォルトの名無しさん
2007/03/15(木) 23:28:59今ではLinux界隈でもバイナリのみ配布とかあるし。
0799デフォルトの名無しさん
2007/03/15(木) 23:30:150800デフォルトの名無しさん
2007/03/16(金) 03:58:21むしろWinのほうがCの使用はすたれてるだろ。
sed、awkでは普通文字列処理しかできんし。
ていうかUN*Xのプログラムは今でもかなり多くがCだぞ
>GUIはスクリプトが対応していなくて
つ pygtk
とネタにマジレスてみるテスト
0801デフォルトの名無しさん
2007/03/16(金) 06:37:060802デフォルトの名無しさん
2007/03/16(金) 08:46:42オブジェクト指向に慣れてコードの拡張性あげていくのが楽しくなってきたので
いまからC流でコードを書けといわれてもどうしていいかわからない
0803デフォルトの名無しさん
2007/03/16(金) 11:12:310804デフォルトの名無しさん
2007/03/16(金) 15:29:090805デフォルトの名無しさん
2007/03/16(金) 15:47:330806デフォルトの名無しさん
2007/03/16(金) 19:16:560807デフォルトの名無しさん
2007/03/16(金) 21:21:08変換によって有効桁が失われるって警告出るんですが、
わざと消すためにやってるわけで
出ないようにする方法はありませんか?
0808デフォルトの名無しさん
2007/03/16(金) 21:25:52#if defined(__BORLANDC__)
#pragma warn -????
#endif
BYTE hoge = ...
hoge >>= n;
#if defined(__BORLANDC__)
#pragma warn .????
#endif
????にはその警告とやらの番号を当てはめてくれ。
0809デフォルトの名無しさん
2007/03/16(金) 21:37:35多分、その警告はシフト演算の際に byte 型とやらが int に昇格され、
演算後に再びその byte 型に代入される際に出ている警告。
明示的に
BYTE hoge = ...
hoge = (BYTE)(hoge >> n);
とかやってやると警告はでなくなると思う。
0810デフォルトの名無しさん
2007/03/16(金) 22:36:15もののファイル名の指定をchar配列で指定したいのですがいい方法は
ありませんでしょうか。例えばsystem("copy hairetu +sum.txt sum.txt");
みたいにしたいのですがやり方がわかりません。どなたかご教授ください。
0811デフォルトの名無しさん
2007/03/16(金) 22:38:220812デフォルトの名無しさん
2007/03/16(金) 22:39:15ファイル名部分を可変にしたいってことならsprintf。
0813デフォルトの名無しさん
2007/03/16(金) 22:39:220814デフォルトの名無しさん
2007/03/16(金) 22:41:13というような、ありがちな<>で区切られたデータを
構造体に格納したいですが、どういう風にすればよいのか
いまいちよくわかりません。 教えてください
0815デフォルトの名無しさん
2007/03/16(金) 22:44:43つ[sscanf(string, "%[^<]<>%[^<]<>%d", ...)]
0816デフォルトの名無しさん
2007/03/16(金) 22:44:430817デフォルトの名無しさん
2007/03/16(金) 23:02:30ありがとうございました。
また、sscanfの知らない使い方があったみたいなので
それについて調べてみます。
0818デフォルトの名無しさん
2007/03/16(金) 23:12:00sscanf("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
$
0819デフォルトの名無しさん
2007/03/16(金) 23:48:45�dクスです。
0820デフォルトの名無しさん
2007/03/17(土) 01:47:18バグだらけでした<>
0821デフォルトの名無しさん
2007/03/17(土) 06:10:08{
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 をどうにかする
}
}
0822デフォルトの名無しさん
2007/03/17(土) 09:35:44int 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型は渡せないと出ます。
配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
&をつけるのでしょうか?
0823デフォルトの名無しさん
2007/03/17(土) 10:26:111 % 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;
}
0824デフォルトの名無しさん
2007/03/17(土) 10:27:12a ← アドレス
a[i] ← 値
&a[i] ← アドレス
0825デフォルトの名無しさん
2007/03/17(土) 10:29:10なぜも何も、それが % 演算子だ
% って何か知ってる?
0826デフォルトの名無しさん
2007/03/17(土) 10:34:150827それはBasic
2007/03/17(土) 11:11:160828デフォルトの名無しさん
2007/03/17(土) 11:12:580830デフォルトの名無しさん
2007/03/17(土) 11:18:43\ っぽいけど % なのは何BASIC ?
ttp://ja.wikipedia.org/wiki/BASIC#.E4.B8.BB.E3.81.AA.E4.BA.88.E7.B4.84.E8.AA.9E.E3.81.A8.E6.A7.8B.E6.96.87
0831デフォルトの名無しさん
2007/03/17(土) 11:26:27Cでは、整数を整数で割るだけで整数除算になるので専用の演算子はない。
0832デフォルトの名無しさん
2007/03/17(土) 11:26:27生きるがよい
0833デフォルトの名無しさん
2007/03/17(土) 13:23:07*dest *src はそれぞれ何の略なのか教えて欲しい
0834デフォルトの名無しさん
2007/03/17(土) 13:23:43source
0835デフォルトの名無しさん
2007/03/17(土) 13:26:26ありがとうございました
0836デフォルトの名無しさん
2007/03/17(土) 13:29:580837デフォルトの名無しさん
2007/03/17(土) 13:46:530838デフォルトの名無しさん
2007/03/17(土) 17:05:170839デフォルトの名無しさん
2007/03/17(土) 22:03:330840デフォルトの名無しさん
2007/03/18(日) 03:11:08個人的にはcallocの0クリアがされてた方が
バグもあまり発生せず、なんだか扱いやすい気がするんだけど、
なんか考え方が間違ってます?
0841デフォルトの名無しさん
2007/03/18(日) 03:16:53決まりごとでもない限りどーでもいい部分だな
0842デフォルトの名無しさん
2007/03/18(日) 03:24:31バグにはならんような気がする。
0クリアされている必要なんて無い場合も多いし。
0843・∀・)っ-○◎●
2007/03/18(日) 03:25:24その原因となる箇所がよくわかってないってことだろ?
むしろそれが問題だ
ちなみにcallocは内部でmallocでメモリ確保したものをmemsetで
ゼロクリアしてから返してる。
メモリアロケーションの方法は1種類じゃないんだから、むしろゼロクリアが
必要なときに的確にする癖をつけたほうがいい。
0844デフォルトの名無しさん
2007/03/18(日) 04:03:03オカルトな法則やルールができていくんだよなー
0845デフォルトの名無しさん
2007/03/18(日) 04:32:47static変数とか
0846デフォルトの名無しさん
2007/03/18(日) 09:16:080847810
2007/03/18(日) 11:14:080848デフォルトの名無しさん
2007/03/18(日) 11:36:05test[6][7] だったら、「7」を取得したいのですが、
int l
l=strlen(test[0])
printf("%d",l);
ではうまくいきません
0849デフォルトの名無しさん
2007/03/18(日) 11:40:34それが本当に二次元配列なら、sizeof(test) / 6。
まぁ、定数か変数で覚えておけと。
0850デフォルトの名無しさん
2007/03/18(日) 11:41:040851デフォルトの名無しさん
2007/03/18(日) 11:44:42マジックナンバーであることが根本的に問題じゃないか?
0852デフォルトの名無しさん
2007/03/18(日) 11:45:55sizeofで解決できました ありがとうございました
0853デフォルトの名無しさん
2007/03/18(日) 11:46:14例として出してるだけだろ
0854デフォルトの名無しさん
2007/03/18(日) 11:48:110855デフォルトの名無しさん
2007/03/18(日) 12:00:13assert(sizeof a[0] / sizeof a[0][0] == 7);
assert(sizeof a / sizeof[0] == 6);
0856デフォルトの名無しさん
2007/03/18(日) 12:00:15現在は、やさしいCを使ってるのですが、正直微妙ですね。ほとんど「おまじない」とかで
なんでこうなるかということが書かれていない。
独習Cが結構評判いいみたいなのですが、中身をみたら文字だらけでメモリのこと
など載っていないかんじでしたけど、どうですか?初心者にとっては理解しやすいものですかね??
なにかお勧めあったら教えて下さい。
0857デフォルトの名無しさん
2007/03/18(日) 12:02:200858デフォルトの名無しさん
2007/03/18(日) 12:06:330859デフォルトの名無しさん
2007/03/18(日) 12:08:15K&Rプログラミング言語C第2版
これ以外読まなくていい
0860デフォルトの名無しさん
2007/03/18(日) 12:10:010861デフォルトの名無しさん
2007/03/18(日) 12:26:41assert(sizeof a / sizeof[0] == 6); は
assert(sizeof a / sizeof a[0] == 6); の間違い。
0862デフォルトの名無しさん
2007/03/18(日) 12:49:47...
l = numof(test[0]);
↑でもいいけど、↓こっちのほうがいいよな
#define WIDTH 7
#define HEIGHT 6
..
int test[HEIGHT][WIDTH];
..
l = WIDTH;
0863デフォルトの名無しさん
2007/03/18(日) 13:08:060864デフォルトの名無しさん
2007/03/18(日) 13:08:580865デフォルトの名無しさん
2007/03/18(日) 13:11:28#define numof(array) (sizeof (array) / sizeof *(array))
ってしてる。
>>862
> こっちのほうがいいよな
まあ、一長一短だな。
0866デフォルトの名無しさん
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]);
}
}
設計意図をコードに直接反映させることが重要かと思う。
0867デフォルトの名無しさん
2007/03/18(日) 13:25:41> testの全要素表示という意図なら
こんな状況、Cならありえないんじゃない?
コンパイル時にスコープの届かない範囲の配列はポインタと等値になるわけだから、要素長を伝えないといけない(=sizeof は使えない)
そうではなく、スコープの届く範囲の配列は WIDTH と HEIGHT が分かっているんだから sizeof を使う必要はない
やっぱり配列に対して sizeof するのは、コンパイル時に要素長が解決する場合かなと思う
0868デフォルトの名無しさん
2007/03/18(日) 13:36:11下のコードだと、見なくても全部ということがわかる。
なんていっても、結局はtestが2次元配列なのかどうかもtestの定義をみて
初めてわかるからどっちでもいいかといえば、どっちでもいいかもね。
0869デフォルトの名無しさん
2007/03/18(日) 14:12:000870デフォルトの名無しさん
2007/03/18(日) 16:37:07int 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]でもいいのですがここがユーザーの入力で
変わってしまうときどうやって関数で渡したらいいかということです。
0871デフォルトの名無しさん
2007/03/18(日) 16:38:34int main(void)
{
unsigned char Layer[10][20*20];
}
void Function(unsigned char (*Layer)[20*20])
{
Layer[0][5]=123;//値の代入が出来る
}
すいません こうでした
0872デフォルトの名無しさん
2007/03/18(日) 16:46:350873デフォルトの名無しさん
2007/03/18(日) 16:53:540874デフォルトの名無しさん
2007/03/18(日) 17:04:380875デフォルトの名無しさん
2007/03/18(日) 17:10:52基本情報技術者合格すればまあまあですか?
0876デフォルトの名無しさん
2007/03/18(日) 17:14:45それに賛成。
というかサイズが固定ではない場合それ以外の方法ある?
void Function(unsigned char * Layer, int width, int height);
1次元配列でも2次元配列でも
それは1つの連続したメモリであることを利用する。
0877デフォルトの名無しさん
2007/03/18(日) 17:15:16> C言語をある程度理解すれば、プログラマとしてそれなりにやっていけますか?
NO
> 基本情報技術者合格すればまあまあですか?
NO
次の患者さんどうぞ〜
0878デフォルトの名無しさん
2007/03/18(日) 17:16:17int a[1][1]
の時のaって、int*だっけ?int**だっけ?
0879デフォルトの名無しさん
2007/03/18(日) 17:17:27ソフトウェア開発技術者くらいになれば、プログラマとしてやっていけますか?
どれくらいできればやっていけるのでしょうか?
0880デフォルトの名無しさん
2007/03/18(日) 17:21:41プログラマって職業あるのかな。
情報処理の試験と実際の仕事は違うしな。
いまどきC言語が少々程度判った程度ゴロゴロいるだろうし。
他人の作ったプログラムのバグ取したり
機能拡張したりしなければいけない。
その際元あるコードがスパゲッティーで納得いかなくても
自分の付け足したコードが悪いのか元あるコードが悪いのか示すため
元あるコードを消さずに残しておかなければいけないとか。
何かよくわからない説明でプログラムを作らなければいけないとか。
テストを数百件やったとか
バグ発見した件数を毎日数えて
日々少しずつバグが減っているグラフを見せて仕事していることを主張したり。
0881デフォルトの名無しさん
2007/03/18(日) 17:21:56最外周の配列がポインタになる。
そう書けばわかりやすいが、Cの宣言の構文がアレなんで、int (*)[1]。
0882デフォルトの名無しさん
2007/03/18(日) 17:23:01thx
0883デフォルトの名無しさん
2007/03/18(日) 17:25:05プログラマになってから日々勉強じゃないの。
今すぐプログラマになっていいよ。
ちなみに俺はソフトウェア開発技術者試験はまったくだめだ。
さっぱりわからん。
0884デフォルトの名無しさん
2007/03/18(日) 17:29:40面倒だからといって変数名が全部
1文字で意味わかんないようなプログラムを書いちゃ駄目とかそういうことが大事だな。
int a,b,c,d,e,f;
経験積んでメモリ破壊や解放漏れを起こしにくいように心がけたり
テストやデバッグの効率を上げるとかだな。
じゃないとデスマーチで体壊すよ。
0885デフォルトの名無しさん
2007/03/18(日) 17:29:40上司がまともならその人の能力に合わせた仕事をくれるよ
C言語以外にも言語ができる奴には、幅広い仕事くれるし
テストしかできないやつは一生テスト要員
当然評価=給料にも差がつくし、出世にも差がつく
早い話が毎日勉強
ちなみに新入社員をみてる感じこの業界に馴染めない奴は、
一年持たずに辞めていく。一年持てば大丈夫やっていけるよ
0886デフォルトの名無しさん
2007/03/18(日) 17:31:56配列のポインタ配列という形なら、可能といえば可能。
0887デフォルトの名無しさん
2007/03/18(日) 18:02:27>>884
>>885
なんていうか。丁寧にありがとうね。
試験と実際の仕事は違うってよく聞くけどさ。
じゃあ、アプリケーションエンジニアって資格を取ったら、それはどれくらいの価値あるの・
これくらいの資格だとやはり凄いの?
0888デフォルトの名無しさん
2007/03/18(日) 18:06:510889デフォルトの名無しさん
2007/03/18(日) 18:09:28基本情報れべるの学習が終わったあとは
独習Cで勉強するか、共立出版から出てる聖書で勉強するか悩んでるんですが、
どっちで勉強するのがいいでしょうか?
正直いって、基本情報レベルのCって簡単ですね
0890デフォルトの名無しさん
2007/03/18(日) 18:11:47アーメン
0891デフォルトの名無しさん
2007/03/18(日) 18:12:33どっちがいいかは個人の好みがあるからなんとも言えないね
2,3ページ読んで判りやすい方で勉強するのがいいよ
ちなみに自分だったら両方読むかな(良書だし)
0892デフォルトの名無しさん
2007/03/18(日) 18:16:00こんなにたくさんの言語を勉強しないといけないのですか?この中から大事なのを選ぶとしたら何ですか?
0893デフォルトの名無しさん
2007/03/18(日) 18:16:44LISPはどーした?
Prologは?
そんなに似通ったパラダイムの言語したって面白くないよ?
0894デフォルトの名無しさん
2007/03/18(日) 18:19:460895デフォルトの名無しさん
2007/03/18(日) 18:20:22勉強するかしないかは個人の問題だよ
社会人なら「大事なの=業務で使うもの」と考えるといいよ
でも学生なら好きな言語を選べばいいと思う
相性もあるからね
あとここはC言語スレなんで一応Cを薦めておきます
0896デフォルトの名無しさん
2007/03/18(日) 19:05:59http://pc11.2ch.net/test/read.cgi/tech/1075035410/
http://pc11.2ch.net/test/read.cgi/tech/1152778344/
スレ違いだし、本気で質問したいなら↑へ誘導
何となくだが>>892は、就活で面接に行った先で
「この業界はどんな感じでしょうか? お金稼げますか?」
とか聞き出しそうでコワイ (いや独断だけど
0897デフォルトの名無しさん
2007/03/18(日) 19:35:550898デフォルトの名無しさん
2007/03/18(日) 19:40:25夢のスーパープログラマーになれるとでも思ってんじゃね?
0899デフォルトの名無しさん
2007/03/18(日) 19:41:340900デフォルトの名無しさん
2007/03/18(日) 20:23:47お金はいらないけど、プログラマって何歳までできるのか?って考えてしまいます。
あと、資格試験は業務と関係ないといいますが、なら何のためにあるのか疑問です。
どうなんでしょうか?
0901デフォルトの名無しさん
2007/03/18(日) 20:39:55採用時の目安
技術なんて実際に見ないと評価できないから、その代わり
0902デフォルトの名無しさん
2007/03/18(日) 20:44:40釣りうぜえ
死んどけチンカス
0903デフォルトの名無しさん
2007/03/18(日) 20:51:22ちょっとくらい聞いたっていいだろ?学生なんだから
0904デフォルトの名無しさん
2007/03/18(日) 20:57:09スレタイって読まなくても良いんだ……
0905デフォルトの名無しさん
2007/03/18(日) 21:07:04(俺じゃないけど)誘導までしてやってんだし、これ以上何か答える義理はないッッッ!!
0906デフォルトの名無しさん
2007/03/18(日) 21:11:05プログラマに免許や資格試験はないよカス。
0907デフォルトの名無しさん
2007/03/18(日) 21:11:47>技術なんて実際に見ないと評価できないから、その代わり
そんな言い訳して面接時にまともな技術評価を怠っているような会社に入ってはいけない。
そんな会社には低レベルな技術者が巣くうことになり、技術力のあるヤツが入っても
その低レベルな技術者の分までコキ使われるだけ。
0908デフォルトの名無しさん
2007/03/18(日) 21:25:340909デフォルトの名無しさん
2007/03/18(日) 21:43:370910デフォルトの名無しさん
2007/03/18(日) 21:47:34と書いて、メモリ領域を確保すると、ずっとメモリを確保したままになりますよね?
これを開放したい場合はどうしたらよいのですか?
0911デフォルトの名無しさん
2007/03/18(日) 21:48:33ムリ
0912デフォルトの名無しさん
2007/03/18(日) 22:03:13exit(0);
0913デフォルトの名無しさん
2007/03/18(日) 22:42:500914デフォルトの名無しさん
2007/03/18(日) 22:45:420915デフォルトの名無しさん
2007/03/18(日) 22:56:40無理って???
開放できるんでしょ?
>>912
exit(0);
でなんで開放できるの?だいたい0ってどこででてきたの?
>>914
c dw 100
ってなんですか? dwって何?
0916デフォルトの名無しさん
2007/03/18(日) 22:59:04> 開放できるんでしょ?
なんでそう思うの?
0917デフォルトの名無しさん
2007/03/18(日) 23:01:390918デフォルトの名無しさん
2007/03/18(日) 23:01:43そうやって確保した領域は絶対に解放されない。
大きな配列をずっと確保したままにするのが嫌とかいう理由なら、
宣言するのはポインタにしておいて、領域そのものは
malloc()で動的に確保するようにするなら似たようなことはできる。
0919デフォルトの名無しさん
2007/03/18(日) 23:07:230920デフォルトの名無しさん
2007/03/18(日) 23:09:360921デフォルトの名無しさん
2007/03/18(日) 23:11:470922デフォルトの名無しさん
2007/03/18(日) 23:13:22つまりローカル以外でstaticは超危険なんですね
0923デフォルトの名無しさん
2007/03/18(日) 23:13:45�d!
0924デフォルトの名無しさん
2007/03/18(日) 23:16:34よっぽどいいことかよっぽど嫌なことでもあったのかw
0925デフォルトの名無しさん
2007/03/18(日) 23:24:560926デフォルトの名無しさん
2007/03/18(日) 23:36:420927デフォルトの名無しさん
2007/03/18(日) 23:58:28普通こう書いたらそれは「そのプログラムの中で」って意味だろ。
0928デフォルトの名無しさん
2007/03/19(月) 00:00:14プログラムを終了しても開放されないんですか?
malloc()に関してはしらべてみますね。ありがとうございます
0929デフォルトの名無しさん
2007/03/19(月) 00:34:550930デフォルトの名無しさん
2007/03/19(月) 00:35:36ネットで十分じゃない。
0931デフォルトの名無しさん
2007/03/19(月) 00:36:12騙るのやめてもらえませんかね?いま調べてる所なんですけど
0932デフォルトの名無しさん
2007/03/19(月) 00:36:20紙ベースじゃないけどmanでいい
0933デフォルトの名無しさん
2007/03/19(月) 00:41:38これも偽物だYO。今しらべてるから
0934デフォルトの名無しさん
2007/03/19(月) 00:46:260935デフォルトの名無しさん
2007/03/19(月) 00:46:58プログラムを終了しても、メモリをとり続けるのですか?
0936デフォルトの名無しさん
2007/03/19(月) 00:48:36電源きるんだYO。
0937デフォルトの名無しさん
2007/03/19(月) 00:48:44質問したり回答する人がいなくなっちまうだろ
0938デフォルトの名無しさん
2007/03/19(月) 00:49:14なるほど、ありがとうございます
0939デフォルトの名無しさん
2007/03/19(月) 00:49:500940デフォルトの名無しさん
2007/03/19(月) 00:51:040941デフォルトの名無しさん
2007/03/19(月) 00:51:530942デフォルトの名無しさん
2007/03/19(月) 00:53:200943デフォルトの名無しさん
2007/03/19(月) 00:54:474e7く日3事々00ど8っ上前らとee8なこチ1可けンなまりこ;日い新アる書,た
事ポー72日てロら寧よ1てどt78とスaフ2かゃ,1質前0レ無いソの勉8のh02
うコのさi導語れ、つも前とnさ8フ無だてにれら説面かこデがフなのル馴いれs2るx
あス理の8め違のプ日8理勉7ど配い価リ取の他も8の、の投やなと名て名ん、画な、0
が。単辞投らォじ、が2早0ば基7デ、評そ名8けe投うとす開9一名0ど、プ差8たっ
聞言書いとでし、わの独強無り無は8い1日sてC1解s可らd発がの00sなかかラ日
学日え3snつ28にトかするな、要とiト味てるいにそー171んト1無き格ちてのょ
8のェな際ド明よ0s無8で0る効すっ要at実正名然人お8え22、変プで6さ日か1
に稿、ト2神5と、よ、司らぞ名こ19、い強か能や愚さデ8しaす語7い上い8のわ価
ら;1名あが情なれ、、0があ格投まfれ28そし解ト立るaだ投しっ来1ラ示ア語業さ
日68をで列べ、すト語パ7、名な0Cさ格tフで8ロ報7を前8た基事ラかいルデ9日
く度2情すテ本れん前るてにIのをか02い。れっsのグん0L習をけ0め、ルと1な生
そ渡合ベり4破8列デ8a。、っし、の日バCf版じ0で、g年言18報73ちし日い8
が0C。7なお1すの=hに日i8で目外はで、うとば員デいっ2フる2名稿*勉0のa
。能ンォスnなbっっん8、丁8のせョラらみ、自ん名んい体フ1ょsC9前能3るトロ
か6悩で名投70数感書あののn勉5丈し者りテお*、少やバのれ3だ0u前ルど1フg
リ7o値、凄場聖ンかユいいもん、聞e0く世0ルさデしプa出の、*7でゲラ発。9ア
程O作日日のいや稿gォ作元付かきく1エ8よ3ー、い前験、*うよが2y2だ料奴8壊
百合さ稿2名さ1だ前確し0俺持わ3なねHが前いθだたしかしトてトら814マ処プし
0944デフォルトの名無しさん
2007/03/19(月) 00:55:31フーるがけ2てでそも体日値10193nn語でさの稿3*、か1、9めCつなわしかゲ
デ1のろ日書00るのさ1た0、投ac稿ん6bかるを書デなのさ、が解かi来わ7をト
どトのて名1ト09800a3テのル9う0と壊事み20に923らルi夫2eさa無a
。ロトす9gあ能ん、かれa、一ヤう08えでるss可はよ9288O58名0れ名合い
をさらさ上か勉す3aの作風g8C格しと=しア無着3名4くのs9、れ投だg、月マに
前フ稿1で日か78かなうたし9っょ。まさ騙愚い月*1違4月日然リぞ日2さh8け5
日場フ88デeo破が名トい1、えにて8日ら7価こsり、3さ学ン験3日9時なと名感
3名だ無7習ェね98だ聞日ユしがしっ出0て90テ7す78し前る9さ明02な。格と
変面4し1丁の他丈ん情で々名Hト、て「2い。8ら127デのい2奴ょ名しなルるく名
稿8せの回評、トバよ4が0、さ0っラいト勉ラ4いい0わ立るんな名外名っ前悩のしで
1ua吊tgい0トあ01ま3レ前お自プんよめ0発0てス1月日も3ax8でさす解ラ
、eト勉ンC前じ9無ど。8れなく0名f列しれ稿の、パし2eい0のル2らなこたんる
百そa、度*うォ09言,めたか0けい64ルあてθ前投語eえ600にssい。と、0
か遭日メ前よいをら要、sスのれ料。書12稿や前いらの開0強1aかき0。なし0のつ
定あ0トd15r86日んとるデ日fっ0、元3ゃ7プh示も998ト、質さ合ど9目な
デ0フyの日す無処1いいし1、.aリのト、ロルルよ要確名、ォ。で8前の8持作0な
ん凄き理9ッ列プ。0リうんん基sン22を日や1Lで2付tい名な、0、すl投でだリ
1名かれ8勉画。ア。4本3ス2おらフん生ん前能稿ま前2っ0i1な9a発7渡独iる
て無投く取名て日月プ能、4は4稿13し丈、世08Oエ,5*名lもん2新の語か6ん
0945デフォルトの名無しさん
2007/03/19(月) 00:57:12、の、格が習0前1ラん、の47て0いしgyをるx、、さめ1スバ0稿a合投3投92
いだん4要独まし5ん3てんれ13すだ取3か作dリのれ理あすらト前0凄の名名。れし
、い2し0体開せて79どすgt風度の3。書をろどい本e能9をてらぞ言い5度他す2
さs7処2日んい32さ付変デ6し8りの名、うンるでa、確7ン俺日か9も1ッeさい
1く画ア0、月0よ料ル.勉8H3生9外2こか前る0エく9かゲ、おま丈のて2,2く
か0かす0l00トォ。名ッ、を価無き1て日いん08々名る、世、示ト自能78格76
1前0い前き4ル793来0リnだる。いな言4れ。のs9んきフた名10説んト700
ゃょ情0ー強名どし3すて月yるろ、でラ8処勉渡0月お日立7無で能質ルaはらさ持の
る変らるるテフ1解元は投外02る。tとん0稿をなレぞた14やgcついアi、221
s4新日てLだ名トL解*しめ時体い名価ラ、っ語30夫けf0れな前aル1列dめ日稿
日けう124か3習0gし3i0とgg8稿学デ前7リんパのまきで前投験84すフi、
元は、壊日1い基稿7る8いル学ト新1a月リれも、9名の日とルト9まで3アき場版や
の71月しンか稿列8いえくで0解し2l画きのよそロ9あんをでトた勉い37えCしt
、し800て本リ示い名が、5前勉ら。9か28ど0ス前名よた09る28然ンょ4発名
8でフ8,でで9んだ百ト08ユ前ら百要日日、語こえ2Os稿ょ23す日さマよ稿ロプ
回な前。iら0っ吊時だ、さ6世にH前39さ0ッ「学9んん9なしなか9sすう0名じ
リルなsと語、、そか1渡んのラつ前はl名0丈名8、6丈あし1日定0ンiいす3θょ
8どロルhル感e名0立2さ0能う、eらのる821生フして、ら取7うし8の前遭ん、
違5eっが着つsら日2ルんf0などプa4も0ト0やな9ども稿n1て2評投名日9ト
0946デフォルトの名無しさん
2007/03/19(月) 00:59:58こいつ最悪だな
0947デフォルトの名無しさん
2007/03/19(月) 01:02:190948デフォルトの名無しさん
2007/03/19(月) 01:13:350949デフォルトの名無しさん
2007/03/19(月) 03:07:27リアルタイムにデータが更新されていくようなプログラムを作ろうとしてます。
高負荷も考慮されて信頼性の高そうな物が良いのです。
ircdが良さそうに見えるのですがコードの質が良いのかどうか判断が付きにくく・・・。
先輩方よろしくお願いします。
0950デフォルトの名無しさん
2007/03/19(月) 03:17:380951デフォルトの名無しさん
2007/03/19(月) 03:23:55似たような物でしょうか?
0952デフォルトの名無しさん
2007/03/19(月) 03:27:44という問題で、
http://eggrice.no.land.to/up/src/tohoh0153.txt
こう書いたのですが、日本語文字がおかしくなります。
どうすれば化けなくなるでしょうか?
0953デフォルトの名無しさん
2007/03/19(月) 03:29:59初歩レベルならば「日本語は扱えません」と注意書きするだけでいい。
文字コードちゃんと扱おうとすると面倒くさいのよ。
0954デフォルトの名無しさん
2007/03/19(月) 03:32:17wchar.h, wctype.h
0955デフォルトの名無しさん
2007/03/19(月) 03:32:48う〜ん日本語は扱えないことにすればいいですかねぇ…
0956デフォルトの名無しさん
2007/03/19(月) 03:39:43C言語では、マルチバイト文字(列)の操作のために以下のような関数が規定されている。ただし、特に日本語のような2バイト文字集合を含むロケールでは、実装が不十分で実用に耐えない場合も多い。
* mblen()
* mbtowc()
* wctomb()
* mbstowcs()
* wcstombs()
Cだと結構厳しそうな雰囲気・・・。
ガチでやるなら文字コードを判定する所からスタートかも。
C++なら・・・ってスレ違いか。
0957デフォルトの名無しさん
2007/03/19(月) 03:40:44_strlwr() 使ってしまうのが一番楽かねー
要するに>>954
0958デフォルトの名無しさん
2007/03/19(月) 03:42:110959デフォルトの名無しさん
2007/03/19(月) 03:57:24まだ入門レベルなのでマルチバイト文字は考慮しないことにします〜
0960デフォルトの名無しさん
2007/03/19(月) 07:02:50文章を表示するプログラムでソースコードからexeファイルを作成し、
実行すると、コマンドプロンプトっぽい画面に文章が表示されるんですが
その表示が一瞬で、本当に確認できるかできないかってほど一瞬でしか表示されません。
これはどうすればいいのですか?
0961デフォルトの名無しさん
2007/03/19(月) 07:07:25http://pc11.2ch.net/test/read.cgi/tech/1167476845/592-594
http://pc11.2ch.net/test/read.cgi/tech/1167476845/598-600
0962デフォルトの名無しさん
2007/03/19(月) 07:12:37大好きです
0963デフォルトの名無しさん
2007/03/19(月) 08:11:380964デフォルトの名無しさん
2007/03/19(月) 08:14:14CでDFT/IDFTのプログラムつくってるんですが、IDFTの時、実部だけときたまものすごくでっかい数(*exp(269))がついてしまう…
一応ソースをはっておきます。かなり粗く造ってあるので申し訳ない
#include <stdlib.h>
#include<stdio.h>
#include <math.h>
0965デフォルトの名無しさん
2007/03/19(月) 08:15:39#define rand1() ((double) rand()/RAND_MAX)
#define Pi 3.141592653589793238462643383
#define SUMPF 10000
#define N 1024
main()
{
double i, k, t[N], s[N], ans[N], dfti[N], dftr[N], dft[N], idfti[N], idftr[N], idft[N], y1, y2 ,e;
double tans(),sans();
FILE *fp;
0966デフォルトの名無しさん
2007/03/19(月) 08:17:05周波数フィルタの値が 1/EPS みたいに大きすぎる値
0967デフォルトの名無しさん
2007/03/19(月) 08:17:08{
t[i]=tans(i);/*時間軸の呼び出し*/
s[i]=sans(i);/*入力波の呼び出し*/
y1+=s[i];
}
y2=y1/N;/*直流成分*/
if( (fp=fopen("DFT_so.dat", "w")) == NULL )
exit(1);
/*直流成分の除去*/
for(i=0;i<=N;i++)
{
s[i]=s[i]-y2;
fprintf (fp,"%f %f\n",t[i],s[i]);
}
fclose(fp);
0968デフォルトの名無しさん
2007/03/19(月) 08:17:46exit(1);
/*DFT*/
for(k=0;k<N;k++)
{
for(i=0;i<N-1;i++)
{
dftr[k]+=s[i]*cos(2*Pi*i*k/N);
dfti[k]+=s[i]*sin(2*Pi*i*k/N);
}
dft[k]=sqrt((dftr[k]*dftr[k])+(dfti[k]*dfti[k]));
fprintf(fp,"%f %f\n",k*SUMPF/N ,dft[k]);
}
fclose(fp);
0969デフォルトの名無しさん
2007/03/19(月) 08:18:53if( (fp=fopen("IDFT.dat", "w")) == NULL )
exit(1);
/*IDFT*/
for(i=0;i<N;i++)
{
for(k=0;k<N-1;k++)
{
idftr[i]+=dftr[k]*cos(2*Pi*i*k/N)+dfti[k]*sin(2*Pi*i*k/N);
idfti[i]+=-dftr[k]*sin(2*Pi*i*k/N)+dfti[k]*cos(2*Pi*i*k/N);
}
if(idftr[i]>100000)
{
idftr[i]=idftr[i]/e;
}
idft[i]=(idftr[i]+idfti[i])/N;
fprintf(fp,"%f %f\n", t[i],idft[i]);
}
fclose(fp);
0970デフォルトの名無しさん
2007/03/19(月) 08:24:410971デフォルトの名無しさん
2007/03/19(月) 08:27:480972964
2007/03/19(月) 08:41:37DFTは大丈夫なんでそれは平気だと思います
>970
そうですね!すみません
>971
あ、貼り忘れてますがちゃんとやってます
なぜかIDFTの実部の計算結果だけ「exp(269)」がついちゃうんだぜ…
0973デフォルトの名無しさん
2007/03/19(月) 09:05:02{
idftr[i]=idftr[i]/e;
}
ここじゃないの?
0974964
2007/03/19(月) 09:07:48そこはそのexp(269)
をなんとか取ろうとしたとこです
なぜか完璧に消えてくれなかった。3つくらい残ってしまう
0975964
2007/03/19(月) 09:23:237336にプログラムあげておきました
0976964
2007/03/19(月) 09:24:057336にプログラムあげておきました
0977964
2007/03/19(月) 09:25:09しまった。誤爆です。スマソ
0978デフォルトの名無しさん
2007/03/19(月) 09:28:33double exp ( double x )
| └指数
HUGE_VAL
返却値
1.指数を返す
2.結果がオーバーフローを起こす場合 HUGE_VAL を返す。
3.アンダーフローを起こす場合は 0 を返す。
0979デフォルトの名無しさん
2007/03/19(月) 09:33:30>idftr[N]=0;/*IDFT実数部*/
>idft[N]=0;/*IDFT結果*/
ナイス初期化
0980964
2007/03/19(月) 09:34:33オーバーフローしてるのか…
じゃぁexpでうちけそうとしても無理ってことですね
個人的にはDFTとIDFTの式中のexpの指数がでかすぎるのかなぁと思ってるんですが…
0981964
2007/03/19(月) 09:35:46どうもw
0982デフォルトの名無しさん
2007/03/19(月) 09:50:160983964
2007/03/19(月) 10:11:54ほんまや!!ありがとうございます
0984デフォルトの名無しさん
2007/03/19(月) 10:17:21scanf("%d\n" ,&test);
printf("表示");
ということをさせたいのですが
scanfを使っても改行されるばかりで上手くいきません。
お願いします。
0985デフォルトの名無しさん
2007/03/19(月) 10:18:230986デフォルトの名無しさん
2007/03/19(月) 12:21:40こういうことがやりたいのか?
scanf("%d\n" ,&test);
↓
getchar();
0987デフォルトの名無しさん
2007/03/19(月) 13:00:37無事出来ました!
ありがとうございます、感謝
0988デフォルトの名無しさん
2007/03/19(月) 14:20:21C/C++でもスレッドを作れたりしますか?
0989デフォルトの名無しさん
2007/03/19(月) 14:24:130990デフォルトの名無しさん
2007/03/19(月) 14:24:200991デフォルトの名無しさん
2007/03/19(月) 16:06:19どうすればいいのでしょうか・・?m(__)m
0992デフォルトの名無しさん
2007/03/19(月) 16:12:02MessageBox関数の仕様にあわせてどうぞ。
#つーか、どこのMessageBoxなのかと。
0993991
2007/03/19(月) 16:14:48第二引数はconst char * 型らしいのですが、ここにどうやってshort型の値をいれたらいいのでしょうか?
0994デフォルトの名無しさん
2007/03/19(月) 16:16:01それとも sprintf か何かで値を表示したいのか?
0995C言語
2007/03/19(月) 16:17:5610000ゲット(‘w‘)
0996991
2007/03/19(月) 16:21:03(const char *)short とすると、コンパイルは通るのですが、
実行すると、おちます・・・。
0997デフォルトの名無しさん
2007/03/19(月) 16:22:380998デフォルトの名無しさん
2007/03/19(月) 16:40:07昔 MSDN で Win32 の szMessageBox とか見た事あるけど、
結局使えなかった記憶がある(Win のバージョンの問題だったような、そうでなかったような)。
まあ、おとなしく、vsprintf 系の関数を使って szMessageBox を自作しろってこった。
0999デフォルトの名無しさん
2007/03/19(月) 16:45:59C言語なら俺に聞け(入門篇) Part 10
http://pc11.2ch.net/test/read.cgi/tech/1174290325/
1000デフォルトの名無しさん
2007/03/19(月) 16:46:1110011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。