- 1 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:15:31 ]
- C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 117代目 pc11.2ch.net/test/read.cgi/tech/1225320579/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 37 pc11.2ch.net/test/read.cgi/tech/1224000127/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
- 271 名前:デフォルトの名無しさん [2008/11/04(火) 00:36:54 ]
- みなさん、Cのソースを組むとき、分かりやすく汎用的に組む為に、具体的にどういうことに気を付けてますか?
たとえば、、、 僕の場合なんですが、 ・一行は80文字。 ・strcpyよりmemcpy ・独自関数ライブラリのプロトタイプは必ず書く。 ・関数の引数が多くなりすぎる時は構造対で渡す。 ・関数名はキャメル式に統一。 ・入れこは3つ以上にしない。 ・繰り返し文は使い分ける。 ・構造化プログラミング。mainは目次みたいな感じで、全体が把握でくるような作りに。 ・C言語についてのコメントは書かない。 ・インクルードヘッダはは使用するものだけ書く。(まとめたりしない) まだあると思うけど、とりあえずこれくらいかな〜 みんなのも教えてください。
- 272 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:39:26 ]
- >>271
> ・strcpyよりmemcpy 状況にもよりますが、これは賛同しかねます。
- 273 名前:デフォルトの名無しさん [2008/11/04(火) 00:45:27 ]
- >>272
あ、すいません。 そうですね。\0つけたい時ありますもんね。 strcpy→strncpyに訂正します。
- 274 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:50:17 ]
- >>271
入れ子2つだけじゃ厳しいなぁ
- 275 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:52:42 ]
- memcpy()でコピーしてるのに、コピーの長さをstrlen()で取ってるコードをこのまえ見たな。
strcpy()でいいじゃんって思うけど。
- 276 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:53:10 ]
- >>271
>一行は80文字。 まあほとんどないことですが、意味の上で 80文字を超えるようであれば、それはそれでこだわりません。 >プロトタイプは必ず書く 前方参照をほとんど行わないので、特に必要性を感じません。 >入れこは3つ以上にしない。 それはそうなんですが、まあ、ええ、ときどき、しばしばやってしまいます。 >キャメル式 初耳です。よろしければ意味を教えてください。
- 277 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:56:34 ]
- >・一行は80文字。
これは無い
- 278 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:57:33 ]
- >>276
ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9
- 279 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:59:40 ]
- >>277
そういうスタイルの人もいるよ。 Cだと80くらいでも十分書けるし。
- 280 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:04:14 ]
- いや居るのは知ってるよ
- 281 名前:デフォルトの名無しさん [2008/11/04(火) 01:06:24 ]
- >>276
動的独自ライブラリから独自関数を使う場合、引数間違っててもコンパイルが通る。んで、実行時にコア吐いて初めて気付く事がある。プロトタイプ書いてると、コンパイルエラーでるから、書くようにしてる。好みかな。 キャメル式は、確か、ラクダみたいな意味だったかな。大文字と小文字だけでつけるやつ。こういうの。 FileCopy() 区切り方の違いかな。変数はアンダーバー使うし、マクロは大文字とか。
- 282 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:06:58 ]
- ああそう。
- 283 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:08:54 ]
- うん
- 284 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:08:55 ]
- >>281
下位のサブルーチンから書いていって、main()を最後に書くってスタイルの人なんじゃないの?
- 285 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:09:11 ]
- コーディング規約のスレがあったような
ここでもいいんですよ、はい
- 286 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:10:53 ]
- >>281
ん、了解。たしかに分割コンパイルですすめるときは .h にプロトタイプをまとめる、というのは日常的にしますね。読みが浅かったです。 >>278 >>281 キャメル式+ハンガリアンでかいてみることもあります。気分しだいですが。
- 287 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:16:37 ]
- >>284
昔はそういう人も居たし俺もそうだった。技巧賞ノミネート作品のように。 でもある時から改めた。
- 288 名前:デフォルトの名無しさん [2008/11/04(火) 01:18:18 ]
- >>275は>>273を読んでないのか
- 289 名前:デフォルトの名無しさん [2008/11/04(火) 01:20:25 ]
- >>287
技巧賞とあるんだ ぐぐるわ
- 290 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:25:01 ]
- >>288
別に責めてるわけじゃないから、気にしなくていいよ。
- 291 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:25:48 ]
- >>287
技巧賞っていうか、Pascalの影響も多分にあると思う。
- 292 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:28:07 ]
- >>286 ハンガリアン記法はダメだろ
- 293 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:30:20 ]
- >>287
さしつかえなければ、かえた理由を教えてください。 たしかに私も厳密な意味で下から上にかいているわけではなく、コンパイルOKれべるですので、技巧賞はむりですね。
- 294 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:32:58 ]
- >>292
私のはいわゆる「アプリケーションハンガリアン」ってやつですね。MicroSoft 流 pszXXX とかいうのは私も嫌いで、これはやらないです。 そもそも全部の変数をハンガリアンにするわけではありません。 節操がないといえば、それまでですが。
- 295 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:36:38 ]
- しかしアプリケーションハンガリアンって、あんまり使う機会がないっていうか。
システムハンガリアンはダメだって言われてるけど、Cのときは、ポインタはpをつけてる。
- 296 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:41:43 ]
- >>269
どちらでも実行結果は変わりませんでした。
- 297 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:52:53 ]
- >>296
more の内容をください。more にも fflush(NULL) をいれるとどうなりますか?
- 298 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:58:06 ]
- fflush(stdout); を入れるのは一つ目のprintfですよね?
C:\081103>1 |more fflush(NULL) ファイル C:\081103\fflush(NULL) にアクセスできません 1 2 3 4 5 となりました。
- 299 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:10:06 ]
- >>298
いえいえ、more も自作しているのかな、と思って、 fflush() で more のバッファリングも殺してしまおうと思ったわけで、 コマンドラインで fflush を指定するつもりはありませんでした。 more が標準出力をバッファリングしており、自作のプログラムの出力をその都度画面に出力していないのでは?と思いますが、いかがでしょう。
- 300 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:14:20 ]
- ごめんなさい、何言ってるか分かりません・・・
自分の不勉強のようなので出直してきます。
- 301 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:19:23 ]
- >>300
いえいえ、そんなつもりはないです。 バッファリングについてかいておきますね。 printf() で出力した時点で、それが画面にそのままでるわけではなくて、いったん別のところにたくわえられており、 ある程度たまった時点で画面に出力される、という仕組みになっているのが普通です。 たとえば、これは画面ではなくてディスクなんですが、printf()などで一文字ずつ書き込む、なんてディスクがカリカリいって (ハードウェアの操作には時間がかかることは直感的に感じていただけるものと思います。)なんだか非効率だと思いませんか? なにかわからないことがあれば遠慮なくきいていただいていいと思いますよ。レスポンスがあるかどうかは運まかせかもしれませんが。
- 302 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:00:02 ]
- strncpyは仕様が腐ってるので使うのやめとき。
- 303 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:08:05 ]
- どう腐ってるの?
- 304 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:09:44 ]
- 終端文字列の扱いのこといってんだろう多分
- 305 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 09:28:37 ]
- strncpy()を使うくらいなら、spritf()を使いこなすか、いっそ自前で管理した方がいい希ガス。
- 306 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 13:08:21 ]
- つ strncat()
- 307 名前:デフォルトの名無しさん [2008/11/04(火) 16:12:50 ]
- spritf
- 308 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 16:32:53 ]
- >305s/spritf/sprintf/
- 309 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:24:34 ]
- int i,j,k,count;
printf("何段?"); scanf("%d",&count); for(i = 1;i <= count;i++){ for(j = 1;j <= count-i;j++){ putchar(' '); } for(k = 1;k <= i;k++);{ printf("*"); } putchar('\n'); } 上記のプログラムで右下が直角の三角形が表示されるつもりなのですが 何段?5 ----* ---* --* -* * となってしまいました(半角スペースを-としました)。kがうまくいってないような気がするのですが、ご指摘お願いします。
- 310 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:35:29 ]
- >for(k = 1;k <= i;k++);{
この行に注目。
- 311 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:44:17 ]
- >>310
printf("* %d",k);にしたところ ----*2 ---* 3 --* 4 -* 5 * 6 となりました・・・なぜ毎回k=1にならないんだ。
- 312 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:45:47 ]
- >>311
>310 他は見なくていい。
- 313 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:47:45 ]
- >>312
注目したのですがとくにおかしくないような・・・ i回の繰り返し文のはずです。
- 314 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:53:12 ]
- やっと気付きました。 for(k = 1;k <= i;k++);←ここですね{
くだらない質問で失礼致しました。ご指摘ありがとうございました。
- 315 名前:デフォルトの名無しさん [2008/11/05(水) 01:32:51 ]
- int k,i,j,n;
printf("何段?"); scanf("%d",&n); for(k=0;k<=n;k++){ for(i=0;i<(n-k);i++){ printf(" "); } for(j=0;j<k;j++){ printf("*"); } printf("\n"); } 布団入ってから作ったから動くかどうかわからん。
- 316 名前:デフォルトの名無しさん [2008/11/05(水) 01:42:04 ]
- do{
if(){ break; } if(){ break; } }while(0) 時々みるこれどうなのよ?テクッてて見易いとかいうやつは程がしれてるな
- 317 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:53:25 ]
- >>316
while (1) {if()break; if() break;} とか for(;;) {if () break; if () break; } はよくみます。lint にひっかからないように for(;;) {} を使う、ていう意見も。 ループの脱出条件が2つ以上ある、というのであれば、これらのやり方もありだと思います。
- 318 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:18:01 ]
- >>317
論点がずれてる
- 319 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:22:47 ]
- 大文字と小文字を区別しないコンパイラはありませんか?
- 320 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:24:46 ]
- そこまで大胆に規格を逸脱した実装は見たことないな。
せいぜいDOS/Windowsでヘッダ名が大文字でも行けるくらいしか知らない。
- 321 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:39:26 ]
- >316
どうなのよってお前の感想どおりだ
- 322 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 03:13:09 ]
- >>316
別にテクッてるとは思わないがいいんじゃないの
- 323 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 08:06:33 ]
- >>316
その書き方は嫌いだが goto 禁止なら仕方ないな
- 324 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:25:39 ]
- int main(){
(略) printf("test\n"); 関数(Dname); } void 関数(char *fname){ printf("2\n"); } というプログラムがあったときに、testが表示されて 2が表示されずにセグメンテーションエラーでるのはどこに原因があると考えられますか?
- 325 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:27:13 ]
- 略されたところに魔物が棲んでいると考えられます
- 326 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:58:22 ]
- 324ですけど解決しました
関数の中の定義した配列のサイズがおおきすぎたためでした。
- 327 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:33:44 ]
- >>316
美しくないとは思ってたんだがそれに近い書き方だ 0じゃなくて条件1個だけど どう書くべきなの? 条件をいっぱい書くとして抜けるタイミングが異なる場合はどうしたらいい?
- 328 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:37:59 ]
- >>316
初心者なのでよくわからないのですが これはif ・・・・・ else if ・・・ じゃだめなんですか?
- 329 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:39:58 ]
- >>328
それで組んでもさほど代わらないと思うよ。 むしろネストが増えるし
- 330 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:04:32 ]
- qsortでIPアドレスをキーにソートしたいんですが、うまくいきません。
IPアドレスとchar型の文字列を要素に持つ構造体のソートをしたいのですが 比較関数内にprintfを置いてみると、どうやら比較関数を数回参照しただけで デバッガが立ち上がってしまいます。 IPアドレスはCSVから読み込んでいますが、5MB程度のCSVなら問題なく読み込み、ソートまでできます。 全く同じフォーマットの150MBのCSVからIPアドレスを全て読み込んでソートしようとするとデバッガが立ち上がります。 比較関数内の数箇所にprintfを置いてみたところ、比較関数の先頭と最後のprintfはセットで表示されるので、 比較関数内ではデバッガは出ていません。 どうやら割り当てされていないメモリ領域を参照しているみたいなんですけど、qsortをする際に変な領域を参照することとかあるのでしょうか。
- 331 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:08:08 ]
-
・複数プラットフォームで運用するものでない ・仮に複数プラットフォームがあるとしても、ウチは個別にソースを用意する ・社風なのか、ソースの流用は好まない なのに、「typedefで調べろよ!んったく何やってんだよもー」 とかグチグチ言い出す不満の塊 お前ストレス解消するために会社来てんのか
- 332 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:55:18 ]
- >>330
デバッガってのはデバッグするためのツールなんだけどね・・・ まぁたぶんスタックが足りないんだろう。どーんと増やしてみては?
- 333 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:05:48 ]
- >>327
ループ条件が存在するならループで書いたって問題ないだろ
- 334 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:34:11 ]
- while(条件式)
if(){ continue; } if(){ } } 1個目のifでcontinueした場合2個目のifはとばされて、whileの頭にもどりますよね?
- 335 名前:デフォルトの名無しさん [2008/11/05(水) 14:46:20 ]
- やってみれ
- 336 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:47:34 ]
- なんでその程度の規模のプログラムで聞くかね・・・
さくっとサンプル作って、どういう動きするか テストしてみればいいじゃん。
- 337 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:02:59 ]
- それがゆとり
- 338 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:18:58 ]
- 何度も言うけど、Cは動作の詳細を網羅しない言語だから「やってみろ」はダメ
i=i++とか、やってみてその結果が正しいと思い込んだらどうすんの? こういうのに素直に答える気がないなら「教科書読み直せ」でいいんだよ >>334 そうだよ
- 339 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:22:50 ]
- どうもしねーよゆとり
- 340 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:25:46 ]
- >>338
ここで散々論争になってきたようなところは はまったときに聞けばいいんだよ。 どうせはまるところはそういうところって大体結論でてるんだし。
- 341 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:21:34 ]
- >>340
いつどこでそんな結論が出たの? むしろ最初から正しい知識を与えないからそういうところではまるんじゃないの 問題にしているのは「やってみて確かめる」という姿勢はトラブルの種を抱えているということで 後になってトラブルが起きてから解決できるかどうかではない
- 342 名前:デフォルトの名無しさん [2008/11/05(水) 17:57:50 ]
- >>341
それを言うなら、動作保証の有無を 2ch で聞く姿勢にこそ問題があるだろう 正しい知識だ? そもそもそんなのを与える義理がない者をつかまえて何を説くやら
- 343 名前:デフォルトの名無しさん [2008/11/05(水) 18:57:39 ]
- 質問です。
プログラムの練習で数のべき乗を計算するプログラムをCで作ってみたのですが、ちゃんと計算してくれません。 出来れば、どこが間違っているか教えていただけないでしょうか? コードは下記のとおりです。 #include <stdio.h> double multi(double x,int y); int main(void){ double a,b,mul; printf("数字aを入力してください\n"); scanf("%d",&a); printf("aを何乗するか入力してください\n"); scanf("%d",&b); mul = multi(a,b); printf("%d",mul); return 0; } double multi(double x,int y) { int i; double mu; for(i=1;i<=y;i=i+1) { mu*=x ; } return mu; }
- 344 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:01:12 ]
- >>343
scanf("%d",&a); → scanf("%lf",&a); scanf("%d",&b); → scanf("%lf",&b); printf("%d",mul); → printf("%f",mul); double mu; → double mu=1;
- 345 名前:343 [2008/11/05(水) 19:10:21 ]
- >>344
ありがとうございました。 桶下で、ちゃんと動作するようになりました。
- 346 名前:343 mailto:sage [2008/11/05(水) 19:11:26 ]
- 桶下→おかげ
です。 失礼しました・・・・・
- 347 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:41:50 ]
- %fより%gを使おう。
- 348 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:45:36 ]
- なんかちがうんでげすか?
- 349 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:55:55 ]
- if ( (a=Func()) == 8 )
aにFuncの返り値を代入しつつ比較ってできる?
- 350 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:58:11 ]
- できる
- 351 名前:デフォルトの名無しさん [2008/11/05(水) 20:00:22 ]
- >>349
やってみてうまくいかないのか?
- 352 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:19:04 ]
- 入門以前に、環境について質問なのですが、Microsoft Visual C++.net ExpressとBCC5.5では、どちらが使い易いですか?
- 353 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:26:03 ]
- どう考えても前者
- 354 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:29:21 ]
- IDEとコンパイラ単体では比較にすらならん
- 355 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:29:30 ]
- >>351
うまくいったが、その動作が保証されてるかどうかを気にしてるんじゃないの?
- 356 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:43:12 ]
- >>342
なぜ問題が? ネットの情報の信用性云々言い出すならそもそもこんなスレの存在意義自体がない あと正しい知識を与えろと言ってるのではない 答えたくないなら「やってみろ」ではなく「教科書読め」と返せと言ってるだけ
- 357 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:47:50 ]
- どう答えるかはその人の勝手で、お前がグダグダ言おうとかわらんけどな。
まあ、好きなだけ言っててくれw
- 358 名前:デフォルトの名無しさん [2008/11/05(水) 20:52:58 ]
- >>355
推測なんざ聞きたかねえ すっこんでろ >>356 教科書じゃねえ、保証者(メーカなり規格なり)が発行する資料で確認することだろうが だいたい回答者サマがそんなこともわかってないような 2ch で聞くことに問題がないとでも言うのか
- 359 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:00:47 ]
- >>358
教科書を文字通りに取られたか そこはそういったものに読み替えてくれればいいよ で、2chで質問することを問題視する君はなんでこのスレにいるわけ? 帰れば?むしろ帰ってくれない?邪魔だから
- 360 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:02:18 ]
- いつものageのバカじゃないか
相手しても無駄っていうかお前も邪魔だからやめろ
- 361 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:07:35 ]
- 要するにこのスレを潰したいから荒らしてるんだろ?
- 362 名前:デフォルトの名無しさん [2008/11/05(水) 21:12:26 ]
- >>359
いーや、おまえは教科書と言った それからあんたには邪魔かも知れないが 俺はスレタイどおり参加しているだけで荒らしているわけでもない(スレは荒れているかも知れないがな) 難癖つけられる筋合いはないので勝手にするぜ おまえこそ正義があるなら運営にでも訴えてはどうだ、あ?
- 363 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:16:37 ]
- printf("%d %d %d", ++i, ++i, ++i);
- 364 名前:355 mailto:sage [2008/11/05(水) 21:53:55 ]
- >>358
すっこまねえよ。 要はお前が規格に沿った回答、または引用をすることができないから、 2chで質問することに意味がないと思いこんでるだけだろ? お前が「やってみた?どうだった?」とかアホ面ひっさげたレスをしなければ 規格に沿った回答の密度があがるんだよ。 すっこんでろ。
- 365 名前:デフォルトの名無しさん [2008/11/05(水) 22:04:15 ]
- >>364
>>351 をどう読めばそうなるのかは知らんし興味もないが 推測なんざ聞きたかねえ、と言ったはずだ だからその部分に対しては答えない すっこまねえのは確かにあんたの勝手だが それはこちらにも言えることだ 同じ言葉を返しさえすれば痛烈だとでも思っていて自己矛盾に気づかないなら小学生なみだぜ
- 366 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:05:21 ]
- >>365
だからすっけんどろっての
- 367 名前:デフォルトの名無しさん [2008/11/05(水) 22:08:21 ]
- >>366
うっせえ ぼけ
- 368 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:18:24 ]
- まだすっこんでないよな?
Cの教科書っていったらK&Rで異論ないと思うんだが、 それで何の問題があるんだ?
- 369 名前:デフォルトの名無しさん [2008/11/05(水) 22:23:38 ]
- >>368
甘いんだよ、後出し設定なんか聞いてやらん
- 370 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:40:38 ]
- >>369
お前教科書って聞いて何思い浮かべたの?
- 371 名前:368 mailto:sage [2008/11/05(水) 22:42:33 ]
- 後出しも何も俺>>356じゃねえよ?
寒くなってきたんだから布団にすっこんでぽかぽかになっとけよ
- 372 名前:デフォルトの名無しさん [2008/11/05(水) 22:45:49 ]
- で、別人のふりくらいしかすることなくなったわけか
- 373 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:48:16 ]
- このスレには極端にレベルの低い小学生が二人いるのかな
- 374 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:49:49 ]
- よそでやれ
- 375 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:58:36 ]
- 次の方どうぞ〜♪
- 376 名前:デフォルトの名無しさん [2008/11/05(水) 23:53:51 ]
- >>316
それ好きな人が身近にいる。else ifだとデコボコになるからこれが好きとのこだ。 そいつは、構造対のメンバ名が長い時も、最初にそのメンバのアドレスを短くて意味のわかるポインタに移す。 最初は何でいちいちそんな事すんだよとか思ってたが、正直、そいつのソースは読みやすい。 好みだな
- 377 名前:デフォルトの名無しさん [2008/11/05(水) 23:59:17 ]
- 確かに、構造体ん中に構造体ある時とか、長くなるね。
- 378 名前:デフォルトの名無しさん [2008/11/05(水) 23:59:33 ]
- 複数ソースファイルがあるとき
ソースファイルその絡みがあるじゃないですか 例えばその値がどこから来たかを見つけたいとき どうやればいいのですか。 1.c から 10000000000000.c くらいまであるとして そのうちの23460001.cにある関数から 5986293.cに渡されたとしたら わからないじゃ ないですか 5986293.cのincludeには782365.cと23435.cしかない というように、「渡りに渡って行き着いた」やつは非常に見つけにくい。
- 379 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:01:30 ]
- >>378
それは設計が悪くないか?
- 380 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:01:38 ]
- __FILE__
- 381 名前:デフォルトの名無しさん [2008/11/06(木) 00:01:42 ]
-
ゲームに限らず、携帯電話やATMなど 「仕事」のソースは例外なく大量のファイルに分かれているのに 「この値はどこから来たのか」 「それをはじき出すものはどこにあるのか」 っていうコメントがないことがほとんどです!!!!!!!!!!!!!!!!!!!!!!!!!!
- 382 名前:デフォルトの名無しさん [2008/11/06(木) 00:04:02 ]
- >>378
Java見たら泣くよ
- 383 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:04:39 ]
- 今時デバッガ使えば、その時点でどの関数がどの関数を呼び出しているかなんてすぐ分かる。
それとは別に、プログラムを実行させなくても静的に解析するツールだってちらほら存在する。
- 384 名前:デフォルトの名無しさん [2008/11/06(木) 00:06:47 ]
- 研修期間中に読んだものの中で最長の渡りが
30ファイル先 まず先に値を出す1.c -> それを利用する2.c -> 2.cで出た値を利用する3.c ................................................. 30.cだけ見ると、「この値はどこから来たの」ってことしか分からず、 includeを見て追っていくと何十も何百も元のファイルから来てたとわかるのみです。 しかもそのincludeも、標準ライブラリ除いて20くらいincludeされていることもザラで それら全部調べるとなるとたいへんな時間がかかります!!!!!!!!!!! 今仕事でバリバリやってる人らはどうやって調べているの と
- 385 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:07:21 ]
- >>378
1.関数呼び出しの構造図を書く func_a func_b func_c func_d 2.データフローを書く func_a - x ->func_b
- 386 名前:デフォルトの名無しさん [2008/11/06(木) 00:08:38 ]
- 関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ・・・・
きつい時あるね
- 387 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:09:43 ]
- >>386
でも昔のDOSのころのようなミニマムな開発じゃなければ そういうのはざらでしょ。
- 388 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:10:14 ]
- 保守って点から見りゃ、およそ最悪だろ。
- 389 名前:デフォルトの名無しさん [2008/11/06(木) 00:14:51 ]
- >>386
みたいなのをどうしても調べにゃならん時に、たどり着いたソースが新規1985年だったのがある。俺産まれた年(笑) 昔の人は英語好きだよね〜JISに対応してなかったのかね〜
- 390 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:18:22 ]
- >>389
時代的にはこんな感じだよ。 マシンによるんじゃないかな? www.eonet.ne.jp/~building-pc/pc/pc1985.htm
- 391 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:22:45 ]
- とりあえずincludeで追いかけるってのはありえない
ライブラリならドキュメントがあるはずだし ソースがあるならgrepかければ済む
- 392 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:32:05 ]
- for(;;)
{ int d = 0; (dを用いた適当な処理) } と int d; for(;;) { d = 0; (dを用いた適当な処理) } を比べると上のほうがオーバヘッドが大きいでしょうか? dはfor文内でしか利用しませんのでスコープを限定したいのですが.
- 393 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:32:14 ]
- 以前、関数から参照する外部変数や値の影響についてなどを関数仕様書に書いた。
すると技術の若造が「そういう事は止めてくれ。」と言われた。 「どうして?」の問いに、「そんな事を書いたら分かっちゃうだろ。」の回答。 C言語好きでNE○の系列会社に入社する奴はヲタクなお山の大将が多かった。
- 394 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:34:30 ]
- >>393
ドキュメントとソースの乖離が発生することを懸念して、じゃなくて、分かっちゃうからってところがwww
- 395 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:35:35 ]
- >>393
日本語でおk
- 396 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:38:36 ]
- >>392
{ int d; for(;;) { d = 0; (dを用いた適当な処理) } } とかは? これってgccしかできなかったっけ? >>393-394 意味がわからねえw
- 397 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:40:28 ]
- メーカー製の場合、見えてはいけないものが多い。
特に地上デジタル放送関連は、結局はドライバで制御している以上、 「バレるとB-CASなしでも見られてコピーし放題」って芸当も出来るようになる。
- 398 名前:デフォルトの名無しさん [2008/11/06(木) 00:50:07 ]
- コメントなしね〜HTMLならしかたないとこあるけどね〜
- 399 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:52:21 ]
- >>397
外に見せる?資料と内部では違うだろ・・ 内部のものまで「書かない」が徹底されてるのか?
- 400 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:56:22 ]
- >396
VC6なんで出来るけどステートメントが深くなるからあんまりやりたくないです. それよりfor文の中に入れたときに何度もdが宣言されるけどそのときのオーバヘッドが気になります.
- 401 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:57:17 ]
- >>393 ソフトさんですか。
- 402 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:59:12 ]
- オーバーヘッド気になるなら実測なりアセンブリ見るなりすればいいだろ。
- 403 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:59:44 ]
- for(ここにおけば?;;)
vc6だとグローバルスコープだったような気がするけど でもそれはc++だったような期もするけど
- 404 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:03:51 ]
- >>400
宣言文は実行ステートメントではないから、 実行時のオーバヘッドにはならないだろ。
- 405 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:06:48 ]
- ____
.ni 7 /ノ ヽ\ 内部にも見せないよ l^l | | l ,/) / /゚ヽ /゚ヾ\ .n 以前、それで営業がポカやらかしたし ', U ! レ' / / ⌒ ⌒ \ l^l.| | /) 絶対に流出させられないから / 〈 | (____人__) | | U レ'//) ヽ\ |lr┬-l| / ノ / /´ ̄ ̄ノ ゙=ニ二" \rニ | `ヽ l
- 406 名前:デフォルトの名無しさん [2008/11/06(木) 01:41:40 ]
- B-CAS廃止されたんじゃなかったか?
- 407 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:48:54 ]
- まだよ
- 408 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:51:04 ]
- >>401
妙に納得した。 >>392 そのケースなら、コンパイラはどちらも同じようにコンパイルしてしまう。 スコープを限定してくれた方が読むにも判り易いからどんどん限定してくれたまえ。 # それこそ某N∈Sみたいな所の仕事だと全て関数の先頭で宣言しろとか言われかねないけど。
- 409 名前:393 mailto:sage [2008/11/06(木) 02:10:15 ]
- >>397
そういうカッコいい理由ならまだいいんだがw NE○の通信系には変な田舎者の高専や専卒出身の奴が多いのは確かだよ。 カモフラージュ気取りのアメージングコード、騙しの#includeなどは当たり前。 例えば、ANSIの定数をコソーリとトリッキーなビットシフトで何重にも再定義してたりで デバッガで動かすと、EOFが5に見えたりするんだが、奴らはその自分達の技術に対する 他人の反応を見て楽しんでたんだよ。(家で人知れず独りでオナニーしてろってwww) >>401 昔はT芝相手で設計部門向けのCADなどのソフトもやってましたよ。その他にも監査に 似た評価・検証系もしてたので、よく使うコンパイラ数本のC標準ライブラリのヘッダやソースまで ほぼ暗記してました。
- 410 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:12:19 ]
- >>352
遅レスだけど、エラーの指摘はTURBO C1.0対MS-C3.0の頃からborlandの方が出来が良い。 使いやすさじゃ勝負にならないけど、学習用途なら色々動かして、気に入った物を使うといいよ。
- 411 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:12:56 ]
- 悪いがマ板でやってくれ
- 412 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:14:28 ]
- >>378
やっぱ一回実行して呼び出しスタック覗くのが一番早い気が。 gdbにもあったはずなんで、大抵の環境で可能だと思う。
- 413 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:19:50 ]
- fnameに/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data
とかはいってたとして、次のファイル操作 printf("%s",fname); if((fp = fopen(fname, "rb")) == NULL ) { fprintf(stderr,"ERR;入力ファイル error;read_inputfile\n"); exit(EXIT_FAILURE); } これをかいて実行すると開けないってエラーがでるんですけども。なぜだと 考えられますか?ちなみに、emacsから/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data だと開けます。開けるからわからないんですけど。ファイルネームにラストに改行はいってるみたいで。 ただそれでエラーがくるのかと。3.dataはバイナリのデータです。
- 414 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:26:44 ]
- 改行入ってたら、実際のファイルの名前にも改行入ってないと開けないぞ
- 415 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:13:23 ]
- >ただそれでエラーがくるのかと
ファイルを指す文字列をどう解決するかは当然OSに依存する あいにく君の使っている環境は、末尾の\nを排除してファイルを探すことができなかった それだけのことであって、そもそもCの話ではない
- 416 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:14:42 ]
- C言語を志すならばやはりK&Rは買わないとダメでしょうか?
- 417 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:17:30 ]
- 別になくても困りはしないよ
- 418 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:19:39 ]
- もちろんあったほうがいいけど必須ではないよ
CFAQを読んだ上で、規格合致ギリギリのラインを攻め込んだりしない限り問題ないと俺は思う
- 419 名前:デフォルトの名無しさん [2008/11/06(木) 18:20:37 ]
- >>416
K&R自体は買わなくても他に手はいくらでもあるが たかが3千円弱の自己投資をためらうようならお先真っ暗だ
- 420 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:22:34 ]
- 買ったけど内容は入門書と変わらない
正直要らないよ
- 421 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:24:44 ]
- K&Rってのは、C言語をマスターしている人間が買う入門書。
マスターしてるなら買うわけないじゃん、と思うだろうが まさにその通り。 あの本は、読んでる人間はC言語を完全にマスターしてること前提で書いている。 辞書で言うならこんな感じだな レバレッジ 株用語のひとつ。 リスクヘッジ リスクをヘッジすること。 ってな
- 422 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:56:30 ]
- >>416
優れた医者は毒を薬とするという例えがあるようにその本を毒とするか薬とするかは自分次第 他人の評価を聞いて悩むより本屋でちょっと覗いてみて興味を持ったら買うのが一番 図書館で借りたって良いんだしさ 百聞は一見に如かずだよ
- 423 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:50:09 ]
- >>416
そうそう、積読の価値はあると思います。いつか、ふとしたときに手にとって、おもわず読みふけってしまう、ということがあると思います。
- 424 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:41:57 ]
- >>421
そんなことはない。 Prefaceに書いてあるとおり、他の言語は知ってるけど、C言語は 知らないって人向け Cの文法は知ってるけど、書き方を知らないような人にも向いてると思う
- 425 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:44:04 ]
- でも本に書いてあるものは全部よい書き方だと思っちゃうようなひとには向いていない
- 426 名前:デフォルトの名無しさん [2008/11/06(木) 22:04:00 ]
- 「よい書き方」について論じている本ではないことくらいわかれ・・・・無理なのか?
- 427 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:00:10 ]
- 趣味でプログラムを覚えようと思うのですが、最初はC言語でいいんですよね?
おすすめの入門書、サイトがありましたら教えて下さい。
- 428 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:04:30 ]
- >>427
いきなりCだなんて。えっち。 それはともかく、おすすめしない。
- 429 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:12:41 ]
-
time_t tp; time(&tp); sprintf(buf,sizeof(buf),"%Y%m%d",localtime(&tp)); ↑こんな感じのを sprintf(buf,sizeof(buf),"%Y%m%d",localtime(time(&tp)); ↑こんな感じで一行で書きたいんだけど。 もちろん、この書き方が駄目なのは分かるんだけど。 関数の戻り値のアドレスを渡したいんだよねー
- 430 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:13:07 ]
- はじめてのC
- 431 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:14:31 ]
- >>429 上のもダメですが
- 432 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:16:55 ]
- >>429
なんでこだわるの?
- 433 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:18:29 ]
- つーか、それstrftime()の間違いだろ。
- 434 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:51:25 ]
- >>427
C言語に興味があるのならC言語にすればよい。 入門書は、本屋に置いてあるのでいいと思うよ。 例えば、ポニョのとかLepton先生のとかカニハンのおっちゃんのとか。 ああ、でも『はじめての~』は買わない方がいいと思う。 厨房のとき読んでコードギアスの2ndOPになった。 あまり評価高くないけど、河西本とかもオヌヌメ。もう記述が古いけど厨房でも理解できた。 ウェブサイトは、使わない方がいいよ。コピー&ペーストで終わらせようとする衝動に負けるだろうから。 手で打って覚えるんだよ。目でコードの美しさに感動するんだよ。体でプログラミングの楽しさを感じるんだよ。 本気でC言語を使って思い通りにプログラミングできるようになりたければ、 他人の評価は気にせずに自分の直観を信じて本を読んでいった方がいいよ。 そのレビューをした人と自分の言語理解度が必ずしも同じであるわけではないのだから。 1冊読んでいい気になるなよ、そこの自称中級者。 うわっキモ。米大統領選:オバマ氏、共和党地盤・インディアナ州奪取 まで読んだ。
- 435 名前:デフォルトの名無しさん [2008/11/07(金) 00:15:14 ]
- 猫Cのこのページ
ttp://www.kumei.ne.jp/c_lang/intro/no_13.htm のPGMをコーディングして実行したんだけど 結果が 「time1=1225984391 time2=0」となってしまう。 printf ("time2=%ld\n",t2) と単独で出力すればちゃんと「time2=1225984392」になる。 何が間違ってるんでしょうか
- 436 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:16:03 ]
- 実行環境はMicrosoft Visual C++ 2008 Express Editionの
Win32 コンソールアプリケーションです
- 437 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:35:33 ]
- TCP/IPのソケットを使って互いに通信するプログラムを作りたいのですが、正直さっぱりわかりません
どこか詳しい説明とサンプルプログラムがあるサイトはないでしょうか?
- 438 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:38:07 ]
- ほれ
x68000.q-e-d.net/~68user/net/
- 439 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:21:40 ]
- >>435
%ld に対応するのは long 型であって、time_t 型ではありません。 long 型と time_t 型のサイズが等しい環境では上手くいくかもしれませんが、 あらゆる環境で常にそれが成立するわけではありません。
- 440 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:57:52 ]
- ネコなんかで勉強しようなんてするから嵌まるんだ。
long(t1)とでもすれば"%ld"で出力されるだろ。
- 441 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:14:22 ]
- >>440
やってみたけどダメです。。。 じっさい、t1のほうは「%ld」でちゃんと出力されてるんですが。 ブレイクポイント設定して見てみるとちゃんと変数の中身は変わってます。 なのに「"\ntime1=%ld time2=%ld\n"」で標準出力するとtime2=0 になっちゃう
- 442 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:41:07 ]
- >>441
64bit環境? %ld のかわりに、%I64d でやるとどうなる?
- 443 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:54:50 ]
- って環境は>>436か
time_tは typedef __int64 __time64_t; /* 64-bit time value */ typedef __time64_t time_t; /* time value */ だから64bit整数だな。%I64dか%lldで。
- 444 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:57:58 ]
- つーか、longが64bitじゃないんだから、>>440でいいはずだな。
>>441はなにをやってみたんだ? printf("\ntime1=%ld time2=%ld\n", long(t1), long(t2));だぞ?
- 445 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:07:02 ]
- >>444
その通りやってみたんですがダメですね・・・ printf ("time2=%ld\n",t2) だと正常に出力されるので%ldの型指定に問題があるとは思えないのです。 なんで0が出力されるのか、全く見当が付きません・・・
- 446 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:12:17 ]
- 本についてるプログラム(C言語を習得する類の本ではありません)で
ただのint型変数にファイルから100000という値を読み込んでる ものがあったんですが、一般的に見てこのコードは正しいんでしょうか?
- 447 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:13:42 ]
- >>446
どのあたりが疑問なんだ?
- 448 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:21:58 ]
- >>447
int型で表せる値の範囲についてです。 環境によるかもしれませんが 参考書には-32767〜32767と載っていたもので
- 449 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:23:22 ]
- >>445
えーとだな、まず64ビット整数はたとえば0x0000000012345678 という数値なわけだ。 これをスタックに積んで、32ビットで取り出すと、0x12345678 と 0x00000000の2つの数字がとれるわけ。 なんで2番目が0になるかわかったろ?
- 450 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:17 ]
- >>445
>printf ("time2=%ld\n",t2) この場合も、0x0000000012345678を積んで、0x12345678だけ取り出したから たまたまうまくいってるように見えるだけで、上位32ビットは切り捨てられている。
- 451 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:44 ]
- >>448
それは少し古い時代のint型だな 今は大抵4バイトなんで-2147483648 to 2147483647 を表せることが多い
- 452 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:45 ]
- intが16ビットなんて8ビットパソコンの時代じゃないか(80年代)
参考書が古すぎ
- 453 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:35:38 ]
- >>451
そうですか、分かりました。 どうもありがとうございます。
- 454 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:52:02 ]
- >>449-450
ありがとうございます。上手くいきました。 t1-long(t2) ってやってました。>>445を読むまで理屈が判りませんでした。 VC6とかだと上手くいってたのかな?サンプルコードも油断ならないですね
- 455 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:56:54 ]
- × >>445を読むまで理屈が判りませんでした。
○ >>449を読むまで理屈が判りませんでした。 安価間違えたorz
- 456 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:00:00 ]
- >>454
long(t1)は、time_t型のt1の値を、long型にキャストすると言うことだ。 t1 - long(t2)では、time_t型のt1からlong型にキャストされたt2の値を引こうとしてしまうので、 time_t型の実態であるlong long型にキャストして引き算を行なってしまうので結果はlong long型のまま。 引き算する場合はlong(t1 - t2)としなくては意味がない。 そもそもtime_t型は実態が32ビット整数だった時代が長いから無理もないとは思うが、 32ビット整数である保証がないのでちゃんとキャストするべき。それをしていないサンプルは、当てにならないと言うこと。 尚、time_t型同士の引き算は本来なら、difftime()を使うべき。
- 457 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:09:00 ]
- >>456
結局のところ、printf("%g\n", difftime(t1, t2))ってことね。 # だからといって、printf("%g\n", difftime(t1, 0))する奴ぁいねぇと思うが。
- 458 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:34:56 ]
- 対角要素に0があっても正しく動く逆行列を求めるソースおちてないですかね?
- 459 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:48:52 ]
- 同じx86-64bitでも、Windows系の64と、Unix/BSD/Linux系の64アーキテクチャの違いも・・・
- 460 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:07:30 ]
- >>427
自分もプログラミング入門者なんだが、苦しんで覚えるC言語ってサイトがわかりやすいと思う お互い頑張りましょう。
- 461 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:13:02 ]
- >>446
コードそのものは正しい 16bit環境には対応していないというだけ
- 462 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:23:20 ]
- >>460
俺も昔、苦しんで覚えたなw 血便、下血、終電、睡眠デバッグ・・・
- 463 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:32:19 ]
- >>460
「苦しんで覚えるC言語」リンク先のsetjump/longjump >プログラムの流れをグチャグチャにする凶悪な関数であり、よほどの事情でもない限り使用してはいけない。 ワラタ 後に例外処理 try 〜 chatch に衣替えして支持を得る、元祖例外処理サポート関数のデビュー作なのに、 誰も正しい使い方を広められず、gotoと併せて鵜呑み受け売りで語り継がれて忌み嫌われたんだよね。
- 464 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:39:18 ]
- longjumpが悪だとは決して思わないけれど
忌み嫌われる程度には危険で使いにくいと思う
- 465 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:41:11 ]
- 海の怖さを知って初めて一人前の猟師
そういうことさ
- 466 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:44:09 ]
- コードの海は俺の海
- 467 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:51:00 ]
- そして怖い膿を知った
- 468 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:57:00 ]
- まあデストラクタが呼ばれないから実際使えなかったわな。
- 469 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:26:41 ]
-
「今は大抵○バイト」 一番ダメな考え方 こうやって決め打ちすると、そこから変わった場合に一切対処できずに泣いて誰かに助けを頼むことになる 「ママが○バイトだって言ってたから○バイトじゃなきゃダメなんだあああウワアアアアン!」
- 470 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:30:46 ]
- 分かったからお前が解説してやってくれ
- 471 名前:デフォルトの名無しさん [2008/11/07(金) 18:47:01 ]
- >>468
おまえC使いのくせにスタックの巻き戻し程度のものが自分で実装できんのか?
- 472 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:17:37 ]
- 関数にn次の2次元配列を渡す場合はどう書けばいいですか?
double data[n][n]とかいう配列です
- 473 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:31:08 ]
- void func(double **data)
- 474 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:32:14 ]
- >>472
void hoge(double *pData) とか void hoge(double Data[n][n]) じゃだめ?
- 475 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:35:34 ]
- >>473
渡すときは func(data)ですか?
- 476 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:38:37 ]
- ああ間違えた。>>473が正しい。
ポインタじゃなくて実体そのものをコピーしていいなら俺のでもいい・・・はず・・・ pc11.2ch.net/test/read.cgi/tech/1225320579/ の379の質問か。
- 477 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:40:15 ]
- >>475
そう >>476 間違っています 勉強しなおしましょう
- 478 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:40:44 ]
- >>476
>>475+>>473だとコンパイルがとおらないんです
- 479 名前:デフォルトの名無しさん [2008/11/07(金) 19:43:19 ]
- >>473 であるべき、と強硬に言い張る奴が昔いた
一生懸命 malloc してたw
- 480 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:44:01 ]
- >>473は大嘘
普通は func(double data[][n])
- 481 名前:476 mailto:sage [2008/11/07(金) 19:45:25 ]
- >>477
あ、下のほうって意味だったんですが、VC++で動くけど問題なんでしょうか? 以下のソースで動きました。 void test(int data[2][2]) { printf("%d\n", data[0][0]); printf("%d\n", data[0][1]); printf("%d\n", data[1][0]); printf("%d\n", data[1][1]); } int main(int argc, char *argv[]) { int data[2][2] = {0,1,2,3}; test(data); return(0); }
- 482 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:48:29 ]
- void test(int data[][2])
{ printf("%d\n", data[0][0]); printf("%d\n", data[0][1]); printf("%d\n", data[1][0]); printf("%d\n", data[1][1]); } int main(int argc, char *argv[]) { int data[2][2] = {0,1,2,3}; test(data); return(0); } これでいい
- 483 名前:476 [2008/11/07(金) 19:50:57 ]
- >>482
関数で一次限の配列の要素数を書かない理由はポインタ渡しにしたいからですか? それとも別の理由?
- 484 名前:デフォルトの名無しさん [2008/11/07(金) 19:50:58 ]
- K&R で書くなら ANSI 混ぜるなよ
- 485 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:56:33 ]
- >>472
関数に配列を渡すことはできない。渡されるのは常に配列の戦闘要素へのポインタである。 double data[X][Y] という配列があるとき、data は double の配列の配列であり、 これを関数呼び出しの引数に書くと、それは double の配列へのポインタに変換される。 実際に関数にわたるのはこのポインタで、その型は double (*)[Y] である。 だから関数の仮引数の宣言は以下のようになる。 int func(double (*data)[Y]) …@ ただし、これは次のように書いてもいい。 int func(double data[X][Y]) …A int func(double data[][Y]) …B Aは配列そのものを表しているが、既に述べたように関数が配列そのものを受け取ることはない。 そこで、関数の仮引数に配列が書かれたときには、配列がその先頭要素へのポインタに置き換わるのと同様に、 その配列要素へのポインタを宣言したのと同じに扱われることになっている。だからAの持つ意味は@と同じである。 ここでAがポインタに置き換わるとき、当然最初の添字Xは無視されることとなる。つまりBのように省略が可能である。
- 486 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:59:26 ]
- >>483
最初の添字が無意味だから したかろうがしたくなかろうが配列を引数に書いたら 絶 対 に ポインタ渡しになる
- 487 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:02:33 ]
- 配列を値渡ししようとしてもポインタの値渡しになるから
値そのものは渡せない
- 488 名前:476 [2008/11/07(金) 20:09:51 ]
- >>485-487
丁寧な説明ありがとうございます。 おかげでポインタの理解が深まりました。 人の質問に答えて見るもんですね。 同様に構造体の配列も要素数書いてもポインタになるのを始めて知りました。 試してみたらアドレス一緒でビックリ! でも、なんでdata[0]->data1じゃなくてdata[0].data1なんでしょうか? typedef struct{ int data1; int data2; }TEST_TABLE; void test(TEST_TABLE data[2]) { printf("%d\n", data[0].data1); printf("%d\n", data[0].data2); printf("%d\n", data[1].data1); printf("%d\n", data[1].data2); } int main(int argc, char *argv[]) { TEST_TABLE data[2] = {0,1,2,3}; test(data); return(0); }
- 489 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:23:24 ]
- まったく理解できてねぇwwwwwww
- 490 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:40:40 ]
- >>429
これでいいじゃない。 struct tm *v_localtime(time_t t) { return localtime(&t); } strftime(buf, sizeof buf, "%Y%m%d", v_localtime(time(0));
- 491 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:41:33 ]
- >>488
dataがポインタだから data[0]は構造体自体
- 492 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:42:27 ]
- >>488
[]演算子に*の意味が入っているから。
- 493 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:03:43 ]
- 1 TEST_TABLE data[10]; TEST_TABLEを要素とする配列。
2 data[0] 先頭要素。 3 &data[0] 先頭要素のポインタ。 4 data だけ書いたら↑3と同じ。 5 TEST_TABLE *p = &data[0]; 配列先頭要素へのポインタで変数 p を初期化。 6 TEST_TABLE *p = data; ↑5 と同じ。 7 p->data1 ポインタを使って要素へアクセス。 8 data->data1 ↑6,7 から、これは 7 と等価。 9 data と p は等価だから、data[0] は p[0] と等価。 10 つまり *p は p[0]。 11 (*p).data1 *演算子はポインタから実体を返す。だから要素アクセスはドット。 12 (*data).data1 上と同じ。 13 data[0].data1 ↑2で書いたように要素なのでアクセスはドット。 14 data[1] 二番目の要素。 15 &data[1] 二番目の要素のポインタ 16 以下 data[0] と同じ。 17 data[2] 三番目の要素。 18 以下↑と同じ。 19 p = dataのとき、 data[1] は *(p + 1) と同じ。 20 つまり、&data[1] は p + 1 21 data[1] は data[0] の後ろにくっついてるわけだから 22 &data[1] と &data[0] の間のアドレス距離は data[0] の大きさ分ある。 23 つまり、 p+1 と p では data[0] の大きさだけ移動してる。 24 等価等価言ってきたけど、 p++ はできて、data++ はできない。 25 以上とは関係なく、関数の仮引数では data[] は配列じゃなくポインタ。
- 494 名前:476 mailto:sage [2008/11/07(金) 21:11:52 ]
- >>491-493
またまた詳しい説明、ありがとうございました。 ポインタに関して理解していないところの多さを感じました。 まだまだ勉強不足ですね。 さて、名無しに戻って元々したかった質問をします。
- 495 名前:デフォルトの名無しさん [2008/11/07(金) 21:16:40 ]
- VC++でファイルからデータを読み込み分解するプログラムを作りたいです。
ファイルには hoge:aaa\r\n hage:bbb\r\n のように記述されていて、 hoge:に対する記述は hoge:aaa\r\n hoge:bbbb;012\r\n と";"の後にもデータが続いている場合があります。 aaaやbbbbの文字数は一定ではないです。 これを読み出すときに、 sscanf(bBuf,"hoge: %s",&data[HOGE][0]); としているのですが、";"以降がdataに入りません。 どうしたらいいでしょうか?
- 496 名前:デフォルトの名無しさん [2008/11/07(金) 21:33:13 ]
- >>493
> 3 &data[0] 先頭要素のポインタ。 > 4 data だけ書いたら↑3と同じ。 ダウト sizeof &data[0] != sizeof data
- 497 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:46:16 ]
- >>496
それは例外事項 data だけなら先頭要素のアドレスで正しい
- 498 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:49:47 ]
- ん?
- 499 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:52:25 ]
- 不毛だ
- 500 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:58:46 ]
- うるせーな
気にしてんだよ
- 501 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:18:19 ]
- data と p が等価で、 sizeof data が例外なのか。
p = data ができるのが例外なのか。
|

|