2 :
デフォルトの名無しさん :02/10/21 23:38
4 :
デフォルトの名無しさん :02/10/21 23:39
5 :
デフォルトの名無しさん :02/10/21 23:40
すみませんが、教えてください。 JFrameでactionListenerを使ってイベントをうまく拾えないのですが、 いい見本となるソースはありませんか?
6 :
デフォルトの名無しさん :02/10/21 23:41
先生!! Cのgoto文はどんな時に使うのが好ましいのか教えてください!!
>>5 C言語じゃないのでJavaスレに行きなさい。
>>6 乱用は避けるべきですが、例外処理に使うのが適当だと思われます。
>>8 差別ですか?
教えてくれてもいいと思いますが?
gcc の goto は switch 文の代わりに使ったりできるらしい。 info の 'Labels as Values' にある。
13 :
デフォルトの名無しさん :02/10/22 00:22
先生教えてください。 以下のプログラムを書いたのですが、system関数はでかいプログラム を実行すると、エラーになると本に書いてました。system関数を使わず にすます方法はないでしょうか(あくまでもCのプログラムとして実行 させたいと思っています) #include <stdio.h> #include <string.h> #include <stdlib.h> #include <process.h> void main(int argc, char *argv[]) { char g_name[50] = "tcc -IB:\\include -LB:\\lib -e"; strcat(g_name,argv[1]); strcat(g_name," "); strcat(g_name,argv[1]); strcat(g_name,".c"); system(g_name); } コンパイラ tc2.0 dos版(涙)
14 :
デフォルトの名無しさん :02/10/22 00:27
>>13 DOSの文字数制限の話だろ。
MAKEファイルを作成して、MAKEしる。
>>1 今度はアタシに聞きなさいになったんですか?
16 :
デフォルトの名無しさん :02/10/22 11:49
sizeof演算子で質問(?) 現在テスト中の環境、CPUが特殊らしくて char型の実体のアドレスはどこでもいいがshort,int,longは偶数アドレスに 実体が配置されていないとシステムが暴走するとのこと。 こ〜ゆ〜特殊な環境で宣言された以下の構造体があるとします。 typedef struct stdata { intia; charca; charcb; shortsa; charcc; intib; } STRUCT_DATA; で、 a = b + sizeof(STRUCT_DATA); と a = sizeof(STRUCT_DATA); a = a + b; で最終的なa の値が変化するんですが、こゆ事って有り得ることすかね? あー書いててもわけわかんね。
17 :
デフォルトの名無しさん :02/10/22 11:56
>>16 あんたのコードがバグってるんじゃないの?
そりゃ、bが違ってるんだろ。 再現する最小限のソース作ってみ。
19 :
デフォルトの名無しさん :02/10/22 12:00
>>16 それは特殊ってほどでもないと思う。
あと普通のCPUでも、偶数とか8バイトおきにメンバを置くってのは
やってる。(そのほうが効率いいから)
21 :
デフォルトの名無しさん :02/10/22 13:49
win+vcでネットワーク使ってみようと思ってるのですが、 gethostbyname((char*)"www.xxxxx.com") とかくと、必ずNULLを返します。 これを使うには、なにか前に実行しなければならない関数があるのでしょうか?
22 :
デフォルトの名無しさん :02/10/22 13:56
>>21 WSAStartup()なんじゃない?
サンプルは検索すれば見つかると思う。
23 :
デフォルトの名無しさん :02/10/22 14:11
はい!動きました。有難うございます。 APIって書いてありますからWinだけかもしれませんね。
>>23 winsockは別ライブラリになってるから、個別に初期化する必要がある。
25 :
デフォルトの名無しさん :02/10/22 14:27
配列が0から始まる理由を…。 納得できるご説明お願いします!
array[0] == *(array+0) == *array
27 :
デフォルトの名無しさん :02/10/22 14:36
#include < stdio.h > void main ( void ) { char s[100]; fgets( s,100, stdin ); if ( instr( s, "YASU" ) == 1) { printf( "%sにYASUは含まれる\n", s ); } else { printf( "%sにYASUは含まれない\n", s ); } } どなたかこの文字列検索のプログラムの作成の仕方を教えて下さい
28 :
デフォルトの名無しさん :02/10/22 14:37
29 :
デフォルトの名無しさん :02/10/22 14:42
>>27 #define instr(s, t) strstr((s), (t))
30 :
デフォルトの名無しさん :02/10/22 14:43
>>27 #define instr(a,b) (strstr(a,b)!=NULL)
答えても、丸写しした
>>27 は先生に「何故こうしたか」を説明できないだろー
>>35 ややワロタ。
>>34 前スレで宿題・課題の丸投げウザイってことで
>>1 に「丸投げ禁止」が入ったんだから、
>>32 は間違ってない。宿題スレに誘導してやればイイんでないの?
>>32 ((( (゚∀゚))) アヒャ
↑
│ ウイテル・・・
ウイテル・・・ │ ∧_∧
∧∧ 60cm (,,, ) ウイテル・・・
( ,,). .│ ( ) ∧_∧
/ | │ | | | (,, )
〜(__). ↓ (__)_) (____)〜
""""""""""""""""""""""""""""""""""""""""""
モナーの身長は 42.86cm か。
>>32 正しく動くけど、宿題だとしたら間違いなく×をつけられる解答にしてみたつもりだ。
いや、○をもらえるかもしらんが…
どっちにしろ教師の想定していた解答ではないだろうからつっこみが入ると思うぞ。
40 :
デフォルトの名無しさん :02/10/22 20:24
おしえてください。 VC.netでグラフやアニメーションかけますか?
42 :
デフォルトの名無しさん :02/10/22 20:45
43 :
デフォルトの名無しさん :02/10/22 20:49
できるよ。環境さえ正しければ。
44 :
デフォルトの名無しさん :02/10/22 20:51
45 :
デフォルトの名無しさん :02/10/22 20:55
ヘッダファイルの書き方って、定石とかありまする? ぼく、staticな関数のプロトタイプなんか専用のも別に作って、一個のソースファイルに つきヘッダ2こづつ作ってるんですけど、これってもしかして無駄? まったく一人で書いてるので、ミュータントみたいかもしれないけど....
46 :
デフォルトの名無しさん :02/10/22 20:58
>>44 それならOK。
ここはWin以外の環境も含まれるからね。
次から VC or MFC or Win32API 関連スレで聞くといいよ。
ありがとうございました。感謝(・略)感謝
49 :
海外出張から帰ってきたビル・ジョブス :02/10/22 21:03
+演算子の2つの役割って知ってるか? ところで、おれのスレタイ変えてんじゃねーよゴルァ! 「おれに聞け!」シリーズなんだけど・・・。
50 :
デフォルトの名無しさん :02/10/22 21:06
>>45 ユニークな値を#definesしてヘッダーの2重インクルードをしないとか。
#if !defined(structs_H__01234567_89AB_CDEF_0123_456789ABCDEF__INCLUDED_)
#define structs_H__01234567_89AB_CDEF_0123_456789ABCDEF__INCLUDED_
/*ここから俺様の好き放題*/
/*EOF*/
#endif // !defined(structs_H__01234567_89AB_CDEF_0123_456789ABCDEF__INCLUDED_)
「おれ」が居なかったものはしょうがない。
>>45 まったく無駄とまでは思わないけど、「staticなプロトタイプが入ってて
特定のソースからしかincludeしないヘッダ」と「externのプロトタイプが
入ってて複数のソースからincludeするヘッダ」が混在してるのはあまり
好ましくないような。せめて見ただけで区別できるようなファイル名を
付けるとかした方がいいんじゃないかな。
でも漏れなら、staticなプロトタイプはソースの頭に入れてしまうけどね。
55 :
hiloshi :02/10/22 21:27
最近ようやく、ポインタと文字列について理解してきたので、 某HPにあった「文字列の巡回」というプログラムを作ってみました。 これはたとえば”1234”と入力すると、 1234 4123 3412 2341 と表示されるプログラムです。 試行錯誤しながら作ったんで、みづらいかもしれませんが、
先生教えてください sock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP); のようなsockについて,来た接続を切断するにはどうすればいんでしょうか?
57 :
hiloshi :02/10/22 21:29
#include <stdio.h> #include <string.h> /*文字列strを後ろに一つずらして文字列cpにコピー*/ char *copy(char *str,char *cp,int len) { int a; char *s=cp; cp[0]=str[len-1]; for(a=0;a<len-1;a++) cp[a+1]=str[a]; while(*str++=*cp++) ; return(s); }
58 :
hiloshi :02/10/22 21:29
int main(void) { char str[51]; char cp[51]={0}; int len; int i; puts("■文字列の巡回パターン■"); printf("50字以内で文字列を入力してください。\n"); gets(str); printf("\n%s\n",str); /*入力された文字をそのまま出力*/ len=strlen(str); printf("%s\n",copy(str,cp,len)); /*一つだけずらしたのを出力*/ for(i=1;i<=len-2;i++) printf("%s\n",copy(str,cp,len)); return(0); }
59 :
hiloshi :02/10/22 21:29
二つ質問があるんですが、 @charへのポインタ型を返す関数copyの返却値を、 return(cp)とするとうまく表示されません。 自分の認識では、上のcpは文字列cpの先頭要素のアドレス、つまりポインタですから これをそのまま返しても問題ないように思います。 しかしうまく表示されなかったので、はじめにcpの先頭要素のアドレスを ポインタsに初期化子として代入して、そのsを返すとうまく表示されました。 これがどうしてかわかりません。 Aこのソースでプログラムを実行しても特に問題はなかったんですが、 コンパイルの段階で、「警告」と出て、 copy関数内のwhle文の条件式である 「*str++=*cp++」について、 「おそらく不正な代入」と表示されました。 どうしてなんでしょうか? そもそも、Warningや警告というのはエラーとは違う意味で出てくると思うんですが、 実行してもエラーがなければOKっていう訳にはいかないんですかね?
60 :
海外出張から帰ってきたビル・ジョブス :02/10/22 21:29
ファイル増えると管理が大変になるよ。 でもファイル分けないと出来ないこともあるね。分かるかな?
61 :
デフォルトの名無しさん :02/10/22 21:31
>59 文字列の実体はどこにあるの?
62 :
海外出張から帰ってきたビル・ジョブス :02/10/22 21:34
>59 処理系教えてくれ
63 :
hiloshi :02/10/22 21:35
!!! すいません。文字列の実体ってどういうことすか? 例えばvc[3]={1,2,3}だったら 1,2,3のことですか?
64 :
hiloshi :02/10/22 21:36
>>62 OSがXPで、コンパイラはbccです。
答えになってなかったらすいません。
>>59 ソース見ないと分かんないんだけど、
*str++=*cp++
のところで cp がインクリメントされてるみたいだけど?
それが原因じゃない?>> return(cp) でうまくいかない
66 :
hiloshi :02/10/22 21:41
>>65 ああああああ!!!
そうっすね。ありがとです。
つまり関数の最後では、cpはヌル文字直前をさしてるってことですかね?
67 :
デフォルトの名無しさん :02/10/22 21:42
>>56 closeすればいいだろ。
遮断ならshutdown
69 :
デフォルトの名無しさん :02/10/22 21:44
だってcp変わってるじゃん
70 :
海外出張から帰ってきたビル・ジョブス :02/10/22 21:45
>>57-59 > @charへのポインタ型を返す関数copyの返却値を、
> return(cp)とするとうまく表示されません。
はもう回答されてるから
> Aこのソースでプログラムを実行しても特に問題はなかったんですが、
> コンパイルの段階で、「警告」と出て、
> copy関数内のwhle文の条件式である
> 「*str++=*cp++」について、
> 「おそらく不正な代入」と表示されました。
変数の値を調べるつもりで
while(i == 10)
とか書くところを
while(i = 10)
と書いてしまうコーディングミスがなされる事が多いから
57 のコードは問題無い
どうしても警告消したい場合は判定を省略しないで
while((*str++ = *cp++) != '\0')
とかやってみる
>>59 2の方だけど、条件式を
(*str++=*cp++) != '\0'
にしたら警告消えない?
コンパイラによってはカッコで囲むだけで消えるかも
(*str++=*cp++)
73 :
hiloshi :02/10/22 21:51
>>68 !!!
えーと、whileの中身は非0である限り実行ですよね?
するとcpがどんどん増えて、いずれヌル文字に・・・
そしたらcpがヌル文字になった時にも
評価式は評価されてるってことすか?
cp++って後置増分演算子だから、評価した後に増えるんですよね?
ヌル文字の時は条件が0になるから評価されないんじゃないんですか?
なんか混乱してきましたw
74 :
hiloshi :02/10/22 21:54
>>71 >>72 ありがとうございます。
(*str++=*cp++) != 0
で警告が消えましたw
やっぱりきちんと書いた方がいいってことですね。
それにしても皆さんすごすぎて
こんな初歩な質問ですいません。
75 :
デフォルトの名無しさん :02/10/22 21:56
>>73 > cp++って後置増分演算子だから、評価した後に増えるんですよね?
「条件が0になるかどうかを調べる評価」 *cp++ が終わった後に増えるんですよね?
>>78 66 も 68 も 70 も不正解
while 終了後に cp はぴったり '\0' を指している
ついで
>>58 入力する文字列の桁数が決まっている場合は fgets() がよろし
メッセージ無視して 51 文字以上入力されたら目も当てられない
char str[51];
printf("50字以内で文字列を入力してください。\n");
fgets(str, sizeof(str), stdin);
こんな感じで
入門書だと説明してくれないのね
未来を指してしまった 78 ではなく 73
78 :
デフォルトの名無しさん :02/10/22 21:58
うんこ
>>76 > 66 も 68 も 70 も不正解
> while 終了後に cp はぴったり '\0' を指している
嘘書いた
68 と 70 が正解ごめんね
>78 入力するうんこの桁数が決まっている場合は fgets() がよろし メッセージ無視して 51 文字以上入力されたら目も当てられない char str[51]; printf("50字以内でうんこを入力してください。\n"); fgets(str, sizeof(str), stdin); こんな感じで 入門書だと説明してくれないのね
81 :
hiloshi :02/10/22 22:02
ぐわあああ
いったいどれが本当なんだああ
わからなくなってしまいました。
どなかたか、完璧な回答をお願いできないでしょうか・・・
>>76 fgetsなんてはじめて聞いたんですが、
引数のstrは文字列ですよね
sizeofがstrの長さで、
stdinっていうのはなんですか?
ちなみに今、柴田望洋さんの「定本 明解C言語」っていう本で勉強してるんですが
この本どうなんすか?
オレ的にはちょっとむずかしいかなってw
バカなだけかもしれないんですけど・・・
82 :
デフォルトの名無しさん :02/10/22 22:03
まあ、チャレンジャーじゃないかぎり、 うんこをたくさん入れないと思われ。
83 :
hiloshi :02/10/22 22:04
あ、そうか。 あくまで評価式ですもんね。 評価するだけして、空文になってますけど その後は無視してって事か!! あー、ちょっとわかった気がします。
84 :
海外出張から帰ってきたビル・ジョブス :02/10/22 22:05
>>76 まぁ処理系依存なんだからそんなにアツクなるなよ。
おれの作ったコンパイラはノンオプティマイズ時は\0の次を指すよ。
\1
86 :
hiloshi :02/10/22 22:08
87 :
hiloshi :02/10/22 22:08
#include <stdio.h> void turn(char *a,char *b,char *c,char *d) { char *x,*y,*z; while(*x++=*a++) ; while(*y++=*b++) ; while(*z++=*c++) ; while(*a++=*d++) ; while(*b++=*x++) ; while(*c++=*y++) ; while(*d++=*z++) ; }
88 :
hiloshi :02/10/22 22:08
int main(void) { char anny[]="A"; char bany[]="B"; char chery[]="C"; char domy[]="D"; int i; puts(" anny bany chery domy"); puts("------------------------"); printf(" %s %s %s %s\n",anny,bany,chery,domy); for(i=1;i<=4;i++) { turn(anny,bany,chery,domy); printf(" %s %s %s %s\n",anny,bany,chery,domy); } return(0); }
また低金利か
勉強だと思って勘弁しろ、なんて言うんだねぇ...勉強になターヨ
91 :
海外出張から帰ってきたビル・ジョブス :02/10/22 22:10
>>hiloshi ところで、C言語における"真"と"偽"の各値を知ってる?
真 !!0 偽 !0
やっちまった!
94 :
hiloshi :02/10/22 22:13
>>91 う・・・
正直いってよく意味が・・・
真は非0で偽は0じゃないんですか?
95 :
海外出張から帰ってきたビル・ジョブス :02/10/22 22:19
>>hiloshi 正解です。
96 :
hiloshi :02/10/22 22:20
おお なんか合ってたw 勉強した成果がちょっとだけ出ました。 こんな問題いいですね。 プログラムばっか作ってたら、もっと根本のとこを忘れがちになるんで。
98 :
hiloshi :02/10/22 22:24
>>97 どこがどう間違ってるんですか?
それすらもわからない・・・
ああ・・・
#include <stdio.h> int main(void){ char anny[]="A"; char bany[]="B"; char chery[]="C"; char domy[]="D"; int i; puts(" anny bany chery domy"); puts("------------------------"); printf(" %5s %5s %5s %5s\n",anny,bany,chery,domy); for(i=1;i<=4;i++) { char *tmp; *tmp=*anny; *anny=*bany; *bany=*chery; *chery=*domy; *domy=*tmp; printf(" %5s %5s %5s %5s\n",anny,bany,chery,domy); } return 0; }
>>67 デーモンの裏でパケット監視させてるんで
close,shutdownはできなかたんですよ.
相手を拒否できますか?
iptableやipchainはナシの方向で.
>>98 ヒントを出してあげよう。
問題ではanny〜domyはchar型の変数となっている。
で、代入する値は'A'〜'D'となっている。"A"〜"D"とは違う。
それともう一つ。ポインタは何かを指すものということは知ってるよな?
>>87 のx,y,zはどこを指してるんだ?
次の話題に移っているようだが掘り起こし
>>81 fgets() は gets() とほぼ同じだけど、バッファサイズと読み出し場所を指定でき
stdin は簡単に説明すると gets() がデータ呼んでくるのと同じモノ
知らないキーワードを示されたら Web 検索しるようにしると吉
自分で調べられるようにならないと実力伸びていかないとか
>>80 漏れの文体が気に入ったのね
でも &nbsp; 抜けてるし
charanny = 'A'; charbany = 'B'; charchery = 'C'; chardomy = 'D'; これでいーじゃん。 なぜ文字列?
>>103 問題からすると、これでいいじゃなくて、
そうでなければならない。
105 :
デフォルトの名無しさん :02/10/22 22:54
>>103 しまたタブが…
char anny = 'A';
char bany = 'B';
char chery = 'C';
char domy = 'D';
ですな。
107 :
海外出張から帰ってきたビル・ジョブス :02/10/22 23:12
>>hiloshi いっぱい間違えて、禿げそうになるまで考えると、君の未来は明るいぞ! しかし、結果だけにとらわれず、格好良くてセンスの良いコード記述を心がけよう! 例えば、 for (cp[0] = str[len-1], i = 1;・・・ のように、解釈ブロックを意識して記述すると読むほうも楽で、後のデバッグも楽。
もしかして
>>57-59 でやろうとしてた事って、
size_t l, i, j;
const char * const s = "The C Language*";
puts("==== Q2_B ====");
l = strlen(s);
for(i = 0; i < 10; i++)
{
for(j = 0; j < l; j++)
putchar(s[(j + l - i) % l]);
putchar('\n');
}
じゃないか?
109 :
hiloshi :02/10/22 23:24
うぅ。すいません。
いくつか質問があるんですが。
>>101 ’と”の違いがまだよく分かってないみたいです。
どういう風に認識すればいいんでしょうか?
>>103 これも今までは
char vc[]="ABC";
のように”でくくっていたのに
’でいいのは文字列じゃなくて文字定数だからですか?
putcharみたいな。
>>107 すいません。解釈ブロックって一体・・・?
>>109 char a[] = "abc"; は、char a[] = {'a', 'b', 'c', '\0'}; と同じ。
それと、char a[] = "abc"; と char *p = "abc"; の "abc"は決定的に 意味が違うので注意。
112 :
デフォルトの名無しさん :02/10/23 00:08
114 :
デフォルトの名無しさん :02/10/23 00:14
"abc"の置かれる場所が違うってことでは?
>>114 それはa[]の方は変更してはいけないところに置かれていて、*pの方は変更してもいいところにおかれているということでしょうか?
116 :
デフォルトの名無しさん :02/10/23 00:20
>>115 逆でしょう。
aはスタックに、pはどこだっけコード領域?、
組み込み系だとROMを指すことになるかと。
ごめんね漏れも 107 の後半は何を言ってるのかわからない
コードセグメントだねぇ。
>>115 > それはa[]の方は変更してはいけないところに置かれていて、*pの方は変更してもいいところにおかれているということでしょうか?
これは、反対だよ。a[] の内容は、変更してもいいけど、p の指す先は、変更しちゃダメ。
>>111 は、多分こういうことを言いたいんだと思うけど、"abc" と書くと、char a[] = "abc"; の "abc" 自体は、ROM エリアに置かれたりする (開始時に a[] にコピーする) から余計混乱する。
>>119 いや、別に混乱はしないでしょ
int a[]={1,2,3};
と本質的にはかわらないよ
char a[] = "abc"; は"abc"の方がa[]にコピーされるが、 char *p = "abc"; は pが"abc"を指すように初期化される、って 事かな? "abc"自体には差はないかも。
>>120 > int a[]={1,2,3};
で、char *p = "abc"; みたいな書き方できる ?
>>121 コピーされるというかabcの各文字+\0で初期化されるってだけ。
char a[]={'a','b','c','\0'};と書くのは面倒だから。
>>123 (何を言いたいんだろう...。そんなことは、みんなわかっていると思うけど...。)
125 :
デフォルトの名無しさん :02/10/23 00:45
>>124 コピーされると言うと、メモリー上のどこかに"abc"をおいてそれをa[]にコピーするみたいじゃない。
>>125 void foo()
{
char a[] = "abc";
...
}
なら、そうするのが普通だと思うけど。
127 :
デフォルトの名無しさん :02/10/23 00:56
char *p = "abc"; char a[] = "abc"; pには"abc"の先頭アドレスが代入されてて、 配列aには文字列"abc"が代入されてるってことですよね。 aは配列aの先頭アドレスを指すから printf("%s\n",a);でも printf("%s\n",p);でも abc って表示されるけど。 aもpもアドレスを表してるから。 ・・。あってますか?
128 :
海外出張から帰ってきたビル・ジョブス :02/10/23 00:58
>すいません。解釈ブロックって一体・・・? 処理の集約をしたほうが良いということ。 例のcp[]に対しての前処理なら、for文に含めたほうがスッキリしませんか?
>>126 gccで="abc"と={'a','b','c','\0'}の時のソースをコンパイルして吐き出したアセンブラのコードを見てみた。
同じことやっているのにコードが変わるんだねぇ。
="..."だと必ず最後に\0がつくけれど、={...}だとつくとは限らないから同じコードを吐くようにするのは面倒なのかな。
必ずじゃないな。 配列の要素数と文字列の長さが同じなら\0はつかないな。
132 :
デフォルトの名無しさん :02/10/23 01:09
#define _PATH_SERVICES "c:\windows\system32\drivers\services" windowsでこういう書き方ってできないですね どーかけばいいのでしょうか
>127 文字列の長さを変えて、sizeof(p)とsizeof(a)の値を比べてみると勉強になるよ。
134 :
デフォルトの名無しさん :02/10/23 01:10
135 :
デフォルトの名無しさん :02/10/23 01:10
>>132 \→\\ ってこと?
そっか。char a[] = "abc"; の初期化の方法は実装依存なんだ。 a[]に'a','b','c','\0'を一文字ずつ代入しても別にいいから。 "abc"をコピーするとばかり思ってたアタシは頭固かったです。
>132 \→\\
138 :
デフォルトの名無しさん :02/10/23 01:12
テキストエディタってみなさん何使ってますか? フリーのでいいのがあったらぜひ教えてください
139 :
デフォルトの名無しさん :02/10/23 01:13
メモ帳
1以上100以下の整数値を入力せよというメッセージを表示し、整数値nを読み、その値を添字 とするフィボナッチ数列の値anを計算し、表示し、終了するプログラムを書け。 ただし、a1=1,a2=1,an+2=an+1+anである。範囲以外の数値を読み込んだら、1以上100以下の整数値を 入力せよというメッセージを表示して入力を待つ。 このプログラムをできるだけ簡単なプログラムで教えてください。(for,while,if程度のプログラムで)
>>140 この程度自分で出来ないなら今行ってる学校やめて違う道を探した方が良い。
143 :
デフォルトの名無しさん :02/10/23 01:25
#include <stdio.h> int main(){ int piyo; hoge: printf("→"); scanf("%d",&piyo); if(piyo < 1 || piyo > 100) goto hoge; else if(piyo == 1)puts("a1=1"); else if(piyo == 2)puts("a2=1"); else if(piyo == 3)puts("a3=2"); else if(piyo == 4)puts("a4=3"); ... }
144 :
デフォルトの名無しさん :02/10/23 01:33
>>1 バストはいくつぐらいですか?
ヒップは?顔は誰似?
>>143 switch禁止みたいだからif-elseを使ったの?
>>1 ネカマ歴は?
住んでる場所は?
ワキガですか?
彼女いない歴は?
お母さんとできてますか?
147 :
デフォルトの名無しさん :02/10/23 01:36
素人だからswitchの存在忘れてたの。
結局 char a[] = "abc" は char a[] = { 'A', 'B', 'C', '\0' } に同じ
これは丸暗記するしか無し
で
char a[] = "abc"; /* Statement1 */
char *p = "abc"; /* Statement2 */
となるとイメージ的にはこんな感じ
罫線多少ズレるけど許して
a[0] a[1] a[2] a[3]
.┏━━┯━━┯━━┯━━┓
a┃char.│char.│char│char.┃
.┗━━┷━━┷━━┷━━┛
Statement2 が ↑ ↑ ↑ ↑Statement1 が実行
実行されるたびに .│ │ │ │されるたびにコピー
. ┏━━━┓アドレスをセット ┌──┬──┬──┬──┐
p┃char * ┃←──────.│ 'A' │ 'B' │ 'C' │ '\0'.│←どっかの変更不能
. ┗━━━┛ └──┴──┴──┴──┘ なメモリ領域
p[0] p[1] p[2] p[3]
なお、a と p はそれぞれ配列型 (char[4]) とポインタ型 (char*) で全然別の型
でも関数とかに渡すと配列型はその最初の要素へのポインタ型 (この場合は
char*) に成り下がる
>>133 > sizeof(p)とsizeof(a)
この場合はどっちも 4 だからよくわからない
150 :
デフォルトの名無しさん :02/10/23 01:40
>>149 133 :デフォルトの名無しさん :02/10/23 01:09 >127 文字列の長さを変えて、sizeof(p)とsizeof(a)の値を比べてみると勉強になるよ。 ~~~~~~~~~~~~~~~~~~~~
153 :
デフォルトの名無しさん :02/10/23 01:45
>>149 ポインタが4バイトと決めてかかるなよぉ〜
>>140 0はいけないってことは、数列の最初の要素の添え字は1?
>>140 つくってみた。
俺の環境(4byte integer)だと添え字が100になる前にオーバーフロウしたよ(泣
157 :
デフォルトの名無しさん :02/10/23 01:52
>>140 int main()
{
int i, j = 1, k, f1 = 1, f2 = 1, fib;
while (1) {
scanf("%d", &i);
if (1 <= i && i <= 100) break;
puts("1以上100以下で入力して下さい");
}
j = 1; k = i;
while (k--) {
if (j == 1 || j == 2)
fib = 1;
else {
fib = f1 + f2;
f2 = f1;
f1 = fib;
}
j++;
}
printf("fib(%d) = %d\n", i, fib);
return 0;
}
>>156 、
>>158 32-bit の unsigned でも、46 あたりでもう Overflow するね
double でも 80 あたりから精度が足りなくなる模様
64-bit unsigned でも 93 で Overflow
問題作った人の気が知れない
俺の勝ちですか? とかいってみるテスト。
>>160 確かにオーバーフロウの可能性はないな(ワラ
でもプログラム作るときに自分で計算しないといけないぞー
電卓も桁が足りなくて使えないと思うし。
>>160 ソースをちゃんと完成させてから勝ち誇りなさい
みなさんありがとう!!
>>160 あなたのプログラムに "A" と入力していいですか?
ダサいかも知らんがゾーン 10 進でやった。 #define ZONE_DECIMAL_MAX_COLUMNS 32 #define ZONE_DECIMAL_MAX_BUF (ZONE_DECIMAL_MAX_COLUMNS + 1) void zd_SetUInt(char *DecValue, unsigned long NewValue) { char buf[ZONE_DECIMAL_MAX_BUF]; size_t l, i = 0; l = sprintf(buf, "%u", NewValue); memset(DecValue, 0x00, ZONE_DECIMAL_MAX_BUF); for(; ; ) { l--; DecValue[i] = buf[l] - '0'; if(!l) break; } }
void zd_Add(char *DecValue, char *AddValue) { size_t i; char Carry = 0; for(i = 0; i < ZONE_DECIMAL_MAX_COLUMNS; i++) { if((DecValue[i] += AddValue[i] + Carry) >= 10) { DecValue[i] -= 10; Carry = 1; } else Carry = 0; } }
char *zd_ToAscii(char *DecValue, char *StrBuf) { size_t i = ZONE_DECIMAL_MAX_COLUMNS; size_t j = 0; for(; ; ) { if(DecValue[i]) { for(; ; ) { StrBuf[j++] = DecValue[i] + '0'; if(!i) break; i--; } StrBuf[j] = '\0'; break; } if(!i) break; i--; } return StrBuf; }
int main(void) { char prev2[ZONE_DECIMAL_MAX_BUF], prev1[ZONE_DECIMAL_MAX_BUF], cur[ZONE_DECIMAL_MAX_BUF]; int i; char buf[ZONE_DECIMAL_MAX_BUF + 1]; zd_SetUInt(prev2, 1); zd_SetUInt(prev1, 2); printf("1:1 2:2 "); for(i = 3; i <= 100; i++) { memcpy(cur, prev2, ZONE_DECIMAL_MAX_BUF); zd_Add(cur, prev1); memcpy(prev2, prev1, ZONE_DECIMAL_MAX_BUF); memcpy(prev1, cur, ZONE_DECIMAL_MAX_BUF); printf("%d:%s ", i, zd_ToAscii(cur, buf)); } getchar(); return(0); }
結果 1:1 2:2 3:3 4:5 5:8 6:13 7:21 8:34 9:55 10:89 11:144 12:233 13:377 14:610 15:987 16:1597 17:2584 18:4181 19:6765 20:10946 21:17711 22:28657 23:46368 24:75025 25:121393 26:196418 27:317811 28:514229 29:832040 30:1346269 31:2178309 32:3524578 33:5702887 34:9227465 35:14930352 36:24157817 37:39088169 38:63245986 39:102334155 40:165580141 41:267914296 42:433494437 43:701408733 44:1134903170 45:1836311903 46:2971215073 47:4807526976 48:7778742049 49:12586269025 50:20365011074 51:32951280099 52:53316291173 53:86267571272 54:139583862445 55:225851433717 56:365435296162 57:591286729879 58:956722026041 59:1548008755920 60:2504730781961 61:4052739537881 62:6557470319842 63:10610209857723 64:17167680177565 65:27777890035288 66:44945570212853 67:72723460248141 68:117669030460994 69:190392490709135 70:308061521170129 71:498454011879264 72:806515533049393 73:1304969544928657 74:2111485077978050 75:3416454622906707 76:5527939700884757 77:8944394323791464 78:14472334024676221 79:23416728348467685 80:37889062373143906 81:61305790721611591 82:99194853094755497 83:160500643816367088 84:259695496911122585 85:420196140727489673 86:679891637638612258 87:1100087778366101931 88:1779979416004714189 89:2880067194370816120 90:4660046610375530309 91:7540113804746346429 92:12200160415121876738 93:19740274219868223167 94:31940434634990099905 95:51680708854858323072 96:83621143489848422977 97:135301852344706746049 98:218922995834555169026 99:354224848179261915075 100:573147844013817084101
573147844013817084101をコピーして、 電卓起動して、 貼りつけて、 log押したら21桁と言うことが分かりました。
>>165 (・∀・)イイ!
ゾーンなんて久しぶりに聞いたな…。
それ自体は別にダサくないと思うけど、インスタンスが配列むき出しなのはダサい。
じゃあ俺はパックでつくろう。
>>170 10 進で 21 桁という事は、2 進で何 bit あれば表現できる?
>>171 > インスタンスが配列むき出しなのはダサい
C++ ならともかく、C では仕方ないと思う。
それとも、struct で包めという話?
確かにそれなら、代入に memcpy() でなく = が使えるが。
ちなみに 167 は 全域 0x00 の DecValue を受けるとマズいな。
StrBuf[j] = '\0'; は return の直前だった。
実際、 169 + 143 が最強かもな。
宿題の解答にはなりえないという意味でもいいな
>>143
>>174 ああ、まさしく。
>>175 pow(2, 70) == 1180591620717411303424 で 22 桁。
これで 10 進で 21 桁を十分に表現できる。
普通に計算するなら 128-bit の int が必要という事だな。
pow(2, 312) は・・・とんでもない数字になるぞ。
8343699359066055009355553539724812947666814540455674882605631280555545803830627148527195652096
実に 95 桁、無量大数 pow(10, 88) をゆうに超える。
掘り起こし
>>60 > ファイル増えると管理が大変になるよ。
> でもファイル分けないと出来ないこともあるね。分かるかな?
ごめんねこれ分からない
分割コンパイルとかそういう事じゃないよね
178 :
デフォルトの名無しさん :02/10/23 18:21
char TEST(*temp) { char *a; char *b; a = GetA(temp); b = GetB(temp); } とやると、aとbの値が同じになるんですが、 どうすればいいでしょうか?
180 :
デフォルトの名無しさん :02/10/23 18:28
>>178 GetA() と GetB() の内容が示されないと何とも言えないし
もし両者が同じ挙動なら a と b が同じになるのも納得いくかも
でも最初の 「char TEST(*temp)」 って仮引数の型が指定されてなくて
コンパイルエラーになると思うし
そういえば return も無いね
184 :
デフォルトの名無しさん :02/10/23 18:32
学校で使用するためC++6.0をインストしたのはいいのですが、 どうしてもコンパイルすると 「ツールを開始できません。 この操作を正しく終了しました。 ツールを開始できません。 'vcspawn.exe' 実行時のエラーです。 ビルドを実行できませんでした。 test.obj - エラー 1、警告 0」 が、出てしまいます・・・。コンパイルしたプログラムはサンプルからとったので 間違えているはずがないのですが・・・ 何が原因だか教えてくれませんか?
>>184 インストールの仕方が間違ってる。
マニュアルを熟読すべし。
剰余の計算を long i=x/y; res=x-i*y; のようにやっているのをライブラリ関数のfmod(x,y)としたら 急に動作が遅くなってしまいました。 どのような理由が考えられるのでしょうか。
すいません・・・たしかに友達から借りたやつです・・・ やっぱり製品版買わないと正式に動かないのですか?
>>188 馬鹿者。
動く動かないの問題ではなく、それは犯罪だ。
>>182 char TEST(char *temp)
でした。。
returnは書き込むときに消えちゃったみたいです、
GetA()とGetB()の処理は全然違います。
でも、aの値がbの値になってしまうんです。
b = GetB(temp);
を消すと、aの値は正常に出るんですが、
入れると、aがbの値になります。
初心者ですみませんがよろしくおねがいします。。
>間違えているはずがないのですが・・・ この学習姿勢
192 :
デフォルトの名無しさん :02/10/23 18:55
プロセスの使用メモリ量を調べたいのだが、 int getrusage(int who, struct rusage *usage); ってものの、rusage構造体のどのメンバーを 調べればよいか知っている方いませんか? manみても、よくわからんし、 ru_maxrssかなぁなんて思っていたのだが、机上計算と違う値を返すし。
今、線形リスト研究中・・・。
http://www.cs.u-gakugei.ac.jp/~miyadera/LECTURE/ElecBook2/ptech20.htm while( current=getmemory(), scanf("%d", ¤t->data) != EOF )
/* 24 */ {
/* 25 */ previous->next = current;
/* 26 */ previous = current;
/* 27 */ }
while( scanf("%d", &temp) != EOF )
/* 22 */ {
/* 23 */ current=getmemory();
/* 24 */ current->data = temp;
/* 25 */ if( previous == NULL )
/* 26 */ head = current;
/* 27 */ else
/* 28 */ previous->next = current;
/* 29 */ previous = current;
/* 30 */ }
ここのEOFが、認識できません。previous=current;
とすると、末尾ソードを差し込むっていうのはわかって
ます。scanf()関数は、位置インジゲータを返さない
奴だというのはわかってます。
>>187 x と y は double?
なら fmod() 呼び出しのオーバーへッドくらいしか考え付かない
というより一度 long i を経由することで型変換のオーバーヘッドがあるはず
なんだけど・・・
x と y が long なら、fmod() 呼び出しで要らない型変換してるので遅い
というか x % y でいいとか
どれくらい違うの?
アセンブリリスティングは出せる?
コードがもうちょっとはっきりしないと何とも言えない
ちょっと露骨な言い方したコンパイラーが認識できなんじゃ なくて自分がEOFの流れがわからない。<<194
>>190 だ〜か〜ら〜
GetA() と GetB() の内容が示されないと何とも言えないし
return が消えてて関数終端の } が残ってるのは解せないけど
先に a を求めてるのにその後の b = GetB(temp); のせいで a が変わるとすれば
GetA() は temp を返しててかつ GetB() 内部で temp を変更してる?
想像ではこれ以上辿れないよ
>>190 が言ってる意味を推測してみた。たとえば
char *GetA(char *p)
{
return strcpy(p, "漏れはA");
}
char *GetB(char *p);
{
return strcpy(p, "漏れはB");
}
という2つの関数があったとして、
それを
void test(void)
{
char *a,*b;
a = GetA(temp);
b = GetB(temp);
printf("%s", a);
}
のように呼び出すと「漏れはB」が表示されるということ?
だったらそれが当たり前なんだけど。
あ、1箇所余計なセミコロンが付いてしまった。まあいいか。
200 :
hiloshi :02/10/23 19:19
どうも。昨日も来たんですけど、 あれから自分なりに考えたんですがいい結果が得られません。 つくりたいプログラムは4つの配列に A、B,C,Dとそれぞれ初期化して 一つずつずらして表示するっていうものです。 ソースは次レスに
201 :
hiloshi :02/10/23 19:20
#include <stdio.h> void turn(char *a,char *b,char *c,char *d) { char *x=d; while((*d++=*c++)!=0) ; while((*c++=*b++)!=0) ; while((*b++=*a++)!=0) ; while((*a++=*x++)!=0) ; }
202 :
hiloshi :02/10/23 19:20
int main(void) { char anny[]={'A','\0'}; char bany[]={'B','\0'}; char chery[]={'C','\0'}; char domy[]={'D','\0'}; int i; puts(" anny bany chery domy"); puts("------------------------"); printf(" %s %s %s %s\n",anny,bany,chery,domy); for(i=1;i<=4;i++) { turn(anny,bany,chery,domy); printf(" %s %s %s %s\n",anny,bany,chery,domy); } return(0); }
203 :
デフォルトの名無しさん :02/10/23 19:20
>>197 tempはどこにあるの?
グローバル変数?
204 :
hiloshi :02/10/23 19:20
どこがわるいのか教えてくれませんか?
ああ、もう1つミスってるわ。 void test(void) の中 char temp[40]; /* サイズは適当 */ という変数を追加。
207 :
デフォルトの名無しさん :02/10/23 19:24
要するに、
>>190 の GetAもGetBも
引数で渡されたポインタをそのまま返すような関数
なんじゃないかな、と推測してみた。
>>193 まともなプログラム書きたいなら scanf() と gets() は絶対ダメ
scanf() やめて fgets() + atoi() 使えば
こんな感じで
char bug[256];
while(fgets(buf, sizeof(buf), stdin))
{
current = getmemory();
t->data = atoi(buf);
previous->next = current;
previous = current;
}
それと EOF って要するに入力の終わりを判定したいんだろうけど
例えば相手がキーボードだと打てば打つだけ続いて永遠に終わらない
適当に切り上げる条件付けなきゃダメ
あと行頭にコメントアウトで行番号入れるの見づらいし編集しづらいし
行挿入した時大変だし止めた方がいいよ
行番号を表示してくれるエディタを使えば幸せ
バグってる ×: char bug[256]; ○: char buf[256];
>>209 > 例えば相手がキーボードだと打てば打つだけ続いて永遠に終わらない
いいえ、Winだとctrl+z, Unixだとctrl+dで終わりますが何か?
>>211 そういうのを環境依存って言うんだよ
そういう話題を扱いたいならスレ違い
>>212 かわいそうな人だ・・・日常に余裕無いんだね。
214 :
デフォルトの名無しさん :02/10/23 19:41
A-D変換ボードから送られてくるデータを取り込む関数は何を使えばいいのでしょうか?
>>204 昨日の続きというと
>>86 の事かな
そうすると設問は
| char型の変数 anny, bany, chery, domy を宣言し、それぞれに初期値として
| 'A', 'B', 'C', 'D' を持たせる。
って書いてあるけどそれがどうして
> つくりたいプログラムは4つの配列に
> A、B,C,Dとそれぞれ初期化して
になっちゃうの?
C の前に日本語を理解してね
>>214 inb
でも
そういうのを環境依存
だから
そういう話題を扱いたいならスレ違い
だとおもうよ。
217 :
デフォルトの名無しさん :02/10/23 19:42
おいお前ら 204がかわいそうだろ 答えてやれよ そういうオレもめんどくさい
しまった!sage進行ですか?もしそうならすみません。
>>201 行と列の中をカウントするソースの一部です。
この中のfor文を利用して'A'+(i1+j1)のようにしてみては
どうでしょうか。 なお、i2とj2についてはユーザー指定です。
改行が、多すぎると( ゚Д゚)ゴルァでの全部かけません。
ij=i2*j2;
for(i1=0;i1<ij;i1+=j2){
putchar('\n');
for(j1=0;j1<j2;j1++){
i3=(len++)%j2;
p[i3][j1]=i1+j1;
printf("%3d",p[i3][j1]);
}
}
>>219 まさか。
どちらでもいいけど、質問ならageるべき。
>>213 はいはい、どうせ DOS と UNIX しか知らないんでしょ
>>214 その A-D 変換ボードの仕様書以外にそれを解決する情報は無いよ
223 :
デフォルトの名無しさん :02/10/23 19:46
inb? MSDNライブラリにでてないのですが…?
>>201 cとかbとかインクリーメントとされたあとに代入が行われているけどいいの?
>>217 215 の通り前提条件が間違ってる
だから 204 に答えるとしたら 「問題のとらえ方が悪い」
よって 201-202 のソースは添削しようが無い
char型の変数だっていっているのに、なぜchar型の配列をつくるんだろう・・
227 :
デフォルトの名無しさん :02/10/23 19:55
べつスレに書いてたのですが反応が無いのでこちらに転載します DLソフトのように取得した画像に番号を割り振ってフォルダに 保存していく機能を持たせるにはどんな感じのプログラムにすればいいのでしょうか? 房な質問ですみません。使用する関数を教えてもらえれば幸いです。 まだ、学習したてで、コンストラクタを使えば良いのか、ただ単にハンドル渡して 組み立てれば良いのか混乱しています。 よろしくお願いします。
228 :
hiloshi :02/10/23 19:56
>>226 すいません。よく分かってないもので。
char型の変数にいれるってことは
char a={'A'};
とかってことですか?
この時はヌル文字とかいらないんですか?
文字列の時だけヌル文字がいるんですか?
でもchar型の変数で表現できるのは2バイト文字だけですよね?
>>227 コンストラクタはC++とかでしょ?
Cにはないから他のスレッドにいって。
>>227 >まだ、学習したてで、コンストラクタを使えば良いのか、ただ単にハンドル渡して組み立てれば良いのか混乱しています。
どっちも突拍子のない気がするのは確かです。
もう少し勉強を続けてはどうでしょうか?
>>223 222 読んでね
実際に inb 使うかどうかき知らないよ
inb は <asm/io.h> で思い切り環境依存
>>227 あのね、ここは C のスレだよ
激しく弾けるほどスレ違い
>>228 >でもchar型の変数で表現できるのは2バイト文字だけですよね?
実装依存(藁が無ければ1バイトだけだと思います。
>>231 そうか?仕様言語がCカモしれん。
コンストラクタと言う言葉だけで判断するにはあまりにも彼は電波だ。
234 :
デフォルトの名無しさん :02/10/23 19:59
コンストラクタを使わなくても大丈夫です。 大体どんな感じのプログラムになるのかだけでも教えてもらえませんか? イメージがわかないんです。
>>222 > はいはい、どうせ DOS と UNIX しか知らないんでしょ
プッ、DOSもUNIXも知らない人が必死です。
>>200 答えだけ示す、理由は自分で考えろ
ヒント:while((*d++=*c++)!=0)実行後、dとcは何処を指している?
void my_strcpy(char *a, char *b)
{
while((*a++=*b++)!=0)
;
}
void turn(char *a,char *b,char *c,char *d)
{
char *x=d;
my_strcpy(d, c);
my_strcpy(c, b);
my_strcpy(b, a);
my_strcpy(a, x);
}
>ヒント:while((*d++=*c++)!=0)実行後、dとcは何処を指している? 指してる先をインクリメントしてるのでdもcも指してる場所は変わらないと思われ。
239 :
デフォルトの名無しさん :02/10/23 20:00
>>212 なんでここで環境云々の話になるんだ?
そもそもfgets使ってる時点で思いっきり環境依存なのだが。
>>238 ん?
ポインタをインクリメントして、インクリーメントする前のポインタが指さしているところを間接参照しているんじゃないの?
C言語使ってる時点で環境依存です。
>>240 ごみん。食べるスパゲティは好きなんだけどね。
そういうのを環境依存って言うんだよ そういう話題を扱いたいならスレ違い
>>235 193 には 209 で答えたよ
第一 220 は何をやってるか分からないし、215 は読んだ?
>>239 > そもそもfgets使ってる時点で思いっきり環境依存なのだが。
(゚Д゚)ハァ?
なんとか教えてもらえませんか? すれ違いなのは分かってるんですがVC++関係のスレがいま寂れてて まともなレス返ってこないんですよね…
>>246 C++スレッドがあるでしょ(^_^;)
>>234 > 大体どんな感じのプログラムになるのかだけでも教えてもらえませんか?
sprintf(fname, "hoge%04u.jpg", i++);
fp = fopen(fname, "wb");
fclose(fp);
どうもです。
未 定 義 の 次 は 環 境 依 存 か
252 :
デフォルトの名無しさん :02/10/23 20:06
>>243 激しく同意。
標準入出力なプログラムの話題は別スレでやれ。
253 :
デフォルトの名無しさん :02/10/23 20:07
>>246 スレ立てるまでも無いへ逝けばたいてい答え出る。
254 :
デフォルトの名無しさん :02/10/23 20:07
処理系依存、環境依存、未定義 ネタはつきないぜ(*^_^*)
>>246 まともなレス返ってこなくて当たり前だよ
あのね、あんたの用件は VC++ スレでもスレ違いだよ
なぜならあんたは言語について訊いてるんじゃなくて
ソフトの設計について訊いてるんだから
>>255 最近はまともなのが付いてるけどな。
CodeWarrior時代は苦労した。
C は ク ソ 言 語
262 :
デフォルトの名無しさん :02/10/23 20:10
>>249 ありがとうございます。参考にさせていただきます。
>>253 ありがとうございます。そちらでもきいてみます。
スレ違いでご迷惑かけました。答えてくれた方ありがとうございました。
>>247 C++スレでも無駄だと思う…
>246
なんていうか、スレ違いとかそう言うレベルじゃないと思います…。
とりあえずK&Rなりストラウストラップ本でも読んでください。
>>260 そのOSでな。
UNIXのコンソールからDOSにパイプでデータ送れたりしたら認めるが。
>>261 それは同意するが、Cを使わないとできないようなことがあるのも事実。
Cを使わないとするとアセンブラレベルに降りないとならなくなるし、
だから便利ではあるのよ。
標準入出力は環境依存とか言ってる逝ってる人のいるスレはここですか?
がーん! printfもスレ違いなの?
まいったねこりゃ
>>266 どこでもprintfが使えると信じてるうちは幸せだ。
270 :
デフォルトの名無しさん :02/10/23 20:13
printf("Here is Hell World);
>>267 printf("%s\n",NULL);の結果は処理系依存だす。
>>269 アフォ
標準ライブラリが使えないのは環境依存だ
スレ違いは言い過ぎだったが後に引けなくて困ってる様子を思い浮かべるスレ
別に買い換える必要はないよね?
>>272 標準ライブラリが使えるか使えないかは環境に依存する。
276 :
デフォルトの名無しさん :02/10/23 20:15
俺のティンポは環境依存ですが何か?
sizeof(TIMPO)の値は処理系依存だな。
サイズではなく臭いが
>>275 だからといって標準ライブラリは使えないという前提で話を進めるとものすごいことになる。
>>270 文法エラー: 文字列リテラルが終了していません。
>>275 そんな事はわかっている。
しかし規格の上では定められてるものなんだから、このスレで扱ったって
いいだろう。
しかしキーボードから EOF を打つ方法や A-D 変換ボードなんてのは規格で
決まってないだろう。
そういうのを環境依存と言うんだ。
>>276 良し。
ANSI C または ISO Cでないプログラム言語を 「C言語」と強弁している人がいる人がいるスレはここですか?
>>279 そうそう。
大部分の質問に「環境依存だからでてゆけ」と答えないといけなくなる(涙
標準入出力の話は別スレでやれと言われたのですが、どのスレでやればよいのでしょうか? これ以上スレ違いだとバカにされるのはまっぴらなので教えてください。
>>284 C言語を使うならここでいい。
他の言語で標準入出力を扱うのならば、適切なスレッドで。
とマジレスしてみる。
strlen とか memcpyとか malloc なんかはここでも可でしょうか?
>>287 209 は特に間違っていない。
でなければ処理系に依存しないキーボードの EOF の判定方法を呈示してみろ。
> 適当に切り上げる条件付けなきゃダメ って代替案を促してるのが狭量なのか?
キーボードから入力しても必ず終了させられるコードを書いてみてよ。 ただし決まった回数ループすると終了するというものはだめだよ。
294 :
デフォルトの名無しさん :02/10/23 20:30
kokosogasemai
マジレスだけど、 209=280だとすれば、彼の言ってることも納得できる。
>>293 ただの煽り。ちょっと遊んであげればすんだのにね。
まぁ、冗談を解する余裕もない心の狭い
>>209 だからこそこの偉業を達成できたと。
偉業といえば、俺はNULL論争を起こしたことがあるぜ。 そんなつもりはなかったのに(涙
>>292 Cにはキーボードなどは規定されていない、
しかし、たいがいのOSにはキーボードからEOFを検出できる仕組みがある。
例えばWinだとctrl+z, Unixだとctrl+d
209はCについては間違っていないが、OSの知識は無知だったという結論でいいか?
>>211 もわざわざ「Winだと〜、Unixだと〜」って依存を前提に書いてるんだから
大目に見てやれよ
>>290 だから、そういう態度が狭量だって言うんだよ。
一般的なUNIXとDOSでキーボード入力でEOF発生できるという情報が出たんだからいいじゃん。
他の環境でのEOFを発生方法知ってるのならそれを提示してくれればいい。
わざわざ環境依存だ云々いって切り捨てなくてもいいと思うけどね。
#ちなみに、EOFの判定方法はfgetsがNULLを返したときだね。
未定義などのネタが当分出てないから、みんな飢えてるのかもな
>>299 >Cにはキーボードなどは規定されていない、
そのための標準入力か。勉強になる。
>>209 さん、もうすぐ100レスです。そろそろ降参してください。
ごめんね でも環境に依存するようなコードをここで呈示するのは極力避けるべき だと思うのね 間違ってる?
>>194 レスどうも。
unsigned long modulo(unsigned long x,unsigned long y) {
unsigned long res;
long i=x/y;
res=x-i*y;
return (res);
}
これなんですが。この関数を呼ぶのをやめて単純にfmod(x,y)に
したのですが・・・。暗号化のために累乗と剰余を頻繁に行う
プログラムなのですが剰余をfmodに変えたら
4倍時間がかかってしまいました。
%については失念していたのでこれも試そうと思います。
ありがとうございました。
>>305 常識の範囲である程度認めてあげてよ。
常識って何と言われたら何もいえなくなるけど
308 :
デフォルトの名無しさん :02/10/23 20:36
質問者の環境に合わせたコードでいいと思うが。
>>305 「ctrl+zはCではEOFを表す!」って言ってるわけじゃないんだから。
Winではそうだね、よかったね、って話なんだから。
310 :
デフォルトの名無しさん :02/10/23 20:38
>>228 やりたいことは
ABCD
DABC
CDAB
BCDA
とか
ABCD
BCDA
CDAB
DCAB みたいな結果を得たいんだと思うけど
それなら一つの配列に入れたほうが簡単だと思うが
>>308 だね。
今まではある程度の環境依存なら環境を示せといってきたし
>>301 > 適当に切り上げる条件付けなきゃダメ
って代替案を促してるのが狭量なのか?
ってもう一回書かなきゃダメか?
209 は fgets() での EOF 判定方法もちゃんと提示している。
その辺を読み取れない方が狭量じゃないのか?
>>305 前提をちゃんと挙げていた。
って言うか荒らしに反応する人も荒らしです。
317 :
ヘタレエンジニア :02/10/23 20:40
流体解析ソフトを動かすため、Visual C++ 6.0とやらを オベンキョ しなければならないのですが、「VC++」で数値計算させ るために参考となる良い本がわかりません。 なんか、データベース用とか、ダイアログがどうした、とか、そんなの ばかりが書店に溢れています。 変な質問ですが、こんな僕のためにお答えしていただける、奇特な方が おられたら、神と崇めたいと思います。
>>312 UNIXとDOSでのEOF発生方法を「環境依存だ」と言って切り捨ててるところをいってるのだが。
>>317 多分、今の流れを見てのネタだと思うけど、
それは参考書スレッドでやって。
俺間違っているかな?(T_T)
>>317 「C言語」 「入門」 で検索してください。
あと勝手に崇められると迷惑だと思います。
>>318 つまり漏れが目くそで 318 が鼻くそ
ヘタレエンジニアに崇められてもな。
324 :
ヘタレエンジニア :02/10/23 20:45
>>320 いえ、Windows板の方にここを教えてもらって、C言語とスレ名にあるから
ここに書き込んだまでです。
「推薦図書/必読書・・・」というスレでよろしいでしょうか。質問ばかり
ですいません。
326 :
ヘタレエンジニア :02/10/23 20:52
>>321 ありがとうございます。試してみまふ。
>>325 ありがとうございます。早速、書きました。
しかし、なんだかんだ言われている2ちゃんねるですが、物凄い有用な
サイトですね・・・。
327 :
hiloshi :02/10/23 20:58
すいません。また質問です。 char型の変数をprintfで表示するための変換指定子はなんですか? %dでやると、JISコードの値が出てしまう・・
>>327 %c
つか、これくらいは聞くなよ。参考書読め。期待してるんだから頑張れよ。
>>327 > JISコードの値
おそらくAsciiコードかShift_Jisコードだと思うんだが
ところで文字コードも環境(以下略
char anny = 'A', bany = 'B', chery = 'C', domy = 'D'; puts(" anny bany chery domy"); puts("------------------------"); printf(" %c %c %c %c\n", anny, bany, chery, domy); printf(" %c %c %c %c\n", domy, chery, bany, anny);
332 :
hiloshi :02/10/23 21:41
すいません。今度はもっと上級な質問をします。 でもオレの持ってる本には文字列は詳しく書いてるんですけど 文字のことはさっぱりで・・・。 でもここのおかげで少しずつわかってきたんで みなさんに感謝多々です。
>>332 >すいません。今度はもっと上級な質問をします。
じゃなくて、ある程度自分で調べてから質問しろよってこと
335 :
hiloshi :02/10/23 21:46
ある程度調べるってことで、ここで質問してるんですよ
336 :
hiloshi :02/10/23 21:48
あとコードの事ですけど、 オレの持ってる本はJISコードという文字コード体系が広く普及してる って書いてあるんだけど、これは間違ってんの?
>>335 ある程度調べる、じゃなくて
ある程度 *自分で* 調べる、だ。
>>336 それは間違っていない。
が、広く普及してるからと言ってあなたの環境もそれを採用しているかどうかは
別の話だ。
>>335 「調べる」 と 「訊く」 の区別は大丈夫か?
341 :
hiloshi :02/10/23 21:56
あーうぜーなお前ら どうせ禿げたオタクばっかだろ 黙って質問に答えてればいいんだよ それくらいしか能のないんだから 先生気分ですか?じこまんですか? どうぞ死んでください。
BMPファイル情報表示は完成したのですが、 画像ファイルの白黒化を教えて頂きたいです。 malloc()関数を使い、8・24ビットカラー画像どちらでも 変換できるといったように。 どなたか、ご親切な方のサンプルソースをご教授願いたいです。 /* #include */ #include<stdio.h> #include<stdlib.h> //exit用 #include<conio.h> //getch用 #pragma pack(1) //構造体メンバを1バイトサイズの単位に設定 /* ファイルヘッダ構造体型 */ typedef struct tagBITMAPFILEHEADER { unsigned short bfType; //フォーマットの種類を表す数値(Windows BMPの場合 0x4D42) unsigned long bfSize; //ファイルサイズ unsigned short bfReserved1; //予約領域(0) unsigned short bfReserved2; //予約領域(0) unsigned long bfOffBits; //ファイル先頭からのバイト数で表したイメージデータの位置 } BITMAPFILEHEADER;
/* 情報ヘッダ構造体型(BMPファイル独自のヘッダ) */ typedef struct tagBITMAPINFOHEADER { unsigned long biSize; //情報ヘッダのサイズ(40) long biWidth; //画像の幅(ピクセル単位) long biHeight; //画像の高さ(ピクセル単位) unsigned short biPlanes; //プレーン(レイヤー)の数(通常1) unsigned short biBitCount; //1ピクセルあたりのビット数と画像の種類(下記補足参照) unsigned long biCompression; //圧縮の種類(下記補足参照) unsigned long biSizeImage; //イメージデータのみのバイトサイズ unsigned long biXPelsPerMeter; //横軸画素数/メートル(省略値0) unsigned long biYPelsPerMeter; //縦軸画素数/メートル(省略値0) unsigned long biClrUsed; //画像中で使用されている色数(RGBQUADの個数) //画像タイプの最大発色数と同じ場合は0 unsigned long biClrImportant; //画像を表示する上で重要な色の数、すべての色が重要な場合は0 } BITMAPINFOHEADER; /* カラーテーブル */ typedef struct tagRGBQUAD { unsigned rgbBlue; //青の輝度 unsigned rgbGreen; //緑の輝度 unsigned rgbRed; //赤の輝度 unsigned rgbReserved; //Must be zero } RGBQUAD;
/* プロトタイプ宣言 */ void printBmp(BITMAPFILEHEADER fh,BITMAPINFOHEADER ih); //BMPファイルのヘッダ情報の表示 void readBmp(char *filename,BITMAPFILEHEADER *fh,BITMAPINFOHEADER *ih); //BMPファイルのヘッダを読み込む /* main start */ void main(int argc,char *argv[]) { BITMAPFILEHEADER bfh; //ファイルヘッダ構造体 BITMAPINFOHEADER bih; //情報ヘッダ構造体 char *filename; filename = argv[1]; readBmp(filename,&bfh,&bih); printBmp(bfh,bih); if(argc!=2) { printf("\nコマンドライン引数エラー!\n"); //コマンドライン引数の確認 exit(1); } fopen(argv[1],"rb"); } /* main end */
/* BMPファイルのヘッダ情報の表示 */ void printBmp(BITMAPFILEHEADER fh,BITMAPINFOHEADER ih) { printf("<<ファイルヘッダの内容>>\n\n"); printf("ファイルタイプ = 0x%X (BM)\n",fh.bfType); printf("ファイルサイズ = %d バイト\n",fh.bfSize); printf("予約領域1 = %d",fh.bfReserved1); printf(" 予約領域2 = %d\n",fh.bfReserved2); printf("オフセット = %d バイト\n\n",fh.bfOffBits); printf("<<情報ヘッダの内容>>\n\n"); printf("情報ヘッダのサイズ = %d バイト\n",ih.biSize); printf("画像の幅 = %d ピクセル\n",ih.biWidth); printf("画像の高さ = %d ピクセル\n",ih.biHeight); printf("プレーン数 = %d\n",ih.biPlanes); printf("ビット/ピクセル = %d bpp\n",ih.biBitCount); printf("圧縮の種類 = %d (RGB)\n",ih.biCompression); printf("イメージデータサイズ = %d バイト\n",ih.biSizeImage); printf("横軸画素数/m = %d pixel/m ×",ih.biXPelsPerMeter); printf(" 縦軸画素数/m = %d pixel/m\n",ih.biYPelsPerMeter); printf("使用色数 = %d",ih.biClrUsed); printf(" 重要色数 = %d\n\n",ih.biClrImportant); return; }
/* BMPファイルのヘッダ情報を読み込む */ void readBmp(char *filename,BITMAPFILEHEADER *fh,BITMAPINFOHEADER *ih) { FILE *fp; /* ファイルオープン */ printf("\n入力ファイル : %s",filename); if((fp=fopen(filename,"rb"))==NULL) { printf("\nオープンエラー!\n"); exit(1); } printf("\n\n"); /* ファイル読み込み */ fread(&(fh->bfType),sizeof(fh->bfType),1,fp); fread(&(fh->bfSize),sizeof(fh->bfSize),1,fp); fread(&(fh->bfReserved1),sizeof(fh->bfReserved1),1,fp); fread(&(fh->bfReserved2),sizeof(fh->bfReserved2),1,fp); fread(&(fh->bfOffBits),sizeof(fh->bfOffBits),1,fp);
fread(&(ih->biSize),sizeof(ih->biSize),1,fp); fread(&(ih->biWidth),sizeof(ih->biWidth),1,fp); fread(&(ih->biHeight),sizeof(ih->biHeight),1,fp); fread(&(ih->biPlanes),sizeof(ih->biPlanes),1,fp); fread(&(ih->biBitCount),sizeof(ih->biBitCount),1,fp); fread(&(ih->biCompression),sizeof(ih->biCompression),1,fp); fread(&(ih->biSizeImage),sizeof(ih->biSizeImage),1,fp); fread(&(ih->biXPelsPerMeter),sizeof(ih->biXPelsPerMeter),1,fp); fread(&(ih->biYPelsPerMeter),sizeof(ih->biYPelsPerMeter),1,fp); fread(&(ih->biClrUsed),sizeof(ih->biClrUsed),1,fp); fread(&(ih->biClrImportant),sizeof(ih->biClrImportant),1,fp); fclose(fp); getch(); }
341 について謝罪しない限り hiloshi は放置
350 :
hiloshi :02/10/23 21:59
ところで皆さんはポインタを習得するのに どれくらいかかりました?
トリップ必須だなっと
352 :
hiloshi :02/10/23 22:00
>>349 オレじゃないよーー!!!
誰だーーー!!!
341=349
hiloshiは本物偽者どちらもウザい
まずは、その本のその部分を正確に抜粋して貰わないことには、 ナントモ言えない。
>>350 ポインタ単独ではそんなに時間がかからなかったが
それはメモリのアクセス方法とかアセンブラについての
基礎知識があったわけでそれを含めると結構時間がかかってると思う。。
>355は
>>336 に対して。 リロード忘れてウトゥ
>>350 トリップつけろや。ニセモノもつけてくるかもしらんが、
内容で本物かどうかはある程度判別つくんで心配すんな。
で、どの程度で習得できたといえるのかがわからんなあ。
ポインタは指すものと思っておけばいいんじゃないか。
あるメモリ領域があって、ポインタはそこを指してる。
頭のなかでポインタからその領域に向かって矢印が出てるとイメージすりゃいい(w
360 :
hiloshi :02/10/23 22:08
じゃちょっと抜粋します。犯罪っぽいですけどね。 「C言語での文字とは、その文字に与えられたコードすなわち整数値である。ただし、たとえ同じ文字であっても その値はプログラムの実行環境によって異なる可能性があります。より具体的には、プログラムが実行される 環境で採用されている文字コードに依存した値になります。 日本で広く普及しているパソコンの多くはJISコードという文字コード体系が利用されていますので これを例にとって解説しましょう。」 って感じです
>>350 ポインタはある日突然閃いたかのように分かるので、習得期間は不定。
実は「JIS X 0201コード」の略という罠、、、なら、正しい。 ASCIIコードに対抗するJISコード(典型的には、バックスラッシュと 円の違いを主とする)なわけで。
363 :
hiloshi ◆W2li6n5Xa6 :02/10/23 22:19
こんな感じでw 何も書かないのもあれなんで、ちょっと質問いいですか? ほんと考えたんですけど、わかんないんです。 void turn(char *a,char *b,char *c,char *d) { char *x=d; *d=*c; *c=*b; *b=*a; *a=*x; } っていう風にしますよね? 最初の、ポインタxの宣言のときにポインタdのアドレスをいれて そのあとどんどん入れ替えていきますよね。 それで最後にaにもとのdの値をいれようとしても、 xはポインタだから、もう既にcの値が代入されたdをxに代入しますよね? こういう時に、もとのdの値を関数内でちゃんと保存する方法ってないんですか?
>>360 あとは書名と著者と出版社とページを挙げれば引用の範疇になるから大丈夫。
で、その記述はなんとも不完全なような気がする。
色々推測するとして、
・その本はMS-DOSが全盛の時代に書かれた
・そうすると広く普及してるパソコンというのはNECのPC-98x1シリーズに該当するだろう
・確かにPC-98x1シリーズでは、text vramではJISコードを用いていた
だから、状況を限定すればその記述も間違いとはいえないような気がするが、
Cの参考書としてはよろしくないな。
日本で現状広く普及してるパソコンにはWindowsが乗っていて、
こいつが通常扱う文字コード体系はShift-JISかUnicodeだ。
365 :
デフォルトの名無しさん :02/10/23 22:20
getservbyname.cの一節にこのようなものがあるんですが while ( (p = getservent()) ) { if (strcmp(name, p->s_name) == 0) なんでnameとp->s_nameを比較してるんでしょうか ちなみに本をよみながらやってるんですが その本のサンプルプログラムには getservbyname(argv[1],"udp") として呼び出してありこのプログラムの実行例は # ./a.out 1024 こうで nameには"1024" p->s_nameには"rtmp" などのポインタが入ってます 全然ちがうものを比較してるようにみえるのですが なぜでしょうか?
366 :
hiloshi ◆W2li6n5Xa6 :02/10/23 22:21
>>xはポインタだから、もう既にcの値が代入されたdをxに代入しますよね? すいません。間違えました。 xはポインタだから、もう既にcの値が代入されたdを、aに代入です
367 :
hiloshi ◆W2li6n5Xa6 :02/10/23 22:23
>>364 それらを書いた方がいいって事ですか?
でもたぶん98シリーズの事を言ってるんだと思います。
それ系の本を書いてる人みたいだし。
書かれたのは1999年ですけど。
>363 char x = *d; ... *a = x;
>>363 dの指してる先の中身を保存したいんだろ。xにdを保存してどうするよ。
dの指してる先に'Q'があったとして、
d--------->'Q'
こんな状態。で、char *x = d;をやると、
d--------->'Q'
x----------^
xも同じ所を指すようになる。
そうじゃなくてやりたいことは'Q'そのものを保存したいんだろ。
だったら、char y = *d;とやるべきだ。
370 :
hiloshi ◆W2li6n5Xa6 :02/10/23 22:27
>>368 そうですね。基本ですね。あんなに悩んだ自分がばかみたいです。
すいません。お手数かけました。
>>367 うん、書いたほうがいいと思う。
んで、その記述だけで本全体を判断するのは危険だが、
少なくともその部分の記述はウソと言ってもいい。忘れたほうがいい。
372 :
hiloshi ◆W2li6n5Xa6 :02/10/23 22:32
じゃあ書いておきます。 書名:定本 明解C言語 著者:柴田望洋 出版社:ソフトバンク社 ページ:200ページ です。
今、線形リスト研究中。 typedef struct __node{ charname[20]; chartel[16]; struct __node *next; }Node; typedef struct { Node *head; Node *tail; }List; 以下略 void Insertnode(List *list,const char *name,const char *tel) { Node *ptr=list->head; list->head=getmemory(); strcpy(list->head->name,name); strcpy(list->head->tell,tell); list->head->next=ptr; } void Appendnode(List *list,const char *name,const char *tel) { Node *ptr=list->tail; list->tail=getmemory(); strcpy(ptr->name,name); strcpy(ptr->tel,name); ptr->next=list->tail; } 以下略 先頭へのノード挿入 末尾へのノード挿入
list->head->next=ptr;とptr->next=list->tail ptrは、もちろんノードの省略の意味だけど。 微妙に、変化した記述の意味がわからん。
>>365 getservbyname.c って何
>>365 その結果、引数で指定したサービスが見つからないことが期待されるのか
どうかでいろいろ変わってくると思うのだが。
>>374 日本語勉強して
何かわからないのか分からない
「微妙に、変化した記述」 って何を指すの
じゃあ!!数学的に答えます。 ○->■に指すことは、積と表す事にする。 list->head->next=ptr;a*b*c=A ptr->next=list->tail;A*c=a*b; (A=a*b)としているが全部省略したら 同じ意味を指すので省略しないこととする。 ちなみに、headとtailの区別は考えてる。 この微妙な変化に、ソートの真髄があるんじゃ ないかと考えている。
380 :
デフォルトの名無しさん :02/10/23 23:10
それってソートなん?
> (A=a*b)としているが どこをどーしたら、そうなるん?
>>378 何か数学的なのかちっとも分からないし
「○->■に指すことは、積と表す事にする」 って定義が全然生きてないし
「微妙な変化」 がつまり何を指すのかやっぱり分からないし
どこにもソートになるような記述は無いし
結局何を訴えたいのかさえ
電波キタ─wwヘ√レvv〜(゚∀゚)─wwヘ√レvv〜─!!
385 :
デフォルトの名無しさん :02/10/23 23:19
readでfopenしたテキストファイルをeofになるまでfgetsするプログラムを作ったんですが、 Win2kとWin98で動きが違って困ってます。 現象としては、CRLFのみの行を取得しようとした時 Win2kでは普通に読んでくれるんですが、 Win98だとeofになってしまいます。 何故eofになってしまうのかがよく分かりません。 申し訳ありませんが、ご存じの方がいらっしゃいましたらご教授下さい。
>>380 いずれにせよ、システムコールとはちと違うと思うが。
>>383 ね だったら、この掲示板に全部ソース書いていいのか。
その一部分で、意味理解しないこと自体おかし。
日本語ちゃんと読んでる。 そう考えても自然じゃないの(積)
カンシャク持ちだねヽ(*`Д´)ノゴルァ
388 :
デフォルトの名無しさん :02/10/23 23:29
文字列の数字をint型の数字に変えたいんですけど、javaみたいに一発変換できる関数ないですか?
390 :
デフォルトの名無しさん :02/10/23 23:34
391 :
hiloshi ◆W2li6n5Xa6 :02/10/23 23:39
>>342 みたいにいきなり長いコードをコピペするのも荒らしに近いなぁ
もう寝るは、おやすみ!!
電波サッタ─wwヘ√レvv〜(゚∀゚)─wwヘ√レvv〜─!!
>>385 テキストの途中で読み込みが止まってしまうのは、元ファイルに EOF コード '\x1A'
が混じっている等がありますが、そりは Windows 3000 でも一緒だったはず。
よくわからないので、再現する最低のコードを示せませんか?
う・・・Windows 3000 カコイイ・・・
398 :
デフォルトの名無しさん :02/10/24 00:02
>>385 こんな感じです
FILE* fpHoge;
char cHogeData[256];
char* cRet;
bool bRet = true;
if ((fpHoge= fopen("C:\\hogehoge.txt","r")) == NULL){
return;
}
while(bRet!=false){
memset(cHogeData, 0x20, sizeof(cHogeData));
cRet= fgets(cHogeData, 256, fpHoge);
if(cRet == NULL){
if(ferror(fpHoge)!=0){
fclose(fpHoge);
return;
}
if(feof(fpHoge)){
bRet = flase;
continue;
}
}
}
fclose(fpHoge);
400 :
デフォルトの名無しさん :02/10/24 00:07
>>399 なぜcHogeDataを0x20で埋めるのかサパーリわからん。
>>400 変数を使う前にクリアするのが癖なのです
でも、これが原因じゃないですよね?
while(fgets(cHogeData),sizeof cHogeData,fpHoge){ /* いろいろ */ } じゃだめなのか?(^_^;)
>>401 0x20ってASCIIでは空白だっけ?
空白でクリアする理由がわからない。
この場合はクリアする理由さえわからないけど。
>>402 元々コボラーなので、この書き方好きじゃないんです。
もしかしてこの辺に問題有り?
>>404 だから、再現する最低のコードを示してくれないと何もわからないってば〜。
>>399 問題となる現象は、CRLFだけの行を読んだときに
fgetsがNULL返して、ferrorがエラーなしで、feofがEOFだと言う
ということでいい?
誤爆スマソ
このエラーの意味がわかりません error C2664: 'CallWindowProcA' : 1 番目の引数を 'int (__stdcall *)(void)' から 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 VC++6.0 win98 です
>>408 ポインタが指すものが違う。
キャストして。
411 :
デフォルトの名無しさん :02/10/24 00:16
>>408 1 番目の引数を
'int (__stdcall *)(void)' から
'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)'
に変換できないってことだよ。
>>410 とりあえず
>>402 の方法でやってみて。
/* いろいろ */というところにprintf("%s",cHogeData);とでもいれて。
>>412 ありがとうございます。
自宅に98マシンが無いので、明日試して報告します。
あ、ループ抜けたらfcloseしてね。
>>410 405 は誤爆でしたゴメンナサイ。
399 のコードまんまで再現せず。
(当方 Windows 98 SE、VC++6SP5)
テストデータの方がおかしいのでは。
>>415 当方もWindows 98 SE、VC++6SP5です。。
データのeofになってしまう部分をhexで見たら
0d0a0d0aだったのですが。
(前後3バイトを付けると 6161220d0a0d0a303030)
もう一度データも洗ってみます
>>416 うーん・・・
そのデータを使ったテキストでも、やっぱり再現しない。
399 への転記ミスとかと違う?
416 の環境で、399 まんまのコードは動く?
ああ、まんまと言っても while 終了の直前で printf("%s", cHogeData) してね。
>>417 確かに
>>399 はここに載せる為に若干手を加えているので
これをそのまま動かしたって訳じゃないですね。
こちらも、試してみます。printf付きで
ありがとうございます
ダブルポインターって何ですか? あと、ポインタが変数のアドレスを格納するのは分かるのですが、実際に はどういう時に使うのですか?
>>420 > ダブルポインター
**p のようなものと思われ。
ポインタ変数を指すポインタ。
> 実際にはどういう時に使うのですか?
memset() とか scanf() とか使ったこと無い?
あんな風に呼び出し元の変数の値を変えたい時に使う。
あと、リンクリストとか作る時、
struct List
{
char data1[4];
int data2;
struct List *next;
}
とかやる。
>>420 ( `Д) <ポインタのポインタ。
/(ヘ つ )ヘ 2次元配列もどきを作るときに使ったり、
ポインタの値そのものを変更する関数のパラメータに使ったり・・・
あ、後半はポインタの使用法か・・・ スマソ。
>>420 例えば、FILE *fi があったとして、これを他の関数で代入したい時、
f(fi); ではもちろんだめで、f(&fi); となる。
ところで、この関数のプロトタイプは
void f(FILE **fi);
となって、ポインタのポインタとなる。
int main(int argc, char **argv)
427 :
デフォルトの名無しさん :02/10/24 04:01
memsetって**を使う? **といったら真っ先にstrtolを思い浮かべるんだけど。
よく見てなかった。 ダブルポインタの利用法じゃなくて、ポインタの利用法か。
420 の書き込みは、どうも罠が多い。
3次元配列を2次元配列に代入したいんですが n3_data[6][7][8]; n2_data[7][8]; ~n3_data初期化の処理 memmove(n2_data,n3_data[0],sizeof(char)*6*7); でよいのでしょうか?
>>430 いいんじゃない?
ただ、そんなところで悩むのなら
for(i = 0; i < 7; i++){
for(j = 0; j < 8; j++){
n2_data[i][j] = n3_data[0][i][j];
}
}
にしたほうがいいとおもうが。
>>431 ついつい自分の実力でできないようなので,やろうとしてしまう癖があるんですよ
ありがとう
char num[10]={1,-1,0} char num[10]={1,-1} どっちでも,あとの配列は0で初期化する?
434 :
デフォルトの名無しさん :02/10/24 13:22
437 :
デフォルトの名無しさん :02/10/24 13:25
北海道静内郡静内町 北海道十勝郡浦幌町静内
すみません。unionがredefinition だと叱られます。 怖くて修正できません。どうすればいいでしょうか? 以下エラーです。 gcc -DHAVE_CONFIG_H -I. -I. -I. -I. -I. -g -O2 -c -o src/ipc/semtool.o `test -f 'src/ipc/semtool.c' || echo './'`src/ipc/semtool.c In file included from src/ipc/semtool.c:38: /usr/include/sys/sem.h:93: field `sem_perm' has incomplete type src/ipc/semtool.c:42: redefinition of `union semun' src/ipc/semtool.c: In function `createsem': 略 make[1]: Leaving directory `/tmp/cygutils-1.1.2' make: *** [all] Error 2
-------------------------------------------------------------------------------- ura@V:$ sed -n 93,101p /usr/include/sys/sem.h struct ipc_perm sem_perm; /* permissions .. see ipc.h */ time_t sem_otime; /* last semop time */ time_t sem_ctime; /* last change time */ struct sem *sem_base; /* ptr to first semaphore in array */ struct sem_undo *undo; /* undo requests on this array */ ushort sem_nsems; /* no. of semaphores in array */ }; -------------------------------------------------------------------------------- ura@V:$ sed -n 42,52p src/ipc/semtool.c union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ ushort *array; /* array for GETALL & SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ void *__pad; };
>>438 semtool.c 内でunion semunを定義してるからじゃないか?
48〜52行目をコメントにしてみるとどうなる?
>>438 何をコンパイルしようとしてるのか知らんが、正しくconfigureできてないのかも。
char a[]; char b[10]; とあって、 str(a,b)はエラーですよね?aにメモリ確保してないから。さらにaは大きさ10じゃなかったらやっぱり駄目ですよね?
>>446 じゃなくて、char a[]; そのものがコンパイル通らないだろ。
>>447 *aはよくてもa[]は駄目なんですか?何故?
>>446 グローバルならコンパイル通るかもね
その場合は (char *) 型になるし
内容は何指してるかわからないからダメダメ
450 :
デフォルトの名無しさん :02/10/24 17:48
>>448 初期化が必要だからじゃないのか。
char a[] = {"hogehoge"};
みたいに
>>450 最初a[]がどこか変なところを指しているのはわかってます。だからmallocでも使ってヒープとらないといけないんじゃないか?という質問なんですが。
配列名に代入できないと思うが
>>451 C-FAQの「配列とポインター」を読むこと。
>>453 この件は C-FAQ に載っていない。
>>451 char a[] と定義する時、関数内であるならばそれはポインタではなく配列であり、
char a[] = "hogehoge"; のような初期化を要求することを意味している。
(450 の初期化は間違っている)
だから 447 の通り 「char a[]; そのものがコンパイル通らない」。
定義がグローバルである場合、それは extern char a[]; と等しく、配列ではなく
ポインタになる。
つまり、char *a; と宣言した場合に等しい。
なお、関数内でも extern char a[];と書いた場合はポインタになる。
>>454 > (450 の初期化は間違っている)
別に間違っていない。
> 定義がグローバルである場合、それは extern char a[]; と等しく、配列ではなく
> ポインタになる。
それは C++ の話で、C の場合はやっぱりコンパイルエラー。
>>451 要は、ポインタ使いたいなら a[] なんててせずに、素直に *a と書きなさいってこった。
>>454 > 定義がグローバルである場合、それは extern char a[]; と等しく、配列ではなく
> ポインタになる。
> つまり、char *a; と宣言した場合に等しい。
激しく間違い
C FAQを見たことはあっても、意味を理解できない阿呆は
以下の文章を16回声に出して読んでみろ。
6.1:
Q: あるソースファイルでchar a[6]と定義して、別のファイルで
extern char *aと宣言した、なぜこれはうまくいかないのか。
A: extern char *aという宣言が、実際の定義と食い違うからである。
「タイプTへのポインター」は「タイプTの配列」とは異なる。
extern char a[]を使え。
http://www.catnet.ne.jp/kouno/c_faq/c6.html
458 :
デフォルトの名無しさん :02/10/24 18:33
いやー見てて面白いなぁ。たかが言語ごときに苦労してやがる。レベルひくぅ
>>459 > これがCスレの恐ろしさか・・・
その通り、ジ○ンプのこ○かめと同様です。
ま、配列とポインタは全く別のものだというこった。 同じものとは考えないほうがいい。 同じものとして扱える局面はあるが、根本的には別のものである。 混乱に拍車をかけてるのは関数の宣言で、 void foo(char str[]); なんてできてしまうことだ。この場合「だけ」は例外でstrはポインタになる。 それ以外で、[]をつけて宣言した場合は全部配列だ。
462 :
デフォルトの名無しさん :02/10/24 18:57
>>459-460 まぁ、そのくらい住人が多いし初心者も気軽に質問できるってことですよ。
ていうか、前スレのことは全然気がつかなかった。
答える方もレベル低いからレスもあてにならんがな(w
466 :
hiloshi ◆W2li6n5Xa6 :02/10/24 19:15
どうも。 質問とかじゃないんですけど、以前、ソースの中身を気にしろって 事を言われたので、チェックして欲しいなと思いまして。 ちゃんと実行はされるんですけど、もっといい書き方があったら 教えて欲しいです。 作ったプログラムは、車を移動するってやつです。 今オレが使えるものを駆使しましたw この程度ですが、どうかお願いします。
467 :
hiloshi ◆W2li6n5Xa6 :02/10/24 19:15
#include <stdio.h> /*mycarの座標*/ typedef struct { int x1; int y1; }point; /*車(mycar)*/ typedef struct { double fuel; point p; }car; /*X方向にx2、Y方向にy2移動*/ void move_car(car *a,int x2,int y2) { a->p.x1+=x2; a->p.y1+=y2; }
468 :
hiloshi ◆W2li6n5Xa6 :02/10/24 19:16
/*車の状態を表示*/ void print_sub(car a) { printf("現在位置 x:%d\n",a.p.x1); printf(" y:%d\n",a.p.y1); printf("残り燃料:%.1f\n\n",a.fuel); } int main(void) { car mycar; /*車*/ int sel; int x,y; /*移動距離*/ double use_fuel; /*移動して消費した燃料*/ puts("■車移動プログラム■"); mycar.p.x1=mycar.p.y1=0; mycar.fuel=1000; print_sub(mycar);
469 :
hiloshi ◆W2li6n5Xa6 :02/10/24 19:16
while(1) { do /*selが1か0でない時は繰り返す*/ { printf("移動しますか(Yes/1 No/0):"); scanf("%d",&sel); }while(sel!=1&&sel!=0); if(sel==1) { puts("移動距離を入力してください。"); printf("X方向:"); scanf("%d",&x); printf("Y方向:"); scanf("%d",&y);
470 :
hiloshi ◆W2li6n5Xa6 :02/10/24 19:16
use_fuel=((x*10)+(y*10))/7; mycar.fuel-=use_fuel; if(mycar.fuel>=0) /*燃料が残るなら動かす*/ move_car(&mycar,x,y); else /*残らない時はその旨を表示して、燃料を戻す*/ { puts("\n燃料不足で移動できません。\n"); mycar.fuel+=use_fuel; } print_sub(mycar); } else /*selが0の時、プログラムは終了へ*/ break; } return(0); }
typedef struct { double fuel; point p; }car; のpは,ポインタと間違われる可能性がある あと,コピペの仕方が見にくいです スペースを入れてくらはい
あと,テキストファイルとかに書いてうpした方がいいと思われ そして,すれ違い感が漂っている
473 :
hiloshi ◆W2li6n5Xa6 :02/10/24 19:22
>>472 >テキストファイルとかに書いてうp
ってどういう事ですか?
あとすれ違い感って
スレ違いってことですか?
474 :
デフォルトの名無しさん :02/10/24 19:23
∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ̄ ̄( ゚Д゚) ̄ ̄| < もう寝るよ。おやすみ。 |\⌒⌒⌒⌒⌒⌒\ \ | \ \  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \ |⌒⌒⌒⌒⌒⌒| \ |_______|
CとC++てなにがちがうの?
全部
C; C+=1;の違い
char box[10][12]; char *GetAdr() { int i; for(i=0;i<12;i++) box[0][i]=1; return box; } void main() { int i; char *pbox; pbox=GetAdr(); for(i=0;i<12;i++) printf("%d\n"pbox[0][i]); } いろいろとエラーが出てしまいます。 どのようにすればいいでしょうか?
char** pbox;
char *GetAdr()も問題のようなんですが
char **GetAdr()になおしましたが, return box; の時にどうすればいいのかわかりません。
??
>>479 > いろいろとエラーが出てしまいます。
> どのようにすればいいでしょうか?
エラーが出たらエラーメッセージが指摘していることを直せ。
基本だ。
それをしようとしないで人に訊くだけなら迷惑だからプログラミングするな。
return (char **)box;
エラーメッセージは環境依存
489 :
デフォルトの名無しさん :02/10/24 20:28
人が折角聞いてんだからさっさと答えろやカス
>>466 間違えて文字入力した時の対策をしてくれ
この世の終わりまで回り続けるところだった
くだらないことで上げてしまった ・・・鬱だ氏のう
お題:構造体をいちいちtypedefするのってどうよ?
初歩的な質問ですいません。 puts()関数やstrcpy()関数などは 配列の先頭のアドレスを渡すだけで 配列全体にアクセスできるんでしょうか? puts()関数の内部的動きを教えて下さい。
訂正 初歩的な質問ですいません。 puts()関数やstrcpy()関数などは 配列の先頭のアドレスを渡すだけで 配列全体になぜスできるんでしょうか? puts()関数の内部的動きを教えて下さい。
>>493 a[0]='m';
a[1]='n';
a[2]='\n'`;
\nが見つかり出力はそこで終わり
>>493 なんでマニュアルを見ないんだろう・・・・
putsもstrcpyも配列内に\0が見つかるまで永久に処理を続けるの。
498 :
デフォルトの名無しさん :02/10/24 20:32
ZettonのHNはそこらの掲示板で見るのだが・・・。
これだから窓際なんだ・・・
C?( ´,_ゝ`)プッ
503 :
デフォルトの名無しさん :02/10/24 20:36
>>496 putsは\nを見つけても処理を終えないけど・・・・
>>496 により、文字配列の終端子は'\n'ということが証明されますた
>>496 ヌル文字のことを言っているのでしょうか?
>>505 fgetsの仕様とごちゃまぜにした。に190円。
#include<stdio.h> void func(int arg[]); main() { int a[]= { 0,1,2,3 }; func(a); /* この時、関数にはaの先頭のアドレス が渡されると思うんですが、 その場合、ユーザー関数の引数は ポインタ変数じゃないといけない、 などいろいろな矛盾が出てくるんです。*/ } void func(int arg[]) /* この時、ユーザー関数の引数には何が入っているのでしょうか? */ { arg[0]=10; arg[1]=11; arg[2]=12; arg[3]=13; printf("%d %d %d %d",arg[0],arg[1],arg[2],arg[3]); } お願いします。
その質問の仕方は・・・。 やはりあのZettonか
>>492 > お題:構造体をいちいちtypedefするのってどうよ?
宣言の時にいちいち struct つけなくていいからそうする
>>479 なんといっていいか、おそらくこういうことをやりたいんだろう。
二次元の配列をパラメータでやり取りするときはこうやる。
boxがポインタ型になったときはは(char**)じゃないぞ。(char (*)[12])だ。
---
#include <stdio.h>
char box[10][12];
char (*GetAdr())[12]
{
int i;
for(i=0;i<12;i++)
box[0][i]=1;
return box;
}
int main()
{
int i;
char (* pbox)[12];
pbox=GetAdr();
for(i=0;i<12;i++)
printf("%d\n", pbox[0][i]);
return 0;
}
>>507 > void func(int arg[]) /* この時、ユーザー関数の引数には何が入っているのでしょうか? */
&a[0]
513 :
デフォルトの名無しさん :02/10/24 21:00
>>507 printf("%d %d %d %d",a[0],a[1],a[2],a[3]);
func(a);
printf("%d %d %d %d",a[0],a[1],a[2],a[3]);
で検証しないいけないんじゃなかろうか。
>>512 構造体宣言の時に 1 回だけ typedef するのと、構造体定義のたびに struct を
つけて回るのとどっちがいい?
>>512 あとはFILEみたいに構造体であることを使用者が知らなくてよいものをつくるときとか。
それならひとつの型とした方が自然。
>>506 '\0' との区別がついていないに \240-。
>>511 アドレスは
ポインタ変数にしか入れれないんじゃないでしょうか?
>>507 もしかしてさ、仮引数におけるvoid arg*とvoid arg[]はまったく同じだということをしらないとか?
void arg*じゃなくてvoid *arg
>>515 FILEは使用者がメンバを使うわけじゃないからいいけど
メンバを使う場合は構造体であることがわかりやすい方がいいんじゃないかなぁ。
>>520 俺はそう考えてメンバーにアクセスするときはtypedefしないようにしているよ。
あまり受け入れられないスタイルだけど(^_^;)
522 :
主婦のサークルで〜す :02/10/24 21:15
>>470 とりあえず、ざっと見た感想を。
燃料が足りるかどうか判別するのは、move_carの中でやったほうがよくないか?
で、move_carが返す値で燃料が足りてるかどうかmainで表示する。こんな風に。
#define MOVE_EMPTY_FUEL 1
#define MOVE_NORMAL 0
int move_car(...) {
:
if (燃料が足りない)
return MOVE_EMPTY_FUEL;
:
return MOVE_NORMAL;
}
int main() {
:
switch (move_car(...)) {
case MOVE_EMPTY_FUEL:
puts("\n燃料不足で移動できません。\n");
exit(0);
break;
みたいな感じ。
あと、print_subという名前はあまりよくないような気がする。
print_carとかね。できるだけ名前は具体的なものをつけた方がいいと思うぞ。
Cの好きな主婦がいいです!
C言語のような主婦がいいです!
主婦でありさえすればCなんてどうでもいいです!
int a; /* いろいろ */ if(a==1||a==2||a==3||a==4){ /* いろいろ */ } これは switch(a){ case 1: case 2: case 3: case 4: /* いろいろ */ } と書くべきですよね?
if (0 < a && a < 5) と書くべき。
あ、連番だとそうなるか・・・ じゃあ、、、 int a; /* いろいろ */ if(a==1||a==2||a==4||a==5){ /* いろいろ */ } これは switch(a){ case 1: case 2: case 4: case 5: /* いろいろ */ } と書くべきですよね?
名前間違った 529だ
知るか、勝手にしろボケ。
534 :
デフォルトの名無しさん :02/10/24 21:29
switch厨死ね
主婦タン・・・
>>530 それ(switchの方)で良いんでねえの。
switch (var) {
case 1: case 2: case 4: case 5:
/* 処理 */
}
の方が見やすいかもしれない。その辺はお好みで
switchで、breakしないとそのまま続けて実行するのは便利なのか不便なのか。
>>538 お前の少ない脳でもちょっとは考えて発言しろや
便利に決まってんだろ。ヴォケ
質問というか、アドバイスお願いしたいのですが、 下記のプログラムで、逆ポーランド表記は可能でしょうか? 確認手段がなく、頭の中で実行可能かどうかの判断もできないヘタレなもので。 #include<stdio.h> char stack[50],polish[50]; double v[50]; int pri[256]; int sp1,sp2; int main(void) { int i; char *p="逆ポーランド表記にする式"; for(i=0; i<=255; i++) pri[i]=4; pri['+']=pri['-']=1; pri['*']=pri['/']=2; pri['^']=3; pri['(']=5; pri[')']=0; stack[0]=0; pri[0]=-1;
sp1=sp2=0; while(*p != '\0'{ while(pri[*p]<=pri[stack[sp1]] && stack[sp1] != '(') polish[++sp2]=stack[sp1--]; if(*p != ')') stack[++sp1]=*p; else sp1--; p++; } for(i=sp1; i>0; i--) polish[++sp2] = stack[i]; for(i=1; i<=sp2; i++) putchar(polish[i]); } 誤字脱字等は自分でなんとかできますが、 何か決定的な間違いとかありましたらアドバイスを。
>>510 神
普通の書籍では,char (*GetAdr())[12]のようなことが書いていないので助かりました
>>522 主婦だぁ?
中学生以下でないと反応しません
>>531 if (0 < a && a < 5 && a != 3)
>>541 546 には従うな
&nbsp; にしろ
>>547 それ、ABONEのリンク先表示機能で見たとき死ぬほど読みにくい。やめてくれ。
>>541 数字が 2 桁以上になると実行結果が訳わからなくなる
>>548 そんな事は A Bone の作者に文句言え
547 に言うのは筋が違う
551 :
hiloshi ◆W2li6n5Xa6 :02/10/24 22:22
どうも。 一通り基礎はやったかなって感じです。 ファイルの入出力とかはまだなんで、新しい本を買いたいと思うんですが そこで、これが出来たら基礎はおkみたいな 問題出してくれませんか? テキストの問題とか、Web上のとかは一通りやってみたんで。 お願いします。ぺこり
>>551 「C言語による最新アルゴリズム事典」を立ち読み。
553 :
hiloshi ◆W2li6n5Xa6 :02/10/24 22:34
>>552 奥村晴彦
『C言語による最新アルゴリズム事典』
技術評論社,1991年,ISBN4-87408-414-1,2400円
ですか?
そのまんまやんっ、古典だねっ(かなり失礼(w)
555 :
hiloshi ◆W2li6n5Xa6 :02/10/24 22:36
出来れば金がかかんない方が・・・ 問題ないですかね?
立ち読みって書いてあるじゃろが〜
557 :
hiloshi ◆W2li6n5Xa6 :02/10/24 22:41
その場で覚えると!? ふふ。やってみますw
すみません。コピペしたらスペースが消えたみたいで…
>>549 さん
後輩の宿題なんで詳細はわからないのですが、
二桁以上の式はないようなので、その点は大丈夫かと思います。
アドバイスありがとうございます。
#include<stdio.h>
char stack[50],polish[50];
double v[50];
int pri[256];
int sp1,sp2;
int main(void)
{
int i;
char *p="逆ポーランド表記にする式";
for(i=0; i<=255; i++)
pri[i]=4;
pri['+']=pri['-']=1;
pri['*']=pri['/']=2;
pri['^']=3;
pri['(']=5;
pri[')']=0;
stack[0]=0;
pri[0]=-1;
sp1=sp2=0; while(*p != '\0'{ while(pri[*p]<=pri[stack[sp1]] && stack[sp1] != '(') polish[++sp2]=stack[sp1--]; if(*p != ')') stack[++sp1]=*p; else sp1--; p++; } for(i=sp1; i>0; i--) polish[++sp2] = stack[i]; for(i=1; i<=sp2; i++) putchar(polish[i]); } またやってしまった… 逆に迷惑だと思うので修正はひかえます…
562 :
デフォルトの名無しさん :02/10/24 22:58
金かけられ無いんならライオン本はだめか。
563 :
デフォルトの名無しさん :02/10/24 22:59
宿題スレ行ってみたら?
すみません。
でも
>>549 さんのレスをみると一桁なら大丈夫のようなので、
宿題スレにはいかなくても良いかな?と思います。
皆さんアドバイスありがとうございました。
>>564 待った、漏れは、詳細な検証はしてないぞ。
1+2 とか 1+(2+3) くらい。
しかし、本人の宿題を持ってくるだけでスレ違いなのに、後輩の宿題とは・・・。
564 もその後輩も気が知れない。
後輩は,美人です
567 :
hiloshi ◆W2li6n5Xa6 :02/10/24 23:20
今宿題スレに行き、即爆破しました。 fgetsってどう使うんですか? 実引数が3つありますよね? fgets(A,B,C)ってので、 それぞれどういう意味なんですか? あと上記だとCのところにstdinとあるやつも 意味不明ですた
march!
573 :
hiloshi ◆W2li6n5Xa6 :02/10/24 23:37
>>572 ありがとうございます。
ファイルはまだなんですよ。本に書いてる事は一通りやったんですが
一言も出てきませんでした。
だから今Cの解説サイトとか見て、ファイルIOの勉強します。
char box[10][12]; const char (*GetAdr())[12] { return box; } 可能?
575 :
hiloshi ◆W2li6n5Xa6 :02/10/24 23:41
あともう一ついいですか? Cを勉強しながらC++もやりたいなって思ってるんですよ。 今大学でやってるのはCだけなんですけど 来年からC++とJavaもやるんで、ちょっと予習しようかなって。 CとC++を同時に学ぶ事は何か問題ありますか?
一応言っておく。
>>572 のページはあくまでLinux用だからな。標準ではない拡張がなさ
れてる関数も多いから注意しとけよ。
>>575 C++ は、C を日本語と同じくらいスムースに使えないと手に負えないぞ。
C をベースにして拡張しまくった言語だから。
C++ コンパイラで C をコンパイルすることはできるが、それは C++ を学ぶとは
言わないし。
>>577 あー、この本いいっすよね。たまにバグがあるけど(w
おすすめの本です。
>>574 何を可能か訊きたいのかわからないが、コンパイルは可能だ。
>>575 それならCなんてやらずにC++やっとけよ。
582 :
hiloshi ◆W2li6n5Xa6 :02/10/24 23:59
>>578 じゃあやっぱりCをやりまくってから
移った方がいいですね。
やっぱもう一冊本買おうかなーって思うんですけど
「新C言語入門 シニア編」 ソフトバンク 林晴比古著
がおすすめだってよく書いてるんですが
この本持ってる人とかどうですか?
ObjectPascal(Delphi) -> Java -> C++がお勧め。
584 :
hiloshi ◆W2li6n5Xa6 :02/10/25 00:03
>>581 でも今学校でCやってるんすよ。
それが無かったら今すぐにでもC++いきたいんですけどねー。
ああ、やらされる感が・・・
>>582 その本タメよタメタメ!バグだらけだし、未だに古いCのスタイル
使ってるし。
んなもんガッコでC勉強してるフリして家でC++勉強しときゃいいんだよ。
587 :
デフォルトの名無しさん :02/10/25 00:26
だから!ハルヒコ本はやめとけと!あれほど!
あいつに1万以上投資した自分が情けない・・・
>>588 だって学校の教科書だったんだもん!!
今では開くことなくなったなぁ。役に立たないから。
マナたんハァハァだよな
麻〜奈〜
あんたらSMか
まなタンに縛られて鞭打たれてハイヒールで踏まれたいです。
マリオです
ルイージです
"591 :デフォルトの名無しさん :02/10/25 00:44" "マナたんハァハァだよな" "592 :デフォルトの名無しさん :02/10/25 00:47" "麻〜奈〜" "593 :デフォルトの名無しさん :02/10/25 00:49" "あんたらSMか" "594 :デフォルトの名無しさん :02/10/25 00:50" "まなタンに縛られて鞭打たれてハイヒールで踏まれたいです。" "595 :デフォルトの名無しさん :02/10/25 00:52" "マリオです" "596 :デフォルトの名無しさん :02/10/25 00:52" "ルイージです";
まぁ無難に600と
WIN3.1だなんて今の時代に・・・って01時30分かいっ!!!
>>599 まあ、先頭に char *dummy = とか書いてくれれば文法エラーではない。
604 :
デフォルトの名無しさん :02/10/25 02:39
1; これだけでもOKだろ? なんの意味もないから警告はでるかもしれないけど。
>>604 OK だ。
ところで、それで何をやりたい?
606 :
デフォルトの名無しさん :02/10/25 02:42
607 :
デフォルトの名無しさん :02/10/25 02:52
int main() {
"
>>602 の教訓を生かして、これからはコメントを定数として宣言します!!";
return 0;
}
604 :デ フォル トの
1; 名 無し さん
これだけでもOK :02/ 10 /2
なんの意 5 02 :39
605 :デフォ 味もなだろ? は
>>604 ルトのいから警告
OK だ。 ところで 名無しさん でるかもし
606 :デフォ 、それ :02/10/25 0
>>60 5 ルトので 何 をやりた れないけど。
>>602 が定 名無しさん い? 2:41
60 7 :デフ ォ 数だけ :02/10/25 0
in t ma in ルトの書くのは違
"
>>6 () { 名無 しさ ん 反だと 言っ て2:42
retu 02の教 :02/10/25
} rn 0; 訓を 生かして いるみたいだ から・・・
、これからは 02:52
彡 コメ ント を定数
彡 とし て宣 言し
彡 ま す!!";
(,,ノ゚д゚)ノ
つまらないかどうかは環境依存
つまらないってゆうか未定義
未定義かどうかは環境依存
612 :
デフォルトの名無しさん :02/10/25 05:25
環境依存ってゆうか未定義
未定義っていうか文法違反
マ板ってこんな下らないスレばかりなんですね。
614 が間違ったことを言った
本当は2ちゃんねるは全部こんな下らないスレばかり。
616 が知ったようなかぶりをこいていい気になっている模様 ミットモ(・A・)ナイ!
キャッチャーがミットもってないと困るよね。
俺がC言語を語ってやろうと思ったが、やめた。
620 :
hiloshi ◆W2li6n5Xa6 :02/10/25 10:15
もう一つ質問! Cで2冊目に買う本としてお勧めってあります?
Effective C++
>>620 K&R
この本が理解できれば、Cを使えると言ってもいいし、
C++に移行してもいいだろう。
本は買うのが勿体ないからWeb活用汁。 それでもってんなら聖書イットケ
やっぱりGoF本でしょう?
626 :
hiloshi ◆W2li6n5Xa6 :02/10/25 10:57
>>622 すいませんでした。
今度から調べます。
627 :
デフォルトの名無しさん :02/10/25 11:01
今まで調べてなかったのかよ・・・氏ねヴォケ
628 :
hiloshi ◆W2li6n5Xa6 :02/10/25 11:09
今更C言語ですか??( ´,_ゝ`)プッ
630 :
hiloshi ◆W2li6n5Xa6 :02/10/25 11:13
いまさらですよねーマジで。 9月くらいにHello World作りましたから。 でも来年からはJavaとC++が出来る!!
そんなもん自分で進んで勉強したらいいだろーが ガキ?
632 :
hiloshi ◆W2li6n5Xa6 :02/10/25 11:25
>>631 オレは本を読みながらやったほうが
技術も身に付くと思ってるので聞いているだけです。
634 :
デフォルトの名無しさん :02/10/25 12:35
#define MAX 100 ... char str[MAX] とする場合と char str[100] にする場合では何が違うんですか?どんなケースに使い分けるんですか?
実行スピードが関係してくるんだよ 出来るだけマクロ使ったほうが良い。
>>634 定数には名前を付けた方がわかりやすい。
って言うか、
hankei * PI * PIとhankei * 3.141592653589793238 * 3.141592653589793238の差。
後、値が変わったときの修正が一カ所ですむのも魅力。
637 :
デフォルトの名無しさん :02/10/25 12:41
thanks!!
638 :
デフォルトの名無しさん :02/10/25 12:43
char str[MAX] がグローバルだったり、参照回数が頻繁だったり、 要素数でいろいろ処理することがあれば、プログラムを改良する 時に、マクロ一箇所書きかえれば済むでしょ。
>>634 保守性が違う。
その100という数字を後で、1000に変えるとき、
MAXを1000に変えるだけで済むか、
その変数のスコープ内の100という値を1000に変えるか。
後者の場合、その変数とは無関係な100が存在している
可能性も考慮しなくてはならない。
>>635 漏れは実行スピードは変わらないと思ってたけど・・・。
>>634 プリプロセッサが書き換えるから実行効率は変わらん
保守性向上や、読む人に意味をはっきりさせるためにマクロをつかう
p[100] と q[100] だと 100 が同じ意味なのか偶然同じ数なのかが区別できん
643 :
デフォルトの名無しさん :02/10/25 12:48
今時こんな質問で懇切丁寧に答えてくれる香具師なんていないよ・・・ 真面目すぎ
>>643 マジックナンバーの問題って重要だと思うよ。
自分の主観的なイメージを周りに反映させようとしているの?
エゴだよ。それ。
645 :
デフォルトの名無しさん :02/10/25 12:51
厨房もまじめに厨房してくれるスレ
>>643 簡単な質問だから厨房がはりきってしまった
647 :
デフォルトの名無しさん :02/10/25 13:10
goto文に関する注意点でよく“ほとんど使われることが無い”とか“使うぐらいなら プログラムを見直すほうがよい”とかかれているんですが、どうして使わないほうが よいのでしょうか?房な私から見れば書式も簡単で使いやすいんですが…。
>>647 プログラムが死ぬほど読みにくくなるんです。
昔のは関数とかの垣根を無視してジャンプできたりしたんで。
安易にループから脱出すると読みにくいってことですか?
>>649 安易にループの中からループ開始前の行に戻れたりするんです。
x;
while(a == 0)
{
if(a != 8)
goto x:
}
後、順次、選択、繰返で構造化プログラムの制御は可能ってことになってるしね。
一つの命令でそれらを超えたことを出来るからね。
行儀の悪いおばはんみたいなもんだ。
651 :
デフォルトの名無しさん :02/10/25 13:21
ルール違反に近いということで。
652 :
デフォルトの名無しさん :02/10/25 13:24
>>649 たとえばソース中にifとかwhileとあってもプログラムの制御が
どこに飛ぶか一目瞭然だけど、
goto label;
とかあると、ラベルがどこにあるか探さないと制御がどこにいくか
分からないでしょ。
でかい関数のなかで、gotoが多数使われていると、追いかけるのが
なかなかたいへん。
653 :
デフォルトの名無しさん :02/10/25 13:25
654 :
デフォルトの名無しさん :02/10/25 13:57
ダミーのOwlMainを誤って使用しました。 っていたいなんなんでしょう? 誰か、おしえて〜〜
静的記憶域期間と自動記憶域期間、ファイル有効範囲とはなにか教えて ください。あと、静的記憶域期間はなんと読むのですか。
論争が起きそうな質問じゃないと満足できなくなった漏れはCスレ中毒の重症ですか
性的記憶とはなにの記憶で児童記憶とは(ry
>>657 JIS用語らしい。X3010に同じ語句があった。
>>658 じゃあ論争の火種を。
auto:宣言されたブロックとその子孫ブロック内でのみ生きられる。
static:プログラム終了まで居続ける。
>>661 そのままなので論争になりそうな気がしない。
static int sx=0;とint ax=0;の違いを教えて下さい。
関数の中か外か。
>655 ファイル有効範囲 auto:extern可 static:extern不可
シングルトン
このstaticってキーワード、変数の寿命を指定するのと(
>>655 の言うところの
「静的記憶域期間」)、名前のスコープをファイル内に限定するのと
(同じく
>>655 の「ファイル有効範囲」)、二つの違う意味を持つというのは
Cの言語仕様のよろしくないところだと思うんだが。
後者の意味のキーワードは"private"とかにすればよかったのに。
C++で使われてしまったのでもはや不可能だが。
#include<stdio.h> int fx=0; void func(void) { static int sx=0; int ax=0; printf("%3d%3d%3d\n",ax++,sx++,fx++); } int main(void) { int i; puts("ax sx fx"); puts("----------"); for(i=0; i<10; i++) func(); puts("----------"); return (0); } 上記のプログラムでaxの値が変化しない所が分かりません。
>>669 auto変数は関数に入るたびに初期化されるから。
static変数はプログラム開始時に一度だけ初期化されるだけ。
672 :
デフォルトの名無しさん :02/10/25 15:16
K&R2 §8.7 Example --- A Storage Alocator に、 malloc()とfree()を実現する方法が載っているらしい。 今課題中、近くに本がない 誰か、おしえて〜〜
char a[1024]; とあって、 strcpy(a,"hoge"); とすると自動的にhogeのあとに\0は入りますか?
674 :
デフォルトの名無しさん :02/10/25 15:18
即レスありがとうございます。
VC++のCRTのソース見ろ。
では char a[1024]; char b[1024] = "hoge"; で for(i=0;i<4;i++)a[i]=b[i]; の時は?
hoge
679 :
デフォルトの名無しさん :02/10/25 15:29
680 :
デフォルトの名無しさん :02/10/25 15:41
入んないだろ。
>>680 なんでそう言い切れるんだか理由を述べよ。
>>677 ネタですか?
先頭から4文字を自分で数えられないの?
論争の予感
>681=679 ネタというか、ひねくれ者ですか? 要するに確保時に a[4]がたまたま \0になっているかも しれないといいたいの?
>>685 それか静的変数だな。
ネタというか、アフォかと言いたい。
>>688 だからネタですか?
低レベルなネタなら他へ逝ってくれ。
>>690 =688=683=681=679
はネタなので放置。
おいおいどうして答えた方がネタなんだよ。
>>679 が静的を思いつかなくて悔しいからネタにしたがってんじゃねーの
>>692 お前の答えは幼稚なんだよ。
673と677はそういう主旨の質問じゃないだろうが。
それとも自作自演して喜んでるのか?
673=677=692=690=688=683=681=679 か。ネタなら少しは捻れよ。
>>695 自動か静的かによって答えが変わるんだから「かもしれない」で間違いではないだろ。
説明不足ではあるが。
> なんでそう言い切れるんだか理由を述べよ。 こんな煽りを入れるヤシに今更マジレスされてもな。
>>695 どういう主旨でどういう答えが幼稚じゃない答えなんだか示して欲しいものだが。
友人に聞いたら入らないそうです。 ってか荒れましたねw
よう知らんけど700突破━━━━(゚∀゚)━━━━ !!!!
入るか入らないかと聞かれたら「入らない」というのが答ではないのか?
>>677 のforループでは'\0'は入らないぞ。
入っているか? という質問であればそりゃ入っているかもしれないし入っていないかもしれない。
グローバルな配列って0クリアされたっけ?
>>708 される。ちなみにstaticな配列もグローバルスコープ、ブロックスコープ共に0クリアされる。
ローカル変数のみ初期化されないって言えば分かり易い。
>>710 厳密にはauto変数な、ってautoって言葉は規格から消滅したのかな。
staticでないローカル変数のみ初期化されない。
char a[1024]={0};としとけ
こんな低レベルなネタでこれほど盛り上がるとは... みんな飢えてんだな。 もっとマシなのをきぼーん。
char a[5]=""; char b[5]={};
char a[100]; /* 配列に空文字列をセットする3つの方法 */ strcpy(a, NULL); strcpy(a, 0); strcpy(a, "");
ネタです。
どう見てもネタ。 strcpy(a, 0); はありえない。文字列に数値をコピーて。
どうせなら3回転くらい捻ったネタきぼーん。
>>720 要するにNULLのことでしょ。(関数が宣言されていることを前提に)
いや、ネタはいらん。
ははーん。717=679 だな。 そのうち 717で書いたstrcpyは自作の関数(orマクロ)ですが、何か? とか言い出すぞ。
>>725 =726=728=729
ジサクジエンは放置(´・∀・`)
週末は厨房同士がにぎやかだな、っと。
何でも聞け!
>>722 が何を「要するに」と言っているのか気になる。
その関数でどういう動作を想定しているんだ。
>>720 数値って? strcpyは0を(char*)と解釈しますが。
厨房がネタにレスをすると墓穴を掘る法則
strcpy(a, ""); ならわかるが。
strcpy(a, { 'b', '\0' }); これも実は動くって知ってたか?
>>733 > その関数でどういう動作を想定しているんだ。
そんなことは知らんよ。というか、
ネタだろ というのを否定したわけじゃない。
> strcpy(a, 0);
> はありえない。文字列に数値をコピーて。
という書き込みに対して、
数値をコピーではなくNULLポインタを渡す動作でしょ
と言ってるだけ。
要するにNULL==0
>>737 動く動かない以前にコンパイル通らないんですけど。
%cat neta.c
#include <string.h>
int main(int argc, char * argv[])
{
char a[8];
strcpy(a, { 'b', '\0' });
return 0;
}
%gcc neta.c
neta.c: In function `main':
neta.c:5: syntax error before `{'
%
741 :
デフォルトの名無しさん :02/10/25 17:29
cygwinで、 tmpfile(); で作成したテンポラリファイルの中身を読み込みたいのですが やり方がわからないです。 ご教授願えないでしょうか?
>>739 細かい話をすると、ポインタが与えられる文脈で
0が出てきたらコンパイラはNULLポインタと解釈する。
だから、strcpyのプロトタイプが与えられてないときに、
strcpy(a,0) なんてやると0はどう解釈されるかわからない。
単に、strcpyにバイナリ0がわたるだけ。
プロトタイプが与えられているとNULLポインタが生成されて、
strcpyにNULLポインタが渡る。
規格ではNULLポインタがバイナリ0である保証はない。
(ただしほとんどの処理系はバイナリ0だと思う)
>>741 tmpfileのプロトタイプは
FILE *tmpfile(void);
であるから、読むときはfgetcとかfgetsとかfreadとかを使えばよろしい。
ただし、普通tmpfileを読む前には書いてるのが普通だから(じゃないと空)、
読む関数を発行する前にfseekする必要がある。
>>741 書き込んだあとでrewind()すればファイルポインタが先頭に戻るので、
書いた内容が読めます。
>743, >744 動きました、ありがとうございます。
strcpy(a, 0); を実行すると、0番地から始まる内容をCストリングと見なしてaに コピーしようとする。 0番地にアクセスした場合の動作は処理系依存。
748 :
デフォルトの名無しさん :02/10/25 20:27
Cで点を表示する関数ってなんですか? 円とか書けないんですか?
またNULL論争か。
>>748 printf("点円");
750 :
デフォルトの名無しさん :02/10/25 20:30
そういえば戻り値のない(void)関数をプロトタイプなしで使った場合、 a=func();はコンパイルが通りますよね。 これってどう動作するんですか? やっぱり未定義ってやつですか?
751 :
デフォルトの名無しさん :02/10/25 20:32
>>751 標準関数だけだと*と空白をつかって書き出すくらいしか・・・
753 :
デフォルトの名無しさん :02/10/25 20:36
>>752 標準関数以外を使えばできるとな
どんな関数でつか?
標準ではないから情報処理試験では線を引く関数などを独自に定義しているな。
>>753 正直しらん。
環境を書いてくれれば他の人が答えてくれるかも。
Windows2000です。
757 :
デフォルトの名無しさん :02/10/25 20:39
>>755 逆に言えば知らなくても大丈夫ってことか
それにしても何でないんだろな
いろいろ便利だと思うのに・・・
>>750 コンパイラはプロトタイプや定義の与えられてない関数があったとき、
その関数が返す値をintと仮定する。
これは古のCから引き継いだ仕様だ。
760 :
デフォルトの名無しさん :02/10/25 20:55
私はXPにBCCなんですが、 点を表示することは可能でしょうか?
>760 windows使ってる香具師はとりあえず猫みとけ。
6 2/1 05 7 63 :ユカ :0 5 21: どうも リ 、初めまし 0/2 このスレは、面 て。 すね。 itoku/ こ h t tp://www.h5 白いで e.jp/~gek htt p 4. .dion.n iyasu/ ht t ://www.h ne.jp/~gek ea/ h tt p://www.h5 dion. jp/~gek ir http p://www.h4 .dion.ne. p/~shinsetu/ ://www .pla .dion. ne.j nning -insti gato r.com/sile ntpeople/be 彡 st/inde x2.ht ml 彡 (,,ノ゚д゚)ノ
すげー、専用板まであるじゃん。
また貴様か!&&rrlo;!ろり懲はし少&&rlro;
ヽ \
/ \ \
∧_∧/
(;´Д`) i i i
/ ヽ _ i i i--、
./| | | |  ̄ ̄ ̄ |:::::|.
/ \ヽ/| | ノ__ノ..
/ \\| |
/ /⌒\ し(メ .i i i . .
/ / > ) \ ノノノ
/ / / / .\_ ザックザック
し' (_つ /:::::/::... /ヽ
; "ノ・ ./∴: / )i iヽ-、_へ ,ヘ
'',, : :―― / / i i i iヽ . ̄ ゙― ノ /
n_ _/; i .ノ / /ノ-' ̄ ゙ ― 、__ノ
_ノ 二二二、_( _Д_ ;)-ヽ_ノ-'
>>763 ゙ー ''~ ∨ ̄∨
767 :
デフォルトの名無しさん :02/10/25 22:08
はじめてのC
timeGetTime関数を普段使っているのですが,もっとせいのうのいい関数はあるのでしょうか?
せいのうのいいってのは1/1,000,000,000,000,000秒ぐらいの精度です。
>>770 RTCはそんなに高い精度持たないだろ。
もっと威勢の良い?
773 :
デフォルトの名無しさん :02/10/25 22:49
今ファイルの入出力をやってるんですが 「追加モードで "car.dat" をオープンする」 ってどういうことですか?
fopen(p,"car.dat","w+"); ?
776 :
デフォルトの名無しさん :02/10/25 22:54
>>775 なるほど。
r+とw+ってどう違うんですかね?
書き込んで読む込むのと
読み込んで書き込む?
逆か?
読み込んで書き込むのはわかりますけど、
書き込んでから読み込む必要ってあります?
777 :
デフォルトの名無しさん :02/10/25 22:54
777
セブンセブンセブン
779 :
mokorikomo :02/10/25 23:01
>770 そんな解像度のハードウェアが存在するのか?
7of9
>>770 2^(-15) or 10^(-15) Dotch?
782 :
デフォルトの名無しさん :02/10/25 23:09
784 :
デフォルトの名無しさん :02/10/25 23:28
これを実行したらおかしな事に・・ なんでかわかる? #include <stdio.h> int check_str(char *name) { char *end="end"; while((*name++)==(*end++)) if(*name=='\0'&&*end=='\0') return(1); return(0); }
785 :
デフォルトの名無しさん :02/10/25 23:28
int main(void) { FILE *fp; char maker[20],car[20]; int cc; fp=fopen("car.dat","w"); while(1) { printf("メーカ名を入力してください(終了条件/end):"); gets(maker); if(!check_str(maker)) { printf("車種を入力してください:"); gets(car); printf("排気量を入力してください:"); scanf("%d",&cc); fprintf(fp,"メーカ名:%s 車種:%s 排気量:%d\n",maker,car,cc); } else break; } fclose(fp); return(0); }
>>785 取りあえずstrcmp()って知ってるか?
787 :
デフォルトの名無しさん :02/10/25 23:33
788 :
デフォルトの名無しさん :02/10/25 23:34
>>785 思い出した!
stringヘッダのだ
文字列比較ってやっちゃな
790 :
デフォルトの名無しさん :02/10/25 23:35
>>785 動かしてみな。
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *fp;
char maker[20],car[20];
int cc;
fp=fopen("car.dat","w");
while(1)
{
printf("メーカ名を入力してください(終了条件/end):");
scanf(" %s", maker);
if (strcmp(maker, "/end"))
{
printf("車種を入力してください:");
scanf(" %s", car);
printf("排気量を入力してください:");
scanf("%d",&cc);
fprintf(fp,"メーカ名:%s 車種:%s 排気量:%d\n",maker,car,cc);
}
else
break;
}
fclose(fp);
return(0);
}
792 :
デフォルトの名無しさん :02/10/25 23:40
そしたらcheck_strは要らんね。 でもなんかね、二回目からのメーカ入力のところが 飛ばされるんだ。 一回目はちゃんと入力待ちになるのに、 二回目はなんねーんだよ。 なんなんだよこれはよー。
こっちの方がいいや。 #include <stdio.h> #include <string.h> int main(void) { FILE *fp; char maker[20],car[20]; int cc; fp=fopen("car.dat","w"); while(1) { printf("メーカ名を入力してください(終了条件/end):"); scanf("%s", maker); if (strcmp(maker, "/end")) { printf("車種を入力してください:"); scanf("%s", car); printf("排気量を入力してください:"); scanf("%d",&cc); fprintf(fp,"メーカ名:%s 車種:%s 排気量:%d\n",maker,car,cc); } else break; } fclose(fp); return(0); }
>>792 飛ばされるのは、scanf("%d", &cc); で残った改行文字が次の gets(); で
読まれるからだよ。
こういう場合は scanf("%s")にして、改行文字を飛ばせばいい。
795 :
デフォルトの名無しさん :02/10/25 23:42
一つ質問! なんでgetsじゃなくscanf? もしかして変な動作はgetsが原因?
>>795 ホワイトスペース文字 " ", "\t", "\n"は %c 以外での型指定文字では
読みとられないから。
gets()はホワイトスペース文字も読み込んでしまう。但し行末の改行文字
は"\0"に変えるけど。
797 :
デフォルトの名無しさん :02/10/25 23:46
今getsをscanfにしたら正常に動作しますた・・・。 やべー!どっちを使えばいいんだ! scanfはスペース読めないんだよね? しかも評判悪いし・・・。 でもなんでこのプログラムは getsじゃだめなんべか? わからんべ。 教えて欲しいだす。
>>797 >しかも評判悪いし・・・
何がだ?オーバーフローの可能性はgetsにもあるぞ?
>>797 基本的にはgets()とscanf()を混ぜるとよろしくない。どうしても
gets()を使いたいなら、全部gets()にして、最後のscanf()の
所をatoi()でコンバートすべし。
800 :
デフォルトの名無しさん :02/10/25 23:49
>>796 んー。
実行結果はこうなったんだよね。
メーカ名を入力してください(終了条件/end):HONDA
車種を入力してください:CIVIC
排気量を入力してください:1500
メーカ名を入力してください(終了条件/end):車種を入力してください:
排気量を入力してください:
a
メーカ名を入力してください(終了条件/end):車種を入力してください:end
たぶんgetsが原因だと思うんだけど
801 :
デフォルトの名無しさん :02/10/25 23:50
>>798 なんかね、C++の入門サイトみたいなとこに
「あの悪名高きscanf・・・うんぬんかんぬん」
って書いてあったよ。
しかもここの住人にもgets使えっていわれたし
ほれ。全部gets()。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *fp; char maker[20],car[20],buf[20]; int cc; fp=fopen("car.dat","w"); while(1) { printf("メーカ名を入力してください(終了条件/end):"); gets(maker); if (strcmp(maker, "/end")) { printf("車種を入力してください:"); gets(car); printf("排気量を入力してください:"); gets(buf); cc=atoi(buf); fprintf(fp,"メーカ名:%s 車種:%s 排気量:%d\n",maker,car,cc); } else break; } fclose(fp); return(0); }
803 :
デフォルトの名無しさん :02/10/25 23:52
すんまそん。勉強になりますただ。 田舎に帰るにはまだはやいんべ。んだ。 もう少しがんばりますんだ。んだ。(ほじほじ
>>801 このスレで勧めたのはfgetsじゃないのか
806 :
デフォルトの名無しさん :02/10/25 23:54
このスレじゃなかったんで。 fgetsってファイル入力の時に使うンでないの?
>>804 そうそう、このスレではfgetsとsscanfだったような。
fgets()をstdinに対して使うと安全だ。
#define gets2(s, n) fgets(s, n, stdin)
810 :
デフォルトの名無しさん :02/10/25 23:58
というかどのスレが一番いいんだあ!! 初心者のオレにはわからん! ちなみに前はC言語の事ならオレにきけ!とか 行ってますた 今度からここにしよう ところでsscanfとfscanfってどう違うン?
812 :
デフォルトの名無しさん :02/10/26 00:00
マクロね、はいはい。 で、stdinってのは標準入力ストリーム?だっけ? つまりキーボードね、はいはい。 で、1つ目が文字列でしょ?代入する。 2つ目は文字数?これがよくわかんねーんだが・・・ さあ、どする!!??
>>810 fscanf()もホワイトスペース文字を読み飛ばさないから都合悪いよ。
sscanf()はバッファにホワイトスペース文字が残っても捨てられるだけ。
>>812 char buf[20]; とかしてあって、
fgets(buf, 20, stdin); とすれば、bufの文字数を超えて読みとられる
のを防げる。
816 :
デフォルトの名無しさん :02/10/26 00:03
>>813 その辺の話はまだオレには早いみたいね。
全然わからん。
オレの聞いた感じだと、
\nをちゃんと改行として認識できる関数と、
認識できない関数を混ぜてつかったら危険だ!
だからそんな改行とかなんて、切捨てる関数を使え!!
って感じ?
>>816 ちょっとニュアンスが違うけど、だいたいそういうことです。
結論:iostream最強
819 :
デフォルトの名無しさん :02/10/26 00:07
あともう一つ!
>>811 >標準入力決め打ちか任意のファイルか。
sscanfがキーボードで
fscanfはどっちでもって事かい?
std::getlineを使えってこった。
>>819 fgets() + sscanf()がキーボード
fscanf()はファイル
という風にしておいた方がよさげ。
822 :
デフォルトの名無しさん :02/10/26 00:14
824 :
デフォルトの名無しさん :02/10/26 00:19
825 :
デフォルトの名無しさん :02/10/26 00:19
もう終わりね! また教えてもらったら 公開するさ おまえらがんばれ!
(;´Д`)ハァハァハァハァ
せっかくだが既に行ったことのあるサイトだ
828 :
デフォルトの名無しさん :02/10/26 00:21
829 :
デフォルトの名無しさん :02/10/26 00:23
そんな事よりお前ら Cの質問しろよ もっときぼん
830 :
C言語初心者 :02/10/26 00:30
質問です。 2chのトリップを演算するコードをどなたかCで書いていただけませんか? PHPだと、、 $name1 = $name; if(strstr($name,"#")){ $pass = substr($name, strpos($name,"#")+1); $pass = str_replace(',',',',$pass); $salt = substr($pass."H.", 1, 2); $salt = ereg_replace("[^\.-z]", ".", $salt); $salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef"); $name2 = substr($name, 0, strpos($name,"#")); $name = $name2." ◆</b>".substr(crypt($pass,$salt),-10)."<b>"; } こんな感じらしいですけど、これのC言語で書いたものを欲しいのです、、、 どなたか、お願いします。。。
831 :
デフォルトの名無しさん :02/10/26 00:31
>>830 crypt()がわからなければどうにもらならないのでは?
833 :
デフォルトの名無しさん :02/10/26 00:39
win32用のcrypt()もどっかに転がってるよ。 結局ラウンジで公開されてたツールつかってたけど。
835 :
C言語初心者 :02/10/26 00:43
>>834 まじですか?
ちょっとググって調べてみます。
836 :
デフォルトの名無しさん :02/10/26 00:48
トリップ作成プログラム の mktrip(Ver.0.03) は ソース付きだったよ Delphi + c だったけど
837 :
デフォルトの名無しさん :02/10/26 01:00
質問です 別プロセスの標準出力の内容を取得したいのですが どうやったらよいのでしょう? OutputDebugString() の出力内容は取得できたのですが printf()やらの内容の取り方がわかりません。 ちなみに「別プロセス」は完全に別(ソリティアとか notapad.exe )です。 ソースではなく、概要くらいでよいのでわかる人いらっしゃいますか?
WIN32APIスレに池
gccの場合、cryptって-lcryptオプションが必要なのよね。以前、小一時間悩んだ。
暗号化プログラムはアメリカやフランスの規制もあってか 切り離すようになったんでないのかな
そのためのパイプではないか。
Linuxならpopenを使ってリードモードでオープンか。 他はしらん。
とは言うものの、リードで使ったことないから間違っているかも。
>838 >841 >842 サンクスです。 めちゃめちゃ盲点でした(w ちょっとやってみます。
海でgets!
846 :
デフォルトの名無しさん :02/10/26 01:56
>>776 w+は前の内容はあれば捨てる。r+は捨てない。
837 は一体何をやりたいんだ? ソリティアやメモ帳は標準出力を吐いてるのか?
>>847 >>837 はそれをつきとめたんだよ、きっと!
・ソリティアの画→標準出力から画像バイナリ出力→BitBltで表示
・メモ帳→標準出力から(以下略
char *pass2trip(const char *pass) { char *s = (char*)malloc(strlen(pass)+3), *t, salt[3]; char *tr[2] = {":;<=>?@[\\=^_`", "ABCDEFGabcdef"}; sprintf(s, "%s.H", pass); sprintf(salt, "%c%c", s[1], s[2]); free(s); for (s=salt; *s; s++) if (*s < '.' || *s > 'z') *s = '.'; for (s=salt; *s; s++) { if ((t=strchr(tr[0], *s)) != NULL) *s = tr[1][s-tr[0]]; } s = crypt(pass, salt); return &s[strlen(s)-10]; }
850 :
デフォルトの名無しさん :02/10/26 03:40
#include <stdio.h> #include <stdlib.h> #include <string.h> #define __USE_XOPEN #include <unistd.h> int main(int ac, char **av) { char *trip; if (ac!=2) { printf("usage:%s pass\n", *av); exit(1);} trip = pass2trip(*(av+1));/* 変換 */ printf("%s\n",trip); return 0; }
851 :
C言語初心者 :02/10/26 03:45
>>849 おーすごい、早速いただきました。すばらしい。
ミスってるよ。 *s = tr[1][s-tr[0]]; *s = tr[1][t-tr[0]];
------ここから
char *pass2trip(const char *pass)
{
char *s = (char*)malloc(strlen(pass)+3), *t, salt[3];
char *tr[2] = {":;<=>?@[\\=^_`", "ABCDEFGabcdef"};
sprintf(s, "%s.H", pass);
sprintf(salt, "%c%c", s[1], s[2]);
free(s);
for (s=salt; *s; s++) {
if (*s < '.' || *s > 'z') *s = '.';
if ((t=strchr(tr[0], *s)) != NULL)
*s = tr[1][t-tr[0]];
}
s = crypt(pass, salt);
return &s[strlen(s)-10];
}
-------ここまで
検証してなくてスマンです。
./pass2trip hogehuga
qpAhStv0fs
今度は大丈夫の様。
http://pc3.2ch.net/test/read.cgi/tech/1020206592/130
あ、まだあるや。<バグ逝ってきます、鬱。ちゃんとテストしよ…。
>>855 あんまりサポートに専念すると若死にするよ。(藁
char *pass2trip(const char *pass) { char *s = (char*)malloc(strlen(pass)+3), *t, salt[3]; char *tr[2] = {":;<=>?@[\\]^_`", "ABCDEFGabcdef"}; sprintf(s, "%sH.", pass); sprintf(salt, "%c%c", s[1], s[2]); free(s); for (s=salt; *s; s++) { if (*s < '.' || *s > 'z') *s = '.'; if ((t=strchr(tr[0], *s)) != NULL) *s = tr[1][t-tr[0]]; } s = crypt(pass, salt); return &s[strlen(s)-10]; } これでどうかな? 折角なので。
>>858 あら、割れちゃったのかね。
まーなんだ、それが本人だったとしても違っていたとしても、
面白い質問だったり、真摯な質問だったりしたら漏れは答えるよ。
860 :
デフォルトの名無しさん :02/10/26 05:57
>>860 そうね。そのときはぐぐれだの本読めだの言うか
流して終わりにするよ(そうしてるし)。
>>847 VC++6.0の [ビルド]-[デバッグの開始]-[プロセスへアタッチ]
で任意のプロセスにアタッチした後、
アウトプットウィンドウのデバッグタブに出力される文字列群が取りたいなぁと・・・
何に使うかというと、仕事でも使うんだけど
市販のゲームとか見てるとなかなか楽しいです。
さすがにソリティアでは何も出てこなかったけど、
サカつくとかでは、さりげなくエラー出てたり、製作者の名前とか出てきたり。
スレと関係ないので sage
DbgView DbgMOn
864 :
デフォルトの名無しさん :02/10/26 07:50
ある一連の処理を、複数個並行して実行することになりました。 そこで、一つの関数の中でそれらの処理をできるだけ小さく分割して実行し、 上位ルーチンからコールを繰り返すことで完了させたいと思いました。 switch分を使い、staticな変数をcaseラベルに用いてプログラムカウンタ代 わりにし、それぞれのcase内には最小単位の処理を記述し、終わると自らcase ラベルを必要に応じて(条件分岐,ループ動作を含み)書き換えます。 上位ルーチンへは、caseラベルを返り値とすることで、現在のステータスを知らせ ており、上位ルーチンからは、caseラベルの初期化と、実行限界ラベルを受け取って 制御を行っています。上位ルーチンは、同時に実行したければそれらの下位ルーチンを 同じループの中で呼び出すことになります。 と、いうようなことをやっています。ひとりで書いているので変かもしれません。 しかし、冗長さの弊害がさけられず、switch文の使い方としても気持ちわるいものが あります。他に合理的なアプローチがあれば教えて下さい。よろしくお願いいたします。
構造体 関数ポインタ スレッド
>>864 > 終わると自らcaseラベルを必要に応じて(条件分岐,ループ動作を含み)書き換えます。
何を言っているのかさっぱり分からず
> しかし、冗長さの弊害がさけられず、switch文の使い方としても気持ちわるいものが
> あります。他に合理的なアプローチがあれば教えて下さい。よろしくお願いいたします。
どんな感じなのかまったく窺えないので、雰囲気をつかめる最小限のコードを晒せ。
マルチチャンネル? > ある一連の処理を、複数個並行して実行することになりました。 AAAAAAAAAA? ABCDEFGHIJ? わからん
>>866 あのね、わからないのはあなたのレベルが低いからっていう可能性
もあるかもだから、むやみやたらにさっぱりわからんとか書き込む
もんじゃないと思うよ。
半分煽り、半分マジレスね。
半分マジレスだってさ(ppp
∧_∧ ∧_∧
_( ´∀`) (´∀` )
三(⌒), ノ⊃ (
>>1 .) 糞スレは
 ̄/ /) ) | | |
. 〈_)\_) (__(___)
∧_∧ .∧_∧
( ´∀) (´∀` )
≡≡三 三ニ⌒)
>>1 .) 立てるなって
/ /) )  ̄.| | |
〈__)__) (__(___)
∧_∧ ,__ ∧_∧
( ´)ノ ):;:;)∀`)
/  ̄,ノ''
>>1 . ) 言ってるだろうが
C /~ / / /
/ / 〉 (__(__./
\__)\)
ヽ l //
∧_∧(⌒) ―― ☆ ―――
( ) /|l // | ヽ ヴォケがーー!
(/ ノl|ll / / | ヽ
(O ノ 彡'' / .|
/ ./ 〉
\__)_)
やい 871、漏れの白星パンチを盗むな。 あと 870 は何が言いたい?
>>864 switch文使ってるのになんとか限界って言うのは必要?
default:に飛ばすとか。
sub(int label){
switch (label) {
case ONE:hoge(&label);
case TWO:huga(&label);
default:puni(&label);
}
return label;
}
parent() {
static int label;
label = sub(label);
}
874 :
デフォルトの名無しさん :02/10/26 09:15
atoi("hoge") が 0 を返すことは保証されていますか?
/* 引数:limiter=その呼び出しで実行限界とするcase文の事例数値 */ /* 返り値:0=処理完了, 1=実行中 */ char coldFire( int limiter ) { static int myControl; /* switch文の制御数値 */ if( limiter < 0 ) /* limiterが無効値の場合は制御数値の初期化 */ myLabel = 0; if( limiter < myLabel ) /* 実行限界まで処理したら処理をポーズ */ return 0; result = 1; /* 返り値格納用 */ switch( myControl ) { case 0: /* 通常の処理 */ /* 何らかの処理 */ myControl++; break; case 1: /* 条件ループ処理 */ /* あるいは何らかの処理 */ if( /* なんらかの条件 */ ) myControl++; break; /**** この間、その他case文の羅列:フラグ分岐等バリエーション多数 ****/ case endOfCase: /* 最後の処理 */ /* 何らかの処理 */ result = 0; break; } return result; }
うまく説明できなくてすみません。 基本的には値がゼロになるまで呼び出しを繰り返すことで 処理を完了するようになっています。 それで、なにがしたいかと言うと、同じような関数を複数、 同じループ内で呼び出し、かつ、それぞれの進行状況によっ て他の処理やインターロックを行いたいというわけです。
>>874 有効で無い数字が現れた時点で終了するので保証される。
>>876 for(i = 0; i < MAX_SHORI; i ++) {
shoriA0001_shokika(&j[i]);
shoriA0002_maeshori(&j[i]);
shoriA0003_bunkiMain(&j[i]);
shoriA0004_atoshori(&j[i]);
}
int shoriA0003_bunkiMain(int* j)
{
int state1 = shoriA0003_B01_shokika(j);
}
VBマンセー グローバル変数マンセー 構造体は戦場では必要無し
879 :
デフォルトの名無しさん :02/10/26 09:31
この業界入って、何の資格も取らずに40歳までいっちゃうとリストラ対象になるってホントですか?
∧_∧ / ̄ ̄ ̄ ̄ ̄ (・∀・ )< いくつぐらいで、「重複ですか?」アラート出るんかな? _| ̄ ̄||_)_\_____ /旦|――||// /| | ̄ ̄ ̄ ̄ ̄| ̄| . | |_____|三|/
それだと親内がcoldFireだらけになりそうだな。
みっそみそみそ みっそみそみそ 味噌スープ!
884 :
864:上位ルーチンではこんなふうに :02/10/26 10:23
#define initProc -1 #define untilEnd 10000 void dragonBall( void ) { coldFire( initProc ); rabitt2000( initProc); pic16f84( initProc ); while( rabitt2000(10) ) ; for(;;) { while( coldFire(5) ) rabitt2000( untilEnd ); while( coldFire(20) ) { rabitt2000( untilEnd ); pic16f84(10); } while( rabitt2000( untilEnd ) ; rabitt2000( initProc); while( coldFire( untilEnd ) { rabitt2000( 10 ); pic16f84( untilEnd ); } } }
こんなふうにして、プロセス間で精度が悪いながらも同期をとりながら 動いています。 もう、端的にお聞きして良いですか? 私、ヘンでしょうか?
> プロセス間で ??
綺麗です。
>886 ああ、すいません。それぞれの下位ルーチンが行っている処理の間で...という意味です。
889 :
デフォルトの名無しさん :02/10/26 11:09
そもそもCってどういう意味なんですか? Bの次だからCってただそれだけ? 他に意味はないの?
>>885 > もう、端的にお聞きして良いですか? 私、ヘンでしょうか?
出されたコードだけ見た限りでは、少しヘンだと思う。
やってることが固定なんだから、
> static int myControl; /* switch文の制御数値 */
わざわざこんなものを用意して制御する必要はないと思う。
(仮に必要だったとしても、俺なら上位ルーチン側で変数を用意する)
↑はシングルスレッドでの処理を前提とした場合ね。
>>889 「C言語は,1972年,アメリカAT&Tベル研究所のDennis M.Ritchieによって設計された、
彼の目的は、ミニコンピュータのオペレーティングシステム(OS)であるUNIXを開発する事
であったが、それにふさわしい言語を自らつくりあげたのである.C言語の前身は,1970年
にKen Thompsonによって開発されたB言語である.B言語も同じUNIX開発用に設計された
言語であり、BCPLという言語を改良した物であった.このB言語の次に開発されたものである事から、
”C言語”と名づけられたと言われている.」
と、「第2種情報処理試験合格ゼミC言語の総合研究(平成七年度)」(P.22)には書いてあります.
ってなんでこんな古いのがあるんだよ〜〜
技術評論社ね
894 :
デフォルトの名無しさん :02/10/26 11:54
フィボナッチ探索を用いて、単峰性のデータの最大値を求めるプログラムです。 何故かうまく動作しません。 どこがわるいんですか? #include <stdio.h> /* フィボナッチ数列を求める関数 */ int fibonacci(int n) { if(n==1||n==2) return(1); else return(fibonacci(n-1)+fibonacci(n-2)); }
895 :
デフォルトの名無しさん :02/10/26 11:54
int main(void) { int data[50]={12,14,26,30,32,43,49,56,67,68,71,84,93,105,118,131,134,164,184,204,208,240,267,284,304,312,309,279,274,264,219,199,197,194,193,192,175,158,142,130,110,95,86,70,54,42,38,32,15,8}; int i=1; int fn=1; /* 問題に適するフィボナッチ数列のnの値 */ int data_s=50; /* 配列dataの要素数 */ int sel=0; /* 判定用 */ puts("■フィボナッチ探索■");
896 :
デフォルトの名無しさん :02/10/26 11:54
while(1) { if(fibonacci(i)==data_s) { fn=i; break; } else if(fibonacci(i)<data_s) if(data_s-fibonacci(i)<data_s-fibonacci(fn)) fn=i; else if(fibonacci(i)-data_s<data_s-fibonacci(fn)) fn=i; else sel=1; if(sel==1) break; i++; } printf("%d",fn); return(0); }
897 :
デフォルトの名無しさん :02/10/26 11:55
なお、プログラムは途中までしかつくってません
int fibonacci(int n) { int x = 0, y = 1; while (n--) { int z = x; x += y; y = z; } return x; }
if else が入れ子になってるときは{}で はっきりどうかかるか示しなさい。 あと、無限ループじゃなくてforにする。
900 :
デフォルトの名無しさん :02/10/26 12:05
>>898 もとの再帰を用いた関数はだめですか?
>>899 for文にしたときの条件は
sel==1
でいいですよね?
901 :
デフォルトの名無しさん :02/10/26 12:08
まちがえた。 sel==0だ
dataは使って無いね。
903 :
デフォルトの名無しさん :02/10/26 12:15
904 :
デフォルトの名無しさん :02/10/26 12:35
もうちょっと先を書いて色々変更したらおかしくなったみたい・・・ #include <stdio.h> /* フィボナッチ数列を求める関数 */ int fibonacci(int n) { if(n==1||n==2) return(1); else return(fibonacci(n-1)+fibonacci(n-2)); }
905 :
デフォルトの名無しさん :02/10/26 12:36
/* 問題に適するnを求める */ int get_fn(int data_s) { int i; int sel=0; /* 判定用 */ int fn; for(i=1;sel==0;i++) { if(fibonacci(i)==data_s) { fn=i; sel=1; } else if(fibonacci(i)<data_s) { if(data_s-fibonacci(i)<data_s-fibonacci(fn)) fn=i; } else { if(fibonacci(i)-data_s<data_s-fibonacci(fn)) fn=i; else sel=1; } } return(fn); }
906 :
デフォルトの名無しさん :02/10/26 12:36
/* フィボナッチ探索 */ int fib_search(int x,int data[],int sn) { int f1,f2; int search_num; f1=fibonacci(x-1); f2=fibonacci(x-2); printf("%d番目の要素:%d\n",f1,data[f1+sn]); printf("%d番目の要素:%d\n\n",f2,data[f2+sn]); if(data[f1]<data[f2]) search_num=f2; else search_num=f1; return(search_num); }
907 :
デフォルトの名無しさん :02/10/26 12:36
int main(void) { int data[50]={12,14,26,30,32,43,49,56,67,68,71,84,93, 105,118,131,134,164,184, 204,208,240,267,284,304,312,309,279,274,264,219,199,197,194,193, 192,175,158,142,130,110,95,86,70,54,42,38,32,15,8}; int fnum; /* 問題に適するフィボナッチ数列のnの値 */ int data_s=50; /* 配列dataの要素数 */ int serchnumber=0; puts("■フィボナッチ探索■\n"); fnum=get_fn(data_s); printf("%d",fnum); fib_search(fnum,data,serchnumber); return(0); }
908 :
デフォルトの名無しさん :02/10/26 12:37
最後にチェック用として入れた printf("%d",fnum); が表示されないよー。 なぜだああ!!
>890さん この場合、呼び出し側で各下位ルーチンのswitch文制御数値を管理するとなると、 呼び出し側ルーチンでは、同時に呼び出される下位ルーチンの個数や、それぞれ の下位ルーチンが担当する処理の寿命や、それぞれの下位ルーチンとそのswitch 文制御変数を保持する変数との結び付けについて間違いがないようにする必要が あり、さらに、複数の呼び出し側ルーチンを通じて下位ルーチンが一連の処理を 継続する場合にはそのswitch文制御変数を保持する変数を上位ルーチン同士がな んらかの方法で受け渡す必要があるので、そのようにしなかったのです。
910 :
デフォルトの名無しさん :02/10/26 13:04
911 :
デフォルトの名無しさん :02/10/26 13:15
scanf("%c",&a); で2文字以上入力するとエラーを出したいのです。 ヒント下さい。
912 :
デフォルトの名無しさん :02/10/26 13:27
2文字以上入力した場合エラー出せばいい
914 :
デフォルトの名無しさん :02/10/26 13:31
>>912 無理なんですか?(汗
>>913 2文字以上入力されたかどうかを調べる方法がわからないです(T_T)
scanf("%2s", string); 2文字以上入力出来るけど、2文字しか受け取らへん。 エラー出そうと思ったらscanf()じゃ無理やから、環境に依存したコーディングになりま
fgets/sscanfだたと思うよ。CFAQに載っていたの。
915の発言は脳内削除して下さい。 2文字で入力を打ち切る場合かと思うてた。スマンでし。 fgets()で入力受けた後にstrlen()で調べたらおk。
#define INPUTMAX 4 char buf[INPUTMAX]; fgets(buf, INPUTMAX, stdin); if (buf[3] != '\0') { /* エラー表示 */ }
919 :
デフォルトの名無しさん :02/10/26 14:19
みなさんありがとうございます。 fgets()やstrlen()など調べてみます〜♪
Cスレの寿命は一週間、っと。
半分以上ネタor論争だがな
Rubyスレは半万年続きますが何か?
>>900 その再帰だと二回同じの呼び出さなきゃいけないでしょ。
そしてそれぞれが二回呼び出すわけだから良くない。
>>905 data_sに一番近いフィボナッチ数を選ぶんだとおもうけど、
int get_fn(int data_s) {
int i;
for (i=1; fibonacci(i) < data_s; i++) ;
if (i == 1) return 1;
if (fibonacci(i) == data_s) return i;
return (data_s-fibonacci(i-1) < fibonacci(i)-data_s)? i-1 : i;
}
925 :
デフォルトの名無しさん :02/10/26 15:46
>>924 なるほど。余計な計算を省くわけですね
勉強になります。
926 :
デフォルトの名無しさん :02/10/26 15:51
898の関数でやるとプログラムがとまってしまいます! なんで!?
927 :
デフォルトの名無しさん :02/10/26 15:52
一応、ここまで出来ました #include <stdio.h> /* フィボナッチ数列を求める */ int fibonacci(int n) { if(n==1||n==2) return(1); else return(fibonacci(n-1)+fibonacci(n-2)); } /* 問題に適するnを求める */ int get_fn(int data_s) { int i; for(i=1;fibonacci(i)<data_s;i++) ; if(i==1) return 1; if(fibonacci(i)==data_s) return i; return(data_s-fibonacci(i-1)<fibonacci(i)-data_s)?i-1:i; }
928 :
デフォルトの名無しさん :02/10/26 15:53
/* フィボナッチ探索 */ int fib_search(int x,int data[],int sn) { int f1=fibonacci(x-2); /* 1つ目のめくる値の添え字 */ int f2=fibonacci(x-1); /* 2つ目のめくる値の添え字 */ int search_num; /* 数え始める値の添え字 */ printf("%d番目の要素:%d\n",f1+sn,data[f1+sn]); printf("%d番目の要素:%d\n\n",f2+sn,data[f2+sn]); if(data[f1+sn]<data[f2+sn]) search_num=f1+sn+1; if(data[f2+sn]<data[f1+sn]) search_num=sn; return(search_num); } int main(void) { int data[50]={12,14,26,30,32,43,49,56,67,68,71,84,93 ,105,118,131,134,164,184,204,208,240,267,284,304,312,309,279 ,274,264,219,199,197,194,193,192,175,158,142,130,110,95,86,70,54,42,38,32,15,8}; int fnum; /* 問題に適するフィボナッチ数列のnの値 */ int data_s=50; /* 配列dataの要素数 */ int ser=0; /* 数え始める部分 */ int n; int max; /* 最大値 */
929 :
デフォルトの名無しさん :02/10/26 15:53
puts("■フィボナッチ探索■"); fnum=get_fn(data_s); for(n=0;(fnum+n)>=1;n--) { ser=fib_search(fnum+n,data,ser); } return(0); }
930 :
デフォルトの名無しさん :02/10/26 15:55
それで、一回表示した要素は、もう表示しないようにしたいんです。 でもまだポインタとか学校では習ってないんで 使わない方がいいかなって。 表示した要素の添え字を格納するopen_data[]とか作って いろいろ試したんですけど、ポインタが必要になるんです。 ポインタ使わないでできます?
>>909 > 呼び出し側ルーチンでは、同時に呼び出される下位ルーチンの個数や、それぞれ
> の下位ルーチンが担当する処理の寿命や、それぞれの下位ルーチンとそのswitch
> 文制御変数を保持する変数との結び付けについて間違いがないようにする必要が
> あり
884のコードを見る限りでは、渡すのは定数だけで、
そんな(「間違いがないようにする必要が」と言うほどの)
複雑なことをやっているようには見えない。
ただし、コードに載せていない部分からも呼び出している
なら話は別だけど。
それと俺が
> (仮に必要だったとしても、俺なら上位ルーチン側で変数を用意する)
と書いた意味はわかってる?
別にcoldFire関数で静的な変数を用意しなくても、
引数で渡してそれを関数が更新して返却すればいいということ。
それと、「同時に呼び出される」と書いているけど、
シングルスレッドなら同時には呼ばれないよね。
あんたの書き込みは、言葉(用語)もなんか普通と違っていて
今いち理解できん。
fib_searchを変えた方がいい。 引数は2つ。検索の開始点と終了点。 で、フィボナッチ数で三つにわけるのかな。 開始点と中間点1、中間点1と中間点2、中間点2と終了点。 でそれぞれ再帰かなあ。
933 :
デフォルトの名無しさん :02/10/26 16:21
はじめまして構造体について教えて下さい。 以下のようなサンプルがありました。 int main{ ATDisc myDisc; void DisposeDisc(myDisc); } static void DisposeDisc(ATDisc& disc) { DisposeATDisc(&disc); } このDisposeDisc関数のdiscはポインタなんでしょうか? 下のように書き換えられますか? int main{ ATDisc *myDisc; void DisposeDisc(&myDisc); } static void DisposeDisc(ATDisc *disc) { DisposeATDisc(&disc); }
>>909 ごめん。よく見ると909に
> 複数の呼び出し側ルーチンを通じて下位ルーチンが一連の処理を
> 継続する場合には
と書いてあった。ということは
884で載せたコード以外からも呼び出されるんだよね。
だったらそのやり方でもいいと思う。
>>933 参照渡し。
int main{
ATDisc *myDisc;
void DisposeDisc(myDisc);
}
static void DisposeDisc(ATDisc *disc)
{ DisposeATDisc(disc); }
>>935 もどきじゃなかったっけか?それ。
参照の情報を持った変数を値渡ししてるんで。
純粋なのはPascalのvarとかだと思う。
937 :
C言語初心者 :02/10/26 16:37
質問です。 VCでStrMatch()を使うと外部参照エラーが出ます。 Win32用のライブラリはないのでしょうか?
>866, 867, 873, 878, 881, 882, 886, 890, 931 まとめてしまい申し訳ありませんが、みなさんありがとうございました。 用語やその他ヘンなところがあるのは、周囲に同職がいないため、本や netだけを頼りに勉強しているせいなので、自分でも気にしています。 サンプルとはいえコードを他人に見てもらった経験もこれが初めてで、 職場では納期を守りさえすれば、ソフトのことなどだれも関心持ちません。 いろいろありがとうございました。みなさんの善意に感動しています。 いただいたレスは全てじっくり勉強いたします。ではまた。
939 :
デフォルトの名無しさん :02/10/26 16:57
>>929 のfor文の後に
printf文を書いたんですが何も表示しません!
エラーもなにもないのに・・・
どうしてですか!?
fibonacciの最初に if (n <= 0) printf("fib(%d)", n); って入れてみたら。なんか0以下呼び出してそうだし。
942 :
デフォルトの名無しさん :02/10/26 17:30
いやfor文の外なんだよ。 for(n=0;(fnum+n)>=1;n--) ser=fib_search(fnum+n,data,ser,&max); printf("最大値は%dです。\n",max); return(0); } って。 なんで表示されないの?
fibonacci(0)は呼び出してなかったか?
944 :
デフォルトの名無しさん :02/10/26 18:08
>C言語は時代遅れなんかじゃないです。 >みんな大好きなんです。このシリーズの速さがそれを物語っています。 学校の授業で教える言語なので厨房が多いだけ。
>>945 それをいっちゃだめ。
さめちゃうでしょ。
はあ〜あ、鮫ちゃった。Javaスレでも逝くか。
よーし、パパ埋めちゃうぞぉ
949 :
デフォルトの名無しさん :02/10/26 18:48
sprintfの引数の許容アクセスモードの指定でwbはどういう意味ですか? いちおうライブラリを見て"w"と"b"については書いてあったんですが"wb" については書かれて無かったです。
>>949 fopenの間違いか?
fopenなら書き込み&バイナリモード(改行コード変換なし)で開くという意味。
UNIXでは全く意味のないもの。
>>950 たっているだろ
fopenってモードは文字列じゃなくて実体は整数のマクロのビットORで渡す仕様にすればよかったのに。
>>953 C++はそうなっているのは偶然ではないだろう。
> UNIXでは全く意味のないもの。 なんか勘違いさせそう。 UNIXでは"w"と等価。というべきか。
957 :
デフォルトの名無しさん :02/10/26 19:02
ごめんなさい、fopenでした、ごっちゃになってました、激しく逝ってきます。 単純にwとbを合わせただけなんですね。
958 :
デフォルトの名無しさん :02/10/26 19:13
実は以前、ファイルに順番に名前をつけていくのはどうすればいいですか?の質問で、 sprintf(fname, "hoge%04u.jpg", i++); fp = fopen(fname, "wb"); fclose(fp); と解答をいただいたのですが、2行目以降でどうしてファイルオープンしてその後、閉じるのか 分からないのですがどなたかご教授いただけないでしょうか?
>958 アフォすぎ。ネタかと思うくらい。
! ! ! ! す み ま せ ん ! ! ! ! し つ も ん で す!!! makeコマンドありますよね。 例えば、 SJIS_FILE=hoge.txt nkf-e: nkf -e < $(SJIS_FILE) > $(SJIS_FILE).euc というMakefile のSJIS_FILEという変数をMakefileを変更せずに例えば、 % SJIS_FILE=moge_dummy.txt;make nkf-e みたいに指定して実行したいんですが、 上の方法では変数にmoge_dummy.txtが格納されません! 一体どうすれば可能なのでしょうか? どなたか教えてください。 御願いします!!!
>>958 fopenとfcloseの間の処理はあんたしか仕様を知らないんだから
自分で作らないとダメだよ。
たとえばfwriteやfseekなどを組み合わせて。
そもそも、このスレの
>>227 で
> 房な質問ですみません。使用する関数を教えてもらえれば幸いです。
>>234 で
> 大体どんな感じのプログラムになるのかだけでも教えてもらえませんか?
> イメージがわかないんです。
という質問だったんだろ。
>>961 % make nkf-e SJIS_FILE=moge_dummy.txt
965 :
デフォルトの名無しさん :02/10/26 23:20
967 :
デフォルトの名無しさん :02/10/26 23:46
初心者もOKだからOKなんちゃうか?
義理チョコは未定
未定かどうかは環境依存 漏れは男子校だった・・・
漏れも男子校ですた。 でも後輩から本命チョコもらってしまいますた。。。 (;´Д`)っ■
やっぱこの、次スレ立った後のマターリ感が何とも言えないよな。
次スレは半可通が妙に息巻いててみてらんない。
一体次スレは 45 からどこまで同じ話題が続くんだ。 今夜中に 250 超えたりしてな。
>>974 越えてしまいますた。300に迫る勢いです。
>>975 300 も超えてしまいました。ウルムン・シュソト・ドラソクです
今のうちにコソーリ100でもとっておこうっと。。
厨房度では HSP スレを超えたな。
次スレ面白すぎ・・・ 今日中に次次スレにならないだろーな
回しているのは 3-4 人なわけだが。
500 超えちゃったよ......
肩を震わせて笑っています 何とかしてください次スレ
そろそろ燃え尽きてきたような
600いったね
>>974 の予想なんてとんだ甘ちゃんだったわけだ
うう・・・メンバーの厨房度をすっかりなめきっていたよ・・・
書き込みして寝て起きたらこれですか。 適当に書いたことなのに。
かちゅで次スレの新着レスが400近くあるよ 今朝方4時ぐらいまではみてたんだが ム板でもこんなにレスが付くことがあるのか
>>987 仲間発見だ!
一週間も放置するとDAT落ちしてログを保存できないスレってのもム板では珍しいかも
やれやれ、次スレは 45 と 609 で埋まっちまうのかい? つーか、609 は 45 を引きずってたから全部 45 ネタとも言えるかもな。
割と意外な方向に収束したな。
次スレ45ネタをリアルタイムで見たかった・・・。 このスレは、あと9回書き込めるよん。
このスレが終わるのと、次次スレができるのと、どっちが早いか。
また蒸し返されてますが(w
まもなくここは 乂1000取り合戦場乂 となります。 \∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ,,、,、,,, / \〇ノゝ∩ < 0x03E8取り合戦、いくぞゴルァ!! ,,、,、,,, /三√ ゚Д゚) / \____________ ,,、,、,,, /三/| ゚U゚|\ ,,、,、,,, ,,、,、,,, ,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/ //三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ ∪ ∪ ( ) ( ) ( ) ) ,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ ,,、,、,,, ( ) ( ) ( ) ( )
996
997!
998!!
999!!!
( ̄ー ̄)ニヤリッ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。