1 :
デフォルトの名無しさん :
01/12/24 19:49 漏れは27才、、、今まで1ヶ月一生懸命Cを勉強してきた、、、 他の言語はHTMLしかできないが、例のスレがウイルスに犯されているのをみかねて、立ち上がった。 変数宣言、入力、出力、演算、条件文、繰り返し文、関数、ファイル処理、ポインタ、構造体、と入門レベルなら一通りできる。 あと構造体のチェイン、関数のポインタ、ビットシフト、共用体がわからんが、これもあと一ヶ月くらい勉強すればわかるだろう。 このスレでは、漏れが基礎レベルの質問に答える。しかし、俺様が5分以上考え込む難問は禁止だ。
v(^・^)v
3 :
デフォルトの名無しさん :01/12/24 19:53
コンソールでの文字入力、どうしてますか?
4 :
デフォルトの名無しさん :01/12/24 19:54
voidってなんですか?
5 :
デフォルトの名無しさん :01/12/24 20:13
>>3 まず、Cでは、「文字」と「文字列」は別の物として扱われる。
「文字」は一文字、「文字列」は配列を用意して、
そのなかにちまちま文字をはめ込んだものだ。
また、まぎらわしいことに、「文字列定数」とかいうものもある。が、いまはとりあえず、文字の入力についてだけ説明する。
とりあえず、次のコードをコンパイルして実行する。
#include <stdio.h>
int main(void)
{
int ch; // int 型の ch を宣言。
ch=getchar(); // getchar で一文字読み込み、ch に代入する。
putchar(ch); // putchar で、ch に読み込んだ文字を出力する。
}
上のコードを実行すると、プロンプトが出て、文字を入力するように待機しているので、たとえば A と入力しEnterを押せば
A
と出力される。
見た目はこれだけだが、
(1)なぜ ch をint で宣言したのか(なぜgetcharをintで受けるのか)
(2)もしAAと2文字入力してからEnterを押すとどうなるのか(バッファリングの問題)
(3)ch の中身は本当は何が入っているのか
など細かく見ていくとおもしろいのだが、入門スレなので大胆に省略する。
天才?
In article
>>5 , デフォルトの名無しさん/5 wrote:
> また、まぎらわしいことに、「文字列定数」とかいうものもある。
「リテラル」は「定数」って訳すと混乱する場合も多いので、
そう訳さない場合もけっこうありますよ。
> {
> int ch; // int 型の ch を宣言。
> ch=getchar(); // getchar で一文字読み込み、ch に代入する。
> putchar(ch); // putchar で、ch に読み込んだ文字を出力する。
> }
>
> 上のコードを実行すると、プロンプトが出て、文字を入力するように待機しているで、
プロンプトがでるってどんな環境の場合だろう?
たとえば A と入力しEnterを押せば
> A
> と出力される。
Enterはどこ行っちゃったの?
> (1)なぜ ch をint で宣言したのか(なぜgetcharをintで受けるのか)
なぜ変数名が「ch」なのか? てのも気になりますね。
8 :
デフォルトの名無しさん :01/12/24 20:24
クソスレ立てる1はウザイが、 嬉々としてしゃしゃり出てくる7には、 ウザイを通り越してむしろ愛すら感じる(;´Д`)ハァハァ
「C の超カンタンなことなら漏れに聞け」
うむ、Kusakabeが嬉々として食いつくタイトルだな。
ご苦労
>>1
11 :
>なぜ変数名が「ch」なのか? :01/12/24 20:31
わかんないの? >1 才能を感じる♪
In article
>>7 , Kusakabe Youichi/
[email protected] /7 wrote:
>「リテラル」は「定数」って訳すと混乱する場合も多いので、
>そう訳さない場合もけっこうありますよ。
わたしならこんなめんどうな回答はしませんね。
こう答えます。
13ペイジを見ればわかりますよ?:)
In article
>>9 , デフォルトの名無しさん/sage/9 wrote:
> クソスレ立てる1はウザイが、
> 嬉々としてしゃしゃり出てくる7には、
「ききとしてしゃしゃりでて」きたことにすると、うれしいのですね? :)
Kusakabeって何人いるんだ?
In article
>>12 , Kusakabe Youichi/12 <
[email protected] > wrote:
> 13ペイジを見ればわかりますよ?:)
「よ」の後ろがだめですね。(まるでMS-IMEユーザー)
17 :
デフォルトの名無しさん :01/12/24 20:40
>>4 void というのは「何も無い」という状態を、積極的に宣言するものだ。たとえば
int main() // () の中が空白
でも、引数無し、というのは見てわかるが、
int main(void) // () の中に void がある
とかいたほうが、
「引数はありませんよ」
と明らかに示しているのでわかりやすい。
また、もし間違えて、この関数を引数つきで呼んでしまったときは、コンパイラーで判断して、エラーを出せる。
また、関数の返り値が何も無い、ということを示すときにも使う。
(1)void foo (void) //foo という関数は、引数が無くて、返り値も無い
(2)int bar(void) // bar という関数は、引数が無くて、int 型の返り値を返す
このように使う。また、void 型の変数宣言というのもあるらしいが、そこまでよく読んでいないので省略。
ちなみに、ネットでvoidというハンドルを使う者もまれにいるらしい。これは「void」という名前ではない。
「名前」欄を空白にせずに、わざわざvoidと書き込むということは、
「名乗るほどの名前じゃありやせん」
という意味、つまり、2ちゃんでの「名無しさん」とかと同じ意味である。
In article
>>16 , Kusakabe Youichi/9 <
[email protected] > wrote:
> 「よ」の後ろがだめですね。(まるでMS-IMEユーザー)
わたしがバカにするのはATOKだけですね。
Kusakabe Youichiネタはウザイので、 他でやってください。
In article
>>17 , Kusakabe Youichi/17 <
[email protected] > wrote:
> ちなみに、ネットでvoidというハンドルを使う者もまれにいるらしい。これは「void」という名前ではない。
そんなにこわがらなくてもー :)
不定と処理系依存ってどう違うの?
>>21 不定は文字どおり、定まってない。決まっていない。
処理系依存は、(実装が)処理系によって違ってる。
ってことじゃないの?
>>21 不定は処理系にかかわらずどんな処理が行われるか、どんな結果が返ってくるか決められていない。
処理系依存はOSとかCPUとかで動きが違う。
NULLと'\0'ってどう違うんですか?
25 :
デフォルトの名無しさん :01/12/24 20:54
>>21 不定というのは、本当に何がはいるかまったくわからない、ということ。
処理系依存は、ある特定の処理系だけつかうなら、その動作が予想できるけど、別の処理系に持っていったとき、どういう動作になるかわからないもの。
ナァルッ
ヒープってなんですか?
スタックってなんですか?
29 :
デフォルトの名無しさん :01/12/24 20:56
>>24 同じ。しかし、「0」と書くより
「\0」
と書いたほうが「文字としての0」という雰囲気をもっている。文字列の終端を見つけたいときなど
「0まできたらループ終了」
とかいうコードを書くと
「この0はいったいなんだ?」
と一瞬迷う。「\0」にしておけば、文字としての0、つまり、文字列の終端がきたらループを抜けるんだな、とすぐわかる。
30 :
デフォルトの名無しさん :01/12/24 20:58
>>30 ポーランド人じゃないので
そんな記法受け付けません。
ポインタにNULLを代入した場合 「何もさしていない」って意味っしょ?
malloc関数の仕組みを教えてください。 ヒープのを知らないのでは答えられないと思いますが。
35 :
デフォルトの名無しさん :01/12/24 21:13
Cの開発に携わったのはリッチーだけで、カーニハンは「プログラミングC」の執筆に携わっただけというのは本当ですか?
>>34 >答えられないと思いますが。
なら、聞くなよ。
37 :
>33のリンク :01/12/24 21:15
変な日本語だ。内容もちょっとヘンなかんじだ。
38 :
デフォルトの名無しさん :01/12/24 21:17
39 :
デフォルトの名無しさん :01/12/24 21:20
>>34 動的に必要なメモリを確保する関数だ。
それ以上は知らん。
>>35 知らないので省略。
41 :
デフォルトの名無しさん :01/12/24 21:22
ナルとニルとヌルの違いを教えてください。
>sage == ネタ 君の脳内ルールを、ここで語られても困りますが。
47 :
デフォルトの名無しさん :01/12/24 21:34
>>42 ナル null ほとんどの場合、0 と等価
ニル nil Lisp用語 なにも無いという意味
ヌル null ナルの日本人用読み方
これはネタスレだよね?
>>45 間抜けなことを書いてしまったからネタということにしたいのでしょう。
追求しないのが大人の態度。
>>47 >ナル null ほとんどの場合、0 と等価
ほとんどじゃない場合は?
51 :
デフォルトの名無しさん :01/12/24 21:38
>ナル null ほとんどの場合、0 と等価 100点満点で10点
>>51 ヌルの値じゃなくて、定義は何ですか?
どういうときに使えばいいの?
54 :
デフォルトの名無しさん :01/12/24 21:43
In article
>>17 , デフォルトの名無しさん/17 wrote:
> このように使う。また、void 型の変数宣言というのもあるらしいが、
はつみみです。
In article
>>18 , Kusakabe Youichi/18 <
[email protected] > wrote:
> In article
>>16 , Kusakabe Youichi/9 <
[email protected] > wrote:
> > 「よ」の後ろがだめですね。(まるでMS-IMEユーザー)
>
> わたしがバカにするのはATOKだけですね。
わたしはATOKを馬鹿にしたりしたことはいちどもないですよ。
(使うやつは馬鹿だろうけど)
In article
>>20 , Kusakabe Youichi/20 <
[email protected] > wrote:
> In article
>>17 , Kusakabe Youichi/17 <
[email protected] > wrote:
> > ちなみに、ネットでvoidというハンドルを使う者もまれにいるらしい。これは「void」という名前ではない。
>
> そんなにこわがらなくてもー :)
「てもー」なのに「:)」が付いてるんですか?
59 :
デフォルトの名無しさん :01/12/24 21:45
In article
>>24 , デフォルトの名無しさん/sage/24 wrote:
> NULLと'\0'ってどう違うんですか?
全然ちがうものですよ。
125ペイジ 「5.1.3 NULLと'\0'と0」 を読みましょう。
62 :
デフォルトの名無しさん :01/12/24 21:46
64 :
デフォルトの名無しさん :01/12/24 21:47
66 :
デフォルトの名無しさん :01/12/24 21:49
>61 本もってたらここで わざわざ聞かないって。
68 :
デフォルトの名無しさん :01/12/24 21:51
whileもforも関数の再帰呼び出しも使わないで繰り返し処理を行う方法を教えてください。
70 :
デフォルトの名無しさん :01/12/24 21:52
これは無限ループなのか
74 :
デフォルトの名無しさん :01/12/24 21:53
>>71 ではnullと不定は等価ではないということになります。
75 :
デフォルトの名無しさん :01/12/24 21:54
>>73 あ、そっか。Cにもgotoってあったんだったな。
それさえ使わない方法は無理だよね?
76 :
デフォルトの名無しさん :01/12/24 21:55
>>74 nullは不定ではないということですか?
setjmp,longjmp
79 :
デフォルトの名無しさん :01/12/24 21:58
>>77 その辺は曖昧です。あなたが不定ではないと思えば不定ではないし、不定であると思えば不定だということになります。
>>79 わかりました。C言語って曖昧なんですね。
81 :
デフォルトの名無しさん :01/12/24 22:00
>>80 いえ、コンピュータ自体が曖昧なのです。人間が作った物ですから。
In article
>>67 , デフォルトの名無しさん/sage/67 wrote:
> 本もってたらここで
> わざわざ聞かないって。
買えばいいのに。
In article
>>68 , デフォルトの名無しさん/68 wrote:
> whileもforも関数の再帰呼び出しも使わないで繰り返し処理を行う方法を教えてください。
回数分書く。
84 :
デフォルトの名無しさん :01/12/24 22:00
>>81 なるほど。
これで、僕の作ったプログラムが動かない原因がやっとわかりました。
僕のせいじゃないってことですね。
86 :
デフォルトの名無しさん :01/12/24 22:01
>>85 はいそうです。コンピュータの機嫌を損ねないよう、くれぐれも気をつけてください。
>83 いわれてみれば それもあるな
>>84 ループのアンロール。
先生にしてはまともな回答。
91 :
デフォルトの名無しさん :01/12/24 22:03
ループ処理を・・・・なら
>>83 みたいな答えは不正解になりますよね?
日下部ネタはよそでお願いします。うざい。
>>91 繰り返し処理…
って質問してるからなぁ。
つーか、難癖付けるにしてももう少しエレガントにやっとくれ。
>>91 それを言ったら、再帰もループと言えるのか?
95 :
デフォルトの名無しさん :01/12/24 22:05
96 :
デフォルトの名無しさん :01/12/24 22:06
あ、いえ、糞壁を相手にしたのがそもそもの間違いでした。ごめんなさい。
In article
>>93 , デフォルトの名無しさん/sage/93 wrote:
> 繰り返し処理…
> って質問してるからなぁ。
回数分繰り返してかくんだから「繰り返し処理」ですよ。
98 :
デフォルトの名無しさん :01/12/24 22:07
みなさん、反応しなくていいですからね。
>>97 日本語書けとは言わないから、理解はしてくれ、偽カベさん。
91が「ループ処理を…なら不正解」と書いたのに対して、
「繰り返し処理…って質問してるからなぁ」と答えたんだが?
ついでに「難癖付けるにしてももう少しエレガントに」とも書いたな。
In article
>>98 , デフォルトの名無しさん/98 wrote:
>
>>97 >
> 無限ループにしたい場合はどうするの?
無限にかくのよ。
ループ命令は使わずにループ処理するにはどうしたらいいですか、ってか? アホカ
>>101 繰り返し処理を…の質問に対しての回答だから
先生は日本語読み違ってないよ。
先生に栄養を与えるようなことは書かないほうがいいよ。
106 :
デフォルトの名無しさん :01/12/24 22:18
(;;)
107 :
デフォルトの名無しさん :01/12/24 22:19
>>106 泣いているの?クリスマスイブに一人だから?
C言語使わずにC言語勉強するにはどうしたらいいですか?
人 。。∧ ∧Å。ノ。,,, _(⊂(゚Д゚*)⌒ヽつ_ |=======∪======| |yyyyyyyyyyyyyyy| |~~~~~~~~~~~~~~~~~~~~~| ======================
110 :
デフォルトの名無しさん :01/12/24 22:22
>>108 C言語を使うとはどういうことでしょう?Cでソースコードを書くということでしょうか?
それなら頭の中でコンパイル&リンクすればよいです。
112 :
デフォルトの名無しさん :01/12/24 22:25
(←これを表す三文字はなんだったっけ?
113 :
デフォルトの名無しさん :01/12/24 22:39
114 :
デフォルトの名無しさん :01/12/24 23:09
トライグラフ使う奴なんていねーよ!
116 :
デフォルトの名無しさん :01/12/25 01:10
>>112 3文字表記があるのは次の9通り
??= #
??( [
??/ \
??) ]
??' ^
??< {
??! |
??> }
??- ~
従って
>>115 正解
117 :
デフォルトの名無しさん :01/12/25 01:52
a[i++]=b[i++] 不定と思ってたけど、処理系依存だった
118 :
デフォルトの名無しさん :01/12/25 02:31
??=include <stdio.h> int main(int argc,char* argv??(??))??< if(argc==2??!argc==3) printf("%s??/n",argv??(1??)); ??> とかでOK??
>>118 > if(argc==2??!argc==3)
どうでもいいが
if(argc==2??!??!argc==3)
と思われ
いやいや <は<で&は&で その他は文字コード;だろ?
> <は<で&は&;で エスケープできてないな。 <lt; &ということか。
じゃねーよ。<だろーが。
ネタスレなのに質問すみません。 char型の文字(10進数の数字)をint型に変えることはatoi関数で出来ますが、 char型の文字(16進数の数字)をint型に変えるにはどうすれば良いですか?
あげます
sscanf("BEFF", "%x", &i); printf("%x:%d\n", i, i);
>>124 charはそのままintになるが、16進数文字列からの変換なら
int i = (int)strtol(str, 0, 16);
unsigned u = (unsigned)strtoul(str, 0, 16);
128 :
デフォルトの名無しさん :01/12/26 17:50
↑ビットフィールドを騙ってみた。 くそレススマソ。 まあ、どうせくそスレだからいいよな。
よくコメント内に、omajinaiとか書いてる人がいるんですが、 「omajinai」ってなんですか? 宗教?
131 :
デフォルトの名無しさん :01/12/26 21:16
単なる自分の無能さのいいわけです。
最近次のような記述をみました。 struct data{ int a:1; int b:7; } この:1や:2はいったい何物ですか?
>>134 もうちょっと詳しく教えてください。
私が見た本には載ってなかったんです。
>133 aに1ビット bに7ビット割り当てる でも aを読み出す時は intだよという意味です そいや int a:1 ; は 0か-1 になるのか 0か1になるのか どっちだったかな?
たしかbccだと struct data{ char a:1; char b:7; ・・・ と沢山 } とかやるとビット並びが連続しない所が出来てイヤーンな感じだった記憶もある
>>136 なるほど。これって入門書とかではあんまり取り上げてないですよね。
結構一般的なテクニックなんでしょうか。
>138 うんにゃ 少なくともおいらは コンパイラによって動作違うからキライ (1<<n) とかシフト演算とか使うなやっぱり
In article
>>133 , デフォルトの名無しさん/sage/133 wrote:
> 最近次のような記述をみました。
> struct data{
> int a:1;
> int b:7;
> }
> この:1や:2はいったい何物ですか?
K&Rでも見たら?
>>140 お、K&Rに載ってるのですか。ちょうど今読んでるところなのです。
しかし、当方のセルヴェルは低級なため、構造体のところまで
読み進むにはもう少し時間がかかりそうです。
142 :
デフォルトの名無しさん :01/12/26 22:23
ビットフィールドは使いどころによっちゃ便利なんだけどね。 嫌いな人も好きな人もいるし、コーディングスタイルの問題とは 思うけど同じソースを異なるアーキテクチャで使いまわそうと したときに下手な書き方してたら死ぬることも無いことは無いね。
143 :
デフォルトの名無しさん :01/12/26 22:25
>>141 物語じゃないんだから、前から順番に読むなYO!!
144 :
デフォルトの名無しさん :01/12/26 22:26
Cで構造体のネストするような場面では、素直にC++のクラスを使ったほうが便利?
In article
>>141 , デフォルトの名無しさん/sage/141 wrote:
> しかし、当方のセルヴェルは低級なため、構造体のところまで
補充すればいいのでは?
Cをやり出してからPerlを見るとわけがわからない・・・ なんで1つの変数に文字列が入るんだ? うーん・・・
>>146 それはある意味正常な感覚だな。
「変数」には「型」があるわけで、Cのプリミティブな型の感覚でとらえると
そういう感じになってしまう。
C++のclassと演算子オーバロードを学ぶとそのへんの「縛り」から抜け出せる。
stringクラスとかね。
Perlの型がC++のクラスとまったく同じかというと、厳密には違うんだろうけど
感覚的に「わけがわかって」くる。なんとなく。
148 :
デフォルトの名無しさん :01/12/27 00:06
>>146 さすがインタプリタ言語だなと思う>文字列型
何文字つっこもうがセグメンテーション違反が起きないから。
>>146 さらにいうと、数値への自動変換機能つきの文字列な。
>>150 便利といえば便利だが厄介なときもあるな。
NULLポインターが 内部では『0』じゃない場合がある って聞いたんだけど それならこういうのは危険なのかな? void* p[10]; memset(p,0,sizeof p); とか void** p = calloc(10,sizeof p); この場合『0』で初期化しているので 内部ではNULLポインターではない、 と解釈されそう
153 :
デフォルトの名無しさん :01/12/27 00:34
NULL==0 は、NULLのビットパターンにかかわらず必ず成り立つから、かまわないのでわ?
>>153 整数定数0 と、ビットパターン0は別じゃない?
NULL == 0 が必ず成立することを規格は保証しているけど、
NULL == *(void*) &memset_zero_area は保証あるの?
# 超カンタンな問題ではなくてゴメン
155 :
デフォルトの名無しさん :01/12/27 01:33
>154 >NULL == 0 が必ず成立することを規格は保証しているけど そうなの? Cって実装依存じゃないの?
ポインタの文脈で 0 が使われると NULL と解釈されるだけで、 NULL = 0 ではない。
NULL==0 っていう式の値は1ってことは保証されてるよ。 ==は必ずしもビットパターンの一致を検査するわけじゃないからね。 ただし、共用体やポインタのキャストを使ってNULLを整数だってコンパイラだまして整数定数0と比較する式は0になることもあるよ。
158 :
デフォルトの名無しさん :01/12/27 02:40
>>154 memset_zero_area ってのがなんなのか知らないからわかんない。
memset_zero_area ってなに? おせーて
char memset_zero_area[sizeof(void *)]; memset(memset_zero_area, 0, sizeof memset_zero_area); ということだろう。
>>154 つーか NULL == *(void**) &memset_zero_area だな。
161 :
デフォルトの名無しさん :01/12/27 03:02
たとえば、NULLのビットパターンが0xa0000だとして、 NULL==(void *)0xa000は真かどうかってことかな?
In article
>>152 , デフォルトの名無しさん/sage/152 wrote:
> NULLポインターが
> 内部では『0』じゃない場合がある
> って聞いたんだけど
「NULLが0なんじゃなくって、0がNULLなんです」! (定型)
In article
>>155 , デフォルトの名無しさん/155 wrote:
> >154
> >NULL == 0 が必ず成立することを規格は保証しているけど
> そうなの?
> Cって実装依存じゃないの?
質問する前に規格書か文法書ぐらい読みましょう。
In article
>>157 , 153/157 wrote:
> NULL==0 っていう式の値は1ってことは保証されてるよ。
> ==は必ずしもビットパターンの一致を検査するわけじゃないからね。
1行めはいいのですが、2行めは適切な教え方ではないですね。
>>164 >1行めはいいのですが、2行めは適切な教え方ではないですね。
ご指摘、感謝します。
>163 古い「ANSIC言語大辞典」という本を読んだが 「NULL == 0 が必ず成立することを保証」 という意味には取れんのだが.. C++に関してはNULLポインタの定義がしっかりしているが。
167 :
デフォルトの名無しさん :01/12/27 07:58
浮動小数点って何?
168 :
BCC32.141516 :01/12/27 08:16
JPGの画像のwidthはどうやって得るの?
>>168 オフセット14バイト目からビッグエンディアン2バイト
170 :
デフォルトの名無しさん :01/12/27 10:33
>>166 void* p; において
p = 0; と p = NULL; は C++ では等価だか、Cでは等価を保証しない
(p == 0) と (p == NULL) は C++ でも C でも等価、つーことでしょ
>>127 ありがというございます。試してみます。
>>170 保証されるってば。保証されないのは、たとえsizeof(int) == sizeof(void *)
であっても*(int *)&p = 0 と p = 0が等価ではないということ。
なんかビットパターンが違うかもしれないということで混乱してるやつが
多いみたいだけど、sizeof(float) == sizeof(int)の場合(IA32はそうだね)に
float f = 1において*(int *)&f == 1 にはならなくてもf == (float)1になる
のと同じことだよ。
あー、保証されてるされてる。 なんかこの話題年に2回くらい見てる気がする。
#undef NULL #define NULL "死ね"
「NULL == 0 が必ず成立することを保証」 の出典を教えてください。 保証しないと既存のプログラムが動かなくなる事はわかりますが。
In article
>>175 , 166/175 wrote:
> 「NULL == 0 が必ず成立することを保証」
> の出典を教えてください。
っていうか文法書や規格書ぐらい読めば?
陽一コラ!!、早く寝ろよおまえ!! こんな所で粘着してないでさっさと仕事さがせよ!! わかったか? わかったらちょっとコーヒー買って来い!陽一!!!
お前ら。 臭がりすぎ〜
179 :
(-_-;)うぅ :01/12/28 05:33
これ見ていただきたいんですが やることは標準入力から数字を受け取って3乗して表示するものです。 p()のところでc=cは何を入れてるんでしょうか・・ ボーランドのだとコンパイルエラーになりませんでした。 実行すると入力した数字が表示されるみたいっす。 int main(void) { int a; int (*b)(int a); b=q; a=atoi(gets("うんこ")); printf("3乗は %d です\n",(*b)(a)); return(0); } int q(int a) { int c; c=p(a); return(c); } int p(int a) { int c=c; printf("できるのか?→%d\n",c); return(a * a * a); }
In article
>>179 , (-_-;)うぅ/179 wrote:
> ボーランドのだとコンパイルエラーになりませんでした。
> int c=c;
うーむ、そこも何をやりたかったか意味不明ですけど、
gets("うんこ")
ここもエラーにならなかったのですね:)
q()を介してp()を呼んでいる意味もなさそうですし、
bという関数のポインターを使う必要もないですね。
あ、ヘッダとプロトタイピング宣言は省きました。
182 :
デフォルトの名無しさん :01/12/28 07:00
>>179 c=c は、コンパイルエラーにならないとすると
正直何もしてないに等しい。
int c;
c=c;
と2行に分けて書いたのとほぼ等価行為なので
結局Cに何が入ってるかは神のみぞ知るってところ。
全てがスタックに取られたとしたら スタックエリアはqが呼ばれた時に 00 qのc - 04 qからmainのreturnアドレス - 08 qのa - 0C mainのb - 10 mainのa となるから変ですね。 たぶん mainのa も qのcもスタックではなく レジスタに割り付けられて、そのレジスタが同じというのが真相でしょう。 確か -S かなんかで出せる筈のアセンブラ出力してみて下さい。
#include <stdio.h> #undef NULL #define NULL 1 int main( int, char** ); int main( int argc, char** args ) { printf("Null is %d\n", NULL ); }
186 :
デフォルトの名無しさん :01/12/28 10:07
>176 >> 「NULL == 0 が必ず成立することを保証」 >> の出典を教えてください。 >っていうか文法書や規格書ぐらい読めば? だから、さっさと出典だせ。
>>185 #include <stdio.h>
int printf(const char *format, ...) { return 0; }
int main()
{
int c = 5;
printf("c = %d\n", c);
return 0;
}
何も表示されませんが、何か?
もちろん、標準ライブラリのprintf関数の動作は
規格で決まっていますが、何か?
そんな枝葉どうでもいいじゃん! おまえらpascalでもやれよ!
「NULL == 0 が必ず成立することを保証」は、されていませんね。 #define NULL 0 があるから、0になってるだけで。 #define NULL 1 にすれば、「NULL == 0」は保証されません。
>>189 だからてめーの言う通りなら、
標準ライブラリの動作は全て「保証されていません」になるんだよ、バーカ
>>186 ISO/IEC 9899:1999
6.3.2.3
6.5.9
7.17
あたりかな。
ただし、NULLはstddef.hで定義されるマクロなので、明示的にも暗黙的にも
#includeしてない場合や、#undefして#defineした場合などは当然 NULL == 0
であるとは限らないけど、そんなプログラムはstrictly conforming program
じゃないから標準なんて気にするな。
193 :
デフォルトの名無しさん :01/12/28 10:37
お前ら「保証されている」って言葉の意味を考えた事ないですか?
ここで「保証されない」と言う人は、 「定数0」と「ビット列としての0」の区別も 「NULL」と「ヌルポインタ」の区別もしてないと思われ
「保証されていない」のは標準Cに準拠していないだけ。 「勝手に書き換える」のは「未定義の動作をひきおこす」だけ。
気のせいか?
>>194 「int型はINT_MAXまでの値をとりえることが保証されている」
#undef INT_MAX
#define INT_MAX 1234567890123456789012345678901234567890
int i = INT_MAX;
printf("%d", i);
あれー?「保証されている」ってかいてあるのに、嘘じゃん。
結局「NULL は、プリプロセッサによってどんなコードに置き換わるかは不明だが、 NULL == 0であることは保証されている」ってことだな?
mallocしたらexitするまでの間に必ず(以下略
>>201 お前の感じている感情は精神的疾患の一種だ
開放する方法は OS が知ってる OS に任せろ
すみません。ふと思いついて、 int n[1][1][1][1][1]; こういう配列を作ってみたんですが、 実際のメモリ上ではどういう構造になっているのか全く分かりません。 int n[5] とも違うようだし、 sizeof の値も sizeof(n) == sizeof(int) だし、 どなたかご教授願えませんでしょうか。
In article
>>203 , デフォルトの名無しさん/sage/203 wrote:
> int n[1][1][1][1][1];
> こういう配列を作ってみたんですが、
> 実際のメモリ上ではどういう構造になっているのか全く分かりません。
int×2×2×2×2×2でしょ?
> int n[5] とも違うようだし、
どこから5がでてくるのでしょう?
>>204 > > int n[1][1][1][1][1];
> > こういう配列を作ってみたんですが、
> > 実際のメモリ上ではどういう構造になっているのか全く分かりません。
> int×2×2×2×2×2でしょ?
( ゚Д゚)ハア?
君ねー見た目が命だよ。
>>203 面白い。
>sizeof の値も sizeof(n) == sizeof(int) だし、
1x1x1x1x1で要素一つだから当然。
>203 その多次元配列のメモリレイアウトのこと?
209 :
デフォルトの名無しさん :01/12/28 21:24
基本的に下から順番に固まりになってる絵を想像すれば問題ない
>>204 pacalじゃないんだから配列指定は 最大じゃなくて サイズを示す
サイズは1だから メモリは 単なるintの変数と同じ
>>207 たしかに、×2->×1ですね。(^^;
> > sizeof の値も sizeof(n) == sizeof(int) だし、
> 1x1x1x1x1で要素一つだから当然
というかもとの発言のひとは、何を確認したかったのだろう?
ただ、cの配列はサイズを越えたからといって叱ってくれる訳ではないので n[x1][x2][x3][x4][x5] というように x1,x2,x3,x4,x5に 0以外を指定しても怒られない
In article
>>209 , デフォルトの名無しさん/209 wrote:
> 基本的に下から順番に固まりになってる絵を想像すれば問題ない
下ってどっちですか?
>>213 ビルの窓から踏み出したら移動して逝く方向。
ご自身で確かめるよろし。
In article
>>210 , デフォルトの名無しさん/sage/210 wrote:
> 配列指定は 最大じゃなくて サイズを示す
> サイズは1だから メモリは 単なるintの変数と同じ
そういえば、2ch.comp.programmerほうで、
「関数の引数に渡すときに&をつけるのがいやなので)」とかいう
だけの理由で、int a[1];みたいに書くとか言ってる人がいましたね:)
(それって、つまり代入や比較はその宣言したところではほとんどしなくて、
関数の引数に渡すばかりなんだろうか)
>215 スマン 判るように言ってくれ 引数の宣言と 代入や比較とは?
In article
>>212 , 210/sage/212 wrote:
> n[x1][x2][x3][x4][x5] というように x1,x2,x3,x4,x5に 0以外を指定しても怒られない
負の数は? > 0以外
>217 試してみなさい。 たいていの環境では叱られないだろう
In article
>>214 , デフォルトの名無しさん/sage/214 wrote:
> ビルの窓から踏み出したら移動して逝く方向。
> ご自身で確かめるよろし。
添字の小さいほうがどっちになるの?
>218 VC6.0でコンパイル。 警告、エラー ともになし。
In article
>>216 , 210/sage/216 wrote:
int a[10]; と宣言しておいて、
a[20] = 0; と代入してもコンパイル時に警告だしてくれるコンパイラーは
あまりないっていう程度の意味では?
# でも「0以外」ってのがよくわからん。そっちに関しては宣言時の話?
>>219 移動して逝きついた先で添え字を調べてみろ。
ええと、
>>215 の前半は
int func(int a[1])
{ なんとかかんとか
}
みたいに参照代わりに配列を使うという話と読んだ。
がその話と後半 括弧内が繋がらない ので判らんと聞いた
間違ってオタオタ中ですか?
へー、素直に訂正することもあるんだー
>>225 間違いもあるさ。あんまり突っ込まないでやってくれ。
In article
>>224 , デフォルトの名無しさん/sage/224 wrote:
> 間違ってオタオタ中ですか?
そういうことにしたいのですね:)
なんか必死だな。
>>223 どっちかというとこういうことじゃないか?
int func(int *);
int a[1];
func(a); /* &をつけない */
>>229 ああなるほど どうせそう書くなら
int func(int a[]); も一緒だし、そう書いた方がなんかいいと思えるよう
になったのは最近delphi漬だからかなあ
>>213 一番右の添え字。
配列のイメージってわかりますか?
レスありがとうございました。 n のひとつ分が多次元になるわけじゃなくて、 単なる n だったんですね。 勉強になりました。
そんな君に 「C言語ポインタ完全制覇」 をすすめる
うむむ、どう理解したんだか全然分からん。
int n[1][1][1][1] = {{{{1}}}};
n[0][0][0][0] = 1;
for (n[0][0][0][0] = 0; n[0][0][0][0] < 10; n[0][0][0][0]++) printf("%d\n", n[0][0][0][0]);
>238 メモリリークおめでとう
int n[1][1][1][1][1]; int i,j,k,l,m; /* 初期化 */ for(i=0;i<1;i++){ for(j=0;j<1;j++){ for(k=0;k<1;k++){ for(l=0;l<1;l++){ for(m=0;m<1;l++){ n[i][j][k][l][m]=0; } } } } }
242 :
デフォルトの名無しさん :01/12/29 00:21
>>233 >「C言語ポインタ完全制覇」
これ(・∀・)イイ!
この本の著者さん、今度はJava本出したんだよね。
Javaでは何を完全制覇するの?
>>243 完全制覇じゃないけど、謎と落とし穴と解明するらしいよ。
そかそか。
ごめん…。 sage進行だったんだね…。
In article
>>227 , Kusakabe Youichi/227 <
[email protected] > wrote:
> In article
>>224 , デフォルトの名無しさん/sage/224 wrote:
> > 間違ってオタオタ中ですか?
> そういうことにしたいのですね:)
ほんものだったら「ということに」では? :)
In article
>>228 , デフォルトの名無しさん/sage/228 wrote:
> なんか必死だな。
ということにしたいわけですか? :)
# えさやりすぎか?:)
>248 ふーん、で? 何怒ってるの?
糞壁改め餌壁
In article
>>249 , デフォルトの名無しさん /sage/249 wrote:
> ふーん、で? 何怒ってるの?
おこってるっていうことにしてしまうと、何か安心するわけですね? :)
遅れてゴメン え〜と、 僕が言おうとしてたのは ・ポインターが必要なところに0が出てきたら NULLポインターに置き換えられる ・NULLポインターはビットパターンが『0』とは限らない ってことで void* p[10]; memset(p,0,sizeof p); のとき(32ビット環境で) ((DWORD)p[1]) == 0 ビットパターンが0なので これは真になるのはわかるんだけど p[1] == 0 (この『0』はNULLポインターの値に置き換えられる) これが必ず真になるかが知りたかったの
なる。
In article
>>253 , 152/sage/253 wrote:
> ・ポインターが必要なところに0が出てきたら
> NULLポインターに置き換えられる
「置き換え」というのは適切じゃないですね。
「解釈」ぐらいに言ったほうがいいのでは?
> ・NULLポインターはビットパターンが『0』とは限らない
> ってことで
「NULL」って書いちゃうと、マクロで定義した「NULL」という名前の
ことだと思ってしまって、理解できなくなるひともいるので、
カタカナで書いたりちがう書き方したほうがいいかも。
何でコイツの言う事は毎回毎回こうも中身が無いのかね (呆
そのためのコテハンだから。
voidだから。
In article
>>256 , デフォルトの名無しさん/sage/256 wrote:
> 何でコイツの言う事は毎回毎回こうも中身が無いのかね
「ということにしたい」
うんうん (笑
>>259 > 「ということにしたい」
「ということにしたいということにしたい」
262 :
デフォルトの名無しさん :01/12/29 15:42
文字列strの中の数字文字だけ削除する関数を作ったのですが、 void del_digit(char str[]) { unsigned i = 0; unsigned j; while(str[i]){ if (str[i] >= '0' && str[i] <= '9'){ j = 0; while(str[i + j]) str[i + j] = str[i + ++j]; //A }else i++; } } //A�のところを str[i + j++] = str[i + j]; とするとうまくいきません。 左辺を読み込んだ時点でjはインクリメントされるわけではないのでしょうか?
無効アドレスとはなんぞやを考えれば答えは必然と解る。
264 :
デフォルトの名無しさん :01/12/29 15:54
>>263 無効アドレスですか。。。
なんか初めて聞くような気が。
何せ勉強はじめたばかりなもので。
In article
>>262 , デフォルトの名無しさん/262 wrote:
> str[i + j++] = str[i + j];
> とするとうまくいきません。
side-effectついてはK&Rにも書いてありますよ。
>>253 > ((DWORD)p[1]) == 0
> ビットパターンが0なので
> これは真になるのはわかるんだけど
なるとは限らない。
値をキャストする際にはビットパターンの変換も行われることを忘れないように。
DWORD 0のビットパターンが0の場合は((DWORD *)p)[1] == 0なら成り立つ。
> p[1] == 0
> (この『0』はNULLポインターの値に置き換えられる)
> これが必ず真になるかが知りたかったの
これも必ず真になるとは限らない。
規格に忠実に書く場合、null pointerで初期化したいならmemsetを使わずに
void *p[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
とか
for (i = 0; i < sizeof(p) / sizeof(*p); i++) p[i] = NULL;
で初期化する。
>>265 > side-effectついてはK&Rにも書いてありますよ。
これについて説明する際はsequence point(副作用完了点)のことを言う必要が
あるのでは?
268 :
デフォルトの名無しさん :01/12/29 16:12
>>265 >>267 K&Rはもってないです。
side-effectとsequence pointですか。。
なんか難しい話なのかな。
副作用ってのは関数形式マクロ使うときに2度インクリメントされたりする
から気をつけろと聞いたくらいです。
269 :
262=264=268 :01/12/29 16:20
です。 ここID出ないんだ。
In article
>>268 , デフォルトの名無しさん/268 wrote:
> side-effectとsequence pointですか。。
> なんか難しい話なのかな。
> 副作用ってのは関数形式マクロ使うときに2度インクリメントされたりする
> から気をつけろと聞いたくらいです。
たとえば a[i] = i++; で、何が起きるかは保証されない(a[5]に6が入るかもしれないし
5が入るかも)けど、
if (func1() && func2())....ではfunc1がfunc2より前に呼ばれることと、func1()の
返す値が0じゃなかった場合にfunc2()呼ばれないことが、
親切系の日下部さんもいるんだ。
274 :
デフォルトの名無しさん :01/12/29 17:37
つか、わからなかったら、インデックスのインクリメントなんて、別の行に書け。
>>262 つーか、削除した分だけ最後の文字が増殖しそうな気がするのだが。
a[5]に5が入るかもしれないし、a[6]に5がはいるかも、じゃないのかな???
ネットに落ちてるソースを見てみると、 宣言やマクロが全部一つのヘッダファイル(例えばcommon.h) にまとめられていて、それを全部の .c でインクルードしてる場合がある。 これはアリなのか? たんなるコーディングスタイルの問題か? 俺はいつも hoge.c には hoge.h というように、 一対一にヘッダ作ってるから、ちょっとビビった。
In article
>>277 , デフォルトの名無しさん/sage/277 wrote:
> ネットに落ちてるソースを見てみると、
> 宣言やマクロが全部一つのヘッダファイル(例えばcommon.h)
> にまとめられていて、それを全部の .c でインクルードしてる場合がある。
>
> これはアリなのか? たんなるコーディングスタイルの問題か?
>
> 俺はいつも hoge.c には hoge.h というように、
> 一対一にヘッダ作ってるから、ちょっとビビった。
「まとめかた」の問題では?
意味もなく1つにまとめているんだったら、よくないですね。
>>277 それぞれのソースファイルに対してヘッダーファイルをつくるのなら、
マクロ等はすべてソースファイルの中に書けよ。
昔のCコンパイラは遅かったからね プリコンパイルなんて仕掛けが出来てさ そいつを最大限に利用しようとすると ヘッダファイルを全部纏めるというクセが
悪い。一番肝心なことを訊いてなかった。 つまり「みんなはどうしてる?」ってことだ。 どうまとめようがアリなのは分かるけど、 なんか効率のいい方法とか、おすすめはないかな? 最近よく見るのが #include "hoge.c" ってカンジで、 .c をそのままインクルードする方法。 少なくともこれはよくないと思うんだが。
>>283 ん?どっちにしてもソースファイルx2になるんじゃないの?
>>284 ヘッダーファイルを一つにまとめた場合は、ソースファイル+1じゃない。
じゃなくて、ソースファイルに書き込めばソースファイルだけになるじゃない。
>それぞれのソースファイルに対してヘッダーファイルをつくるのなら、 って言う条件の話じゃなかったの??
1000のファイルがあるとすると #include "hoge1.h" #include "hoge2.h" . . . と1000行書くとでも言うのかい? どうまとめるかは規模によるだろ。
In article
>>288 , マグナム/sage/288 wrote:
> 1000のファイルがあるとすると
> #include "hoge1.h"
> #include "hoge2.h"
> .
> .
> .
> と1000行書くとでも言うのかい?
そうですよ。
>>282 基本的には、あるまとまった機能単位でhoge.h hoge.c等をつくり、
その機能単位の複数から参照されるような共通定義は別にcommon.hなど
にまとめておく。
例外はもちろんある。そのへんは機に臨み、変じて応ず。
>>288 そのソースは1000ものヘッダが必要なのか?
構成をもうちょっと考えたほうがいいぞ、となる。
どうまとめるかは「規模」ではなく「依存関係」による。
外から呼ばれる関数のプロトタイプ宣言をヘッダに用意。 呼びたくなったら(リンクしたくなったら)そのヘッダをインクルードする。 それと、それらに使われる構造体やらなにやらの定義のヘッダは 別ファイルに作る。 ってのがスタンダードだと思ってました。
>292 複数の人数でプロジェクト組んでやる場合 そちらの方がソース読みやすいね。 ヘッダでヘッダをインクルードしさらにへっだを... というのをやられると読みにくてしょうがない。
普通1000もヘッダができるようなら、サブディレクトリに分割してライブラリ にでもするだろ。 hoge/foo.c hoge/foo.h hoge/bar.c hoge/bar.h んで、メインでは公開するインターフェースだけを#include "hoge.h"する。
C++だけど、外に見せたくないprotectedやprivateなメンバの宣言と 外から呼ばれるメンバ関数の宣言を別のファイルに書きたくなることがある。
>>295 インターフェイスクラスを作って対処しても、ソースファイルが2つ増えるのがウザいんだよね〜。
つまらんツッコミが入る前に・・・ ×ソースファイル2つ ○ヘッダファイルとソースファイルが1つずつ
>285 ホントに見せたくない変数なんかは.libにすればいいんじゃない? わざわざprotectedされてる関数や変数を理由もなく使うバカはいないだろうし・・・
>>298 >ホントに見せたくない変数なんかは.libにすればいいんじゃない?
クラス定義に書かないで.libにする?
なんかそういう方法あるんですか?
宣言、だな、定義じゃなくて。
In article
>>297 , 296/sage/297 wrote:
> つまらんツッコミが入る前に・・・
>
> ×ソースファイル2つ
> ○ヘッダファイルとソースファイルが1つずつ
ヘッダーファイルはソースファイルじゃないのですね? :)
実装ファイルとヘッダファイル
>303 そこ、エサまいちゃだめ。
Windows用で最新のC/C++の規格に完全対応している コンパイラってドレデスカ?
C言語をやるひとは、アセンブラを覚えた方がいいんですか?
In article
>>306 , age/sage/306 wrote:
> C言語をやるひとは、アセンブラを覚えた方がいいんですか?
お好きなように。
308 :
デフォルトの名無しさん :02/01/01 11:51
>>306 ターゲットCPUが固定ならばアセンブラやるならばCは捨ててもよい
Cコンパイラしかないという環境があるからそういうターゲットならばCもよいと思うが
>>何をもって最新規格というのかわからんがVC++かGCCでとおらないものは
Cとはいえんとおもう。
BCCはANSI対応をうたっているけれどmakeファイルの互換性やライブラリーの互換性が低いのでいやだ
309 :
デフォルトの名無しさん :02/01/01 15:14
C99 のことでしょ? 漏れもC99に対応してるコンパイラーがわからん。
gcc 3.0だろが
311 :
デフォルトの名無しさん :02/01/02 23:55
cygwinっていうのにgccっていうのが入ってたので使ってみたんだけど cygwinからじゃないともしかして実行できないんですか? DOS窓から起動したらエラーで終了しちゃいました。
>>311 cygwin1.dllあたりを見つけたら実行はできるけど
ほとんど役に立たないよ。シェルがなきゃパワー半減。
cygwinのgccはそのままだとcygwin.dllに依存するけど、 オプションでそれ外せるよ。 オプションは"-mno-cygwin"
>>311 DOS窓からも実行できるぞ。
C:\cygwin\bin にパス通しとけ。
パスの通し方は自分で調べてね。
315 :
デフォルトの名無しさん :02/01/03 01:16
cygwinのgccで生成したバイナリってI/O系がちょー遅いよね。 何とかならない?
316 :
デフォルトの名無しさん :02/01/03 01:34
>>315 Winに無い機能をエミュレーションしてるんだから、そらー遅いだろう。
>>313 そのかわりUnix固有な事、例えばfork()なんかは呼べなくなるんで注意。
libcもmsvcrt.dllを使うようになる。
>>315 何とかしたいなら cygwin1.dll の開発メンバーになろう。
標準出力のベンチでRubyに負けたらしいぞ>gcc
ああ、あれはcygwin上での話なのか? 比較したrubyは何版だろう。 Windows用の中じゃcygwin版が一番速いはずなんだが…。
321 :
デフォルトの名無しさん :02/01/03 03:13
「gccっていうの」って発言が出るような時代なのだなぁ。しみじみ。
追試してみた。思ったより速いね>Ruby Cygwin 1.3.6-6 / gcc 2.95.3-4 / Ruby 1.7.2 $gcc -O2 main.c # あっちのスレの 267 $time ./a.exe real 0m3.578s real 0m1.375s real 0m1.281s $time ./a.exe > /dev/null real 0m2.281s real 0m0.031s real 0m0.016s $ time ruby -e "for i in 1..10000 do puts 'hello,ruby'; end" real 0m3.843s real 0m1.750s real 0m1.703s $ time ruby -e "for i in 1..10000 do puts 'hello,ruby'; end" > /dev/null real 0m2.297s real 0m0.031s real 0m0.047s
323 :
デフォルトの名無しさん :02/01/03 03:39
>>322 Perlもきぼーん。
自分でやれと言わないで・・・
ベンチスレ立ててやれよ
いいなぁUNIX環境・・・ 俺のPC/ATじゃあ・・・・・(TT)
ここにも来たか printベンチャー (´д`;)
In article
>>326 , デフォルトの名無しさん/sage/326 wrote:
> ここにも来たか
> print(IM^]A,0 (´д`;)
文字化けしてますよ。
は?死ねよバカ
クソカベニマジレスカコワルイ
>>322 ほとんどがIOだから、たぶんcygwin1.dllに隠れて差が見えないんだろうな。
Linuxだとこんな感じ。
書き出してるデータ量がやや違うが、まあこんなもんだろう。
うーん、やけにperlが速いな。
gcc 2.96
ruby 1.7.2 2001-12-31
perl 5.6.0
$ gcc -O2 main.c
$ time ./a.out > /dev/null
real 0m0.010s
user 0m0.000s
sys 0m0.010s
$ time ruby -e "for i in 1..10000 do puts 'hello,ruby'; end" > /dev/null
real 0m1.115s
user 0m1.080s
sys 0m0.010s
$ time perl -e 'for $i (1..10000) {print "hello,Perl\n"}' > /dev/null
real 0m0.028s
user 0m0.020s
sys 0m0.000s
まだ意味なしベンチやってるし。
あ、rubyで遅いのはputsだ。一桁違う。 $ time ruby -e '10000.times {print "hello,C\n"}' > /dev/null real 0m0.088s user 0m0.060s sys 0m0.020s $ time ruby -e '10000.times {puts "hello,C\n"}' > /dev/null real 0m1.055s user 0m1.010s sys 0m0.050s
ルビー遅っ (^∀^)ハハハっ
#include<stdio.h> main() { printf("EOF=%d",getchar() != EOF); } にキーボードからCtrl+Z(MS−DOS)を入力すると0を返してくれる と思うのですがCtrl+Zを入力するとプログラムが終了してしまいます。 キーボードからEOFを入力するのはCtrl+Zであってますよね。 何がいけないのでしょうか?教えてください。
336 :
デフォルトの名無しさん :02/01/03 08:13
るbぃ晒しああげ!!
337 :
デフォルトの名無しさん :02/01/03 10:03
Cでクラスメソッドみたいなのを実装するにはどうしたらよいのですか? WindowsでたくさんWindowコントロールがある場合1つのWindowだと Handle->発信もとの判別をIF文使うかハッシュしてテーブル使うかしか 思いつかないんですけれど。 C++ならば1つクラス作ってメンバー関数にサブプロシージャもたせれば 実行時に関数の実体のコピーが作られるからメンバー変数にアクセスできるので Handle->発信元レコード指定 の特定ができるけれど Cの場合ポインタをレコードに入れるやり方ではできても 動的に変数分だけ関数の実体を作ったりする方法がわかりません。
In article
>>335 , ポン酢/335 wrote:
> #include<stdio.h>
> main()
> {
> printf("EOF=%d",getchar() != EOF);
> }
> にキーボードからCntl+Z(MS-DOS)を入力すると0を返してくれると思うのですが
まぬけな思い込み。
> Cntl+Zを入力するとプログラムが終了してしまいます。
当然ですね。
> キーボードからEOFを入力するのはCntl+Zであってますよね。
合ってません。
> 何がいけないのでしょうか? 教えてください。
思い込みがいけない。
17ペイジを読みましょう。
#include <stdio.h>
int main(void)
{
printf("EOF=%d\n",getchar() != EOF);
return(0);
}
^Z
EOF=0
できたんだけど・・・
>>335
>>335 終了してしまうというのは、command.comのプロンプトに戻ってしまうということか、
それともウィンドウが閉じてしまうということか。
>341 Schemeでも使うYO!
>>339 Kusakabe Youichiの様なバイタリティ溢れる若者には
初心者を相手にがんばってもらいたい。
<<339 どこを見てもDOSはCtrl+ZでLinuxはCtrl+Dだと書いてあるのですが 違うのですか?どの本の17ページでしょうか? <<342 うつして試してみましたが私の所では0返ってきませんでしたよ。 <<343 プロンプトに戻るということです。何かわかりますか?
In article
>>346 , ポン酢/346 wrote:
> どこを見てもDOSはCtrl+ZでLinuxはCtrl+Dだと書いてあるのですが
> 違うのですか?
EOFがCtrl+Zなわけではありません。
(それが証拠に行の最初以外のところでCtrl+Zしてみればよい(傍証にしかならんか))
EOFという文字コードがあるわけじゃなく、
getchar()が「もう文字がない」ときに返す値なわけです。
ファイルの末尾にいちいちCtrl+Zが付いているわけじゃないでしょ?
たとえば「abcd」だけの4バイトのファイルだったら、getchar()を4回呼ぶ間は
それぞれの文字のコードを返し、5回目に呼んだときに、もうファイルに何もないので
(末尾に達しているので)、EOFをかえすだけです。
フィアルの末にCtrl+Zがついているわけではありません。
> どの本の17ページでしょうか?
まっとうな本です。
> うつして試してみましたが私の所では0返ってきませんでしたよ。
そこで0が返るかどうか「以前」の勘違いがあるんですってば。
>>347 23人目のKusakabeと認定されました。
人格分裂者みたいだな(w
>>348 23人ってあまりにも多すぎるし、そもそも奴はこんな論調を展開するまい。
CP/Mの話をも視野に入れた(でもいちいち言葉には書かない)話になるはずだ。
認定撤回を要求する。
要求は公開されるのだろうか?(w
23人目のハリーポッター?
>>347 >EOFがCtrl+Zなわけではありません。
>(それが証拠に行の最初以外のところでCtrl+Zしてみればよい(傍証にしかならんか))
試してみました。
C:\c>eof←実行して
kno←適当に文字を打ってここでCtrl+Zを入力すると
C:\c>←この状態になって
C:\c>eof←もう一度実行すると
EOF=0←これが表示されました。
どういうことなのでしょう?0は出てくれたのですがわけがわかりません。
</PRE></TD></TR></TABLE> は気にしないで下さい。
試しに #include<stdio.h> main() { printf("EOF=%d\n",getchar() != EOF); } とやってみたら?
もしそれで納得出来る結果が出たなら 1、printf は必ずしも即座に結果を出す訳ではないです 2、結果をフラッシュせずに終ったら出力されない場合がある事 3、実際に出力させるには \n を送るか fflash で
ああ、全然的外れだ。 結局 ctrl+Zで標準入力だけでなく標準出力も閉じてしまう win95系のdos窓で起こるバグの事を言ってるんじゃないかな?
日下部=voidって 昔某UG掲示板に論理粘着したあげくに絨毯爆撃で消された、あのvoid氏と同一人物なのだろうか・・・
口調は奴のそれだったのか?
可能性は高そうだけど偽者もいるからな。
アレはHP∞だからのぅ (´д`;) 適当におちょくって遊ぶのが一番だで
>>357 私の環境はWin98です。
ちなみにコンパイラはVC++6.0のやつです。
Ctrl+Zにアンドゥが割り当てられているのが原因だと思うのですが。
違うのでしょうか?
>>363 作った実行ファイルをそのままwinNT系で動かせば大丈夫な筈
これは コンソール入力にctrl+Zが入力される事で コンソール出力も閉じてしまう
問題で、試しに そのアプリをリダイレクトしてみたら?
例えば test.exe だとしたら
test. >temp.txt として
ctrl+Z を入力してみればちゃんと出力される筈
>>363 何もしなくてもUNDOの機能が組み込まれると思ったら大間違いだ。
DOSプロンプト上には表示されないのになぜなんでしょう? Ctrl+ZやEOFをキーワードにGoogleで検索して軽く回ってみた のですがどのページもこの問題について触れてないのが不思議です。
368 :
デフォルトの名無しさん :02/01/04 23:43
今までUP4800でプログラムを作ってきてたのですが、お金がないので Linuxに載せ換えなければならなくなりました(泣) 大変にお行儀の悪いプログラム達で、ネットワーク経由のデータをntohl,hs なんて一切せずそのまま使ってたりします。 バイナリで書き込んである大量のデータファイルもあるのですが、1・2・4 バイト混合の構造体(穴埋めくらいはしてありますが)+ご丁寧にビットフィ ールドも使いまくっているのですが、これらを一気に変換する仕組みはないで しょうか? 地道に見つけて一行ずつ直していくほかないのでしょうか? だいぶ数があるので、もうメゲているので、どなたかのお知恵を拝借させてい ただきたく。
>367 さあ? 単なるバグだと思ってたし、実際、コンソール入力出力は ハードやbios叩いてたから深く考えなかったなあ・・・・スマン >368 ご愁傷様 思いつくのは 1、そのサーバマシンがある間に、その構造体を読み書きする部分を直接から ハンドリング関数で読み書きするように変更 例えば getDataHoge(フィールド名) みたいな感じね フィールド名はenumで定義 2、その後linuxに移す という事くらいかなあ
スマンだなんてとんでもないです。 いろいろありがとうございました。
371 :
デフォルトの名無しさん :02/01/05 00:31
>>369 どうもありがとうございます。
UPのOSに依存する部分を確認して一行ずつ直すのにメゲているので
部分的でも良いのでさっと変換できるような仕組みがあったらいいなー
と、虫の良いことを考えているのですが…ないですかねぇ?
>.371 正直 UP4800 は触った事はありません。 64bitマシンでしたっけ? int も64bitですか? そしてエンディアンは同じですか? エンディアンが同じなら構造体の intとかをint64とかに変名して一挙に 修正すればスムのでしょうけど
373 :
371です :02/01/05 00:50
>>372さん UPはMIPSで、R10000シリーズを使ってます。 32ビットですね。 多少癖はありますが、ごく普通のUNIXマシンだと思いますよ。 固定資産償却済みの化石のようなマシンだとR3000もあります。 #さらにゴミのような扱い(現役ではあるんですね、なさけない…)の #古い古いUP(正確にはUPではなくEWS4800ですが)386もあります。
MIPSなら 両方に対応出来るんだから リトルエンディアンにしてそれで終わりじゃないのかい?
375 :
372です :02/01/05 17:14
>>374さん 教えて君ですみません、もう少し教えて貰えませんか? UP4800上のプログラム、データ->Linuxへ移植する際にMIPSマシンだとリトルエンディアン にしておわり、ってどういう意味なのでしょうか? CPUそのものがエンディアン変換を行ってくれたり、特別な命令を使うと86系と同じエ ンディアン/パディングを行ってくれるのですか?
あ、アプリが(バイナリ互換の為)32bitモードで動いてるって可能性もあるか。 ちゃんとマシン/OSの仕様確認した方が良さそうだね。 fileコマンドとかである程度わかると思う。
PS2はintが4バイトでlongが8バイトな糞システム。 ほとんど嫌がらせだよな...
>>378 IA-64はそれと同じで、ポインタも64bitですが、何か?
381 :
デフォルトの名無しさん :02/01/08 21:14
>>346 亀れす
Section 1.5 Character input and output 17
is an expression .....以下略
日本語版は21Pね
382 :
デフォルトの名無しさん :02/01/08 21:19
383 :
デフォルトの名無しさん :02/01/09 11:39
atoiの逆ってsprintf()でいいの?
384 :
デフォルトの名無しさん :02/01/09 12:45
itoa
iota
>385 1ch逝け
387 :
デフォルトの名無しさん :02/01/09 14:43
でも処理系によっては無くない?
388 :
デフォルトの名無しさん :02/01/09 14:59
NULLは0とは限らないよ。 やねのHPに書いてあった。 でもWindows上ではNULL==0が保証されてるよ。
>でもWindows上ではNULL==0が保証されてるよ。 だれが保証してんねん。
390 :
デフォルトの名無しさん :02/01/09 15:05
連帯保証人=???
391 :
デフォルトの名無しさん :02/01/09 15:09
APIリファレンスに書いてあった気がする。
392 :
デフォルトの名無しさん :02/01/09 15:11
Windowsじゃなくて、C/C++処理系が保証してます。 厳密に言うと、 「NULLが再定義されてない場合、式”NULL==0”を評価すると1になる。」 ってところでしょうか? これ、何度も繰り返される話ですよね。
>>388 ほう?"Windows"が保証しているのか
# VC++ではなくて
394 :
デフォルトの名無しさん :02/01/09 15:14
Windows CEMeNT 20009895 といってセメントなんです、固まるものなんです。 固まらないほうがおかしいくらい。
395 :
デフォルトの名無しさん :02/01/09 15:20
ていうかWindowsのAPIがNULL==0として扱ってる。 ∴Windowsも保証。
>>395 >ていうかWindowsのAPIがNULL==0として扱ってる。
それとこれとは話がちがうような。
Windowsが保証してるんじゃなくて Windowsがそれを前提としているだけだRO
398 :
デフォルトの名無しさん :02/01/09 17:11
int *p; p=realloc(p,size); やっちゃったよ。 メモリが確保されないで1時間悩んだよ。
小一時間自分を問い詰めて吉
Win32コンソールでビットマップの表示の仕方教えてください。
コンソールでBMP表示・・・ できるのか?
コンソールには表示出来ませんから、窓をぴったり重ねて表示するとか
C/C++以外にポインタが使える(絶対番地にアクセスできる)高級言語って ありますか?
>>403 なんでこのスレで聞くの?
DelphiもC/C++と同じ程度に絶対番地にアクセス出来るし
VBでも多少は出来るよ
>>403 Pascalにもポインタはあるが、“絶対番地”ってなんだろうね。
言語仕様とOS依存な話と混ざってないかい。
406 :
デフォルトの名無しさん :02/01/11 00:00
質問です。 fp = fopen("hoge.txt", "a"); strcpy(a, "abc\n"); fputs(a, fp); fclose(fp); てなプログラムで、このときhoge.txtの後ろに文字列"abc\n"が追加されますが、 先頭に追加するようにできる、上手い方法はないですかね…? 1回ファイルの中身を全部読み出さないとだめなんでしょうか。 ヘタレな質問でスマソ
最初のhoge.txtの中身が
"1234\n"
だとして、
>>406 のプログラムを実行するとhoge.txtが
"1234\nabc\n"
ってなりますよね?
それを
"abc\n1234\n"
となるようにしたいのです。
…わかりづらかったらスマソ
ちなみに、 FILE *fp; char a[4]; としてます。
>>402 変数にアドレスとデータの概念(ポインタ)があり
アドレスの演算ができるのはC系統の言語だけ。
>>410 なんか格好良い言い方だな。
「410さんのレスがもらえるのはこのスレだけ!」
しかしC系統の言語ってのは、大雑把なくくりだな。
アセンブリは?
言語違うとか返されそうだ…
410のレス先は
>>403 だった。正直スマン。
>>411 アセンブラはあって当たり前と思うのであえて書かんかった。
というかそれが無いものはもはやノイマン型コンピュータではないと思う。
配列渡す時は、配列の最初のポインタを渡せばいいの?
配列の先頭へのポインタ渡すなら、それでもいぞ、でも、配列の大きさは渡せないぞぉ。 配列をそっくりコピーして渡したいなら、構造体に埋め込んじゃえ。
415 :
ネタではありません :02/01/11 13:53
・・・ディスクフルってなに?
>>415 > ・・・ディスクフルってなに?
Cと関係あるのかな?
1.44Mのフロッピーディスクに2Mのデータを書き込もうとすると
発生する現象のことだ
>>406 ファイルは、 "a" または "a+" のアクセス種別で開くと、
すべての書き込み操作がファイルの終端から行われます。
ファイル ポインタは fseek 関数または rewind 関数で移動できますが、
書き込み操作を実行する前に必ずファイルの終端に戻されます。
したがって、すべてを読み出すしか方法はありません。
本当にこのスレは頭の悪い人ばかりですね :) 自分は天才とは言いませんが、ここに来るのは子守みたいなもんです :)
>>420 「C の超難しいことなら漏れに聞け」スレでいってください
422 :
デフォルトの名無しさん :02/01/11 16:02
会社をやめてしまった先輩のソースをメンテしてるんですが、 どうにも理解不能な個所があるんです。 sprintf(wrkbuf, "%s%c", snddata, i["$#!"]); i["$#!"]って、これはなに? iはただのintで配列でもなんでもないのに。 しかも配列のインデックスが文字列!? 動いてるからいいんだけど、気持ち悪いよぉ。
defineされてるとか?
424 :
デフォルトの名無しさん :02/01/11 16:17
>>422 Cの[]演算子は実は交換法則がなりたつ。
だから"$#!"[i]と意味は一緒。(それでも俺はこんなソースキモくて嫌いだが)
しかしソンナコトほとんどだれも知らないし普通知る必要も無い。
その先輩のささやかな置き土産かも。
トロイやウイルスでなくてよかったな。
>>422 > sprintf(wrkbuf, "%s%c", snddata, i["$#!"]);
>
> i["$#!"]って、これはなに?
> iはただのintで配列でもなんでもないのに。
int i = 0;
char p[] = "$#!";
で、
p[i] と i[p] は同じ結果を返します。
"abc"[i] と i["abc"] も同じですね。
でもi["abc"]なんて書き方をするプログラマはドキュソ決定。
427 :
デフォルトの名無しさん :02/01/11 16:20
>>400 できるよ。
0xA800
0xB000
0xB800
0xE000
のセグメントがそれぞれ青、赤、緑、輝度になってるから
てきとーに書き込むのさー。
君にならできるさー。
428 :
デフォルトの名無しさん :02/01/11 16:23
>>425 ゴメソ…。
俺も面白がってやってる…。
>>424 >>425 ありがとうございます!
なるほど、"$#!"[i]と同じ意味ということですか。
一気に霧が晴れました。
"0123456789ABCDEF"[n]; ってやるとどうも頭でっかちで気に入らない。で、 n["0123456789ABCDEF"]; って、やったり…。
多分Perlの特殊変数 `$#" のつもりと思う・・・ (アフォだなぁ
あれ? 違うのかな? 話は交換性の方に言ってるけど 一応defineされてないか確認しても良いカモ 因みにPerlでは配列の最後の要素を指す添え字です -> $#
>433 や、ども。defineじゃありませんでした。 Perlとも関係ありませんでした。 たぶん先輩はこれ書いてる時にもうやめるつもりで、 僕に試練を与えてくれるつもりだったのでしょう。
じゃあ、試練に敗れたんだ…。
なぜ俺のことを漏れって言うのですか?
>>435 あう。でもでも、関数へのポインタを返す関数の連鎖実行(うまく言えない
みたいのはなんとかクリアしたので自分では50点付けてます。
>>410 >変数にアドレスとデータの概念(ポインタ)があり
>アドレスの演算ができるのはC系統の言語だけ。
Delphiにもあるし、出来るけど?
var p:^byte; とポインタを定義して
inc(p,10); で p=p+10 相当の事も出来るよ
absoluteを使ってアドレスそのものを割り当てる事さえ出来る
440 :
デフォルトの名無しさん :02/01/12 12:35
スレタイトルに笑わせてもらったので(・∀・)アゲ!
あぼーん
443 :
デフォルトの名無しさん :02/01/12 16:32
今Cで、getchar()関数で得た値をコマンドとして int command(char cmd)みたいな感じで 関数の処理を分けるのを作っているんですが、 while(flag) { cmd=getchar(); flag=command(cmd); } とすると、getchar()の値が、最初に入力した値のまま cmdに代入されるんですよ。 なにかうまい解決方法はないですかね?
因みに一回目はうまくいきます。
445 :
デフォルトの名無しさん :02/01/12 17:36
cmd = getchar() の後に、 fflush(stdin) を入れてみてください。多分うまくいくはずです。 標準入力の内容をフラッシュするのです。
ありがとうございます。m(_ _)m 解決できそうです。
C-FAQに標準入力のフラッシュ(というかクリア)について書いてあるので、 読んどいたほうがいいかも。 結論をいってしまうと、処理系依存な方法を使うしかない。 fflush(stdin)かrewind(stdin)あたりのどれかしらは多分使えるので、 どれが使えるかライブラリリファレンスをチェック!
449 :
デフォルトの名無しさん :02/01/14 02:34
ねずみ講あぼーんage
「C の超カンタンなことなら漏れに聞け 」って挿入の弧と?。
>450 やっぱ年寄りは早起きなんだな。
452 :
デフォルトの名無しさん :02/01/14 07:49
すいません、Cの初心者(&コンピュータの仕組み自体もよく分かってない)なので すがこの前 #include <stdio.h> void main() { char a; scanf("%s",&a); char *b = &a; for(int i = 0;b[i] != 100;i++) {} printf("dまでの字数は%d文字です\n",i); } と書いたらコンパイルは通って文字数の数え上げも出来たのですが何故だか5文字 以上打ち込むと強制終了のダイアログが出てしまいました。 友人に相談したら”お前怖いことするなぁ・・・邪悪だよ・・・。”としか逝って くれませんでした。 一体何がいけなかったのでしょうか? なんか初心者が質問しても良さそうなスレタイトルだったので思い切って質問して みました。もしかしたら馬鹿な質問かもしれませんがどうか皆さんの御知恵を貸し てください。
453 :
デフォルトの名無しさん :02/01/14 07:57
>452 >char a; はメモリを一文字分しか確保してない。 そこに文字列を入れることはできないのです。 char a[256]; のような感じにしましょう。 あと 'd' を意味しているのなら 100 と書かずに 'd' と書きましょう。 つか、ちゃんとCの本読みましょう。
>>452 自力で解決できるかどうかが、試金石になるでしょう。
>452 手元にCの本はない?
あ、おそっ、、、
>> 452 0文字分(+NULL終端)しかない領域に、 それ以上の文字列を突っ込んでいるから。
>>458 キミもなんかおかしな事言うね。
問題なのはこれでしょ
>char a;
>scanf("%s",&a);
>>459 あんたが( ゚Д゚)ハア?
それがまさに1バイト(=char)に文字列突っ込む行為でねーの?
>>459 キミもなんかおかしな事言うね。
問題なのはこれでしょ
>char a;
>scanf("%s",&a);
以下永遠に続く。
5文字まで大丈夫って言うのはなんでだろ。
アラインメントのせいで、4文字までは大丈夫、つか3文字+\0までは大丈夫そうなきがする、 あとは鼻から出た悪魔に気がつくのが5文字目入れてからだって事かも。
464 :
デフォルトの名無しさん :02/01/14 10:53
>>452 for(int i = 0;b[i] != 100;i++)
ってのも、思ったとおりになってないだろうな。
たぶん
for(int i = 0;i != 100;i++)
だろうね。
for(int i = 0;i<100;i++)
って書く人が多いから、このほうが意図が伝わりやすいけど。
つことは、
char a[100] ;
が正解かし?
465 :
デフォルトの名無しさん :02/01/14 10:55
char a[100]; scanf("%s", a); だ、100バイト以上入力したら鼻悪魔だけど。
for(i=0 ; b[i] ; i++) と思われ。
>>461 > char a;
> scanf("%s",&a);
char a[1];
scanf("%s",a);
1バイトに文字列突っ込む=これと同意だろ?
と言いたいのですが。
それとも俺が根本的におかしな事逝ってるのか、461さんよ?
ついでに 100と比較しているのは、454さんも言っているように for(int i = 0;b[i] != 'd';i++) と同意だと思われ。 “dまでの字数…”と書いてある~から。 これだとNULL終端見てないんで、 for(int i = 0;(b[i] && b[i] != 'd');i++) か。 ただしコレだと'd'が存在しない場合のことはしらん。 文字列を格納する領域が必要なことは既に多くの方が説明されているので省略。
>>467 >1バイトに文字列突っ込む
この仕様を満たそうとして
> char a;
> scanf("%s",&a);
なんだな。おっしゃるとおりだ。
ただ、仕様の時点でバグがある。
>>467 >>459 >キミもなんかおかしな事言うね。
というほど根本的な違いがあるのかね?
もちろん、
>>452 のレベルにおいて、だが。
>>458 も
>>459 も指摘してる場所は同じだろ、といいたい。
ま、おれがとんでもない勘違いをしてるのなら、指摘されたいと切に願う。
正規表現で言えば、 文字:. 文字列:.*\0 1bitで文字列を表現できるのは空文字列だけ。
どーでもいいじゃん。 バッファ確保さえすれば、いいじゃん。
474 :
デフォルトの名無しさん :02/01/14 12:29
charの変数と、要素数1個のcharの配列とは根本的に違うのを
>>452 がわかってれば、
どこがおかしいのかはすぐに気がつくだろう、という意味では、大きな違いがありそうだな。
何が違うの? >charの変数と、要素数1個のcharの配列とは根本的に違う よく分からない、マジで教えて下さい
>>475 データ型(変数型ではない)が違いますよ。
>>471 >
>>459 >キミもなんかおかしな事言うね。
> というほど根本的な違いがあるのかね?
あぁ!?
“キミもなんかおかしな事言うね。”
ってのは俺のカキコじゃねーよ。
459のカキコだ。
printf("%c",&a); と printf("%c",a); の違い?
>>478 その認識、非常に危険だがまぁ、その違いでもある。
&は何をするものか知ってるか?
>>480 スマソ
459=461で、コピペで煽り返されたと思った。
俺の根本的考え違い、鬱氏。
>>481 あ、やぱし、ちょっとアツくなったよ、ゴメソ
483 :
デフォルトの名無しさん :02/01/14 14:12
int c c = getc(stdin)) >= 0 で文字"a"を読み込むと、cには97が入る。 何で?
484 :
デフォルトの名無しさん :02/01/14 14:15
ASCIIコード?
>>483 ファイルからは8bit固定長のデータを常に読む。
JISコードの場合、int型で変換すると10進数で127までの
数になる。
つまり、aという文字は00110001と表されている。
これを10進数にすると97。
488 :
名無し募集中。。。 :02/01/14 15:04
>>1 どういうとき引数にconst使えばいいの?
489 :
1じゃないけど :02/01/14 15:12
>>488 関数のなかで、読取専用にしたい変数につかう。
もし変更すると、コンパイラに怒られる。
>>488 引数を定数式として使いたい場合。
つまり、プログラムを通して値が変わらないような場合に使う。
プログラムにおいて、値を変更したい時は宣言部の値を
変えればいいことになる。
491 :
名無し募集中。。。 :02/01/14 15:17
>>489 ポインタ変数にconstつけると、何が読み込み専用になるの?
492 :
名無し募集中。。。 :02/01/14 15:19
>>490 それだと、#define とどう違うの?
493 :
デフォルトの名無しさん :02/01/14 15:23
>>487 やっと謎が解けた。
完璧理解しました。ありがとう
#defineはコンパイルにおいて出てきた特定の文字列が 同じ定数に置き換わる.適用範囲はプログラムソース全体。 constの適用範囲は#defineより狭い。 外部関数の中で宣言すれば、外部関数の中でしか役割を果たさない。 ポインタ変数も,実数であらわされる。 その値が変わらないことを意味する。
>>491 constは直後の語にかかる。
const int *a;は値の代入はできないが、ポインタの代入は可
int const *b;は値の代入はできるが、ポインタの代入は不可
ひょっとして、Cじゃなくて、C++の話題になってきたかもしれないのでsage
sageてない。鬱氏
497 :
デフォルトの名無しさん :02/01/14 15:35
#defineに比べて、const定数は、コンパイラが型チェックをしてくれるYO!
498 :
デフォルトの名無しさん :02/01/14 15:42
a=12 b=6 c=a+b d=a-b write(*,*) a,b write(*,*) c,d write(*,*) a*b,a/b end みたいなプログラムをするには、 どんなソフトが必要ですか?
>>495 const int *a は int const* a と同じ。
ポインタを const にするには int* const a とする。
>>498 多分、きみにはそのプログラムを作ってくれる人が必要だね。
>>500 まぁこんな感じの、ってことで。
FORTRANプログラムって言うんでしょうか。
何を使ってプログラムを実行するんですか?
>>501 何かカワイいから教えてあげたいが、訳和歌蘭
FortranでもCでも良いからコンパイラが有れば
>>498 みたいなソースから実行可能なコードを生成出来る。
コンパイラはフリーで沢山有るから探してくれ
>>498 Windows98以降をつかっているなら、
Dim a, b, c, d
a = 12
b = 6
c = a + b
d = a - b
WScript.Echo a, b
WScript.Echo c, d
WScript.Echo a*b, a/b
これをメモ帳に貼りつけて、abcd.vbsなんていう名前で保存してから、
そのファイルのアイコンをダブルクリックみよう。
ダブルクリックしてみよう。
ありがとうございました。 コンパイラを手に入れました。 なんですが、498をそのまま使ったら「宣言の構文エラー」って言われました。 > 498みたいなソースから実行可能なコードを生成 とはどうやるんでしょうか。
すいません、解説してくれてましたね。。。 ありがとうございました。
>>505 ここはC言語のスレ、で498のソースはどうみてもC言語ではないのだが?
ていうか何言語よ?
・数値演算の結果を出力したい
のか
・498のソースそのものを実行したい
のか、どっちよ?
#include<stdio.h>
void main(void){
int a,b,c,d;
a=12;
b=6;
c=a+b;
d=a-b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",c,d);
printf("%d,%d\n",a*b,a/b);
return;
}
hage
2038 年 1 月 19 日 アメリカ東部時間 (EST) にて 2038 年 1 月 18 日月曜日の午後 10 時 14 分 07 秒 協定世界時 (UTC) にて 2038 年 1 月 19 日火曜日の午前 3 時 14 分 07 秒 日本時間 (JST) にて 2038 年 1 月 19 日火曜日の午後 12 時 14 分 07 秒 ●今後の代表的な「危険日」 2025年 1月 1日 昭和100年問題 2038年 1月19日 UNIXの日付管理問題
510 :
デフォルトの名無しさん :02/01/14 18:03
switch(m){ case1: h(r,x,f()); case2: h(r,x,g()); ...... } double f(x) ddouble x; { ...... } double g(x) double x; { ...... } void h(r,x,k()) double r,x,k(); { printf("lf",r*k(x)); } のように関数を引数にもつ関数というのは作れるのでしょうか?
void h(double r, double x, double (*k)(double)); double f(double x); h(r,x,f);
>>511 おお、素早いお返事有難う御座います。そんな使い方があったんですね。
今まで、関数ごとに同じようなhにあたる関数を幾つも作ってた(か、配列を引数にしてた)
のですが、これでスマートになりますです。
513 :
デフォルトの名無しさん :02/01/14 18:37
514 :
名無し募集中。。。 :02/01/14 20:52
>>515 MFCをやらないなら、MVS6.0はあまりおすすめできないかも。
MVSでコンパイルできるソースがgccでエラーになったりと、
初心者にはとっつきづらい。
>>511 無い頭を振り絞って教えてもらったことを試してみました。
とりあえず、次のようにすればコンパイラは通り、実行結果も手計算と一致しました。
(一応、僕と同レベルの人のために結果を載せときます)有難う御座いました。
#include <stdio.h>
main()
{
void h(double x,double (*k)(double));
double f(double x);
double x;
printf("x="); scanf("%lf",&x);
h(x,&f);
}
double f(x)
double x;
{
double s;
s=x*x+1;
return(s);
}
void h(x,k)
double x,(*k)();
{
double s;
s=(*k)(x);
printf("%lf",0.5*s);
}
>>517 すみません。
h(x,&f)の&はいりませんね。
>>515 学生以外買っちゃいけないんじゃないの?
オークション自体ソフトの許諾に抵触したりしてそうだけど。
520 :
超初心者 :02/01/14 22:53
あ!メルマガ出してる兄ちゃんだ!
521 :
デフォルトの名無しさん :02/01/16 22:35
こんちは。 VCのintで-1はなんで0xffffffffなのかがわかりません。 負数の先頭バイトが1なのなら0x80000001じゃないんですか?
2の補数
523 :
デフォルトの名無しさん :02/01/16 22:42
Cって何ですか?
| | | だれかボケて | |____ ____| ∧,,∧ || ⊂ミ.,,゚Д゚彡つ
2の補数の符号反転は、bitパターンを反転して1を足します。
し、しまった…
527 :
デフォルトの名無しさん :02/01/16 22:49
>>521 別にVCに限ったことじゃない。
なぜ0xffffffffになるかは、
1+(-1)=0 なことを考えればわかる。
0x00000001 + 0x80000001 = 0x80000002
では、-2になってしまうだろ?
>>521 そんな表現したら(-1)+1を計算するときにめんどくなるだろ。
かぶったよ…。
と学校のちぇんちぇいに教わりました。
なるほどよくわかりました。 正数表現で先頭バイトに1を付するんじゃなくって。 先頭バイトが1の場合は負数なんですよっていうだけなんですね。 根本的にそこを勘違いしていました。 -1は 0x00000001を反転させて0xfffffffeにしたあと0x00000001を足して 0xffffffffということなんですか。よく分かりました。いつ忘れるかわからないけど(w
>>531 小さな突っ込み大きなお世話だろうけど、
“先頭1バイト”ではなく“先頭1ビット”ね。
昔からずっと疑問に思っていたのですが、なぜC言語ではmain関数から プログラムがスタートするのですか?
534 :
デフォルトの名無しさん :02/01/17 17:52
実は皆の知らないところでmainというクラスが作られていてmain関数はそのコンス トラクタだったのだ!!・・・などというオレはやっぱりバカですか?
535 :
デフォルトの名無しさん :02/01/17 18:07
>> 533 簡単にいうとこうだから↓ _start( ){ main( ); exit( 0 ); }
536 :
デフォルトの名無しさん :02/01/17 18:10
char buffer[256] while(gets(buffer) != NULL) { } これだと一生ループから抜けられないんですが、間違ってますか?
537 :
デフォルトの名無しさん :02/01/17 18:13
>char buffer[256] セミコロンが無い。
>>536 実行環境は何よ?
Windows系なら Ctrl+Z と [Enter]、
Unix系なら Ctrl+D を入力したらループ抜けると思うぞ。
>>540 Win98です。Ctrl+Zで確かに抜けられました。ありがとうございます。
こういう仕様にしたのかな…ふむ。
>>541 > こういう仕様にしたのかな…ふむ。
誰に逝ってんの?
独り言はキモイからヤメテ
#include<stdio.h> #define SIZE 100 void main() { int a[SIZE][3],n,m,l,sum_e=0,sum_l=0,sum_m=0,sum[SIZE]; float ave[SIZE],ave_e,ave_l,ave_m; printf("to stop input ^D\n"); for(n=0; n<SIZE; n++) { printf("\n%d人目のデータを入力してください\n",n+1); sum[n]=0; for(m=0; m<3; m++) { if(m==0) printf("英語の点数は"); if(m==1) printf("国語の点数は"); if(m==2) printf("数学の点数は"); scanf("%d",&a[n][m]); if(a[n][m]==EOF) break; /*ここ*/ if(m==0) sum_e += a[n][m]; if(m==1) sum_l += a[n][m]; if(m==2) sum_m += a[n][m]; sum[n] += a[n][m]; } ave[n]=sum[n]/3; ave_e=sum_e/(n+1); ave_l=sum_l/(n+1); ave_m=sum_m/(n+1); if(a[n][m]==EOF) break; /*ここ*/ } for(l=0; l<n; l++) { printf("\n\n%d人目の三科目の合計点は%d点です\n",l+1,sum[l]); printf("%d人目の三科目の平均点は%f点です\n\n",l+1,ave[l]); } printf("英語\n合計点は%d点\n平均点は%f点\n\n",sum_e,ave_e); printf("国語\n合計点は%d点\n平均点は%f点\n\n",sum_l,ave_l); printf("数学\n合計点は%d点\n平均点は%f点",sum_m,ave_m); } 上の二箇所のifで、「^Dを入力したらループを抜ける」ようにしたつもりなんですが 上手くいきません……
if( scanf("%d",&a[n][m]) != 1) break; が意図した動作だろう。漏れはscanfはおすすめしないが。 man scanfしる!
再びお願いします。 #include <stdio.h> main() { double (*k)(double x); double (*f)(double x), (*g)(double x); double x=1.0; printf("f or g? \n"); scanf("%lf",k); printf("%lf" ,k==f ? f(x) : g(x)); } double f(x) double x; { return(x+1.0); } double g(x) double x; { return(x+2.0); } というコードを書きました。やりたいことはキーボードから関数名(fかg)を 選択することです。しかし、コンパイラを通りません。 fとkが定義されていないと解釈されるようです。(続く)
k=='f' ? f(x) : g(x) と思われ。
あ、kも…
下手な鉄砲なんとやらで、色々試してみてそのうちの1つが #include <stdio.h> main() { double k(double x); double f(double x), g(double x); double x=1.0; printf("f or g? \n"); scanf("%lf",k); printf("%lf" ,k==f ? f(x) : g(x)); } double f(x) double x; { return(x+1.0); } double g(x) double x; { return(x+2.0); } double k(x) double x; { } なのですが、コンパイラは通るのですが、キーボードから f と 入力すると全て3.000000と出力されます。他のアルファベット(a,b,c.......) を入力してもやはり3.000000と出力されます。 ということは、k!=(キーボードからの入力f)と解釈されたということになると思いますが、 つまりこれはキーボードから入力した文字 f とコードの中にある 関数の指すポインタ(のつもり)のfは別物ということになるのでしょうか? 他にもコンパイラを通るものはあったのですが、症状は同じです。 全部とは言いませんが、ヒントを下されば嬉しいです。
早い!
>>546 さんどうも有難うございます。
早速試してみます。というか、言われてみればそうですね。
間抜けでした(^_^;)
scanfのとこ、なんで %lf ? とかも。
つかさ。 double k(double x);に対して、 scanf("%lf",k); は無いとおもうんだけどな。 char buf[255]; fgets( buf, sizeof( buf ), stdin ) printf("%lf",buf[0]=='f' ? f(x) : g(x)); ふつー、こんな感じやないか。
552 :
デフォルトの名無しさん :02/01/18 04:52
>>510 キーボード入力なりなんなりから、直接関数を指定することは不可能です。
>>551 のようにしなさい。
553 :
デフォルトの名無しさん :02/01/18 04:56
全角の処理ってどうやったらいいのでしょうか? struct ad_data{ /*構造体の宣言*/ char name[20]; int no; }; struct ad_data wave[NI]; /*構造体の配列の宣言*/ struct ad_data *pit; /*構造体ポインタ*/ FILE *run; printf("はじめに氏名と年齢を登録します。年齢は半角で入力して下さい。\n何名のご登録ですか?="); scanf("%d",&num);getchar();putchar('\n'); while(i<num){ printf("氏名:"); fgets(lmy,20,stdin); for(b=0;lmy[b]!='\n';b++); lmy[b]='\0'; strcpy(wave[i].name,lmy); printf("年齢:"); scanf("%d",&wave[i].no);getchar(); i++; } if((run=fopen("A:name_file.txt","w"))==NULL){ /*ファイルへの書き込み */ printf("ファイルがオープンできません\n"); exit(1); } pit=wave; for(i=0;i<num;i++){ fprintf(run,"%s %d\n",pit->name,pit->no); pit++; } fclose(run); printf("以上の情報をファイルに書き込みました。読み込みようのプログラムで読込めます。\n");
上のように入力を行った後、ファイルで読込むと苗字と名前の間のスペースで 次に飛ばされてしまい、使い物にならなくなってしまうのです。良い解決法を おねがいします。
555 :
510(アホでスマソ) :02/01/18 04:59
>>551 有難う御座いました。そのまま試してみたら見事目的が叶いました。
あと、当然ですが
char a;
scanf("%c",&a);
printf("%lf",a=='b'?f(x) : g(x));
としてbと入力しても2.000000と出ました。
よく考えたら、別に関数そのものをscanfに渡してやろうとする必要は
全然なかったですね。
>>552 そうだったのですか、これですっきりしました。
読み込みようのプログラムです。 #include<stdio.h> #include<stdlib.h> void main(void) { struct rea_data{ char name[20]; int no; }; struct rea_data lot[10]; int i; int p=100; FILE *run; while(p!=0){ i=0; printf("ファイルの内容を出力します。\n\n"); if((run=fopen("A:name_file.txt","r"))==NULL){ printf("ファイルがオープンできません。フロッピィ―を入れて下さい。\n"); exit(1); } while(fscanf(run,"%s %d",lot[i].name,&lot[i].no)!=EOF){ printf("%s %d\n",lot[i].name,lot[i].no);i++; }fclose(run); printf("\n画面を終了させるには0を入力して下さい。\nもう一度出力させるには他の数字を入力して下さい。"); scanf("%d",&p);getchar(); } }
558 :
デフォルトの名無しさん :02/01/18 05:06
scanfはスペース(空白)をデータ区切りとみなします。 別の関数を使ってください。
fgetsならOKですか?
構造体の定義事態が問題でしょうか?
561 :
デフォルトの名無しさん :02/01/18 05:11
>>559 OKですよ。保存形式(または読み出し処理)は変更しなきゃいけないけど。
どのように変更したらいいのでしょうか? いろいろやってみたのですが、どうもうまくいかなかったのです。 お手数ですが、なにとぞよろしくおねがいします。
563 :
デフォルトの名無しさん :02/01/18 05:20
>>506 構造体の定義は別に変なとこありませんよ。
あえていうなら、読み込みの
while(fscanf(run,"%s %d",lot[i].name,&lot[i].no)!=EOF){
の&lot[i].noは&(lot[i].no)とするか、lot[i].&noとしないと
だめかもしんない。
564 :
デフォルトの名無しさん :02/01/18 05:21
>>563 ありがとうございます!
さっそくためしてみます。
565 :
デフォルトの名無しさん :02/01/18 05:26
>>562 たとえば、書き込み
sprintf(s,"%s,%d",name,no);
fputs(s,fp);
読み込み
fgets(r,30,fp);
rを加工(","を一文字ずつ調べてもよいし、token系の関数で分離していい)
で、noのほうはatoiで数値に戻すとか。
あくまで、例ね。もっと効率いい方法があるかもしんない。
566 :
デフォルトの名無しさん :02/01/18 05:27
スマソ sprintf(s,"%s,%d\n",name,no); こうしないと、読み込み失敗するな。
567 :
デフォルトの名無しさん :02/01/18 05:29
つかCじゃなきゃダメなの? perlなら死ぬほど簡単にできるんだが(ワラ
568 :
デフォルトの名無しさん :02/01/18 06:13
宿題な感じを受けるのは気のせい?
気のせいではありません。よろしくおねがいします。
571 :
デフォルトの名無しさん :02/01/18 08:06
ウィンドウズのシステム関数でDWORDと定義する場合が
あるみたいですけど、具体的にどういった型なのか教えてもらえますか?
>>1
>>571 1じゃねーけど、includeディレクトリにあるwindef.hを見れば分かる。
typedef unsigned long DWORD;
WPARAMとLPARAM ってなんじゃ
575 :
デフォルトの名無しさん :02/01/18 20:36
576 :
デフォルトの名無しさん :02/01/18 20:47
bcc32(ボーランドのフリーなコンパイラ)で文字列を暗号化したいのですが 先生、どうやれば実現できますか?cryptが使えないんです。
>>577 “ハッシュ”って普通、一方向の変換でないの?
復号化できない変換を暗号化と呼ぶのでしょうか?
579 :
デフォルトの名無しさん :02/01/18 21:30
自前で作った構造体を関数で受け取りたい時、 関数側の引数のところは、structって付けないとだめなんでしょうか? というか、つけたらコンパイル通ったのですが。 なんといったらいいか。FILEの構造体ならstructはつけなくても渡せたのに、 自前で作った構造体の場合は、structをつけないとだめか?ってことです。
>>579 良い機会なので、includeファイルを覗くという行為を覚えましょう。
includeファイルはいくら覗いてもタイーホされません。
stdio.hを見ればわかるとおり、
typedef struct
{
...
} FILE;
と typedef されているので、structが不要なのです。
typedef struct _iobuf FILE;
この部分かな・・・。VC6.0<stdio.h>
>>580-581 Thanx!!
typedefの意味が分かった気がしました。
なるほろ。
>>578 暗号化と呼ぶかどうかは知らんが、crypt も復号できない。
584 :
デフォルトの名無しさん :02/01/18 22:11
>>577 先生!一方向性関数は勘弁してください。588さんの言うような可逆的な暗号がいいんです。
バイナリファイルで保存みたいな方法もあるらしいのですが、一体全体どうやるのですか?
ごーやほしてもわかりません。
586 :
デフォルトの名無しさん :02/01/18 22:17
intからcharはatoiだけど、 doubleからcharはどうすればいいでしょう? MSDNのどこかに書いてあるのでしょうか。。。ふむぅ。
587 :
デフォルトの名無しさん :02/01/18 22:19
missった
逆だった。しかもatofだということ判明。
げ、588ゲトしちゃった・・
>>588 すんませんでした。逝って来ます・・・
鬱だ。
592 :
デフォルトの名無しさん :02/01/18 22:46
先生!よかった。よく調べたら見つかりました、暗号化。 罵倒される前でほんとによかった。
ワラタ
プログラミング言語C(K&R)かったんだけどさ〜 これ、たいした事なくない? むっかしから、出てるみたいだけどさ〜 当時にしては画期的だったかもしんね〜けど。
たいしたこと無い人にはたいしたことはないかもしれませんな。 さっさとC++の勉強でも始めれば?
K&Rを一般のC言語解説本と思ってる?
そうなんだ!、その簡素で柔軟な仕様こそがC言語の唯一にして最高の武器なのさ!! 昔と言うけど、昔の人を馬鹿にしては駄目だよ! 君にピラミッドの建設が出来るかい? 僕らは人生の半分を勉強と言う名の過去の偉人の後追いに費やしてるんだよ! 君もそんな人になれればイイネ!!
600 :
デフォルトの名無しさん :02/01/19 08:39
困ってるので質問させてください。 例えば struct type val[10]; と、定義した構造体の配列変数valを配列全部を 別の関数に渡す方法あるでしょうか? return (val[10]); で全部渡せるんでしょうか?
ポインタ使え
602 :
デフォルトの名無しさん :02/01/19 09:24
デバッグしてもすぐ次のエラーが出てしまいます。 一体何が悪いのやら・・・。 Stack Overflowって何? 例外処理 (初回) は 00.main.exe にあります: 0xC00000FD: Stack Overflow。
struct val_10 { struct type val[10]; }; で、このval_10を渡すとか。 #それが正しい設計かは別問題だがね。
str って何でしょうか? 見直すというか見たこと亡いんですけど・・・。
あ、そうか。悪いね でもそれじゃ分からんよ。 そのエラーの意味はつまり スタックがオーバーフローしたって事だ 書き込んじゃ行けない所に書き込んじゃってるの 本買え
In article
>>602 , デフォルトの名無しさん/602 wrote:
> Stack Overflowって何?
再帰のバグかaotoで大きな配列を使っているかのどちらかでしょうね。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
>600 こういうこと? #include<stdio.h> struct xy{ int x; int y; }; void f(xy *); int main(){ int i; xy a[10]; f(a); for(i=0;i<10;i++) printf("%d %d\n",a[i].x,a[i].y); return 0; } void f(xy *a){ int i; for(i=0;i<10;i++){ a[i].x=i; a[i].y=i; } return; }
エディタからコピペしたら、 めちゃくちゃ汚くなってしまった・・・
本にそれらしいこと書いてるんですけど、意味不明で・・・。 デバッグすると test dword ptr [ecx],eax ; ...probe it っていうところに→が出るんですけど、何なんでしょう? そもそもこのページは何なのでしょう?
>> 607 再帰のバグってどんなのですか?
あー、とりあえず、vc++のデバッガなら、デバッグウインドウで コールスタックを表示しろ。
In article
>>611 , 602/611 wrote:
> 再帰のバグってどんなのですか?
キーワードを教えてもらったら、とりあえず検索でもしてみましょう。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
func(){ func(); } main(){ func(); }
>>614 スタック領域が消滅するのは時間の問題だなw。
いや、どうだろ。末尾再帰で無限ループとみた。
617 :
デフォルトの名無しさん :02/01/19 12:30
真面目な話、Basicは大体わかったのでちょっとC言語もやってみたいのですがプログラムを作るにはテラパットとLSI C-86試食版さえあれば 簡単なプログラムを作ることは可能ですか
staticじゃない関数でも末尾再帰はスタック食わないように 最適化されるもんなのかねぇ。
620 :
デフォルトの名無しさん :02/01/19 12:49
数字をfgetcで受けると代入された数値がおかしくなるんですが、何でですか? scanf使わないで数字を取得したいのですが。
In article
>>620 , デフォルト名無しさん/620 wrote:
> 数字をfgetcで受けると代入された数値がおかしくなるんですが、何でですか?
> scanf使わないで数字を取得したいのですが。
fgetc()は文字を一文字ずつしか受け取れません。
int n;
scanf("%d", &n)
のような数字を受け取るような使い方はできません。
fgets()とsscanf()の組み合わせを使いましょう。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
>>621 わかりました。その組み合わせを使ってみます。
623 :
デフォルトの名無しさん :02/01/19 13:56
領域確保するAPIで GlobalAlloc・LocalAlloc・VirtualAlloc・malloc のそれぞれの違いがよー分からん(゚Д゚) 詳しく知ってる人教えてYO
625 :
デフォルトの名無しさん :02/01/19 15:06
MFCってなんなんでしょうか? エンジェル・ハートという本に M もっこり F ふらいんぐ C きゃっち ってかいてあったんですけど
626 :
デフォルトの名無しさん :02/01/19 15:08
モーニング娘ファンクラブ(公認)
テトラポッド?
631 :
デフォルトの名無しさん :02/01/19 16:44
エラーで error LNK2001: 外部シンボル "_function" は未解決です fatal error LNK1120: 外部参照 2 が未解決です。 って出てるんですけど、どう違うのでしょう? それに、こういう場合どこを直せばいいのでしょう?
In article
>>631 , デフォルト名無しさん/631 wrote:
> って出てるんですけど、どう違うのでしょう?
> それに、こういう場合どこを直せばいいのでしょう?
ヘルプに詳しい解説があります。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
633 :
デフォルトの名無しさん :02/01/19 17:08
ようするに _function っていうのがソースに書いてあったんでさがしたけど、どこにもねーぞボケ 状態だと思う。
クラスで宣言してるのに 実装を忘れてるバヤイが多い
ライブラリをリンカに渡すのを忘れたとか。 VC++なら、純粋仮想デストラクタではまってるとか。
>>621 盲目的にscanf()を嫌うのもどうかと思うが。
if (scanf("%d", &n) != 1) {
error(); // とか
skipline(stdin);
}
すればいいだけだろう。
In article
>>636 , デフォルト名無しさん/sage/636 wrote:
それでは[123a5]のような入力の時に困るでしょう。
(入力のミスを検出できない)
いろいと工夫すれば、scanf()もつかえるかもしれませんけど、
それなら一行ごとに入力を受け取ってバッファ上で
あれこれ操作やチェックをしたほうがずっと楽です。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
やりたいことによる。複数回読むなら次でエラーになるだろうし、 scanf("%d%", &n) == 1 && getchar() == '\n' とか scanf("%d%*[^\n]", &n) == 1 とかいろいろできるし、 要するに使い方をちゃんと考ろってこと。
>>638 無条件にscanf()使うな!っていうのはどうかとは思うけど、
ここは「Cの超カンタンな…」やからねぇ。
ここで質問するような初心者にたいしてなら、
考慮すべき点の多いscanf()は使うな、
と言いきるのもありではないでしょうか?
In article
>>638 , デフォルト名無しさん/sage/638 wrote:
> scanf("%d%", &n) == 1 && getchar() == '\n' とか
> scanf("%d%*[^\n]", &n) == 1 とかいろいろできるし、
エラーの場合ストリームの読み飛ばしが必要だったり、
変な入力がエラーにならなかったりしますね。
> 要するに使い方をちゃんと考ろってこと。
初心者に使わせるのにはくせが強すぎると思いますよ。
(上記のようにいろいろ工夫が必要だし)
よく言われているように、fgets()でやったほうが簡単でしょう。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
>>640 ホテル行きましょう!ホテル!
そしてあんなことやこんなことしてくれませんか?
あ、大婆様、keiko!(めーヴぇ)が飛んでるよ・・・
初心者質問です。 array配列からReduceNum番目の要素を削除する関数を作ろうと思っています。 型の違う配列を受ける方法がよくわからないので、void ポインタを使って 見ましたがvoid * サイズが定義されていませんエラーが山盛りでます。 int ReduceArray(void *array,unsigned int ArrayNum,unsigned int ReduceNum){ for (unsigned int i = ReduceNum ; i < ArrayNum - 1;i++){ array[i] = array[i + 1]; } delete array[++i]; return 1; } こういう関数はどうやって書いたらよいのでしょう?
>>643 要素の大きさも引数として渡す。
あと、voidポインタにdelete演算子使うなよ。
しかしdelete使ってるという事はC++か?
C++ならtemplate関数で書け。
ファイル分けがワカラン ヘッダとかどう書けばいいのか。。。
>>645 外部から参照するものはヘッダファイルに出す。
内部に隠蔽したいものはソースファイルに書く。
templateやinline関数はヘッダファイルに出す。
なるほろ。サンクスコ 簡単なクラスを作りたいんだけど、 メソッドの実装含めてヘッダに書けばいいのかな?
うむむ。違うか。。。
Perlでいう opendir(DIR,$dir); @files=readdir(DIR); closedir(DIR); はCではどのように書けばいいですか? readdirみたいな関数があるんでしょうか?
In article
>>649 , デフォルト名無しさん/sage/649 wrote:
Unix系ならopendir,readdir,closedirで。
Windows系なら、FindFirst,FindNextで。
詳しくは検索してください。
----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------
>>649 opendir(),readdir()はない。
かわりにfindfirst(),findnext()でディレクトリ内を
順にスキャンしてエントリを見てゆく方法が用意されている。
>>650 すいません。返答ありがとうございます。
FAQレベルとは分かっていながら手掛かりがつかめなくて困っていました。
それじでは、がんばります。
>要素の大きさも引数として渡す。 ArrayNumというのがそれです。 最終的にでてくる配列は渡した配列より要素が1つ少なくなるので for (unsigned int i = ReduceNum ; i < ArrayNum - 1;i++){ array[i] = array[i + 1]; } としてみました。 >しかしdelete使ってるという事はC++か? >C++ならtemplate関数で書け。 C++です。でもtemplate関数わからないです・・・。 perlなら簡単なのになあ・・・・せめて 任意の型の配列の渡し方がわかれば何とかなる気がするのですが・・
>>654 そのArrayNumは、要素の大きさではなく、要素の数では?
#include <algorithm> std::copy( &array[ReduceNum+1], &array[ArrayNum], &array[ReduceNum] ); でどうよ。
つーか、関数化以前の問題として… TArray* array = new TArray[ArrayNum]; ... delete array[ArrayNum -1]; とやろうとしてないか? 配列の要素をdeleteするなら TArray** array = new TArray*[ArrayNum]; for (int i = 0; i < ArrayNum; i++) array[i] = new TArray; ... delete array[ArrayNum -1]; ではないかと思われ。 656さんの言うようにstd::vector<T>を使う方が… std::list<TArray> array; array.erase(array.begin() + ReduceNum);
× std::list<TArray> array; ○ std::list<TArray> array(ArrayNum);
#define RBUF 1280 とかって仮にしておいて いろいろコーディングして memset(String,'\0',RBUF)←なんでもいい . あとでバッファが足りなくなったなあ・ ッ手思って #define RBUF 2000 とかってやると大抵落ちます。なんでなんでしょう・・?
分割とか結合ってどういう意味ですか。 ラブマとか書いてあるんですけど意味がわかりません。 おしえてください。
× std::list<TArray> array; ○ std::vector<TArray> array(ArrayNum); 寝ぼけてんな俺、そろそろ寝たい…
>>660 > #define RBUF 2000
> とかってやると大抵落ちます。なんでなんでしょう・・?
・2000でも足りてない
・どこかにバグがある
664 :
デフォルトの名無しさん :02/01/20 11:05
くだらない質問ですが、 typedef struct s{ char* str; }ELEM; こういう構造体があったとして、 ELEMをmallocでメモリ確保、strにもmallocでメモリ確保。 その後ELEMをfreeした場合、strは解放されずにのこってしまいますか?
>>664 > strは解放されずにのこってしまいますか?
YES、いわゆるメモリリークという状態ですね。
666 :
デフォルトの名無しさん :02/01/21 02:09
int a=1,b=1; a=a++; b=++b; Cの規格では aは1、bは2になるんですか?
667 :
デフォルトの名無しさん :02/01/21 02:13
>>664 残るけど、終了すればきちんと解放される(はず)。
>>664 それがいわゆるメモリーリークってヤツ。
プログラム内部で、ヒープからmallocで確保しているメモリの参照を
取得する(=freeする)手段がなくなると、プログラム終了までプログ
ラムがそのメモリの再利用が出来なくなる。
プログラムが終了すれば、プログラムがOSから確保したメモリはOSに
全部かえしてしまうので、すぐ終わるプログラムならメモリーリーク
は気にするが必要ない。サーバープロセスとかだったら、リークが
たまってくるとハングアップするとかになるので危険。
>>666 なんでこの手の質問は後を絶たないのだろう?
>>669 それは「超カンタンなこと」ではとてもないので、ここで聞いては逝けない。
つうか実行してみりゃわかるだろうに。
672 :
デフォルトの名無しさん :02/01/21 02:35
673 :
デフォルトの名無しさん :02/01/21 02:53
なんて読んでる? malloc = マロック calloc = カロック
malloc = もろっこ calloc = ころっけ
malloc = マリック
>673 その発言は削除対象になります。
malloc = ムァロック
エムアロック
処理系依存や未定義は、実行した結果を見て納得するの危険なんだが、 「やってみれ」が後を絶たないのは(以下略)
略さず メモリアロケーション
>>672 > aもbも2だろ?
はい?正気?
>>679 > 処理系依存や未定義は、実行した結果を見て納得するの危険なんだが、
666が本気で聞いてるならどうにもならんDQNだろうが、
でも処理系依存や未定義って言葉が出てくる場面かね…
682 :
Cの馬鹿〜〜 :02/01/21 23:08
FILE ポインタがわかりません。 なんで FILE *f とかで宣言するんですか? FILE f とかはなんでだめなの?
>>682 大人の事情です。
あと、FILE“ポインタ”って自分で逝ってるでしょ?
FILE型のポインタです。
標準関数はファイルストリームを内部で管理してます。
fopen()を使うとその内部データへのポインタをもらえます。
そんな感じ。
684 :
デフォルトの名無しさん :02/01/21 23:19
>>682 えっと、質問です。
int a;
と
int *a;
の違いはわかりますか?
わかるのとわからないのでは、アドバイスの内容が変わってきますので。
685 :
デフォルトの名無しさん :02/01/21 23:29
>>681 シーケンスポイントで検索してみろ、って言われたこと無い?
>>666 の式は、2つとも未定義だろ。
687 :
デフォルトの名無しさん :02/01/21 23:42
>>681 あんた「シケーンスポイントで検索しる」って言われたことあるだろ?
>>666 の2つの式の結果は両方とも未定義だ。
688 :
デフォルトの名無しさん :02/01/21 23:57
int型からchar型に変換する関数「atoi」の逆、char型からint型に 変換する関数ってあるんですか?
itoa
690 :
デフォルトの名無しさん :02/01/22 00:02
(ぷ
タブで区切られたデータを別々の変数に入れたいんですが、良い方法が思いつきません。 Perlでいうと、 ($hoge1,$hoge2,$hoge3) = split /\t/, $hoge4; のようなことがやりたいんですが、何かいい方法はないでしょうか・・・。
sscanf(hoge4, "%[^\t]%[^\t]%[^\t]", hoge1, hoge2, hoge3);
FILE構造体で扱えるファイルの限界サイズってどのくらいでしょうか? fpos_tがlong型だとして、sizeof(long) == 4な環境では 2147483647バイト = 約2Gバイト程度 ってことでいいんでしょうか?
>>693 ありがとうございます。sscanf()は初めて聞きました・・・。
試しにやってみたところ、ちょっと変だったのですが、
sscanf(hoge4, "%s%s%s", hoge1, hoge2, hoge3);
としたらうまくいきました。
どうもありがとうございました。
c や c++ では、どのようにして変数を宣言するのですか? また、どのような型がありますか。
>>696 char int float double
698 :
デフォルトの名無しさん :02/01/22 01:05
>>695 "%s%s%s" は空白文字区切りであり、
タブ区切りではないけど、それで良いの?
699 :
Not 692 :02/01/22 01:09
本当に"%[^\t]%[^\t]%[^\t]"でいいの? 二つ目以降はわけのわからない値が代入されるんだけど。 それともVC6.0のバグ?
ごめんなさい。たぶん、 sscanf(hoge4, "%[^\t]\t%[^\t]\t%[^\n]", hoge1, hoge2, hoge3); でいいかと。ボケボケは逝ってきます。
701 :
デフォルトの名無しさん :02/01/22 01:30
質問なのですが、以下のプログラム #include <stdio.h> int main(void) { float k,l; printf("K? "); scanf("%f",&k); printf("f? "); scanf("%f",&l); printf("k + l = %f\n", k + l); printf("k * 3.54 = %f\n", k*3.54); return 0; } を実行して K?2.1 l?1.1 と入力すると K + l = 32.00000 K * 3.54 = 74.340000 のように答えが出力されてしまうのですがどうすれば直るのでしょうか。 k、lが整数でないと正常に動きません。さっぱり訳が分かりません。 環境はCygwinのgccです。
>>698 あ、空白が入ってると変なところで区切られちゃいますね・・・。
ということで
>>700 今度はうまくいきました。
この方法でやってみますね。
ありがとうございました。
>>701 VC6.0Proなら問題なかった。
見間違いじゃないよね?
>>703 float,double型のscanfをすると勝手に小数点が移動してしまうのです。
例えば上のプログラムの
scanf("%f",&k);
のすぐあとに
printf("%f\n",k);
を入れて、kに2.1を入力すると
21.000000
と表示されてしまうんですよね。
全く持って謎です。どこが間違ってるんでしょうか。
705 :
デフォルトの名無しさん :02/01/22 01:58
>>705 厨房なもんでgets()で読み込んだ文字列(ここでは数字列?)を
計算に使ってるのを見たことが無いのですが。どうするのでしょう。
…っていうかどう考えても上のscanf間違ってないですよねぇ。
だれかCygwinのgcc使ってる人情報くれませんかね。
そういうときは、gcc -vの結果や、cygwinの バージョンなども貼り付けるのが常道。
それに、strtod,strtol,strtoul
atof使ったら計算そのものは解決できました。
ありがとうございます。
>>708 gcc -vですか。Cygwin上の「標準エラー出力」ってファイルに書き出すことはできるんですか?
僕には全く分からんメッセージがずらずら出てきたのですが手で移すのちと辛いので。
あと、Cygwinのバージョンってどうやって調べるんでしょうか?
ほんと厨房ですみません。
bashなら、 2> errとかあるんじゃねーの。
keisan.exe(.test+0x0):libgcc2.c: multiple definition of `mainCRTStartup' /usr/lib/crt0.o(.text+0x0):crt0.c: first defined here keisan.exe(.data+0x0):/cygnus/netrel/src/gcc-2.95.3-4/gcc/libgcc2.c: multiple definition of `_cygwin_crt0_bp' /usr/lib/crt0.o(.data+0x0):crt0.c first defined here /cygdrive/c/WINDOWS/TEMP/ccd1x2e0.o(.text+0x34):keisan.c: multiple definition of `main' keisan.exe(.text+0.78):libgcc2.c: first defined here collect2: ld returned 1 exit status …というのがgcc -o -v keisan.exe keisan.cの結果です。 エディタ上(秀丸使用)でコンパイルというのがどういうことなのか 分からなかったので結局手で打ち込んでしまいました。 一応間違ってないか見直しましたが…。
$gcc -v Reading specs from /usr/lib/gcc-lib/i386-unknown-openbsd2.9/2.95.3/specs gcc version 2.95.3 20010125 (prerelease) こういうのをきいてるの
716 :
Cの馬鹿〜〜 :02/01/22 04:54
>>683 >>684 遅いレスですみません。
>標準関数はファイルストリームを内部で管理してます。
なんとなくわかった気がします。
つまりFILEのアドレスを内部で管理してるって事でしょうか?
例えば、ディレクトリの下にあるファイルをポインタで示すとかって概念であってます?
int a;
と
int *a;
の違いはわかりますよ。 ポインタと変数ですよね。
でも・・・ float 型のポインタとかは正直・・・なんで?
なんでそんなん使うの?って思いますよ。
>>716 クイズです。
整数型のデータの置いてある場所を覚えておきたいとき -> 整数ポインタ型をつかう
浮動小数点型のデータの置いてある場所を覚えておきたいとき -> □型をつかう
さて□には何が入るでしょう?
データ(オブジェクト)が取りうるメモリ容量が あっていればCPU的には問題ないはずだが。 あっ浮動小数点型だと演算のときニーモニックが違ってくるか。
719 :
Cの馬鹿〜〜 :02/01/22 07:18
720 :
デフォルトの名無しさん :02/01/22 08:04
>>716 float型はfloatの値(1.2とか)自体を保存するときに使う
float*型はfloat変数の場所を保存するときに使う。
なんで使うかは、float型の変数の場所が知りたいときもあるからだろ。
time_tやsize_tのtってどういう意味ですか。 とても気になります。
typeのtだろ。
そうだったのか! ありがとう。
>>716 > なんでそんなん使うの?って思いますよ。
int* はわかるが float* はわからないのか?
それじゃ何で int* を使うか考えてみてくれ。(できればそれをここに書いてほしい)
多分同じ理由で float* が必要になると思われ。
>>716 は
>ポインタと変数ですよね。
と結っていから、なにか、勘違いをしているらしので…
gcc -v の結果です。 Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-4/specs gcc version 2.95.3-4 (cygwin special) …これで何か分かるんでしょうか。 っていうか標準入力から実数を入力させるときってscanfじゃなくてgetsを 使うのって普通なんでしょうか?そろそろうちのCygwinのgccを 見限ってしまいそうな勢いです。
別に見限ってもいいでしょう。環境としてのCygwinだってかなりつかいでがあります。 mingwのgccをCygwinでつかったらどうですか。ちなみにうちのmingwはその小数点の 問題は起こりませんでした。versionは2.95.3-5です。
>>727 > versionは2.95.3-5です。
mingwじゃなくても問題は起きなかった。バージョンは同じ。
とりあえず
>>704 はバージョンを上げてみるべし。
729 :
デフォルトの名無しさん :02/01/22 20:03
新C言語シニア編 (著 林晴比古) P60 コンパイルが通らない。この本の通り書いたのに。 struct cell{ struct cell * next; int value; } typedef struct cell CELL; こう書けばコンパイルが通る typedef struct cell{ struct cell * next; int value; } CELL;
>コンパイルが通らない こういうことを言う人ってのは、 >新C言語シニア編 (著 林晴比古) こういう本を買っているのですね : )
; が…
732 :
デフォルトの名無しさん :02/01/22 21:04
>>730 ここは初心者スレなので、余計なつっこみは入れないでほしいのです。
エラーメッセージみりゃあ 原因わかるだろぅ
734 :
デフォルトの名無しさん :02/01/23 10:07
#includeで"〜.c"ファイル(ソースファイル)を読み込むのは好ましくないんですよね? #includeを使わないで複数のソースファイルをまとめるにはどうすればよいのでしょうか。
736 :
デフォルトの名無しさん :02/01/23 10:46
exit(1); とか return -1; ってどういうことですか? exit(100); とか exit(-3.5) とかもありなんですか?
738 :
デフォルトの名無しさん :02/01/23 11:19
739 :
はじめっこ :02/01/23 12:21
初心者の俺には分からん。教えてください。 int i,j,k; for(i=j=k=0; i<10; i++){ という部分、i,j,kはfor内だけのローカル変数でいいんだけど もっとまともな書き方があると思うから、これが定石だ とかいうソースを教えてください。
740 :
デフォルトの名無しさん :02/01/23 12:24
変数宣言と同時に、変数初期化、ってことかな? int i = j = k = 0; for(i=0; i<10; i++){
{ int i; for(i=0; i<10; i++){ int j, k; // } } でどうでっか
>>740 > int i = j = k = 0;
C/C++ではこーゆーことはできん。
743 :
代打名無し :02/01/23 12:35
すみません誰か教えてください、、、unixです、、、 キーボードから円を入力すると,ドルに変換するプログラムを作成しなさい。 なお,変換レートは本日分の値を使用し, 変換値の表示は小数点第1位までとすること。 角度を−90〜90度まで5度ステップで変化させ, そのときの正弦関数と余弦関数の値をディスプレイに並べて表示する プログラムを作成しなさい。 なお,正弦関数と余弦関数の値は,小数点以下3桁で表示しなさい。 下記の指示にしたがって解答しなさい。 1 キーボードから1より大きい整数値nを入力して, その階乗n!を計算し,結果を表示するプログラムを作りなさい。 その際,nが1以下の時には, nが1より大きい値となるまで入力を繰り返し求めるようにする。 また,階乗の値は double 型とする。 n!=2×3×4×・・・×(n−1)×n 2 作ったプログラムをコンパイルし,正しく動作することを確認したら, 15!を求め,画面に表示された通りを答えなさい。
744 :
はじめっこ :02/01/23 12:39
ありがとうございます。
iもfor内のローカルにしたいんだけど、for内で宣言でき、
1行で書けるらしいんです。
int i,j,k,l;
for(i=j=k=0; …
これでもまだだめなソースと言われます。
>>742 ありがとうございます。
> int i = j = k = 0;
を直してコンパイルできるようになりました。
745 :
はじめっこ :02/01/23 12:47
main(){
for(int i=0, int j=0, int k=0; i<10 && j<20 && k<20; i++){
cout << i << endl;
j++;
k++;
}
}
できないし、1行で書けるなんてウソかなー?
>>741 さんのが定石かな?
>>743 > キーボードから円を入力すると,ドルに変換するプログラムを作成しなさい。
1:rate = doller:yenなので
doller = yen / rete
従って
double yen2doller(int yen, int rate)
{ return (double)yen / rete; }
yenかrateのどちらかを明示的にcastしないと
yen / rateをintとして計算してしまう。
最後に、
> なお,変換レートは本日分の値を使用し,
これは一体どこから取得するの?
私ならば仕様不備で突っ返す。
>>745 for( int i=0, j=0, k=0; i<10 && j<20 && k<20; ++i){
cout << i << endl;
++j;
++k;
}
これ超識。
なおi++より++i、これM識。
748 :
はじめましてこ :02/01/23 13:00
こんにちは。 ポインタ値の設定についておしえて下さい。 下記の様に例1,例2があります。 char型のポインタ値の設定をする場合は 例1のp = &c;の様に&をつけるものと 思っていましたが例2を見ていただくとp = c;で &がついていません。 どう違うのですか? 例1 char c; char *p; p = &c; putchar(*p); 例2 char c[32] = "Hello"; char *p; p=c; printf("p:%s\n",p);
>>749 ANSI Cに準拠してればね。あと
for (int i,j,k=i=j=0; 〜
とか。
>>748 if ( c==&c[0] ) printf( "%s\n", "つまりこーゆーことやねん" );
>>750 ついでにcoutとendlが整数型の変数ならな。
char c;と宣言したなら &c char c[32];と宣言したなら c はchar型のポイントとなっております。
>>747 for(int i = 0; i < 10; ++i)
すら、コンパイラ通らないようだけど漏れが悪いのかな。
>>754 コンパイラが悪い。
C99対応してないコンパイラなど捨ててしまえ!
下のプログラムなんですがファイルからとってきたのと 同じものをタイプしても配列の長さが違います。 つまりi,jの長さが違うんです、 どうしてですか? void num2(){ int n=100,i,j; FILE *fp1,*fp2; char honbun[100],type_moji[100]; fp1=fopen("input","r"); if(fp1==NULL) exit(-1); system("kinput2 2>/dev/null&"); do{ printf("%s", fgets(honbun,n,fp1)); fgets(type_moji,n,stdin); i=strlen(honbun); j=strlen(type_moji); printf("%d %d",i,j); } while(!strcmp(honbun,type_moji)); fclose(fp1); }
>>756 あちこちでおんなじこと書くなよ。ばーか。
758 :
デフォルトの名無しさん :02/01/23 17:00
Illegal character 'character' (0x'value') コンパイラメッセージ 不正な文字 'character' (0x'value') 入力ファイルの中に無効な文字がありました。 その文字の 16 進値が出力されます。 これは,関数マクロに余分な引数が渡されたことが原因であることもあります。 ・・・というエラーが出るのですが原因が全くわかりません。 配列の[]の中の文字に対するエラーなのですが、他の文字に 変えても同じエラーが出ます。 「関数マクロに余分な引数が・・・」このあたりが原因でしょうか。 なにか心当たりがある人いたら教えてください。お願いします。
>>754 コンパイラを捨ててしまうのも宜しいが、使って居るのが
C/C++コンパイラならば、C++のプログラムとしてコンパイル
しては如何かな。
コンパイラは変えたくなく、魔道に手を染めるは好まぬ、
というのであれば
>>741 で我慢なされ。
>>759 > 魔道に手を染めるは好まぬ、
むぅ、宣言されてない関数をチェックするためによく使うが、
やはりそれは魔道なのか?
762 :
はじめましてこ :02/01/23 19:04
うう・・・ こんな簡単のが理解出ません・・・ #include <stdio.h> int f(int n) { int y; if (n<=0) return 0; y=f(n-1); return y+n; } int main(void) { printf("%d\n",f(3)); return 0; } 関数定義部の y=f(n-1); return y+n; が理解できません・・・ なんで、6が表示されるんだろう・・・
765 :
デフォルトの名無しさん :02/01/23 20:44
それは再帰関数といって、関数が自分自身を呼び出しています。 main f(3) f(2) f(1) f(0) という呼び出しシーケンスになっています。後は自分で考えてください。
766 :
デフォルトの名無しさん :02/01/23 20:47
>>763 1 + 2 + 3 だろ。
再帰だから、DrScheme でステップ実行やれば理解できるよ。
あ、ちょっと嘘ツイテル w でも大体そんな感じ
初心者ですいません。そんなのも解らないの?って思うかもしれませんが聞いてください。 "123.4"(文字列)から'.'を検索して小数点の前と後ろを分割して、どちらも1000倍にして、 それを足して123400(123000, 400)という数値を作りたいのですが解りません。 特に、小数点の後ろ側(0.4)を1000倍の仕方が・・・。 float型を使用しないでできるんでしょうか?
マルチポスト(以下略
770 :
はじめっこ :02/01/23 21:29
>>747 ありがとうございます。できました。
for(int i=0, j=0, k=0; i<10 && j<20 && k<20; i++)
ありがとうございます。もっかい考えなおします。というか、これで悩んでたらやばいなぁ・・・
773 :
デフォルトの名無しさん :02/01/24 00:04
out0.dat,out1.dat,out2.datみたいなファイルを作って書き込みたいんだけど どうすればよいですか? for(i=0;i<10;i++){ fpw = fopen("out数字.dat","w"); ↑ fprintf(" ", ); fclose(fpw); } とやって見ようかと思ったけど、ムリだし・・・
>>773 sprintf()を調べる…
そいでファイル名の文字列を作る…
775 :
デフォルトの名無しさん :02/01/24 00:11
>>773 いや、何したいんだか判らん…
ファイル名の一部を連番にしたいなら、例えば
char fname[64];
sprintf(fname, "out%d", i);
fpw = fopen(fname, "w");
だけど…そういう事でなく?
char filename[]="out0.dat"; for(i=0;i < 10;i++){ filename[3] = i + 0x30; fpw = fopen(filename, "w"); fprintf(" ",); fclose(fpw); }
777 :
デフォルトの名無しさん :02/01/24 00:24
774,775さん。どうもありがとう。 本買って勉強しようかな?
fprintf(" ",); は fprintf(fpw," "); な気がする。。。
779 :
デフォルトの名無しさん :02/01/24 00:26
あと776さんも。(書いている間に更新されてた・・・)
780 :
デフォルトの名無しさん :02/01/24 00:38
はじめまして、次のプログラムを作ってくれませんか?初心者で授業についていけてないんです。 プログラムを見て納得したい。お願いします。 平面状の2点P1(x1,y1),P2(x2,y2)を結ぶ直線のP1から3分の1の位置を求める 関数 int c3poin (double x1, double y1, double x2, double y2, double *cx, double *cy)の プログラムを作れ。 main関数も作り実行が確認できる形式にせよ。なおP1から3分の1の位置は次式で与えられる。 X = 2x1+x2/3, y = 2y1+y2/3
781 :
デフォルトの名無しさん :02/01/24 00:41
>>780 そのままだが
c3poin (double x1, double y1, double x2, double y2, double *cx, double *cy)
{
*cx = 2*x1 + x2/3;
*cy = 2*y1 + y2/3;
}
>>768 > 特に、小数点の後ろ側(0.4)を1000倍の仕方が・・・。
strtoul()を使って何桁あったか調べる。
>782、783 両方とも、別スレで解決済みで御座います。
まるちかよ!
787 :
ダダダダーん! :02/01/24 10:41
どうかこれも人助け。クラ−メルの公式をCでやってください。お願い〜。
>>787 おんなじしつもんをあちこちにかくなって。
>お願い〜。 >先生おねがい〜。 >こら、そこのあなた簡単っだって笑わない! 案外芸が細かいな。
790 :
デフォルトの名無しさん :02/01/24 11:24
同時書き込み、排他制御、ロックについて教えて下さい。 下記の処理を一つのファイルに対して 複数のプロセスから実行するときの定石を教えて下さい。 1テキストファイルをオープン 2テキストファイルへ書き込み (何度か繰り返し) 3テキストファイルをクローズ ファイルへ書き込むごとにオープンとクローズを繰り返すのはあほ? 同時に開きっぱなしにして一行ずつ追記していきたいんです。
791 :
デフォルトの名無しさん :02/01/24 11:25
790ですが追記です。 OSはWinとUNIXで両方使えたらいいんですけどね。
オープンを繰り返すのが普通だと思いますが。 追記モードで、バッファが関係してなくて、write一発で決まって、 複数プロセス/スレッドからのオープンが問題ないなら、 ロックは要らないかもしれません。
793 :
デフォルトの名無しさん :02/01/24 14:34
2次元の文字配列 char data[20][20]; というのを定義したとして,それを引数として別の関数から 呼び出そうと思ったのですが,うまくいきません.簡単に書くと main () { char data[20][20]; r=kansu(data); } に対して,kansuを int kansu(char data[][]) { : : } とすると,引数の指定が間違っています,というような感じでエラーが 出てしまいます.どのようにすべきなのでしょうか?
char(*data)[20]
キ─ボードからファイル名を入力して、そのファイルの文字数をカウントするプログラム を作って頂けないでしょうか? 間に合わないか、、
797 :
デフォルトの名無しさん :02/01/24 20:19
798 :
デフォルトの名無しさん :02/01/24 20:21
>>796 _openと_filelength見れ。
改行?無視無視。
学校の課題です。。 もうそろそろ今使ってる場所追い出されるので、諦めます。
>>796 なんてムカツク言い方…。(・∀・)カエレ!
>796 エクスプローラーからALT+RETURN
1つのファイルに、UTF16,UTF8,SJIS,EUC,ISO-2022-JP,ISO-2022-KR,BIG5などが 混在してあるファイルの「正確な」文字数をカウントしたいんです。 もちろん、"あ"を2とかカウントしたりしては駄目です、、、
>>803 無理、あとヽ(`Д´)ノ カエレ!
なんだよ「間に合わないか」とか「駄目です」ってのはよ…
自分で文字コードについて調べて少しでも作ってみれ。
806 :
デフォルトの名無しさん :02/01/25 00:32
>1つのファイルに、UTF16,UTF8,SJIS,EUC,ISO-2022-JP,ISO-2022-KR,BIG5などが >混在してあるファイル それって許されるのか?(w
>>803 m17n-ruby に UTF16 ISO-2022-KR BIG5 エンコードを追加実装して
適当に guess をかませながら str.size を足していく
あ、書き忘れましたが、そのテキストは、MIME-Multipartです、、、 もちろん、Multipartなメタメッセージは、数えてはいけません。 あと、UTF16で、リガチャなど複合文字もきちんと数えていただきたいです、、、
>>809 ふん、出てくる出てくる、次々に“仕様”がよ(藁
「数えてはいけません」って、てめぇ何様?
自分のやりたい事、要求仕様くらい整理して語れんのか?
811 :
cccccc :02/01/25 00:45
これからC言語を勉強していきたいのですが、 おすすめの開発ソフトと入門書を教えてください。
>>809 メールで送って MIME デコードはメーラに任せ、
部分部分コピペして別ファイルに入れてもおk?
814 :
デフォルトの名無しさん :02/01/25 00:49
なんか、新手の荒らしに見えるのだが<教えて君大量発生
2chネタ心者なのだろう。
“教えて”君なら答えようかって気にもなるけどさ、 “作って”君は何だコイツ?としか思えんな…
817 :
デフォルトの名無しさん :02/01/25 00:52
818 :
デフォルトの名無しさん :02/01/25 01:05
文字列を比較して特定のメッセージがあったら その行を抜き出すプログラムを作りたいんですけど いい関数あります? ライブラリの見方がよくわからないもんでして・・・・
>810 整理できなくて、すみません、、、 MIME-Version: 1.0 Content-type: multipart/mixed; boundary="------a---"; charset UTF-8 Sample UTF-Txt ------a--- Content-type: text/plain; charset=shift_jis シフトJISでかかれています ------a--- というようなテキストが延々続きます。 数えるのは、Multipartの中にかかれた文字です。 扱うエンコーディングは、IANAに登録されたものすべてだそうです。 ○付き文字や、リガチャなども考慮して数える、というものです。 卒業がかかっているもので、なにとぞよろしくお願いします、、m(_ _)m
>>807 > 適当に guess をかませながら str.size を足していく
その答え方いいなぁ、“適当に”が重要ですね。
“いいかげんに”では無いところがポイント。
821 :
デフォルトの名無しさん :02/01/25 01:12
>これからC言語を勉強していきたいのですが、 >おすすめの開発ソフトと入門書を教えてください 勉強なのか仕事に使うかで違うと思うけど勉強ということにする。 仕事ということにしても無駄にはならない。 参考書は 前橋氏のC言語体当たり学習=>ポインタ完全制覇 => K&R がおすすめ。 C言語診断室という本もいいのだがどうも入手が困難 みたいなのでWeb上のものを読むとよい。同様にlanguage C FAQも Webにあるので読もう。 ツールとしては「C言語を始めよう」+ ボーランドCコンパイラが いいと思う。どちらもフリー。(ボーランドCコンパイラは無料のユーザ登録が必要)
>>818 KMP法 BM法などがある。
google で検索すればソースもあるよ。
823 :
デフォルトの名無しさん :02/01/25 01:17
824 :
デフォルトの名無しさん :02/01/25 01:21
>820 先にあげられたリンク先で自分のことをあげてる箇所もわからないようだから転載してあげよう。 俺って親切! Q:私は社会人ではなく、学生です。 課題として出された問題をメーリングリストに参加している人達に解いてもらっても問題はないでしょうか? (New! 2001.07.09) A:問題大アリです。 今すぐ事務局に退学届けを出し別な道を模索した方が、儚い人生の道を踏み誤り本当に下らない人生とならずに済む確率が少しは上がるでしょう。
初心者にメールを出してみようと思ったことはないかな?
826 :
デフォルトの名無しさん :02/01/25 01:24
>824 私へのリプライでしょうか? それはメーリングリストに適用されるもので、 このトピにはあてはまらないと判断しました。 あなたに答えてもらわなくても結構です! 824以外の方、どうかお願いします!! m(_ _)m
>>824 …え゛、漏れですか?
すいません、もう数年前に事務局に退学届けを出し
(学生とは)別な道を模索しました〜
(ぴったりな内容の回答例だたので、ちょとドキドキ)
というか、824はやりかたがわからないのではないですか? 無知な人は黙っていてください!
なぁ、796よ。 君のこの一連の書き込みはネタだよな(笑 ネタだと逝ってくれ、でないとイタすぎる…
>830 ネタですよ。メール欄をみましょう。 それでは、偽者は去ります。 またあえるといいですね。 それと、Multipartな文字数えプログラム、 できたら発表してくださいね。
832 :
デフォルトの名無しさん :02/01/25 01:46
初心者スレでのネタはなるべくやめてほしいのです。 本当に困ってる人がきたときに、いちいちネタか?ネタか?と確認作業が入るので仕事が遅くなります。
833 :
デフォルトの名無しさん :02/01/25 03:14
|= ← これはどういう意味ですか?
>>833 あんたちょっとだまってて、っていう意味です。
明日は曇りという意味です
真面目に答えて下さい。 検索にかからないんですよ! お願いします、一言教えて下さい。
837 :
デフォルトの名無しさん :02/01/25 03:52
#include "match.h" こういうセミコロンで囲んだものの意味がわからないんですけど #include <match.h> とは意味が違うのですか?
a|=bはa=a|b
K&Rを読め>837
841 :
デフォルトの名無しさん :02/01/25 04:01
>>840 そんな殺生な・・・
買わなきゃダメでスカイ?
>>839 ファイルを探す順序はどちらが早いんですかね?
842 :
名無しさん@お腹いっぱい :02/01/25 04:06
" "
>842 ありがとう.
838、ありがとう。 御礼にあなたのことを想像しながらオナります。
セミコロンじゃなくてダブルクォーテーションです。 で、""はカレントを先に探して、そのあとの順番は<>と同じだったんじゃ?
セミコロンで囲むと、エラー出ます。 #include ;math.h;
あらま。俺ってば恥ずかしい。 匿名掲示板でよかった〜〜 ありがとう845
848 :
( ´∀`) :02/01/25 07:58
@strlen Astrcat Bstrcmp どう使うか、どういうものかはわかってますが 何て読む(発音)するかわかりません・・・。 おい、お前ら、お助け頂けませんか?
(1)エス・ティー・アール・レン (2)エス・ティー・アール・キャット (3)エス・ティー・アール・シー・エム・ピー(またはコンプ) と読んでるなぁ。
string
>>848-850 そこらへんは呼び方いろいろだと思うけどね。
回りで通じる呼び方にするべし。
おれは、str部分はストラにしてる。
853 :
( ´∀`) :02/01/25 09:30
>>852 お返事ありがとう。そっか〜。
漏れは家で独学なんだけど、みんなはどうなのかと
気になっていましたので・・・。
>>854 見るたびに思うがFalseをファールと発音するやつはいないだろ。
enumはイニューム charはチャー
reinterpret_cast<T> 読み方わかんないんで“あー、ほらキャスト”で誤魔化す。
素直に読めば「リインタプリットキャスト」では?
reinterpret_castやstatic_castなんて使うことあるの? reinterpret_castならまだしもstatic_castってCのキャストと同じなうえに主張が強すぎて読みにくいし。
860 :
デフォルトの名無しさん :02/01/28 03:55
さがりすぎ:)
861 :
ちょっと恥ずかしいけど :02/01/28 23:47
恥ずかしい質問なんですが、 char *name = new char[50]; char *my = "ABC"; name = "ABC"; //(strcpy(name,my)ならOK) strcat(name,my); //nameは"ABCABC" これがエラーになるのがよく分からないのです。 name = "ABC"とstrcpy(name,my)って同じような 気がするんですが・・・・ 今までC++BuilderのAnsiStringばかり使って楽して 来たのですが、汎用なものを作ろうとcharやりだし たのはよいけどcharってなんだか面倒なこと多いですねぇ
>>861 ここで説明始めると小一時間では終わらん。
name = "ABC"は、文字列定数"ABC"のアドレスをポインタ変数nameに代入している。
strcpy(name,"ABC")は文字列"ABC"をポインタ変数nameが指す領域に複写している。
ポインタとメモリ管理について勉強しる!
>>861 なぜ char * を使うことで汎用なものになると思いましたか?
864 :
デフォルトの名無しさん :02/01/29 00:00
>>861 漏れのコンパイラ(VC6)では通っちゃったよ。
どんなエラーが出た?
コンパイルエラーは出ないだろ。
866 :
デフォルトの名無しさん :02/01/29 00:58
実行結果も期待通りだったよ。 コンパイラに依存するの?
>>861 それはたぶんReadOnlyな領域に文字列を書き込もうとしている。
ただ、リンカのオプション等によってはwriteできる領域に配置させることも
あるのかもしれない。
869 :
デフォルトの名無しさん :02/01/29 01:19
>>865 >>867 がなにをいいたいのかわからん。
漏れがヴァカでスマソが、詳しく書いてください。
>>869 環境知らんけどすぐ後にもう一つ文字列リテラル作って
出力してみたらどうなる?
char *name = new char[50];
char *my = "ABC";
name = "ABC"; //(strcpy(name,my)ならOK)
char *s="tabunkowaremasu";
strcat(name,my); //nameは"ABCABC"
cout << s << endl ;
みたいに
871 :
デフォルトの名無しさん :02/01/29 01:26
>864 VCな人は、/GFつきでビルド・実行してみれ。
872 :
デフォルトの名無しさん :02/01/29 01:28
>>870 スマソ。漏れがものすごい勘違いしてた。
確かにそれだと壊れるよ。
ありがと。
873 :
デフォルトの名無しさん :02/01/29 01:29
Mid(String str,int a,int b) Mid(”ほげほげ”,1,2) -> ほげ Mid(”aiueokakikukeko”,3,4) -> ueok こういう関数をCでだれか作っておくれ。
エラー処理は端折ってある。あと、freeを忘れるなよ :) wchar_t *wcsmid( const wchar_t * str, int begin, int end ) { int length = end - begin; wchar_t *ret = malloc(( end - begin + 1 )*2); wcsncpy(ret, str+begin, length ); ret[length] = L'\0'; return ret; }
875 :
ちょっと恥ずかしいけど :02/01/29 01:37
遅くなりまた。しかもかなり説明不足な質問で申し訳ないです。 環境はVC++6.0でエラーは仰る通りコンパイル時ではなく、実行時 に「writtenになることはできませんでした」というエラーでした。
876 :
デフォルトの名無しさん :02/01/29 01:48
*2はまずいな。*sizeof( whcar_t )か。
エラー E2034 mid.cpp 13: 'void *' 型は 'wchar_t *' 型に変換できない(関数 wcsmid( const wchar_t *,int,int) ) 教えておくれ。(泣 freeを忘れるなの意味もよくわからない。
879 :
ちょっと恥ずかしいけど :02/01/29 02:06
>>863 char *が汎用だと思ったのは、自分が使う環境がC++Builder or VC++6.0
だとした場合、仮にC++Builder でAnsiString使っても.c_str()がありますし
MFCのCStringにも・・・・と思ったらCStringの場合にはstrcpyでコピーしな
いとダメ?だとしたら大して汎用ではないかなぁ。
なんでBorlandもMSも文字列はSTLの<string>を標準にしてくれないんで
しょうか・・って愚痴ですね。
880 :
デフォルトの名無しさん :02/01/29 02:07
>>878 wchar_t *ret = (wchar_t*)malloc(( end - begin + 1 )*2);
double *r=(double *)callos(5000,aizeof(double)); free(r); いま調べた、領域開放。
883 :
デフォルトの名無しさん :02/01/29 02:52
こんばんは. ちょうど文字列ってことで,C言語において, *ch1,と *ch2 に英文字列が入っているとき,それが全く同じ文字列か どうか調べる効率の良い方法はないでしょうか? 今は while(ch1[cnt]!='\0'){ if(ch1[cnt]==ch2[cnt]){ break; } cnt++; } って感じなんですが.もっとスマートな方法募集中です. C++にしろってのは無しでお願いします.
strcmpじゃ駄目なの?
ソレハstrcmpトドウチガウノデショウカ?
ムシロ、883のコードハ、strcspnポイ。
887 :
デフォルトの名無しさん :02/01/29 03:08
そういや他人のコード読むと、最初の一文字を比較してから、 strcmp()してるのが多いけど、今時のパソコンでも効果的で 漏れも真似してやるべき?
やっぱりそうですよねぇ. strcmpを使う場合は if(strcmp(ch1,ch2)==0){} とすればいいんでしょうけど.何か動作がおかしいのでね. strcspn調べたら確かに883っぽいですね.
あり?さがらない... 名前入れたら阿寒のか?
当然やることによるんでは? 頻度にね.
∧ ∧ 。 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (*゚ー゚) / < ここに「sage」(半角)と ( つ | 入れるとスレがありません。 | ̄ ̄ ̄ ̄ ̄| \___________
スレなくなっちゃうのかよ!
>>878 テメェで「こういう関数をCでだれか作っておくれ。」といっておきつつ、
> エラー E2034 mid.cpp 13:
C++でコンパイルするヴァカ発見。
894 :
デフォルトの名無しさん :02/01/31 19:14
>>861 うまく説明出来ないが、大体こんな感じ。
>char *name = new char[50];
1.まずchar型の変数50個のアドレスが確保され
その先頭のアドレスが変数「name」に代入される。
>char *my = "ABC";
2. read only文字列"ABC"の先頭文字'A'のアドレスが
変数「my」に代入される。
>name = "ABC"; //(strcpy(name,my)ならOK)
3. さらに「2」とは違う別のRead only文字列"ABC"の
先頭文字'A'のアドレスが変数「name」に代入される。
この段階で「1」で確保したメモリをせっかく指し示していた
変数「name」がまったく別のアドレスを指し示す事になる。
「1」で確保されたメモリは迷子状態。
>strcat(name,my); //nameは"ABCABC"
4. 変数「name」は現段階でread onlyの文字列の先頭アドレスを
指し示しているので、内容を変更する行為は全てエラーになる。
char a=*("abc"+1); putchar(a); 結果:b Cって凄いね。 理屈どうりにうまくいくのは。
> それが全く同じ文字列か > どうか調べる効率の良い方法はないでしょうか? while(*ch1++ = *ch2++);
だーいにゅー
>>887 あなたが試してみて、みんなに結果を報告してくれるとみんな助かります。
よろしく。
> それが全く同じ文字列か > どうか調べる効率の良い方法はないでしょうか? /* まったく同じだったら1 違えば0 */ unsigned int strchk(char *a,char *b) unsigned int c=0,d; if((d=strlen(a)) == strlen(b)){ while(*a != '\0') if(*a++ == *b++) c++; if(c == d) return 1; } return 0; }
>>899 それを使うんだったらstrcmp()の方が間違いなく速い。
そもそも、
>>883 のソースがなにをやりたいのかよく分からないんだけど…
(strcspnとも違うと思うぞ)
もしかして、2行目は==じゃなくて!=の間違いだったりしない?
それにしても、「全く同じ文字列かどうか」のチェックになってないが。
実はチェックしたいのは、「全く同じ文字列かどうか」じゃない別のこと
じゃないの? そうでないと、strcmp()でダメな理由が分からん。
こんばんは、あまりにも低レベルな質問で恐縮なのですがVCで以下のところが よくわかりません。 char buffer[1]; int len; len = strlen(buffer); としたところlenに7が入りました。 これは初期化をしていないからでしょうか?
そうです
>>901 C 言語では文字列の終端を 「ヌル文字 ('\0')」 と規定している。
strlen は '\0' が現れるまでカウントしているわけだ。
そのコードの場合は buffer がたまたま割り当てられたメモリ領域の頭から
'\0' が見つかるまで延々とカウントすることになる(いつまでかはやってみないと不明)。
つーか char buffer[1]; だと1文字分しかないので
文字列はヌル文字しかない空文字列(これ→ "" )しか入らないと思うが。
>903 詳しい解説ありがとうございました。 C言語って怖いですね。 たとえばbuffer[255]と宣言して。 buffer[255]="\0"とかやっても大丈夫なんですから。 気をつけなければ。
>>904 >buffer[255]="\0"とかやっても大丈夫なんですから。
buffer[255]='\0'じゃないと、コンパイルエラーになると思うが。
906 :
デフォルトの名無しさん :02/02/02 00:26
>906 #define 1 255 ってやってるんじゃないの?最初のほうで。 # いや嘘です。許してください。
>>906 struct name *p = (struct name *)malloc(256);
strcpy(p->namestr, "ほげ");
p->namelen = strlen(p->namestr);
とか。
>>908 固定で割り当てたら意味ないだろ。
#include <stddef.h>
struct name
newname(const char *str)
{
size_t len = strlen(str) + 1;
struct name *p = (struct name *)malloc(offsetof(struct name, namestr) + len);
memcpy(p->namestr, str, len);
p->namelen = len;
return p;
}
struct name *n = newname("ほげ");
ファイル名の一部分だけ違うやつを連続して読み込みたいと おもって(たとえば、file1、file2、file3・・・・つう感じで) char file_name[6]; int i; file_name[0] = 'f'; file_name[1] = 'i'; file_name[2] = 'l'; file_name[3] = 'e'; file_name[5] = '\0'; for (i =1 ; i < 10 ; i++) { file_name[4] = '0' + i; fopen(file_name,"r"); } こんな感じでやったんだけどfopenのところがコンパイル通りません。 どうしたらよいんでしょうか? 元ネタは C言語 体当たり学習 徹底入門 という本のP158/159あたりのコードなんですけど・・・
>>910 コンパイルエラーはなんて出てるの?
単に
#include <stdio.h>
の記述抜けってコトはない?
>>911 #include <stdio.h>は記述してあります。
コードをコンパイルしようとしたときに出るエラーは
error C2664: 'fopen' : 1 番目の引数を 'int [7]' から
'const char *' に変換できません。 (新しい機能 ; ヘルプを参照)
というやつです。VC++ 6.0を使って勉強しています。
どうやら
fp = fopen(fopen((char *)file_name,"r");
とするとエラーが出なくなります。
コンパイラ特有の解釈とかが絡んでのエラーなんでしょうか?
それとも、C言語としての規約としては
わざわざキャストしなければいけないと言うことではないですよね?
>>912 俺はVC6でちゃんとコンパイル通ったぞ。
本当に
>>910 のコピペと同じ内容か?
int file_name[6];
って宣言してないか?
>>913 >int file_name[6];
>って宣言してないか?
あっ!!!!
すんまそん・・・・・・思いっきりしてました。
これをなおして、キャストもはずしてきちんと動くようになりました。
本の作者には変な疑いをかけてしまって申し訳ないっす。。。。
あと100万年くらい精進いたします。
今後とも、なにとぞご指導ください。
>>914 なんで char => int と宣言を変えるだけで駄目なの?
917 :
デフォルトの名無しさん :02/02/03 20:20
>>916 1 番目の引数を 'int [7]' から 'const char *' に変換できないから。
・・・実は漏れもよくわからん(w
int a[7]を暗黙の内にchar*やconst char*にするのは、 バグの元。(というか殆どバグと同じだから) int*や、const int*にはOK。違いが判るか?
変更するべきでなさそうな変数とか宣言するときにみんなちゃんと const つけてる? const int lineCount = lines.size(); for( int lineIndex = 0; lineIndex<lineCount; ++lineIndex ){ const char const* lpszLine = lines[lineIndex]; ... } とか。 なんか意味なさそうだけどつけたほうがかっこいいかなぁとか。 思わない?漏れだけ?
>>918 #聞くは一時の恥、聞かぬは一生の恥根性で。。。。。
正直なところわかりません。
「char*/const char*」も「int*/const int*」もどちらも
変数の値にはアドレスが入っている。
しかし、そのアドレスが指し示す先には
char*の場合(本来意図しない)文字の値が入っている。
しかし、int*の場合は本来の意図通りの数値が入っているから?
ここまではあっていますでしょうか?
だからどうしてダメなのか今ひとつピンとこないんですが・・・・
よろしければなにとぞご教授ください。
>>919 過度なconstの記述はかえってコードを見ずらくするんで
関数引数やC++のメソッド/静定数にしかつかわない。
>>920 file_name[]をintとしたときとcharとしたときの変数ダンプ見れ。
ちょっとわからないので教えていただけたらうれしいです。 unsigned chat A[] = { 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90 }; unsigned char bits; bits = A[(unsigned char)(p->mon->aaa.buf[(unsigned char)p->mon->aaa.cnt] - ' ')]; もし、cnt が「4」のとき、bitsにはどういう何が入るのでしょうか?
>>923 > もし、cnt が「4」のとき、bitsにはどういう何が入るのでしょうか?
p->mon->aaa ってのは何?
それが分からなきゃなんだかサパーリ サパーリ
# なんで配列の添え字をunsigned charにキャストしてるんだろう…
924さんありがとう。 p->mon->aaaは、構造体です。 ># なんで配列の添え字をunsigned charにキャストしてるんだろう… 型変換は特にしなくても良いとは思ったんですが・・・。 aaa.bufはメンバがバッファです。 aaa.cntは添え字みたいな感じです。 で、スペースをマイナスってどういうことかなって。 ごめんなさい。わかりづらくて。
>aaa.bufはメンバがバッファです。 >aaa.cntは添え字みたいな感じです。 正直、感動した。 なんつーの、えと、デカルチャー!
>>926 > で、スペースをマイナスってどういうことかなって。
だ・か・ら!
p->mon->aaa の値が分からなきゃ答えられないでしょうが!!
文字コードでの空白文字からのオフセット値を取ってるんでしょ。
なんでそんな事をしてるのかは、これだけのコードではワケワカラン。
p->mon->aaa.bufのサイズが256で 配列の添え字が0〜255じゃなきゃ困るってことだろ?
>929 そのようなバッファに対して、cntをunsigned charとしないのは なぜだろうか。ついでに、A[]は要素が10個しかないようだが、 A[(unsigned char...に意味はあるのだろうか?
bufの中身が"9876543210"で、cntが「4」の場合です。 923 の配列のどれが選択されるんでしょう? ホント、手間かけてごめんなさい。
追記。 "選択されるんでしょう?"てゆーのは、 bits = A[p->mon->aaa.buf[p->mon->aaa.cnt] - ' ']; をした結果、bitsに入る値のことです。
実行してみれば? 呆れて何も言えんわ…
何で質問をマトモにすることも出来ないアフォが、この業界に 入ってくるやつには多いんだろうかね? あんまりバカじゃ出来ない仕事のはずなのにね。
追記 実行してエラーが出たからといって、 エラーになるんです、とか書き込まないように(w
結果:core dump. ジャネーノ?
>>922 やってみました
int file_name_i[2];
char file_name_c[2];
と、したときに
intは 0x0012ff78、charは 0x0012ff74となってました。
これは番地を表しているのですよね?
で、file_name_i[0]/file_name_i[1]にはそれぞれ「0xcccccccc」が
file_name_c[0]/file_name_c[1]にはそれぞれ「0xcc」が入っていました。
これは値(数値や文字)ですよね?
ということで、intをcharにキャストすると予期せぬアドレスを
壊してしまう(バッファあふれ?)事になるからでしょうか?
んー、そもそもVC++の使い方がわかっていないので
これらの値が何を指しているのかも怪しいのですが・・・・・
いかがなもんでしょうか?
ほらよ。てか、一体何がわからんのかわからん。 一個ずつ筋道たてて考えれや。 cntが4なら →p->mon->aaa.buf[(unsigned char)p->mon->aaa.cnt]は'5' →'5'-' 'は0x15=21 →A[21]なんて知らん →(;´Д`)core dumped
>937 大概、char*を受ける関数、ってのはCの文字列が欲しいわけだよな。 "string\0"ってヤツ。で、int[]={'s', 't', 'r'...}やけども、x86系なら、 "s\0\0\0t\0\0\0r\0\0\0"...ってなるわけよ。扱われるのは 最初の's'だけになっちまう。こんな危ない動作を、暗黙で行えるか、 ちゅうこと。(その危なさを知って、敢えて行いますよ、っていう言明が キャストなわけ。)
>>937 まず、普通はintは4バイトでcharは1バイト。
だから、int a[2]に1と2を入れるとメモリイメージ的には
00 00 00 01 00 00 00 02 となる(とりあえずエンディアンは無視で)
で、char b[2]に1と2を入れると
01 02 となる。
こういう違いのため、int*をchar*として使おうとすると、1バイトずつ
取り出すことになるんで上の場合は1と2ではなく、
00がたくさんと01,02に見えてしまう、といった感じで。
>>915 #include <stddef.h>はoffsetofを使うため。
> struct name *p = (struct name *)malloc(offsetof(struct name, namestr) + len);
offsetof(...)はnamestrの前までの固定領域のサイズ、それとnamestr用の領
域を一緒に割り当てる。
>943 あー、漏れだたら、面倒だからsizeof( name ) + len で済ますかなー。
945 :
デフォルトの名無しさん :02/02/04 00:46
すみません、ひとつ教えて欲しいんですが例えば、 「20人分の点数を入力して、上位5名分の点数を高得点順に出力する」 という問題で、高得点順に並び替えるプログラムが分かりません。 if文を使って考えてみましたが分かりませんでした。 おねがいします。
>945 ふつーにsortすればいいのでは?
そもそも「ソート」という概念すら知らないのかも。 "ソート" & "アルゴリズム" で検索してみろ。
>>940-941 すげーわかりましたっ!!!!!
かなり感動でっす。
ほんまに、ありがとうございます。
んで、自分が
>>937 で書いた
> ということで、intをcharにキャストすると予期せぬアドレスを
> 壊してしまう(バッファあふれ?)事になるからでしょうか?
は、逆を考えてしまっていたようですね。
自分は大きさ1(char)のところへ大きさ4(int)の物を入れるのがキャストと
思っていましたが、大きさ4(int)の物を大きさ1(char)として扱うのが
キャストですね。
ほーんま、勉強になりました。
これでもうちょっと頑張って勉強していけます。
これからもよろしくお願いします。
>>942 そうですよね、これって超簡単なことなんですよね。。。。。
で、初心者が脱落しやすいといわれる、メモリへの格納イメージ部分なんですよね。
なんか、1歩先へ進めた気がします。
こんなへたれですけど、これからもがんばりましゅ。。。。
>>948 いや、どっちもキャストとは言うと思います。
ただ、大きさ1(char)のところへ大きさ4(int)の物を入れようとすると
大きさ3分が切り捨てられるため意図した動きにならないこともあります。
>>946 >>945 の
> if文を使って考えてみましたが分かりませんでした。
この一文から945の程度が知れるのでたぶんソートとか言っても意味わからんと思われ。
if文を20個ネストと言うのはどうだ?
>>950 たいていif文を使って〜とかfor文を使って〜とかいうやつはそれを習ってるか習ったばかりの段階だからな。
>951 if文20個だけでは済まないような‥‥
954 :
デフォルトの名無しさん :02/02/04 03:10
>>948 EOFが127を超えるという事を聞いたことがあるんだけど、どう対処するの?
955 :
デフォルトの名無しさん :02/02/04 03:34
引数に多次元配列を取るにはどうしたらよいですか?
957 :
デフォルトの名無しさん :02/02/04 03:41
え?
958 :
クワサワ先生 :02/02/04 04:01
http://www.puchiwara.com/hacking/ / | | | |ヽ @ノノヽヽヽ@
|( ゚〜゚ )| ノノノ人ヽ_ (ノ~\\ ノノノノ从ヘ ノノノノヽヽ (0^〜^0)
|( )| (●´ー`●) (`.∀´) ノハヽヽ. |( ´Д` )| 从^▽^从 ( )
| | | ( ) ( ) 从 ^◇^ 从 |( )| ( ) .| | |
| | | | | | ||| ( ) ||| | | | | | |
(_)__) (__)_) (__)_) (_)_) (_)__) (_)__) (_)__)
飯田 安倍 保田 矢口 後藤 石川 吉澤
ノノノノヽヽ .ノノノノ从ヘ / | | | |ヽ
∋oノハヽヽo∈ ∬`▽´∬ 川’ー’川 川o・-・) ◎ノ^^ヽ◎ @ノハ@
( ´D`) ( ) ( ) ( ) §(´・e・`)§ (‘д‘ )
( ) ||| ||| ||| ( ) ( )
(_)_) (_)__) (_)__) (_)__) (_)_) (_)_)
辻 小川 高橋 紺野 新垣 加護
>>655 void test(int **ip);
>>949 うっ、おっしゃるとおりどっちもキャストですね。。。。
#やっぱり、俺アホだ・・
もし良かったら確認させてもらいたいんですが、
> きさ1(char)のところへ大きさ4(int)の物を入れようとすると
> 大きさ3分が切り捨てられるため
って、本当なのでしょうか?
自分のイメージでは、意図しない場所(大きさ3だけ後方)まで書き込んでしまい、
メモリ領域を破壊すると思っていたいのですが・・・・・
その部分は切り捨てられちゃうんですか?
>>954 す・すんまそん・・・・
おっしゃることが理解できないです。
EOFはマクロだろうというところまでは頭が働いたので
適当にヘッダーファイルを漁ったところ
stdio.hの中に
#define EOF (-1)
つうのを見つけました。
この値が場合によって(処理系によって?)127を超える値になると言うことでしょうか?
で、そのようになった場合、自分が質問させてもらっていた
事にどのような影響があるんでしょうか?
またもや、スレのタイトル通り超カンタンな事をお聞きしてますでしょうか?
ヒントでも良いので、教えてもらえませんか?
#マジ頼むっす
char c; int i; char*cp = &c; で、 *c = i; なら、cで表現できないデータが失われるかも、ってだけ。 *(int*)c = i; なら、メモリ破壊。 この違いがおわかりか?
あ、いかん。下の方の*cとかは*cp,*(int*)cpね。
>>962 うぅ、、、、、これは俺が試されているんだろう。
ここでしくじったら、二度と質問に答えてもらえないかも
#プレッシャー!!!
ということで、猿なので一度にはわかりませんので
順を追って考えさしてください。
char c; 値(1バイト)が格納される
int i; 値(4バイト)が格納される
char *cp= &c; 変数cの値が格納されているアドレスを*cpに代入 //かなり理解があやしいぃ。。。
で、
*cp = i; 4バイト分の値(i)を、変数cpが示す先のアドレスへ入れる。
変数cpは&cが代入されているから、1バイト分のアドレス領域
>>メモリ破壊
*(int *)cp = i; アドレスcpが指し示す先には4バイト分のデータ領域があるとコンパイラに、
無理矢理信じ込ませる。→cpをint *でキャストしているので
で、そのアドレスが指し示す先に4バイト分の値(i)を代入
でも実際は1バイト分(&c)しかない。
>>メモリ破壊
下側は何となくこれで良いような気がしますです。
上は・・・・・????
くぅ、こんなにメモリの事を考えてコード読んだのはじめてっす。
この1文書くのに1時間かかりました。
必死に考えました、マジで悔しいっす。
お願いみしゅてないでぇ〜〜〜〜(T_T)
>>964 *cp = i;
と
memcpy( cp, &i, sizeof(int) );
との違いを理解しろ。
>>964 char a = 128;
printf( "a=%d", a );
結果がどうなるか試してみればいい。
aの値を色々変えてみれば、解かると思う。
>960 つか、君の主張では、 コンパイラは避けられて、又避けるべきな 「メモリ破壊を招くコード」をわざわざ出力する と言うことになるんだが。
>>965 たびたびお騒がせしております
本日もたりない頭を絞ってみました
>*cp = i;
4byte分(int i)の値を、1byte分(char cp)確保されている
場所へコピーしようとするが、賢いコンパイラが
余った3byte分を破棄してくれて、
意図しない結果になるがメモリ破壊は起こらない。
>memcpy( cp, &i, sizeof(int) );
変数iの値が確保されているアドレス(&i)を先頭として、
4byte分(=sizeof(int))の内容をを変数cpが指し示す
アドレスから4byte分の領域へ無理矢理コピーする。
が、cpはchar型なので本当は1byte分しか
メモリ領域が確保されていない為メモリ破壊が起こる。
ここまでは、よかでしょうか?
で、キャストというのはmemcpyと同じように無理矢理
内容をコピーしてしまうために
>>962 さんがおっしゃる状況になる。
こんな理解でよろしいでしょうか?
>>966 ありがとうございます。
最初に気がついたのは、代入する値が127以下だと
表示される値が代入した値なのに、128以上だと
負の値が表示されることでした。
これはしばらく考えていたら、情報処理でやった
2の補数の考え方だと言うことに気がつきました。
最終的に確信が持てたのは変数の宣言を
unsigned charにしたときなのですが・・・・
で、さらに
printf("a=%d\n",a);
printf("a=%c\n",a);
などとやっているうちに、なんとか
>>965 でいただいた
課題への回答へいたることが出来ました。
>>967 おっしゃるとおりですね。
そのときの自分は「キャスト」という物に
固執しすぎていたようです。
キャストするならば、コンパイラはこちらの意図通りに
だまされてくれるので、メモリ破壊が起こってしまいますが
そうでなければきちんと切り捨ててくれるんですね。
勉強になりました。
これからも頑張って精進していきます。
なにとぞよろしゅうお願いしますです。
>>968 まだ勘違いしてると思うよ。
その考えでは
*cp = i;
と
memcpy( cp, &i, sizeof(char) );
が同じという事になってしまう。
>>971 説明が悪かったな。
この場合はたまたま結果が同じになるな。
float f; char c;
で
c = f;
と
memcpy( &c, &f, sizeof(char) );
では、結果が違うという事が言いたかった。
そろそろNEWスレかな
>>971 =972
ま、まだダメっすか・・・・
ちょっと鬱かもしれない。
> float f; char c;
> で
> c = f;
4Byte分のfloatの値(数値)を1Byte分のcharの
値へ(文字コードとして)代入しようとするが、
余分な3Byte分は切り捨てられる。
よって、メモリ破壊は起こらない。
(結果は意図した物にはならないが、
エンディアンにより一定の規則性あり?)
> memcpy( &c, &f, sizeof(char) );
変数fが格納されているアドレス(&f)から
1byte分(sizeof(char))のアドレスを
変数cが格納されているアドレス(&c)へコピーする。
メモリ破壊は起こらないが意図した結果にならない。
って、こう考えてしまうんですが、
わざわざお題を考えていただいているんだから
この答えじゃおかしいんですよねぇ。
なんか、まじめにこんがらがってきました。
足りない頭がマジむかつくっ!!
次スレに移行するまでにはOK頂きたいっす。。。。
>>974 >(結果は意図した物にはならないが、
>エンディアンにより一定の規則性あり?)
c=fはキャスト変換なんだよ。
明示的キャスト変換になっていないから、いい書き方だとはいえないけど。
(本当はc=(char)fと書くべき)
結果は意図したものになるんだよ。
キャスト変換はメモリコピーとは違う。
以下の部分をコンパイルして実行してみたらわかる。
解かりやすいように、charじゃなくてshortを使ってみた。
fの値をいろいろ変えてみると解かると思うけど。
s = f の結果は意図したものになってる。
float f;
short s;
f = 1234.56789;
s = f;
printf("s = f -> %d\n",s);
memcpy( &s, &f, sizeof( short ) );
printf("memcpy -> %d\n",s);
976 :
デフォルトの名無しさん :02/02/14 20:50
char *f="1000.TXT"; のようにした場合、 "1001.TXT"と変えることは無理でしょうか?
>976 char *f = "1000.TXT"; f = "1001.TXT"; で何か問題でも?
ありがとうございまする。 そんな簡単にできるとは・・・。 char型はなんだかよーわかりません。。。
コマンドライン引数を使って"okinawaken"を入力して ASCIIコードに変換→表示というプログラムを作りたいんですが・・・ 宜しくお願いします
int main(int argc, char *argv[])
{
int i;
for(i = 1; i < argc; i++){
printf("%s\n", argv[i]);
}
return 0;
}
>>979 これを参考にしてチョ
>980さん 早速のレス有難う御座います この場合、okinawakenはどうやって入力させればいいのでしょうか 初心者質問ですみません
オロオロ。あっしも初心者でげす。 まずexe作って、 hoge.exeだったとしたら、 DOSプロンプトから hoge.exe okinawaken と打てばよいのではないでしょうか。
test.exe okinawaken[Enter]
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; int tmp=0; for(i = 1; i < argc; i++){ printf("%s\n", argv[i]); tmp=tmp+atoi(argv[i]); } printf("コマンドライン引数の和は%d",tmp); return 0; } これはコマンドライン引数の和を求めるプログラムで、 これをhoge.exeにして、c:\に移動して、 DOSから cd c:\ hoge.exe 100 20 とすると和が表示されるはずです。 これを参考に。
有難う御座います おかげさまでなんとか出来そうな感じになりました 親切にしていただいて、涙がちょちょぎれそうです 多謝
たびたびすみません okinawakenを ASCIIコードに変換→表示 という部分が上手くいかなくて・・・ 申し訳ありませんが教えていただけませんでしょうか
const char* p="osakafu"; while(*p) printf("%x\n",*p++);
>987さん ご教授、誠に有難う御座います しかし当方の頭ではコマンドライン引数で入力された文字列に 適用することが出来ませんでした
自分は printf("%s\n", argv[i]); ↓ printf("%x\n", argv[i]); このようにフォーマット指定子を変えるだけで ASCIIコードになると思っていたのですが 全然違うみたいですね・・・・ すみません、分からないです・・・
ヽ(`Д´)ノ const char* p=argv[i]; while(*p) printf("%x\n",*p++);
>>989 これじゃだめかしら。
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=0;i < argc;i++){
int d=0;
while(argv[i][d] != '\0') printf("%x",argv[i][d++]);
putchar('\n');
}
return 0;
}
>990さん >991さん 自分のようなおばかに教えていただき、感謝の極みです 御陰様でやっとできました 大変貴重なレス、有難う御座いました
1000ゲッターにはおいしいスレだな
ヘ-+------+--+-----+ヽ_ /:::|:::::::|:::::::::::::/::::::/::::::::::::::/:::::::/`\_ / ̄\::::::|:::::/:::......-―――--..........__/:::::::::::::::\ ┌ー ̄::::::::::::ヽ::|:::..-^ ̄ ^ ヽ、:::::::::\ ヽ::::::::::::::::::::::::::::/ 今だ995 \::::::::ヽ ヽ:::::::::::::::::::::::/ ゲットー :::: \:::::ヽ ヽ::::::::::::::::::/ ズザーー :::::::: \::::|_ ):::::::::::::::| ::::*::::: ヽ:|::::ヽ /::::::::::::::::| ::;;;;: l::::::::ヽ /::::::::::::::::::| ノ::ii:ヽ:: l::::::::::| |::::::::::::::::::::| /::::;リ:::l:::: |::::::::::::| |:::::::::::::::::::::l ...l::::;リ:::/:: /:::::::::::::| .|::::::::::::::::::::::l . /:ア/::: /:::::::::::::::i l:::::::::::::::::::::::::l ./::`^::::: /:::::::::::::::::/ ヽ::::::::::::::::::::::::l /:::::::::: /:::::::::::::::::::/ /:::::::::::::::::::::::l /::::::::::::: /::::::::::::::::::::::/ /::::::::::::::::::::::::i __-ー--=;;;:::::::::::::: ....::::/:::::::::::::::::::::::/ ./:::::::::::::::::::::::::::i"::::::::::::::: ヾ─ 、/"ヽ:/::::::::::::::::::::::::::::l ヽ::::::::::::::::::::::丶:::::::::: / il .ヽ:::::::::::::::::::::::::::/ \::::::::::::::::::::ヽ::::::: / l ! ヽ:::::::::::::::::::/ ii::::::::::::::::::` -::-/ / .i ヽ::::::::/ ----- ̄丶/ lヽ ヽ/ / l ^ヽ.. ヽ / l ヽ .ヽ l .l ヽ / 丶 l ヽ .l ヽ l l / ヽ___../ .ヽ---/
996get
∋oノハヽo∈/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´D`) < こんにちわぁ〜 = ⊂ ) \_______ = (__/"(__) トテテテ... ∋oノハヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ○( ´D` )○< つぃののみれす! \ / \_______ しし))ミ ピョ-ン ∋oノハヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´D`) < きょうはせんをげっとしにきたのれす ∪ ) \_______________ (_)_)
∋oノノハヽヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (´D`≡´D`) < られもいましぇんね?ののがせんげっとしちゃいましゅよ? (⊃ ⊂) \________________________ (_)_)
いまら!999げっとぉぉぉなのれす!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄(´´ ∋oノハヽo∈ ) (´⌒(´ ⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ らにみてるのれす、てれるらないれすか!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ポ∋oノハヽo∈ ポ ン (´D` #) ン (´;) U,U )〜 (;;). (´)〜(⌒;;UU (´ )...〜⌒(`)
いまら!せんげっとぉぉぉなのれす!!  ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∋oノハヽo∈ (´⌒(´ ⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ | ? |  ̄∨ ̄ (´´ | ∋oノハヽo∈ ) (´⌒(´ 人 ⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡ ( ) | ̄ ̄ ̄ ̄ ̄ ̄ (´⌒(´⌒;; ̄ ̄  ̄ | ズザーーーーーッ | | | (´´ |! (´⌒(´ ∋oノハヽo∈ (´⌒;;;≡≡≡ (´D`; )⌒つ | ̄ ̄ ̄ ̄ ̄ (´⌒(´⌒;; ̄ ̄ ⊂  ̄U | | | | プラ〜ン | ∋oノ|ヽo∈ ( / ⌒ヽ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ U ) | UU |
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。