C言語なら俺に聞け( ..
[2ch|▼Menu]
574:デフォルトの名無しさん
08/01/05 11:27:15
>>573
プロトタイプ宣言のなかった頃という実例を提示してくれ。
宣言がなかったら外部の関数は一切まともに呼べないと思うのだが。

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

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

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

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

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

580:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/05 14:29:42
要素数intを再帰するのはちょっと勇気がいる。「スタックはもう0よ」に気をつけて。

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

583:デフォルトの名無しさん
08/01/05 14:35:36
>>581
そこで最近覚えた末尾再帰の最適化ですよ。

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

585:デフォルトの名無しさん
08/01/05 15:56:01
ソート済み配列なら楽なんだがな

586:576
08/01/05 16:39:31
>>584ので
わかった気がします。
ありがとうございました

587:584
08/01/05 17:50:36
あぁ 577 にもヒントが
見落としていたよorz


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

589:デフォルトの名無しさん
08/01/06 00:48:37
mainから読まないと理解できない俺はorz

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

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

591:554
08/01/06 01:04:01
レス有難う御座いました。
結論としては>>555なのでしょうが。

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

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

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

592:デフォルトの名無しさん
08/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
08/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
08/01/06 04:13:28
あー15行目の
printf("test");
はif文に入ったかどうかチェックする為に書いた物で意味はありません。

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

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

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

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

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

598:デフォルトの名無しさん
08/01/06 04:42:36
ポインタの前に配列を

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

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

600:デフォルトの名無しさん
08/01/06 05:09:17
>>599
URLリンク(www9.plala.or.jp)

601:デフォルトの名無しさん
08/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
08/01/06 05:55:21
眠い目こすりながら"もうちょい・・もうちょい・・"ってやってたら出来ました!
600さん601さんありがとうです。ほぼ601さんの書き込み通りで出来ました。

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

603:デフォルトの名無しさん
08/01/06 10:25:50
>>574

つ URLリンク(homepage3.nifty.com)


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

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

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


604:デフォルトの名無しさん
08/01/06 10:36:54
まだやんの

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

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

607:デフォルトの名無しさん
08/01/06 12:45:03
今でもいきなり呼べるよ

608:603
08/01/06 12:59:23
>>605

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

こうだった。


609:デフォルトの名無しさん
08/01/06 14:23:04
>>608
セミコロン要らないの?

610:603
08/01/06 15:20:15
>>609

もちろん要るorz


611:デフォルトの名無しさん
08/01/06 16:17:55
まだやってたのか。

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

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

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

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


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

614:デフォルトの名無しさん
08/01/06 17:32:58
コール規則が複数あるような場合に嵌るだろ

615:デフォルトの名無しさん
08/01/06 17:47:37
プロトタイプを人間が確認してるようなもんだな

616:デフォルトの名無しさん
08/01/06 19:08:31
>>612
なんか色々とウサンクサイな・・・

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

618:デフォルトの名無しさん
08/01/06 21:04:47
%gってなんすか?教えてくだしあ

619:デフォルトの名無しさん
08/01/06 21:07:50
printfでぐぐれ

620:デフォルトの名無しさん
08/01/06 21:08:20
manコマンドしか見てなかったよ

621:デフォルトの名無しさん
08/01/06 21:09:06
ごめんうそ

622:デフォルトの名無しさん
08/01/06 21:21:22
普通に、man printfしても出てくるでしょうが。

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

624:デフォルトの名無しさん
08/01/06 22:22:41
ますます話が迷走を深めてまいりました

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

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

627:623
08/01/07 00:38:00
>>625
ソースなんてないよ。 実体験。
まだ経験してないのであれば...幸せなのか天才なのか、はたまた...

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

629:デフォルトの名無しさん
08/01/07 01:02:06
>>628
俺も一瞬思ったw

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

630:デフォルトの名無しさん
08/01/07 01:04:46
627と628の言うソースは違うものを指していると思われ。


631:デフォルトの名無しさん
08/01/07 01:06:02
野暮だな

632:デフォルトの名無しさん
08/01/07 03:51:40
そんなことは628もわかってんのにな

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

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

635:デフォルトの名無しさん
08/01/07 18:15:09
条件がはっきりしないけど、0.9足して切捨てとか

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

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

638:デフォルトの名無しさん
08/01/07 19:10:03
は?

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

640:デフォルトの名無しさん
08/01/07 19:32:25
「宿題の回答」としてはベストな回答だと思うよ。

641:デフォルトの名無しさん
08/01/07 19:35:31
アホだろ

642:デフォルトの名無しさん
08/01/07 19:44:31
(n + d) / d;
だめ?

643:デフォルトの名無しさん
08/01/07 19:47:15
だめ

644:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/08 01:07:31
>>645
つ[fscanf()]

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

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

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

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

651:デフォルトの名無しさん
08/01/08 02:24:07
 >>650
 つ URLリンク(www9.plala.or.jp)
ファイルの終端でない間ループする
0 != feof(fp)

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

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

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

655:デフォルトの名無しさん
08/01/08 05:02:29
>>653
ほとんど使わないのかよ!

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

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

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

657:デフォルトの名無しさん
08/01/08 08:03:25
>>651
0 == feof(fp)

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

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

660:デフォルトの名無しさん
08/01/08 13:18:16
>>658
どこでどんな4バイトが無駄になるんですか?

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

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

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

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

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

665:デフォルトの名無しさん
08/01/08 14:07:58
エウレカ!エウレカ!

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

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

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

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

669:デフォルトの名無しさん
08/01/08 15:39:06
sizeof(foo)/sizeof(*foo)

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

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

672:デフォルトの名無しさん
08/01/08 16:12:32
>>669 ちょっとダサイけど、thx!

673:デフォルトの名無しさん
08/01/08 16:16:36
>>671
getsはない。

674:デフォルトの名無しさん
08/01/08 16:19:02
んだ。今度はバッファオーバーフローだな。

675:デフォルトの名無しさん
08/01/08 16:20:31
scanfでも桁数制限できるだろ

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

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

677:デフォルトの名無しさん
08/01/08 16:32:53
ごめん
feofの返り値が0の間

678:デフォルトの名無しさん
08/01/08 16:38:00
>>671
果てしなく無意味なオーバーフロー対策だなwwwwwwwww

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

680:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/08 16:57:05
なんだべきって

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

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

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

684:デフォルトの名無しさん
08/01/08 17:10:17
681は日本語を勉強するべきだろう。

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

686:デフォルトの名無しさん
08/01/08 17:50:06
人間関係

687:デフォルトの名無しさん
08/01/08 18:03:14
マ板で聞け
URLリンク(pc11.2ch.net)

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

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

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

691:688
08/01/08 20:38:44
それっぽいスレ見つけました
そちらで聞いてみます。どうもありがとうでした。

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

693:デフォルトの名無しさん
08/01/08 21:04:03
>>692
C:\\save.txt

694:デフォルトの名無しさん
08/01/08 21:05:43
え?ファイルが無いのに読み込めたの?

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

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

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

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

698:デフォルトの名無しさん
08/01/08 22:13:51
>>697
コピーできました。
OSはWindowsXPです。
GUIです。

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

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

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

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

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

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

704:デフォルトの名無しさん
08/01/09 00:05:44
バイナリファイルはfeofで、特に他では使うなとか聞いたな

705:デフォルトの名無しさん
08/01/09 00:07:24
>>704
それを言ってた奴は馬鹿。

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

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

708:デフォルトの名無しさん
08/01/09 16:03:33
まあ、読まないとEOFフラグセットされないわけだが

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

710:デフォルトの名無しさん
08/01/09 22:46:43
ではない

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

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

713:デフォルトの名無しさん
08/01/10 02:41:23
連投嫌われる?
聞きたい事いいいいっぱいあるです・・・。

714:デフォルトの名無しさん
08/01/10 02:49:36
重要度の高い順に少しずつ質問すればいいと思うよ。

715:713
08/01/10 02:57:50
じゃぁひとつだけ><

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

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

717:デフォルトの名無しさん
08/01/10 03:17:54
>>716さん
レスありがとうございます!

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

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

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

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

718:デフォルトの名無しさん
08/01/10 03:19:37
訂正です。

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

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

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

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

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

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

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

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

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

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

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

724:デフォルトの名無しさん
08/01/10 13:55:15
>>723
C/C++の宿題を片付けます 102代目
スレリンク(tech板)

725:デフォルトの名無しさん
08/01/10 20:23:44
くだらない質問なのですが
Cで

static int hoge;
int static hoge;

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

726:デフォルトの名無しさん
08/01/10 20:26:52
違う。
staticのような修飾子と型名は順不同というだけ。

727:デフォルトの名無しさん
08/01/10 20:28:17
>static int hoge;
>int static hoge;

その2つは一緒

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

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

728:デフォルトの名無しさん
08/01/10 20:39:05
関数内でも大域にならない?

729:デフォルトの名無しさん
08/01/10 20:44:34
寿命はそうだがスコープは地が宇部

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

731:デフォルトの名無しさん
08/01/10 20:56:39
C++では無名名前空間で対処したな。

732:デフォルトの名無しさん
08/01/10 21:05:53
>>725ですが
ちょいとまだ把握できてないです

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

}

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

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

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

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

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



735:デフォルトの名無しさん
08/01/10 22:02:25
そゆこと

736:デフォルトの名無しさん
08/01/10 22:08:02
了解しました!

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

738:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/12 13:15:12
>>738

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


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

742:デフォルトの名無しさん
08/01/12 13:15:43
音声→音声ファイルね

743:デフォルトの名無しさん
08/01/12 13:25:55
>>738
PIの初期化してないじゃん。ちゃんとデバッグしてんの?

744:デフォルトの名無しさん
08/01/12 13:29:16
そーだ、それも書くの忘れてたw

745:738
08/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:デフォルトの名無しさん
08/01/12 13:29:48
math.hにPIが定義してあるのかとおもったが、そうでもないな

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

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

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

750:738
08/01/12 14:09:29
解決できました。皆さんありがとうございます。

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

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


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

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

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

755:デフォルトの名無しさん
08/01/13 12:37:19
えー

756:デフォルトの名無しさん
08/01/13 12:43:11
>>754
っ stdin

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

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

759:デフォルトの名無しさん
08/01/13 13:54:48
もう開く/閉じる/書く/読むでいいよ。

760:デフォルトの名無しさん
08/01/13 13:56:07
それなんてinterface?

761:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/13 17:50:32
スレ違いに値しますが、どなたかtabキー送り幅の設定方法を教えて下さい
8マスから4マスに変えたいです

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

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

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

766:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/14 00:22:24
***追記***

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

768:デフォルトの名無しさん
08/01/14 00:22:35
StoAって何だよ

769:デフォルトの名無しさん
08/01/14 00:23:33
StoAの中身書いてないわろた

770:デフォルトの名無しさん
08/01/14 00:24:04
どうみてもStoAが悪いだろw

771:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/14 00:42:07
すんません%sでした"汗

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

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

return 0;
}

だと正常に動きます。


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

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

774:デフォルトの名無しさん
08/01/14 00:45:06
いいからStoAの内容書けよ

775:デフォルトの名無しさん
08/01/14 00:46:24
>>772
んなこた良いからさっさとStoAのソースを貼れwww

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

777:デフォルトの名無しさん
08/01/14 00:48:59
じゃあ分かりません帰ってください

778:デフォルトの名無しさん
08/01/14 00:49:16
説明するのが目的なのか、説明してもらうのが目的なのかはっきりして欲しいな

779:デフォルトの名無しさん
08/01/14 00:51:35
>>776
その通りです。

ありがとうございます。

>>778

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

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

781:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/14 01:14:31
正直いいますと今手元にソースが無いのでかけませんが、覚えてる範囲で流れを書きます。

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

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

処理B結果をかえす。

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

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






783:デフォルトの名無しさん
08/01/14 01:16:48
StoAがわかったら説明してやんよ

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

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

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

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

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

786:デフォルトの名無しさん
08/01/14 01:39:22
cron に投げれば

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

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

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

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

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

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

792:785
08/01/14 02:04:17
cron調べましたが使えそうです
ありがとうございました

793:デフォルトの名無しさん
08/01/14 02:04:31
OSに依存する

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

795:デフォルトの名無しさん
08/01/14 02:38:30
>>791
win以外ではエスケープシーケンスとか

796:デフォルトの名無しさん
08/01/14 04:25:03
clearコマンドが使える場合もあるけど、鼬害。

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

798:デフォルトの名無しさん
08/01/14 10:53:06
ちらつきって

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


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

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

どちらにしろ標準関数だけじゃ辛いので、
こういった関数を使うしかない。
URLリンク(msdn.microsoft.com)

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

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

802:デフォルトの名無しさん
08/01/14 11:40:12
>>801
消さずに上書き。
変化の無い部分は書き換えない。


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

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

805:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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
08/01/14 12:42:21
あと下の
a = atoi(*argv[1]);
b = atoi(*argv[2]);
も教えてください

808:デフォルトの名無しさん
08/01/14 12:49:27
Windowsでもcurses使えるんだっけか?

809:デフォルトの名無しさん
08/01/14 12:54:39
>>808
移植はされてると思う。

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

811:デフォルトの名無しさん
08/01/14 14:19:43
806の日本語がバグっとる

812:デフォルトの名無しさん
08/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]);\
}


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5383日前に更新/237 KB
担当:undef