C言語なら俺に聞け! Part 94

このエントリーをはてなブックマークに追加
1v(^o^i)d●v(^o^i)d●v(^o^i)d
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 93
http://pc5.2ch.net/test/read.cgi/tech/1098007606/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:04/10/31 17:48:24
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
3デフォルトの名無しさん:04/10/31 17:49:11
【FAQ】
プログラム終了時にはfree()をちゃんとすること。
4デフォルトの名無しさん:04/10/31 17:51:48
新スレ乙
5デフォルトの名無しさん:04/10/31 17:51:57
>>3
そんなネタはいらないんだよ
6デフォルトの名無しさん:04/10/31 18:04:53
続きをやるぞ。age!
7大原ゆき:04/10/31 18:05:26
うんざりなんだけど
8デフォルトの名無しさん:04/10/31 18:05:38
OSとかで解放してくれない時は自分でfreeしてください。
9デフォルトの名無しさん:04/10/31 18:06:05
続きは俺俺でやってください。
10大原ゆき:04/10/31 18:06:41
そうだ、俺俺があったんだ…
すっかり忘れてた
11デフォルトの名無しさん:04/10/31 18:07:24
とりあえず、freeがいらないといっている奴は、
C言語の規格書からプログラム終了時にOS依存ではなく、
C言語として必ずメモリが解放されると記述している場所を示せ。
12大原ゆき:04/10/31 18:08:13
下らない論争はここでやってください

C言語なら俺俺に聞け! Part 87
http://pc5.2ch.net/test/read.cgi/tech/1090652323/
13デフォルトの名無しさん:04/10/31 18:08:15
HP-●Xが昔
void free(void *ptr) { return; }
だったという話を風の噂に聞いたことある。真偽のほどは確かめていない。
14デフォルトの名無しさん:04/10/31 18:09:33
とりあえず、freeがいるといっている奴は、
OSの規格書からプログラム終了時にプログラム依存ではなく、
OSとして必ずメモリが解放されるとは限らないと記述している場所を示せ。
15大原ゆき:04/10/31 18:10:45
>>14
もうこないでよ、あっちいってよ
斯く言う私はfree必要派
16デフォルトの名無しさん:04/10/31 18:39:31
OSの規格書があるなんて初耳だなw
17デフォルトの名無しさん:04/10/31 20:37:30
>>16
開発元が作ってればあるんじゃない?w
手に入るかは別として
18デフォルトの名無しさん:04/10/31 20:58:23
>>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しないといけない」環境なんてのを
もちだすのがぼけ
21デフォルトの名無しさん:04/10/31 22:00:30
いちおうCの規格ではfreeしろ。絶対しろよな。とは
規定してないみたいだよ。
ttp://www2s.biglobe.ne.jp/~hig/q_a/Programing_QA03.html#Q2
22デフォルトの名無しさん:04/10/31 22:06:20
だから、終了前に絶対freeしろも、freeするなも極端すぎなんだって。
いいじゃん、別にどっちでも。
まともじゃないOSを相手にする時だけに気をつければ。

free不要論みたいなバカ論ならともかく、議論する内情じゃないよ。
23デフォルトの名無しさん:04/10/31 22:06:40
変な家庭だな。
24デフォルトの名無しさん:04/10/31 22:07:32
×内情
○内容
25デフォルトの名無しさん:04/10/31 22:09:23
必要なfree()はしたほうがジェントルメンだと思うけど。。。
その程度のことなんじゃないのか?
シルバーシートで席譲るみたいな、マナーっつうか。
26デフォルトの名無しさん:04/10/31 22:10:39
下らない論争はここでやってください

C言語なら俺俺に聞け! Part 87
http://pc5.2ch.net/test/read.cgi/tech/1090652323/
27デフォルトの名無しさん:04/10/31 22:13:14
>>18
終了しないプログラムでmallocしなければ
メモリリークしない、ということは少なくとも真理です。
28デフォルトの名無しさん:04/10/31 22:28:27
>>21
つまり、プログラムの終了時にメモリが必ず解放されるとは
書いていないということですね。
29デフォルトの名無しさん:04/10/31 22:29:49
mallocして独自メモリ確保ルーチンを呼べばいいじゃない
30デフォルトの名無しさん:04/10/31 22:32:00
書いていない=未定義。
未定義なのだからより安全なほうを選ぶのが
常識でありマナーというものでしょう。
31デフォルトの名無しさん:04/10/31 22:40:59
> 極端すぎなんだって。
> いいじゃん、別にどっちでも。

あ、つごう悪くなってきたのでごまかしモードだな? ;-)
32デフォルトの名無しさん:04/10/31 22:41:34
> つまり、プログラムの終了時にメモリが必ず解放されるとは
> 書いていないということですね。

そもそもmallocしたらメモリーがかならず確保されるとも書いてないぞ?
33デフォルトの名無しさん:04/10/31 22:42:14
> 必要なfree()はしたほうがジェントルメンだと思うけど

じゃあ終了時はしないのね。
34デフォルトの名無しさん:04/10/31 22:45:21
Ctrl-Cシグナル等を受けたときでも行儀よくfreeしないといけないの?
35デフォルトの名無しさん:04/10/31 22:50:30
このスレ暫く封印…と。〆(。。
36デフォルトの名無しさん:04/10/31 22:58:06
>>34
CTRL-Cシグナルなんてものは、そもそもC言語の範囲外です。
C言語の範囲外は範囲外。C言語の範囲内はC言語でやりましょう。
もちろんmalloc、freeはC言語の範囲内なのでC言語でね。
37デフォルトの名無しさん:04/10/31 22:58:23
>>34
どうせ他のリソースも解放しないといけないんだから、ついでにfreeしとけ。
38デフォルトの名無しさん:04/10/31 22:59:10
>>33
大抵しないけど、自己満足的にするときもある。
気分によりけり。
39デフォルトの名無しさん:04/10/31 23:00:49
カーニハンやリッチーはどこまでfreeしてたんだろうね?
歴史学的見地をしりたいな。
40デフォルトの名無しさん:04/10/31 23:11:18
こういうコードはしばしば書いた。
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()してない。
41デフォルトの名無しさん:04/10/31 23:22:48
Cで書くときはあまり真面目にfreeして終了しないが
VBで書くときはかなり几帳面にset obj = nothingして終了している。
そんな自分がよく分からない。。。
42デフォルトの名無しさん:04/10/31 23:30:02
>>40
私ならsFooを関数外に出して、if (sFoo) free(sFoo)する関数をinitFoo()でatexit()に登録するなぁ。
43デフォルトの名無しさん:04/10/31 23:36:03
なんでネタスレになってるんだ?
ここは初心者の集まりかよ。
44デフォルトの名無しさん:04/10/31 23:58:25
一般的な OS ならプロセスごと消滅するわけで
free() する必要などこれっぽっちもない。
そもそも、標準 C の範疇を越えている以上、スレ違い。
45デフォルトの名無しさん:04/11/01 00:01:03
>>43
変なのが前スレから粘着しているんだ。
スルーお願いします。
46デフォルトの名無しさん:04/11/01 00:06:06
>>43
もともとCについてぐだぐだ語るスレだ。
気にするな。
47デフォルトの名無しさん:04/11/01 00:09:55
voidなのかvoid信者なのかしらんが、
あんなプログラマとして終わっちゃった人の相手してどうすんのよ。
おれの中では石田晴久並に過去の人。
48デフォルトの名無しさん:04/11/01 00:43:01
石田晴久はプログラマですらない
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です。
54デフォルトの名無しさん:04/11/01 01:42:06
Unixが終了する時はfreeいらないと思うけど、アプリが終了する時にはどうなん?
55デフォルトの名無しさん:04/11/01 01:45:52
逆に
オレはいかなる時でもfree書いているぜ
という人はいるのか?
56デフォルトの名無しさん:04/11/01 01:46:39
free(>>55);
57デフォルトの名無しさん:04/11/01 01:51:38
>>51
べつにー、過去にどうだったか関係なく、過去の人。
58デフォルトの名無しさん:04/11/01 02:25:39
> Unixが終了する時はfreeいらないと思うけど、アプリが終了する時にはどうなん?

だーかーらー Unixの/binや/usr/bin の下にあるこまんとも彼らがかいたのは多いのよ?
59デフォルトの名無しさん:04/11/01 02:28:44
60デフォルトの名無しさん:04/11/01 02:33:05
「過去にしたい」人なのね。
61デフォルトの名無しさん:04/11/01 02:33:25
↑過去のひとだと思いたい!
62デフォルトの名無しさん:04/11/01 02:33:42
>>58
自分達でカーネルソースまで管理できるシステムだからこそできることだね。
63デフォルトの名無しさん:04/11/01 02:34:18
っていうか、自分たちでCの文法まできめたんだろうが...
64デフォルトの名無しさん:04/11/01 02:48:03
>>60
気にするなよ
65デフォルトの名無しさん:04/11/01 02:51:56
なんでおまえらそんなにvoidをこわがるんだよ!
こわくねーだろ?
66デフォルトの名無しさん:04/11/01 02:54:47
free()してる最中にシグナル届いてハンドラに飛ばされるとどうなるんだろうね?
興味深い。
67デフォルトの名無しさん:04/11/01 03:03:54
だからfreeするな
68rubykitch!!!!!!!:04/11/01 03:04:22




おなじみ、エキサイトhttp://www.excite.co.jp/world/english/で
「shit」と入力し和訳にかけてみてください。恐らく予想通りの結果が得られます。
それでは次に「shit!」とエクスクラメーションマークを一つ足してください。
予想もしなかった大変な事態になるはずです。
が、それは気にせずにエクスクラメーションマークを足していきましょう。
4つ目で少し不思議なことになりますが。
無事5つ目までつけ終えれば今回の実験は終了です。


.
69デフォルトの名無しさん:04/11/01 03:07:26
>だからfreeするな
だよね。
70デフォルトの名無しさん:04/11/01 03:38:31
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)。
72デフォルトの名無しさん:04/11/01 03:54:15
>>65
何で気にするの?
73デフォルトの名無しさん:04/11/01 04:04:41
>>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
参考になりましたありがとうございます。
ちなみにこれ今やってる大学入試問題です。携帯電話の英文入力インターフェースを作ってるんですが
理解に苦しんです。カンニングにならないのか?という意見もでそうですが
情報収集能力もテストのいっかんですので大丈夫ぽいです。
75デフォルトの名無しさん:04/11/01 07:51:08
マルチすんなボケ
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のバグなのでしょうか。
真剣に悩んでます。ご指南よろしくお願い致します。
77デフォルトの名無しさん:04/11/01 11:39:15
>>76
お前が悪い
コンパイラのせいにするな
78デフォルトの名無しさん:04/11/01 11:39:23
条件式の書き方の問題
A > big1 > big2 とは書けない
A > big1 && big1 > big2 と書かないといけない
以下同
79デフォルトの名無しさん:04/11/01 11:51:07
>>77やっぱりそうでしたか。ありがとうございます。
>>78あ、そうだったんですか。今まで知りませんでした。
こんなくだらない質問にお答えくださって本当に感謝します。
ありがとうございました。
80デフォルトの名無しさん:04/11/01 13:24:29
特定の文字を区切り文字として、for文で順番に文字列が取り出せる
ように分割してくれる関数は、どんなものがありますか?
81デフォルトの名無しさん:04/11/01 13:26:14
strtok
82デフォルトの名無しさん:04/11/01 13:28:12
>>81
ありがとうございます。m(_ _)m
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

どなたかご教授お願いいたします。
84デフォルトの名無しさん:04/11/01 16:26:13
>undefined reference to `main'
mainが無い
85デフォルトの名無しさん:04/11/01 16:42:38
>>83
最低限 main() が必要だって理解できてなくて、
自分がコンパイルではなくリンクしていることも解ってなくて、
エラーメッセージの英文も読めなくて、
トドメに日本語まで間違うって…
86デフォルトの名無しさん:04/11/01 16:46:50
2chの質問者に何も期待してはいけないであーーる
87デフォルトの名無しさん:04/11/01 18:57:54
「:」で区切られたデータを scanf で受け取るにはどうしたら良いでしょうか?
例えば、
char s[ 128 ];
int n;
scanf( ???, s, &n );

PM:7
と入力したとき、s に"PM", n に 7 が入るようにしたいんですが…
88デフォルトの名無しさん:04/11/01 19:14:50
へたれ
89デフォルトの名無しさん:04/11/01 21:00:42
>>87
"%[^:]:%d"
90デフォルトの名無しさん:04/11/01 23:57:48
ちょっとお聞きしたいのですが、C言語の既存の
関数からで.midiの再生って可能ですか?
.wavの再生にはPlaySound関数を使ってるのですがwavはファイルサイズ
が大きすぎて人に渡すプログラムを作るときに困ってしまいます。
もし再生する方法をどなたかご存じでしたらお願いします。
91デフォルトの名無しさん:04/11/02 00:01:00
92デフォルトの名無しさん:04/11/02 00:07:34
>>90
windowsサウンドプログラミングという書籍を買ってください。
そして、PlaySoundはC言語の既存の関数ではありません。
MidiはPlaySoundのようにファイル名を指定しただけで再生する
Win32APIはありません。
9390:04/11/02 00:08:30
91>>頭悪そうな発言スレを勧められるとは・・・
とりあえずサンクス
94デフォルトの名無しさん:04/11/02 00:25:11
92>>そうなんですか。ってことはデバイスをオープンとか
何とかとか長く書くような真似をしないと駄目なんですね・・。
今度書店で見つけたら買ってみます。ありがとうございました。
95デフォルトの名無しさん:04/11/02 00:43:08
fopenでNULLが返ってきた時に
何故ファイルが開けなかったか知るにはどうしたらいいですか?
96デフォルトの名無しさん:04/11/02 00:47:09
>>95
errnoがあるだろ
strerror
98デフォルトの名無しさん:04/11/02 00:52:56
>>87-89
バッファーオーバーランする罠
99デフォルトの名無しさん:04/11/02 01:11:03
MCI関連でなかったっけ>midi
100デフォルトの名無しさん:04/11/02 01:25:45
>>94
サウンドプログラミング2
http://pc5.2ch.net/test/read.cgi/tech/1091054082/l50
101デフォルトの名無しさん:04/11/02 01:33:57
>>100
そのスレは94の質問内容のようなスレではない
102デフォルトの名無しさん:04/11/02 03:44:32
>>89
ありがとうございます
しかし二回以上連続で scanf した時に、s の先頭に改行が入ってしまうのですが…
これは未定義ながら fflush( stdin ) するしかないのでしょうか…?
103102:04/11/02 03:54:47
* というのがあったので
"%[^:]:%lu%*c"
として最後の改行を読み飛ばすようにしたらうまくいきました。
ありがとうございました
104デフォルトの名無しさん:04/11/02 13:47:36
>>103
そうまでして scanf() 系を使わないといけない理由が知りたい。
105デフォルトの名無しさん:04/11/02 14:28:23
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の方で参照できる
方法はあれば、教えて下さい。
106デフォルトの名無しさん:04/11/02 15:28:25
>>105
故意犯?
>>1
>まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
こっち池
★初心者にVisual C++を教えるスレ★ Part15
http://pc5.2ch.net/test/read.cgi/tech/1097880265/
107デフォルトの名無しさん:04/11/02 16:06:29
つーかマルチ?
108デフォルトの名無しさん:04/11/02 16:14:18
>>105-106
コンソールアプリならこっち
迷惑だからVC++スレには絶対来るな

【初心者歓迎】C/C++室 Ver.11【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1099190154/l50
109105:04/11/02 16:27:18
>>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; では駄目なの?
113デフォルトの名無しさん:04/11/02 22:19:14
>>112
CとC++の区別がつくようになってから来い
114デフォルトの名無しさん:04/11/02 22:22:56
>>112
EffectiveC++ P.44参照
115デフォルトの名無しさん:04/11/02 22:33:47
どうして BCD なんか使うのですか? わけわかんない。
116デフォルトの名無しさん:04/11/02 22:39:32
『組込み開発者におくるMISRA-C―組込みプログラミングの高信頼化ガイド』
↑を読んだ時の疑問なんですが、

i = 3;
i = i++;

この場合、
2行目の代入と増分の副作用完了点の順序が処理系依存になるので
最終的なiの値も処理系依存になるのは分かるんですけど、

i = 3;
i = ++i;

の場合がよく分かりません。
iの値の参照前に増分するので最終的なiは4でいいのかと思ったんですけど、
これも処理系依存になると上記の本では解説されてました。
117デフォルトの名無しさん:04/11/02 22:42:40
愛がいつまでも続くと思うな
118デフォルトの名無しさん:04/11/02 22:44:51
>>116
誤りですね。i = ++i; は大丈夫です。
119デフォルトの名無しさん:04/11/02 22:49:58
char c[10] とか char c[128] とか。
なんでいつも適当な確保なのですか?
120デフォルトの名無しさん:04/11/02 22:55:17
適当には二つの意味がある!
121デフォルトの名無しさん:04/11/02 22:58:35
128が中途半端だと感じてるんだろ
122大原ゆき ◆6iqfpMYUkI :04/11/02 23:05:59
>>119
貴方の質問から何を聞きたいのかを想像して答えますが、
例えば、cが入力用のバッファとして使われる場合、人が何文字入力するか、
なんていうことは予め判りませんよね。
だから、とりあえず入力される数としてあり得る範囲を確保し、
それ以上の要素を入力しても、配列に納める分以上は納めないようにする処理
を書いてあげないといけません。
例えば、フーリェ変換用のバッファとして使う場合などの特定用途では確保する
要素数は初めから判っているので、プログラム中で使われる配列の要素数が最小
になるように勤めるとより良いです。
123デフォルトの名無しさん:04/11/02 23:06:16
>>121
そうです。
124デフォルトの名無しさん:04/11/02 23:09:41
いいえ、適当ではありません。
128には意味があります。
125デフォルトの名無しさん:04/11/02 23:09:44
>>122
どうもありがとうございます。あまり確保しすぎてもいけないと
も聞いたのですですが、どのぐらいまでなら確保してもよいのですか?
126大原ゆき ◆6iqfpMYUkI :04/11/02 23:10:22
>>123
例えば、フーリェ変換(計算機では普通FFT)だと2の倍数にしないとできません。
2の倍数というのはわりとよく出てきますよ。
127デフォルトの名無しさん:04/11/02 23:11:02
友人に #define は問題があるから C では enum 使えと言われたのですが本当でしょうか…?
例えばこんな感じで

×#define 1 A
○enum { A = 1 };
128大原ゆき ◆6iqfpMYUkI :04/11/02 23:11:11
>>125
場合によります。
129デフォルトの名無しさん:04/11/02 23:12:48
>>127
問題があるのは、あなた使い方の方です
130デフォルトの名無しさん:04/11/02 23:13:26
わらた
131127:04/11/02 23:14:25
- #define 1 A
+ #define A 1

お恥ずかしい…
132116:04/11/02 23:17:48
>>118
やはり前置増分演算子の場合は問題ないんですね。
ありがとうございました。
133大原ゆき ◆6iqfpMYUkI :04/11/02 23:19:45
>>127
defineはエラーがあってもコンパイル時にエラーとして検出できませんし、
フラグの値を設定したいときのような場合、値の数が極端に多いと、
ユニークな数を果して割り当てられたかどうかを確かめるのは困難です。
例えば、
#define PI 3.44
という定義があったとして、これを使ったコードにエラーがあったとき、
エラーメッセージにPIという文字は見ることができません。
3.44という良く解からない数字として表れるのです。
書いた人はたぶんπのつもりだったのでしょうが、あいにくπは3.14…です。
134デフォルトの名無しさん:04/11/02 23:22:38
>>133
毎回毎回長文&駄文はネタなの
135大原ゆき ◆6iqfpMYUkI :04/11/02 23:24:23
>>127
一般的にC++ではdefineはなるべく使うべきではありません。
幸運な事に、代わりに使える機能がいくつか用意されました。
Cでdefineとして書いていたものはtemplate、inline関数、const定数
として置き換え可能です。
enumはユニークな数を割り振りたいときや、const定数をクラス内部で初期値設定
できない時などに使うと良いでしょう。
定数を宣言するときは大抵const定数で良いでしょうね。
136デフォルトの名無しさん:04/11/02 23:26:48
なるほどそういうことだったんですか。
ということは友人の主張は正しかったんですね。

分かりやすい説明ありがとうございました
137デフォルトの名無しさん:04/11/03 00:01:26
>>134
#define と enum 比較するのに実数持ち出したり
C スレでいきなり C++ の話を始めたりするんだから
ネタでなけりゃ頭の不自由な人でしょ。
138デフォルトの名無しさん:04/11/03 00:38:49
> 128には意味があります。

人間の遺伝子的には127歳まで生きるようにできてるんだよね。
仕様では。
139大原ゆき ◆6iqfpMYUkI :04/11/03 00:38:57
>>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とたいしてちがいないのよね。
せいぜい(重複した値がないようにできるぐらいの利点しかない。
143デフォルトの名無しさん:04/11/03 00:55:36
>>141
Cだからこそ、私はこんな感じで。
typedef enum {Foo1st, Foo2nd, Foo3rd, NofFoo} Foo_t;
for (i = 0; i < NofFoo; ++i) ;
144デフォルトの名無しさん:04/11/03 00:57:13
たんに「いちばんうしろ」にあるだけですよね?
なんかそれっていやですよね。
145デフォルトの名無しさん:04/11/03 00:57:38
>>142
他人の書いたインクルードファイルでシンボルが衝突した場合に発見が早い。
#まさか/usr/includeの下のインクルードファイルで名前が競合するとは思わなかったぞ。>Sun
146デフォルトの名無しさん:04/11/03 01:49:45
128が中途半端だという疑問に対し、純粋な答えが2の倍数
それをまったく関連性のない、かつ限定的な話のフーリエ変換持ってきたりして、意味不明

enumとdefineの話だって #define PI 3.44と記述ミスしてる時点で、
enumにしようが数値の記述ミスしたら計算結果は変わる

結局、どれも問いに対する答えになってないんだよね
147デフォルトの名無しさん:04/11/03 04:02:10
大学でプログラミングの授業落としてしまって、教授に「どうせテスト範囲の部分を理解か暗記しただけにすぎないんだろう。
それじゃいつまでたってもだめだよ。勉強法を変えろ!」と言われました。まぁ図星だったんですが、
C言語の勉強法ってなんですか?意味がわかりません。
あと、おすすめのC言語の参考書を教えて下さい。
148Rubykitch:04/11/03 04:05:35
で、また1から丸投げ、と。
149デフォルトの名無しさん:04/11/03 04:16:28
ぶるん、ぶるん、ぶるるるるん、
ふふふふーーーーぶるるるるるーーーーーー

おっぱい
150デフォルトの名無しさん:04/11/03 06:16:13
>>147
漏れは大学にはいってからプログラミング勉強しはじめたけど、
95点未満はとったことないな。

> C言語の勉強法ってなんですか?意味がわかりません。
とりあえずソースコードを打ちまくったらどうだろう?
漏れははじめのころはそんな感じだった。
たくさん打ち込んでいくうちのソースの内容が分かるようになっていった。

> あと、おすすめのC言語の参考書を教えて下さい。
んなもん人にきくものでは無いと思う。
実際に読んでみて自分に合う物を使えばいいわけだし。
本に頼らずともプログラミング入門系のWebページも数多くあるし。
漏れはC言語に関しては大学で教科書に使った本とWebだけかなぁ。
151デフォルトの名無しさん:04/11/03 07:52:26
enum が長くなって歩食う数行に渡るときはマクロのときみたいに
enum { A, B, C /* ... */,\
X, Y, Z };
って \ を行末に付けなきゃダメですか?
152デフォルトの名無しさん:04/11/03 07:55:35
エラーが起きたらダメ。
153デフォルトの名無しさん:04/11/03 10:15:25
> あと、おすすめのC言語の参考書を教えて下さい。

日下部先生の「作ってわかるCプログラミング」がいいよん。

> 漏れは大学にはいってからプログラミング勉強しはじめたけど

大学でプログラムつくりかたおしえるようなところはかなりダメ。
講義ではもっとメタな概念を教え、プログラミングは自分で勝手に覚えるのが大学生。
そんな技巧を直接教えるのは専門学校や工業高校の仕事だ。
154デフォルトの名無しさん:04/11/03 10:18:04
>>151
だめかどうかはやってみれば分かるだろ。
155デフォルトの名無しさん:04/11/03 10:20:15
そーいえば、行末の¥なんて使ったことないや・・・。
156デフォルトの名無しさん:04/11/03 10:23:50
はいはいそうですね。
157デフォルトの名無しさん:04/11/03 10:28:53
// 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
土曜日からはじめるのがぼけ
159デフォルトの名無しさん:04/11/03 10:58:13
>>157
Winのコードの一部だね
160デフォルトの名無しさん:04/11/03 11:01:08
enum {
dimanche,
lundi,
mardi,
mercredi,
jeudi,
vendredi,
samedi};
161デフォルトの名無しさん:04/11/03 11:02:08
誰一人として某ageにしましまでワラタ
162デフォルトの名無しさん:04/11/03 11:25:52
Vous voyez?
163デフォルトの名無しさん:04/11/03 13:34:47
enum dia
{
domingo, //ドミンゴ
lunes, //ルネス
martes, //マルテス
miercoles, //ミエルコレス
jueves, //フエベス
viernes, //ビエルネス
sabado, //サバド
};
164デフォルトの名無しさん:04/11/03 13:57:46
>>157
Days型ではなくenum Days型
165デフォルトの名無しさん:04/11/03 17:31:10
#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);}
166165:04/11/03 17:32:03
正しい答えが出ません。なにがいけないのかよく考えても分かりません
もしよかったらドコがいけないのか教えてください
167デフォルトの名無しさん:04/11/03 18:14:14
分かりません。
168デフォルトの名無しさん:04/11/03 18:54:41
>>165
>double f[]={5,9,4,-2,8,6,7,3,-12};
9個しかない。
169デフォルトの名無しさん:04/11/03 18:58:25
>>168
ありがとう
それでも答えがおかしいです・・・
170デフォルトの名無しさん:04/11/03 19:06:36
君はデバッグというものを知らないのか?
問題のある場所がわからないのであれば一行一行数値を調べりゃ済むだろ?
ましてやこんな小規模なプログラム、大して労力も掛からんだろうに
171デフォルトの名無しさん:04/11/03 19:10:53
わかりません。
172デフォルトの名無しさん:04/11/03 19:25:16
>>165
配列の添え字のつけ方を理解していない問題と、
Gaussの消去法の方法そのものを理解していない
問題の2つの問題があるのでがんばってください。
173デフォルトの名無しさん:04/11/03 19:40:31
はい
174デフォルトの名無しさん:04/11/03 21:53:36
テキストファイルが以下のようになっていたとして

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]にはテキストファイルの一行が読み込まれます

175デフォルトの名無しさん:04/11/03 22:26:11
>>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
ない
178デフォルトの名無しさん:04/11/03 22:30:59
mainの入り口で全部変換すれば、それほど手間でもないんじゃないか?
179デフォルトの名無しさん:04/11/03 22:34:14
やっぱり無いですか・・・。
全部変換することにします。
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;
}
181デフォルトの名無しさん:04/11/03 23:28:34
>>180
寧ろ間違っているのはbdimの方。
sizeof(double) はsizeof(double *)よりも大きい実装なのだろう。
182180:04/11/03 23:35:11
>>181
見落としていました。これで問題が解決できそうです。
ありがとうございます。
183デフォルトの名無しさん:04/11/03 23:46:26
>>182
老婆心ながら付け加えるけど、adimを埋めるには二重ループが必要なのは判っているよね?
184180:04/11/03 23:56:57
>>183
for(i=0; i<nm; ++i) {for(j=0; j<nm; ++j) {
adim[i][j] = 0;
}}
ということですよね?こちらは大丈夫です。
いろいろありがとうございます。
185174:04/11/03 23:57:49
>>175
できれば現在1バイト目なのか2バイト目なのかを判定する具体的な方法を
教えてくれると助かります。
186デフォルトの名無しさん:04/11/03 23:59:24
>>185
1バイト処理するごとにカウントアップしていけばいいやん。
187デフォルトの名無しさん:04/11/04 00:02:56
>>174
おまえらアフォか。
どう考えても「005B」の並びが現れるのは「[」のときだけだろ?
188デフォルトの名無しさん:04/11/04 00:03:27
>>185
着目するバイトの一つ前のバイトが
・1バイト文字か2バイト文字の2バイト目ならばそのバイトは1バイト文字か2バイト文字の1バイト目。
・2バイト文字の1バイト目ならばそのバイトは恐らく2バイト文字の2バイト目。
189デフォルトの名無しさん:04/11/04 02:56:03
質問です。
二次元配列の構造体って
struct a{

}bc[x][y];
じゃできないんですけど、どうしたらいいですか?
190デフォルトの名無しさん:04/11/04 02:58:18
>>189
今度はマルチかよ。
最低な奴だ。
191デフォルトの名無しさん:04/11/04 02:59:15
こっちじゃないのか〜!?
192デフォルトの名無しさん:04/11/04 03:02:18
>>189
一次元配列の構造体ならそういう風に作れるんですか?
193デフォルトの名無しさん:04/11/04 03:35:24
>>189
できるよ
194デフォルトの名無しさん:04/11/04 03:41:07
x, y が変数駄目なら定数にすればいい
195デフォルトの名無しさん:04/11/04 03:41:22
>>174
>AAAA はSJISの半角、全角の入り混じった文字列
>[ はUnicode 
なんつーバカなフォーマットなんだ、と思ったが
もしかして
  AAAA\0[BBBB\0]\t............\n
なんじゃないの?
196デフォルトの名無しさん:04/11/04 04:04:05
>>195
AAAA,BBBB を書き込むときに間違って後ろの\0 まで一緒に書き込んだのかw
197デフォルトの名無しさん:04/11/04 06:07:17
それなら、こうなってるんじゃないかな
AAAA\0[BBBB\0]\t............\0\n
198デフォルトの名無しさん:04/11/04 08:31:56
セパレータがNULな通信フォーマットとか。
199デフォルトの名無しさん:04/11/04 09:31:35
一次元配列ならこれでできるけど
struct a{

}bc[x];
二次元配列ならこれで、全体定義にならないんだよね。
C言語だよ
200デフォルトの名無しさん:04/11/04 09:34:56
#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に入れるプログラムなんですが・・・
201デフォルトの名無しさん:04/11/04 09:57:26
>200
二重のforループで何がしたいのか分からない。

>for(i=0;*(p+i-1)='\0';i++){
一番最初のループで、*(p - 1)とアクセスすることになるけど、それは良いこと?

>b[10]='\0';
char b[10]と宣言しているのに、b[10]を書き換えても大丈夫?
それに、'\0'は文字列の終端を示すコードだけど、
配列の終端を示すコードじゃないよね?
202デフォルトの名無しさん:04/11/04 10:05:48
struct a{

}(*bc)[x];
203デフォルトの名無しさん:04/11/04 10:11:29
#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);
}
204デフォルトの名無しさん:04/11/04 10:25:43
なんか色々ミスってるし・・・

b[10]云々は消したはずなのに、一部残ってたみたいです
最後のprintf〜の最後のsakasamaはbです

>201
ループにポインタ入れるとマズイですかね?

>203
それ試してみましたが何も表示されませんでした
205デフォルトの名無しさん:04/11/04 11:00:10
もういい、もうわかったから初心者スレに行こうな、な?
206デフォルトの名無しさん:04/11/04 11:17:30
首吊って勉強し直して来ますorz
207デフォルトの名無しさん:04/11/04 13:37:48
>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] にもアクセスしようとしている。これはマズそうだ。
208デフォルトの名無しさん:04/11/04 14:27:35
>>202
それでもできない…。
209174:04/11/04 16:15:51
AAAA[BBBB]であっているとおもいます。

元々がEUCのファイルだったのですが、windowsに移し変えたときにSJISに変換して処理していました。
なのでEUCにもどしてからAAAAをぬきだして、SJISにすることにしたら、とりあえずうまくいきました。
どのみち2byteに統一するフォーマットじゃないのはバカだなといった感じですね。
ちなみに、これはお金を払って利用できるとある単語辞書です。
210デフォルトの名無しさん:04/11/04 16:26:01
>>176
一応BCCも対応している。

>>185
http://homepage1.nifty.com/herumi/adv/adv40.html#003

>>200
#include <stdio.h>
#include<string.h>
main()
{
  char a[10], b[10];
  char *p;
  int i, len;

  strcpy(a, "Program");
  len = strlen(a);
  p = a;
  for (i = 0; i < len; i++) {
    b[len - i - 1] = p[i];
  }

  printf("%s\n", b);
}
211174:04/11/04 16:31:24
>>210
SJISの1byte判定コード、ありがとうございます。
問題は解決してしまいましたが、覚えておく必要があるものなので助かりました。
212デフォルトの名無しさん:04/11/04 20:25:19
>>209
元のフォーマットがバカなんじゃなくて
お前の変換がバカだったんじゃないのか?
213デフォルトの名無しさん:04/11/04 20:27:43
>>210
後ろに変な文字が繋がってるんですけど
214デフォルトの名無しさん:04/11/04 20:30:30
>>213
最後のprintfの前にb[len] = '\0';を書いてみろ。
215174:04/11/04 21:12:43
>>212
フォーマットをあらかじめ2byteで統一する配慮と、
文字コードの変換の失敗は関係ないと思いますがどうなんでしょう。
ちなみにEUC→SJISはフリーソフトを使わせていただきました。

たびたび湧いてすいません、ななしにもどります。
216デフォルトの名無しさん:04/11/04 21:19:45
C言語、Java、Linuxなどのおすすめの参考書を教えて下さい。
そんなスレなかったっけ?参考書まとめサイトとか
217デフォルトの名無しさん:04/11/04 21:24:44
君はまず検索という高等テクニックを身に付けよう
218http:// 210.222.18.163.80.kg/:04/11/04 21:25:18
黙れ
219デフォルトの名無しさん:04/11/04 21:54:45
検索しても見つけきれなかった・・
220デフォルトの名無しさん:04/11/04 22:21:34
それぐらい検索できない奴にプログラムをする将来はない。
それを習得すれば道は開けるだろう。
221デフォルトの名無しさん:04/11/04 22:25:17
220は漫画読みすぎだなw
きにしないでいーよ
222デフォルトの名無しさん:04/11/04 22:27:44
本音半分冗談半分だ
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;
は、ちゃんとエラーになってくれます。
224デフォルトの名無しさん:04/11/05 00:57:37
大阪(西梅田)、新宿(JR駅前)のそれぞれ一等地に
拠点を構え、業績急上昇中!未経験者大募集中!の
ソフトウェア開発会社
グリーンシステムを応援するHPです。
http://www.geocities.jp/grs_hp/

応援するスレはこちら!
http://school4.2ch.net/test/read.cgi/job/1077432387/

最高の会社にするため、みんな頑張ってます!

225デフォルトの名無しさん:04/11/05 00:59:35
>>223
はい、両者共に文法的に正しいです。
226デフォルトの名無しさん:04/11/05 01:21:20
C89のときもただしかったのー?
struct struct ...ってことだよね?
227デフォルトの名無しさん:04/11/05 01:24:10
int
main(void)
{
char s1[9], s2[9];
fgets(s1, sizeof s1, stdin);
fgets(s2, sizeof s2, stdin);
return 0;
}
これで 8byte 入力すると
2 回目の fgets() をスルーしちゃうんですけど
何故なんでしょう

9byte でスルーするなら
なんとなく分かるんですけど
228デフォルトの名無しさん:04/11/05 01:25:31
>>227
>これで 8byte 入力すると

8byte = 改行を入れて 9byte 入れているつもりです
たとえば 10101010 とか
229デフォルトの名無しさん:04/11/05 01:26:47
\0だろ・・・
230デフォルトの名無しさん:04/11/05 01:28:53
改行、\0を含めて9byteまでです。
231デフォルトの名無しさん:04/11/05 01:33:07
>>226
structのキーワードがついたポインタ型は、不完全型といって、
デリファレンスさえしなければどこでも使えます。
232デフォルトの名無しさん:04/11/05 02:01:18
"10101010\n\0" で 10byte になっているってコトですか?
gets() と違うのか…
233デフォルトの名無しさん:04/11/05 02:59:12
C言語初心者です
文字列の配列として char mona[20] = "abc def gh";があるとして
" "(つまり空白)ごとにそれぞれ別の空の3つの配列に入れなおしたいのですが、どのようにすればいいのでしょうか?
空白までの長さが常に一定なら楽ですが、例えば"giko u koko"のように色々な場合があるとします

自分の考えだと、for文を使って一つずつ配列を入れなおしていき、もし" "が出たら云々のようにしたいとは思ったのですが
未熟なプログラム技術ではうまくいきません・・・

どなたかアドバイスお願いします
234デフォルトの名無しさん:04/11/05 03:27:49
>>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]);
}
235デフォルトの名無しさん:04/11/05 03:48:21
>>234
あ、ありがとうございます
実行したらできたけど、内容はいまいちわかってないので解読していこうと思います
236デフォルトの名無しさん:04/11/05 05:24:21
#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;
}

こんなのでもどうでしょう?
なんかミスがあったら教えてください
237デフォルトの名無しさん:04/11/05 05:25:58
あ、別の空の3つの配列に入れなおすんですね。
ちょっと題意がずれちゃってますが、「strtokはいかがですか?」ってのが言いたかったことなんで、
ご勘弁を(汗
238デフォルトの名無しさん:04/11/05 05:28:45
strtok はタコ過ぎるからなあ
239デフォルトの名無しさん:04/11/05 06:16:10
↑strtok がタコなのではなく、使い方がタコなだけだろ。
ちゃんと man に、静的領域を使用する事が明記されてるんだから。
ある所には strtok_r だって有るし...

でもJM見てたら「絶対に使用しないこと」とか書いてるな。
240デフォルトの名無しさん:04/11/05 07:04:14
>>239
JM がタコなんでしょう。
241デフォルトの名無しさん:04/11/05 08:10:16
> structのキーワードがついたポインタ型は、不完全型といって、
> デリファレンスさえしなければどこでも使えます。

いや、参照もしちゃってるんですよ。なぜエラーにならない?
242デフォルトの名無しさん:04/11/05 08:17:08
>>241
構造体内に限らないが、
  struct Unknown_Tag *hoge1;
  struct Unknown_Tag hoge2;
前者はOK。後者はNG。
243デフォルトの名無しさん:04/11/05 08:29:35
そんなことは当然わかっているのですが、
hoge1というメンバーに代入しているところでもエラーがでないことがどうしても理解できないのですが。
なぜでしょう?
244デフォルトの名無しさん:04/11/05 08:41:30
代入なんかしてねーじゃん
245デフォルトの名無しさん:04/11/05 08:43:57
だから、「dereferenceしない限り」と書いてあるじゃん。
246デフォルトの名無しさん:04/11/05 08:49:51
くだらん質問のくせに随分と態度が不遜じゃん
247デフォルトの名無しさん:04/11/05 08:56:21
ミニにタコ
248デフォルトの名無しさん:04/11/05 09:44:08
>>236
一応書いておくと、静的領域に書き込もうとしているからダメダメ。
まさしく使い方が蛸。
249デフォルトの名無しさん:04/11/05 09:50:42
どこがだよ。目ついてんのか?
250コピペ推奨:04/11/05 10:15:47
    ┗┳┳━ |_| ━━━┳┳┛
      ┃┃ /  ヽ     ┃┃   もういくつ寝ると 出て行くの
    ┏┻┻ |======| ━━┻┻┓
    ┗┳┳ ヽ__ ¶_ ノ ━━┳┳┛ 朝鮮人は ウソついて 
      ┃┃ (/)     ┃┃
      ┃┃ (/)     ┃┃   日本に居座り たかります
    凸┃┃ (/)     ┃┃凸
    Ш┃┃ (/)     ┃┃Ш  早く出て行け 朝鮮人♪
    .|| ┃┃ (/)     ┃┃.||
  ∧_∧   (/) ∧_∧  ∧ ∧
  ( ・∀・)  (/)(´∀` )  <゜Д゜ > 元歌:童謡「お正月」
  (つ  つミ (/)(⊃⊂ ) ⊂  ⊃
  |_|_|_I(/)_|_|_|__|  |
  /////ノ,,,,,,ヽ ////||  |〜
////////////  |∪∪
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|  |
|        奉  納        |
251コピペ推奨:04/11/05 10:23:12
http://www.geocities.com/naverchat/CyberTerrorism01/
特にヨーロッパ・アメリカ・オーストラリアなど先進国たちの一部ネチズンたちはチャット空間で韓国人だと明らかにすれば弾き出す
とか集団的に退場して捨てるなど韓国人に対して反感を持っていることで現われた.
バンクフェワンドルの海外ペンパル(http://www.prkorea.com/vankop10_5.html)と海外チャットサイト訪問経験(http://www.prkorea.com/vankop10_4.html)
を打ち明けた掲示板には外国ネチズンたちに ‘門前薄待’当ぎりネチズンたちの事情が並んでいる.
海外チャットを始めてからひと月頃なったと言うバンクフェワン精米領さんは
“韓国出身だと言えば有り難がらない場合が 70%ほどされた”と “その時ごとに気持ちが悪かった”と打ち明けた
252デフォルトの名無しさん:04/11/05 12:38:58
int* num;
num = malloc(sizeof(int));
*num = 100;
のように動的なメモリ確保してそこへ値を代入したり
するときがあると思いますがどういったときに有効な手段
なのでしょうか?私は基本的にint iなどのような
使い方しかしたこと&その程度のプログラムしか打ったこと
がないのですが動的なメモリ確保+代入、参照はどういった
場面に有効で、どういった場面に不向きなのでしょうか?
よろしければご教授よろしくお願い致します。


253デフォルトの名無しさん:04/11/05 13:04:26
>>252
最小単位の組み込み型 (char, int, floatなど)の
変数1つを動的確保するような状況はほとんど無い。

配列もしくは構造体/クラスなどの単位で
動的確保した時に有効な使い方が出来る。

詳細は↓に誰か書いてくれるでしょう^^
254デフォルトの名無しさん:04/11/05 13:12:27
リストとかツリーとかデータ構造について勉強するといいよ
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でコンパイルしました。
以下にソースを示します
256デフォルトの名無しさん:04/11/05 13:17:59
#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;
}
257デフォルトの名無しさん:04/11/05 13:27:37
>>256
ソースを見ただけで実際に実行してはいないが、
怪しいところが2つ

・"%lf%lf"
・fwrite(&in_buff, sizeof(int), 1, stream);

読み込み・書き込みストリームが同じなのは
仕様ですか?
258デフォルトの名無しさん:04/11/05 13:29:42
>>257
"r+"の間違い
259デフォルトの名無しさん:04/11/05 13:31:00
>256
fopen()の第一引数見てみ
260デフォルトの名無しさん:04/11/05 13:33:31
fscanfが原因
261デフォルトの名無しさん:04/11/05 13:34:35
fscanf(stream, "%lf%lf", &ta, &tb);
262デフォルトの名無しさん:04/11/05 13:35:02
fopen失敗したら終了しとけよ
263デフォルトの名無しさん:04/11/05 13:39:48
>ビルドまではうまくいきますが実行しようとするとアプリケーションエラーが出てしまいます。

本当にビルド出来たんだろうか?警告無視してっていう意味だろうか?
264デフォルトの名無しさん:04/11/05 13:47:20
>>257
%lf%lfはあっている。
>>258
r+でもダメなものはダメ。
>>263
コンパイラによっては警告にはならないだろ。
265デフォルトの名無しさん:04/11/05 16:42:22
コンパイラによってはって、「VC++6.0でコンパイルしました。」と書いてあるだろ。
266デフォルトの名無しさん:04/11/05 17:34:18
#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なんでつ
ポインタ使った方法で強制終了しない方法を・・・
267デフォルトの名無しさん:04/11/05 17:36:49
mallocすればいいじゃないの
268デフォルトの名無しさん:04/11/05 17:42:17
あるファイルにbuf[4][128]というstaticの配列があり、これを別の
ファイルで使いたいのですが、このアドレスを関数で取得するに
はどう書けばよいのでしょうか?とりあえずこうしてみたのですが
駄目でした。
char** getBuf(void)
{
return (char**)buf;
}
int main(void)
{
char **ptr;
ptr = getBuf();
ptr[3][100]=100;
}
269デフォルトの名無しさん:04/11/05 17:43:46
>>268
#include
すれば普通に使えない?
270デフォルトの名無しさん:04/11/05 17:46:50
>>269
え、staticなので使えないですよね?ヘッダにbuf[4][128]を書くと
単にbuf配列が2つできるだけですし…
271デフォルトの名無しさん:04/11/05 17:50:48
>>270
ごめん見落としてました
>>268 で行けそうだけどなあ……
272デフォルトの名無しさん:04/11/05 17:52:07
bufがグローバルならstaticの意味ないし、ローカルならポインタ返せばいいんじゃね?
273266:04/11/05 17:52:40
(;´Д`)  違うみたい・・・・なんでだろ・・・表示した瞬間に落ちる・・・
274デフォルトの名無しさん:04/11/05 17:57:44
>bufがグローバルならstaticの意味ないし
bufはstaticです。
>ローカルならポインタ返せばいいんじゃね?
それが>>268なのですが…
275デフォルトの名無しさん:04/11/05 17:59:10
#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;
}

どうだろ。
276デフォルトの名無しさん:04/11/05 17:59:44
ちなみに>>268はコンパイルはとおりますが、実行時にメモリアクセス
違反で落ちます。
開発自体はC++で行っているのが何か関係あるのかな…
277デフォルトの名無しさん:04/11/05 18:00:56
>>276
あー配列の値書き換えたらダメでしょ
278デフォルトの名無しさん:04/11/05 18:02:27
は?
279デフォルトの名無しさん:04/11/05 18:02:45
char** と char[][]は互換じゃないっしょ
280デフォルトの名無しさん:04/11/05 18:03:01
static外せば?意味ないよ
281デフォルトの名無しさん:04/11/05 18:03:06
>>277
なぜでしょう?配列を宣言しているソースの中では普通に
書き換えてますが…
282デフォルトの名無しさん:04/11/05 18:05:18
>char** と char[][]は互換じゃないっしょ
はい、それが原因だと思うので、これを
char** getBuf(void)
どう書き直せばいいか教えてもらいたいのですが…
283デフォルトの名無しさん:04/11/05 18:06:57
>>276
for(i=0; i <= n; i ++)
284266:04/11/05 18:11:47
275>>

感謝!できますた。
ちょっと質問でつが、やっぱりポインタ使う時はmallocつかってメモリ確保しなきゃだめでつか?
C言語初めて間もないのでして・・・いままでmalloc使ったこと無かった・・・ORZ
285デフォルトの名無しさん:04/11/05 18:15:40
>>284
mallocっつーかアドレス確保しる。
286275:04/11/05 18:19:25
for(i=0; i <= n; i ++)
じゃなくて
for(i=0; i < n; i ++)
こうか
287デフォルトの名無しさん:04/11/05 18:22:55
>>282
char (*getBuf(void))[128];
288デフォルトの名無しさん:04/11/05 18:26:39
>>287
おえっ。変態!スケベ!エロッ!
289デフォルトの名無しさん:04/11/05 18:42:37
C++スレの方にも書き込んでまして、以下の返答をもらえました。
>char* ptr; を char (*ptr)[128];に替えればいいだろ。
たぶん>>287さんも同じことを指摘してもらっていると思いますが
とりあえずこれで解決できそうです。有難うございました。

>static外せば?意味ないよ
文法の問題なのでCスレでよいと思って質問したのですが、実際
にはC++で開発してまして、static変数ではなくprivate変数なので
外せないのです。
290デフォルトの名無しさん:04/11/05 19:02:37
マルチの上にスレ違いかよ・・・
291デフォルトの名無しさん:04/11/05 19:04:03
漏れはC++はよく知らんのだが、private変数のポインタを外部に渡して
外から書き換えるっつうのは、法律的にも倫理的にも許される事なのか?
292266:04/11/05 19:20:59
>>284 ふむ・・・やっぱり仕様でつか?
今まで使ったことなかったので・・・(;´Д`)
293デフォルトの名無しさん:04/11/05 19:28:29
>>289
C++のスレのアドバイスはおかしい。
そのやり方だと

char[4][128]をchar **にキャストして
char **を char (*)[128] にキャストするんだぞ

型がわかってないやつがキャストしまくって
誤魔化す最悪のコード

>>291
設計がウンコーとしか言いようがないよね

294デフォルトの名無しさん:04/11/05 19:47:27
>マルチの上に
マルチは申し訳ないです。
>スレ違いかよ・・・
一応、C/C++に共通する文法なのでスレ違いではないと
思ってますが…

>>293さん
良かったら正しいソースを書いて教えてもらえませんか?
295デフォルトの名無しさん:04/11/05 19:56:42
>>294
そこで>>287みたいにすればキャストなしでできる。
296デフォルトの名無しさん:04/11/05 20:09:00
>>291
private どころか static らしいよ。

>>293
ん?
    char buf[4][128];
    char (*getBuf(void))[128] {
        return buf;
    }
なら
  char (*ptr)[128] = getBuf();
で問題ないわけだが。
297デフォルトの名無しさん:04/11/05 20:18:44
>char (*ptr)[128] = getBuf();
>で問題ないわけだが。
はい、C++の方のアドバイスを元に今はそうしてます。これです。
char* getBuf(void){ return (char*)buf; };
char (*ptr)[128] = getBuf();

これなら正しいんですか?
>型がわかってないやつがキャストしまくって
>誤魔化す最悪のコード
これには当てはまって無いですか?
298デフォルトの名無しさん:04/11/05 20:36:48
>>297
だからそれは正しくない。
>>296のchar (*getBuf(void))[128]が正しい。
299デフォルトの名無しさん:04/11/05 20:58:08
>>298
了解です。C++の方でも同様の答えをいただきました。

これで完全に解決しました。マルチに最後にまで付き合って
もらってすみません。勉強になりました。
300デフォルトの名無しさん:04/11/05 21:03:50
>>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でミリ秒単位の時間を調べるには何を使用すれば良いのでしょうか?
302デフォルトの名無しさん:04/11/05 22:15:17
>>301
timeGetTimeかな
303デフォルトの名無しさん:04/11/06 09:27:30
char (*getBuf(void))[128]{ return buf; };
char (*ptr)[128] = getBuf();
304デフォルトの名無しさん:04/11/06 17:42:17
よくアプリケーションの設定を
変数名 = 値
の形式でファイルに出力しているものがありますが

fscafでファイルからデータを読み込んだ時
変数名の部分を文字列として変数にいれて
その文字列の名前の変数に値を代入する
なんてことができるのでしょうか?

それとも変数名を出力しているのは判り易いようにしているだけで
for分の中にswitchいれて順番に値を入れてるだけでしょうか?
305デフォルトの名無しさん:04/11/06 17:48:56
Windowsだったらiniファイルだな。
306デフォルトの名無しさん:04/11/06 17:49:11
>>304
> fscafでファイルからデータを読み込んだ時
> 変数名の部分を文字列として変数にいれて
> その文字列の名前の変数に値を代入する
> なんてことができるのでしょうか?
できない。

> それとも〜
WindowsならたぶんGet/SetPrivateProfileStringを使っている。
307304:04/11/06 17:56:45
テキスト形式なので
てっきり書式使ったCだと思ってました

ありがとうございます
308デフォルトの名無しさん:04/11/07 05:25:27
>>304
Hashの勉強しる
309デフォルトの名無しさん:04/11/07 10:11:22
>>308
どこからHashの話になるんだ?
310デフォルトの名無しさん:04/11/07 10:13:36
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
誤差のこと?
314デフォルトの名無しさん:04/11/07 17:11:30
>>312
hikeiが初期化されてないとか?
315313:04/11/07 17:14:19
そっちだな
316デフォルトの名無しさん:04/11/07 17:15:31
略、の中で初期化はしてます。
すいません重要な部分略しちゃいました。
全部1を入力して結果1のはずなんですけど結果が違うんです
317デフォルトの名無しさん:04/11/07 17:16:25
printf("%d日の平均気温は%4.1f度です\n",j,hihei);

ここで四捨五入になっちゃってるんじゃない?
318デフォルトの名無しさん:04/11/07 17:18:22
>>316
あーそれじゃ、略している中でぶち壊しているに一票。
319デフォルトの名無しさん:04/11/07 17:24:00
>>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;
}
320デフォルトの名無しさん:04/11/07 17:26:07
#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になってるみたいです。
何度もスイマセン。
321デフォルトの名無しさん:04/11/07 17:31:22
>>double kion[23][30];
関係なさそうだけど
322デフォルトの名無しさん:04/11/07 17:33:16
あるだろ
323デフォルトの名無しさん:04/11/07 17:35:42
>>320
いろんなところにprintf入れて
tempkの値は正しいものが入ってるのか、
hikeiとかhiteiとかは正しい値になっているのかなどを出力しとけ。
324318:04/11/07 17:44:53
double kion[24][30];にすべきだね。
やっぱり配列の範囲外に書き込むことでぶち壊してたと。
325デフォルトの名無しさん:04/11/07 17:52:33
>>324
それでも壊れるよ

for(j=1;j<=30;j++){
326デフォルトの名無しさん:04/11/07 17:52:57
double kion[24][30];にして>#define N 24使ったら正常に動きました。ありがとうございました。
327デフォルトの名無しさん:04/11/07 21:06:49
開いたファイルがバイナリかテキストかはどうやって調べれば良いんでしょうか?
328デフォルトの名無しさん:04/11/07 21:09:25
調べようがない。コンピュータにとってはテキストもバイナリに過ぎない。
割り当てのない文字コードを探してもいいかもしれないが、その場しのぎの
環境依存コードにしかならない。
329デフォルトの名無しさん:04/11/07 21:10:06
>>327
fopenした時にどっちにしたかを自前で覚えてろ。
330デフォルトの名無しさん:04/11/07 21:12:49
>>329
それは環境依存のバイナリモード、テキストモードの話だね?
331デフォルトの名無しさん:04/11/07 21:13:44
>>329
回答を質問より先に読んだのに、質問を完璧に予測できた
332デフォルトの名無しさん:04/11/07 21:29:11
>>328-329
qkccという文字コードと改行コードを変換できるプログラムがあるのですが、
ワイルドカードで指定したとき実行形式などのファイルにたいしては、
おそらくバイナリファイルです。と表示されたのでどうやって判断してるのかと
思ったんです。
汎用的な方法は無いんですか。どうもです。
333デフォルトの名無しさん:04/11/07 23:19:36
>>332
qkcのこと? それならソースが公開されてるんで読んでみては?
334デフォルトの名無しさん:04/11/07 23:34:37
>>332
テキストファイルには有り得ないデータがあればバイナリファイル。
335デフォルトの名無しさん:04/11/08 00:35:49
判定するときは、文字コードを意識しないとね。
336sage:04/11/08 08:42:56
あるテキストファイルに
3+4*12
とかいてある時、そのテキストファイルを読みこんで、
式の答えをその式の次の行に追加するにはどうしたらいいのでしょうか?
参考書をみてもファイルの読み込みから、さらに計算までの方法がのってなくて、
わかりませんでした。
助言おねがいします。
337デフォルトの名無しさん:04/11/08 09:03:56

宿題丸投げクズは放置
338デフォルトの名無しさん:04/11/08 09:15:25
>>336
「再帰下降」もしくは「再帰下向き」でぐぐるべし。
他の宿題スレでも、これ以上の回答は得られないものと考えるべし。
339デフォルトの名無しさん:04/11/08 09:16:25
だれかがbisonを懇切丁寧に教えてくれるかもよープゲラ
340デフォルトの名無しさん:04/11/08 09:35:58
/* 多くは語るまい */
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;
342340:04/11/08 09:55:57
げ、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;
}
345デフォルトの名無しさん:04/11/08 13:13:31
if(i == 0){
max = min = a;
}else if(max < a){
max = a;
}else if(min > a){
min = a;
}
346デフォルトの名無しさん:04/11/08 13:19:56
プログラムの勉強初めて1週間も経たない者ですが。ビィジュアルC++6.0でプログラムの勉強したいと思い。
押入れから2年前ぐらいに買ったビィジュアルC++6.0(その時は3日もせずに押入れ行き)引っ張り出してCの勉強はじめテルですけど、今の所 全然
意味が分かりません。勉強してれば分かるようになるんでしょうか?今24歳無職です。大丈夫でしょうか?
347デフォルトの名無しさん:04/11/08 13:32:18
     |
     J
でつ
348デフォルトの名無しさん:04/11/08 13:36:01
>>346
勉強の仕方はどうやってますか?
349デフォルトの名無しさん:04/11/08 13:42:40
>>348 林ハルヒコの新ビィズュアルC++6.0入門ビギナー編と新C言語入門ビギナー編(←これは3年前にブクオフで400円で購入)のうちC言語のほうを読んでいます。
350デフォルトの名無しさん:04/11/08 13:47:38
ビィジュアル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);

}
351デフォルトの名無しさん:04/11/08 13:51:12
>>350
そんなライブラリ無いよ。
多分書きたかったであろうは「stdio.h」
スタンダードIO(標準入出力)の意味だ覚えとけ
// studio.hと間違えている人は見るけれどsudioは始めてみたな。。。
352デフォルトの名無しさん:04/11/08 13:51:13
みんな釣りか...
353デフォルトの名無しさん:04/11/08 13:53:59
>>350 すいませんでした。ただの綴り間違えでしたか。
354デフォルトの名無しさん:04/11/08 13:54:51
エラー表示をちゃんと読もうぜ。
なんのための表示なんだか・・・
355デフォルトの名無しさん:04/11/08 13:59:04
>>344
>>345 ありがとうございます。

この場合は負の数を考えない事が多いので、0以上で考えればいいのですね。
356デフォルトの名無しさん:04/11/08 14:22:39
>>355
違う。
一個目のデータを(仮の)最大値、最小値としている。
なお、>344は1オリジン、>345は0オリジンなことに注意。
357343:04/11/08 14:33:30
>>356
書き込んだ後に、自分の早とちりに気づきました・・・。
おっしゃるとおりです。
オリジンというのは、forの「0以上20未満」と「1以上20以下」の差のことですよね?
358デフォルトの名無しさん:04/11/08 14:47:18
通りすがりからのレスですまん。

> オリジンというのは、forの「0以上20未満」と「1以上20以下」の差のことですよね?

まあそういうことだ。

で、一般に「オリジン」と言ったら開始位置のことを指す。
普段数える時にゼロから始める奴はいないからプログラムの出力もそうしろ、
ってことだろう。
(配列だとかで0オリジンだからって出力も0にする必要は無い。ユーザーは何も知らないから混乱する)
359デフォルトの名無しさん:04/11/08 14:52:05
房丸出しの質問ですいません。
(プログラム経験全くなし)いきなりVisual C++6.0に挑戦しても大丈夫ですか?
360デフォルトの名無しさん:04/11/08 14:56:11
>>359
ガタガタ言ってねえで手を動かせ
361デフォルトの名無しさん:04/11/08 14:57:06
多少スレ違いの可能性があるかもしれないんだけど
C言語のコンパイラって何使ってる?
C言語勉強しようと思ってLSI C-86侵食版を使おうとしてるんだけど
うまく作動しないorz
ちなみに環境はwin MEです
いい動作方法か
コンパイラのオヌヌメあったら、教えてくだしあ
馬鹿でスマソ
362デフォルトの名無しさん:04/11/08 14:58:43
363デフォルトの名無しさん:04/11/08 14:59:11
>>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系は大きくなる
364デフォルトの名無しさん:04/11/08 15:00:47
あのな、ここはCのスレで、質問してるバカもCコンパイラを訊いてるだろ?
365デフォルトの名無しさん:04/11/08 15:01:48
>>363
なんだその嘘と偏見だらけのリスト。
366361:04/11/08 15:06:05
たくさんのレスありがd
とりあえず全くの初心者なんで
>>2をみてみたんだけど何をつかっていいのやら全くわかりませんですたorz
c++のコンパイラってC言語でもコンパイルできるのかな??
ほんと馬鹿ですまん
367デフォルトの名無しさん:04/11/08 15:14:05
>>366 できるよ。
368361:04/11/08 15:18:05
なるほど!それじゃ、CコンパイラにこだわらずC++コンパイラでも試してみるよ
ご迷惑おかけしますたm__m
369デフォルトの名無しさん:04/11/08 15:28:57
C++よりもCの方が早いよー
camlだったらCとC++の間くらいの早さだよー
370デフォルトの名無しさん:04/11/08 15:44:42
LSI-C侵食版って……
まぁ、過去の遺物だが。
371デフォルトの名無しさん:04/11/08 15:56:12
>>366
大抵のC++コンパイラは拡張子がcならCのソースコードとしてコンパイルする。

ところで少なくともLSI-Cを使えないのなら無料のコンパイラはどれも無理だな。
どれもインストールの方法は似たり寄ったりだし。
372361:04/11/08 18:17:21
やっとコンパイル出来ますた!
ちなみにBORLAND C++
でやりますた
レスしてくれた方々dクス
373デフォルトの名無しさん:04/11/08 19:54:24
strtok("", " ");
と記述するとコンソールが落ちるんですがなぜでしょうか。
374デフォルトの名無しさん:04/11/08 19:54:57
man strtok
375373:04/11/08 19:55:32
× strtok("", " ");
〇 strtok("a", " ");
376デフォルトの名無しさん:04/11/08 20:04:55
#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)
とあるから、落ちたとしてもそれは不適切な動作とは言えない。
377373:04/11/08 20:10:48
>>376
どもです。
まさかそんな仕様だったとは思いませんでした。
378デフォルトの名無しさん:04/11/08 21:37:54
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
をダウンロードしたいのですが、日本語ページはないのでしょうか?
379デフォルトの名無しさん:04/11/08 21:40:06
380デフォルトの名無しさん:04/11/08 21:40:52
DLするだけならすぐ分かるだろ。


クマー
381デフォルトの名無しさん:04/11/08 21:45:06
382デフォルトの名無しさん:04/11/08 22:40:05
「やさしいC」か「猫でもわかるC言語プログラミング」を買おうと思ってるのですが
読んだことのある方がいたら感想を聞かせてもらえませんか?
383デフォルトの名無しさん:04/11/08 22:46:08
いいかげんスレ違いの話ばかりするのはやめようや
384デフォルトの名無しさん:04/11/09 12:56:37
猫に人間の言葉が分かるか!!
385デフォルトの名無しさん:04/11/09 17:02:25
>>384
わからないかなー にゃんにゃん
386デフォルトの名無しさん:04/11/09 17:44:16
nyaid nyain(nyaid){
nyaintf("にゃにゃぁ にゃぁにゃん\n");
}
387デフォルトの名無しさん:04/11/09 22:13:28
>>384
分かるようだぞ。人間の言葉は。
ただしコンピュータ言語は絶対分からないはずだ。理由は覚える必要を
感じないから。
388デフォルトの名無しさん:04/11/10 13:32:13
さがりすぎ
389デフォルトの名無しさん:04/11/10 15:04:44
今手元にコンパイラが無いので、自分では確認できないんですが、質問いいでしょうか。
bool型を返す関数check_bool()というのがあるのですが、呼び出し側のほうで、
int ret = check_bool(value);と書かれてます。
自分のソースではないんですが、どうやらコンパイルも通っているそうで。
trueやfalseの場合、retには何が入ってくるんですか?
390デフォルトの名無しさん:04/11/10 15:08:45
>>389
0か0以外
391デフォルトの名無しさん:04/11/10 15:09:14
stdbool.h嫁
392デフォルトの名無しさん:04/11/10 15:14:44
>>389
FALSE が 0 なら TRUE は -1 が正しい
http://pc5.2ch.net/test/read.cgi/prog/1082154544/l50
393デフォルトの名無しさん:04/11/10 16:03:37
>>389
trueなら1、falseなら0。
コンパイルが通るのはshort→intと同じように、変換後の型の表現可能な値の範囲が変換前より大きくなる整数同士の型変換の扱いになるからだと思う。
394デフォルトの名無しさん:04/11/10 17:25:11
strcmpでNULL文字かどうかの比較をしているんですが、
strcmp( var, "\0")
strcmp( var, '\0')
これって下が正しいんですよね。
文字列が""で、文字が''ですよね?
395デフォルトの名無しさん:04/11/10 17:30:07
何がいいたいのか解らん
下ってコンパイル通らなそうなんだけど
396デフォルトの名無しさん:04/11/10 17:31:38
strcmpは文字列比較だぞ。
「ですよね?」じゃなく、前提で勘違いしてる。
397デフォルトの名無しさん:04/11/10 17:34:18
char hoge = '\0';

if( hoge == '\0' )
printf( "ぬるぽ!\n" );
else
printf( "ガッ\n" );

-----------------------
ぬるぽ!
398デフォルトの名無しさん:04/11/10 17:43:01
>>394
>>396の言う通り、strcmpは文字列同士の比較なのでナル文字かどうかの比較にはstrcmp(var, "")か*var == '\0'
399デフォルトの名無しさん:04/11/10 18:33:56
>>397
ガッ
400デフォルトの名無しさん:04/11/10 20:15:16
パソコン超初心者なんですが ライフゲームを
作っています。どうすれば完成させることが出来ますか?

#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;

↓下に
401デフォルトの名無しさん:04/11/10 20:17:40
お邪魔しマース
402デフォルトの名無しさん:04/11/10 20:17:45
>>400
スレ違い
403デフォルトの名無しさん:04/11/10 20:18:17
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);
}}
404デフォルトの名無しさん:04/11/10 20:18:48
もういいって。
405デフォルトの名無しさん:04/11/10 20:19:14
すみませんでした。
406デフォルトの名無しさん:04/11/10 21:24:17
CSVファイルの特定のフィールドに特定の文字列が含まれている
行を抽出する(要するにフィールドを意識したGREP)のに
一番速い方法はどんな感じでしょうか。
407デフォルトの名無しさん:04/11/10 21:38:50
>>406 るby!!!!!!!!!!!!!!!!!!!!!!!!
408デフォルトの名無しさん:04/11/10 21:41:06
質問です
printfの中で""を表示したいのですがどうすればよいのでしょうか?
表示結果を
"abc"
と表示したいのですprintf(""""\n);では駄目みたいなのですが…
409デフォルトの名無しさん:04/11/10 21:41:59
printf("\"abc\"\n");
410408:04/11/10 21:45:17
>409
ありがとうございました、無事できました!
411デフォルトの名無しさん:04/11/10 21:45:45
>407
いや、Cで組むとしたら、の話です。
412デフォルトの名無しさん:04/11/10 21:59:35
漸化式x[1]=0.1
x[n+1]=(x[n]+1)^(1/3)のn番目の値を出すプログラムを書きたいのですが
三乗根の書き方が分かりません、アドバイスお願いします
413デフォルトの名無しさん:04/11/10 22:02:33
>>412

double cbrt(double)
414デフォルトの名無しさん:04/11/10 23:09:49
ある処理のパフォーマンスをmsec単位で測定したいのですが、
どうすればよいでしょうか?
415デフォルトの名無しさん:04/11/10 23:10:38
OSのサポートなしには不可能なので処理系依存。
416デフォルトの名無しさん:04/11/10 23:14:05
>>414
このスレ的にはclockかな?
417デフォルトの名無しさん:04/11/10 23:17:34
>>411
grepのソースでも読めば? セル中に','が含まれていないことが保証できるならgrepでできることだし。
#例えば第3フィールドが123なら、system("/bin/grep '^[^,]*,[^,]*,123,' csv.txt");
418デフォルトの名無しさん:04/11/10 23:24:31
>>406
使いにくいがregexはどう?
C++ならboostなんだろうけど
419デフォルトの名無しさん:04/11/10 23:29:18
>417
grepは遅いのでダメです。
420デフォルトの名無しさん:04/11/10 23:41:00
>>406
DBに突っ込め。
421デフォルトの名無しさん:04/11/10 23:57:05
>420
いやいや、質問している間にだいぶ状況が
整理できたのでなんとかなりそうです。
422デフォルトの名無しさん:04/11/10 23:57:43
>420
それ今まで出た中で一番遅い方法じゃねーの?
423デフォルトの名無しさん:04/11/10 23:59:34
定本Cプログラマのためのアルゴリズムとデータ構造を読んだ人(じゃなくてもいいのですが)
に質問なんですが、二分検索木の挿入や削除の所で、構造体へのポインタのポインタを、
わざわざ使う理由がわかりません。
ふつうに構造体のポインタで良いと思うのですが、どうなのでしょうか?
名著と言っている人もいますが、ちょっと読む気無くし中です……
424デフォルトの名無しさん:04/11/11 00:04:39
printfが内部で持っているバッファサイズっていくつでしょうか。
8KB?あとこれって変更できますか?
425デフォルトの名無しさん:04/11/11 00:05:11
>423
それで動いたのか?
426デフォルトの名無しさん:04/11/11 00:19:06
>>424
内部に持っていない。
427デフォルトの名無しさん:04/11/11 00:20:04
>426
ウソつけ
428デフォルトの名無しさん:04/11/11 00:23:06
>>427
サイズはいくつなんですか?
429デフォルトの名無しさん:04/11/11 00:24:06
質問ですが、
char *s;と、
char s[256];
では何が違うのですか?
430デフォルトの名無しさん:04/11/11 00:24:27
typedef double Number;
中略
void moge(Nunber, void(*)(Number, Nunber[]);

のvoid(*) の(*)って何を意味しているんですか?
431デフォルトの名無しさん:04/11/11 00:24:39
C70
432デフォルトの名無しさん:04/11/11 00:24:59
>428
8192バイト
433デフォルトの名無しさん:04/11/11 00:25:09
434デフォルトの名無しさん:04/11/11 00:26:17
>>432
どこで確認できるのでしょうか?変更する方法もお願いします。
435デフォルトの名無しさん:04/11/11 00:31:52
>>433
どうもです。
436デフォルトの名無しさん:04/11/11 00:32:44
>>425
手元にPCないので確認できないです。
ていうかこの本の例題、main関数ぐらい使ってくれよ〜
437デフォルトの名無しさん:04/11/11 00:33:09
>434
つきあいきれんよ
438デフォルトの名無しさん:04/11/11 00:33:35
>436
単にお前が初心者すぎて読みこなせないだけなんじゃないの?
439デフォルトの名無しさん:04/11/11 00:40:51
>>437
8192バイトという数はどこでわかったんですか?
それだけでも教えてください。
440デフォルトの名無しさん:04/11/11 00:43:41
>>429
配列とポインタの違い。
441デフォルトの名無しさん:04/11/11 00:46:59
char *s; ←これは宣言で
char s[256]; ←これは定義ですよね?
442デフォルトの名無しさん:04/11/11 00:55:23
443デフォルトの名無しさん:04/11/11 00:55:54
>>441
いいえ。どちらも定義です。
444デフォルトの名無しさん:04/11/11 00:57:22
>>430
ポインタ。
445デフォルトの名無しさん:04/11/11 01:07:21
>>442
どちらも宣言みたいですね。
宣言と定義がぐちゃぐちゃに・・_| ̄|○
446デフォルトの名無しさん:04/11/11 01:54:47
>>445
( ゚д゚)ポカーン
447デフォルトの名無しさん:04/11/11 01:57:11
配列の宣言「char a[6]」
ポインターの宣言「char *p」
だから合ってるんじゃないの。ぶっちゃけどうでもいいけど。
448デフォルトの名無しさん:04/11/11 03:16:02
宣言⊃定義
なんだから合ってると言えば合ってるんだけどね。でもねえ…
449デフォルトの名無しさん:04/11/11 04:12:11
あえて言っちゃうと規格がバカ!
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」は内部結合でもいいよと書かれているが、字面じゃ完璧エラーだろ。
450デフォルトの名無しさん:04/11/11 04:25:33
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側に渡す方法ってありますかね?
452デフォルトの名無しさん:04/11/11 10:00:17
引数として渡す
453デフォルトの名無しさん:04/11/11 10:09:52
>>449
>もちろん、「extern char a[6]; static char a[6];」なんて仮定義しても警告すら出ん。
>規格では「extern」は内部結合でもいいよと書かれているが、字面じゃ完璧エラーだろ。

お前はアフォか?
454デフォルトの名無しさん:04/11/11 10:32:38
float data = 1.00825;
tmpString.Format("%f",data);

ここで、tmpStringに入る文字列は "1.008251"となるのですが。
これはどうしてでしょう。
455デフォルトの名無しさん:04/11/11 10:38:27
似たような値だから気にするなって事で。
456デフォルトの名無しさん:04/11/11 10:43:51
>>453
警告も出なかった。
gcc
457453:04/11/11 11:40:21
>>456
警告なんて出る訳ないからアフォだと言ってるんだが
458デフォルトの名無しさん:04/11/11 11:46:31
>>454
float data = 0.1;
で試してみ?
459449:04/11/11 12:27:40
ツッコミどころが微妙でワロタ
460デフォルトの名無しさん:04/11/11 12:47:18
入力した文字列データを2次元配列に格納したあと、
逆順に表示するプログラムの表示。
ただし、一文字目に'@'が入力されるとデータ入力を終わる。
データ数は最大20個、また一つの文字列データの
最大長は半角10文字

実行例
word=sekiyu
word=yasai
word=denwa
word=@
denwa
yasai
sekiyu
461デフォルトの名無しさん:04/11/11 12:51:49
>>460
プログラムの表示とはバイナリですか?
それともソースファイルを表示するのでしょうか?
462デフォルトの名無しさん:04/11/11 12:52:33
>>461
ソースファイルです
463デフォルトの名無しさん:04/11/11 12:55:50
>>460
で?
それが何?
痴呆?
464デフォルトの名無しさん:04/11/11 12:57:37
>>463
その類の反応も見飽きた。
飽きた飽きた飽きた飽きたぁぁああぁあぁうぇww
465454:04/11/11 13:02:00
>>458
0.100000
となりますが・・・

あと、例では単に data変数に測値を入れてますが、
実際にはある演算の結果が 1.00825(デバッガ上で確認)となり、
これをFormat関数に渡すと誤差を含んだ文字列が帰ってきてる
ようです。

うーむ。
466454:04/11/11 13:02:34
測地→即値
です
467デフォルトの名無しさん:04/11/11 13:12:55
468デフォルトの名無しさん:04/11/11 14:29:00
>>449 は変数のスコープを理解していない罠
469デフォルトの名無しさん:04/11/11 14:32:22
>>454
float data = 0.1;
tmpString.Format("%.18f",data);
470デフォルトの名無しさん:04/11/11 15:04:56
>>465
デバッガ上で確認した数値が誤差を含んでいない保証はない。
471デフォルトの名無しさん:04/11/11 15:50:17
>>465
1. 1.00825 なんて数は、2進数では表現できない。
2. デバッガでは有効桁数6桁で表示しているが、
  Format (つかコレ C じゃねぇだろ) では 7桁表示。
472423:04/11/11 19:06:04
423なのですが、この本を読み返しているうちにだんだんわかってきました。
構造体↓
NODE **p;
を宣言して
*p
として使ったときと、
NODE *p;
を宣言して
p
として使ったときでは、指しているものが違うことに気がつきました。
何か違っていることを言っているようでしたら、訂正お願いします。
473デフォルトの名無しさん:04/11/11 19:12:01
AIXでC言語による開発をしています。

アーカイブでextern宣言した配列に値を設定しておき、
呼び出し元でその配列を参照することはできますでしょうか?
474デフォルトの名無しさん:04/11/11 19:15:17
>>473
やってみたら?
475デフォルトの名無しさん:04/11/11 19:16:00
>>472
NODE n;
NODE *p1;
NODE **p2;
p1 = &n;
p2 = &p1;
----------------
*p1 は n;
*p2 は &n;
476デフォルトの名無しさん:04/11/11 20:34:00
とある関数
void hoge(double &x, double &y){}

のdouble &xとdouble &y の&の意味を教えてください。
477デフォルトの名無しさん:04/11/11 20:37:09
478デフォルトの名無しさん:04/11/11 21:54:09
>>474
やってみたところ、なんとか自己解決しました。
お騒がせしました。
479デフォルトの名無しさん:04/11/11 22:41:17
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です。
480デフォルトの名無しさん:04/11/11 22:46:47
←ここだと表示されてないですね・・・
481デフォルトの名無しさん:04/11/12 00:41:35
^Kなのか。\nに\rがつくというならまだわかるんだが。
とりあえず標準出力はテキストモードで、
リダイレクトした際には吐き出すディレクトリのマウントモード(だっけ?)に
依存しそうだから、stdoutをfreopenかなんかでモード変えてみたらどうだろう。
482479:04/11/12 01:17:33
>>481
テキストモード、freopenでも変化なしです…。
当然fopenでも変わりませんでした。
483デフォルトの名無しさん:04/11/12 02:01:59
単純に、printf("%c", 11)では書けるのかな。
484デフォルトの名無しさん:04/11/12 02:50:01
コントロール文字
485デフォルトの名無しさん:04/11/12 09:16:57
fputc()使っといたら?
486デフォルトの名無しさん:04/11/12 10:25:50
誰か助けてください。
次の関数で0≦x≦2の範囲で、xの値の0,1ごとに
yの値を計算するプログラムを作成せよ。画面にはx、y両方の値を表示す
るようにすること。while文を使うこと。y=x*x−3x+5/4
487デフォルトの名無しさん:04/11/12 10:36:43
>>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;
}

ていうかマルチすんなボケ
488デフォルトの名無しさん:04/11/12 10:39:07
>>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
のように求めたいんですが
489デフォルトの名無しさん:04/11/12 10:44:07
>>488

(n-1)*10で割った後、10で割ったあまりを取ればいいんじゃない?
490489:04/11/12 10:48:24
(n-1)*10→pow(10,(n-1))
orz
491デフォルトの名無しさん:04/11/12 11:01:19
>>489
ああ、成る程!
ありがとうございました
492479:04/11/12 12:46:57
解決しましたんで報告します。

>>483さんの方法で出力自体はできたんで、
fscanfしたものと比較、もし^Kだったら>>483さんの方法で出力、
ということをしようと思ったんですが、
その時点ですでに^Kをfscanfできていなかったことが分かりました。

で、代わりにfgetcを用いた所、^Kを格納することができました。
数字部分にもfscanfを用いると何故か格納ができなくなっていましたんで
そちらに対してもfgetcを用いた、という感じです。

これは処理系によるfscanfの不具合なんですかね?
よく分からん(´・ω・`)

とりあえず、ご教授ありがとうございました。
493479:04/11/12 12:47:36
ソースです。

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);
494773:04/11/12 13:52:06
ありがとうございます。今学校で提出しました。
495486:04/11/12 13:52:35
ありがとうございます。今学校で提出しました。
496479:04/11/12 13:58:50
あれ?
出現回数もchar型で出力&スペース除去したものを

while(!feof(fp)){
fscanf(fp, "%c%c", &c, &i);
while(i>0){
fprintf(fpw, "%c", c);
i--;
}
}

で復元したら、問題なくできました。
なんだったんだ…。
497デフォルトの名無しさん:04/11/12 14:36:32
>>496
scanf()系は、%sや%dなどではホワイトスペースを取り除く機能を持っている。
通常ホワイトスペースは空白文字、タブ文字、改行文字だがもしかしたら、
0x0bもホワイトスペースとして取り除かれたのジャマイカ。
最後の例では%cしか使っていないからその問題は起きない。

しかし、fscanf()やfprintf()のようなコストの掛かる関数ではなく、
fgetc()やfputc()を使うべきジャマイカ。
498デフォルトの名無しさん:04/11/12 16:21:13
0x0B ^K VT 垂直タブ
499486:04/11/12 16:42:30
マルチしました。ごめんさい。
500486:04/11/12 16:43:08
ごめんなさい。
501486:04/11/12 16:50:42
ごめんね。。。
502486:04/11/12 17:12:18
ぬるぽおおおおお
503486:04/11/12 17:14:55
ぬるぽしました。ごめんなさい。
504デフォルトの名無しさん:04/11/12 20:34:51
struct value {
double a1;
double a2;
double a3;
};

int main(){
struct value value;

scanf("%f",&value.a1);
printf("%f",value.a1);
}
略してますがこんな感じのソースなんですが、構造体のメンバにscanfで
入力できません。コンパイルは通ったのです。なんででしょうか?
505デフォルトの名無しさん:04/11/12 20:37:50
>>504
scanf の場合は、%f は double ではなくて float だったような。
double にしたいのなら %lf にしよう。
506デフォルトの名無しさん:04/11/12 20:38:08
scanf("%lf",&value.a1);
printf("%lf",value.a1);
507デフォルトの名無しさん:04/11/12 21:01:09
scanfの場合doubleでもfloatでも%lfにするんじゃなかったっけ?
508504:04/11/12 21:03:42
お答え頂きありがとうございます。質問しといて申し訳ないのですが、
要点を書こうとして略しすぎてしましました。%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);
となってます。
全部書くのもあれなのでまた略してます、すいません。
この辺が問題のようなので。
お願いします。
509デフォルトの名無しさん:04/11/12 21:03:49
>>507
そんなわけないと思う。
第一、バイト数がわからなければ、実装できないだろう。
510デフォルトの名無しさん:04/11/12 21:05:27
ポインタ
511デフォルトの名無しさん:04/11/12 21:05:43
>>508
それはキミ scan_value(value a) って書いたら、
value のコピーが渡されるから、
入力しても関数呼び出し側には反映されないよ。

scan_value(value* a) のようにポインタを使わないといかん。
512デフォルトの名無しさん:04/11/12 21:10:24
scanf()ではdoubleは%lf。floatは%f。
ポインタを扱うのでサイズの違いに意味がある。
printf()ではdoubleは%f。%lfは処理系依存だったはず。
暗黙の型変換が入るのでfloatは勝手にdoubleになるからやはり%f。
513デフォルトの名無しさん:04/11/12 21:20:41
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は同じ結果にならねばならない」が正解。
514508:04/11/12 22:08:44
value avoid scan_value()関数の定義の中の
scanf("%lf",&a.a1);
scanf("%lf",&a.a2);
scanf("%lf",&a.a3);
の3つの行で
. または .* の左側に構造体が必要
というエラーがでましたがこれはどういうことですか?
教えて君ですいません。Cでやり始めたのですが出来なくて
C++でやったら出来ました。でも原因が知りたいので是非お願いします。
515デフォルトの名無しさん:04/11/12 22:55:34
>>514
scan_value(value *a)
にしてるなら
scanf("%lf", &a->a1);
516デフォルトの名無しさん:04/11/12 22:57:42
アロー演算子
517479:04/11/12 23:11:43
>>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
>>519
そういうネタはこっちのスレで
http://pc5.2ch.net/test/read.cgi/tech/1090652323/
521デフォルトの名無しさん:04/11/13 00:07:30
>>519
Cなら機能単位でまとめ、グローバル変数などは一つのヘッダで一括管理すれば
良いでしょう。
C++ならクラス単位。
Cでもファイル単位でクラスの様に扱うとややオブジェクト指向風になるので保守性が
良くなります。
↓このようなことをする人もいますが、ここまで来ると少しやりすぎという気がします。
http://www.sage-p.com/process/cool.htm
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
523デフォルトの名無しさん:04/11/13 20:10:22
ぬるぽーーーーーーーー
524デフォルトの名無しさん:04/11/13 20:16:11
ガッ でもこの場合ぬるぽじゃないぞ。
mainでとったtmの実体ないだろ。だからだ。
525522:04/11/13 20:27:37
>>524
mainのtmはポインタにしてはいけないということでしょうか?
526デフォルトの名無しさん:04/11/13 20:31:23
というかアドレス渡ってないんじゃないのかあんど&
527デフォルトの名無しさん:04/11/13 20:33:59
ここにはバカしかいないんですね

#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;
}
528デフォルトの名無しさん:04/11/13 20:38:14
すぐ答えをだすやつは包茎
529522:04/11/13 20:38:23
>>524,526,527
どうもありがとうございました。
ポインタについて、全然理解できていないようなので、出直してきます。
530デフォルトの名無しさん:04/11/13 20:44:07
つーか、struct tmなんて中途半端なもんやり取りしないでtime_tか文字列にしとけと思うが。
531デフォルトの名無しさん:04/11/13 21:08:36
>>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型の配列を、サブルーチンで使えるようにするには
どうすればいいのでしょうか?
533デフォルトの名無しさん:04/11/13 23:25:32
自分で考えようね。
534デフォルトの名無しさん:04/11/13 23:26:21
グローバル変数として定義する。
535デフォルトの名無しさん:04/11/13 23:30:42
関数の引数として参照渡しすればよかろう。
536デフォルトの名無しさん:04/11/13 23:31:15
ぽいんちゃ
537デフォルトの名無しさん:04/11/13 23:38:39
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
なぜ、このスレで禿本がでてくる?
539デフォルトの名無しさん:04/11/13 23:52: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;
}
540デフォルトの名無しさん:04/11/13 23:58:14
if(num == 253) seikai(num);


if(num == 253) {
seikai(num);
break;
}
541デフォルトの名無しさん:04/11/13 23:58:34
return
542デフォルトの名無しさん:04/11/13 23:59:36
ruby
543539:04/11/14 00:02:44
>>540
ありがとうございました
544539:04/11/14 00:04:44
関数を作る必要なかったのかorz
545デフォルトの名無しさん:04/11/14 00:17:49
num使ってないね
546デフォルトの名無しさん:04/11/14 00:20:42
プログラムのどこかで exit または main から return した後って
malloc で獲得したメモリは開放されるのでしょうか。
547デフォルトの名無しさん:04/11/14 00:37:28
どこにそんなこと書いてあったんだ? >546
548デフォルトの名無しさん:04/11/14 00:52:19
開放される場合が多いが、すべての環境で開放されるわけではない。
---終了--
549デフォルトの名無しさん:04/11/14 00:54:06
char *s;

s=(char *)malloc(sizeof(char)*100);
.
.
.

free(s);

550デフォルトの名無しさん:04/11/14 01:05:39
関数Aに配列(の先頭アドレス)を渡して、
その関数内でその配列の要素数を求める方法はないのでしょうか?
複数の文献をネットであたりましたが、通常のsizeof割り算方式では
不可能を示すものしかなく、関数内でもとめる方法がありません。
教えてください。
551デフォルトの名無しさん:04/11/14 01:12:18
>>550
不可能です。
552デフォルトの名無しさん:04/11/14 01:15:13
C言語を始めようと思い開発ツールを購入しようと
思っているのですが、後で痛い目にあいたくないので
扱いやすいソフトを教えていただけないでしょうか?
553デフォルトの名無しさん:04/11/14 01:21:52
学生だったら
激安で買えるVisual Stdio.NET theSpoke Disc.8
http://pc5.2ch.net/test/read.cgi/tech/1095325802/
554デフォルトの名無しさん:04/11/14 01:22:43
>>552
Emacs 最高
Elisp 覚えればな。
555デフォルトの名無しさん:04/11/14 01:22:45
>>552
ゆくゆく何を作りたいかを書きもせず、ましてやOSさえ書いてないのは、
もしかしてエスパーがこのスレにいると思ってますか?
556デフォルトの名無しさん:04/11/14 01:24:01
WINMXでDL
557デフォルトの名無しさん:04/11/14 01:26:57
>>551
じゃC++はどうなのよ?
558デフォルトの名無しさん:04/11/14 01:27:24
呼び出し元の関数で配列の最後になにかフラグを入れたら
良いんじゃないっすか?
charだったらNULLか何か入れて
関数AでNULLが出るまでカウントする。
これじゃ駄目かな?
559546:04/11/14 01:27:40
開放されたかされてないかはどうやって調べればよいでしょうか。
560デフォルトの名無しさん:04/11/14 01:28:14
>>550の質問
561デフォルトの名無しさん:04/11/14 01:29:45
>>558
駄目です。
562デフォルトの名無しさん:04/11/14 01:32:02
>>561
WHY?
563デフォルトの名無しさん:04/11/14 01:32:14
例外つかうとかは?
564デフォルトの名無しさん:04/11/14 01:33:12
>>558
そこまでする努力するのなら、素直にパラメータひとつ増やしてサイズ渡せばいいと思うんだが。
というかそっちの方が楽ですよ。特殊なキャラを埋め込むときにどうせサイズが必要だし、
呼ぶ前に埋めるのと、呼ばれた側でカウントするのとで無駄に速度が落ちるし、いいことないっす。
565デフォルトの名無しさん:04/11/14 01:35:14
>>558
結局フラグ入れたり、引数に要素数渡したり、グローバル変数でフラグにするしかないのか?
566デフォルトの名無しさん:04/11/14 01:43:10
グローバル変数でフラグって何よ
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出来ない言語でした。
572デフォルトの名無しさん:04/11/14 01:50:40
>>552
これからC言語を始めようと思うなら
お金かけずに秀丸+Borlandで十分だと…
573デフォルトの名無しさん:04/11/14 01:54:57
てか秀丸とtheSpokeの値段が大して変わんないんだな
574デフォルトの名無しさん:04/11/14 01:55:04
>>550
需要がありそうなのに決定的な解決方法はないってことになるのかな?
575デフォルトの名無しさん:04/11/14 01:55:12
Borlandの開発環境は少ないからやはりgccかと
cigwin落としてviで書くのが一番かと...
何をやるのか分からないがやはりコンパイルやリンカの仕組みは
知らないと。
576デフォルトの名無しさん:04/11/14 01:56:17
タダでやるならこっちのほうがいい。
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
577デフォルトの名無しさん:04/11/14 01:57:10
eclips+gcc
578デフォルトの名無しさん:04/11/14 02:02:07
EclipseでCって使う人多いのでしょうか?
579デフォルトの名無しさん:04/11/14 02:04:09
俺も気になった業務系の人は使うのかな?
580デフォルトの名無しさん:04/11/14 02:24:22
ただでそれなりな環境って意味では一番の組み合わせなんじゃないの?
581デフォルトの名無しさん:04/11/14 02:34:19
>>567
どこからその通信云々の前提が出てきたんだ…

固定長前提の場合を除くと、C以外でも配列のサイズを渡すしかないっすよ。
コードの字面で陽に渡すかどうか(コンパイラが受け持つかどうか)は別としてね。

582デフォルトの名無しさん:04/11/14 02:44:26
>>581
結局そういう結論になりますか・・・。
C言語に特化した方法で良いので何か効率の良い解決方法はありませんか?
それについて書かれたサイトやモジュールはないでしょうか?
583デフォルトの名無しさん:04/11/14 02:48:46
>>582
何故その方法にこだわる?
584デフォルトの名無しさん:04/11/14 02:58:58
C言語では配列の引数はポインタと同じ扱いになっている(こうしないと配列丸ごとコピーすることになるからかな?)
ポインタは通常メモリアドレスに過ぎないので、それだけではどれだけの長さがあるのかなんて判別できない
通信の場合でも何も無しでは何処で区切るなんてわかりっこないので
一定の長さにするか、事前に長さを渡すか、区切りを決めておくという方法でやり取りする
585デフォルトの名無しさん:04/11/14 03:02:22
>>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;
}

586デフォルトの名無しさん:04/11/14 03:03:14
続き
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;
}

使い方はわかるよね。
587デフォルトの名無しさん:04/11/14 03:07:28
struct {
 size_t size;
 char values[1];
} char_array;
しといて
char_array* array = malloc( sizeof( size_t )+count );
というのはよく見るね。
言語仕様的にはアウトの予感だけど。
588デフォルトの名無しさん:04/11/14 03:09:19
>>587
アウトです。C99でも標準化委員会で議論はされたけど結局アウトだったような。
589デフォルトの名無しさん:04/11/14 03:44:15
>>588
values[1] じゃなくて values[] にれば C99 的に ok
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
590デフォルトの名無しさん:04/11/14 03:52:54
>>589
おー、サンキューっす。それは知りませんでした。精進します。
591デフォルトの名無しさん:04/11/14 04:05:13
>>557
template<int N> void Hoge(int& Foo[N]);
592デフォルトの名無しさん:04/11/14 07:10:40
struct {
 size_t size;
 char values[0];
} char_array;
593デフォルトの名無しさん:04/11/14 09:19:49
>>559
プロセス終了処理を追えばわかる。
594デフォルトの名無しさん:04/11/14 11:13:48
>>591
template <T, std::size_t N> void f(const T (&t)[N});
595デフォルトの名無しさん:04/11/14 12:38:29
配列の要素を引数と言う香具師始めて見た。
596デフォルトの名無しさん:04/11/14 12:41:40
始めるなよ ぼけ
597デフォルトの名無しさん:04/11/14 12:44:24
IRCでvoid教祖様とそのとりまき連中が話していたのだが、
for (;;) と
while (1) で、
gccでのコンパイル結果のバイナリーに差がでるような
gccのオプションって何だ?
IRCの会話をみながら、ひそかに自分で試してみたが、見つからなかった。
(見つけて反論してやろうと思ったのに)

gccにかぎらず、その2つで差がでるようなコンパイラー自体
思い当たらないのだが。
598デフォルトの名無しさん:04/11/14 12:52:48
VC++6.0
; 8 : for(;;);

jmpSHORT $L582
$L585:

; 9 :
; 10 : while(1);

moveax, 1
testeax, eax
jeSHORT $L586
jmpSHORT $L585
$L586:
599デフォルトの名無しさん:04/11/14 13:26:30
ぼるじょあが一言

600デフォルトの名無しさん:04/11/14 13:31:39
ゥルェエー!
601デフォルトの名無しさん:04/11/14 13:54:31
602デフォルトの名無しさん:04/11/14 14:34:13
最近、C、C++の基礎本を読み終えたのですが
とあるプログラムを使ってコマンドプロンプト上に出力された文字列
(例:りんご を 3個 ください)からオリジナルのプログラム上で
自動対応させることは可能でしょうか。


1):「りんごを3個ください」(外部プログラムからの出力)

2):「りんご3個でよろしいですね」(if文などを使ったオリジナルプログラムから出力)

初歩的な質問ですいませんが宜しくお願いします。
603デフォルトの名無しさん:04/11/14 14:36:03
初歩的な日本語も勉強しましょうね
604デフォルトの名無しさん:04/11/14 14:37:15
>>602
は?
605デフォルトの名無しさん:04/11/14 14:52:32
>>602
できるが、多少面倒かもしれない。
606デフォルトの名無しさん:04/11/14 14:54:06
602です。
読みづらい文章ですいません。
最初にコマンドプロンプトで、あるプログラム(hoge.exe)を実行します。

C:\bin\hoge\hoge.exe -C
sentence1: りんご を 3個 ください

と出力されるのですが、ここで主力結果「りんごを・・」に対する返答を
するプログラムをCで作りたいのですが、キーボードからの入力は
scanfを使えばいいと分かるのですが、既に画面上に表示されている文字列を
利用する関数はありますでしょうか。

分かりづらい説明ですいませんが宜しくお願いします。

607デフォルトの名無しさん:04/11/14 14:56:00
>>593
> プロセス終了処理を追えばわかる。

プロセス終了処理ということは OS のソースを見ないといけないということで
しょうか。 Windows などの場合はどうすればよいでしょうか。
608デフォルトの名無しさん:04/11/14 15:02:48
>>606
でちゃったの拾うのは面倒なんで
FIFOかPIPE使って
609デフォルトの名無しさん:04/11/14 15:05:19
>>607
そんなときのためにサポートセンターがある。
610デフォルトの名無しさん:04/11/14 15:10:22
結論として終了前には必ずfreeするということでOK?
611デフォルトの名無しさん:04/11/14 15:13:33
>>610
そうしない積極的な理由がない限り、それでいい。

>>606
インタラクティブに対応するのは結構難しいかと。
事前に出力がわかっているのなら、入力すべき内容を
テキストファイルにでも入れてリダイレクトで済むかも知れず。
612デフォルトの名無しさん:04/11/14 15:17:13
する必要のない処理を入れるなんてナンセンスですよ。
613デフォルトの名無しさん:04/11/14 15:18:24
>>608, 611
どうも有難うございます。参考にさせていただきながらやってみます。
またお世話になるかもしれませんが宜しくお願いします。
614デフォルトの名無しさん:04/11/14 15:19:18
アホはほっとこ。
なんでこんなナンセンスな香具師が湧いてるんや…
615デフォルトの名無しさん:04/11/14 15:20:13
>>612
>611が敢えて抽象的な表現したんだから察しような。
616デフォルトの名無しさん:04/11/14 15:35:48
ナンセンスな質問ですいません。
事前に出力される結果は分かっていないんです。外部音声認識により
「りんご3個」と発話した結果(話者により、果物名や個数は異なる)
に対して

if fruit(りんご){
こんな処理しろ
}
else {
りんごじゃなかったら、こうしろ
}

上記適当ですが、こんな形の処理を実行したいと思ってます。。
初歩的な質問かもしれませんが宜しくお願いします。
617デフォルトの名無しさん:04/11/14 15:44:04
くどくどやって申し訳ないんですけど
こんな感じでやって 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;

}

618デフォルトの名無しさん:04/11/14 15:50:01
OK
619デフォルトの名無しさん:04/11/14 15:53:15
漏れはatexitでメモリ解放の手続きを行ってる(た)がな
最近C使ってねぇや
620デフォルトの名無しさん:04/11/14 15:53:30
>>617
異常が無いかどうかを正確に判断できるのならね。
621デフォルトの名無しさん:04/11/14 15:55:01
>>616
パイプ使っとけ。
622デフォルトの名無しさん:04/11/14 16:01:58
>>620
> 異常が無いかどうかを正確に判断できるのならね。

何回も実行して特に不都合がなければ異常なしと判断してよいと思っていたの
ですが、何かいい方法はあるのでしょうか。
623デフォルトの名無しさん:04/11/14 16:09:17
ねえよ。
624デフォルトの名無しさん:04/11/14 16:13:16
ひどい。
625デフォルトの名無しさん:04/11/14 16:39:21
質問させてください。

たとえば、

明日は\n
いい\n
天気="晴れ"ですね。\n

という文字列があるとします。

「晴れ」の部分を取り出すときはどうすればいいのでしょうか?
sscanf()関数しかないのでしょうか?
626デフォルトの名無しさん:04/11/14 16:44:01
>>622
気になるならfree()しとけ。気にならないならfree()しなくていいから。
627デフォルトの名無しさん:04/11/14 16:45:30
>>597
すげー亀レスだけど最適化切ればwhile(1)は
cmpしてからjmpすると思う。多分。
少なくともBorland C++ではそうだった気がする。昔試したときは。

ってそういう話ではない?
628デフォルトの名無しさん:04/11/14 16:46:03
>>616
真っ当な回答としては、そのプログラムの開発元に相談しろとしか言えない。
既に何度か書かれているようにpipeを使ってできないこともないが、結構難しい。
後は、要件と開発コスト次第。
629デフォルトの名無しさん:04/11/14 16:46:58
>>625
他にも方法は色々あると思うが、sscanf()を躊躇う理由がないならそれでいい。
630デフォルトの名無しさん:04/11/14 16:48:15
取り出すとはどういう意味だ?文字列の中に「晴れ」が含まれてるか
チェックするにはどうするかという質問?

631デフォルトの名無しさん:04/11/14 17:04:36
>>630
天気="雨" 天気="曇り"という場合もあります。

「雨」「曇り」・・・

sscanf(buf,"明日は\nいい\n天気="%s"ですね。\n",tenki);
これくらいならいいけど、文字列がもっと長くて、取り出したい値が10個あるときにどうすれば・・・
632デフォルトの名無しさん:04/11/14 17:18:24
>>625
strstr()
633デフォルトの名無しさん:04/11/14 17:25:05
明日はいい天気だといってるに雨や曇りがあるのか?
ハァ?
634デフォルトの名無しさん:04/11/14 17:25:16
>>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()とか。
635デフォルトの名無しさん:04/11/14 17:32:05
>>631
sscanf(buf, "%*[^\"]\"%[^\"]", tenki);
636デフォルトの名無しさん:04/11/14 17:34:29
cahr
637デフォルトの名無しさん:04/11/14 17:34:55
^t
638634 :04/11/14 17:35:55
Ctrl-t
639デフォルトの名無しさん:04/11/14 17:35:56
誰か>>633の相手してやれよ
640デフォルトの名無しさん:04/11/14 17:48:52
chasen
641デフォルトの名無しさん:04/11/14 17:52:01
>>634
(;´Д`)スバラスィ ...ハァハァありがとうございます。

そこに入る値が不明(ランダム)の場合はどうしたらよいのでしょうか?
642デフォルトの名無しさん:04/11/14 17:55:41
>>641
ランダムなら、適当な値入れればいいんじゃない?
643デフォルトの名無しさん:04/11/14 18:05:19
>>641
chasenで形態素解析するのと、
「="」が出てきてから「"」までの区間と「="」の一つ前の形態素とを
取り出せばよい。
644デフォルトの名無しさん:04/11/14 18:36:52
>>641
>635は虫界。
645デフォルトの名無しさん:04/11/14 19:05:12
>>643
chasen()関数?初耳だ・・・
勉強せねば・・・

>>644
おお!!thx!!!!!見落としてたよ。

スレの住人様迷惑かけてすみません。
646デフォルトの名無しさん:04/11/14 19:11:46
誰か>>639の呼びかけに応えてやれよ
647デフォルトの名無しさん:04/11/14 19:30:07
>>645
関数ちゃうちゃう…
http://chasen.naist.jp/hiki/ChaSen/
648デフォルトの名無しさん:04/11/14 19:32:29
形態素解析しないと、
「今日はいい天気="晴れ"ですね。」
という構文だと 天気="晴れ" というのが取り出せへんと思うんやけど。
649デフォルトの名無しさん:04/11/14 20:46:09
>>595
じゃあ、おまいの解決方法は?
650デフォルトの名無しさん:04/11/14 21:32:32
651デフォルトの名無しさん:04/11/14 21:49:37
農家の人たちは雨降る(など自分たちに都合のいい天気の)ことをいい天気と呼ぶんだぞ。
652デフォルトの名無しさん:04/11/14 22:06:34
strstr とかの標準関数って、検索したい文字列が日本語でも
ちゃんと動く?
653デフォルトの名無しさん:04/11/14 22:08:52
日本語の文字列の中から1バイトの文字を探そうとすると悲しいことになるかもしれない。
654デフォルトの名無しさん:04/11/14 22:09:47
>>652
実装による。
非標準だがVCやBCCなら_mbsstrなどが用意されている。
655デフォルトの名無しさん:04/11/14 22:20:05
>>652
C++でstd::wstring.find()使えばどう?
656デフォルトの名無しさん:04/11/14 22:23:34
ユニッコードにしちゃえ
657デフォルトの名無しさん:04/11/14 23:31:08
strstr、wcsstr、_mbsstr のヘルプのところにワイド文字版、
マルチバイト文字版と書いてあるのですが、ワイド文字、
マルチバイト文字とは何を指しているのでしょうか。
658デフォルトの名無しさん:04/11/14 23:34:21
>>657
聞くスレをちゃんと選んで聞けよ
659デフォルトの名無しさん:04/11/14 23:51:07
>658
その通りでした。>657の質問は取消ます。
660デフォルトの名無しさん:04/11/15 13:10:37
>>658
うるせぇんだよ。ボケ。
661デフォルトの名無しさん:04/11/15 13:38:21
>>660
黙れ総理大臣
662デフォルトの名無しさん:04/11/15 15:53:41
アセンブリ言語で書いたプログラムをC言語の中で関数として使用するにはどう宣言すればいいですか?
例えばa.asmというのに対してCプログラム中で、extern inline void a();としてやってみましたが、
コンパイル時に function "a" was referenced but not defined となってしまいます。
ご存知の方いたらよろしくお願いします。
663デフォルトの名無しさん:04/11/15 16:23:22
>>662
インラインアセンブラ でぐぐれ
664デフォルトの名無しさん:04/11/15 17:53:22
同一ディレクトリ内にあるすべてのファイルを開く良い方法はありますか?
665デフォルトの名無しさん:04/11/15 18:00:27
環境に依存しますね
666デフォルトの名無しさん:04/11/15 18:06:40
linuxです
opendirとかreaddirを使えばできそうですね
667デフォルトの名無しさん:04/11/15 18:22:56
>>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デフォルトの名無しさん:04/11/15 18:57:34
>>669

シラネぇーよ。
671デフォルトの名無しさん:04/11/15 19:06:30
定番に過ぎるが、
>>670
知らんのなら黙っとけ。な?

>>669
何が返されるのか知らず、マニュアルも見ず、か。
いい度胸だ。
「成功すると引数そのまま、エラー or ファイル終端で NULL」
改行コードでファイル終端と見做されちゃ困るだろう?
672デフォルトの名無しさん:04/11/15 19:37:49
>>671
死ねや。ゴミ糞やろうが。
673デフォルトの名無しさん:04/11/15 19:41:15
>>669-672=ゴミ屑でFA
674デフォルトの名無しさん:04/11/15 19:42:46
定番に過ぎる
675デフォルトの名無しさん:04/11/15 21:10:19
>>669
何も入力せずにリターンを押した場合は、
長さゼロの文字列を入力したことになる。
676デフォルトの名無しさん:04/11/15 22:02:45
>>669
gets()がNULLを返すのはEOFまで読み込んだか失敗したとき。
何も入力していないときはEOFでも失敗でもない。

お前がやりたいことはたぶんこう。getsよりfgetsの方が良いが。
if (gets(buf) == NULL || !strcmp(buf, ""))
  break;
677669:04/11/15 22:18:48
もっとスマートにできる方法教えろ。
678669:04/11/15 22:24:00
>>669
初心者がいきがってんじゃねぇーぞ。
679デフォルトの名無しさん:04/11/15 22:25:46
喧嘩したらだめだよー 騙りもだめー 煽りもだめー 自演もだめー にゃんにゃん
680デフォルトの名無しさん:04/11/15 22:30:05
>>677
そこで関数化ですよ。
inline bool Gets(char *p)
{
  return (gets(buf) == NULL || !strcmp(buf, "");
}
681デフォルトの名無しさん:04/11/15 22:41:53
getsはサイズチェックしないから(ry
682669:04/11/15 23:43:49
質問に答えて下さった方々、ありがとうございます。
何か騙りがたくさんいますが。
getsで読み込んだ時、何も無かった場合のエラー処理がしたかったのです。
676さんの方法でいけそうです。
ありがとうございました。
683デフォルトの名無しさん:04/11/15 23:44:31
いや、strcmp(buf, "")なんて恥ずかしいコード書かなくていいから。
684デフォルトの名無しさん:04/11/15 23:47:08
if (gets(buf) == NULL || buf[0] == '\0' )
こう?
685デフォルトの名無しさん:04/11/15 23:47:18
buf[0] == '\0'
686デフォルトの名無しさん:04/11/16 00:02:26
CでおすすめのRFC無い?
687デフォルトの名無しさん:04/11/16 00:20:06
Request For Comments?
688デフォルトの名無しさん:04/11/16 00:25:44
Readers for C-language
689デフォルトの名無しさん:04/11/16 07:30:08
if (gets(buf) == NULL || !*buf )
690デフォルトの名無しさん:04/11/16 07:31:46
if ( !(gets(buf) && *buf) )
691デフォルトの名無しさん:04/11/16 08:19:42
時差を取得する方法を教えてください
692デフォルトの名無しさん:04/11/16 08:25:31
海外へ飛ぶ
693デフォルトの名無しさん:04/11/16 08:57:04
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 は古い仕様だからなのですか?
695デフォルトの名無しさん:04/11/16 13:51:47
× int test(void);
○ int aaa(void);
696デフォルトの名無しさん:04/11/16 14:03:55
>>694
いえ、gccでもオプションを調整すれば出ます。
つーか、Cはプロトタイプ宣言必須じゃないからね。
引き数無しのプロトタイプはvoidを明記する必要があるわけさ。
697694:04/11/16 14:10:12
わかりました。ありがとうございます。
698デフォルトの名無しさん:04/11/16 14:25:35
ふと思ったのですが,
文書ファイルに文字を上書きをする場合は,単にwrite()で書き込みをすればそれで十分と思ったのですが,
文書ファイルに文字を挿入する場合っていったいどういう処理が行われているんでしょうか?
そのまんま考えてみると,挿入された文字以降のデータを全て移動させないといけないはずなんで,それってものすごい効率悪い処理だな〜って思い,気になってしまいました.
699デフォルトの名無しさん:04/11/16 14:28:31
>>698
http://pc5.2ch.net/test/read.cgi/tech/1095843584/560
なぜ時間差でマルチする?
700デフォルトの名無しさん:04/11/16 15:01:35
>>698
内部では行単位でリストに格納している
やたら長い行だとそれでも効率悪いがそんな文章は滅多にない
701デフォルトの名無しさん:04/11/16 15:31:25
関数へのポインタなんですが、
void (*func)(void) = func1; などとしたとき、

func()
↑と
(*func)()
↑とではどう違いますか?
702デフォルトの名無しさん:04/11/16 15:40:55
>>701
どちらも結果は同じなので、今は書きたい方を書いていいことになってます。
703デフォルトの名無しさん:04/11/16 15:43:19
>>698
こっちのスレだとwrite()の時点でスレ違い。
つーか、あっちでほぼ答が出てるのに何故そのままコピペ?

で、あっちでも書いたけど、普通は入出力を別のファイルにするから問題にならない。
704デフォルトの名無しさん:04/11/16 15:44:21
テキストエディタみたいなものなら通常一文字ごとにファイルに書かないしねぇ。
705デフォルトの名無しさん:04/11/16 20:32:59
>>701
同じだよ。
俺はポインタを通していることを隠したくないんで後者だな。
あくまで個人的な気持ちで、周りに負担をかけてまで突っ張りはしないが。
706デフォルトの名無しさん:04/11/16 20:52:33
構造体のs.memberとp->memberでは区別してるけど、関数呼び出しでは
区別してないって奴ね。言語の決めの問題。
707デフォルトの名無しさん:04/11/16 20:53:46
>>706
ハァ?????????????????????





wwwwwwwwwww

708デフォルトの名無しさん:04/11/16 20:57:06
>>707
706 がわけわかめってとこには同意だが、
おまいさんもちゃんと技術的な話を入れないと同類だよ

(*p).member って書き方も使うときは使う
(*pp)->member なんてメリットねえし
709706:04/11/16 21:36:52
関数呼び出しと関数へのポインタでの関数呼び出しでは
どちらも()を使うけど、構造体と構造体へのポインタでは
使う演算子が違うってことなんだけど。

・関数
func()
(*pfunc)()

・構造体
s.member
ps->member
710706:04/11/16 21:39:16
書き忘れっていうか書き間違い。

関数へのポインタの場合は

pfunc()

でも可。
711デフォルトの名無しさん:04/11/16 21:44:02
配列渡しってなんですか?
712デフォルトの名無しさん:04/11/16 21:54:06
全角文字や漢字の0x5C(\\)を(全角、漢字のものと)特定してはじく方法ってありますか?
713デフォルトの名無しさん:04/11/16 22:00:42
>>712
あります。
ないとも言えます。
文字列を先頭から舐めていけばなんとかなるでしょう。
714デフォルトの名無しさん:04/11/16 22:04:31
SJISなら文字列頭から見ていって、漢字の範囲のコードが出てきたら次の文字は漢字の一部と判定していくのが確実
ユニコードは知らん
715デフォルトの名無しさん:04/11/16 22:10:40
716デフォルトの名無しさん:04/11/16 22:47:09
VC7.1 で stdbool.h をインクルードしようとすると
インクルード ファイルを開けません。'stdbool.h': No such file or directory
とエラーが出てしまいます。
VC7.1 では stdbool は使えないのでしょうか?
717宿題47:04/11/16 22:52:26
>>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
718デフォルトの名無しさん:04/11/16 22:55:23
>>717
stdbool.hは今やC99で標準ライブラリに取り込まれた。
もちろんVCは非対応だが。
719717:04/11/16 22:58:04
>>718
ふむ、情報THX。
C99に対応しているSun-OSのccで見つからないって言われたからないもんかと思ってたよ。
#そういえばC99フル対応のオプションはつけてないなぁ。その所為かな?
720712:04/11/17 00:20:58
>>713-715
どうもでsy
>>714氏の方法でうまくいきました
どうもありがd
721デフォルトの名無しさん:04/11/17 00:31:12
>>720
礼くらいちゃんと言え
722デフォルトの名無しさん:04/11/17 00:52:28
中学生に礼儀をきたいすんな
723デフォルトの名無しさん:04/11/17 00:53:35
つーか、お礼を哀願する回答者って全然かこよくない
724デフォルトの名無しさん:04/11/17 01:04:38
期待はしていない
礼を言えと言っているのだ
725デフォルトの名無しさん:04/11/17 01:07:39
孔子を学びなさい。
周公を学びなさい。
あなたがたに不足しています。
726デフォルトの名無しさん:04/11/17 01:13:14
>>725
なにそれ。
要点いってくれないかなー
727デフォルトの名無しさん:04/11/17 01:16:10
>>726
ただ、学びなさい。
それが貴方に必要なことです。
学べばそういう言動はなくなるでしょう。
728デフォルトの名無しさん:04/11/17 01:20:23
>>727
ばっかじゃねーの?
729デフォルトの名無しさん:04/11/17 01:26:37
>>728
学びなさい。
730デフォルトの名無しさん:04/11/17 01:27:06
>>728
学びなさい。
731デフォルトの名無しさん:04/11/17 01:28:09
あなたも学びが足りないようですね。
732デフォルトの名無しさん:04/11/17 01:28:14
>>728
学びなさい。
733デフォルトの名無しさん:04/11/17 01:28:34
>>731
学びなさい。
734デフォルトの名無しさん:04/11/17 01:29:35
>>733
もう終わり?
735デフォルトの名無しさん:04/11/17 01:30:24
このスレ自体が、学びからかなり遠いんだが
宿題を他人にやらせる。これ最低
736デフォルトの名無しさん:04/11/17 01:31:26
なに釣られてんの?w
737デフォルトの名無しさん:04/11/17 01:31:40
>>735
仕方が無いじゃないか
このスレ無かったら、CやC++のスレが宿題であふれちゃうぜ
738デフォルトの名無しさん:04/11/17 01:33:50
>>737
ここは宿題スレじゃないが。
何時間寝てないですか。
739デフォルトの名無しさん:04/11/17 01:44:22
C 言語というか indent の `{' について質問.

struct {
char n[20]; int i;
} test[] = {
{"A", 1},
};
を indent 使って整形すると, (いろいろオプションは試したのですが)
struct
{
char n[20];
int i;
} test[] =
{
{
"A", 1},};

となります.

関数は
func(void)
{
となって欲しいんですが,
構造体は
struct {
となって欲しいんです.

何かテクがありますか?
740デフォルトの名無しさん:04/11/17 01:45:20
>>739
自分で作れば?
741デフォルトの名無しさん:04/11/17 02:03:58
>>740
ないのね
742デフォルトの名無しさん:04/11/17 02:11:39
Windows環境において fork で子プロセスを生成するしたいのですが、
Cygwinを使わずに実現する方法はありますか?
743デフォルトの名無しさん:04/11/17 02:12:18
VM
744742:04/11/17 02:22:54
>>743
VMですとなぜかインストールから数日経つとXWindowが
立ち上がらない状態に陥り使い物にならず困っています。

他の方法はありませんか?
745デフォルトの名無しさん:04/11/17 02:28:27
>>743
VMって何?
VirtualMachine?
VMWare?
人にわかるように書いてほしいものだ。
746デフォルトの名無しさん:04/11/17 02:33:06
Vitamin, Mineral
747デフォルトの名無しさん:04/11/17 02:35:50
>>742
SFU
748デフォルトの名無しさん:04/11/17 02:38:24
>>746
どうやってソレでforkを実現するのだ?
749デフォルトの名無しさん:04/11/17 02:39:11
>>748
forkで喰えば
750デフォルトの名無しさん:04/11/17 02:42:52
>>742
Cygwinで使えたっけ?できなかったような?
751デフォルトの名無しさん:04/11/17 02:47:11
>>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
白黒画像のビットマップファイルを取り入れて、ある色の濃さ以上のみ表示して、その他は切り捨てると言う様な事をしたいんですけどどういった手順でしたらいいかご教授願います。初心者なんで分かりにくい文ですみません。
753デフォルトの名無しさん:04/11/17 11:35:58
すべての点について、周囲の点の数をカウントする
754デフォルトの名無しさん:04/11/17 11:44:28
>>752
機種も環境も書いてないのに回答できるわけないだろ。
755デフォルトの名無しさん:04/11/17 11:49:51
(1)ファイルを読み込む。
(2)ある色の濃さ以上のみを表示する。


以上

756デフォルトの名無しさん:04/11/17 15:54:56
アルゴリズムを聞きたいのか?
白黒って、本当にモノクロームなのか。それともグレイスケールなのか。
それによってかなり違う。
後者なら簡単なので説明略。
前者なら、濃い部分=点の密度の高い部分として
>>753のいうように小さなブロック内の色の平均をとる。モザイクみたいに。
757test ◆.CzKQna1OU :04/11/17 20:37:51
test
758test ◆pAe7pK8jnY :04/11/17 21:41:54
test
759デフォルトの名無しさん:04/11/17 22:45:09
>>754
機種とか環境に依存すると思うなら素直に追い払えばいいのに
760デフォルトの名無しさん:04/11/17 23:38:59
来年から入る会社にC言語を使うと言われたのですが
なにを勉強すればよろしいでしょうか?ポインタの基礎程度までの知識はあるつもりです
なにか良い書籍や、作っといたほうがいいプログラムがあれば教えて下さい
761デフォルトの名無しさん:04/11/17 23:40:27
>>760
そこまで分かってるなら後は研修で習うんじゃないか?
762デフォルトの名無しさん:04/11/17 23:46:26
>>760
その会社で何をやってるかわからないのに、助言できんわ。
763デフォルトの名無しさん:04/11/17 23:48:22
C++やってみてもいいんじゃなかろうか。
多分にスレ違いな気がするけど。
764デフォルトの名無しさん:04/11/18 00:47:44
>>760
> ポインタの基礎程度までの知識はあるつもりです
まずはポインタを便利に使ったプログラムを紹介してみては?

アイディアが浮かばないならば
そのへんを勉強すればいいと思うし
765デフォルトの名無しさん:04/11/18 07:14:59
>>760
とにかく基本をしっかり
・二重ポインタ
・構造体の配列
・分割コンパイル
・アルゴリズム(ソート、圧縮、行列、etc...)

スタイルは入社後でないと無理

実行環境は配属先が決まらないと雲を掴むような話
デバドラあたりがんがん作ってたりする位ならまだしも
ちょっとかじってる程度ならどれやっててもないよりまし位
766デフォルトの名無しさん:04/11/18 08:04:44
>>765
加えて、行列とポインタの区別かな
767デフォルトの名無しさん:04/11/18 08:12:47
行列とポインタねぇ・・・
768デフォルトの名無しさん:04/11/18 08:17:39
行列って何れふか
769デフォルトの名無しさん:04/11/18 08:52:49
ベクトルじゃないか?
770デフォルトの名無しさん:04/11/18 09:04:32
>>769
それC++のSTLのこと言ってる?
771デフォルトの名無しさん:04/11/18 10:22:30
配列でしょ
772デフォルトの名無しさん:04/11/18 10:24:37
>>771
空気嫁
773デフォルトの名無しさん:04/11/18 10:56:34
774デフォルトの名無しさん:04/11/18 11:06:53
「ポインタの基礎」ってどういう意味なんだろうね。
煽りじゃないよ。
どのくらいを知っていると「基礎」って言えるんだろう。
int *abc; と宣言するとポインタ変数になります。 くらいで基礎?
775デフォルトの名無しさん:04/11/18 11:10:00
>>760
俺の特にオススメは

1:プログラミング言語C  、共立出版株式会社、カーニハン&リッチー
2:Cプログラミング専門課程、技術評論社   、藤原博文
3:Cプログラミング診断室 、技術評論社   、藤原博文

の3冊、どれも¥3000でジャリ銭釣りが来る値段。

1はANSI規格本なので俺はC言語で仕事する時は必携と思ってる、
 が翻訳本の常かチョット読みづらい。
2、学生の時ポインタが理解し切れなかったとき、これで
 C言語のメモリを意識するという意味を理解した。
 関数も配列も構造体もポインタも多重だろうが
 全ては所詮メモリと悟りたければオススメ。
 俺はこれでCを飛躍的に開眼した。
3、これはダメなプログラムの見本集の意味合いも強いので、
  自分を戒めるために時々再読するためにオススメ。

他にも色々あるが取り合えずこんだけ
776デフォルトの名無しさん:04/11/18 11:38:37
>>774
メモリがイメージできるかどうか
777デフォルトの名無しさん:04/11/18 12:11:38
>>760
プロンプト画面で良いから
入力/閲覧が出来る日記プログラム作ったら?
・ファイルの入出力
・画面表示
・ちょっとしたDB設計
・構造体の設計
・配列のポインタ
・構造体のポインタ配列の繋げ変え
・メモリの確保
etc・・・
結構いろいろな事が出来ると思うぞ。

>>774
ポインタの基礎って言うと
実体とアドレスだから
char *cP = Null; の *cP と cP の意味知ってれば良いんでない?
ホントに最低の基礎だが。
778デフォルトの名無しさん:04/11/18 12:26:45
>>775
1:規格本としてしか利用しないなら規格本を買えばいいので不要。或いはManOnWWWでいい。
2:これでもいいけどこの辺はひとそれぞれかな。
3:Webで読めるから不要。一度通しで読みたいなら借りれば充分。

>>760
「ダブルポインタなら大丈夫です」と自信ありげに面接のときに言ってた香具師がいたが、
入社してから「トリプルポインタはよく判らないんですよぉ」と言いやがった。
こういうのは、ポインタの基礎ができていない典型。
まぁ、余裕があるなら何かテキストファイルの加工をするようなツールでも作ってみたら?
その辺りのイメージが湧かないなら「プログラミング作法」を読んでみてもいいかと。
#但し、言語がRatforなのでコード丸写しはできないが。
##私自身は、そのお蔭でより勉強になったし知らない言語に対する恐怖が減ったが。
その会社がもし合わないようなら就職フェアで待ってるからw
779デフォルトの名無しさん:04/11/18 12:27:53
Cで、列挙子を文字列として取得する方法ってありませんか?
780デフォルトの名無しさん:04/11/18 12:35:56
>>778
C言語歴13年の自分ですが「ダブルポインタ」「トリプルポインタ」と
いう言葉は初耳。なにそれ?

781デフォルトの名無しさん:04/11/18 12:48:04
>760
ポインタはアドレスを格納するための「変数」で、
配列はアドレスを示す「ラベル」の働きをすることを認識できればいい。

char* pc;
char ac[10];
pc = ac; // ポインタ変数pcに配列acのアドレスを代入する

因みにポインタ変数のバイト数は不定だが、4バイトであることが多い。

作っておいた方がいいプログラムはファイルの16進ダンプかな?
782デフォルトの名無しさん:04/11/18 12:52:27
>>778
>>760 にススメたのを評価するは分かるが、
何故「不要」までいいだすの?ナゾ・・・
それに1.に関して「規格本を買えば良い」ってアンタ・・・
この本の意味や知らないだろ?amazonで良いから見て来いよ。
今更「知ってる」言っても嘘バレバレだぞ

783デフォルトの名無しさん:04/11/18 13:14:40
>>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 を勉強中のテキストとして用いたときで
そんなのがまだ必要なレベルで仕事している人の苦労は察して余りある
786デフォルトの名無しさん:04/11/18 14:38:54
持ってないなら手元に置いといたらいいと思うが。
どうにも煽りたいんだろうけど。
787デフォルトの名無しさん:04/11/18 14:56:19
ぽいんたはやっぱり
いんたーふぇーすで使うのが良い。
あぽいんとめんとを取っておかないとえらーになり
きなくさいことに暴走する事もある。
あの星をつかみたいなら
いでたちを綺麗に整えば
かすかに手が届きそうかと思う。2列。
788778:04/11/18 15:25:25
>>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が出力されません。なぜそうなるか教えてください
792デフォルトの名無しさん:04/11/18 16:37:39
>>791
誤差
793デフォルトの名無しさん:04/11/18 16:40:34
>>791
floatの演算は10進演算ではないから誤差が出る。
forループの中でfを使いたいなら、
for (int i = 10; i >= 1; i--) {
f = i / 10.0;
}
としろ。
794791:04/11/18 16:42:15
>>792
誤差なのは分かりますが、もう少し詳しく教えてください。

逆にfloat f;
for(f = 0.1;f <= 1.0;f = f+0.1){
printf(" %f \n",f);
}
としたときも 0.100000 〜 0.900000 までしか出力されません。
795791:04/11/18 16:44:08
>>793
たしかにそうなんですが、大学の課題でなぜそうなるか考察汁って言われたのでお願いします
796デフォルトの名無しさん:04/11/18 16:48:48
>>795
>>1のリンク先は当然チェック済みなんだろうな?
797デフォルトの名無しさん:04/11/18 16:50:05
だから誤差
798デフォルトの名無しさん:04/11/18 16:50:43
>>794
ttp://pc21.nikkeibp.co.jp/special/gosa/
言語は変わるが主旨は同じだ
たっぷり30分は考えるといい
799デフォルトの名無しさん:04/11/18 16:51:07
行列演算を関数化するとどんな感じなの?

ていうか行列からしてよくわかんないんだけど。
800デフォルトの名無しさん:04/11/18 17:02:55
>>794
「0.1」は2進数で表せないから。
801デフォルトの名無しさん:04/11/18 17:10:50
>>791
0.1 を 2進数 で表してごらん
802デフォルトの名無しさん:04/11/18 17:16:37
>>800-801
質問の意味わかってるのかな
803デフォルトの名無しさん:04/11/18 17:18:24
丸め誤差だっけ?
804デフォルトの名無しさん:04/11/18 17:23:09
>>802
どのみち、それ以外の説明ないが
805デフォルトの名無しさん:04/11/18 17:28:53
浮動小数点に対する等値比較があること自体、仕様のバグだろ
ただし、ここで言う等値比較とは == != <= >= ! を指す
806デフォルトの名無しさん:04/11/18 17:30:52
この場合は <= じゃなく < にしても同じだろ
807デフォルトの名無しさん:04/11/18 17:34:01
普通に出力されたけど折れの環境は何かおかしいのかな
808デフォルトの名無しさん:04/11/18 17:42:51
>>807
別におかしくない。浮動小数の内部表現形式が違うだけ。たぶん。
809デフォルトの名無しさん:04/11/18 18:10:45
で、 0.1 を内部表現するとどうなるの?
810デフォルトの名無しさん:04/11/18 18:33:16
>>791
嘘をつくな
printfの書式制御文字列と出力が一致しない
811デフォルトの名無しさん:04/11/18 19:22:46
>>810
特定の環境では'\\'を書き込もうとすると'\'に置き換えられるからしょうがねぇべさ。
812デフォルトの名無しさん:04/11/18 19:34:54
>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 でそんな出力など出るものか
814デフォルトの名無しさん:04/11/18 20:13:06
プログラミング言語Cか、俺も手元に置いてるな
なんか基礎本サヨナラ&紙媒体持たない派が多いみたいだけど
使える言語の基礎確認本は1冊くらい手元に置いておかないの?
それと、金融系の仕事が多く自前PC持ち込めなかったり環境制
限が厳しい俺には紙媒体はまだまだ現役だよ。
815デフォルトの名無しさん:04/11/18 20:23:07
>>814
金融系って説得力の補強のつもりで言ってるのか?
物事を確認すべきときの情報源の選択に関して論外な発言をしながらでは逆効果にしかなってないぞ
816デフォルトの名無しさん:04/11/18 20:27:07
使える言語/OS/ミドルウェア/ライブラリ/プロトコルの基礎確認本を
全部手元に置いていたらいくらスペースがあっても足りない。
817デフォルトの名無しさん:04/11/18 20:27:45
>>815
意味分からん
818デフォルトの名無しさん:04/11/18 20:27:52
>>816
繰り返す
物事を確認すべきときの情報源の選択に関して論外な発言をしながらでは逆効果にしかなってないぞ
819デフォルトの名無しさん:04/11/18 20:28:43
>>817
一次情報って言ってるんだが、本気で意味わからないのか?
820デフォルトの名無しさん:04/11/18 20:29:07
紙の方がはるかに視認性が高いよ
wwwでトロトロ検索閲覧するより、ずっと楽
821デフォルトの名無しさん:04/11/18 20:30:23
まぁ、K&R引きながらコーディングしてる奴は信用できないのは確かだ。
822デフォルトの名無しさん:04/11/18 20:31:12
>>820
www って誰が言い出したんだ?
相次ぐ金融系のシステムトラブルはもしかして
1人のアフォに業界全体が振り回されている痛い構図か?
823デフォルトの名無しさん:04/11/18 20:31:55
また変なのが沸いたねw
824デフォルトの名無しさん:04/11/18 20:41:29
wwwとかは>>778が言ってるな
825デフォルトの名無しさん:04/11/18 20:48:43
質問です

C言語はクリトリス言語の略ですか?
826デフォルトの名無しさん:04/11/18 20:50:15
827デフォルトの名無しさん:04/11/18 20:55:09
違うでし。おしっこしーしー言語でし
828デフォルトの名無しさん:04/11/18 21:22:05
A
B
C
D


Z 言語までいくとあれか? 死姦とか?
829デフォルトの名無しさん:04/11/18 21:38:49
自演乙
830デフォルトの名無しさん:04/11/18 21:44:49
>>813
ブラウザの話ね。'\\'と書いたのは勇み足。
'\n'と書こうとして'\n'になったんでしょって話。
831デフォルトの名無しさん:04/11/18 21:52:29
テメェら死ねや。wwwwwwwwwww

ww
wwwww

wwwwwwwwww
www


wwww


wwwww

832デフォルトの名無しさん:04/11/18 21:58:05


while(fscanf(fp, "%c", c)==1){
printf("%c", c);
}


途中にfscanfがあるのですが、whileを抜けません。ファイルの終わりまで来ても
1を返し続けているようです。ファイルの終わりでwhileを抜けるにはどうしたらよい
ですか?
833デフォルトの名無しさん:04/11/18 22:07:17
while(fscanf(fp, "%c", c) != EOF)
じゃダメかい?
834デフォルトの名無しさん:04/11/18 22:13:24
その前にfscanf(fp, "%c", &c)の間違いじゃないか?
それに欲を言えば(f)getc/putcharにしろ。
835デフォルトの名無しさん:04/11/18 22:17:01
>ブラウザの話ね。

プ
某に毒されてるだけだって
正直に言えよ、ホモ野郎w
836デフォルトの名無しさん:04/11/18 22:21:46
なんかしらんが、\nという表記を知った人が偉そうにしてるようです。
半可通ほど居丈高の法則ですな。
837デフォルトの名無しさん:04/11/18 22:26:59
ウホな香具師ほどホモと言われると必死こくなw
838デフォルトの名無しさん:04/11/18 22:31:51
 ○ 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
からしレンコンと言われたオヴァヴァの本音と建て前
840デフォルトの名無しさん:04/11/18 22:48:05
>>838
それは、終点ノードまでの最短の経路長ってことでいいのかな?
841838:04/11/18 22:59:07
>>840
そうです。
無限ループで値が割り振られていない隣り合うノードに1、2…と値を割り振っていって
最終的に割り振るノードが無くなったら終了すればいけると思うんですけど…

ネットワーク図のコピーをとって、値を割り振ったノードへのリンクを消していく(1を0にする)
既に値が入っている場合は無視する部分のアルゴリズムをプログラムで表現するのが
かなり難しいです…
842デフォルトの名無しさん:04/11/18 23:03:50
843838:04/11/18 23:07:44
トリップつけるべきだった…
844デフォルトの名無しさん:04/11/18 23:09:52
>>843
全ノードを辿ることが出来てるなら、その時点で経路長は分かってるはずだが
845838:04/11/18 23:11:55
そんなことは分かってるんですよ。もうあなたには答えていただかなくて結構です!
ごちゃごちゃやってんと、プログラム自体晒せや。
846デフォルトの名無しさん:04/11/18 23:15:00
>>843
つーか、別にマルチでもいいんだよ
あなたがどこで何を聞こうが、それはあなたの主権だし
色んな人に聞いて回るのは聞き込み調査の基本だよ
収穫があってもなくても会釈くらいしろって話に過熱したバカガキが
マルチ=無礼者の判断基準を勝手に制定したがっているだけ
バカガキの必死=自演の大合唱
これのほうが説得力ありすぎるのはみんなわかってる
847デフォルトの名無しさん:04/11/18 23:18:31
とりあえずダイクストラ法でいいんじゃない?
848 :04/11/18 23:19:09
844=845=846 
849デフォルトの名無しさん:04/11/18 23:21:31
842=848
850 :04/11/18 23:23:52
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
854デフォルトの名無しさん:04/11/18 23:35:10
前に出た問題と同じじゃないか。
既出も既出、大既出だよ。
855デフォルトの名無しさん:04/11/18 23:37:01
>>854
一人で過去ログ読んでろオナニー小僧
856デフォルトの名無しさん:04/11/18 23:51:29
>>855=838
何この人
857デフォルトの名無しさん:04/11/19 00:00:20
既出既出とうるさいキモヲタは臭いデブ
858デフォルトの名無しさん:04/11/19 00:01:04
c言語初心者です。
関数内で配列Aを逆順した配列Bを作るにはどうすれば良いですか?
859838 ◆e.FqsY.OU2 :04/11/19 00:02:17
ご迷惑をおかけして申し訳ございません…
トリップつけました。

>>844
経路長は辿っていけば分かるんですけど、
最短経路長を出すのに
無限ループ(隣のノードが無くなるまで){
隣のノードに経路長を記録
隣のノード番号を配列に記録
}

>>847
ダイクストラ法も調べたんですけど、
ランダムに生成されるネットワークである点と
向きが無い点、リンクの長さが均一な点が違いまして…
参考にはなったんですけど。
860デフォルトの名無しさん:04/11/19 00:04:56
なんだか自分のこと良くわかってない人が粘着しています
861838 ◆e.FqsY.OU2 :04/11/19 00:05:18
>>844
経路長は辿っていけば分かるんですけど、
最短経路長を出すのが上手くいかなくて…
無限ループ(隣のノードが無くなるまで){
隣のノードに経路長を記録
隣のノード番号を配列に記録
}
とやればうまくできそうなんですけど…
862デフォルトの名無しさん:04/11/19 00:06:10
キモヲタデブというイメージはキモヲタどもが自分はヲタではないと自らを納得させるために作り出した幻影に過ぎず
大部分のヲタは実際にはデブではない。
863デフォルトの名無しさん:04/11/19 00:32:43
>>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の違いは何でしょうか?
よろしくお願いします。
865デフォルトの名無しさん:04/11/19 00:35:21
floatとdouble
866デフォルトの名無しさん:04/11/19 00:40:55
>>861
0、1とかをノードと名付けたとして、ノードを結ぶ線に番号つけて、
その番号の順列組み合わせをしていったらどうかね。
その順列組み合わせのうち

・始点または終点がノードを共有してないもの
・これまでに出てきたもの

を最初に省いちゃう。線の数が距離ね。
順次計算していって、えーと終了条件が問題っすね。
線の数に等しくなったら終了なのは明らかだけど、
それ以前に終わる条件があるようなきもする。
867デフォルトの名無しさん:04/11/19 00:46:08
AからBへの距離を求めるには。
Aに隣接する点をマークする(距離1)。
距離1に隣接し、かつまだマークされていない点をマークする(距離2)。
以下Bに到達するまで。
Aからだけ行うよりも、
AとB両方から歩み寄るほうが速い事が期待できる。
868デフォルトの名無しさん:04/11/19 01:13:54
文字配列(例:char a[20])の中身を全て空にする関数とかないでしょうか?
869デフォルトの名無しさん:04/11/19 01:24:50
>>868
memsetを使う
完全に文字列としてしか使わないならa[0]='\0';でも見かけ上は同じだが
870デフォルトの名無しさん:04/11/19 01:26:09
「空」とはどういう状態のことを言うのか定義せよ。
とりあえず、文字配列てことだから、

void strclear(char *s)
{
*s = '\0';
}

でどうだ。
871デフォルトの名無しさん:04/11/19 01:38:00
お二人ともレスありがとうございます。

空にする時に文字配列の一つ一つに'\0'を入れていたのですが、'\0'が反映されてないのか配列に数字が残ってる事があったもので…
とりあえずmemsetを使ってみたところきちんとできました。念のため確認したいのですが、char型のa[20]を初期化する場合、
 memset( a , 0 , 99 * sizeof(char) );
で大丈夫でしょうか?
872871:04/11/19 01:39:04
99→20だった…度々すみませんorz
873デフォルトの名無しさん:04/11/19 02:05:04
'\0'が反映されてないのか配列に数字が残って
'\0'が反映されてないのか配列に数字が残って
'\0'が反映されてないのか配列に数字が残って
'\0'が反映されてないのか配列に数字が残って
'\0'が反映されてないのか配列に数字が残って
874デフォルトの名無しさん:04/11/19 02:05:43
>>871
99→20で一応正解。ただ、規格によりsizeof(char)はつねに1なので、省略してもOK

#これは場合にもよる。趣味とかコーディングルールとか。

aが確実に配列なのであれば、

memset(a, 0, sizeof(a));

のほうがいいかも。
875デフォルトの名無しさん:04/11/19 02:11:22
>>874
いつも思うんだけど、
sizeof( T[N] )==sizeof( T )*N って、保証されてるんだっけ?
これが強制されると配列内にコントロールデータを埋め込むことが出来なくなるよね。
(実際に埋め込んでるコンパイラは見たこと無いけど)
かといってこれが保証されてないと
N = sizeof( array )/sizeof( array[0] ) が軒並み破綻するわけだけど。
876デフォルトの名無しさん:04/11/19 02:18:43
コントロールデータって何?
877デフォルトの名無しさん:04/11/19 02:20:41
なんかデバッグ情報とかさ。
878デフォルトの名無しさん:04/11/19 02:24:31
>>877
うーん、コントロールデータがわからん。もうちょっと詳しく。
ただ、少なくとも
sometype A[N];
という、sometype型の配列があったときは
sizeof(A) == sizeof(sometype) * N
が真になることは保証されてる。
879デフォルトの名無しさん:04/11/19 02:27:05
誰が保証してくれたの?
880デフォルトの名無しさん:04/11/19 02:53:50
ANSIじゃない?
881デフォルトの名無しさん:04/11/19 03:00:05
確かANSIのsizeofのExampleの所にも
配列の要素数を求めるのに使える てな例が載ってたな
882デフォルトの名無しさん:04/11/19 03:13:00
ただし関数に配列を渡すとポインタと同じ扱いになるので要注意
と釘を刺してみる
883デフォルトの名無しさん:04/11/19 03:52:48
前回のリターン入力から今回のリターン入力までの
経過時間を測定する関数を作りたい
scanfを利用して、文字か整数かの入力待ちでなら作れそうなんですけど
どうやってリターンの入力待ちを行うのでしょうか
884デフォルトの名無しさん:04/11/19 03:56:20
getchar();
885デフォルトの名無しさん:04/11/19 03:58:37
('A`)ハハーナルホド ソクレスアリガトウ
886デフォルトの名無しさん:04/11/19 08:57:48
ここって来てる人自体は少ないな、結構浮上してるから見に来たのだが、
ID無いのも相まって少数の人が必死に書いてる感じ。
特に高圧的な文体数人が目立つ、朝から晩まで筆まめだな仕事しろよ(w
まぁこの業界の教えたがりは大抵居丈高だが
887デフォルトの名無しさん:04/11/19 09:01:50
>>875
コントロールデータ埋め込んで例えば何がしたいの?
実行時 sizeof ならコントロールデータをカウントしない値を返せばいいし
配列と称して実はリストとか言い出すと、連続領域ではなくなるわけで
サイズはと訊かれても答えようがなかったりするよな
ちなみに sizeof array / sizeof array[0] は規格票の文中でも使ってるぞ
888デフォルトの名無しさん:04/11/19 09:07:03
どこだって教えたがりは大抵居丈高だよ・・・・自尊心のかたまりだから
889デフォルトの名無しさん:04/11/19 09:30:19
>>886
どこかで苛められたのかい?可哀相に。ヨシヨシ
890デフォルトの名無しさん:04/11/19 09:38:05
リアルで無能だと教えるのもうっとうしくなるからなあ
891デフォルトの名無しさん:04/11/19 09:38:57
俺の経験上、居丈高に教えてるのは初心者に2,3本毛が生えたやつらだよ。
多少分かるようになった初心者は、お前こんなのも分からないのかよと馬鹿にしつつ自分の知識をひけらかしたくなる。
もう少しすると興味が無くなるのでROMるかスレ自体からいったん離れる。
さらにもう少しすると煽りに徹するようになる。答えは書かない。ピンポイントでヒントだけ教えてやる。
安易に答えを教えてしまうと質問者のためにならないから。
さらにもう少しすると再びROMる。
すっかり古参と化した彼らはスレと住人たちのの成長を生温かく見守るようになる。
892デフォルトの名無しさん:04/11/19 09:44:50
神の如く、か。
893デフォルトの名無しさん:04/11/19 09:49:31
>>891
なにげにワロタ
894デフォルトの名無しさん:04/11/19 10:11:46
>>887
>sizeof array / sizeof array[0]
俺はいつも numberof って名前でマクロ書いてる。
つか、どうせなら標準マクロにしてくれればよかったのに。
// offsetof は標準化されてるのになあ…
895デフォルトの名無しさん:04/11/19 10:30:36
>>さらにもう少しすると煽りに徹するようになる。答えは書かない。ピンポイントでヒントだけ教えてやる。
俺ここ
896デフォルトの名無しさん:04/11/19 11:55:58
886は馬鹿。
895は大馬鹿。
897デフォルトの名無しさん:04/11/19 12:52:58
>>894
激しく同意
898デフォルトの名無しさん:04/11/19 13:01:01
>>896
激しく同位
899デフォルトの名無しさん:04/11/19 13:31:42
激しく同電位
900タヌキ:04/11/19 14:45:43
C言語には関係ないのですが教えてください
いくら叩かれたって煽られてもいいです知りたいのです!

CGIについてなのですが
http://homepage1.nifty.com/kodayan/cgi/con2/pass1source.htm
このページを参照してくれませんでしょうか
このCGIの設置方法を教えてください
AAA!CAFEというところでCGIを使いたいのですが
901デフォルトの名無しさん:04/11/19 14:48:07
>>900
そんなに寂しいのか?
902デフォルトの名無しさん:04/11/19 14:52:05
激しく同位体
903デフォルトの名無しさん:04/11/19 14:56:23
そういえばAAA!CAFEの管理人okkakii元気かな?
904デフォルトの名無しさん:04/11/19 15:36:19
激しくどうでもいい
905デフォルトの名無しさん:04/11/19 17:55:14
fread で、EOF の場合でも読み込めたバイト数知りたいのですが、
なにか手はあるのでしょか。
それとも fread が無理だとして、簡易な別の手段とか。
906デフォルトの名無しさん:04/11/19 17:56:08
?
907デフォルトの名無しさん:04/11/19 18:17:27
>>905
freadは読み込めた個数を返すよ。EOFは返さない。
908デフォルトの名無しさん:04/11/19 23:08:09
>707の気持ちは分かるけど、書き込んだのは間違い。
>708は存在する意味が分からない。
909デフォルトの名無しさん:04/11/19 23:08:50
>904
スルーできない理由は何?
910デフォルトの名無しさん:04/11/20 00:34:11
奇特な方がいたら教えてください。
C言語で作成したプログラムをVC++でコンパイルして実行ファイルだけ抜き出す。
実行ファイル(exeファイル)だけから作製したプログラムを逆算することはできるのでしょうか?
できないと思うのですが、それで正しいのでしょうか?
911デフォルトの名無しさん:04/11/20 00:35:31
奇特な方がいたら教えてください。
C言語で作成したプログラムをVC++でコンパイルして実行ファイルだけ抜き出す。
実行ファイル(exeファイル)だけから作製したプログラムを逆算することはできるのでしょうか?
できないと思うのですが、それで正しいのでしょうか?

912デフォルトの名無しさん:04/11/20 00:38:17
危篤ですので答えてあげる余裕がありません
913デフォルトの名無しさん:04/11/20 00:40:14
奇特な方がいたら教えてください。
C言語で作成したプログラムをVC++でコンパイルして実行ファイルだけ抜き出す。
実行ファイル(exeファイル)だけから作製したプログラムを逆算することはできるのでしょうか?
できないと思うのですが、それで正しいのでしょうか?

914デフォルトの名無しさん:04/11/20 00:43:51
>>911
できない。
Releaseビルドされたものは
dumpbin /disasm kusosure.exe
で逆アセンブルまではできるが逆コンパイルは
シンボルファイルがないと無理
915デフォルトの名無しさん:04/11/20 01:01:26
>>914
Oh!産休!
やはりできないのですね。
じゃ、例えばWindowsとかのプログラムがCD-ROMから読み取ることができるなんてもなしですね。
916デフォルトの名無しさん:04/11/20 01:52:53
いや、だからプログラムそのものは読み取れるけれども、それから
ソースファイルを再現することはほぼ不可能と言っているのだよ。
917デフォルトの名無しさん:04/11/20 02:04:22
.NETやJAVAみたく中間言語挟んでるやつは可能だけどな
918デフォルトの名無しさん:04/11/20 02:08:59
下のはテキストファイルの中身を行単位でランダムに並べ替えるプログラムなんですがエラーがでます。指摘・アドバイスお願いします.

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);

}
919デフォルトの名無しさん:04/11/20 02:11:42
>>918
どこでどんなエラーが出るか書け!クソめ!
920デフォルトの名無しさん:04/11/20 02:20:55
> char mozi[50][50],mozi2[50]; //ファイルの中身は50文字*50行と仮定

>kazu = GetRand(50); //GetRand(50)で0〜50の間で乱数を取得
>kazu2 = GetRand(50);

ここぢゃね?
921デフォルトの名無しさん:04/11/20 02:23:15
すいません。35行目でエラーがでます。
922デフォルトの名無しさん:04/11/20 02:27:27
35行目ってどこよ?
質問の仕方すら分かんねーのか?
923918:04/11/20 02:39:30
エラーメッセージは、
「test.exe の 0xcccccccc で初回の例外が発生しました : 0xC0000005: 場所 0xcccccccc を読み込み中にアクセス違反が発生しました」
「test.exe の 0xcccccccc でハンドルされていない例外が発生しました : 0xC0000005: 場所 0xcccccccc を読み込み中にアクセス違反が発生しました。」
の二つが出ていて具体的な場所は表示されてませんでした。
924デフォルトの名無しさん:04/11/20 02:43:32
GetRandが50を返してるんじゃね?
925デフォルトの名無しさん:04/11/20 02:44:10
空行入れても30行しかないわけだが

>>920のとこじゃね?
926918:04/11/20 02:47:35
GetRandはライブラリの関数なんでそっちの方も覗いてみます
。レスくださった方々ありがとうございます。
927デフォルトの名無しさん:04/11/20 02:57:56
>なんでそっちの方も覗いてみます

...いや、そっちぢゃねーだろ

>GetRandが50を返してるんじゃね?
って読めてる?
928デフォルトの名無しさん:04/11/20 06:57:15
age
929デフォルトの名無しさん:04/11/20 09:29:56
#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";
}

問題はやった奴が何が起きるのかを理解しているかであって
言語の不備じゃない
932java to c:04/11/20 11:31:17
>>931
ありがとう。
参照を返せるってことですね
933デフォルトの名無しさん:04/11/20 11:39:44
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?
936デフォルトの名無しさん:04/11/20 12:18:10
>>935
別物。拡張子は *.lib とか。複数の *.obj をいい感じに連結してある。
と言っても、リンカに渡すときは殊更 *.obj と *.lib を区別する必要もない。
937デフォルトの名無しさん
なるほどです