C言語なら、オレに聞け! <3>

このエントリーをはてなブックマークに追加
1ジョブス2世
おれは25才、3年間プログラムを一生懸命作ってきた。
C言語しか知らないがC言語なら誰にも負けない...
C FAQに載ってる質問すると煽るぞゴルァ!

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

・C FAQ 日本語訳
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/C-faq/C-faq-00.html


前スレ、関連スレは >>2
2ジョブス2世:2001/05/15(火) 21:21
独断と偏見で選んだ関連スレだ。

関連スレ
・( ゚Д゚)ノ ギコ猫のプログラム相談室part5
http://piza.2ch.net/test/read.cgi?bbs=tech&key=980521175

・お兄ちゃんの宿題、私が答えるよ
http://piza.2ch.net/test/read.cgi?bbs=tech&key=982853418

・VisualC++相談室 2
http://piza.2ch.net/test/read.cgi?bbs=tech&key=981630730

・C++Builder相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=969458279

・C++相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=980175292

・C#相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=977112364

・ネットワークプログラミング相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=970344582

過去スレ
・C言語なら、オレに聞け!
http://piza.2ch.net/test/read.cgi?bbs=tech&key=979529893
3デフォルトの名無しさん:2001/05/15(火) 22:18
御苦労さんage
4デフォルトの名無しさん:2001/05/15(火) 23:37
がんばってね>ジョブス2世
5C言語見習い:2001/05/16(水) 00:18
構造体について勉強しているのですが
#include<string.h>
struct cell{
double num;
struct cell *next;}
この宣言に意味がよく分かりません。
どうかご教授ください。
6デフォルトの名無しさん:2001/05/16(水) 00:20
>>5
>この宣言に意味がよく分かりません。
質問の意味がよく分かりません。
7>6:2001/05/16(水) 00:29
おそらく初心者が本当にわからんのはこの部分だろうね。
struct cell *next; /*構造体の自己参照*/
初心者が、あくまでも*参照*であって、実体ではないことに
気付くのはいつの頃だろうか。
8名無し:2001/05/16(水) 00:29
そのくらい自分で参考書見て勉強すれば、わかるだろ!
9C言語見習い:2001/05/16(水) 00:40
>>7
すみません。どう質問すればいいのかも分かりませんでした。
その通りstruct cell *next; この部分です。
構造体の自己参照で調べてみたいと思います。
ありがとうございました。
10デフォルトの名無しさん:2001/05/16(水) 00:42
>>7
そんなに参照って負担になるかなあ?
俺は抵抗を覚えたり理解できなかったりした記憶が
全くないんだけど。

というか、さくっと理解できる人とそうでない人が
色々いるのかなあ。

いわゆる本来の意味での頭のよさとは多分別だ(w
117>10:2001/05/16(水) 00:52
わからなかったやつがここ>>5にいるだろ。
多分、右脳の発達具合とか、そんなものなんだろうね。
12C言語見習い:2001/05/16(水) 01:17
すみません。調べてみましたが理解し切れませんでした。
ヒントだけでもいただけないでしょうか?
13デフォルトの名無しさん:2001/05/16(水) 01:27
値==そこにある建物
参照(ポインタ)==住所かな。
nullポインタ==該当宛先なし。

cell a;//値
cell* pb;//ポインタ
pb = &a;//aのメモリ上の住所をpbに書き込む

>>5
は、単方向リンクリスト構造の各要素の為の宣言。
構造体のなかに、「次の構造体の住所」を書いておくところがあるということ。

ここに「次の構造体の住所」を書く。
次の構造体のその場所に、「次の次の構造体の住所」を書く。


で、数珠つなぎのデータの列(配列とはちょっと違っていて、要素はメモリ上の
あちこちにある)ができるというわけさね。それが何の意味があるのかは、勉強せい。
147>12:2001/05/16(水) 01:31
イメージとしては、自分の指で自分の事を指す事と同義。
でも指で指せる対象は他人という場合もありえる。

typedef struct 人 *誰か;
struct 人 {
誰か 指で指す; /* 自分や他人 */
};

test() {
 struct 人 わたし;
 struct 人 あなた;
 わたし.指で指す = &あなた; /* わたしはあなたを指で指す */
}
15デフォルトの名無しさん:2001/05/16(水) 01:40
>>12
int i;
cell a[N+1];
cell* pcell;

for(i=0;i<N;i++) cell[i].next = &cell[i+1];
cell[i]next. = NULL;

//芋づる式にnumを参照この場合適当な値だけどな
for(pcell = &a[0];ipcell != NULL;pcell = pcell->next){
pcell->num;
}

普通はヒープを使うがな。動的確保が分からなければそれを
調べる事だ。
167>:2001/05/16(水) 01:44
誰か どなたかが指してる相手は?(誰か どなたか) {
 return どなたか->指で指す;
}

test2(誰か わたし) {
 誰か 誰でしょう = どなたかが指してる相手は?(わたし);
 if (誰でしょう == &あなた)
  printf("わたしはあなたを指しています。\n");
 else
  printf("わたしはあなた以外を指しています。\n");
}
17デフォルトの名無しさん:2001/05/16(水) 01:47
C++をはじめたばかりで拙い質問ですが。

typedef float foo[3];
のような組み込み配列で作った型をコンテナとしてSTLで使おうと
思ったのですが、
typedef std::vector<foo> bar;
という宣言を行うと、コンパイルエラーになってしまいます。
これはどのような理由で、どのようにすれば使えるようになるの
でしょうか?
18デフォルトの名無しさん:2001/05/16(水) 02:05
参照は、今の我々がすごく馴染んでいるものでいえば、
WWWのリンクが、一番似てるぞ。
#おかげで説明しやすくなったよ今は…しみじみ…

structの宣言はwww頁の雛型みたいなもんだ。
便利なHTMLエディタ使ってるみたいなイメージな。

実行時にその変数を作ったりnewで作ったりするのは
雛形から自分の頁を1つづつ作るのと同じだ。

*nextっていうメンバは、「次の頁へ」のリンクだ。

で、実際に次の頁ってどの頁なのよ?という話は、
実行時つまり雛型から頁書き起こした時に決めるわけな。
19デフォルトの名無しさん:2001/05/16(水) 02:10
そりゃ配列はテンプレートに書けないんじゃない?
class foo{ flaot value[3]; }
vector<foo> bar;

とか、valueって名前が出てきちゃうのがウザイね
20 :2001/05/16(水) 02:18
19 ついか
class foo{
float value[3];
float operator[](int i){return value[i];}
}

これでOKか
21デフォルトの名無しさん:2001/05/16(水) 02:20
float& operator[](int i){return v[i];
すまん&が抜けた。鬱だ氏脳
22デフォルトの名無しさん:2001/05/16(水) 02:22
>>17
そのコード、私の環境では通りました。
VC++をお使いなら、最新のサービスパックを当てましょう。
23>20:2001/05/16(水) 02:23
つーかpublicが抜けてる。(重箱すまそ)
24デフォルトの名無しさん:2001/05/16(水) 02:26
>>17
コンストラクタとデストラクタが定義されていないから駄目なんじゃ。
classやらstructで包むしかないね。
25デフォルトの名無しさん:2001/05/16(水) 02:27
>>19
templateの機能が標準に追随できてない古いコンパイラだとそうするしかないですね。
あと、vectorに格納するならoperator<とoperator==を定義してやる必要があります。
26名無し:2001/05/16(水) 02:34
え?
27デフォルトの名無しさん:2001/05/16(水) 02:35
typedefしないで書く時って
vector<float[3]> hoge;
とかでOK?
28デフォルトの名無しさん:2001/05/16(水) 02:37
vector<float[3]> hoge; で通るね
2925:2001/05/16(水) 02:49
すんません、それはmapに格納するときの話でした(藁
vectorはそんな必要ないですね。逝ってきます……
30デフォルトの名無しさん:2001/05/16(水) 03:07
>>25
今の規格だと std::vector<T> って T が左辺値になれない型でも大丈夫なんですか?
昔 vector の実装を読んだときには

T __x_copy = __x

みたいなコードがあって、T が左辺値になれないとダメだった覚えが。

手元の g++ (2.95.2), Visual C++ 6.0, Borland C++ Compiler 5.5 で試してみましたが、
vector<float[3]> hoge; だと construct はできるけど push_back できませぬ。
31ななしさん:2001/05/16(水) 03:27
そもそも、C言語とはなんですか?師匠。
32学生:2001/05/16(水) 04:15
分割コンパイルあたりが分からんです(曖昧でごめんなさい)

test1.cってファイルがこんな感じ
#include <stdio.h>

struct db{
char name[10];
};

int data_in(struct db data[], char *in_name, int index, int max);

int main()
{
   中略・・・
   index = data_in(data, in_name, index, 5);
   ・・・
}
===============================
test2.cはこんな感じ
#include <stdio.h>

int data_in(struct db data[], char *in_name, int index, int max)
{
   中略
}

で、bcc32 -wc test.c test2.c
ってコンパイルするとtest2.cで「未定義の構造体 'db'」
とエラーに成ります。

構造体を大域で宣言してるけど、他のファイルからじゃスコープ外
ってことなんですか?
アンポンタンなことやってたらごめんなさい。
33学生:2001/05/16(水) 04:17
長すぎましたね・・・。切れてる部分

で、bcc32 -wc test1.c test2.c
ってコンパイルするとtest2.cで「未定義の構造体 'db'」
とエラーに成ります。

構造体を大域で宣言してるけど、他のファイルからじゃスコープ外
ってことなんですか?
アンポンタンなことやってたらごめんなさい。
34デフォルトの名無しさん:2001/05/16(水) 05:02
>>32
定義と宣言の違いをよ〜っく勉強せえ。K&Rに書いてあるよ。
35学生:2001/05/16(水) 06:04
K&R買ってきます・・・。
でも、もうチッと教えて〜。
ヘッターファイルにプロトタイプ宣言すれはええってことすっか?
36デフォルトの名無しさん:2001/05/16(水) 08:00
bcc32 -wc test1.c test2.c



bcc32 -wc test1.c
bcc32 -wc test2.c

と2回に分けてコンパイルしたのと同じことだろ。

bcc32 -wc test2.c

だけコンパイルすると未定義といわれるのは当然では?
37デフォルトの名無しさん:2001/05/16(水) 08:14
結局time以外のsrandの種ができませんでした。(T_T)
clockでは駄目だった。どう作ればいいのでしょう?
38デフォルトの名無しさん:2001/05/16(水) 09:47
clock()はmsvcrtの実装だとプロセスが開始されてからの
時間をミリ秒単位で返すので、初期化部分に書いておくと
ほとんどの場合同じ値を返します。

APIのGetTickCount()やQueryPerformanceCounter()のどちらか
を使うといいと思います。ちなみに95系だとGetTickCount()
は10ミリ秒単位の精度しかなかったと思います。

QueryPerformanceCounter()は64ビットの値を返すので、
上位、下位の32ビットでXORとるのがいいと思います。

POSIXなら、gettimeofday()システムコールですね。
3934:2001/05/16(水) 10:27
>>35
なかなか良いところを突いてるぞ。

>>36
微妙にそう言う問題じゃないことに気付け。
40学生:2001/05/16(水) 10:52
>34 サンクスコ
とりあえず、後はK&R見て質問しますね。

僕が思ったのは、bcc32のオプションで解決する方法とか
有るのかと甘い考えもしてましたが、こっちがアンポンタンっすね。
41デフォルトの名無しさん:2001/05/16(水) 11:47
1 2 3と入力した時に3 2 1 と表示したいのですが、
どこかで狂ってしまいました。
教えて下さい。

typedef struct{
int a;
}b;
void main(void)
{
b p[N];
int i;
for(i=0;i<N;i++){
scanf("%d",&(p[i].a));
}
sort(p[i].a);
for(i=0;i<N;i++){
printf("%4d\n",p[i].a);
}

void swap(int* a, int* b)
{
int x;
x = *a;
*a = *b;
*b = x;
}

void sort(b p[])
{

int i = 0;
     int j = 0;
for(i = 0; i < 3; i++)
{
for(j = i+1; j < 3; j++)
{
if(p[i].a < p[j].a)
{
swap(&(p[i].a), &(p[j].a));
}
}
}
}
42デフォルトの名無しさん:2001/05/16(水) 12:57
>>41
・#define N 3
・sort(p[i].a); → sort(p);
・mainの閉じカッコ

ちなみにコンパイル通ったの?
4341:2001/05/16(水) 15:43
>>42 さん
解決できました!ありがとうございます。
sort(p[i].a); → sort(p);
にしたら、直ったのですが、意味を理解できません(^^;
44デフォルトの名無しさん:2001/05/16(水) 16:38
バカ?
45デフォルトの名無しさん:2001/05/16(水) 19:10
GDBで、
print/f sin(0)
って打つと0にならないのは何で?
46デフォルトの名無しさん:2001/05/16(水) 19:55
>>43
sort 関数は b (←何でこんな名前を付ける?) のポインタを
受け取るんだから、当然 b のポインタを渡さなきゃダメでしょ。
47デフォルトの名無しさん:2001/05/17(木) 00:28
>>45
まじ??
48850:2001/05/17(木) 06:54
>>825さん

>>> for(i=0; i<N; i++)
>>> printf(" %d %d\n",i,a[i]);
>>> sort(point);
>>> for(i=0; i<N; i++)
>>> printf(" %d %d\n",i,a[i]);
>>> sort(昇順に並び替え)した時に、
>>> a[i]の値は昇順になるのですが、iの値もそれと対比させて、
>>> 出力するにはどうすればよいのでしょうか?

>> int j[N] ;
>> for(i=0;i<N;i++){
>> j[i]=i;
>> printf(" %d %d\n",i,a[i]);}
>> sort(point);
>> for(i=0;i<N;i++)
>> printf(" %d %d\n",j[i],a[j[i]]);
>> ※sort(a[j[i]]の結果で、jをsortする)

> j[i]=i;
> って事は、
> printf(" %d %d\n",i,a[i]);}と
> printf(" %d %d\n",j[i],a[j[i]]);
> は、同じ意味になるのではないでしょうか?

iの値もそれと対比させて、出力すると言う事は、
同じ意味になって良いと思いますが、違いますか?
もしそうならば、あとは、全体の出力する順番を変えればOK。
j[N]をsortすれば、その順番がsortされるので、
その結果、元の順番がj[N]に残り、a[j[N]]は、sortされています。
またまた分かり辛いですが、もう少し頑張ってみて下さい。
49デフォルトの名無しさん:2001/05/17(木) 09:41
>>45
原因不明 GDBのバグ??
50デフォルトの名無しさん:2001/05/17(木) 23:16
誰か>>45 回答しろヤ ゴルァ!!
51デフォルトの名無しさん:2001/05/17(木) 23:46

main(int argv, char *argc[] )
main(int argc, char *argv[] )

より一般的なのはどっち?
52中途半端くん:2001/05/17(木) 23:48
>>45
(gdb) print/f sin(0)
No symbol table is loaded. Use the "file" command.
(gdb) printf sin(0)
Bad format string, missing '"'.
なんかへん
53デフォルトの名無しさん:2001/05/18(金) 00:00
>>51
一般的ってそういう問題じゃないだろゴラァ
count vector
54デフォルトの名無しさん:2001/05/18(金) 12:53
>>52 math.hをインクルードしていないプログラムを実行させていませんか?
55ちゃちゃいれ野郎:2001/05/18(金) 15:46
>>51,>>53
>count vector
counter vector
だピョン。
56デフォルトの名無しさん:2001/05/18(金) 16:12
>>54
-lmじゃないですか?
57デフォルトの名無しさん:2001/05/19(土) 00:19
123.4567
を_123.4567(_はスペース)
のようにするには、
%4fでいいのですか?
58名無し:2001/05/19(土) 00:22
%4.4f
59デフォルトの名無しさん:2001/05/19(土) 23:56
処理が大きくなって途中で分からなくなり、ダメでした。
どうやればいいのでしょうか?
入力@と入力Aの各レコードでマッチング処理を行い、一致した物を抽出。
             (シーケンシャルマッチ)
・マッチング処理は、 項目keyで行う ・各入力は全て項目keyでソートされている
・一致するレコードを一対とする ・入力keyにマッチしなければ、メッセージを出力
入力@フォーマット(主key) 項目key|品目名|日付
入力Aフォーマット      項目key|品目名|金額
出力フォーマット(結果)   項目key| 日付 |金額|品目名
*入力@(a.txt)と入力A(b.txt)は、既にあるファイルから読みとります。
*|は(0x7C)です。 *項目keyは、数字で4Byteです。
60デフォルトの名無しさん:2001/05/20(日) 01:14
構造体の変数をもっとも簡単に
シリアライズする方法おしえて。
61デフォルトの名無しさん:2001/05/20(日) 02:02
そのままバイト配列にキャスト>60
62マジレス:2001/05/20(日) 11:01
 C言語初心者の質問をちょっと聞いてください.
パーセント(%)で表示させようとして
試みているのですが、どうもうまくいかないんです.
キャスト、floatを使ってみたのですが、
うまくいきません。
どうやれば、うまく処理できるんでしょうか
プログラマーの皆様、どうか教えてください。
お願いします。

int main (void)
{
int kazu=100;
int a=3;
float ans;
int ritu;/*%で出す変数*/

ans=(float)2/100;
printf("%1.3f\n",ans);
ritu=ans*100;
printf("%f\n",ritu);
return 0;
}
63デフォルトの名無しさん:2001/05/20(日) 16:10
初心者です
FILE *fp;
for........
    c=getc(fp);

なぜfp++としていないのにcにはつぎつぎとファイルの値が
ほりこまれていくのですか?
64デフォルトの名無しさん:2001/05/20(日) 16:13
>>63
<stdio.h> 読みなよ。

というか、なんで fp++ で次のバイトが読み出せると思ったんだい?
65デフォルトの名無しさん:2001/05/20(日) 16:15
VC++ってフリーソフトですか?
マイクロソフトのホームページでダウンロードできますか?
66デフォルトの名無しさん:2001/05/20(日) 17:30
>>65
がんばれ
6763:2001/05/20(日) 19:02
>>64
よんでもよくわかりませんごめんなさい。
c=getc(fp);
c=getc(fp);
c=getc(fp);
なにも操作していないのになぜcの内容がかわっていくの??
6863:2001/05/20(日) 19:05
abcdefg(改行)
cdefgahkl(終わり)

getcで上記のファイル内容を読もうとしたら
改行の手前までしか読めないのです。2行目はどうすれば読める
のでしょうか。よろしくおねがいします。
69デフォルトの名無しさん:2001/05/20(日) 19:20
>c=getc(fp);
>c=getc(fp);
>c=getc(fp);
>なにも操作していないのになぜcの内容がかわっていくの??
思いっきりgetc(fp)の結果をcに代入してるじゃん。(w
ネタなら下げてやってね。
7063:2001/05/20(日) 19:23
ネタになるほどばかなのか ハァ
getc(fp)とするごとに
つぎの値をとっていくとゆうことで
それはもうルールとしてきまりきったことなのですか?
71デフォルトの名無しさん:2001/05/20(日) 19:27
>>67

fopenで開いたファイルは、現在の「読み・書きの位置」って情報を持ってるのね。
メモ帳のカーソル位置みたいなもの。
getc()はその読み・書き位置にある文字を返して、読み・書き位置を1つ進める関数。
だから、getc()を呼ぶたびに返る値が変わる。

ちなみに、現在の読み・書き位置を知りたければftell()、変更したければfseek()を使え。
72デフォルトの名無しさん:2001/05/20(日) 19:27
>>70
だから getc() の定義を読みなよ。
7363:2001/05/20(日) 19:34
>>71さんありがとうございます。わかりました
もしよろしければ>>68もおねがいしたいのですが
>>72
>>定義の説明に1文字読み込むとありました。だから
次に読む文字はどう指定するのかなと疑問に思っていました。
7472:2001/05/20(日) 19:37
>>73
定義というのはソースコードのことね。

環境依存だけど、たいていは FILE 構造体の中にバッファと、現在どこまで読んだか
の情報が格納されている。FILE 構造体と getc() 読めば全て書いてあるわけだが、
getc() はちょっと読みにくいかもしれない。
75デフォルトの名無しさん:2001/05/20(日) 19:40
>>68
そんなはずはない。
'\n'が読まれることはわかってるか?
76デフォルトの名無しさん:2001/05/20(日) 19:51
>68
getc()でも改行は読めるぞ。
getc()==0x0Aのときが改行。
77デフォルトの名無しさん:2001/05/20(日) 20:10
>>63
あなたは荒らしと同じ事をしているのに気が付いてますか?
ここで基本的(Cを全く理解してない)な事を質問し続けられるのは迷惑でしかない。
C言語の本何冊か読破してから出直してください。
これはまじめな話です。
783冊読破した人:2001/05/20(日) 20:27
>初心者です
>FILE *fp;
>for........
>    c=getc(fp);

>なぜfp++としていないのにcにはつぎつぎとファイルの値が
>ほりこまれていくのですか?

これわしも疑問。原理的にどうなってるのか知りたい。
C実践プログラミングにも独習Cにも載ってなかったよ。
79デフォルトの名無しさん:2001/05/20(日) 20:35
>>78
だから <stdio.h> 読んでくれよ……
80偽善者君:2001/05/20(日) 20:50
VC++6 の stdio.h からコピペ。うりゃ。

struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;

/* Macro definitions */

#define getc(_stream) (--(_stream)->_cnt >= 0 \
? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
8163:2001/05/20(日) 20:56
>>71-76大変ありがとうございました。
ほぼ解決しました。
もっと初心者向けのスレに質問しようかなやみました。
>>77
うーん、タイトルと質問を見比べましたが嵐ほどには
ならないとおもうのですが。。嵐なら大変失礼しましたm(__)m
82デフォルトの名無しさん:2001/05/20(日) 20:58
>>80
Tnx.
83デフォルトの名無しさん:2001/05/20(日) 21:06
59の者だけど誰か教えてくれ
…くれは、ダメ?
84デフォルトの名無しさん:2001/05/20(日) 21:44
63よ。
あなたは、別に荒らしじゃないぞ。
できれば、同様の質問をを初心者から受けたら親切に
答えてやってくれ。それが77を見返す正当な手段だと
思うぞ。分かりやすく答えた時が真に理解した証だ。
85デフォルトの名無しさん:2001/05/20(日) 21:45
86デフォルトの名無しさん:2001/05/20(日) 21:54
>>63
多分根本的なことを理解していないので、
わざとやってんじゃないのか?と思われてしまうんでしょう。
K&Rを頭から最後まで読んでみるのをおすすめします。
87デフォルトの名無しさん:2001/05/20(日) 22:25
>>59
どの辺りがわからなくなったの?部分的なら回答する気も起きるが
それともプログラム1本全部晒せってか?
88デフォルトの名無しさん:2001/05/20(日) 23:37
>87
iskanjiを使っての0x7cを探すとこの処理。できれば、memcmpとstrcmpのどちらの
方が効率的かの指摘いただければ…。

>プログラム1本全部晒せってか?
 やって見せてくれるなら有り難い。
89!87:2001/05/20(日) 23:43
memcmp>88
90名無したん:2001/05/21(月) 00:40
思いっきり課題で申し訳ないのですが・・
 一行に1単語が書かれたファイル「test.txt」からファイルを読み込み、それ
をソートして「tests.txt」に書き出すプログラムを作れと言われました。
読み込んでいく所までならなんとかなったのですがソートして書き出すというやり方
が分かりませんです。文字列比較ならstrcmpを使えばいいんでしょうが・・。
#include <stdio.h>

#define BUFFER_SIZE 200
void main(){
char buffer[BUFFER_SIZE];
FILE *fp;
fp = fopen("test.txt", "r");

if ( !fp ){
printf("ファイルオープンエラー\n");
return;
}

while( fgets(buffer, BUFFER_SIZE, fp) ){
printf("%s", buffer);
}
fclose(fp);
}

test.txtがこうだったら・・

osaka
hyogo
kyoto
nara
wakayama
shiga

tests.txtが

hyogo
kyoto
nara
osaka
shiga
wakayama

みたいになればいいようです。どなたかご教授お願いします。
9145:2001/05/21(月) 09:24
GDBで、
print/f sin(0)
って打つと0にならないのは何でですか??
92デフォルトの名無しさん:2001/05/21(月) 10:32
>>91
ソース中に
printf("%lf\n", sin(0));
を入れてみろ、出力結果が0でない場合、以下の原因が考えられる。
・math.hがincludeされていない
・数学関係のライブラリがリンクされていない(unix系だとlibm.sl)

math.hをincludeしないでコンパイル&実行ができた上に
結果が間違っている理由は知らん(誰かのフォローを期待)
それが嫌ならC++のコンパイラを使え、宣言していない関数を使おうとすると
コンパイル時にエラーとなる。
93デフォルトの名無しさん:2001/05/21(月) 11:07
>>90
#include <stdlib.h>
int main(void)
{
  return system("sort test.txt > tests.txt");
}
すまん、ネタだ。

> ソートして書き出すというやり方が分かりませんです。
まず、1行しか覚えていないのが問題。
ソートをする為には全ての行を覚えておく必要がある。
> char buffer[BUFFER_SIZE];
ではなく
char buffer[MAX_LINE_SIZE][BUFFER_SIZE];
として
int i, max_line;
/* 行の読込み */
for (i = 0 fgets(buffer[i], sizeof(buffer[0]), fp) && i < MAX_LINE_SIZE; i++ )
  ;
max_line = i;
if(max_line == MAX_LINE_SIZE) {
  printf("行が多すぎて読めん\n");
  exit( -1 );
}
/* ソート */
qsort(buffer, max_line, sizeof(buffer[0]), strcmp);
/* ソートの検証 */
for (i = 0 i < max_line; i++ ){
  printf("%s", buffer[i]);
}
ファイル出力は宿題だ。これぐらいは自分でヤレ。
ソート関数は自作したいのなら検索エンジンに聞け。
課題ならば「バブルソート」をキーにすれば十分だろう。
94デフォルトの名無しさん:2001/05/21(月) 11:22
>>62
> 試みているのですが、どうもうまくいかないんです.
> うまくいきません。
こんな質問の仕方では煽られるか放置されるかのどちらかです。

そのコードを実行した結果、どうなった?
何が出力されるとうまくいったことになるの?
我々はあなたの書いたコードは見えてもあなたの頭の中は見えません。

> int ritu;/*%で出す変数*/
> printf("%f\n",ritu);
int型で%fは使えません。
9545:2001/05/21(月) 15:29
>>92
もちろん、math.hはインクルードしてます。
printf("%lf\n", sin(0));
の結果は0になります。
GDBで直接print/f sin(0)
と書くと0でない結果になってしまいます。
96デフォルトの名無しさん:2001/05/21(月) 16:33
構造体内の点数(文字型)を加算し、合計点の多い順番に並び替える。
並び替えの際、構造体のポインタを引数とする関数を作成する。
97デフォルトの名無しさん:2001/05/21(月) 16:56
すれば?
98デフォルトの名無しさん:2001/05/21(月) 19:29
>96
それが理解できてたら質問なんかしないと思われ。
99デフォルトの名無しさん:2001/05/22(火) 01:07
どうでもいいけど、エラーとかプロンプトは
fprintf(stderr, "ゴラァ\n");
としてほしいぞ。

って初心者は混乱するだけか?

# UNIX でない人は無視してくれ。
# UNIX な人で初心者は心の中に秘めておいてくれ。
10045:2001/05/22(火) 11:10
>>91 >>45
誰か再現して原因を突き止めてください。
101Take:2001/05/22(火) 13:30
無限ループ内でKey入力等を受け取ったらループを脱出するような
プログラムの作り方をご存知内でしょうか。

while(1)
{
/*処理*/

/*ループ脱出*/
}

ちなみに

do
{
/*処理*/
}
while(getch() != 97) /* 97はAsciiでの 'a' */

のような処理だとgetch()関数で入力待ちになるので入力しない
時にはループを実行し続けるような処理がしたいんです。
(WindowのWinProc関数のような割り込み処理のようなもの)
どうかお願いします。
102デフォルトの名無しさん:2001/05/22(火) 14:30
select文じゃ駄目?
103デフォルトの名無しさん:2001/05/22(火) 14:44
kbhit
104デフォルトの名無しさん:2001/05/22(火) 15:04
>>101
OSが何か書かないとと答えようがない。
WinProcはコールバックで割り込みとは関係ない。

>>102
select文?VBの?(藁
105デフォルトの名無しさん:2001/05/22(火) 17:46
>>101
マルチスレッドにすれば全部解決します。
やり方はOS依存なので自分で調べてください。

あと、'a'って書こうぜー?
106デフォルトの名無しさん:2001/05/22(火) 18:22
>>91
の原因は何なんでしょう?
むむー。
107デフォルトの名無しさん:2001/05/22(火) 19:05
構造体 PP
long aa
long bb
void (*cc)()
というものがあります。

short tmp[50]
というものがあります。

ヘッダで以下のように宣言されています
#define TMPAREA (*(PP **)&tmp[30])

tmp[32]には別の人がフラグとして情報をもたせてあります。
で、今解読しているソースで

TMPAREA->bb = 50000;

と書かれています。
コメントで /* tmp[30]にデフォルト値を設定 */ と書かれています。

これって問題なく動作するんですかねー??
108デフォルトの名無しさん:2001/05/22(火) 19:40
動くかもしれないけど、
設計した奴が目の前に居たら殴るかも
109107:2001/05/22(火) 19:44
設計した人はいないけど、歴代の開発者はいっぱいいますよー
6年前から続いているシステムのソース修正を担当することになって
ソース開いて

「はあ?」

の連発ですー
110名無しさん@お腹いっぱい。:2001/05/22(火) 19:49
>>100
ほんとだ、0にならんね。
#include <stdio.h>
#include <math.h>
main()
{
  printf("%lf\n", sin(0));
}
をコンパイルして実行すると
0.000000
と表示する。
gdb a.out してから
(gdb) br main
(gdb) run
としたところで
(gdb) print/f sin(0)
$1 = 3.34344531e-13
とでた(Linux@Intel)。
e-13だから殆ど0だけどね:D
111デフォルトの名無しさん:2001/05/23(水) 01:04
C-FAQは、>>1参照
112デフォルトの名無しさん :2001/05/23(水) 19:32
下のプログラムのなかの
if (fds[0] != STDIN_FILENO) {
dup2(fds[0], STDIN_FILENO);
close(fds[0]);
}
がさっぱり分かりません。dup2を詳しく
解説してください


switch (pid0 = fork()) {
case -1:
fprintf(stderr, "%s: cannot fork\n", argv[0]);
return -1;
case 0:
close(fds[1]);
if (fds[0] != STDIN_FILENO) {
dup2(fds[0], STDIN_FILENO);
close(fds[0]);
}
execl("/usr/local/bin/wc", "wc", "-l", NULL);
execl("/usr/bin/wc", "wc", "-l", NULL);
execl("/bin/wc", "wc", "-l", NULL);
_exit(-1);
}
switch (pid1 = fork()) {
case -1:
fprintf(stderr, "%s: cannot fork\n", argv[0]);
return -1;
case 0:
close(fds[0]);
if (fds[1] != STDOUT_FILENO) {
dup2(fds[1], STDOUT_FILENO);
close(fds[1]);
}
execl("/usr/local/bin/ls", "ls", "-1", NULL);
execl("/usr/bin/ls", "ls", "-1", NULL);
execl("/bin/ls", "ls", "-1", NULL);
_exit(-1);
}
113デフォルトの名無しさん:2001/05/23(水) 20:35
dup2って何する関数だっけ?
114デフォルトの名無しさん:2001/05/23(水) 20:53
>>112
> dup2を詳しく解説してください
man dup2
名前
dup2 - duplicate an open file descriptor

形式
#include <unistd.h>

int dup2(int fildes, int fildes2);

DESCRIPTION
The dup2 function causes the file descriptor fildes2 to
refer to the same file as fildes. The fildes argument is a
file descriptor referring to an open file, and fildes2 is a
non-negative integer less than the current value for the
maximum number of open file descriptors allowed the calling
process. See getrlimit(2). If fildes2 already refers to an
open file, not fildes, it is closed first. If fildes2 refers
to fildes, or if fildes is not a valid open file descriptor,
fildes2 will not be closed first.

The dup2 function is equivalent to fcntl(fildes, F_DUP2FD,
fildes2).)
115デフォルトの名無しさん:2001/05/23(水) 20:59
unix系なら、ここなんかどうよ
ttp://www.jp.freebsd.org/man-jp/search.html
116デフォルトの名無しさん:2001/05/23(水) 23:18
>>59 これ、お願いします。
117デフォルトの名無しさん:2001/05/23(水) 23:23
嫌です。>>116
118デフォルトの名無しさん:2001/05/24(木) 01:04
>>116
>どうやればいいのでしょう?

自殺でもすればー?
119デフォルトの名無しさん:2001/05/24(木) 03:39
>>116
>処理が大きくなって途中で分からなくなり、ダメでした。
分割統治法を学び給え
120デフォルトの名無しさん:2001/05/24(木) 04:28
>>96
比較関数が構造体のqsortで良いのでは?

>>112
dup2は、ファイルハンドルを複製する関数なので、
(ファイルハンドルについての、細かい事は自分で調べて下さい)
あとは、「STDIN_FILENO」の定義次第だけど、
普通に考えれば、stdinのファイルハンドルではないかと…。
つまり、この処理後は、fds[0]からの入力は、
stdinからの入力として読み込む事が出来ます…多分。

>>59
別に、それ程難しい(複雑)とは思いませんが…。(^^;
取り敢えず、自分で作れるところだけ作って、
入力部、出力部、マッチ部、等々、幾つかの関数に分け、
どうしても上手く行かない部分だけ聞いた方が良いかと…。
121デフォルトの名無しさん:2001/05/24(木) 20:39
>>110
GDBのバグですかね??
私は2.12121442になりました。
Linux Red hat 6.0にて
122デフォルトの名無しさん:2001/05/24(木) 20:54
C言語用.INIファイル読み取りライブラリどっかに落ちてないですか?
UNIXで使いたいのですが。
123デフォルトの名無しさん:2001/05/25(金) 00:45
文字列 str1 の指定された位置(左端を0としてP番目の文字以降に
文字列 str2 を挿入し,結果としてstr3を作るプログラムを作成しなさい。
str1は ABCGHI
str2は EFG
str3は 空っぽ
Pは 3

できるだけ簡単にお願いします。ちょうどIFとかWHILE文の所の
課題です。
死にそうです。
INTはI,J,k,P でお願いします。
124デフォルトの名無しさん:2001/05/25(金) 00:58
C の予約語には IF, WHILE, INT なんてありません。
(もちろん、if, while, int もないです。)
そのあたりのセンスというか感覚を磨いてからでないと
C どころかコンピュータそのものを操るのは無理でしょう。

と書きつつも「標準ライブラリは使用してよいのか?」
と言ってみる。
>>123
125デフォルトの名無しさん:2001/05/25(金) 01:26
一応,教科書どおりに書きました。
# include <stdio.h>
void main()
{
って始まるやつです。

これに変数の型を指定するのに
intやcharを使いますよね?

標準ライブラリ?なんだろ?
ソフトは「LSIC」で,メモ帳で書いて拡張子をcにして
アイコンにD&Dすれば勝手にコンパイル→exeファイルができる
ものです。
126デフォルトの名無しさん:2001/05/25(金) 01:32
ぜひとも>>125の「void main」には反応しない様にお願いします!
127デフォルトの名無しさん:2001/05/25(金) 01:48
>>125
>って始まるやつです。

ここに反応しそうです。
128デフォルトの名無しさん:2001/05/25(金) 01:51
>>125
この程度が自分で組めないようなら、、、学校?仕事?趣味?
 趣味なら、頑張れ。
 学校なら、友達に聞け。友達いない? 諦めろ。才能ないし。
 仕事? 辞めろ。邪魔だ。
129VBなら:2001/05/25(金) 01:52
str3 = left(str1,3) & str2

だな(w
130デフォルトの名無しさん:2001/05/25(金) 02:23
>>123

strncpy(str3,str1,p);
strcat(str3,str2);
strcat(str3,str1+p);

標準ライブラリベタ使い(w

これは冗談としても、この先どんどん課題難しくなるから、
今のうちに勉強するか学校やめるか考えたほうがいいよ。
それかレポートを丸写しさせてくれるような友達を見つけるか。
131124:2001/05/25(金) 02:31
>(もちろん、if, while, int もないです。)
全角で書いたつもり↑
132デフォルトの名無しさん:2001/05/25(金) 05:18
言わんとする事の細かい部分(変数の使い方)は、
良く分かりませんが、こんな所でしょうか?
でも、LSIC使ってて、課題が出るような環境って…。
やっぱ、ネタ? (^^;
------------------------------
#define MAX 10
char str1[] = "ABCGHI" ;
char str2[] = "EFG" ;
char str3[MAX] ;
size_t P = 3 ;

void main () {
size_t I ;
size_t J ;
size_t k ;
I = J = k = 0 ;

while ( I < P ) {
str3[k] = str1[I] ;
k++ ;
I++ ; }
while ( str3[k] = str2[J] ) {
k++ ;
J++ ; }
while ( str3[k] = str1[I] ) {
k++ ;
I++ ; } }
------------------------------
133デフォルトの名無しさん:2001/05/25(金) 05:56
size_tとか使うと確実に写したのがバレバレだろうね(藁
134デフォルトの名無しさん:2001/05/25(金) 09:32
malloc()でメモリの確保に失敗したとき、NULLを返さずにmalloc()
の中で落ちてしまうのですがこれはどういうことなんでしょうか?
サイズが小さいと落ちないようですが、確保しようとするサイズは何か
関係ありますか?
135デフォルトの名無しさん:2001/05/25(金) 09:39
その式書いてみーや
136デフォルトの名無しさん:2001/05/25(金) 09:46
>>134
ライブラリの蟲かヒープ壊したかでしょ
Linuxだと失敗時は使った瞬間にSEGVだった気がする
137123:2001/05/25(金) 12:26
みなさん,助けていただいてありがとうございます。
独学で昨日始めたばっかりなんです。
ちょっといきづまってしまいました。

また来るかもしれませんが,冷たくしないでください。
138質問翁:2001/05/25(金) 12:58
Cに限ったことではないですが質問があります。
他のアプリケーションのウィンドウをSetParent で
自身の子ウィンドウにした場合の弊害は何ですか?
MSDNには「新しい親ウィンドウと子ウィンドウは、
同じアプリケーションに属していなければなりません。」と
書いてありますが、試してみると一応表示されるんですよね。
139デフォルトの名無しさん:2001/05/25(金) 13:00
>>138
なんかスレ違いだよ。
140デフォルトの名無しさん:2001/05/25(金) 13:43
#define WRK_CODE (100*0x18*2+1)

main()
{
char mode;

mode = !WRK_CODE;








modeには何が入るの?
141デフォルトの名無しさん:2001/05/25(金) 13:47
>>140
微妙にスレ違い。
↓こっちがふさわしそう。
http://piza.2ch.net/test/read.cgi?bbs=tech&key=981185737
142デフォルトの名無しさん:2001/05/25(金) 13:48
>>140 WRK_CODE をビット反転した結果
143デフォルトの名無しさん:2001/05/25(金) 14:01
>>142は大嘘なので信じないように。ビット反転演算子は「~」だ。
144デフォルトの名無しさん:2001/05/25(金) 14:03
>>140
真偽の反転だろ?
145134:2001/05/25(金) 15:32
W32APIと標準関数(mallocなど)を混ぜて使っているのですが
これは不具合の原因になりますか?
146デフォルトの名無しさん:2001/05/25(金) 15:45
>>123 がんばれよぉ。。。
147デフォルトの名無しさん:2001/05/25(金) 16:15
>>134=145
だから、その式書いてみろや!
人のいうこと聞かずに一方的に質問しないこと。常識やぞ。
148134      :2001/05/25(金) 19:34
int *it;

*it = malloc( (int)255 );

です。
149デフォルトの名無しさん:2001/05/25(金) 20:24
>>148
it = (int *) malloc( ... )
です。
あと、int 255 分個用意したければ malloc(sizeof(int) * 255)
ポインタについて勉強なされ。
150134:2001/05/25(金) 20:50
148は偽物。何でそういう暗いことするんだ?
やっぱ書き込まないのが一番だな。。。はーめんどくさ。
151デフォルトの名無しさん:2001/05/25(金) 20:59
>>149
微妙にスレ違い。
↓こっちがふさわしそう。
http://piza.2ch.net/test/read.cgi?bbs=tech&key=981185737
152149:2001/05/25(金) 21:07
>>151
ああそうだな
153デフォルトの名無しさん:2001/05/25(金) 21:59
>>150
おいおい、バカにされたからって偽者のせいにして
自分はいかにも賢い、みたいな態度とるなよ。嫌われるぞ?
154134:2001/05/25(金) 22:33
馬鹿にされたって誰が?149は148へのレスだし148だってネタだろ。
面倒くさいって言うのは偽物の指摘とこういう誤解へのレスなどのこと。
放置しとけばいいんだが俺的にキモイんでね。でもやっぱ面倒くさいので
もう書き込むのはこれで最後にしとく。>153
155デフォルトの名無しさん:2001/05/25(金) 23:59
あ〜あ、さがちゃたよ。
156132:2001/05/26(土) 00:16
>>123
誰宛てか、書くの忘れたけど分かりましたよね。(^^;
でも、独学なのに、何で課題があるの?
やっぱ、ネタだったのかな…。
本当に、昨日から始めたばかりで、気を悪くしたら、ゴメンね。
157デフォルトの名無しさん:2001/05/26(土) 00:31
C言語で
文字列Aを特定の文字で切り分けて
配列にいれるっていう関数はありますでしょうか?
Perlの
@array = split(/\,/,$line);
と同じモノです。
158デフォルトの名無しさん:2001/05/26(土) 00:37
Gcc v3.0 will be released in the next few weeks. For linux at least :)

これってホント?
159153:2001/05/26(土) 00:38
>>154
おお、本当に偽者だったのか。それはスマん。
ま、人にものを聞く態度がなってなかったから、偽者にからかわれたんだろうね。
以後精進しなさいな(w
160デフォルトの名無しさん:2001/05/26(土) 00:38
CでPOWER PCの丸めの向きを変えるのってどうやればいいんですか?
http://mackako.im.uec.ac.jp/chiba-f/octave/fpu_control.html
ここ見てやってみてもエラーが出てできないです。
161デフォルトの名無しさん:2001/05/26(土) 00:40
最近の言語から始めた人って、C言語の関数は不便だ不便だって
文句言うのが多いよなー
ちったあ自力でやれ!自分で関数作れ!って思うことが多い・・・

スレに反するので、さげ
162デフォルトの名無しさん:2001/05/26(土) 00:50
>>157
strpbrk() もしくは strtok(), を使って自分でバラす。

元の文字列を破壊して構わないなら、strtok() でセパレータを '\0' に書き換えつつ、
各要素へのポインタを記録しておくのがセオリー。
163デフォルトの名無しさん:2001/05/26(土) 03:26
>>157
perlのソースからぱくってこい
164デフォルトの名無しさん:2001/05/26(土) 04:38
Cでシステムコールを勉強したいんですが、
なにかいい本など教えてください
165デフォルトの名無しさん:2001/05/26(土) 04:43
>>164
システムコール・・・
機種や使ってるコンパイラはなんですか?
166デフォルトの名無しさん:2001/05/26(土) 05:03
わざわざシステムコールつってんだからUNIX系と思うけど。
オンラインならlinuxのJFドキュメントとか参考になるかな?>164
本は腐るほど出てると思うけど。
167デフォルトの名無しさん:2001/05/26(土) 07:07
strなんたら(strcpy、strcmp、strcat等)って正しくはなんて読むのでしょうか?
私は良く判らないのでそのまま「エスティーアールコピー」って言ってたんですが、「ストラコピー」や「ストリングコピー」っていう人もいました。
もしも正しいのが判らなければ多数派でもいいです。
お願いします。
168デフォルトの名無しさん:2001/05/26(土) 07:15
>>167
charですらキャラ派、チャー派がいるのに
strなんかだと……

つーか正しいも糞もないので
そんなこと気にせず、勉強しなさい。
169デフォルトの名無しさん:2001/05/26(土) 09:37
オマエモナ
170デフォルトの名無しさん:2001/05/26(土) 13:23
#include <stdio.h>

int main ()
{
int c, b;
while ((c = getchar()) != EOF) {
b = (c & 0x01) << 7 | \
(c & 0x02) << 5 | \
(c & 0x04) << 3 | \
(c & 0x08) << 1 | \
(c & 0x10) >> 1 | \
(c & 0x20) >> 3 | \
(c & 0x40) >> 5 | \
(c & 0x80) >> 7;
putchar(b);
}
return 0;
}
これってなんですか?
171デフォルトの名無しさん:2001/05/26(土) 14:55
>>170
マクロ展開に失敗したのか?
172デフォルトの名無しさん:2001/05/26(土) 16:10
スターコピー
スターコンプ
スターカット
これだけは譲れません。
173デフォルトの名無しさん:2001/05/26(土) 16:13
>>170
'\'は必要無し
どっからパクってきたソースだ?
174デフォルトの名無しさん:2001/05/26(土) 16:16
ビット列を逆順にしたものを出力するプログラム
cat input.txt | foo > output.txt
175デフォルトの名無しさん:2001/05/26(土) 16:24
>>165
>>166

linuxです
176デフォルトの名無しさん:2001/05/26(土) 16:32
>>175
Linuxデバイスドライバ (オライリー)
Linuxプログラミング (ソフトバンク)

この2冊だけでご飯3杯はいけるね。
あとは カーネルソース がおかず。
JF,JM が漬物(ただしちょっと痛んでる)。
177ひよこ:2001/05/26(土) 19:39
C言語で再帰関数の勉強をしてたのですが疑問が出来たので質問させてもらいます。

A:  test(d, c, b, a++);
B:  test(d, c, b, a+1);

例えば、このような関数を再帰関数として使うとき、Aだと「不正な処理のため強制終了」
だったのですが、Bだとなんの問題もなく通りました。
なぜなのでしょうか?
178デフォルトの名無しさん:2001/05/26(土) 19:49
>>177
はぁ?
a++ってなに?
なんで全角混じってるの?
それと
> このような関数
と言われてもよくわからない。
179デフォルトの名無しさん:2001/05/26(土) 20:11
>>177-178
なんかスゲーワラタ
180デフォルトの名無しさん:2001/05/26(土) 20:11
まぁ仮にa++のことだとして、

a++とa+1の違いわかってる?
181中途半端くん:2001/05/26(土) 20:12
>>177
a++ だと、test終了後にインクリマンコされる。
a+1だと、testに a+1 が渡されるが aの値は変化なし。

基本動作が全然違うから、>>177は勉強頑張りなさい
182デフォルトの名無しさん:2001/05/26(土) 20:15
++aならよかったのにね(多分)
183デフォルトの名無しさん:2001/05/26(土) 20:33
>>181

違う。a++ でもtest関数に制御が移る前にインクリ○○○される。
184ひよこ:2001/05/26(土) 20:33
たくさんのレスありがとうございます。 ++の間違いでした。

a++ が間違いだということはわかりました。
でも、++a が a+1 と同じ意味というわけではありませんよね?
185中途半端くん:2001/05/26(土) 20:44
>>183
むう・・・処理系によって動作がことなるのか?
手元で実験したけど確かにtest後にインクりメンコされたよ。

main()
{
 int b=9;
 test(b++);
 printf("%d\n",b);
}
test(int b)
{
 printf("%d\n",b);
}

$ ./a.out
9
10
186デフォルトの名無しさん:2001/05/26(土) 21:13
>>184
はい、++a が a+1 と同じ意味というわけではありません。
187デフォルトの名無しさん:2001/05/26(土) 21:15
>>164
『詳解UNIXプログラミング』なんかどうよ?
Linuxだと微妙に違うかも知んないけど。
http://www.amazon.co.jp/exec/obidos/ASIN/4894713195/249-6075145-6980341
188中途半端くん:2001/05/26(土) 21:15
>>183
言ってる意味がわかったよ
testにはaが渡されるけど、testが実行されるときにはもうa++されてると。
勉強不足だったよ。ごめん
189183:2001/05/26(土) 21:22
>>188

そう。

#include <stdio.h>

int a;

void test(int n)
{
printf("n = %d\n", n); /* nは9 */
printf("a = %d\n", a); /* aは10になっている! */
}

int main(void)
{
a = 9;
test(a++);

printf("a = %d\n", a); /* もちろん a は 10 */

return 0;
}
190デフォルトの名無しさん:2001/05/26(土) 21:44
こんなコード、そもそもかかないことだ。
191デフォルトの名無しさん:2001/05/27(日) 23:39
行列式を求めるにはどうしたらよいのでしょうか?
192デフォルトの名無しさん:2001/05/27(日) 23:53
>>185
もともと b++ の使い方間違ってるよ。本読みなおせ。
193デフォルトの名無しさん:2001/05/28(月) 00:00
>>192
間違った使い方のサンプルなんです。
194192:2001/05/28(月) 00:10
>>193
ん、そっか。悪かった。
195デフォルトの名無しさん:2001/05/28(月) 02:33
週明けあげ&次ネタ待ち
196デフォルトの名無しさん:2001/05/28(月) 03:17
C言語なんて古いもの、もう使ってる会社ないんじゃないの?あるの?
大抵はVC++かC++かJAVAでしょ。Cなんて役に立つのかなあ
197デフォルトの名無しさん:2001/05/28(月) 03:20
>>196
寝言は寝てからな。
198くみこ:2001/05/28(月) 03:30
>>196
失礼ね。まだまだ現役よ!
199デフォルトの名無しさん:2001/05/28(月) 07:47
>>196
C言語知らないのか?
CとC++を比べるのはいいけど、C++とVC++を別物というのは
ちょっと馬鹿っぽいぞ。まあ、違うといえば違うがな。
200デフォルトの名無しさん:2001/05/28(月) 11:07
範囲1〜10の文字列にアスキーコード[0x21]〜[0x7E]の範囲の文字
をランダムに決定するにはどうしたら良いでしょうか?
201デフォルトの名無しさん:2001/05/28(月) 11:25
>>200
なんか文がおかしいよ。

for(i=0;1<10;i++){
str[i]=rand()%(0x7e-0x21)+0x21;
}
202デフォルトの名無しさん:2001/05/28(月) 11:33
>>196,>>200
Cについて「どうも話が合わん。」って思ったとき、
相手が MS-C しか知らない or MS-C 出身者だったってこと多くない?
203202:2001/05/28(月) 11:38

>>196,200 誤り
>>196,199 正解
スマソ。
204!196:2001/05/28(月) 11:45
>>199
> C++とVC++を別物というのは ちょっと馬鹿っぽいぞ。

C++の処理系ってVC++しかないの?
それは君の頭の中でだけだろ?
205デフォルトの名無しさん:2001/05/28(月) 11:46
>>204
???
206204:2001/05/28(月) 11:47
ごめん。
元はと言えば>>196

> 大抵はVC++かC++かJAVAでしょ。

がおかしいのだね。

> 大抵はC++かJavaでしょ。

って言うべきって話ね。
207デフォルトの名無しさん:2001/05/28(月) 11:50
>>206
ブ、ラジャ!
208デフォルトの名無しさん:2001/05/28(月) 16:35
if〜else文とswitch〜case文って、どっちのほうが
処理が早いの?
switch〜case文で30段階ぐらいに分かれてるのと
if〜else文で分岐は3つ、その中でまた細かく分かれて
合計30ぐらいの条件になっているのってどっちのほうが
負荷が軽いか、一般論でいいので教えてください。
209デフォルトの名無しさん:2001/05/28(月) 16:45
>>208
単純に定数の比較だけなら一般的には同じ。
210デフォルトの名無しさん:2001/05/28(月) 16:47
聞いたことある話だと、
0から始まってる連番のcaseはジャンプテーブルに展開されるので高速らしい。
if文は単純にテーブルにできるものじゃないから、
処理速度はcase<=ifじゃないかなーと思う。推測レベルですが。

>>208の処理だと、ifの方は2段階で条件分岐をしているので、
1段階のcaseのほうが速いと思う。
211208:2001/05/28(月) 16:54
勉強になります。メモメモ。

いやあ、呼ばれる頻度の高いものが上に来るようにif文を最適化して
書いておけば、上からひとつひとつチェックされていくcase文より
結果的に早くなるよ、と言われてそれを試したところ、実際にかなり
早くなったことが8年ぐらい前にあるんです。

でも、今のCPUだとちょっとした処理程度では、速度の差なんて
見えない、ソースコードの見易さのほうが先だ・・・みたいな状況ですから
どっちが本当にいいのかわからなくなってまして、ね。

・・でもVBの場合は、select〜case〜end selectよりも、if〜end ifの
方が格段に早いような気もするなぁ・・・
タイマー関数で使ったら差を感じたことがあります。
212デフォルトの名無しさん:2001/05/28(月) 17:07
>>208>>210
caseの条件次第でしょう。ジャンプテーブルで簡単に分岐できる
のなら早くなるし、逆に、まったく出来ずに30回の比較になる可
能性もありえます。意外とifの方がいい場合も結構あるかと。
213デフォルトの名無しさん:2001/05/28(月) 17:10
俺の職場のソースって大半が

void aho( void )
{
switch( ? )
{
case a:
return;

case b:
break;

case c:
return;

default:
return;
}

baka();
}

になっている。これはこれで早いのかいな。
214デフォルトの名無しさん:2001/05/28(月) 18:15
今調べたら
・caseの数がそれなりにある(10ぐらい)
・ほぼ連番(1つなら連続してない数があっても可)
・0からじゃなくても可
な条件でジャンプテーブルに展開されたよ。

一般にはcaseで逝けるところはcaseのほうがよさそう。

>>212
なんか具体的にifのがいいところがあったら教えて。
215まちこさん:2001/05/28(月) 18:44
#include <stdio.h>
#include <stdlib.h>
#define TYPE float

int main(){
int i, j, k;
TYPE ***h;
int L = 17, M = 13, N = 14;

h = (TYPE ***)malloc(sizeof(TYPE **)*L);
*h = (TYPE **)malloc(sizeof(TYPE *)*L*M);
**h = (TYPE *)malloc(sizeof(TYPE)*L*M*N);
for(i=0;i<L;i++){
h[i] = *h + i*M;
*h[i] = **h + i*M*N;
for(j=1;j<M;j++){
h[i][j] = *h[i] + j*N;
}
}

for(i=0;i<L;i++){
for(j=0;j<M;j++){
for(k=0;k<N;k++){
h[i][j][k] = 0.1;
printf("&h[%02d][%02d][%02d] = %p\n", i, j, k, &h[i][j][k]);
}
}
}

exit(0);

}


3次元配列の動的確保の部分を
関数にしたいのですが、
どうしたらいいのでしょうか?

void hogehoge(TYPE ****f, int X, int Y, int Z){
(関数の中身)
}

で、main関数で,

hogehoge(&f, L, M, N);

と、したいのですが...
216デフォルトの名無しさん:2001/05/28(月) 18:46
全角スペースで字下げしてほしいの・・・
217デフォルトの名無しさん:2001/05/28(月) 18:46
関数内で領域確保しても、関数終われば領域は破棄されるんじゃ
なかったっけ。mallocは、宣言位置より下の関数に対しては有効だけど
宣言位置より上には無効じゃなかったけー?
218デフォルトの名無しさん:2001/05/28(月) 18:48
>>217
そういうmalloc欲しいな〜
あったら便利だよね♥

でも、そんなものはない
219デフォルトの名無しさん:2001/05/28(月) 19:05
>>217
激しい電波だな。大丈夫か?
220デフォルトの名無しさん:2001/05/28(月) 20:13
>>215
そのmain関数を書いたのがあなたなら
そんなもの簡単に書けると思うのですが。

それとも大学の課題とかですか?

どっちにせよ僕が答える必要はないでしょ。
221デフォルトの名無しさん:2001/05/28(月) 20:57
関数を抜けると解放されちゃうメモリを確保する関数というのは
どう書いたらいいのでしょう(藁
222デフォルトの名無しさん:2001/05/28(月) 21:07
スタックに確保する
223デフォルトの名無しさん:2001/05/28(月) 21:47
>>221は関数を抜けると解放されてしまうのだったら、
メモリを確保する関数など書けないではないか、
ということを言いたかったのだと思われ。
224215のまちこさん:2001/05/28(月) 21:58
>>220

>>215は半分以上俺が書いた
void でない関数なら1個関数を知ってるのよ

double ***mona(int X, int Y, int Z)
{
 int i, j;
 double ***a;
 a = (double***)malloc((X+1)*sizeof(double**));
 for(i=0;i<=X;i++){
  a[i] = (double**)malloc((Y+1)*sizeof(double*));
  for(j=0;j<=Y;j++){
   a[i][j] = (double*)malloc((Z+1)*sizeof(double));
  }
 }
 return a;
}

で、main関数で

double ***f;
f = mona(50,50,50);

とかで、確かに3次元配列の動的確保ができる。
だけど、これだとメモリに連続して確保されてないのよ。

しかも、返り値を持たない関数を作りたいので、
どうしようかと。

単にアドレスを渡して、関数側ではさっきの部分を
それぞれポインタにすればいいと思うのですが、
ドキュソなのでうまく逝かないのね。
225217:2001/05/28(月) 22:17
え?

main()
{
char *a;
seset( a );
printf( "%s", a );
}

void seset( char *aa)
{
aa=(char *)malloc(255);
strcpy(aa,"hoehoe");
}

で、ちゃんとhoehoeって出るの?
MS-DOSで5年ぐらい前にやったときはでなかったような・・
ごめん、もうC4年以上触ってないから自信無いです
226デフォルトの名無しさん:2001/05/28(月) 22:26
aはどこ指してんだ?厨房は無理するな。
227デフォルトの名無しさん:2001/05/28(月) 22:29
>>225
メモリ確保云々より、ポインタを理解するのが先だと思われるっす。
228デフォルトの名無しさん:2001/05/28(月) 22:30
>>225
ポインタずーれーまーくーりー
悪い例てんこもりー
229デフォルトの名無しさん:2001/05/28(月) 22:32
>>217
それってalloca()の事では?

それにしても
>宣言位置より下の関数に対しては有効だけど
ってのは違ってるが。
230カミーユ:2001/05/28(月) 22:32
そんなコード、修正してやる!

main()
{
 char *a;
 seset( &a );
 printf( "%s", a );
}

void seset( char **aa )
{
 *aa=(char *)malloc(255);
 strcpy(*aa,"hoehoe");
}
231デフォルトの名無しさん:2001/05/28(月) 22:33
>>218
alloca のことか?
232デフォルトの名無しさん:2001/05/28(月) 22:41
>>217はポインタの勉強を1からやりなおせ
ハゲしく勘違いしてる
233デフォルトの名無しさん:2001/05/28(月) 22:57
>>215はいったい何なの?
自分で書いたんだったら明らかだと思うのだが。
234デフォルトの名無しさん:2001/05/28(月) 23:15
>>233
恒例の宿題だと思われ。
235220:2001/05/28(月) 23:35
>>224
半分以上って……やっぱ宿題か…よく見るとmainも変だね。
たぶん君の意図してるのは

void hogehoge(TYPE ****f, int x, int y, int z){
*f = (TYPE***)malloc(sizeof(TYPE)*x*y*z);
}

でしょ。
236デフォルトの名無しさん:2001/05/29(火) 00:43
話は違いますが

strcat(a,b)などのstr系の文字列処理関数は、
引数にそれ自身が変化する文字は使えないですよね。
たとえば、for(i=0;i<99;i++)のiをbのところに置けないです。
このような変化する文字を他の文字に連結させる方法はないですか?
参考書でも調べてみたのですが、載って無かったです。
237デフォルトの名無しさん:2001/05/29(火) 01:05
>>236
sprintf
238デフォルトの名無しさん:2001/05/29(火) 01:07
>>236
質問の意味がよくわからな
239デフォルトの名無しさん:2001/05/29(火) 01:27
for(i=0;i<99;i++){
strcat(a,i);

この処理は無理です。
文字列aの後ろに数値を連結させたいのです。
sprintfだと連結ではなくて、コピーになってしまいます。
240デフォルトの名無しさん:2001/05/29(火) 01:37
for(i=0;i<99;i++){sprintf(c,"%d",i);srtcat(a,c);...
241デフォルトの名無しさん:2001/05/29(火) 01:50
>>239>>240
for(i=0;i<99;i++){a+=sprintf(a,"%d",i);}
242デフォルトの名無しさん:2001/05/29(火) 01:52
サンキュー!!
243デフォルトの名無しさん:2001/05/29(火) 02:11
>>241
目から鱗が30枚くらい落ちました。
勉強しよう。
244デフォルトの名無しさん:2001/05/29(火) 02:15
いまだに236のしたいことがわからない俺はSEには絶対なれませんか?
245デフォルトの名無しさん:2001/05/29(火) 02:46
>>236はVBみたいに勝手に数値が文字になってくれると思い込んでるんでしょ。
まず型ってのを理解してもらわないと。
246デフォルトの名無しさん:2001/05/29(火) 03:09
>>241
ポインタで無ければならないし、処理前のa+=strlen(a)が抜けてる
247デフォルトの名無しさん:2001/05/29(火) 03:16
>>244
絶対なれません。
248 :2001/05/29(火) 05:09
目からウロコ つか、使いどころがわからん
hoge01234567891011、、、なんて何に使うの?
249デフォルトの名無しさん:2001/05/29(火) 05:11
>>244
キニスルナ。236の日本語が不自由なだけだよ。
250220:2001/05/29(火) 11:46
>>235
バカ……
251デフォルトの名無しさん:2001/05/29(火) 12:06
日本語なら、ワシに聞け! スレでも作ろうかな
252佐藤浩嗣:2001/05/29(火) 12:19
今ごろ16ビットのTurbo C++を使っている人はいないかもしれませんが、これでWindows programを作ってWinExecで他の実行プログラムを呼び出すと同じフォルダ内のプログラムは呼び出せますが、フルパスを書き込んでも他のフォルダのプログラムは呼び出せません。WinExec以外に事前指定指定すべき関数などがあるのでしょうか?
また、同じくTurbo C++でEasy Winでcinやcoutによって入力ファイルや出力ファイルを指定するときも同じく、そのプログラムのあるフォルダ内のファイルしか呼び出せません。(GetApplication()->ExecDialog(new TFileDialog(this, SD_FILEOPEN,
 strcpy(FileName, "*.txt"))) == IDOKなどで、開くファイルや保存ファイルを指定するとフルパスで指定できるのに、WinExec, EasyWinでのcin, coutではフルパスが無効なのはなぜでしょうか?有効にするにはどうすればよいのでしょうか?
253デフォルトの名無しさん:2001/05/29(火) 12:20
>>252
\\→\
254デフォルトの名無しさん:2001/05/29(火) 15:07
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
255デフォルトの名無しさん:2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
256デフォルトの名無しさん:2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
257デフォルトの名無しさん:2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
258デフォルトの名無しさん:2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
259デフォルトの名無しさん:2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
260デフォルトの名無しさん:2001/05/29(火) 15:08
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
261デフォルトの名無しさん:2001/05/29(火) 15:09
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
262デフォルトの名無しさん:2001/05/29(火) 15:09
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
263デフォルトの名無しさん:2001/05/29(火) 15:09
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
264デフォルトの名無しさん:2001/05/29(火) 15:10
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
265デフォルトの名無しさん:2001/05/29(火) 15:11
visual C++やってますが、”curses"をインクルードできません。もし
これに変わるものがあれば教えてください。
カーソル移動なんかをやりたいのですが、できません。
266デフォルトの名無しさん:2001/05/29(火) 15:24
>>254-265
うざい 消えろ 氏ね
267デフォルトの名無しさん:2001/05/29(火) 15:49
>>265
カーソル移動なんかやらなくていいよ
268デフォルトの名無しさん:2001/05/29(火) 17:08
エスケープシーケンス
269ウルトラ初心者:2001/05/29(火) 17:10
strcmpを使用しないで文字列を比較するにはどうしたら
良いのでしょうか?
270デフォルトの名無しさん:2001/05/29(火) 17:21
1)strcmp相当のものを自分で作る
2)アルゴリズムを見直して使用しないようにする

bool cmp(char *p1,char *p2)
{
do{
if(*p1 != *p2)
return false;
}while(*(p1++) != NULL);

return true;
}

こんな感じかな?
271デフォルトの名無しさん:2001/05/29(火) 17:23
あ、p2をインクリメントし忘れた。打つ出汁農
272デフォルトの名無しさん:2001/05/29(火) 17:45
do{
}while()
も職場によっては嫌われるよな〜
273デフォルトの名無しさん:2001/05/29(火) 17:48
えー、do{}while()いいじゃん。俺大好きだよ。
じゃぁ処理の結果によってループみたいなのはどうやって書くのかな。
for()?
274デフォルトの名無しさん:2001/05/29(火) 18:23
おれは while すら嫌いで for ばっか使ってるぞ。
275デフォルトの名無しさん:2001/05/29(火) 19:16
>>272
>>273
while( 1 )
{
if( ?? ) break;
}

じゃない?
276デフォルトの名無しさん:2001/05/29(火) 19:43
while(1)って嫌いなんだよね
277デフォルトの名無しさん:2001/05/29(火) 20:31
Why?
278デフォルトの名無しさん:2001/05/29(火) 20:52
ちょっとお聞きしたいのですが、
ファイルの開け方やチェイン構造体は本を読んでなんとなく
わかるのですが、ファイルから文字列を一文字づつ読み込んで、
それをチェイン構造体に入れる方法がわかりません。

struct string{
char str;
struct string *next;
};

FILE *fp1;
char s[256];
int i;
i = 0;

struct string *data;

while(s[i] = getc(fp1) != EOF){
s[i] = getc(fp1);
data->str = [i];
i++;

とりあえずこんな感じでファイルの中の文字列を
構造体に変換しようとしてるのですが、うまくいきません。
なにか簡単な方法ありますでしょうか?
279デフォルトの名無しさん:2001/05/29(火) 21:05
dataの実体が無いよ
getc()を2回も呼ぶのはおかしいよ
ていうか、文法がめちゃくちゃだ;_;

リストがどうこうと言う前に、
C言語をもう一回勉強しなおそう。
280佐藤浩嗣:2001/05/29(火) 21:07
>>253
お蔭様でうまくいきました。ありがとうございました。m(__)m
void TMy::HandleButton3Msg(RTMessage)
{
// strcpy (s1,"c:\\Tcwin\\MyApp\\Template\\test1");
strcpy (s1,"C:\\Progra~1\\Intern~1\\IEXPLORE c:\\tcwin\\myapp\\template\\help.htm");
WinExec(s1, SW_SHOWNORMAL);
}
281279:2001/05/29(火) 22:09
すみません。 コードはかなり省いて書いてある上に間違っているので、
気にしないで下さいませ。
282デフォルトの名無しさん:2001/05/29(火) 22:30
do-whileはfindfirst/nextとかでよく使うけど
if (fd = first()) {
 do {
  /*fdの処理...*/
 } while(fd = next());
}
これよりスマートに書けるか?
283デフォルトの名無しさん:2001/05/29(火) 22:36
あ、書けるわ(w
for (fd = first(); fd; fd = next()) {
 /* fdの処理 */
}
すまそ。
284デフォルトの名無しさん:2001/05/29(火) 23:23
>>283 それもらった。
285!279:2001/05/29(火) 23:59
>>278=281
dataは、sと同じ大きさの配列で無ければいけません。
まあ、その前に、配列をチェイン化する目的も見えませんが…。
もし、それ以外の間違いなら、もう1度正しいと思っている、
(でも上手くいかない)ソースを、正しく(?)書いて下さい。
このままでは、欲しい結果(指摘)を得る事は、困難だと思われます。
要するに、間違いを気にするなと言われたら、
じゃあ、何を気にすれば良いんだ?って事になりますので…。(^^;
286デフォルトの名無しさん:2001/05/30(水) 00:37
>> 282-283
書けてないんじゃない?

age足
287デフォルトの名無しさん:2001/05/30(水) 00:56
>>282>>283も大バグですな。こんなやつが制御装置組んでいる
飛行機にだけは乗りたくないものだ。
288282=283:2001/05/30(水) 02:14
すまん。どの辺が間違ってるのかわからない。
くわしく指摘してくれい。
289288:2001/05/30(水) 02:16
>>286-287ね
290288:2001/05/30(水) 02:22
代入の部分のことを言ってるとしたら、萎えだなあ・・
291デフォルトの名無しさん:2001/05/30(水) 02:25
>>278
多分線形リストのことを言っていると思うので、
アルゴリズム辞典を買ってきて調べましょう。

>>286
俺もわからん。説明してくれ。
292!(286-291):2001/05/30(水) 02:36
自分も良く知りませんが、fdはファイルハンドルとして、
ファイルハンドル関係は、失敗した時、大抵-1を返すので、
もしかしたら、成功したfdの値が0の可能性もあるのでは?
まあ、結局は、first()とnext()次第だし、
本当に0を返す時があるかは、知らないけどね…。(^^;
293名無しさん@お尻おっぱい。 :2001/05/30(水) 02:47
>>292
fdは確かにファイルディスクリプタとして使われる変数名だけど
ここでもその意で使ってるか?

勝手な憶測でfirst(),next()ともに成功したら何らかの数値を、
最後までたどり着いたら0を返却する関数として読んでたよ。
294デフォルトの名無しさん:2001/05/30(水) 02:47
>>292
fd->ファイルハンドル
失敗->-1
決め付けはいかんなあ・・

>>282-283を純粋に見ると、C言語の条件式同様、
成功->非0
失敗->0
として扱ってるのは自明なんじゃないのか?
295デフォルトの名無しさん:2001/05/30(水) 02:56
>>293
自分は、成功した時にはファイル名へのポインタ、
失敗したら、NULLが帰ってくると読みました。
ただ、286,287の言うバグの可能性を考えると、
これ以外考えられなかった(思いつかなかった)ので…。
まぁ、どちらにしても、関数の戻り値次第だし、
あまり気にする必要もないのでは?
296デフォルトの名無しさん:2001/05/30(水) 02:59
つーことは、
>>286-287
はドキュンということでファイナルアンサー?
297292=295:2001/05/30(水) 03:01
>>294
>決め付けはいかんなあ・・
では、負の数と訂正させて頂きます。
それと、自分の基本的な考え方は、286と287以外の方と
ほぼ同じですので、あまり、厳しく突っ込まないで下さい。(^^;
298デフォルトの名無しさん:2001/05/30(水) 03:03
>>296
読解力に欠ける知能障害者だから・・・
彼らと仕事をしたら(職種が何であれ)とても大変な目にあいそうだ。
299デフォルトの名無しさん:2001/05/30(水) 03:04
>>296
286,287の意見を聞きたいので、
テレフォンを使わせて下さい。
300なもし:2001/05/30(水) 03:59
聞けって言っても教えてくれねーじゃねーか?しらね―んだろ。この
301デフォルトの名無しさん:2001/05/30(水) 04:29
オーディエンスでお願いします。
302デフォルトの名無しさん:2001/05/30(水) 09:55
>>282>>283
俺はfor()の中身が長くなったらdo while()使うなぁ。
なぜか行の長さのバランスが悪いソース嫌いなんで。
303デフォルトの名無しさん:2001/05/30(水) 10:53
>>286-287
某スレの101、別の某スレの430だろこいつ。
どうしようもないシッタカ厨房君だから相手にしなくていいよ>all
304デフォルトの名無しさん:2001/05/30(水) 10:55
>>303
>某スレの101、
気付けば「何だ」と思うよーなMiss[c/c++]
http://piza.2ch.net/test/read.cgi?bbs=tech&key=986528326

>別の某スレの430だろこいつ。
こっちはわからん・・・
305デフォルトの名無しさん:2001/05/30(水) 10:56
306304:2001/05/30(水) 11:00
>>305
サンクス
どのスレにもいるんだね・・・
307デフォルトの名無しさん:2001/05/30(水) 13:08
どっちかっつーと、
fd = first();
while (fd = next()) {
  ・・・
}
っていう形に持ち込みたいなぁ。
308デフォルトの名無しさん:2001/05/30(水) 13:33
>>307
whileの中の処理を関数に分ければ出来るよ。
意味あるかどうかは知らないけど。
309デフォルトの名無しさん:2001/05/30(水) 13:57
typedef unsinged char CHAR;
typedef unsigned char UCHAR;
unsigned char *getTable( int cnt, unsigned char *key, UCHAR *wrd, unsigned char *key2 );

この3行の意図するところを、誰か教えてください。
310デフォルトの名無しさん:2001/05/30(水) 13:57
先輩のソースです
311デフォルトの名無しさん:2001/05/30(水) 14:03
>>310
型定義とプロトタイプ宣言じゃん
(せっかくの定義型の使い方が中途半端だな。
貴殿はその辺を晒したいのか?)
312親切な人:2001/05/30(水) 14:03
>>310
その先輩を始末したら、ここに報告してくださいね
313309:2001/05/30(水) 14:05
ぐち 2  と間違えました。ごめんなさい(−−
314309:2001/05/30(水) 14:11
間違いついでに
/* このプロジェクトでは未使用 */ // ここから
typedef unsigned long u_long;
typedef unsigned short u_short;
typedef double u_double;
/* このプロジェクトでは未使用 */ // ここまで


じゃあ、消せよ! と思ったら別のソースで

u_long getKeyNyuryoku( unsigned long )

とかやってます。
315デフォルトの名無しさん:2001/05/30(水) 14:31
char dmy:6;
char tmp:3;

という書式があるんですが、これ何でしょう?
普通のCのソースで、コンパイルも通るのですが
何をやっているのかわかりません。

詳しい方、お教え願います。
316315:2001/05/30(水) 14:35
解決しました :p
317デフォルトの名無しさん:2001/05/30(水) 17:18
>>315-316
おれ知らんから、教えてくれ。
318317:2001/05/30(水) 17:22
nn-? Compile 通らないけど??
319うそつき:2001/05/30(水) 17:26
>>317
K&Rの本を読むと載ってます。
共用体がどうのこうのというあたりです。

ようは特定のビットを取り出してcharとかintとかとして使う為のものです。
320315:2001/05/30(水) 17:37
ビットフィールドですね
321デフォルトの名無しさん:2001/05/30(水) 17:37
>>317
ビットフィールドを調べてみろ。
http://www.ncad.co.jp/~komata/c-kouza7.htm

# 俺はあまり使わんが
322デフォルトの名無しさん:2001/05/30(水) 21:44
制御屋は使う、
こともある。
I/O アクセスする時など便利。
xx番地のnビット目を調べるときいちいちビット演算子を使わなくてもすむ。
ただし、その MPU とコンパイラを十分理解しておけ!!
323デフォルトの名無しさん:2001/05/30(水) 21:51
>>315
ちなみに標準でサポートされるビットフィールドの型はint, signed int,
およびunsigned intの3つだけ。
charや他の型を使えるのは処理系の独自拡張。これらの拡張は処理系ごとに
思いっきり振る舞い方が異なるから要注意ね。
324デフォルトの名無しさん:2001/05/30(水) 21:56
>>323
ビットフィールドそのものがインプリメント依存だよ。
325デフォルトの名無しさん:2001/05/30(水) 21:58
論理演算の方がつぶしが利く
326デフォルトの名無しさん:2001/05/30(水) 22:07
>>325
むしろそっちの方がきついかと。
327デフォルトの名無しさん:2001/05/30(水) 22:11
>>325
制御系のCコンパイラの場合ビットフィールドの振る舞いを変える
コンパイルオプションがあるから、どちらかと言うとビットフィールド
の方が流用が効くのでは?
328デフォルトの名無しさん:2001/05/30(水) 22:36
>>325
結局エンディアンに依存する
329323:2001/05/30(水) 22:42
>>324
標準規格の範囲であれば、処理系依存部分はせいぜいビットの順番とintの
場合の符合の有無程度。
それ以外の型を使うと、フィールドの順序までもがバラバラになる可能性が
ある。それに、そうした拡張を持つ処理系には、汎整数拡張を省略するもの
も多いから、なおのこと振る舞い方がバラバラになる。

>>325
同意。つぶしが利くのは論理演算。
ビットフィールドはつぶし云々より便利だから使うだけ。

>>327
コンパイラによる。
組み込みの場合は、いろいろな処理系を使わざるを得ないから、再利用を
考えたコードを書くときはビットフィールドは避けるか、使うにしても
signed intかunsigned intだけにして、ビットオーダを#ifで選択できる
ようにするしかない。
330デフォルトの名無しさん:2001/05/30(水) 22:43
メモリマップドファイルって便利だと思うんだけど
なんでみんな使わないの?
331デフォルトの名無しさん:2001/05/30(水) 22:43
>>328
論理演算はエンディアンには依存しない。
332デフォルトの名無しさん:2001/05/30(水) 22:49
>>331
intの場合はするだろう?
333331:2001/05/30(水) 22:54
>>332
依存しない。
もし依存するというのなら、それは(入出力ポート等の)アクセス方法を
間違えている。
334デフォルトの名無しさん:2001/05/30(水) 22:54
>>329
ビット操作でビットフィールドが良いか論理演算が良いかなんて結局
宗教みたいなもんだからどっちでもいいんじゃない?

>>331
エンディアン依存するよ。
335329:2001/05/30(水) 23:06
>>334
どちらが良いとか悪いとかは言っていない。
つぶしが利くかどうかということ。
用途に応じて使い分けるのが一番。
336デフォルトの名無しさん:2001/05/30(水) 23:08
これまでビットフィールドを使ったプロジェクトを(自分は)見たこと無い。
337デフォルトの名無しさん:2001/05/30(水) 23:09
しないと思うけどなー。
68系と86系で論理演算を書き分けたこととか無いよ。
338デフォルトの名無しさん:2001/05/30(水) 23:16
>>336
同意。
Cは既に論理演算があるのに、ビットフィールドは余計だったと思う。
339デフォルトの名無しさん:2001/05/30(水) 23:17
struct A{
   union{
      unsigned int  m_Pack;
      char      m_Char[4];//
      struct{
         unsigned int   m_Phase0 : 4;
         unsigned int   m_Phase1 : 4;
         unsigned int   m_Phase2 : 4;
         unsigned int   m_Phase3 : 4;
         unsigned int   m_Phase4 : 4;
         unsigned int   m_Phase5 : 4;
         unsigned int   m_Phase6 : 4;
         unsigned int   m_Phase7 : 4;
      };
   };
};

で論理演算の時はm_Packを使って時に応じているが。
340331:2001/05/30(水) 23:20
>>337
おそらく、バイトアクセスしないといけないデバイスを無理やりワードアクセス
するような場合を想定していると思う。
アセンブリ言語ではよくやることだけど、C言語でやる場合はエンディアン云々
以上の問題がある。可搬性については論外。
341デフォルトの名無しさん:2001/05/30(水) 23:22
それ、バグコードですが。>339
342デフォルトの名無しさん:2001/05/30(水) 23:23
>>333
全フィールドをバイトアクセスできるならな。
32bit単位でしかアクセスできない入出力ポートなんてのもあるのだよ。

>>336
それは経験が足りないか、または君の会社の思想の問題と思われ。
343デフォルトの名無しさん:2001/05/30(水) 23:26
>>339
unionの間違った使い方。
m_Packとビットフィールドは対応するとは限らないよ。やばいよ。
344デフォルトの名無しさん:2001/05/30(水) 23:35
>>340
そんな難しい話ではなくてもワード単位でアクセスするデバイスに
ワードで書き込んだだけでエンディアン依存してしまうのでは?
345デフォルトの名無しさん:2001/05/30(水) 23:39
>>343
まぢ? 根拠求む
(K&R読んだけど大丈夫そうに思える)
346デフォルトの名無しさん:2001/05/30(水) 23:47
m_Phase0〜7それぞれがunsigned int分の領域を使うかもしれんね。
構造体のメモリレイアウトは、メンバの順番以外保証されてなかったと思う。
347うそつき:2001/05/30(水) 23:50
>>346
GCCのオプションで構造体の最適化をしないというのがある
それをつかったら問題ない
たぶんうそ
348デフォルトの名無しさん:2001/05/30(水) 23:50
>>340
するね。このへん、組込系とかデバドラの経験がある人ならわかると思うが。
CPUと周辺デバイスでエンディアンが違うなんてザラにあるよ。
有名なトコだと、昔のMacに載ってたNu-Bus。

Macは68kだから当然ビッグエンディアンだが、Nu-Busはリトルエンディアンでしか
アクセスできないため、ワード転送しかできないデバイスなんかはメモリから読んで
バイトスワップするか、あらかじめスワップされたイメージを用意してたよ。
349デフォルトの名無しさん:2001/05/30(水) 23:55
>>348
outbとかinbをごりごり改造したり・・・
350デフォルトの名無しさん:2001/05/31(木) 00:08
自分で作るソートプログラムの引数を
qsort(void *,size_t,size_t,(*cmp)(const *, const *))
と同じようにしたいので、実際のqsortの中身を見たいのですが
ファイルにもないし、いろいろな本やサイトにもありません
どうすれば分かるのでしょうか?
351デフォルトの名無しさん:2001/05/31(木) 00:14
>>350
30円くれたら教えてあげます。
うそ。
アルゴリズム事典とか買ってくると漏れなくついてくるよ!
352350:2001/05/31(木) 00:19
>>351
辞典とかもいろいろ読みました・・・
void型ポインタ(オブジェクト)を引数に使って
るプログラムは全然なかったです
353デフォルトの名無しさん:2001/05/31(木) 00:22
>>352
キャストすればいいじゃん。
354350:2001/05/31(木) 00:27
キャストしてやってみたのですが
どうしてもぐちゃぐちゃしたプログラムに
なってしまうので実際どうやっているのかな?
とおもったのです・・・
355デフォルトの名無しさん:2001/05/31(木) 00:34
>>354
その辺はセンスよセンス。
うそ。
ここに自作コードを書くと漏れなく採点してあげるよ。
356デフォルトの名無しさん:2001/05/31(木) 00:44
typedef使えよ〜>>354
357デフォルトの名無しさん:2001/05/31(木) 01:04
typedef int (*comp_t)(const void*, const void*);
qsort(void *,size_t,cmp_t cmp);
358340:2001/05/31(木) 09:02
>>348
それはデバイスのリード・ライトがエンディアンに依存するのであって、
論理演算が依存するわけではない。
&=演算子等を使った場合でも理屈は同じ。
359315:2001/05/31(木) 09:10
ビットフィールド、周りに聞いたら知らん人多かったよ
ここで勉強になりました
間違った使い方しないよう十分心がけます。
・・・ていうか先輩のソースの修正なんすけどね
んでもって今日は体調悪いので休ませてもらってる。明日参考にしまーす
360317:2001/05/31(木) 19:04
ビットフィールドなんて、言葉すら知らんかった…
おかげで一つ賢くなれたので、はりきって逝ってきます
361デフォルトの名無しさん:2001/05/31(木) 19:31
K&R読んでない奴がたくさんいるな。
362デフォルトの名無しさん:2001/05/31(木) 20:57
旧スレageてるやつがいるのでこっちもageとこう。

>>361
今は他にいい本があるから、とか。
363デフォルトの名無しさん:2001/05/31(木) 21:17
>>361
C言語の規格を知るならJISハンドブックの方が絶対いいからね。
言語の仕様を知るなら処理系のマニュアルだね。
364デフォルトの名無しさん:2001/05/31(木) 21:48
>>358
ムキになって屁理屈こねてるね。
論理演算には少なくともリードが発生するだろうに。
その結果エンディアン依存するという指摘なんだよ。
365358:2001/05/31(木) 22:05
>>364
レジスタフェッチやイミディエイト値のリードは確かに避けられないね?
そんなものはエンディアンに依存するとは言わないよ。

それにデバイスへのアクセスは、エンディアンに依存するというよりメモリ
マップに依存するのであって、普通移植性に対する障害としてあげられる
エンディアンへの依存とはまったく別の問題だと思うけど。
366あのさあ:2001/05/31(木) 22:19
K&Rって何の略?
どういもの?
367デフォルトの名無しさん:2001/05/31(木) 22:20
>>366
カニチャーハンと富豪
368デフォルトの名無しさん:2001/05/31(木) 22:41
366に対する367の解答
>カニチャーハンと富豪

うーん...濃い内容だ。。。ところで、C言の話とは違うけど、
この中で【Linux】使っている人はいるのだろうか?
もし使っていたらWebサーバとかにしているのだろうか?
369デフォルトの名無しさん:2001/05/31(木) 22:51
>>368
何故にそんな話になるのかわからんが使ってるよ。
Webサーバとかにはしてないけど。
370デフォルトの名無しさん:2001/05/31(木) 22:53
>>366
KernighanとRichieが書いた「プログラミング言語C」って本。
371デフォルトの名無しさん:2001/05/31(木) 23:03
>>365
メモリマップ…??
「下位ビットが上位アドレスにマッピングされる」とかその逆とかを指してるなら
それこそ「移植性に対する障害として挙げられるエンディアンへの依存」に
他ならないんだけど。
ハードウェア知らないならあまり大きな口は叩かない方がいいよ。
372デフォルトの名無しさん:2001/05/31(木) 23:12
>>365
論点がずれている。
>>322-328から続く制御系の実装の話をしているんだから外部デバイス
に対して論理演算がエンディアン依存するか否かで語られるべき。
つまりはチップセットを変えずにMPUだけを68系から86系に変えた場合
とかがありがちなシチュエーション。
LCDなんかは簡単には変更効かないしね。
制御/組込み屋がエンディアン依存を気にするのはそういう場合だろう?
373デフォルトの名無しさん:2001/05/31(木) 23:20
なんかさ、アドレスによってエンディアンが違うのってあるじゃん
泣きそうになるんだけど・・・
374デフォルトの名無しさん:2001/05/31(木) 23:22
ビットフィールドをレジスタアクセスに使用すると使いまわしが
効かなくなるという意見には基本的には賛成。
だが、ビットフィールドで記述するとビットロード命令に落ちる
実装系もあるから使わざるを得ない場合が多い。
そもそもそんな場合はvolatileやpragmaが頻発するコードになるのだろう
から、移植性を気にするならばマクロに切り出して毎回見直しを
かけたほうが無難だと思うよ。
375デフォルトの名無しさん:2001/05/31(木) 23:59
8bit以上のI/O扱ったこと無いから
エンディアンなど知らん
376デフォルトの名無しさん:2001/06/01(金) 00:16
>>375
ちゅう事は4bitI/Oか?
4bitマイコンにCは実装されているのだろうか?
晒しage
377デフォルトの名無しさん:2001/06/01(金) 00:19
「読み出される値が異なるから、演算式を変更しなければいけない。
だから、論理演算はエンディアンに依存する」
これは、「ゼロクリアされたメモリ上の文字列を
足し算によって"1234"に変更するためには
リトルエンディアンは0x34333231、ビッグエンディアンは0x31323334、
を加えなければならない。したがって、足し算はエンディアンに依存する。
同様に、全ての演算はエンディアンに依存する」
と言っているのと同じ。

メモリ(やI/O)から読みこんだ値はエンディアンに依存するが、
(ビッグエンディアンの 10 00)|(1) == 0x1001 == (ビッグエンディアンの 10 01)
(リトルエンディアンの 00 10)|(1) == 0x1001 == (リトルエンディアンの 01 10)
同じ値に対して同じ論理演算をしたら結果は必ず同じになる。

(ビッグエンディアンの 10 00)|(1) != (リトルエンディアンの 10 00)|(1)
なのは、単に「同じバイト列でも演算の対象となる『値』が違うから」のはず。

外部デバイスとエンディアンが違うから、
想定していた値と違う『値』がデバイス(メモリ)から読み出される。
つまり、エンディアンに依存するのは『値』であり、論理演算ではない。

「経験豊富なプログラマ」の頭の中は、俺には理解できないけどね。
378デフォルトの名無しさん:2001/06/01(金) 00:22
なんでこんな話題で盛り上がるのん?
組み込み屋はアホばっかり?
379デフォルトの名無しさん:2001/06/01(金) 00:27
>>378
この板にはアホしかいません。
380デフォルトの名無しさん:2001/06/01(金) 00:38
structとtypedefってどう違うのだろう?
同じように思えるんだけど・・・。
381デフォルトの名無しさん:2001/06/01(金) 00:39
アホがまた一人>380
382デフォルトの名無しさん:2001/06/01(金) 00:41
だいたい、論点はなんだ?
>>331
>論理演算はエンディアンには依存しない。
だろ?

それを>>332>>334がてめーの脳内で
>移植性はエンディアンに依存しない。
と読み替えて電波飛ばしてるんだよ。
383デフォルトの名無しさん:2001/06/01(金) 00:43
>>382もアホと解釈してかまわないのですか?
384デフォルトの名無しさん:2001/06/01(金) 01:09
ingってなんですか?
385デフォルトの名無しさん:2001/06/01(金) 01:20
>>384
動名詞
386デフォルトの名無しさん:2001/06/01(金) 01:21
そういや、イングエイマルムシテーィン?ってまだ活動してるの?
つーか生きてるの?
387デフォルトの名無しさん:2001/06/01(金) 01:28
>>386
あれはYngwey
388デフォルトの名無しさん:2001/06/01(金) 01:31
>>377の理屈では論理演算がエンディアンに依存するしないを云々する
こと自体無意味ということになってしまうよ。
389デフォルトの名無しさん:2001/06/01(金) 01:49
>>380
爆笑。キミ、凄いよ! 新卒?
390デフォルトの名無しさん:2001/06/01(金) 02:10
この板は毎日CantyGuy君が出て盛り上がるね(w
今日はアンチMFCキティ君が暴れて凄かったけど、明日のヒーローは
ここの380か?
391デフォルトの名無しさん:2001/06/01(金) 02:47
>>382
>だいたい、論点はなんだ?
>>331
>>論理演算はエンディアンには依存しない。
>だろ?

違うのねん。ビットフィールドの代替手段としての論理演算について論じている
んだから、演算式の書き換えが必要ならやっぱりエンディアンに依存する、と
いう主張なんだけど。

メモリ上はエンディアンとは無関係に01 02 03 04と並んでいて、それをロング
ワードで拾ってきて最下位アドレスの8bitを取り出す論理演算式はエンディアン
によって変わるでしょ?
392デフォルトの名無しさん:2001/06/01(金) 03:56
ライブラリ関数っていうのありますよね。
math.hでsin関数などが使えるようになりますが、math.hを見てみても中身は#defineとかばっかりで実際の計算部分のソースがありません。
printfなどもそうですが。

一体これらの関数の計算部分の実体は何処にあるのでしょうか?
あと、これらのソースも見てみたいのですが、ちょこっと探した感じでは見つかりませんでした。
393デフォルトの名無しさん:2001/06/01(金) 04:02
>>392
ライブラリ。(^^;
394デフォルトの名無しさん:2001/06/01(金) 04:07
ライブラリのソースがついてくる実装を探そう
395デフォルトの名無しさん:2001/06/01(金) 04:21
392です。
>>393
なんか僕おかしな事書いたんでしょうか?_・)

>>394
UNIX系のオープンソースなやつの配布CDのソース入りのやつなら載ってたりするんでしょうか。
今からちょうどインストールしてみようと思っていたVineのやつを落としてみます。
396デフォルトの名無しさん:2001/06/01(金) 04:39
VisualC++にも付いてこなかったっけ。
397デフォルトの名無しさん:2001/06/01(金) 04:46
>>392
ライブラリ関数の実体は、ライブラリとして提供されています。
(ヘッダにあるのは、関数の宣言とマクロ等で、実体はありません)
自分も昔、同じような事を考えた事がありましたが、
基本的に、純粋なCのみで、一切ライブラリ関数を使用せずに、
printfのような関数を作る事は、出来ません。
(sin関数等は、知識があれば出来ますが…。)
それの意味するところは、自分で考えて見て下さい。
398397:2001/06/01(金) 04:47
392=397です。
399397:2001/06/01(金) 04:49
398は書き間違いで、自作自演という意味ではありません。m(_ _)m
正しくは、393=397です。
400デフォルトの名無しさん:2001/06/01(金) 05:06
>>392
別に自分で実装したいって言っているのではなくて、
どういう処理をしているかを見てみたいと言っているのでは?
401デフォルトの名無しさん:2001/06/01(金) 05:31
392です。
>>400
そのとおりです。
工房の時ですが、まだCに触れて間もない頃どんなCの入門書にも画面への自由な図形の描画方法などには触れておらずどうしてだろうと思っていました。
結局は動かすOSによるとかで、そう言うものだと納得しましたが、じゃあ普通に解説してるprintfやscanfなんかはどうなっているんだろう
と思ったのです。

>>397
>純粋なCのみで、一切ライブラリ関数を使用せずに、
>printfのような関数を作る事は、出来ません。
となると一番最初にprintfを作った人はどうしたのか、ということに・・・

ものすごくヴァカなこと聞いてるんでしょうかね・・・とりあえず引き続きライブラリのソースとやらを探してみます。
402デフォルトの名無しさん:2001/06/01(金) 05:53
gcc開発環境のソース一式落としてくれば?>401
わかんなかったら検索しろ
403デフォルトの名無しさん:2001/06/01(金) 05:55
>>397は、入出力とかは結局OSに依存するから、
C言語の仕様という範疇では語れないということを言いたいんでしょ。
そのための標準ライブラリであるわけだし。

ライブラリを読むのは非常に良いことだと思いますが、
ライブラリが必ずしもよく練られた素晴らしいコードであるという保証も無いし、
実装に依存できるのをいいことに汚いコードが書いてあるかも(藁
404デフォルトの名無しさん:2001/06/01(金) 08:34
GNUのlibpng-1.0.11-src.zipをダウンロードしてscriptsフォルダみたらmakefile.w32がないよー。
びえーん。
405デフォルトの名無しさん:2001/06/01(金) 09:54
>>401
作れないのはOS依存の入出力等の部分で、printf等は最終的にシステム
コールを呼ぶ。それ以外の処理のほとんどは大体Cだけで書かれてる。

>>402
glibc
406デフォルトの名無しさん:2001/06/01(金) 10:00
自己レス
>>404
makefile.vcawin32に名前が変わってました。
うんこっこー。
407デフォルトの名無しさん:2001/06/01(金) 11:34
今日は>>380来ないのかな。
408デフォルトの名無しさん:2001/06/01(金) 12:14
>>392 さんは聞き方とその後の態度を間違えていたら、
>>380 以上のドキュソ扱いされてたと思う・・
409デフォルトの名無しさん:2001/06/01(金) 12:25
逆に言えば、ドキュソな質問でも、質問の仕方がドキュソでなければ、それなりの
回答が得られるということだ。ドキュソのみなさんは拳拳服膺するように。
410デフォルトの名無しさん:2001/06/01(金) 13:28
>>397
うそつき・・・
411デフォルトの名無しさん:2001/06/01(金) 14:27
UNIX Cでマルチスレッドのアプリを作るとき、
自スレッドだけ、一定間隔休止させたい場合、
sleep()関数でいいですか?
412397:2001/06/02(土) 00:51
>>392
>最初にprintfを作った人はどうしたのか
今あるコンパイラが全て、それ以前のコンパイラによって、
コンパイルされていると仮定して、1番最初のコンパイラが、
どうやって、作られたのかを考えれば分かりますよ。
Cを勉強する上では、全く意味がありませんが、
ハードウェアに興味があれば、自分で考えてみましょう。(^^;

>>410
どこが?
413デフォルトの名無しさん:2001/06/02(土) 00:56
>>412
printfが作れない ってとこ?
414397:2001/06/02(土) 01:04
>>413
使ってるCに、バグがあるか、純粋でないCでない限り、不可能でしょう。
作れるものなら見せて欲しい。(^^;
415397:2001/06/02(土) 01:10
>使ってるCに、バグがあるか、純粋でないCでない限り、不可能でしょう。
日本語が変な(分かり辛い)ので書き直し。
使っているCにバグがなく、
それが、純粋なCであれば、不可能でしょう。
416デフォルトの名無しさん:2001/06/02(土) 01:19
ライブラリを使わないと文字の出力も出来ないんじゃないの?
・・・I/O直叩きか。すでにそこから苦労しそうだな。
417デフォルトの名無しさん:2001/06/02(土) 01:21
>>412
また嫌になるあほが出現した。このスレのレベルですか?
418中途半端くん:2001/06/02(土) 01:34
>>411
それで問題ないです。
でも精度が1秒刻みなのでそれ以上細かいことやりたいときは
usleepを使いましょう。
(それでも100ミリくらいでガタがくるけど)

そういえば今月のLinuxJapanだかにそのあたりの話があったね
419デフォルトの名無しさん:2001/06/02(土) 01:37
純粋なC、それは>>415の脳内にある理想の言語。萌え(w
420デフォルトの名無しさん:2001/06/02(土) 01:42
すみません。教えてください。
main()は、どこから呼ばれるんでしょうか?
gdbで見てもこのあたりよくわかりません・・・
421デフォルトの名無しさん:2001/06/02(土) 01:49
usleepはあやしいのでnanosleepをつかおう
422デフォルトの名無しさん:2001/06/02(土) 02:18
>>415
printfのソース見たことある?
必要になるのは文字列操作関数(群)と文字出力。
文字列操作なんてのはただのメモリコピーだから作るのはわけない。
文字出力部分を処理系にあわせて書いてやればいい。
423デフォルトの名無しさん:2001/06/02(土) 02:21
>>422
可変引数は、あれはどうなんだよ
実装できねえだろ
424デフォルトの名無しさん:2001/06/02(土) 02:34
>>423
実装のしかたが判らないのなら素直に教えてくださいと
頼めば良いのに。
425デフォルトの名無しさん:2001/06/02(土) 02:39
>>424
ライブラリが無ければ手も足も出ないだろう、
ということを言っているんです。理解できましたか?
426397:2001/06/02(土) 02:46
>>415
>printfのソース見たことある?
見たことも何も、自分で作ってます。(^^;
>必要になるのは文字列操作関数(群)と文字出力。
それを提供しているのは、各処理系依存の関数で、
K&RやANSIの定義に、それらはありますか?
自分が知っている限り、何も無い状態のCから
呼び出せる関数はmainのみだったと思うのですが、違いますか?
つまり、不可能と言うのは、そう言うことですね。(^^;

>>423
そう言えば可変引数も標準ライブラリでしたっけ…。
427397:2001/06/02(土) 02:50
黙ってると、次はイランインとかが出そうなので、
先に突っ込ませて頂くと、あれも、処理系依存の、
ライブラリ関数なので、もちろん使えませんよ。
428デフォルトの名無しさん:2001/06/02(土) 02:53
lisp/schemeなら可変引数は自然に定義できる。
みんなlisp/schemeやんなさい。
429デフォルトの名無しさん:2001/06/02(土) 03:12
>>426
>それを提供しているのは、各処理系依存の関数で、
>K&RやANSIの定義に、それらはありますか?

今日のヒーローは君か。
処理系依存の関数作ればいいじゃん。
ANSIに無い関数は作ってはいけないとでも?

君の脳内定義を適用するとANSI標準のコンパイラってのはこの世に
存在できないことになるんだけど。
430デフォルトの名無しさん:2001/06/02(土) 03:17
>>429
意味不明意味不明!
処理系依存の関数ってどうやって作るんだ?
可変な引数ですらライブラリ頼みなのに!
431デフォルトの名無しさん:2001/06/02(土) 03:21
ひょっとしてすげえ面白い展開になっている?
432デフォルトの名無しさん:2001/06/02(土) 03:24
たぶん>>425-428は自作自演。悲惨だなこいつ。
433デフォルトの名無しさん:2001/06/02(土) 03:32
423=430=431=432
な気がするのは気の性?(w
434423=430:2001/06/02(土) 03:33
>>433
後半は違うぞ。
435デフォルトの名無しさん:2001/06/02(土) 03:37
>>433
いやむしろ429=430=430=431だろう。(w
436デフォルトの名無しさん:2001/06/02(土) 03:40
なんだ、結局理論じゃ勝てねえからって荒らし行為に出てきたのか・・・
小さい人間だな。
437デフォルトの名無しさん:2001/06/02(土) 03:41
>>436
ごめんよ。あんまり痛いんで口出ししてしまった。
もう黙るから許してくれ。
438デフォルトの名無しさん:2001/06/02(土) 03:44
>>423=430
自分の持ってる処理系のstdarg.hのva_list/va_start/va_endの辺り参照。
おそらく処理系依存コードをマクロで隠蔽している筈です。
わかんなかったら2、3冊本読んだ方が早いかも。
439デフォルトの名無しさん:2001/06/02(土) 03:46
>>438
>>423=430に言っても判らないと思うよ。
440たぶん:2001/06/02(土) 03:54
393=397=398=399=401=403=412=414=415=423=425=426=427=430=436

信じたくないが…
441423:2001/06/02(土) 04:00
>>438
読んだよ
マクロで隠蔽されているとは言っても、
機種依存だとはいっても、
Cだけでかかれていることにはかわりないから
可変引数はライブラリに頼らず実装可能?

ところでprintfはどうなんだ?
純粋なCだけで文字が出せれば、負けか・・・
442>>1は:2001/06/02(土) 04:18
C言語習得に3年もかかったのか、
プログラム技術とC言語の言語とは意味が違うし。
プログラム開発とC言語とも次元が違う、
3年たってもC言語しかやらないとは情けない。
443デフォルトの名無しさん:2001/06/02(土) 04:46
>>441
void myprintf(const char *f,...) {
  va_list vaptr;
  va_start(vaptr,f);
  vprintf(f, vaptr);
  va_end(vaptr);
}
vprintfは書式文字列fとva_listを受け取る関数。
(当然vprintfも自分で作れる)
最終的に、fputcやfwriteなどの低レベル関数を使う段階までは、
ANSI規格内で自分で作れます。
わかんなかったら、やっぱり本読んでね。
444397:2001/06/02(土) 04:50
正解は、393=397=398=399=412=414=415=426です。
>>429
>今日のヒーローは君か。
理解出来ていない、あなた達です。(^^;
445397:2001/06/02(土) 04:55
>最終的に、fputcやfwriteなどの低レベル関数を使う段階までは、
>ANSI規格内で自分で作れます。
本当に作れるのなら作ってみて下さい。
難しいことは言わないから、
Hello!
を、一切のライブラリ関数使わずに、画面上に表示して下さい。
(勿論、標準ライブラリと、処理系依存のライブラリ全て使わずに)
それが、出来たら、今日のヒーローは自分です。 
446443:2001/06/02(土) 05:00
それぐらい自分でやんなさい。バカタレ>>445
447デフォルトの名無しさん:2001/06/02(土) 05:08
今起きたんでよくわかんないんだが、
システムコールを使わずにprintfを実装できるかって話でいいの?
448デフォルトの名無しさん:2001/06/02(土) 05:09
>393=397=398=399=412=414=415=426=444

言語仕様と実装の違いがまるで分かっていないバカタレですな。
ANSI標準だのなんだのってのはあくまで言語仕様の問題で、
その実装のために処理系依存の関数を作ったからとて標準から
外れるわけではない。

>>445
>本当に作れるのなら作ってみて下さい。

たいていのセルフCコンパイラ(とそのライブラリ)は自分で自分を
記述してると思うんだけど。(つまり、既に作られたものは無数に存在する)
449デフォルトの名無しさん:2001/06/02(土) 05:11
>>447
そういう話なら早いんだけど…
どうも>>397が言っているのはわけがわからない。
450デフォルトの名無しさん:2001/06/02(土) 05:13
397は処理系依存部分をどこで吸収すべきかが分かっていないドキュソですか?
451デフォルトの名無しさん:2001/06/02(土) 05:14
>>445

>>443はあなたの言ってる事に矛盾してないですよ。
もう一度よく読みましょう。
452デフォルトの名無しさん:2001/06/02(土) 05:16
システムコールやI/Oなんかの低レベル部分はどうやったって機種依存だろ。
C標準ってのは上っ面の規定だから実装とは関係無いだろ。
仕様と実装をごっちゃにして話してる奴がいるみたいだ。
453デフォルトの名無しさん:2001/06/02(土) 05:16
>>452
ごっちゃにしてるのは397ただひとり。
454デフォルトの名無しさん:2001/06/02(土) 05:18
よくわからないけど、397は「実装が機種依存するからANSI標準だけでは何もできない」
って主張してるように見えるんだけど。俺の目は節穴デスか?
455デフォルトの名無しさん:2001/06/02(土) 05:19
>>404 >>406
お前かっこいいよ。
456デフォルトの名無しさん:2001/06/02(土) 05:19
さようなら397
457デフォルトの名無しさん:2001/06/02(土) 05:21
おやすみ397
458デフォルトの名無しさん:2001/06/02(土) 05:22
454=397
さようなら397
459デフォルトの名無しさん:2001/06/02(土) 05:25
>>458
おいおい。>>454はどう見ても別人だろ。
460デフォルトの名無しさん:2001/06/02(土) 05:25
次レスから永遠に397関係の発言禁止
461デフォルトの名無しさん:2001/06/02(土) 05:30
い〜つまでも〜絶える〜ことなく〜発言は〜禁止〜
462>>460ゴメン:2001/06/02(土) 05:34
>>403が言ってるので正しいのだろうが
>>414-415が意味不明。
そして紛糾。

>>397は間違ってはいないが
読解力と自分の思ってることを伝える能力がかなり乏しいのかと。
463デフォルトの名無しさん:2001/06/02(土) 05:34
              彡
          彡       彡   彡
              ブルッ・・・
        .∧ ∧
       ヾ(,,゚Д゚),)       彡
        人つゝ 人,,
      Yノ人 ノ ノノゞ⌒〜ゞ
    .  ノ /ミ|\、    ノノ ( 彡
     `⌒  .U~U`ヾ    丿
             ⌒〜⌒
464デフォルトの名無しさん:2001/06/02(土) 05:37
それにしても442はイタイ
465デフォルトの名無しさん:2001/06/02(土) 05:37
    ∧ ∧         / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ̄ ̄( ゚Д゚) ̄ ̄|   <  >>397、おやすみ!
|\⌒⌒⌒⌒⌒⌒\   \
|  \           \    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
\  |⌒⌒⌒⌒⌒⌒|
  \ |_______|
466デフォルトの名無しさん:2001/06/02(土) 05:40
442=397
467デフォルトの名無しさん:2001/06/02(土) 05:41
>>466
了解。
468397:2001/06/02(土) 06:07
読んでない人が多いようなのでもう1度。
>ライブラリ関数の実体は、ライブラリとして提供されています。
>(ヘッダにあるのは、関数の宣言とマクロ等で、実体はありません)
>自分も昔、同じような事を考えた事がありましたが、
>基本的に、純粋なCのみで、一切ライブラリ関数を使用せずに、
>printfのような関数を作る事は、出来ません。
>(sin関数等は、知識があれば出来ますが…。)
>それの意味するところは、自分で考えて見て下さい。
自分の主張は、これだけです。
それでも、出来ると言う方は反論を。
469デフォルトの名無しさん:2001/06/02(土) 06:16
ある処理系では、IOポートに文字コードを書くと表示装置に文字が出力されます。
int putchar(intc)
{
    *((volatile int*)OUTPORT) = c;
    return 0;
}
これは純粋なCでコンパイルできませんか?
470デフォルトの名無しさん:2001/06/02(土) 06:19
>>468
バカの相手もほどほどに。
注:あなたがバカだって言ってるわけじゃないわよ。
471デフォルトの名無しさん:2001/06/02(土) 06:35
>>469
*純粋*なCだと無理じゃない?
処理系依存のCが純粋ってのはここでは間違ってるんでしょ。
472デフォルトの名無しさん:2001/06/02(土) 06:36
>>470
>>469の間違いではなくて?
473デフォルトの名無しさん:2001/06/02(土) 07:25
>>472
ではないです。
でもバカは言い過ぎでした。

双方がちゃんとスレ読んでないから
こうなっただけだよ。
>>397がバカってわけじゃない。
474デフォルトの名無しさん:2001/06/02(土) 07:31
じゃ誰がバカなの?>>473
475デフォルトの名無しさん:2001/06/02(土) 07:33
>>474
>でもバカは言い過ぎでした。
ってことです。
ごめんなさい。
476デフォルトの名無しさん:2001/06/02(土) 07:56
>>469
コンパイルが通ればコンパイルできるんじゃない。
たいてい意図した通りにはならないけど。
477441:2001/06/02(土) 08:42
いままで厨房な発言をしててごめんなさい。

Cでフルスクラッチで記述して、画面に文字を出力することが
できました。ライブラリは一切使用していません。
よって、頑張ればライブラリ無しでprintfが作れることが
わかりました。(可変引数の件は解決してるし)

海よりも深く反省します。 >>397、おめーのせいで恥かいちゃった
じゃないか!勉強できたからいいけど。
478デフォルトの名無しさん:2001/06/02(土) 09:13
>>468
標準出力の実体が何であるかは処理系依存なので、何も画面に表示したりファイルに
出力できる必要などない。
例えば単にどこかのメモリに出力するだけならフルスクラッチで実装できるよ。
479デフォルトの名無しさん:2001/06/02(土) 09:16
>>478
標準出力はバッファ、とか言い切れば、すでに完成していたってことか。
480478:2001/06/02(土) 10:46
>>479
だいたいそんな感じ。
もっとも、その実用価値とかはまた別の問題だけどね。
481デフォルトの名無しさん:2001/06/02(土) 10:55
469みたいなケースなら実用になるんじゃない?
482478:2001/06/02(土) 11:07
>>481
そうだね。
テキストVRAMとかに直接出力するとか、UARTに出力するとか、マップドファイルに
出力するとかなら実用価値は十分にある。
483デフォルトの名無しさん:2001/06/02(土) 11:13
ていうか組込用のライブラリだと、標準出力はUARTだったりするんだけどね。
484478:2001/06/02(土) 11:27
>>483
確かに。大昔のコンピュータも結構そんな感じだったりするね。

組み込み処理系(というよりフリースタンディング環境)の場合には、
printfはいわゆる標準関数ではないけど、あると重宝するもんね。
485デフォルトの名無しさん:2001/06/02(土) 15:32
逆にCに出来ない事はレジスタレベルでのキャリー制御やボロー制御くらいのもの。
速度やタイミングを問わないのなら標準ライブラリ全てを記述できるぞ。
企業によっては標準ライブラリがグローバルにメモリを確保する事を嫌って、
自前の標準ライブラリに差し替える所もあるしね。
486デフォルトの名無しさん:2001/06/02(土) 15:46
>>485
Cでもレジスタはどうにかならなかったっけ?
勘違いしてたらごめん
487コロコロ:2001/06/02(土) 16:01
私の学校で出ている課題について教えてください。できれば、コード記述でお願いします。

 課題 文字列操作

 <処理概要>
入力ファイルに入っているランダムな文字列を読み込んで編集する。
 入力ファイル名  \public\C言語応用\課題02\input.txt

入力ファイルの内容

 io4@5ovgiq@w340 9tn@q0mikanb924 rwijra;o4 aestrawberryut@90
240strawberry9t animikanrja ddg fvbananaxjfringogqworiadf;
amomolkjtcwieroutstrawberry34t7vv
dsgfoiuto sdrgovq@4r q0awitflksjd;f
laumikanwett errgt thhbcvbasf fitu@qo4rfachocolateaaarffvnxdkjfq23
sdfgi oq34itu aqeurgvksjd q9bananau4 tue ggsjdgoiumomoq349tifvk
asrgmomoio uweringoorigporegf
asdmomofg sjd;fmikanligurin@qa94it kwjegfr:bananaa ergtqaegr
dfgi oeoitgu;fldkgj b9wu44tlgkjjlksvdjgfsmikanadfg
oiupqoi34 ta;lkdf j;lakjdfg0987 bjlhbxcvblkj
;lkjchocolateroigeurrgssdmomoffkjahljhringoglar+ j;lkj4rti

 <詳細仕様>
    入力ファイルの内容は、ランダムな小文字のアルファベット文字列からなり、
    1行の文字数は揃っていない。これを1行ずつ読み取り、次の編集を加えて
    1行を20文字に揃えて標準出力する。加える編集項目は、以下の通り。

    1.文字列"ringo"を発見したら、"APPLE"に変換し、発見回数を数える。
2.文字列"mikan"を発見したら、"ORANGE"に変換し、発見回数を数える。
3.文字列"momo"を発見したら、"PEACH"に変換し、発見回数を数える。
4. 文字列"banana"を発見したら、後ろに"cake"を付ける。
     5. 文字列"strawberry"を発見したら、後ろに"cake"を付ける。
6. 文字列"chocolate"を発見したら、後ろに"cake"を付ける。
7. 1〜6以外の文字列の場合は、"."(ピリオド)を出力する。

   例えば、入力ファイルの1行目にq0mikanb924という文字列があるが、
  この"mikan"の部分が"ORANGE"に変わる。他の文字はピリオドになる。


  【結果の表示例】

  .............APPLE..
.....ORANGE.......PE
ACH......bananacake.
.....

ringoの出現回数は、1回
 mikanの出現回数は、1回
 momoの出現回数は、 1回
 bananaの出現回数は、1回


 以上が課題の内容です。ご託宣お願い致します。
488デフォルトの名無しさん:2001/06/02(土) 16:02
>>486
レジスタがメモリマップ上にある処理系では出来る可能性はある。
ただし、レジスタ上の振る舞いは気にしなくて良いように
コーディングするほうが良いかと。
489デフォルトの名無しさん:2001/06/02(土) 16:38
>>487
まず何を教えて欲しいのか教えてくれ。
「課題を代わりにやって欲しい」と言うのであればもう来るな。
490お願いします:2001/06/02(土) 16:39
うまく動きません。何が悪いんでしょうか

char *p,*q;
int num = 0;

printf("input data : ");fflush(stdin);
fgets(p);
q = p;
for(q != '\0') {
if(*q >= '0' && *q <= '9')
num = num * 10 + q - '0';
else
break;
}
printf("%u\n",p);
491デフォルトの名無しさん:2001/06/02(土) 16:48
>>490
っていうかコンパイル時に警告が出るはずだが。
「識別子pは初期化される前に使用されている」
492490:2001/06/02(土) 16:51
>>491
pの初期化とはどういうことなのでしょうか?
宣言をしているのでいいのでは
493デフォルトの名無しさん:2001/06/02(土) 16:54
>>492
ポインタの勉強をやり直せ。
宣言と初期化は別だ。
pはどこを指している?
494490:2001/06/02(土) 17:31
>>493
よくわかりません
宣言と初期化はどう違うのでしょうか
pはどこを指しているのでしょうか?
わかるのなら教えてください
495デフォルトの名無しさん:2001/06/02(土) 17:33
>>490
>うまく動きません。何が悪いんでしょうか
おまえの頭だ
496デフォルトの名無しさん:2001/06/02(土) 17:34
>>491
よく見ると

>for(q != '\0') {

これもおかしいな。(ここで構文エラーが出ないか?)

>num = num * 10 + q - '0';

これもな。

だからポインタの勉強をやり直せ。
497490:2001/06/02(土) 17:34
>>495
わからないのならレス付けないでください
498デフォルトの名無しさん:2001/06/02(土) 17:35
>>494
>宣言と初期化はどう違うのでしょうか

宣言:変数を使うことを高らかに宣言する
初期化:変数に初期値を与える

>pはどこを指しているのでしょうか?

知りません。実行するまで誰にもわかりません。
499デフォルトの名無しさん:2001/06/02(土) 17:37
>>497
ここまで書いてもわからないなら出ていくのはお前の方だ。
495はかなり正しいことを書いているよ。
むしろこっちが聞きたいくらいだね。
「なんでこれしきのことがわからないのか」がわからないよ。
500490:2001/06/02(土) 17:40
>>499
自分だって初心者の時があったのでしょう
頭が悪いなんてレスつける人が正しいとは思えません
501デフォルトの名無しさん:2001/06/02(土) 17:42
お、開き直ったね(w
正しいと思えないのはやっぱり勉強が足りないから。
自分で勉強が足りないと思えないのは頭が悪いから。
どう見てもちゃんと勉強してるようには見えないんだよ。
K&Rよく読め。
502デフォルトの名無しさん:2001/06/02(土) 17:47
週末だなぁ…
掲示板をアプリケーションウィザードだと勘違いしてる偽学生諸君、君らは
何のために親のスネをかじって学校に行ってるのか?
課題を丸投げして「動くようにしてください」なんてやってると君らの頭には
何も残らない。考える必要がないから。
そーやって単位を取得して「●●大学情報工学部卒」なんて履歴書もって
入ってこられると、困るのは俺達現場の人間だ。
頼むから向学心がないならさっさと単位をあきらめて別の道を選べ。
503デフォルトの名無しさん:2001/06/02(土) 17:48
>>501
K&Rとかそういうこと以前だぞ
504490:2001/06/02(土) 17:48
>>501
すぐにそうやってごまかそうとする
505デフォルトの名無しさん:2001/06/02(土) 17:50
>>504
あれがごまかそうとしてるように見えるなら、やっぱり悪いのは君の頭だ(w
506デフォルトの名無しさん:2001/06/02(土) 17:53
>>504
課題ができなくて逆ギレするのは結構だが、笑いものにされるだけだよ。
この板の住人は、向学心があって自助努力に欠かない学生には優しいが
君のようなまるで勉強しない掲示板ウィザード頼みの偽学生には思いきり
厳しいんだよ。理由は>>502を読んでね。
507490:2001/06/02(土) 17:53
>>505
今自分ができるからとできない人をばかにするのは
自分の小ささを証明しているだけですよ。
昔自分が人に迷惑をかけたことまで忘れて人をばかにしているんだから
508デフォルトの名無しさん:2001/06/02(土) 17:54
どうせネタでしょ
本当に分からなかったら、馬鹿を通り越してる
509デフォルトの名無しさん:2001/06/02(土) 17:56
>>507
もう進むべき道は示されてるんだよ。>>496-498あたりで。
あとは自分で勉強しなさいって事。
まあ、勉強もしないでリロードしては恨み言を書いてるような奴は
やっぱり頭が悪いと言わざるを得ないけど。
510デフォルトの名無しさん:2001/06/02(土) 17:57
>>496-498
ネタですか?
511510:2001/06/02(土) 17:58
ちがった
>>496-509
ネタですか?
512デフォルトの名無しさん:2001/06/02(土) 18:01
>>507
少なくとも今ほど気軽に他人に迷惑をかけられる時代に生まれた奴は
この板にはそう多くはいないよ。
(平日の)この板の住人が君のような勉強をしていた時分には2ちゃんはおろか
パソ通すら一般的ではなかった。
日本語のnetnewsだってほとんどなかったんだよ。
だから、他人に迷惑かけようと思ってもできない。だからみんな自分で勉強して
たんだね。
ジジ臭いと思うかも知れないが、心構えの問題だ。
513デフォルトの名無しさん:2001/06/02(土) 18:06
>>502
それいいな。コピペ用にもらっとこう(藁
514就職活動中ぼう:2001/06/02(土) 18:08
#include <stdio.h>
#include <malloc.h>

#define BUF_SIZE 1000

void main()
{
char *p,*q;
int num = 0;

printf("input data :");
fflush(stdin);
p=(char *)malloc(BUF_SIZE);
fgets(p, BUF_SIZE, stdin);
q = p;
while(*q != '\0'){
if(*q >= '0' && *q <= '9')
num = num * 10 + *q - '0';
else
break;

q++;
}
printf("%d\n",num);
}
515デフォルトの名無しさん:2001/06/02(土) 18:13
ココなんなんだ?
516デフォルトの名無しさん:2001/06/02(土) 18:13
教えたがり君の登場で一気に盛り下がった模様…
517デフォルトの名無しさん:2001/06/02(土) 18:23
↑は全部一人の人の自作自演と思われリ
518デフォルトの名無しさん:2001/06/02(土) 18:25
いくらなんでもチゲー(藁
519517:2001/06/02(土) 18:29
>>518
ちがうかなー
490のプログラム中途半端すぎるし、
ネタっぽいんだけど
520デフォルトの名無しさん:2001/06/02(土) 18:37
毎週1〜3人の割合で根本的に馬鹿なのが登場するよな
521493他多数:2001/06/02(土) 18:37
少なくとも俺の他に1人以上いるはず(w
522デフォルトの名無しさん:2001/06/02(土) 18:44
>>521
いないいない、いてもはづかしすぎて、
消えたほうがいいな
523デフォルトの名無しさん:2001/06/02(土) 18:47
週明け、514のコードに致命的なバグがあることに気付かずに意気揚々と
課題を提出する490。先生がどんなコメントをするか楽しみだね....
524デフォルトの名無しさん:2001/06/02(土) 18:48
おばかな質問者に勘違い回答者、それにツッコミを入れずには
いられない厨房PGの三つ巴が楽しいスレ。
525デフォルトの名無しさん:2001/06/02(土) 18:54
>>520
ここんとこ毎日ヒーローが出るね。
526デフォルトの名無しさん:2001/06/02(土) 19:44
>>523
バグはいってるの?
527デフォルトの名無しさん:2001/06/02(土) 20:00
>>513
情報工学部ってのは、あまり見かけないので、コピペのときは「○○大学
工学部情報工学科卒」にした方が良いかと。
528アレンジしてみたYO:2001/06/02(土) 20:39
掲示板をアプリケーションウィザードだと勘違いしてる偽学生諸君、君らは
何のために親のスネをかじって学校に行ってるのか? 将来就きたい職業
に向けて職能を身につけるためではないのか?
課題を丸投げして「動くようにしてください」なんてやってると君らの頭には
何も残らない。職能なんか身に付かない。考える必要がないから。
それでは君らのためにならない。いや、この際君らのことはどうでもいい。
何も知らずに高い学費を払っている親御さんが不憫だし、なによりも
そーやって単位を取得して「●●大学工学部情報工学科卒」なんて履歴書
もって 入ってこられると、俺達現場の人間が非常に困る。
頼むから向学心がないならさっさと単位をあきらめて別の道を選べ。
それでも課題をやって欲しかったら学校名と学籍番号を書いてくれ。
早急に人事に連絡しておくよ。「こいつが来ても追い返せ」とね。
529デフォルトの名無しさん:2001/06/02(土) 20:43
コピペはやめとけ。今は流行は参照だ。
530デフォルトの名無しさん:2001/06/02(土) 20:47
>>529
オーバーライドされてる模様。
531デフォルトの名無しさん:2001/06/02(土) 21:11
514ってバグはいってる?
532デフォルトの名無しさん:2001/06/02(土) 21:17
priority of operator
533デフォルトの名無しさん:2001/06/02(土) 21:34
>>485
setjmpとlongjmpの実装方法を是非教えてください。
534デフォルトの名無しさん:2001/06/02(土) 21:47
>>533
ある処理系ではプログラムカウンタやスタックポインタなどのレジスタが
メモリ上にマップされていま(以下略
535デフォルトの名無しさん:2001/06/02(土) 21:52
490=526=531
自分ではバグがあるのかないのか確認できないので、名無しさんのふりをして
教えてもらおうと必死です。
学校を卒業してからも、そうやって周囲に迷惑をかけながら仕事をするんでしょうね。
536デフォルトの名無しさん:2001/06/02(土) 21:59
>>490
君のような奴にはマジかネタか区別の付かないようにレスをするのがこの板の
暗黙のルールなんだよ。あ、言っちゃった(w
537533:2001/06/02(土) 22:15
>>534
レスありがとうございます。

関数の戻り先番地やフレームポインタはスタックに積まれますから、setjmp
の引数(jmp_buf型)からの相対アドレスで操作できますね。
ほとんどの場合、関数内で破壊してはならないレジスタがいくつかあると思う
のですが、安全にjmp_buf型のオブジェクトに退避する方法がわかりません。
レジスタファイルがメモリマップ上に配置されているプロセッサの場合はとも
かく、それ以外のプロセッサの場合はやはりCだけでは実装できないのでしょ
うか?
538アンギラ:2001/06/02(土) 22:23
↑のほううざいよ
無視しとけばいいのに
539デフォルトの名無しさん:2001/06/02(土) 22:29
>>537
単純に与えられたポインタをスタックに積まれた戻り先ポインタに
差し替えてreturnすればOK。
540533:2001/06/02(土) 23:10
>>539
それだと、setjmpの後で呼び出された関数からlongjmpしたときに、正しく
レジスタが復帰しないと思うのですが。
変数を全部volatileにしても、この問題は解決しないように思います。
541デフォルトの名無しさん:2001/06/02(土) 23:13
aの値がどうもおかしいようなんです。
初期化したら強制終了されるし・・・
if文の中にif文ってできないんですか?
どなたか教えてください。
お願いします。
aの値がおかしいから「ここから」〜「ここまで」って所が無視される。
http://www.geocities.co.jp/HeartLand-Oak/5706/5.txt
542デフォルトの名無しさん:2001/06/02(土) 23:14
543デフォルトの名無しさん:2001/06/02(土) 23:22
>>541
if文の中のif文とかの問題ではない。
答えを言ってもいいけど、それだともっと根深い問題に気づかないままに
なってしまうから控えておくよ。
悪いことは言わないから、全部捨てて書き直した方がいい。
544デフォルトの名無しさん:2001/06/02(土) 23:33
>>541
他人にデバッグさせるのね。
困った人だわ。
545541:2001/06/02(土) 23:35
答えを言うと根深い問題に気づかない・・・
と言うことは,何だろう・・・?
書き直したの2度目なんだけどね・・・
とりあえず何を勉強したらよいのか教えてもらえませんか?
何も思いつかないもんで・・・
すいません・・・
546541:2001/06/02(土) 23:37
デバックさせるつもりはないですよ。
でも結果的にそうなっているのね・・・
申し訳ないです・・・
ここでは何を聞いたらいいんでしょうか?
547デフォルトの名無しさん:2001/06/02(土) 23:50
>>541
だれも指摘しないけど、mainが長すぎて読む気がしない。
(それが仕事なら別)
548デフォルトの名無しさん:2001/06/02(土) 23:57
>>540
setjmp()の処理としてはスタックに積まれているレジスタ退避値や戻り先ポインタ、
呼ばれた時点でのスタックオフセットをグローバルに取られたjmp_buf ma構造体変数
に退避する。
longjump()関数内ではjmp_buf maの情報を元にスタックを辻褄合わて
リターンすれば完了。
詳細はコンパイラの実装の本を読む事をお勧めするよ。
549デフォルトの名無しさん:2001/06/03(日) 00:00
こんなCの書き方ができるなんてスゴすぎる。
何に教わったんだ?
550デフォルトの名無しさん:2001/06/03(日) 00:02
>>541
とりあえず{}で全部囲め!
551540:2001/06/03(日) 00:11
>>548
しつこいようですが、コンパイラの種類によっては、関数の呼び出し時に
退避されないレジスタ群とかも結構あって、それらのレジスタを関数内で
破壊する場合は、リターン時に元に戻す必要があります。

longjmpを呼び出す前に、これらのレジスタが破壊されていた場合には、
setjmp以前の値に戻す必要があるわけですが、それらの値はスタックに
積まれているわけでもなく、レジスタを直接操作する以外には確実に退避
する方法が思いつきません。

教えていただいた方法は、関数呼び出し時に呼び出し側で保存されるレジ
スタについてはうまく退避できます(もっともこの場合はjmp_buf型に
格納する必要もないでしょう)。しかし、それ以外のレジスタについては
どうしようもありません。
それから、フレームポインタを使用しない処理系の場合にも、スタックポ
インタを元に戻す方法が思いつきません。
552デフォルトの名無しさん:2001/06/03(日) 00:18
>>541
単純なミスです。

それより君のもってる入門書とかで
「これはあまりおすめしない」とか
「一般的にこういうときはこうしてます」
とか簡単な初心者のための定石みたいなもの書いてない?
553543:2001/06/03(日) 00:21
>>545
とりあえず、自分なりに納得がいくまで全部書き直してみて。
550の意見は聞く耳もたなくていいから注意して。
554デフォルトの名無しさん:2001/06/03(日) 00:21
sizeof の後()で囲むのはかっこ悪いのですか?
555デフォルトの名無しさん:2001/06/03(日) 00:22
>>551
>しつこいようですが、コンパイラの種類によっては、関数の呼び出し時に
>退避されないレジスタ群とかも結構あって、それらのレジスタを関数内で
>破壊する場合は、リターン時に元に戻す必要があります。

そのコンパイラってバグってるんでないかい?具体的な処理系を教えてちょ。
556デフォルトの名無しさん:2001/06/03(日) 00:43
>>553
>550の意見は聞く耳もたなくていいから注意して。

俺は>>550じゃないけど別におかしなことを
言ってるわけではないと思うが?

よーするにif文等は全部{}つけとけって言いたいのでは?
557デフォルトの名無しさん:2001/06/03(日) 00:47
if(a<0);
 a=0;
558ドキュ学生:2001/06/03(日) 00:54
すごいプログラムだね。はじめて見た。ある意味関心。
559デフォルトの名無しさん:2001/06/03(日) 01:01
>>558
それは>>557のことか?
560デフォルトの名無しさん:2001/06/03(日) 01:10
>>556
元のソースをよく読め。…いや、やっぱりいい。
見なくて済むなら見ない方が…

>>541
scanfのプロトタイプ宣言を良く見直すように。
それとポインタの勉強をやり直せ。
あと、「構造化プログラミング」ってのを勉強しておけ。
561ドキュ学生:2001/06/03(日) 01:13
>>559
あ、ごめんね。541のこと。
プログラム初心者の友達が似たようなもの書いてたが、
200行も行けば破綻するでしょ、普通。
デキる奴だから、ここまでのが書けるのかなと思った。
562デフォルトの名無しさん:2001/06/03(日) 02:10
>>561
どう見ても >>541 は破綻してると思われ。
563デフォルトの名無しさん:2001/06/03(日) 02:15
>>555
話がずれてる気がする。>>551 が問題にしてるのは

- アセンブラを使わずC言語の範囲だけで setjmp(), longjmp() が書けるのか?

だと思われ (>>485 を受けての発言)。これに対する答えは

- No, 場合によってはアセンブラで書かないとダメだ

で良いかい?
564デフォルトの名無しさん:2001/06/03(日) 02:25
>>554
に便乗して、return(0) はカッコ悪い??
565デフォルトの名無しさん:2001/06/03(日) 02:27
return ((0));にしとけ。
566デフォルトの名無しさん:2001/06/03(日) 02:29
>>564
括弧は無実です。悪くありません。
567デフォルトの名無しさん:2001/06/03(日) 02:36
誰か540に教えてやれ。
「純粋なCだけで標準関数を実装できるかどうか」という問い自体が処理系依存だって。
568441:2001/06/03(日) 02:44
>>567
もともとは、「ライブラリを使わなきゃ何も出来ないんだよーだ」
といいだした人がいて、その人いわく、
「Cでライブラリは書けないんだよ。printf作れるか?オラ」
とのことなので純粋なCでライブラリが書けるか論争になってます。
(オラも最初は書けないと思ってただ)

とりあえず、prinfは純粋なCのみで実装できることが一応証明された
ので、めでたしめでたしとなってます。たぶん。
569デフォルトの名無しさん:2001/06/03(日) 02:53
>>568
それでlongjump?longjump自体がメチャメチャ処理系依存じゃん。
振る舞いも実装も処理系に任せられてるから云々しても無意味なんでは?
570441:2001/06/03(日) 03:00
>>569
処理系に依存してる っつーのは百も承知だったり。
とにもかくにも Cだけ(アセンブラでのライブラリとかはナシ)
で書けるかというのが論点だったんで、まーそんなもんです。

おかげで処理系をそんなに気にせずに済むライブラリの存在が
急にすごいものに思えたりして結構面白かったような。
571デフォルトの名無しさん:2001/06/03(日) 03:10
>>568
じゃあ>>469とか>>534で結論出てんじゃん。
「処理系によってはアセンブラもライブラリも使わずに実装可能」
572441:2001/06/03(日) 03:12
>>571
うん、結論でてるよ。>>397もどっかいっちゃったし
573デフォルトの名無しさん:2001/06/03(日) 03:20
>>563
>>555の質問俺も聞きたい。退避してないレジスタを呼び出し先で
ぶち壊しておいて、呼び出し元で値を期待するCコンパイラなんて
あるのか?K&R以前のC?
574デフォルトの名無しさん:2001/06/03(日) 03:26
K&R以前とかそう言う問題じゃないと思われ(w
575デフォルトの名無しさん:2001/06/03(日) 03:33
>>563の脳内にある処理系で実装できるかどうかまでは
誰にも何にも言えないね。
576ゴルァ:2001/06/03(日) 07:07
CとC++の違いはなじゃ〜
ゴルァ
577デフォルトの名無しさん:2001/06/03(日) 07:31
>>576
Cで//でコメントがかけるいま、両者は私にとり同じものです(泣
578デフォルトの名無しさん:2001/06/03(日) 07:38
>>576
一度クラスというやりかたに触れると、
そうでないスタイルに戻れなくなります。
javaでもいいから触れておくべし。
579551:2001/06/03(日) 08:28
>>555
結構いろいろな処理系がそうした実装になっています。
例えば、三菱のM16C/80用の純正コンパイラNC308の場合、すべての汎用レジスタは
呼び出された側で退避しなければなりません。また、R4000系用のIRIX CやexeGCCの
場合は、v0,v1やa0〜a3, t0〜t7レジスタは自由に破壊できますが、s0〜s7(またはs8)
は値を関数内で退避しないといけません。

if (setjmp(env) == foo())
{
 hoge();
}

のような処理を想定してみてください。前後で使用する変数がすべてvolatileであった
としても、等価演算子のオペランドであるfoo()の返却値はレジスタに格納されている
場合が十分ありえます。
そして、hogeの中でそのレジスタを破壊する場合、通常であればhogeからのリターン時
にそのレジスタを元に戻すのですが、途中でlongjmpした場合にはそうした動作を期待
できません。
この場合、当然jmp_buf型の変数にそれらのレジスタの値を格納しておいて、longjmpで
元に戻す必要がありますが、レジスタを直接触れない限り、それらを確実にjmp_buf変数
に格納する方法は思いつかないのです。
580579:2001/06/03(日) 09:32
少し言葉足らずだったのか、分かりにくい内容になってしまいました。

ようは、setjmpを呼び出す前のレジスタの状態をlongjmpで同じ位置に戻って
くる際に元の値に戻すには、setjmp関数内で何とかしてスタックに積まれて
いないレジスタを退避する必要があるということです。

setjmpは規格上はマクロですが、関数として実装する以外にCだけで実装する
ことはできないでしょうね。
581デフォルトの名無しさん:2001/06/03(日) 09:38
>>579-580
結局何が言いたいの?setjmpを関数として実装することに何か問題でも?
582デフォルトの名無しさん:2001/06/03(日) 09:58
>>541
なんか、俺の今やってる仕事のソースに似てるな。構造が。
gotoの使い方とかmainの中で全部ってのが特に。
みんな電車の中では電源切れよな。
583デフォルトの名無しさん:2001/06/03(日) 10:49
>>580
自分でも認めているようだが、それ以上にわけ判らんぞ。
584デフォルトの名無しさん:2001/06/03(日) 11:33
yahoo
585デフォルトの名無しさん:2001/06/03(日) 11:35
JISからUTF-8に変換する方法ってわかるかたいますか
いたらヒントだけでも教えてください
お願いします
586デフォルトの名無しさん:2001/06/03(日) 11:35
jis2utf8
587585:2001/06/03(日) 11:40
ウインドウの提供しているAPIも利用すれば変換は簡単にできるんですが
実際に内部でどんなことやっているのかわからなくて
文字コードについて書かれた本がほとんど本屋においてなくて
何かいい本があったら教えてください。
内容がわからないと通販でも買うのも躊躇してしまうし
588初心者プログラマ:2001/06/03(日) 12:33
C言語で「例えば1+4とキーボードから入力した場合、
その演算結果を表示する電卓プログラムを作成せよ。
ただしswitch分を使い演算子は*,/,-,+などにも対応できるようにせよ。」

これ、教えてください。よろしく願いします。
589デフォルトの名無しさん:2001/06/03(日) 12:46
>>588
フローチャートをかいてやる

入力

構文解析

実行

(゚д゚)ウマー
590初心者プログラマ:2001/06/03(日) 12:53
>>589
C言語始めたばっかしなので、よくわかんないです。
無能ですいません。
591デフォルトの名無しさん:2001/06/03(日) 12:57
順を追って解説してやる。

入力は scanf でいいだろ。
使い方は調べろ。
592初心者プログラマ:2001/06/03(日) 13:00
scanf は、なんとかわかります。

後、よろしくお願いします。
593デフォルトの名無しさん:2001/06/03(日) 13:04
念のために聞きたいんだが、入力される数字は
 -6.0*-2
をサポートするのか?
整数のみなのか? 負のサポートは? かっこは?
それによって手の抜き方がかわってくるからな
594初心者プログラマ:2001/06/03(日) 13:13
小数、負のサポート、-6.0*-2 はありだと思います。かっこはまだ、
習ってないので、なしです。

お手数かけます。
595デフォルトの名無しさん:2001/06/03(日) 13:16
>>588-594
どっかの2ショットチャットでやれ。うざい。
596七氏:2001/06/03(日) 13:18
ここでやるで
597デフォルトの名無しさん:2001/06/03(日) 13:19
>>595
了解。めんどうだったし、もう帰るわ。がんばれよ
598初心者プログラマ:2001/06/03(日) 13:20
もう、どうでもええわ
599ど素人:2001/06/03(日) 15:14
タイマーを使いたいのですが、たとえば2秒たったら入力を
打ち切るといった使い方が分かりません。
600デフォルトの名無しさん:2001/06/03(日) 15:22
ランダムでqui1に1から8の数字
ランダムでqui2に1から16の数字をいれ
その2桁の数字パターンから
複数のswitch文で8×16の処理の中から1つを選び処理します
32回繰り返しつつ1度出た数字パターンは2度と繰り返さないようにする
プログラムを作っていますがうまくいきません
ランダムで出た数字を一度qui1とqui2にいれ
繰り返し回数をcouでカウントしながら
その数字をac1[cou]とac2[cou]にいれました
それをdo〜while文とfor文で
for(cou=0;cou<33;cou=cou+1){
do{
qui1=rand()%8;
qui2=rand()%16;
}
while(((qui1==ac1[0])||(qui2==ac1[7]))&&((qui2==ac2[0])||(qui2==ac2[16])));
(qui1とqui2の数字に対する処理)
}
while文の中は異常に長いので掲示板では略して書きました

もちろん変数宣言やsrand(clock());などはしています
ac1[32]ac2[32]はすべて-1をいれています

うまくいきませんどうか力をかしてください
601デフォルトの名無しさん:2001/06/03(日) 15:57
>>600
要は同じ組み合わせが出なければいいんでしょ?
検証してないから動くかはしらない

int flag[8*16]={0};
int i,qui1,qui2;
for(i=0;i<32;i++)
{
 do{
  qui1=rand()%8;
  qui2=rand()%16;
 }
 while( flag[qui1*16+qui2] );
 flagflag[qui1*16+qui2]=1;

 /* ここでqui1とqui2が得られてる */
}
602デフォルトの名無しさん:2001/06/03(日) 16:00
よーわからんけど、ac1[]とac2[]に別けてはダメなんでないの?
組み合わせの数は 8x16 有る訳だし…
ac[8][16]とかで持てば十分だけろうけど…
32回繰り返すという時点で、1〜8 の qui1 は4回くらい
同じ数が出てくるでしょ?
603デフォルトの名無しさん:2001/06/03(日) 16:07
>>600

>>601のやり方でいいと思われ。
ただ、
int flagflag[8*16]={0};
が抜けてるので注意。

うまく動かないうちは、srand(clock());はやらない方がいいぞ。
毎回違う乱数が出るよりはデバッグしやすいから。
srand( 2 );とかで決め打ちすれば、毎回必ず同じ乱数でるからね。
604601:2001/06/03(日) 16:10
>>603
flagflag って flag の間違い。あははのはーだ。
605デフォルトの名無しさん:2001/06/03(日) 16:10
ありがとうございます早速試してみます
606デフォルトの名無しさん:2001/06/03(日) 16:32
#define ONANIE
607デフォルトの名無しさん:2001/06/03(日) 16:35
インディアン  エンディアン
どっちのほうで呼んでますか?
608デフォルトの名無しさん:2001/06/03(日) 16:37
うまく動かすことができました
601〜604のプロフェッショナルの方々ありがとうございました

while( flag[qui1*16+qui2] );
flag[qui1*16+qui2]=1;
こんな動作はまだ2ヶ月の俺には思いつかなかったです
皆さんさすがですね
609601:2001/06/03(日) 16:39
>>608
ちなみに、flag[qui1*16+qui2] となっているのは、
flag[qui1][qui2] のときの宣言時の初期化方法を
ど忘れしたからにすぎない。 わははのはーだ。
610605:2001/06/03(日) 17:14
>>609
flag[qui1][qui2]={
{0},{0}
}
もしかしたらこれで合ってますか?
611605:2001/06/03(日) 17:16
↑間違い間違い
flag[8][16]={
 {0},{0}
}
もしかしたらこうですか?
612デフォルトの名無しさん:2001/06/03(日) 17:40
次のスレタイトルは、「C言語なら、俺に聞け!(宿題は手伝いません)」
にしておかないと、初心者と名乗る努力しない君がいっぱい来るぞ
613603:2001/06/03(日) 17:51
>>604
うわ!!めっちゃ恥ずかしい!!
顔から屁が出そーだ!!
ごめん、ちゃんと理解して中田よ。

>>611
int a[2][3]={ {1,2,3}, {4,5,6} };
てな感じなので、それでも一応あってるのかな?
{0}は一つでいいのでは?

>>612
だな。
614shige:2001/06/03(日) 19:38
トイレに閉じ込めて3時間も放置しやがったからな・・・
これは報復なのだ・・・
615shige:2001/06/03(日) 19:43
>>612
ありがとうございます。
試してみますね。
6160x264:2001/06/03(日) 20:51
?
617今更397:2001/06/04(月) 02:53
昨日はネットに繋げなかったのですが、少し時間を空けて読んでみると、
自分が書いた事を、ちゃんと読まずに、レスを入れる人も多いけど、
自分も、人の書いた事をちゃんと読んでない事が分かりますね。
それにしても、標準出力先が、メモリ上と言う発想は、面白かったです。
(煽っている訳ではなく、本当に。)
ですが、自分が出来ないと言っているのは、
K&RやANSI準拠のソースで出来た、大多数の処理系で動くCであって、
処理系依存で出来れば良いと言う話ではありません。
純粋なCという書き方で分かると思って書いたのですが、
それを、大多数の処理系で動くCとは、とって貰えなかったようですね。
尚、この話題を、今更引っ張るつもりはありませんので、あしからず。
618デフォルトの名無しさん:2001/06/04(月) 03:37
>>617
>それにしても、標準出力先が、メモリ上と言う発想は、面白かったです。

ANSIもK&Rでも標準出力先が画面表示である必要を規定していない。
実際にあるんだよ。そう言う処理系が。

だいたい何をもって「大多数の処理系」に当てはまるかどうか判断する気か?
標準出力画面表示で標準入力がキーボードって、普及してる総数は多いが
処理系の種別としてはレアな方だぞ。
組込用の処理系なんてCPUとペリフェラルの構成ごとに実装が分かれるからな。
それこそ星の数ほどあるよ。
ちなみにメモリマップトI/Oは組込では好んで使われる。
つまり、大多数の処理系では「純粋なCだけで標準ライブラリを実装できる」事に
なるが?
619デフォルトの名無しさん:2001/06/04(月) 12:46
411です。
418さん、421さん、レスありがとう。
sleepだとプロセス全体が休止するんじゃないかと不安でした。
LinuxJapanも見てみます。
620デフォルトの名無しさん:2001/06/04(月) 21:53
>>618
そんなに偉そうに言うもんじゃないよ。
617の言っていることは、表現のまずさはともかく、特に間違ってはいない。

組み込み処理系はフリースタンディング環境だから、そもそも標準関数など規格上存在
しない。
標準関数について語る場合、特に指定しなくてもホスト環境のことに決まっている。

printfなどは純粋なCだけでスクラッチできるけど、既出のsetjmpやlongjmpはプロセ
ッサによってはやはり実装できない。戻り先番地が専用のスタックに詰まれる場合もある
からね。この場合、アセンブリ言語でないとどうしようもない。
もっとも、アセンブリ言語でしか実装できそうにないものでも、最悪の場合、機械語の
サブルーチンを配列に格納して、それを関数のポインタにキャストして無理やりコール
すれば実現できる。ところが、プログラムとデータが同一のメモリマップ上にない場合
にはこの方法は無理。
これが理由でsetjmpとlongjmpが実装できない場合が有り得る。

それにexit関数も(おそらくatexitも)無理。なぜなら、最初のmainの呼び出しから
リターンするときexitの呼び出しと等価でないといけないから。スタートアップを
書き直せばよいというかも知れないけど、ホスト環境のエントリ関数はmainであると
決まっているので、スタートアップに手を出した時点で規格合致処理系ではなくなって
しまうからね。
621デフォルトの名無しさん:2001/06/04(月) 23:25
>>618
Cで標準出力に出力する場合は、stdoutを使いなさい。
直接メモリ上に書き込んでしまうと、意味のある標準出力になりません。
その上で、あなたが言ってる事にどれほどの意味があるか考えて下さい。
622コロコロ 487です:2001/06/04(月) 23:34
>>489さん 大まかに言えば、バッファ確保とポインタ制御です。
623デフォルトの名無しさん:2001/06/04(月) 23:38
>>621
stdout の出力先がメモリだ、と言っておるのだ。
624デフォルトの名無しさん:2001/06/04(月) 23:43
fopen,fclose,fread,fwrite,fflush,signal
malloc,free,time,setjmp,longjmp,exit
足りない(余分な)ものもあるかもしれないが、効率を無視すれば、
これだけあれば、ほとんどの標準関数は作れるはず。
625デフォルトの名無しさん:2001/06/04(月) 23:49
>>623
アホ?
626デフォルトの名無しさん:2001/06/04(月) 23:49
>>624
つまり、それらは全部ライブラリってわけだ。
627デフォルトの名無しさん:2001/06/05(火) 00:20
>>620
>>617=>>397は、結論は正しい可能性があるんだけど、途中で論理破綻
したり逆切れしたりで全然信用されていないんだよ。
結局良く考えないで発言した>>397が否定されたせいで、どうしても
自分の考えが正しいと認めさせたいだけ。
凄く幼児的だから正しい間違っている以前に相手しない方が良いよ。
スレが汚れるだけ。
628デフォルトの名無しさん:2001/06/05(火) 01:33
>>599
僕も初心者だけど、君の為に一生懸命サンプル作ったよん。
ゲーム仕立てになっているからあそんでねん。

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <stddef.h>

int GetKey(void){int i;if(kbhit())i=getch();else i=0;return i;}
int GetChar(char *p,double d){int i,j;time_t t;t = time(NULL);
for(j=0;i!='\r';){if(i=GetKey()){if(i!='\r')printf("%c",p[j++]=(char)i);
else {printf("\r\n");p[j++]='\0';return 1;}}
if (difftime(time(NULL),t) > d)return 0;}return 0;}

int main(int argc,char *argv[])
{
char c[]="NamaMugi Namagome Namatamago.";
char p[100];/*tekitou*/

printf("ねぇねぇ。「%s」って入力して。はやくはやくー!\r\n",c);
if (GetChar(p,4)){
if(strcmp(c,p))printf("ちげーよ。ダホ!");
else printf("なに真剣になってんの?バカじゃない?%s\r",p);
}else printf("遅いんじゃい!このノロマが!");
return 0;
}
629デフォルトの名無しさん:2001/06/05(火) 01:59
>>628
勉強中の者としては役に立ったです。
他にも違うテクつかったのキボーン
630デフォルトの名無しさん:2001/06/05(火) 02:12
>とりあえず、prinfは純粋なCのみで実装できることが一応証明された
>ので、めでたしめでたしとなってます。たぶん。
とありましたが、ではいざ
main()
{}
だけでhello worldを表示するとなると{}内にはどのような記述が考えられますか?
環境はWindows上でVC++6を使うとした場合で・・・
631デフォルトの名無しさん:2001/06/05(火) 02:18
>>630
”画面に表示” というのは全く議論の対象になってなかったからね。
ライブラリのソースを見てみないとにんともかんとも
632デフォルトの名無しさん:2001/06/05(火) 02:34
>>628
とても初心者とは思えません。凄いです。
このやりかたでは、キー単発しか取得できなくて、連続押しは
出来ませんよね?連続押しできる方法はあるのでしょうか?
簡単なゲームを作りたいんですけれも挫折してたんです。
でも感謝です。テトリスとかできそうですね。
633デフォルトの名無しさん:2001/06/05(火) 02:59
setjmpとlongjmpはANSI Cで実装できるとは限らないということで
よろしいでしょうか?
634デフォルトの名無しさん:2001/06/05(火) 03:08
>>630
>Windows上でVC++6を使うとした場合で・・・
自分もVC++の処理方法は知らないので、
もしかしたら、何をやっても、出来ないかもしれませんが、
stdoutのメンバに必要な処理をしてやれば多分OK。
バッファがフラッシュ出来ないので、あふれた場合や、
バッファリングされていない場合はNGですが、
そうでなければ、プログラム終了時に、勝手に出力されます。
他の方法は、VC++に詳しい人に期待。
635デフォルトの名無しさん:2001/06/05(火) 05:42
>>634
#include "stdio.h"
main()
{
fputs("Hello World\n", stdout);
}
じゃないの?

それから、ライブラリが無いと何もできないというのは、まあ
普通に OS 提供の API やシステムコール等使うという意味では
そうなんだけど、8bit パソコンの時代や Wonder Swan みたいな
シンプルなゲーム機だったりすると、C で直接ハード叩いてあれこれ、
ってこともそれほど珍しくないと思う。Win32にしても、突き詰めると
結構多くの(OS側の)コードもCで書いてあったりするし。
636デフォルトの名無しさん:2001/06/05(火) 05:44
typedef void *HANDLE; typedef unsigned long DWORD;
HANDLE GetStdHandle( DWORD nStdHandle );
int WriteConsoleA( HANDLE hConsoleOutput, void *lpBuffer,
DWORD len , DWORD *written, void *reserved );
int main() {
DWORD written; HANDLE hStdout = GetStdHandle(-11);
WriteConsoleA(hStdout,"Hello World!\n", 13, &written, 0);
return 0;
}
_stdcallを宣言に入れると不純と言われる気がしたんで、 コンパイルは下のように。
cl /Gz hello.c /link /nodefaultlib kernel32.lib /entry:main /opt:nowin98
637デフォルトの名無しさん:2001/06/05(火) 05:47
>>635
そういえばMSXのCならライブラリなんていらないな
638デフォルトの名無しさん:2001/06/05(火) 06:49
Cで出来なくてアセンブラでしか出来ないことってある?
639なぞなぞだよ:2001/06/05(火) 07:14
>>638
早口言葉
640デフォルトの名無しさん:2001/06/05(火) 09:08
>>638
1命令のローテートシフト

コンパイラが賢いと、ここぞって所で使ってくれるんだろうか?

cpu依存の命令を使う時、MMX、SIMD、3DNowとか。
641デフォルトの名無しさん:2001/06/05(火) 16:49
>>638
自慢
642:2001/06/05(火) 18:10
学校の課題です。誰か教えてください。

成田空港の駐車料金は以下のようになっています。最初の一時間は500円、一時間を
越えて6時間までは30分ごとに250円ずつ加算、6時間を越えて72時間までは30分ごと
に30円ずつ加算、ただし、6300円が上限、72時間を越えると12時間ごとに900円ずつ
加算されます。たとえば11時間駐車すると500+2500+300円になります。年月日つき
の入庫時刻と現在時刻を入力して駐車料金を表示するプログラムを書きなさい。

これって月や年が変わると以上に面倒なんですが、誰か教えてくれませんかね?
643デフォルトの名無しさん:2001/06/05(火) 18:13
>>642
出題した先生にバットで殴る蹴るの暴行を加えれば、非常に楽になりますよ
644中途半端くん:2001/06/05(火) 18:45
>>642
月や年が変わっても大丈夫なように、
すべてを秒に変換してから計算なさい
645デフォルトの名無しさん:2001/06/05(火) 18:51
>>644
それって核心に近すぎてギャグになっていないような

俺なら適当な基準点からの分単位の時間に変換して差をとる。
基準点は駐車開始年の1月1日とかにするかな?
すなおに引き算で年月日の差を求めてもいいけど、面倒。

どっちにしろ、月ごとの日数はテーブルかなんかで持ってないといけないね。
あとうるう年の計算に気をつけな。
646中途半端くん:2001/06/05(火) 19:25
>>645
マジもマジ。
time関数でも使うがよかろう。
647デフォルトの名無しさん:2001/06/05(火) 20:03
>>642
月や年が買わったら「早く取りに行きましょう」と表示して終了。
648デフォルトの名無しさん:2001/06/05(火) 20:14
>>>647
そういえば、ちょっと前まで銀行のATMって、記帳しないでログがたまっていくと
「そろそろ記帳しませんか?」みたいメッセージ出てたよな・・・
最近はあふれた分だけ別に郵送されてくるけど。
649デフォルトの名無しさん:2001/06/05(火) 20:15
>>642
ネタか?
>>643
ええ事書いた。
650デフォルトの名無しさん:2001/06/05(火) 22:22
>>642
その仕様では、駐車の上限、下限、使用される暦、出力通貨は何かが記載
されていなので、たとえばBC4004/1/1からユダヤ歴9010年Thischri月5日までの
駐車料金をインドネシアルピーで出力しないかんかもしれません。よって、
・各種暦からユリウス日への変換ルーチン
・無制限長の四則計算ルーチン
・ネットワークを利用して通貨変換するプログラム
などを利用するのがよいと思われます。
651デフォルトの名無しさん:2001/06/05(火) 22:29
>>650
何はともあれ、「成田空港の駐車場」が作られるより
昔の暦は考えないでいいと思いますがどうか。
652デフォルトの名無しさん:2001/06/05(火) 22:33
>>651
しかしlongを超える期間の処理には気を配った方が良いな。
653デフォルトの名無しさん:2001/06/05(火) 22:42
>>651
未来に関しては五十億年後ぐらいまで見ておいた方がいいのかな?
654デフォルトの名無しさん:2001/06/05(火) 22:48
消費税導入前後とかややこしそうだ
655コロコロ:2001/06/05(火) 22:56
私の学校で出ている課題について教えてください。できれば、コード記述でお願いします。

 課題 文字列操作

 <処理概要>
入力ファイルに入っているランダムな文字列を読み込んで編集する。
 入力ファイル名  \public\C言語応用\課題02\input.txt

入力ファイルの内容

 io4@5ovgiq@w340 9tn@q0mikanb924 rwijra;o4 aestrawberryut@90
240strawberry9t animikanrja ddg fvbananaxjfringogqworiadf;
amomolkjtcwieroutstrawberry34t7vv
dsgfoiuto sdrgovq@4r q0awitflksjd;f
laumikanwett errgt thhbcvbasf fitu@qo4rfachocolateaaarffvnxdkjfq23
sdfgi oq34itu aqeurgvksjd q9bananau4 tue ggsjdgoiumomoq349tifvk
asrgmomoio uweringoorigporegf
asdmomofg sjd;fmikanligurin@qa94it kwjegfr:bananaa ergtqaegr
dfgi oeoitgu;fldkgj b9wu44tlgkjjlksvdjgfsmikanadfg
oiupqoi34 ta;lkdf j;lakjdfg0987 bjlhbxcvblkj
;lkjchocolateroigeurrgssdmomoffkjahljhringoglar+ j;lkj4rti

 <詳細仕様>
    入力ファイルの内容は、ランダムな小文字のアルファベット文字列からなり、
    1行の文字数は揃っていない。これを1行ずつ読み取り、次の編集を加えて
    1行を20文字に揃えて標準出力する。加える編集項目は、以下の通り。

1.文字列"ringo"を発見したら、"APPLE"に変換し、発見回数を数える。
2.文字列"mikan"を発見したら、"ORANGE"に変換し、発見回数を数える。
3.文字列"momo"を発見したら、"PEACH"に変換し、発見回数を数える。
4. 文字列"banana"を発見したら、後ろに"cake"を付ける。
5. 文字列"strawberry"を発見したら、後ろに"cake"を付ける。
6. 文字列"chocolate"を発見したら、後ろに"cake"を付ける。
7. 1〜6以外の文字列の場合は、"."(ピリオド)を出力する。

   例えば、入力ファイルの1行目にq0mikanb924という文字列があるが、
  この"mikan"の部分が"ORANGE"に変わる。他の文字はピリオドになる。


  【結果の表示例】

  ・・・・・・・・・・・・・APPLE・・
  ・・・・・ORANGE・・・・・・・PE
  ACH・・・・・・bananacake・
  ・・・・・

 ringoの出現回数は、1回
 mikanの出現回数は、1回
 momoの出現回数は、 1回
 bananaの出現回数は、1回


 以上が課題の内容です。ご託宣お願い致します。
 再度顔出してすみません。かなり切羽詰まってます。
私は低レベルなのでそれに即したプログラムでお教え願えないでしょうか。
 また、fgetsなんかを使うのでしょうか?
656デフォルトの名無しさん:2001/06/05(火) 23:07
いい加減にしとけよ>655
657デフォルトの名無しさん:2001/06/05(火) 23:12
過去に未来か。壮大なスケールだ…
>>643 の解答にかなり納得している。
>>642 よ>643の解答通りにやったらいいのでは。そうすれば悩む必要はないね!

memmoveを用いたプロトタイプ宣言これってmemcpyと比べてどっちが便利(扱い易い)
ex)void *memcpy(void *dest,const void *src size_t n);
void *memmove(void *dest,const void *src,size_t n);
まぁ、memmoveは重複しても性格にコピー去れるみたいだけど…
もしよかったら扱い易い方の貴方の使い道ちょっこだけで書いてみて…
658655:2001/06/05(火) 23:12
>>656
あんだとー
くそー
できないなら何も書き込むなよ
659コロコロ:2001/06/05(火) 23:17
>>658は偽者です。
1行読み込みはどのようにするのでしょうか?
また、リダイレクトとはどのようにするのでしょうか?
660デフォルトの名無しさん:2001/06/05(火) 23:24
>>659
プログラムを組む以前の部分すら分かっていないようだが、
学校でいったい何をやってるの?
661デフォルトの名無しさん:2001/06/05(火) 23:24
>>659
偽者でも本物でもどっちだっていいんだよ。
キミさ、プログラミング全く向いてないから止めちまえ。
662デフォルトの名無しさん:2001/06/05(火) 23:28
>655よ。【>>965 名前:コロコロ 投稿日:2001/06/02(土) 16:14】
と同一人物ですよね♪ nanndekokodemo同じ質問、氏点の?
ほんとに和姦ないの?
663おしえてくん:2001/06/05(火) 23:30
int i=5;
printf(" i=%d \n ++i=%d",i,++i);

がどうしておなじすうじになるんでしょう?
664デフォルトの名無しさん:2001/06/05(火) 23:34
665デフォルトの名無しさん:2001/06/05(火) 23:45
ウザイ
666デフォルトの名無しさん:2001/06/06(水) 00:27
このまま実装してしまうと、将来地価が上がったり貨幣価値が上下した
り税制が変わったりと言った、高度に政治的な仕様変更に対応するのが
大変です。以下のように仕様を書き換えて提出すると評価が上がります。

成田空港の駐車料金は以下のようになっています。最初のn時間はp円、n時間を
越えてm時間まではn/2分ごとにp/2円ずつ加算、m時間を越えてo時間まではn/2分ごと
にq円ずつ加算、ただし、r円が上限、o時間を越えるとl時間ごとにs円ずつ
加算されます。
667デフォルトの名無しさん:2001/06/06(水) 00:29
668デフォルトの名無しさん:2001/06/06(水) 00:31
>>663
てめーみてーな奴はC FAQ読めって言ってるだろ。ヴォケ。
キーワードは「引数の評価順」だ。
669 うんこMEN:2001/06/06(水) 00:51
あのう、数学とCについての因果関係について知りたいのですが
一体どういったところで数学の知識が必要とされるのですか?
股、どのくらいのレベルまでが必要とされるのですか?
中学生とか高校生の数Uとかあるじゃないですか。

あと、アルゴリズムについての知識があまり無いのですが
どうすれば増やす事が出来ますか?
それとここのプログラマーサンたちは今までどういう勉強法で取り組んでいたのか
教えていただけませんか?
股一日何時間くらいかとか、出来るだけ詳しくお願いします。
私はかれこれ2年ほどCを触っているのですが、どうもうまく出来ません。

お願いします。
670久保晶彦:2001/06/06(水) 00:58
うー・・・・。
671デフォルトの名無しさん:2001/06/06(水) 01:01
>>669
最低限必要なのは論理学。知らないとプログラム書けない。
あとは業務によって千差万別。
たとえば波形データを扱うような場合は代数学、解析学が必要。
波形データの測定の場合にはさらに統計学も必要。
勘定系とかだと統計学とか。3Dゲームとかだと代数幾何解析全部必要。
アルゴリズムは専門の本があるから読む。
自分でアルゴリズムを開発するなら数論の勉強をしておくといろいろと
役に立つ。
672デフォルトの名無しさん:2001/06/06(水) 01:13
>>671
なんの役にも立たないレスありがとう。
673 うんこMEN:2001/06/06(水) 01:14
>>671
すごい・・・。
論理学ってどういうものですか!?
数論というのも今 初めて聞きましました!!
ヤバイですね・・・。
本とかあればいいんですけど・・・。

あと、代数学とか統計学とか、「必ず」必要なのでしょうか?
知識が無くてもある程度なら組めるといった甘い考えでは通用しないんですかねぇ・・・。
やっぱ・・・。

アルゴリズムの本ですか〜。
わかりました!!
今度買ってきて色々読んでみることにしますです。

ああ・・・。
難しそう・・・。

あ、わざわざご丁寧にありがとうございました!!
おかげで助かります!!
674デフォルトの名無しさん:2001/06/06(水) 01:39
>>673
論理学ってのは命題に対して対偶・逆を導出したり…
要は「pならばq」は真だけど「qならばp」はかならずしも真ならず、
といったことを系統立てた学問。
「必要条件」とか「十分条件」て言葉くらいは聞いたことあるだろ。

数論てのは、ぶっちゃけた話、数パズル。
フェルマーの最終定理もこれに含まれる。

知識が無くてもある程度できなくもないけど、当然の事ながら
原理が理解できてないとコピペ以上のことはできない。
チューニングや仕様変更にはまるで対応不可。
675ドモルガン:2001/06/06(水) 01:41
なんかアニメの銃の名前みたいでかっこいいよな
676デフォルトの名無しさん:2001/06/06(水) 01:52
そうねぇ。
ド・モルガンの定理、ベン図、カルノウ図を駆使して論理演算を最適化。
コンパイラ作ったりするには必須。
コンパイラがこれをやってくれないことが明らかな場合とか、アセンブラ
でコーディングするときは知ってた方がいいな。
677デフォルトの名無しさん:2001/06/06(水) 07:36
if(a==b && c==d)

if(!(a!=b || c!=d))

同じことを意味してるって位はわかる程度の論理学は必要なんでは?
∪とか∩はAAのための記号じゃないってことですよ。
678デフォルトの名無しさん:2001/06/06(水) 09:25
でも
if(foo() && bar())

if(!(foo() || bar()))
の結果は同じにならないよね
679デフォルトの名無しさん:2001/06/06(水) 10:53
>>678
結果って何?
680デフォルトの名無しさん:2001/06/06(水) 12:05
>>678
お前バカか?
ぜんぜん結果違うじゃん
681デフォルトの名無しさん:2001/06/06(水) 12:09
677に対応させるんなら
if(!(!foo() || !bar()))
って書きたかったんじゃないのか?

結局if(foo() && bar())とかいうときにはfoo()が偽ならbar()は評価
すらされないって事を言いたかったんだと思うが、
もうちょっと落ち着いて書け。
682デフォルトの名無しさん:2001/06/06(水) 12:17
入力された文字数を調べるプログラムです。
Borland C++ Compiler 5.5でコンパイルしてみたのですが、
なぜかコメントの入っている行のprintf()が実行されません。
ちなみに、LSI C-86 Ver.3.30 試食版では正常に動作しました。

#include <stdio.h>

main()
{
char c;
long n;

n = 0;
c = getchar();
while (c != EOF) {
++n;
c = getchar();
}

printf("%ld\n", n); // 問題はこの行

return 0;
}

これについて何か知っている方は、ぜひ教えてください。
683デフォルトの名無しさん:2001/06/06(水) 12:17
>>681
それはC++なら規定されていたかもしれないけど、
Cだと処理系依存じゃねーのか?
684中途半端くん:2001/06/06(水) 12:17
>>678
if( ! ( ! foo() || ! bar() ) ) じゃないかな(あってる?)

それよりも、Cで評価式の中に関数を入れるのは
わかってないとバグの元だから注意しよう。
685デフォルトの名無しさん:2001/06/06(水) 12:19
Perlだと
open .. or die
で積極的に利用していますよね。
686デフォルトの名無しさん:2001/06/06(水) 12:24
>>682
c = getchar();
while (c != EOF) {
++n;
c = getchar();
}

この行、無駄ねぇか・・・?
whileの()内に条件書きたがる人って、この手の無駄多いよなぁ
687中途半端くん:2001/06/06(水) 12:25
んだよかぶりまくりじゃーん。みんな昼休みなのか。
688デフォルトの名無しさん:2001/06/06(水) 12:27
>>683
K&Rには
「左から右に評価され真偽が判明した時点で打ち切る」
って書いてあるから、多分規定されてるんだと思う。
689デフォルトの名無しさん:2001/06/06(水) 12:29
while(getchar() != EOF)
  ++n;
690中途半端くん:2001/06/06(水) 12:30
>>682
はやくて見えないだけです。
一番最後に sleep(10); でもはさめばprintfは実行されます。
691デフォルトの名無しさん:2001/06/06(水) 14:03
>>688
「多分」っていうか規定されています。
基本的な演算子の機能くらいみんな覚えようよ〜。
5つも10個もの言語を使わなくちゃならなくって
大変、って人はともかくとしてさ。
692デフォルトの名無しさん:2001/06/06(水) 14:08
あの、VC++の乱数の作り方。
1から6までの乱数作りたいんですけど。
randだけではむりですよね。
VBだとわかるんですけど。
693デフォルトの名無しさん:2001/06/06(水) 14:11
>>692
かけろ!われ!あまれ!
694デフォルトの名無しさん:2001/06/06(水) 14:15
n = rand()%6+1;

数式的には算数レベルだけど、意外と思いつかないtipsなのかもね。
695682:2001/06/06(水) 14:18
>>690
試してみたのですが、だめでした。
696中途半端くん:2001/06/06(水) 14:21
>>695
じゃ %ld が悪いんだなきっと。
手元にCの本が無いから分らないけど
697デフォルトの名無しさん:2001/06/06(水) 14:21
Sleep(10000);
これくらいでどうだろう(藁

うーんと、バッファがフラッシュされていない可能性はどうでしょう?
fflush(stdout);
を入れてみるとか。
698682:2001/06/06(水) 14:32
>>697
どちらももだめなようです。

>>696
それはないと思いますよ。

コンパイラのバグということはあり得るのでしょうか。
699デフォルトの名無しさん:2001/06/06(水) 15:08
>>681
条件が違うんだから結果が違うのは当たり前、という話だな。
700デフォルトの名無しさん:2001/06/06(水) 15:26
printf("hello, world\n");
とでもして、printf自体が実行されてるかを確認しよう。
701デフォルトの名無しさん:2001/06/06(水) 15:32
stdoutの向き先が変な方に行っているというのはどうだろう。
fprintf(stderr,"%ld\n",n);
にしてみるとか。

よくわからんがBolandCにもコンソールってあるの?
702デフォルトの名無しさん:2001/06/06(水) 16:02
703デフォルトの名無しさん:2001/06/06(水) 16:23
>>682
> 実行されません。
無限ループしてないか?プロンプトは返ってきているのか?

だとしたら
> char c;
int c;
にしてみろ。
704中途半端くん:2001/06/06(水) 16:28
>>682
ところで、EOFってどうやって検出してるの?
その環境でのEOFの値って何だろう。
getcはちゃんとEOFを返却するのかな。
705デフォルトの名無しさん:2001/06/06(水) 16:31
Ctrl+D
もしくは
Ctrl+Z
で終了させてみろ>>682
706デフォルトの名無しさん:2001/06/06(水) 17:06
今時こんな話しで悪いが
MS-DOSで図形を表示したいのですが
エスケープシーケンスでスクリーンの制御をするためのライブラリって
なんかいいのあるかな?
図形って言うか サインカーブの曲線とかのグラフ表示したい
どうなんでしょみなさん?
707デフォルトの名無しさん:2001/06/06(水) 17:09
>>706
pc-98なら、やったことあるけど。。
708デフォルトの名無しさん:2001/06/06(水) 17:27
>>682
>printf("%ld\n",n);

printf("\n%ld\n",n);
って改行入れてみればいいんでない?
709682:2001/06/06(水) 17:44
いろいろと返答ありがとうございます。
すべて試してみたのですが、やはりうまくいかないようです。

↓もうひとつ試したのですが

>>682のwhile(){}の後

printf("%ld\n", n); //表示されない
printf("Hello, world!"); //表示される

return 0;
}

また、条件をEOFの代わりに別の文字 (例えば 'q' ) にした場合は、
正常な結果が出ました。

なぞは深まるばかりです。
710中途半端くん:2001/06/06(水) 17:51
>>709
long n;
printf("%ld\n",n);

int n;
printf("%d\n",n);
に変更
711デフォルトの名無しさん:2001/06/06(水) 21:37
>>709
コンパイラ:Borland C++ 5.5.1
OS   :NT4.0 SP5
>>682のソースを実行したけどうまくいくぞ?

そっちの環境を教えてくれ
712682:2001/06/06(水) 22:14
>>711
osはwindows98seです。
713デフォルトの名無しさん:2001/06/06(水) 23:18
閏年の日数計算で質問です。
例えば1800年1月1日から2001年1月1日の日数計算だったら
閏年も考慮できるんですが、それが
1800年1月1日から2001年12月31日とかになると、
正確な数字が出せません。月によって日数が違うのはどう考えたら
いいんでしょうか?
714デフォルトの名無しさん:2001/06/06(水) 23:24
>>713
そんなもの言うまでもないと思うが。
本当に思いつかないのなら、脳味噌スカスカだぞ。
715デフォルトの名無しさん:2001/06/06(水) 23:28
>>714
脳みそスカスカでいいからどういうソース書いたらいいのか教えて。
716デフォルトの名無しさん:2001/06/06(水) 23:30
717デフォルトの名無しさん:2001/06/06(水) 23:47
>>682
char c ; long n ; getchar () ;
上を、全て下のように変えて、駄目だったら、
int c ; size_t n ; fgetc(stdin) ;
次の結果がどうなるか報告するように。
printf("Hello, world!\n%ld\nHello, world!",n) ;
718デフォルトの名無しさん:2001/06/07(木) 00:26
int a;
double c = 128.555;
a = c;
printf("%d\n",a);

結果 : 128

どうしてこうなるのでしょうか?
四捨五入がされないんですがコンパイラに問題があるのでしょうか?
教えてください。
719中途半端くん:2001/06/07(木) 00:30
>>718
ネタとしてはかなり中途半端だなぁ。
720デフォルトの名無しさん:2001/06/07(木) 00:33
>>718
切り捨てが基本。
721718:2001/06/07(木) 00:35
>>720
四捨五入はできないのでしょうか?
722デフォルトの名無しさん:2001/06/07(木) 00:36
>>521
0.5を足してキャスト
723デフォルトの名無しさん:2001/06/07(木) 00:36
>>721
+0.5
724デフォルトの名無しさん:2001/06/07(木) 00:37
>>722
0.5を足しても、やっぱり1人以上だな
725デフォルトの名無しさん:2001/06/07(木) 00:37
K&Rによると、
浮動少数→整数の変換は、小数点以下が単に無視されるだけだそうです。
123.456→123ってことですね。四捨五入したかったら予め0.5を足しましょう。
負数の場合はこれじゃダメだけど。
726デフォルトの名無しさん:2001/06/07(木) 01:21
自動的に四捨五入されるような代入式なんて、
怖くて使えないと思わないのかなあ >>722
727デフォルトの名無しさん:2001/06/07(木) 01:39
C++のdelete[] に関しての質問です。

char *buff = new char[10];
// 中略

1) delete [] buff;
2) delete buff;

1)が正しいと思うのですが、2)でもメモリーリークしない
とベテランの人に言われました。本当でしょうか?
728sage:2001/06/07(木) 01:45
>>727
ベテランの使ってるコンパイラは親切なのでリークしないのでしょう。

あなたが将来使うコンパイラでリークしない保証はありません
729デフォルトの名無しさん:2001/06/07(木) 01:57
unsigned char aa[128]="ABC|012|DEF|345";

の時に例えば、DEFだけを取り出す処理ってどういった流れになるんでしょうか?
730デフォルトの名無しさん:2001/06/07(木) 02:00
>>729
そのものズバリのコードを書いたほうがいい?
ヒントだけの方がいい?
731デフォルトの名無しさん:2001/06/07(木) 02:00
aa[11] = NULL;
unsigned char *bb = &aa[8];
732デフォルトの名無しさん:2001/06/07(木) 02:02
>729
やりたい事によります。
"DEF"を探したいだけなら、strstrで十分だし、
"|"をデミリタにして、区切ってから探したいのなら、
strtokと、memcmp(strcmp)を使う。
733デフォルトの名無しさん:2001/06/07(木) 02:04
>>731
笑えた。(^^;
734デフォルトの名無しさん:2001/06/07(木) 02:09
char p = aa;
while(*p!=NULL){
 pからの文字列とターゲット文字列"DEF"を比較
 一致した?
  ポインタを返す
 pを進める
}
エラー;

|を区切りとして扱うなら、NULLと同格にみなしてくれる比較関数を書こう
その場合pの進み先は次の|かヌルになる。
735デフォルトの名無しさん:2001/06/07(木) 02:15
>>728
ありがとうございました。発見次第delete[]に直します。
736デフォルトの名無しさん:2001/06/07(木) 02:24
main( argc, argv )
int argc;
char **argv;
{
inst( argc, argv );

}

この「int argc;」「 char **argv;」は、なぜmainの{}の外に記述
してあるのですか? {}の中に書いてはダメなのでしょうか?
737中途半端くん:2001/06/07(木) 02:26
>>736
それはちょっと古い書き方かな。多分。
やってることは
main( int argc, char **argv)
と何一つ変わらないよ。
738デフォルトの名無しさん:2001/06/07(木) 02:27
>>736
ANSIでは
int main(int argc, char* argv[])
と書きます。

ていうか{}の中に書くのはローカル変数だ。
739デフォルトの名無しさん:2001/06/07(木) 02:29
>>692

GetTickCount()%6+1では、どうだろう?
740K&R先生:2001/06/07(木) 02:30
ANSIは認めませんよ
741デフォルトの名無しさん:2001/06/07(木) 02:44
>>739
それだと1/1000秒以内に数回読み出すような場合に不都合が。
2回振った合計を求める場合とか。
742デフォルトの名無しさん:2001/06/07(木) 04:25
>>734
俺も少し前までやってたけど
NULLと比較しないでNULL文字'\0'と比較するものじゃないのですか?
743デフォルトの名無しさん:2001/06/07(木) 04:36
ANSIは認めませんよ
744デフォルトの名無しさん:2001/06/07(木) 07:32
>>742
そうですね。
鬱なのでもう一度K&Rを頭から読みます。
745682:2001/06/07(木) 10:10
>>717
報告します.
一番最初の”Hello, world!\n”だけ無視されました。
何が起こっているかは少しわかりました。
どうやら、初めの改行までが表示されないようです。
もう少し調べてみます。
746682:2001/06/07(木) 13:41
解決しました
いろいろと騒がせてすいませんでした
ほんとにバカなミスをしていたのにきずいていなかっただけでした。
ありがとうございました >> all
747中途半端くん:2001/06/07(木) 13:46
>>746
なにが原因だったか書けや
748682:2001/06/07(木) 13:55
>>747
はずかしくてちょっと書けません
ごめんなさい
749デフォルトの名無しさん:2001/06/07(木) 13:59
恥ずかしくないからこっちおいで
750デフォルトの名無しさん:2001/06/07(木) 14:15
>>748
ていうか掲示板に質問投げて自力解決したらフィードバックするのがルールだぞ。
751デフォルトの名無しさん:2001/06/07(木) 14:47
なんか<3>は進行が早いね。
752デフォルトの名無しさん:2001/06/07(木) 14:54
>>682関連
壮大なネタ?
それから、中途半端くんは、もしそれがネタなら書き込みを控えるように。
ここはネタすれじゃないよ。
753中途半端くん:2001/06/07(木) 14:56
>>752
ネタで書き込んだことなんて一度だって無いんだけど・・・
754デフォルトの名無しさん:2001/06/07(木) 15:17
あっしは認めませんよ
755デフォルトの名無しさん:2001/06/07(木) 15:48
>>690
>はやくて見えないだけです。
>一番最後に sleep(10); でもはさめばprintfは実行されます。

これをネタと言わずして何と言おう。
本気でこれを書いたのか?
756デフォルトの名無しさん:2001/06/07(木) 15:52
for( if(j == 0) { i;} else { j;} ; j++)


うまく動かないんですが何がわるいんでしょうか
757デフォルトの名無しさん:2001/06/07(木) 15:53
セミコロンの数が足りない
758デフォルトの名無しさん:2001/06/07(木) 15:55
>>757
そんな問題か?
759デフォルトの名無しさん:2001/06/07(木) 16:02
ソケットで、受信待ちの間、プログラムがとまっちゃうんですけど、、
どうしたらいいのでしか?
760デフォルトの名無しさん:2001/06/07(木) 16:03
マルチスレッドにしよう
761中途半端くん:2001/06/07(木) 16:13
>>755
はんぶん本気。
実行中の標準出力が別ウィンドウになってるようなのならそういうことあるし。
762デフォルトの名無しさん:2001/06/07(木) 16:37
質問です。read は一行だけ読み込むのですか?
↓ではなぜ while の中に埋め込んであるのですか?
read(STDIN_FILENO, buf, sizeof(buf));だけでは
どこがだめなんでしょうか。

#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <stdio.h>

#define BUFSIZE 1024

main(int argc, char *argv[])
{
char buf[BUFSIZE], *p;
ssize_t len, l;
size_t n;

while ((len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
p = buf;
n = len;
while (n > 0) {
l = write(STDOUT_FILENO, p, n);
if (l < 0) {
fprintf(stderr, "%s: write error\n", argv[0]);
return 2;
}
p += l;
n -= l;
}
}
if (len < 0) {
fprintf(stderr, "%s: read error\n", argv[0]);
return 1;
}
return 0;
}
763デフォルトの名無しさん:2001/06/07(木) 16:44
>>762
readの使い方を調べよ。
764デフォルトの名無しさん:2001/06/07(木) 16:45
標準入力が何もなかった場合にはゼロが返るから、
エラー処理のかわりにしてるんじゃないか?
765中途半端くん:2001/06/07(木) 16:54
>>762
>なぜwhile の中に埋め込んであるのですか
とりあえず無限ループにしたいからでしょ。
766デフォルトの名無しさん:2001/06/07(木) 17:16
↑ コテハンどおりの回答だな
767682:2001/06/07(木) 17:29
746と748は偽者です。まだ解決してません。

出力先をファイルに切り替えた場合は、正常に出力されました。

これまでわかったことをまとめてみます。
getchar()で入力されたEOFが、画面上に表示される(?)と、
そこからは文字を「画面」に表示することが不可能になります。
ただし、改行が出力されてからは表示可能になります。
768ヒントをやろう:2001/06/07(木) 17:38
#define EOF (-1)
769中途半端くん:2001/06/07(木) 17:45
>>767
改行が押されるまで入力ストリームに文字は入っていかないから
取り出せない。こともある。ような気がする。
たとえば、
123<ctrl+d>
と入力しても終わらないでしょ?(このあと<enter>後に<ctrl+d>なら終わる)
123<enter>
<ctrl+d>
ならきちんと4文字入力したと出ます。(<ctrl+d>のみ なら取れる)

で、これは標準入力の問題なんで、bashだかttyだかの設定を
変更すると出来たような気がするけどその辺はよくわかんない。
770中途半端くん:2001/06/07(木) 17:54
>>767
いってることがよく分らなかったら、
while (c != 'A') {
とでもしていろいろ入力してみれば納得するよ。多分。
771中途半端くん:2001/06/07(木) 18:18
>>769 続き
>>682の環境はDOSだったね。bashもttyもあんま関係なかったね。
Linuxなら stty -icanon で解決するんだけどねぇ。
772デフォルトの名無しさん:2001/06/07(木) 19:23
>>761
>実行中の標準出力が別ウィンドウになってるようなのならそういうことあるし。

なんの話をしているのかさっぱり解らないよ。

それに、>>682の質問は「実行されないが何故か?」だろ。
それに対して、

>はやくて見えないだけです。

と書いたということは、「実行されているが*見えない*」と答えたんだろ。
そして、

>一番最後に sleep(10); でもはさめばprintfは実行されます。

などと意味不明なことを書く。

どこが「半分本気」なんだよ、馬鹿ものが。
つまらんエクスキューズをしないで、ちゃんと答えるか、ネタスレにでも
行きやがれ。
773デフォルトの名無しさん:2001/06/07(木) 19:27
>>771
>>>682の環境はDOSだったね。bashもttyもあんま関係なかったね。

お前本当に名前どおりの奴だな。

>Linuxなら stty -icanon で解決するんだけどねぇ。

知らないなら口出しするなよ。
774中途半端くん:2001/06/07(木) 19:28
>>772
ちゃんと答えたよ。
775中途半端くん:2001/06/07(木) 19:48
>>682
あと他に思いつくのといったら、getchar を使わずにgetch を使う くらいかな。

>>773
あんまりカリカリしてると血圧上がるよ?
776デフォルトの名無しさん:2001/06/07(木) 20:37
>>774
あーそうかい。
お前の*ちゃんと*のレベルがわかったよ。
777デフォルトの名無しさん:2001/06/07(木) 22:01
C言語があればゲームつくれるって聞いてんだけど本当?
778デフォルトの名無しさん:2001/06/07(木) 22:25
べつにC言語じゃなくても作れるけど>777
ゾロ番おめでとう
779777:2001/06/07(木) 22:30
おっ、777だったのか。気づかんかった
何気にここ初書きこみでした。

なんか知り合いがゲーム作るのはC言語がイイ!!
って言ってたんだけど実際どうなんですか?

後、もしC言語を勉強したかったら
どこのサイトに行けばよくわかるですか?
780デフォルトの名無しさん:2001/06/07(木) 22:32
>>779
ネタはsageでやってくれ。
マジなら書き込むな。
781デフォルトの名無しさん:2001/06/07(木) 22:35
「C言語 ゲームプログラミング」で検索>777
782デフォルトの名無しさん:2001/06/07(木) 23:00
ウインドウズプログラムでファイルを再帰的に検索するプログラムを
作ったんですが、実行するとすこし反応しなくなります。
どうすればいいのでしょうか。
783デフォルトの名無しさん:2001/06/07(木) 23:02
>>782
てきとーなところでメッセージループを回せ。
784デフォルトの名無しさん:2001/06/08(金) 00:27
>>682=767
何で682で、EOFが表示されるの?
どこか、プログラムを端折ってませんか?
もしかして、682のままなら、表示されませんか?
だったら笑うけど…。
785デフォルトの名無しさん:2001/06/08(金) 00:28
>>772
>>実行中の標準出力が別ウィンドウになってるようなのならそういうことあるし。

>なんの話をしているのかさっぱり解らないよ。

>>一番最後に sleep(10); でもはさめばprintfは実行されます。

>などと意味不明なことを書く。

Windows環境でDOSプログラムを実行すると、DOS窓が立ち上がってプログラムが実行されて、プログラムが終了すると窓が消えることがあるけど、761はそれが言いたいのでは?
プログラムの最後にSleep()を突っ込めば、一旦停止されるからprintf()の出力が見えるってこと。
761が説明不足なのはわかるが、おまえの理解力も足りない。
786宿題です:2001/06/08(金) 00:42
フルカラーのビットマップを24色に変換するプログラムを作れ
といわれました。まったくわかりません。
ビットマップがどういうデータ構造をしているかも知りません
どなたか暖かい手を差し伸べてください。お願いします。
787デフォルトの名無しさん:2001/06/08(金) 00:48
788デフォルトの名無しさん:2001/06/08(金) 01:10
>>786
やる気があるなら、BMPのデータ構造くらい自分で調べろ。
簡単に分かることさえやらないようなヤツには答える気はしない。
789デフォルトの名無しさん:2001/06/08(金) 01:14
>>787-788
しかし見栄え良く24色に減色するにはかなり高度なアルゴリズムが
必要とされると思われ。君らできる?(w
790デフォルトの名無しさん:2001/06/08(金) 01:21
誤差拡散かディザでいいんじゃネーノ?
791デフォルトの名無しさん:2001/06/08(金) 01:29
DOSでワイルドカードの展開をしたいのですが、
もしかしてsetargv.objってMS-Cにしか付いてきませんか?
Quick-Cを使ってます。ネタじゃないです。
792デフォルトの名無しさん:2001/06/08(金) 01:30
>>789
R3階調G4階調B2階調で24ビットBMPのまま単純近似じゃだめかな?
793デフォルトの名無しさん:2001/06/08(金) 01:37
>>789
ここまで極端な減色だと、元画像の特性がどんなだろうと見栄えのある
画像にはなりにくいので、思い切った減色が必要。
モノクロにしてから256→24に減階とか、輪郭抽出して2値にしちゃうとか
前処理として強烈なフィルターかけるとか。
794デフォルトの名無しさん:2001/06/08(金) 01:43
>>793
そう思う。俺がこの問題を解くのならモノクロ化するね。
たぶん印象は一番良いはず。
795787:2001/06/08(金) 01:45
>>789
何の為の24色か分からないので、そんな無意味な事は出来ません。
と言うか、出力のフォーマットはどうなってるんだ>>24
796デフォルトの名無しさん:2001/06/08(金) 01:45
まず見栄えよくってどんな判定基準か説明してもらわんとな>>789
画像サイズが大きくなって良いなら、CMYKの単/複合色の10色と
白黒2色の計12色を使用し、砂網で網点化すりゃ再現できる範囲で
写真画質も可能だが、そんな答えを期待している?
797デフォルトの名無しさん:2001/06/08(金) 01:49
>>796
ビットマップのサイズを変更しちゃうわけか。
こりゃ盲点。そこんとこどうなの>>786
798デフォルトの名無しさん:2001/06/08(金) 01:55
>>795
IndexColorのBMPファイルだと思われ
799デフォルトの名無しさん:2001/06/08(金) 02:10
>>798
>IndexColor
上が良く分からないのですが、24色に何か意味があると言う事?
普通は16か256。百歩譲って32だと思うのですが…。
800デフォルトの名無しさん:2001/06/08(金) 02:20
>>799
意味は無い
あえてあげるとBMPにしたとき256、32よりサイズが小さくなることのみ
801デフォルトの名無しさん:2001/06/08(金) 02:41
32色のBMPって5bit単位データが詰まってるんでしょうか?
802デフォルトの名無しさん:2001/06/08(金) 02:53
>>801
ここで言うBMPとは、BMPフォーマットを指しているのではなく、
ベタなフォーマットの事を指しているのだと思う。
だから、使えるかは別として、考え方は正しい。…多分。
803へたれ:2001/06/08(金) 06:39
>682
確かものによっては

printf( "test1\n" );
getch();

とか

getch();
printf( "test2\n" );

って書いたら printf の表示がおかしくなったと思う。理由しらね。
Windows2000評価版 + VC++6 SE で
printf( "test\n" );
getch();
なら問題なかったけど。
804へたれ:2001/06/08(金) 06:43
初心者です。
何の意味もないプログラムですが、

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

long test( void )
{
static long st = 0;
st += ( st >> 4 );
return ++st;
}
int main( void )
{
int i;
int hairetu[1000];
clock_t start, end;

for ( i=0 ; i<10 ; i++ )
hairetu[i]=0;

start = clock();
printf( "start = %d\n", start );

for( i=0 ; i<10000 ; i++ )
hairetu[ test() % 2 ]++;

end = clock();

printf( "start = %d\n", start );
printf( "end = %d\n", end );

return getch();
}

#if 0
===== 実行結果 =====
start = 50
start = 2530
end = 50
#endif

Windows2000評価版 VC++6 SE SP1での実行結果です。
俺には何が間違っているのかわかりません。
バグですか?それとも何か間違ってるのでしょうか?
805デフォルトの名無しさん:2001/06/08(金) 07:40
意味無いってか、なにやりたいかわかんねーよ
806デフォルトの名無しさん:2001/06/08(金) 08:39
>>804
コメントのいれかたが渋い。
807デフォルトの名無しさん:2001/06/08(金) 08:53
>>802
一応、フォーマットを厳密に解釈するなら、5bitIndexColorで最大24色
というBMPファイルを作ることは可能。
1ラインごとにロングワードアラインのためのパディングが入る。
808デフォルトの名無しさん:2001/06/08(金) 09:18
>>804
startの値を変えてないのに、なんで50と2530になるの?
って質問だよね?

test()を10000回も呼び出すとstがオーバーフローしますよね。
stはunsigned型じゃないのでオーバーフローして値がマイナスになることがあります。
そんなときに hairetu[test()%2] が hairetu[-1] になることがあります。
で、たまたまhairetu-1はstartのアドレスだったって話です。
# うちの環境だと違ったけど。

ループを抜けた時点で
hairetu[0] + hairetu[1] + start - startの最初の値 = 10000になるでしょ?

startとendの値が同じなのは大して処理に時間がかからないからです。
809デフォルトの名無しさん:2001/06/08(金) 11:21
あるファイルの文字コードの種類を判別したいのですが
JIS,SJIS,EUCの判別はできるのですが、UTF-16,UTF-8の
判別法がわかりません。何かよい本、またはホームページが
あったら教えていただけないでしょうか?
よろしくお願いします。
810デフォルトの名無しさん:2001/06/08(金) 11:29
>>809
無いんじゃない?
811デフォルトの名無しさん:2001/06/08(金) 11:48
>>808
ヴァカか?
test()が返す値は常に1だぞ?
812デフォルトの名無しさん:2001/06/08(金) 11:49
と、思ったらstatic longじゃん、

逝ってくる
813中途半端くん:2001/06/08(金) 12:01
814デフォルトの名無しさん:2001/06/08(金) 12:01
>>809
無いと思うよ
ただ判別法ならバイト並びで、0の後に0x7f以下の値が頻出するならUTF-16とし、
UTF-8はマルチオクテット後のASCIIが正しくデコードできること、でいいんじゃない?
815デフォルトの名無しさん:2001/06/08(金) 12:46
森本レオはオレ、オレって言ってて学校の先生に怒られたから
レオにしたそうだ。
816デフォルトの名無しさん:2001/06/08(金) 12:53
>>815
知ったかぶり厨房は氏ね!
817デフォルトの名無しさん:2001/06/08(金) 14:05
ネッシーは氏ね氏ね言われたからネッシーになったそうだ
818デフォルトの名無しさん:2001/06/08(金) 14:06
シチューはカレーを作る途中で中止食らった過程が元で
偶然出来たから、シチューと名づけられたそうだ
819809:2001/06/08(金) 14:07
>>813,814
ありがとうございました
820デフォルトの名無しさん:2001/06/08(金) 16:10
>>817-818
ありがとうございました
821デフォルトの名無しさん:2001/06/08(金) 18:17
カレーライスは、カレーとライスを組み合わせた
食べ物だから、カレーライスと名付けられたそうだ。
822宿題です:2001/06/08(金) 18:29
ビットマップを任意の倍率で拡大するプログラムを作れといわれた
のですが方法がまったくわかりません。
どなたか暖かい手を差し伸べてください。
823デフォルトの名無しさん:2001/06/08(金) 18:35
>>822
なんか、課題をかわりにやってくれっていっているようにしか
読めないが気のせい?
# それは自分の為にも他人の為にもならないよ
824デフォルトの名無しさん:2001/06/08(金) 18:44
825デフォルトの名無しさん:2001/06/08(金) 19:10
>>824
自分の言葉で語れや
826デフォルトの名無しさん:2001/06/08(金) 19:10
>>824
自分の言葉で語れや
827824:2001/06/08(金) 19:12
元ネタ書いたの俺なんだけど
828デフォルトの名無しさん:2001/06/08(金) 19:14
>>821
違うぞ。そんな間違った知識どこでおぼえてきたんだ。

カレーライスは、始め立ち食いメインの名もない飯の一種だった。
彼らは、そのうち立って食することは行儀の悪いことだと悟り始めた。
そして、彼らは、椅子に座った。

つまり、そういうことだ・
829デフォルトの名無しさん:2001/06/08(金) 19:17
宿題なんですが
4次方程式を解くプログラムを作れといわれたのですが
ヒントだけでももらえませんか
言語はCです
お願いします
830Hints:2001/06/08(金) 19:25
>>829
拡大して直線近似でニュートン法。
831デフォルトの名無しさん:2001/06/08(金) 19:30
>>829
フェラしてくだちい。
832デフォルトの名無しさん:2001/06/08(金) 19:33
>>830はCAD屋と見た(w
833宿題なんですが:2001/06/08(金) 21:06
英語の文章を解析して主語、述語、補語、目的語に分解する
プログラムを作れといわれました。
なにかヒントをください
お願いします
834デフォルトの名無しさん:2001/06/08(金) 21:09
DDRをミュール変換してUTRにしたいんですが
皆さんはどのようにやっていますか?
よろしかったらおしえてください。
835デフォルトの名無しさん:2001/06/08(金) 21:09
DDRをミュール変換してUTRにしたいんですが
皆さんはどのようにやっていますか?
よろしかったらおしえてください。
836デフォルトの名無しさん:2001/06/08(金) 21:09
>>833
すげー高度な宿題だな
837デフォルトの名無しさん:2001/06/08(金) 21:19
>>833
格情報を含む単語辞書と文型辞書を用意してパターンマッチング。
838デフォルトの名無しさん:2001/06/08(金) 21:20
>>833-835はネタだろ。

>>831はネタと見せかけて実はマジレス。
839834:2001/06/08(金) 21:41
ネタではありません
単語の数を限定(1000語)してありますが
それでもむずかしいです。
なにかヒントをください。
840デフォルトの名無しさん:2001/06/08(金) 21:45
>>829
次の宿題だ。
5次方程式を代数的に解くプログラムを作れ。
841デフォルトの名無しさん:2001/06/08(金) 21:46
>>839
文法の木を作って、それを文章に対して再帰的に当てはめる。
自然言語だと複数の解釈が出来上がるかもね。
842デフォルトの名無しさん:2001/06/08(金) 21:46
>>840
自分にできないことを宿題に出すのもどうかと思うぞ
843839:2001/06/08(金) 21:49
文法の木というのどういうものでしょうか?
名詞ー述語ー目的語 見たいなパターンをたくさん作って
当てはめていくという意味でしょうか?
844840:2001/06/08(金) 21:53
>>842
確かにオレにはムリだ。頼む、教えてくれ。
845デフォルトの名無しさん:2001/06/08(金) 21:54
BNFみたいなやつ>>843
文 := 〜 | 〜 名詞
(文は〜または 〜 または名詞から出来ている)
名詞 := 〜 | 〜
(名詞は〜または 〜から出来ている)
こんな風に、どんどん〜の部分を細分化していって、
最終的に終端記号(この場合、実際の単語)までこの
定義を行なう。
846デフォルトの名無しさん:2001/06/08(金) 22:37
n個の整数からr個選び出して順列を生成するってどうやるんですか?
n個の整数の順列生成はできるんですが、n個からr個選び出す
ところで行き詰まっています。何かヒント頂けませんか?
847デフォルトの名無しさん:2001/06/08(金) 22:40
>>846
r個選び出す条件って何よ?ランダム?
つーか自分で問題の意味判ってる?
848デフォルトの名無しさん:2001/06/08(金) 22:45
n,rの値は自分で決めることが出来ます。#defineなどで。
例えば、n=4,r=2なら、生成する順列は、
12,13,14,21,23,24,31,32,34,41,42,43
です。どうやったらこの順列を作れるのだろうかと・・・。
849デフォルトの名無しさん:2001/06/08(金) 22:54
>>822
「拡大」のみってのがミソだ。
つーことは、やっぱそっち系の学科だろう。
む、バイキューブリック補完とガンマ補正を組み合わせた拡大で「可」が拾えるはず。
単純線形補完なんかやると赤をもらうので注意。
850デフォルトの名無しさん:2001/06/08(金) 23:23
>>822
拡大のみってどこ系の学科なの?
851849:2001/06/08(金) 23:27
「拡大」と「縮小」が同じ方法で実装しないってこと。
自然画像の処理を研究しているとこなら常識だと思ってたが>>850
852デフォルトの名無しさん:2001/06/08(金) 23:52
>>729 の者です。一応'|'区切りで取り合えず組んで見ましたが、その後|を境目に一つ一つ出力
しようとして下記のPGの8〜9目を4つコピって、3の部分を1〜4の数字に変えましたが、
どうしても、最初のABCしか出力されないので、その後所々にprintf(…)で物理チェックを
かまして見た所、startとlengが変化しないのが原因みたいなのですが、どこら辺を直せばいいか
ご指導お願いします。
インクルード省略
void kou(unsigned char *rec, unsigned char *buf, int Cnt);
main(void)
{
unsigned char aa[128]="ABC|012|DEF|345";
unsigned char bb[128];

bb[0]=0x00;
kou(rec,bb,3);   |→ここの二行を後3つコピーして3を1〜4に変更。
printf("%s\n",bb); |
}
void kou(unsigned char *rec, unsigned char *buf, int Cnt)
{
int i,s,start,leng,count;

start=leng=0;
for(i=s=0;rec[i];i++,s++){
if(rec[i]==0x7c){
count++;
if(Cnt==count){
s=s-1;
leng=s;
break;
}else{
start=i+1;
s=0;
}
}
}
if(rec[i]==0x00 && Cnt==(count+1)){
leng=s;
count++;
}
if(Cnt==count){
memcpy(buf,rec+start,leng);
buf[leng]=0x00;
}
853デフォルトの名無しさん:2001/06/09(土) 00:10
>>846 >>848
これはschemeでの例。
C言語には自分で直してね。(比較用にr個分の配列が必要)
もっといい方法があるかもしれないけど。

(define (disp-rev l)
  (cond ((pair? l)
         (disp-rev (cdr l)) (display (car l)) )))
(define (example0 n r p)
  (let loop ((i 1))
    (cond ((<= i n)
      (cond ((< 0 r) (if (not (memv i p))
                         (example0 n (- r 1) (cons i p)))
                     (loop (+ i 1)))
            (else (disp-rev p) (display " ") ))))))
(define (example n r) (example0 n r '()))

(example 4 2)
---|12 13 14 21 23 24 31 32 34 41 42 43
=>()
(example 4 3)
---|123 124 132 134 142 143 213 214 231 234 241 243
312 314 321 324 341 342 412 413 421 423 431 432
=>()
854ゲイツ:2001/06/09(土) 00:29
こんど、どこかの会社がA言語を開発したと聞いたのですが
本当ですか?
855デフォルトの名無しさん:2001/06/09(土) 00:34
>>854
うそです
856デフォルトの名無しさん:2001/06/09(土) 00:37
        /⌒ヽ⌒ヽ
               Y
            八  ヽ
     (   __//. ヽ,, ,)
      丶1    八.  !/
       ζ,    八.  j
        i    丿 、 j
        |     八   |
        | !    i 、 |
       | i し " i   '|
      |ノ (   i    i|
      ( '~ヽ   !  ‖
        │     i   ‖
      |      !   ||
      |    │    |
      |       |    | |
     |       |   | |
     |        !    | |
    |           | ‖
   /   ●     ●  ヾ     
857デフォルトの名無しさん:2001/06/09(土) 00:42
>>856
ワラタ
858デフォルトの名無しさん:2001/06/09(土) 00:48
>>848
まずその謎の言葉の定義からなんとかしろ。
普通、「整数」と言ったら「0」を含む。
普通、「順列」と言ったら「nPr」の事を指す。
普通、
>12,13,14,21,23,24,31,32,34,41,42,43
のような集合は「数列」と呼ばれる。

で、そのサンプルの数列見て集合の特性が思いつかないなら
お前は理系に向いてないからさっさとやめろ。
859853:2001/06/09(土) 01:02
ちょっと手直し(n -> from to)
(define (example10 from to r p)
  (let loop ((i from))
    (cond ((<= i to)
      (cond ((< 0 r) (if (not (memv i p))
                         (example10 from to (- r 1) (cons i p)))
                     (loop (+ i 1)))
            (else (disp-rev p) (display " ") ))))))
(define (example1 from to r) (example10 from to r '()))

(example1 0 3 2)
---|01 02 03 10 12 13 20 21 23 30 31 32
(example1 1 4 2)
---|12 13 14 21 23 24 31 32 34 41 42 43
わかるかなあ・・
860デフォルトの名無しさん:2001/06/09(土) 01:12
>>853
何気に意地悪だねあんた(w
861デフォルトの名無しさん:2001/06/09(土) 01:50
>>852
mainのrecとkouのcountを、異次元から召還してます。
また、kouは{}の数すら対応していません。
通しで考えた訳ではないので、どうか分かりませんが、
rec=aa、count=0、最後に}を追加で上手くいくかも…。
でも、個人的には最初から考え直す事を勧める。
862超初心者です。:2001/06/09(土) 14:35
 Cの勉強を始めて1週間の若輩者なのですが、今使っている本のなかにある
サンプルプログラムがコンパイルできません。以下のようなものです。

#include <stdio.h>
#include <math.h>

main()
{
int year,
double amout, principal = 1000.0, rate = .05;

printf("%4%21s", "年数", "預金残高");

for (year = 1; year <= 10; year++) {
amout = principal * pow(1.0 + rate, year);
printf("%4d%21.2f\n", year, amout);
}

return 0;
}

というものなのですが、gccでコンパイルすると

/tmp/ccA0Xbkx.o: In function `main':
/tmp/ccA0Xbkx.o(.text+0x5f): undefined reference to `pow'
collect2: ld returned 1 exit status

というエラーメッセージが出て、コンパイルしてくれません。
ちなみにccでコンパイルしても同様のメッセージがでました。
一体どうすれば上手くいくのでしょうか。どなたかご教授ください。
 ちなみに環境はTurboLinuxのWS6.0です。
863中途半端くん:2001/06/09(土) 14:41
>>862
-lm
864超初心者です。:2001/06/09(土) 15:03
>863さん
 できました。ありがとうございます。
でもどうして、"-lm"で上手くいくのでしょうか。
あとで、/usr/include/math.h を見たのですが、
powという文字列を検索しても見つかりませんでした。
どういう仕組みになってるのかすごく気になります。
 gccのマニュアルを読もうとしたのですが、英語ですごく
長い文章が延々とあるもんですから、ちょっと・・・。
日本語のgccの簡単な使い方とかFAQとかってないものでしょうか。
865デフォルトの名無しさん:2001/06/09(土) 15:07
powって関数何だよシラネーヨって怒られてるわけです。
>>863のような引数を付けてgccすることにより、
算術関係の関数がリンクされるようになります。

確か
866デフォルトの名無しさん:2001/06/09(土) 15:14
算術演算ライブラリである libm.a は、Unix系の cc ではデフォルトでリンクされません。
-lxxx は libxxx.a をリンクしろ!というオプションです。
X-Window を使う時は -lX や -lX11 とかしますよね。
アレと同じです。
867デフォルトの名無しさん:2001/06/09(土) 15:16
今うちのTurboLinux(6.0server)でmanしてみたけど、
確かにman powとかしてもどのライブラリが要るとか書いてないね。
868中途半端くん:2001/06/09(土) 15:25
>>864
-l オプションは、libなんとか.a というライブラリを読むためにつかう。
-lm なら libm.a を読み込む。
libm.a にはたしかmath.hで使えるようになる関数が詰まってる。
どこにあるかというと、普通は /usr/lib/ の下。
gcc の日本語のマニュアルは ↓
http://www.linux.or.jp/JM/html/GNU_gcc/man1/gcc.1.html

って感じ
869超初心者です。:2001/06/09(土) 15:36
みなさん、レス本当にありがとうございました。
なるほど、そういう風になっていたんですねえ。
どうやら道はまだまだ遠いようですが、最初の一歩で
挫折しなくて済みました。これからも精進してまいります。
870デフォルトの名無しさん:2001/06/09(土) 15:36
今math.hを読んでみたけど、libm.aをリンクしろって指示は書いてなかった。
manにも書いてなかった。linux.or.jpにある日本語マニュアルにも書いてなかった。

そうなると、未知の関数があった場合、どのライブラリをリンクすればいいかは、
どうやって調べたら良いんだろう。
manだけでは調べられないものなのか?
871デフォルトの名無しさん:2001/06/09(土) 15:52
手元に環境が無いので自信なし

% cd /usr/lib
% foreach i (lib?*)
? echo $i
? nm $i | grep pow | grep -v UNDEF
? end
872デフォルトの名無しさん:2001/06/10(日) 00:54
>>870
関数名が既知でリンクするライブラリが未知の場合はgrepすればいいのでは?
そもそも完全に未知の関数は調べる事もないだろうし…。
873デフォルトの名無しさん:2001/06/10(日) 04:16
age
874へたれ:2001/06/10(日) 04:58
普段&使ってるから%がマイナス出すの忘れてた・・・。
鬱だ・・・寝よう・・・
 回答有難うございました。
875デフォルトの名無しさん:2001/06/10(日) 11:20
GCC-HOWTOの 6.2 「ライブラリに尋ねる(sine()はどこにいるの?」
に、一応やり方は書いてある。
この文書、Linuxプログラミング初心者向け。JFで探して。
すでに、disk上にあるかもね。

ただ、man(3)にリンクすべきライブラリなり、コンパイルオプションなりが
書いてあると、幸せになれる人は多いよね。
Solarisのmanには、たしか書いてあって、「ウマ〜」と思った
記憶がある。
876デフォルトの名無しさん:2001/06/11(月) 16:06
int は処理系に依存するという話ですけど、
32ビットマシンでもコンパイラのスイッチ次第で16ビット扱いに
なったりするものなのでしょうか?
それとも、コンパイラでは制御しようのないものなのでしょうか?
877デフォルトの名無しさん:2001/06/11(月) 16:11
それこそ処理系に依存します(藁

コンパイラを設計する人が作ってればあるし、作ってなければ無い。
878デフォルトの名無しさん:2001/06/11(月) 16:36
>>876
そういやVCってスモールモデルとかまだ作れるの?
Ver4以降触ってなくてすっかり忘れてるや。
879デフォルトの名無しさん:2001/06/11(月) 16:52
#define int short
880デフォルトの名無しさん:2001/06/11(月) 17:11
shortが16bitという保証は無い。

24bitとかの処理系だって有りうる。見たことは無いが。
でも昔は12bitCPUって結構あったし。
881デフォルトの名無しさん:2001/06/11(月) 18:40
>>880
>24bitとかの処理系だって有りうる
ねーだろ
882デフォルトの名無しさん:2001/06/11(月) 18:40
>>880
>24bitとかの処理系だって有りうる
ねーだろ
883デフォルトの名無しさん:2001/06/11(月) 18:40
>>880
>24bitとかの処理系だって有りうる
ねーだろ
884デフォルトの名無しさん:2001/06/11(月) 18:40
>>880
>24bitとかの処理系だって有りうる
ねーだろ
885デフォルトの名無しさん:2001/06/11(月) 18:40
>>880
>24bitとかの処理系だって有りうる
ねーだろ
886デフォルトの名無しさん:2001/06/11(月) 18:43
うちではshortは32bitですが何か?
887名無しさん:2001/06/11(月) 18:49
初期のF−15の制禦コンピューターは
IBM製の24ビットのはず。
ただし加算器の巾かアドレスバスの巾かは不明。
888:2001/06/11(月) 18:53
>>886
環境なーに?
889デフォルトの名無しさん:2001/06/11(月) 18:53
>>881-885
1byteが9bitだったマシンもあったのだよ。
890ネタにマジレス:2001/06/11(月) 18:55
>>881-885
規格上ではあってもよい
891デフォルトの名無しさん:2001/06/11(月) 19:09
longが40bitって環境なら今まさに使ってるよ。
892デフォルトの名無しさん:2001/06/11(月) 21:51
>>879
汎整数拡張というものを知ってるか?
893デフォルトの名無しさん:2001/06/11(月) 21:55
>>892
なーんでーすかー?
894デフォルトの名無しさん:2001/06/11(月) 22:23
4ビットマイコンでのCの実装例ってあるの?
895デフォルトの名無しさん:2001/06/11(月) 22:35
#include <stdio.h>

struct point
{
int x;
int y;
};

struct point p;

void function(struct point p)
{
p.x = p.x + 2;
p.y = p.y + 2;
};

main()
{
p.x = 1; p.y = 2;
function(p);
printf("%d %d\n",p.x,p.y);
}

↑で3 4が返されないのがどうしてもわかりません。
ドキュソですいませんが誰か教えて…。
896中途半端くん:2001/06/11(月) 22:38
>>895
実体を渡してるから。
だから、ポインタを渡せばいいよ。
897sage:2001/06/11(月) 22:41
構造体データを値渡ししてるから
898デフォルトの名無しさん:2001/06/11(月) 22:45
あ、ありがとう。ホントに…
でも、pを*pとしてp.xなどをp->xとしたら、
今度はDOS画面で「不正な処理うんぬん」とでてしまいした。
899デフォルトの名無しさん:2001/06/11(月) 22:47
おそらくポインタに実体のアドレスを入れてないから>898
900デフォルトの名無しさん:2001/06/11(月) 22:47
おそらくポインタに実体のアドレスを入れてないから>898
901デフォルトの名無しさん:2001/06/11(月) 22:47
>>895
関数 void function(struct point p) の中での構造体 p は、
関数の前で宣言した外部変数の p ではなく、
関数内で宣言された自動変数だから。

例えば...
#include <stdio.h>

main()
{
int i;
i = 4;
if (i == 4) {
int i;
i = 5;
}
printf("%d\n", i);
}
↑で 5 が表示されないのと同じ理由
902sage:2001/06/11(月) 22:48
なんで書き込みが重複する?
903デフォルトの名無しさん:2001/06/11(月) 22:48
>>898
void function(struct point *p)
{
p->x = p->x + 2;
p->y = p->y + 2;
};

main()
{
p.x = 1; p.y = 2;
function(&p);

きちんと学べ。あてずっぽうでコードを書くな。
904デフォルトの名無しさん:2001/06/11(月) 22:54
 >>895〜897,899〜903
やっとわかりました。
本当にありがとうございました。
905デフォルトの名無しさん:2001/06/12(火) 00:11
第1バイトの値を取り出すのに、
int a = 0xdo3322ff;
a = (char)a;

a = (0x000000ff) & a;
とするのとどっちがいいのですか?
906デフォルトの名無しさん:2001/06/12(火) 00:14
下>905
907905:2001/06/12(火) 00:17
>>906
why
908デフォルトの名無しさん:2001/06/12(火) 00:17
0xdoって何よ?ネタ?>905
909906:2001/06/12(火) 00:19
おれの好み>907
910905:2001/06/12(火) 00:20
>>908
それはただの入力ミス
どっちがいいか知りたかったの
911デフォルトの名無しさん:2001/06/12(火) 00:21
waitさせよー。
912デフォルトの名無しさん:2001/06/12(火) 00:26
もったいよー
913デフォルトの名無しさん:2001/06/12(火) 00:30
>>905

わかりやすい。
キャストしてない。
914屁理屈:2001/06/12(火) 00:35
"第1バイト"なら、エンディアンの問題があるから、
共用体使うか、アドレスとってポインタをキャストして逆参照しなきゃだめじゃん。

まあ、"最下位バイト"を取得したいんだろうけどさ。
915デフォルトの名無しさん:2001/06/12(火) 00:44
>>914
int->charのキャストにインデイアンが関係あるの?
916デフォルトの名無しさん:2001/06/12(火) 00:56
インディアンうそつかない
917デフォルトの名無しさん:2001/06/12(火) 01:00
>>916
君と同じ過ちを犯したやつが過去何人いた事か…
918デフォルトの名無しさん:2001/06/12(火) 01:00
>>915
関係レスを全部読んでないだろ
919デフォルトの名無しさん:2001/06/12(火) 02:39
>>915
int→charへのキャスト にはインディアンは関係ない。
ただ、第1バイト っていう表現をしてるから
インディアンがしゃしゃりでてくるのだよ。アンダスタン?
920デフォルトの名無しさん:2001/06/12(火) 09:43
頼むからくだらんネタはやめてくれ>インディアン
その手の言い換えは全然かっこよくないぞ。
921デフォルトの名無しさん:2001/06/12(火) 10:26
int a = 0xdo9987fe;

printf("a = %x\n",(char)a); → a = fffffffe
printf("a = %x\n",(unsigned char)a); → a = fe

どうしてー
922デフォルトの名無しさん:2001/06/12(火) 10:31
大学でCG論という講義をとっているのですが、
そこで”OpenGL”というやつをやっていますが、
よくわかりません(教授は毎週1000行近いプログラムの課題
を出します。つらい・・・)詳しいサイトや本は知りませんか?
923デフォルトの名無しさん:2001/06/12(火) 10:32
>>922
OpenGL完全マスター
朝日出版
924922:2001/06/12(火) 10:34
ちなみに使ってるソフトはC++Builder4です。
925デフォルトの名無しさん:2001/06/12(火) 10:37
OpenGLはしょぼい・・・・・shadeとか使ったほうがサクッ!とできる(笑)
し、あまりのショボさにCGを見比べると絶望する。でも
CGの根本を学にはいい材料。
926デフォルトの名無しさん:2001/06/12(火) 10:38
DirectXだろう
927デフォルトの名無しさん:2001/06/12(火) 11:30
>>921
符号拡張
928デフォルトの名無しさん:2001/06/12(火) 11:33
b<0?(int)(b-0.5f):(int)(b+0.5f)

って浮動小数点数bを整数に近似丸めさせるときの
式としてあってますか?
929デフォルトの名無しさん:2001/06/12(火) 11:48
>>928
あってるよ
930デフォルトの名無しさん:2001/06/12(火) 11:51
>>922
やってわかるOpenGL
東和出版社
931922:2001/06/12(火) 12:43
そうですか書名だけを見るとできそうな気がしますが(笑)
最後は努力と要領の問題でしょうが・・・・

そころでOpenGLはどうなんでしょうやって損はないでしょうか?
CG論の教授は将来性抜群と絶賛していて、卒論でやってもいいとか
言っていますが。
932デフォルトの名無しさん:2001/06/12(火) 13:34
損はしないね
933デフォルトの名無しさん:2001/06/12(火) 15:57
>>932
ほんとかよ?
卒論なら自分でグラフィックライブラリ作るぐらいやったほうが
いいんじゃない。力もつくしサー
934デフォルトの名無しさん:2001/06/12(火) 18:45
(int)floor(b+0.5f)

って浮動小数点数bを整数に近似丸めさせるときの
式としてあってますか?
935デフォルトの名無しさん:2001/06/12(火) 19:00
だめ>>934
936デフォルトの名無しさん:2001/06/12(火) 19:01
>>934
正の整数で四捨五入ってことならあってるよ
937デフォルトの名無しさん:2001/06/12(火) 22:05
>>936
違うよ。四捨五入なら、小数部が0.5のとき整数部が偶数になるように丸めない
といけないのに、>>934ではそうなっていない。
round関数が使えればそれが一番手っ取り早いけど、そうでなければ、もう少し
処理が複雑になる。
938デフォルトの名無しさん:2001/06/12(火) 22:15
>>937
整数部が偶数になるように? なぜ?方言?
939デフォルトの名無しさん:2001/06/12(火) 22:24
> 違うよ。
違いません。方法の一つです。

>四捨五入なら、小数部が0.5のとき整数部が偶数になるように丸めない
>といけない
それはいわゆる「銀行丸め」だね。そういう四捨五入の方法もあるが、
一般的なじゃないよ。
940デフォルトの名無しさん:2001/06/12(火) 22:26
ネタだとばかり思ったら、
> それはいわゆる「銀行丸め」だね。
ほぇー。こんな流儀があったのか。知らんかった。
941937:2001/06/12(火) 22:27
>>938-939
JISでもISOでもそうなっているよ。
少なくともまともなエンジニアの間では常識。
942デフォルトの名無しさん:2001/06/12(火) 22:35
>>941
いいよ。オレは社会で通用する常識の方をとるよ。
943デフォルトの名無しさん:2001/06/12(火) 22:43
>>942
それはC言語から足を洗うという意味と見た。
944デフォルトの名無しさん:2001/06/12(火) 22:48
http://homepage1.nifty.com/s_miyake/hp/jisround.htm
これか。でも、生理的に受け付けん・・・
945デフォルトの名無しさん:2001/06/12(火) 23:08
>>937
つーか、
四捨五入は四捨五入、JIS丸めはJIS丸めで別物だろ?
946デフォルトの名無しさん:2001/06/12(火) 23:20
>>945
JIS丸めなどという言い方は正式には存在しない。
正式な言い方はあくまでも「四捨五入」。
947デフォルトの名無しさん:2001/06/12(火) 23:21
>>943
デジタル信号処理で同じ事やったら誤差が累積していくだろう?
少なくとも制御系では常識ではないよ。
948デフォルトの名無しさん:2001/06/12(火) 23:29
>>947
2数の中間値を偶数方向に丸めるのは、誤差の累積を最小限に収める意図も
含まれている。
通常、浮動小数点数の端数処理は四捨五入(ここでいうJIS丸め)を採用して
入り場合がほとんど。math.hの中のFLT_ROUNDSが1になっていれば、そうだ
よ。

これは工学全体で常識だから、相手の無知が発覚しない限り、敢えて説明する
人は誰もいないだけ。制御系は工学の色彩が強いので、当然常識だよ。

というか、ほとんどの場合、何も考えなくてもこの方式で四捨五入されている。
精度に収まらない端数処理然り、printf等で文字列に変換する場合然り。
949デフォルトの名無しさん:2001/06/12(火) 23:33
間違えた。
math.hではなくfloat.hの中のFLT_ROUNDSだった。
950デフォルトの名無しさん:2001/06/12(火) 23:38
>>946
正式な言い方は「JIS Z8401 数値の丸め方」だろ
お前が四捨五入って言ってるからって、自分用語を勝手に常識にするのはやめれ
951デフォルトの名無しさん:2001/06/12(火) 23:41
どうでもいいが、そろそろ新スレでいかんか?
952デフォルトの名無しさん:2001/06/12(火) 23:42
よろしく>951
953デフォルトの名無しさん:2001/06/12(火) 23:55
新スレです。以後はこちらにどうぞ。
http://piza.2ch.net/test/read.cgi?bbs=tech&key=992357382&ls=50
954デフォルトの名無しさん