1 :
v(^o^i)d●v(^o^i)d●v(^o^i)d :
04/10/31 17:47:56
2 :
デフォルトの名無しさん :04/10/31 17:48:24
【FAQ】 プログラム終了時にはfree()をちゃんとすること。
新スレ乙
6 :
デフォルトの名無しさん :04/10/31 18:04:53
続きをやるぞ。age!
7 :
大原ゆき :04/10/31 18:05:26
うんざりなんだけど
OSとかで解放してくれない時は自分でfreeしてください。
続きは俺俺でやってください。
そうだ、俺俺があったんだ… すっかり忘れてた
とりあえず、freeがいらないといっている奴は、 C言語の規格書からプログラム終了時にOS依存ではなく、 C言語として必ずメモリが解放されると記述している場所を示せ。
HP-●Xが昔 void free(void *ptr) { return; } だったという話を風の噂に聞いたことある。真偽のほどは確かめていない。
とりあえず、freeがいるといっている奴は、 OSの規格書からプログラム終了時にプログラム依存ではなく、 OSとして必ずメモリが解放されるとは限らないと記述している場所を示せ。
>>14 もうこないでよ、あっちいってよ
斯く言う私はfree必要派
OSの規格書があるなんて初耳だなw
>>16 開発元が作ってればあるんじゃない?w
手に入るかは別として
>>13 そんな莫迦な話が本当だとするなら、HP-UX (下らない伏字に何の意味が?) では
「終了しないプログラムで malloc してはいけない」という事になりますね。
19 :
デフォルトの名無しさん :04/10/31 21:48:50
>
>>968 > 意味なくない。常に free() を行うのが正統な C だ。
> まともなプログラマなら誰だって同意するだろう。
おまえぼけ。たとえばUnixのソースをみても終了時のfreeはしないのがあたりまえ。
伝統的にも正統かどうかをみても「しない」のが常識。
20 :
デフォルトの名無しさん :04/10/31 21:52:32
> > しっかりfreeしたつもりでも
> > 当のfreeが void free(void *ptr) { return; }
> > と定義されてるのもあるという話、聞いたことアルヨ。
>
>>993 > 標準Cの話してるのに、なんでそんな話になるんだ?
標準の話だというなら、それこそ「終了時もfreeしないといけない」環境なんてのを
もちだすのがぼけ
だから、終了前に絶対freeしろも、freeするなも極端すぎなんだって。 いいじゃん、別にどっちでも。 まともじゃないOSを相手にする時だけに気をつければ。 free不要論みたいなバカ論ならともかく、議論する内情じゃないよ。
変な家庭だな。
×内情 ○内容
必要なfree()はしたほうがジェントルメンだと思うけど。。。 その程度のことなんじゃないのか? シルバーシートで席譲るみたいな、マナーっつうか。
>>18 終了しないプログラムでmallocしなければ
メモリリークしない、ということは少なくとも真理です。
>>21 つまり、プログラムの終了時にメモリが必ず解放されるとは
書いていないということですね。
mallocして独自メモリ確保ルーチンを呼べばいいじゃない
書いていない=未定義。 未定義なのだからより安全なほうを選ぶのが 常識でありマナーというものでしょう。
31 :
デフォルトの名無しさん :04/10/31 22:40:59
> 極端すぎなんだって。 > いいじゃん、別にどっちでも。 あ、つごう悪くなってきたのでごまかしモードだな? ;-)
32 :
デフォルトの名無しさん :04/10/31 22:41:34
> つまり、プログラムの終了時にメモリが必ず解放されるとは > 書いていないということですね。 そもそもmallocしたらメモリーがかならず確保されるとも書いてないぞ?
33 :
デフォルトの名無しさん :04/10/31 22:42:14
> 必要なfree()はしたほうがジェントルメンだと思うけど じゃあ終了時はしないのね。
Ctrl-Cシグナル等を受けたときでも行儀よくfreeしないといけないの?
35 :
デフォルトの名無しさん :04/10/31 22:50:30
このスレ暫く封印…と。〆(。。
>>34 CTRL-Cシグナルなんてものは、そもそもC言語の範囲外です。
C言語の範囲外は範囲外。C言語の範囲内はC言語でやりましょう。
もちろんmalloc、freeはC言語の範囲内なのでC言語でね。
>>34 どうせ他のリソースも解放しないといけないんだから、ついでにfreeしとけ。
>>33 大抵しないけど、自己満足的にするときもある。
気分によりけり。
カーニハンやリッチーはどこまでfreeしてたんだろうね? 歴史学的見地をしりたいな。
こういうコードはしばしば書いた。 FooStruct * initFoo(void) { static FooStruct * sFoo; if (sFoo == NULL) { sFoo = malloc(sizeof(FooStruct)); } setSomeFoo(sFoo); return sFoo; } 当然、free()してない。 或いはこういうコードも。 FooStruct * allocFoo(unsigned cnt) { static FooStruct * sFoo; if (sFoo) { free(sFoo); } sFoo = malloc(sizeof(FooStruct) * cnt); setSomeFoos(sFoo, cnt); return sFoo; } やはり、最後はfree()してない。
Cで書くときはあまり真面目にfreeして終了しないが VBで書くときはかなり几帳面にset obj = nothingして終了している。 そんな自分がよく分からない。。。
>>40 私ならsFooを関数外に出して、if (sFoo) free(sFoo)する関数をinitFoo()でatexit()に登録するなぁ。
なんでネタスレになってるんだ? ここは初心者の集まりかよ。
一般的な OS ならプロセスごと消滅するわけで free() する必要などこれっぽっちもない。 そもそも、標準 C の範疇を越えている以上、スレ違い。
>>43 変なのが前スレから粘着しているんだ。
スルーお願いします。
>>43 もともとCについてぐだぐだ語るスレだ。
気にするな。
voidなのかvoid信者なのかしらんが、 あんなプログラマとして終わっちゃった人の相手してどうすんのよ。 おれの中では石田晴久並に過去の人。
石田晴久はプログラマですらない
49 :
デフォルトの名無しさん :04/11/01 01:34:33
> CTRL-Cシグナルなんてものは、そもそもC言語の範囲外です。 じゃあその場合はメモリーリークしちゃってもいいと?
50 :
デフォルトの名無しさん :04/11/01 01:37:17
> カーニハンやリッチーはどこまでfreeしてたんだろうね リッチーもトンプソンも終了時にはfreeしてない。Unixのソースみてみろ ぼけ
51 :
デフォルトの名無しさん :04/11/01 01:38:54
> おれの中では石田晴久並に過去の人。 っていうか石田晴久がCの本訳すより前からめだってただろ彼
52 :
デフォルトの名無しさん :04/11/01 01:40:04
なんでここでvoidがでてくるんだ? かれの本にはfreeするなとでも書いてあるのか?
53 :
デフォルトの名無しさん :04/11/01 01:40:59
いえ、main関数はintです。
Unixが終了する時はfreeいらないと思うけど、アプリが終了する時にはどうなん?
逆に オレはいかなる時でもfree書いているぜ という人はいるのか?
>>51 べつにー、過去にどうだったか関係なく、過去の人。
58 :
デフォルトの名無しさん :04/11/01 02:25:39
> Unixが終了する時はfreeいらないと思うけど、アプリが終了する時にはどうなん? だーかーらー Unixの/binや/usr/bin の下にあるこまんとも彼らがかいたのは多いのよ?
60 :
デフォルトの名無しさん :04/11/01 02:33:05
「過去にしたい」人なのね。
61 :
デフォルトの名無しさん :04/11/01 02:33:25
↑過去のひとだと思いたい!
>>58 自分達でカーネルソースまで管理できるシステムだからこそできることだね。
63 :
デフォルトの名無しさん :04/11/01 02:34:18
っていうか、自分たちでCの文法まできめたんだろうが...
65 :
デフォルトの名無しさん :04/11/01 02:51:56
なんでおまえらそんなにvoidをこわがるんだよ! こわくねーだろ?
free()してる最中にシグナル届いてハンドラに飛ばされるとどうなるんだろうね? 興味深い。
67 :
デフォルトの名無しさん :04/11/01 03:03:54
だからfreeするな
おなじみ、エキサイト
http://www.excite.co.jp/world/english/で 「shit」と入力し和訳にかけてみてください。恐らく予想通りの結果が得られます。
それでは次に「shit!」とエクスクラメーションマークを一つ足してください。
予想もしなかった大変な事態になるはずです。
が、それは気にせずにエクスクラメーションマークを足していきましょう。
4つ目で少し不思議なことになりますが。
無事5つ目までつけ終えれば今回の実験は終了です。
.
>だからfreeするな だよね。
71 :
初心者 :04/11/01 03:45:40
質問です。たとえばボタンを押せば強弱によって表示される文字が 変わるものを作りたいのですが、下の条件で 引数1で、弱く押せば a 強く押せば b を表示させたい時にはどうしたらいいんですか? (1) void DisplayLetter(int LetterNum) 機能: 指定された文字を表示する(注、ここでは a=10 b=20ということにしてください) (4) int SensePressure(int ButtonNum) 機能: 指定された番号のボタンに関して、押されたときの強さを調べる。 引数: 0 〜 12の整数が許される。番号に対応したボタンの状況を調べる。番号とボタンの関係は表3の通りである。 戻り値:弱く押されたときはWEAK(1)、強く押されたときはSTRONG(2)、指定されたボタンが押されていないときはERROR(0)。 数に範囲外の値が指定された場合にも、ERROR(0)。
>>71 宿題かなあ。問題がごちゃごちゃしててよくわからんよ。
とりあえず、DisplayLetterとSensePressureが与えられてて、
それを使ったコードを書けということかな。
こんな感じかな。
void foo(int ButtonNum)
{
int pressure = SensePressure(ButtonNum);
switch (pressure) {
WEAK:
DisplayLetter(10);
break;
STRONG:
DisplayLetter(20);
break;
default:
/* なにもしない */
break;
}
}
でもなんか問題の解釈を間違ってるような気がする…
74 :
初心者 :04/11/01 04:26:13
>>73 参考になりましたありがとうございます。
ちなみにこれ今やってる大学入試問題です。携帯電話の英文入力インターフェースを作ってるんですが
理解に苦しんです。カンニングにならないのか?という意見もでそうですが
情報収集能力もテストのいっかんですので大丈夫ぽいです。
マルチすんなボケ
76 :
デフォルトの名無しさん :04/11/01 11:30:55
すみません。初めてこの掲示板を利用させていただくものですが、 質問させて頂いてよろしいでしょうか。 #include <stdio.h> void main() { int A=1,B=2,C=3;int big1=0,big2=0; if(A>big1>big2){big1=A;}//1>0>0 if(B>big1>big2){big1=B;}//2>1>0 if(C>big1>big2){big1=C;}//3>2>0 //big1=3 big2=0 if(big1>A>big2){big2=A;}//3>1>0 big2=1 if(big1>B>big2){big2=B;}//3>2>1 big2=2 if(big1>C>big2){big2=C;}//3>3>2 big2=2 printf("一番大きい数:%d 二番目に大きい数:%d",big1,big2); } この文はA、B、Cの内から一番大きい数と二番目に大きい数をプログラムが 判断して結果を出力するというプログラムです。 本来なら実行結果は(一番大きい数:3 二番目に大きい数:2)となるはずなのに borlandやvisualC++コンパイラでは(一番大きい数:3 二番目に大きい数:1)と 出力します。これは私の書いたプログラムが悪いのでしょうか。 それとももしかして考えたくはありませんがCのバグなのでしょうか。 真剣に悩んでます。ご指南よろしくお願い致します。
条件式の書き方の問題 A > big1 > big2 とは書けない A > big1 && big1 > big2 と書かないといけない 以下同
79 :
デフォルトの名無しさん :04/11/01 11:51:07
>>77やっぱりそうでしたか。ありがとうございます。 >>78あ、そうだったんですか。今まで知りませんでした。 こんなくだらない質問にお答えくださって本当に感謝します。 ありがとうございました。
特定の文字を区切り文字として、for文で順番に文字列が取り出せる ように分割してくれる関数は、どんなものがありますか?
strtok
83 :
デフォルトの名無しさん :04/11/01 14:55:21
コンパイルしたら こんなエラーがでてしまい、コンパイルが通りません。 cc -g test.o -o test /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In function `_start': ../sysdeps/i386/elf/start.S:77: undefined reference to `main' collect2: ld はステータス 1 で終了しました make: *** [test] エラー 1 どなたかご教授お願いいたします。
>undefined reference to `main' mainが無い
>>83 最低限 main() が必要だって理解できてなくて、
自分がコンパイルではなくリンクしていることも解ってなくて、
エラーメッセージの英文も読めなくて、
トドメに日本語まで間違うって…
2chの質問者に何も期待してはいけないであーーる
「:」で区切られたデータを scanf で受け取るにはどうしたら良いでしょうか? 例えば、 char s[ 128 ]; int n; scanf( ???, s, &n ); で PM:7 と入力したとき、s に"PM", n に 7 が入るようにしたいんですが…
へたれ
89 :
デフォルトの名無しさん :04/11/01 21:00:42
90 :
デフォルトの名無しさん :04/11/01 23:57:48
ちょっとお聞きしたいのですが、C言語の既存の 関数からで.midiの再生って可能ですか? .wavの再生にはPlaySound関数を使ってるのですがwavはファイルサイズ が大きすぎて人に渡すプログラムを作るときに困ってしまいます。 もし再生する方法をどなたかご存じでしたらお願いします。
>>90 windowsサウンドプログラミングという書籍を買ってください。
そして、PlaySoundはC言語の既存の関数ではありません。
MidiはPlaySoundのようにファイル名を指定しただけで再生する
Win32APIはありません。
91>>頭悪そうな発言スレを勧められるとは・・・ とりあえずサンクス
94 :
デフォルトの名無しさん :04/11/02 00:25:11
92>>そうなんですか。ってことはデバイスをオープンとか 何とかとか長く書くような真似をしないと駄目なんですね・・。 今度書店で見つけたら買ってみます。ありがとうございました。
95 :
デフォルトの名無しさん :04/11/02 00:43:08
fopenでNULLが返ってきた時に 何故ファイルが開けなかったか知るにはどうしたらいいですか?
strerror
MCI関連でなかったっけ>midi
>>100 そのスレは94の質問内容のようなスレではない
>>89 ありがとうございます
しかし二回以上連続で scanf した時に、s の先頭に改行が入ってしまうのですが…
これは未定義ながら fflush( stdin ) するしかないのでしょうか…?
* というのがあったので "%[^:]:%lu%*c" として最後の改行を読み飛ばすようにしたらうまくいきました。 ありがとうございました
>>103 そうまでして scanf() 系を使わないといけない理由が知りたい。
Visual C++.netを使用して、 VisualC++プロジェクト→.NET→コンソールアプリケーション で下記を作成し、ウォッチで"tmp->c"を参照しても、2次元配列 の中身が参照できません。 #include "stdafx.h" #using <mscorlib.dll> using namespace System; typedef struct{ int a; int b; int c[5][2]; }AAA; AAA aaa; int _tmain() { AAA *tmp; tmp = &aaa; return 0; } VisualC++プロジェクト→Win32→Win32コンソールプロジェクト で作成すると、参照できるのですが、.NETの方で参照できる 方法はあれば、教えて下さい。
つーかマルチ?
>>108 【初心者歓迎】C/C++室 Ver.11【環境依存OK】
に行ってみます。ありがとうございました。
110 :
いなむらきよし :04/11/02 22:05:34
奇形がやさしく答えるキケー!
111 :
デフォルトの名無しさん :04/11/02 22:11:29
void *GetPtr(void) { char c = 'a'; return &c; }
112 :
デフォルトの名無しさん :04/11/02 22:16:41
c++ の質問です。 CString *s[] = new CString[10]; delete[] s; // 質問:どうして delete s; では駄目なの?
>>112 CとC++の区別がつくようになってから来い
>>112 EffectiveC++ P.44参照
115 :
デフォルトの名無しさん :04/11/02 22:33:47
どうして BCD なんか使うのですか? わけわかんない。
『組込み開発者におくるMISRA-C―組込みプログラミングの高信頼化ガイド』 ↑を読んだ時の疑問なんですが、 i = 3; i = i++; この場合、 2行目の代入と増分の副作用完了点の順序が処理系依存になるので 最終的なiの値も処理系依存になるのは分かるんですけど、 i = 3; i = ++i; の場合がよく分かりません。 iの値の参照前に増分するので最終的なiは4でいいのかと思ったんですけど、 これも処理系依存になると上記の本では解説されてました。
愛がいつまでも続くと思うな
118 :
デフォルトの名無しさん :04/11/02 22:44:51
>>116 誤りですね。i = ++i; は大丈夫です。
119 :
デフォルトの名無しさん :04/11/02 22:49:58
char c[10] とか char c[128] とか。 なんでいつも適当な確保なのですか?
適当には二つの意味がある!
128が中途半端だと感じてるんだろ
>>119 貴方の質問から何を聞きたいのかを想像して答えますが、
例えば、cが入力用のバッファとして使われる場合、人が何文字入力するか、
なんていうことは予め判りませんよね。
だから、とりあえず入力される数としてあり得る範囲を確保し、
それ以上の要素を入力しても、配列に納める分以上は納めないようにする処理
を書いてあげないといけません。
例えば、フーリェ変換用のバッファとして使う場合などの特定用途では確保する
要素数は初めから判っているので、プログラム中で使われる配列の要素数が最小
になるように勤めるとより良いです。
123 :
デフォルトの名無しさん :04/11/02 23:06:16
いいえ、適当ではありません。 128には意味があります。
125 :
デフォルトの名無しさん :04/11/02 23:09:44
>>122 どうもありがとうございます。あまり確保しすぎてもいけないと
も聞いたのですですが、どのぐらいまでなら確保してもよいのですか?
>>123 例えば、フーリェ変換(計算機では普通FFT)だと2の倍数にしないとできません。
2の倍数というのはわりとよく出てきますよ。
友人に #define は問題があるから C では enum 使えと言われたのですが本当でしょうか…? 例えばこんな感じで ×#define 1 A ○enum { A = 1 };
わらた
- #define 1 A + #define A 1 お恥ずかしい…
>>118 やはり前置増分演算子の場合は問題ないんですね。
ありがとうございました。
>>127 defineはエラーがあってもコンパイル時にエラーとして検出できませんし、
フラグの値を設定したいときのような場合、値の数が極端に多いと、
ユニークな数を果して割り当てられたかどうかを確かめるのは困難です。
例えば、
#define PI 3.44
という定義があったとして、これを使ったコードにエラーがあったとき、
エラーメッセージにPIという文字は見ることができません。
3.44という良く解からない数字として表れるのです。
書いた人はたぶんπのつもりだったのでしょうが、あいにくπは3.14…です。
>>127 一般的にC++ではdefineはなるべく使うべきではありません。
幸運な事に、代わりに使える機能がいくつか用意されました。
Cでdefineとして書いていたものはtemplate、inline関数、const定数
として置き換え可能です。
enumはユニークな数を割り振りたいときや、const定数をクラス内部で初期値設定
できない時などに使うと良いでしょう。
定数を宣言するときは大抵const定数で良いでしょうね。
なるほどそういうことだったんですか。 ということは友人の主張は正しかったんですね。 分かりやすい説明ありがとうございました
>>134 #define と enum 比較するのに実数持ち出したり
C スレでいきなり C++ の話を始めたりするんだから
ネタでなけりゃ頭の不自由な人でしょ。
138 :
デフォルトの名無しさん :04/11/03 00:38:49
> 128には意味があります。 人間の遺伝子的には127歳まで生きるようにできてるんだよね。 仕様では。
>>137 >>133 ではenumという言葉は一切使わず、
>>135 の最後でenumを持ち出しています。
>>127 への返答としては少し不備があった事は確かだと思います。
>>136 に誤解が無いように追記しますが、enumは整数しか扱うことができません。
140 :
デフォルトの名無しさん :04/11/03 00:47:15
> あいにくπは3.14…です。 いいえ3です。
141 :
デフォルトの名無しさん :04/11/03 00:48:16
enumで定義した数だけループしたいんですがどうすればいいですか? sizeofは使えないんですか?
142 :
デフォルトの名無しさん :04/11/03 00:50:51
> defineはエラーがあってもコンパイル時にエラーとして検出できませんし、 enumもたいがいのコンパイラーでエラーや警告でませんよ。 enumで定義した値以外を代入したり、 ちがうenumで定義した値を代入してもエラーや警告でない(gccあたりでためしてみて!) そうするとdefineとたいしてちがいないのよね。 せいぜい(重複した値がないようにできるぐらいの利点しかない。
>>141 Cだからこそ、私はこんな感じで。
typedef enum {Foo1st, Foo2nd, Foo3rd, NofFoo} Foo_t;
for (i = 0; i < NofFoo; ++i) ;
144 :
デフォルトの名無しさん :04/11/03 00:57:13
たんに「いちばんうしろ」にあるだけですよね? なんかそれっていやですよね。
>>142 他人の書いたインクルードファイルでシンボルが衝突した場合に発見が早い。
#まさか/usr/includeの下のインクルードファイルで名前が競合するとは思わなかったぞ。>Sun
128が中途半端だという疑問に対し、純粋な答えが2の倍数 それをまったく関連性のない、かつ限定的な話のフーリエ変換持ってきたりして、意味不明 enumとdefineの話だって #define PI 3.44と記述ミスしてる時点で、 enumにしようが数値の記述ミスしたら計算結果は変わる 結局、どれも問いに対する答えになってないんだよね
大学でプログラミングの授業落としてしまって、教授に「どうせテスト範囲の部分を理解か暗記しただけにすぎないんだろう。 それじゃいつまでたってもだめだよ。勉強法を変えろ!」と言われました。まぁ図星だったんですが、 C言語の勉強法ってなんですか?意味がわかりません。 あと、おすすめのC言語の参考書を教えて下さい。
で、また1から丸投げ、と。
ぶるん、ぶるん、ぶるるるるん、 ふふふふーーーーぶるるるるるーーーーーー おっぱい
>>147 漏れは大学にはいってからプログラミング勉強しはじめたけど、
95点未満はとったことないな。
> C言語の勉強法ってなんですか?意味がわかりません。
とりあえずソースコードを打ちまくったらどうだろう?
漏れははじめのころはそんな感じだった。
たくさん打ち込んでいくうちのソースの内容が分かるようになっていった。
> あと、おすすめのC言語の参考書を教えて下さい。
んなもん人にきくものでは無いと思う。
実際に読んでみて自分に合う物を使えばいいわけだし。
本に頼らずともプログラミング入門系のWebページも数多くあるし。
漏れはC言語に関しては大学で教科書に使った本とWebだけかなぁ。
enum が長くなって歩食う数行に渡るときはマクロのときみたいに enum { A, B, C /* ... */,\ X, Y, Z }; って \ を行末に付けなきゃダメですか?
エラーが起きたらダメ。
153 :
デフォルトの名無しさん :04/11/03 10:15:25
> あと、おすすめのC言語の参考書を教えて下さい。 日下部先生の「作ってわかるCプログラミング」がいいよん。 > 漏れは大学にはいってからプログラミング勉強しはじめたけど 大学でプログラムつくりかたおしえるようなところはかなりダメ。 講義ではもっとメタな概念を教え、プログラミングは自分で勝手に覚えるのが大学生。 そんな技巧を直接教えるのは専門学校や工業高校の仕事だ。
154 :
デフォルトの名無しさん :04/11/03 10:18:04
>>151 だめかどうかはやってみれば分かるだろ。
そーいえば、行末の¥なんて使ったことないや・・・。
はいはいそうですね。
// enum キーワードの例 enum Days// enum による Days 型定義 { saturday,// デフォルトで saturday = 0 sunday = 0, // 同様に sunday = 0 monday, // monday = 1 tuesday, // tuesday = 2 wednesday, // etc. thursday, friday } today; // today 変数は Days 型
158 :
デフォルトの名無しさん :04/11/03 10:49:16
土曜日からはじめるのがぼけ
160 :
デフォルトの名無しさん :04/11/03 11:01:08
enum { dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi};
誰一人として某ageにしましまでワラタ
Vous voyez?
enum dia { domingo, //ドミンゴ lunes, //ルネス martes, //マルテス miercoles, //ミエルコレス jueves, //フエベス viernes, //ビエルネス sabado, //サバド };
164 :
デフォルトの名無しさん :04/11/03 13:57:46
>>157 Days型ではなくenum Days型
#include<stdio.h>/*Gauss消去法*/ #define NUMBER 9 int main(void) { int i,j,k,l; double a[][NUMBER+1]={ {5, 1, 3, 4, 0, 0, 0, 0, 0, 0},{1, 6,-5, 8,-2, 0, 0, 0, 0, 0},{3,-5, 2, 4, 6, 8, 0 ,0, 0, 0},{4, 8, 4,-4, 5, 1, 3, 0, 0, 0},{0,-2, 6, 5, 8, 3, 9, 5, 0, 0},{0, 0, 8, 1, 3, 3, 6,-6, 1, 0}, {0, 0, 0, 3, 9, 6, 9, 0, 5, 2},{0, 0, 0, 0, 5,-6, 0,-5, 4,-7},{0, 0, 0, 0, 0, 1, 5, 4, 4, 7},{0, 0, 0, 0, 0, 0, 2,-7, 7,-2}, }; double f[]={5,9,4,-2,8,6,7,3,-12}; double u[NUMBER+1]={0}; /*前進消去*/ for(i=0;i<=NUMBER-1;i++){ for (j=i+1;j<=NUMBER;j++){ f[j]-=(a[j][i]/a[i][i])*f[i]; for(k=1;k<=NUMBER;k++){ a[j][k]-=(a[j][i]/a[i][i])*a[i][k]; } } } u[NUMBER]=f[NUMBER]/a[NUMBER][NUMBER]; /*後退代入*/ for(l=NUMBER-1;l>=0;l--){ for(j=l+1;j<=NUMBER;j++){ f[l]-=a[l][j]*f[j]; } u[l]=f[l]/a[l][l]; } for(i=0;i<NUMBER;i++){ printf("u[%2d] = %.2E \n",i+1,u[i]); } return(0);}
正しい答えが出ません。なにがいけないのかよく考えても分かりません もしよかったらドコがいけないのか教えてください
167 :
デフォルトの名無しさん :04/11/03 18:14:14
分かりません。
>>165 >double f[]={5,9,4,-2,8,6,7,3,-12};
9個しかない。
>>168 ありがとう
それでも答えがおかしいです・・・
君はデバッグというものを知らないのか? 問題のある場所がわからないのであれば一行一行数値を調べりゃ済むだろ? ましてやこんな小規模なプログラム、大して労力も掛からんだろうに
171 :
デフォルトの名無しさん :04/11/03 19:10:53
わかりません。
>>165 配列の添え字のつけ方を理解していない問題と、
Gaussの消去法の方法そのものを理解していない
問題の2つの問題があるのでがんばってください。
はい
テキストファイルが以下のようになっていたとして AAAA[BBBB]\t............\n AAAA[BBBB]\t............\n AAAA[BBBB]\t............\n .... AAAA はSJISの半角、全角の入り混じった文字列 [ はUnicode BBBB もAAAAと同様です .....は今回の処理では不要な部分です これを一行ずつ読み込んでAAAAの部分だけ抜き出したいのですが Unicodeの「[」の文字コードが0x005Bで、 例えばSJISの「ー」なんかは0x815Bなので、行のはじめから1文字ずつチェックしていくと 「ー」の後半部分を「[」と判定してしまって「AAーA」という文字列を「AA・」と抜き出してしまいます。 2byte文字の後半部分が5Bというものが他にもあるのでif文で除外するのも手間がかかります。 なにか良い判定方法はないでしょうか? これでは失敗する例 if(strncmp(wtemp,"[",1 )==0 ){ ] 図示するとこんな感じ AAーA[BBBB] ↑ wtemp wtemp は char line[256]へのポインタ line[256]にはテキストファイルの一行が読み込まれます
>>174 先頭から(1バイト目か2バイト目かを意識しつつ)一文字ずつ処理する。
176 :
デフォルトの名無しさん :04/11/03 22:29:50
コード全体で wchar_t を使うようにしたいのですが、 main の第二引数がchar*argv[]でいちいち変換しないといけません。 wchar_t を受け取れる wmain って標準にあるんでしょうか? MSDN を見る限り MS の独自拡張っぽくて・・・。
177 :
デフォルトの名無しさん :04/11/03 22:30:45
ない
mainの入り口で全部変換すれば、それほど手間でもないんじゃないか?
やっぱり無いですか・・・。 全部変換することにします。
180 :
デフォルトの名無しさん :04/11/03 23:08:39
なぜか fnc-1 は通るのに、全く同じである fnc-2 は通りません。 adimに問題があるようですが、原因がわかりません。原因は何でしょうか? #include <stdio.h> #include <stdlib.h> int nm = 6; void fnc(double **adim, double *bdim) { int i; for(i=0; i<nm; ++i) {bdim[i] = 0;adim[i][i] = 0;}/* fnc-1 */ for(i=0; i<nm; ++i) {bdim[i] = 0;adim[i][i] = 0;}/* fnc-2 */ } int main(void) { double **adim, *bdim; int i; bdim = (double *)malloc(sizeof(double *) * (nm)); adim = (double **)malloc(sizeof(double *) * (nm)); for(i=0; i<=nm; i++) {adim[i] = (double *)malloc(sizeof(double) * (nm));} fnc(adim, bdim); return 0; }
>>180 寧ろ間違っているのはbdimの方。
sizeof(double) はsizeof(double *)よりも大きい実装なのだろう。
182 :
180 :04/11/03 23:35:11
>>181 見落としていました。これで問題が解決できそうです。
ありがとうございます。
>>182 老婆心ながら付け加えるけど、adimを埋めるには二重ループが必要なのは判っているよね?
>>183 for(i=0; i<nm; ++i) {for(j=0; j<nm; ++j) {
adim[i][j] = 0;
}}
ということですよね?こちらは大丈夫です。
いろいろありがとうございます。
>>175 できれば現在1バイト目なのか2バイト目なのかを判定する具体的な方法を
教えてくれると助かります。
>>185 1バイト処理するごとにカウントアップしていけばいいやん。
>>174 おまえらアフォか。
どう考えても「005B」の並びが現れるのは「[」のときだけだろ?
>>185 着目するバイトの一つ前のバイトが
・1バイト文字か2バイト文字の2バイト目ならばそのバイトは1バイト文字か2バイト文字の1バイト目。
・2バイト文字の1バイト目ならばそのバイトは恐らく2バイト文字の2バイト目。
189 :
デフォルトの名無しさん :04/11/04 02:56:03
質問です。 二次元配列の構造体って struct a{ … }bc[x][y]; じゃできないんですけど、どうしたらいいですか?
191 :
デフォルトの名無しさん :04/11/04 02:59:15
こっちじゃないのか〜!?
>>189 一次元配列の構造体ならそういう風に作れるんですか?
x, y が変数駄目なら定数にすればいい
>>174 >AAAA はSJISの半角、全角の入り混じった文字列
>[ はUnicode
なんつーバカなフォーマットなんだ、と思ったが
もしかして
AAAA\0[BBBB\0]\t............\n
なんじゃないの?
>>195 AAAA,BBBB を書き込むときに間違って後ろの\0 まで一緒に書き込んだのかw
それなら、こうなってるんじゃないかな AAAA\0[BBBB\0]\t............\0\n
セパレータがNULな通信フォーマットとか。
一次元配列ならこれでできるけど struct a{ … }bc[x]; 二次元配列ならこれで、全体定義にならないんだよね。 C言語だよ
#include<stdio.h> #include<string.h> main() { char a[10],b[10]; char *p; int i,j; strcpy(a,"Program"); p=a; for(i=0;*(p+i-1)='\0';i++){ for(j=9;j=0;j--){ b[j]=*(p+i); } } b[10]='\0'; printf("%s\n",sakasama); } このプログラムを動かしても文字化けして読めないんですが何処が間違っているんでしょうか aの文字列を一度ポインタに入れて、それを逆に読むようにしてbに入れるプログラムなんですが・・・
>200 二重のforループで何がしたいのか分からない。 >for(i=0;*(p+i-1)='\0';i++){ 一番最初のループで、*(p - 1)とアクセスすることになるけど、それは良いこと? >b[10]='\0'; char b[10]と宣言しているのに、b[10]を書き換えても大丈夫? それに、'\0'は文字列の終端を示すコードだけど、 配列の終端を示すコードじゃないよね?
struct a{ … }(*bc)[x];
#include<stdio.h> #include<string.h> main() { char a[10],b[10]; char *p; int i; strcpy(a,"Program"); p=a; for(i=0;i<=9;i++){ b[9-i]=*(p+i); } printf("%s\n", b); }
なんか色々ミスってるし・・・ b[10]云々は消したはずなのに、一部残ってたみたいです 最後のprintf〜の最後のsakasamaはbです >201 ループにポインタ入れるとマズイですかね? >203 それ試してみましたが何も表示されませんでした
もういい、もうわかったから初心者スレに行こうな、な?
首吊って勉強し直して来ますorz
>180 よう,son of Bush,まだ見てるか? 漏れは main() 内で fnc() を呼び出す直前の,このクソも気になる。 > adim = (double **)malloc(sizeof(double *) * (nm)); > for(i=0; i<=nm; i++) {adim[i] = (double *)malloc(sizeof(double) * (nm));} for の中で adim[nm] にもアクセスしようとしている。これはマズそうだ。
AAAA[BBBB]であっているとおもいます。 元々がEUCのファイルだったのですが、windowsに移し変えたときにSJISに変換して処理していました。 なのでEUCにもどしてからAAAAをぬきだして、SJISにすることにしたら、とりあえずうまくいきました。 どのみち2byteに統一するフォーマットじゃないのはバカだなといった感じですね。 ちなみに、これはお金を払って利用できるとある単語辞書です。
>>210 SJISの1byte判定コード、ありがとうございます。
問題は解決してしまいましたが、覚えておく必要があるものなので助かりました。
>>209 元のフォーマットがバカなんじゃなくて
お前の変換がバカだったんじゃないのか?
>>213 最後のprintfの前にb[len] = '\0';を書いてみろ。
>>212 フォーマットをあらかじめ2byteで統一する配慮と、
文字コードの変換の失敗は関係ないと思いますがどうなんでしょう。
ちなみにEUC→SJISはフリーソフトを使わせていただきました。
たびたび湧いてすいません、ななしにもどります。
C言語、Java、Linuxなどのおすすめの参考書を教えて下さい。 そんなスレなかったっけ?参考書まとめサイトとか
君はまず検索という高等テクニックを身に付けよう
黙れ
検索しても見つけきれなかった・・
それぐらい検索できない奴にプログラムをする将来はない。 それを習得すれば道は開けるだろう。
220は漫画読みすぎだなw きにしないでいーよ
本音半分冗談半分だ
223 :
デフォルトの名無しさん :04/11/05 00:55:12
質問です。 typedef struct tag_foo { struct tag_foo *prev; struct FOO *next; } FOO; も typedef struct { struct tag_bar *prev; struct BAR *next; } BAR; もエラーにならないんですが、このコンパイラーは壊れているのでしょうか? 文法的には正しい? C89の場合とC99の場合で教えてください。 あ、もちろん、 typedef struct { struct tag_biz *prev; BIZ *next; } BIZ; は、ちゃんとエラーになってくれます。
226 :
デフォルトの名無しさん :04/11/05 01:21:20
C89のときもただしかったのー? struct struct ...ってことだよね?
int main(void) { char s1[9], s2[9]; fgets(s1, sizeof s1, stdin); fgets(s2, sizeof s2, stdin); return 0; } これで 8byte 入力すると 2 回目の fgets() をスルーしちゃうんですけど 何故なんでしょう 9byte でスルーするなら なんとなく分かるんですけど
>>227 >これで 8byte 入力すると
8byte = 改行を入れて 9byte 入れているつもりです
たとえば 10101010 とか
\0だろ・・・
改行、\0を含めて9byteまでです。
>>226 structのキーワードがついたポインタ型は、不完全型といって、
デリファレンスさえしなければどこでも使えます。
"10101010\n\0" で 10byte になっているってコトですか? gets() と違うのか…
233 :
デフォルトの名無しさん :04/11/05 02:59:12
C言語初心者です 文字列の配列として char mona[20] = "abc def gh";があるとして " "(つまり空白)ごとにそれぞれ別の空の3つの配列に入れなおしたいのですが、どのようにすればいいのでしょうか? 空白までの長さが常に一定なら楽ですが、例えば"giko u koko"のように色々な場合があるとします 自分の考えだと、for文を使って一つずつ配列を入れなおしていき、もし" "が出たら云々のようにしたいとは思ったのですが 未熟なプログラム技術ではうまくいきません・・・ どなたかアドバイスお願いします
>>233 int i;
char *giko[3];
size_t len = strlen(mona);
for (i = 0; i < sizeof(giko) / sizeof(*giko); ++i) {
giko[i] = malloc(len);
}
sscanf(mona, "%s%s%s", giko[0], giko[1], giko[2]);
for (i = 0; i < sizeof(giko) / sizeof(*giko); ++i) {
printf("%s\n", giko[i]);
free(giko[i]);
}
>>234 あ、ありがとうございます
実行したらできたけど、内容はいまいちわかってないので解読していこうと思います
#include <string.h> #include <stdio.h> int main(void) { char mona[20] = "abc def gh"; char *monaWord; monaWord = strtok(mona, " "); puts(monaWord); while (1) { monaWord = strtok(NULL, " "); if (monaWord == NULL) { break; } else { puts(monaWord); } } return 0; } こんなのでもどうでしょう? なんかミスがあったら教えてください
あ、別の空の3つの配列に入れなおすんですね。 ちょっと題意がずれちゃってますが、「strtokはいかがですか?」ってのが言いたかったことなんで、 ご勘弁を(汗
strtok はタコ過ぎるからなあ
↑strtok がタコなのではなく、使い方がタコなだけだろ。 ちゃんと man に、静的領域を使用する事が明記されてるんだから。 ある所には strtok_r だって有るし... でもJM見てたら「絶対に使用しないこと」とか書いてるな。
241 :
デフォルトの名無しさん :04/11/05 08:10:16
> structのキーワードがついたポインタ型は、不完全型といって、 > デリファレンスさえしなければどこでも使えます。 いや、参照もしちゃってるんですよ。なぜエラーにならない?
>>241 構造体内に限らないが、
struct Unknown_Tag *hoge1;
struct Unknown_Tag hoge2;
前者はOK。後者はNG。
243 :
デフォルトの名無しさん :04/11/05 08:29:35
そんなことは当然わかっているのですが、 hoge1というメンバーに代入しているところでもエラーがでないことがどうしても理解できないのですが。 なぜでしょう?
代入なんかしてねーじゃん
だから、「dereferenceしない限り」と書いてあるじゃん。
くだらん質問のくせに随分と態度が不遜じゃん
247 :
デフォルトの名無しさん :04/11/05 08:56:21
ミニにタコ
>>236 一応書いておくと、静的領域に書き込もうとしているからダメダメ。
まさしく使い方が蛸。
どこがだよ。目ついてんのか?
250 :
コピペ推奨 :04/11/05 10:15:47
┗┳┳━ |_| ━━━┳┳┛ ┃┃ / ヽ ┃┃ もういくつ寝ると 出て行くの ┏┻┻ |======| ━━┻┻┓ ┗┳┳ ヽ__ ¶_ ノ ━━┳┳┛ 朝鮮人は ウソついて ┃┃ (/) ┃┃ ┃┃ (/) ┃┃ 日本に居座り たかります 凸┃┃ (/) ┃┃凸 Ш┃┃ (/) ┃┃Ш 早く出て行け 朝鮮人♪ .|| ┃┃ (/) ┃┃.|| ∧_∧ (/) ∧_∧ ∧ ∧ ( ・∀・) (/)(´∀` ) <゜Д゜ > 元歌:童謡「お正月」 (つ つミ (/)(⊃⊂ ) ⊂ ⊃ |_|_|_I(/)_|_|_|__| | /////ノ,,,,,,ヽ ////|| |〜 //////////// |∪∪ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | 奉 納 |
251 :
コピペ推奨 :04/11/05 10:23:12
252 :
デフォルトの名無しさん :04/11/05 12:38:58
int* num; num = malloc(sizeof(int)); *num = 100; のように動的なメモリ確保してそこへ値を代入したり するときがあると思いますがどういったときに有効な手段 なのでしょうか?私は基本的にint iなどのような 使い方しかしたこと&その程度のプログラムしか打ったこと がないのですが動的なメモリ確保+代入、参照はどういった 場面に有効で、どういった場面に不向きなのでしょうか? よろしければご教授よろしくお願い致します。
>>252 最小単位の組み込み型 (char, int, floatなど)の
変数1つを動的確保するような状況はほとんど無い。
配列もしくは構造体/クラスなどの単位で
動的確保した時に有効な使い方が出来る。
詳細は↓に誰か書いてくれるでしょう^^
リストとかツリーとかデータ構造について勉強するといいよ
255 :
デフォルトの名無しさん :04/11/05 13:16:11
数字が(小数点含む)一行書かれたファイル(ex 1.0 2.0 3.0 4.0 ・・・・)を 入力して二つずつ足した値をtxtファイルに出力するプログラム(ex 3.0 7.0 ・・・)を 作っているのですがうまくいきません。 ビルドまではうまくいきますが実行しようとするとアプリケーション エラーが出てしまいます。いったいどこがおかしいのかご教授ください 環境はOS;Win2000SP4 VC++6.0でコンパイルしました。 以下にソースを示します
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char *argv[]) { double in_buff; double ta ; double tb ; char filename[255]; FILE *stream; if(argc==1) { printf("設定ファイルが入力されていません\n"); return(1); } else { strcpy(filename,argv[1]); } if((stream = fopen("filename","r")) == NULL) printf("%sを開けませんでした。\n",filename); else printf("%sを開きました\n",filename); fscanf(stream, "%lf%lf", ta,tb); in_buff = ta + tb; fwrite(&in_buff, sizeof(int), 1, stream); fclose(stream); return 0; }
>>256 ソースを見ただけで実際に実行してはいないが、
怪しいところが2つ
・"%lf%lf"
・fwrite(&in_buff, sizeof(int), 1, stream);
読み込み・書き込みストリームが同じなのは
仕様ですか?
>256 fopen()の第一引数見てみ
fscanfが原因
fscanf(stream, "%lf%lf", &ta, &tb);
fopen失敗したら終了しとけよ
>ビルドまではうまくいきますが実行しようとするとアプリケーションエラーが出てしまいます。 本当にビルド出来たんだろうか?警告無視してっていう意味だろうか?
265 :
デフォルトの名無しさん :04/11/05 16:42:22
コンパイラによってはって、「VC++6.0でコンパイルしました。」と書いてあるだろ。
#include <stdlib.h> #include <stdio.h> #include <time.h> void setData(int *p,int n); main() { int *s; int t,i; printf("数値入力\n"); scanf("%d",&t); setData(s,t); for(i=0;i<t;i++) printf("%d\t",*s++); } void setData(int *p,int n) { int i; srand((unsigned) time(NULL)); for(i=n;i>=1;i--) p[i]=rand()%100; } 数値入力しただけの配列に0〜99の乱数セットする関数だけど・・・ 強制終了してしまいまつint *s;を255個の配列にしたら別にOKなんでつ ポインタ使った方法で強制終了しない方法を・・・
mallocすればいいじゃないの
あるファイルにbuf[4][128]というstaticの配列があり、これを別の ファイルで使いたいのですが、このアドレスを関数で取得するに はどう書けばよいのでしょうか?とりあえずこうしてみたのですが 駄目でした。 char** getBuf(void) { return (char**)buf; } int main(void) { char **ptr; ptr = getBuf(); ptr[3][100]=100; }
>>268 #include
すれば普通に使えない?
>>269 え、staticなので使えないですよね?ヘッダにbuf[4][128]を書くと
単にbuf配列が2つできるだけですし…
bufがグローバルならstaticの意味ないし、ローカルならポインタ返せばいいんじゃね?
(;´Д`) 違うみたい・・・・なんでだろ・・・表示した瞬間に落ちる・・・
>bufがグローバルならstaticの意味ないし
bufはstaticです。
>ローカルならポインタ返せばいいんじゃね?
それが
>>268 なのですが…
#include <stdlib.h> #include <stdio.h> #include <time.h> void setData(int *p,int n); main() { int *s; int t,i; printf("数値入力\n"); scanf("%d",&t); s = (int *)malloc(sizeof(int) * t); setData(s,t); for(i=0;i<t;i++) printf("%d\t",*s++); return 0; } void setData(int *p,int n) { int i; srand((unsigned) time(NULL)); for(i=0; i <= n; i ++) p[i]=rand()%100; } どうだろ。
ちなみに
>>268 はコンパイルはとおりますが、実行時にメモリアクセス
違反で落ちます。
開発自体はC++で行っているのが何か関係あるのかな…
は?
char** と char[][]は互換じゃないっしょ
static外せば?意味ないよ
>>277 なぜでしょう?配列を宣言しているソースの中では普通に
書き換えてますが…
>char** と char[][]は互換じゃないっしょ はい、それが原因だと思うので、これを char** getBuf(void) どう書き直せばいいか教えてもらいたいのですが…
>>276 for(i=0; i <= n; i ++)
275>> 感謝!できますた。 ちょっと質問でつが、やっぱりポインタ使う時はmallocつかってメモリ確保しなきゃだめでつか? C言語初めて間もないのでして・・・いままでmalloc使ったこと無かった・・・ORZ
>>284 mallocっつーかアドレス確保しる。
for(i=0; i <= n; i ++) じゃなくて for(i=0; i < n; i ++) こうか
>>282 char (*getBuf(void))[128];
C++スレの方にも書き込んでまして、以下の返答をもらえました。
>char* ptr; を char (*ptr)[128];に替えればいいだろ。
たぶん
>>287 さんも同じことを指摘してもらっていると思いますが
とりあえずこれで解決できそうです。有難うございました。
>static外せば?意味ないよ
文法の問題なのでCスレでよいと思って質問したのですが、実際
にはC++で開発してまして、static変数ではなくprivate変数なので
外せないのです。
マルチの上にスレ違いかよ・・・
漏れはC++はよく知らんのだが、private変数のポインタを外部に渡して 外から書き換えるっつうのは、法律的にも倫理的にも許される事なのか?
>>284 ふむ・・・やっぱり仕様でつか?
今まで使ったことなかったので・・・(;´Д`)
>>289 C++のスレのアドバイスはおかしい。
そのやり方だと
char[4][128]をchar **にキャストして
char **を char (*)[128] にキャストするんだぞ
型がわかってないやつがキャストしまくって
誤魔化す最悪のコード
>>291 設計がウンコーとしか言いようがないよね
>マルチの上に
マルチは申し訳ないです。
>スレ違いかよ・・・
一応、C/C++に共通する文法なのでスレ違いではないと
思ってますが…
>>293 さん
良かったら正しいソースを書いて教えてもらえませんか?
>>291 private どころか static らしいよ。
>>293 ん?
char buf[4][128];
char (*getBuf(void))[128] {
return buf;
}
なら
char (*ptr)[128] = getBuf();
で問題ないわけだが。
>char (*ptr)[128] = getBuf(); >で問題ないわけだが。 はい、C++の方のアドバイスを元に今はそうしてます。これです。 char* getBuf(void){ return (char*)buf; }; char (*ptr)[128] = getBuf(); これなら正しいんですか? >型がわかってないやつがキャストしまくって >誤魔化す最悪のコード これには当てはまって無いですか?
>>297 だからそれは正しくない。
>>296 のchar (*getBuf(void))[128]が正しい。
>>298 了解です。C++の方でも同様の答えをいただきました。
これで完全に解決しました。マルチに最後にまで付き合って
もらってすみません。勉強になりました。
>>297 なんつうか…もうアレだ、解らないなら
typedef char STRBUF[128];
しとけ。
static STRBUF buf[4];
STRBUF *getBuf(void) {
return buf;
}
:
:
STRBUF *ptr = getBuf();
すっきりしたろ?
301 :
デフォルトの名無しさん :04/11/05 21:53:01
linux上のgccから移植したプログラムをbcc32(無料版)でコンパイルしようと思っていますが、 gettimeofday()等が見当たらないのですがそういう物なのでしょうか? bcc32でミリ秒単位の時間を調べるには何を使用すれば良いのでしょうか?
char (*getBuf(void))[128]{ return buf; }; char (*ptr)[128] = getBuf();
よくアプリケーションの設定を 変数名 = 値 の形式でファイルに出力しているものがありますが fscafでファイルからデータを読み込んだ時 変数名の部分を文字列として変数にいれて その文字列の名前の変数に値を代入する なんてことができるのでしょうか? それとも変数名を出力しているのは判り易いようにしているだけで for分の中にswitchいれて順番に値を入れてるだけでしょうか?
Windowsだったらiniファイルだな。
>>304 > fscafでファイルからデータを読み込んだ時
> 変数名の部分を文字列として変数にいれて
> その文字列の名前の変数に値を代入する
> なんてことができるのでしょうか?
できない。
> それとも〜
WindowsならたぶんGet/SetPrivateProfileStringを使っている。
テキスト形式なので てっきり書式使ったCだと思ってました ありがとうございます
char *をkeyにするHashっていい田印ちゃうんか つーか連想配列
311 :
デフォルトの名無しさん :04/11/07 13:39:35
312 :
デフォルトの名無しさん :04/11/07 17:06:08
double tempk; double hikei,hihei; 〜略〜 scanf("%lf",&tempk); //気温入力 ←これを24回繰り返す hikei = hikei + tempk; //hikeiに 〜略〜 hihei = hikei / 24; //24で割る printf("%d日の平均気温は%4.1f度です\n",j,hihei); 〜略〜 これで平均がちゃんと数値出ないんだけどなんででしょうか
313 :
デフォルトの名無しさん :04/11/07 17:11:04
誤差のこと?
315 :
313 :04/11/07 17:14:19
そっちだな
略、の中で初期化はしてます。 すいません重要な部分略しちゃいました。 全部1を入力して結果1のはずなんですけど結果が違うんです
printf("%d日の平均気温は%4.1f度です\n",j,hihei); ここで四捨五入になっちゃってるんじゃない?
>>316 あーそれじゃ、略している中でぶち壊しているに一票。
>>312 これはうまく動いた。
#include <stdio.h>
#define N 24
int main()
{
int i;
double Sum = 0;
for (i = 0; i < N; i++)
{
double Temp = 0;
scanf("%lf", &Temp);
Sum += Temp;
}
printf("平均気温は%4.1f度です\n", Sum / N);
return 0;
}
#include <stdio.h> int main(){ double kion[23][30]; double saikou,saitei,goukei,tempk,heikin; double hikou,hitei,hikei,hihei; int j,h,n; goukei=0;heikin=0;hikou=0;hitei=0;hikei=0;hihei=0;tempk=0; for(j=1;j<=30;j++){ for(h=0;h <= 23;h++){ printf("%d日、%d時の気温を入力してください\n",j,h); scanf("%lf",&tempk); kion[h][j] = tempk; hikei = hikei + tempk; goukei += tempk; if(hitei == 0){hitei = tempk; }else{ if(tempk < hitei){hitei = tempk;} } if(tempk > hikou){hikou = tempk;} tempk = 0; } hihei = hikei / 24; printf("%d日の平均気温は%4.1f度です\n",j,hihei); printf("%d日の最低気温は%4.1f度です\n",j,hitei); printf("%d日の最高気温は%4.1f度です\n",j,hikou); 〜以下略〜 こんな感じです。 6桁くらいにしてみたところ 上二つのループの中で何故か合計が2になってるみたいです。 何度もスイマセン。
>>double kion[23][30]; 関係なさそうだけど
あるだろ
>>320 いろんなところにprintf入れて
tempkの値は正しいものが入ってるのか、
hikeiとかhiteiとかは正しい値になっているのかなどを出力しとけ。
double kion[24][30];にすべきだね。 やっぱり配列の範囲外に書き込むことでぶち壊してたと。
>>324 それでも壊れるよ
for(j=1;j<=30;j++){
double kion[24][30];にして>#define N 24使ったら正常に動きました。ありがとうございました。
327 :
デフォルトの名無しさん :04/11/07 21:06:49
開いたファイルがバイナリかテキストかはどうやって調べれば良いんでしょうか?
調べようがない。コンピュータにとってはテキストもバイナリに過ぎない。 割り当てのない文字コードを探してもいいかもしれないが、その場しのぎの 環境依存コードにしかならない。
>>327 fopenした時にどっちにしたかを自前で覚えてろ。
>>329 それは環境依存のバイナリモード、テキストモードの話だね?
331 :
デフォルトの名無しさん :04/11/07 21:13:44
>>329 回答を質問より先に読んだのに、質問を完璧に予測できた
>>328-329 qkccという文字コードと改行コードを変換できるプログラムがあるのですが、
ワイルドカードで指定したとき実行形式などのファイルにたいしては、
おそらくバイナリファイルです。と表示されたのでどうやって判断してるのかと
思ったんです。
汎用的な方法は無いんですか。どうもです。
>>332 qkcのこと? それならソースが公開されてるんで読んでみては?
>>332 テキストファイルには有り得ないデータがあればバイナリファイル。
判定するときは、文字コードを意識しないとね。
336 :
sage :04/11/08 08:42:56
あるテキストファイルに 3+4*12 とかいてある時、そのテキストファイルを読みこんで、 式の答えをその式の次の行に追加するにはどうしたらいいのでしょうか? 参考書をみてもファイルの読み込みから、さらに計算までの方法がのってなくて、 わかりませんでした。 助言おねがいします。
宿題丸投げクズは放置
>>336 「再帰下降」もしくは「再帰下向き」でぐぐるべし。
他の宿題スレでも、これ以上の回答は得られないものと考えるべし。
だれかがbisonを懇切丁寧に教えてくれるかもよープゲラ
/* 多くは語るまい */ char buf[1000]; char cmd[1100]; FILE * fp = fopen("aru.txt", "r"); fgets(buf, sizeof(buf), fp); sprintf(cmd, "awk 'BEGIN {print %s}' /dev/null >> aru.txt", buf); system(cmd);
341 :
デフォルトの名無しさん :04/11/08 09:47:25
>>336 #!/bin/bash
for aa in `cat text`; do
echo $aa;
echo $(($aa));
done;
げ、fclose()忘れてやんの。
343 :
デフォルトの名無しさん :04/11/08 12:48:22
まだCを勉強し始めてから間もない者です。 「20個の数字を入力して最大値、最小値を求めよ」という問題に対して、以下のようなプログラミングをしてみました。 一応コンパイルして、実行してみるとちゃんと動くのですが、いまいちエレガントさに欠けるような気がするので助言を お願いします。 #include<stdio.h> int main(void){ int i, max = -32768, min = 32768, a; printf("20個の数字を入力して下さい\n"); for (i = 0; i < 20; i++){ scanf("%d", &a); printf("%d個目の数字は%d\n", i + 1, a); if(max <= a){ max = a; } if(min >= a){ min = a; } } printf("\n最大値:%d\n最小値:%d\n", max, min); return; }
344 :
デフォルトの名無しさん :04/11/08 13:02:01
>>343 #include<stdio.h>
int main(void)
{
int i, max, min, a;
printf("20個の数字を入力して下さい\n");
for (i = 1; i <= 20; i++){
scanf("%d", &a);
printf("%d個目の数字は%d\n", i, a);
if(i==1){
max=min=a;
continue;
}
if(max < a){
max = a;
}
if(min > a){
min = a;
}
}
printf("\n最大値:%d\n最小値:%d\n", max, min);
return 0;
}
if(i == 0){ max = min = a; }else if(max < a){ max = a; }else if(min > a){ min = a; }
プログラムの勉強初めて1週間も経たない者ですが。ビィジュアルC++6.0でプログラムの勉強したいと思い。 押入れから2年前ぐらいに買ったビィジュアルC++6.0(その時は3日もせずに押入れ行き)引っ張り出してCの勉強はじめテルですけど、今の所 全然 意味が分かりません。勉強してれば分かるようになるんでしょうか?今24歳無職です。大丈夫でしょうか?
| J でつ
>>348 林ハルヒコの新ビィズュアルC++6.0入門ビギナー編と新C言語入門ビギナー編(←これは3年前にブクオフで400円で購入)のうちC言語のほうを読んでいます。
ビィジュアルC++6.0で実行しようとすると#include<sudio.h>の部分がエラーになります。何ででしょうか? #include<sudio.h> double wa(double x, double y); main() { double a,b,sum; a=11.11; b=22.22; sum=wa(a,b); printf("a=%f b=%f sum=%f\n",a,b,sum); } double wa(double x, double y) { double z; z=x+y; return(z); }
>>350 そんなライブラリ無いよ。
多分書きたかったであろうは「stdio.h」
スタンダードIO(標準入出力)の意味だ覚えとけ
// studio.hと間違えている人は見るけれどsudioは始めてみたな。。。
みんな釣りか...
>>350 すいませんでした。ただの綴り間違えでしたか。
エラー表示をちゃんと読もうぜ。 なんのための表示なんだか・・・
355 :
デフォルトの名無しさん :04/11/08 13:59:04
>>344 >>345 ありがとうございます。
この場合は負の数を考えない事が多いので、0以上で考えればいいのですね。
>>355 違う。
一個目のデータを(仮の)最大値、最小値としている。
なお、>344は1オリジン、>345は0オリジンなことに注意。
357 :
343 :04/11/08 14:33:30
>>356 書き込んだ後に、自分の早とちりに気づきました・・・。
おっしゃるとおりです。
オリジンというのは、forの「0以上20未満」と「1以上20以下」の差のことですよね?
通りすがりからのレスですまん。 > オリジンというのは、forの「0以上20未満」と「1以上20以下」の差のことですよね? まあそういうことだ。 で、一般に「オリジン」と言ったら開始位置のことを指す。 普段数える時にゼロから始める奴はいないからプログラムの出力もそうしろ、 ってことだろう。 (配列だとかで0オリジンだからって出力も0にする必要は無い。ユーザーは何も知らないから混乱する)
房丸出しの質問ですいません。 (プログラム経験全くなし)いきなりVisual C++6.0に挑戦しても大丈夫ですか?
多少スレ違いの可能性があるかもしれないんだけど C言語のコンパイラって何使ってる? C言語勉強しようと思ってLSI C-86侵食版を使おうとしてるんだけど うまく作動しないorz ちなみに環境はwin MEです いい動作方法か コンパイラのオヌヌメあったら、教えてくだしあ 馬鹿でスマソ
>>361 主流プログラム】
VisualC++ UNIXOSはこれで書いてる。プログラム作り難い。ny作者がGUIに凝る為bcbに逃げた実績あり。
GUIをVBで内部をC++で書いてる人多いみたい。数多くの初心者を粉砕してきた。
VisualBasic 複雑なプログラムの開発できない。動作が重い。短時間でアプリを作れる。
JAVA オブジェクト指向でそれがまた難しいとか。JAVA仮想マシーンを間に挟むことで
全てのOSで実行できるのが売りだが、全てとはいかないとか。VBより軽く.netよりちと重い。
Delphi 中々高機能なアプリがVB並みに簡単に作れ実行速度もC++並み。資産を利用できないのが弱み。
ファイルサイズが大きめ。
BorandC++Builder C++並みに高機能な上VB並みに作りやすくアプリも軽い。資産を利用できる。
ファイルサイズが大きめ。けど人気は微妙。
【支流プログラム】
HSP 優しくて主に簡易的なゲームを作りに適している
ひまわり 日本語でプログラムを書ける
jscript vbscript javascript php perl 基本的にWeb系プログラム
【2chスレ数ランキング】(左から多い順)
C,C++系圧倒 JAVA系55スレ VB系38スレ HSP系37スレ delphi系35スレ BCB系11スレ ひまわり4スレ
【完成したプログラムの処理速度】(左から早い)
c,c++>>BCB>delphi>>>>>>>.net>>JAVA>>>>>VB>>…>>HSP
【完成したプログラムのファイルサイズ】
c,c++が小さくBCB,delphi系は大きくなる
あのな、ここはCのスレで、質問してるバカもCコンパイラを訊いてるだろ?
たくさんのレスありがd
とりあえず全くの初心者なんで
>>2 をみてみたんだけど何をつかっていいのやら全くわかりませんですたorz
c++のコンパイラってC言語でもコンパイルできるのかな??
ほんと馬鹿ですまん
なるほど!それじゃ、CコンパイラにこだわらずC++コンパイラでも試してみるよ ご迷惑おかけしますたm__m
C++よりもCの方が早いよー camlだったらCとC++の間くらいの早さだよー
LSI-C侵食版って…… まぁ、過去の遺物だが。
>>366 大抵のC++コンパイラは拡張子がcならCのソースコードとしてコンパイルする。
ところで少なくともLSI-Cを使えないのなら無料のコンパイラはどれも無理だな。
どれもインストールの方法は似たり寄ったりだし。
やっとコンパイル出来ますた! ちなみにBORLAND C++ でやりますた レスしてくれた方々dクス
strtok("", " "); と記述するとコンソールが落ちるんですがなぜでしょうか。
man strtok
× strtok("", " "); 〇 strtok("a", " ");
#include <string.h> char *strtok(char * restrict s1, const char * restrict s2); (ISO/IEC 9899:1999 7.21.5.8 The strtok function -1 Synopsis)とあり、 strtokはstrに対して内容の変更を行う。一方、 If the program attempts to modify such an array, the behavior is undefined. (ISO/IEC 9899:1999 6.4.5 String literals -6) とあるから、落ちたとしてもそれは不適切な動作とは言えない。
>>376 どもです。
まさかそんな仕様だったとは思いませんでした。
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003 をダウンロードしたいのですが、日本語ページはないのでしょうか?
DLするだけならすぐ分かるだろ。 クマー
「やさしいC」か「猫でもわかるC言語プログラミング」を買おうと思ってるのですが 読んだことのある方がいたら感想を聞かせてもらえませんか?
いいかげんスレ違いの話ばかりするのはやめようや
猫に人間の言葉が分かるか!!
nyaid nyain(nyaid){ nyaintf("にゃにゃぁ にゃぁにゃん\n"); }
>>384 分かるようだぞ。人間の言葉は。
ただしコンピュータ言語は絶対分からないはずだ。理由は覚える必要を
感じないから。
388 :
デフォルトの名無しさん :04/11/10 13:32:13
さがりすぎ
今手元にコンパイラが無いので、自分では確認できないんですが、質問いいでしょうか。 bool型を返す関数check_bool()というのがあるのですが、呼び出し側のほうで、 int ret = check_bool(value);と書かれてます。 自分のソースではないんですが、どうやらコンパイルも通っているそうで。 trueやfalseの場合、retには何が入ってくるんですか?
stdbool.h嫁
>>389 trueなら1、falseなら0。
コンパイルが通るのはshort→intと同じように、変換後の型の表現可能な値の範囲が変換前より大きくなる整数同士の型変換の扱いになるからだと思う。
strcmpでNULL文字かどうかの比較をしているんですが、 strcmp( var, "\0") strcmp( var, '\0') これって下が正しいんですよね。 文字列が""で、文字が''ですよね?
何がいいたいのか解らん 下ってコンパイル通らなそうなんだけど
strcmpは文字列比較だぞ。 「ですよね?」じゃなく、前提で勘違いしてる。
char hoge = '\0'; if( hoge == '\0' ) printf( "ぬるぽ!\n" ); else printf( "ガッ\n" ); ----------------------- ぬるぽ!
>>394 >>396 の言う通り、strcmpは文字列同士の比較なのでナル文字かどうかの比較にはstrcmp(var, "")か*var == '\0'
パソコン超初心者なんですが ライフゲームを 作っています。どうすれば完成させることが出来ますか? #include<stdio.h> main() { int a[20][30]; int b[20][30]; int i,j; int s,kaisu=0; char c; for(i = 0; i<20;i++) for(j=0;j<30;j++){ a[i][j]=0; b[i][j]=0; } b[5][7]=1; b[6][7]=1; b[7][7]=1; b[8][7]=1; b[6][8]=1; b[8][9]=1; b[11][14]=1; b[11][12]=1; b[11][13]=1; b[12][15]=1; b[15][20]=1; ↓下に
お邪魔しマース
printf("次?(単に Enter 終わりは e)\n"); scanf("%c",&c); while( (c=getchar() != 'e' ) ){ printf("次?(単に Enter 終わりは e)\n"); for(i=1;i<=20;i++){ for(j=1;j<=30;j++){ s=b[i-1][j-1]+b[i-1][j]+b[i+1][j]+b[i+1][j+1]+b[i][j-1]+b[i+1][j-1]+b[i][j+1]+b[i-1][j+1]; if(s==2) a[i][j]=a[i][j]; else if(s==3) a[i][j]=1; else a[i][j]=0; } } for(i=0;i<20;i++){ for(j=0;j<30;j++) if(a[i][j] ==0 ) printf("○"); else if(a[i][j] == 1) printf("●"); printf("\n"); } scanf("%c",&c); }}
もういいって。
すみませんでした。
406 :
デフォルトの名無しさん :04/11/10 21:24:17
CSVファイルの特定のフィールドに特定の文字列が含まれている 行を抽出する(要するにフィールドを意識したGREP)のに 一番速い方法はどんな感じでしょうか。
>>406 るby!!!!!!!!!!!!!!!!!!!!!!!!
408 :
デフォルトの名無しさん :04/11/10 21:41:06
質問です printfの中で""を表示したいのですがどうすればよいのでしょうか? 表示結果を "abc" と表示したいのですprintf(""""\n);では駄目みたいなのですが…
printf("\"abc\"\n");
410 :
408 :04/11/10 21:45:17
>409 ありがとうございました、無事できました!
>407 いや、Cで組むとしたら、の話です。
412 :
デフォルトの名無しさん :04/11/10 21:59:35
漸化式x[1]=0.1 x[n+1]=(x[n]+1)^(1/3)のn番目の値を出すプログラムを書きたいのですが 三乗根の書き方が分かりません、アドバイスお願いします
>>412 double cbrt(double)
ある処理のパフォーマンスをmsec単位で測定したいのですが、 どうすればよいでしょうか?
OSのサポートなしには不可能なので処理系依存。
>>411 grepのソースでも読めば? セル中に','が含まれていないことが保証できるならgrepでできることだし。
#例えば第3フィールドが123なら、system("/bin/grep '^[^,]*,[^,]*,123,' csv.txt");
418 :
デフォルトの名無しさん :04/11/10 23:24:31
>>406 使いにくいがregexはどう?
C++ならboostなんだろうけど
>417 grepは遅いのでダメです。
>420 いやいや、質問している間にだいぶ状況が 整理できたのでなんとかなりそうです。
>420 それ今まで出た中で一番遅い方法じゃねーの?
423 :
デフォルトの名無しさん :04/11/10 23:59:34
定本Cプログラマのためのアルゴリズムとデータ構造を読んだ人(じゃなくてもいいのですが) に質問なんですが、二分検索木の挿入や削除の所で、構造体へのポインタのポインタを、 わざわざ使う理由がわかりません。 ふつうに構造体のポインタで良いと思うのですが、どうなのでしょうか? 名著と言っている人もいますが、ちょっと読む気無くし中です……
printfが内部で持っているバッファサイズっていくつでしょうか。 8KB?あとこれって変更できますか?
>423 それで動いたのか?
>426 ウソつけ
429 :
デフォルトの名無しさん :04/11/11 00:24:06
質問ですが、 char *s;と、 char s[256]; では何が違うのですか?
typedef double Number; 中略 void moge(Nunber, void(*)(Number, Nunber[]); のvoid(*) の(*)って何を意味しているんですか?
C70
>428 8192バイト
>>432 どこで確認できるのでしょうか?変更する方法もお願いします。
435 :
デフォルトの名無しさん :04/11/11 00:31:52
436 :
デフォルトの名無しさん :04/11/11 00:32:44
>>425 手元にPCないので確認できないです。
ていうかこの本の例題、main関数ぐらい使ってくれよ〜
>434 つきあいきれんよ
>436 単にお前が初心者すぎて読みこなせないだけなんじゃないの?
>>437 8192バイトという数はどこでわかったんですか?
それだけでも教えてください。
char *s; ←これは宣言で char s[256]; ←これは定義ですよね?
>>442 どちらも宣言みたいですね。
宣言と定義がぐちゃぐちゃに・・_| ̄|○
配列の宣言「char a[6]」 ポインターの宣言「char *p」 だから合ってるんじゃないの。ぶっちゃけどうでもいいけど。
宣言⊃定義 なんだから合ってると言えば合ってるんだけどね。でもねえ…
あえて言っちゃうと規格がバカ! Cでは宣言文と定義文が分かれていないと初期のころから不思議がられていた。 で、上の「char a[6];」のみで「=」無しのやつなんかは、規格の6.9.2で、 仮定義(tentative definition)と、仮なんて無理やりな言葉で誤魔化した。 真の定義じゃないから、関数の外で「char a[6]; char a[6];」なんて複数仮定義してもOKだし、 もちろん、「extern char a[6]; static char a[6];」なんて仮定義しても警告すら出ん。 規格では「extern」は内部結合でもいいよと書かれているが、字面じゃ完璧エラーだろ。
extern int i3 = 3; という定義も規格上はOK
451 :
デフォルトの名無しさん :04/11/11 09:59:02
main() { int i[8][8]={1.....}; //中身は省略 A(); } みたいなプログラムでDLLでA()関数を呼び出してstatic int i[8][8]の 中から特定の数字を見つけてその値を返り値として戻したいのですが main()で宣言している変数をDLL側に渡す方法ってありますかね?
引数として渡す
>>449 >もちろん、「extern char a[6]; static char a[6];」なんて仮定義しても警告すら出ん。
>規格では「extern」は内部結合でもいいよと書かれているが、字面じゃ完璧エラーだろ。
お前はアフォか?
float data = 1.00825; tmpString.Format("%f",data); ここで、tmpStringに入る文字列は "1.008251"となるのですが。 これはどうしてでしょう。
似たような値だから気にするなって事で。
457 :
453 :04/11/11 11:40:21
>>456 警告なんて出る訳ないからアフォだと言ってるんだが
>>454 float data = 0.1;
で試してみ?
ツッコミどころが微妙でワロタ
460 :
デフォルトの名無しさん :04/11/11 12:47:18
入力した文字列データを2次元配列に格納したあと、 逆順に表示するプログラムの表示。 ただし、一文字目に'@'が入力されるとデータ入力を終わる。 データ数は最大20個、また一つの文字列データの 最大長は半角10文字 実行例 word=sekiyu word=yasai word=denwa word=@ denwa yasai sekiyu
>>460 プログラムの表示とはバイナリですか?
それともソースファイルを表示するのでしょうか?
462 :
デフォルトの名無しさん :04/11/11 12:52:33
>>463 その類の反応も見飽きた。
飽きた飽きた飽きた飽きたぁぁああぁあぁうぇww
>>458 0.100000
となりますが・・・
あと、例では単に data変数に測値を入れてますが、
実際にはある演算の結果が 1.00825(デバッガ上で確認)となり、
これをFormat関数に渡すと誤差を含んだ文字列が帰ってきてる
ようです。
うーむ。
測地→即値 です
>>454 float data = 0.1;
tmpString.Format("%.18f",data);
>>465 デバッガ上で確認した数値が誤差を含んでいない保証はない。
>>465 1. 1.00825 なんて数は、2進数では表現できない。
2. デバッガでは有効桁数6桁で表示しているが、
Format (つかコレ C じゃねぇだろ) では 7桁表示。
472 :
423 :04/11/11 19:06:04
423なのですが、この本を読み返しているうちにだんだんわかってきました。 構造体↓ NODE **p; を宣言して *p として使ったときと、 NODE *p; を宣言して p として使ったときでは、指しているものが違うことに気がつきました。 何か違っていることを言っているようでしたら、訂正お願いします。
AIXでC言語による開発をしています。 アーカイブでextern宣言した配列に値を設定しておき、 呼び出し元でその配列を参照することはできますでしょうか?
>>472 NODE n;
NODE *p1;
NODE **p2;
p1 = &n;
p2 = &p1;
----------------
*p1 は n;
*p2 は &n;
とある関数 void hoge(double &x, double &y){} のdouble &xとdouble &y の&の意味を教えてください。
477 :
デフォルトの名無しさん :04/11/11 20:37:09
>>474 やってみたところ、なんとか自己解決しました。
お騒がせしました。
2 1 > 1 H 1 M 3 H 1 F 1 7 1 / 1 " 1 1 1 のように文字 個数という順で並んでいる画像ファイル(バイナリ形式pbm)を その個数分だけ文字を並べていく(RLE解凍)プログラムです。 if ((fp = fopen(argv[1], "rb")) == NULL){ printf("file open error!\n"); } while(!feof(fp)){ fscanf(fp, "%c %d ", &c, &i); while(i>0){ printf("%c", c); i--; } } という形で直接リダイレクトして出力してるんですが、 出力ファイルの「」(^Kとxyzzyでは表示されている)だけが出力されずに 解凍した画像にズレが生じてしまいます。 解決方法をご教授ください。 環境はWinXP+Cygwin+gccです。
←ここだと表示されてないですね・・・
^Kなのか。\nに\rがつくというならまだわかるんだが。 とりあえず標準出力はテキストモードで、 リダイレクトした際には吐き出すディレクトリのマウントモード(だっけ?)に 依存しそうだから、stdoutをfreopenかなんかでモード変えてみたらどうだろう。
>>481 テキストモード、freopenでも変化なしです…。
当然fopenでも変わりませんでした。
単純に、printf("%c", 11)では書けるのかな。
コントロール文字
fputc()使っといたら?
486 :
デフォルトの名無しさん :04/11/12 10:25:50
誰か助けてください。 次の関数で0≦x≦2の範囲で、xの値の0,1ごとに yの値を計算するプログラムを作成せよ。画面にはx、y両方の値を表示す るようにすること。while文を使うこと。y=x*x−3x+5/4
>>486 #include <stdio.h>
int main()
{
double x;
for (x=0.0; x<=2.0; x+=0.1) {
printf ("x = %.1f\ty = %.2f\n", x, x*x-3*x+5/4);
}
return 0;
}
ていうかマルチすんなボケ
>>486 float x=0;
while(x<2.0){
printf("x=%2.1f,y=%2.1f\n",x,x*x-3*x+5/4 );
x+= 0.1;
}
答えつつ質問
与えられた整数mの中の任意の桁nの値を求めるにはどうすればいいでしょうか?
例えばm=123のときは
n=1 ; 3
n=2 ; 2
n=3 ; 1
n=4 ; 0
のように求めたいんですが
>>488 (n-1)*10で割った後、10で割ったあまりを取ればいいんじゃない?
(n-1)*10→pow(10,(n-1)) orz
>>489 ああ、成る程!
ありがとうございました
解決しましたんで報告します。
>>483 さんの方法で出力自体はできたんで、
fscanfしたものと比較、もし^Kだったら
>>483 さんの方法で出力、
ということをしようと思ったんですが、
その時点ですでに^Kをfscanfできていなかったことが分かりました。
で、代わりにfgetcを用いた所、^Kを格納することができました。
数字部分にもfscanfを用いると何故か格納ができなくなっていましたんで
そちらに対してもfgetcを用いた、という感じです。
これは処理系によるfscanfの不具合なんですかね?
よく分からん(´・ω・`)
とりあえず、ご教授ありがとうございました。
ソースです。 while(!feof(fp)){ c = fgetc(fp); fgetc(fp); i = fgetc(fp) - 48; j = fgetc(fp) - 48; while (j>=0 && j<=9){ i = i * 10 + j; j = fgetc(fp) - 48; } while(i>0){ fprintf(fpw, "%c", c); i--; } } fclose(fp); fclose(fpw);
494 :
773 :04/11/12 13:52:06
ありがとうございます。今学校で提出しました。
495 :
486 :04/11/12 13:52:35
ありがとうございます。今学校で提出しました。
あれ? 出現回数もchar型で出力&スペース除去したものを while(!feof(fp)){ fscanf(fp, "%c%c", &c, &i); while(i>0){ fprintf(fpw, "%c", c); i--; } } で復元したら、問題なくできました。 なんだったんだ…。
>>496 scanf()系は、%sや%dなどではホワイトスペースを取り除く機能を持っている。
通常ホワイトスペースは空白文字、タブ文字、改行文字だがもしかしたら、
0x0bもホワイトスペースとして取り除かれたのジャマイカ。
最後の例では%cしか使っていないからその問題は起きない。
しかし、fscanf()やfprintf()のようなコストの掛かる関数ではなく、
fgetc()やfputc()を使うべきジャマイカ。
0x0B ^K VT 垂直タブ
499 :
486 :04/11/12 16:42:30
マルチしました。ごめんさい。
500 :
486 :04/11/12 16:43:08
ごめんなさい。
501 :
486 :04/11/12 16:50:42
ごめんね。。。
ぬるぽおおおおお
ぬるぽしました。ごめんなさい。
struct value { double a1; double a2; double a3; }; int main(){ struct value value; scanf("%f",&value.a1); printf("%f",value.a1); } 略してますがこんな感じのソースなんですが、構造体のメンバにscanfで 入力できません。コンパイルは通ったのです。なんででしょうか?
>>504 scanf の場合は、%f は double ではなくて float だったような。
double にしたいのなら %lf にしよう。
scanf("%lf",&value.a1); printf("%lf",value.a1);
scanfの場合doubleでもfloatでも%lfにするんじゃなかったっけ?
お答え頂きありがとうございます。質問しといて申し訳ないのですが、 要点を書こうとして略しすぎてしましました。%fを%lfにしてもだめで した。問題は別のところにあったようです。もう一度ご教授ください。 void scan_value(value a){ printf("\nベクトルの要素1を入力してください。");scanf("%lf",&a.a1); printf("ベクトルの要素2を入力してください。");scanf("%lf",&a.a2); printf("ベクトルの要素3を入力してください。");scanf("%lf",&a.a3); printf("\n"); } という関数を作って、main関数の中で struct value value_a; scan_value(value_a); となってます。 全部書くのもあれなのでまた略してます、すいません。 この辺が問題のようなので。 お願いします。
>>507 そんなわけないと思う。
第一、バイト数がわからなければ、実装できないだろう。
ポインタ
>>508 それはキミ scan_value(value a) って書いたら、
value のコピーが渡されるから、
入力しても関数呼び出し側には反映されないよ。
scan_value(value* a) のようにポインタを使わないといかん。
scanf()ではdoubleは%lf。floatは%f。 ポインタを扱うのでサイズの違いに意味がある。 printf()ではdoubleは%f。%lfは処理系依存だったはず。 暗黙の型変換が入るのでfloatは勝手にdoubleになるからやはり%f。
printfについてはfprintfと同様と定義されており、以下の通り。 【ISO/IEC 9899:1999 7.19.6.1 The fprintf function -7】 ... or has no effect on a following a, A, e, E, f, F, g, or G conversion specifier. と言うことで、「%lfと%fは同じ結果にならねばならない」が正解。
value avoid scan_value()関数の定義の中の scanf("%lf",&a.a1); scanf("%lf",&a.a2); scanf("%lf",&a.a3); の3つの行で . または .* の左側に構造体が必要 というエラーがでましたがこれはどういうことですか? 教えて君ですいません。Cでやり始めたのですが出来なくて C++でやったら出来ました。でも原因が知りたいので是非お願いします。
>>514 scan_value(value *a)
にしてるなら
scanf("%lf", &a->a1);
アロー演算子
>>497 なるほど。
今後なるべくfgetc()やfputc()使うように気をつけることにします。
518 :
デフォルトの名無しさん :04/11/12 23:13:03
またアフォが1匹製造されたか・・・
519 :
デフォルトの名無しさん :04/11/13 00:00:32
質問! ファイル分割する単位はどうやって決めてますか? 複数の人間で開発する場合は、一人一人の分担で決まると思いますが、 一人で開発できるボリュームのとき、分割しようとすると、 ヘッダが入り組んできて、よくわからなくなってしまいます。 分割しすぎなのでしょうか?
520 :
デフォルトの名無しさん :04/11/13 00:02:28
522 :
デフォルトの名無しさん :04/11/13 20:00:51
関数を使って現在時刻(型はstruct tm)を得たいのですが、 関数内で現在時刻を得ても、その時刻をmain関数に反映させることができません。 どうすればいいでしょうか?ご教授お願いします。 ・プログラム #include <stdio.h> #include <time.h> void get_time( struct tm *tm ) { time_t t; time(&t); tm = localtime(&t); printf("1:%s", asctime(tm) ); } int main (void) { struct tm *tm; get_time( tm ); printf("2:%s", asctime( tm ) ); return 0; } ・実行結果 1:Sat Nov 13 19:57:08 2004 2:Sun Jan 0/ 00:00:l0 1900
ぬるぽーーーーーーーー
ガッ でもこの場合ぬるぽじゃないぞ。 mainでとったtmの実体ないだろ。だからだ。
525 :
522 :04/11/13 20:27:37
>>524 mainのtmはポインタにしてはいけないということでしょうか?
というかアドレス渡ってないんじゃないのかあんど&
ここにはバカしかいないんですね #include <stdio.h> #include <time.h> void get_time( struct tm **tm ) { time_t t; time(&t); *tm = localtime(&t); printf("1:%s", asctime(*tm) ); } int main (void) { struct tm *tm; get_time( &tm ); printf("2:%s", asctime( tm ) ); return 0; }
すぐ答えをだすやつは包茎
>>524 ,526,527
どうもありがとうございました。
ポインタについて、全然理解できていないようなので、出直してきます。
つーか、struct tmなんて中途半端なもんやり取りしないでtime_tか文字列にしとけと思うが。
>>527 なんでわざわざ struct tm **tm よ?
>>522 get_time() の
tm = localtime(&t);
を
*tm = *localtime(&t);
にして、main で
struct tm tm;
get_time(&tm);
と、実体のあるポインタを渡す。
…でも、できれば localtime() じゃなく localtime_r() を使った方がいい。
532 :
デフォルトの名無しさん :04/11/13 23:24:38
メインルーチンなどで確保したint型の配列を、サブルーチンで使えるようにするには どうすればいいのでしょうか?
自分で考えようね。
グローバル変数として定義する。
関数の引数として参照渡しすればよかろう。
ぽいんちゃ
void f(int (*a)[16][16][16]) {} void f(int* a) {} int main() { int a[16][16][16][16]; f(a); f(&a[0][0][0][0]); return 0; } 詳しくは禿本C.7.3で
538 :
デフォルトの名無しさん :04/11/13 23:47:35
なぜ、このスレで禿本がでてくる?
独習Cの練習問題なんですが、CD-ROMがないので答えがわかりません・・・ 数当てゲームのプログラムなんですが、正解のあとループの終わらせ方がわかりません どなたかご教授願います。↓までが限界です・・・ #include <stdio.h> int seikai(int num); int main(void) { int ans,num,i; ans = 253; printf("数当てゲームです\n整数を入力して下さい。"); scanf("%d",&num); for (i = 0;i < 9; i++) { if(num == 253) seikai(num); if(num < 253) printf("小さいです\n"); if(num > 253) printf("大きいです\n"); printf("もう一度入力して下さい"); scanf("%d", &num); } return 0; } int seikai(int num) { printf("正解です!"); return 0; }
if(num == 253) seikai(num); を if(num == 253) { seikai(num); break; }
return
ruby
関数を作る必要なかったのかorz
num使ってないね
プログラムのどこかで exit または main から return した後って malloc で獲得したメモリは開放されるのでしょうか。
547 :
デフォルトの名無しさん :04/11/14 00:37:28
どこにそんなこと書いてあったんだ? >546
開放される場合が多いが、すべての環境で開放されるわけではない。 ---終了--
char *s; s=(char *)malloc(sizeof(char)*100); . . . free(s);
関数Aに配列(の先頭アドレス)を渡して、 その関数内でその配列の要素数を求める方法はないのでしょうか? 複数の文献をネットであたりましたが、通常のsizeof割り算方式では 不可能を示すものしかなく、関数内でもとめる方法がありません。 教えてください。
C言語を始めようと思い開発ツールを購入しようと 思っているのですが、後で痛い目にあいたくないので 扱いやすいソフトを教えていただけないでしょうか?
>>552 Emacs 最高
Elisp 覚えればな。
>>552 ゆくゆく何を作りたいかを書きもせず、ましてやOSさえ書いてないのは、
もしかしてエスパーがこのスレにいると思ってますか?
WINMXでDL
557 :
デフォルトの名無しさん :04/11/14 01:26:57
558 :
デフォルトの名無しさん :04/11/14 01:27:24
呼び出し元の関数で配列の最後になにかフラグを入れたら 良いんじゃないっすか? charだったらNULLか何か入れて 関数AでNULLが出るまでカウントする。 これじゃ駄目かな?
開放されたかされてないかはどうやって調べればよいでしょうか。
560 :
デフォルトの名無しさん :04/11/14 01:28:14
562 :
デフォルトの名無しさん :04/11/14 01:32:02
例外つかうとかは?
>>558 そこまでする努力するのなら、素直にパラメータひとつ増やしてサイズ渡せばいいと思うんだが。
というかそっちの方が楽ですよ。特殊なキャラを埋め込むときにどうせサイズが必要だし、
呼ぶ前に埋めるのと、呼ばれた側でカウントするのとで無駄に速度が落ちるし、いいことないっす。
565 :
デフォルトの名無しさん :04/11/14 01:35:14
>>558 結局フラグ入れたり、引数に要素数渡したり、グローバル変数でフラグにするしかないのか?
グローバル変数でフラグって何よ
567 :
デフォルトの名無しさん :04/11/14 01:44:38
558です。
自分もパラメータ増やすと思いますが。
>>550 は通信等でどうしてもバイトしか渡せない時があるから
その時の処理じゃないのですか?
568 :
デフォルトの名無しさん :04/11/14 01:45:56
CとC++の違いって Cのオブジェクト指向の要素を取り入れたのがC++と聞きましたが では C#との違いは何でしょうか? Cさえ覚えればC#もすぐに覚えられるのでしょうか?
569 :
デフォルトの名無しさん :04/11/14 01:46:33
558です。 セマフォの管理などの場合はグローバルでフラグを 持つのはかなり有効と思うのですが?
570 :
デフォルトの名無しさん :04/11/14 01:48:34
C++はプラットフォームを選ばないですが、 C#はWinのみで動作する言語です。
571 :
デフォルトの名無しさん :04/11/14 01:49:38
↑失礼C#はWinのみでしかPG出来ない言語でした。
>>552 これからC言語を始めようと思うなら
お金かけずに秀丸+Borlandで十分だと…
てか秀丸とtheSpokeの値段が大して変わんないんだな
574 :
デフォルトの名無しさん :04/11/14 01:55:04
>>550 需要がありそうなのに決定的な解決方法はないってことになるのかな?
575 :
デフォルトの名無しさん :04/11/14 01:55:12
Borlandの開発環境は少ないからやはりgccかと cigwin落としてviで書くのが一番かと... 何をやるのか分からないがやはりコンパイルやリンカの仕組みは 知らないと。
eclips+gcc
578 :
デフォルトの名無しさん :04/11/14 02:02:07
EclipseでCって使う人多いのでしょうか?
579 :
デフォルトの名無しさん :04/11/14 02:04:09
俺も気になった業務系の人は使うのかな?
ただでそれなりな環境って意味では一番の組み合わせなんじゃないの?
>>567 どこからその通信云々の前提が出てきたんだ…
固定長前提の場合を除くと、C以外でも配列のサイズを渡すしかないっすよ。
コードの字面で陽に渡すかどうか(コンパイラが受け持つかどうか)は別としてね。
>>581 結局そういう結論になりますか・・・。
C言語に特化した方法で良いので何か効率の良い解決方法はありませんか?
それについて書かれたサイトやモジュールはないでしょうか?
C言語では配列の引数はポインタと同じ扱いになっている(こうしないと配列丸ごとコピーすることになるからかな?) ポインタは通常メモリアドレスに過ぎないので、それだけではどれだけの長さがあるのかなんて判別できない 通信の場合でも何も無しでは何処で区切るなんてわかりっこないので 一定の長さにするか、事前に長さを渡すか、区切りを決めておくという方法でやり取りする
>>582 どうしても、ていうなら、こんなのくらいしか思いつかない。
typedef struct {
char *p;
size_t size;
} char_array;
char_array *char_array_alloc(size_t size) {
char_array *ca = malloc(sizeof char_array);
if (!ca) return NULL;
ca->p = malloc(size);
if (!ca->p) {
free(ca);
return NULL;
}
ca->size = size;
return ca;
}
続き void char_array_free(char_array *ca) { free(ca->p); free(ca); } size_t char_array_get_size(char_array *ca) { return ca->size; } char *char_array_get_buf(char_array *ca) { return ca->p; } 使い方はわかるよね。
struct { size_t size; char values[1]; } char_array; しといて char_array* array = malloc( sizeof( size_t )+count ); というのはよく見るね。 言語仕様的にはアウトの予感だけど。
>>587 アウトです。C99でも標準化委員会で議論はされたけど結局アウトだったような。
>>589 おー、サンキューっす。それは知りませんでした。精進します。
>>557 template<int N> void Hoge(int& Foo[N]);
struct { size_t size; char values[0]; } char_array;
>>591 template <T, std::size_t N> void f(const T (&t)[N});
配列の要素を引数と言う香具師始めて見た。
596 :
デフォルトの名無しさん :04/11/14 12:41:40
始めるなよ ぼけ
597 :
デフォルトの名無しさん :04/11/14 12:44:24
IRCでvoid教祖様とそのとりまき連中が話していたのだが、 for (;;) と while (1) で、 gccでのコンパイル結果のバイナリーに差がでるような gccのオプションって何だ? IRCの会話をみながら、ひそかに自分で試してみたが、見つからなかった。 (見つけて反論してやろうと思ったのに) gccにかぎらず、その2つで差がでるようなコンパイラー自体 思い当たらないのだが。
VC++6.0 ; 8 : for(;;); jmpSHORT $L582 $L585: ; 9 : ; 10 : while(1); moveax, 1 testeax, eax jeSHORT $L586 jmpSHORT $L585 $L586:
ぼるじょあが一言 ↓
ゥルェエー!
602 :
デフォルトの名無しさん :04/11/14 14:34:13
最近、C、C++の基礎本を読み終えたのですが とあるプログラムを使ってコマンドプロンプト上に出力された文字列 (例:りんご を 3個 ください)からオリジナルのプログラム上で 自動対応させることは可能でしょうか。 例 1):「りんごを3個ください」(外部プログラムからの出力) ↓ 2):「りんご3個でよろしいですね」(if文などを使ったオリジナルプログラムから出力) 初歩的な質問ですいませんが宜しくお願いします。
初歩的な日本語も勉強しましょうね
606 :
デフォルトの名無しさん :04/11/14 14:54:06
602です。 読みづらい文章ですいません。 最初にコマンドプロンプトで、あるプログラム(hoge.exe)を実行します。 C:\bin\hoge\hoge.exe -C sentence1: りんご を 3個 ください と出力されるのですが、ここで主力結果「りんごを・・」に対する返答を するプログラムをCで作りたいのですが、キーボードからの入力は scanfを使えばいいと分かるのですが、既に画面上に表示されている文字列を 利用する関数はありますでしょうか。 分かりづらい説明ですいませんが宜しくお願いします。
>>593 > プロセス終了処理を追えばわかる。
プロセス終了処理ということは OS のソースを見ないといけないということで
しょうか。 Windows などの場合はどうすればよいでしょうか。
>>606 でちゃったの拾うのは面倒なんで
FIFOかPIPE使って
>>607 そんなときのためにサポートセンターがある。
結論として終了前には必ずfreeするということでOK?
>>610 そうしない積極的な理由がない限り、それでいい。
>>606 インタラクティブに対応するのは結構難しいかと。
事前に出力がわかっているのなら、入力すべき内容を
テキストファイルにでも入れてリダイレクトで済むかも知れず。
する必要のない処理を入れるなんてナンセンスですよ。
613 :
デフォルトの名無しさん :04/11/14 15:18:24
>>608 , 611
どうも有難うございます。参考にさせていただきながらやってみます。
またお世話になるかもしれませんが宜しくお願いします。
アホはほっとこ。 なんでこんなナンセンスな香具師が湧いてるんや…
>>612 >611が敢えて抽象的な表現したんだから察しような。
616 :
デフォルトの名無しさん :04/11/14 15:35:48
ナンセンスな質問ですいません。 事前に出力される結果は分かっていないんです。外部音声認識により 「りんご3個」と発話した結果(話者により、果物名や個数は異なる) に対して if fruit(りんご){ こんな処理しろ } else { りんごじゃなかったら、こうしろ } 上記適当ですが、こんな形の処理を実行したいと思ってます。。 初歩的な質問かもしれませんが宜しくお願いします。
くどくどやって申し訳ないんですけど こんな感じでやって OS に異常がなければ free しなくても大丈夫? int main(int argc, char *argv[], char *envp[]) { int i; int *dummy; int mem = 1; for (i = 0 ; i < 1000000; i++){ if ((dummy = malloc(mem <<= 1)) == NULL){ printf("mem: %d\n", mem); exit (1); } } return 0; }
OK
漏れはatexitでメモリ解放の手続きを行ってる(た)がな 最近C使ってねぇや
>>617 異常が無いかどうかを正確に判断できるのならね。
>>620 > 異常が無いかどうかを正確に判断できるのならね。
何回も実行して特に不都合がなければ異常なしと判断してよいと思っていたの
ですが、何かいい方法はあるのでしょうか。
ねえよ。
ひどい。
質問させてください。 たとえば、 明日は\n いい\n 天気="晴れ"ですね。\n という文字列があるとします。 「晴れ」の部分を取り出すときはどうすればいいのでしょうか? sscanf()関数しかないのでしょうか?
>>622 気になるならfree()しとけ。気にならないならfree()しなくていいから。
>>597 すげー亀レスだけど最適化切ればwhile(1)は
cmpしてからjmpすると思う。多分。
少なくともBorland C++ではそうだった気がする。昔試したときは。
ってそういう話ではない?
>>616 真っ当な回答としては、そのプログラムの開発元に相談しろとしか言えない。
既に何度か書かれているようにpipeを使ってできないこともないが、結構難しい。
後は、要件と開発コスト次第。
>>625 他にも方法は色々あると思うが、sscanf()を躊躇う理由がないならそれでいい。
取り出すとはどういう意味だ?文字列の中に「晴れ」が含まれてるか チェックするにはどうするかという質問?
>>630 天気="雨" 天気="曇り"という場合もあります。
「雨」「曇り」・・・
sscanf(buf,"明日は\nいい\n天気="%s"ですね。\n",tenki);
これくらいならいいけど、文字列がもっと長くて、取り出したい値が10個あるときにどうすれば・・・
明日はいい天気だといってるに雨や曇りがあるのか? ハァ?
>>631 取り出したい文字列を配列にして、ループでまわしたら?
#define N_TENKI_TYPE 3
cahr *tenki_type[N_TENKI_TYPE]={"晴","雨","曇"};
for(i=0;i<N_TENKI_TYPE;i++){
val=strstr(buf,tenki_type[i]);
if(val)break;
}
if(val)strcpy(tenki,tenki_type[i]);
でどーよ?
あとは、正規表現regex()とか。
>>631 sscanf(buf, "%*[^\"]\"%[^\"]", tenki);
cahr
^t
Ctrl-t
chasen
>>634 (;´Д`)スバラスィ ...ハァハァありがとうございます。
そこに入る値が不明(ランダム)の場合はどうしたらよいのでしょうか?
>>641 ランダムなら、適当な値入れればいいんじゃない?
>>641 chasenで形態素解析するのと、
「="」が出てきてから「"」までの区間と「="」の一つ前の形態素とを
取り出せばよい。
>>643 chasen()関数?初耳だ・・・
勉強せねば・・・
>>644 おお!!thx!!!!!見落としてたよ。
スレの住人様迷惑かけてすみません。
形態素解析しないと、 「今日はいい天気="晴れ"ですね。」 という構文だと 天気="晴れ" というのが取り出せへんと思うんやけど。
?
農家の人たちは雨降る(など自分たちに都合のいい天気の)ことをいい天気と呼ぶんだぞ。
strstr とかの標準関数って、検索したい文字列が日本語でも ちゃんと動く?
日本語の文字列の中から1バイトの文字を探そうとすると悲しいことになるかもしれない。
>>652 実装による。
非標準だがVCやBCCなら_mbsstrなどが用意されている。
>>652 C++でstd::wstring.find()使えばどう?
ユニッコードにしちゃえ
strstr、wcsstr、_mbsstr のヘルプのところにワイド文字版、 マルチバイト文字版と書いてあるのですが、ワイド文字、 マルチバイト文字とは何を指しているのでしょうか。
>658 その通りでした。>657の質問は取消ます。
662 :
デフォルトの名無しさん :04/11/15 15:53:41
アセンブリ言語で書いたプログラムをC言語の中で関数として使用するにはどう宣言すればいいですか? 例えばa.asmというのに対してCプログラム中で、extern inline void a();としてやってみましたが、 コンパイル時に function "a" was referenced but not defined となってしまいます。 ご存知の方いたらよろしくお願いします。
664 :
デフォルトの名無しさん :04/11/15 17:53:22
同一ディレクトリ内にあるすべてのファイルを開く良い方法はありますか?
環境に依存しますね
666 :
デフォルトの名無しさん :04/11/15 18:06:40
linuxです opendirとかreaddirを使えばできそうですね
>>666 ひとつのプロセスがオープンできるファイルの数は限りがあるよ。
668 :
デフォルトの名無しさん :04/11/15 18:24:25
ファイルを開くのではなくファイル名を取りたかったので 大丈夫みたいです #include<stdio.h> #include<sys/types.h> #include<dirent.h> int main(){ DIR *dp; struct dirent *entry; if((dp = opendir("dat"))==NULL){ exit(-1); } chdir("dat"); while((entry=readdir(dp))!=NULL){ printf("%s\n",entry->d_name); } }
669 :
デフォルトの名無しさん :04/11/15 18:49:32
char buf[100]; gets(buf); で何も入力せずにリターンを押した場合、bufには何が入ってくるのですか? if (gets(buf)==NULL) break; というコードを見て、何も入力せずにリターンを押した場合にbreakと思ったのですが、 動かなかったです。
定番に過ぎるが、
>>670 知らんのなら黙っとけ。な?
>>669 何が返されるのか知らず、マニュアルも見ず、か。
いい度胸だ。
「成功すると引数そのまま、エラー or ファイル終端で NULL」
改行コードでファイル終端と見做されちゃ困るだろう?
定番に過ぎる
>>669 何も入力せずにリターンを押した場合は、
長さゼロの文字列を入力したことになる。
>>669 gets()がNULLを返すのはEOFまで読み込んだか失敗したとき。
何も入力していないときはEOFでも失敗でもない。
お前がやりたいことはたぶんこう。getsよりfgetsの方が良いが。
if (gets(buf) == NULL || !strcmp(buf, ""))
break;
もっとスマートにできる方法教えろ。
喧嘩したらだめだよー 騙りもだめー 煽りもだめー 自演もだめー にゃんにゃん
>>677 そこで関数化ですよ。
inline bool Gets(char *p)
{
return (gets(buf) == NULL || !strcmp(buf, "");
}
getsはサイズチェックしないから(ry
質問に答えて下さった方々、ありがとうございます。 何か騙りがたくさんいますが。 getsで読み込んだ時、何も無かった場合のエラー処理がしたかったのです。 676さんの方法でいけそうです。 ありがとうございました。
いや、strcmp(buf, "")なんて恥ずかしいコード書かなくていいから。
if (gets(buf) == NULL || buf[0] == '\0' ) こう?
buf[0] == '\0'
686 :
デフォルトの名無しさん :04/11/16 00:02:26
CでおすすめのRFC無い?
Request For Comments?
Readers for C-language
if (gets(buf) == NULL || !*buf )
if ( !(gets(buf) && *buf) )
691 :
デフォルトの名無しさん :04/11/16 08:19:42
時差を取得する方法を教えてください
海外へ飛ぶ
694 :
デフォルトの名無しさん :04/11/16 13:48:52
bcc5.5.1ですが、 int aaa(); int main() { return aaa(); } int aaa() { return 0; } というようなファイルをコンパイルすると プロトタイプ宣言のない関数という警告がでます。 プロトタイプ宣言を int test(void); とするか、 -P オプションで C++ とみなしてコンパイルすると 出ないのですが、VC6 や gcc ではこんなのはでません。 bcc の C は古い仕様だからなのですか?
× int test(void); ○ int aaa(void);
>>694 いえ、gccでもオプションを調整すれば出ます。
つーか、Cはプロトタイプ宣言必須じゃないからね。
引き数無しのプロトタイプはvoidを明記する必要があるわけさ。
わかりました。ありがとうございます。
ふと思ったのですが, 文書ファイルに文字を上書きをする場合は,単にwrite()で書き込みをすればそれで十分と思ったのですが, 文書ファイルに文字を挿入する場合っていったいどういう処理が行われているんでしょうか? そのまんま考えてみると,挿入された文字以降のデータを全て移動させないといけないはずなんで,それってものすごい効率悪い処理だな〜って思い,気になってしまいました.
>>698 内部では行単位でリストに格納している
やたら長い行だとそれでも効率悪いがそんな文章は滅多にない
関数へのポインタなんですが、 void (*func)(void) = func1; などとしたとき、 func() ↑と (*func)() ↑とではどう違いますか?
>>701 どちらも結果は同じなので、今は書きたい方を書いていいことになってます。
>>698 こっちのスレだとwrite()の時点でスレ違い。
つーか、あっちでほぼ答が出てるのに何故そのままコピペ?
で、あっちでも書いたけど、普通は入出力を別のファイルにするから問題にならない。
テキストエディタみたいなものなら通常一文字ごとにファイルに書かないしねぇ。
705 :
デフォルトの名無しさん :04/11/16 20:32:59
>>701 同じだよ。
俺はポインタを通していることを隠したくないんで後者だな。
あくまで個人的な気持ちで、周りに負担をかけてまで突っ張りはしないが。
構造体のs.memberとp->memberでは区別してるけど、関数呼び出しでは 区別してないって奴ね。言語の決めの問題。
>>706 ハァ?????????????????????
wwwwwwwwwww
ぷ
708 :
デフォルトの名無しさん :04/11/16 20:57:06
>>707 706 がわけわかめってとこには同意だが、
おまいさんもちゃんと技術的な話を入れないと同類だよ
(*p).member って書き方も使うときは使う
(*pp)->member なんてメリットねえし
関数呼び出しと関数へのポインタでの関数呼び出しでは どちらも()を使うけど、構造体と構造体へのポインタでは 使う演算子が違うってことなんだけど。 ・関数 func() (*pfunc)() ・構造体 s.member ps->member
書き忘れっていうか書き間違い。 関数へのポインタの場合は pfunc() でも可。
配列渡しってなんですか?
全角文字や漢字の0x5C(\\)を(全角、漢字のものと)特定してはじく方法ってありますか?
>>712 あります。
ないとも言えます。
文字列を先頭から舐めていけばなんとかなるでしょう。
SJISなら文字列頭から見ていって、漢字の範囲のコードが出てきたら次の文字は漢字の一部と判定していくのが確実 ユニコードは知らん
VC7.1 で stdbool.h をインクルードしようとすると インクルード ファイルを開けません。'stdbool.h': No such file or directory とエラーが出てしまいます。 VC7.1 では stdbool は使えないのでしょうか?
>>716 宿題46かな?
VCだとPOSIX独自のインクルードファイルがないから取り敢えずこれでも突っ込んどいて。
--
/* dummy stdbool.h for no POSIX env.. */
#ifndef STD_BOOL_H
#define STD_BOOL_H
typedef enum {false, true} bool;
#endif
>>717 stdbool.hは今やC99で標準ライブラリに取り込まれた。
もちろんVCは非対応だが。
>>718 ふむ、情報THX。
C99に対応しているSun-OSのccで見つからないって言われたからないもんかと思ってたよ。
#そういえばC99フル対応のオプションはつけてないなぁ。その所為かな?
中学生に礼儀をきたいすんな
723 :
デフォルトの名無しさん :04/11/17 00:53:35
つーか、お礼を哀願する回答者って全然かこよくない
期待はしていない 礼を言えと言っているのだ
孔子を学びなさい。 周公を学びなさい。 あなたがたに不足しています。
>>726 ただ、学びなさい。
それが貴方に必要なことです。
学べばそういう言動はなくなるでしょう。
あなたも学びが足りないようですね。
このスレ自体が、学びからかなり遠いんだが 宿題を他人にやらせる。これ最低
なに釣られてんの?w
>>735 仕方が無いじゃないか
このスレ無かったら、CやC++のスレが宿題であふれちゃうぜ
>>737 ここは宿題スレじゃないが。
何時間寝てないですか。
C 言語というか indent の `{' について質問. struct { char n[20]; int i; } test[] = { {"A", 1}, }; を indent 使って整形すると, (いろいろオプションは試したのですが) struct { char n[20]; int i; } test[] = { { "A", 1},}; となります. 関数は func(void) { となって欲しいんですが, 構造体は struct { となって欲しいんです. 何かテクがありますか?
Windows環境において fork で子プロセスを生成するしたいのですが、 Cygwinを使わずに実現する方法はありますか?
VM
>>743 VMですとなぜかインストールから数日経つとXWindowが
立ち上がらない状態に陥り使い物にならず困っています。
他の方法はありませんか?
>>743 VMって何?
VirtualMachine?
VMWare?
人にわかるように書いてほしいものだ。
Vitamin, Mineral
>>746 どうやってソレでforkを実現するのだ?
>>742 Cygwinで使えたっけ?できなかったような?
>>742 >>742 Cygwinではこうやって実装してる
http://www.sixnine.net/cygwin/translation/cygwin-ug-net/highlights.html 親プロセスが子プロセスを fork する際に最初に発生する作業は、
親プロセスが子プロセスのために Cygwin のプロセステーブル内の領域を初期化するすることです。
それから、Win32 の CreateProcess 呼び出しを使用して、サスペンド状態の子プロセスを作成します。
次に、親プロセスは自分自身のコンテキストを保持するために setjmp を呼び出し、
Cygwin の共有メモリ領域 (Cygwin の全てのタスクの間で共有される) にこのコンテキストへのポインタを設定します。
そして、親プロセス自身のアドレス領域からサスペンド状態の子プロセスのアドレス領域へとコピーすることで、
子プロセスの .data セクション及び .bss セクションを埋めます。
子プロセスのアドレス領域が初期化された後、子プロセスが実行され、その間親プロセスはミューテックスを使用して待機します。
子プロセスは自分自身が fork されたことを知ると、保存されたジャンプバッファを使用して longjump します。
子プロセスは親プロセスが待機しているミューテックスをセットし、もう一つのミューテックスをブロックします。
これは親プロセスに対して、子プロセスが親プロセスのスタックとヒープをコピーし終わったことを知らせるシグナルとなり、
その後、親プロセスは子プロセスが待機していたミューテックスをリリースして fork 呼び出しから復帰します。
最後に、子プロセスは最後のミューテックスのブロックから復帰し、共有領域を使用して渡されたメモリマップ済み領域を再生成して、
自分自身の fork から復帰します。
あとはCygwinのソース読め
752 :
初心者 :04/11/17 11:30:16
白黒画像のビットマップファイルを取り入れて、ある色の濃さ以上のみ表示して、その他は切り捨てると言う様な事をしたいんですけどどういった手順でしたらいいかご教授願います。初心者なんで分かりにくい文ですみません。
すべての点について、周囲の点の数をカウントする
754 :
デフォルトの名無しさん :04/11/17 11:44:28
>>752 機種も環境も書いてないのに回答できるわけないだろ。
(1)ファイルを読み込む。 (2)ある色の濃さ以上のみを表示する。 以上
アルゴリズムを聞きたいのか?
白黒って、本当にモノクロームなのか。それともグレイスケールなのか。
それによってかなり違う。
後者なら簡単なので説明略。
前者なら、濃い部分=点の密度の高い部分として
>>753 のいうように小さなブロック内の色の平均をとる。モザイクみたいに。
test
test
>>754 機種とか環境に依存すると思うなら素直に追い払えばいいのに
来年から入る会社にC言語を使うと言われたのですが なにを勉強すればよろしいでしょうか?ポインタの基礎程度までの知識はあるつもりです なにか良い書籍や、作っといたほうがいいプログラムがあれば教えて下さい
>>760 そこまで分かってるなら後は研修で習うんじゃないか?
>>760 その会社で何をやってるかわからないのに、助言できんわ。
C++やってみてもいいんじゃなかろうか。 多分にスレ違いな気がするけど。
>>760 > ポインタの基礎程度までの知識はあるつもりです
まずはポインタを便利に使ったプログラムを紹介してみては?
アイディアが浮かばないならば
そのへんを勉強すればいいと思うし
765 :
デフォルトの名無しさん :04/11/18 07:14:59
>>760 とにかく基本をしっかり
・二重ポインタ
・構造体の配列
・分割コンパイル
・アルゴリズム(ソート、圧縮、行列、etc...)
スタイルは入社後でないと無理
実行環境は配属先が決まらないと雲を掴むような話
デバドラあたりがんがん作ってたりする位ならまだしも
ちょっとかじってる程度ならどれやっててもないよりまし位
767 :
デフォルトの名無しさん :04/11/18 08:12:47
行列とポインタねぇ・・・
768 :
デフォルトの名無しさん :04/11/18 08:17:39
行列って何れふか
ベクトルじゃないか?
配列でしょ
「ポインタの基礎」ってどういう意味なんだろうね。 煽りじゃないよ。 どのくらいを知っていると「基礎」って言えるんだろう。 int *abc; と宣言するとポインタ変数になります。 くらいで基礎?
>>760 俺の特にオススメは
1:プログラミング言語C 、共立出版株式会社、カーニハン&リッチー
2:Cプログラミング専門課程、技術評論社 、藤原博文
3:Cプログラミング診断室 、技術評論社 、藤原博文
の3冊、どれも¥3000でジャリ銭釣りが来る値段。
1はANSI規格本なので俺はC言語で仕事する時は必携と思ってる、
が翻訳本の常かチョット読みづらい。
2、学生の時ポインタが理解し切れなかったとき、これで
C言語のメモリを意識するという意味を理解した。
関数も配列も構造体もポインタも多重だろうが
全ては所詮メモリと悟りたければオススメ。
俺はこれでCを飛躍的に開眼した。
3、これはダメなプログラムの見本集の意味合いも強いので、
自分を戒めるために時々再読するためにオススメ。
他にも色々あるが取り合えずこんだけ
>>760 プロンプト画面で良いから
入力/閲覧が出来る日記プログラム作ったら?
・ファイルの入出力
・画面表示
・ちょっとしたDB設計
・構造体の設計
・配列のポインタ
・構造体のポインタ配列の繋げ変え
・メモリの確保
etc・・・
結構いろいろな事が出来ると思うぞ。
>>774 ポインタの基礎って言うと
実体とアドレスだから
char *cP = Null; の *cP と cP の意味知ってれば良いんでない?
ホントに最低の基礎だが。
>>775 1:規格本としてしか利用しないなら規格本を買えばいいので不要。或いはManOnWWWでいい。
2:これでもいいけどこの辺はひとそれぞれかな。
3:Webで読めるから不要。一度通しで読みたいなら借りれば充分。
>>760 「ダブルポインタなら大丈夫です」と自信ありげに面接のときに言ってた香具師がいたが、
入社してから「トリプルポインタはよく判らないんですよぉ」と言いやがった。
こういうのは、ポインタの基礎ができていない典型。
まぁ、余裕があるなら何かテキストファイルの加工をするようなツールでも作ってみたら?
その辺りのイメージが湧かないなら「プログラミング作法」を読んでみてもいいかと。
#但し、言語がRatforなのでコード丸写しはできないが。
##私自身は、そのお蔭でより勉強になったし知らない言語に対する恐怖が減ったが。
その会社がもし合わないようなら就職フェアで待ってるからw
Cで、列挙子を文字列として取得する方法ってありませんか?
>>778 C言語歴13年の自分ですが「ダブルポインタ」「トリプルポインタ」と
いう言葉は初耳。なにそれ?
>760 ポインタはアドレスを格納するための「変数」で、 配列はアドレスを示す「ラベル」の働きをすることを認識できればいい。 char* pc; char ac[10]; pc = ac; // ポインタ変数pcに配列acのアドレスを代入する 因みにポインタ変数のバイト数は不定だが、4バイトであることが多い。 作っておいた方がいいプログラムはファイルの16進ダンプかな?
>>778 >>760 にススメたのを評価するは分かるが、
何故「不要」までいいだすの?ナゾ・・・
それに1.に関して「規格本を買えば良い」ってアンタ・・・
この本の意味や知らないだろ?amazonで良いから見て来いよ。
今更「知ってる」言っても嘘バレバレだぞ
>>778 ポインタのポインタのポインタは
単純にポインタのポインタでいいんじゃないの?
どっちもポインタ型なわけだし
784 :
デフォルトの名無しさん :04/11/18 13:19:57
ポインタのぽいんたのポインタのポンた。
785 :
デフォルトの名無しさん :04/11/18 14:25:14
>>782 俺は 778 ではないが、K&R が「規格本」という
>>775 の発言は明白に誤り
C の標準を定義している文書は規格本ではなく規格票といい
C の規格票を取り寄せるときに指定する文書番号は ISO/IEC9899 もしくは JIS X3010
実際に C で開発をするにあたっては規格を確認することはもちろんだが、
処理系に特有のことを調べる必要も出てくる
そういう場合にも参照すべきは K&R ではなく、その処理系のマニュアル
K&R が有用なのはあくまで C を勉強中のテキストとして用いたときで
そんなのがまだ必要なレベルで仕事している人の苦労は察して余りある
持ってないなら手元に置いといたらいいと思うが。 どうにも煽りたいんだろうけど。
ぽいんたはやっぱり いんたーふぇーすで使うのが良い。 あぽいんとめんとを取っておかないとえらーになり きなくさいことに暴走する事もある。 あの星をつかみたいなら いでたちを綺麗に整えば かすかに手が届きそうかと思う。2列。
>>780 実際にそういった香具師がいるんだが、私もそのとき(面接)初めて耳にしたよ。
>>782 K&Rが何かは知ってるよ。>775を皮肉りたかっただけさ。
#尤も、改訂版は買ってないし通読してはいないが。
>>783 私も同意。ポインタを理解できていれば、ポインタのポインタもポインタに変わりがないことくらい判るからね。
>>787 ご愁傷様です。
789 :
デフォルトの名無しさん :04/11/18 16:11:07
配列とポインターについてなら、 日下部先生の「作ってわかるCプログラミング」技術評論社 がいちばんわかりやすかったな。 後輩にもそれを読ませてる。
790 :
デフォルトの名無しさん :04/11/18 16:12:36
暇そうなら、30秒以内に自分で自殺してファイルごと消えうせるモジュールを書いて味噌汁。
791 :
デフォルトの名無しさん :04/11/18 16:34:41
#include<stdio.h> int main(void){ float f; for(f= 1.0;f>=0.1;f=f-0.1){ printf(" %f \n",f); } } の実行結果が 1.000000 0.900000 0.800000 0.700000 0.600000 0.500000 0.400000 0.300000 0.200000 となり0.100000が出力されません。なぜそうなるか教えてください
>>791 floatの演算は10進演算ではないから誤差が出る。
forループの中でfを使いたいなら、
for (int i = 10; i >= 1; i--) {
f = i / 10.0;
}
としろ。
>>792 誤差なのは分かりますが、もう少し詳しく教えてください。
逆にfloat f;
for(f = 0.1;f <= 1.0;f = f+0.1){
printf(" %f \n",f);
}
としたときも 0.100000 〜 0.900000 までしか出力されません。
>>793 たしかにそうなんですが、大学の課題でなぜそうなるか考察汁って言われたのでお願いします
だから誤差
行列演算を関数化するとどんな感じなの? ていうか行列からしてよくわかんないんだけど。
丸め誤差だっけ?
805 :
デフォルトの名無しさん :04/11/18 17:28:53
浮動小数点に対する等値比較があること自体、仕様のバグだろ ただし、ここで言う等値比較とは == != <= >= ! を指す
この場合は <= じゃなく < にしても同じだろ
普通に出力されたけど折れの環境は何かおかしいのかな
>>807 別におかしくない。浮動小数の内部表現形式が違うだけ。たぶん。
で、 0.1 を内部表現するとどうなるの?
810 :
デフォルトの名無しさん :04/11/18 18:33:16
>>791 嘘をつくな
printfの書式制御文字列と出力が一致しない
>>810 特定の環境では'\\'を書き込もうとすると'\'に置き換えられるからしょうがねぇべさ。
>791 3DCCCCCD 00111101 11001100 11001100 11001101 0.100000 ← 0.1 3F800000 00111111 10000000 00000000 00000000 1.000000 3F666666 00111111 01100110 01100110 01100110 0.900000 3F4CCCCC 00111111 01001100 11001100 11001100 0.800000 3F333332 00111111 00110011 00110011 00110010 0.700000 3F199998 00111111 00011001 10011001 10011000 0.600000 3EFFFFFD 00111110 11111111 11111111 11111101 0.500000 3ECCCCCA 00111110 11001100 11001100 11001010 0.400000 3E999997 00111110 10011001 10011001 10010111 0.300000 3E4CCCC8 00111110 01001100 11001100 11001000 0.200000 3DCCCCC3 00111101 11001100 11001100 11000011 0.100000 ← 10回目のf ってな感じで、10回目のfは0.1より小さいからforループを抜ける。
813 :
デフォルトの名無しさん :04/11/18 19:40:16
>>811 嘘をつくな
\\n でそんな出力など出るものか
プログラミング言語Cか、俺も手元に置いてるな なんか基礎本サヨナラ&紙媒体持たない派が多いみたいだけど 使える言語の基礎確認本は1冊くらい手元に置いておかないの? それと、金融系の仕事が多く自前PC持ち込めなかったり環境制 限が厳しい俺には紙媒体はまだまだ現役だよ。
815 :
デフォルトの名無しさん :04/11/18 20:23:07
>>814 金融系って説得力の補強のつもりで言ってるのか?
物事を確認すべきときの情報源の選択に関して論外な発言をしながらでは逆効果にしかなってないぞ
使える言語/OS/ミドルウェア/ライブラリ/プロトコルの基礎確認本を 全部手元に置いていたらいくらスペースがあっても足りない。
818 :
デフォルトの名無しさん :04/11/18 20:27:52
>>816 繰り返す
物事を確認すべきときの情報源の選択に関して論外な発言をしながらでは逆効果にしかなってないぞ
819 :
デフォルトの名無しさん :04/11/18 20:28:43
>>817 一次情報って言ってるんだが、本気で意味わからないのか?
紙の方がはるかに視認性が高いよ wwwでトロトロ検索閲覧するより、ずっと楽
まぁ、K&R引きながらコーディングしてる奴は信用できないのは確かだ。
822 :
デフォルトの名無しさん :04/11/18 20:31:12
>>820 www って誰が言い出したんだ?
相次ぐ金融系のシステムトラブルはもしかして
1人のアフォに業界全体が振り回されている痛い構図か?
また変なのが沸いたねw
質問です C言語はクリトリス言語の略ですか?
違うでし。おしっこしーしー言語でし
A B C D Z 言語までいくとあれか? 死姦とか?
829 :
デフォルトの名無しさん :04/11/18 21:38:49
自演乙
>>813 ブラウザの話ね。'\\'と書いたのは勇み足。
'\n'と書こうとして'\n'になったんでしょって話。
テメェら死ねや。wwwwwwwwwww ww wwwww w wwwwwwwwww www wwww wwwww
832 :
デフォルトの名無しさん :04/11/18 21:58:05
… while(fscanf(fp, "%c", c)==1){ printf("%c", c); } … 途中にfscanfがあるのですが、whileを抜けません。ファイルの終わりまで来ても 1を返し続けているようです。ファイルの終わりでwhileを抜けるにはどうしたらよい ですか?
while(fscanf(fp, "%c", c) != EOF) じゃダメかい?
その前にfscanf(fp, "%c", &c)の間違いじゃないか? それに欲を言えば(f)getc/putcharにしろ。
835 :
デフォルトの名無しさん :04/11/18 22:17:01
>ブラウザの話ね。 プ 某に毒されてるだけだって 正直に言えよ、ホモ野郎w
なんかしらんが、\nという表記を知った人が偉そうにしてるようです。 半可通ほど居丈高の法則ですな。
837 :
デフォルトの名無しさん :04/11/18 22:26:59
ウホな香具師ほどホモと言われると必死こくなw
○ 0 | 1○\ | \ 2 ○―○3 上図のように、任意の数のノード数がランダムにリンク(1がリンクしている状態) するネットワークである始点から終点までの経路長を求めたい。 例えば、0が始点だったら1は経路長1、2と3は経路長2。 ランダムなネットワークの図を配列とfor文を用いて |0123 ―+―――― 0|―100 1|1―11 2|01―1 3|011― という具合に生成することはできたんですけど、 肝心の経路長を求める部分がわかりません。
839 :
デフォルトの名無しさん :04/11/18 22:33:39
からしレンコンと言われたオヴァヴァの本音と建て前
>>838 それは、終点ノードまでの最短の経路長ってことでいいのかな?
841 :
838 :04/11/18 22:59:07
>>840 そうです。
無限ループで値が割り振られていない隣り合うノードに1、2…と値を割り振っていって
最終的に割り振るノードが無くなったら終了すればいけると思うんですけど…
ネットワーク図のコピーをとって、値を割り振ったノードへのリンクを消していく(1を0にする)
既に値が入っている場合は無視する部分のアルゴリズムをプログラムで表現するのが
かなり難しいです…
トリップつけるべきだった…
>>843 全ノードを辿ることが出来てるなら、その時点で経路長は分かってるはずだが
そんなことは分かってるんですよ。もうあなたには答えていただかなくて結構です! ごちゃごちゃやってんと、プログラム自体晒せや。
846 :
デフォルトの名無しさん :04/11/18 23:15:00
>>843 つーか、別にマルチでもいいんだよ
あなたがどこで何を聞こうが、それはあなたの主権だし
色んな人に聞いて回るのは聞き込み調査の基本だよ
収穫があってもなくても会釈くらいしろって話に過熱したバカガキが
マルチ=無礼者の判断基準を勝手に制定したがっているだけ
バカガキの必死=自演の大合唱
これのほうが説得力ありすぎるのはみんなわかってる
とりあえずダイクストラ法でいいんじゃない?
844=845=846
849 :
デフォルトの名無しさん :04/11/18 23:21:31
842=848
848=849
851 :
デフォルトの名無しさん :04/11/18 23:24:13
849=304
852 :
デフォルトの名無しさん :04/11/18 23:25:30
(・∀・)ニヤニヤ
853 :
デフォルトの名無しさん :04/11/18 23:32:58
(`_ヽ´) wwwwwwwwww
前に出た問題と同じじゃないか。 既出も既出、大既出だよ。
855 :
デフォルトの名無しさん :04/11/18 23:37:01
857 :
デフォルトの名無しさん :04/11/19 00:00:20
既出既出とうるさいキモヲタは臭いデブ
858 :
デフォルトの名無しさん :04/11/19 00:01:04
c言語初心者です。 関数内で配列Aを逆順した配列Bを作るにはどうすれば良いですか?
859 :
838 ◆e.FqsY.OU2 :04/11/19 00:02:17
ご迷惑をおかけして申し訳ございません…
トリップつけました。
>>844 経路長は辿っていけば分かるんですけど、
最短経路長を出すのに
無限ループ(隣のノードが無くなるまで){
隣のノードに経路長を記録
隣のノード番号を配列に記録
}
>>847 ダイクストラ法も調べたんですけど、
ランダムに生成されるネットワークである点と
向きが無い点、リンクの長さが均一な点が違いまして…
参考にはなったんですけど。
なんだか自分のこと良くわかってない人が粘着しています
861 :
838 ◆e.FqsY.OU2 :04/11/19 00:05:18
>>844 経路長は辿っていけば分かるんですけど、
最短経路長を出すのが上手くいかなくて…
無限ループ(隣のノードが無くなるまで){
隣のノードに経路長を記録
隣のノード番号を配列に記録
}
とやればうまくできそうなんですけど…
キモヲタデブというイメージはキモヲタどもが自分はヲタではないと自らを納得させるために作り出した幻影に過ぎず 大部分のヲタは実際にはデブではない。
>>861 始点からノードnまでの最短経路をa[n]とすると、
各ノード(仮にk)について、周辺ノード(仮にm1, m2…mn)との関係は
a[k] = min(a[m1], a[m2]…,a[mn]) + 1
この関係をそのまま再帰関数にすればいいのでは
864 :
デフォルトの名無しさん :04/11/19 00:33:54
すいません、ど初心者なんですが、書式制御文字の%fと%lfの違いは何でしょうか? よろしくお願いします。
floatとdouble
>>861 0、1とかをノードと名付けたとして、ノードを結ぶ線に番号つけて、
その番号の順列組み合わせをしていったらどうかね。
その順列組み合わせのうち
・始点または終点がノードを共有してないもの
・これまでに出てきたもの
を最初に省いちゃう。線の数が距離ね。
順次計算していって、えーと終了条件が問題っすね。
線の数に等しくなったら終了なのは明らかだけど、
それ以前に終わる条件があるようなきもする。
AからBへの距離を求めるには。 Aに隣接する点をマークする(距離1)。 距離1に隣接し、かつまだマークされていない点をマークする(距離2)。 以下Bに到達するまで。 Aからだけ行うよりも、 AとB両方から歩み寄るほうが速い事が期待できる。
文字配列(例:char a[20])の中身を全て空にする関数とかないでしょうか?
>>868 memsetを使う
完全に文字列としてしか使わないならa[0]='\0';でも見かけ上は同じだが
「空」とはどういう状態のことを言うのか定義せよ。 とりあえず、文字配列てことだから、 void strclear(char *s) { *s = '\0'; } でどうだ。
お二人ともレスありがとうございます。 空にする時に文字配列の一つ一つに'\0'を入れていたのですが、'\0'が反映されてないのか配列に数字が残ってる事があったもので… とりあえずmemsetを使ってみたところきちんとできました。念のため確認したいのですが、char型のa[20]を初期化する場合、 memset( a , 0 , 99 * sizeof(char) ); で大丈夫でしょうか?
99→20だった…度々すみませんorz
'\0'が反映されてないのか配列に数字が残って '\0'が反映されてないのか配列に数字が残って '\0'が反映されてないのか配列に数字が残って '\0'が反映されてないのか配列に数字が残って '\0'が反映されてないのか配列に数字が残って
>>871 99→20で一応正解。ただ、規格によりsizeof(char)はつねに1なので、省略してもOK
#これは場合にもよる。趣味とかコーディングルールとか。
aが確実に配列なのであれば、
memset(a, 0, sizeof(a));
のほうがいいかも。
>>874 いつも思うんだけど、
sizeof( T[N] )==sizeof( T )*N って、保証されてるんだっけ?
これが強制されると配列内にコントロールデータを埋め込むことが出来なくなるよね。
(実際に埋め込んでるコンパイラは見たこと無いけど)
かといってこれが保証されてないと
N = sizeof( array )/sizeof( array[0] ) が軒並み破綻するわけだけど。
876 :
デフォルトの名無しさん :04/11/19 02:18:43
コントロールデータって何?
なんかデバッグ情報とかさ。
>>877 うーん、コントロールデータがわからん。もうちょっと詳しく。
ただ、少なくとも
sometype A[N];
という、sometype型の配列があったときは
sizeof(A) == sizeof(sometype) * N
が真になることは保証されてる。
879 :
デフォルトの名無しさん :04/11/19 02:27:05
誰が保証してくれたの?
ANSIじゃない?
確かANSIのsizeofのExampleの所にも 配列の要素数を求めるのに使える てな例が載ってたな
ただし関数に配列を渡すとポインタと同じ扱いになるので要注意 と釘を刺してみる
前回のリターン入力から今回のリターン入力までの 経過時間を測定する関数を作りたい scanfを利用して、文字か整数かの入力待ちでなら作れそうなんですけど どうやってリターンの入力待ちを行うのでしょうか
getchar();
('A`)ハハーナルホド ソクレスアリガトウ
ここって来てる人自体は少ないな、結構浮上してるから見に来たのだが、 ID無いのも相まって少数の人が必死に書いてる感じ。 特に高圧的な文体数人が目立つ、朝から晩まで筆まめだな仕事しろよ(w まぁこの業界の教えたがりは大抵居丈高だが
887 :
デフォルトの名無しさん :04/11/19 09:01:50
>>875 コントロールデータ埋め込んで例えば何がしたいの?
実行時 sizeof ならコントロールデータをカウントしない値を返せばいいし
配列と称して実はリストとか言い出すと、連続領域ではなくなるわけで
サイズはと訊かれても答えようがなかったりするよな
ちなみに sizeof array / sizeof array[0] は規格票の文中でも使ってるぞ
どこだって教えたがりは大抵居丈高だよ・・・・自尊心のかたまりだから
>>886 どこかで苛められたのかい?可哀相に。ヨシヨシ
リアルで無能だと教えるのもうっとうしくなるからなあ
俺の経験上、居丈高に教えてるのは初心者に2,3本毛が生えたやつらだよ。 多少分かるようになった初心者は、お前こんなのも分からないのかよと馬鹿にしつつ自分の知識をひけらかしたくなる。 もう少しすると興味が無くなるのでROMるかスレ自体からいったん離れる。 さらにもう少しすると煽りに徹するようになる。答えは書かない。ピンポイントでヒントだけ教えてやる。 安易に答えを教えてしまうと質問者のためにならないから。 さらにもう少しすると再びROMる。 すっかり古参と化した彼らはスレと住人たちのの成長を生温かく見守るようになる。
神の如く、か。
>>887 >sizeof array / sizeof array[0]
俺はいつも numberof って名前でマクロ書いてる。
つか、どうせなら標準マクロにしてくれればよかったのに。
// offsetof は標準化されてるのになあ…
>>さらにもう少しすると煽りに徹するようになる。答えは書かない。ピンポイントでヒントだけ教えてやる。 俺ここ
896 :
デフォルトの名無しさん :04/11/19 11:55:58
886は馬鹿。 895は大馬鹿。
899 :
デフォルトの名無しさん :04/11/19 13:31:42
激しく同電位
900 :
タヌキ :04/11/19 14:45:43
激しく同位体
そういえばAAA!CAFEの管理人okkakii元気かな?
激しくどうでもいい
fread で、EOF の場合でも読み込めたバイト数知りたいのですが、 なにか手はあるのでしょか。 それとも fread が無理だとして、簡易な別の手段とか。
?
>>905 freadは読み込めた個数を返すよ。EOFは返さない。
>707の気持ちは分かるけど、書き込んだのは間違い。 >708は存在する意味が分からない。
>904 スルーできない理由は何?
奇特な方がいたら教えてください。 C言語で作成したプログラムをVC++でコンパイルして実行ファイルだけ抜き出す。 実行ファイル(exeファイル)だけから作製したプログラムを逆算することはできるのでしょうか? できないと思うのですが、それで正しいのでしょうか?
911 :
デフォルトの名無しさん :04/11/20 00:35:31
奇特な方がいたら教えてください。 C言語で作成したプログラムをVC++でコンパイルして実行ファイルだけ抜き出す。 実行ファイル(exeファイル)だけから作製したプログラムを逆算することはできるのでしょうか? できないと思うのですが、それで正しいのでしょうか?
危篤ですので答えてあげる余裕がありません
奇特な方がいたら教えてください。 C言語で作成したプログラムをVC++でコンパイルして実行ファイルだけ抜き出す。 実行ファイル(exeファイル)だけから作製したプログラムを逆算することはできるのでしょうか? できないと思うのですが、それで正しいのでしょうか?
914 :
デフォルトの名無しさん :04/11/20 00:43:51
>>911 できない。
Releaseビルドされたものは
dumpbin /disasm kusosure.exe
で逆アセンブルまではできるが逆コンパイルは
シンボルファイルがないと無理
>>914 Oh!産休!
やはりできないのですね。
じゃ、例えばWindowsとかのプログラムがCD-ROMから読み取ることができるなんてもなしですね。
いや、だからプログラムそのものは読み取れるけれども、それから ソースファイルを再現することはほぼ不可能と言っているのだよ。
.NETやJAVAみたく中間言語挟んでるやつは可能だけどな
下のはテキストファイルの中身を行単位でランダムに並べ替えるプログラムなんですがエラーがでます。指摘・アドバイスお願いします. void shuffle(){ char mozi[50][50],mozi2[50]; //ファイルの中身は50文字*50行と仮定 int kazu,kazu2,loop; FILE *fp; fp = fopen("test.txt" , "r"); //ファイルを開く //ファイルから読み込む for(loop=0;loop<50;loop++){ fgets( mozi[loop] , 50 , fp); } //ファイルを閉じる fclose(fp); fp = fopen("test.txt", "w"); //ファイルを開く //ランダムに並べ替える for(loop=0;loop<20;loop++){ kazu = GetRand(50); //GetRand(50)で0〜50の間で乱数を取得 kazu2 = GetRand(50); strcpy(mozi2 , mozi[kazu]); strcpy(mozi[kazu] , mozi[kazu2]); strcpy(mozi[kazu2] , mozi2); } //ファイルへ書き込み for(loop=0;loop<50;loop++){ fputs(mozi[loop] , fp); } //ファイルを閉じる fclose(fp); }
>>918 どこでどんなエラーが出るか書け!クソめ!
> char mozi[50][50],mozi2[50]; //ファイルの中身は50文字*50行と仮定 >kazu = GetRand(50); //GetRand(50)で0〜50の間で乱数を取得 >kazu2 = GetRand(50); ここぢゃね?
すいません。35行目でエラーがでます。
35行目ってどこよ? 質問の仕方すら分かんねーのか?
エラーメッセージは、 「test.exe の 0xcccccccc で初回の例外が発生しました : 0xC0000005: 場所 0xcccccccc を読み込み中にアクセス違反が発生しました」 「test.exe の 0xcccccccc でハンドルされていない例外が発生しました : 0xC0000005: 場所 0xcccccccc を読み込み中にアクセス違反が発生しました。」 の二つが出ていて具体的な場所は表示されてませんでした。
GetRandが50を返してるんじゃね?
空行入れても30行しかないわけだが
>>920 のとこじゃね?
GetRandはライブラリの関数なんでそっちの方も覗いてみます 。レスくださった方々ありがとうございます。
>なんでそっちの方も覗いてみます ...いや、そっちぢゃねーだろ >GetRandが50を返してるんじゃね? って読めてる?
928 :
デフォルトの名無しさん :04/11/20 06:57:15
age
#include<stdio.h> main() { int i; for(i=0;i<10000;i++){ printf(゙ヌルポ\n゙); } }
930 :
デフォルトの名無しさん :04/11/20 11:06:32
Cって文字列をreturnできないの?
931 :
デフォルトの名無しさん :04/11/20 11:18:26
>>930 できるよ
const char *fusianasan(void)
{
return "mojiretu";
}
問題はやった奴が何が起きるのかを理解しているかであって
言語の不備じゃない
932 :
java to c :04/11/20 11:31:17
>>931 ありがとう。
参照を返せるってことですね
C++ならオブジェクトを使って std::string fusianasan() { std::string str; str = "mojiretu"; return str; }
934 :
デフォルトの名無しさん :04/11/20 11:55:31
>>933 スレ違い
struct string
{
char mojiretu[256];
};
struct string fusianasan(void)
{
struct string kusosure = { "sine" };
return kusosure;
}
935 :
デフォルトの名無しさん :04/11/20 12:11:42
スタティックリンクライブラリって単なるobj?
>>935 別物。拡張子は *.lib とか。複数の *.obj をいい感じに連結してある。
と言っても、リンカに渡すときは殊更 *.obj と *.lib を区別する必要もない。
なるほどです