C言語なら、俺に聞け! <9>

このエントリーをはてなブックマークに追加
1C言語ハッカー Kusakabe Youichi
おれは21才、9年間プログラムを一生懸命作ってきた。
あちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ C言語なら、オレに聞け! <8>
http://pc.2ch.net/test/read.cgi/tech/1005811510/l50
2ゲト(・∀・)
って何か2.3日真面目に仕事してたらえらい勢いですすんでるですね
3(・∀・)イイ:01/12/02 15:06
疑問に思ったんですが、printfがあればputsは必要ないのではないでしょうか?
それとprintfとputcharでは使用するメモリの領域が違うとかあるんですか?
4Kusakabe Youichi:01/12/02 15:08
>>1 C言語ハッカー Kusakabe Youichi wrote:
> おれは21才、9年間プログラムを一生懸命作ってきた。
> あちこちの言語に手を出したが結局極めたのはC言語だけだった。

これってようするにおちこぼれ? (^^;
5Kusakabe Youichi:01/12/02 15:21
>>3 (・∀・)イイ wrote:

> 疑問に思ったんですが、printfがあればputsは必要ないのではないでしょうか?

そういう人にとっては、「中華庖丁があれば、柳刃も出刃も菜切りもペティナイフ

いらない」んでしょうね :)
6デフォルトの名無しさん:01/12/02 15:23
(1)printf は\nをわざわざ入れてやらないと、改行しない。
puts は勝手に改行する。

(2)いろんな書式指定をするならprintf が便利だが、書式指定が特にないならputsを使えばよい。
7デフォルトの名無しさん:01/12/02 15:24
>>3
>それとprintfとputcharでは使用するメモリの領域が違うとかあるんですか?
混在して使っても、特に問題はないと思いますよ。
8(・∀・)イイ:01/12/02 15:30
>>6
やっぱりその程度の違いしかないんでしょうかね?

>>7
そうですか。やっぱり問題ないですか。ありがとうございます。
9(・∀・)イイ:01/12/02 15:40
>>5
悪いんですけど、質問に答える意思がないのならわざわざ書かなくてもいいです。
文句地味たことは必要ありません。
10newbieM:01/12/02 15:43
全スレで移動しろと勧告されたので
移動して再度質問させていただきます。

今ある特定のディレクトリの中のファイル名を比較して
リネームというようなソフトを作ろうと思っているんです。
つまりaっていうフォルダに
abc.txt
efg.txt
・・・・
ってあったとき
abc.txtをエービーシー.txt
efg.txtをイーエフジー.txt
という風に初めからあるリストと比較してリネームしたいんです。
ですが具体的にどのように書いたらいいかがわかりません。
どの命令を組み合わせるかおしえていただけないでしょうか?
OSはwin98です。
11newbieM:01/12/02 15:44
使ってるソフトはいちおうVC++6.0です。
>>11
Perlか何かででバッチファイルを書き出せば?
13デフォルトの名無しさん:01/12/02 15:48
>>10
windowsはディレクトリを開けないんだっけ?
とりあえずdir.hにfindfirst,findnextとかあったかな
あとstdio.hのrename

windowsではwindows.hのfindfirstfile,findnextfile
あたりだな
14(・∀・)イイ:01/12/02 15:54
構造体の宣言で
typedef struct TagPerson{
char *a
int d;
}Person;
と書くのと、
TagPerson{
char *a;
int d;
};
と書くのでの違いはなんなんでしょうか?
15Kusakabe Youichi:01/12/02 15:54
>>10 newbieM wrote:
> 今ある特定のディレクトリの中のファイル名を比較して
> リネームというようなソフトを作ろうと思っているんです。
> ですが具体的にどのように書いたらいいかがわかりません。
> どの命令を組み合わせるかおしえていただけないでしょうか?

man 5 rename
16(・∀・)イイ:01/12/02 15:57
ごめんなさい。14の訂正です。
構造体の宣言で
typedef struct TagPerson{
char *a
int d;
}Person;
と書くのと、
struct TagPerson{
char *a;
int d;
};
と書くのでの違いはなんなんでしょうか?
17Kusakabe Youichi:01/12/02 16:01
>>13 デフォルトの名無しさん wrote:
> >>10
> windowsはディレクトリを開けないんだっけ?
> とりあえずdir.hにfindfirst,findnextとかあったかな

Windows移植したopendirもころがってますね。
18デフォルトの名無しさん:01/12/02 16:02
>>16
そのまえに typedef の意味わかってる?
>>16
typedef使うと、タイプ量が減って楽。
20(・∀・)イイ:01/12/02 16:06
>>18
typedefの意味は知っています。ようは型定義でしょ?

struct TagPerson{
char *a;
int d;
};
でのグループ名はどこにいっちゃってるんでしょうか?
違いがよくわかりません。
21デフォルトの名無しさん:01/12/02 16:16
>>20
「グループ名」って、なんだったっけ?

a
typedef struct TagPerson Person;

の意味は分かる?
23Kusakabe Youichi:01/12/02 16:19
>>14 (・∀・)イイ" wrote:
> 構造体の宣言で
> typedef struct TagPerson{
> char *a
> int d;
> }Person;
> と書くのと、
> TagPerson{
> char *a;
> int d;
> };
> と書くのでの違いはなんなんでしょうか?

前者はtypedefしてるんですね。
struct TagPerson {char *a; int d;} Person;
typedef struct TagPerson;
と2つにわけてみればわかるでしょう。

また、2つに分けない場合、typedefした名前だけを使うなら、
タグ名はなくてもいいですね。

このへんは第7章にわかりやすく解説されています。
typedef struct TagPerson Person;
Person person;
person.a = "name";
person.d = 0;
---------------------------
struct TagPerson person;
person.a = "name";
person.d = 0;

わかる?
>>20
struct tagPerson1{...};
typedef struct tagPerson1{...} Person2;

int main()
{
struct tagPerson1 *p1;
Person2 *p2;

p1 = (struct tagPerson1 *)malloc(sizeof(struct tagPerson1));
p2 = (Person2 *)malloc(sizeof(Person2));
}


まぁ、実際にはmallocのも取り値はキャストしなくていいけどね。
26デフォルトの名無しさん:01/12/02 16:22
>>20
この疑問って、自分でコード書けば一発で分かる類のヤツだと思うが。
(それとも、なんか深い意味でもあるのか)
27デフォルトの名無しさん:01/12/02 16:24
>>20
struct TagPerson{
char *a;
int d;
};
で、TagPerson 型の構造体を宣言したら、後は
struct TagPerson suzuki;
で、 struct TagPerson 型の変数suzukiを宣言すればいいよ。
28Kusakabe Youichi:01/12/02 16:33
>>20 (・∀・)イイ wrote:

> >>18
> typedefの意味は知っています。ようは型定義でしょ?

実際には型定義ではないのだが、そうだと思っていても実害はほとんどないので
最初のうちはそう覚えておけばいいかも。

> struct TagPerson{
> char *a;
> int d;
> };
> でのグループ名はどこにいっちゃってるんでしょうか?

それに「グループ名」ってなんだ? 「構造体名」のこと?
日下部が厨房を吸い寄せててんのか?
前の800位から凄いなちょっと
さあ、誰の教え方が一番うまかったか(藁
>>9

あんた、「適材適所」って言葉も知らないでしょ ? C 言語の前に、「日本語」
覚えたら ?
32newbieM:01/12/02 17:00
/*rename.c*/

#include<stdio.h>

main()
{
char old[] = "借金帳.txt", new[] = "asdcz.txt";
rename( old, new );
}
みたいに作ってみました。ディレクトリからって言うのは
調べてみたんですけどやっぱり使い方わからなくて・・・
でもこれだと200個とか変換するのに
かなり書かなきゃいけませんよね?
そこで
借金帳.txt→asdcz.txt
の部分をリスト化してそれを使ってリネームしたらいいのかなと
思ったんですが・・・そういった場合はどうすればいいんでしょうか?
33:01/12/02 17:14
printf("逝ってよし");
>>32
名前リストをコンパイル時に確定してしまっていいのなら、これが楽かなぁ。

struct renlist {
  const char *rl_src;
  const char *rl_dst;
} renlist[] = {
  { "借金帳.txt", "asdcz.txt" },
  { "ノート.txt", "note.txt" },
  { NULL, NULL }  /* sentinel */
};

struct renlist *rp;
for (rp = &renlist[0]; rp->rl_src != NULL; ++rp)
  rename(rp->rl_src, rp->rl_dst);
めちゃめちゃ機能限定じゃん! (^∀^)ハハッ
>>35
Yup. シンプルで良いでしょ? (まぁ、実際には rename の戻り値ぐらいチェック
しないとアレだが)
37名無しだゴルァ:01/12/02 18:01
前スレで2分法やらの質問をしたものです。
簡単じゃねえかゴルァ!!
誰か答えてくれたっていいじゃないかゴルァ!!
ってもう出来たからいいけど・・・

以上、愚痴でした。
>>37
愚痴は sage でな。
------
Kusakabe 先生のスレ違い/意図不明な書き込みに対する苦情には専門のスレ
が用意されて いるので、ム板では書かないようにお願いします。そのような書き
込みにコメント をつけるのは、彼と一緒に一緒になって荒らし行為をし てるのと
変わりません。

日下部 陽一先生の隔離スレッド void ***
http://pc.2ch.net/test/read.cgi/prog/1006918877/

#同意も反論も不要。なんかあったら↑のスレで言ってくれ。
------
>>39
おまえの方がよっぽどウザイよ。
風紀委員やりたいなら、学校でやってろ。
>>40
オマエモナー
42(・∀・)イイ :01/12/02 20:14
typedef struct TagPerson{
char *a
int d;
}Person;
で、structの部分、TagPersonの部分、Personの部分をそれぞれなんていうんですか?
なんかこの前聞いた人と違うこと言ってて・・・
>>42
プログラミング言語Cの付録から。

TagPerson はタグ名
Person は typedef 名
44(・∀・)イイ:01/12/02 20:32
>>43
ありがとうございます。
struct TagPerson{
char *a;
int d;
};
こういうときは、どうやって使うんでしょうか?
>>44
アレだけみんながよってたかって教えてるのに全滅かい!
>>44
目的語が良く分からんけど、もしかして >>34 見ると解決したりします?
>>40
まあそう言うな。向こうじゃ全員ではないが
たいていの人間が同意してる。
彼も良かれと思ってやってることだ。
彼のkittyさを知らないわけでもないだろ。
48デフォルトの名無しさん:01/12/02 20:48
糞壁の書き込みに対する苦情には専門のスレ
が用意されているので、荒れないようにそこでレスしてください。
http://pc.2ch.net/test/read.cgi/prog/1006918877/
#同意も反論も不要です。何かあったら↑のスレでお願いします。
糞壁はカスです。みんなで力を合わせて排除しましょう。
(´-`).。oO(Kusakabeって自分の書いてる事面白いつもりなのかな)
>>48
言いたいとは良く分かる(やつのせいでお気に入りのスレが荒廃したし)。
だが、基本的にスレ違いな内容だから sage で書け。
>>48
言いたいことは良く分かる(やつのせいでお気に入りのスレが荒廃したし)。
だが、いちいち書かれるとはっきり言って鬱陶しい。10回に一回くらいの割合で書け。
52デフォルトの名無しさん:01/12/02 22:43
>>43
struct TagPerson{
char *a;
int d;
};
で、TagPerson 型の構造体を宣言したら、後は
 struct TagPerson suzuki;
で、 struct TagPerson 型の変数suzukiを宣言すればいいよ。
そしたら
*suzuki.a = 25
suzuki.d = 125
と代入できる。
53妊娠中:01/12/02 22:48
>>43
typedef struct{
char *a;
int d;
}chinpo;
でchinpo型ができますか?
54妊娠中:01/12/02 22:49
あちがえた。>>52
>>53
できる。
56デフォルトの名無しさん:01/12/02 23:03
C--言語はないんですか?
57デフォルトの名無しさん:01/12/02 23:04
C言語やる人はスタックをあまり気にしない人なのでしょうか。
また、構造体メンバのデータ位置もあまり気にしない人なのでしょうか。
>>57
気にしますよ。
>>57
人や環境による。
オレはかなりおおまか。
>>57
場合による。
組み込み系で、開発にPC上のエミュレータなんか使ってる場合、
バウンダリの扱いに気をつけて構造体使わないとハマる。

PCアプリ作る場合なら、ほとんど気にしない。
>>56
JAVAがそうです。
62デフォルトの名無しさん:01/12/03 00:20
十回乱数を求める時、
1、2、3、・・・10と並んで出る確率と
1、1、1、・・・1と全部1が出る確率は同じでしょうか?
>>62
それC言語関係ないんじゃ?
確率論的には同じじゃない?
>>62
rand()の実装についてききたいのか?
65デフォルトの名無しさん:01/12/03 00:32
>>56
C--あるよ
>>65

B言語?
67デフォルトの名無しさん:01/12/03 00:37
>>66
検索しろ
>>67

検索しろって言われてもな、--←これはキーワードとして見てくれないんだよ。
69デフォルトの名無しさん:01/12/03 00:45
7067:01/12/03 00:48
>>69

だめみたい・・・
多分--もキーワードとして見てくれているんだろうけど、Cと--を勝手に分けてしまっているんじゃないかな?

>>70

本当にあるんだね(笑)
面白い情報サンクス
72newbieM:01/12/03 01:38
>34さん
無事それを使ってできました!
今やっと250ほどのデータ打ち込み終わったところです。
ありがとうございました。
7362:01/12/03 07:29
重複しない乱数を取得する質問で、
過去に取得した値を調べて、同じのが無ければ決定する
方法が紹介されていましたが(どのスレだったか忘れました)。
これだと、なかなかループから抜けなくなるかもしれません。

よって、
0〜100の値を10個取得する場合、
配列A[101]にA[0]=0、A[1]=1、...と代入して、
最初は0〜100からランダムに一つ選び、その値を配列から削除し、配列の要素数を-1する。
次は、0〜99からランダムに一つ選び、.....
...
とやる方がいいかな? と思ったのです。

で、乱数関数が全部1を返した場合。
このやりかただと、求まる値は 1, 2, 3, ...となります。
わからなくなってきた・・・。

それより、ある値が出る確率は
(1/101) * (1/100) * (1/99) * .... * (1/92)
になるから・・。
74Kusakabe Youichi:01/12/03 07:33
In article >>73, 73 62 wrote:
> 重複しない乱数を取得する質問で、
> 過去に取得した値を調べて、同じのが無ければ決定する
> 方法が紹介されていましたが。

どろくさい方法ですよね:)

> これだと、なかなかループから抜けなくなるかもしれません。

数が増えるとかなり遅いですね。
(現実的にはたいがい有限時間内に終わっていますが^^)

> よって、
> 0〜100の値を10個取得する場合、
> 配列A[101]にA[0]=0、A[1]=1、...と代入して、
> 最初は0〜100からランダムに一つ選び、その値を配列から削除し、配列の要素数
を-1する。
> 次は、0〜99からランダムに一つ選び、.....
> ...
> とやる方がいいかな? と思ったのです。

それって意味ないような(^^;
75デフォルトの名無しさん:01/12/03 07:45
意味ないの意味が分からないよ。
乱数の範囲が大きくなると、配列のサイズがでかくなるので、
使えないって事?
76デフォルトの名無しさん:01/12/03 07:55
あらかじめ含めない値をランダムに求めておいて、並べ替えるやり方はどうですか?

たとえば、2を含めないと決めたら、
A[10] = {0, 1, 3, 4, ..., 9}
を作って、並べ替えるやり方。
77Kusakabe Youichi:01/12/03 07:57
In article >>75, 75 デフォルトの名無しさん
wrote:

> 意味ないの意味が分からないよ。
> 乱数の範囲が大きくなると、配列のサイズがでかくなるので、
> 使えないって事?

そうじゃなくって、要件を満たしていないのでは? っていう意味。
78デフォルトの名無しさん:01/12/03 07:59
#同意も反論も不要。なんかあったら↑のスレで言ってくれ。とか貼られそうな予感・・・・
79Kusakabe Youichi:01/12/03 08:03
In article >>76, 76 デフォルトの名無しさん
wrote:

> あらかじめ含めない値をランダムに求めておいて、並べ替えるやり方はどうです
か?
> たとえば、2を含めないと決めたら、
> A[10] = {0, 1, 3, 4, ..., 9}
> を作って、並べ替えるやり方。

ですから、その「あらかじめ含めない値をランダムに求めておいて」のところは
どうやるの? :)
>>62
結局何の確率が知りたいのかわかんない。

rand()関数の出目の確率なのか。
配列を使った自作関数での出目の確率なのか。
81デフォルトの名無しさん:01/12/03 09:21
>>79
自分なりに考えてやって見ました。
これで何点くらい、もらえますか?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define M 100 // 乱数の範囲
#define N 10 // 必要な乱数の範囲

int main()
{
 int table[M];
 int i;
 srand(clock());

 for( i = 0; i < M; i++ ) {
  table[i] = i;
 }

 for( i = 0; i < N; i++ ) {
  int r = rand() % M;
  int tmp = table[i];
  table[i] = table[r];
  table[r] = tmp;
 }

 for( i = 0; i < N; i++ ) {
  printf("%d ", table[i]);
 }
 printf("\n");

 return 0;
}
82デフォルトの名無しさん:01/12/03 09:35
符号付き整数を符号維持したまま右シフトするもっとも単純な方法って?
FAQには符号付き整数の右シフトは処理系依存と書いてあります。

#define RSHIFT(i,n) ((i>0?1:(-1))*(signed)(((unsigned)i)>>n))

こんな馬鹿みたいなのしか思いつかないのですが。
83デフォルトの名無しさん:01/12/03 09:40
sizeof(unsigned long) < sizeof(void *)
な処理系、あるいは両者のcastがうまくいかない処理系って
どんなのがありますか?規格では保証していないようですが。
84デフォルトの名無しさん:01/12/03 09:53
>>82
そのやりかた、あってる?
あと、FAQの何章に書いてありました?
見つからなかった(^^;
85デフォルトの名無しさん:01/12/03 09:55
>>82
いいんじゃないの?
それならcharでもintでもいけるし。たぶん。

最上位ビットを残して云々 って一瞬考えたけど
処理系にすげー依存しそうだしやめた。
>>85
マイナスのとき、処理がうまくいかないよ。
87Kusakabe Youichi:01/12/03 10:07
余談ですが、

In article >>81, 81 デフォルトの名無しさん
wrote:
>  for( i = 0; i < M; i++ ) {

こういうふうに「for」と「(」をはくっつける、
「(」と「)」の内側に空白を明けるっていうのは、
どこの影響だろう :)

括弧のフォントをデザインした人がかわいそうだ :)
88デフォルトの名無しさん:01/12/03 10:08
>>82 シフトせず、2で割る。 i /= (2 << n);
でも、そういうのはアセンブラで書いたほうが確実。
処理系依存部分は、処理系依存言語に任せる。これ最強。
89Kusakabe Youichi:01/12/03 10:09
In article >>82, 82 デフォルトの名無しさん
wrote:

> 符号付き整数を符号維持したまま右シフトするもっとも単純な方法って?

「>>>」 :-P

> FAQには符号付き整数の右シフトは処理系依存と書いてあります。
> #define RSHIFT(i,n) ((i>0?1:(-1))*(signed)(((unsigned)i)>>n))
> こんな馬鹿みたいなのしか思いつかないのですが。

unsignedにcastするか、負の場合だけ場合分けしてmaskを使うかでしょうね。
9082:01/12/03 10:11
>>84
すみません。処理系依存とは書いてないですね。
ですが Q20.15(書籍版ですが)に「負の数を右シフトすることは割算と
等しくない」とあります。

また、K&R第2版の253ページに「右シフトを負の数にした場合、結果は処
理系依存」という旨の文章があります。

>>84,86
思いきりまちがえてますね。失礼しました。

(ちょっとオリジナルFAQ&JIS本見る時間が無いので夜まで失礼します)
91デフォルトの名無しさん:01/12/03 10:15
なるほど、カニチャーハンには
右シフトしたときに処理系によって
0が入るのと符号がはいるのと両方ある
って書いてあるね

手元のだとP60だから、まあその辺
92デフォルトの名無しさん:01/12/03 10:17
>>89
>>> って古いコンパイラでもつかえる?
>>81
60点。確率が均等でない。
ためしにN=2でtable[0]が2になる確率を考えてみろ。

19,4c19,7
<   int r = rand() % M;
<   int tmp = table[i];
<   table[i] = table[r];
<   table[r] = tmp;
---
>   int r = rand() % (M - i);
>   if (r) {
>    int tmp = table[i];
>    r += i;
>    table[i] = table[r];
>    table[r] = tmp;
>   }
94Kusakabe Youichi:01/12/03 10:19
In article >>91, 91 デフォルトの名無しさん
wrote:
> なるほど、カニチャーハンには
> 右シフトしたときに処理系によって
> 0が入るのと符号がはいるのと両方あるって書いてあるね

私なら、「そこだけJavaやる」:) も。
なんでCには「>>>」がないんだろうね。
95Kusakabe Youichi:01/12/03 10:20
In article >>92, 92 デフォルトの名無しさん
wrote:

> >>89
> >>> って古いコンパイラでもつかえる?

いや、新しいのでも無理では?
>>94
> 私なら、「そこだけJavaやる」:) も。

もうね、アホかと。馬鹿かと。
97Kusakabe Youichi:01/12/03 10:23
In article >>96, 96 デフォルトの名無しさん
wrote:

> >>94
> > 私なら、「そこだけJavaやる」:) も。
>
> もうね、アホかと。馬鹿かと。

そんなにうれしいですか? :)
インラインアセンブラはあっても、インラインジャヴァはありません
99Kusakabe Youichi:01/12/03 10:35
In article >>98, 98 デフォルトの名無しさん
wrote:

> インラインアセンブラはあっても、インラインジャヴァはありません

あってもだれもつかわなそう:)
100てきとう:01/12/03 10:41
#define RSHIFT(i,n) (((i<0?1:0)*(~((unsigned)~0)>>n))|(i>>n))
101てきとう:01/12/03 10:43
(i<0?1:0) は 真偽値が 真:1 偽:0 でない処理系を考慮

かっこがおおいのはかんべんしてちょー ぷりぷり
>>94
> なんでCには「>>>」がないんだろうね。

Cは実行効率至上主義だから。
CPUの都合を考えて実行効率の良い方法でやっちゃって良いよって方針だから。
符号拡張しなけりゃならんとか決めたら、
そーゆー命令のないCPU上で実行効率が落ちるから、そーゆーのを嫌って。
103Marezo:01/12/03 11:20
#define RSHIFT(i,n) (signed)((unsigned)i&0x8000|((unsigned)i&0x7fff)>>n)
>>103
それnが2以上だと
105味噌醤油醸造株式会社:01/12/03 11:23
>>103
うちのPCだと、変な結果になります(T-T)
>>105
うん。間違ってるもん。
107初心者:01/12/03 11:31
C言語で画面の制御はどんな関数を使用するんですか?
画面上のラインとカラムを指定して、値の入力・出力ができるんでしょうか?
又、表形式で罫線をひいたりすることはできるんですか?

C言語入門の本は読んだのですが、上記の部分は載っていませんでした。
公開されているサンプルPGも調べてみたのですが、
(調査不足ならすいません)見つけることができませんでした。
教えてください。
>>107
ncursesのようなライブラリが用意されてれば
それを使うがいいし、もしなければ
機種依存上等!てな感じで
コントロールコードやエスケープシーケンスを駆使して
描画すればいいじゃん、って感じ
109初心者:01/12/03 11:43
グラフィック関数を使用するのですか?
>>109
絵を描きたいならそう言えよ。
111初心者:01/12/03 11:58
絵ではなくて、表なんですけど。
すいません。

本には一行単位で入出力が行なわれているんですが、
画面単位で特定の項目の内容を受け取りたい場合や
画面単位で項目名や注意書きを表示する方法が
無かったんです。
で、調べていくうちグラフィック関数の名前だけを知り
それで、表作成ができるのかなと思ってたんです。
112Kusakabe Youichi:01/12/03 12:00
In article >>102, 102 デフォルトの名無しさ
ん wrote:
> > なんでCには「>>>」がないんだろうね。
>
> Cは実行効率至上主義だから。
> CPUの都合を考えて実行効率の良い方法でやっちゃって良いよって方針だから。
> 符号拡張しなけりゃならんとか決めたら、
> そーゆー命令のないCPU上で実行効率が落ちるから、そーゆーのを嫌って。

でも、その割には1の補数とか、1命令でできないハードウェアもたまに
存在するのに、演算子はありますね。
>>112
たとえばどのハード?
そういうハードに出会ったこと無いので教えてほしい
RSHIFTって、ROTATEじゃなくて、あくまで符号付のままのSHIFTだろ。
>>82 のまんまでいいと思うけど。
115Kusakabe Youichi:01/12/03 12:21
In article >>107, 107 初心者 <[email protected]
yndns.org> wrote:

> C言語で画面の制御はどんな関数を使用するんですか?

環境依存でしょう。
-8を符号付で右シフトする例
11111000 -8
(unsigned)
00001000 8
>>1
00000100 4
符号復活
11111100 -4

あー>>82のままでいいのか。納得
117あぼーん:あぼーん
あぼーん
118Kusakabe Youichi:01/12/03 12:38
In article >>113, 113 デフォルトの名無しさ
ん wrote:

> >>112
> たとえばどのハード?
> そういうハードに出会ったこと無いので教えてほしい

正確には「ない」のではないかもしれないが、
メルコムとか、その上のCの処理系が履くコードをみてみると、
わざわざ数命令で実現しているので、「ない」のだと思ったが。
(そのマシン純正のfortranもそうだったのでたぶん本当にハード的にないんだと思
う)

まあ、「ないようなハードがいけない」といわれればそれまでだが、
だったら「>>>」も入れてくれてもいいのになーと思ったわけです。
119デフォルトの名無しさん:01/12/03 12:40
>>116
>あー>>82のままでいいのか。納得

printf("%d\n", RSHIFT(-8,1));
うちで実行すると結果はこうなります。
-2147483644

これで、いいんでしょうか?
(俺が勘違いしてるかのかな?)
>>118 (´Д`)
おいおい確認もしないで発言してたのかよ
>>119
>>100のはどうよ?
>>119
0x80000004 だな
なんかヘンテコリン
#define RSHIFT(i,n) (i>=0?i>>n:(signed)~(((unsigned)~i)>>n))
124デフォルトの名無しさん:01/12/03 12:49
>>121
printf("%d\n", RSHIFT(-8,1));
で結果は
-4
だった。
>>124
じゃあ>>100のが正解か
もうちっと短くならんかね?
>>123
それじゃあ、iが負のとき正になっちゃうんじゃないか?
127デフォルトの名無しさん:01/12/03 14:37
Cを習得するのにどれくらいかかった?
C++は?
VBは?
誰か教えて!
128123:01/12/03 14:49
>>126
10010010
↓反転
01101101
↓シフト
00110110
↓反転
11001001
129初心者:01/12/03 15:05
>>115

環境依存って、例えばエクセルやアクセスで画面展開して、
必要項目をテキストファイルでCで受け取る。
というような事ですか?
>>127
Cは二ヶ月。
C++は半年。
VBは一日。
131about:RSHIFT:01/12/03 15:20
最上位ビットが1かどうかを値が負かどうかで判定するのは
内部表現が2の補数であるという仮定に基づいていると
思いますが、この仮定って規格で保証されてましたっけ?
保証されていない場合、最上位ビットの判定は
n&~((~((unsigned)0))>>1)
でいいでしょうか?

この問題って、いかなる内部表現であれ、
2の補数表現の数を2で割ったようなビット操作を
エミュレートせよ、ってことなのかな。。
132デフォルトの名無しさん:01/12/03 15:56
こんな感じの変数を宣言した場合、関数に渡すときって
どんな感じでやればいいのでしょうか?

char *buf[4][8];

今は下みたいにしていて、コンパイルは通るけど
sub関数でmemcpyをして、その値を出そうとするとcoreを吐いてしまうのですが

void sub( char *[][] );
main(){
char *buf[4][8];
sub( buf );
}

sub( char buf[][8] ){
}
>>131
おおっと。たしかにそんな規定は無いかもしれないけど
内部表現が2の補数じゃないアーキテクチャって
どんな表現なのかな?
つーかビット演算って
>>132
main(){
char *buf[4][8];
sub( buf );
}

sub( char *buf[][8] ){
}

でいいんでないの?
実際には見たことないけど,内部に符号ビットがあって、
数値表現は全て正数表現っていうアーキテクチャが一部の
大型計算機にある(あった?)というのを聞いたことがある。
正か負は符号ビットで判断するんだって。
136Kusakabe Youichi:01/12/03 16:17
In article >>127, 127 デフォルトの名無しさ
ん wrote:

> Cを習得するのにどれくらいかかった?
3日
> C++は?
3週間
> VBは?
3version:)
137Kusakabe Youichi:01/12/03 16:28
In article >>132, 132 デフォルトの名無しさん wrote:

> こんな感じの変数を宣言した場合、関数に渡すときって
> どんな感じでやればいいのでしょうか?
>
> char *buf[4][8];

> 今は下みたいにしていて、コンパイルは通るけど
> sub関数でmemcpyをして、その値を出そうとするとcoreを吐いてしまうのですが
>
> void sub(char *[][]);
> sub(char buf[][8])

っていうか、よくコンパイル通りますねえ
138デフォルトの名無しさん:01/12/03 16:30
>>127
>Cを習得するのにどれくらいかかった?

一年くらいかかた。
COBOLをやってたから、最初は、ローカル変数とか引数ってのが
ビンとこなくて、変数は全部、ソースの先頭のところにグローバル
で使ってた。しかも仕事で。はっはっは!
>>132
>sub関数でmemcpyをして
なにやりたいのか,よくわからんのだけれど,
*buf[][]に、memcpyするってこと?
>>136-137
それはageなくちゃいけないような内容なのか?
ところで、右にシフトしたら数が小さくなる規定はあるんだろうか?
>>141
処理系依存じゃないか?
>>141-142
2進数表現を素直にマッピングできないような
アーキテクチャのマシンわざわざ作る奴いないだろ。
数字を左から書く文化圏でコンピュータが発明されていたなら
あったかもしれないけど。

数値にグレイコードとか使う変態マシンも理論上ありえるけど
アキュムレータが大変なことになりそう。
144デフォルトの名無しさん:01/12/03 18:47
Cの手っ取り早い環境はlcpadとlsicのみでいいですよね?
で、cpadのコンパイラパス入力すれば歓声〜〜、ですか?
145C初心者:01/12/03 20:01
K&Rを初めて購入したのですが、この本を使う上での注意点とかありますか?
>>145
破って尻を拭かないように。
>>141
右にシフトしたら数が小さくなる、んじゃなくて、
シフトして数が小さくなる方向が右、なんじゃない?
実際の環境で試しながら読む。
149C初心者:01/12/03 20:15
>>148
ありがとうございます。
他の本でK&Rをケチョンケチョンにこき下ろしてる記述(K&RはC言語を分かりづらくしている諸悪の根源とか)
があったりするのですが、実際どうなのでしょうか・・・・。
>>149
Cが分からないと言う奴はそもそもK&Rを読まない。
151C初心者:01/12/03 20:22
>>150
オレもそう思うんですけどね。。。
K&Rをこき下ろしてる本とは、これです。↓
http://www2.gihyo.co.jp/books/bookinfo.asp?ID=971
そう言う本は「処理系決め撃ち」で勝手な規格を作ってるんじゃないの?
だからintは4バイトだの、void mainだのって平気で書いちゃう
K&Rには未定義な動作は未定義と書いてるだけだから、そこは別途調べる必要が有ります
153C初心者:01/12/03 20:30
>>152
いや、この本はその辺はちゃんとしてます。
void main についてもわざわざ欄を設けて説明してありました。
でも、実際問題、あのポインタ表記はどうにかならんものかと思う。
155C初心者:01/12/03 20:33
>>154
と、言いますと?
>>151
ああ、あれか。K&Rの第五章を焼き直した本ね。

参考文献にK&Rが入っていないCの本は見たことない。
参考文献すら書いてない本は買うに値しない。

ちがう?
157C初心者:01/12/03 20:54
>>156
そんな、オレを責められても困りますよ。
158デフォルトの名無しさん:01/12/03 21:39
K&R、本屋で立ち読みした。
3分で吐き気がした。
コンピューターとは話せるが、まともな人間と普通のコミュニケーションが取れないヲタが文章を書くと、ああなるという、良い見本だった。
教育学の教科書にサンプルとして採用しようと思った。
もちろん、ダメな解説例として。

人にわかりやすく物事を教えるには、それなりに「教えるスキル」が必要だ。
カニチャーハンは、その辺がまったくわかっていない。
K&Rは、最後の一冊として読むべきだ。最初に読んではいけないし、勉強の途中で読んでもいけない。
ほとんど全部他の本を読み尽くして、C++に逝く直前に読むと良い。
159C初心者:01/12/03 21:43
>カニチャーハン
ワロタ!
160C初心者:01/12/03 21:45
うーん、K&R買わなければ良かったかなあ・・・(鬱
>>160
> うーん、K&R買わなければ良かったかなあ・・・(鬱
買っといて損はない。
K&Rが理解できればCの文法は理解したと思って良い。

あと、K&Rは規格書やマニュアルに近い書き方なので、
慣れていない人が読むと>>158のような感想を持つでしょう。
>>158
K&R はあくまで「Cの入門書」であって「プログラミングの入門書」でも教科書でも
ないからね。

基本的なプログラミング技術が身についていない人間が読むのは、ちょっと辛い。
身近に質問できる先輩とかいれば、どうにかなるけど。
163C初心者:01/12/03 22:08
>>161
なるほど・・・。
「解説書」ではなくて「規格書」「Cの定義文」みたいに接すれば有用だということですね?
164仕様書無しさん:01/12/03 22:10
>>158
プログラマー辞めてよし!
つか、日本語版訳が悪いから止めとけってばよ(藁
166C初心者:01/12/03 22:17
>>165
その話はよく聞きますね。
167デフォルトの名無しさん:01/12/03 22:23
じゃー漏れがもっとわかりやすく翻訳しなおしてやろうか?
あれって許可いるのか?
168C初心者:01/12/03 22:33
もちろん原著者の許可が要るでしょう。
169デフォルトの名無しさん:01/12/03 22:36
ヲイヲイCの文法理解すんのに大袈裟じゃないか?
170デフォルトの名無しさん:01/12/03 22:37
引用には許可は不要です。翻訳してもOK.
>>170
いや、引用でなくて、丸ごと一冊訳そうとたくらんどるんだけど。
172デフォルトの名無しさん:01/12/03 22:47
>>171
どっかスレ作って、そこでガンガン訳しちゃうってのはどう?
添削も出来るし。

まーこの際著作権は無視だな、ムシ
173デフォルトの名無しさん:01/12/03 22:48
親切な人がホームページにまとめてアップしてくれそうだし
なんならオレがその役をかってでてもいい
174デフォルトの名無しさん:01/12/03 22:49
煽ってるが、捕まるかもw
175デフォルトの名無しさん:01/12/03 23:12
しかし、あんなクソ訳を放置しておくというのも日本全体の利益にならんな。
役所が金出してくれればいいんだが。
176デフォルトの名無しさん:01/12/03 23:16
>>151
こきおろしている、というより「時代遅れな記述がある」と言っているんじゃ・・・
俺にはそう読めましたが。
(まあ、たしかにどうでもいいあげあしとりもありますが)
177Marezo:01/12/03 23:19
>>103
勘違いしていた(^^;
#define RSHIFT(i,n) i<0 ? (signed)!(!(unsigned)i >> n) : i >> n;

確か「!」はnotだったはず。
>>177
つーか負の表現に2の補数を使ってるところなら
>>100で完了してるんだけど、どうよ?
179デフォルトの名無しさん:01/12/03 23:30
関数をstatic宣言するのとしないのの違いを教えてください。

static void hoge();
void hoge();

returnした時に挙動が変わるようなのですが・・・・
よろしくお願いします。
180デフォルトの名無しさん:01/12/03 23:33
>179
外部から参照できる(static なし)かできないかの違い(static)
>>179
static にすると同一の翻訳単位 (厳密に言うと #include とかあるからアレなんだが、
基本的には同じ *.c に書いてある範囲)からしか呼び出せない。static にしないと、
外部からでも呼び出せる。

> returnした時に挙動が変わるようなのですが・・・・
それは static 変数と勘違いしてないか?
18282:01/12/03 23:47
どうも右シフトの元質問者です
なんだかお題の書き方が曖昧だったみたいですんません
割算をしたいという趣旨ではなくて、最上位ビット以外をシフトしたい
ということでした。てことでいろいろヒントをいただいた結果こんなん
になりました。

#define MASK ((~(unsigned)0)>>1)
#define RSHIFT(i,n) (signed)((i<0?(~MASK):0)|(((unsigned)i&MASK)>>n))

簡単にならんかな・・・
183179:01/12/03 23:47
レスありがとうございます。とても勉強になります。

returnした時の挙動というのは具体的に言うとこういう事です。

static void alarm(int);

int connect(int a, int b)
{
...A
signal(SIGALRM, alarm);
...B
}

alarm(int signo)
{
return;
}

とあった時SIGALRMシグナルが呼び出されてalarm関数に飛んだ後
returnで一気にconnectへ帰って...Bの領域を実行して無いようなのですが・・・

アドバイスよろしくお願いします。
18482:01/12/03 23:49
あれ、だめだな(^^;
18582:01/12/03 23:50
いや、やっぱり正しいか<aho
>>179
OSは
187デフォルトの名無しさん:01/12/04 00:02
そもそも、signalの使い方を誤解している
188説明より手を動かした方が理解できるだろ:01/12/04 00:06
Unixなの?
まず下記のような2つのファイルを作って
% cc -o main a.c b.c
としろ。エラーが出るだろ。
次にstaticを除いて同じことをしてみろ。エラーが出ないだろ。
外から参照できないってのはつまりこういうこと。

a.c
---
extern void func();
int main() {
func();
}
---

b.c
---
static void func () {
}
---
189179:01/12/04 00:09
引き続きレスありがとうございます。
static宣言するメリットというのは外から参照できないというのに尽きるのでしょうか?
>>182
#define RSHIFT(i,n) (signed)(((unsigned)i&MASK)|(((unsigned)i)>>n))
これダメかな
(unsigned)→(signed)が処理系依存なんで
厳密にはどうしようもない気もしますが…。
191179:01/12/04 00:22
ソース見つけました。
http://www4.big.or.jp/~kanai/data/unpv12e/lib/connect_timeo.c


connect_alarm(int signo)
{
return; /* just interrupt the connect() */
}
のreturnの役割がわからないです。
これはただ呼び出し元に戻るだけではないのでしょうか?
>>191
んー…。これってさ alarm() でエラーハンドラに飛ぶ仕掛けが
あるから、ダミーのやつ入れて意図的に処理しないように
してるんじゃないかな。全体見てないのでよくわかりませんけどね…。
>>183
それはstaticをつけるかどうかによって挙動が変化してるのか?

>>191
returnに意味はないでしょう。
>>182
負の数を右シフトしたとき、最上位以外の左には、0を詰めたいの?
195Kusakabe Youichi:01/12/04 00:54
In article >>145, 145 C初心者 wrote:

> K&Rを初めて購入したのですが、この本を使う上での注意点とかありますか?

訳本の場合は「誤植に注意」かな。
不審な箇所があったら原書と見比べよう。
196Kusakabe Youichi:01/12/04 00:56
In article >>149, 149 C初心者 wrote:
> 他の本でK&Rをケチョンケチョンにこき下ろしてる記述
(K&RはC言語を分かりづらくしている諸悪の根源とか)
> があったりするのですが、実際どうなのでしょうか

デマですね。その本を「わかりやすいいい本だ」と薦められて、
それなのにその本を理解できなかった馬鹿が、
「自分の理解力に問題がある」ことを認めたくないがために、
事実のほうをねじ曲げて「わかりにくい本だ」ということにしようとしたのでしょう。
コイツは、ニセカベですね。いずれにしても無視だが。
198Kusakabe Youichi:01/12/04 00:58
In article >>153, 153 C初心者 wrote:

> >>152
> いや、この本はその辺はちゃんとしてます。
> void main についてもわざわざ欄を設けて説明してありました。

どう書いてありましたか? :)
199Kusakabe Youichi:01/12/04 00:59
In article >>158, 158 デフォルトの名無しさん wrote:
> 人にわかりやすく物事を教えるには、それなりに「教えるスキル」が必要だ。

カーニハン氏はその点もうしぶんないですね。
200Kusakabe Youichi:01/12/04 00:59
In article >>162, 162 デフォルトの名無しさん wrote:

> >>158
> K&R はあくまで「Cの入門書(I?C任△辰董屮廛蹈哀薀潺鵐阿瞭?ハ臀?(I?C任盒飢塀颪任發覆い?C蕕諭」

え? よくできた「入門書」だと思いますけどねえ。
201Kusakabe Youichi:01/12/04 01:00
In article >>163, 163 C初心者 wrote:

> >>161
> なるほど・・・。
> 「解説書」ではなくて「規格書」「Cの定義文」みたいに接すれば有用だということですね?

厳密性に欠けるので「規格書」や「定義」ではないですね。
「Cの入門書」「解説書」っていうのが正しい。
202Kusakabe Youichi:01/12/04 01:00
In article >>165, 165 デフォルトの名無しさん wrote:

> つか、日本語版訳が悪いから止めとけってばよ

そうですね誤訳や誤植が多いです。
英語読めるひとはなるべく原書を読みましょう。
203Kusakabe Youichi:01/12/04 01:01
In article >>167, 167 デフォルトの名無しさん wrote:

> じゃー漏れがもっとわかりやすく翻訳しなおしてやろうか?
> あれって許可いるのか?

翻訳するのはかまわないですが、それを出版するには翻訳権の問題が
ありますね > 2次著作を出版
204Kusakabe Youichi:01/12/04 01:01
In article >>170, 170 デフォルトの名無しさん wrote:

> 引用には許可は不要です。翻訳してもOK.

こういうデマを本気にしないようにね。
偽のほうが、まともなこと書いてるわ(藁
206デフォルトの名無しさん:01/12/04 01:07
>>77
 int A[100] = {0, 1, 2, 3, ... 99};
 int B[10];
 int index;

 for(i = 0; i < 10; i++)
 {
  index := random(100 - i);
  B[i] := A[index];

  // indexより右にある要素を左にずらす。
  if (index < 99 - i)
  {
   memmove(&A[index], &A[index + 1], 99 - i - index);
  }

 }

要件を満たしていませんか?

>>80
>結局何の確率が知りたいのかわかんない。

どこかに0-99までの値で重複しない乱数を10個取得する方法があるとすると、
その方法(方法1)と、上の方法(方法2)が同じ結果を出す確率です。

例えば結果が、1, 2, 3, ...となった場合、
方法2では、random(100 - i)が全部1を返した事になります。

そこで、方法1がデタラメに値を出して1, 2, 3...となった確率と
random(100 - i) が全部1 を返した確率は同じか?と思ったのでした。

randomは真の乱数を返すとします。
ここでは関数の実装方法による出目の確率は問題にしません。
はじまったか。

K&Rは開発者なので、K&R本が良い悪いとか教育者として
どうこういう話は俺もなんだか的外れな印象を受けますね。
208あぼーん:あぼーん
あぼーん
>>190
unsignedが処理系依存なら、abs()使えば?
210デフォルトの名無しさん:01/12/04 01:10
第五款 著作権の制限(引用)
第三十二条 公表された著作物は、引用して利用することができる。
この場合において、その引用は、公正な慣行に合致するものであり、
かつ、報道、批評、研究その他の引用の目的上正当な範囲内で行なわれる
ものでなければならない
デマですね。その本を「わかりやすいいい本だ」と薦めて、
それなのにその本は実は悪書だと理解していない馬鹿が、
「自分の理解力に問題がある」ことを認めたくないがために、
事実のほうをねじ曲げて「わかりやすい本だ」ということにしようとしたのでしょう。
>>209
んー… abs() をどう使うのか思いつかない。
おしえて。
>>212
#define RSHIFT(i,n) (signed)((i<0?(~MASK):0)|((abs(i)&MASK)>>n))
では、だめか?
214デフォルトの名無しさん:01/12/04 01:22
わかりやすいといっているのは
わかりやすかったからわかりやすいというのではなく
わかりやすくなかったのにわかりやすかったといわないと
わからないばかだとおもわれるから
わかりやすいといっているわけですよ
215Kusakabe Youichi:01/12/04 01:23
In article >>189, 189 179 wrote:

> 引き続きレスありがとうございます。
> static宣言するメリットというのは外から参照できないというのに尽きるのでしょうか?

178ペイジと254ペイジに解説してありますよ。
>>213
なるほどー。1の補数と2の補数でもOK?
ビットパターンが変わりそうなんだけど…
217206:01/12/04 01:28
>どこかに0-99までの値で重複しない乱数を10個取得する方法があるとすると、
これも一つ値が決まると、次は99種類の値から選ぶ事になるので、
確率は同じ。

>>206のやりかたで問題ない。

求める個数が少なく、randomの範囲が大きい場合、配列の大きさがもったいないので、
その時は日下部法を使えばいいかな。

求める個数とrandomの範囲が大きく、かつ近い場合は206のやり方がいい。
求める個数が多い(=配列Bが大きい)ので配列Aの大きさは問題無し。
218仕様書無しさん:01/12/04 01:32
>>216
つーか、>>182 が、「最上位ビット以外をシフトしたい」と
言ってる意味がわからんのよ、俺。
左から0詰めたいのか、1詰めたいのか(負の場合)。
219Kusakabe Youichi:01/12/04 01:32
In article >>207, 207 デフォルトの名無しさん wrote:

> はじまったか。
>
> K&Rは開発者なので、K&R本が良い悪いとか教育者として
> どうこういう話は俺もなんだか的外れな印象を受けますね。

っていうかカーニハンは教え方上手いですよね。
220Kusakabe Youichi:01/12/04 01:33
In article >>208, 208 デフォルトの名無しさん wrote:
> おこずかいの欲しい女の子募集!!

221Kusakabe Youichi:01/12/04 01:33
In article >>209, 209 デフォルトの名無しさん wrote:

> >>190
> unsignedが処理系依存なら、abs()使えば?

...
>>221
(unsigned char)(-1)
1 ? 255 ?
>>218
俺もよくわからんです。(w
算術シフトみたいなのをイメージしたんだけど、負数の表現方法で
ビットパターンそのものが違うから、最上位ビット以外シフトに
どういう意味があるのか俺はよくわかってなかったりする。(w
224206:01/12/04 01:41
無視しないでよ。
個人的にはK&Rは辞書代わりに使ってました(ます)。
本当は規格書を参照した方がいいのでしょうけど。。

なお、K&Rの正誤表なるものがベクターにありました。
内容は未確認ですが。。
最近のK&Rは正誤表どおりに直ってる

けどまだちょっと違うとの声
>>4がわからん。 1とは別人なのかな??
228Kusakabe Youichi:01/12/04 02:05
In article >>225, 225 デフォルトの名無しさん wrote:

> 個人的にはK&Rは辞書代わりに使ってました(ます)。
> 本当は規格書を参照した方がいいのでしょうけど。。

主にどんなことを調べていましたか?
演算子の結合の優先順序?
>>227
1 の名前はネタ。本物の Kusakabe Youichi は煽りのプロ、かつスレ違いな話を
age で延々と続けるので、相手にしないことが推奨されてます。また騙りも多く、
Kusakabe Youichi 名義の人間を相手にした結果、荒廃したスレッドは数知れず。

ただし、本物の Kusakabe Youichi は煽りのプロとはいえ、技術的には「それなり
に分かってる」人なので、まっとうな返事をもらったら感謝しておきましょう。スレ
違いなツッコミを受けたら、はらわたが煮え繰り返っても相手にせず無視しましょ
う。

#スレを読んでる人には、どっちがバカかは論争せずとも分かってます。

Kusakabe Youichi について、これ以上の詳しいことはプログラマー板の自治スレ
や隔離スレを読んで悟ってください。
230206:01/12/04 02:24
私が無視されるのって、もしかして日下部さんの痛い所を突いたからですか?
ごめんなさい、あやまります。
231Kusakabe Youichi:01/12/04 02:32
In article >>230, 230 206 wrote:

> 私が無視されるのって、もしかして日下部さんの痛い所を突いたからですか?

え、どの発言ですか? > 無視された
232206:01/12/04 02:39
>>231の発言に私は答えるべきでしょうか? それとも無視するべきでしょうか?
>>229さん、教えて下さい!
233デフォルトの名無しさん:01/12/04 03:04
自分の発言くらい自分で判断しろ!
234Kusakabe Youichi :01/12/04 03:18
あ、俺どうしようもなくキチガイだから。
>>232
痛い/痛くないは技術的な話から逸れそうだから、続きはこっちでやれば?

日下部 陽一先生の隔離スレッド void ***
http://pc.2ch.net/test/read.cgi/prog/1006918877/
くだらない事ですが、、文字配列の添え字アクセスについてです

main()
{
  FILE *fp = NULL;
  char *buf = NULL;  /* 行バッファです */
  size_t size = 10240;/* バッファのサイズです */

  /* ファイルをオープンします */
  buf=(char *)malloc(size);
  memset(buf,'\0',size);/* 塗りつぶしておきます */
  while(fgets(buf,size,fp)){
    if(buf[size-3] != '\0')/* ←←ここです! *//* 行の最後まで読めなかった */
      /* 領域を拡張して読み直します */
    else
      printf("%s",buf);
  } 
}
この[size-3]の添え字計算はマズイと言うか最適化されませんか?
char *chkptr = size - 3;として
buf[size-3] の変わりに *chkptr とした方が良いでしょうか
reallocしてアドレスが変わる可能性が有るから、最適化出来ないのかなぁ・・・
とか勝手に思ってるんですが、
と言うかこのやり方馬鹿ですか? (汗
うわっ間違えました!!
char *chkptr;
chkptr = buf + sizeof(char)*(size - 3);
です 、、
238デフォルトの名無しさん:01/12/04 06:47
>>236
どういう書き方をすると、速くなるかは実際にコンパイルするまで
分かりません。
工夫した書き方で、逆に遅くなることもあります。

その例だと、どちらが速くなっても、わずかな差しかないと
思うので、自分が「素直」だと思う書き方が良いと思いますよ。

スピード重要で少しでも早くしたいときは、ソースで判断せずに、
実際に実行させて、計測してください。
239デフォルトの名無しさん:01/12/04 06:50
>>237
>chkptr = buf + sizeof(char)*(size - 3);

この sizeof はいりません。
charだから動いているけど、それ以外の型だと、このコードは
正常にうごきませんね。
まず判定方法を改めろ。fgetsの返値を使うとかな。
最適化を語るのは、それからの話だ。
241236 :01/12/04 07:24
間違えてるじゃん、、ううっ、皆さん有難う御座います。
>>238
気にする程でも無いですか、そう言われると気にならなくなって来ました
当分は-O3様にお任せしますです。
>>239
ぎゃっ、すいません。キャストか良く分かっていないです。。。
>>240
戻り値はこの場合だとbufですよね、、でもif(buf=fgets(buf,size,fp))とか
すると開放する時に if(buf);free(buf); って出来なくなるし。。。
取り合えず変なやり方と言う事ですよね。うーん
242236:01/12/04 07:27
もう間違えまくり(鬱
キャストか → キャストとか
if(buf=fgets(buf,size,fp)) → if((buf=fgets(buf,size,fp))!=NULL)
逝ってきます
243Kusakabe Youichi:01/12/04 07:30
In article >>236, 236 デフォルトの名無しさん wrote:
>   FILE *fp = NULL;
>   char *buf = NULL;  /* 行バッファです */

意味のない初期化ですね。

>   size_t size = 10240;/* バッファのサイズです */

変数に入れなくてもいいのでは?

>   buf=(char *)malloc(size);

エラーチェックぐらいしておけば?

>   memset(buf,'\0',size);/* 塗りつぶしておきます */

何の意味があるの? (末尾だけじゃだめなの?)

>     if(buf[size-3] != '\0')/* ←←ここです! *//* 行の最後まで読めなかった */
>       /* 領域を拡張して読み直します */

じゃあ1行が数ギガバイトあったらそこまで拡張するのでしょうか?

> この[size-3]の添え字計算はマズイと言うか最適化されませんか?
> char *chkptr = size - 3;として

なぜ-3なの? -1 じゃなくて?
244Kusakabe Youichi:01/12/04 07:30
In article >>240, 240 デフォルトの名無しさん wrote:

> まず判定方法を改めろ。fgetsの返値を使うとかな。

どう使うのでしょうか? :)
245Kusakabe Youichi:01/12/04 07:38
In article >>243, 243 Kusakabe Youichi <[email protected]> wrote:
> >   memset(buf,'\0',size);/* 塗りつぶしておきます */
> 何の意味があるの? (末尾だけじゃだめなの?)

っていうか末尾の1つ前か

> > この[size-3]の添え字計算はマズイと言うか最適化されませんか?
> > char *chkptr = size - 3;として
>
> なぜ-3なの? -1 じゃなくて?

-2かな。
246236:01/12/04 07:50
>>Kusakabe Youichiさん 有難う御座います。
>意味のない初期化ですね。
はい、厨房です、bufに付いては後でfreeする時に怖いので(勘違い?)(鬱
>変数に入れなくてもいいのでは?
/* 領域を拡張して読み直します */ の部分が
bufExpansion(&buf,&size,fp);とかになっとります(鬱
>じゃあ1行が数ギガバイトあったらそこまで拡張するのでしょうか?
力の限り(鬱
>なぜ-3なの? -1 じゃなくて?
end of string\n\0というパターンを考えました(鬱

何かスレのレベル下げまくりみたいなんで山に帰ります。
謝謝了。
247Kusakabe Youichi:01/12/04 07:59
In article >>246, 246 236 wrote:
> > 意味のない初期化ですね。
> はい、厨房です、bufに付いては後でfreeする時に怖いので(勘違い?)

はい勘違いですね。逆に言えばNULLをfreeしたときの挙動は
標準規格では未定義だったように記憶しています。
(少なくとも標準規格以前のBSD(VAXとか)ではfree(NULL)したときには
何も起きませんでしたが、SystemV系のではfree(NULL)するとSegmantation Fault
でコアダンプするものがほとんどでしたよ)

> > 変数に入れなくてもいいのでは?
> /* 領域を拡張して読み直します */ の部分が
> bufExpansion(&buf,&size,fp);とかになっとります

なるほど。だったら変数にすることはかまわないですが、
最初に変数に与える数値は#defineしておきましょうね。
あと、そのbufExpansionですが、reallocとか使っているのでしょうか?
fpを渡しているのはなぜでしょう?
もしかして中でfgets()を呼んでいる?
だとしたら「関数のまとめる」ために切る部分を誤っているような。

# 一般に言って、やたらと引数が多くなったり、アドレスを渡す引数が多くなる
# ような関数分けはどこか間違っていることが多いです。

> > じゃあ1行が数ギガバイトあったらそこまで拡張するのでしょうか?
> 力の限り(鬱

> > なぜ-3なの? -1 じゃなくて?
> end of string\n\0というパターンを考えました(鬱

え? でも「\n」だったら「\0ではない」のだからいいのでは?
if(baz)
free(baz);
で破棄した時にbazにゴミが入ってたらヤバイっつってんだろ
魔板でレスするなって怒られてるんだけどな B -)
249Kusakabe Youichi:01/12/04 08:19
In article >>248, 248 デフォルトの名無しさん wrote:

> if(baz)
> free(baz);
> で破棄した時にbazにゴミが入ってたらヤバイっつってんだろ

この馬鹿理解してないみたい(^^;

つまり、ifでNULLだけどけてみたり、freeでゴミが入ってるかもしれない
なんていうコードの書き方ってのは「場当たり的すぎ」だという意味です。
(「予防的プログラミング」に似ているがその実が違う)
実の無い会話だね
251デフォルトの名無しさん:01/12/04 08:50
つくづくこのオッサンは口だけだと思ってしまう
アホが書いたランダム爆撃コードを良く退治させてもらったもんだが
多分アンタの本読んだんだろね p
素人には難しいかもしれないが、コーダーってのは色んなレベルの寄せ集め
なんだよ、もし話が理解出来なくて気を悪くしたならすまないね。
252Kusakabe Youichi:01/12/04 08:54
In article >>251, 251 デフォルトの名無しさん wrote:

> つくづくこのオッサンは口だけだと思ってしまう

「思ってしまう」->「思いたい」ですかね。

> アホが書いたランダム爆撃コードを良く退治させてもらったもんだが
> 多分アンタの本読んだんだろね p

11月12日発売でした。

> 素人には難しいかもしれないが、コーダーってのは色んなレベルの

とか偉そうに言うやつにかぎってしょーもないコード書くのよね:)
少なくともANSIの規格上ではfree(NULL)は何も起きないことが
保証されているはず。
どっかのタコな実装は知らん。
>11月12日発売でした。
そりゃ良かったよ、色んな意味でね
>とか偉そうに言うやつにかぎってしょーもないコード書くのよね:)
俺やお前を含めてね。
255Kusakabe Youichi:01/12/04 09:10
In article >>253, 253 デフォルトの名無しさん wrote:

> 少なくともANSIの規格上ではfree(NULL)は何も起きないことが保証されているはず。

あれ? そうでしたっけ。
調べてみます。

> どっかのタコな実装は知らん。

ベル研に言ってください :) > どっかの
256Kusakabe Youichi:01/12/04 09:12
In article >>254, 254 デフォルトの名無しさん wrote:

> > 11月12日発売でした。
> そりゃ良かったよ、色んな意味でね

時系列的因果関係は合ってますか?


> > とか偉そうに言うやつにかぎってしょーもないコード書くのよね
> 俺やお前を含めてね。

無理に私までいっしょにしなくてもいいですよ :)
Kusakabeは無視。定説です。
258ヒツキー@プロゴルァミング:01/12/04 09:16
Kusakabeの偽者多いなぁ。
騙されてる>>257みたいなのも多いなぁ。
259Kusakabe Youichi:01/12/04 09:19
In article >>257, 257 デフォルトの名無しさん wrote:

> Kusakabeは無視。

とかいちいち書くやつ :)
260通りすがりですけど:01/12/04 09:30
>>259 Kusakabe Youichiさん wrote:
>> Kusakabeは無視。
>とかいちいち書くやつ :)
とかいちいち書く偽者 :)
261Kusakabe Youichi:01/12/04 09:37
In article >>255, 255 Kusakabe Youichi <[email protected]> wrote:
> > 少なくともANSIの規格上ではfree(NULL)は何も起きないことが保証されているはず。
>
> あれ? そうでしたっけ。
> 調べてみます。

調べてみました。C89以降は保証されているようですね > free(NULL)は何も起きない

でも、やはりmallocが返す値を入れる変数を
「あらかじめNULLにしておく」のを薦めるのはやはり変だと思います。
(たとえばこの人も薦めてる > http://www.google.com/search?q=free+%88%F8%90%94+NULL&hl=ja&lr=)

つまりその変数が最初のmallocの値を受け取るよりも前に
「free」が呼ばれた場合のことを考えた処置ですよね。
それはつまり、変数を宣言したあと「そのfreeが絶対にmallocからの値を代入する
よりも前に出てこない」ことが保証できないぐらいの複雑さの場合は意味を持ちますが
逆にいえば、そんな汚いコードを書くことのほうをどうにかするべきです。

同様のことは、たとえばif ((fp = fopen( ...で使う変数fpを
FILE *fp = NULL; のように初期化しておくことにも言えます。
まぁ char *buf = (char*)malloc( size ); と
書ければすむ話なんですがね。better C としてのC++利用。

初期化は、こういうことを為かもしれませんね。
char *a = NULL; char *b = NULL;

if( !a = malloc( size ) ) goto error;
if( !b = malloc( size ) ) goto error;
--snip--
error:
free(a); free(b)
263Kusakabe Youichi:01/12/04 09:57
In article >>262, 262 デフォルトの名無しさん wrote:
> まぁ char *buf = (char*)malloc( size ); と
> 書ければすむ話なんですがね。

っていうか、その表記が許されたとしても、
「宣言と代入が離れすぎていて、freeが先におこなわないことを保証できない」
コードって問題でしょ?

たとえば宣言をmallocからの代入の「すぐ近く」に置くことで、
freeがそれより前の行になってしまうようなものはコンパイル時にエラーに
できちゃうわけで。

> better C としてのC++利用。

Cでもできますね > ブロックの先頭以外に変数宣言を書く。

> 初期化は、こういうことを為かもしれませんね。
> char *a = NULL; char *b = NULL;
>
> if( !a = malloc( size ) ) goto error;
> if( !b = malloc( size ) ) goto error;
> --snip--
> error:
> free(a); free(b)

はい。たぶんそういうことをやりたいんでしょうね。
でもそれはずいぶん汚い書き方ですよね。そっちのほほうを何とかすべきで
あって、「NULLを入れておかないと危険」なような書き方自体に問題がある
わけです。
if(hoge)free(hoge); と言うより
free(hoge)hoge=NULL; なんだけどなあ・・・
つまりhogeにはまともなポインタかNULL以外入って欲しく無いし
それでバグ取りがやり易かったり超実用的なんだけど・・・
こんな事言うと「そんなヘボい構造自体が」とか言われそうだけど
私が書いたんじゃないんだよなあ
って言うと「そもそもそう言う設計自体が」って来るんだろねえ (^∀^)アハハッ
265Kusakabe Youichi:01/12/04 10:08
In article >>264, 264 デフォルトの名無しさん wrote:

> if(hoge)free(hoge); と言うより
> free(hoge)hoge=NULL; なんだけどなあ

なるほどfreeしたあとですか?
だったら、宣言時だけじゃあだめですね。
(freeしたたびに代入ですかー)

> つまりhogeにはまともなポインタかNULL以外入って欲しく無いし

でもそれはfreeに渡す変数だけじゃなく、すべてのポインターに関して
言えるのでは?
(ある時点でその指しているものが無意味に成ってしまうポインター変数なんて
いくらでもありそうですし)

> それでバグ取りがやり易かったり超実用的なんだけど

ですからそれは「本末転倒」ってやつですね。
「わかりにくいプログラム」を「わかりやすく直す」ことをせずに、
デバッグしやすくする方法って感じですね。
とにかくこの人は言ってる事がかなりヤバイです、いやホント。
構造体ポインタはちょっと、、とか平気で言っちゃう人もプロジェクトには居る訳ですね
嫌あなたが超絶天才的C言語完全体なのはわかりますがね。
実際そう言う人とやってくのが仕事な訳ですよ、ええ。
そう言う人相手に「for使うならカウンタの初期化は無駄です」なんて
教えると会社潰れる位のつけ払う事になりますわ、多分
糞壁はその存在自体が壮大なネタだからね(と思いたいです。)
268Kusakabe Youichi:01/12/04 10:17
In article >>266, 266 デフォルトの名無しさん wrote:

> とにかくこの人は言ってる事がかなりヤバイです、いやホント。

「ということにしたい」のですね? :)

> 構造体ポインタはちょっと、、とか平気で言っちゃう人もプロジェクトには居る訳ですね

意味がわからないですが...
「構造体ポインタは使わないほうがいい」という人がプロジェクトにいたりする
っていう意味ですか?

っていうか、そんな人が平気で存在できるようなプロジェクトや会社に
自分がいるっていう事実はどう認識しているのですか? :)



> 実際そう言う人とやってくのが仕事な訳ですよ、

自分のあまりにも情けない環境を「世の中のごくふつう」だと
思い込みたいからといって、事実をねじまげるには無理がありますね :)
269Kusakabe Youichi:01/12/04 10:22
In article >>267, 267 デフォルトの名無しさん wrote:

> 糞壁はその存在自体が壮大なネタだからね

こういうのがいっぱい暴れて会話の邪魔をするところなんですね。
2chって。
Kusakabe Youichi先生は4徹でデバッグとかした事有りますか?
OpenDivX のコード読んだです (´ー`)
氏んだです (´ー`)
272Kusakabe Youichi:01/12/04 10:28
In article >>270, 270 デフォルトの名無しさん wrote:

> Kusakabe Youichi先生は4徹でデバッグとかした事有りますか?

それって何ですか? > 4徹
>>269
えっネタじゃ無いんですか? (^^;
274iku:01/12/04 10:50
こんにちは。ikuと言います。
あ い うのデータを
CSVにあ,い,うという形で出力する方法を知りたいのですが,
教えて頂けないでしょうか?
それともう一つ,
もしその出力するCSV1にデータが存在していた場合,
初期化してからデータ出力をしたいのですが,
どうすれば初期化できるのでしょうか?
よろしくお願いします。m(_ _)m
275Kusakabe Youichi:01/12/04 10:59
In article >>274, 274 iku <[email protected]> wrote:

> こんにちは。ikuと言います。
> あ い うのデータを
> CSVにあ,い,うという形で出力する方法を知りたいのですが,
> 教えて頂けないでしょうか?

ふつうに書けばいいのでは?
でも文字列は全部「"」で括ってたような > ふつうのCSV

> それともう一つ,
> もしその出力するCSV1にデータが存在していた場合,
> 初期化してからデータ出力をしたいのですが,

man fopen
276お胸おっぱい:01/12/04 11:04
>>274
意味判らん…
空白で区切った "あ い う" を、カンマ区切りにしたいってこと?
なんで、こいつは、fjでほとんど発言しなかったfree()問題を
ここでしつこく語ってるかと言うと、fjでは突っ込まれるのが怖くて
発言できなかったから。
>>274

要するに、日本語を含んだスペース区切りのCSVを
コンマ区切りにCSVに直した言ってことか?

普通にスペースをコンマにReplaceすりゃいいじゃん。
C言語でやると漢字の2バイト目にスペースと同じ文字コードが
含まれてる可能性があって、分岐がめんどくさくなるような。
279Kusakabe Youichi:01/12/04 12:13
In article >>277, 277 デフォルトの名無しさん wrote:

> なんで、こいつは、fjでほとんど発言しなかったfree()問題を
> ここでしつこく語ってるかと言うと、

はつみみですね。fjで何度か話題になったのは、
「exitするときにいちいちfreeコードは意味があるか?」という
話題なので、全然ちがう話題ですね。


> fjでは突っ込まれるのが怖くて発言できなかったから。

ということにしたいわけですね? :)
(それで私の発言は見なかったことにしてるのですね^^)
>>265
CODE COMPLETE 読みましょう。

私は dangling pointer 嫌いです。ただ C だと全面的に dangling pointer
を追放するのは難しい(いちいち NULL を自分で代入しないとならなず、現実
的ではない)から、諦めてますけど。

C++ を使う場合には「所有する」オブジェクトに関しては std::auto_ptr な
どのスマートポインタを多用しますし、また関連を張るために使うポインタに
ついては NULL or 意味のあるポインタ値が常に保たれるように注意します。
281名無し:01/12/04 13:47
誰かさんの作ったexeファイルを
visualC++でそのプログラムを
見るにはどうしたらいいのんですか?
visualC++にドラッグしてドロップしろ
>>263
> Cでもできますね > ブロックの先頭以外に変数宣言を書く。

できませんよ。途中にブロックを作ってその先頭に変数宣言を
書くことはできますが。
284Kusakabe Youichi:01/12/04 16:57
In article >>283, 283 デフォルトの名無しさん wrote:
> >>263
> > Cでもできますね > ブロックの先頭以外に変数宣言を書く。
>
> できませんよ。

いえできますよ。

> 途中にブロックを作ってその先頭に変数宣言を書くことはできますが。

そりゃもちろんできますね。でもそれは「ブロックの先頭」ですね。
285  :01/12/04 17:12
>>281
逆アセンブルすればいい。MSDNをよく調べろ。
つーか、コンパイルがなんであるか良く分かってないだろ。
>>284
C99からはブロックの途中から変数宣言できるようになったんですか?
ANSI X3.159 の古い規格しか知らない物で。
287  :01/12/04 17:15
ここはニュースグループじゃないんだから、無駄な引用はするなボケ。
しかも、articleじゃ無くてただのレス。
>>286
C99からできるようになったのよ。
http://std.dkuug.dk/JTC1/SC22/WG14/ 参照のこと。
厳密じゃなくてもいいなら http://seclan.dll.jp/ あたりもお手軽かも。

# 単にCと言った場合は混乱するなあ。規格の趣旨から言うと現行規格は
# ISO/IEC 9899:1999のみなんだけどさ。
289Kusakabe Youichi:01/12/04 17:21
In article >>286, 286 デフォルトの名無しさん wrote:
> C99からはブロックの途中から変数宣言できるようになったんですか?

なってますよ。

for (int i = 0; ... みたいなのもできるし。

複合定数も、指定付き初期化も。
>>289
C99サポートしたコンパイラなんてまだ一般的ではないんだから、一言
「C99では」と前置きしとけ。
291Kusakabe Youichi:01/12/04 17:26
In article >>287, 287    wrote:

> ここはニュースグループじゃないんだから(Iyぢ無駄な引用はするなボケ。

また「ニュースグループ」とかわけのわからないこと言うやつがいた :)
292Kusakabe Youichi:01/12/04 17:27
In article >>288, 288 デフォルトの名無しさん wrote:
> # 単にCと言った場合は混乱するなあ。

混乱しないでしょ? override...じゃないや、えっとようするに
新しいのが古いのを上書きしてるんだし。
そろそろ荒らし対策にお願いでもだしとくか?
>>288
JIS があるやん。
295288:01/12/04 17:54
>>292
> override...じゃないや、えっとようするに
outdate

> 新しいのが古いのを上書きしてるんだし。
288でもそのように書いたつもりですが。
ANSI X3.159-1989、ISO/IEC 9899:1990、ISO/IEC 9899:1999のそれぞれで仕様が
異なる場合はC89、C90、C99と明記することが多くありません? (いまだにC9Xと
呼んでる人もいるけど)
念の為、これはISO/IEC JTC1/SC22/WG14のmailing archiveやcomp.lang.cを読んだ感想です。
296 ◆RubyOmS2 :01/12/04 18:04
>>295
C99に対応していないgcc2.95.3を使っている俺としては、
C99でしか使えないことは明記して貰うとありがたい。
297Kusakabe Youichi:01/12/04 18:08
In article >>295, 295 288 wrote:
> > 新しいのが古いのを上書きしてるんだし。
> 288でもそのように書いたつもりですが。
> ANSI X3.159-1989、ISO/IEC 9899:1990、ISO/IEC 9899:1999のそれぞれで仕様が
> 異なる場合はC89、C90、C99と明記することが多くありません?

うーん、C90っていう言い方はあまり聞かないですね。
C89でまとめちゃってる気がする。

> (いまだにC9Xと呼んでる人もいるけど)

C99をそう呼ぶひとってのは、確実にC90とはいいそうにないですね。
298288:01/12/04 18:14
>>297
> うーん、C90っていう言い方はあまり聞かないですね。
ほとんど一緒ですから。

> C99をそう呼ぶひとってのは、確実にC90とはいいそうにないですね。
そんなことないですよ。C99がdraftのころは自分のことをC9Xと呼びつつ、
ANSIを参照するときはC89、ISOを参照するとき(めったにないけど)はC90
と書いてました。その時のくせがまだ抜けない人もいるみたいです。
>>298
ネタにマジレスですか?
300デフォルトの名無しさん:01/12/04 19:22
日下部さん御歳はいくつですか?
>>300
それがC言語と関係あるのか? 荒らしたいならプログラマー板の隔離スレに
いけ、ヴァカ。
302namber:01/12/04 19:25
C言語の初心者ですが次のことがどうしてもわかりません。助言おねがいします。
int **a;
としたときの動的変数のメモリ確保の方法がわかりません。
例えば、
int a[3][3];
と同じ大きさのメモリを確保する場合どうしたらよいでしょう。
どうぞよろしくおねがいします。
303デフォルトの名無しさん:01/12/04 19:28
>>302
int a[3][3] の置き換えならば、
int **a; ではなくて、
int (*a)[3]; であろう。
>>302
C FAQ見れ。
305288:01/12/04 19:42
>>299
カコワルイがしょうがない。
306デフォルトの名無しさん:01/12/04 19:47
char *s;
printf("%s", s);
printf(s);
これって実行結果同じ?
307デフォルトの名無しさん:01/12/04 19:50
>>306

文字列に代入文字があると変わる。
だからprintf(s)は危険。
308デフォルトの名無しさん:01/12/04 19:51
だれかC99について盛大に語って。
もう
「K&R読め」
の時代でなくて
「C99の規格書読め」
という時代なの?
309307:01/12/04 19:53
>>306

とりあえず、printf関数の第一引数は文字列定数にするべき。
310 ◆RubyOmS2 :01/12/04 20:02
>>306
#include <stdio.h>
main()
{
char *s;
s = "%%";
printf("%s", s);
printf("\n");
printf(s);
printf("\n");
}
--------------
%%
%

こんなふうに、、、
311デフォルトの名無しさん:01/12/04 20:05
>>310

それはまだいいよ。

#include <stdio.h>
main()
{
char *s;
s="%d";/* %sとでもよい */
printf(s);
}

----------------------
こういうことをすると、必要な引数が足りなくて、無いものを参照しようとして実行時にエラーになると思う。
312311:01/12/04 20:06
× /* %sとでもよい */
○ /* %sとかでもよい */
>>308
よし、盛大に騙ってやろう。
まず、C99では以下のような関数定義が可能になった。
もちろん今までのようなold styleも許される。

int
main(argc, argv)
  int argc;
  char **argv;
{ return 0; }
314デフォルトの名無しさん:01/12/04 20:21
>>313
変数宣言をカーリーブランケットの外に出せるってこと?
>>313
              ∩
             | |
             | |
             | |
             | |
       ∧_∧  | |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      ( ´Д`)//  <  先生!その場合プロトタイプ宣言はどうなりますか!
      /     /    \___________
     / /|    /
  __| | .|    | __
  \   ̄ ̄ ̄ ̄ ̄   \
  ||\            \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              ||
316C99ならここを読め:01/12/04 20:41
プログラミング言語 C の新機能
http://seclan.s5.xrea.com/c99d/
デニス・リッチー氏インタビュー――CとUNIXの開発者が見る未来
http://www.idg.co.jp/lwonline/backnumber/200101/20010112_01_report.html
>>313
・・・

一応突っ込んどくね。
>314-315
これが2chでいう
「ネタニマジレスカコワルイ」
という奴なのか・・・?
それは新しいっ!
>>315
プロトタイプ宣言など必要ない。
型の正当性はプログラマが保証すればよい。

あと、予約語にはentryというのが追加された。
これはエントリポイントを生成し、関数の途中から処理を実行できる。
例えば
int neta(int a)
{
  a++;
entry dayo:
  a++:
  return a;
}

gomen = neta(2);の場合、gomen:4となるが、
gomen = neta.dayo(2)の場合、gomen:3となる。
>>320
      .          ∩
                 |::|
                 |::|
        ∧_∧   |::| ./ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       (:∵´Α`)/:/< 先生!僕は先生しんじてます!
      /:∵:∵:∵:/   \____________
     /::/|:∵:∵:∵/
  __|::| .|:∵:∵:∵|
  \   ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  ||\             \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              ||
722 :Kusakabe Youichi :01/12/04 18:06
In article >>710, 710 仕様書無しさん wrote:
> > そんな変なことを言うひともいるんですね。
> そうですよね、ふつー上京は東京に行くことだし、

はつみみです。

730 :仕様書無しさん :01/12/04 18:13
>>722
じょうきょう【上京】
地方から都へ行くこと。現在は,東京へ行くこと。
(新辞林 by 三省堂 @Yahoo! DICTIONARIES)
とありますよ。

「地方から都へ行くこと。」「東京へ行くこと。」のどちらが「普通」かと言
えば現在では後者といっておかしくないでしょう?

744 :スバリ回答 :01/12/04 18:20
民明書房国語辞典
じょうきょう【上京】 [名][自サ]地方から都に出ること。京都へ出ること。

やはり、日下部氏は正しかった。

752 :Kusakabe Youichi :01/12/04 18:27
In article >>741, 741 困った wrote:

> 清水国語辞典
> じょうきょう【上京】 ジヤウキヤウ[名][自サ]地方から都に出ること‥豕・惱个襪海函
>
> 誤植ですね。

民明書房国語辞典 じょうきょう【上京】 [名][自サ]地方から都に出ること。京都へ出ること。
323デフォルトの名無しさん:01/12/04 21:26
HTML 上がりの 厨房です。
  printf("%s",str);
と書きますが、HTML的には
  printf("%s%",str);
と前と後ろと囲ってもらわないと気持ち悪いです。
324デフォルトの名無しさん:01/12/04 21:27
>>322
その辞書そのものが捏造かもしらんじゃん。
コンパイラー トロジャンという言葉を知らんのか。
>>324
厨房相手に反応すんのやめようよ(・∀・)

  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ( ・∀・)< 辞典はやっぱり民明書房だね♪
 (    )  \_______
 | | |
 (__)_)
327デフォルトの名無しさん:01/12/04 21:43
日下部先生尊敬してます
>>327
どうしようもないレスで age るな、バカ。日下部先生を鑑賞するスレはプログラマー板
にあるから、こっちに来るように。
todayを25置き換える場合、
#define Today 25

const int today=25;
と書くのとは、どちらがいいのでしょうかね?
みなさんはどちらを書くんですか?教えてください。(出来れば理由などもあればお願いします)
よろしくお願いします。
>>329
enum のほうがよいんじゃない?
理由:gdbで25がtodayに読める
331名無しさん@お腹いっぱい。:01/12/04 23:14
#include <stdio.h>
#include <math.h>
int N;
double M=10.0+h,h,pi=M_PI;      ←ここのhと
void integ();
double f(double);
main()
{
h=1.5;
integ();
h=0.5;
integ();
void integ()       ←ここが
{
double daikei=0.,simpson=0.;
int i;
N=M/h;
for(i=-N;i<=N;i++){daikei +=f(i*h);}
daikei *=h;
for(i=-N;i<=N;i+=2){simpson +=4.*f(i*h);}
for(i=-N;i<=N-1;i+=2){simpson +=2.*f(i*h);}
simpson *=h/3.0;
printf("\n h=%lf\n",h);
printf("sqrt(pi)=%15.10e\n",sqrt(pi));
printf("daikei =%15.10e\n",daikei);
printf("simpson =%15.10e\n",simpson);
}
}
double f(double x)
{
return exp(-x*x);
}

コンパイルしてもうまくいかないんですけど、どうしてでしょうか?
よろしかったら教えてください。
332Kusakabe Youichi:01/12/04 23:17
In article >>302, 302 namber wrote:
> 例えば、
> int a[3][3];
> と同じ大きさのメモリを確保する場合どうしたらよいでしょう。

(sizeof(int) * 3 * 3)では?
333Kusakabe Youichi:01/12/04 23:18
In article >>306, 306 デフォルトの名無しさん wrote:

> char *s;
> printf("%s", s);
> printf(s);
> これって実行結果同じ?

sのなかにバックスラッシュや%がなければね。
334Kusakabe Youichi:01/12/04 23:18
In article >>308, 308 デフォルトの名無しさん wrote:

> だれかC99について盛大に語って。
> もう
> 「K&R読め」
> の時代でなくて
> 「C99の規格書読め」
> という時代なの?

K&RもC99対応のが出るのでは?
335Kusakabe Youichi:01/12/04 23:19
In article >>309, 309 307 wrote:

> >>306
> とりあえず、printf関数の第一引数は文字列定数にするべき。

なんで連体形?
336Kusakabe Youichi:01/12/04 23:21
In article >>314, 314 デフォルトの名無しさん wrote:

> >>313
> 変数宣言をカーリーブランケットの外に出せるってこと?

ライナスがいつも持っているやつですね! > ブランケット


ライナス 《漫画 Peanuts に登場する Lucy の弟;
いつも安心毛布 (security blanket) を持ち歩くインテリ少年》
―民明書房刊『ライナスのすべて』より
337デフォルトの名無しさん:01/12/04 23:22
何人騙っている人がいるのか知らないけど、うざいよ。
>>323-336
ネタはやめれ。
>>332
sizeof(int[3][3])じゃだめ?
340デフォルトの名無しさん:01/12/04 23:30
コールバック関数の作りかたと
用途おしえて
>>340
printf("kusakabe");
>>340

void callback(void)
{
;
}

用途は実行速度を飛躍的に高める。
343Kusakabe Youichi:01/12/04 23:34
In article >>329, 329 デフォルトの名無しさん wrote:

> todayを25置き換える場合、
> #define Today 25
> と
> const int today=25;
> と書くのとは、どちらがいいのでしょうかね?

第4章に書いてありますね。
>>340

void inarticle(char *wrote)
{
puts("kusakabe");
}
345Kusakabe Youichi:01/12/04 23:35
In article >>331, 331 名無しさん@お腹いっぱい。 wrote:

> double M=10.0+h,h,pi=M_PI;      ←ここのhと
> void integ()       ←ここが
> コンパイルしてもうまくいかないんですけど、

いくわけないですね。

> どうしてでしょうか?

書き方がまちがっているからです。
346Kusakabe Youichi:01/12/04 23:35
In article >>339, 339 デフォルトの名無しさん wrote:

> >>332
> sizeof(int[3][3])じゃだめ?

問題ないね。
>>331
> double M=10.0+h,h,pi=M_PI;      ←ここのhと

宣言前にhを参照してるし、hは定数でない。

> void integ()       ←ここが

標準的なCでは関数定義はネストできない。
348デフォルトの名無しさん:01/12/05 00:29
これからは「誰かの話やソースを皮肉りたいとき」には
くさかべ名乗ればいいから
ラクに皮肉や否定ができるな。
>>348
もともと匿名なんだから、他人の名を借りなくても出来るだろ。
糞壁名乗ってるのは遊んでるだけ。
350Kusakabe Youchi:01/12/05 00:34
>>348

ということにしたいのですね?:)
>>332
> (sizeof(int) * 3 * 3)では?
ホントに?

問:
int a[3][3];において常に&a[0][3] == &a[1][0]は成り立つか。
(10点)
352むぎ茶:01/12/05 00:37
だから、kusakabeは俺みたく、煽り共有コテハンになる、って言ったろ。
>>351
成り立つ
354重複しない乱数考えてみたよ1/2:01/12/05 00:44
#include <stdio.h>
#include <memory.h>
#include <time.h>
#include <malloc.h>
#include <stdlib.h>

/* 「くじびき」構造体*/
struct lot{
 int *begin;  /* 配列先頭*/
 int size;  /* 配列の要素数 */
 int current; /* 配列内の現在の参照オフセット*/
 int limit;  /* 配列内の現在の有効領域終端オフセット */
};

/* 初期化 */
int init_lot(struct lot* L){
 int i,v;
 if(!L || !L->begin || L->size<1) return -1; /*err*/
 L->limit = L->size - 1;
 memset(L->begin,0xff,sizeof(int) * L->size);/* -1は値が未設定とする*/
 srand(time(NULL));
 i=0;
 for(v=0; v<L->size; v++){
  if((i+=rand()) >= L->size) i %= L->size;
  while(*(L->begin+i)!=-1){ i = (i>=L->size ? 0 : i+1);}
  *(L->begin+i) = v;
 }
 L->current = 0;
 return 0;
}
355重複しない乱数考えてみたよ2/2:01/12/05 00:45
/* くじをひく */
int draw_lot(struct lot* L){
 int ret;
 if(!L || !L->begin || L->size<1 || L->limit<0) return -1; /* err */
 if(L->limit > 0){
  L->current += rand();
  if(L->current > L->limit) L->current %= L->limit;
 }
 ret = *(L->begin + L->current);
 *(L->begin + L->current) = *(L->begin + L->limit);
 *(L->begin + L->limit) = ret;
 L->limit--;
 return ret;
}

/* リセット */
int reset_lot(struct lot* L){
 if(!L || !L->begin || L->size<1) return -1; /* err */
 L->limit = L->size - 1;
 srand(time(NULL));
 return 0;
}

/* 使用例 (コマンドラインで配列サイズと試行回数を指定)*/
int main(int argc, char *argv[]){
 struct lot lotlot;
 int i, n, size=10,loop=10;
 if(argc>1) size = atoi(argv[1]);
 if(argc>2) loop = atoi(argv[2]);
 lotlot.begin = malloc(sizeof(int)*size);
 lotlot.size = size;
 init_lot(&lotlot);
 for(i=0;i<loop;i++){
  while((n=draw_lot(&lotlot))!=-1) printf("%2d ",n);
  printf("\n");
  reset_lot(&lotlot);
 }
 free(lotlot.begin);
 return 0;
}
なにゆえ

なにがしかの関数呼び出しの際、そこに渡す引数名と

渡した後、そこの内部で使われる引数名は

似たような名前にしたらイカンとですか?
357Kusakabe Youchi:01/12/05 01:02
>>356

そんなことも分からないような人がいるからですね:)
>>356
べつにそんなこと無いんじゃない?
>>351
必ずしもなりたたないよー。
360同じような:01/12/05 01:16
「max」で最大長を見てた
そして関数に渡した
んで、maxを入れてることが分かりやすいようにと思って、渡され側にも「max」と入れようとしたら

「何やってるかわからなくなるから、そこは limit とでもしといて」

だって。
余計に分かりづらいやないかい。
>>353
残念はずれ。
362初心者:01/12/05 06:27
>>351
お尻に詰め物が入る(処理系が有る)ですか?
糞壁の言う事は絶対聞かない (^^;
>>362
ケツの穴にツララを突っ込まれた気分だ・・・
364デフォルトの名無しさん:01/12/05 08:54
>>320
はアセンブラやりすぎ。
>>360
C言語には「コメント文」という概念があります。
覚えておくと便利ですよ〜〜〜〜〜〜〜〜。
366Kusakabe Youichi:01/12/05 09:15
In article >>365, 365 デフォルトの名無しさん wrote:

> >>360
> C言語には「コメント文」という概念があります。
> 覚えておくと便利ですよ〜〜〜〜〜〜〜〜。

文だったのか。
367Kusakabe Youichi:01/12/05 09:23
In article >>362, 362 初心者 wrote:
> お尻に詰め物が入る(処理系が有る)ですか?
> 糞壁の言う事は絶対聞かない (^^;

構造体と混同?
>>367
それより、>>351 答えたら。
369Kusakabe Youichi:01/12/05 09:46
In article >>368, 368 デフォルトの名無しさん wrote:
> >>367
> それより、>>351 答えたら。

どんな質問?
>>369
なんだ、マ板でニセモノ合唱されたら、こっちに逃げてきたのか。
371デフォルトの名無しさん:01/12/05 13:13
日下部先生愛してます
372デフォルトの名無しさん:01/12/05 14:25
くさかべせんせえ、下は九九を表示するプログラムで、両方とも
コンパイラは通るのですが、

#define ROWS 9
#define COLUMNS 9

1)
main()
{
int i;
int j;
int **k = (int **)malloc(sizeof(int) * ROWS);

for(i=0;i<ROWS;i++)
{
for(j=0;j<COLUMNS;j++)
{
k[j] = (int *)malloc(sizeof(int));
}
}

for(i=0;i<ROWS;i++)
{
for(j=0;j<COLUMNS;j++)
{
k[i][j] = (i+1) * (j+1);
printf("[%d x %d = %2d]",(i+1),(j+1),k[i][j]);
}
printf("\n");
}

return 0;
}
は実行されるのですが、

2)
main()
{
int i;
int j;
int **k = (int **)malloc(sizeof(int) * ROWS);
for(i=0;i<ROWS;i++)
{
for(j=0;j<COLUMNS;j++)
{
k[j] = (int *)malloc(sizeof(int));
k[i][j] = (i+1) * (j+1);
printf("[%d x %d = %2d]",(i+1),(j+1),k[i][j]);
}
printf("\n");
}

return 0;
}
は実行時エラーが出て止まります。

なんでですか?
373デフォルトの名無しさん:01/12/05 15:06
メモリ確保
ってなんでする必要があるの?
374デフォルトの名無しさん:01/12/05 15:12
会社とかで
「会議室を使いたい」
と思って、予約しないで勝手に使いたい時間にいくと、既に他の部署の人に使われてたりする。

なので、
「何月何日の何時何分から何時何分まで会議室を使います」
と予約しておく必要がある。
375デフォルトの名無しさん:01/12/05 15:14
>>372
なぜメモリ確保するのかは聞かないことにして、

k[j] = (int *)malloc(sizeof(int));
ではなく
k[j] = (int *)malloc(sizeof(int)*COLUMNS);

すべきでわ?
376デフォルトの名無しさん:01/12/05 15:18
>>372
2)は↓こうすべきだと思うが

main()
{
int i;
int j;
int **k = (int **)malloc(sizeof(int *) * ROWS);
for(i=0;i<ROWS;i++)
{
k[i] = (int *)malloc(sizeof(int)*COLUMNS);
for(j=0;j<COLUMNS;j++)
{
k[i][j] = (i+1) * (j+1);
printf("[%d x %d = %2d]",(i+1),(j+1),k[i][j]);
}
printf("\n");
}

return 0;
}
377iku:01/12/05 17:31
>>274
返事が遅くなってすいません。
みなさんご意見どうもありがとうございました。
fprintf(fp1,"%s,%s,%s,%s\n",strPath,strSheet,strPCNAME,strErrMsg);
で解決しました。
378iku:01/12/05 17:45
こんばんは。fprintfについて教えて下さい。
下記の様な処理でファイルからデータを読みこんでbuff1にデータを
文字列で格納しました。
この読込んだデータはc:\\test1\\というパス名なのですが
ファイルからこのデータを読込んでa.txtというテキスト名を
くっつけたいと考えています。(c:\\test1\\a.txt)
この操作をするにはbuff1+"a.txt"なんてすれば良いのかな?
と思いやってみましたがbuff1の値が化けてるいる様です。
どうやったらc:\\test1\\a.txtの値を取得できるか教えて頂きたいのですが。
よろしくお願いします。

if (NULL == (fp0 = fopen(mvemFilename.c_str(),"r"))){
Label1->Caption = "Cannot Open Read File";
exit(1); //実行を終了し,オペレーティングシステムに戻る
}
for(i=0;i<100;i++){ //ファイルから内容を読込む
//ファイルの終わりかどうか判断する
if(NULL == fgets(buff1,255,fp0)){
Label1->Caption = "Finish";
break; //for文をぬける
}
fprintf(fp0,"%s",buff1);
}
fclose(fp0);
>>378
> この操作をするにはbuff1+"a.txt"なんてすれば良いのかな?
良くないです。strcat() 使いましょう。
380sage:01/12/05 17:52
strcpy(buff1 + strcspn(buff1, "\r\n"), "a.txt");
381iku:01/12/05 18:10
レスありがとうございます。
ちなみに3文字を+したい場合は
strcat(s1,s2);
strcat(s1,s3);
と2回やらなきゃいけないのでしょうか?
それともう一点,何で文字化けしていたのでしょうか?
>>381
> ちなみに3文字を+したい場合は
「+ する」というのは、意味が曖昧だから使わない方がいい。s2, s3 が指している
文字列を s1 が指している文字列に連結したい、ということだと思うが、それなら
>>381 のように 2 回 strcat() する以外に

char path[MAXPATH];
sprintf(path, "%s%s%s", s1, s2, s3);

なんて書く方法もある。(ファイルから読み込んでる場合には、改行文字を事前に
潰しておくことをお忘れなく)

> それともう一点,何で文字化けしていたのでしょうか?
それは正確に話すと、わりと面倒なんで俺はパス。とりあえずポインタと文字列
をキーワードに、書籍を読んでみたら、とだけ言っておきます。
383iku:01/12/05 18:47
>>382
ご指摘ありがとうございます。
これからはもっと注意します。
ポインタと文字列をキーワードに,わかりました。
もしお勧めの本がありましたら教えて下さい。
よろしくお願いします。m(_ _)m
それにしてもCって難しいですね。
プログラムが動く仕組みをよく理解していないと・・・・・
>>383
「プログラムが動く仕組み」どころか、
文字列のなりたちをきちんと理解してくれると いいなぁ。
C言語じゃなくても、他の言語でも共通の部分なので。
385iku:01/12/05 19:10
>>384
はい。ごもっともです。m(_ _)m
>>385
sage で書いてくれ。
>>385

そのメールアドレスって本物?
場をわきまえようね(^_^;)
>>387
でもさ、実際こういう風に晒したところでなにか問題ある?
mailto:[email protected]
>>388

うざいメールがイパーイ
売られる可能性もあるし。
390Kusakabe Youichi:01/12/05 21:24
In article >>372, 372 デフォルトの名無しさん wrote:

> くさかべせんせえ、下は九九を表示するプログラムで、両方とも
> コンパイラは通るのですが、

そうですか。
391Kusakabe Youichi:01/12/05 21:26
In article >>383, iku/383 <[email protected]> wrote:
> それにしてもCって難しいですね。

簡単ですよ。

> プログラムが動く仕組みをよく理解していないと・・・・・

それは他の似た言語でも同じでしょう。
392デフォルトの名無しさん:01/12/05 21:33
#include <iostream>
int main(){
char c[20]="123abc";
char *p=&c[0];
char *a="aaa";
c[7]=100;
for (int i=0;i<20;i++){
printf("%d\n",c[i]);
printf("%d\n",&c[i]);
printf("%d\n",++p);
}
printf("%d\n",++p);
printf("%d\n",a);
printf("%d\n",++a);
return 0;
}
393デフォルトの名無しさん:01/12/05 21:51
↑char *a="aaa"の部分ですが、
これはメモリのどこかに"aaa"という文字列定数が記憶されて
それへのポインタが入るってことでいいのでしょうか?
>>393

よい。
>>394
どうもありがとうございました!
396Kusakabe Youichi:01/12/05 21:59
In article >>393, デフォルトの名無しさん/393 wrote:

> ↑char *a="aaa"の部分ですが、
> これはメモリのどこかに"aaa"という文字列定数が記憶されて
> それへのポインタが入るってことでいいのでしょうか?

そうですね。
>>395

この後にIn article君がうるさいことを言うだろうけど、無視してね。
398デフォルトの名無しさん:01/12/05 22:13
for 文のネストって実際の業務では何重まで許されるんですか?
>>398

一回も許さない。
400Kusakabe Youichi:01/12/05 22:17
In article >>398, デフォルトの名無しさん/398 wrote:

> for 文のネストって実際の業務では何重まで許されるんですか?

「業務では」ってのはとくにないでしょう。
Cの規格で許されているところまででは?
401デフォルトの名無しさん:01/12/05 22:19
でも8重ネストとか見ると叩きたくなりませんか?
>>398
あなたは何重まで許せますか?
>>400
規格で認められていてもたとえば「プロジェクトのスタイルに反する」
という理由でリジェクトされる可能性はあるでしょう。
規格を知らない人間でもスタイルにはうるさいもんだし。
>>403
そういう人間とクサカベたんの対決が見てみたいなぁ。
405Kusakabe Youichi:01/12/05 22:27
In article >>401, デフォルトの名無しさん/401 wrote:

> でも8重ネストとか見ると叩きたくなりませんか?

いいえ。
406Kusakabe Youichi:01/12/05 22:31
In article >>403, デフォルトの名無しさん/403 wrote:

> >>400
> 規格で認められていてもたとえば「プロジェクトのスタイルに反する」
> という理由でリジェクトされる可能性はあるでしょう。

っていうか、プロジェクトごとにコーディング規約はちがうわけだから、
こんなところで一般論を聞いてもいみないのでは?

で、それを承知で聞いているのだから、
プロジェクトごとのコーディング規約のことではないと
思われる。
>>401
人間が書いたコードだと許せんが、コードジェネレータが吐いたコードなら
許す。
408デフォルトの名無しさん:01/12/05 22:35
どのファイルの関数からもいじれるbool変数_endingをメインファイルのヘッダで
定義したのですが、次のようなエラーが出ました。
でもコンパイルは通って、ちゃんと動きますし、_endingの動作も意図した通りです。

>リンク中...
>gmain.obj : error LNK2005:
>"bool _ending" (?_ending@@3_NA) はすでに main.obj で定義されています
>draw.obj : error LNK2005:
>"bool _ending" (?_ending@@3_NA) はすでに main.obj で定義されています

以下はヘッダの定義部分です。
>#include <windows.h>
>#include "gmain.h"
>#include "draw.h"
>// -----------------------------------------------------
> bool _ending; // 終了フラグ

"gmain"ソースファイル内だけでいじっていますが、
"draw"ソースファイル内では参照も何もしていません。
コンパイラはVC++6.0です。このままほっておくとマズイのでしょうか。
>>408
main.h内で
extern bool ending;

main.cpp内で
bool ending;


で、みんなでmain.hをインクルード。
410393:01/12/05 22:44
#include <iostream>
int main(){
int *a;
a=(int *)malloc(sizeof(int)*10);
a[5]=100;
for (int i=0;i<10;i++){
printf("%d\n",*a);
printf("%d\n",&a);
printf("%d\n",a);
a++;
}
return 0;
}
ワカワカメヨ。。。モウ
>>410
とりあえず、確保した領域初期化したら?
>>409
通りました!ありがとうございますです・・・。
課題○投げスンマセン。
とりあえず>>351
>int a[3][3];において常に&a[0][3] == &a[1][0]は成り立つか。
が気になるんですが、どういうときに成り立たないんでしょう?
成り立つと思ってたんですが
414393:01/12/05 23:07
#include <iostream>
int main(){
int *a;
int i;
a=(int *)malloc(sizeof(int)*10);
for (i=0;i<10;i++){
a[i]=i*3;
}
for (i=0;i<10;i++){
printf("%d\n",*a);
printf("%d\n",&a);
printf("%d\n",a);
a++;
}
return 0;
}
とりあえず初期化と。。。
int型へのポインタ型変数「a」っていう変数にmallocで確保したアドレスが入って・・・
*aで「a」に入ってるアドレスへ行く。
&aで「a」自身のアドレスを参照。
aで「a」に入ってるアドレスを参照。
という解釈でよろしいでしょうか?
でもa++してるのに&aの値が変わって行かないのはなぜなの?アカン。。。
>>414
ポインタ変数に++してるから。では。
int b; だったとしたら、
b++; ってしても &b の値は変わらないでしょ。

int *a; のときも一緒。
>>414
a++で代わるのは
変数aの値であって
aのアドレスではない。
418393:01/12/05 23:14
>>415
あっどうもありがとうございました。
「a」自体のアドレスは変わらずに
中身が指すアドレスが++されていくからですね。
チョトワカッテキタ
419393:01/12/05 23:16
>>416-417
どもありがとうございました。
なんだかわかってきたような気分です!!
>>408
_ から始まる識別子(厳密にはもうちょっと制限されるけど)は、処理系や
標準ライブラリが使うために予約されている。_ending はおそらく CRT の
スタートアップルーチンあたりで使われているものとコンフリクトしている
ものと思われ。

不幸なことになる可能性が高いから、とりあえず _ から始まるシンボルを
使うのはやめとけ。
421デフォルトの名無しさん:01/12/05 23:28
ASCIIってどうよ。
>>420
ありがとうございます。
__FILE__とかですね(多分)。ちょっと目印に、と思ったのですが
アホでした。しかもなんだか危険極まりないカンジの予約語ですね・・・
名前のつけ方勉強しなおしますです・・・
423デフォルトの名無しさん:01/12/05 23:45
ラテン8ってどうよ。
gccを2.95から3.02にしたのですが
環境変数を読んでくれなくて -I -L
オプションで逃げたのですが
今度はリンカが膨大なエラーを吐くので
(undefined reference _virtual_なんとか)
へこんでおります。

3.0はオブジェクトの出力形式も違うのでしょうか?
(こんなときに FAQ の mail-archive の cgi が止まってる-- >_<)
425機種依存の勉強:01/12/06 00:17
486でビットフィールドはどういうふうに扱われますか?

struct {
 unsigned int a:8;
 unsigned int b:8;
 unsigned int c:8;
 unsigned int d:8;
} chars;

union {
 unsigned int r;
 struct chars c;
} unichars;

union unichars u;

u.r = 8; といれたときに u.c.d に入る?それとも u.c.a ?
gccは2.9.xです
>>424
3.0からC++のmangling schemeが変わってる。ライブラリもコンパイルしなおせ。
427名無し:01/12/06 00:26
486はC言語を解するようになったのですか? by void風
実行してみればわかるだろハクチデスカ ┐(´ー`)┌ by むぎ茶風
428機種依存の勉強:01/12/06 00:32
>>427
えーすみません

動かしました。わかりました。aに入りました。

野村監督 辞任だってさ
486はリトルなエンディアンさ。
俺もゆで卵はとんがってる方から食べるな。
>>430
え?
>>431
ビッグエンディアンとリトリエンディアンの由来を調べてみれ。
433393:01/12/06 00:44
#include <iostream>
int main(){
int *a;
a=(int *)malloc(sizeof(int)*10);
free (a);
return 0;
}
これでちゃんとfreeされてます?

それはいいとして、
int型ポインタ変数aはmalloc確保されたアドレスの先頭しか
わからないですよね?
終わりはここ!ってのはわからないはず?なのに、
なぜちゃんと解放してくれるのでしょうか?
どこかにここからここまで確保しましたっていう情報が
記録されてるのでしょうか?それとも・・・
> どこかにここからここまで確保しましたっていう情報が
> 記録されてるのでしょうか?
これが正解。
ただし、移植性のある方法でそれを調べる方法はない。
435424:01/12/06 00:46
>>426
ありがとうございます m(__)m お教えの通り自作のライブラリを
コンパイルしなおしたのですが、まだエラーが...

試してみると3.0のライブラリのみ使うプログラムは正常に
スタティックリンクできました。自作ライブラリをリンクすると
エラーみたいで…。
環境変数から無視される辺りから何か変ですよね。
オプションが正しく渡っていないのかも…。
>>433
実は公にされてはいませんが、
CPUにはラプラスの悪魔が仕組まれています。
自分でサイズ指定してるジャン。
438393:01/12/06 00:54
>>434
それを管理しているのはOSなのでしょうか?
>>438
気にするな。
440393:01/12/06 01:01
スミマセン
マエカラキニナッテタモンデ・・・
>>438
malloc() のソース読め。
442デフォルトの名無しさん:01/12/06 01:03
保毛太郎

printf("この〜木 何の木");

while (1) {
printf("気になる");
}
メモリ512Mの時代でいちいち気にすることではない。
445393:01/12/06 01:08
>>441
ざっと目を通しただけですけども、
先頭アドレスとサイズで処理してるみたい(?)ですねぇ・・・。
どうもありがとうございました!
自分のOSはWIN95のPC-9821です
エスケープシーケンスを使いBorland C++ 5.5.1で
コンパイルをすると不具合がでます

例えば画面消去をしたくて
printf("\x1b[2J");
としても
[2J
↑のように出力されます

コンパイルしたEXEはDOS/Vのほうでは正常に動作します
何か対処方法はあるのでしょうか?
>>446
98版のWindowsってANSI.SYSついてないんだっけ?
ま、プログラミングとは関係ないから別の板で聞いた方がいいと思われ。
>>444
UMBも使え
449446:01/12/06 01:18
ANSI.SYS入ってませんでした
でも一応 LSI C-86でコンパイルするとPC-98でも
エスケープシーケンスは正常に動作します
DEVICEHIGH=C:\WINDOWS\COMMAND\ANSI.SYS
451446:01/12/06 01:43
>>447,450
ちょっと調べてみたらPC-98はANSI.SYSを組み込む
必要がないみたいでした
でも原因が特定できてよかったです。ありがとうございました

あとスレ違いスイマセン
452デフォルトの名無しさん:01/12/06 08:52
ちょっとおしえてください。

char str[] = "あAAAA";
とやって
if (str[0] == 'あ')
とか
printf("%c", str[0]);
をやりたいのですが失敗します

mbchrcmpとかmbprintfとか無いのでしょうか?
strncmp
454Kusakabe Youichi:01/12/06 09:02
In article >>452, デフォルトの名無しさん/452 wrote:
> char str[] = "あAAAA";
> とやって
> if (str[0] == 'あ')
> とか
> printf("%c", str[0]);
> をやりたいのですが失敗します

「失敗します」じゃあ「どうなったか」がわからないですね。

ちゃんとできるようになるには、質問とかのときに「ちゃんと現状を報告できる」
ことがまず必要ですよ(ちゃんとした質問にするためだけじゃなくて、自分の理解の
ためにも)

あと、この場合は環境の報告も必要ですね。
mbchrcmpって何? ぶびちぅ??
>>454
すいません、ちょっと専門的な話をしてるので黙っててもらえますか
もし話に入れなくて気分を害されたならごめんなさい
「」で囲むのは、何か意味があるんですか?
458Kusakabe Youichi:01/12/06 09:09
In article >>456, デフォルトの名無しさん/456 wrote:

> >>454
> すいません、ちょっと専門的な話をしてるので黙っててもらえますか

「専門的」な質問ですね ;)
VB厨なんかなmbchrcmpて、スゲー気になる (w
460Kusakabe Youichi:01/12/06 09:11
In article >>457, デフォルトの名無しさん/457 wrote:
> 「」で囲むのは、何か意味があるんですか?

そういうのはCの文法にないですね :)

ヒント: %lcについては415ペイジに解説があります。
MultiByteだよ -> MB...
VB厨には違いないが
462Kusakabe Youichi:01/12/06 09:13
In article >>459, デフォルトの名無しさん/459 wrote:
> VB厨なんかなmbchrcmpて、スゲー気になる

っていうか、てきとーな入門書でも見ればいいのにとは思う。
wchar_t wstr[] = L"あAAAA";
とやって
if (wstr[0] == L'あ')
とか
printf("%lc", wstr[0]);
をすればいいのでは?
ふつう「あ」は2バイト、charは1バイト。
465452:01/12/06 09:29
char*の指しているアドレスの文字(全角&半角)が知りたかったんです。
半角1バイト、全角2バイトは知ってましたが、どうすればよいか分からなかったので。

463さんありがとうございます。
出来ました。
Lを付けるのは知りませんでした。もっと勉強します。
>454
日本語は2バイトだから駄目、どうしてもそうしたいなら
if(str[0] == "あ"[0] && str[1] == "あ"[1])
467452:01/12/06 09:33
"あ"[0] "あ"[1]なんてできるとは知りませんでした。
いいこと教えてくれて有難うございます。
468Kusakabe Youichi:01/12/06 09:36
In article >>463, デフォルトの名無しさん/463 wrote:
> wchar_t wstr[] = L"あAAAA";
> とやって
> if (wstr[0] == L'あ')
> とか
> printf("%lc", wstr[0]);
> をすればいいのでは?

そういう教え方では本人のためにならないような(^^;
469iku:01/12/06 09:52
こんにちはikuです。
エラー処理の(EInOutError &e)の&eって何者なのでしょうか?
ネットでEInOutErrorを検索してみたらつけている人と
つけていない人がいらっしゃったのですが・・・・
void __fastcall TForm1::DriveComboBox1Change(TObject *Sender)
{
try{
// ドライブ名を設定
DirectoryListBox1->Drive = DriveComboBox1->Drive;
}catch(EInOutError &e){
// 例外時の処理
if(e.ErrorCode == ERROR_NOT_READY){
// デバイスの準備が出来ていないときの処理
}else{
// その他のエラー処理
}
}
}
>>469
スレ違い。C++スレ逝け。
471じゃばちゅぅ〜:01/12/06 10:11
C言語難しいです、Cfaqを読んでるんですが、ポインタの所でやたら出てくる
配列がポインタに***なりさがる***の意味がイマイチ分かりません。
例えば、2次元配列は100%ポインタのポインタに成りうるけど、逆は必ず真では無い
と言う感じでしょうか、と言うかfunc(char **str_ptr);
みたいなプロトタイプが有ったとすると、str_ptrが2次元配列なのか
単にchar型へのポインタへのポインタなのかは定義部を見ないと分からないですかね。
何かメッチャ戸惑っています
今日K&R買いに行くので、これだけ教えてプリーズです
472じゃばちゅぅ〜:01/12/06 10:18
例えばargvとかなら main(int argc,char *argv[],char *envp[]);
単に文字列へのポインタなら func(char **str_ptr);
みたいに、、なってないですよね   んー、、むずかしひ
473デフォルトの名無しさん:01/12/06 10:24
char **p;
p=(char **)malloc(4);
free(p);

こうするとfreeのところで失敗します。なぜなのでしょうか。
コンパイラはVC++6.0のものを使っています。
474Kusakabe Youichi:01/12/06 10:26
In article >>471, じゃばちゅぅ〜/471 wrote:
> 例えば、2次元配列は100%ポインタのポインタに成りうるけど、逆は必ず真では無い
> と言う感じでしょうか、

そういうふうに考えるとよけいに混乱します。

> と言うかfunc(char **str_ptr);
> みたいなプロトタイプが有ったとすると、str_ptrが2次元配列なのか
> 単にchar型へのポインタへのポインタなのかは定義部を見ないと分からないですかね。

その前にCの関数の引数はcall by value..のことを思い出さないとだめ。
foo(int);というプロトタイプの関数があったとして、
それにfoo(a);と呼び出すときと、foo(100);とやるときで、
受け取る側でどうなるかを関数定義部分(きっとfoo(int x){ ....}みたいに書いて
あるはず)でどうなるかを考えてみてください。

あと、
int *a;
というポインターでも
int b[10];
という配列でも
b[1]やa[1]はかけますが、
a++はできてもb++ができないのはなぜか
(つまりint iのi++ができても10++ができない理由も)
そのへんを理解していれば、(理解できる入門書を買えば)わかりやすくなります。

> 今日K&R買いに行くので、これだけ教えてプリーズです

英語を読めるならばできれば原書のほうがいいです。
475デフォルトの名無しさん:01/12/06 10:31
>>466
char* str = "あいうえお";
int len = strlen(str);
for( int i = 0 ; i < len ; i++ ){
if( *(unsigned short*)(str+i) == *(unsigned short*)"あ" ){
処理;
}
}
ではどうかな?
>>475
charのアドレスを、shortのアドレスに変換してアクセスするのって
保証されてるんだっけ?
477Kusakabe Youichi:01/12/06 10:39
In article >>472, じゃばちゅぅ〜/472 wrote:
> 例えばargvとかなら main(int argc,char *argv[],char *envp[]);
> 単に文字列へのポインタなら func(char **str_ptr);
> みたいに、、なってないですよね   んー、、むずかしひ

152〜154ペイジにわかりやすく解説してあります。
478Kusakabe Youichi:01/12/06 10:42
In article >>473, デフォルトの名無しさん/473 wrote:
> char **p;
> p = (char **)malloc(4);
> free(p);
>
> こうするとfreeのところで失敗します。なぜなのでしょうか。

「失敗します」が具体的にどうなることを言っているかを
うまく説明する練習をしましょう。
479kusokabe Youichi:01/12/06 10:50
In article >>478,kusakabe Youichi/478 wrote:
> > char **p;
> > p = (char **)malloc(4);
> > free(p);
> >
> > こうするとfreeのところで失敗します。なぜなのでしょうか。
>
> 失敗します」が具体的にどうなることを言っているかを
> うまく説明する練習をしましょう。

糞レスをつけるのならレスをしない方がよいでしょう。
もちろんこのレスに限ったことではありません:)
>>476
あ;;
len-1だね:)
>>478
いや、質問の仕方が悪いってのは、まっとうな指摘だと思うが…
482481:01/12/06 10:55
まちがえた。
481は >>479 へのカキコ。
483Kusakabe Youichi:01/12/06 10:56
In article >>475, デフォルトの名無しさん/475 wrote:

> >>466
> char* str = "あいうえお";
> int len = strlen(str);
> for( int i = 0 ; i < len ; i++ ){
> if( *(unsigned short*)(str+i) == *(unsigned short*)"あ" ){
> 処理;
> }
> }
> ではどうかな?

shortがそのバイト数である保証はどこにもないですね。
484Kusakabe Youichi:01/12/06 10:57
In article >>476, デフォルトの名無しさん/476 wrote:

> >>475
> charのアドレスを、shortのアドレスに変換してアクセスするのって
> 保証されてるんだっけ?

何がですか? > 保証されているかどうか
(「可能かどうか」ですか? できる内容がですか?)
485じゃばちゅぅ〜:01/12/06 10:57
>Kusakabeさんどうもです
>その前にCの関数の引数はcall by value..
えっと、結局配列でも値渡しするのは先頭要素へのポインタだから
まとめちゃえって感じですよね?、でも、例えば2次元配列を期待してる
関数に、単なるポインタへのポインタを渡したりするときっと中で添え字アクセス
とかされて死ぬと思うんですが、、その辺は呼び出す時に**ptrの意味を良く考えなきゃ
駄目なんですね、ヒャー
>a++はできてもb++ができないのはなぜか
はい、何となく分かります
>152〜154ペイジにわかりやすく...
教科書ですね、まさかプロの翻訳屋さんより読める気はしないので
おとなしく日本語のを買ってきます。
ありがとうございました  m(_ _)m
In article(中略)
>>485

図書館で借りろ:)
487Kusakabe Youichi:01/12/06 11:02
In article >>479, kusokabe Youichi/479 wrote:

> In article >>478,kusakabe Youichi/478 wrote:
> > > char **p;
> > > p = (char **)malloc(4);
> > > free(p);
> > >
> > > こうするとfreeのところで失敗します。なぜなのでしょうか。
> >
> > 失敗します」が具体的にどうなることを言っているかを
> > うまく説明する練習をしましょう。
>
> 糞レスをつけるのならレスをしない方がよいでしょう。

とかいうくだらない反応するぐらいなら何もしないほうがいいのでは? :)

私は最も適切な反応しているわけですので。
488Kusakabe Youichi:01/12/06 11:02
In article >>480, デフォルトの名無しさん/480 wrote:

> >>476
> あ;;
> len-1だね:)

EUCだったらどうするの? :)
489Kusakabe Youichi:01/12/06 11:03
In article >>481, デフォルトの名無しさん/481 wrote:

> >>478
> いや、質問の仕方が悪いってのは、まっとうな指摘だと思うが…

「仕方が悪い」というだけの指摘ではなく、どの部分がというのも示し、
「どうするべきか」の指針も与えているわけですからね。
490デフォルトの名無しさん:01/12/06 11:04
>>485
立ち読みで十分だよ、薄い(内容もね)本だから。
誤植が多いから注意してよんでね。
491デフォルトの名無しさん:01/12/06 11:05
>>484
>何がですか? > 保証されているかどうか

もしかすると、環境によっては動かないかも、
と思ったんですけど、大丈夫なんですかね?
CPUによっては、奇数のアドレスにchar以外では、
アクセスできないとかってあるじゃないですか。
>>485 何日やったか知らないが、本読む前でそれ位ならいい線逝ってるよ 藁
俺も厨房だが、その辺は何となくNULL参照しまくりながら慣れていった
個人的にはオライリーもお勧めしておく。
>>491
アラインされてない場合の動作は未定義。
つまり、何も問題なく動いてもいいし、バスエラーが起きてもいいし、
モニタを爆発させてもいい。
494Kusakabe Youichi:01/12/06 11:08
In article >>485, じゃばちゅぅ〜/485 wrote:
> >その前にCの関数の引数はcall by value..
> えっと、結局配列でも値渡しするのは先頭要素へのポインタだから
> まとめちゃえって感じですよね?

べつに「まとめて」いるわけじゃないです。

> でも、例えば2次元配列を期待してる
> 関数に、単なるポインタへのポインタを渡したりするときっと中で添え字アクセス
> とかされて死ぬと思うんですが、、その辺は呼び出す時に**ptrの意味を良く考えなきゃ
> 駄目なんですね、(I訪??

二次元配列であろうが、ポインターのポインターであろうが、
引数で渡るときにはアドレス1つです。

> >152〜154ペイジにわかりやすく...
> 教科書ですね、

あ、いえ、いまたまたま私の手もとにあった日本の入門書のペイジ数でした。
495490:01/12/06 11:11
>>490
あ、K&R買いにいくのか。糞本と間違えたーよ、鬱!
496490:01/12/06 11:13
>>494
>あ、いえ、いまたまたま私の手もとにあった日本の入門書のペイジ数でした。

↑これね、糞本てのは。
497デフォルトの名無しさん:01/12/06 11:14
>>494

> あ、いえ、いまたまたま私の手もとにあった日本の入門書のペイジ数でした。

他人に分からないレスはしないでください。非常に迷惑です。
ただでさえあなたは迷惑な存在なのですから。
> 二次元配列であろうが、ポインターのポインターであろうが、
> 引数で渡るときにはアドレス1つです。
はつみみです。引数で渡るときにはポインタ1つだと思ってました。
ところで、アドレスって何ですか?
>>498

加える服
500Kusakabe Youichi:01/12/06 11:18
In article >>496, 490/496 wrote:
> >>494
> >あ、いえ、いまたまたま私の手もとにあった日本の入門書のペイジ数でした。
>
> ↑これね、糞本てのは。

そう思いたいのですね? :)
まあまあ、みなさん。
偽日下部相手に目くじら立ててもしょうがありませんよ。
彼もそのうち気付くでしょう。本物の足元にも及んでいないと。
イゴ スベテノ クサカベハ ニセモノ トイウ ツウセツデ ヨロシク。
ニセモノアツカイ デキナイヒトハ ムシニ ツトメテクダサイ
>>476
RISCなんかだと、アライメントされてないアクセスはだいたいSIGBUSかなんかくらうな。

エミュレートしてくれるOSもあるが、激烈に遅くなる。
>>474
> foo(int);というプロトタイプの関数があったとして、
> それにfoo(a);と呼び出すときと、foo(100);とやるときで、
> 受け取る側でどうなるかを関数定義部分(きっとfoo(int x){ ....}みたいに書いて
> あるはず)でどうなるかを考えてみてください。

禿死苦意味不明
お前ら隔離スレでやってくれませんか?
505Kusakabe Youichi:01/12/06 11:23
In article >>497, デフォルトの名無しさん/497 wrote:
> > あ、いえ、いまたまたま私の手もとにあった日本の入門書のペイジ数でした。
>
> 他人に分からないレスはしないでください。

「他人」っていってもいろいろいますね。

> ただでさえあなたは迷惑な存在なのですから。

そう思いたいのですね? :)
506Kusakabe Youichi:01/12/06 11:24
In article >>498, デフォルトの名無しさん/498 wrote:
> ところで、アドレスって何ですか?

住所でしょ。
507Kusakabe Youichi:01/12/06 11:25
In article >>501, デフォルトの名無しさん/501 wrote:

> まあまあ、みなさん。
> 偽日下部相手に目くじら立ててもしょうがありませんよ。

というと安心できるんですか? :)
508Kusakabe Youichi:01/12/06 11:25
In article >>502, デフォルトの名無しさん/502 wrote:

> >>476
> RISCなんかだと、アライメントされてないアクセスはだいたいSIGBUSかなんかくらうな。
>
> エミュレートしてくれるOSもあるが、激烈に遅くなる。

DGのがそうだったなあ > 遅く
場所を弁えましょう。日下部の偽者はム板に戻ってください。
本物の存在は一切認められていません。

ここで日下部を騙る事はコスプレして銀座の町に迷い出るようなものです。
>>506
住所って何ですか?
>>509

ム板ってここのことだけど・・・
それにしても、糞壁っていかれた人工知能プログラムみたいだな。
512じゃばちゅぅ〜 :01/12/06 11:27
うっ、何か大変な事になってる (゚д゚lll)
皆さんアドバイス大感謝です、今からK&R買いに行って来ます。
>492 オライリーはPracticalですよね、詳説が本棚の肥やしになってる
んだよなぁ・・・・と言うかお金が無い(泣
何か適当にやったらコア吐きまくるので、コード書かずにアレばっかり読んでたんです。
サンクス!>>みなさま
513506 :01/12/06 11:28
>>511
やべ、俺、板を誤爆しちゃったよ。
>>513

名前も誤爆(w
515509:01/12/06 11:33
うげげ、はずかしー誤爆。
かくなる上は逝って詫びます。

あ、でもココに居る日下部はみんな偽者らしいので相手にしても
しょうがないですよ。テイセツラシイデス
有意義な時間をお過ごしください。
>>950

次のスレNoは10ではなく0x0Aがいいな
頼んだぞ(まだ早いって)
ヲタばっかでつまんなかったム板が、日下部さんが来て以来おもしろ
くなった。毎日のぞいちゃうよ。
518Kusakabe Youichi:01/12/06 15:06
In article >>517, デフォルトの名無しさん/517 wrote:

> つまんなかったム板が、日下部さんが来て以来おもしろ
> くなった。毎日のぞいちゃうよ。

いごよろしく
来てるのは偽日下部だけだよ>>517
520iku:01/12/06 16:59
こんにちはikuです。
以下様な処理を環境Windows2000pro,SQLServerで
行いたいのですが,考え方としてどういうやり方で
やれば良いのかアドバイスを頂きたいと思い投稿しました。
端末を立ち上げると自動的にその端末の情報が
データベースに蓄積されるシステム(毎日更新予定)なのですが,
長期出張,産休といった人が出た場合,その端末は
立上がらないので何ヶ月も前の日付のデータが存在します。
理由あってそのデータを調査するという事で
今日の日付から一ヶ月前以上のデータを別テーブルへ
移動するという事をやる事になりましたが,
一ヶ月前,二ヶ月前,三ヶ月前のデータの
日付をどうやってわりだしたら良いのかわかりません。
どなたかこの日付調査で良い方法があったらよろしくお願いします。
何かCで参考になる関数,APIなどあれば・・・・
521デフォルトの名無しさん:01/12/06 18:19
sin()、cos()を使おうと思ったら
lib\math.lib: Warning: Unresolved external symbol 'errno'.
って言われてしまいます。ちゃんと
#include <math.h>
はしているのですが、なにが原因なんでしょう。

P/ECEなんですが教えていただけますか?
522デフォルトの名無しさん:01/12/06 18:22
errno.h
523デフォルトの名無しさん:01/12/06 20:02
C用のsplit関数のサンプルってどっかに無いですか?
お約束的な関数が沢山載ってるサイトを教えて欲しいです
524デフォルトの名無しさん:01/12/06 20:08
-lmをわすれてない?
525デフォルトの名無しさん:01/12/06 21:29
すいません、おもいっきり初心者です。
C言語を使ったプログラムで
時間計算をするプログラムを書けという問題がでたのですが
はっきりいってわからなかったんです。
問題は5曲の曲の時間の合計を出すというものです。
もしよければおしえてください。
526デフォルトの名無しさん:01/12/06 21:31
printf の変換文字列の
%g
%p
%n
って仕事でよく使うんですか?
527デフォルトの名無しさん:01/12/06 21:32
>>525
全部、秒に直せ!
そのあと足せ!
そして、戻せ!
ヒントをやろう・・・

1時間は60分ッ!!
1分は60秒だぁああーーッ!!
>>526
%gはあんまり使ったことがない。普段数値計算とかしないから。
%pはデバッグではよく使う。
%nは場合による。
529525:01/12/06 21:37
時間= t / 3600 を整数に切り捨てたもの
分= (t - ji * 3600) / 60 を整数に切り捨てたもの
秒= (t - ji * 3600 -分 * 60)

??
530デフォルトの名無しさん:01/12/06 21:44
入力された秒数を、時間、分、秒に変換する。

#include <stdio.h>

main()
{
int ji,fun,byou;

printf("秒数=");
scanf("%d",&byou);
ji=byou/3600;
byou=byou%3600;
fun=byou/60;
byou=byou%60;

printf("%d時間 %d分 %d秒\n",ji,fun,byou);
}

copyright (c) 林春比古@改訂新C言語入門スーパービギナー編
>>529
うむ。だんだん良くなってきたな。
ここで108ある秘奥義のうちのひとつを伝授しよう。

a = b % c;

これで a に、 bをcで割ったときの余りが入るぞ。
>>531
ごめん。いきなり答えばらしちゃった。
533デフォルトの名無しさん:01/12/06 21:49
あのー本屋はヴィジュアルc++ばっかりなんですけど、
C++ビルダーはもうないんですか?
MS製品は極力使いたくないんですけれど。
>>532
いいですよ。非奥義はあと107ありますから
>>530見てると、ろくな本じゃないような気がする
536Kusakabe Youichi:01/12/06 21:52
In article >>525, デフォルトの名無しさん/52
5 wrote:

> すいません、おもいっきり初心者です。
> C言語を使ったプログラムで
> 時間計算をするプログラムを書けという問題がでたのですが

書けばいいじゃん。

> はっきりいってわからなかったんです。

「どうわからなかったのか」の説明が、
「はっきりいって」だけじゃあわからないですね。
はっきり言ってってのはこの場合せいぜい「正直に言って」と同じ程度の意味の
ことしかいってないわけなので、ようやくすると
「xxxという問題が出たのですがわかりません」
とだけしか言っていないことになります。

> 問題は5曲の曲の時間の合計を出すというものです。
> もしよければおしえてください。

2:51 コルコヴァード
2:42 酒とバラの日々
3:15 ジョーンズ嬢に会ったかい?
3:55 イパネマの娘
5:16 D&E

という5曲の演奏時間の合計を手計算できない人には無理でしょう:)
537525:01/12/06 21:53
これで、曲数と分も入力できるようにしたいのですが
それは非奥義107に含まれていますか??
>>537
それは秘奥義には入ってない。
環境に依存するものは秘奥義には入らんのだ。

宿題ていどならばscanfでも使うがよかろう。
539デフォルトの名無しさん:01/12/06 22:01
かわいそう(笑)
540デフォルトの名無しさん:01/12/06 22:06
2:51 コルコヴァード
2:42 酒とバラの日々
3:15 ジョーンズ嬢に会ったかい?
3:55 イパネマの娘
5:16 D&E

という5曲の演奏時間の合計を求めるプログラムを結局は求めるの?

つーか宿題くらい自分でやれよ(w
541Kusakabe Youichi:01/12/06 22:07
In article >>526, デフォルトの名無しさん/526 wrote:
> printf の変換文字列の
> %g
> %p
> %n
> って仕事でよく使うんですか?

使いますね。%pは実装依存だけどよくつかう。
542Kusakabe Youichi:01/12/06 22:24
In article >>531, デフォルトの名無しさん/531 wrote:
> ここで108ある秘奥義のうちのひとつを伝授しよう。
> a = b % c;
> これで a に、 bをcで割ったときの余りが入るぞ。

bが負の数だったら? cが0のときは?
543デフォルトの名無しさん:01/12/06 22:27
C言語で小麦を作れますか?
544Kusakabe Youichi:01/12/06 22:32
In article >>537, 525/537 wrote:

> これで、曲数と分も入力できるようにしたいのですが
> それは非奥義107に含まれていますか?

それは107の1 n = 0; ... n++; を使うのでは?
545Kusakabe Youichi:01/12/06 22:47
In article >>543, デフォルトの名無しさん/543 wrote:

> C言語で小麦を作れますか?

Cでならできるかも。C言語では無理かも。
546デフォルトの名無しさん:01/12/06 22:53
ひたすら無視される悲惨な偽日下部(w
やっぱみんな、大人だわぁー。ここなら安心。
548Kusakabe Youichi:01/12/06 23:23
In article >>547, デフォルトの名無しさん/547 wrote:

> ひたすら無視される悲惨な偽日下部(w

ということにしたいのですね。
549デフォルトの名無しさん:01/12/06 23:25
sum += a;

sum = sum + a;
とどっちがいいの?
550デフォルトの名無しさん:01/12/06 23:29
>>549

どちらでもコンパイル時に精製されるものは変わらないでしょう。
後者書く奴は素人
552Kusakabe Youichi:01/12/06 23:34
In article >>549, デフォルトの名無しさん/549 wrote:

> sum += a;
> と
> sum = sum + a;
> とどっちがいいの?

Cだったら前者でいいのでは?
後者のように書く意味はとくにないでしょう。
入力分 : m
入力秒 : s

hour += (mim += (sec += s) / 60 + m) / 60;
min %= 60; sec %= 60;
554defaultの名無しさん:01/12/07 00:03
過去スレ検索してないけど質問してよろしい?
>>554

よい。
糞壁が書き込むよりずっとまし。
556Kusakabe Youchi :01/12/07 00:05
>>554

スレって何ですか?
>>556
ここは祭り禁止ですよ。
>>554
とりあえず >>1 にある C FAQ だけは読んどけ。
559defaultの名無しさん:01/12/07 00:16
>>558
>>1のC FAQを見てもわかりませんでした。
一体日下部陽一って何なんですか?
560あり:01/12/07 00:18
fread()とかでファイルを読むときにfp指定するけど、
このfpって次に使うときは、進んだままになっちゃうの?

はじめてのCって本の例題見るとそんな感じになっていました。
>>560
戻したければ fgetpos(), fsetpos() 使う。ftell(), fseek() でも良いけど。
>>559
それはプログラマー板で聞きましょう。技術じゃないし。
563Kusakabe Youichi:01/12/07 03:36
In article >>560, あり/560 wrote:

> fread()とかでファイルを読むときにfp指定するけど、
> このfpって次に使うときは、進んだままになっちゃうの?

fpで指している構造体の中の一部にそれを覚えておく箇所があるわけですね。
次にreadしたりwriteしたりfseekしたらずれますが。
fpで指している構造体を使わないreadやwriteを使ってもずれるわけですか。
不思議ですね。
a〜hまでの8文字の中から4つを選び出す組み合わせを全て表示するプログラム
を知りたいのですが、

グーグルで「c 組み合わせ アルコリズム」で出ますか?
566デフォルトの名無しさん:01/12/07 07:11
日下部は騙りを無くすためにトリップ使え。
567デフォルトの名無しさん:01/12/07 10:10
日下部先生マンセー
568Kusakabe Youichi:01/12/07 10:13
In article >>567, デフォルトの名無しさん/567 wrote:

> 日下部先生マンセー

ビル建設中にべつの場所にあったときのほうがおいしかったですね > 黒豚のトンカツ
>>568
わ、わかりにくい... 一瞬考えてしまったが肉屋の方か。
570time.h:01/12/07 11:53
時間の話題なのに、おもいっきり無視されてる…
ウツダ
小数点以下一桁を切り上げする方法と
割算の答えを100桁(割り切れた場合はその桁まで)表示する方法を
教えてください。お願いします。
572デフォルトの名無しさん:01/12/07 15:46
>>571
>割算の答えを100桁(割り切れた場合はその桁まで)表示する方法を

ライブラリでも用意するしかないよ。
>>571
> 割算の答えを100桁(割り切れた場合はその桁まで)表示する方法を
そんなに大きな桁を何に使うの?
無量大数でも68桁(88桁の説もあり)なのに...
574デフォルトの名無しさん:01/12/07 16:39
K&Rを勉強中の初学者です。
演習2-9で分からないところがあるので、おしえていただきたいのです。

コードの改良は、

int bitcount (unsigned x)
{
int b;

for (b=0;(x=(x & (x-1)) != 0;b++)
    ;
return b;
}

でいいんじゃないかと思うのですが、

2の補数システムではなぜそうなるか、の説明がよくわかんないです。

最も右の1ビットから下位ビットが1の補数となり、&によって、0がセットされるため、
最も右の1ビットが消える。

では、ちょっと的外れのようなので、正しい理由を教えていただきたく思います。
もちろん、コードの間違いもありましたら、お願いします。
575571:01/12/07 16:45
>>572-573
課題で出されたものです。
もしかして課題とかの質問はだめですか?
ちょっと一人ではわからないので詳しい人に聞きたいのですが...
576デフォルトの名無しさん:01/12/07 16:50
>>575
「多倍長整数演算」とかで、検索かけてみ。
ここで説明するのはきつい。
577デフォルトの名無しさん:01/12/07 16:52
>>574
コンパイルする環境ないの?
そのコードは動いてないよ。
>>574
何も間違ってないぞ。
その解釈であってる。
>>574
101000 (x)
100111 (x-1)
100000 (x & (x-1))
580571:01/12/07 17:07
>>576
ありがとうございます。
srtcmpを使って数字を比較しようとしているのですが、
これだと2つの値が同じときでも後者が大きいと判断
されてしまいました。
ちゃんと等しいときに0を返してくれるのってどうすれば
いいのでしょう?

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

int main(){
char a[2],b=0;
a[1]=10;
a[2]=10;
b=strcmp(&a[1], &a[2]);
printf("a[1]: %d a[2]: %d b=%d\n",a[1],a[2],b);
if(strcmp(&a[1], &a[2])==0)
printf("等しい\n");
else if(strcmp(&a[1], &a[2])>0)
printf("a[1]が大きい\n");
else
printf("a[2]が大きい\n");
}
583571:01/12/07 17:49
>>581
ありがとうございます。
読んでみましたがよくわからないです。。。

C言語及びプログラム言語初心者には
難しい課題を与えられた気がします。。。
もっと簡単にできないでしょうか?
>>582
> srtcmpを使って数字を比較しようとしているのですが、
そもそもstrcmpは数字を比較するものではない。

> ちゃんと等しいときに0を返してくれるのってどうすれば
> いいのでしょう?
「ちゃんと等しい」をもっと「ちゃんと」定義して欲しい。

とりあえず
> if(strcmp(&a[1], &a[2])==0)
if(a[1] - a[2])
では駄目なのか?
>>582
>srtcmpを使って数字を比較しようとしているのですが、
もうね、アホかと。馬鹿かと。
あのさぁ、だめだめ!
割り算ってどーやるの?あれ?
まずふつーにやるだろ?余りがでんだろ?
その次どーすんの?0くっつけんだろ?それってなに?10倍ジャン?
そーやってやると小数圏に突入(乳突起きぼんぬ)すんだろ、
そんでつづけていけば最高じゃんか

そーやってやれ。余裕だ。
>>584
> そもそもstrcmpは数字を比較するものではない。
ごもっともです。
でも、a[1],a[2]を文字に置き換えてもstrcmpの結果が
0にはなってくれません。

とりあえずif(a[1]-a[2])でもできないこともなさそうです。
ありがとうっす。
>>582
すごい妄想だな!
strcmpは同じだとTRUE=1を返すんだっけ?そこが逆?
あと、数字の大きさ比較するにはなにも、引き算でいいじゃんか
引き算したかったらatoiを使えYO
たとえば文字(列)"4"を数字でつかえる4にしてくれるZO
ちなみにAPI板にも寄ってください・・・
591デフォルトの名無しさん:01/12/07 18:05
そこまでたたかなくてもいいじゃん(^-^;
宿題レスにもな。
>>574
for (b=0; x != 0; x&=(x-1), b++)
にしないと、x=1のときゼロになる
>>587
> でも、a[1],a[2]を文字に置き換えてもstrcmpの結果が
> 0にはなってくれません。
残念ながらstrcmpは「文字」を比較するものでもありません。
「文字列」を比較します。

「文字」と「文字列」の違いについては入門書を良く読んでください。
とりあえず添え字は0からだよ、a[2]は書いてはいけない領域
つーか複雑なこといわなくても、
文字を比較したかったら=使えばいいじゃんか
strcmpは文字も比較できるぞ。
=使ってて例えばabcdefghi(\0)からbcdなりcなりを
抽出したいときはどーする?そーゆーときstrcmpとか
シリーズを使うのだ!
>>596
> strcmpは文字も比較できるぞ。
できません。
できると思う人はできる例を示してください。

char a = 'a';
char b = 'a';
これをstrcmpでどう比較するの?
>>597
strncmpを使えばできるね。
strcmp(&a,&b)でも比較対象a,bのそれぞれのすぐ後ろが'\0'なら
できないと言えなくも無いね。

だけど、そんなコードを俺の目の前で書いたら、氏なす。
599デフォルトの名無しさん:01/12/07 19:43
>>598

それはたまたま'\0'があったらってことだよね?
多くの場合において無いと思うから、同じ文字だったらアクセス違反になるだろうね。

ところで、なんで比較演算子を使いたがらないんだろう?
数字が昇順に並んでいない文字コードがあるの?
もしあったとしても、atoi()で変換してやればいいじゃない。
600599:01/12/07 19:44
あ、昇順に並んでいなかったらstrcmpもstrncmpも使えないか・・・・
601Kusakabe Youichi:01/12/07 19:58
In article >>599, デフォルトの名無しさん/599 wrote:
> ところで、なんで比較演算子を使いたがらないんだろう?
> 数字が昇順に並んでいない文字コードがあるの?

けっこうありますね > そういうコードセット
602Kusakabe Youichi:01/12/07 19:58
In article >>600, 599/600 wrote:

> あ、昇順に並んでいなかったらstrcmpもstrncmpも使えないか・・・・

え、それとは独立な問題ですよ。
>>597
馬鹿言うな
文字比較したいときは人間の手で一文字の
配列をつくるんですYO。
たとえば文字(列)検索ルーチンで
わざわざ一文字と複数文字の区別するんですか?
(ちょっとはするけどさ)基本的に文字列としてあつかうでしょ?
604Kusakabe Youichi:01/12/07 20:07
In article >>603, デフォルトの名無しさん/603 wrote:
> たとえば文字(列)検索ルーチンで

どっちですか? > 文字/文字列
糞壁が痛い人を呼んでいるので終了。
Cに於いて文字列とはヌルターミネートされた文字の並びを指します(例え一文字でも)
strcmpは文字列を対象に書かれてますので、文字の照合は///出来ません///
>>strcmp(&a,&b)でも比較対象a,bのそれぞれのすぐ後ろが'\0'なら
>>できないと言えなくも無いね。
この辺りから糞壁信者っぽい、ネタにもならんね
607デフォルトの名無しさん:01/12/07 20:28
大体文字と文字列の区別なんて意味がわかっちまえば
こだわる必要ねーんだよ。意味がわかったら
人間語の文字つー意味にもどれよ。
要は終記号がないとコンピューターが判断できない
つー話でしょうが。

テキスト中の文字(列)検索したいときに
いちいち一文字と複数文字の区別考えて
「えーっと、いま検索窓にaっていれたから
今は文字検索したな」やれ「あ、”あいう”っていれたから
これから文字列検索をします!」とか下らんことかんがえる
わけですか?語句検索すんのに文字も文字列もきにしないんですけど。
608デフォルトの名無しさん:01/12/07 20:33
じゃぁ文字照合したいときはどーすんの?
できないじゃん。
どーせちょちょっとやって、strcmp使ったって
いいんじゃんか。おんなじことだぜ?ほかの方法つかったって。
609Kusakabe Youichi:01/12/07 20:35
In article >>605, デフォルトの名無しさん/605 wrote:
> 糞壁が痛い人を呼んでいるので終了。

わたしのせいにしようとしても無駄ですよ:)
呼んでいるのはあたなでしょう:)

> Cに於いて文字列とはヌルターミネートされた文字の並びを指します(例え一文字でも)

なんじゃそりゃ:) > 例え
610Kusakabe Youichi:01/12/07 20:36
In article >>607, デフォルトの名無しさん/607 wrote:
> テキスト中の文字(列)検索したいときに

で、どっち? :) > 文字/文字列
611デフォルトの名無しさん:01/12/07 20:38
以下605の戻って無限ループ
===終了===
(・∀・) デンパイタデヤッテロ!!
613デフォルトの名無しさん:01/12/07 20:48
うぉ!まだ言ってるんのか!
僕はヤフー検索するのに文字か文字列
なんて考えません。語句です。語ですか?句ですか?
とかいっちゃうあなたにマイナス1点
だいたいあなた、間違ってるYO.
文字列or文字、それでWholeをカバーするんですか?
絶対にどっちかだ!とか考えてんでしょ?
文字列を文字の区別はYes or Noとは違いますよ?
僕は人間言葉の文字という意味を使った。
614574:01/12/07 20:50
有り難うございました。
考え出したら、ぐるぐる巡ってしまって、ちょっと解んなくなってました。
コードは、')'が足りなかったですね。
有り難うございます。

では、また、頑張ってみます。
ここで糞壁を煽るのは良いけど、技術的な突っ込み所満載な悲惨さまでは
再現しなくていいよ (^^;
616Kusakabe Youichi:01/12/07 20:52
In article >>613, デフォルトの名無しさん/613 wrote:

> うぉ!まだ言ってるんのか!
> 僕はヤフー検索するのに文字か文字列なんて考えません。

っていうかどっちですか?

1文字の文字と、
1文字の文字列は別物ですよ。
いやマジで他所でやって頂きたい
>>613
>僕は人間言葉の文字という意味を使った。
人間言葉の文字って何? 検索しても出てきませんが?
618デフォルトの名無しさん:01/12/07 20:58
サイコロをA回振ります。
1〜6のそれぞれの目が出た回数を記録していきます。
振り終わった時に考えられる結果(1がm回、2がn回、3が…)
の総数と、一番多く出た目の数と一番少なく出た目の数の
差がB以下になる確率を出します。
Aを入力してからBを入力すると計算が始まります。
不正な数字が入力された時のチェックなどは省いています。
と、いうプログラムを気合で作りました。C初心者です。

添削希望です。
もっといい書き方などありましたら教えていただきたいです。
2回に分けてコピペします。
619618:01/12/07 20:59
#include<stdio.h>
#include<conio.h>

void count(int *a,int margin,int *total,int *hit);
void haji(int *a,int *b);
void indec(int *a,int *b);

int zzz=0;

int main(void)
{
int eye[6]={0,0,0,0,0,0},margin,shake;
unsigned long int total=0,hit=0;
char ex;

printf("振る回数 … ");
scanf("%d",&shake);
printf("差 … ");
scanf("%d",&margin);

eye[0] = shake;

while(eye[5] != shake){



if(eye[5])haji(eye,eye+5);
else if(eye[4])indec(&eye[4],&eye[5]);
else if(eye[3])indec(&eye[3],&eye[4]);
else if(eye[2])indec(&eye[2],&eye[3]);
else if(eye[1])indec(&eye[1],&eye[2]);
else indec(&eye[0],&eye[1]);

count(eye,margin,&total,&hit);


}
count(eye,margin,&total,&hit);

printf("\n\n振る回数:%d回 差:%d以下\n",shake,margin);
printf("パターン数:%ld ヒット数:%ld ヒット率:%.15lf%\n\n",total,hit,(double)hit/(double)total*100);
printf("何かキーを押すと終了します。");

ex=getche();

if(shake>70){
printf("\n!!再確認!! 何かキーを押すと終了します。");
ex=getche();
}

return 0;

}
>615 寧ろ技術的な裏付けの無い発言を書き捨てる時の共有コテハン (w
つーか下げでやれ下げで
621618:01/12/07 21:00
void indec(int *a,int *b)
{
(*a)--;
(*b)++;
}
void haji(int *a,int *b)
{
int i,kou=*b;

if(zzz < *b){
zzz = *b;
printf("%3d ",*b);
}
*b = 0;

for(i=4;;i--){
if(*(a+i)){
*(a+i+1) = kou;
(*(a+i+1))++;
(*(a+i))--;
break;
}
}

}
void count(int *a,int margin,int *total,int *hit)
{
int i,high,low;

high = *a;
low = *a;

for(i=0;i<6;i++){
if(high < *(a+i))high = *(a+i);
}

for(i=0;i<6;i++){
if(low > *(a+i))low = *(a+i);
}

if(high - low <= margin)(*hit)++;

(*total)++;
}


以上です。よろしくおねがいします。
eyeは無いでしょ(^-^;
623あぼーん:あぼーん
あぼーん
624618:01/12/07 21:13
>>622
あの、では、eofdieですか?英語弱くて…
あと、コメント無くてスイマセン。
>>608
> じゃぁ文字照合したいときはどーすんの?
strchr
ちなみに文字列照合の場合はstrstrを使う。

>>616も言っているが
「文字」と「文字列長が1の文字列」は別物

入門書から読み直せ
626Kusakabe Youichi:01/12/07 21:26
In article >>625, デフォルトの名無しさん/625 wrote:
> 入門書から読み直せ

どんな入門書がよいでしょう?
「作ってわかるCプログラミング」を万引き
「ツクッテワカル Cプログラミング」ニ キマッテルダロ
作ってわかるCプログラミング、紙質が素晴らしいね
紙面の余白がとても多いのも良い、メモ帳にぴったりですね
次からはミシン目を入れて下さい :-D
630Kusakabe Youichi:01/12/07 21:35
In article >>629, デフォルトの名無しさん/629 wrote:

> 作ってわかるCプログラミング、紙質が素晴らしいね

はい、ペイジ数がとても多いのに、厚さを増さないように、
高い紙を使ったそうです。

> 紙面の余白がとても多いのも良い、メモ帳にぴったりですね

え? 余白は「少ない」ですよ。わたしはもっと余白をとってほしかった
(とくに小口側じゃなくてノドの側、ぎっしりすぎて読みにくい)

「余白が多い」とかって、ようするに実物見てないのでは? :)
(ここで誰かが書いてたデマを信じて書いたんだったら、恥かくだけですよ^^)
>>627-629
ここでやるなよ。
隔離板へ逝け。
>>626
C言語入門書
http://www.amy.hi-ho.ne.jp/~lepton/program/prog/prog78.html

によると
> 「悪い入門書」のチェックポイント
> ・著者のイニシャルがK(あ、あとついでにMも)である :-p
だそうです。
# 例えばK下部とかかな?
633574:01/12/07 21:39
593さん、有り難うございます。
あの辺りのスレ読み飛ばしていました。
オライリーのC実践でいいんじゃないの?
635デフォルトの名無しさん:01/12/07 21:45
>>632

http://www.amy.hi-ho.ne.jp/~lepton/program/mail/19990628.html
78の K西本批判は、その通りだと思います。
だから俺は明示的にC言語の「文字」
の意味だ、と言った覚えがないのだが
分かった分かった「人間言葉の文字」だよな (w
>>636
ここは C 言語スレです。一般的な「文字」について語りたいなら、別のスレでお願いします。
(そもそも「俺」って誰だよ、番号書いてくれないと名無しさんばっかで分からん)
人間言葉の文字

The character of human language

人間の言語の特徴
640デフォルトの名無しさん:01/12/07 22:52
だったら君はテキスト内を検索
するときにせいぜいアスキーコードでも
使って配列でもつくるんだねw
641Kusakabe Youichi:01/12/08 02:48
In article >>636, デフォルトの名無しさん/636 wrote:

> だから俺は明示的にC言語の「文字」

明示的っていう日本語はないですね。
どっけ池、糞壁!(・∀・ )♪
643仕様書無しさん:01/12/08 03:31
上京を「京都に行くこと」と訳す人間に、
日本語語って欲しくないです。
644デフォルトの名無しさん:01/12/08 03:46
上京ってのは、みやこへ行くことだろ。
京都の人間にとっちゃ、みやこは今でも京都だし、
それを聞いた東京の人間は、とっくに遷都しただろと思う。
スレ違いかつ板違い。
>>643
誤植です。
647Kusakabe Youichi:01/12/08 08:30
In article >>643, 仕様書無しさん/643 wrote:

> 上京を(I☆ぢ京都に行くこと(I?C般?C洪祐屬法「

何言ってるんだかわからないですね。
それはCとは関係あるの? 関係ないならsageでね。
>>648
> それはCとは関係あるの? 関係ないならsageでね。
sageていれば関係無いことをいくら書き込んでもいいということですか?
なんでKusakabeの引用は化けるの?
651Kusakabe Youichi:01/12/08 12:15
In article >>650, デフォルトの名無しさん/650 wrote:

> なんでKusakabeの引用は化けるの?

わたしのが化けているのではなくて、もとのがいけないだけでは?
kusakabeが悪いよ。
653Kusakabe Youichi:01/12/08 12:19
In article >>652, デフォルトの名無しさん/652 wrote:

> kusakabeが悪いよ。

いいえ。
どうせKusakabeが変なソフト使ってるんでしょ。
voidタン・・・ハァハァ
656Kusakabe Youichi:01/12/08 12:26
In article >>654, デフォルトの名無しさん/654 wrote:

> どうせKusakabeが変なソフト使ってるんでしょ。

私のは問題ないですね。
>>656
JIS X 0201仮名が化けたり、JIS X 0208の英数字をISO 8859-1に変換したり
するのは、少なくとも2chの閲覧に限っては問題あると思います。
閲覧するだけならどうでもいい話ですが、引用時にそれを行うのは著作者人格権の
同一性保持権を侵害していることになります。
658Kusakabe Youichi:01/12/08 13:23
In article >>657, デフォルトの名無しさん/657 wrote:
> JIS X 0201仮名が化けたり、JIS X 0208の英数字をISO 8859-1に変換したり

はつみみです。
659デフォルトの名無しさん:01/12/08 13:40
やあみんな!元気?

strcmpで文字列でなく (見た目上)文字を比較する方法を編み出したよ!
やり方は簡単さ!

int a = 'a';
int b = 'b';

if( strcmp(&a,&b) )printf("chigau\n");

ほら、これなら 文字を比較 してるように見えるだりろぉ?

あー石投げるな〜機種依存〜
660デフォルトの名無しさん:01/12/08 14:14
>>619
変数名、引数名が適当すぎる。
それじゃ添削以前に、やってることが理解できないから
読む気がしない。

もっと意味のある変数名にするか、コメントで説明をつけてくれ。
変数名がちゃんとしていれば、コメントは最小限で済む。
つまらない。
if ( a < b ) kill(>>659);
662Kusakabe Youichi:01/12/08 14:21
In article >>661, デフォルトの名無しさん/661 wrote:

> つまらない。
> if ( a < b ) kill(>>659);

2項演算子ですね。
663デフォルトの名無しさん:01/12/08 14:22
下位7ビットでasciiをサブセットに持っていない文字コードは何があるの?
664Kusakabe Youichi:01/12/08 14:25
In article >>663, デフォルトの名無しさん/663 wrote:

> 下位7ビットでasciiをサブセットに持っていない文字コードは何があるの?

いくらでもあるとおもうが。
665デフォルトの名無しさん:01/12/08 14:27
>>661
つまらない、って一刀両断することも無いだろ。

どうして特定の環境で>>659のコードが正しく動いてしまうのか
ということを考えてみた方が面白くはないか?

少なくとも俺が昔このコードを読ん
666デフォルトの名無しさん:01/12/08 14:31
>664
具体的に教えて。
そしてその文字コードを使うOSも教えろゴラア。
>>665
読ん?続きないの?
>>665
> 少なくとも俺が昔このコードを読んだときには一目で動く理由がわかったぞ
>>668
> 少なくとも俺が昔このコードを読んだら一目で恋に落ちたぞ
670デフォルトの名無しさん:01/12/08 14:50
ゴルゴの標的にされた模様。>>665
671デフォルトの名無しさん:01/12/08 14:50
過去ログdat待ちでこのスレしかみてないんですけどなかったから質問です。

RS232Cシリアルポートの送受信ってどするのでしょう?
osの上ならポート指定してwrite、readするだけ。
>>671
I/Oポートに直接ガンガン書けばいいんじゃない?
あと受信はタイマかスレッドで定期的にしろ。
>>674
割り込みつかうのは邪道?
使える環境ならそれを使う。
だいたいOSの上からは割り込みなんて使えんだろ。
>>659
リトルエンディアンでも、plain charがsigned charの処理系で
'\377'とかと比較したら面白いことになるな。
678デフォルトの名無しさん:01/12/08 15:22
672〜676 レスありがと でもわからん。

えーとレスつくようなのでもう少し説明。
環境 Win98でVC

状況

ぶっちゃけて言うと手付かずです。とりあえずどっかのサンプル見て
勉強してから質問しようと思ったんですけど、それすら見つからなかった。
局地的なプログラムならちらほらあったけど、よくわかるのはなし。
で、参考文献とかでもいいので教えてもらいたい。

目的

とりあえず、受信と送信を確立したい。

たぶんオレはすごく間抜けな質問してるんだろうな・・・みなさん大目にみてください。
ちなみにCの経験は大学の授業レベルです。
(つまりポートやタイマなんて関係のないプログラムしか作ったことないんです)
DCB構造体で通信パラメータをセットする。
あとはファイルのリードライトと同じ要領。
ハンドシェイクやプロトコルは適当に自分で考えろ。
ってゆーかVC++関連スレのほうが良いのでは?
680名無し:01/12/08 16:53
HTML(2.X、4)は、codesetとして、UNICODEが規定されている。
で、news<->2ch Converterの仕様か、iso-2022-jpの仕様かは
知らんが、UNICODE文字が、すべてはmapされない。
だから、Halfwidth Katakanaとかハングルとか、見えなくなってしまう
文字の出てくる可能性だって、あるわけ。
だれが悪いのか、って言えば‥‥‥文化摩擦としか。
#Halfwidth Katakana領域を正しく変換しないコンバータが責任かも
個人的には、UNICODE実体参照とかをどう処理するかも気になるが。
クソカベニ ヨメナイヨウニ ハンカクカナ デカキコモウ ... シネ クソカベ!!!
>>678
こんなのあったけど、どうか。
ttp://www.vector.co.jp/soft/win95/prog/se173131.html
683681を全角に復元してみました:01/12/08 21:57
>>681
> クソカベニ ヨメナイヨウニ ハンカクカナ デカキコモウ 。。。 シネ クソカベ!!!
684デフォルトの名無しさん:01/12/08 22:27
0.1 を10回足したいときはどうすればいいの?
685デフォルトの名無しさん:01/12/08 22:30
>>684

0.1*10;
>684
深入りしたくない場合、
予め計算機で計算して即値で 1 と書いておきます。
言語によっては、RationalとかRatio aとかのクラスか型が
有るので、それを使います。
687686:01/12/08 22:34
スレ違いだった。Cスレだった。
688デフォルトの名無しさん:01/12/08 22:36
>>685
それって数学的に正しい答えが出るって保証されてるの?
689デフォルトの名無しさん:01/12/08 22:44
入門書を見ると
int main(void)
って書いてあるけど、これって正しいの?
int main()
のほうがいいんじゃないの?
>>689

ANSI C準拠のコンパイラならどちらでもいいと思うけど。
Cではmain()はmain(...)だったと思うから
main(void)の方が良いだろう。
>>691
あんさん、それプロトタイプ宣言の時だけですぜ。
最後にセミコロンが無いから、689は関数定義の話をしていると思われ。
693デフォルトの名無しさん:01/12/08 23:11
じゃあ、プロトタイプ宣言の時は
int main(void);
で、関数の時は
int main()
でいいんですね?
694デフォルトの名無しさん:01/12/08 23:12
古いコンパイラーで、
char 型の範囲が、0 〜 255
のものって生き残ってるの?
C++より、Cがむずかしい
CよりHSPがむずかしい
>>694
char が signed ではなく unsigned のものがあるか、って話?
698デフォルトの名無しさん:01/12/08 23:44
>>697
そう。
getchar()をcharで受けてはいけない。int で受けなさい、という説明で、
現在のコンパイラーでは、charは -125〜126 だけど、古いコンパイラーでは
0 〜 255 だから、EOFで-1を返すgetchar()を受けるときは、安全性を考慮してintで宣言する、という
説明を読んで、そんな古いコンパイラーいまだに使ってるところあるのかよ。と思ったのです。
あと、ANSI的にはどっちが正しいの?
699デフォルトの名無しさん:01/12/08 23:50
>>698
>ANSI的にはどっちが正しいの?

char が符号付か符号無しかは、処理系によって違う。
あたらしい、古いの問題じゃなくて。
>>698
getchar()で返すのはEOFと0〜UCHAR_MAXのUCHAR_MAX+1通り。
(charが8bitの場合は-1〜255の257通りね。)
signed charでもunsigned charでも足りんと思わんか?
>>698 VC++6 でも /J スイッチつければ char が 0〜255 だぜ
/J default char type is unsigned
ちなみに -125〜126 ってのはいったいどこから出てきた数字?
-127〜127 または -128〜127 ならわかるが。
>>701
> -127〜127 または -128〜127 ならわかるが。

-127〜127ってのはいったいどこから出てきた数字?
-128〜127 ならわかるが。
703701:01/12/09 01:09
>>702よ、ISO標準C90 から出てきた数字だ
<limits.h> SCHAR_MIN/MAXの最小値は -127,+127 と規定されとる
世の中「2の補数系」ばかりじゃないからな
>>702
> -127〜127ってのはいったいどこから出てきた数字?
1 の補数表現でしょ。
705Kusakabe Youichi:01/12/09 03:03
In article >>689, デフォルトの名無しさん/689 wrote:

> 入門書を見ると
> int main(void)
> って書いてあるけど、これって正しいの?

どの入門書ですか?
706Kusakabe Youichi:01/12/09 03:05
In article >>698, デフォルトの名無しさん/698 wrote:

> >>697
> そう。
> getchar()をcharで受けてはいけない。int で受けなさい、という説明で、
> 現在のコンパイラーでは、charは -125〜126 だけど、古いコンパイラーでは
> 0 〜 255 だから、EOFで-1を返すgetchar()を受けるときは、安全性を考慮してintで宣言する、という
> 説明を読んで、

そりゃ説明が間違っているって。
べつにunsignedのがあるからintになっているわけじゃあない。

いったいどこにそんなウソの説明が書いてあったんだ。
707デフォルトの名無しさん:01/12/09 03:05
Cで掲示板作りたいんだけど、お勧めHP無い?
708デフォルトの名無しさん:01/12/09 03:11
709 :01/12/09 03:47
どっかにシグナルハンドラのサンプルソースないかな?
>>709
ってどんなんだ?
sigaction()の使い方、とかだったらUnix系のフリーソフトのソース
見るんじゃ駄目なのか?
man sigaction読んでコード書けない頭なら
プログラミング止めた方がいいよ
712デフォルトの名無しさん:01/12/09 19:24
sprintfが出力する文字数を、
呼び出す前に調べる方法無いですかね?
713Kusakabe Youichi:01/12/09 19:31
In article >>712, デフォルトの名無しさん/712 wrote:

> sprintfが出力する文字数を、
> 呼び出す前に調べる方法無いですかね?

sprintfをエミュレイトする関数をつくればいい:)
>>712
fprintf, vfprint で /dev/null (\\.\null) に書き出して、戻り値をチェック。
>>713
それが面倒なので…

>>714
winの場合は"\\.\null"のファイル開いてそこに書き出すってことですよね。
ありがとうございます。
ああ、久しぶりにヌルヌルしたい。
>>715
> winの場合は"\\.\null"のファイル開いてそこに書き出すってことですよね。
Yes

ただファイル名は \\.\nul が正解 (l は1つ)ね。すまん。
718デフォルトの名無しさん:01/12/10 00:35
文字列がひらがなだけかどうか検索する関数って
簡単な奴ご存知でしょうか?
あとひらがなをかたかなに変換する関数とかあったら
お願いします。
719雪江:01/12/10 00:38
>>718
簡単に実装するには、ひらがなデータベースをつくって
全文字比較 ・・・でしょうね。
変換もまた同じです。
文字コード関係は煩雑だから適当なライブラリを拾うといいと思いますよ

がんばって
720デフォルトの名無しさん:01/12/10 00:43
>雪江さん
どうもありがとう! 頑張ります。
721デフォルトの名無しさん:01/12/10 00:46
\\.\って何?
722名無し:01/12/10 03:11
>>712
たしか、WTLのCString::Formatが、sprintfの文字数を
数えてたかも。
>>718-720の展開ってどうなんですか?
突っ込まなくてもいいのですか?
文字コードがどうのとか言わなくていいのですか?
724さんばー:01/12/10 10:18
ソケットを作って、send(Socket,buf,strlen(buf),1);
でデータを送信するプログラムをC+winsockでを書いているのですが、
closesocketするか、プログラムを終了させないとデータが届きません。
おそらくどこかにバッファされてしまっているのでは、
と思っているのですが、どのようにするとすぐにsendした内容が
届くように出来るのでしょうか。
何で最後のflagsパラメータに1なんか指定してるんだ?
バンド外データとして送信したいのか?
winsock.h
#define MSG_OOB 0x1 /* process out-of-band data */

つーか、スレ違いだけどな。
726さんばー:01/12/10 14:04
>725
すみません単に間違えました。フラグは0にしています。
perlだと $|=1;してストリームをフラッシュしますよね。
このような動作が必要なのではと思っているのですが・・・
727デフォルトの名無しさん:01/12/10 16:00
puts() って数字は出力できないの?
728味噌醤油醸造株式会社:01/12/10 16:03
>>727
int n = 1000000;
puts((const char*)&n);
>>728
おいおい、ネタか?
'\0'が見つからなくて暴走する可能性があるぞ。

>>727
> puts() って数字は出力できないの?
できん。文字列に変換しろ。

char buf[100];  // バッファサイズは適当
sprintf(buf, "%d", n);
puts(buf);
>>724
しばらく時間がたつと送信されると思うけど
バッファしてほしくないときはsetsockoptでTCP_NODELAYを指定する。
731デフォルトの名無しさん:01/12/10 18:07
fgetsでファイルの一行を読み込み、sscanfでデータをセットする場合、
sscanf(line,"%s %s...", data1,data2,...)としたいのですが、
フォーマットの形式が極端に長い場合、これを使うと書くのに時間が
かかるのですが、これ以外の方法はないのでしょうか?
>>731
エディタにコピーの機能はないのでしょうか?
733Kusakabe Youichi:01/12/10 18:11
In article >>731, デフォルトの名無しさん/731 wrote:
> sscanf(line,"%s %s...", data1,data2,...)としたいのですが、
> フォーマットの形式が極端に長い場合、これを使うと書くのに時間が
> かかるのですが、これ以外の方法はないのでしょうか?

そんなにかかりませんよ。

全部%sばかりで同じ繰り返しならば、
少しは速くする方法はありますが、まあそれでも3倍速くなるわけではないですが。
734デフォルトの名無しさん:01/12/10 18:38
>>731
Emacs Lisp でマクロを組む。
735まあ:01/12/11 00:19
>>731
こんなのはどう?
736そもさん:01/12/11 01:37
C言語の師と見込んで質問いたします。

マルチスレッド化するとき
スレッドセーフでないかもしれない
malloc/free(new/delete)を遣うときは
クリティカルセクションでくるむべきでしょうか?
737デフォルトの名無しさん:01/12/11 01:41
じょーきょーよくわかんないけど、もう一段抽象化というか
間に1つクッションいれた設計にしたらどーかしら?

poolアロケーターとか、GCつかうこと考えてもいいんじゃない?

www.annexia.orgにある、c2libってなかなかいいよ。
738デフォルトの名無しさん:01/12/11 01:47
5bit*128の配列がほしい。
どうやってつくるんだ?
739デフォルトの名無しさん:01/12/11 01:47
↑もちろん、メモリ上で連続に確保だ。
740736:01/12/11 01:56
>>737
ありがとうございます。
メモリ管理を集中的に行うオブジェクトを導入して
オブジェクトのミューテックスにするという理解で良いでしょうか。
なるほど・・綺麗です。

>www.annexia.orgにある、c2libってなかなかいいよ。
ありがとうございます、見てきます〜。
>>738
何に使うんだ?
742デフォルトの名無しさん:01/12/11 02:02
スレッドセーフじゃないかもしんない環境ってもしよかったら
何なのか教えてください。

c2libはこの前つかったんですがUNIX系な環境でCでサーバー
書く目的には便利ですよ。Apacheのpoolベースの文字列、
各種コンテナ関数が独立したライブラリになったようなかんじです。
743736:01/12/11 02:18
>>742
>スレッドセーフじゃないかもしんない環境って
古い libc や DOS+gcc や組み込み系のオールドな環境です
今日びスレッドセーフでない環境のほうが珍しいと思われます。(^^;
>>738
unsigned char array[128/8][5];
int a120 = ((array[120/8][0]>>(120%8)) << 0)
     | ((array[120/8][1]>>(120%8)) << 1)
     | ((array[120/8][2]>>(120%8)) << 2)
     | ((array[120/8][3]>>(120%8)) << 3)
     | ((array[120/8][4]>>(120%8)) << 4);
745デフォルトの名無しさん:01/12/11 02:31
>>743
そうでしたか。Thanksです。気を使うことが多くて大変そうですね。
パズルといてるみたいで面白いかも?

処理効率の面で許されるならなるたけ「富豪的」にGCやプールで
ラクしたいですね。Bohem GCやc2libは使えるかどうか不明ですが、
参考にはなりそうですね。
746736:01/12/11 02:50
>>745
>処理効率の面で許されるならなるたけ「富豪的」にGCやプールで
>ラクしたいですね。
はい。スレッド消滅時にはアロケートしたメモリは解決する必要が
あるのでGCに処理してもらえると楽になります。メモリ管理だけでも
(私にとって)奥深いです。
747デフォルトの名無しさん:01/12/11 02:55
>>746
えっと話かわりますが、Hoardっつーのを思い出しました。
dosとか古いlibc向け用途にはダメですが、なかなか
ぐっとくる宣伝文句ですよ。

http://www.cs.utexas.edu/users/emery/hoard/
748 :01/12/11 13:27
eの値を小数点以下100桁まで求めよ。
πの値を小数点以下100桁まで求めよ。
749雪江:01/12/11 13:30
>>748
const char *PI =
"3.14159265358979323846264338327950288419716939937510"
"58209749445923078164062862089986280348253421170679";

int main()
{
puts(PI);
return 0;
}
751デフォルトの名無しさん:01/12/11 15:12
構造体のところではまっているのですが、
グローバルで、
struct _data{
int id;
char szdata[32];
}data[16]:
とかやって、
void func1(){
........
........
strcpy(data[1].szdata,"hogehoge");
printf("%s\n",data[1].szdata);
return;
}
とやると、ここでのprintfではきちんと参照できるのですが、
別関数で、
void func2(){
printf("%s\n",data[1].szdata);return;}
とやると、data[1].szdataには何にも格納されていないのですが、
なにか根本的に間違ってますか?
>>751
間違ってるようにま見えません。
なにか他のことが原因になってるのでは?
>>752
ほかの参考書などをみるに、ほとんどが
void main()内で、
struct _data data[16]などと
やっているものが多く、グローバルなデータベースとして
扱っているものが見当たらず、できないのかとも思ってしまいました

・・・・なんででしょ(・・・少しいらいらします)
>>753
的外れかもしれませんがvolatile宣言をつけてみてはどうでしょうか?
755Kusakabe Youichi:01/12/11 18:03
In article >>753, デフォルトの名無しさん/sage/753 wrote:

> >>752
> ほかの参考書などをみるに、ほとんどが
> void main()内で、
> struct _data data[16]などと

どんな本を読んでいるのでしょうか?
756Kusakabe Youichi:01/12/11 18:07
In article >>751, デフォルトの名無しさん/751 wrote:

> 構造体のところではまっているのですが、
> グローバルで、
(中略)
> なにか根本的に間違ってますか?

(1)「グローバルで」といいつつ関数定義のスコープ内で行っている。
(2)「別関数」といいつつ実はそれはべつのコンパイル単位にある。
(3)「値が格納されていない」ってのは実はコンパイルエラーがでてる。
(4) func1を呼び出す前にfunc2を呼び出していた。
(5) 実はfunc1は呼び出されていなかった。
(6) 1のつもりでlと書いていた
...
なんてことがないことを示すために
ソースをそのまま書いた方が早いと思うが。
757731:01/12/11 18:39
>>732-735
レスありがとうございます。
楽せずにコピペを繰り返すことにしました。
758人間のくず:01/12/11 18:39
「西暦年と月を入力するとその月の日数が表示されるようにせよ」
という問題教えてくれませんか?
if構文の問題なんですがelse if などがよく分かりません
759初心者:01/12/11 18:40
すいません本当に悩んでますC初心者です。
ファイルから文字列を読み込み表示してそれをタイプ
するんですがどうしてもgets()関数を実行してくれません。
どうしてですか?
void num(){
int n=100,i;
FILE *fp;
char honbun[10],fname[5],type_moji[10];

scanf("%s",fname);
fp1=fopen(fname,"r");
if(fp1==NULL)
exit(-1);
do{
printf("%s", fgets(honbun,n,fp1));
gets(type_moji);
}
while(!strcmp(honbun,type_moji));
fclose(fp1);
}
760初心者:01/12/11 18:46
line3 のFILE *fpは*fp1です。
761デフォルトの名無しさん:01/12/11 18:47
>>758
うるう年の計算方法はわかりますか?
762デフォルトの名無しさん:01/12/11 18:49
>>759
>char honbun[10],fname[5],type_moji[10];
いろいろあるけど、とりあえず、こうしてください。
char honbun[1024],fname[256],type_moji[1024];
763初心者:01/12/11 18:52
>>762
やっぱり出来ませんです。
764HELP!!:01/12/11 18:54
http://pc.2ch.net/test/read.cgi/tech/1003838158/966-967
           ↑
          966-967
765デフォルトの名無しさん:01/12/11 18:58
>>763
ファイルのオープンは成功してますか?
766758:01/12/11 19:00
>761
それくらいは分かります。
月が2・4・6・9・11月でないときは31日。
月が4・6・9・11月のときは30日。
月が2のとき
 西暦が100の倍数のとき400の倍数のときはうるう年で29日
                    そうでない場合は28日
 西暦が100の倍数ではないが4の倍数のときうるう年で29日
                   そうでないときは28日
 これをどう書いたらいいのかよく分からないんです。
767?Sメ:01/12/11 19:01
>>765
ファイルはオープンできてます。
読み込んだ文字列を表示して終ってしまいます。
768Kusakabe Youichi:01/12/11 19:13
In article >>766, 758/766 wrote:
>  西暦が100の倍数のとき400の倍数のときはうるう年で29日
>                  そうでない場合は28日
>  西暦が100の倍数ではないが4の倍数のときうるう年で29日
>                  そうでないときは28日

2行めと4行めは同じ場合では?

あと「4の倍数じゃないとき」を忘れてますね。

>  これをどう書いたらいいのかよく分からないんです。

ちゃんとした入門書でも買ったらどうでしょう?
769初心者:01/12/11 19:20
Kusakabe Youichi さん
<<759
お願いします。
>>766
もっと簡単に、
  西暦が400の倍数のとき、29日
  !(西暦が100の倍数) && (西暦が4の倍数)、29日
  その他、28日

とすれば。
771名無し:01/12/11 19:22
scanfが喰わずに残した\nを、getsが喰っただけの話では?
772デフォルトの名無しさん:01/12/11 19:24
>758
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/

これでいけるかな?
ちいうか検索くらいしれ。
773名無し:01/12/11 19:24
>770
  西暦が400の倍数のとき、29日
  西暦が100の倍数のとき、28日
西暦が4の倍数のとき、29日
  その他、28日
の方が素直な感じがするけどな。
774Kusakabe Youichi:01/12/11 19:25
In article >>769, 初心者/769 wrote:

> Kusakabe Youichi さん
> <<759
> お願いします。

ん? それは何ですか?
>>773
まっ、それでもいいけど(W
776初心者:01/12/11 19:31
>>771
出来ました。ありがとうございました。
>> Kusakabe Youichi
759をやってもらいたかったのです。
でも出来ました。また宜しくお願いします。
777初心者:01/12/11 19:41
fgetsでとってきた文字配列には改行を読み込む
ことによって終った場合 改行文字が含まれていますよね。
それを消す方法はないんですか?
778名無し:01/12/11 19:43
forで回して、\nと一致すれば、\0に置き換えればいいかと。
779デフォルトの名無しさん:01/12/11 19:44
ファイルオープンをエラーしたときにexit関数を使いたいのですが、
これはstdio.hには入っていない関数なんですか?
そんなもの定義されていないってエラーくらいました…。

どの本見ても他のヘッダファイルをインクルードしていないのに
この関数が当たり前のように使われているんですが。(カニチャーハンですら)

なにか私の知らないインクルード技術を使っているっていうことなんでしょうか?
780名無し:01/12/11 19:49
そーゆーときは、manするとか、includeファイルのある場所でgrepしてみしょうね。
781Kusakabe Youichi:01/12/11 19:49
In article >>776, 初心者/776 wrote:
> 出来ました。ありがとうございました。
> >> Kusakabe Youichi
> 759をやってもらいたかったのです。

なんだろう?
782初心者:01/12/11 19:50
>>778 助かりました。そうですね。
783Kusakabe Youichi:01/12/11 20:00
In article >>777, 初心者/777 wrote:

> fgetsでとってきた文字配列には改行を読み込む
> ことによって終った場合 改行文字が含まれていますよね。
> それを消す方法はないんですか?

Do you have a rubber? (英)
Do you have an eraser? (米)

172ペイジに書いてありますよ > それを消す方法は
784仕様書無しさん:01/12/11 20:10
>>782
読み捨ててもいいしね。
785Kusakabe Youichi:01/12/11 20:10
In article >>779, デフォルトの名無しさん/779 wrote:
> ファイルオープンをエラーしたときにexit関数を使いたいのですが、
> これはstdio.hには入っていない関数なんですか?

stdlib.hには入ってるのでは?

> そんなもの定義されていないってエラーくらいました…。

ほんとにエラーになったんだろうか...。

> どの本見ても他のヘッダファイルをインクルードしていないのに
> この関数が当たり前のように使われているんですが。

ちゃんとした入門書読んだら?
>>785
stdlib.hに関数が入っているのですか?
はつみみです
787(・∀・)イイ:01/12/11 20:47
厨房ですいません。
関数プロトタイプと標準ライブラリ関数って何ですか?
788Kusakabe Youichi:01/12/11 20:50
In article >>786, デフォルトの名無しさん/sage/786 wrote:
> stdlib.hに関数が入っているのですか?
> はつみみです

わたしもはつみみです。
789Kusakabe Youichi:01/12/11 20:55
In article >>787, (・∀・)イイ/sage/787 wrote:
> 関数プロトタイプと標準ライブラリ関数って何ですか?

前者は82、270ペイジ、
後者は77ペイジに書いてありますよ、
>>788
> わたしもはつみみです。
わたしははつみみです。
791779:01/12/11 21:08
>>785
ちゃんとした入門書…というのはどういうことでしょうか?
K&Rは名著だと聞いていたのですが…。(日本語版P199を参考にしました)

エラーになったことを証明しろといわれても。
VC++で
D:\VisualStudio6.0\VC98\make\Text.cpp(13) : error C2065: 'exit' : 定義されていない識別子です。
と言われているんですが…これでは証明になりませんか?

たしかにstdlib.hをインクルードすると動きます。
でも、参考書がインクルードせず載せているのが何故か、理由が知りたいのです。
792 :01/12/11 21:10
>>790
わたしははつかねずみです。
793 :01/12/11 21:12
K&RはC言語の本ですよ。
拡張子が.cppですからコンパイラはC++のソースとしてコンパイルします。
794Kusakabe Youichi:01/12/11 21:15
In article >>791, 779/791 wrote:

> >>785
> ちゃんとした入門書…というのはどういうことでしょうか?

K&Rでだめなら、ちまたにいっぱいある入門書から、ましなのをえらべという
程度の意味です。

> たしかにstdlib.hをインクルードすると動きます。

じゃあすればいいじゃん。

> でも、参考書がインクルードせず載せているのが何故か、理由が知りたいのです。

そういうのはK&Rに書いてあるので読めばわかると思うのですが、
K&Rの説明で意味がわからないなら、ほかのを読んだら? というだけのことです。
>>791
マジレスするとK&Rの本はあの人たちが
「おれたちゃーこういう風に使ってるんだよ」
と紹介してる本であって、間違っても入門書じゃないです。
もちろん入門書としても最高峰に位置しますが。
記述が抜けてるのは当たり前田のクラッカー って感じです。
はつみみですか?
はい、はつみみです。
796779:01/12/11 21:18
>>793
VC++の使い方がまずかったということでしょうか。申し訳ありませんでした。
まだVC++を手に入れたばっかりなので、そのあたりが全然わかっていないのです。
Cプログラムを作っていたつもりが、C++プログラムを作っていたのですね。

これからVC++でCプログラムを作るための修行に逝ってきます。
797Kusakabe Youichi:01/12/11 21:19
In article >>795, デフォルトの名無しさん/sage/795 wrote:
> マジレスするとK&Rの本はあの人たちが
> 「おれたちゃーこういう風に使ってるんだよ」
> と紹介してる本であって、間違っても入門書じゃないです。

いえ、わかりやすい解説がしてある入門書だと思いますよ。
798779:01/12/11 21:20
>>795
C言語を作った人たちの本なのだから、間違った記述などまったくないという前提で読んでいました…。

記述が抜けているなんて、はつみみです(笑
799Kusakabe Youichi:01/12/11 21:26
In article >>796, 779/796 wrote:
> まだVC++を手に入れたばっかりなので、そのあたりが全然わかっていないのです。

どうやって手に入れたのですか?
800Kusakabe Youichi:01/12/11 21:27
In article >>798, 779/798 wrote:

> >>795
> C言語を作った人たちの本なのだから、間違った記述などまったくないという前提で読んでいました…。

っていうか、C++はCのスーパーセットではないですよ。

> 記述が抜けているなんて、はつみみです

記述が「抜けている」とはだれもいってないのでは?
ハツミミデス
>>800
>>795 で書きましたが、書いてないことにしたいのですね? :)
803デフォルトの名無しさん:01/12/12 00:30
K&R はコンピューターと同化しちゃってるやばいヲタであって、インストラクターではありません。
教え方はうんこレベルです。
もともと、スペーストラベルをやりたいがために、わざわざOSから組んじゃう基地害です。
そのOSを組むためにわざわざ新しい言語をつくっちゃうキモイ人達です。
関わらないほうが身のためです。
804Kusakabe Youichi:01/12/12 00:35
In article >>803, デフォルトの名無しさん/803 wrote:

> K&R はコンピューターと同化しちゃってるやばいヲタであって、
> インストラクターではありません。教え方はうんこレベルです。

そう思い込めば自分が理解できなかった現実をごまかせると思ったんでしょうかね :)

カーニハンは文章もうまいし、教え方もいいですね。
他の著書でも感心してしまいます。
あとは全体の構成力とか、すごいと思います。

> もともと、スペーストラベルをやりたいがために、
> わざわざOSから組んじゃう基地害です。

それはTompsonですね。

> そのOSを組むためにわざわざ新しい言語をつくっちゃうキモイ人達です。

それはふつうでしょう。
わたしもよくやりましたし。
糞壁はC++が出来ない石器人 (・∀・ )カワイソウナヂヂイダ
806デフォルトの名無しさん:01/12/12 00:49
kusakabeはむかつくことを言うときに使用する共用ハンドルですか?
807Kusakabe Youichi:01/12/12 00:49
In article >>805, デフォルトの名無しさん /sage/805 wrote:

> 糞壁はC++が出来ない石器人 (・∀・ )芹何嚇挿挿伽泗

ということにしたいのですね? :)
>>806
そのとおり、本物はどうでもいい昔話が好きなちょっとウザイおじいちゃんです。
完全無視を心掛けましょう。 B-)
おい、ここで相手するなって >反応してる人 (いや真面目な話)
810Kusakabe Youichi:01/12/12 00:56
In article >>806, デフォルトの名無しさん/806 wrote:

> kusakabeはむかつくことを言うときに使用する共用ハンドルですか?

っていうかわたしはごく普通のことしか言ってないのですが、
何が気になるんですか?
811Kusakabe Youichi:01/12/12 01:00
In article >>808, デフォルトの名無しさん/sage/808 wrote:

> >>806
> そのとおり、本物はどうでもいい昔話が好きなちょっとウザイおじいちゃんです。

ということにしたいのですね? :)
どうでも良いけど、文字化けうざいよ。
折角でしゃばって名前入れてもらったんだから
NKF32使えば? って又雑談ごめんなさい→他の人
糞壁キモイ!!
814Kusakabe Youichi:01/12/12 01:09
In article >>812, デフォルトの名無しさん/sage/812 wrote:
> って又雑談ごめんなさい→他の人

本気でそう思っているなら、えらそうに書かなきゃいいのに
(実際には思ってもいないことを書いたのだろうけど)
815Kusakabe Youichi:01/12/12 01:10
In article >>812, デフォルトの名無しさん/sage/812 wrote:
> って又雑談ごめんなさい→他の人

本気でそう思っているなら、えらそうに書かなきゃいいのに
(実際には思ってもいないことを書いたのだろうけど)
@echo off
817 :01/12/12 03:34
eの値を小数点以下100桁まで求めるプログラムと
πの値を小数点以下100桁まで求めるプログラムを教えてください。
( ´,_ゝ`) アッソー
>>791
> VC++で
> D:\VisualStudio6.0\VC98\make\Text.cpp(13) : error C2065: 'exit' : 定義されていない識別子です。
> と言われているんですが…これでは証明になりませんか?
Text.cppをText.cにファイル名を変更してからコンパイルしてみろ

ちなみにbcc32だと警告はでるがコンパイルはできる
C:\temp>bcc32 text.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
text.c:
警告 W8065 text.c 3: プロトタイプ宣言のない関数 'exit' の呼び出し(関数 main )
警告 W8070 text.c 4: 関数は値を返すべき(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

また、上記ソースを-Pオプションをつけ、
C++としてコンパイルするとエラーとなる
C:\temp>bcc32 -P text.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
text.c:
エラー E2268 text.c 3: 未定義の関数 'exit' を呼び出した(関数 main() )
*** 1 errors in Compile ***

結論:CとC++は微妙に違う
820(・∀・)イイ:01/12/12 15:06
厨房ですいません。

#define NDEBUG

NDEBUGは何をするものなんでしょうか?
>>820
なにもしないよ
>>820
デバッグ用のマクロを無効にするやつ。
詳しくは検索してちょ。
>>821
するだろ。

>>820
assert() を検索。
824(・∀・)イイ:01/12/12 18:42
つまりasssert()を無効にするってことなんですね。
わかりました。ありがとうございます。 m(_ _)m
825教えてくん:01/12/12 19:45
2つ質問があります。
1.実行ファイルのあるディレクトリの取得方法
2.隠しファイルの作り方
OSはUNIX系です。
>>825
移植性のある方法はない。
827教えてくん:01/12/12 19:59
じゃあLinuxに限った方法でいいです。
>>826

条件付きコンパイルでいいじゃん。
>>825
> 1.実行ファイルのあるディレクトリの取得方法
一般的にはargv[0]をみてPATHを検索するとかくらいしかないが、不確実。

> 2.隠しファイルの作り方
ファイル名の先頭に.(ピリオド)をつける
830Kusakabe Youichi:01/12/12 20:00
In article >>825, 教えてくん/825 wrote:

> 1. 実行ファイルのあるディレクトリの取得方法

man sh

> 2. 隠しファイルの作り方

man chmod

manの使い方がわからないなら、

man man
831Kusakabe Youichi:01/12/12 20:04
In article >>829, デフォルトの名無しさん/sage/829 wrote:
> > 1. 実行ファイルのあるディレクトリの取得方法
> 一般的にはargv[0]をみてPATHを検索するとかくらいしかないが、不確実。

「実行ファイルのある」をその意味にとりましたか...。
っていうかunixだったら、そこには入ってないのでは?
832教えてくん:01/12/12 20:04
>>829
ありがとうございました。
なるほど、設定ファイルの最初に.が付くのはそのためですか。

>>830
シェルではなく、C言語でコーディングする方法はありませんか?
>>832

system関数じゃだめなのか?
>>825
> 1. 実行ファイルのあるディレクトリの取得方法
man which
835教えてくん:01/12/12 20:07
PATHを検索しても、シンボリックリンクの場合はだめですよね。
836Kusakabe Youichi:01/12/12 20:10
In article >>832, 教えてくん/832 wrote:
> シェルではなく、C言語でコーディングする方法はありませんか?

man fchmod

Cの入門書の1つぐらい買いましょう。
837教えてくん:01/12/12 20:13
>>836
入門書も持ってますけど、標準関数を網羅したのは高いので…。
リファレンスとして、LSI-Cのマニュアルを使っています。
だからUNIXだとわからないことが多いんですよ。
838デフォルトの名無しさん:01/12/12 20:14
>>837

なら素直に従ったら?
>>831
> 「実行ファイルのある」をその意味にとりましたか...。

あぁ、自分自身じゃなくてか。

> っていうかunixだったら、そこには入ってないのでは?

だから不確実だって。
Linux限定なら

readlink("/prco/self/exe", buf, sizeof(buf))

で自分自身のパスも取れるけどね。
>>836
> man fchmod
>
> Cの入門書の1つぐらい買いましょう。
Unixの入門書じゃなくて?
841Kusakabe Youichi:01/12/12 20:27
In article >>837, 教えてくん/837 wrote:
> 入門書も持ってますけど、標準関数を網羅したのは高いので…。

標準ともかぎりませんよ。
それに「高い」って、いくらぐらいまでなら買えるのですか?

> リファレンスとして、LSI-Cのマニュアルを使っています。
> だからUNIXだとわからないことが多いんですよ。

manならタダじゃん。
842Kusakabe Youichi:01/12/12 20:27
In article >>839, デフォルトの名無しさん/sage/839 wrote:

> >>831
> > 「実行ファイルのある」をその意味にとりましたか...。
>
> あぁ、自分自身じゃなくてか。

いや、どっちの意味かわたしもわからないです。
わたしはたぶんそっちじゃないと思う。
843Kusakabe Youichi:01/12/12 20:30
In article >>840, デフォルトの名無しさん/sage/840 wrote:

> >>836
> > man fchmod
> >
> > Cの入門書の1つぐらい買いましょう。
> Unixの入門書じゃなくて?

そっちはmanでいいのでは?

お金ないみたいだし。
Kusakabe氏はchmod系列の関数を出してるけど、Linuxって「隠しファイル」
という属性があるの?
ファイル名が . で始まるファイルはドットファイルといわれ、
DOS でいうところの隠しファイル扱い。
846839:01/12/13 01:52
> readlink("/prco/self/exe", buf, sizeof(buf))
readlink("/proc/self/exe", buf, sizeof(buf))

欝山車
847Kusakabe Youichi:01/12/13 02:01
In article >>844, デフォルトの名無しさん/sage/844 wrote:

> Kusakabe氏はchmod系列の関数を出してるけど、Linuxって「隠しファイル」
> という属性があるの?

...
そのファイルの属するディレクトリーのrとxで隠すっていう意味じゃなく?
ヴぁーカそりゃディレクトリの属性だろが
お前の生まれた皮革産業地域以外では
UNIXの隠しファイルはドットファイルの事指すんだよ
役立たずはとっとと消えろ、四足が
849Kusakabe Youichi:01/12/13 02:29
In article >>848, デフォルトの名無しさん /sage/848 wrote:

> ヴぁーカそりゃディレクトリの属性だろが

そうですよ。-rのときと-xのときの違いはわかってますよね? (わかってないのかな?)

> UNIXの隠しファイルはドットファイルの事指すんだよ

はつみみです。それは隠しファイルとは呼ばないような.。
すごい言われようだ (^−^;
851Kusakabe Youichi:01/12/13 02:32
In article >>850, デフォルトの名無しさん/sage/850 wrote:

> すごい言われようだ (^−^;

ですね。でも結局は自分が恥をかくだけ...っていうか
言えばいうほどあとで恥ずかしいだけでしょうけど、
でもまあ匿名ですからね。
825への回答としては「Linuxには(Windowsで言うような)隠しファイルは無い」
が正解なんじゃないかなあ。
853Kusakabe Youichi:01/12/13 03:56
>>851
Kusakabe Youichiで間違った事書いても、所詮、偽者だって言えば済む事ですしね。
854デフォルトの名無しさん:01/12/13 08:20
IRCやNetNewsでは日下部先生に太刀打ちできないカスどもが必死だな(笑)
お前素人だろ、糞壁通の俺から言わせてもらえばコイツが潜在能力の全てを発揮するのは
NetNewsに於いてのみだよ。
ここだと常識を超える質と量の厨房に圧倒されて中々力を発揮出来ないと思ってるね。
後コイツは頭の回転が悪いからIRCだと駄目なんだよ、実際この粘着レス考えるのにも
ある程度考える時間が居るってのが痛いね。まあその点では善人って訳よ(アヒャ
まあ俺みたいな先天的ムカツキ発言野郎にはRCじゃ遠く及ばんわけよ OK?
>>855
おまえはKusakabe玄人。それでいいよ。
kusakabe原人
858Kusakabe Youichi:01/12/13 09:26
In article >>853, Kusakabe Youichi/853 <[email protected]> wrote:

> >>851
> Kusakabe Youichiで間違った事書いても、所詮、偽者だって言えば済む事ですしね。

っていうか、とくに間違ったこと書いてないからもんだいないですね。

#「事」はひらがな。
859Kusakabe Youichi:01/12/13 09:27
In article >>855, デフォルトの名無しさん /sage/855 wrote:

> お前素人だろ、糞壁通の俺から言わせてもらえばコイツが潜在能力のすべてを
> 発揮するのはNetNewsに於いてのみだよ。

そう自分に言い聞かせると安心できるのですね :)

> ここだと常識を超える質と量の厨房に圧倒されて中々力を発揮出来ないと思ってるね。

それは「希望」ですか? :)

> 後コイツは頭の回転が悪いからIRCだと駄目なんだよ、

はつみみです ;)
860デフォルトの名無しさん:01/12/13 19:26
もうここではC言語の質問を出来そうにないな…。
初心者の漏れにとっては、すごくいいスレだったのだが。

「彼のいない」C言語質問スレってある?
もしあるならそこへ行って質問したいんだけど。
>>860
お前がここで聞いて、誰かが答えた時点でその板はもう
「彼のいない」C言語質問スレではない。
徹底的に無視して聞くか、だめなら2ちゃんでは聞くな。
>>860
ホットゾヌを入れて NG ワードに Kusakabe Youichi と指定しろ(メニューバーから [ツール]
- [NGワード設定])。これでヤツの発言は自動的に透明あぼーんされる。
863Kusakabe Youichi:01/12/13 20:23
In article >>860, デフォルトの名無しさん/860 wrote:

> もうここではC言語の質問を出来そうにないな…。

ということにしたいのですね?
864デフォルトの名無しさん:01/12/13 20:25
>>863

:)←これはどうした?
865Kusakabe Youichi:01/12/13 20:34
In article >>864, デフォルトの名無しさん/864 wrote:
>:)←これはどうした?

ということにしたいのですね? :)
866デフォルトの名無しさん:01/12/13 20:34
>>863
そうです。そうしたいです。
それ以外にどの様に読めますか?
867デフォルトの名無しさん:01/12/13 20:35
標準入力から英文を読み込んでファイルに保存したいのですが、
scanf("%s")でfputs関数を使うのと、scanf("%c")でfputchar関数を使うのはどちらがいいですか。
868デフォルトの名無しさん:01/12/13 20:40
かゎぃぃ
869デフォルトの名無しさん:01/12/13 20:42
>>867
どっちでもいいよ。
scanf()は使わないにこしたことはないけどね。
>>867
getchar(), putc()
そもそもCにはfputcharという標準関数は存在しないし、
putcharは標準出力に出力する。

# その機能はcatでもできるような気がするが(゚ε゚)キニシナイ
871867:01/12/13 20:57
>>870
ごめんなさいです。fputc使おうと思ってました。
どっちでもいいのはわかるんですが、一般的にどちらが使われているのか
知りたくて質問しました。
あと、もしstrという配列(バッファというやつですか?)を使ってファイルに書き出そうとしたら、
要素数はどのくらいがいいんでしょうか。
やっぱりstr[256]とか2の倍数がよいのでしょうか?理由は知りませんが…。
糞壁が煮詰まった時に連発する

ということにしたいのですね? :)

ってサッパリ意味がわからん。
何これ、キティ語なの?
>>872
その質問はスレ違い。
マ板の該当スレで聞け。
874デフォルトの名無しさん:01/12/13 21:09
>>871
どこくらいのバッファがいいかは、実際に動かす環境で
実験してみるしかないね。
標準入出力関数を使えば、一応バッファリングはしてくれるから、
そんなにせいいっぱいの性能を求めるんじゃなかったら、
一文字ずつ処理してもいいよ。
875デフォルトの名無しさん:01/12/13 21:12
>>871
最近のマシンなら、1メガくらいとってみるとか。>バッファ
876867:01/12/13 21:13
>>874
ありがとうございます。
レスを読むと、どうも文単位で読み込むのが常識みたいですね。
とりあえずscanf("%s")→putsで作成してみます。
>>871 最高速を狙うなら fread/fwrite を使うべし。
バッファサイズは BUFSIZ を使うのが普通かもね。

だが、普通は getc()/putc()マクロを使えば十分速いです。
fgetc()/fputc() はたぶん一番遅いっす。
>>872

866 に返事を書けないことでわかるが、無意味な言葉。
「ぼく、降参」程度に受け止めておけばよい。
>>876
scanf("%s") 使うぐらいなら、fgets() 使えって。
キケンでなおかつ遅くて良いことないよ。
>>876
> とりあえずscanf("%s")→putsで作成してみます。
scanfでファイルの終わりをどうやって検出しようと思っているのか
小一時間問いつめたい
# まぁ無理すればできなくはないが...
881デフォルトの名無しさん:01/12/13 21:23
>>876
scanfを使うと、シロウトあつかいされますよ。
>>880
戻り値見ろよボケ。
883867:01/12/13 21:28
>>880
ファイルの終わりはctrl+Dで出力します。(UNIX環境です)
学校の自習問題の一部ですので…。

fgets()ならEOFの時NULLが返るので扱いやすいのでしょうか。
でも、これだと先ほどのstr[256]とかしたときに256文字を越える行が
出て来ると処理できないのかと思うのですが。
たとえば260字の行が出てきたら、最後4文字が読み込めないのではないですか?
これが気になってscanfを使おうと思っていたのです。
無知でスミマセン。
884867:01/12/13 21:30
>>881
ほんと素人なので、右も左もわかんないんです。
なぜscanfを使うべきではないのか、理由を教えてもらえないでしょうか?(煽りではなく、マジ質問です)
>>882
それでもバッファオーバランを防止できないんですよ
そこでまたブチギレですよ。
>>884
> でも、これだと先ほどのstr[256]とかしたときに256文字を越える行が
>出て来ると処理できないのかと思うのですが。
fgetsは2回に分けて読めばいいのですが、
scanf, getsだと256文字を越える行が出て来ると
何が起こるかわかりません。
887867:01/12/13 21:38
>>886
あ、二回に分けて読むことができるんですね。
それだとどんな長い文がきても安心できます。

ありがとうございます。
fgets→fputsでやってみることにします。
888デフォルトの名無しさん:01/12/13 21:40
>>884
getchar(),fputc()で一文字ずつ処理したほうが簡単かも。
>>888
ヤーヤーヤー
890867:01/12/13 21:47
ごめんなさい、もうひとつ質問させてください。
標準入力からファイルに書き出す時は、ファイルオープン、ファイルクローズをしなくてもよいのでしょうか?
>>890
> 標準入力からファイルに書き出す時は、ファイルオープン、ファイルクローズをしなくてもよいのでしょうか?
標準入力、標準出力、標準エラー出力は最初からopenされていて、
プログラム終了時にcloseされていることは保証されている。
だから(゚ε゚)キニシナイ
892867:01/12/13 21:55
あ、うまくできました。
レス下さった皆さん、本当にありがとうございました!
bankers algorithmの日本語解説があるとこって知りませんか?
>>885
バッファサイズ指定しろあゴルァ
895デフォルトの名無しさん:01/12/14 02:10
fgetsを使ってファイルポインターを次の行の先頭に持っていっている私は阿呆ですか?
K&Rの演習問題解けた人は
アンサーブックの通りになっていたのですか。

いや簡単なやつなら全く同じになりますが
複雑な方はちょっと
897Kusakabe Youichi:01/12/14 04:09
In article >>880, デフォルトの名無しさん/sage/880 wrote:
> > とりあえずscanf("%s")→putsで作成してみます。
> scanfでファイルの終わりをどうやって検出しようと思っているのか
> 小一時間問いつめたい
> # まぁ無理すればできなくはないが...

そう「無理」はしなくてもいいでは?
898Kusakabe Youichi:01/12/14 04:10
In article >>883, 867/883 wrote:
> ファイルの終わりはctrl+Dで出力します。(UNIX環境です)
> 学校の自習問題の一部ですので…。

その授業ではどんな教科書を使っているのですか?
899Kusakabe Youichi:01/12/14 04:11
In article >>884, 867/884 wrote:

> >>881
> ほんと素人なので、右も左もわかんないんです。

<--こっちが右 こっちが左です-->

# 信用するかな?

> なぜscanfを使うべきではないのか、理由を教えてもらえないでしょうか?

教科書にそんなことも書いてないのですか?
900!f84%3dm2:01/12/14 05:46
> 教科書にそんなことも書いてないのですか?

書いてない教科書多いと思うけど。
901Kusakabe Youichi:01/12/14 09:07
In article >>900, !f84%3dm2/sage/900 wrote:

> > 教科書にそんなことも書いてないのですか?
>
> 書いてない教科書多いと思うけど。

いい教科書を選びましょうね。
902ig:01/12/14 10:33
早速ですが、質問があります。
c言語のキャストについての質問です。
環境は、Solaris2.6&SUNのccコンパイラです。

(intを返す関数へのポインタ)を(longを返す関数へのポインタ)型に
キャストするにはどのようにコードを書けばよいのでしょうか?
---以下、詳しい説明
(longを返す関数へのポインタ)をメンバ変数に持つ構造体
を宣言しました。
仮にこの構造体を
typedef struct {
long (*function)();
} sa;
とtypedefするとします。
その後、.cファイルの中で
sa va[]={{a},{b},{c}}
てな感じで宣言したいのです。
ただし、a(),b(),c()は、intを返す関数として定義してしまって
るんですよね…
だからキャストして{警告: 初期値設定の型が一致していません}
ってな警告を黙らせたいなと思ってます。
903デフォルトの名無しさん:01/12/14 10:38
>>902
typedef int (*int_func)();
sa va[]={{(int_func)a},{(int_func)b},{(int_func)c}}

動作確認してないけど、こんな感じかな?
904ig:01/12/14 10:54
>>903
>>デフォルトの名無しさん
ありがとうございます。

このやり方でコンパイラは黙ってくれました。
ただ、
typedef long (*long_func)();
でしたけども。
>>904
>typedef long (*long_func)();

だね。スマソ。
906デフォルトの名無しさん:01/12/14 11:28
ていうか、日下部がいようといまいと、2chで質問しなきゃ前に進めな
いような奴は最初から見込みないと思う(ゲラ
>>906
話が見えませんが…
908Kusakabe Youichi:01/12/14 12:15
In article >>902, ig/902 wrote:
> ただし、a(),b(),c()は、intを返す関数として定義してしまってるんですよね…
> だからキャストして{警告: 初期値設定の型が一致していません}ってな警告を黙らせ

喇叭を使う :-P
909Cハッカー日下部陽一
黄色信号が出ましたので、新スレを作りました。
早めの移行をお願いします。
http://pc.2ch.net/test/read.cgi/tech/1008300863/l50