07/08/29 21:50:13
>>411
すいません!書き忘れてましたけど、headはstatic変数で今回ダミーとして扱います
ちなみにheadはhead->next = NULLで初期化してあります。
for文の初期化でtmp = head;とあるので、head->nextでダミーではない値をもつリストに入るときにはcntは1になっています
なのでcnt == indexはひとつ前になるんじゃないかな~と考えてます。間違えてたらすいません
413:408
07/08/29 21:54:23
>>412
つまり head->next が最初の要素ってことですね
なら納得です
だとすると、やはりこのソースからだと分かりませんね
私はここまでです
414:407
07/08/29 22:11:13
>>413
そうですか、ありがとうございました。
原因はこれだけのソースではわからないと思うので、ななし.orgに全部のソースをアップしました
見てくれるなら見てほしいです。んでVisualStudioで実行してほしいです
まだ途中なんでできたらツッコミとかよろしくおねがいします
415:408
07/08/29 22:33:26
>>414
そういうときはURLも貼ってくれないと
ななし.orgってどこですか?
416:407
07/08/29 22:43:24
すいません。。ここです
URLリンク(77c.org)
417:408
07/08/29 23:02:01
>>416
まずここかな
void init_list(void){
ELEMENT top;
head = ⊤
element_cnt = 0;
head->next = NULL;printf("\(^o^)/");
}
ELEMENT top; は関数のローカル変数
head = ⊤
top の実体は関数抜けたら無効になる
にも関わらず 関数外でhead(top) にアクセスしてる
418:407
07/08/29 23:12:46
>>417
ああ~!そうですねw普通におかしいですね
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);
625:デフォルトの名無しさん
07/09/09 22:12:52
キューのデータそのものと頭とケツの位置とかを保持する管理構造体を作って、それをQUE構造体とすべき
626:622
07/09/09 22:17:55
>>623
確かにそうですね。とりあえず今回はって事で書きました
>>623
queue_terminateはどういう処理をしますか?
>>625
そうします
627:デフォルトの名無しさん
07/09/09 22:21:08
>>624じゃないが、
QUE *queue_init(void); → QUE型のメモリ割り当て、初期化
void queue_terminate(QUE *que); → 保持しているキューデータのメモリ解放、QUE型をメモリ解放
だと思う。まぁC++のあれだよね^^
628:622
07/09/09 22:42:24
>>627
そういう事ですか、わかりました
根本的な改善はわかったんですが、今回のデータを入れることができないっていう事の
改善策はありませんか?
また次も同じことになりかねないので・・・
629:デフォルトの名無しさん
07/09/09 22:57:07
>>626
いそいで作ってみた
バグあるかも
URLリンク(2sen.dip.jp:81)
630:デフォルトの名無しさん
07/09/09 22:57:11
構造が悪いから分かりにくくなってるだけ
631:624=629
07/09/09 23:04:25
引数チェックが甘かった orz
まあいっか
632:622
07/09/09 23:15:53
>>629
拝見しました。管理用とデータ用の構造体を作ったほうがいいことがよくわかりました
参考にさせてもらいます。ありがとうございます~
633:デフォルトの名無しさん
07/09/10 00:00:07
>>632
>>629 の不完全型はデータを隠蔽するのに便利!
オススメのテクニックだよ
634:デフォルトの名無しさん
07/09/10 13:51:08
西暦と月を入力すると,以下のようなカレンダーを出力するプログラムを作成せよ
閏年にも対応すること.
西暦年が4で割り切れる年は閏年
ただし、西暦年が100で割り切れる年は平年
ただし、西暦年が400で割り切れる年は閏年
指定された年,月の一日の曜日を求めると良い.曜日を求めるには,Zellerの公式を使う.年も月も整数型の変数を用い,日の部分は1に置き換えること.
(年+年/4-年/100+年/400+(13*月+8)/5+日 )%7
1月と2月は前年の13月,14月として考える.
この式の答えと曜日の関係は以下の通り.
0:日曜日,1:月曜日,2:火曜日....,6:土曜日
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
このようなプログラムを作りたいのですがちんぷんかんぷんでまったくできません。
よろしければ見本のようなものを作ってもらえないでしょうか。
お願いします。
635:デフォルトの名無しさん
07/09/10 13:54:01
丸投げは宿題スレ
636:デフォルトの名無しさん
07/09/10 14:01:37
すれ違い申し訳ありませんでした。
637:デフォルトの名無しさん
07/09/10 14:04:46
Cで構造体を初期化するとき {0}を代入するのと、memsetで0をセットすることの違いはなんでしょうか?
typedef struct tagAAA {
int a;
int b;
int c;
} AAA, * PAAA;
AAA aaa1 = {0};
AAA aaa2;
memset(&aaa2, 0, sizeof(AAA));
おしえてください。
638:デフォルトの名無しさん
07/09/10 14:27:28
浮動小数点型やポインタ型のビット表現がゼロとは限らない
639:デフォルトの名無しさん
07/09/10 14:38:39
>>638
memsetでもそれは同じではないの?
両方、構造体のサイズ分、0 でクリアされるとおもってるんだけど。
640:デフォルトの名無しさん
07/09/10 14:43:38
>>637
memsetで0をセットは百害あって一利なし。使わないほうがよい。
構造体を初期化したいときには、各々の構造体メンバー変数に対し、
決められた初期変数を代入すること。
memsetが唯一有効なのは、メモリーをバイナリーエディッターで除くとき。
反論↓↓↓
641:デフォルトの名無しさん
07/09/10 14:45:29
>>639
doubleの0x00000000は0.0と保障されているわけではない。
ということでしょ。
642:デフォルトの名無しさん
07/09/10 14:46:49
えーと↑↑↑
エディッターのあたりがよくわからない
643:デフォルトの名無しさん
07/09/10 14:50:06
初期化でBYTEレベルでALL 0 にしたい場合は、
= {0} での初期化と、 memset での初期化の違いはあるの?
① AAA aaa1 = {0};
② AAA aaa2; memset(&aaa2, 0, sizeof(AAA));
は同じことをしているのかということです。
644:デフォルトの名無しさん
07/09/10 15:17:06
構造体は知らないけど、配列の場合はコンパイルすると同じコードになるって前にみかけた気がする。
645:デフォルトの名無しさん
07/09/10 15:28:18
>>643
コンパイラによっては、{0}の方が、より最適化される可能性が高い。
646:デフォルトの名無しさん
07/09/10 15:29:45
>643
① graceful
② rude
647:デフォルトの名無しさん
07/09/10 15:58:29
指定の行の削除方法が分かりません
例えば下記のようなファイルがあり
あいう
あああ
いいい
ううう
これを「いいい」だけ削除して下記のようにしたいのですが、1行だけ削除するようなやり方がわかりません
あいう
あああ
ううう
やりかたをご教授いただけないでしょうか
648:デフォルトの名無しさん
07/09/10 15:59:05
サンプルとかみても memset のほうがおおい。
AAA aaa1 = {0}; とかで構造体を初期化しているのってほとんどみないような。
649:デフォルトの名無しさん
07/09/10 16:01:45
>>648
なんで、構造体を初期化する必要があるの?
構造体メンバーを初期化する必要はあると思うが、構造体全体の初期化はあまり意味がないだろう。
650:デフォルトの名無しさん
07/09/10 16:03:13
そもそも、初期値が0とは限らない。
651:デフォルトの名無しさん
07/09/10 16:04:28
windows api つかうときってmemsetで初期化することあるでしょ。
CRITICALSECTIONとか、RECTとか。いちいちメンバごとに初期値いれるソースとかみたことないよ。
いったん初期化してから個別に値いれることはあるけど。
652:デフォルトの名無しさん
07/09/10 16:11:33
① AAA aaa1 = {0};
② AAA aaa1; memset(&aaa1, 0, sizeof(AAA));
①=② FA?
653:デフォルトの名無しさん
07/09/10 16:18:14
={0} は浮動小数点やポインタも正しく 0.0 や NULL に初期化される。
memset で全ビットを 0 にする方法では、処理系によっては浮動小数点やポインタが 0.0 や NULL にならない場合がある。
①≠②
654:デフォルトの名無しさん
07/09/10 16:45:34
>>653
ありがとう。すっきりしました。
655:デフォルトの名無しさん
07/09/10 17:37:39
>>647
改行コードで区切って、消す行の後を違う領域に分けた後、消す行のところに繋げる
656:デフォルトの名無しさん
07/09/10 20:07:43
memsetで初期化のクセを覚えてしまうと、
C++のクラスのオブジェクトに対してもそれをやりそう。
657:デフォルトの名無しさん
07/09/10 20:45:13
コンストラクタがまさかのmemset呼び?
658:デフォルトの名無しさん
07/09/10 20:49:28
>>657
うちの連中ならやりそうだw
ところで、>>637のは
AAAA aaa1 = {}; //{0}の0省略
はできないの?C++の本に乗ってたんだけど、Cでも試したら出来てそうなんだけど。
659:デフォルトの名無しさん
07/09/10 21:05:36
>>658
エラー E2264 式が必要といわれた
@BCC5.5
660:デフォルトの名無しさん
07/09/10 21:06:25
>>658
C++ならできた。CL.EXE
661:デフォルトの名無しさん
07/09/10 21:09:58
>>658
ANSI C的には文法違反。
{}の中には少なくとも一つの式がいる。
662:658
07/09/10 22:42:45
>>659-661 なるほど。情報サンクス。
gccではc89,c99モードにしてやっても出来るみたいなんだけど、
c99はまだ完全なサポートではないし、ことさら制限する様なことはしないのかも。
jiscのサイトから拾ったC言語の文書では、省略可を表すopt記号が無かったからやはり省略不可みたい。
参考)URLリンク(www.jisc.go.jp)
663:デフォルトの名無しさん
07/09/10 22:49:09
Cを無料でダウンロード出来るトコなんてないですかそうですか
やっぱり電気屋とかで買うんですかね?
664:デフォルトの名無しさん
07/09/10 22:50:54
てめぇ~~~ら、一生に一度の俺の質問に答えてくれ!
どうしてC言語の勉強を始めたの?
665:デフォルトの名無しさん
07/09/10 22:52:24
日本語を無料でダウンロード出来るトコなんてないですかそうですか
やっぱり日本とかで買うんですかね?
666:663
07/09/10 23:11:01
>>665
楽しいか?
667:デフォルトの名無しさん
07/09/10 23:14:07
>>664
遊ぶのに理由がいるのかい?
668:デフォルトの名無しさん
07/09/10 23:17:54
>>667
遊びというのは個人的な理由。ではなぜ C言語を選んだ かの理由は???
669:デフォルトの名無しさん
07/09/10 23:19:06
>>667
君、そういうことを言ってしまうと、自分にとって遊びだからという理由で
なぜその遊びを選んだかの理由は関係ないじゃ~~んって無責任な人間になってしまうよ?
なぜなら、殺人を遊びに選んだら、なぜ殺人をしたんですか?という質問に対して
君は常に「遊びだから」という身勝手な言い訳をし続けることになるから。
670:デフォルトの名無しさん
07/09/10 23:19:58
身勝手かどうかは主観に依存するよな。
671:デフォルトの名無しさん
07/09/10 23:30:07
>>670
殺人を遊びという理由は身勝手。なんで殺人をしてしまったのか?
という理由が述べられていない。ただの愉快犯なら情状酌量の余地なし。
すぐさま死刑で良いでしょうw
672:デフォルトの名無しさん
07/09/10 23:31:01
>>670
要するにお前は理由もなくC言語をやっていたんだ。まぁあれだろ
通っていた学校でやらされた程度で、実は面白くないと?w
673:デフォルトの名無しさん
07/09/10 23:31:47
同意。身勝手かどうかを判断する客観的な主体は存在し得ない。
深読みしてみると質問の趣旨は、なぜ数あるプログラミング言語の中から
Cを選んだのか?ってことなんかな。つか複数使える人のほうが多いと思うがね。
674:デフォルトの名無しさん
07/09/10 23:34:14
>>664
単位取得に必要だったからやった
今も後悔はしていない
675:デフォルトの名無しさん
07/09/10 23:36:05
まぁ、普通に答えると始めたきっかけは高校でやらされたからに他ならない。
676:デフォルトの名無しさん
07/09/10 23:38:04
何も知らないころよく聞く言語名がCだったから、かなぁ
677:デフォルトの名無しさん
07/09/10 23:39:48
>>663
環境書かないと分からんだろが!
サンプルソースが欲しいのか
コンパイラが欲しいのか
何が欲しいのかもよく分からん
フリー
コンパイラ
URLリンク(www.google.co.jp)
678:デフォルトの名無しさん
07/09/10 23:42:10
>>677
>>665
679:デフォルトの名無しさん
07/09/10 23:43:09
>>664
きっかけは、情報処理技術者試験のためデス。
学校でFORTRAN習ったけど、当時自宅のMS-DOS環境で開発環境を入手できたのがCだった。
680:デフォルトの名無しさん
07/09/10 23:52:47
>>664
最初は高校でやったMS-BASIC(だったか?)によってプログラミングが楽しくなり
学校においてあった8ビットCPUのポケコンをさわり、欲しくなったので先生に頼んで取り寄せ、16ビットCPUのポケコンを購入
インタプリタで動作するCが組み込まれていてBASICより面白いと思う
大学で自分のPCを買えるようになってコンパイラ方式のCをはじめる
681:デフォルトの名無しさん
07/09/10 23:59:48
>>673
遊びこそ主観だろ、答えたくないバカは黙ってろよ。歩インポイントでお前を
名指しして質問されているわけじゃないだろ?w お前みたいな基地外にはむしろ聞いてないって。
それから、何が主観かなんてどうでも良いんだよ。理由がいえないなら黙ってろ
682:デフォルトの名無しさん
07/09/11 00:00:22
うひょっ、わけわからない入力をしてたw
歩インポイント > お前にピンポイント
683:デフォルトの名無しさん
07/09/11 00:05:49
動的に確保した領域の大きさってどうやったらわかりますか?
684:デフォルトの名無しさん
07/09/11 00:08:23
>>667
全員が全員、遊びでC言語をやっているわけじゃないと思うんだが?
勝手にC言語=遊びみたいなことを言うなよw
お前の場合は遊びに理由がって関係ない話をしているだけ。
お前にとっては遊びで始めたというのが理由であって、C言語は遊びじゃないぞ。
685:デフォルトの名無しさん
07/09/11 00:23:04
>>683
どこかに書いておけばいい
686:デフォルトの名無しさん
07/09/11 00:26:06
自転車置き(ry
687:デフォルトの名無しさん
07/09/11 00:26:39
int *a;
のとき、
aはポインタのアドレス
*aはポインタに格納された値
なんですよね?
じゃあ
&aだと何を表すんですか?
688:デフォルトの名無しさん
07/09/11 00:27:33
>aはポインタのアドレス
いいえ
689:デフォルトの名無しさん
07/09/11 00:28:22
じゃあなによ?
690:デフォルトの名無しさん
07/09/11 00:34:50
aはポインタ型の変数
また、&aはaという変数へのポインタ
691:デフォルトの名無しさん
07/09/11 00:34:52
ポインタ
692:デフォルトの名無しさん
07/09/11 01:01:04
>>687
*aはポインタが指し示すオブジェクト。とでもいった方がよいかな。
値といっても=の左辺になれる事を理解すること。
693:デフォルトの名無しさん
07/09/11 01:20:04
aは、int型のオブジェクトのアドレスを格納するポインタ型の変数=ポインタ。
*aはポインタが指し示すオブジェクト。
&aで、int型のポインタ変数aのアドレスを参照できる。
int a = 10;
int *p;
p = &a;
printf("aのアドレスは%p\n", p);
printf("aのアドレスは%p\n", &a);
printf("aの値は%d\n", *p);
printf("aのポインタのアドレスは%p\n", &p);
これであってますか?
694:デフォルトの名無しさん
07/09/11 01:25:53
おk
695:デフォルトの名無しさん
07/09/11 01:27:08
>>695
*p = 20;
などの操作をして、aの値を確認してみるのも良い。
696:695
07/09/11 01:28:16
ミスった
>>693ね。
697:687
07/09/11 01:39:59
なるほどよくわかりました
ありが㌧
698:デフォルトの名無しさん
07/09/11 02:53:25
コンパイラがVisual C++ 2005 Express Edisionでstring,hが開けないって出るんだけど何ででしょう?
定義は#include <string,h>って書いてるんですけど他に何か設定しないとダメですか?
699:デフォルトの名無しさん
07/09/11 02:56:20
string,hじゃなくてstring.hじゃないか?
700:デフォルトの名無しさん
07/09/11 02:57:25
×string,h
○string.h
というオチじゃないだろうな?
701:698
07/09/11 03:02:51
そ れ だ
メモに貼り付けてフォント変えたら違いが判った
ありがとう!
702:デフォルトの名無しさん
07/09/11 06:39:00
>>680
> 16ビットCPUのポケコンを購入
> インタプリタで動作するCが組み込まれていて
メーカー教えて
703:デフォルトの名無しさん
07/09/11 06:51:08
文字配列とポインタで質問です
char *str[]={”山田”、”井之上”、”御手洗”、”鈴木”};
とした場合
配列は
char
str[0][0]="山", str[0][1]="田", str[0][2]="\0", str[0][3]="\0"
str[1][0]="井", str[1][1]="之", str[1][2]="上", str[1][3]="\0"
str[2][0]="御", str[2][1]="手", str[2][2]="洗", str[2][3]="\0"
str[3][0]="鈴", str[3][1]="木", str[3][2]="\0", str[3][3]="\0"
str[4][0]="\0", str[4][1]="\0", str[4][2]="\0", str[3][3]="\0"
と自動で入って各行の配列の先頭のアドレスが*str[1]や*str[2]に入ってるんでしょうか
704:デフォルトの名無しさん
07/09/11 06:59:57
いいえ
705:デフォルトの名無しさん
07/09/11 07:04:34
という事は
> char *str[]={”山田”、”井之上”、”御手洗”、”鈴木”};
これはどういう状態でしょう?
706:デフォルトの名無しさん
07/09/11 07:06:51
文法エラーの状態です
707:デフォルトの名無しさん
07/09/11 07:10:23
本に載ってる型の定義をそのまま写してみたんですがorz
ちょっとそのまま書いてみて試してみます
708:デフォルトの名無しさん
07/09/11 07:12:47
全角/半角、クォーテーション/ダブルクォーテーションに注意
709:デフォルトの名無しさん
07/09/11 07:19:55
char *str[]={"山田","井之上","御手洗","鈴木"};
文法ってそっちでしたかorz
これでよろしいですか?
710:デフォルトの名無しさん
07/09/11 07:55:59
ちょっと眠気で頭が鈍くなってきたけど
山田、井之上、御手洗、鈴木はそれぞれメモリのどこかに書き込んで
*str[0]~[3]にはメモリのそれぞれの文字列の先頭アドレスが入ってるってことかな
711:デフォルトの名無しさん
07/09/11 08:18:26
>>710
str[0]~[3]にはメモリのそれぞれの文字列の先頭アドレスが入ってるってこと
だと思うよ
712:デフォルトの名無しさん
07/09/11 08:26:49
あぁそっか*をつけるとアドレス先の中身だっけ
まだ微妙に疑問点あるけどひとまず寝ます
頭が動いてないorz
ありがとう
713:デフォルトの名無しさん
07/09/11 13:47:31
文字列の質問です。
1から100の自然数を”1”から”100”という文字列に変換せよ
って問題ですけど、どんなプログラムになりますか?
714:デフォルトの名無しさん
07/09/11 13:53:24
for文で回してsprintf使うとか。
715:デフォルトの名無しさん
07/09/11 14:16:56
char** func()
{
int i,j = 0;
char *cp[100]={'\0'};
for(i = 0; i < 100; i++)
cp[i] = ( char *)malloc(sizeof(char)*4);
for(j = 0,i = 1; i <= 100; i++,j++)
sprintf(cp[j],"%d",i);
return cp;
}
716:デフォルトの名無しさん
07/09/11 14:46:08
そりゃないだろw
717:デフォルトの名無しさん
07/09/11 14:52:54
>>715
変数の寿命を…
718:デフォルトの名無しさん
07/09/11 15:50:26
>>715
さっきは適当に書いて張りました
以下ソース
char** func(char **cp, size_t n)
{
int i,j = 0;
for(i = 0; i < n; i++)
cp[i] = ( char *)malloc(sizeof(char)*4);
for(j = 0,i = 1; i <= 100; i++,j++)
sprintf(cp[j],"%d ",i);
return cp;
}
719:デフォルトの名無しさん
07/09/11 15:57:14
for(i = 0; i < 100; i++)
sprintf(cp[i],"%d ",i+1);
これでいいじゃん
720:デフォルトの名無しさん
07/09/11 16:08:13
>>718
nが配列のサイズならループの最大値100にすんな
引数で渡してる奴を戻り値にすんな
721:デフォルトの名無しさん
07/09/11 16:28:09
ポインタの100個の配列もmallocすればいいのだ
でも質問者は完全版を求めてるの?
722:718
07/09/11 16:29:51
>>720
たしかにそうだね
オナニーしようかしまいか迷ってる最中に
書き込んだクソソースなんで
あんま吟味しないでね
723:デフォルトの名無しさん
07/09/11 16:39:01
何かアプリケーションを作ろうと思ったらCとC++どっちがいい?
724:デフォルトの名無しさん
07/09/11 17:10:17
伺系アプリの間違いだと信じたい
725:デフォルトの名無しさん
07/09/11 17:57:45
>>702
また難儀な・・・
押入れから引っ張り出してきたよ
あ~なつかしぃい
CASIO PERSONAL COMPUTER FX-890P 16-bit CPU
(液晶の枠部分に書かれている文字)
しかもこれ専用(?)のフロッピーディスクドライブ&そして(確か)増設メモリまで買ってしまったはず
起動したらまだ動く(リチウム電池は空)
(スレチスマソ)
726:デフォルトの名無しさん
07/09/11 18:09:21
>>725
姉妹品?のZ-1ならもってた
捨てちゃったけど
727:デフォルトの名無しさん
07/09/11 18:17:14
>>726
これかな?
URLリンク(www5.plala.or.jp)
っていうかキー配列とか同じだ
FX-890Pの文字がZ-1になってるぐらい
728:デフォルトの名無しさん
07/09/11 19:04:06
bcc32を使っているのですが、c言語のソースプログラムのファイル名に、
list1-1.cのように「-」を使ってもいいのでしょうか?
729:デフォルトの名無しさん
07/09/11 19:06:40
いいよ
730:デフォルトの名無しさん
07/09/11 19:59:08
>>723
C++のほうがお勧めかな。
理由
C++を勉強すると、Cも勉強できる。
C++を知っているとJavaとかも簡単に理解できる。
731:デフォルトの名無しさん
07/09/11 20:39:29
C#
732:デフォルトの名無しさん
07/09/11 20:44:32
printfとputsはどっち使えばいいですか?
皆さんどっち使ってます?
733:デフォルトの名無しさん
07/09/11 20:48:28
>>732
用途による
734:デフォルトの名無しさん
07/09/11 20:50:23
>>732
使っているのは断然 printf だよ
printf を使うことで処理速度に問題が出るようなコードは書いてないから
735:デフォルトの名無しさん
07/09/11 20:58:22
賢いコンパイラは適当に最適化してくれるから、printfつかっとけ。
736:デフォルトの名無しさん
07/09/11 22:44:59
<double>
43 23
<apple>
100E+02 102E-8 102E-12
<leon>
23E+01 12E-02
<kon>
24 23.3
とかいうファイルからE表記の数値だけを抜き取るにはどうすればいいですかね?
737:736
07/09/11 22:45:47
<double>
43 23
<apple>
100E+02 102E-8 102E-12
<leon>
23E+01 12E-02
<kon>
24 23.3
とかかれたファイルからですね。ファイル名はlist.txtとしておきます。
738:デフォルトの名無しさん
07/09/11 22:52:38
>>737
// 使用法 a.exe < list.txt
#include<stdio.h>
#include<string.h>
int main(void)
{
char buf[100];
double value;
int pos;
while(scanf("%s", buf)==1)
{
if(strchr(buf, 'E')!=NULL)
if(sscanf(buf, "%le%n", &value, &pos)>=1)
if(buf[pos]=='\0')
printf("%e\n", value);;
}
return 0;
}
739:736
07/09/11 23:13:38
やってみます
740:736
07/09/11 23:14:44
ありがとうございます
741:デフォルトの名無しさん
07/09/11 23:16:58
(゚Д゚≡゚Д゚)エッナニナニ?
742:デフォルトの名無しさん
07/09/12 02:40:36
入力した文字を逆にして出力したいのですが
#include <stdio.h>
#include <string.h>
int rev (char *);
int main()
{
char str[100];
printf("文字を入力してください\n");
gets_s(str);
rev(str);
printf("逆にしたのはこれです\n");
printf(str);
return 0;
}
int rev (char *str)
{
int i=0;
char str2[100];
size_t len;
len=strlen(str);
while(len>=0){
str2[i]=str[len];
i++;
len--;
}
str=str2;
return 0;
}
743:デフォルトの名無しさん
07/09/12 02:41:11
なぜかlenのカウントも増えていくんですけど何処がおかしいですか?
744:デフォルトの名無しさん
07/09/12 02:49:36
>char str2[100];
>str=str2;
とりあえずこれはまずい
「C言語 スコープ」とかでぐぐれ
745:デフォルトの名無しさん
07/09/12 02:50:27
関数からの見える範囲でしたっけ
ちょっと調べてみます
746:問題
07/09/12 03:04:16
問題:ポインタで操作しなさい
char moji[] ="ABCDEF~XYZ"; /*最大文字26文字*/
char *pc;
pc=moji;
結果
moji:ABCDEF~XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
moji:ABCEF~XYZ
開始位置==>D
終了位置==>D
表示:D
moji:ABCDEF~XYZ
開始位置==>E
終了位置==>B
表示:EF~XYZAB
747:746の続き
07/09/12 03:05:46
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print(char* s, char* e)
{
printf("表示:");
for( ; s <= e ; s++ ) putchar(*s);
puts("");
}
int main(void)
{
char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *pc = moji, *pcstart, *pcend, start, end;
while(1) {
printf("moji:%s\n開始位置==>", moji); scanf("%c", &start);
printf("終了位置==>"); scanf("%c", &end);
pcstart = strchr(moji, start);
pcend = strchr(moji, end);
if( pcstart == NULL || pcend == NULL ) break;
if( pcstart <= pcend ) print(pcstart, pcend);
else print(pcend, pcstart);
}
}
この問題でどうしてもエラーが出るんですが何方かわかる方がいましたら教えてください
748:デフォルトの名無しさん
07/09/12 03:14:23
>>742
void rev(char *str)
{
int len = strlen(str);
int i;
char temp;
for(i = 0; i<len/2; i++)
{
temp = ary[i];
ary[i] = ary[len -i-1];
ary[len -i-1] = temp;
}
}
749:742
07/09/12 03:16:21
>>746
ちょ・・・ヒントかなぁって思って頑張って書いてたよorz
750:デフォルトの名無しさん
07/09/12 03:21:16
>>747
エラーってどんなエラー?
scanf("%c"~の挙動を理解してないとかそんなオチ?
751:742
07/09/12 03:26:59
>>748
sry[i]って初めて見るんですけどこれはなんでしょう?
参考に組ませて頂きます
752:742
07/09/12 03:27:42
×ary[i]
○ary[i]
でしたね
753:746の者です
07/09/12 03:29:31
警告 W8012 07.cpp 7: 符号付き値と符号なし値の比較(関数 MojiSearch(char *,char *) )
警告 W8012 07.cpp 8: 符号付き値と符号なし値の比較(関数 MojiSearch(char *,char *) )
警告 W8004 07.cpp 5: 'j' に代入した値は使われていない(関数 MojiSearch(char *,char *) )
↑がエラー内容です
6ヶ月ぶりにCに触れたんですが仕組みを忘れちゃってどう直せばいいのかわからなくなってしまったんですよ^^;
754:デフォルトの名無しさん
07/09/12 03:31:52
まずそのソースうpしる
>>747にMojiSearchなんて関数ないだろ
755:デフォルトの名無しさん
07/09/12 03:32:34
>>747
scanf実行後stdinには'\n'が残っていて
後のscanfが'\n'をとりこんでしまってる。
一応getc(stdin)で取り繕って変更したソース
の一部を載っける
int temp;
while(1) {
printf("moji:%s\n開始位置==>", moji);
scanf("%c", &start);
temp =getc(stdin);
printf("終了位置==>");
scanf("%c", &end);
temp =getc(stdin);
756:デフォルトの名無しさん
07/09/12 03:40:33
>>753
それはエラーじゃなくて警告って言うんだよ
757:デフォルトの名無しさん
07/09/12 04:30:43
>>753
signedとunsigned比較してんだろ
3つ目の警告は見たまんま
758:742
07/09/12 05:06:22
>>748
#include <stdio.h>
#include <string.h>
void rev (char *);
int main()
{
char str[100];
printf("文字を入力してください\n");
gets_s(str);
rev(str);
printf("逆にしたのはこれです\n");
printf(str);
return 0;
}
void rev (char *str)
{
int i=0,len=strlen(str);
char str2;
printf("文字の長さは%dです\n",len);
for(i=0;i<len/2;i++){
str2=str[i];
str[i]=str[len-i-1];
str[len-i-1]=str2;
}
}
ary[i]がまだ謎だけど出来たよ、ありがとう
759:746
07/09/12 10:35:45
自分で書いた方のソースがvoid rev (char *ary)だったんで
レス欄にコピペしたとき、「ああ、strか」と思い
aryの部分をstrに全部書き換えたつもりだったが
中途半端に書き換えちった
というわけ
760:デフォルトの名無しさん
07/09/12 10:48:01
警告を無視する奴は、とりあえず渓谷に行って来い
761:742
07/09/12 15:41:36
>>759
なるほど
あえて自分で考える事が出来たし結果オーライだったw
lenの-1も気づかなかったしなorz
スコープについてはまだ良くわかってないけど・・・
762:デフォルトの名無しさん
07/09/12 22:46:17
スマソ スコープについて調べろってのは勘違い
str2へのポインタを関数の外で使おうとしてるのかと思った
763:デフォルトの名無しさん
07/09/12 22:55:14
2点質問があります。
1.関数で配列全体を呼び出しもとに帰すにはどう記述すればよいのでしょうか?
例)a[0],a[1],a[2],a[3]といった、算出した値を配列要素としてではなく、配列全体をreturn文で返す
方法がわからずにおります。
2. 1+X+X^15で生成する疑似ランダムデータの作製法がわからずにおります。
どうかご教示願います。
764:デフォルトの名無しさん
07/09/12 22:58:17
>>763
マルチポストですか?
スレリンク(tech板:278番)
765:デフォルトの名無しさん
07/09/12 23:03:43
やさしいCを打ち込み終了し他の本も色々調べたのですが、
ポインタとかを理解するにはPICを勉強したほうが分かりやすいですか?
766:デフォルトの名無しさん
07/09/12 23:05:53
>>764
急いでいるのでマルチポストをしてしまいました。申し訳ございません。
767:デフォルトの名無しさん
07/09/12 23:07:33
>>765
問題をやった方が良い
768:デフォルトの名無しさん
07/09/12 23:31:22
>>764
大体、関連した話題を扱うスレッドには同じ人が見にきているものだ。
だからマルチポストするとすぐに見つかってしまう。しかも反感を買い回答が得られなくなる。
だから1箇所に投稿し、回答が得られるまで自分でも必死こいて調べるべし。
769:デフォルトの名無しさん
07/09/12 23:33:34
>>765
問題をやるのがいいな。
770:デフォルトの名無しさん
07/09/12 23:56:35
>>767,769
ありがとうございます。問題を解くことからはじめます。
771:デフォルトの名無しさん
07/09/13 02:41:58
>>771
宿題スレの問題をやってみるとか。
いろんな人が同じ問題を問いて解答も出してくれるので、
自分とここが違う、とか、これはこうやって実現するのか、とか、
いろいろ気づくところがあるかも知れないよ。
772:デフォルトの名無しさん
07/09/13 02:42:28
>>771は>>770にだよう。自分に言ってどうする。
773:デフォルトの名無しさん
07/09/13 02:49:26
標準ライブラリ関数を使わずに、コンソールに文字列を出力してみようと思い
システムコールのwriteを使ってみたつもりです。
#include <unistd.h>
int main(void) {
char s[] = "test\n";
write(1, s, sizeof(s));
return 0;
}
Cygwin の gcc 3.3.3 で、-ansi -Wall -pedantic -fno-builtin で
コンパイルできて、期待した動作になりました。
で、glibc-2.6.1の io/write.c を見ると
/*
続く
774:デフォルトの名無しさん
07/09/13 02:54:40
続き、少しインデントを変えています。
*/
#include <sysdep.h>
#include <errno.h>
#include <unistd.h>
#include <stddef.h>
ssize_t __libc_write (int fd, const void *buf, size_t nbytes)
{
if (nbytes == 0) return 0;
if (fd < 0) {__set_errno (EBADF); return -1;}
if (buf == NULL) {__set_errno (EINVAL); return -1;}
__set_errno (ENOSYS); return -1;
}
libc_hidden_def (__libc_write)
stub_warning (write)
weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)
#include <stub-tag.h>
write.c にはこれだけしかないのですが、
fd の値や *buf 内のデータなどは、どこで使われているんでしょうか?
たとえば buf は NULL とだけ比較していますが、
実際に fd に向かって buf を書き込む(?)処理は、どこでやっているんですか?
775:デフォルトの名無しさん
07/09/13 11:37:00
>>773
URLリンク(www.sixnine.net)
>Cygwin は glibc を提供しません。
>代わりに、同じ機能の大部分(全てではありません)を提供する newlib を使用します。
>glibc を Cygwin へ移植するのは難しいでしょう。
776:問題
07/09/13 11:59:26
何方か今から掲示する4問の問題が合ってるか教えてください(パソをメンテに出していて手元になくて調べられないんです^^;)
キーボードより表示開始文字と表示終了文字を入力し、開始~終了までの文字を表示しなさい
char moji[]="ABCDEF~XYZ"; /*大文字26文字*/
実行画面
moji:ABCDEF~XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
moji:ABCDEF~XYZ
開始位置==>D
終了位置==>D
表示:D
moji:ABCDEF~XYZ
開始位置==>E
終了位置==>B
表示:EF~XYZAB
777:776の答え
07/09/13 12:00:14
moji:ABCDEF~XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
778:776の答え(777ミスです)
07/09/13 12:01:06
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /*大文字26文字*/
char start, end, *p;
printf("moji:%s\n", moji);
printf("開始位置==>");
scanf("%c", &start);
fflush(stdin);
printf("終了位置==>");
scanf("%c", &end);
fflush(stdin);
if(!isalpha((int)start) || !isalpha(end)) return 1;
start = (char)toupper(start);
end = (char)toupper(end);
p = moji + start - 'A';
for(;;)
{
putchar(*p);
if(*p == end) break;
if(*(++p) == '\0') p = moji;
}
return 0;
}
779:問題2
07/09/13 12:04:11
文字列と削除文字列を入力し文字列中から削除文字を排除しなさい
実行画面
文字列入力(m1)==>ABCDEFAABCDABC
削除文字==>A
結果文字列(m2):BCDEFBCDBC
780:問題2の答え
07/09/13 12:05:38
#include <stdio.h>
#include <string.h>
#define MAX 256
int main(void)
{
char str[MAX],ch;
size_t sz_str,i;
printf("文字配列入力(m1)==>");
fgets(str,sizeof(str)/sizeof(str[0]),stdin);
sz_str=strlen(str);
printf("排除文字==>");
ch=getchar();
for(i=0; i<sz_str; i++) {
if(str[i]!=ch) putchar(str[i]);
}
return 0;
}
781:デフォルトの名無しさん
07/09/13 12:25:21
この形式の問題何回目だよwwwww
782:デフォルトの名無しさん
07/09/13 12:34:12
くだらん質問なんだけど
バッファサイズを256とか512みたいな16の倍数にしてるコードよく見るけど
そうするとどういう効果があるの?
783:デフォルトの名無しさん
07/09/13 12:34:49
単にキリがいいから使ってるだけ
784:デフォルトの名無しさん
07/09/13 13:12:50
どっちかっつうと2の乗数だが、キリが良いから
785:デフォルトの名無しさん
07/09/13 13:17:36
>>784
2の乗数っていうか、2の羃だね。
786:デフォルトの名無しさん
07/09/13 13:23:03
キリがいいからか
漏れもなんとなくキリがいいから使ってたよw
サソクス
787:デフォルトの名無しさん
07/09/13 13:33:44
文系グラマは100とか1000使うのかな
788:デフォルトの名無しさん
07/09/13 13:46:38
main関数の戻り値ってどういう時使うんですか?
789:デフォルトの名無しさん
07/09/13 13:55:42
>>788
コマンドインタプリタで該当プログラムの終了ステータスとして利用する。
790:デフォルトの名無しさん
07/09/13 15:03:30
>>788
他のプログラムから起動させたとき
791:デフォルトの名無しさん
07/09/13 16:22:48
>>788
#!/bin/sh
if ./a.out; then
echo "成功" # main が 0 を返した時
else
echo "失敗..." # main が 1 を返した時
fi
792:デフォルトの名無しさん
07/09/13 20:54:10
printf("%6.1f",123.45);
を実行すると
123.5
となるのはなぜですか?
123.4になぜなりませんか?
793:デフォルトの名無しさん
07/09/13 20:57:12
一つしたの桁を四捨五入するから。
794:デフォルトの名無しさん
07/09/13 21:01:27
>>793
thx
795:デフォルトの名無しさん
07/09/14 01:02:02
>>775
ありがとうございます。newlibですか。
ではCygwinはおいといて、>>774はglibcの実装についての質問とさせてください。
glibcのwrite.cで定義されている __libc_write の仮引数の使われ方について
なぜこの引数でfdへ書き込みがおこなわれるのでしょうか?
796:デフォルトの名無しさん
07/09/14 02:17:33
たぶんそのソースは実際にコンパイルされるコードじゃない。
システムコールをどうやって呼ぶかはOSやCPUによって異なるから、それはただのプレースホルダだろう。
ざっとみてみたところ、sysdeps/unix/syscalls.listからmake-syscalls.shで自動生成されるんじゃないかと思った。
でも複雑すぎて追いきれん。
実際に特定のターゲット向けにビルドしてみて、生成されたファイルを見なきゃ判らなさそう。
797:デフォルトの名無しさん
07/09/14 02:41:12
>>795
その関数はターゲット用のwrite()が存在しない場合に使われるダミー関数。
writeしても呼ばれない。
798:デフォルトの名無しさん
07/09/14 08:46:05
0: -19.312 -0.144 -0.996 1.412 -0.173 1.933 3.954 4.917 6.333 1.552
-1.515 -1.667 -0.151 0.230 -0.024 0.083 0.377 0.665 0.722 -0.195
-2.321 -1.814 -0.133 0.515 1.343 0.000
1: -19.304 -0.162 -1.799 4.184 1.255 -0.393 -0.335 0.469 1.268 -2.177
-2.390 0.198 -0.151 -0.086 0.111 0.100 0.038 1.462 0.937 -0.569
-0.975 -1.590 -0.486 -0.450 0.133 0.000
2: -18.166 -0.254 -0.178 1.909 2.438 6.705 5.126 -4.463 -0.205 2.752
1.499 4.116 -0.151 0.167 -0.024 -0.312 -0.069 1.179 0.724 -0.214
0.460 -0.921 0.742 0.284 -0.377 0.000
こうかかれたファイルから小数点のところだけ
とりだして二次元配列にいれるにはどうすればいいすかね?
小数点のところ26個あるんですけど。
799:デフォルトの名無しさん
07/09/14 09:33:40
コロンの後まで飛ばして読み込め
800:デフォルトの名無しさん
07/09/14 11:16:37
指定したパスに、ある拡張子のファイルが存在するか調べるために
_dos_findfirstを使用して、BCCでコンパイルしたら
> Warning W8053 2007-09-14_1.c 11: '_dos_findfirst(const signed char *,unsigned int,find_t *)'
> is obsolete in function main
という警告が出ました。obsoleteとは「旧式の、廃れた」という意味です。
これに代わるものはありますか?
801:デフォルトの名無しさん
07/09/14 11:26:11
>>800
dos.hの_dos_findfirst()か、_dos_xxxは古いわなあ。
io.hの_findfirst()でどうか。
802:デフォルトの名無しさん
07/09/14 11:32:30
>>801
なるほど、ありがとうございました。
803:デフォルトの名無しさん
07/09/14 14:01:30
ものすごく初歩的な質問で申し訳ありません。
C言語の入門書にそって勉強していたのですがすぐに躓いてしまいました。
hello worldを表示するソースファイルをコンパイルしようとしたのですが下のエラーが出てきてしまいました。
C:\cwork>bcc32 sample.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample.c:
エラー E2209 sample.c 2: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample.c 6: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
*** 1 errors in Compile ***
何かと思い検索してみて確認したのですが原因がわかりません。
なにか分かる方いらっしゃればアドバイスよろしくお願いします。
804:デフォルトの名無しさん
07/09/14 14:18:24
>>803
C:\borland\bcc55\Include\ の中にファイルはあるか?
インストールはどのファイルをどうやって実行した?
805:デフォルトの名無しさん
07/09/14 14:24:35
>>803
URLリンク(www.google.co.jp)
806:デフォルトの名無しさん
07/09/14 14:27:54
>>803
PATHを通してないんでしょうな、多分。
807:デフォルトの名無しさん
07/09/14 14:41:49
PATH通してなかったらbcc32自体出来ないだろ
808:デフォルトの名無しさん
07/09/14 14:55:56
オレもそう思った。
cfgもデフォルトだろうし、アップデート用のインストーラ使ったんじゃないかと予想。
809:デフォルトの名無しさん
07/09/14 15:13:25
皆様すばやいレスありがとうございます。
>>804様
C:\borland\bcc55\Includeの中にstdio.hはありました。
インストールはその入門書についてあるCDに収録されていた
freecommandlinetools2.exeというファイルを実行しました。
>>807様
Pathは通したつもりでいます。
入門書に書かれてあることをそのまま行っただけなので間違いないとは言い切れませんが。
810:デフォルトの名無しさん
07/09/14 15:20:23
C:\borland\bcc55\Bin に、
bcc32.cfg、ilink32.cfg はあるか?
テキストエディタで開いて、以下に設定されているか確認。無ければ以下のをそれぞれ保存
・bcc32.cfg
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
・ilink32.cfg
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
811:デフォルトの名無しさん
07/09/14 15:22:48
結局、インクルードパスか、、、cfgが確実だな
812:803
07/09/14 15:36:19
>>810様
bcc32.cfg、ilink32.cfg はC:\borland\bcc55\Binにあります。
bcc32.cfg、ilink32.cfg ともに;c:\Borland\Bcc55\lib\PSDK"の部分はありませんでした。
そこで;c:\Borland\Bcc55\lib\PSDK" を追加してみましたがやはりエラーでした。
813:デフォルトの名無しさん
07/09/14 15:36:28
>>807 >>808
知ったかぶるなら黙ってろ。お前らの頭じゃPATHの意味すらわかってなさそうだから。
814:デフォルトの名無しさん
07/09/14 15:39:02
>>812
面倒くさいんでこれ使っちゃいな
URLリンク(www.vector.co.jp)
815:デフォルトの名無しさん
07/09/14 15:41:25
>>812
どうしても嫌ならこれで
URLリンク(www.enri.go.jp)
816:デフォルトの名無しさん
07/09/14 15:43:39
>>807
カレントディレクトリをコンパイラのある場所に移動すりゃ良いんじゃね?
エラーメッセージから推測できるのは、必要なファイルのある場所の
設定がされていないということ。つまり、そういうことだ。
PATHが必要なものに設定されていればどうなるか、分かるよね?
817:デフォルトの名無しさん
07/09/14 15:43:57
>>813
おまえ、名指しで何か言うなら知ったかしないほうがいいぞ
PATHの意味を言ってみ?
818:デフォルトの名無しさん
07/09/14 15:44:54
>>816
>C:\cwork>bcc32 sample.c
>Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
この2つからPATHが通っているのは明白
819:デフォルトの名無しさん
07/09/14 15:46:34
>>817
味方にボールを送る事に決まってんだろうが
820:デフォルトの名無しさん
07/09/14 15:53:56
それはPASS
821:デフォルトの名無しさん
07/09/14 15:56:07
>>819
アホか
ヤマハの電動アシスト自転車の事だろ
822:803
07/09/14 15:57:16
>>814-815様
ありがとうございます。
試してみようと思います。
>>816様
ソースファイルを作成したc:\cworkというディレクトリに移動しているのですが、こういうことでしょうか?
823:803
07/09/14 16:10:52
>>814様のソフトをダウンロードして自動設定したら解決できました。
皆様お忙しいところくだらない質問に時間を割いていただき本当にありがとうございました。
824:デフォルトの名無しさん
07/09/14 16:13:02
結局、原因はなんだったんだろうな