C言語なら俺に聞け( ..
[2ch|▼Menu]
419:408
07/08/29 23:16:02
>>418
一応こちらの環境(BCC5.5)では>>417を改善することで動作はします
(もう少し動作チェックしてみますが)

それから余談ですが、ポインタ配列使うなら ELEMENT next いらないんじゃないですか?
せっかくポインタ繋ぎしてるんですから add_data() 内で new_data=(ELEMENT *)malloc(sizeof(ELEMENT)) してみては?
いまは動作チェックが目的でこうしているというならゴメンナサイね

それから最後にfree()も忘れずに

420:407
07/08/29 23:24:18
改善しました!>>408さん、ありがとうございました!

関数内でmallocはしなくて良い、と言う問題だったので、main側で確保したんです。
自分も関数内で確保した方がいいと思うのですが・・・

421:408
07/08/29 23:52:07
>>420
そういうことですか
分かりました
それらが題意であるならしょうがないですね

余計なことかもしれませんが、
remove_element() は要素を削除するんですよね?
この方法(配列上で行う連結リスト)だと要素を削除した後、その後追加する際に、
空いている要素と空いていない(使われている)要素の区別がつかないので
その点も考慮していく方がよろしいかと思います

422:421
07/08/29 23:53:29
#include <stdio.h>
main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);


}

これにあと配列中の奇数と偶数の数を出力するのを追加したいんですが
どうすればいいんでしょうか?

423:407
07/08/30 00:02:53
>>421
確かにそうですね。mainの考慮をしてみます!

424:408
07/08/30 00:05:50
>>422
こんなんでどうですか?
配列中の値を2で割ってあまりが出るかでないかで奇数、偶数を判断

#include <stdio.h>
main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
int kisu=0,gusu=0;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
if(a[i]%2) kisu++;
else gusu+++
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);
printf("奇数 %d個 / 偶数 %d個",kisu,gusu);

}

425:408
07/08/30 00:08:32
>>422
ところでなんで 421 なんですかね?

>printf("奇数 %d個 / 偶数 %d個",kisu,gusu);
改行忘れたので入れといてください

printf("奇数 %d個 / 偶数 %d個\n",kisu,gusu);

426:デフォルトの名無しさん
07/08/30 00:09:46
おまえも、関係ないなら名前の所の番号外せ

427:422
07/08/30 00:15:18
>>425
ありがとうございます。

名前はミスして書いてしまったようです。すいません^^;

428:デフォルトの名無しさん
07/08/30 00:26:43
怒られちった

429:デフォルトの名無しさん
07/08/30 21:19:36
質問です。
例えば、データの処理(検索など)を行いながら、
同時に秒単位で経過時間を標準出力するといったようなことってできますか?
できるのであれば教えていただきたいのですが。

430:デフォルトの名無しさん
07/08/30 21:44:54
>>429
検索のループ中に時間表示機能入れるなり、スレッド作るなり、signal使うなり
まぁ状況次第でなんなりとどーぞ。

431:デフォルトの名無しさん
07/08/30 23:14:55
奇数偶数なら

if(a[i] & 1)
//奇数
else
//偶数

では?

432:デフォルトの名無しさん
07/08/30 23:18:54
>>431
% 2 でなにか不都合なことがあるの?

433:デフォルトの名無しさん
07/08/30 23:22:31
>>431
負数が2の補数表現で無い環境の場合はうまくいかないんじゃない?
(そんな環境があるかどうかは知らないが…)

434:デフォルトの名無しさん
07/08/30 23:38:35
問題の中に負数がないからどっちでもいいよ

435:デフォルトの名無しさん
07/08/30 23:58:46
>>432
もちろん論理的な不都合はないです。
ただ除算は一般に非効率なので、高速化を狙った提案。ですが、、
>>433
たしかに、そうですね。
使用可能かどうかの確認は必要だと思います。

436:デフォルトの名無しさん
07/08/31 01:46:43
>>435
大丈夫、まともなコンパイラなら%2を割り算では実装しないから。

437:435
07/08/31 02:43:21
>>436
gcc -S で試したら、確かに論理命令が生成されてました。
しかもunsigned だと n % 1 と n & 1 は完全に同じコードに。
勉強になりました。流れ止めて失礼しました。

438:デフォルトの名無しさん
07/08/31 09:54:01
> n % 1 と n & 1 は完全に同じコードに
バグじゃね?

439:デフォルトの名無しさん
07/08/31 09:57:08
バグだな

440:デフォルトの名無しさん
07/08/31 10:08:56
n%2の間違いだろ、突っ込んでやるなよw

441:デフォルトの名無しさん
07/08/31 15:31:29
実数で計算した結果の小数点以下を切り捨ててて
整数のところだけを別の計算に使いたいのです。

どのようにすればできるのかでしょうか。

442:デフォルトの名無しさん
07/08/31 15:37:22
>>441
一度 int にキャストする (正数のときのみ)、あるいは floor()。
入門以前のレベル。本くらい買え。

443:デフォルトの名無しさん
07/08/31 15:40:06
472 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 14:55:28
浮動小数点の小数点以下を簡単に取る方法ってないですか?

473 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 15:13:39
f - floor(f)

444:デフォルトの名無しさん
07/08/31 18:40:31
文字列とfor文についての質問です。
--出力結果--
sample01.txt
sample02.txt
sample03.txt
sample04.txt
sample05.txt
------------
上のように出力し、かつそれぞれを格納したいのですが、
数字の部分に繰り返し文を使ってうまくやる方法がわかりません。

おしえてくらはい><

445:デフォルトの名無しさん
07/08/31 18:52:51
sprintf(fname, "sample%02d.txt", i);

446:デフォルトの名無しさん
07/08/31 19:08:26
あまりの入門レベルにワロタwww

447:デフォルトの名無しさん
07/08/31 19:17:16
入門篇だからいいんじゃね?

448:デフォルトの名無しさん
07/08/31 22:00:31
でも入門書くらい読めよ、てのが少なくない。

449:デフォルトの名無しさん
07/08/31 22:41:01
>>445
うまくいきそうです!ありがとうございました!!

450:デフォルトの名無しさん
07/09/01 00:38:58
>>429
できなくはないが、C言語入門の範疇じゃないな。
OS関連のプログラミングを勉強しないと無理。

451:デフォルトの名無しさん
07/09/01 01:05:03
>>444
char filename[5][100];

for (i = 0; i < 5; i++) {
  sprintf(filename[i], "sample%02d.txt", i + 1);
  printf("%s\n", filename[i]);
}

452:デフォルトの名無しさん
07/09/01 23:22:05
uintptr_t とかsize_t型ってなんなんですか
これもwindowsプログラミング特有の、#defineした型なんでしょうか?

453:デフォルトの名無しさん
07/09/01 23:23:29
#defineはしてないと思うよ^^

454:デフォルトの名無しさん
07/09/01 23:35:05
>>452
size_tは標準の型。
unsigned intとかunsigned longあたりのtypedef。
strlen()のリターン値とかで使われてる。

uintptr_tは知らんけど、
URLリンク(docs.sun.com)
これを見ると、導入が予定されてるのかな?

455:デフォルトの名無しさん
07/09/02 00:12:21
size_tは標準Cに入っている記憶域の大きさを表す型、
sizeof演算子の結果の型と定められている。

uintptr_tはC99から導入された<stdint.h>で宣言されている型の1つで、
ポインタをキャストしても表現を失わないと規定されている符号無し整数型。
VC++でも最近はuintptr_t/intptr_tだけ<stdlib.h>で宣言されている。
<stdint.h>ごと入れればいいものを。

Windowsプログラムなら、uintptr_tよりUINT_PTRのほうが良く見かけるな。
こっちはWindows APIの型とされているし、
VC++にuintptr_tが入るよりも前から存在していたから。

456:デフォルトの名無しさん
07/09/02 00:43:43
一週間ほど前にプログラミングをCから始めまして現在、
URLリンク(homepage3.nifty.com)
まで勉強しました。そこで、もっといいサイトがあるよ〜
っていうのがあれば教えてくださいm(_ _)m
できれば書籍等も・・・・

教えて君で失礼しますた(´・ω・`)

457:452
07/09/02 00:48:08
>>453-455
ありがとうございます。
なるほど、typedefでしたか・・・・。



458:デフォルトの名無しさん
07/09/02 00:49:16
>>456
とりあえずこのサイト全部終わらせればいいんでない

459:デフォルトの名無しさん
07/09/02 01:12:37
Cで正規表現を自前で実装しようと思っていますが速度面で微妙

アセンブラのほうがいいですかね?



460:デフォルトの名無しさん
07/09/02 01:14:35
Cで速度でないなら、アセンブラでやっても大差ないと思う

461:デフォルトの名無しさん
07/09/02 01:14:41
>>459
アルゴリズムの問題だと思われ。

462:デフォルトの名無しさん
07/09/02 01:15:54
>>459
grepか何かのソース読んでみるのはどーか

463:デフォルトの名無しさん
07/09/02 01:23:43
なにの正規表現と比べて遅いと思ったのか分からないけど、
その比較した正規表現の処理系も、おそらくCで書かれてると思われ。

464:デフォルトの名無しさん
07/09/02 01:28:48
Cってメモリと文字列処理がだるいよな

465:デフォルトの名無しさん
07/09/02 01:35:56
何をいまさら

って初心者ですか
そうですね

466:デフォルトの名無しさん
07/09/02 05:17:20
>>456
俺としては、今はもう読むこと無いけど
「C言語入門本物志向が身に付く本」;入門
「ポインタ完全制覇」:ポインタ関連
「文字列操作+ファイル入出力完全制覇」:文字通りの内容
全部「科学技術評論社」
あとは、一応K&R。入門本じゃないけど。
まぁサイトでいえばwisdomsoftかな。
他にも色々あるけど。まぁ、がんばってね

それにつけても、俺が今のレベルまでどうやって勉強してきたのか
さっぱりわからん。学びはじめの頃は
[putchar()//一文字出力する関数]なんてコメントを書きながら
ソース書いてたな。

467:デフォルトの名無しさん
07/09/02 06:45:53
今更Cなんてやっても・・・

CでOSや組み込み系のドライバをサクサク書けるようになるには10年はかかる

やっと使えるなって感じた頃は全く需要がない恐れがある

468:デフォルトの名無しさん
07/09/02 07:10:17
>>467
10年もかからないよ
それに、C言語とOS、ドライバーは関係がない

469:デフォルトの名無しさん
07/09/02 07:12:09
ドライバをCで書くなんてえらい時代になったもんだな
ってアセンブラ厨の老人が沸いてくるよ

470:デフォルトの名無しさん
07/09/02 08:05:57
tuhsなんか読んでるとUnixはversion 6の時代(1974)にすでにデヴァイス
ドライヴァはCで書かれている。
むしろmkdirだのpasswdとかのユーザープログラムがアセンブラで書かれて
たりして笑える。

471:デフォルトの名無しさん
07/09/02 08:06:54
version 6じゃなくてversion 5だった

472:456
07/09/02 08:46:32
>>458,466
レス((ヾ(。・ω・)ノ☆゚+.ァリガトゥ
とりあえず今のサイト最後までがんばってみて、
終わったら466さんの紹介してくださった書籍
よんでみます^^

473:デフォルトの名無しさん
07/09/02 11:27:38
>>464
個人的には文字列操作はダルいけど、メモリ操作は楽。

474:デフォルトの名無しさん
07/09/02 13:44:29
>>469
C て高級アセンブラだよね
こんな言語で業務アプリ書くアホいないよな
って感じてた老人ならここにいますが...


475:デフォルトの名無しさん
07/09/02 14:22:06
>>468
あんたアフォですか?
OSを作成するためにCが作成されたのに・・・

476:デフォルトの名無しさん
07/09/02 14:26:53
もはや関係がないってことだろう

477:デフォルトの名無しさん
07/09/02 15:22:49
1000から9999までの4桁の数字で、各桁を足した数で自分を割りきれる数がいくつあるか調べるプログラムを作りました。
今回は1325という正しい答えを知っていたのでエラーに気づきましたが、答えがわからない場合はどんな風にデバッグしていますか?

478:デフォルトの名無しさん
07/09/02 15:26:44
全部出力して、検算する。

479:デフォルトの名無しさん
07/09/02 15:30:12
各桁の合計を求める部分、割り切れるかどうかを判定する部分、個数を数える部分を
それぞれ個別にテストしてみる。

480:デフォルトの名無しさん
07/09/02 15:34:28
別のアルゴリズムで解いてみる。

481:デフォルトの名無しさん
07/09/02 15:36:56
>>477
そのようなプログラムをCで書かなきゃいけないか?w

excelで十分だろ

482:デフォルトの名無しさん
07/09/02 15:40:25
答えを知ってるってことは課題かなんかだろう
それで>>477みたいな疑問を持ったんだからやる価値があったってことだろう

483:デフォルトの名無しさん
07/09/02 16:52:58
cat.cより抜粋

/* Buffer for line numbers.
An 11 digit counter may overflow within an hour on a P2/466,
an 18 digit counter needs about 1000y */
#define LINE_COUNTER_BUF_LEN 20
static char line_buf[LINE_COUNTER_BUF_LEN] =
{
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0',
'\t', '\0'
};

/* Position in `line_buf' where printing starts. This will not change
unless the number of lines is larger than 999999. */
static char *line_num_print = line_buf + LINE_COUNTER_BUF_LEN - 8;

/* Position of the first digit in `line_buf'. */
static char *line_num_start = line_buf + LINE_COUNTER_BUF_LEN - 3;

/* Position of the last digit in `line_buf'. */
static char *line_num_end = line_buf + LINE_COUNTER_BUF_LEN - 3;

484:デフォルトの名無しさん
07/09/02 16:55:36
>>483の続き

/* Compute the next line number. */

static void
next_line_num (void)
{
char *endp = line_num_end;
do
{
if ((*endp)++ < '9')
return;
*endp-- = '0';
}
while (endp >= line_num_start);
if (line_num_start > line_buf)
*--line_num_start = '1';
else
*line_buf = '>';
if (line_num_start < line_num_print)
line_num_print--;
}

Cの基本的なことを勉強して、cat.cのソースを読んでいますが
この行を計算する関数の処理が何が言いたいのかわかりません。
line_bufを参照しながらカウントしているように見えますが、いまひとつわかりません。
どなたかご教授お願いします。

485:デフォルトの名無しさん
07/09/02 17:16:14
URLリンク(www.google.co.jp)
>何が言いたいのかわかりません
何を聞きたいのかわかりません

486:デフォルトの名無しさん
07/09/02 17:37:21
行番号を表す文字列をポインタ使って変更してるんじゃない?
"399" → "400"みたいに。

487:468
07/09/02 18:25:16
>>475
OSを作成するためにCを勉強しているわけではないだろ
そう意味で関係ない

488:デフォルトの名無しさん
07/09/02 18:37:35
じゃぁ、なん為にやってるの?

文字列を逆順に表示したりするプログラムを書くためですか?hw


489:デフォルトの名無しさん
07/09/02 18:41:38
普通はアプリケーションを作成するためにC言語を勉強するんじゃない?

490:デフォルトの名無しさん
07/09/02 18:42:26
この先必要となる基礎としての勉強じゃないんですか?>>488

491:デフォルトの名無しさん
07/09/02 18:43:35
英語を習うときに、目的を持つかどうかの違い棚。

492:デフォルトの名無しさん
07/09/02 19:06:28
失礼します。
変数Aに一秒ごとに1を追加していくようにしたいのですが、どうしたらいいのでしょうか。

493:デフォルトの名無しさん
07/09/02 19:07:30
どうしてそんなことをする必要があるのかってところから考えたほうがいいよ。

494:デフォルトの名無しさん
07/09/02 19:09:41
>>493
いや、タイマーに使いたいのですが。

495:デフォルトの名無しさん
07/09/02 19:14:44
>>492

main()
{
  int A = 0;
  while (1) {
    sleep(1);
    A++;
  }
}

496:デフォルトの名無しさん
07/09/02 19:16:24
>>492
つ time.h
使った事無いけど…orz

497:デフォルトの名無しさん
07/09/02 19:21:45
CでMMOのBOT作れるんでしょうか?

498:デフォルトの名無しさん
07/09/02 19:22:16
いいえ

499:デフォルトの名無しさん
07/09/02 19:29:53
タイマーの値が必要なときに、現在時刻を取得すればいいんじゃない?
時刻の取得の仕方は環境依存

500:デフォルトの名無しさん
07/09/02 19:35:31
>>495-496
ありがとうございます
試してきます

501:487
07/09/02 20:03:34
>>488
> 文字列を逆順に表示したりするプログラムを書くためですか?hw
なかなかよいポイントをついているね

プログラミングの本質はデータの加工と入出力
世の中のすべてのプログラムは「文字列を逆順に表示したりするプログラム」

データーベースのアプリだって通信モジュールだって高度な科学技術計算のプログラムだって
みーんな本質的には「文字列を逆順に表示したりするプログラム」だ
OSもね


502:デフォルトの名無しさん
07/09/03 05:33:18
もっと軽い言語がたくさんありますよ今は

503:デフォルトの名無しさん
07/09/03 20:21:34
例えば何?

504:デフォルトの名無しさん
07/09/03 23:10:59
おい、五輪実況(男)で看板とか名無しとかLRとか決めるからおちょくりに来いよ
ヒント:なんかVIPの同盟国とかほざいてるから

スレリンク(ootoko板)


505:デフォルトの名無しさん
07/09/04 16:12:59
>>503
スクリプト系の言語のことをいってんじゃないの?

506:デフォルトの名無しさん
07/09/04 16:17:54
スクリプト系はゲロ重だろ

507:デフォルトの名無しさん
07/09/04 18:12:15
int main(void)
{
do {
switch (getnum("番号を入力してください\n")) {
case 1:
question(1);
break;
}
} while (0);
return 0;
}

int getnum(const char *msg)
{
int n;

for (printf(msg); scanf("%d", &n) != 1;) {
while (getchar() != '\n');
}

return n;
}
ここで使われているgetnumがいまいち理解できません。
何をしてるいるのか教えてください。

508:デフォルトの名無しさん
07/09/04 18:18:44
printf(msg) は msg を表示
scanf("%d", &n) は数字を入力
!= 1 は scanf で数字が正しく入力されたか確認
while (getchar() != '\n'); は改行が来るまで入力を読み飛ばす
return n; は入力された数字を返す

これでおk?

509:507
07/09/04 18:40:35
>>508さん
よくわかりました。
ありがとうございます。

510:デフォルトの名無しさん
07/09/05 16:50:33
URLリンク(kansai2channeler.hp.infoseek.co.jp)
質問させてください。
+と-と|を使って升目を出力するプログラムです。
第一に40行目のところのコメントをはずすと最初のループはなぜ止まるのですか?
第二に40行目の部分のコメントをはずしたときに
47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
いろいろ試すうちに2つ目の問題もでてきて分からなくなりました。
よろしくおねがいします。

511:デフォルトの名無しさん
07/09/05 16:54:42
意味がわからない変数名はやめろ

512:デフォルトの名無しさん
07/09/05 17:09:32
continueやめてbreakにすれば?

513:デフォルトの名無しさん
07/09/05 17:45:26
>>510
> 第二に40行目の部分のコメントをはずしたときに
> 47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
コンパイラのバグだと思われる。

514:デフォルトの名無しさん
07/09/05 18:09:57
>>510
>>512も言っているけどswitch内のcontinueやめてbreakにするとこうなる

+---+
|   |
+---+
|   |
+---+


515:デフォルトの名無しさん
07/09/05 18:14:27
>>510
確認してないけどたぶんあれね

continueにしちゃっているから44行目からwhile()の式評価にとんじゃっているんだと思う
実際には47〜49行目は実行されていない
本来は47行目に行かなきゃ行けないのでbreakにする

516:デフォルトの名無しさん
07/09/05 18:20:35
32行目を下のように変更するだけで動作が変わるから、バグでしょ
while (d < e){

while (d < e){printf("");

517:デフォルトの名無しさん
07/09/05 18:26:23
gcc は期待したとおりの動作になったが
bcc だと >>516 の変更前後で出力内容が変化した

変更前
+---+

変更後
+---+
|   |
+---+
|   |
+---+

518:デフォルトの名無しさん
07/09/05 18:28:46
あっwhile (d < e)があったの気づかんかった
とりあえず>>515は忘れて

>>514は目的の動作が分からんので保留かな

519:510
07/09/05 18:42:26
皆さん見ていただきありがとうございました。
continueで戻ることばかり考えていてbreakを忘れていました、
while文の中にあるのでcontinueを使わずとも繰り返しになるのですね、
whileとbreakとcontinueの使い方を再確認します。
変数名も以後気をつけます。

コンパイラのバグということで
他のコンパイラを試してみようと思っていたのですが
>>517さん試していただきありがとうございました。

520:デフォルトの名無しさん
07/09/05 21:23:40
>>519
switch があるから、breakはそっちを抜けるだけで
whileにまで影響しないんだよ
switchとwhileが同じbreakなのは
たまに不便だがな

521:デフォルトの名無しさん
07/09/05 22:16:45
まぁそういう時は多少見辛くてもif-else使うかな。俺は。
ループフラグとかgotoとかキラーイ

522:デフォルトの名無しさん
07/09/06 02:48:24
struct node *hoge(struct node* a)
{
struct node *b;
    b = a;
    a = NULL;
 free( b );
 return a;
}

free関数の形式を調べてみるとvoid free(void *ptr);と書いてありました
URLリンク(www.bohyoh.com)

つまり、上記の関数を実行すると、引き数で渡されたポインタaがNULLを代入される前に指していた領域を開できるということでしょうか?

自分で調べてみて「たぶんあっているな。」とは思ってもどうしても確信できなくて不安になってしまいます。みなさんはそんなことありませんでしたか?(このレス二つ目の疑問です)

523:デフォルトの名無しさん
07/09/06 04:23:10
適当な結果を標準出力に出力しつつ時々
y/n を聞いてくるコマンド ques が
あったとします。y/n を検知して
代わりに y を入力してくれる
プログラムを書きたいのですが、
何をキーワードに検索してよいのか
すらわかりません。パイプで検索したのですが
何か違う感じでした。
よろしくお願いします。


524:デフォルトの名無しさん
07/09/06 07:33:36
>>522
・できる。
・根本的にポインタを理解できていればそんなことはないと思う。

>>523
他に標準入力する項目がなく、quesが確実に標準入力を利用しているというのなら、
yes | ques
でOK。

525:デフォルトの名無しさん
07/09/06 10:22:16
>>524
すいません。C言語でやりたいのです。
それと質問に応じて no と答える場面もあります。
よろしくお願いします。


526:デフォルトの名無しさん
07/09/06 11:01:35
>>525
それなら、パイプで間違ってないと思う。
コマンドの標準出力/標準エラー出力を監視しながら特定のパターンを認識したら、
コマンドの標準入力に対して、yまたはnを投げる。

>何か違う感じでした。
何を期待しているか知らないが、コンソールアプリでは
WindowsのGUIアプリのように、入力待ちになったとかのイベントが
飛んできて、そこに処理を記述するわけではない。
実装はどうしても泥臭くなると思うが。

527:デフォルトの名無しさん
07/09/06 11:03:40
ファイル操作について質問なのですが、
もし現在の日付をfprintf("%d %d %d %d %d %d\n",local->tm_year・・・以下略
こういう風にファイルに保存したとしますよね。
このファイルを読み込むとき、
fscanf("%d%d%d%d%d%d",&year,・・・以下略という風に読み込んだとき、
何故yearという変数にはしっかりとyearで保存した数字が格納されるのですか?
説明下手ですみません。

528:デフォルトの名無しさん
07/09/06 11:07:05
fprintf("%d %d %d %d %d %d\n",local->tm_year・・・
で書き込むと当然、
2007 09 06 ・・・
となるから、fscanf("%d%d%d%d%d%d",&year,・・・で読み込むときは
空白か改行まで読まれるので
2007
09
06
・・・
と順に読み込まれる

529:デフォルトの名無しさん
07/09/06 11:08:05
なぜって言われても、それが fscanf という関数の機能なんだし。
どういう結果になると思ってた?

530:デフォルトの名無しさん
07/09/06 11:10:00
なるほど・・・左上から順に変数に格納されるんですね。それなら呼び出す
順番に気をつけないとメチャクチャになりますね。分かって良かった。
ありがとうございました。

531:
07/09/06 16:45:10
すいません。gccの拡張命令について知りたいのですが
どこかに命令一覧が載ってるサイトってありますか?

532:デフォルトの名無しさん
07/09/06 16:52:09
配列を引数として関数にいれて、関数でその配列の中身を表示しておいて
mainでその関数を100回くらいまわしたら
値がかわってくるんだけど何が原因だと思われますか?

配列は20要素で
引数は4つ使ってます。

533:デフォルトの名無しさん
07/09/06 16:56:09
>>532
そりゃプログラムのバグでしょ
具体的にコード見せてくれないとそれ以上はわからん

534:デフォルトの名無しさん
07/09/06 17:09:10
void makemake(---){ (これをmainと思ってください)
double ma[120][20];
double h1[20],h2[20],n[120];
int num;

fileinput(h1,h2,num);
for(i=0;i<120;i++){
n[i]=fmake(ma[i],h1,h2,num);
}
}

そしてfmake関数に渡します
double fmake(double a[20],double b1[20],double b2[20],int n){
int i;

for(i=0;i<20;i++){
printf("b1:%lf b2:%lf",b1[i],b2[i]);
}

}

まー一部なんでわかりにくいかもしれませんが。
fmake関数のprintfで20ループくらいまでは
きちんと表示されるんですけど途中でnanとかおかしな数字が表示されるんです。



535:デフォルトの名無しさん
07/09/06 17:10:21
not a number

536:532
07/09/06 17:13:30
534ですけどお願いします。

537:デフォルトの名無しさん
07/09/06 17:25:07
そのファイルがおかしいんじゃないの

538:デフォルトの名無しさん
07/09/06 17:26:57
>>536
思わず笑ってしまった。
>>535の not a number は>>534の nan を指してる。

NaN (Not a number)、日本語だと非数。

浮動小数点演算で、0除算など計算結果が正しく求められない計算を
したときに、値が正常でないことを示す特別な値が格納される。その値のこと。

繰り返しはまったく同じものを表示しているわけではないみたいだけど、
fileinputで読んできた値がすでにおかしいんじゃないの?

539:デフォルトの名無しさん
07/09/06 17:45:24
>>534
fileinput をでっちあげて動かしてみたが、まったく問題ない。
省略した部分がおかしいと思われ。

540:532
07/09/06 17:46:27
ファイル入力が間違ってるんじゃないかって指摘するってことは
プログラムはあってるってことですか
ありがとうございます。

どうしようもなくなったら直接fmakeにb1,b2のファイルいれますわ。

541:デフォルトの名無しさん
07/09/06 17:49:45
>>540
プログラムもなにも、挙げられた断片だけでは何もしないコードに見え
る。fmake()は何も返してないし。


542:532
07/09/06 17:53:22
正規分布のプログラムなんすよ。
double a[20],  データ120X20
double b1[20],  20次元の平均
double b2[20],  20次元の分散
int n      平均・分散の組。
式は書くの大変だから省いてるだけです。

543:デフォルトの名無しさん
07/09/06 18:02:25
予想ではたぶんその式が悪い

544:532
07/09/06 18:04:15
double fmake(double a[20],double b1[20],double b2[20],int n){
int i;

for(i=0;i<20;i++){
printf("b1:%lf b2:%lf",b1[i],b2[i]);
}

以上

545:デフォルトの名無しさん
07/09/06 18:06:14
わからなければ計算したり配列弄るごとに中身出力してみ

546:デフォルトの名無しさん
07/09/06 18:30:27
どこが悪いかわかんないのに、なんでそこが悪いと思うのか理解できない。

547:デフォルトの名無しさん
07/09/06 19:15:12
このソースがコンパイルできないんですけど
どこに問題があるんですかね?
コンパイラはgcc3.3.6です。
URLリンク(www8.uploader.jp)

548:532
07/09/06 19:33:26
>>532て書いてるんですけど。
式はあってるんだよ確認ずみだから。
入力のプログラムがあやふやだからここで聞いただけ。

549:デフォルトの名無しさん
07/09/06 19:35:12
はいはい。コンパイラのバグかなんかじゃねえの。

550:デフォルトの名無しさん
07/09/06 19:39:09
そろそろ荒らし化しそうな予感

551:デフォルトの名無しさん
07/09/06 19:48:25
こんなアホ相手にするお前ら優しいな

552:デフォルトの名無しさん
07/09/06 19:48:45
よく言われる

553:デフォルトの名無しさん
07/09/06 19:51:32
>>547
配列の宣言の仕方とsizeの扱い直せばいけると思う

554:デフォルトの名無しさん
07/09/06 19:53:07
>>553追加でコンパイルするだけならsizeはそのままでもいいかも
連投スマン

555:デフォルトの名無しさん
07/09/06 20:18:46
どんどん本性が出てきたな

556:デフォルトの名無しさん
07/09/06 21:39:02
>>510 が、もう見てないだろうから、書いてみる
#include<stdio.h>

int main(void){
int x, y, width=3, height=4;

for(y=0;;y++){
for(x=0;x<width;x++) printf("+---");
printf("+\n");
if(y>=height) break;
for(x=0;x<width;x++) printf("| "" "" "); // コピペ用
printf("|\n");
}
return 0;
}

557:デフォルトの名無しさん
07/09/06 22:38:24
殆どのネットゲームのBOTは C言語で開発されてるんでしょうか?
サイトありましたらおしえてください m)_ _m)

558:デフォルトの名無しさん
07/09/06 22:43:18
無い

559:デフォルトの名無しさん
07/09/06 23:16:50
URLリンク(www.google.co.jp)

560:デフォルトの名無しさん
07/09/07 10:46:15
>>559
ありがとうございました

561:デフォルトの名無しさん
07/09/07 12:55:50
ネトゲのBots全てがCで作成されているかは知らんが
Cで作成できないことはない。
まぁ開発にあたっては、Cの知識だけでなく、それ以上の多くの知識が求められます。

562:デフォルトの名無しさん
07/09/07 14:31:57
UWSCあたりならすぐに書けそうだな。

563:デフォルトの名無しさん
07/09/07 16:02:02
関数は自分で積極的に作ったほうがいいですか?
それとも既存のものの効率的な組み合わせにこだわったほうがいいですか?

564:デフォルトの名無しさん
07/09/07 16:59:44
既存のものの効率的な組み合わせをする関数を自分で積極的に作ったほうがいい

565:デフォルトの名無しさん
07/09/07 19:00:20
>>564
ありがとうございます。なるほど!積極的に作ります

566:デフォルトの名無しさん
07/09/07 19:21:22
グローバル変数として宣言する場合と、staticを付けて関数内で宣言する場合は
どういう違いがあるんでしょう?いくつかの説明文見たところ自分では同じように
思えるんですが、グローバル変数にstaticを付けるプログラムの例を見かけたので気になりました。

567:デフォルトの名無しさん
07/09/07 19:27:15
static を付けないグローバル変数 → 他のファイルからでも参照できる
static を付けたグローバル変数 → 他のファイルからは参照できないが、同じソースファイル内ならどの関数からでも参照できる
static を付けた関数内の変数 → 他の関数からは参照できない

間違って書き換えたりしないように、見える範囲をなるべく最小限にする方が良い。

568:デフォルトの名無しさん
07/09/07 19:40:10
>>567
ありがとうございます、アクセスできる範囲に違いがあるんですね。
つい値を保持できる期間ばかりに目が言ってたみたいです

569:デフォルトの名無しさん
07/09/07 23:03:28
入力された文字列が正しい文字列かを判断するプログラムなんですけど

#include <stdio.h>
#include <string.h>

int getflg(char wd);
main()
{
int n;
char word;
printf("文字入力:");
scanf("%s",&word);
n=getflg(word);
printf("flg=%d",n);
}
int getflg(char wd)
{
int flg=0;
if ( strcmp(wd,"あいうえお")==0 ){
flg=1;
}

return flg;
}

これだとエラーがでるのですがどうすればよいのでしょうか;;

570:デフォルトの名無しさん
07/09/07 23:06:22
>char word;
>printf("文字入力:");
>scanf("%s",&word);

え?w

571:デフォルトの名無しさん
07/09/07 23:08:53
>>569
「文字」ではなく「文字列」だから

#include <stdio.h>
#include <string.h>

int getflg(char *wd);
main()
{
int n;
char word[20];
printf("文字入力:");
scanf("%s",word);
n=getflg(word);
printf("flg=%d",n);
}

int getflg(char *wd)
{
int flg=0;
if ( strcmp(wd,"あいうえお")==0 ){
flg=1;
}
return flg;
}

だね

572:569
07/09/07 23:13:04
>>570
すいません

>>571
文字だと&が必要で
文字列だと&は必要ないということですかね?

あと*wdにするのはなんでですかね?汗

573:デフォルトの名無しさん
07/09/07 23:18:20
>>572
>文字列だと&は必要ないということですかね?
必要ない

>scanf("%s",word);
>if ( strcmp(wd,"あいうえお")==0 )
文字列同士の比較をしたいわけでしょ

char wd だと1文字だけしか渡せない、文字列として渡したいならポインタとして渡すしかない
char *wd は文字列のポインタを渡している

574:デフォルトの名無しさん
07/09/07 23:30:21
#include <stdio.h>
#include <string.h>

int getflg(char *wd);
main()
{
int n;
char word[20];
printf("文字入力:");
scanf("%s",word);
n=getflg(word);
printf("flg=%d",n);
}

int getflg(char *wd)
{
return !strcmp(wd,"あいうえお") ? 1 : 0;
}

575:デフォルトの名無しさん
07/09/07 23:34:11
>>534
> double ma[120][20];
これでスタックフレームを何byte消費しているか理解しているか?

static double ma[120][20];
static double h1[20]
static double h2[20]
static double n[120];
にしてみろ

これで結果がお前の予想通りになったなら
コンパイラはお前の予想通りには動かないということを知っておけ


576:569
07/09/07 23:35:04
>>573
char wdだと1文字だけなんですか?

577:デフォルトの名無しさん
07/09/07 23:41:55
>>575
> これでスタックフレームを何byte消費しているか理解しているか? 

たった、18,9Kじゃん。


578:569
07/09/07 23:47:17
>>576をちと言い換えたいんですが、

int getflg(char wd[])
と違いは何かありますか??

579:デフォルトの名無しさん
07/09/07 23:52:06
>>578
int getflg(char wd[]);

int getflg(char wd);
の違いが理解できない奴はCをする資格が無い

VBかJavaScriptあたりで妥協しておくことをお勧めする


580:デフォルトの名無しさん
07/09/07 23:54:25
理解できないっていうか、こういう基本的なところをネットで訊きながら進めるのって、効率悪すぎだろ。
入門書でも買えばいいのに。

581:デフォルトの名無しさん
07/09/08 00:14:43
Cでは文字列変数というのはなくてバイト(char)の配列として扱っているんだよね
ほかの言語ではまずありえないことだけど

582:569
07/09/08 00:33:22
>>580
基礎的なHPをいろいろ探してみてきたが

int getflg(char *wd);
これだと、ポインタによる引渡しで

int getflg(char wd[]);
これだと、wdに文字列を直接代入する的なものですか?

583:デフォルトの名無しさん
07/09/08 00:33:43
haskellもそうじゃなかったっけ

584:デフォルトの名無しさん
07/09/08 00:34:39
>>582
いや、ややこしいことに
int getflg(char *wd);

int getflg(char wd[]);
は同じ

585:デフォルトの名無しさん
07/09/08 00:38:23
>>582
C FAQのポインタあたりを一通り読んでみるとか。

URLリンク(www.kouno.jp)

586:581
07/09/08 00:38:56
>>582
ちがいます

Cではchar wd[]とchar *wdはほぼ同じ扱いです

587:
07/09/08 00:41:32
でも配列とポインタだと&かましたときの値が違うんじゃないの?

588:デフォルトの名無しさん
07/09/08 00:45:14
関数の宣言で使用する場合は同じ(ポインタと解釈)。

589:デフォルトの名無しさん
07/09/08 01:04:12
>>586
ちがいます

Cでは関数の引き数の宣言において、char wd[]とchar * wdは全く同じ扱いです。

590:デフォルトの名無しさん
07/09/08 01:10:48
char wd[10]
とか書くとまた変わって来るからややこしい。

591:デフォルトの名無しさん
07/09/08 01:45:54
int getflg(char *wd); も
int getflg(char wd[]); も
int getflg(char wd[10]); も
int getflg(char wd[42]); も一緒

592:デフォルトの名無しさん
07/09/08 02:30:12
すみません、質問です。C言語でmallocによる動的な領域確保の勉強をしています。
char型の領域を動的に確保してそこにコマンドライン引数のargv[i]を格納していきます。

void main(int argc, char *argv[]){
  int i;
  char *hikisu;

  for(i=0; i<argc; i++){
    hikisu[i] = (char *)malloc(sizeof(char));
    memset(hikisu[i], NULL, sizeof(char));
    strcpy(hikisuu[i], argv[i]);
  }
}

これでコンパイルが通らないのですが、何が悪いのかよくわかりません。
ご教授お願いします。


593:デフォルトの名無しさん
07/09/08 02:38:44
>>592
動的確保以前のポインタの勉強をしなおせ。
--
// インクルードファイルを適切にインクルードしていない
void main(int argc, char *argv[]){
// mainの戻り値型はintにするべき
// 中括弧は別の行に書くのが一般的
  int i;
// 一文字変数はインクリメンタルサーチしにくいからお勧めしない
  char *hikisu;
// ポインタ変数は、ポインタ一個しか保持できない。引き数を複数保持したいなら、これではダメ

  for(i=0; i<argc; i++){
    hikisu[i] = (char *)malloc(sizeof(char));
// malloc()の引き数はバイト数。これでは1バイトしか確保できない
    memset(hikisu[i], NULL, sizeof(char));
// malloc()したエリアをmemset()で潰してしまうのはナンセンス(一部に妄信者はいるが)
// つーか、引き数が無茶苦茶
    strcpy(hikisuu[i], argv[i]);
// これも引き数が間違っている
  }
}
--
まぁ、取り敢えずこの辺にしておいてやるかw

594:デフォルトの名無しさん
07/09/08 02:44:46
>>592
stdlib.hがincludeされてない。
strcpy(hikisuu[i], argv[i]);
「hikisuu」はどっから出てきた?(タイプミス?)

この2つ直すととりあえずコンパイルは通るかもしれない。(コンパイラ次第)
が、落ちる可能性が高いな。

ていうかコンパイルのエラーを書け。

595:デフォルトの名無しさん
07/09/08 21:00:46
Javaにはメソッドのコメントの書き方で、
/**
@param
@return
*/
のようなのが決まっていて、これでHTMLのドキュメントを自動作成できますが、
Cにはそのようなものはありますか?

596:デフォルトの名無しさん
07/09/08 21:03:28
つ[Doxygen]

597:595
07/09/08 21:25:58
レスありがとうございます。
できるだけ標準的なものを使いたいのですが、そのDoxygenというのはよく使われていますか?
もしJISやISOやその他の標準化団体の制定した書式があるようならば、教えて欲しいのですが。

598:デフォルトの名無しさん
07/09/08 21:28:38
標準化はされてない

デファクトスタンダードには近いかも

599:デフォルトの名無しさん
07/09/08 23:08:08
戻り値で成功か失敗かの判定だけ必要なとき、
成功は0で、失敗は-1で返すのがいいんでしょうか?
古いCの関数はこれが多いですよね。
成功は1で失敗は0にすると、判定側でif(!func()){ printf("error"); }
のような書き方ができるので、これの方が便利な気もするのですが、
どっちがいいんでしょうか。

600:デフォルトの名無しさん
07/09/08 23:16:04
>>599
古いCの関数っていうか、unixのシステムコールだろ。

601:デフォルトの名無しさん
07/09/08 23:24:16
>>599
俺は自分でSUCCESSとFAILUREをdefineして使うのが好き。
SUCCESSが1でも0でもif(func!=SUCCESS)と書く。

この辺は好みじゃね?

602:デフォルトの名無しさん
07/09/08 23:40:14
シンプルに0か0以外がいいよ。
いろいろ値が定義してあると、読むのに負担がかかる。

単純なTRUE,FALSEでも、0以外と0になっているかとか、定義が一箇所かとか気にする必要あるし。
いまやってる仕事なんて、RTN_OKとRTN_ERRだけかと思ってたら、RTN_NODATAとか返してたり返した無かったり
するし。

603:デフォルトの名無しさん
07/09/08 23:55:20
あるディレクトリにある、大量のファイル(ファイル名は***1.dat、***2.dat、***3.datと1000個ぐらい続く)
を順番に読み込みたいのですが、どのようにすれば良いのでしょうか?
通常のファイルを開く方法(fopen)では、指定ファイル名をしてforループで回して変更するとかいう事が出来ない
みたいなので困っています。どなたかご教授よろしくお願い致します。

604:デフォルトの名無しさん
07/09/08 23:58:01
普通に一個ずつ順番に読めばいいんじゃないの?

605:デフォルトの名無しさん
07/09/08 23:58:21
>>603
OSのAPIに頼ってディレクトリのファイル名一覧を作る。
で、順番にfopenか何かで開く。

606:デフォルトの名無しさん
07/09/08 23:58:49
ファイルシステムを直接読めばいいのでは?

607:デフォルトの名無しさん
07/09/08 23:59:52
ファイル名が連番になってるのならforループで舞わせばいいい。

608:デフォルトの名無しさん
07/09/09 00:00:30
つ system

609:デフォルトの名無しさん
07/09/09 00:00:39
>>603
ファイル名が規則的なら、、ループで回して処理できるよ。

610:デフォルトの名無しさん
07/09/09 00:10:34
age

611:デフォルトの名無しさん
07/09/09 00:31:10
***1.dat、***2.dat、***3.dat てことは連番だな

612:デフォルトの名無しさん
07/09/09 00:42:52
int i;
FILE *fp;
char filename[12];
for (i = 1; i <= 1000; i++) {
sprintf(filename, "***%d.dat", i);
fp = fopen(filename, "r");
以下略

613:603
07/09/09 00:50:17
>>612
どうもありがとうございます。
sprintfという関数を知りませんでした。
非常に助かりました。

614:デフォルトの名無しさん
07/09/09 12:21:33
すみません 初心者です。
この最後のFor文は何をしているのですか?
よろしくお願いします。

int wk1;
char DateT[10+1];
char bufs[128];

DateT[0] = "2007/10/01"
memset( bufs, 0x0, sizeof(bufs) );
memcpy( bufs, DateT+ 5, 2 );
wk1= atoi(bufs); wk1-= 1;

for( i=6; i>=5; i--, wk1/=10 )
DateT[i]= (char)((wk1%10)+'0');

615:デフォルトの名無しさん
07/09/09 12:31:14
10 月を 09 月に変えてるんじゃね?

616:デフォルトの名無しさん
07/09/09 12:33:45
月の値、01〜12を00〜11に置き換えている。

617:デフォルトの名無しさん
07/09/09 12:37:52
>614
とりあえずそのコード、コンパイル通らなくない?
質問するくらいだから自分で書いたコードじゃないんだろうけど、あんまり参考にしたくないコードだと思う。
で、for 文限定だと

短い答え:数値を文字列に変換している。
もうちょっと長い答え:
wk1 % 10 で wk1 の一の位の数値を得る。
これに '0' ('0' の文字コード値を足すと 0 なら '0' に 1 なら '1' と数値→文字の変換が出来る。
wk1 /= 10 で十の位が一の位に移って繰り返し。

618:デフォルトの名無しさん
07/09/09 12:51:37
>>614
?? DataT[0] = "2007/10/01"
そいつは、通らねえよ。

それにしても、俺の現場にあるソースに似てるwまさかww



619:sage
07/09/09 13:47:36
>>615
>>616
>>617
>>618
どうもありがとうございました。助かりました。
私の知り合いが解析しているソースを
出来ないなりに私も手伝おうかと思って頭から調べているときに
ひっかかった次第です。
自分はもう少しCの勉強が必要ですね。orz






620:デフォルトの名無しさん
07/09/09 13:50:39
恥ずかしいんでsageます。
失礼しました。


621:デフォルトの名無しさん
07/09/09 20:40:55
2chのスレッドの仕組みについても学んでください
sageで書き込んでもスレッドは下がりません

622:デフォルトの名無しさん
07/09/09 21:54:44
いまリストでキューを実現しようと考えてるのですが、うまくデータを入れることができません
どうすれば改善できるか見てもらえないでしょうか?

URLリンク(www.dotup.org) C言語ってコメント入れているファイルです

623:デフォルトの名無しさん
07/09/09 22:06:18
普通、キューに入れるときに動的にメモリ確保するんでない?

624:デフォルトの名無しさん
07/09/09 22:08:41
>>622
根本的に改善する余地あり
改善案は次の通り(命名に付いては適当に変えたほうが良い)

QUE *queue_init(void);
void queue_terminate(QUE *que);

int queue_enque(QUE *que, void *data);
void *queue_deque(QUE *que);

int queue_size(QUE *que);


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

5394日前に更新/232 KB
担当:undef