[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:45 / Filesize : 237 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:49:22 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 101
pc11.2ch.net/test/read.cgi/tech/1197132472/

369 名前:デフォルトの名無しさん [2007/12/30(日) 00:30:44 ]
>>366
本気で言ってるんすか?
知人の凄い人でもATMなのに人工衛星とかの制御プログラムとか次元が違いすぎる

370 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:32:40 ]
最近、どっかの団体のコーディングルールとか見ると、ポインタの演算禁止とか、
ポインタのポインタらしい使いかたはしないって流れになってきてるな。
じゃPascalでも使ってればいいのにって気がするけど。

371 名前:デフォルトの名無しさん [2007/12/30(日) 00:32:54 ]
ポインタがどうでも良くなってきたんで。
早くファイル操作などの場所をやりたいんですが、ページを飛ばすと複雑な気持ちになるので
ポインタのページと関数のページを仕方なくやりますか

372 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:33:22 ]
>>369
よく嫁
支援ツールだ
つまりだたの社内ツール

373 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:34:43 ]
実用的なのは作ったこと無いな、所詮娯楽用品止まり。

374 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:35:23 ]
私の書いたコードなら、世に出回っているフラッシュメモリのシェアの多くを生み出す装置の検査に使われているぜw

375 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:35:35 ]
まぁ日曜プログラマならそれでいいんじゃね?
自分の腕を仕事に活かしたいと思ったら、それはそれで地獄をみることになるし

376 名前:デフォルトの名無しさん [2007/12/30(日) 00:35:54 ]
>>372
でもすごいっすよ
C言語を始める時期が悪かったですかね
ガキの頃に手をつけとけば良かったと後悔しますよ
Cをマスターしたら次はperlかjavaやろうかと思ってるんすよ

377 名前:374 mailto:sage [2007/12/30(日) 00:36:39 ]
もっと身近なところでは、某駅ビルの駐車券発行機に使われているとか(ぉぃ



378 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:40:35 ]
去年一年くらいCの仕事をやって、医療関係のシステムだったけど、ありえないくらいコードの質が
低かったから、そのシステムを導入してる病院には行かないことにしてる。怖い。

379 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:40:58 ]
>>376
始めるのに早いも遅いもない
逆にガキのころはガキのころにすべき勉強なり体験なりをしなくちゃいけない
Cなんてただの道具にすぎんのですよ、偉い人にはそれがわからんのです

380 名前:デフォルトの名無しさん [2007/12/30(日) 00:41:44 ]
>>374
まじすか?
凄過ぎますよ、是非そういう人に基礎から教えてもらいたいんですが
まぁ無理なんでしょう、自力でやらないと意味がないし
そういうコードを書くにはCを学んでいたときに1日どのくらい書いてましたか?
あとは1日3個適当にプログラムを作るとかそういう目標とかってありましたか?

>>2373
私もそんな感じっすよ
暗号化できたーやーいって(自己満)すよね

>>375
プログラマーになったら大変そうすよね
それで食ってくのは難しいすよね

381 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:44:56 ]
プログラミングの仕事は中国やらインド勢力に取られていくし、
自動生成の流れが盛んになってきているから、
プログラミングの仕事はどんどん減っていくだろうね
現に、カードにパンチしていた時代はコーディングが開発工程の8割を占めていたのに、今では2割程度

382 名前:374 mailto:sage [2007/12/30(日) 00:46:50 ]
そう言えば某社のFAXに……あれはアセンブラだったな。
某社の検査装置に使われているのは……basicか。

てな具合にいろんな時期にいろんなことをやっていたから「Cを学んでいた(だけの)とき」なんてないよ。

383 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:47:00 ]
娯楽用品って言っても仕事なんだけどな (´・ω・`)

384 名前:デフォルトの名無しさん [2007/12/30(日) 00:48:11 ]
>>381
今の日本は開発よりかも指示とかプロジェクトの提案とかそんな感じすかね?
たしかにインドとか中国はすごいっすよね。
ロシアは凄いらしいですがどうなんでしょう。
生まれる場所を間違えたな・・・



385 名前:374 mailto:sage [2007/12/30(日) 00:48:52 ]
>>381
あー確かに、カードパンチの時代は「完全なる机上コーディング」をしたものを「パンチするだけ」だったな。
# 流石に学校で体験しただけだが

386 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:50:47 ]
NHKのワーキングプアの番組でやってたな。
アメリカで銀行のシステムをやって年収1000万のIT技術者が、インドに仕事とられてファーストフードの店でアルバイト。


387 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:53:08 ]
別にインドや中国が凄いってわけじゃなくて、単価が安いからそっちに簡単な仕事まわしてるだけだよ
難しい仕事は単価の高い日本で集中的にやる




388 名前:デフォルトの名無しさん [2007/12/30(日) 00:53:59 ]
やっぱ裕福な国は、それ以上求める物が無くて開発するレベルが低いんですか?
日曜プログラマが良いかな、本職は他ので。
パソコン詳しいねすごいねおっちゃんって言われればそれでいいかな

389 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:57:27 ]
>>387
これからはインド人や中国人の10倍の価値のある技術がないときびしいだろうね。

390 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:01:40 ]
>>388
日本を舐めすぎw
おまい、マスコミに変に影響されてるな
プログラミング力のあるなし以前に、視野の狭さが心配だよ

コーディングっていうのは単純作業なんだよ、単純作業
町工場で働く工員と同じ
指示されたものを淡々と作るだけ

じゃあ、それ以前に何をどう作るか、ってのを考えなきゃいけないよね
それを考えるのが日本の仕事

もちろん、今後すぐにプログラミングの仕事が無くなるわけじゃない
やっぱり言語や文化の壁があって、オフショア開発の管理って難しいくて、
リスクを極力避けるために、
現状は、仕様変更の激しい部分とか、重要な部分ってのは日本でコーディングしてる

391 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:03:10 ]
C/C++でポインタを使わないプログラミングが想像できない

>>380
1日3個も作れるならそいつは天才か、作ったものがゴミ箱行きのカスか

392 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:06:13 ]
とりあえずLinux上の適当なコマンドのソースでも読んでろ

393 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:08:05 ]
UNIXコマンドのソースは俺も読んだなあ。

394 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:10:12 ]
おまいはいいよ

395 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:14:42 ]
ライブラリの○○.aっていうファイルから
収録してある関数名を取り出すことって可能ですかね?
あったら教えてください

396 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:22:21 ]
>>395
nmコマンドでぐぐれ

397 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 02:32:38 ]
>>391
C++ならiteratorは別とすればポインタつかわないこと多くね?



398 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 04:17:57 ]
Java厨です。
Include文とかヘッダファイルの自動生成って出来ないもの?


399 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 05:06:09 ]
条件にもよるが不可能では無い
頑張って作ってみれば?

400 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 07:46:20 ]
>>396
どうもありがとうございました。

401 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:24:40 ]
#define DATA "data"
と、例えば定義してexeを作ったときバイナリエディタでみても"data"を文字列として見つけられません
これはどういう形で格納されていのでしようか?

402 名前:デフォルトの名無しさん [2007/12/30(日) 08:26:04 ]
たとえば、
#define SRAM_A (volatile unsigned char *)0x200000
こんなのもポインタを使っているといっていいですか?
SRAM.Hの中身は、こんなのだらけなんですけど。

403 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:33:50 ]
>>401
DATAを作っていなければコンパイラはobjに"data"を出力しない。
当然、出力されるEXEにも存在しない。

404 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:54:40 ]
>>402
それだと「アドレス」と言いたくなるけど、まぁポインタだね。

405 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:58:09 ]
>>402
組み込みなら普通は #pragma で section 名指定して、
リンカーで配置する。処理系によって違うけど
似たようなコードがあるはず。

絶対アドレスにポインタ使う必要なし。


406 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 13:24:24 ]
趣味でGBAやったときも402みたいなことばかりやったな。

407 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 14:42:25 ]
こんなマクロ定義してたな俺。
#define Acc08(Adr) (*(volatile unsigned char *)Adr)
#define Acc16(Adr) (*(volatile unsigned short *)Adr)
#define Acc32(Adr) (*(volatile unsigned int *)Adr)



408 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 14:50:02 ]
DOS 時代も VRAM 使う時にそういう事してたな。

409 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:04:38 ]
>>401
そもそも使ってなければプリプロセッサはコンパイラに"data"を出力しない

410 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:17:27 ]
void *myMalloc(int size)
{
void *p;
p = malloc(sizeof(double) * size);
if (p == NULL) ...エラー処理;
return p;
}
と言うような関数を作ったのですが、

これに、double **a の奴と、 double *b に
a = (double **)myMalloc(size);
b = (double *)myMalloc(size);
と、つなぎ合わせる事をするのですが、
特にこれで問題は起こらないものでしょうか?

411 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:32:56 ]
>>410
何かメモリがもったいないな

412 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:48:21 ]
a = (double **)myMalloc(size);
のあとは、for文回して
a[i] = (double *)myMalloc(size);
と言うふうに、2次元配列を作る予定なんですが・・・

413 名前:デフォルトの名無しさん [2007/12/30(日) 21:51:23 ]
すみません、質問させてください。
テキストファイルを作ると同時にそのファイルから文字を読み込んで出力する・・というのをやりたいのですが、なぜか開こうとしてもすぐ画面が消えます。なにがいけないんでしょうか?
別に読み込むだけでもいいのでアドバイスお願いします。コンパイラは「Bloodshed Deb-C++」です。

414 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:52:39 ]
改行が多すぎると言われたのでいくつかに分けて書きます。
#include <stdio.h>
#include <stdlib.h>
void kaku(int,int*,char*);
int main(int argc, char *argv[])
{
int ten=0;
char kekka[]="NG";
kaku(1,NULL,NULL);
kaku(2,&ten,kekka);
kaku(3,NULL,NULL);


415 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:53:27 ]

FILE *fp;
char data[256];
fp=fopen("test,txt","r");
fscanf(fp,"%s",data);
fclose(fp);
printf("%s\n",data);
system("PAUSE");
return 0;
}

void kaku(int fg,int *ten,char *kekka)
{
static FILE*f;
switch(fg){
case 1:
f=fopen("test.txt","w");
break;
case 2:
fprintf(f,"%d点,",*ten);
fprintf(f,"%s\n",kekka);
break;
case 3:
fclose(f);
break;
}
}
です。長々とすみません

416 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:59:38 ]
>>412
pointer to pointerを作るなら
a = (double**)malloc(size*sizeof(double*));
じゃないの?
まあ、メモリは余分に確保されてるからコーディング間違えなければちゃんと動くだろうけど。

>>413
意味が分からない

417 名前:416 mailto:sage [2007/12/30(日) 22:01:23 ]
ああ、>>413>>414-415



418 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:06:43 ]
>>416
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(double *));
で確認した所、 double型が8で、double *型が4でした。
ポインタだと値が違うんですね。 始めて知りましたorz

通りで動かなかったのかと・・・ 
ありがとうございました。 頑張ってみます

419 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:16:23 ]
>>413-415
13行目はtest,txtじゃなくてtest.txtだろう。
fopenしたならfpがNULLかどうか必ず確認すべきだ。
system("PAUSE")というのは俺の環境にはなかったから外したら多分期待通り動いた。

420 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:37:38 ]
>>419
できました!ありがとうございます!!

421 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:54:34 ]
>>418
ついでにcharとchar *、shortとshort *とかもsizeofして見比べて見ると良いよ
ポインタがちょっと見えて来る

422 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:55:08 ]
テキストファイルからある文字列を検索し、ヒットした文字列の直後にある数値を抜き出すコードを考えています
例えば
X= 630.20 Y= 220.20
Z= 33.25 A= 30.25
のような感じです。このうちプログラム内で定数として用いたいのが630.20や220.20、33.25に30.25です
まず1行目をfgets()でポインタ*fpに読み込んで、"X="をstrstr()で探します
その辺りまでしかぱっと思いつきません
ここから630.20を読み込もうと思うと、どのような方法があるでしょうか
宜しくお願いします

423 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:56:18 ]
scanf

424 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:01:46 ]
>>423
ありがとうございます
ですが、scanfはキーボードから入力したデータを読み込む奴ですよね?
テキストファイルに書いてあるものを読み込みたいのですが…

425 名前:デフォルトの名無しさん [2007/12/31(月) 02:15:45 ]
isdigit() 一文字ずつで調べて配列に格納して、atof() とか
トークンがスペースなら、そこまで読み込むようにして、 atof() とか

トークンをもう少し考えなおすのがいいかも、セミコロン、カンマとかにする。
strtokn()とかあった気がするが、それは調べてくれ。

426 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:22:41 ]
>>424
fscanf

427 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:24:37 ]
>>425
変なこと教えるなよ。
atofは数字以外に当たったら解析を終了するから、
> 一文字ずつで調べて
とかは不必要だろ。



428 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:29:10 ]
>>425
ありがとうございます。isdigitでチェックして配列に格納が簡単そうですね
strtokn()もありますけど、元ファイルを変換する(というより、別ファイルを作ってそこに数値同士をカンマ等で区切るようにする?)ので、あまり使いたくないところです
最悪、strtokn()で別ファイルを一時ファイルとして作成してやるという方法がありますが…
ちょっと考えてみます。ありがとうございました

>>426
fscanfにそんな機能があったのですか、もう一回調べてきます
ありがとうございました

429 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:54:39 ]
>>428
scanfはfscanfのラッパー関数みたいなもん。
scanf内でfscanfをstdinに対して処理している。
scanfでもstdinをfreopenすればファイルからの入力にできる。

430 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:13:36 ]
普通strtol(), strtod()

431 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:43:21 ]
#include<stdio.h>
int main ()
{
int a,b,c,i,f,d[50];
scanf("%d %d",&a,b);
switch(a*b){
case 0:
return 0;
defalt:
c=a/b;
printf("%d",c); /*19*/
break;
}
i=1;
while(i<=50){
c=a%b;
d[i]=c/b;
c=c%b;
printf("%d",d[i]);
if(d[i]==0)
f++;
else
f=0;
if(f>=2)
break;
i++;
}
return 0;
}
スミマセン!なんでコレダメなのデスカ?オシエテクダサイ!!!

432 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:45:12 ]
>>431
scanf("%d %d",&a,&b);
反射神経が書いてるので違うかもシレン。

433 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:26:48 ]
>>431

defalt:

↑これがだめだ。
ラベルとして認識しているはず。
default: な。


434 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:28:32 ]
>>431

ちょっとずれるが、

switch(a*b){
case 0:

↑0かどうか判断したいだけなら、if文を使うべきだ。
switchにする必要なし。


435 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:42:18 ]
スミマセンちなみにエラーの内容ハ”Ifに(がナイ”デス。
修正しまシタがダメデス。
書き方ノドンクササとかよりそっち教えてホシイデス。

436 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:03:01 ]
>>431に「エラー」は見当たらないような・・・

437 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:18:59 ]
>>435
もう一回、ifの入ってるバージョンのソース見せてくれたらなにかコメントできるかも



438 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:22:45 ]
>>431
>d[50];

>i=1;
>while(i<=50){

これも駄目だな

439 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 14:25:34 ]
437
このトウリデス
ナオラネエ!ウガァァァァァ

440 名前:デフォルトの名無しさん [2007/12/31(月) 17:09:50 ]
#include <stdio.h>
void test(int i);

itn main(void)
{
test(0);
return 0;
}

void test(int i)
{
if(i<10){
test(i+1);
printf("%d",i);
}
}

再帰なんですが
これ難しくて理解できないんすよ。
みなさん詳しく説明してくださいお願いします。

441 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:41:00 ]
test関数は引数が10未満ならもう一度test関数を引数+1の値を使って呼び出したあと引数を出力する。
出力は「9876543210」ってなるだけかな?
10を3とかにして流れをゆっくり追って行けばわかるよ。


442 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:42:04 ]
itnってなんだろうってのは置いといて、

test(0)は0+1でtest(1)を呼ぶ
test(1)は1+1でtest(2)を呼ぶ
最終的にtest(9)が9+1でtest(10)を呼ぶが、i<10じゃなくなるので何もしない
その後printfで9が印字され、8が印字され・・・最初の0が印字されて終了と
処理が戻っていく感じだな

443 名前:440 [2007/12/31(月) 18:03:00 ]
>>441 >>442
やっぱ再帰できたほうがいいすか?
ポインタよりも再帰の方が難しい・・・



444 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:04:52 ]
何が難しいのかさっぱり理解できない

445 名前:440 [2007/12/31(月) 18:11:48 ]
何故、0123456789じゃなくて
逆になるのかが、難しい


446 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:13:21 ]
>>443

感覚的に理解できないだけだと思うけど、
デバッガでステップ実行して追っていけばわかると思うよ。

ちなみに、再帰はめったに使わない。
11年ぐらい仕事でCプログラミングやってるが、
再帰を使ったのは1,2回。

447 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:23:52 ]
>>445
printfを実行するのはtestを実行した後だから

ディレクトリの走査とかそれに類似したものは再帰使うなぁ
定番というか



448 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:30:32 ]
デバッグ中に無限に再帰してスタック食いつぶしてデバッガがフリーズするのも良い思い出。

449 名前:440 [2007/12/31(月) 18:56:37 ]
再帰なんて深く理解しなくていいすか?
適当にながしちまえば?

450 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:01:59 ]
じゃあこれでどうだ

int sum(int n)
{
    int ret;
printf("enter sum(%d)\n", n);
    if(n == 1)
        ret = 1;
    else
        ret = n + sum(n - 1);
printf("leave sum(%d)=%d\n", n, ret);
    return ret;
}

int main()
{
    printf("sum(5)=%d\n", sum(5)); // print 1+2+3+4+5
    return 0;
}

enter sum(5)
enter sum(4)
enter sum(3)
enter sum(2)
enter sum(1)
leave sum(1)=1
leave sum(2)=3
leave sum(3)=6
leave sum(4)=10
leave sum(5)=15
sum(5)=15

451 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:04:18 ]
>>449
何を目的で勉強してるかによるんじゃないかな
単位のためとかであれば流しちゃっていいと思う

452 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:05:08 ]
滅多に使わないけど、再帰は階層構造を簡単に処理するには非常に便利、
この程度の基本テクニックにねを上げてるようじゃ、先は暗いよ。
諦めずに理解するべし。




453 名前:440 [2007/12/31(月) 19:11:11 ]
>>452
理解してみます
再帰はソートっぽいんすね
>>451 >>452とか
他の人たちは
socketとかネットワークプログラムとかもへっちゃらすか?


454 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:18:10 ]
「へっちゃら」の意味合いによる
ネットワーク関連のバグの修正とかは泣きそうになる

455 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:23:41 ]
スタックはLIFO

456 名前:440 [2007/12/31(月) 22:31:02 ]
test(0);


printf("%d",i);
tesxt(i+1);
の逆の再帰だと理解できます
先にprintfで0を表示してそのあとにtest0+1をして
1になってprintfで1を表示して
それを10まで繰り返すんですが

上の440のやり方だと
なぜtest(i+1);したあとprintfをやっているのに 9が最初にくるかがさっぱりなんですが
より詳しく教えてくれる人はいませんすか?

457 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:42:02 ]
>>456
再帰呼び出しが終わったらどこに戻るか考えてみそ。



458 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:44:11 ]
長いのでi<2でやると
test(0)→test(1)→test(2)→2は何もしないのでそのまま終了
test(1)に戻る、printf("%d",1)、test(0)に戻る→printf("%d",0)
return 0;に戻る

459 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:45:23 ]
10まであると面倒だからif(i<10)のところがif(i<2)だったものとする。

test(i+1)の所に順次、関数の中身を展開していくと、

if(0<2){
if(1<2){
if(2<2){
test(2+1); // ここは実行されない。
printf("%d",2); // ここは実行されない。
}
printf("%d",1);
}
printf("%d",0);
}

になる。で、10が表示される。これ見たら分かる?

460 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:45:46 ]
>>456
たぶん他の人と被ると思うけどw

test(0) が呼ばれるじゃん?
→ i<10 なので、test(1) が呼ばれるじゃん?
 → i<10 なので、test(2) が呼ばれるじゃん?
   : 中略するじゃん?
    → i<10 なので、test(9) が呼ばれるじゃん?
     → i<10 なので、test(10) が呼ばれるじゃん?
      → i<10 が成立しないので、何もせずに test(10)を抜けるじゃん?
     → printf("%d", 9) で 9 が出力されるじゃん? そんでtest(9)を抜けるじゃん?
   :
 → printf("%d", 2) で 2 が出力されるじゃん? そんでtest(2)を抜けるじゃん?
→ printf("%d", 1) で 1 が出力されるじゃん? そんでtest(1)を抜けるじゃん?
printf("%d", 0) で 0 が出力されるじゃん? そんでtest(0)を抜けるじゃん?
main() 終了じゃん?

さあ、何が出力されたかな?っと。

461 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:46:56 ]
3人もかぶるとはめずらしい

462 名前:460 mailto:sage [2007/12/31(月) 22:47:32 ]
ほら被ったあw

463 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:50:36 ]
おまえら大晦日なのに暇人だな



いや大晦日だから暇なのか

464 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:52:11 ]
初詣に出かけるまでの時間、暇で暇で仕方ない

465 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:53:14 ]
休みなんて、コーディングくらいしかやること無いしね

466 名前:440 [2007/12/31(月) 22:57:43 ]
おお!わかりやすいです。
ですが何故、繰り上がってる時にprintfが有効にならないのかが不思議です

i<10 test(0);

test(1)に繰り上がる時は test(i+1)とprintf("%d",i);をやるはずなんですが

何故printfが飛ばされてるんですか?

467 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:59:42 ]
test(i+1)が終わらないとprintfに進めないじゃないか。



468 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:59:50 ]
わかってないのにわかりやすいとはこれいかに


飛ばされてるんじゃなくて、test(i+1)で止まってると思えばいい
で、test(i+1)の処理が終わったら戻ってくる。

469 名前:440 [2007/12/31(月) 23:02:55 ]
test(i+1);で10になるまでループしてると考えれば良いんですか?
それで10になったら 987654321と戻ると?

470 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:03:02 ]
>>440
test は、9 から i までを出力する関数。

引数が 10 未満の時は、まず test(i + 1); とすることで 9 から i + 1 までを出力してから、その次に i を出力してるっしょ?
そういうわけで、9 から i までが出力される。
んで、10 以上の数を渡すと、if に引っかかって何も出力されない。

だまされた気分になっても気にしない。

471 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:07:15 ]
test(10)は何も表示しない。
test(9)はtest(9+1)を実行してから9を表示する。つまり、9を表示する。
test(8)はtest(8+1)を実行してから8を表示する。つまり、98を表示する。
test(7)はtest(7+1)を実行してから7を表示する。つまり、987を表示する。
…中略…
test(1)はtest(1+1)を実行してから1を表示する。つまり、987654321を表示する。
test(0)はtest(0+1)を実行してから0を表示する。つまり、9876543210を表示する。

472 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:13:23 ]
再帰関数を展開して1つ1つ理解しようとしても混乱するだけだよ。

例えば 9 から i までを出力する関数 hoge があるとするだろ?
それを使って test を実装しようとすると、一番簡単なのは hoge をそのまま呼ぶだけだけど、
それじゃ面白くないので 9 から i + 1 までを hoge に出力させて、
それから i だけを test 内で出力するという風にしてみよう。
そうすると

void test(int i) {
 if(i < 10) {
  hoge(i + 1);
  printf("%d", i);
 }
}

となるわけよ。これは分かるっしょ?

んで、この test っつー関数は 9 から i までを出力する関数になったわけだから、
hoge としてこの test が使えることになる。
というわけで、

void test(int i) {
 if(i < 10) {
  test(i + 1);
  printf("%d", i);
 }
}

としても同じ結果が得られるって寸法だ。

473 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:14:17 ]
>>459とほとんど一緒だけど
int main(void)
{
/* test(0)開始 */
if(0<2){
/* test(1)開始 */
if(1<2){
/* test(2)開始 */
if(2<2){
/* ここは実行されない */
}
/* test(2)終了*/
printf("%d",1);
}
/* test(1)終了*/
printf("%d",0);
}
/* test(0)終了*/
return 0;
}


474 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:18:46 ]
_beginthreadexでウィンドウハンドルを渡したいんですが、
どうすればいいですかね?

475 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:19:25 ]
スレ違い

476 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:19:57 ]
第3引数から渡すれ

477 名前:440 [2007/12/31(月) 23:21:05 ]
なんとか理解しました

>>460さんのが分かりやすかったです

まだ完全理解したという訳ではないので勉強してみます
回答してくれた皆様ありがとうございました。



478 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:23:03 ]
おそらくスタックがどんな感じなのかわかっていないかな?

iがスタック上に積まれる他に関数呼び出しによる復帰情報(ここだとtest()関数な)がスタック上に積まれるんよ
復帰情報は関数が何処に戻れば良いかを示すリターンアドレスが格納されている
ここではまだ実行されていないprintf()の直前

つまりイメージとしては
復帰←0←復帰←1←復帰←3←復帰…8→復帰←9←復帰
と積まれる(push)

でループから抜けると

今度は
復帰情報→0→復帰→1→復帰→3→復帰…8→復帰→9→復帰
と逆に飛び出してくる(pop)

つまりLIFO(Last In First Out)な訳
良くコインの入れ物として説明されている有名アレ

479 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:46:46 ]
ああなんか色々間違ってるなゴメン

正しくは
push時
main復帰←0←復帰←1←復帰←2←復帰…8←復帰←9←復帰

pop時
main復帰→0→復帰→1→復帰→2→復帰…8→復帰→9→復帰



480 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:55:51 ]
スタック云々言って理解できるなら、
再帰ぐらいで悩まないと思う…。

481 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:16:15 ]
うぬ、そうか、、、スタック説明しないと無理か 大変だな
えーっとスタックはローカル変数を格納する為のメモリ領域で・・・
ってスレ違いだなこりゃ

スマン調べてくれとしか言いようが無い
頑張ってくれ

482 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:18:39 ]
同じ関数だから混乱する。
引数が関数名だと思ってたどってみ
test(1)は test1(1)だと

483 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:23:13 ]
年越し勉強会になっててワロタ

484 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:18:13 ]
printf("あけおめ");

485 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:18:53 ]
puts("ことよろ");

486 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:35:47 ]
scanf("%d", &otoshidama);

487 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:39:34 ]
^D



488 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:42:40 ]
!#include <stadio.h>
int mein()
{
fprint("間違えを見つけた数×100000円お都市玉をもらえます");
}
return 0;

あけましておめでとうございます

489 名前: 【4円】 mailto:sage [2008/01/01(火) 01:49:08 ]
600000GET

490 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:52:21 ]
600000円が最高金額か
ダンヒルの最高値福袋2個分かよw

491 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 06:18:41 ]
Max \700,0000- ?

492 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 06:19:18 ]
\700,000-

493 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:25:28 ]
\nが無いのを間違いと見るなら800000円かな?


494 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:42:07 ]
>>474
4番目のvoid *arglistを使って渡すべし。

495 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:06:42 ]
函数の()の中にvoidとかを書かないのは間違い?

496 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:11:54 ]
函数の()って何だよ。
もうちょっと人に伝わる言葉で表現しろよ。

497 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:13:29 ]
さーせん。
「mein()」の()の事



498 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:14:36 ]
mein って何だよ

499 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:15:15 ]
こっちのセリフです><

500 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:17:14 ]
main

501 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:17:39 ]
>>497
それだけじゃ、宣言か定義か呼び出しかすら分からないわけだが・

502 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:19:24 ]
いえ、>>488のことですが・・・

503 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:21:26 ]
別に何の間違いでもないだろ

504 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:22:46 ]
( ) 内に何も書かなかった場合

○ プロトタイプ宣言
 引数がどうなっているか不明であることを表す。
 その後具体的な引数を指定した宣言や定義が現れない限り、
 この関数を呼び出す時、実引数は可変長引数の時と同じように扱われる。

○ 関数定義
 規格上は void であると見なされることになっている。
 ただし、上記に書いた通りの動作を起こすコンパイラもある。

○ 関数呼び出し
 そもそも ( ) 内に void と書いて呼んではならない。

505 名前:440 [2008/01/01(火) 16:48:42 ]
また質問っす
#include <stdio.h>
#include <string.h>
int ko(char *p);
int main(void)
{
char str[80];

gets(str);
printf("%d\n",ko(str));
return 0;
}
int ko(char *p)
{
int a;
a=0;
while(*p){
a++;
p++;
}
return a;
}
なんですが
while(*p)なんですが
str[80]に入力した文字をどのように繰り返してるんでしょうか?
while(*p)だと全然理解ができません
入力した文字列の\0(ヌル文字まで繰り返すんでしょうか?)


506 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:57:16 ]
while(*p != '\0') { } と同じ。

507 名前:440 [2008/01/01(火) 17:00:23 ]
ありがとうございます
*pとかよくわかりずらくて参考書にそんなようなこと書いてなくて
次はforでやってみようかと思います



508 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:00:32 ]
>>505
・C言語では偽が0、真が0以外
・whileは条件が真(つまり0以外)の間、ループを続ける
・C言語の文字列(char配列)はヌルターミネートといって最後にヌル文字('\0')が入っている
・ヌル文字の文字コードは0
・*は間接参照演算子

つまり
>入力した文字列の\0(ヌル文字)まで繰り返す
で正しい。
ヌル文字ではなかったらaをインクリメントし、ついでにpを進める、ということを繰り返す
まあ(半角)文字数を調べる関数だね

509 名前:440 [2008/01/01(火) 17:06:50 ]
>>508
あ!だからヌル文字で終わるんですね
ヌル文字=0って事を・・・

文字列とかが入るとややこしくなるんで
これを使えば特定の文字の数を数える関数とかへっちゃらっすね

510 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:25:47 ]
でも、ちゃんと '\0' と比較した方が読みやすいから比較しようぜ

511 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:35:04 ]
そうだね。
こんな読みにくいコード書いても、読みやすいコードに比べて実行速度が速くなる訳じゃないもんね。


512 名前:440 [2008/01/01(火) 17:42:21 ]
実行速度ってどうなんすか?
僕が作るプログラムではそこまでイライラするほどかからないんすが

513 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:54:41 ]
全く変わらん。

514 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:16:56 ]
#include <stdio.h>
int main(void)
{
  while(1)
  {
    printf("おまいら\n");
    printf("あけましておめでとう!\n");
  }
  return 0;
}

515 名前:440 [2008/01/01(火) 19:18:16 ]
ネットワークプログラム作りたいんすよね
どんな過程でネットワーク系に入りますか?
まずC言語の文法など覚えてたらすぐネットワーク系のプログラムとかやりますかね?

516 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:27:54 ]
ネットワークプログラムは結構めんどくさい。文法覚えただけでは苦戦する。
でも、目的を持って難題に立ち向かうのが上達の秘訣だとおもう。
コードを書いていれば、何が必要かだんだんとわかってくる。
すぐに作れなくてもあきらめないことが重要だよ。


517 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:47:55 ]
#if
#else if
#end if

の使い方がわかりません!
どういうときに使うんですか!



518 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:51:35 ]
以下の★1と★2のやり方で結果が同じになるのはどうしてなんでしょうか?
有識者の方ご教授をお願いします。

#include<stdio.h>

void * func(void *p){

printf("□■□func開始□■□\n");
printf("pのアドレス = %p\n",p);
printf("p = %d\n",(int)p);
(int)p += 100;
printf("p = %d\n",(int)p);
printf("□■□func開始□■□\n");

return NULL;

}
int main(void){

int number = 30;

printf("numberのアドレス = %p\n",&number);
func((void *)number);★1

return 0;

}


519 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:52:05 ]
#include<stdio.h>

void * func(int *p){

printf("□■□func開始□■□\n");
printf("pのアドレス = %p\n",p);
printf("p = %d\n",*p);
*p += 100;
printf("p = %d\n",*p);
printf("□■□func開始□■□\n");

return NULL;

}
int main(void){

int number = 30;

printf("numberのアドレス = %p\n",&number);
func(&number);★2

return 0;

}


520 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:58:22 ]
>>517
#define VER 2
#if VER < 2
//古いコード
#else
//新しいコード
#endif

みたいにソースを丸ごと切り替えるときに使ったりする
慣れると便利。

521 名前:440 [2008/01/01(火) 19:59:01 ]
>>514
それは、おまいら あけましておめでとうを無限ループですね?
while(1)なので

522 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:59:45 ]
>>518
1はちゃんと動くのか?

523 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:03:15 ]
>>522
*(int*)p += 100;
とすると、同じ結果が出るね。

524 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:05:54 ]
>>517
デバッグ時にコードを一時的に無効化したり有効化するのに便利だね。
/* */とは違って、入れ子にできるから楽

#if 0
hoge();
hoge2();
#endif


525 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:07:40 ]
>>523
ほんとに
func((void *)number);★1
こうなのか?

526 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:11:00 ]
>>525
たしかに。&がないと通らないね。

527 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:12:32 ]
>>523
怒られるんだけどw



528 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:25:21 ]
>>520 >>524
ありがとうございます!
ということは int VER みたいなフラグを作っておいて使うんですね!

#if 0
とか参考にしてたソースに出てきてわからなかったです
ありがとうございました!

529 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:42:21 ]
>>528
>int VER みたいなフラグ
駄目です、それじゃ使えません

530 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:46:59 ]
>>523
*(int*)p
それは参照先がアレじゃないか?

531 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:52:07 ]
>>518
そのこぴぺされたコードで、コンパイルして実行できるか、もう一度確認してみてくれないか?
ちなみにWindows?もしかしてDOS?


532 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:53:06 ]
>>529
orz
使い方おしえてくだしあ

533 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:55:26 ]
>>532
>>520

ただの置換だと思えばいい

534 名前:440 [2008/01/01(火) 21:01:52 ]
viみたいなエディタ作るには
1人じゃ無理すかね?

535 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:03:12 ]
>>532
プリプロセッサと呼ばれる機能なのだ。
#defineはマクロで、文字列の置き換え
#define VAR 2
と書くと、今後ソースのVARは2という文字に置き換えられる。

#ifは条件付コンパイル。式が0でなければ有効となる。
#if VAR>1
と書くと、以下と同意になる。
#if 2>1
となって、式の結果は、1なので、有効となる。

536 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:03:21 ]
viみたいなエディタなら無理じゃない

537 名前:440 [2008/01/01(火) 21:05:24 ]
画面上に色とかつけたりしてるのは、あれはC言語でやってるんすかね?
viで色とかが使えるすがスキームなど色文字を表示することは可?



538 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:06:45 ]
>>537
DOSなら、エスケープシーケンスじゃないか?


539 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:14:13 ]
WindowsならコンソールAPI

540 名前:440 [2008/01/01(火) 21:15:29 ]
Linuxじゃ無理すか?
たしかにwindowsだと猫でもわかるC言語に書いてありましたが

541 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:18:55 ]
猫か…

542 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:21:45 ]
>>540
linux
エスケープシーケンス使えるよ
printf("\033[31mhogehoge\n");
って感じで

543 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:25:50 ]
VT100か

544 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:25:59 ]
>440
ちょっとは自分の頭を使って集中して物を考えたり調べも伸したりする習慣をつけろよ

545 名前:440 [2008/01/01(火) 21:47:36 ]
>>542
すげーっすね!
できましたよ
エスケープシーケンスで調べてきます

>>544
以後気をつけます

546 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 00:02:28 ]
>>523

左辺値にキャストはできないだろ?


547 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 09:04:56 ]
>>546
これを実行してみてほしい

#include<stdio.h>

int main(void){
long num=1234;

*((char*)&num)+=65536+256;
printf("%ld\n", num);
*((short*)&num)+=65536+256;
printf("%ld\n", num);

return 0;
}



548 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 09:59:34 ]
キャストしたものは左辺値じゃないけど、* をつけたから左辺値で通るんだよ。

549 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:28:47 ]
#include <stdio.h>
#include <malloc.h>
main(togo,toog)
int togo;
char *toog[];
{char *ogto, tgoo[80];FILE *ogot; int oogt=0, ootg, otog=79,
ottg=1;if ( togo== ottg) goto gogo; goto goog; ggot:
if ( fgets( tgoo, otog, ogot)) goto gtgo; goto gott;
gtot: exit(); ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0)
goto oggt; goto ggot; ogog: if ( !ogot) goto gogo;
goto ggto; gtto: printf( "%d goto \'s\n", oogt); goto
gtot; oggt: if ( !memcmp( ogto, "goto", 4)) goto otgg;
goto gooo; gogo: exit( ottg); tggo: ootg= strlen(tgoo);
goto tgog; oogo: --ootg; goto togg; gooo: ++ogto; goto
oogo; gott: fclose( ogot); goto gtto; otgg: ogto= ogto +3;
goto ogtg; tgog: ootg-=4;goto togg; gtgo: ogto= tgoo;
goto tggo; ogoo: ootg-=3;goto gooo; goog: ogot= fopen(
toog[ ottg], "r"); goto ogog; ggto: ogto= tgoo; goto
ggot;}
これは何ですか?

550 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:13:44 ]
たしかIOCCCのプログラム。別に何ってわけじゃない。

551 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:00:33 ]
頭が物故割れた

552 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:24:50 ]
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
 char *position, line[80];
 FILE *fp;
 int counter=0, num, maxbuf=79;
 if ( argc == 1) {return 1;}
 fp= fopen(argv[ 1], "r");
 if ( !fp) {return 1;}
 position= line;
 while ( fgets( line, maxbuf, fp)) {
  position= line;
  num= strlen(line);
  num-=4;
  while (( num > 0) && ( !memcmp( position, "goto", 4))) {
   position= position +3;
   ++counter;
   num-=3;
   ++position;
   --num;
  }
 }
 fclose( fp);
 printf( "%d goto \'s\n", counter);
 return 0;
}

たぶんこういうこと

553 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:40:09 ]
まちがえた、・・・まぁいいか・・・

554 名前:デフォルトの名無しさん [2008/01/05(土) 01:12:12 ]
Javaを半年ほどやってCを最近始めた素人です。

同じソースファイル内でも関数の定義位置が違うだけで、
コンパイラが、関数宣言ないよー。という警告をするのが、
いまいち慣れないのですが。

static宣言な、ファイル内スコープの関数なんかでも、
プロトタイプ宣言ってきちんとしたほうが良いのでしょうか。

手元にあるC言語入門だと、main関数を最後のほうに、
定型的な計算用の関数等を、頭のほうにもってきて、
プロトタイプ宣言を書かないようしているのですが、
皆様はどういった書き方をしておられるのでしょうか・・・。

555 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 01:14:41 ]
>>554
基本的に、ソースファイルの書き方は一貫性が大事だと思っている。
だから、一貫性を持って読みやすければそれでOKだ。

556 名前:デフォルトの名無しさん [2008/01/05(土) 01:29:27 ]
>>554
おぃ… どのportでaccessしろと云うのだ?

557 名前:デフォルトの名無しさん [2008/01/05(土) 01:51:07 ]
www.microsoft.com/japan/msdn/vs/vcsharp/mth_lexicograp.aspx
から.msiインスコしたまではいいですが、ここからどうすればアプリとして起動できますか?
よく分からないままMS Visual C#2008入れました。
最終的にやりたいのは、nCrで任意のnとrを最初に指定して、.txtファイルで1行毎に記述した多数の序数x(1≦x≦nCr)を組み合わせ化して別の.txtファイルにsaveすることです。



558 名前:デフォルトの名無しさん [2008/01/05(土) 02:09:33 ]
方向音痴な初心者です
因みに… '/usr/share/doc/man1/或.zg
個人の計算では恐らく'/usr/share/doc*
全てを読み込む様に為っていた筈…

559 名前:デフォルトの名無しさん [2008/01/05(土) 02:20:37 ]
最後の状態…
1・再起動がBIOSに到達せず再起動…
2・停止がBIOSに到達せず停止の筈が再起動…
3・RANを切らないと停止せず…

560 名前:デフォルトの名無しさん [2008/01/05(土) 02:25:06 ]
斯様に考えてもfile内に.pngを埋め込むのは無理と考えerror_fileを削除の末…
此の顛末…

561 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 02:31:08 ]
次の質問をどうぞ

562 名前:557 [2008/01/05(土) 02:42:49 ]
see me(>>557) plz!

563 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 02:55:06 ]
>>557>>562
ここはC#のスレではありませんよ

564 名前:557 [2008/01/05(土) 03:49:11 ]
>>563
Spcially sorry, sir.

565 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 07:32:27 ]
>>554
> 手元にあるC言語入門だと、main関数を最後のほうに、
> 定型的な計算用の関数等を、頭のほうにもってきて、
> プロトタイプ宣言を書かないようしているのですが、
> 皆様はどういった書き方をしておられるのでしょうか・・・。

基本的に読むときのことを考えて書く。
文章は上から下へ向かって読む。
だからプロトタイプ宣言も書いてmainの下に呼び出す関数を書く。

よく見るif (0 == a) みたいなやり方(=を書き間違えるミスを防ぐやつね)
もバッドノウハウだと思う。

566 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:07:16 ]
>>565
最後の2行は同意するが、関数をボトムアップで書くのは臨機応変でありだと思う。

567 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:07:08 ]
>>565

> よく見るif (0 == a) みたいなやり方(=を書き間違えるミスを防ぐやつね)
> もバッドノウハウだと思う。

なんで?
他にいい方法ある?



568 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:07:35 ]
はい、次の質問どうぞ〜

569 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:14:55 ]
>>565
>基本的に読むときのことを考えて書く。
>文章は上から下へ向かって読む。
>だからプロトタイプ宣言も書いてmainの下に呼び出す関数を書く。
うーん・・・微妙。
結局main関数がファイルの一番上に来るわけでもないし、
mainを最初に持ってきたからって可読性は上がらないと思う。
コード全体で一貫性があればケースバイケースどころか
趣味の範疇じゃない?

570 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:18:41 ]
>>567

最近のコンパイラなら警告を出すはずだし、lintもある。
それに、
 if (a = b)
は防げない。

-Wall で出る警告をすべて潰すか、lintを使う習慣をつけたほうが良い。


571 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:19:25 ]
Cに慣れると関数がボトムアップに並んでないと不自然に見えてくる。

572 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:32:24 ]
>>555で終わってるネタ

573 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:32:49 ]
>>569

おれは >>565に同意。
main関数を一番下に持ってくるのは、プロトタイプ宣言がなかった頃の
古い習慣を引きずってるだけだったはず。

>結局main関数がファイルの一番上に来るわけでもないし、

これはその通りだけど、プロトタイプ宣言を長々と書くことは少ないし、
たとえ長くなっても関数ブロックがどこから始まるかはすぐわかるので、
main関数が上にあるはうが見つけやすい。

あと、呼び出す関数の引数などを見たいとき、
プロトタイプ宣言が一箇所にまとまっているほうが見やすいと思う。

まあ、これはコーディングスタイルだから、強くは主張しないけど。


574 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:27:15 ]
>>573
プロトタイプ宣言のなかった頃という実例を提示してくれ。
宣言がなかったら外部の関数は一切まともに呼べないと思うのだが。

575 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:28:40 ]
> mainがどうとか
最近はフリーのでもエディタが強いからなぁ。
気にならなくなったし気にしなくなった。

576 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:31:36 ]
10個の配列に入っている数それぞれが
全て異なるってどういう風に書けばいいんでしょうか?

577 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:37:21 ]
int array[10];
for (int ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) array[ic] = ic;



578 名前:576 mailto:sage [2008/01/05(土) 13:45:39 ]
追記すいません。
10個の配列には既に数字が入っていて
条件式でかくならどうすればいいですかね?

579 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:58:18 ]
ループでまわすか45個条件式書くか、好きなほうにしろよw

580 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:23:57 ]
無駄に再帰

int unique(int array, int n){
 int i;
 if(n <= 1)return 1;
 for(i=1; i<n; ++i)
  if(array[0] == array[i])
   return 0;
 return unique(array+1, n-1);
}

581 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:29:42 ]
要素数intを再帰するのはちょっと勇気がいる。「スタックはもう0よ」に気をつけて。

582 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:34:42 ]
要素10個の配列を想定した再帰でスタックの心配とかw

583 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:35:36 ]
>>581
そこで最近覚えた末尾再帰の最適化ですよ。

584 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:10:46 ]
"入っている数"があまり大きくない数字(例えば0〜9999とか)なら、
配列(例なら10000要素)を用意して重複チェックするという手もある
10回ループすればわかる

585 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:56:01 ]
ソート済み配列なら楽なんだがな

586 名前:576 mailto:sage [2008/01/05(土) 16:39:31 ]
>>584ので
わかった気がします。
ありがとうございました

587 名前:584 mailto:sage [2008/01/05(土) 17:50:36 ]
あぁ 577 にもヒントが
見落としていたよorz




588 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 17:59:25 ]
mainなんて最後に読むから下にあったほうが邪魔にならなくていいな

589 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:48:37 ]
mainから読まないと理解できない俺はorz

コメント豊富ならいいが、
そうでなければ順を追わないと分かりづらい……

590 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:56:00 ]
どうせ上から下に綺麗に順に追って読めるわけじゃないから、どこにmainがあってもいいや

591 名前:554 mailto:sage [2008/01/06(日) 01:04:01 ]
レス有難う御座いました。
結論としては>>555なのでしょうが。

自分はIDE使っていて、
>>573さんの様なスタイルがやりやすそうです。

コンソールでUnixプログラムとかを書ける様な方だと
また意見も変わってくるんでしょうかね…。

>>571とかも参考になります。
皆様ご意見有難う御座いました。

592 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:10:09 ]
すいません、超初心者なんですが判らなくなったので教えていただけませんか?
今アクセスカウンタを作ろうと思って、まずは簡単に動く物をテストで作ってみ
ようかと思ってるのですが、思った動作をしてくれません・・

ipアドレスをゲットして、そのipアドレスから連続でアクセスがあった場合カウンタ
が回らないようにしたいです。超初心者の自分なりに書いてみたのですが、同じipから
のアクセスでもカウンタが回ってしまいます。ソースは

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main()
{
long i;
FILE * fp;
char *test,*ip,*count="count.dat",*addr="addr.dat";

test = getenv("REMOTE_ADDR");
fp = fopen(addr,"r+");
fgets(ip,30,fp);

if(ip==test){
printf("test");
fclose(fp);
}



593 名前:592 mailto:sage [2008/01/06(日) 04:11:42 ]
else
{
fprintf(fp,test);
fclose(fp);

fp=fopen(count,"r+");
rewind(fp);
fscanf(fp,"%6ld",&i);
i++;
rewind(fp);
printf("Content-type: text/plain\n\n\0");

fprintf(fp,"%06ld",i);
printf("%06ld",i);

fclose(fp);
}
}


こんな感じです。多分どっか物凄く適当な事をしてる部分があると思うのですが
自分ではぜんぜんそれがどこか判りません・・・

誰か教えてください・・・

594 名前:592 mailto:sage [2008/01/06(日) 04:13:28 ]
あー15行目の
printf("test");
はif文に入ったかどうかチェックする為に書いた物で意味はありません。

595 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:19:46 ]
基礎からやった方が良いと思うけど、とりあえず。

・ipは只の未初期化のポインタ
・文字列の比較は==ではしない

596 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:19:57 ]
 >>592
char* ip; で
fgets(ip,30,fp); は臭う

if(ip==test) ポインタ比較してどうする
文字列比較は strcmp (string.h)
全部読んでないが、ここら辺。

597 名前:592 mailto:sage [2008/01/06(日) 04:35:19 ]
>>595-596
こんな時間なのに即レスありがとうございます。
もう少しポインタの勉強してきます・・・



598 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:42:36 ]
ポインタの前に配列を

599 名前:592 mailto:sage [2008/01/06(日) 04:56:42 ]
あぅあぅ・・
眠いせいか全く頭まわらず、未だ解決の糸口が掴めません・・今日はもう寝ます。

もしよかったら592の鳥頭でも判るcの初心者向け解説サイトなんかあったら教えていただけますか?orz
よく寝て頭冴えてる時にもう1度チャレンジします。

600 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 05:09:17 ]
>>599
ttp://www9.plala.or.jp/sgwr-t/

601 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 05:09:35 ]
>>592
char *test,ip[128],*count="count.dat",*addr="addr.dat"; にして

if(ip==test){ は
#include <string.h> を追加して if(strcmp(ip, test) == 0)だな

あと、printf("Content-type: text/plain\n\n\0"); の最後の\0は要らない

サイトより、しっかりした一冊を読んだほうが為になると思う

602 名前:592 mailto:sage [2008/01/06(日) 05:55:21 ]
眠い目こすりながら"もうちょい・・もうちょい・・"ってやってたら出来ました!
600さん601さんありがとうです。ほぼ601さんの書き込み通りで出来ました。

else
の後に
rewind(fp);
が無かったのでaddr.datが追加書き込みで上手く働かなかったのだけ
なんとか自力で見つけて修正しました。ホント有難うです!

603 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 10:25:50 ]
>>574

つ homepage3.nifty.com/ryuz/c/about_ansi.html


>宣言がなかったら外部の関数は一切まともに呼べないと思うのだが。

外部の関数はextern宣言で呼ぶ。
古いソースを見ると、こんなのを見かける。
#ifdef __STDC__
int func(int arg1, char *arg2);
#else
int func()   /* これが古いスタイル */
#endif

今はもう過去の遺物だが。


604 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 10:36:54 ]
まだやんの

605 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:26:34 ]
>>603
まさか、その「古いスタイル」という奴は宣言ではないとでも?

606 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:42:43 ]
昔はいきなり呼べたような。
そのためmath.hをインクルードしてないと引数がintになったりしてたような

607 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:45:03 ]
今でもいきなり呼べるよ



608 名前:603 mailto:sage [2008/01/06(日) 12:59:23 ]
>>605

ごめん、間違えた。
#ifdef __STDC__
extern int func(int arg1, char *arg2);
#else
extern int func()   /* これが古いスタイル */
#endif

こうだった。


609 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 14:23:04 ]
>>608
セミコロン要らないの?

610 名前:603 mailto:sage [2008/01/06(日) 15:20:15 ]
>>609

もちろん要るorz


611 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 16:17:55 ]
まだやってたのか。

>>605
とりあえず「プロトタイプ宣言」では無いと思う。

>>606-607
>引数がintになったりしてたような
戻り値とちゃうか?
んで、暗黙の戻り値の型はC99でダメにならなかったっけ?

612 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:17:39 ]
>>611
古い仕様やANSI非準拠の環境ならプロトタイプ宣言なくても関数呼び出しが可能。
戻り値は省略された場合intとみなす(これは確か規格)
引数はそこに関数呼び出しがあるならプロトタイプ宣言がなくとも予測できる。

int func();// ←プロトタイプ宣言
int a = func( 5, "hoge" );
と書かれていればfuncの引数が予測できる。


613 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:22:03 ]
予測も何も、そのままスタックに積んで取り出すだけでしょ
あってる限り問題は出ない

614 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:32:58 ]
コール規則が複数あるような場合に嵌るだろ

615 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:47:37 ]
プロトタイプを人間が確認してるようなもんだな

616 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:08:31 ]
>>612
なんか色々とウサンクサイな・・・

617 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:50:50 ]
まぁ、math.hをインクルードせずにprintf("%g\n", log(1))してみたまえ。いいもんだ。



618 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:04:47 ]
%gってなんすか?教えてくだしあ

619 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:07:50 ]
printfでぐぐれ

620 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:08:20 ]
manコマンドしか見てなかったよ

621 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:09:06 ]
ごめんうそ

622 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:21:22 ]
普通に、man printfしても出てくるでしょうが。

623 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:21:17 ]
プロトタイプ宣言。
200〜300行程度のプログラムならなんとでもなるね。
問題は複数の Cファイルに分割しなければいけない時。
ファイル数が多くなり、extern 関数呼び出しが多くなった時
プロトタイプ宣言が有る場合と無い場合とではバグ出現回数が
大幅に違ってくる。
プロトタイプ宣言する事を癖にした方が良いよ。

624 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:22:41 ]
ますます話が迷走を深めてまいりました

625 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:26:46 ]
>ファイル数が多くなり、extern 関数呼び出しが多くなった時
>プロトタイプ宣言が有る場合と無い場合とではバグ出現回数が
>大幅に違ってくる。
ソースキボン

626 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:42:32 ]
>>625
プロトタイプ宣言がない場合、関数の引数の数と型を合わせるのはプログラマの責任になる。コンパイラはチェックしない。
ファイル間の膨大な数の関数と呼び出しで、それを完璧にやれる人はまずいない。

627 名前:623 mailto:sage [2008/01/07(月) 00:38:00 ]
>>625
ソースなんてないよ。 実体験。
まだ経験してないのであれば...幸せなのか天才なのか、はたまた...



628 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 00:42:39 ]
ソースが無いのにどうやって体験したんだとか勘違いした俺はどうすれば

629 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:02:06 ]
>>628
俺も一瞬思ったw

>>627
昔はソース書いてからコンパイラに吐かせてプロトタイプ作ったりもしたが
今はIDEもあるし、ほぼ同時に作るべ、
複数人でやるならソースとヘッダの提供は不可欠だしな

630 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:04:46 ]
627と628の言うソースは違うものを指していると思われ。


631 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:06:02 ]
野暮だな

632 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 03:51:40 ]
そんなことは628もわかってんのにな

633 名前:U [2008/01/07(月) 17:58:56 ]
質問です・・
if (a < (int)(a * 10) % 10){
a = (int)a+1;
}
(注:aはdouble型です)
上記のような文がプログラム中にあったとき、aを7.1なら8のように小数の切り上げをしたいんですがこれでなっていることになるのでしょうか?
小数の切り上げの方法を知っていたら教えてほしいです(標準関数を用いない方法で)。

634 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 18:08:15 ]
その前に標準関数を使って行けない理由を聞かせてもらおうか。

635 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 18:15:09 ]
条件がはっきりしないけど、0.9足して切捨てとか

636 名前:633 [2008/01/07(月) 18:22:42 ]
>>634
学校の課題なので使ってはいけないという制限があるんです。
>>635
回答ありがとうございます。
ですがすみません7.1の他にも小数があるのでそれ以外にも対応出来るようにしたいんです。

637 名前:633 [2008/01/07(月) 19:05:00 ]
if文の不等号を逆にしたら出力したい結果が無事でました!!
とても答えづらい質問ですみませんでした。



638 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:10:03 ]
は?

639 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:11:03 ]
解決したと思ってるんならそれでいいだろ。
詮索することはあるまい。

640 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:32:25 ]
「宿題の回答」としてはベストな回答だと思うよ。

641 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:35:31 ]
アホだろ

642 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:44:31 ]
(n + d) / d;
だめ?

643 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:47:15 ]
だめ

644 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:52:15 ]
適当に貼ってみる
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
double value=100.001;
long result;

if(argc>=2) value=atof(argv[1]);

result=value; /* この行と */
if(value>result) result++; /* この行 */

printf("%ld\n", result);

return 0;
}

645 名前:デフォルトの名無しさん [2008/01/08(火) 00:57:40 ]
101 287 345 391 348 287 391
371 388 39 388
88 404 150 428 404 387 145 299 404 197
320 397 141 342 428 429 206
36 214 412 88 176 214 346 210 406 308
250 26 112 370 328 328 284

こんな感じのデータファイル(data.txtの一部です)を2次元配列にいれるにはどうプログラミングすればいいですか?
改行とかスペースをどう考慮していけばいいかさっぱりです

646 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 01:07:31 ]
>>645
つ[fscanf()]

647 名前:デフォルトの名無しさん [2008/01/08(火) 01:10:12 ]
>>645
fscanfでも使ったら?



648 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 01:13:50 ]
>>645
for(i = 0; !feof(fp); i++){
do{
fscanf(fp,"%d",&date[i][j++]);
}while(fgetc(fp) != '\n');
}

649 名前:デフォルトの名無しさん [2008/01/08(火) 01:28:52 ]
いやfscanfも普通に改行コード読み飛ばすし

650 名前:デフォルトの名無しさん [2008/01/08(火) 02:15:50 ]
>>648
!feof(fp); って何ですか?

651 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 02:24:07 ]
 >>650
 つ www9.plala.or.jp/sgwr-t/lib/feof.html
ファイルの終端でない間ループする
0 != feof(fp)

652 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 03:13:53 ]
今年からやさしいCを買ってはじめたんだけどscanfがでてきてからいっきに面白くなってきやがったぜ!

653 名前:デフォルトの名無しさん [2008/01/08(火) 03:36:40 ]
ほとんど利用しない命令

654 名前:デフォルトの名無しさん [2008/01/08(火) 03:46:36 ]
>>652
面白くなってきたのか!!
良いことだ!!
ただ油断するなよ。
scanfの仕様をもう一度確かめるんだ!!
不具合が多くて嫌になるぜ!!

655 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 05:02:29 ]
>>653
ほとんど使わないのかよ!

>>653
printfとかだとなんか字がでてくるだけでつまらなかったけど
scanfだとキーボード側から入力できて面白くなってきたぜ
しかし練習問題やったら、doubleなのに変換仕様を%fにしてたり
変数の前に&入れてなかったりとミス多発\(^o^)/

質問スレなのにすいません

656 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 05:50:55 ]
>>655
scanfは正しい入力をしているならまだいいが、ひとたび間違った入力が来ると簡単にバグの原因になる。
整数(%d)を欲しいところで文字列なんて打っちゃった日にはもう・・・
まぁ外に出すようなものじゃなければ気にしなくてもいいけどね。
慣れてきたらそこらへんも勉強してみるといいと思うよ。

657 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 08:03:25 ]
>>651
0 == feof(fp)



658 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 10:07:45 ]
!feof(fp)
だろ。それじゃ4バイトも無駄になる。

659 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 10:15:14 ]
とりあえず、入力と出力ができるようになってからいろいろ試せるんだし
scanfから入るのもいいんじゃない?そのうち使わなくなるだけで

660 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:18:16 ]
>>658
どこでどんな4バイトが無駄になるんですか?

661 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:40:14 ]
>>656
それは返り値でなんとかなるだろ
いやscanfで値取得がだめなのはもちろんなんだがな、オーバーフローは検知不可能できないし

そもそも>>658は誰宛なんだよwww

662 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:48:35 ]
>>661
>オーバーフローは検知不可能できないし
検知できるんですか? できないんですか?
そもそも、その「オーバーフロー」とはなんのことですか?

663 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:49:56 ]
知らない言葉が出てきたら自分で調べる癖つけないといつまでたっても上達せんよ

664 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 14:04:00 ]
>>662
オーバーフローとは
風呂にお湯を張るとき、止めるのを忘れたときに起こる奴

665 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 14:07:58 ]
エウレカ!エウレカ!

666 名前:662 mailto:sage [2008/01/08(火) 14:57:16 ]
>>663
「オーバーフロー」の意味は判るのですが、整数値の入力でどんなオーバーフローが起きるのかと思いまして。

667 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:07:06 ]
intの最大値は(4バイトの場合)2147483647でこれ以上大きい数値は格納できない。
longもunsignd intもcharもそれぞれに最大・最小値があるから、それを超える値を入力されると困る。



668 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:38:01 ]
char *foo[] = {"C/C++", "は", "市ね"};
のような文字列の配列があった場合に、この配列の長さ(上の例では3)を
取得するにはどのようにすればできるでしょうか?

length のような関数があるのではないかと思うのですが、、、

669 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:39:06 ]
sizeof(foo)/sizeof(*foo)

670 名前:662 mailto:sage [2008/01/08(火) 15:49:00 ]
>>667
なるほど。で、それは検知不可能なんですね?
では検知できる入力関数はあるのでしょうか。
或いは、桁数制限してしまえばオーバフローは回避できますよね。

671 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:55:39 ]
getsとかで数字を文字列として読み込んで、atoiとかで文字列を数字に変換する、とか。
文字列としてならいくらでも大きい数値を入れられるし、atoiはオーバーフローを検知してくれる。

672 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:12:32 ]
>>669 ちょっとダサイけど、thx!

673 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:16:36 ]
>>671
getsはない。

674 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:19:02 ]
んだ。今度はバッファオーバーフローだな。

675 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:20:31 ]
scanfでも桁数制限できるだろ

676 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:24:41 ]
>>650
if(!num) はif(num == 0)と
if(num) はif(num != 0)と同じ意味

while(!feof(fp))はfeofの返り値が0になるまでって意味

677 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:32:53 ]
ごめん
feofの返り値が0の間



678 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:38:00 ]
>>671
果てしなく無意味なオーバーフロー対策だなwwwwwwwww

679 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:39:34 ]
プロンプトで入力待ちするプログラムなんて練習のときくらいしか使わんからなんでもいいべ
リダイレクト前提のやつはこの限りでもないが。

680 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:56:16 ]
for(i=0; i < 10; i++){
printf("%d %d\n",x++,x);
}
だと表示される値は2つとも一緒なのに
printf("%d %d\n",x,x++);
に変えるとなぜ左側のほうが大きくなるのでしょうか?
後ろに++を付けているのだから右側が大きくなるべきだと思うのですが

681 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:57:05 ]
なんだべきって

682 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:58:08 ]
>>680
それ未定義動作
まあ理由としては、引数は後ろからスタックに積むから後ろの式を先に評価するケースが多いからだろうな。

683 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:03:12 ]
>>681
「べき」って使いませんか?
「大きくならなければならないと思うのですが」というニュアンスです。

>>682
素早い回答有り難うございます。

684 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:10:17 ]
681は日本語を勉強するべきだろう。

685 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:49:24 ]
SEになりたくて、IT企業に就職しても、
途中で挫折する人がいて退職する人も多々いると聞きます。
そう言われてる箇所は、だいたいどういう箇所なのか
具体的に教えてくれませんか?

686 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:50:06 ]
人間関係

687 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 18:03:14 ]
マ板で聞け
pc11.2ch.net/prog/



688 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:04:43 ]
UNIX Cシェルのmakefileで、
外部の環境変数が設定してあるファイルを
makefileの中から読み込むことって出来ますか?
出来るなら方法を教えてください。

689 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:17:37 ]
さすがにそれはシェルスクリプトのスレかmakeのスレで聞いた方がよくね

690 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:29:21 ]
>>689
ありがとうです
makeスレがないですね
シェルはあまり関係なさそうだし・・
うーん。どこがいいんだろ・・

691 名前:688 mailto:sage [2008/01/08(火) 20:38:44 ]
それっぽいスレ見つけました
そちらで聞いてみます。どうもありがとうでした。

692 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:03:00 ]
fopenの書き込みモードで第1引数(?)にC:\save.txtのように入れたのですが、指定したフォルダを探してもファイルがありませんでした。
エラーは出なかったのでおかしいと思って、読み込みモードで同じフォルダを指定すると読み込むことができました。
あれ?と思いそのフォルダを開いてみたのですが、ファイルは見当たりませんでした。
これはどういうことなんでしょうか?

693 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:04:03 ]
>>692
C:\\save.txt

694 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:05:43 ]
え?ファイルが無いのに読み込めたの?

695 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:08:09 ]
>>693
ありがとうございます!
ファイルを保存できました。

>>694
そうなんです
これはなぜだったんでしょうか?

696 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:35:54 ]
>>695
書き込みモードで起動したときにファイルを作成したと思う。

697 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:51:47 ]
>>692
別のフォルダでsave.txtというファイルをまず作ってくれ
それをお前さんが指定したフォルダにコピーできるか試してみてくれ
あと使っているOS教えてくれ
見えないというのはGUIを使っているということでいいのか?



698 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 22:13:51 ]
>>697
コピーできました。
OSはWindowsXPです。
GUIです。

D:\save.txtで書き込むとちゃんとファイルが出来ました。
指定したフォルダはCの中にあり、その奥に既にsave.txtがあったのが問題だったのでしょうか?
勝手に探してくれたということだと思うのですが。

699 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 22:25:38 BE:314515679-2BP(294)]
上のほうでfeof()で終了判定してるやつがいるけど、どこの素人だよ。
fscanf()がEOFを返したときに終了するのが普通。

700 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 23:08:51 ]
>>698
何も解決にならないでこんなこというのもなんだが
画面に絵とかファイル名とかが表示されてないだけで実際はファイルが生成される現象かな
Windows使ってる友人から以前聞いたことある
ブラウザからテキストの内容を見ることできると言っていたかな
力になれなくてすまん

701 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 23:16:15 ]
>>699
なら>>645のためにも
>>648よりスマートに書いてみろよw

702 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 23:36:51 BE:29954423-2BP(294)]
feof()の仕様って欠陥だろ。
なんでこんな使いどころのない関数があるんだよって感じ。

703 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 23:39:32 ]
エラー時に、ファイル終端に到達したのか
エラーが発生したのかチェックするために使うんじゃね。

704 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:05:44 ]
バイナリファイルはfeofで、特に他では使うなとか聞いたな

705 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:07:24 ]
>>704
それを言ってた奴は馬鹿。

706 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:10:05 ]
読み込みエラーが発生して、ずっとエラーから復帰できなかったら、
永遠にファイル終端に達しないから、エラーチェックしないと feof は危険。
しかし、そのエラーチェックでファイル終端も分かるから・・・。

707 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 10:00:41 ]
feofが単独で存在するのは読まずにチェックすることがあるからで、
読んでるのなら使うことはないな。



708 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 16:03:33 ]
まあ、読まないとEOFフラグセットされないわけだが

709 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:44:54 ]
0バイトのファイルを開いた直後の状態でもEOFではないでしょうか?

710 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:46:43 ]
ではない

711 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 00:44:18 ]
別に読むのがライブラリで自分が読まないケースだってあるんだよ

712 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:27:56 ]
>645 は1行あたりのデータ数がまちまちなんだが、そもそも
>2次元配列にいれる
っていうルールはどんなんだ?

713 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:41:23 ]
連投嫌われる?
聞きたい事いいいいっぱいあるです・・・。

714 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:49:36 ]
重要度の高い順に少しずつ質問すればいいと思うよ。

715 名前:713 mailto:sage [2008/01/10(木) 02:57:50 ]
じゃぁひとつだけ><

ソケット通信用のIOを得たときや、
open などのシステムコールを使って
ファイルディスクリプタを得た時など、
これらのリソースが正数型で返されますが、
この返り値は単なる確保したIOリソース用の
管理用番号みたいなモノと考えて良いのでしょうか?
また、もしそうならば、同一の正数値を指定さえすれば、
同じリソースに対して操作が可能なのでしょうか?

716 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:02:50 ]
>>715
open()の度に更新されるから、無理。勿論、close()しない限りは変わらないが。
# 例外は、stdin, stdout, stderr, stdaux相当のディスクリプタ。

717 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:17:54 ]
>>716さん
レスありがとうございます!

>open()の度に更新されるから、無理。
これに関してはもちろんわかっています。
ただ、返り値自体がどの範囲でどういった形で、
有効なのかが解らなかったもので…。
(IOを得るのにポインタとかで操作しないのかなー?と思ったのです。)

同じプロセス上から同じ値で参照した場合。
という意味で書きました。解りにくくてすみません…。

でも
>勿論、close()しない限りは変わらないが。
ということは715は合ってると考えていいですよね?

># 例外は、stdin, stdout, stderr, stdaux相当のディスクリプタ。
参考になります!



718 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:19:37 ]
訂正です。

誤:ということは715は合ってると考えていいですよね?
正:ということはclose()しない限りは715は合ってると考えていいですよね?

結果的に連投になってしまいましたすみません><

719 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:30:02 ]
>>718
同じプロセス上でopenしたままの記述子なら同じ。
というかそうじゃないと全てのIOが出来ない。

720 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:17:52 ]
char array[256];
と宣言したら
sizeof(array);
で256が返ると思います。でも、

void print_arraysize(char *array) {
  printf("%d",sizeof(array));
}

というようにするとポインタのサイズが返ります。
呼び出される関数側から配列のサイズを知る方法はありますか?

721 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:22:46 ]
>>720
Cでは無理です。諦めて、その関数にサイズも渡すしかありません。

722 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 12:21:11 ]
>>720
構造体の中に配列入れて構造体を引数にすれば、関数に配列を渡せる。
ただ、関数を呼ぶときに構造体の中身の全コピーが作られるので、激しく無駄。

配列の要素数を1つ多めに作っておいて、そこに目印となる値を入れておいて、
関数側で数えるという手もある。

けど結局はfunction( array , sizeof(array) )のようにして呼び出す
関数を作るのが一番かと。

723 名前:デフォルトの名無しさん [2008/01/10(木) 13:52:06 ]
自然数n = 10, r = 0, 1, . . . , 10 に対してnCr を出力するプログラムを教えてください。もしくはそれが載ってるサイトを教えてくださいm(__)m

724 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 13:55:15 ]
>>723
C/C++の宿題を片付けます 102代目
pc11.2ch.net/test/read.cgi/tech/1199515728/

725 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:23:44 ]
くだらない質問なのですが
Cで

static int hoge;
int static hoge;

の違いって、前者が大域変数になって
後者が関数内で静的な、値を保持しつづける関数になるってことですか?

726 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:26:52 ]
違う。
staticのような修飾子と型名は順不同というだけ。

727 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:28:17 ]
>static int hoge;
>int static hoge;

その2つは一緒

>前者が大域変数になって
>後者が関数内で静的な

それは宣言する場所で変わる
関数の外で宣言すれば大域
関数の中で宣言すれば関数内のみ



728 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:39:05 ]
関数内でも大域にならない?

729 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:44:34 ]
寿命はそうだがスコープは地が宇部

730 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:49:33 ]
なんで意味合いの違うものに両方staticなんて割り当てたんだろうな。
ファイルローカルはexternに対してinternalとかにすりゃよかったのに。

731 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 20:56:39 ]
C++では無名名前空間で対処したな。

732 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 21:05:53 ]
>>725ですが
ちょいとまだ把握できてないです

void main(){
int hoge[400000];だとアウトで
static int hoge[400000]; だと領域が確保できて

}

教えてくれた人が「static使うと、たくさん取れるよ」と言ってくれたので調べたのですが
どうもそういうことが見当たらなくて「静的な」とか。

上のような使い方は間違ってますか

733 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 21:11:25 ]
それは、static つけないとスタック領域を使うし、
スタック領域は他と比べるとかなり小さいから。

まあ恒久的なプログラムじゃなくて、一時的な使い捨てプログラムのときはそうやることもある。

734 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 21:32:40 ]
つまり、staticつけると
大域変数と同じところのメモリ領域を使うということですか。



735 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 22:02:25 ]
そゆこと

736 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 22:08:02 ]
了解しました!

737 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 02:32:24 ]
>>733
メモリ制限厳しい組込みとかだと普通にやるよ。
まぁでもソコまでだと、外部変数のバッファを使いまわしてチューニングする方が多いかも。
そんなんやりたく無いんだけどね・・・ハードコスト削減には勝てんわ。



738 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:09:17 ]
音声出力のソースを作っています。
以下のソースで、ファイルは出力されるのですが、音声が出てきません。
どこを修正すればよいか教えていただけませんか?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SIZE 22050*5
#define OFFSET 23
int main(int argc,char *argv[])
{
FILE *fp;
short int inbuf[SIZE];
short int outbuf[SIZE];
int i,f,f0,amp,PI;
f = 440;
f0 = 11050;
amp = 5000;
if((fp = fopen("test-sound-16-22.wav", "rb")) == NULL ) {
printf("ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}

739 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:10:09 ]
続き

fread(inbuf, sizeof(short int), SIZE, fp);
fclose(fp);
for (i=OFFSET; i<200; i++)
printf("%d, ",inbuf[i]);
printf("\n");
for (i=0; i<OFFSET; i++)
outbuf[i]=inbuf[i];
for (i=0; i<(SIZE-OFFSET); i++){
outbuf[i+OFFSET] = amp * sin(2*PI*i*(f/f0));
}
for (i=(SIZE-OFFSET); i<SIZE; i++)
outbuf[i]=0;
if((fp = fopen("testfile2.wav", "wb")) == NULL ) {
printf("ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}
fwrite(outbuf, sizeof(short int), SIZE, fp);
fclose(fp);
return 0;
}


740 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:15:12 ]
>>738

音声を出力するところがどこにもないじゃん。


741 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:15:13 ]
出力された音声はどんなふうになってる?
あとsin()の中intになってないか?

742 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:15:43 ]
音声→音声ファイルね

743 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:25:55 ]
>>738
PIの初期化してないじゃん。ちゃんとデバッグしてんの?

744 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:29:16 ]
そーだ、それも書くの忘れてたw

745 名前:738 mailto:sage [2008/01/12(土) 13:29:36 ]
これとほぼ同様のソースで、2倍の周波数(以下のソース)で出力するものは、
きちんと出力されて、音声も出ています。
正弦波の合成はなぜか出来ない・・・

>> 740
音声ファイルを出力するところがないとは?音声ファイルは出力されていますが・・・

>> 741
出力された音声ファイルは何も発音がありません。
ファイルのサイズはきちんとあるので、データは自体は出力されていると思うのですが・・・

for (i=0; i<(SIZE-OFFSET)/2; i++) {
outbuf[i+OFFSET]=inbuf[i*2+OFFSET];
}
for (i=(SIZE-OFFSET)/2; i<SIZE; i++)
outbuf[i]=0;

746 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:29:48 ]
math.hにPIが定義してあるのかとおもったが、そうでもないな

747 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:30:48 ]
とりあえずPIの定義と、sin()の2を2.0にしてみ



748 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:38:51 ]
何も言わずにコピペだとマルチうぜーとか言われそうなもんだけど、ここの住人は優しいんだな

749 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:53:05 ]
>>745
デバッガで変数の値見ながら実行すればすぐに分かりそうなもんだけど。

750 名前:738 mailto:sage [2008/01/12(土) 14:09:29 ]
解決できました。皆さんありがとうございます。

751 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 06:12:14 ]
構造体で
氏名
年齢
住所
が入る変数を宣言しその構造体の配列を10人分用意しループで順番に入力してもらい氏名、住所、年齢に
空ENTERが入るとループを終了するということをしたいのですが。

全ての項目に空ENTERが入力されるとループを終了するという所をどのように書けばいいのかわかりません。
教えて下さい。


752 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 06:37:02 ]
>>751
空ENTERが入力されたかどうか判別するプログラムは作れるのか?

753 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 10:41:06 ]
>>751
氏名をfgets関数で入力し、strlen関数で氏名の文字数を求め、それがゼロだったら終了

754 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:34:26 ]
fgetsってファイル関連の関数じゃないの?
文字入力として使えるの?

755 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:37:19 ]
えー

756 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:43:11 ]
>>754
っ stdin

757 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:34:55 ]
printf()とかputs()とかscanf()とか全部廃止して、f****()に統一すりゃいいのに。
ストリームの概念が理解しやすくなる。



758 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:48:56 ]
f***()とか全部廃止してopen/close/read/writeにすれば良いのに。
ディスクリプタの概念が理解しやすくなる。

759 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:54:48 ]
もう開く/閉じる/書く/読むでいいよ。

760 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:56:07 ]
それなんてinterface?

761 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 14:14:31 ]
LISP だと以下のようにして定義できるが

(defun 開く (file-name mode &optional perm) ...)
(defun 閉じる (file-desc) ...)
(defun 書く (file-desc buff buff-size) ...)
(defun 読む (file-desc buff buff-size) ...)

まぁ, スレ違いだわな


762 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:50:32 ]
スレ違いに値しますが、どなたかtabキー送り幅の設定方法を教えて下さい
8マスから4マスに変えたいです

763 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:51:57 ]
>>762
環境による。また、アプリケーションの設定にもよる。

764 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:52:18 ]
スレ違いすぎるwww
エディタによる、いやそもそもエディタの話なのかも知らんが

765 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:52:22 ]
それは表示する側の問題だろ。Cの範疇じゃ無理。
使ってるOSと端末くらい書け。

766 名前:デフォルトの名無しさん [2008/01/14(月) 00:21:01 ]
教えてください


int main(void)
{

char *c1;

{
char *c2;

c1 = StoA(1000);
c2 = StoA(2000);

printf("c1 : %d\n", c1);
printf("c2 : %d\n", c2);

}

return 0;

}

このプログラムを実行すると、 なぜかc1の値がc2の値と同じになってしまします。

なぜなのか教えてください。

767 名前:デフォルトの名無しさん [2008/01/14(月) 00:22:24 ]
***追記***

ちなみにStoA関数は数値を文字列に変換する関数です。



768 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:22:35 ]
StoAって何だよ

769 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:23:33 ]
StoAの中身書いてないわろた

770 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:24:04 ]
どうみてもStoAが悪いだろw

771 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:35:00 ]
どうみてもStoAが悪い。
あと
>printf("c1 : %d\n", c1);
>printf("c2 : %d\n", c2);
%sちゃうのか?

で、同じ数値になるってところからサイコメトリーすると、
グローバル変数かローカル変数辺りの配列のポインタを返してると見た。
コール時にバッファ渡すか、StoAでmallocしてmainでfreeするかしたまい。
StoAを作るのが目的でないならsprintfかitoaでも使え。(個人的にはsprintf)

最後に、C言語で数値を文字列に変換する関数は「ItoA」か「ItoS」な。
StoAだと何してんだか訳分からん。

772 名前:デフォルトの名無しさん [2008/01/14(月) 00:42:07 ]
すんません%sでした"汗

StoAはshort型からアスキーコードに変換する関数です。

int main(void)
{
char *c;
c = StoA(123);
printf("%s\n", c);

return 0;
}

だと正常に動きます。


773 名前:デフォルトの名無しさん [2008/01/14(月) 00:44:08 ]
mainの中にあたらしいブロックを作ってその中で*c1をつかうのがなんかしらダメなんじゃないかなと思うんですが。

作るのが目的ではなくてなぜこうなるのか説明するのが目的なのでよろしくおねがいします。

774 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:45:06 ]
いいからStoAの内容書けよ

775 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:46:24 ]
>>772
んなこた良いからさっさとStoAのソースを貼れwww

776 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:48:09 ]
StoAのソースコードは守秘義務の関係上公の場に貼ることは出来ません。
無茶な要求をしないでください。もう少し常識をわきまえて。

777 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:48:59 ]
じゃあ分かりません帰ってください



778 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:49:16 ]
説明するのが目的なのか、説明してもらうのが目的なのかはっきりして欲しいな

779 名前:デフォルトの名無しさん [2008/01/14(月) 00:51:35 ]
>>776
その通りです。

ありがとうございます。

>>778

説明するのが目的なので分かりやすく説明してもらえると光栄です。

780 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:55:23 ]
とりあえず、StoAのソースを貼る気がないのなら終了で。

781 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:56:15 ]
>>779
c1 = StoA(1000);
c2 = StoA(2000);
printf("c1 : %s\n", c1);
printf("c2 : %s\n", c2);

↑で同じ値が出るんだろ?多分両方2000か?
c1 = StoA(1000);
printf("c1 : %s\n", c1);
c2 = StoA(2000);
printf("c2 : %s\n", c2);
これで同じになるか試してみ。
違う値になるようなら、多分StoAがstatic変数かグローバル変数のバッファ使ってる。
printf("%p, %p\n", c1, c2);
で同じ値が出てくるはず。

そうじゃなきゃ、自分でデバッグしてくれ。
ソース無しじゃお手上げ。


782 名前:デフォルトの名無しさん [2008/01/14(月) 01:14:31 ]
正直いいますと今手元にソースが無いのでかけませんが、覚えてる範囲で流れを書きます。

処理@
引数の桁数を調べる
(引数が12345ならiDigに10000を入れておく)

処理A
pStrにcStrのアドレスを入れて
数値を文字コードに変換して*pStrに格納。

処理B結果をかえす。

ちなみにcStrはstatic変数です。

わかりにくくてすいません"汗






783 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:16:48 ]
StoAがわかったら説明してやんよ

784 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:18:02 ]
そら二回目の呼び出しで cStr の内容を上書きしてるから
同じのが表示されるの当たり前でんがな。

バッファをローカルで持って、引数で渡すといいよ。

785 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:36:21 ]
ある時間,たとえば10時20分50秒になったらAの動作を行うというプログラムはどう作れば良いですか

ひとつの方法としてtimeを使って,現在の時間を取得し続け時間になれば動作する方法
これだとずっと時間を取得し続けるので,良くないような気がするので・・・

ちなみに環境はFedora,gccです.

786 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:39:22 ]
cron に投げれば

787 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:43:59 ]
sleep(指定時間-現在の時刻)
すりゃいいだろ。
ま、ふつーにcron使えと。



788 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:47:34 ]
本人の振りしてあおるのもうやめろよwwwみんな耐性ついてるんだしwwwww

789 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:48:44 ]
>>786
ありがとうございます.ちょっと調べましたがcronは使えそうです.
あとは,外部から動作する時間の変更が行われるので,それが出来るか調べて見ます.

自分のプログラムだけで実現できると一番良いですが・・・

790 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:51:44 ]
sleepの方法も考えましたが,時間の変更を行うことがあるので実現しにくいと思いやめました
やはりcronを使わないとしたらこの2つですかね

791 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:02:11 ]
コンソールアプリケーションの画面を何も表示されていない真っ黒の画面に
戻したいんですが方法を教えてください。

792 名前:785 mailto:sage [2008/01/14(月) 02:04:17 ]
cron調べましたが使えそうです
ありがとうございました

793 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:04:31 ]
OSに依存する

794 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:36:42 ]
>>791
winだったら、system("CLS");

795 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:38:30 ]
>>791
win以外ではエスケープシーケンスとか

796 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 04:25:03 ]
clearコマンドが使える場合もあるけど、鼬害。

797 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:50:14 ]
sysytem("cls")だとちらつきがひどいんですが
ちらつかないようにって可能なんでしょうか。
もし可能であるならばどうやればいいのでしょうか。



798 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:53:06 ]
ちらつきって

コンソールでゲームでもつくってんのか?


799 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:55:58 ]
エスケープシーケンスなりCursesなりコンソールAPIなり好きなの使っとけ
細かい制御が必要なら環境かけっつうの

800 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:56:23 ]
毎回書き換えが必要な所のみ書き換えるか
全画面を一度に書き換えるか。

どちらにしろ標準関数だけじゃ辛いので、
こういった関数を使うしかない。
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpfileio/html/Toppage_Console.asp

801 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:26:59 ]
ちょっとしたゲームをつくっています。
環境はWinです。

同じ文字列が右から左に移動していき左端にきた文字は消えていくというのをしてるのですが
おもったようにちらつきを消すことができまちぇん。。

802 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:40:12 ]
>>801
消さずに上書き。
変化の無い部分は書き換えない。


803 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:48:49 ]
う、うわがき・・・
上書きってどう書けばいいのかわかりません。。。。
ちょっとした例示してもらえませんか?

804 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:49:56 ]
消したい文字列と同じ座標にスペースか何かで上書きするとか

805 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:58:06 ]
// >>801
#include <stdio.h>
#include <string.h>

void func(int width, const char * str)
{
int len = strlen(str);
for (int ic = 0; ic <= len; ++ic) {
printf("\r%*.*s", width, ic, str);
fflush(stdout);
sleep(1);
}
for (int ic = 0; ic < width; ++ic) {
printf("\r%*s%*s", width - 1 - ic,
ic < width - len ? str : str + ic + 1 - width + len,
ic + 1, "");
fflush(stdout);
sleep(1);
}
}

int main()
{
func(20, "abcde");
return 0;
}

806 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:41:05 ]
int main(int argc, char **argv){
FILE *fp;
int i, j, a, b;
short int image[HEIFGT][WIDTH];
上のプログラムを一行ずつ何をしてるんですか?

a = atoi(*argv[1]);
b = atoi(*argv[2]);

807 名前:806 mailto:sage [2008/01/14(月) 12:42:21 ]
あと下の
a = atoi(*argv[1]);
b = atoi(*argv[2]);
も教えてください



808 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:49:27 ]
Windowsでもcurses使えるんだっけか?

809 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:54:39 ]
>>808
移植はされてると思う。

810 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:56:27 ]
>>807
プログラムの起動時に渡されたコマンドラインの引数を、数値に変換してるんだけど、それだとバグっていて動かないね。

811 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 14:19:43 ]
806の日本語がバグっとる

812 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:12:11 ]
変換前:This
変換後:hisTay
変換前:is
変換後:siay
以下のコードで上のように出力して欲しいのですが上手くいきません
何故でしょうか?

int main() {
int i;
char s[256] = "This is a pen", *word;
word = strtok(s, " ");
printLatinWord(word);
word = strtok(NULL, " ");
// wordに"ay"が入る。何で?
printLatinWord(word);
return 0;
}

void printLatinWord(char *word) {
char *alp;
/*
通俗ラテン語風に変換して出力
※先頭の文字を末尾に移し、その後ろにayを付加する。
*/
printf("変換前 : %s\n", word);
strncpy(alp, word, 1);
alp[1] = '\0';
strcat(word, alp);
strcat(word, "ay");
printf("変換後 : %s\n", &word[1]);\
}

813 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:29:28 ]
>>812
char *alp;
ポインタにぶちこむな
char alp[1000];
的な感じにしないと

814 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:32:59 ]
>>812
strtokは、与えた文字列(この場合s)の中を書き換えながら、そこを指すポインタを直接返す。
たとえば、"This is a pen" を与えると、strtokは最初
"This\0is a pen"
 ↑
ここを返す。文字列は\0で終わる決まりなので、"This"が得られる。2回目は
"This\0is\0a pen"
         ↑
ここを返す。"is"が得られる。3回目は
"This\0is\0a\0pen"
              ↑
            ここを返す。"a"が得られる。
こういう動作なので、帰ってきた文字列に直接strcatで追加すると、
後ろの文字列(=次に返される文字列)が書き換わってしまう。
つまり、そのprintLatinWordを実行すると、sの中は
"ThisTay\0a pen"
のように書き換わり、次にstrtokが返すはずだった "is" は "ay" になってしまう。

815 名前:812 mailto:sage [2008/01/14(月) 16:42:27 ]
>>813
なんとなく*alpになってしまいました
まだ違いが良く分かってないので頑張って勉強します

>>814
wordを書き換えるとsも変わってしまうんですね。なるほど
丁寧にどうもです
*wordをword[256]に、word = strtok(s, " ");をstrcpy(word, strtok(s, " "))に直して上手くいきました

816 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:55:04 ]
大学の課題で一部分からない点があるので、よろしければヒントをお願いします。

#include<stdio.h>
#define MAX 10

int inputnum(int num[]){
int i;
for(i=0;i<MAX;i++){
scanf("%d",num[i]);
}
return num[];
}

int main (void){・・・・・・と続くのですが、
上記のサブ?ルーチンに表記の間違いがある場合、修正せよという問題です。
ですが配列の返し方など全て自習ということでここで止まってます…。
構文にエラーがあるというところまで分かっているのですが、
どうすえればいいか分かりません。ご教授願います。 orz

817 名前:816 mailto:sage [2008/01/14(月) 16:56:30 ]
For文が見にくくなってしまいすいません…。
よろしくお願いします。



818 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:59:05 ]
void inputnum(int num[]) {
int i;
for(i=0; i<MAX; i++) scanf("%d", num + i);
}


819 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:00:36 ]
>>816
return 0;とでもしておけ
返さなくても渡された中身は書き換わってる
なんでかはポインタについて勉強せんと・・

820 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:06:48 ]
scanf("%d", &num[i]);
もでした

821 名前:816 mailto:sage [2008/01/14(月) 17:17:55 ]
>>818,>>820
丁寧にありがとうございます。

>>819
ということは>>818の通りvoid宣言でいいのですね…。
後でじっくり調べてみます。ありがとうございます。

822 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:21:48 ]
int inputnum(int num[], size_t num_size)
{
    int i;
    for(i=0; i<num_size; i++)
        if(scanf("%d", &num[i]) != 1)
            return 0;
    return 1;
}


823 名前:816 mailto:sage [2008/01/14(月) 17:58:20 ]
>>822
すみません、「size_t num_size」とは何でしょうか?
また戻り値がどこの変数へ戻るのか分かりません…。


また1つ分からない事があるのでどなたかご教授お願いします orz
サイズを指定せずに配列を作る事は可能でしょうか?
int num[];
//これでは要素が無いためサイズが0であるのでできないということまで
分かりましたがそれ以上で詰まっています。
よろしくお願いします。

824 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:04:39 ]
>>823
size_tは型。たぶんunsigned intと同じである環境が多いのかな?
要は自然数用型とか思っとけばとりあえずOK。(サイズにマイナスはないからね)
戻り値がどこに入るかは呼び出し側次第。

int func( void )という関数があったとして
main内で「int a = func( );」 としてればfunc内の戻り値がa内に入る。

825 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:06:53 ]
>>823
サイズを指定しない配列は無理

malloc系を使えば好きな大きさで確保したり、大きさ変えたりはできるけど

826 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:08:05 ]
char s[] = "もけあ";
とかはできるけどそれは宣言のときだけね

827 名前:816 mailto:sage [2008/01/14(月) 18:32:46 ]
>>824
詳しくありがとうございます。
int inputnum(int num[], size_t num_size)
メインルーチンの方で上の2つの変数の値を指定すればいいということですね。

>>825-826
明確にありがとうございます。
入力する回数を予め決めるか、
要素次第ということですね。大変参考になりました。

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



828 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:59:16 ]
int func(int num){

return !(num%2);

}

上記の関数でnumが奇数の場合と偶数の場合の戻り値はそれぞれどうなりますか?
有識者の方宜しくお願いします。

829 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:59:55 ]
タメセカス

830 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:06:49 ]
算数じゃん。

831 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:07:11 ]
>>828
何がわからんのだ?%演算子か?!演算子か?
関数や戻り値がわかってるのならどっちかだろうな。
num = 2;
num % 2 == 0;
!0 == 1

num = 1;
num % 2 == 1;
!1 == 0;
こんなもんでわかるだろ。
ってか>>829で良かったかな。

832 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:08:07 ]
自己顕示欲・・・

833 名前:816 mailto:sage [2008/01/14(月) 21:14:46 ]
すみません。また1つ疑問ができてしまいましたのでご教授お願いします… orz

配列inputのサイズ変数MAXをサブルーチンで決定したいのですが、

int MAX;
void sub(int MAX){
  scanf("%d",&MAX);
}

int main(void){
  input[MAX];



}

とした時に、「sub(MAX);」をどこで定義すればいいのでしょうか?
それともルーチンではできないでしょうか?
よろしくお願いします orz

834 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:18:07 ]
(^ん^)?

835 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:18:29 ]
とりあえずC言語における「定義」の意味を調べなおした方が

836 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:19:26 ]
日本語でおk

MAXの値はどこでも変えられるけど?
MAX = 4;とか好きにすれば?
それとも配列のサイズ変えたいの?

837 名前:816 mailto:sage [2008/01/14(月) 21:19:52 ]
>>833訂正です、すみません。

void sub(int MAX){
  scanf("%d",&MAX);
}

int main(void){
  int MAX, input[MAX];



}



838 名前:816 mailto:sage [2008/01/14(月) 21:22:24 ]
>>835
すみません、定義ではなく呼び出しでした。ご指摘ありがとうございます。

>>836
サイズを入力で指定したいのですが、そのプログラムはサブルーチンで記すことが条件です。

839 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:25:06 ]
>>833
若干エスパー。
丸写しはどーかと思うけど、こういうことか?
void sub(int *MAX){
  scanf("%d",&MAX);
}

int main(void){
  int MAX;
  int *input;
sub(&MAX);
  /* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */
  input = malloc(MAX * sizeof(int));



  free(input);
}


840 名前:816 mailto:sage [2008/01/14(月) 21:37:44 ]
>>839
ご回答ありがとうございます。
分かりづらくなってしまい申し訳ございません。

int MAX = 10;
int main(void){
  int main[MAX];




このように、最初から数値を指定するのではなく、
MAXの値をscanf等の入力で毎回変更することはできませんか?
またできる場合、それをサブルーチンでまとめられますか?


イメージはこんな感じになります。
scanf("%d",&MAX);
int input[MAX];

何度もすみませんがよろしくお願いします。

841 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:53:30 ]
>>840
一応そのイメージで839を書いたんだけど・・・。
要はmallocを使いたくない(or知らないので分からない)ってこと?

どうしても配列ってことであれば、おそらく分からないだろうけど
C89ならムリ。C99なら出来る。
つまりコンパイラによる。
例えば俺が知ってるうちではVCでは出来ない。gccは最近のであれば出来る。

842 名前:816 mailto:sage [2008/01/14(月) 21:53:33 ]
>>839
/* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */
すみませんようやく意味が分かりました。
本当に詳しくありがとうございました。

843 名前:816 mailto:sage [2008/01/14(月) 22:01:13 ]
>>841
#include <stdlib.h>とセットでちらっとだけ見た事があるので
調べて分かれば使えると思いますが、分からないということでお願いします。

別のプログラムで指定した値をファイルに出力し、当プログラムで読み込むというような方法はあるのでしょうか?

844 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:08:52 ]
>>843
とりあえずfopen辺りでファイルの入出力ができるよ(他にもあるけど)
それも分からないの?

845 名前:816 mailto:sage [2008/01/14(月) 22:17:29 ]
>>844
そこは以前にある程度習っているので復習すればできると思います。
ありがとうございます。

846 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:18:52 ]
>>843
>調べて分かれば使えると思いますが、分からないということでお願いします。
お願いされてもwww
とりあえず十分に大きい固定サイズの配列を用意するか、
mallocを調べるのが良いと思うよ。

847 名前:816 mailto:sage [2008/01/14(月) 22:34:59 ]
>>846
>お願いw
すみません余計でした^^;

>固定サイズ
とても参考になりました。
0〜固定サイズまでで値を指定することならできそうです。
ありがとうございました。

時間があればmallocを扱えるようにしたいと思います。



848 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 16:44:03 ]
質問。
ハッシュ法について勉強してるんだけど、格納されたデータ(学籍番号と氏名)を読み取る際に、学籍番号の数(生徒数)を読み取る部分的なプログラムが分かりません。
どういう構文使えばいいでしょうか?
読み込みはこんな感じです↓
/* データファイルの読み込み */
if ((fp=fopen("DATA","r"))==NULL){
printf("File \'DATA\' is not found !\n");
}


while ( fscanf(fp, "%d %s", &data_zipcode, data_address) > 0 ) {
printf("%d : %s\n", data_zipcode, data_address);
/* データの格納 */
if ( StoreData(data_zipcode, data_address) == 0 ) {
printf("Hash Table is full !\n");

}
}
fclose(fp);

849 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 17:05:19 ]
>>848
ファイル内のデータの総数を知りたいなら、一回空読みすればよかろ。
つーか、それってハッシュ法と関連するのか?

850 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 17:50:05 ]
>>849
ハッシュするための下準備。んで、出来ました。ありがとうございました。

851 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:06:23 ]
if ((fp=fopen("DATA","r"))==NULL){
printf("File \'DATA\' is not found !\n");
}

いっつも思うんだけどさ、これって何したいの?

ファイルオープン失敗したまま処理続けるなよ

852 名前:N [2008/01/15(火) 20:07:27 ]
ナップザック問題を解説付きで教えてください。

853 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:17:11 ]
>>851
その箇所だけならなんとも言えんだろーがw

854 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:25:42 ]
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE 128

int main(void);

int main(void)
{
char buf[MAX_LINE];
int n;

printf("降水確率を入力してください。\n");
gets(buf);
n = atoi(buf);
ptintf("降水確率は %d %% です。\n", n);
if (n >= 50){
printf("傘を忘れずにね。\n");
}
else {
printf("傘はいりません。\n");
}
printf("いってらっしゃい。\n");

return(0);
}

/*これ↑のどこが悪いのか教えてください*/

855 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:31:57 ]
gets(),ptintf,return(0);

856 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:47:31 ]
ていうかなんでmain関数にもプロトタイプ宣言してんの?

857 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:01:51 ]
>>852
ググった方が早いと思うよ。
検索ワードはナップザック・ナップサック・動的計画法とかで
アプレット使った図解解説ページがあったと思う。
C言語の質問というよりアルゴリズム全般、数学の方が分野としては近いと思う。



858 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:39:47 ]
mainクソワロタwwwwwwwwwwwwwwww

859 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 01:21:59 ]
>>854
>/*これ↑のどこが悪いのか教えてください*/
降水確率が40%でも傘を持たせない根性。

860 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 07:03:52 ]
グレゴリウス暦の定義を利用して入力された日は何曜日か計算するにはどうしたらいいでしょうか?


861 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 07:28:06 ]
>>860
つ[time.h]

862 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 07:31:21 ]
>>860
ツェラーの公式

863 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 08:29:24 ]
>>860
適当な起算日からの日数を計算して7で割ったあまりを得よ。

864 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 16:44:51 ]
typedef struct{
int data[100];
} test;

int func(const test *x);

int main{
test data;
... //省略
for(i=0; i<10000; ++i){
int temp;
temp = ...; //省略。dataの要素を使ったなんかやたら複雑な計算
func(&data);
printf("%d", temp);
}
return 0;
}

ちゃんとしたコンパイラなら、
funcの引数がconstポインタだからループ中でdataの値は変更されない、と解釈して
毎回やたら複雑な計算をするようなことはしないように最適化してくれますよね?

865 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 16:48:20 ]
ちゃんとしたコンパイラがあればね。

866 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 16:57:04 ]
ないんですか?
たとえばVCとかgccではどうですか。

867 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:03:13 ]
自分で確かめろ



868 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:18:47 ]
いやgccもVCも持っていなくて……
アセンブラも読めないし

869 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:21:57 ]
なら入手して確かめればいいじゃん。

870 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:22:36 ]
constなんかキャストすればいくらでも外せるからな・・・最適化してしまうわけにはいかんような気がする

871 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:42:48 ]
>>864
そんな保証はどこにも無いから素直にループの外に出しておけ。
自分の為だけなら好きにすりゃいいけど、他人が読むなら言いようの無い不安感
(このコードを書いた奴はまともな人間知性を持っているのか・・・他にも問題ありそうだな・・・)
を煽るだけだからやめておけ。

872 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:47:40 ]
ループの中で毎回計算しないものを、ループに入れる神経がわからない。

873 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:59:29 ]
>(このコードを書いた奴はまともな人間知性を持っているのか・・・他にも問題ありそうだな・・・)
あるあるw

874 名前:864 mailto:sage [2008/01/16(水) 20:11:05 ]
要するに最適化してくれないということですね? ありがとうございます。

それと、「const*って最適化に使われているのかな」という疑問が唐突に湧いてきたので質問したものでして、
別にこのコードを実際に使うわけでもないのでいろいろとご安心ください。

875 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:16:37 ]
一度計算した結果はまた同じになることが保証されてるのは関数型言語だけだからな。
Cは最悪裏でサブスレッドがなんかやってるかもしれないし最適化には限界がある。

876 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:25:22 ]
>>874
const*自体は最適化のヒントに使われているよ。
ただ、>864のケースでは使ってないと思うけど。

877 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:43:46 ]
>>864
その最適化はまともなのか?




878 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:48:22 ]
txtファイルの中にある100を探し出してカウントするプログラムを書かないといけないのですが
100を見つけるたびに一つカウントしていくプログラムを組む場合どのような事をすればいいのでしょうか

879 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:50:14 ]
char *sの中から100を検索するコードを書け
それを一行に複数あっても見つかるように拡張しろ
それを複数行に対応させろ
いじょ

880 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:57:56 ]
十分に大きな配列を用意
txtファイルを読み込む
strstrでNULLがでるまで検索
検索した回数を数えればおk

881 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 02:20:28 ]
ありがとうございます
やってみます

882 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 04:31:11 ]
でかい配列なんてイヤだっていうならこんな方法もある。

char buf[4] = {0};
int ch, cnt = 0;

while((ch=fgetc(fp)) {
buf[0] = buf[1];
buf[1] = buf[2];
buf[2] = ch;
if(atoi(buf)==100) cnt++;
}


883 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 04:31:54 ]
while((ch=fgetc(fp))!=EOF)だった。

884 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 06:32:40 ]
>>882
っ 1000

885 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 06:52:16 ]
>>884
ばーかwww

886 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 07:47:18 ]
>>884
具体的に説明していただけませんか?

887 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 08:15:05 ]
>>884
僕には「100」が含まれているように見えますが・・・?



888 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 08:38:06 ]
buf[3]が常に'\0'であることに気付いてないのでしょう。

889 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:27:15 ]
int filename;

scanf("%d",&filename);
fopen("filename.txt","w");

キーボードから任意のファイル名でファイル作りたいんだけど
うまくいかないです。お願いします。

890 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:28:41 ]
char filename[32];

scanf("%s", filename);
fopen(filename, "w");

891 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:31:00 ]
>>890
どうもです
intじゃダメか…

892 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 16:44:02 ]
なぜintでいけると思ったんだよw

893 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 16:45:39 ]
int fileNo;
scanf("%d", & fileNo);
char fileName[100];
sprintf(fileName, "file-%d.txt", fileNo);

894 名前:884 mailto:sage [2008/01/17(木) 18:43:09 ]
これがフルボッコというものかwww

エスパー解釈して数値が並んでいるテキストから
特定の数値の個数をカウントするんだと思ったんだが違うのか?

>>878
テキストに含まれる "100" という文字列の数を数えたかったの?

895 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:46:50 ]
仮に>>878の真意が数値のうちから100を数えたかったとしても、
>>878だけしか書かれていない以上、>>882は十分な答えになってるだろ。

896 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:48:42 ]
っていうかそんな問題ならfscanf()で数値を読めばいいだけで悩むこともないと思うが。

897 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:06:17 ]
除算法を使ったハッシュ関数ってどうすればいいの?
一文字読み込むごとに割って余りを出してその余りを足していけばいいのかな?
で最後まで読み込み終わったらまた割って余りを出すという感じか?
全く見当違いのことを書いていたらすまん。



898 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:12:51 ]
>>897
ん?
ハッシング(Hashing)↓
www.u-gakugei.ac.jp/~miyadera/LECTURE/algo2/5-3.html

899 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:20:25 ]
>>898
それだ。
文章を読み込ませてハッシュ値を出したいんだが、>>897のような感じでいいのかな?

900 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:29:46 ]
精度を気にしないならそれでいい

901 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:35:26 ]
ありがとう。
一応考え方は間違っていないようで安心した。

902 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:26:26 ]
>>861-863
ありがとうございます
とりあえず前年度までの総日数と現在の総日数を出せたたのですが
そこからどうしたらいいのでしょうか?
for文とか使うんですか?

903 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:42:19 ]
>>902
ツェラーの公式

904 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:50:47 ]
1月と2月の計算に注意な

905 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 10:43:47 ]
まず基準となる日の曜日がわかってないとだめだよw

906 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 10:50:23 ]
だからそんなことしなくてもmktime()で教えてもらえばいいだろ。

907 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:18:52 ]
それで最初の質問の用件、「グレゴリウス暦の定義を利用」したことになるのか?



908 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:38:56 ]
>>902
1582年10月15日が金曜日だから、そこからの日数を7で割れば何曜日かわかるでしょ。

909 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:46:01 ]
>>907
Cの標準関数がグレゴリウス暦の定義を利用していないとでも?

910 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:52:28 ]
>>909
たとえそうでも、元の質問者の意図通りじゃないだろう

911 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 11:53:53 ]
標準関数は1970年以降しか扱えない時点で
グレゴリウス暦の定義を利用しているともしていないともいえない。

912 名前:902 mailto:sage [2008/01/18(金) 20:21:50 ]
とりあえずこんな感じの問題です
西暦1年1月は月曜日
1年は通常365日、閏年は366日
4で割り切れる年は閏年
400で割り切れる年は閏年
100で割り切れる年は閏年ではない

変数名関数名を作成
goto文は使用しない
関数途中でのreturnプログラム途中のexitはしない
外部関数は使用しない

913 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 20:29:48 ]
>西暦1年1月は月曜日
意味不明。

914 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 20:29:51 ]
>>912
丸投げするならこちらへどうぞ
C/C++の宿題を片付けます 101
pc11.2ch.net/test/read.cgi/tech/1197132472/
これは現行スレじゃないがな

915 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 00:09:54 ]
西暦1年とかまで考えようとしたら、
途中暦を正すために何日かすっとばしたのも考慮に入れるのけ?

916 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 01:14:29 ]
>>913
そうなんですか?
問題にはそう書いてあるのですが・・・
>>914
ありがとうございます
そっちでやってみます


917 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 17:16:00 ]
質問させていただきます。
ttp://www.geekpage.jp/programming/linux-network/multicast-2.php
このページで紹介されている様なUDP受信プログラムから、
受信したパケットの送信元IPアドレス(192…)を調べるにはどうすればよいでしょうか?



918 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 17:21:22 ]
>>917
recvfrom
pc11.2ch.net/test/read.cgi/tech/1186418855/

919 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 18:11:04 ]
>>918
おかげさまで解決できました。どうもありがとうございました。

920 名前:デフォルトの名無しさん [2008/01/20(日) 18:03:14 ]
C#厨です。C始めました。

#define A 1
#define B 2

int main(){
int i = A + B;
int j = A + B;
int hoge[i][j];
}



新規テキスト ドキュメント.c
新規テキスト ドキュメント.c(7) : error C2057: 定数式が必要です。
新規テキスト ドキュメント.c(7) : error C2466: サイズが 0 の配列を割り当てまたは
宣言しようとしました。
新規テキスト ドキュメント.c(7) : error C2057: 定数式が必要です。
新規テキスト ドキュメント.c(7) : error C2466: サイズが 0 の配列を割り当てまたは
宣言しようとしました。
新規テキスト ドキュメント.c(7) : error C2087: 'hoge' : 添字がありません。
新規テキスト ドキュメント.c(7) : error C2133: 'hoge' : サイズが不明です。

です。どうしたらいいでしょうか?

921 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:11:44 ]
C言語は変数を用いて配列の宣言はできひんのよ

922 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:17:43 ]
1. C++コンパイラの力を借りる。
拡張子cppにして、こういう風に書く

const int i = A + B;
const int j = A + B;
int hoge[i][j];

2. プリプロセッサの力を借りる。
#define i (A + B)
#define j (A + B)

本当に実行時まで変数の値がわからない時の話はまた今度。
お前の見ている本やWebサイトを読み進めていれば、その内出てくるだろうし。

923 名前:デフォルトの名無しさん [2008/01/20(日) 18:17:55 ]
>>921
なぬぅ!なんて使えない糞言語!
ユーザーの入力.etcによって必要なだけ配列を確保するにはどしたらいいん?

ポインタはいいとして(C#にもあるし)、プロトタイプ宣言とか、変数の宣言はブロックの先頭とか、
面倒な決まりが多いぜ…orz

924 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:19:04 ]
その例で無理矢理実現するなら。

#define A 1
#define B 2
#define i (A+B)
#define j (A+B)

int main(){
int hoge[i][j];
}

925 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:19:11 ]
>>923
mallocとか使え

926 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:19:52 ]
C++ の std::vector 使った方が

927 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:20:23 ]
まさに高級言語により生まれたゆとり世代。



928 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:20:45 ]
>>926
つ[スレタイ]

929 名前:デフォルトの名無しさん [2008/01/20(日) 18:22:06 ]
>>922
いあ、C#で書いた迷路の生成プログラムを移植してて、
コマンドライン引数で指定した迷路のサイズによって
2次元配列のサイズを変えたいのね。

コンパイラはVC++EEのコマンドライン使ってるのでC++のコードもおkだけど
出来ればCの範囲でやりたいでふ。

930 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:23:10 ]
>>925
麻呂?首ググって来る

931 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:23:12 ]
malloc 一択。
演算子のオーバーロードとかないから、
何かアクセス関数作っとけ。

932 名前:925 mailto:sage [2008/01/20(日) 18:23:14 ]
(´・ω・`)

933 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:25:02 ]
あらかじめ最大サイズを決めておくという手もなくはない。
エレガントではないが。

934 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:27:32 ]
gccで-std=c99使えばいいよ。

後の規格改定で、変数宣言の位置の縛りもなくなったし、
配列の要素数に変数が使えるようにもなった。
が、しかし、需要がなくてVisual C++は対応していない。

935 名前:920 mailto:sage [2008/01/20(日) 18:33:38 ]
www9.plala.or.jp/sgwr-t/lib/malloc.html
この麻呂でいけそう。超thx!
これってフリー忘れるとプログラム終わってもメモリ使えないままなの?
だとしたら怖い。
C#は案セーフじゃなければ何やってもプログラムが落ちるだけだから何でも試せたのに。

>>934
それって、今のANSI?の規格なら出来るけどVCは遅れてる子だから駄目ってこと?
ならVC2階の窓から捨てる。

936 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:36:31 ]
>>935
フリーを忘れないようには
どうするといいかってのを
考えながらくむのも
おもしろいもんだよ

937 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:37:57 ]
>>935
プログラムが終了すればおk
C#のunsafeとほぼ一緒だと思うけど



938 名前:920 mailto:sage [2008/01/20(日) 19:09:27 ]
>>936
{書いたら直ぐに
}書いて、その間にコードを書くみたいに
麻呂したら直ぐにフリーして間にコード書いちゃ駄目?

>>937
よかた。ちゃっちゃいプログラムなら大事にはならなさそうね。

939 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:10:38 ]
いやいやいやいや、
終了すれば大丈夫だからって
放置する癖は付けない方がいいぞ

940 名前:920 mailto:sage [2008/01/20(日) 19:22:43 ]
>>939
それはだいぢょぶ。
ただ、びくびくしながら書いてたら上達しにくい気がするから心配だっただけ。

もひとつ質問していいかな。
int main(){
int hoge[10][10];
hoge[10][10] = 100;

poke(hoge);
return 0;
}

int poke(int *moge){
return *moge[10][10];
}

って平気?一次元だと出来たんだけど。
試してもいいかなぁ?

941 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:06:48 ]
mallocを麻呂って書くヤツはカス。

942 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:17:08 ]
>>935
大丈夫。VC++みたいなのが世の中の多数派。使う人間、誰もいないし。

たとえ解放し忘れても、プログラムが終了すればWindowsが丸ごと解放する。
あと、マネージドなプログラムで何やってもプログラムが落ちるだけというなら、
アンマネージドなCのプログラムだって、
何やってもプログラムが落っこちるだけで済むと言える。
9xのWindowsでもない限り。

943 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:26:32 ]
>>940
そもそもhoge[10][10]の参照はまずくないか

944 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:29:30 ]
mallocってなんて読むの?
えむあろっく かと思ってるんだけど

945 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:31:57 ]
>>944
宗教論争みたいになっちゃうけど人間関係に問題が起きない範囲で好きに読めばいいと思う。
俺は普段はまろっくって読んでる

946 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:40:08 ]
ネイティブはマロックって言うらしい
ソースは俺

947 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:40:51 ]
まろっくって読んでるけど個人でやってるから口に出した事ないな
プログラマだと口に出して言うことあるのか?



948 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:43:23 ]
動的確保!って叫んでる

949 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:43:26 ]
普段はC++だから口に出して言ったことは無いな

950 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:46:54 ]
【char】変な読み方するな その2【ちゃー】
pc11.2ch.net/test/read.cgi/prog/1177251487/

マジレスするとカタカナ表記でGoogle検索して多い方を使っておけばノープロブレム。

951 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:48:41 ]
ちゃーだと最近のクソ芸人のギャグまでひっかかる

952 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:45:34 ]
>>940
平気じゃない。
2次元配列を1次元配列にマップしたときのインデックスを計算汁。

953 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:50:46 ]
int hoge[10][10];

配列の最後は
hoge[9][9];
よってオタワ

954 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:53:56 ]
int poke(int (*moge)[10]){
return moge[9][9];
}

こういうのならいいんでしょうか・・?

955 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:08:57 ]
int poke(int moge[][]){
}
って感じにできなかったっけか?

956 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:10:32 ]
>>955
それはない

957 名前:920 [2008/01/20(日) 23:16:34 ]
>>952
でけた。THX
でも、こんなの読めないよ…。
hoge[2番目の長さ * 1番目の添え字 + 2番目の添え字]

hoge[1番目の添え字][2番目の添え字]
と同じだなんて気付きようがないぬ
もっと可読性が高い書き方はないかにょ…。



958 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:24:05 ]
>>955
最低でも int poke(int moge[][N]) の N が必要


959 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:36:12 ]
>>957
関数にすればいいじゃん

960 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:41:59 ]
>>957
>>954
の方法は?

961 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:45:25 ]
>>960
2番目の長さが固定になるだろ・・・

962 名前:デフォルトの名無しさん [2008/01/21(月) 00:49:55 ]
Cプログラマ必須テキストです!

mori.eco.to/

963 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:21:37 ]
マルチ乙としかいいようがないな

964 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:23:42 ]
ざっと見てみたけど自意識過剰サイトでわろた
しかもテキストごときに8000円とか誰もひっかからんだろwww

965 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:40:05 ]
在学中に情報系の国家試験である、基本情報処理技術者、ソフトウエア開発を取得

極普通じゃねーかwwwww

966 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:45:21 ]
ばかじゃねーの
8800円あったら専門書買うわーバーカ

967 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:05:24 ]
構造体の初期化で教えてください。

(1)
struct Type x = {.var = NULL};

(2)
struct Type *x;
x = (struct Type *) malloc(sizeof(struct Type));
x->var = NULL;

(3)
struct Type *x;
x->var = NULL;

とあって、(1), (2) だと問題ないのですが、
(3) だと segmentation fault になってしまいます。
どういう理屈からでしょうか?


また、構造体を 「*変数名」で宣言したときは、最初に値を設定するときに、
必ず malloc をしてからでないといけないのでしょうか?

よろしくお願いします。



968 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:07:49 ]
ポインタってのはどこかの実態をポイントしてなきゃアクセスできるわけがねぇ

969 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:08:12 ]
xはその構造体の型へのポインタだから

970 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:10:05 ]
>>967
ポインタがなんなのかまったく理解できてない

struct Type *x;
で用意されるのは構造体struct Type がどこにあるかを表す変数だけ
構造体の本体はない
mallocでそれを用意してやってる

971 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:26:02 ]
long と long int は何が違うんでしょうか

972 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:33:25 ]
いっしょです

973 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:33:43 ]
タイプ数

974 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:20:07 ]
音声を出力するにはどうすればいいのかな?

975 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:20:44 ]
環境書け

976 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:31:16 ]
センサーがあるのでそれで感知をした時に
音声を出力するプログラムを作るにはどうすればいいですか?

977 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:34:52 ]
センサーの入力を監視する部分と、音声を出力する部分を作ればいける



978 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:36:40 ]
音声の出力する部分を作るには
どうすればどのようなプログラミングを作ればいいですか?

979 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 10:40:22 ]
Cの標準機能じゃ無理だからOSとかコンパイラとかを書かないと答えようがない

980 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:33:40 ]
>>978
putchar('\a');

981 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:44:54 ]
>>978
「プログラミング」は作れません。

982 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:54:47 ]
>>978
音声合成とか勉強すれば...

983 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:56:35 ]
センサーって、組み込み?
それなら、周辺回路によるけどどこかのポートをパタパタ。


984 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 19:47:42 ]
>>978
window.hをインクルードしてBeep関数使えば鳴らせるよ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<237KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef