C言語なら俺に聞け(入門篇) Part 39

このエントリーをはてなブックマークに追加
1volatileな名無しさん
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 117代目
  http://pc11.2ch.net/test/read.cgi/tech/1225320579/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 38
  http://pc11.2ch.net/test/read.cgi/tech/1225451731/
過去スレ
  http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2volatileな名無しさん:2008/11/15(土) 05:06:31
>>前スレ994
たとえば、次のようなコードを書いたとしよう。

a = b = 1 + c;

これをコンパイルして実行したとして、コンピュータの中でどういうことがおきるか。

コンピュータは、まず「1」を評価する。
この「評価する」というのは、「1」を整数の1であると認識して、
その整数値1をコンピュータが持っている小さな机の上に乗せることを意味する。

次に、「c」を評価する。
今度は、変数cの中に入っている値(仮に整数の2だったとしよう)を取り出して、
その値(仮に2)をさっきの1と一緒に机の上に並べる。

そして、今度は「1 + c」を評価する。
これは、いま並べて置いた整数値1と2を足して3という数を作り、
「1 + c」という式の値として、改めて机の上に置くことを意味する。

さらに、「b = 1 + c」を評価する。
ここで「1 + c」は3であることがわかっており、それは机の上にある。
そして「=」は代入するという演算子なので、変数bに整数値3を代入(コピー)する。
ここで、机の上の値3はなくなったわけではない。
この値は、「b = 1 + c」という式の値としてまだ残っている。

最後に、「a = b = 1 + c」が評価される。
上で書いたとおり、「b = 1 + c」は3として評価されているから、
変数bに値を代入したのと同様に変数aに3を代入する。
値3は、「a = b = 1 + c」の値として再度机の上に残されるが、
「;」が現れて「この文で行う作業は終わりです」ということになるので、
ここで残った値3は捨てられ、次のコードへと作業が移る。
3volatileな名無しさん:2008/11/15(土) 05:07:34
つづき

同様に、以下の文の意味を考えてみる。

return N[i];

まず、「N」が評価される。
これは関数に渡されたポインタ変数の値で、たぶん配列の先頭を指していて、
そのポインタの値(配列のメモリ上での場所、番地、アドレス)が取り出される。

次に「i」が評価される。
これはもちろん、そのとき変数iに入っていた値が取り出される。

そして「N[i]」が評価される。
[]演算子は、ポインタの指している場所から整数値ぶん先の領域を参照するという意味なので、
コンピュータはN(の指している配列)のi番目の要素(変数)を見つけて、
その値を取り出し、「N[i]」の値として机の上に置く。

最後に 「return N[i]」が実行される。
returnは続く式の値を返すというキーワードであるから、その式の値、
ここでは「N[i]」の値、つまり今机の上に置かれている値が、
関数を呼び出した先に返される。


おわかりいただけただろうか。
4デフォルトの名無しさん:2008/11/15(土) 05:54:24
>>2,3
ある程度わかるようになってから
そういう文みると

あーわかりやすね

って思うのだけれど

プログラミング始めたうちは言ってることが電波杉てわからないんだよね
5デフォルトの名無しさん:2008/11/15(土) 09:24:33
「評価する」「式の値」「副作用」というキーワードを理解していただける手っ取りはやい方法はないものでしょうか?
printf("%d\n", 1 == 1);
はどうですか?
6デフォルトの名無しさん:2008/11/15(土) 09:28:11
コンパイルして実行したとして・・・という感じではないなあ。
実際には CPU の仕様とか最適化とかが影響してくるわけだし。
C の文法を理解する方法としてはそれで全く問題ないんだが。
7デフォルトの名無しさん:2008/11/15(土) 09:34:29
評価する=計算する・実行する
式の値=計算結果
副作用=状態変化
8デフォルトの名無しさん:2008/11/15(土) 12:47:58
関数型言語教えた方がはやい気がしてきたな
9デフォルトの名無しさん:2008/11/15(土) 13:42:12
>>8
簡単に覚えられる関数型言語って何?
10デフォルトの名無しさん:2008/11/15(土) 14:08:24
評価っていう概念は初心者には敷居が高いと思う

前スレ見るに、

 return N[i];

で 配列Nのi番目という、N と i の2つの情報が返る
と思ってるように見える。

そうじゃないよと。その配列の値ひとつ(数値なら数値ひとつ)が返ると。
って説明がわかりやすいかと
11983,994:2008/11/15(土) 14:09:14
>>984 前スレ
大学で聞いた.

>>988 前スレ
勘違いしていない.
大学で>>983 と習ったんだよ.もしかしてうちの准教授がおかしいのか?

>>990 前スレ
今GCC使ってるんだが,コンパイラによって挙動が異なるはずだから,
C90だのなんだのって話をしたんだ.
準拠してるコンパイラならどれ使っても大丈夫なのかが知りたいんだ.
もし環境依存の事実を覚えてしまうと今後面倒なことになるから.

>>993 前スレ
>>常に確実であることが保障されている。
そうだったのか.
12983,994:2008/11/15(土) 14:17:40
>>2,3
なるほど.よくわかった.
小さな机ってのは,多分アキュムレータのことだよな?
アセンブラの方を思い出して想像してみるとよくわかった.

大学で
関数のreturnにはstaticな変数を用いろって話だったんだ.
理由は前スレ>>983で書いてる通り.
それであんな質問をしたんだが,return文は引数と同じで値渡しでOK?

さっきから皆ポインタがどうとかって言ってるけど,それはこういうことだよな?

char *func4(char *a,*b) {
static char s[50];
sprintf(s,"%s%s",a,b);
return s;
}
例なのでバッファオーバーランの話はなしで.
もし.sをstaticで宣言してなかったら,
sのアドレスは正しく返るけど,返したアドレスが指すところはいつ書き換えられてもおかしくない.
ということだよな?

return文が値渡しってのは,みんなどこで知ったんだ?
仕様書とかに書いてある?
13デフォルトの名無しさん:2008/11/15(土) 14:20:10
あまりに当たり前すぎて仕様書に書いてあるかどうかなんて気にした事なかったな
14983,994:2008/11/15(土) 14:21:35
>>10

つまり値渡しってことだよな?
どうも大学で変な知識を植え付けられたらしい.
困った大学だOrz
15デフォルトの名無しさん:2008/11/15(土) 14:22:13
仕様書にはちゃんと書いてある。
俺が知ったのはKnRでだが。
まあ、ほとんどの解説本にも書いてるだろう。
関数に渡す引数と、関数が返す戻り値をごっちゃにするなって。
値渡しだなんだのは前者の話だろう。

なんだって後者の話で出てくるんだ。
17デフォルトの名無しさん:2008/11/15(土) 14:28:30
マイナスの実数を扱う変数型ってなんで無いんですか?
18デフォルトの名無しさん:2008/11/15(土) 14:31:53
float, double
19デフォルトの名無しさん:2008/11/15(土) 14:32:06
C言語で言う構造体とC++のクラスって似たようなもん?
20デフォルトの名無しさん:2008/11/15(土) 14:36:50
ある側面で見ると似てるね。
ずいぶん拡張された構造体として扱えば最初は楽なんじゃない
21デフォルトの名無しさん:2008/11/15(土) 14:41:32
>>18
float は 10^−45 〜 10^38 ってかいてあったんですが・・・  
22デフォルトの名無しさん:2008/11/15(土) 14:44:12
符号ビットもあるよ
23デフォルトの名無しさん:2008/11/15(土) 14:45:47
>>11
>もしかしてうちの准教授がおかしいのか?
いわれることが正しければ、そういうことになりますね。か な り お か し い。
24デフォルトの名無しさん:2008/11/15(土) 14:47:27
浮動小数点を実装するに当たって符号ビットをもうけなければならないという制限ってあるのかな。
ないなら別にそういう処理系があってもいいんだろうし、そういうふうに
書いてあったとしてもおかしくはないだろうね。
普通は符号ビットあるとおもうんだけどさ。
25デフォルトの名無しさん:2008/11/15(土) 15:06:56
浮動小数点のビット表現の標準規格があるから
大体の処理系はそれに準拠してる。
IEEEなんたらでぐぐれ
26デフォルトの名無しさん:2008/11/15(土) 15:09:54
>>25
IEEEなんたら の検索結果 約 17,800 件中 1 - 10 件目 (0.27 秒)

なんたらじゃわからんwww
IEEE754だな
27デフォルトの名無しさん:2008/11/15(土) 15:12:58
>>12
>小さな机ってのは,多分アキュムレータのことだよな?
>アセンブラの方を思い出して想像してみるとよくわかった.

早合点するやつはそれ以上学べないぞ。
小さな机はレジスタとか、あるいはスタックもありうるな。
アキュームレータはねえよ
28デフォルトの名無しさん:2008/11/15(土) 16:35:25
>>24
ISO/IEC9899:1999(E) 5.2.4.2.2 Characteristics of floating types <float.h>
によれば、浮動小数点型は負数が表現できなければならないことになっているが、
符号ビットという実装を義務づけている記述は見あたらない。脚注 16 もそう読める。
29デフォルトの名無しさん:2008/11/15(土) 17:24:36
>>27
いや、load/store を指示可能な(外部からレジスタと同等に扱うことのできる)アーキュムレータ、というのもありまして。
30デフォルトの名無しさん:2008/11/15(土) 17:27:07
>>16
そりゃ、関数呼び出しで参照渡しの返り値が可能な言語処理系もありますし。
31デフォルトの名無しさん:2008/11/15(土) 17:34:23
>>28
なるほど。C99ではそうなっているということですよね。
ありがとうございました。
32デフォルトの名無しさん:2008/11/15(土) 17:37:54
>>30
ここは C スレ
33デフォルトの名無しさん:2008/11/15(土) 17:46:29
>>12
仮引数もそう書けと習ったのか?
返却値の話もろくに聞いていなかっただけだろ
malloc による文字列操作に至っては授業を欠席していたようだな

適性ある奴と同じ行動とってるとひでえ目にあうぞ
34デフォルトの名無しさん:2008/11/15(土) 18:16:16
ちょっとトンチンカンな質問かもしれませんが

int n=0;
ong t;

while(n!=100){
time(&t);
printf("%f\n",t);
n=n+1;
  }

とやるとtの値として100個とも全く同じ値が出てくるのですが
これはプログラムを走らせてる最中全く時間が経過してないということなんでしょうか・・・?
3512:2008/11/15(土) 18:16:49
>>15
昨日調べようとおもって,図書館いったら誰かが借りてて見れなかったんだ.
今度本屋で立ち読みしてくるよ.

>>16 >>32
返すときも,値渡しなのかどうかって話.>>16のいうとおり,話がごっちゃになってきてるが,俺はCの返り値が参照渡しなのか,値渡しなのかがわからなかったからこういう質問をしてしまったんだ.
ここがCのスレだからCの返り値について質問してるんだ.

>>27
アセンブラの授業だと,スタックに入ってるデータをアキュムレータに入れないと足し算も出来なかったんだがなぁ.どうしてもアキュムレータに入れないといけないのかを聞いたら,出来る事は出来るが,遅いって言われた.
3634:2008/11/15(土) 18:16:58

すみません ong は long の間違いです
3712:2008/11/15(土) 18:18:11
>>33
授業は全部出てるしちゃんと聞いてる.
今回のreturnについては変だったから准教授にも聞いたんだ.
そしたら
double normalize(double th) {
while(th > PI) { th -= PID; }
while(th <= -PI) { th += PID; }
return th;
}
はだめで,
double normalize(double th) {
static double out;
while(th > PI) { th -= PID; }
while(th <= -PI) { th += PID; }
out=th;
return out;
}
としろって話だったんだ.

> 引数 th が関数に渡されるときに関数内部では別の変数が用意されて,その変数
> にコピーされます.この関数内の変数は当然 static ではないはずですので,
> return によって正しく返却されることは保証されないと思います.ですから,
> やはり static 変数を別に用意してください.
> なお,数式の評価値も正しく返却されるのか不安なので,私は static 変数に代
> 入してから return しています.たとえ仕様上は保証されていてもバグがあるか
> も知れないので,こうすれば安心です.
とのことだった.

仮引数の書き方はとくに指示されてはいないし,malloc による文字列操作どころかmallocはまだ名前以外出てきた事がない.
仮引数の書き方に適切なものがあるなら是非教えてくれ.
38デフォルトの名無しさん:2008/11/15(土) 18:19:59
>>34
実行速度が速いから,1秒たつまでに終わっちゃうんだと思うよ.
100とするところを,1000000くらいにして試してみると,少しは変わるかも.
39デフォルトの名無しさん:2008/11/15(土) 18:23:11
>>37
教授がなんか勘違いしてんだろうね。

仮引数の件
char *func4(char *a,*b) {

char *func4(char *a, char *b) {
4034:2008/11/15(土) 18:25:07
>>38
なるほどほんとだ。
ありがとうございます。
41デフォルトの名無しさん:2008/11/15(土) 18:27:43
>>37
その準教授なり教授なりの返答はあまりにも稚拙だな。
あなたはstatic変数にしないと不安で仕方ないかもしれませんが、
私はそのようなことで不安になることもありませんし、メモリを浪費したくもありません。
とでも言っておけば?
42デフォルトの名無しさん:2008/11/15(土) 18:31:11
追記。
仕様で保証されているものをバグだ何だと騒ぎ立てるんだったら
staticにすれば大丈夫なんていうのも保証はないし、
そもそもnormalizeにthが壊れずに渡されるかどうかも心配すべき。

ちょっとどうかしてるよ。
4312:2008/11/15(土) 18:34:50
>>39
ですよね……
名古屋大出てるのにOrz

仮引数.
なるほど.次からちゃんと分けて書くようにするよ.
でもなんでそう書く方がよろしいんだ??

さっき,GNU libcを落としてきて,ソース漁ってみた.
printf.cのソースで,
int
__printf (const char *format, ...)
{
va_list arg;
int done;

va_start (arg, format);
done = vfprintf (stdout, format, arg);
va_end (arg);

return done;
}
ってなってたよ.次からいちいちstaticにするのはやめておくことにする.
44デフォルトの名無しさん:2008/11/15(土) 18:42:23
printfで%lfで表示すると同じなのに、比較すると(if分で!=de)異なると
なってしまいます。片方は計算で得た5.0000、もう片方は5をdouble型に
入れたものです。
この二つをどうにかして同じ値として扱いたいんですが何かいい方法はないでしょうか?
45デフォルトの名無しさん:2008/11/15(土) 18:44:20
日本語がおかしくてすみません
簡単に言うとif文の条件として二つの変数を比較するときだけ
小数点5桁とか4桁だけで比較したいんですがどうしたらいいでしょうか?
46デフォルトの名無しさん:2008/11/15(土) 18:45:22
>>44
浮動小数点では単純に==で比較すると誤差で涙目になる。
適当に許容する誤差を決めて
#define EPS 1e-5
if(fabs(a-b) < EPS){//aとbが等しいなら

}
みたいにやるのを薦める
4733:2008/11/15(土) 18:50:37
>>37
それは失礼した
しかし痛い教授にあたったものだな、ご愁傷様

試験のときも教授と同じ間違え方をしないと減点されかねないから気をつけてな
48デフォルトの名無しさん:2008/11/15(土) 18:50:50
ありがとうござます!!
49デフォルトの名無しさん:2008/11/15(土) 19:00:53
>>35
一つ言っておこう
授業で習うことなんて8割方嘘だ

初心者向けにかなり誤魔化しが入っとるけん、
全部鵜呑みにせんと、概要だけふーんと聞いておけばいいよ
50デフォルトの名無しさん:2008/11/15(土) 19:10:07
なぜ伊予弁
5134:2008/11/15(土) 19:15:30
すみませんもうひとつ質問なのですが、

たとえばゲームとかを作る時、キャラクターを動かす部分のプログラムは、
「今xに表示しているキャラ画像を、○○秒後にx+10に表示する」
みたいになると思うのですが、
そもそもこの部分の処理に○○秒以上かかっちゃっう場合はどうするんですか?

52デフォルトの名無しさん:2008/11/15(土) 19:19:07
>>51
動きがガクガクになる。
53デフォルトの名無しさん:2008/11/15(土) 19:19:20
教授なんて名大を出ててもそんなものか。。。
かったるくて日進月歩に合わせられないんだろうな。
法科、会計、情報系は教授もリアルタイムに日進月歩しないと駄目じゃね?
古いままだと実態に合わなく使い物にならなくなるから。
54デフォルトの名無しさん:2008/11/15(土) 19:25:07
>>51
タイマー割り込みの手法を使って、差分を計算してキャラを動かす。
キャラが増えて負荷が高くなったら、一部を間引いて処理する工夫を入れるか
タイマー間隔を延ばして処理する工夫を入れる。
5512:2008/11/15(土) 19:25:23
>>47
俺は授業よりも,Cの本の方を重点的にやってるから,
今回の返り値の謎に気がついたからよかったけど,他の連中に返り値がどうのとかいうと,
「返り血」と思われてしまうよww
困ったもんだ.准教授といえども,間違うってことか.
そう言えば,scanfのフォーマットで[]とか*とかもしらなかったもんな.

そんなもんなのかな?

>>49
准教授の授業3割,本4割,libcとかのGNUのソース2割,どっかのサイト1割くらいで参考にしてるから,
それは大丈夫だと思いたい.

質問の結論は返り値は値渡し.
みんなありがと.ずっと変なソース書き続けるとこだったよ.
聞いてみてよかった.
56デフォルトの名無しさん:2008/11/15(土) 19:34:09
>>37
誰か指摘してたが、関数内で不用意に性的変数を
参照するのは避けるべき
なぜなら再入可能でなくなるから

つまりマルチスレッドで同時にその関数を使用すると不具合が起こる

要はマルチスレッドプログラミングも
したことない助教授は明らかに素人なので
気をつけろってことさ
57デフォルトの名無しさん:2008/11/15(土) 19:36:24
人員不足で担当させられてるだけの門外漢だったりして
58デフォルトの名無しさん:2008/11/15(土) 19:38:06
なんという痛み分けw
5934:2008/11/15(土) 19:40:46
>>52
なるほど・・・
>>54
なんかよくわかりませんがいろいろ解決法があるのですね。
調べてみます。
60デフォルトの名無しさん:2008/11/15(土) 19:40:48
>>55
つかさーアセンブラやってんなら返り血を
渡すコードがどうなってるか見てみるといいぜ
返す型でも変わるし
61デフォルトの名無しさん:2008/11/15(土) 19:51:26
しかしこの返り値クンは、なんやかんやと言い訳ばかりでむかつくなw
後から伸びないタイプだわw
62デフォルトの名無しさん:2008/11/15(土) 20:02:13
管理職タイプ
63デフォルトの名無しさん:2008/11/15(土) 20:09:43
>>61
それはどうでしょうか。

>>55
こちらで返り血を浴びながら修練するのも一興
http://pc11.2ch.net/test/read.cgi/tech/1225320579/
64デフォルトの名無しさん:2008/11/15(土) 20:34:03
関数ポインタってどういう時に使うんですか?><
65デフォルトの名無しさん:2008/11/15(土) 20:36:50
>>64
C#でデリゲート使いたいようなとき。
66デフォルトの名無しさん:2008/11/15(土) 20:43:57
場合分けが必要で呼び出し元で処理を共有したい時とか?
67デフォルトの名無しさん:2008/11/15(土) 20:54:44
wikiでデリゲートを調べたのですがちんぷんかんぷうでした・・・
68デフォルトの名無しさん:2008/11/15(土) 20:56:28
switch (kannsuu)
{
case hoge1:
hoge1();
case hoge2:
hoge2();

}

な感じでしょうか
69デフォルトの名無しさん:2008/11/15(土) 21:03:40
>>67
「ちんぷんかんぷう」に心動かされたので真面目に答えてみる。

関数ポインタの利点は、
1種類のイベントに対して、挙動が違うという場合に用いると良い。

ボタンAを「押した」ときは処理A'を実行し、
ボタンBを「押した」ときは処理B'を実行したい。
てなプログラムを書くときに便利なのです。

ボタンAもBもボタンという挙動をするプログラムなわけだけど、
それぞれのボタンを「押した」という1種類のイベントに対して
処理を変えなければならんでしょ。

そういうときに、関数ポインタを使う。

そもそも、WindowsのGUI部分は関数ポインタの雨あられで実装されてると
思うと良い。
70デフォルトの名無しさん:2008/11/15(土) 21:04:53
なんとなくデリゲートがわかった気がします



int event(string)[10];
event[0] = int kansuu1(string s) {return 1};
event[1] = int kansuu2(string s) {return 1};
event[2] = int kansuu3(string s) {return 1};
event[3] = int kansuu4(string s) {return 1};

event[0]();
event[1]();
event[2]();
event[3]();

ということですね

71デフォルトの名無しさん:2008/11/15(土) 21:07:02
・・・・俺、>>69だけど、酒飲みながら書くと、日本語おかしいな。
反省してもう寝る。おやすみ。
72デフォルトの名無しさん:2008/11/15(土) 21:07:28
>>69

ということは、>>70で、
event[0]に処理A'、event[1]に処理B'を入れておいて、
A=0, B=1にして、event[X]()で実行すればいいんですね!
73デフォルトの名無しさん:2008/11/15(土) 21:18:33
>>69
なかなかわかりやすい説明どうも
7412:2008/11/15(土) 22:16:01
>>60
アセンブラは,そんな詳しいところまで教えてもらってないぜ.

>>61
解釈はいいわけでもなんでもいいんだけど,
事実だから俺にはどうしようもない.
習ってないものは習ってないし,
staticを使えと教えられたものは俺にはどうしようもない.

>>63
しばらくROMって見る事にするよ.

75デフォルトの名無しさん:2008/11/15(土) 22:22:58
>>74
> アセンブラは,そんな詳しいところまで教えてもらってないぜ.

アセンブラもその教授かw
いちばん肝心なことなのに
7612:2008/11/15(土) 22:30:37
>>75
アセンブラは違う人だけど,あの人は非常勤だw
77デフォルトの名無しさん:2008/11/15(土) 22:32:04
>習ってないものは習ってないし,
>staticを使えと教えられたものは俺にはどうしようもない.

うむ、こういう所が伸びない奴の特徴だなw
伸びる奴は自分で自発的に調べる。
習ってないなんて言い訳はしない。
78デフォルトの名無しさん:2008/11/15(土) 22:33:55
今の学生は昔で言う生徒ですから
79デフォルトの名無しさん:2008/11/15(土) 22:34:04
ゆとりは使う人がインプットしないと何もできません
80デフォルトの名無しさん:2008/11/15(土) 22:36:13
22:32:04〜22:34:04
僅か2分の間に一気に批判が集中したな。
81デフォルトの名無しさん:2008/11/15(土) 22:38:04
まぁまぁ。
疑問を持ってこのスレにくるだけマシだよ
態度は気に食わないが
82デフォルトの名無しさん:2008/11/15(土) 22:46:42
>>76
揃いも揃って腐ってるな
83デフォルトの名無しさん:2008/11/15(土) 23:17:58
mingw の crt2.oってどのパッケージにはいってますか?
8412:2008/11/15(土) 23:18:58
誤爆しました
8512:2008/11/15(土) 23:34:39
>>77
必要があれば調べるよ.だけども,returnのについては初歩的過ぎるのか適当な情報がなかったんだよ.
俺の検索能力で見つかったなら聞いていないよ.

>>79
俺はゆとり第1期生さ.すまん.
おっしゃるとおりだ.

>>82
俺は俺の大学をもう少し信じてみるよ.

>>84
おまえ誰だよw
86デフォルトの名無しさん:2008/11/15(土) 23:41:33
staticにして返すなんてのは初めて見た。
その教授よっぽど変な環境でプラグラミングしてたんだろうか。
87デフォルトの名無しさん:2008/11/15(土) 23:43:03
>>12は専攻は何系なんだろう。
まさか情報系じゃないよなw
88デフォルトの名無しさん:2008/11/15(土) 23:48:16
おれは、本人>>12の勘違いだとおもう。
文字列のポインターの戻り値の場合、文字列はstaticで定義するを
戻り値はstaticでになったんだと思う。
89デフォルトの名無しさん:2008/11/15(土) 23:49:56
大学名が知りたい
それがだめなら地域と偏差値だけでも
90デフォルトの名無しさん:2008/11/15(土) 23:51:39
まぁ全てはこのゆとりを経由した情報だからな。
鵜呑みにはできんな。
91デフォルトの名無しさん:2008/11/15(土) 23:52:39
>>85
「呼び出し規約 返り値」で検索すれば情報が出てくるぜ
Cとアセンブラを学ぶなら呼び出し規約は必須だから
92デフォルトの名無しさん:2008/11/15(土) 23:54:09
>准教授の授業3割,本4割,libcとかのGNUのソース2割,どっかのサイト1割くらいで参考にしてるから,

>>12のレベルではGNUのソースはまだ早いなw
93デフォルトの名無しさん:2008/11/16(日) 00:17:41
>>88
一応>>37を見ると教授がおかしいように見える。

が、>>74辺りから>>12を見る目が変わってしまったことは否めない。
今後の学び方次第でどちらにも転がる分岐点にいるって感じかな。
気をつけてね。
94デフォルトの名無しさん:2008/11/16(日) 00:47:42
>>93
>37の准教授の語ったというその台詞をよく読むと、この准教授と名乗っている馬鹿が自己矛盾に気付いていないことが判る。
仮にも准教授と名乗るだけの知恵のある馬鹿がそこまで間が抜けていると考える道理がないので、台詞が間違って伝えられたと結論付けたい。

伝言ゲームがゲームとして成立していることから判る通り、人間は意外に他人の台詞を曲解しているものなんだよね。
95デフォルトの名無しさん:2008/11/16(日) 00:50:18
doubleがスタックにつまれるコンパイラがあったとか?
96デフォルトの名無しさん:2008/11/16(日) 00:52:28
>>95
doubleを値渡しできないはるか昔の時代のことか・・・・・・
いやよく知らんけど
97デフォルトの名無しさん:2008/11/16(日) 01:02:32
>>95
その辺はCPUとOSの仕様もからむな
x86は浮動小数点スタックに積んで返してるし
>>95の言うスタックではないが
98デフォルトの名無しさん:2008/11/16(日) 01:07:41
仮に、70年代のコンパイラで育ったからその旧弊に縛られているとしよう。
問題は、その年齢で准教授と言うことだな。
99デフォルトの名無しさん:2008/11/16(日) 01:11:32
いやリタイアするまで准教授のままの奴なんてごまんといるよ
100デフォルトの名無しさん:2008/11/16(日) 01:36:15
lsi-c 80とかで苦労したんじゃないの?
101デフォルトの名無しさん:2008/11/16(日) 01:37:48
そんなCコンパイラは過去に存在しない
102デフォルトの名無しさん:2008/11/16(日) 01:44:36
LSI C-80ってまだ売ってるんだ。
103デフォルトの名無しさん:2008/11/16(日) 01:53:05
>>64
ん、qsort() とかで必要でしょうね。
104デフォルトの名無しさん:2008/11/16(日) 01:55:58
>>77
それはどうでしょうか?
少なくとも2chで聴いてみるところなど、非常に興味深いと思います。

>>76
こちらで返り血を浴びながら修練するのも一興
http://pc11.2ch.net/test/read.cgi/tech/1225320579/
105デフォルトの名無しさん:2008/11/16(日) 01:57:49
>>89
偏差値ってなんですか?なんの役に立つのですか?まさかそれでプログラミング能力がわかるとでも?
あなたの偏差値がしりたいものです。
106デフォルトの名無しさん:2008/11/16(日) 02:08:28
ゆとり君まだ居たのね。
107デフォルトの名無しさん:2008/11/16(日) 08:09:51
いや、別人だろw
108デフォルトの名無しさん:2008/11/16(日) 10:52:15
質問です
例えば以下のような場合、xは5でいいのでしょうか?
int x = 1, i = 0;
x += ( i += 2, i % 3 );
109デフォルトの名無しさん:2008/11/16(日) 11:41:53
>>108
なんで5になると思ったの?
110108:2008/11/16(日) 11:46:41
>>109
違うのですか?
x += が二回実行され、2と1が足されると思ったのですが
111108:2008/11/16(日) 11:52:15
あ、失礼しました
2と2が足されて6ですね
112デフォルトの名無しさん:2008/11/16(日) 12:01:17
>>108
なんで自分でやってみないの?
113デフォルトの名無しさん:2008/11/16(日) 12:20:56
114デフォルトの名無しさん:2008/11/16(日) 12:28:34
void line(hword Xa, hword Ya, hword Xb, hword Yb, hword color) {
 hword x, y;

 int j = Ya;
 int e = 0;
 for(x = Xa; x < Xb; x++) {
  draw_point(x, j, color);
   e = e + (Yb-Ya);
   if((Xb-Xa)< e) {
    e = e - (Xb - Xa);
    j = j + 1;
    }
   }
  }

このメソッドがどのように動いて斜線を引いているか分かり易く教えていただけないでしょうか?

draw_pointメソッドは指定された(x,j)座標にcolorで指定した色のドットを表示するメソッドです。
斜線の範囲は(Xa, Ya)から(Xb, Yb)です。
115デフォルトの名無しさん:2008/11/16(日) 12:30:55
>>114
>>1 これはC ですか?
116デフォルトの名無しさん:2008/11/16(日) 12:35:05
>>115
C言語です
117デフォルトの名無しさん:2008/11/16(日) 12:35:17
118デフォルトの名無しさん:2008/11/16(日) 12:35:46
>>114
どのようにもなにも、適当な位置を決めて自分で机上トレースしてみれや。
119デフォルトの名無しさん:2008/11/16(日) 12:36:29
>>115
>114のどこがCじゃないと?
Cじゃない確証がないならこのスレで扱えばいいじゃない。

>>114
どの辺が判らない? 全部判らないなんてのは無しにしてよ。
120デフォルトの名無しさん:2008/11/16(日) 12:39:54
>>115
eの型が hwordじゃなくてintなのが気持ち悪い
yを使ってないのが気持ち悪い
あと、水平寄りの斜め線しか引けない気がする
121デフォルトの名無しさん:2008/11/16(日) 12:39:58
動的に確保した構造体を自作関数へ渡す時、何故全て二重ポインタにしないのですか?
122デフォルトの名無しさん:2008/11/16(日) 12:41:41
>>121
必要ないからじゃない?
123デフォルトの名無しさん:2008/11/16(日) 12:43:25
つーか二重ポインタって何?
124114:2008/11/16(日) 12:43:26
>>119
まず1ループ目でeが点から点の高さになりますよね。
そのあと現在値にドットを打って移動して行って、横の長さが段々増えていきますよね。
そこまでは理解できるんですが、それでeが横の長さより大きくなった場合のif文からが理解できません。
机の上で書いてみたりしてるんですが、どうもイメージがわかないので、何故斜線になっていくのかが分かりません。
125デフォルトの名無しさん:2008/11/16(日) 12:50:59
>>124
ブレゼンハムのアルゴリズムかな?
ググればでてくると思う。
126デフォルトの名無しさん:2008/11/16(日) 12:51:49
>>122
構造体へのアドレスが違うのでスッキリしないのですが、
127デフォルトの名無しさん:2008/11/16(日) 12:51:54
>>124
そこまで判っているならこのスレ的にはヒントキーワードを出せば事が足りそうだね。
つ[ブレゼンハム]
128デフォルトの名無しさん:2008/11/16(日) 12:52:27
>>126
言いたいことがよく判らんから、具体例を提示してくれ。
129デフォルトの名無しさん:2008/11/16(日) 13:13:05
typedef struct {
char *a;
}TEST;


int main(void)
{
TEST *test = malloc
tes(test);
}
void tes(TEST *tes)
{
tesはtest構造体を指さないのでスッキリしない

}
130デフォルトの名無しさん:2008/11/16(日) 13:15:27
指しますが何か。
131デフォルトの名無しさん:2008/11/16(日) 13:15:29
>>129
test構造体なんて存在しないだろ
132デフォルトの名無しさん:2008/11/16(日) 13:15:50
>>129
構造体、指してるだろ。
133デフォルトの名無しさん:2008/11/16(日) 13:16:20
>>129
おまえ、コードが断片過ぎだし用語が滅茶苦茶だし、勉強しなおして来いよ。
134デフォルトの名無しさん:2008/11/16(日) 13:16:46
アドレスが違う訳だが、指してる事になるの?
135デフォルトの名無しさん:2008/11/16(日) 13:18:11
どうせポインタのアドレス表示して
違うとか騒いでるだけだろ
136デフォルトの名無しさん:2008/11/16(日) 13:18:13
>>134
>133
137デフォルトの名無しさん:2008/11/16(日) 13:18:55
>>135
その通りだけど?
138デフォルトの名無しさん:2008/11/16(日) 13:20:58
>>108
x+=が二回実行されるわけではない。
i%3の値が一回だけx+=で加算されるため、xは3になる。
カンマ演算子でググればわかる。
139デフォルトの名無しさん:2008/11/16(日) 13:21:19
>>135
教えて下さい
140デフォルトの名無しさん:2008/11/16(日) 13:21:32
構造体の実体はmalloc()が取ってきたメモリに置かれてるから、ポインタに入ってるアドレスが構造体のアドレス。
ポインタ自身のアドレスは、構造体とは違う。
141デフォルトの名無しさん:2008/11/16(日) 13:24:44
>>137
どうやって確認したのかきちんと提示しないからこんな馬鹿げたことになる。
いいから大人しく>133
142デフォルトの名無しさん:2008/11/16(日) 13:24:43
>>140
>ポインタ自身のアドレスは、構造体とは違う。
これはtes関数の引数のポインタ?
143デフォルトの名無しさん:2008/11/16(日) 13:26:13
>>141
printf("%p"&p); //main
printf("%p"&tes); //test
144デフォルトの名無しさん:2008/11/16(日) 13:28:23
>>143
断片を提示するな。ポインタ変数の値とポインタ変数のアドレスを区別しろ。ポインタとは何かを考えろ。
要は、>133
145デフォルトの名無しさん:2008/11/16(日) 13:28:41
struct Hoge h;
struct Hoge* ph = &h;

void func(struct Hoge* arg)
{
}

func(ph);

//ph と arg は同じ(hを指してる)
// &arg と &ph は別
146デフォルトの名無しさん:2008/11/16(日) 13:28:43
>>129
main関数内のtestと、tes関数内のtesは同じだろ。
だから、構造体は渡すことができている。
main関数内の&testと、tes関数内の&tesが異なるのは当然。
147デフォルトの名無しさん:2008/11/16(日) 13:29:34
>>125>>127
分かりました!ありがとうございます!
148デフォルトの名無しさん:2008/11/16(日) 13:29:52
mainに p なんてないし、test って関数もないし、わけわかめ
149デフォルトの名無しさん:2008/11/16(日) 13:36:01
129:デフォルトの名無しさん :2008/11/16(日) 13:13:05
typedef struct {
char *a;
}TEST;


int main(void)
{
TEST *p = malloc
tes(p);
}
void tes(TEST *tes)
{

}
コードを間違えた
>>146
mallocの戻り値を格納するTEST構造体型のポインタ自身のアドレスが
関数testに渡されているだけであって、関数testの*tesが実態を指し示しているとは考えられない
150デフォルトの名無しさん:2008/11/16(日) 13:40:02
2次元配列のポインタを実現したいのですが、
(文字列のn×n表を作る方法は木構造やハッシュ表でよく分からないので・・・)

#include <stdio.h>
typedef struct node {
 char *item;
};
int main(void) {
 int i;
 char n[100];
 struct node *a[100][100];
 for (i=0; i<3; i++) {
  fgets(n, 100, stdin); sscanf(n, "%s", a[i][0]->item);
 }
  printf("%s\n", a[1][0]->item);
}

どのようにすれば文字列をポインタへ設定できるのか何卒ご教授願います。
151デフォルトの名無しさん:2008/11/16(日) 13:40:12
>ポインタ自身のアドレスが関数testに渡されている
ダウト。
だから>>133
152デフォルトの名無しさん:2008/11/16(日) 13:42:55
>>150
あんたの欲しいものは、ポインタの配列の配列じゃないのか?
そのためには、各文字列を収容する空間が別途必要になるが、>150ではそれを一つで済まそうとしているから巧くいかない。
itemのサイズが見込めるなら、ポインタにしないで(取り敢えず)配列にしてしまってはどうか。
153デフォルトの名無しさん:2008/11/16(日) 13:45:15
>>150
使う領域は確保しないとダメさ
154デフォルトの名無しさん:2008/11/16(日) 13:54:34
ポインタpとtesのアドレスが違うのにどうしてポインタtesが構造体を指し示していると言えるのか、
上記が違うのにtes->strとp->strのアドレスが同じなのは何故か、
この二つを教えて下さい
155デフォルトの名無しさん:2008/11/16(日) 13:58:59
間違えた
ポインタpとtesのアドレスが違うのにどうしてポインタtesが構造体を指し示していると言えるのか、
ポインタpとtesのアドレスが違うのにtes->strとp->strのアドレスが同じなのは何故か、
test関数の引数*tesを**tesにした場合の違いは何なのか
この二つを教えて下さい
156デフォルトの名無しさん:2008/11/16(日) 13:59:26
>>154
>144
157デフォルトの名無しさん:2008/11/16(日) 14:00:24
ここでこんなに説明されても理解できてないんだから、ちょっと引き篭もって勉強してこいよ。
158デフォルトの名無しさん:2008/11/16(日) 14:02:21
>>157
もう聞かないから、>>155を詳しく教えてくれ
159デフォルトの名無しさん:2008/11/16(日) 14:04:49
それをさっきから説明してるんだろ・・
160デフォルトの名無しさん:2008/11/16(日) 14:05:41
>>159
具体例を出して教えてくれ、
161デフォルトの名無しさん:2008/11/16(日) 14:06:42
void func(int i, int * pi)
{
printf("%d, %p\n%p, %p\n", i, & i, pi, & pi);
}
int main()
{
int i = 1;
int * pi = & i;
printf("%d, %p\n%p, %p\n", i, & i, pi, & pi);
return 0;
}
これで理解できなきゃ死ねば?
162デフォルトの名無しさん:2008/11/16(日) 14:07:16
>>158
うん、それ無理
163デフォルトの名無しさん:2008/11/16(日) 14:08:49
おっと、func()の呼び出しが抜けたぜ。ついでにグローバル変数も追加しておこう。
int gi;
int * gpi;
void func(int i, int * pi)
{
printf("%d, %p\n%p, %p\n", i, & i, pi, & pi);
}
int main()
{
int i = 1;
int * pi = & i;
printf("%d, %p\n%p, %p\n", i, & i, pi, & pi);
func(i, pi);
gi = i;
gpi = pi;
printf("%d, %p\n%p, %p\n", gi, & gi, gpi, & gpi);
return 0;
}
164デフォルトの名無しさん:2008/11/16(日) 14:09:36
typedef struct {
char *a;
}TEST;


int main(void)
{
TEST *p = malloc
tes(p);
}
void tes(TEST *tes)
{
rrr:
}

じゃぁこれで説明すると
仮に1番地におかれたp に mallocによって200番地に確保されたメモリを入ったとするだろ
そうするとp は1番地に置かれていて 200が入ってるわけだ

で、tesに渡すと ポインタp は2 番地に置かれたとして中身は 200になるわけだよ
(*p)も(*tes)も ポインタの中身である200 、その番地にあるデータへの参照になるわけだよ

165150:2008/11/16(日) 14:10:18
#include <stdio.h>
#include <stdlib.h>
struct node {
 char *item;
};
int main(void) {
 int i;
 char n[100];
 struct node *a[100];
 a = (struct node*)malloc(sizeof(*a)); /* エラー:左辺値が必要 */
 for (i=0; i<3; i++) {
  fgets(n, 100, stdin); sscanf(n, "%s", a[i]->item);
 }
  printf("%s\n", a[1]->item);
}

まずはこのようなポインタの配列を実現したいのですが、どのように領域を確保すればよいのでしょうか?
166デフォルトの名無しさん:2008/11/16(日) 14:10:19
× で、tesに渡すと ポインタp
○ で、tesに渡すと ポインタtes 
だた
167デフォルトの名無しさん:2008/11/16(日) 14:11:31
c 多次元配列 動的確保 あたりでぐぐったほうが
ここでちょろっと説明してもらうよりわかりやすいかもしれない
168デフォルトの名無しさん:2008/11/16(日) 14:14:52
ホント、他人の話をよく読まない香具師が多いな。

>>165
>165にだけピンポイントで答えるぞ。
for (unsigned ic = 0; ic < sizeof(a) / sizeof(* a); ++ic)
a[ic] = malloc(sizeof(* a);
169デフォルトの名無しさん:2008/11/16(日) 14:15:26
>>155
ポインタがオブジェクトを指し示しているということの意味を理解しているか。
ポインタがオブジェクトを指すことができるのは、ポインタ変数の値がオブジェクトの位置を保持しているからである。
問題になるのはポインタ変数の値であって、ポインタ変数の位置ではない。
複数の(つまり、位置の異なる)ポインタ変数であっても、同じ値を持っているなら、それらは同じオブジェクトを指している。
関数の仮引数をポインタとして宣言したとき、関数に渡されるものは実引数に指定されたポインタの値のコピーである。
だから関数の中と外で同じオブジェクトを参照することができる。
170デフォルトの名無しさん:2008/11/16(日) 14:33:12
>>155
int test = 10;
int *a = &test;
int *b = &test;

// a と b は同じ test をさしているが、&a != &b

関数やら構造体やらの前に、これだけの話じゃないの
171150:2008/11/16(日) 14:33:49
>168
for (unsigned ic = 0; ic < sizeof(a) / sizeof(* a); ++ic)
a[ic] = (struct node*)malloc(sizeof(*a));
or (i=0; i<3; i++) {
fgets(n, 100, stdin); sscanf(n, "%s", a[i]->item);
}
for (i=0; i<3; i++) {
printf("%s\n", a[i]->item);
}

malloc以下をこのようにしてコンパイルできるようにはなったのですが、
a[0]->item 〜 a[2]->item の区別がなく更新されてしまういます。
a[0].item のように*を使うことはできないのでしょうか?
172デフォルトの名無しさん:2008/11/16(日) 14:39:19
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFLEN 100
#define NODELEN 100
#define READLEN 3
struct node {char *item;};
int main(void) {
  int i, slen;
  char n[BUFLEN];
  struct node **a;
  a = malloc(sizeof(struct node*) * NODELEN);
  for (i=0; i<READLEN; i++) {
    fgets(n, sizeof(n), stdin);
    slen = strlen(n);
    if(n[slen-1]=='\n'){n[slen-1] = '\0';slen--;}
    struct node *p = malloc(sizeof(struct node) + slen + 1);
    p->item = (char*)(p + 1);
    strcpy(p->item, n);
    a[i] = p;
  }
  for(i=0; i<READLEN; i++) printf("%s\n", a[i]->item);
  return 0;
}
173デフォルトの名無しさん:2008/11/16(日) 14:46:15
>>171
何がしたいのか不明
3行とって、3行出力なのか?
17412:2008/11/16(日) 14:51:43
>>87
工学部情報工学科 一回生だw

>>88
だとすると,>>37のメールの返信をどう解釈するんだ?同じ学科の友達も,staticにするものだと思ってるぞ.

>>89
大学は偏差値が60の国公立.地域は近畿.

>>91
調べてみる.情報サンクス.

>>92
早いのはわかってる.俺が参考に出来るのは,returnする変数にstaticがついていないだとか,ソースの書き方だとか.
アルゴリズムだとかはまだぜんぜんわからない.けど,見ないよりは見た方が良いと思ってる.少しでも人が書いたソースにも慣れていきたいと思うし.

>>93
忠告ありがと.もっと謙虚に学ぼうと思う.

>>94
>>37はメールの本文.
returnについての質問に対する返信の部分だ.伝言ゲームじゃねぇ.
でも俺の勘違いならその方がいい.返値が値渡しってことは皆のおかげでわかったし,
これからもこの准教授に世話になるから.学生の質問にも丁寧に答えてくれるから,俺はこの准教授好きなんだ.

>>98
准教授は50年代中頃の生まれだよ.まだ50代.


というわけで,そろそろ場違いも甚だしいのでROMに戻ります.
175デフォルトの名無しさん:2008/11/16(日) 14:59:18
>>37
仕様上保証されてもバグがあるかもしれないからstatic?
意味がわからん
そんな事気にしてたら何も書けないだろ
パラノイアか?

具体的にコンパイラにバグがあって
それを避けるためのworkaroundだというなら分かるけど
176デフォルトの名無しさん:2008/11/16(日) 15:00:28
ゆとりキター!!
177デフォルトの名無しさん:2008/11/16(日) 15:01:00
for文に関して

for(;;)とはどのようにループするのでしょうか?
178デフォルトの名無しさん:2008/11/16(日) 15:02:22
>>177
無限ループの慣用表現
while(1)と同じ
179デフォルトの名無しさん:2008/11/16(日) 15:02:24
既出かもしれないけど。 >>37 は明らかに教授の間違い。
引数 th が値渡しでコピーされるのと同様に、
戻り値も値渡しになっているので、戻り値を返すときにもコピーが発生する。
だから関数内でstatic にしようが、ローカル変数にしようがどちらでも関係ない。

一般に、staticな変数を関数内で利用すると、マルチスレッドでの実行時などにトラブルが起こる可能性がある。
逆に言えば、マルチスレッドで利用する可能性が無い関数なら、使っても別にかまわない。
180デフォルトの名無しさん:2008/11/16(日) 15:02:55
無限ループです
181デフォルトの名無しさん:2008/11/16(日) 15:03:53
>>177
質問の意図がよくわからん
永久ループという以上の説明がいるのか?
182デフォルトの名無しさん:2008/11/16(日) 15:07:40
>>178>>180>>181
理解できました!ありがとうございます。
183デフォルトの名無しさん:2008/11/16(日) 15:08:17
>>174
一年坊主か。じゃあ忠告しておく。
大学は高校までと違って

 教 員 は 教  育 の プ ロ で は な い 。

研究が本業だからな。自分の研究分野以外は素人だ。
そのうち卒業研究とかすると思うけど、自分で多くの調査実験を
行ったうえで、指導教官と意見が食い違ったら、自分が正しいと思え。

と、うちの指導教官が言ってた。
たまにおかしなこというけど、今でもその言葉は正しいんじゃないかと思う。

184デフォルトの名無しさん:2008/11/16(日) 15:19:35
教授に捨てメルアドでこのスレの内容を送ってやれ。
185デフォルトの名無しさん:2008/11/16(日) 15:22:59
質問です
main(){
int kekka = 0;
unsigned char soeji[] = { 4, 3, 2, 1 };
unsigned int deta[] = { 0, 100, 200, 300, 400 };

kekka = deta[(soeji[3])];
}

この
deta[(soeji[3])]
という表記は使っても大丈夫でしょうか?(kekkaに100が入ってる?)
また添え字になるならsoeji[]はunsigned charよりunsigned intの方が
処理速度的にはよいのでしょうか?

よろしくお願いします。
186デフォルトの名無しさん:2008/11/16(日) 15:23:12
char buf<:124:>;
<::>これ何
187デフォルトの名無しさん:2008/11/16(日) 15:25:53
>>186
Cにそんなもんない。
188デフォルトの名無しさん:2008/11/16(日) 15:27:06
>>187
どこで聞けばいいんだ
189デフォルトの名無しさん:2008/11/16(日) 15:27:47
>>185
何を問題視しているのか判らない。
soeji[3]は問題ないし、deta[1]も問題ない以上、deta[soeji[3]]も全く問題ない。
unsigned charは演算の際にどうしてもintに拡張される。従って、unsigned intにしておいた方が無難。
但し、どうせ大差ない。
190デフォルトの名無しさん:2008/11/16(日) 15:28:00
どこでみたんだよ
191デフォルトの名無しさん:2008/11/16(日) 15:28:45
>>185
添字には整数値が使えるので問題ない
int型あるいはunsigned int型の方が、CPUが扱うビット数と等しいので、一般的には早くなる。
しかし、char型であっても、コンパイル時にint型に格上げされるので、結局変わらないと考えるべき。

>>186
またM$の拡張表記だろ。
192デフォルトの名無しさん:2008/11/16(日) 15:28:58
>>171
>168は、そこにあるように文字列のケアはしていない。文字列については、>152。
193デフォルトの名無しさん:2008/11/16(日) 15:31:12
>>190
VCでコンパイル出来る理由が分からないからどのスレで聞けばいいか教えて
194デフォルトの名無しさん:2008/11/16(日) 15:33:25
>>185
deta[(soeji[3])] の表記自体は問題ないが、そのプログラムだとべつにdeta[soeji[3]] でもいい。
char と int でどちらが速いかは処理系依存だけど、
現在のPC用の処理系では int のほうが有利か、まったく同じかのどちらか。
少なくとも、 char のほうが速いということはない。
195デフォルトの名無しさん:2008/11/16(日) 15:36:28
> <::>これ何

↓の幼虫

<ヽ`∀´> ウェーハッハ
196デフォルトの名無しさん:2008/11/16(日) 15:37:55
>>193
VS C++ 2008 で試したが、コンパイルとおらないぞ。

char buf<:124:>;

197デフォルトの名無しさん:2008/11/16(日) 15:40:36
>>186
周辺のコードも全部そのまま貼れよ
198デフォルトの名無しさん:2008/11/16(日) 15:40:39
digraphオプションをONにしろ。
199デフォルトの名無しさん:2008/11/16(日) 15:42:24
<: == [
:> == ]
200デフォルトの名無しさん:2008/11/16(日) 15:42:38
そういやそんなのあったな
一応標準だわ
201デフォルトの名無しさん:2008/11/16(日) 16:19:54
(<: = [))

↑チンパンジーとかゴリラの顔文字にみえる
202デフォルトの名無しさん:2008/11/16(日) 16:32:47
>>176
あなたのほうがゆとりと呼ぶのにふさわしい。
>>12 は筋の通った言い分をもっており媚びずに素直で好感を持ちました。

>>12
icot の先生はまだおられますか?
203デフォルトの名無しさん:2008/11/16(日) 16:46:11
      ∧__∧
      ミ ・ω・ミ∧∧ 
       /⌒ ,つ⌒ヽ ) ←>>202=>>12
       (___  (  __)  
"''"" "'゙''` '゙ ゙゚' ''' '' ''' ゚` ゙ ゚ ゙''`
204185:2008/11/16(日) 16:57:41
>>189>>191>>194
解答ありがとうございます。
205デフォルトの名無しさん:2008/11/16(日) 17:02:50
仕様書(JISX3010)のreturnに関係がありそうなところ読んでみたけど,値渡しかどうかはわかんなかった.
でも,ISOの仕様書にもJISの仕様書にも,return文に用いる変数をstaticにしてるものは見つからなかった.
関数内で配列を宣言してそのアドレスを返す場合を除いて.

>>179
マルチスレッドがどうのって言ってる人が何人かいるけど,
staticってマルチスレッドどんあ悪さを?

>>183
忠告ありがたく受け取っておきます.
そう思っていればなんか食い違ってもそっかぁと思えるし.
でも,正しいものを選定するのが大変そうだ…
個人的には,高校も小学校までと違って,教師は教育のプロではないと思う.

>>184
すぐにばれるwwreturnについて質問したやつなんて,多分学科で俺一人に違いないw

>>202
icotが何かわかりません><
206デフォルトの名無しさん:2008/11/16(日) 17:05:13
ほぼ同時に関数を実行しようとすると値がおかしくなる可能性がある
207デフォルトの名無しさん:2008/11/16(日) 17:06:09
「static マルチスレッド」でぐぐればいくらでもでてくるだろう
それでも理解できないならわからないところを質問すればいい
208デフォルトの名無しさん:2008/11/16(日) 17:11:32
>>207
いっぱい出てきた.ごめん軽はずみに聞くべきじゃなかった.
しかしこれは…准教授はほんとにマルチスレッドでプログラミングしたことないのかな…
209さかみ:2008/11/16(日) 17:14:44
ギタン砲乙www
ヤリ無双普通に面白かった
210デフォルトの名無しさん:2008/11/16(日) 17:16:42
なんという誤爆
211デフォルトの名無しさん:2008/11/16(日) 17:22:12
>>205
関数内に書かれたstatic変数は、実行時にプロセス内で唯一無二の変数として存在。
マルチスレッドな実行環境でその関数が多重並列に呼ばれる場合は弊害をもたらす。
シングルスレッドな実行環境でも、リエントラント問題を考慮しなければいけない。
212デフォルトの名無しさん:2008/11/16(日) 17:25:53
staticの挙動の学習用に限ってなら使って構わないよ
213デフォルトの名無しさん:2008/11/16(日) 17:44:26
>>205
そもそも返却値に値渡しなんて概念はない。
返却値をどう使うかを考えてみればすぐわかるぜ。
さらにいうと、厳密には引数にも値渡ししかないしな。
214デフォルトの名無しさん:2008/11/16(日) 18:00:38
その自称准教授流に再帰階乗関数書いて見た。
これについて意見聞いてみたいな

int kaijo(int n)
{
 static int ret;
 ret = n;
 if (n > 1) {
  ret *= kaijo(n-);
 } else {
  ret = 1;
 }
 return ret;
}
215デフォルトの名無しさん:2008/11/16(日) 18:23:18
このページを見て、マルチスレッドのプログラムを作ろうとしているのですが、
http://homepage2.nifty.com/c_lang/intro/no_99.htm

実際にコンパイルすると、
error C2664: '_beginthreadex' : 6 番目の引数を 'unsigned long *' から 'unsigned int *' に変換できません。
とエラーがでます。

どうやったら解決できますか?
216デフォルトの名無しさん:2008/11/16(日) 18:29:54
DWORD thID; を int thID にすれば?
217デフォルトの名無しさん:2008/11/16(日) 18:32:16
>>215
もしかして 64ビット環境?
とりあえずキャストすればいいんじゃないかな

_beginthreadex(NULL, 0, mythread, NULL, 0, (unsigned int *)&thID);
218デフォルトの名無しさん:2008/11/16(日) 18:33:25
>>213
正確にいえばそうなりますね。C に参照渡しはない。
だから、>>30 でいったとおり、他の言語、特にpascal なども念頭におくと意思疎通が図りやすいのでは、と考えたしだいです。
219デフォルトの名無しさん:2008/11/16(日) 18:34:40
>>217
恐ろしいことを…
220デフォルトの名無しさん:2008/11/16(日) 18:36:17
>>217
64bit環境って何ですか?
とりあえずそれで解決できました。
ありです。
221デフォルトの名無しさん:2008/11/16(日) 18:38:54
CreateThreadと_beginthreadexは微妙に引数・戻り値の型が違うから困りもの。
215のコードはCだと警告が出るだろうけどコンパイルできるはず。
222デフォルトの名無しさん:2008/11/16(日) 18:44:22
>>218
人の話聞いてねーなてめー
C言語で関数からの返却値をどう扱うかを考えれば
値渡しだとか参照渡しだとかそもそも関係ないってことだよ

C言語の返却値が値渡しってのも間違いだ
223デフォルトの名無しさん:2008/11/16(日) 18:45:33
じゃ、何渡し?
224デフォルトの名無しさん:2008/11/16(日) 18:48:21
>>223
"渡し"じゃない。
"評価"だ。
225デフォルトの名無しさん:2008/11/16(日) 18:49:23
はぁ?なにいってんの?
226デフォルトの名無しさん:2008/11/16(日) 18:51:54
そもそも関数の内側からの視点で考えるからわかりづらい。

HOGE()って関数があって、それを呼び出すって言うことは
HOGE()を評価するってこと。
評価=evaluateだから、値を得るって言ったほうが本質に近いな。
227デフォルトの名無しさん:2008/11/16(日) 18:55:55
その議論で、static変数の問題は解決するんだろうか?
解決するにはどこへ議論を運べばいいんだろうか?
228デフォルトの名無しさん:2008/11/16(日) 18:58:19
ResumeThreadと
SetEventって何が違うんですか?
229デフォルトの名無しさん:2008/11/16(日) 18:59:57
んで、C言語では評価されたものをどう使うかってとこに行くのさ。

例えば、a = HOGE(); を考える。
aに代入する時点でどのみちコピーが発生するので、
HOGEでの返却値がテンポラリ変数であろうが、static変数で
あろうがどっちでもいいのさ。

230デフォルトの名無しさん:2008/11/16(日) 19:01:12
めでたしめでたし。
231デフォルトの名無しさん:2008/11/16(日) 19:04:05
構文は、
return 式;
だから、値しか返しようがない。
式がたまたま変数一個からなっていても特別扱いはされない。
232デフォルトの名無しさん:2008/11/16(日) 19:04:21
>>228
スレ違い。
Win32API質問箱にでも行ってみたら?
233デフォルトの名無しさん:2008/11/16(日) 19:32:40
>>228
なにがちがうんですかってほど似てないだろ。
234デフォルトの名無しさん:2008/11/16(日) 20:23:27
>>196
VS2005 <::>大文字な
235デフォルトの名無しさん:2008/11/16(日) 20:27:18
関数へ渡す引数が多くてややこしい場合
引数をポインタ配列にして渡せば、見やすくなると思ったんですが
こういう方法は一般的ではあるんでしょうか?
236デフォルトの名無しさん:2008/11/16(日) 20:28:03
ありますよ?
237デフォルトの名無しさん:2008/11/16(日) 20:31:22
構造体に纏める方が幾分まし。
238デフォルトの名無しさん:2008/11/16(日) 20:36:45
構造体もやってみようとしたんですが
関数の中でコードがややこしくなったんで(私の不勉強でいい方法があるのかも知れませんが)
ポインタ配列で渡そうかと思った次第です
どうもありがとうございます。
239デフォルトの名無しさん:2008/11/16(日) 20:41:26
>>235
vipではよくあること
240デフォルトの名無しさん:2008/11/16(日) 20:42:42
with文を使うと簡潔になる。
241205:2008/11/16(日) 20:46:36
>>211
ググったらもっと難しいのがいっぱい出てきたけど,
その例はわかりやすいなぁ.ありがとう.

>>214
これおもしろいな.
でもこのままじゃ何入れても1しか返さないじゃ…
int kaijo2(int n)
{
static int ret;
if () {
ret = n * kaijo2(n-1);
} else {
ret = 1;
}
return ret;
}
これでどうだろう.

242205:2008/11/16(日) 20:50:05
>>213
引数が値渡ししかないってのはわかる.アドレスを引数にもってくるときも,アドレスの値を渡してるわけだし.返却値が値渡しかどうかって話になったのは,俺が引数を比較対象に持ってきたからだすまん.

准教授は授業で,
関数が終了したら関数内の自動変数は解放される.だから,返値に用いる変数にはstaticをつけないと,戻った時点で値が変わってる可能性がある.だから,返値に用いる変数にはstaticをつけろってことだった.

今回,俺がstaticをつける事に疑問を抱いて,同じ学科の友人との話題にしたんだ.
准教授の説明の意味を,呼び出し元に戻るときに関数が終了するから,戻った時点でその変数の中身が保証されない.
だから,代入する時点で保証されないっていうことだと考えた.もし,引数の場合と同じように値がコピーされるなら,staticをつけないといけない意味がわからない.

int func(void) {
int n;
n=50;
return n;
}
int main(void) {
int a;
a = func();
}
とすると,
内部的には,return文は式のアドレスを取得するという意味で,
a = func();のfunc()はそのアドレスの指す内容に置き換えられるという感じなんだろうと解釈したんだ.
そうすれば,staticが必要な意味が現れてくる.
だから,return N[i];が正しく返されるのかを質問したりしたんだ.return文で評価した値をどうやって呼び出し元に持ってくるのかがわかってればこんな質問はしなかった.

return N[i];に至っては,N[*(&i)]てな感じになって呼び出し元にもっていくのだと思ってた.

>>229
a = HOGE();で,HOGE()が評価されたときに,HOGE()の実行結果の値をどうやって,呼び出し元にもってくるのかが問題です.だから値渡しなのかどうかって話になったんです.
243デフォルトの名無しさん:2008/11/16(日) 20:54:27
>>242
>a = HOGE();で,HOGE()が評価されたときに,HOGE()の実行結果の値をどうやって,
>呼び出し元にもってくるのかが問題です.だから値渡しなのかどうかって話になったんです.

どうやって呼び出しに持ってくるかは処理系依存。
C言語の仕様として決まってないし、決めても仕様がない
244デフォルトの名無しさん:2008/11/16(日) 20:57:06
ゆとり君が気にしてることは、ある意味正常な好奇心だわな。
その答えを手にするにはC言語のコードがどういう風に
アセンブリコードに落とされるかを調べないといけない。
C言語のレイヤーでは答えはでないよ
245デフォルトの名無しさん:2008/11/16(日) 21:02:31
戻り値の実装はどうでもいいんだよ
大抵はスタックに積むんだろうけど
246デフォルトの名無しさん:2008/11/16(日) 21:03:33
適当に EAX レジスタとかいってみる
247デフォルトの名無しさん:2008/11/16(日) 21:07:20
俺の環境(PCとPSP)だとサイズが収まれば
返値はレジスタに入ッてるな。
248デフォルトの名無しさん:2008/11/16(日) 21:09:27
おまいら、結論はstatic変数にするな、准教授はC言語素人、ってことでFA
なんだから蒸し返すなよ
249デフォルトの名無しさん:2008/11/16(日) 21:21:54
>>244が真理、
250デフォルトの名無しさん:2008/11/16(日) 21:32:36
>>235
配列で渡す(つまり、ポインタで渡す)ならわかるが、
ポインタ配列で渡すのはまったく一般的ではない。
251デフォルトの名無しさん:2008/11/16(日) 21:35:21
>>248
准教授はコンピュータ言語については素人、でしょうね。

>>242
仕様と実装を区別する考え方もあります。というより、すべてを追い求めていては命がいくつあっても足りないから。
そろそろcの使い方を習熟する本来の道筋に戻ったほうがよさそうです。

とにかくコードをたくさん書くこと。http://pc11.2ch.net/test/read.cgi/tech/1225320579/ でお待ちしております。
252デフォルトの名無しさん:2008/11/16(日) 21:39:57
>>242
>a = HOGE();で,HOGE()が評価されたときに,HOGE()の実行結果の値をどうやって,
>呼び出し元にもってくるのかが問題です.だから値渡しなのかどうかって話になったんです.

関数 HOGE() は、自身が return xxx; で呼び元に戻る時、戻り値xxxの値をレジスタ(例えばEAX)
などに入れて戻ります。 そして呼び元の a = HOGE(); に戻った時点での右辺の評価とは、その
レジスタ(EAX)の値を評価するということです。つまりxxxの値ですね。

あと、C言語の関数インターフェースレベルでは値渡しとか参照渡しの概念は無いよ。
プログラマの手によって、ポインタやアドレス演算子を使った参照ライクなコーディングも
可能ですよ、という仕組みが盛り込まれているだけなのです。
C言語の仕様によって、ポインタとアドレス演算子という便利素材が用意されているだけです。
253デフォルトの名無しさん:2008/11/16(日) 21:42:33
スレチ承知なんだけど

function func_name() {
 func_name = 0;
}

a = func_name();

という感じで、関数名に値を入れることで右辺値とする言語があったように思うんだけど、
なんだっけ?記憶が薄い辺りで探るとvbかpascalかその辺だと思うが。。
254デフォルトの名無しさん:2008/11/16(日) 21:44:46
>>253
Cでもできるけどにゃー
255デフォルトの名無しさん:2008/11/16(日) 21:46:21
JavaScript?
256デフォルトの名無しさん:2008/11/16(日) 21:46:26
学びて思わざればすなわちくらし、思いて学ばざればすなわちあやうし

知識がないのにあーだーこーだ理屈を捏ね回すのはよくない。
同様に、教科書読んだだけでC言語マスターしますた、なんてのもよくない。
バランス、大事。
257デフォルトの名無しさん:2008/11/16(日) 21:47:40
>>254
本当ですか?実例を書いてください。
258デフォルトの名無しさん:2008/11/16(日) 21:48:56
>>256
ん、同意します。でも、個人的にはコードを書いた量を信頼します。どなたかの真似をすれば
「書いたコード量は裏切らない」
259デフォルトの名無しさん:2008/11/16(日) 21:49:52
>>253
昔のbasicだな

>>254
関数ポインタの話と誤解して無いか?
関数名に代入すると返り値になるとこじゃないかな
260デフォルトの名無しさん:2008/11/16(日) 21:50:01
バランス厨氏ね
261デフォルトの名無しさん:2008/11/16(日) 21:50:26
みんな新弟子前
262デフォルトの名無しさん:2008/11/16(日) 21:56:50
>>259
そう。関数名に代入すると返り値に、のところ。

basic由来なのね。ありがとう。自分が最近使ってる言語では
やらないから思い出せずむずむずしてたんだw
263デフォルトの名無しさん:2008/11/16(日) 22:04:45
ちがうだろww昔のbasicに関数なんてねーよw
VB.NETでは使えるな
264デフォルトの名無しさん:2008/11/16(日) 22:08:12
知識に見合った技術が無いといけない
アマチュアとプロで言えば
知識の量 アマチュア>プロ
技術の量 プロ>アマチュア
になる
265デフォルトの名無しさん:2008/11/16(日) 22:09:27
>>264
なんでやねんw
266デフォルトの名無しさん:2008/11/16(日) 22:33:06
>>262
あれはPASCAL由来だろ
267デフォルトの名無しさん:2008/11/16(日) 23:39:16
Cでcgiを作ったことのある人はいますか?
268デフォルトの名無しさん:2008/11/16(日) 23:41:27
はい。
269デフォルトの名無しさん:2008/11/16(日) 23:42:45
{
}
の対応が、どう見ても、何度見直しても合ってるのに、コンパイルが通らなくて、
}
を一個消すとコンパイルが通る・・・。

こういうことってあり得るんでしょうか?原因は何でしょうか?
270デフォルトの名無しさん:2008/11/16(日) 23:43:24
たぶん}が一個多かったんじゃないかな?
271デフォルトの名無しさん:2008/11/16(日) 23:44:35
実は一つコメントになっていたとか、条件コンパイルの対象になっていたとか、なんかあるんでしょ。
272デフォルトの名無しさん:2008/11/16(日) 23:47:47
"が開きっぱなしとか
273デフォルトの名無しさん:2008/11/16(日) 23:54:12
>>271
条件コンパイル!ありそう!
>>272
あ!それもありそうです。もっとよく見て見ます。
274デフォルトの名無しさん:2008/11/16(日) 23:54:29
ノーマークなトライグラフ発動したとか?
??> が文中の何処かにある?
275デフォルトの名無しさん:2008/11/16(日) 23:58:05
ちなみに、while文の入れ子はできないってルールはありますか?
それから、while文の中からreturnはできないってルールとか。。
276デフォルトの名無しさん:2008/11/16(日) 23:58:49
>>275
ありません
ありません
277デフォルトの名無しさん:2008/11/17(月) 00:00:07
>>275
ないよ。

正確には入れ子の深さ制限はあるかもしれないが
気にするようなレベルじゃない
278デフォルトの名無しさん:2008/11/17(月) 00:06:48
>>275
お作法にルールで反論してもかみ合わないよ
279デフォルトの名無しさん:2008/11/17(月) 00:10:22
>>274
??>
というのは、??は任意の2文字ということ??中途半端に、>や)の片方だけを
使ってる部分はあるかもしれません。
けど、
}
だけの1行をコメントアウトすると、コンパイルが通り、きちんと動作するのが不可解で・・・。

>>276->277
ありがとうございます。
入れ子は2重なので深くはないですよね。

int main()
{
 while( ){
  if( ){
   while( ){
   }
  }else if( ){
  }

  if( ){
  }

 }
}

のような感じで非常に長いので、あまりよろしくないプログラムであることは
間違いないのですが。上手い書き方がよく分からず・・・。
この場合、関数分けして短くすべきなんでしょうか・・・?
280デフォルトの名無しさん:2008/11/17(月) 00:12:18
トライグラフというキーワードも一緒にもらえてるんだからそれで調べるぐらいの気概が欲しい
281デフォルトの名無しさん:2008/11/17(月) 00:13:06
>>278
やらないのがルールなんですか?
282デフォルトの名無しさん:2008/11/17(月) 00:13:55
>>279
そのくらいの関数は普通ですけど。
あと、長いから分けるというのは感心しない。機能で分けてください。
283デフォルトの名無しさん:2008/11/17(月) 00:14:10
>>279
> ??は任意の2文字ということ?
違う
文字通り ??> の組み合わせ。 プリプロセッサが ??> を } に置き換える
284デフォルトの名無しさん:2008/11/17(月) 00:15:48
>>279
正味のところやりたいことによると思うが、各ifの条件文はwhileでのループ内容に依存してるかどうかとか、
関数化したら短くなった!の前に見直したらすっきりした!という結果になることはあるよね。
285デフォルトの名無しさん:2008/11/17(月) 00:19:00
これぐらいで可読性を失うとかどんなエディタだよ
286デフォルトの名無しさん:2008/11/17(月) 00:20:31
if や while の条件式部分が長く、そこに傾注しちゃって
肝心の { を開いてないオチに1票 (K&R スタイル記述でたまにやっちまうZE
287デフォルトの名無しさん:2008/11/17(月) 00:23:24
>>285
どんなエディタ使ってるんですか?
288デフォルトの名無しさん:2008/11/17(月) 00:24:25
>>287
どんなエディタ使ってるんですか?
289デフォルトの名無しさん:2008/11/17(月) 00:27:15
>>288
vimというエディタです。
290デフォルトの名無しさん:2008/11/17(月) 00:28:56
>>289
それはどのようなエディタですか?
291デフォルトの名無しさん:2008/11/17(月) 00:29:21
エディタの機能で可読性が上がったという方は#regionでガベッジにふたをするタイプかなぁ。
そうじゃないといいんだけど。
292デフォルトの名無しさん:2008/11/17(月) 00:29:21
293デフォルトの名無しさん:2008/11/17(月) 00:30:27
>>290
windowsでいうところのメモ帳のようなエディタといえばよろしいでしょうか
294デフォルトの名無しさん:2008/11/17(月) 00:32:27
>>269
 思い込みは止めろ。ソースは嘘を付かない。
コメントになっていることはよくある。特にエディタに強調表示がないときには。

って、VIMかぁ、とりあえず:set showmatchしとけ
どこかにアップロードしたら、確かめてあげるよ。
295289:2008/11/17(月) 00:35:44
!= >>269
296デフォルトの名無しさん:2008/11/17(月) 00:35:51
ここでemacserが颯爽と登場。

ヘッダファイルに{が多いのかもな
297デフォルトの名無しさん:2008/11/17(月) 00:37:29
>>280
すみません。今調べてみたら、「??に続けて特定の文字を記述することで、ISO/IEC 646にない文字を表現する。」
とかなんとか出てきました。よく分からずにいたら、>>283でようやく意味が分かりました。
知りもしなかったので、それは使ってないですね。教えてくださって、ありがとうございます。

>>282>>284
機能ごとに分けるとすると、既に機能では関数化されてるので、長く書くしかないですね。。
>>285
viエディタです。
印刷してマーカー引いて見直してもよかったんですが、時間がなくて・・。
298デフォルトの名無しさん:2008/11/17(月) 00:40:20
>>297
viなのかvimなのかにもよるが、最近ならたぶん、
いずれかのカッコの上にカーソルを置いて%で対応カッコにジャンプしてくれるよ。
299デフォルトの名無しさん:2008/11/17(月) 00:40:52
きゅーえっくす
300デフォルトの名無しさん:2008/11/17(月) 00:43:53
>>297
プリプロ終了段階で止めて
ソースチェックしてみたら?
301269 ◆omke6ataOI :2008/11/17(月) 00:47:48
すみません。キャップつけます。
>>289は別の方です。私は vi 使ってます。

>>298
そうです。その%で括弧に飛んでるんですが、どう見てもあってるんですよ。
%で飛べば、コメントも関係なく飛んでくれるはずなので、コメントアウト
されてる可能性が一番高いかもしれません。

皆様、ありがとうございました。
302デフォルトの名無しさん:2008/11/17(月) 00:49:49
インクルードファイルだと思うけどなぁ
303デフォルトの名無しさん:2008/11/17(月) 00:51:44
整形ツールに通してみれば良いんじゃないかと
304269 ◆omke6ataOI :2008/11/17(月) 00:52:59
>>300
そんなことできるんですか?どうやるんですか?
305デフォルトの名無しさん:2008/11/17(月) 00:55:50
>>304
コンパイラのオプションとかで。
コンパイル環境は?

どうでもいいがHDDのドライバ書きそうな酉だな
306デフォルトの名無しさん:2008/11/17(月) 00:59:12
>>301
vimと仮定して書くが、
ggVG=
とやって再インデントを行ってみては。
307デフォルトの名無しさん:2008/11/17(月) 01:00:42
手癖がでてしまった。
gg=G
のほうが楽か。コマンドモードで。
308デフォルトの名無しさん:2008/11/17(月) 01:01:40
>>304
vi ってことはgccっぽいな。

-E オプションでコンパイルだ
309デフォルトの名無しさん:2008/11/17(月) 01:10:40
質問です

10この配列の中から値が100の配列の添え字を戻り値とする関数は、
配列の添え字が戻り値ということで、unsigned int型とした方がいいのでしょうか?

main(){
 int ret;       /* unsigned intとするべき? */
 ret = read_soeji();
}

unsigned int read_soeji(){
 int i;           /* unsigned intとするべき? */
 for( i=0 ; i<10 ; i++)
 {
  if( array[i] == 100 )
  {
   return( i );
  }
 }
}

よろしくお願いします。
310デフォルトの名無しさん:2008/11/17(月) 01:12:51
>>309
size_tとすべき。
311デフォルトの名無しさん:2008/11/17(月) 01:14:03
見つからないときの処理が入ってないぞ。
312デフォルトの名無しさん:2008/11/17(月) 01:14:35
>>309
規格書をみていないのでアレなんですが、
実は

a[-5]

もアリで、コンパイル自体は無難にとおってしまいます。
ということで、普通の int 型でいいのでは、と思います。
313デフォルトの名無しさん:2008/11/17(月) 01:16:36
>>309
それ、明示的にreturnされないパスがあるぞ。

それはそうと、read_soeji()の返り血をintにして、
値が100のが見つからない場合は負数を返して
エラーを判別できるようにするのが一般的
314デフォルトの名無しさん:2008/11/17(月) 01:17:02
>>309
intにすべき
315デフォルトの名無しさん:2008/11/17(月) 01:17:56
>>309
私ならint型にしておく。
添字は、int型の整数値ならよいから。
もうひとつ、見付からなかったときに、-1とか返せた方が便利だから。
316デフォルトの名無しさん:2008/11/17(月) 01:18:00
>>314
なぜですか?
317デフォルトの名無しさん:2008/11/17(月) 01:18:37
>>309
つかさーアセンブラやってんなら返り血を
渡すコードがどうなってるか見てみるといいぜ
返す型でも変わるし
318デフォルトの名無しさん:2008/11/17(月) 01:39:31
>>1のテンプレにこれ追加
Cのレイヤーでは答えられない質問があります。
なのでその場合、回答者は質問に合ったスレッドへ誘導してください。
319デフォルトの名無しさん:2008/11/17(月) 01:43:23
夜も遅いのにみなさん即レスありがとうございます。
修正してみました。

int read_soeji(){
 int i;
int ret = -1; /* 配列に100がない時retは-1 */
 for( i=0 ; i<10 ; i++)
 {
  if( array[i] == 100 )
  {
   ret = i;
   break;
  }
 }
 return( ret );
}

こんな感じでどうでしょうか。
320デフォルトの名無しさん:2008/11/17(月) 01:47:11
>>319
10返しちゃうよそれ。

int read_soeji(){
 int i;
int ret; /* 配列に100がない時retは-1 */
 for( i=0 ; i<10 ; i++)
 {
  if( array[i] == 100 )
  {
   return i;
  }
 }
 return -1;
}

こんなんでいいよ
321デフォルトの名無しさん:2008/11/17(月) 01:49:19
>>320 わ!はずかしい
322デフォルトの名無しさん:2008/11/17(月) 01:53:11
returnに括弧つけるのよく見るけど何で?
 i=(1);
と書くのと同じようなもんだと思ってるんだけど、違う?
323デフォルトの名無しさん:2008/11/17(月) 01:58:41
括弧つけると関数っぽく見えて何となく統一感があるからなだけ
324デフォルトの名無しさん:2008/11/17(月) 01:59:03
>>322
returnが関数だと勘違いをしている人もいる。
そういう人は括弧をつける。昔のオレw
325デフォルトの名無しさん:2008/11/17(月) 02:03:45
ifやwhileとかの制御系キーワードには括弧がつくので、
returnの後ろにも括弧があると統一感が出る・・・・ような気がするが、どっちでもいい
326デフォルトの名無しさん:2008/11/17(月) 02:10:42
モテようとして、括弧つけちゃっている人がいるんですよぉ〜
なぁ〜〜にぃ〜〜!?やっちまったな!
男は黙ってぇ〜↓
327デフォルトの名無しさん:2008/11/17(月) 02:25:34
括弧つけるとコンパイル時にエラーが検出されないと何度言ったら…
328デフォルトの名無しさん:2008/11/17(月) 02:28:48
昔はつける必要があった
329デフォルトの名無しさん:2008/11/17(月) 03:01:33
昔はなぁ、たった1倍とでも無駄にはできんかったとばい。
< と <= と、イコール1文字でも省略できる条件があるなら、そうしたとばい。
330デフォルトの名無しさん:2008/11/17(月) 03:02:56
1倍とじゃなくて、1バイトねw 改行も叱り。中括弧の位置とか。
331デフォルトの名無しさん:2008/11/17(月) 03:05:08
むしろ1行何円というバイトの給与形式だったので必死に延ばしてたぜ
332デフォルトの名無しさん:2008/11/17(月) 08:17:13
>>326
男は黙って exit
男は黙って exit
333デフォルトの名無しさん:2008/11/17(月) 15:22:34
C言語における神様のパズルとは何か
いくつか提示せよ
334デフォルトの名無しさん:2008/11/17(月) 17:06:13
軍曹殿、それは命令ですか?
335デフォルトの名無しさん:2008/11/17(月) 18:00:08
Red Hat Linux 9でC言語を初めよと思い簡単なプログラムを作成したけど
gcc test.ccと実行すると
-bash: gcc: command not foundになってしまう。
何故なの??
336デフォルトの名無しさん:2008/11/17(月) 18:05:46
>>335
なんで、そんな大昔のOSを使ってるの?
337デフォルトの名無しさん:2008/11/17(月) 18:07:02
>>335
非標準的なインストールをして、gccがインストールされていないのでは?
パッケージをインストールして適切にパスを通せば使えるはずですよ。

それはいいけど、拡張子".cc"はCじゃありませんよ。
338デフォルトの名無しさん:2008/11/17(月) 18:35:07
>>331
こっそりコメント行いれたり?
339デフォルトの名無しさん:2008/11/17(月) 19:15:15
>>333
モザイク除去
340デフォルトの名無しさん:2008/11/17(月) 20:11:34
>>335
シェルで
which gcc
をやってちゃんとあるか確認せよ。
確かRedHat9はデフォルト設定でプログラミング環境が入らなかった。
 システム設定
  アプリケーションの追加と削除
   エディタ
   開発ツール
のチェックボックスをチェックしてインストールせよ。
341デフォルトの名無しさん:2008/11/17(月) 21:14:03
windows2000+VC6です。
beepを5秒位鳴らしたいのですが、非同期で鳴らす方法はありますでしょうか?
スレッドを使わずに済ませたいのです。
342デフォルトの名無しさん:2008/11/17(月) 21:19:05
スレッドを使いたくないのに非同期とな
343デフォルトの名無しさん:2008/11/17(月) 21:20:40
>>341
スレッド使わなきゃそもそ(ry

マルチプロセスならおk?
344デフォルトの名無しさん:2008/11/17(月) 21:34:07
>>341
非同期と同期を勘違いしてるとしてマジレス

1.時刻取得->t1
2.ビープならす
3.時刻取得->t2
4.t2-t1が5秒以下なら2へ
5.酋長
345デフォルトの名無しさん:2008/11/17(月) 21:34:37
×酋長
○終了
346デフォルトの名無しさん:2008/11/17(月) 21:39:42
>>342-344
いや、5秒間鳴らしたいのですが、その間も処理をしたいのです。
PlaySoundとかのクラスが非同期をサポートしてた気がしたので、
beepにもないかなぁと思ったわけです。
347デフォルトの名無しさん:2008/11/17(月) 21:45:04
MessageBeep?
348デフォルトの名無しさん:2008/11/17(月) 21:52:30
>>346
なんで?5秒間くらい待てないの?
349デフォルトの名無しさん:2008/11/17(月) 21:54:36
350デフォルトの名無しさん:2008/11/17(月) 22:15:23
>>341
標準の C だけではできない

誘導: Win32API質問箱 Build72
http://pc11.2ch.net/test/read.cgi/tech/1226575789/
351デフォルトの名無しさん:2008/11/17(月) 22:20:14
Cしかできない物理科なんですけど就職先ってありますかね?
352デフォルトの名無しさん:2008/11/17(月) 22:23:52
>>351 SE
353デフォルトの名無しさん:2008/11/17(月) 22:25:16
>>351
というような質問をしていることが最大のネックになるだろう
続きマ板でやれ
354341:2008/11/17(月) 22:25:37
>>347
MessageBeepを試してみました。
これってコンパネで設定されたWAVファイルが再生されるので、指定時間鳴らす事ができないようです。

>>348
何でって言われるとちょっと困りますが、5秒間メッセージに応答しないのは問題なのです。
355341:2008/11/17(月) 22:27:20
>>350
標準のCじゃなくてもよかったんですが、win32APIを使うとなるとC++になるって事でしょうか?
とりあえず、C++にして紹介されたスレで聞いてみます。
356デフォルトの名無しさん:2008/11/17(月) 22:30:14
>>355
Win32API は C++ じゃなく C だよ
357デフォルトの名無しさん:2008/11/17(月) 22:30:25
win32APIはCで使えるぞ
358356:2008/11/17(月) 22:34:13
>>357
正確にはそうだな
実際アセンブラで書いたことあるし
359341:2008/11/17(月) 22:35:48
>>356-357
了解です。CのままWin32Apiのスレで聞いてみます。つか、もう書きこみした。
あそこのスレはおかしな流れになってるので、レスが付くが微妙ですが・・・。

360デフォルトの名無しさん:2008/11/17(月) 22:56:17
だめだああああ
どうあがいてもファイルの分割コンパイルができない。
グローバル変数を使いたくて、ヘッダファイルに宣言書いて、重複定義の話とかインクルードガードとか
externとか調べて一応理解もしてるつもりが、ずーーと無理だ。
絶対に既に定義されているとか言われちまう。ちくしょー
361デフォルトの名無しさん:2008/11/17(月) 22:57:40
まあなんだ、ソースうpしてみなって
362デフォルトの名無しさん:2008/11/17(月) 23:03:12
ifdef使いなよ
363デフォルトの名無しさん:2008/11/17(月) 23:05:13
>>360
グローバル変数を使おうとする時点で間違っている。
364デフォルトの名無しさん:2008/11/17(月) 23:10:53
ヘッダで変数宣言してるからじゃ?ヘッダに書くとインクルードしたファイル全部にその変数が宣言される。
365デフォルトの名無しさん:2008/11/17(月) 23:11:46
まぁ、宣言だけなら問題ないな。問題は、定義をばら撒いてしまうことだ。
366デフォルトの名無しさん:2008/11/17(月) 23:14:23
>>360
環境ぐらいかけや
367デフォルトの名無しさん:2008/11/17(月) 23:14:54
ヘッダーには extern 付きで宣言
分割ソースのうち、何処かのファイルの1箇所だけで extern 無しで宣言(+初期化)

a.h
 extern int globalA;

b.c
 #include "a.h"
 int globalA = 0; /* 初期化もついでに */

c.c
 #include "a.h"
......
 globalA を参照・変更したーり
368デフォルトの名無しさん:2008/11/17(月) 23:19:41
b.c では #include する必要なし
369デフォルトの名無しさん:2008/11/17(月) 23:21:23
もう壊れかけで書きなぐっただけなのに色々教えてくれてありがとう
既になにが何やら分からんし疲れたのでまた今度ちゃんと質問しに来るよ。
370デフォルトの名無しさん:2008/11/17(月) 23:21:30
おおう そうであった b.c は include 不要だね (組み込み型だし
構造体とかだと、結局 include するはめになるだろうけど
371デフォルトの名無しさん:2008/11/17(月) 23:44:12
ポインタのメリットは?
ややこしいだけで便利な感じが全くしないからイメージが掴めない
一応使い方は分かるけど全部数字渡せばいいんでないのかな?
372デフォルトの名無しさん:2008/11/17(月) 23:46:28
>>371
文字列とか配列はどうすんの?
373デフォルトの名無しさん:2008/11/17(月) 23:46:41
>>371
双方向リスト構造を自分で実装してみれば
ありがたみがわかるよ
374デフォルトの名無しさん:2008/11/17(月) 23:46:48
それで済むレベルならそれでいいと思うよ
375デフォルトの名無しさん:2008/11/17(月) 23:49:31
qsort の立場が無くなる
376デフォルトの名無しさん:2008/11/18(火) 00:20:16
realloc=re + allocのreはどの英単語が省略されたのですか?
377デフォルトの名無しさん:2008/11/18(火) 00:23:08
接頭辞でぐぐれ
378デフォルトの名無しさん:2008/11/18(火) 00:23:42
>>376
英語で普通によく使われる接頭辞 re- じゃないでしょうか?
379デフォルトの名無しさん:2008/11/18(火) 00:24:23
>>376
省略っていうか、そういうもんなんじゃないの?
380デフォルトの名無しさん:2008/11/18(火) 00:38:31
int array[10] = { 20, 30, 40, 100, 100, 50, 60, 100, 90, -1 };

この配列から100を削除し、前詰にする(空いたら最後に-1を追加)プログラムですが、
こんな感じでいいでしょうか?

int i,j;
while( (array[i] != -1) && (i<10) )
{
  if( array[i] == 100 )
  {
    for( j=i ; j<10-1 ; j++ )
    {
      array[j] = array[j+1];
    }
    array[10] = -1;
    break;
  }
  else
  {
    i++;
  }
}

2個連続で100が続いた場合、for文では2つ目を飛ばしてしまいそうですが、
for文でも方法がありましたら教えて頂けるとありがたいです。
381デフォルトの名無しさん:2008/11/18(火) 00:44:50
while( (array[i] != -1) && (i<10) )

for(; (array[i] != -1) && (i<10); )
382デフォルトの名無しさん:2008/11/18(火) 00:49:35
array[10]にアクセスするな
383デフォルトの名無しさん:2008/11/18(火) 00:49:48
配列サイズで終わるのか、-1で終わるのかどっちかにしろ。
仕様が曖昧になって無駄に複雑になる。
384デフォルトの名無しさん:2008/11/18(火) 00:56:44
元のプログラムがあちこち怪しいから書き換えてみたけど……
--
for(int i = 0; array[i] != -1 && i < sizeof(array) / sizeof(* array); ++i) {
if (array[i] == 100) {
for (int j = i; j < sizeof(array) / sizeof(* array) - 1; ++j) {
array[j] = array[j + 1];
}
array[sizeof(array) / sizeof(* array) - 1] = -1;
--i;
}
}
--
ちゃんと考えていないから合ってなかったらゴメン。
385デフォルトの名無しさん:2008/11/18(火) 01:12:53
void reduce100(int array[]){
  int *p, *q;
  for(p = array; *p != 100; p++) if(*p == -1) return;
  q = p + 1;
  while(*q != -1){
    if(*q == 100){ q++; continue;}
    *p++ = *q++;
  }
  *p = -1;
}
386デフォルトの名無しさん:2008/11/18(火) 01:19:35
>>376
re-freshとかre-turnとかre-unionとか
387デフォルトの名無しさん:2008/11/18(火) 01:22:32
void reduce100(int array[]){
  int *p, *q;
  for(p = array; *p != 100; p++) if(*p == -1) return;
  for(q = p + 1; *q != -1; q++) if(*q != 100) *p++ = *q;
  *p = *q;
}
388デフォルトの名無しさん:2008/11/18(火) 01:27:02
遅い時間にみなさんありがとうございます。

forで書くとやっぱりわかり辛いので、指摘頂いたのを修正しまして

int i,j;
while( (array[i] != -1) && (i<10) ) {
  if( array[i] == 100 ) {
    for( j=i ; j<10-1 ; j++ ) {
      array[j] = array[j+1];
    }
    array[10-1] = -1;
    break;
  }
  else {
    i++;
  }
}

これでどうでしょうか。
389デフォルトの名無しさん:2008/11/18(火) 01:33:31
20 30 40 100 50 60 100 90 -1 -1

だな。
390デフォルトの名無しさん:2008/11/18(火) 01:34:49
てか、i 初期化してねーぞ。
391デフォルトの名無しさん:2008/11/18(火) 01:43:05
ごめんなさい、これでどうでしょうか

int i=0;
int j;
while( (array[i] != -1) && (i<10) ) {
  if( array[i] == 100 ) {
    for( j=i ; j<10-1 ; j++ ) {
      array[j] = array[j+1];
    }
    array[10-1] = -1;
  }
  else {
    i++;
  }
}
392デフォルトの名無しさん:2008/11/18(火) 02:12:01
>>391
i==10のときにarray[10]を読んでしまうのはまずいので、
&&の左右を入れ替えるべし。
while( (i<10) && (array[i] != -1) ) {
あとはいいと思う。
393デフォルトの名無しさん:2008/11/18(火) 02:19:56
俺はもう頭が弱ってしまっているので
作業配列を用意して、そこに元の配列をコピーして、
作業配列を読みながら100以外を詰めていくようにしてしまうな
394デフォルトの名無しさん:2008/11/18(火) 02:32:14
>>380 クソースだというのは内緒でおじゃる

#include <stdio.h>
#define DEL 100
#define END -1
int main(void) {
int array[10] = { 20, 30, 40, 100, 100, 50, 60, 100, 90, -1 };
int i,j,array_sz=sizeof(array)/sizeof(array[0]);
for(i=0,j=0; i<array_sz; i++) {
if(array[i]==DEL) j++;
else array[i-j]=array[i];
}
for(i=array_sz-j; i<array_sz; i++) array[i]=END;
for(i=0; i<array_sz; i++) printf("%d ",array[i]);
return 0;
}
395デフォルトの名無しさん:2008/11/18(火) 02:32:45
ありがとうございます。
心置きなく寝れます。
396デフォルトの名無しさん:2008/11/18(火) 03:44:17
そうか、安らかに眠れ・・・
397デフォルトの名無しさん:2008/11/18(火) 08:11:43
色々やってもうだめだと思ったら
大文字と小文字違ってやんの・・・俺の3時間かえせーーー
398デフォルトの名無しさん:2008/11/18(火) 08:13:09
            ___
           ,r'     `ヽ、
          ,i"        ゙;
          !.(●)   (●),!
          ゝ_      _,r''
         /  ;;;;;;  ・・ ;;;;) それは報告しなくてもいいです。
         /          (_
        |    f\ トェェェイノ     ̄`丶.
        |    |  ヽ__ノー─-- 、_  )
.        |  |            /  /
         | |          ,'  /
        /  ノ           |   ,'
      /   /             |  /
     _ノ /              ,ノ 〈
    (  〈              ヽ.__ \
     ヽ._>              \__)
399デフォルトの名無しさん:2008/11/18(火) 08:20:10
シグナルハンドラを使うメリットを教えて下さい。
400デフォルトの名無しさん:2008/11/18(火) 08:58:03
>>399
ミニマムなプロセス間通信
401デフォルトの名無しさん:2008/11/18(火) 11:08:00
>>399
非同期処理
402デフォルトの名無しさん:2008/11/18(火) 14:13:39
float同士計算してて
表現できる範囲こえると何が表れるの?
1231e-39をこえると、完全に0になるわけ?
403デフォルトの名無しさん:2008/11/18(火) 14:16:32
1231e-99を超えるっていうのかそれ。
確かに精度を割り込んだら0になるけど。
404デフォルトの名無しさん:2008/11/18(火) 14:21:55
floatで小数点の計算をしてて、でた結果をlogとるときに
nanがでるケースがあるとおもうんだけど、
どういうケース?log(0)=nanなんだけど
405デフォルトの名無しさん:2008/11/18(火) 14:25:07
負数でも入れたんじゃね
406デフォルトの名無しさん:2008/11/18(火) 14:33:47
確率計算だから負はないんです。
0で表現できなくなったからnanになったと考えるしかないかな
407デフォルトの名無しさん:2008/11/18(火) 14:41:48
本当はぴったり0になるはずのところ誤差でマイナスになったとか
408デフォルトの名無しさん:2008/11/18(火) 15:35:09
そんなくだらないことより日本終了のお知らせですよおまいら
409デフォルトの名無しさん:2008/11/18(火) 15:35:50
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char *item;
};
int main(void) {
int i;
char n[100];
struct node **a, *b;
a = malloc(sizeof(*a));
for (i=0; i<3; i++) {
fgets(n, 100, stdin);
b = malloc(sizeof(*b));
b->item = (char*)(b+1);
strcpy(b->item, n);
a[i] = b;
}
for (i=0; i<3; i++) printf("%s\n", a[i]->item);
}

このポインタの配列a[i]->itemを、2次元配列a[i][j]->itemとして実現したいのですがどうすればよろしいでしょうか?
a[i][j]->item = b;
としてもうまくいかないので・・・
410デフォルトの名無しさん:2008/11/18(火) 15:41:09
そりゃ a が struct node** なら
a[i] は struct node* だし、てことは
a[i][j] は struct node なんだから
a[i][j].item でええやん。
411デフォルトの名無しさん:2008/11/18(火) 15:47:09
>>409
その前に色々バグを直した方がいいんじゃないか
412デフォルトの名無しさん:2008/11/18(火) 16:00:39
二次元配列の動的確保をしたいならこれで我慢しなさい

foo **bar;
bar = malloc(sizeof(foo *) * A);
for(i = 0; i < A; i++) bar[i] = malloc(sizeof(foo) * B);

bar[a][b] = hoge;

for(i = 0; i < A; i++) free(bar[i]);
free(bar);
413409:2008/11/18(火) 16:05:56
>>411
一応動く程度には作ってみたのですが、どこを直せばよいでしょうか?
414デフォルトの名無しさん:2008/11/18(火) 16:10:49
なんで自分で考えないの?
415デフォルトの名無しさん:2008/11/18(火) 16:14:49
分からないグズは黙ってろ
416デフォルトの名無しさん:2008/11/18(火) 16:16:39
ポインタの解釈がおかしいからでは?
417デフォルトの名無しさん:2008/11/18(火) 16:19:28
>>413
strcpyでコピーしてる先はどこで確保してんの?
b+1がどこを指すかわかってる?
418デフォルトの名無しさん:2008/11/18(火) 16:22:28
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
#define N 3
struct node {
char item;
};
int main(void)
{
int i, j, k;
char n[MAX];
struct node **a;

a = (struct node **)malloc(sizeof(a) * N);
for (i = 0; i < N; i++) {
a[i] = (struct node *)malloc(sizeof(*a) * MAX);
gets(n);
for (j = 0; j < (int)strlen(n); j++)
a[i][j].item = n[j];
for (k = j; k < MAX; k++)
a[i][k].item = '\0';
}
for (i = 0; i < N; i++) {
for (j = 0; j < MAX; j++)
printf("%c", a[i][j].item);
putchar('\n');
free(a[i]);
}
free(a);
return 0;
}
419409:2008/11/18(火) 17:11:05
>>418
for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
gets(n);

すみません、i*j入力してi*j出力する意味で2次元配列と書いたつもりだったのですが・・・
420デフォルトの名無しさん:2008/11/18(火) 17:18:54
>>419
お前の目はフシアナか

for (i = 0; i < N; i++)
for (j = 0; j < (int)strlen(n); j++)
421デフォルトの名無しさん:2008/11/18(火) 17:26:05
/* aを入力した場合「正解です」と表示し、そうでない場合「不正解です」と表示し、
  aが入力されるまで繰り返すプログラム*/
#include <stdio.h>
int main(void);
int main(void)
{
char moji;
while(1){
printf("aを入力して下さい。\n");
scanf("%c",&moji);
if( moji=='a' ){
printf("正解です\n");
break;
}
else{
printf("不正解です\n");
}
}
return (0);
}

実行結果
aを入力して下さい。
s
不正解です
aを入力して下さい。
不正解です
aを入力して下さい。

こうなってしまいます。
どうしたらいいんでしょうか?
422デフォルトの名無しさん:2008/11/18(火) 17:27:18
いいんじゃない?どうでも
423409:2008/11/18(火) 17:27:19
>>420
jをそのように使うのではなく、iと同じように行列で入力したいという意味なんです(3*3入力のように)
424デフォルトの名無しさん:2008/11/18(火) 17:58:40
>>421
改行文字を入力しているのに、それを読み飛ばしていないから。
425421:2008/11/18(火) 18:10:05
改行文字の意味は分かりますが、
読み飛ばしていないからと言うのはどういう意味なのでしょうか?
426デフォルトの名無しさん:2008/11/18(火) 18:16:08
入力された改行文字は、次回のscanf()で収容されるのです。
427デフォルトの名無しさん:2008/11/18(火) 18:18:10
scanfの次にこれ入れてみては。
printf("(%#2x)\n", moji);
428421:2008/11/18(火) 18:19:44
どのようにして読み飛ばせばいいのでしょうか?
例をあげて頂ければありがたいです。
何度もすいません。
429デフォルトの名無しさん:2008/11/18(火) 18:20:51
>>423
という事は i や j を数値で入力するという意味ですか?
ご呈示のソースでは行が横方向に繋がった文字列として
書かれていますのでどっちみちその書き方では[i][j]のように
アクセスする事はできません。
430デフォルトの名無しさん:2008/11/18(火) 18:26:20
>>421
scanf("%c ", & moji)
431421:2008/11/18(火) 18:28:37
ダメです、変わりません。
どうしたら・・・
432デフォルトの名無しさん:2008/11/18(火) 18:34:44
getchar()
433デフォルトの名無しさん:2008/11/18(火) 18:39:44
ダミーでscanfの前にscanf("%*");するとか
434421:2008/11/18(火) 18:40:27
getchar()でも結果は同じorz
435421:2008/11/18(火) 18:46:22
433さんありがとうございます。
無事できました!!
436デフォルトの名無しさん:2008/11/18(火) 19:51:47
>>423 こういう事?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
#define N 3
struct node {
char *item;
};
int main(void)
{
int i, j;
char n[MAX];
struct node **a;
a = (struct node **)malloc(sizeof(a) * N);
for (i = 0; i < N; i++) {
a[i] = (struct node *)malloc(sizeof(*a) * N);
for (j = 0; j < N; j++) {
a[i][j].item = (char *)malloc(sizeof(char) * MAX);
gets(n);
strcpy(a[i][j].item, n);
}
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%12s", a[i][j].item);
putchar('\n');
free(a[i]);
}
free(a);
return 0;
}
437デフォルトの名無しさん:2008/11/18(火) 19:52:25
あ、free(a[i][j].item); 忘れてたわ
付け加えといて
438409:2008/11/18(火) 21:27:51
>>436-437
どうも分かりやすいスマートなプログラムをありがとうございます(o*。_。)oペコリ
ポインタの考え方もとても参考になりました。
439デフォルトの名無しさん:2008/11/18(火) 21:50:42
>>438
gets()じゃ危険でfgets()を使いたいのなら行末に'\n'が入るから
取り除かないと表示が変になるよ
440デフォルトの名無しさん:2008/11/18(火) 21:55:58
0〜30までの乱数(小数5ケタ)を発生させる方法を教えてください
441デフォルトの名無しさん:2008/11/18(火) 22:16:27
メルセンヌツイスタでおk
442デフォルトの名無しさん:2008/11/18(火) 22:31:11
0〜10までの乱数を割り算を使わずに表示するメソッドを作成したいのですが、どのようにすればよいでしょうか?
443デフォルトの名無しさん:2008/11/18(火) 22:58:29
>>442
何故割り算を使わないの?
444デフォルトの名無しさん:2008/11/18(火) 23:23:15
0-10がでるまで頑張って返す
445デフォルトの名無しさん:2008/11/18(火) 23:23:53
>>443
C言語のプログラムファイルを元にプログラムを作成して、それを変換して使うのですが、変換後の媒体では割り算が使用できないためです。
446デフォルトの名無しさん:2008/11/18(火) 23:25:45
自分で割り算の処理を作ればいいじゃない。
447デフォルトの名無しさん:2008/11/18(火) 23:27:54
>>445
それはその「変換後の媒体」について聞くべき場所で聞くことじゃないのか
448デフォルトの名無しさん:2008/11/18(火) 23:28:10
>>445
乱数の種を配列で作っておき、それをローテーションして使うとか?
449デフォルトの名無しさん:2008/11/18(火) 23:30:39
十進文字列にして一の位を取り出す
450デフォルトの名無しさん:2008/11/18(火) 23:30:39
>>445
ハードウエアで乱数を作る方法をもしかして知っているか?
451デフォルトの名無しさん:2008/11/18(火) 23:32:05
10より小さくなるまで10で減算を繰り返せば10で割った余りが求められるよ!
452デフォルトの名無しさん:2008/11/18(火) 23:32:59
もう下位4ビットだけ使えば
453デフォルトの名無しさん:2008/11/18(火) 23:40:11
お前ら何を言っているんだ。
>442は「表示する」メソッドが欲しいんだぞ。
乱数生成はきっと既にあるに違いない。
454デフォルトの名無しさん:2008/11/18(火) 23:44:09
じゃ割り算いらねぇじゃんよ
455デフォルトの名無しさん:2008/11/18(火) 23:59:08
strcpy("hogepiyohogera","AAAA");
って、BCCでコンパイルエラーにならないんですが、大丈夫でしょうか?
char *strcpy(char *s1, const char *s2);
第二引数の方はいいとして、第一引数は"hogepiyohogera"(const char *ですよね??)をchar *に変換しているようで、全く大丈夫な気がしないんですが…。
456デフォルトの名無しさん:2008/11/19(水) 00:01:16
Cでは慣習的に(互換性のためにも)文字列リテラルをchar *にそのまま渡せる。
結果どうなろうとそんなの関係ねぇ。
457デフォルトの名無しさん:2008/11/19(水) 00:07:08
BCCのコンパイラオプションに -d (重複文字列をマージする)ってのが
あるからこれをONにしてコンパイルして>>455みたいのを試すと
同一文字が全部書き換わってワロス
458デフォルトの名無しさん:2008/11/19(水) 00:07:26
なるほど。無茶が残ってるんですね。
あと、
char sz[42];
strcpy(sz,"HOGE");
*(sz+2)='C';
が問題ないのは分かりますが、
char *sz;
sz="HOGE";
*(sz+2)='c';
って大丈夫なんでしょうか?
これまたconstなところを書き換えようとしているように見えるのですが、BCCは何らモンクを言いません・・・。
459デフォルトの名無しさん:2008/11/19(水) 00:10:16
>>458
一応規格では unspecified(不定の動作)になる
BCCでは問題ないようだがコンパイラによっては本当にread onlyの
領域に文字列がマップされてコアダンプ起こすことがある
460デフォルトの名無しさん:2008/11/19(水) 00:12:32
>>459
そういうのは未定義の動作だろ
461デフォルトの名無しさん:2008/11/19(水) 00:12:55
なるほど。
あのコードを走らせてマシンから火が吹いても俺のせいなわけですね。
どうもありがとうございます。
462デフォルトの名無しさん:2008/11/19(水) 00:12:59
#include <stdio.h>

int main()
{
char *a = "abc", *b = "abc", *c = "abc";

*(a + 1) = 'd';

printf("%s %s %s\n", a, b, c);

return 0;
}

bcc32.exe -d test.c
test
adc adc adc
463デフォルトの名無しさん:2008/11/19(水) 00:19:44
ISO9899:1999§6.4.5.6
It is unspecified whether these arrays are distinct provided their elements
have the appropriate values. If the program attempts to modify such an array,
the behavior is undefined.

悪い未定義(undefined)と書かれていた
464デフォルトの名無しさん:2008/11/19(水) 00:22:07
そうなるとK&R第2版P128に「結果が不定となるので注意がいる」
というのは誤訳かはたまたC89に限った事なのか
465デフォルトの名無しさん:2008/11/19(水) 00:27:10
fscanfでファイルから値を読み込みたいんですが、

FILE *fp = fopen("data.dat","r");
float x,y;

if(!fp)
return 1;
while(fscanf(fp,"%f %f",&x,&y) != EOF)
printf("%f %f\n",x,y);
fclose(fp);

これはどこかのサイトに載ってたのをほぼそのまま借りたのですが、
これだとdataファイルの中身の値、例えば0.123・・・などの整数値が0の場合printfを使ったとき
1,23・・・のように初めて0ではない数が現れるとその数値が整数部になってしまいます。
これをそのまま0.123・・と印字できるようにしたいのですが、御教授お願いします。

値がマイナスの場合はそのまま印字されてました。
ファイル内の値はただの数でなく0.12345E+00のようになっていてE以前の数値の部分だけ読み込んで印字できるようにしたいです。
上のプログラムでは一応不要な部分は消えてました。

466デフォルトの名無しさん:2008/11/19(水) 00:40:00
>>465
%f であれば実数表現(0.123) になりませんか?
%e であれば浮動小数点表現(1.23e-01) になりますが、これを非正規化?のままで出力する(0.123e-00) のは、
printf() ではわかりません。
467デフォルトの名無しさん:2008/11/19(水) 00:46:07
そのプログラムをそのまま実行したら

0.123450 0.123450

となったが、これじゃいかんの?
468デフォルトの名無しさん:2008/11/19(水) 00:52:36
>>464
あの本はコンセプトを綴った本で、明確な定義を求めてはいけない
469デフォルトの名無しさん:2008/11/19(水) 00:56:47
一行に数値が4つ並んでるんですよ。
0.588235E-01 0.300000E+01 -0.299827E+01 0.1500000E+01

とりあえずこの1行だけををファイルに書いて、プログラムを走らせたら結果は
0.058823 3.000000
-2.998270 1.500000

ってなりました・・・マイナスの奴もずれてましたw
470デフォルトの名無しさん:2008/11/19(水) 00:58:04
0.123e1をscanf("%f")で読んでprintf("%f")したら1.230000と出る、って話じゃないかな?
指数表記での仮数部をとりたいなら、文字列として読んでいらない所を捨てるしかないかな。

>>465
"0.12345E+00"はE+00まで含んで一つの数値の書き方(これを指数表記という)なんだけど、
大丈夫ですよね?
471デフォルトの名無しさん:2008/11/19(水) 01:07:26
>>470
恥ずかしながら今初めて知りました・・・
ってことはE+〜、E−〜の部分がちゃんと計算されて桁が繰り下がったり、上がったりしてた
ということですか・・

レス下さった方々有難う御座いました、かなり恥ずかしいです
472デフォルトの名無しさん:2008/11/19(水) 18:24:12
ファイルを取り込み、それを構造体として格納し、
numの大小によってそれらを入れ換えるプログラムを書きたいのですが、
どうやってもセグメントエラーになってしまいます。

同じ型で二つの構造体変数を宣言していて、
ひとつの構造体変数同士の入れ換え(例 a[1]=a[2];)は問題なく動いているようなのですが、
別々の変数で入れ換えを行っているとき(例 b=a[1];)でエラーが返されているようです。
どうすれば正しく動くようになりますでしょうか?
473デフォルトの名無しさん:2008/11/19(水) 18:25:54
#include <stdio.h>

struct data{
char a[21];
char b[21];
int num;
}s[21],t;

main()
{
FILE *fp; int count,i,j;

fp=fopen("test.dat","r");
for(i=0; ; i++){
if((fscanf(fp,"%s %s %d",s[i].a, s[i].b, s[i].num))==EOF){ break; }
else count++;
} fclose(fp);

for(i=0; i<count; i++){
t=s[i];
for(j=i+1;j<count;j++){ if(t.num<s[j].num){ t=s[j]; s[j]=s[i]; s[i]=t;} }
}

for(i=0; i<count; i++){
printf("%s %s %d\n",s[i].a, s[i].b, s[i].num);
}
return 0;
}
474デフォルトの名無しさん:2008/11/19(水) 18:44:29
コンパイラBorland C++ Compiler 5.5を使ってコマンドプロンプトでコンパイルしたいのですが
"インクルードファイル`stdio.h`をオープンできない"って表示されてコンパイル出来ないのですが
なにが原因なんでしょうか?教えてください
475デフォルトの名無しさん:2008/11/19(水) 18:46:39
コンパイラ初期設定はしたんだろうな?
476デフォルトの名無しさん:2008/11/19(水) 18:47:34
しょ、初期設定とはなんでしょうか?
477デフォルトの名無しさん:2008/11/19(水) 18:49:05
ヒント:bcc cfg
478デフォルトの名無しさん:2008/11/19(水) 18:50:00
>>472
そもそも>>473のコード動くのか?
count を0に初期化することと、s[i].numは&s[i].numじゃないのか?
479デフォルトの名無しさん:2008/11/19(水) 18:50:53
>>476
bcc32.cfgでググれ。
480デフォルトの名無しさん:2008/11/19(水) 18:51:00
あ、それはあります。
置く場所が間違っているのでしょうか・・・
bcc55に入れてあるのですが。
481476,480:2008/11/19(水) 18:56:14
ググったら解決しました^^
ありがとうございました
482デフォルトの名無しさん:2008/11/19(水) 18:58:43
すいません
人のふりするのは止めてもらえませんか
483デフォルトの名無しさん:2008/11/19(水) 18:59:19
当人はググっってみたの?
484デフォルトの名無しさん:2008/11/19(水) 19:10:04
GCCの件です。

>>3362003年から放置状態でした。
>>337ダウンロード済みのやつを買ったので不明です。拡張子はcですか?
>>340which gcc を実行したところ no gcc でした。
インストールしてみます。
485481:2008/11/19(水) 19:13:59
すみません・・・当人です・・・
まじで、ググったら解決しました。
486デフォルトの名無しさん:2008/11/19(水) 19:35:57
ファイルからの読み込みを構造体の各配列に格納したいのですが、上手くいきません。
#include <stdio.h>
typedef struct Student{
char number[4];
char name[8];


} Student;
int main(){
char fname[32]; int i=0,j; FILE *fp; Student sdt[8];
printf("filename:"); scanf("%s",fname); scanf("%*c");
fp=fopen(fname,"r");
if(fp==NULL){
printf("error\n"); break;
}
while(){
fgets(sdt[i].number,3,fp); for(j=0;sdt[j].number!='\n';j++); sdt.number[j]='\0';
fgets(sdt[i].name,7,fp); for(j=0;sdt[j].name!='\n';j++); sdt.name[j]='\0';
i++;
}
return 0;
}
ファイルには、構造体の配列に対応するデータが1行ずつ書き込まれています。
例:(「」の内)
「101
太郎
102
次郎 …

ファイルの最後は改行され、最終行は何も無い状態です。
とりあえず1行ずつ読み込めばいいのかと思い作ってみましたが、ループ部の条件で躓きました。
どなたかご教示お願いします。
487デフォルトの名無しさん:2008/11/19(水) 19:58:37
まず、windows環境ならファイルを"rt"で開くこと
次に、fgetsの仕様をよく読みなおすこと
488デフォルトの名無しさん:2008/11/19(水) 20:04:44
つ−かコンパイルでエラーするのでは
489デフォルトの名無しさん:2008/11/19(水) 20:15:51
>>486
iカウンタを使うならwhileよりforのほうがわかりやすいし、初期化忘れ対策にもなる

fgetsは最大で指定した文字数-1文字まで読み込む関数
3と指定したら2文字しか読み込まない
3桁の数字の行は\nを含めて4バイトになるから
終端ヌル文字を加えてバッファは5以上ないといけない

\nをはじくのはいいが、必ずあると決めてかかるのは危険
ない場合にも処理できるようにすること
あと、本当は行の長さが長すぎた場合の処理も必要

終了条件は二つ
・用意したバッファが満杯になる
・正しく読めるデータがない

それから配列の添字の使い方があちこち間違ってる
490デフォルトの名無しさん:2008/11/19(水) 20:16:47
>>478
countはコピペミスで、ご指摘の通りcount=0になっています。
&については、つけなければコンパイルを通り、つけると不適切な代入としてエラーが返されます。
491デフォルトの名無しさん:2008/11/19(水) 20:22:41
創価学会は詐欺集団です。

池田大作という名前はウソで、本当は朝鮮人です。
創価は日本人から金をしぼりとる朝鮮企業です。

俺が見たのは2つの封筒で、片方には2枚プリントが入っていて
もう片方は1枚プリントが入っていて、両方あわせて約4万円です。

朝鮮人には無料で配られますが、日本人は4万円で買わされます。

仏壇も朝鮮人なら無料で貸してくれます。
日本人は3000万円以上の仏壇を買わされます。

引越しも朝鮮人なら無料です。
(いつも仏壇をちょっと運ぶだけでたくさん金をもらってるから)


今から創価学会に入る人は本当にバカです。

そのバカな人のおかげで印刷所・引越し業の人が生活できる。

悲しいけどこれが現実なのよね。
492デフォルトの名無しさん:2008/11/19(水) 20:31:08
>>490
どこにつけた
493デフォルトの名無しさん:2008/11/19(水) 20:32:51
>>340エディタ、開発ツールのインストールの途中にインストールDISK1ディスク
を挿入して下さいと表示されましたがうちの自宅サーバにはCD-ROMドライブが付属していないので困っています。
一応、RedHatLinux9のCD-ROMの内容はPCに保存されているようです。
どうすればいいのかがわかりません。
TeraTermProから操作しています。
宜しくお願いします。
494デフォルトの名無しさん:2008/11/19(水) 21:21:25
>>493
rpmはもってるってこと?
なら
rpm -ivh /path/to/gcc.rpm
495デフォルトの名無しさん:2008/11/19(水) 21:42:22
>>493
CDドライブぐらい買った方がいいんじゃないの?
496486:2008/11/19(水) 21:46:01
ご回答ありがとうございます。理解できた範囲で修正してみました。
#include <stdio.h>
#include <stdlib.h>
typedef struct Student{
char number[8];
char name[16];
} Student;
int main(){
char fname[32]; int i=0,j; FILE *fp; Student sdt[8];
printf("filename:");
scanf("%s",fname); scanf("%*c");
fp=fopen(fname,"rt");
if(fp==NULL){
printf("error\n");
exit(0);
}
for(i=0;i<8;i++){
fgets(sdt[i].number,4,fp); for(j=0;sdt[i].number[j]!='\n';j++); sdt[i].number[j]='\0';
fgets(sdt[i].name,8,fp); for(j=0;sdt[i].name[j]!='\n';j++); sdt[i].name[j]='\0';
}
return 0;
}
改行コードはあるものとしてお願いします。
読み込むデータが無い場合の条件の表現がわかりません。
fgetcとEOFを上手く使うのでしょうか。
497デフォルトの名無しさん:2008/11/19(水) 21:46:36
板違い
498デフォルトの名無しさん:2008/11/19(水) 21:48:23
>>496
だからfgetsの仕様をちゃんと読めって
499デフォルトの名無しさん:2008/11/19(水) 21:56:01
>>493
公式でiso落とせるからmountしてみたら?
http://www.redhat.com/download//howto_download.html
500496:2008/11/19(水) 21:56:22
>>498
申し訳ありません。おっしゃっていることが理解できないのですが。
fgets()を使用するとアクセス位置が次の行に移ると認識しているのですが、誤解でしょうか。
これ以外には思い当たる節がありません。
501デフォルトの名無しさん:2008/11/19(水) 22:05:25
>>500
たぶん、かなりの初心者なんだと思うけど
4文字読むとか8文字読むために fgets は、普通、使わない。
fgets は1行丸ごと読むために使う。

char buf[1024];         // 十分なサイズ
fgets(buf, sizeof(buf), fp);

とかしておいて、そのあと読んだデータを加工するのが、普通の使い方。

strcpy(sdt[i].number, buf);
for(j=0; sdt[i].number[i] ; j++)
 if(sdt[i].number[j] == '\n' ) sdt[i].number[j] = '\0';
502デフォルトの名無しさん:2008/11/19(水) 22:10:59
だれかscanf()は使うなってアドバイスしてやればいいのに。
503デフォルトの名無しさん:2008/11/19(水) 22:15:12
scanfマジオススメ。
504デフォルトの名無しさん :2008/11/19(水) 22:32:00
>>501
そういう風にするなら
char *p;とでも宣言しといて
char buf[1024];
fgets(buf, sizeof(buf), fp);
if(p = strrchr(buf,'\n'))
*p = '\0';
てしたほうがすっきりするかな
505デフォルトの名無しさん:2008/11/19(水) 23:08:08
>>500
fgets()はファイルエンドに達したときにヌルポインタを返す
これを使って終了条件を設定する
506デフォルトの名無しさん:2008/11/19(水) 23:48:12
>>504
strrchr()じゃなくてstrchr()でいいよ。どうせ改行文字は高高一つしかないからね。
507デフォルトの名無しさん:2008/11/19(水) 23:53:35
組み込み系とかは抜きにしてイマドキの環境でヒープとスタック領域が
衝突するなんて起こりえる?
メモリのアロケーションはOSとコンパイラとどちらに依存しているのかえ
508486:2008/11/20(木) 00:19:34
なんとか形になりました。
助言ありがとうございました。
509デフォルトの名無しさん:2008/11/20(木) 00:22:25
>>507
今時のなら起こりえない、間に衝突を塞ぐ的なものがある
510デフォルトの名無しさん:2008/11/20(木) 00:40:25
>>509
ssとdsは違う、とおもっていていいのでしょうか?
511デフォルトの名無しさん:2008/11/20(木) 00:45:50
MMUがあるからな
512デフォルトの名無しさん:2008/11/20(木) 01:33:31
>>511
それは windowsも?linux も?
windows って ss=ds ではなかったでしょうか?
513デフォルトの名無しさん:2008/11/20(木) 02:00:08
isspace()はどのように実装されているのですか?
514デフォルトの名無しさん:2008/11/20(木) 02:15:26
>>513
実際どうなってるかは知らないけど、その手のは大体テーブル使ってるらしいよ、主に速度面の理由から
515デフォルトの名無しさん:2008/11/20(木) 03:22:06
>>512
今時、セレクタ(セグメントレジスタの値)は関係ない。

Win32の場合、EXEファイルに使用するスタックの量を指定しておき、
実行開始時、それだけのアドレス空間が予約されるようになっている。
アドレス空間を予約してしまえば、ほかの用途(ヒープなど)で手を出すことは不可能。
しかも、指定された量を超えてスタックを使おうとすれば、スタックオーバーフローとして例外処理される。
516デフォルトの名無しさん :2008/11/20(木) 03:32:02
int isspace(int c)
{
if((c >= 0x09 && c <= 0x0d )|| c == ' ')
return 1;
else
return 0;
}
517デフォルトの名無しさん:2008/11/20(木) 03:32:54
locale対応の必要性もなかったっけ?
518デフォルトの名無しさん:2008/11/20(木) 08:36:16
誰もがうなる1行ハックコードを教えてください。僕が感動したらあなたの勝ちです
519デフォルトの名無しさん:2008/11/20(木) 08:54:34
format c:
520デフォルトの名無しさん:2008/11/20(木) 10:55:15
C言語はschemeみたいにステップ実行、つまり順番にどのような作業が行われているかを
1ステップごとに見ることはできないのですかね?
ビルドはできても正常な値を出せないときはプログラムを地道に調べていくしかないのでしょうか?
どこまで正解で、どこから自分の考えた値を出せていないのかを知りたいのですが…
初心者丸出しな質問ですいません。
521デフォルトの名無しさん:2008/11/20(木) 11:01:28
>>520
それはデバッガの話であって
Cだからとかそういう話では無かろうよ。
環境は何?
522デフォルトの名無しさん:2008/11/20(木) 11:01:33
えーと、デバッガというものがあってね。
523デフォルトの名無しさん:2008/11/20(木) 12:54:49
ファイルが開いてるか開いてないか状態を調べる関数とかってありますか?
524デフォルトの名無しさん:2008/11/20(木) 13:02:48
>>523
fopen/openしたら?オープン済だったらエラーになるだろ。

つか、それ以前にオープンしたかどうかはプログラムで把握していないといけない。
525デフォルトの名無しさん:2008/11/20(木) 13:05:30
>>524
実行環境依存じゃね?
マルチプロセスOSで 同一のファイルを 両方とも read で開くのはOK とか
526デフォルトの名無しさん:2008/11/20(木) 13:07:50
昔々ひとつのファイルをread と write で開いて中身消滅させたことがあるな
527デフォルトの名無しさん:2008/11/20(木) 13:15:08
>>524
排他処理してたらエラーにならないわけで(ファイルが閉じるまで待つようにしていれば)、それ以外の方法を知りたいのです
528デフォルトの名無しさん:2008/11/20(木) 13:18:41
OSによって違うんだから環境依存
529デフォルトの名無しさん:2008/11/20(木) 13:19:47
>>527
複数のプロセスで同じファイルにアクセスするってこと?
アクセスはreadのみ?writeのみ?readとwrite?
530デフォルトの名無しさん:2008/11/20(木) 13:22:48
>>529
テキストファイルを、他のプロセスから開かれてないかチェックしたいのです
531デフォルトの名無しさん:2008/11/20(木) 13:28:42
>>530
そのプロセスというのが自分の身内ならそこに問い合わせろ
関係ないプログラムなら環境依存
532デフォルトの名無しさん:2008/11/20(木) 13:29:57
>>531
環境依存ってなんですか?
533デフォルトの名無しさん:2008/11/20(木) 13:30:19
だーかーら OS依存だってば

自プロセスが read で開いている間に 別プロセスが read で開く/write で開く とどーなるか?
自プロセスが write で開いている間に 別プロセスが read で開く/write で開く とどーなるか?
別プロセスが read で開いているファイルに対して 自プロセスが read/write で開くとどーなるか?
別プロセスが write で開いているファイルに対して 自プロセスが read/write で開くとどーなるか?

C言語のレベルでは上記の振る舞いに対し どうあるべきかの規定は無い
534デフォルトの名無しさん:2008/11/20(木) 13:30:25
>>532
お前には無理ということ
535デフォルトの名無しさん:2008/11/20(木) 13:35:21
環境ごとのスレで聞け
WindowsならWIN32APIのスレ
536デフォルトの名無しさん:2008/11/20(木) 13:35:36
WindowsとかLinuxとかそれぞれがそれぞれの流儀を持っている領域。
C言語の標準規格の枠組みでは方法がないということ。
537デフォルトの名無しさん:2008/11/20(木) 13:44:07
そもそもCにはプロセスという概念すらない
538デフォルトの名無しさん:2008/11/20(木) 13:55:27
言語仕様はそうだろ。でも標準関数まで枠を広げたらプロセスの概念はあるだろ。
539デフォルトの名無しさん:2008/11/20(木) 14:39:19
かなり基本的なことかつ、情報量が少ないかもしれませんがよろしくお願いします。
今Cで卒論をやってまして、フィッシャー識別器を作ってます。
ソース等は明かせませんが、2つのクラスのサンプルを読み込み、
再代入法で誤識別率を求めるパターン認識系のプログラムです。

入力パターン数を変動できるようにしていまして、
最小な誤識別率を出すパターンの組み合わせを最良優先探索法で導いています。

入力パターン数が9以下の時は動作自体に問題はないのですが、
10以上になると計算用のdouble型配列tmp[]の中身にNaNが入ってしまうことがあります。

自分の考察としては、Cで利用できる記憶領域の許容量をオーバーしたため、
他に記憶しようとした値がtmpのアドレスに上書きされてしまったのではと考えているのですが、
そのようなことはあり得るんでしょうか。
また、情報が少なくて申し訳ないのですが、あり得ないなら他にどのような理由が考えられるでしょうか・・

よろしくお願いします。
540デフォルトの名無しさん:2008/11/20(木) 14:41:08
十中八九、計算式が間違っているだけだと思う。
541539:2008/11/20(木) 14:43:22
連投すみません、開発環境は以下になります。
WindowsXPSP3
エディタ:C言語を始めよう + コンパイラ:Borland C++

また、友達とペアプログラミングしており、その友達の環境は
WindowsXPSP2
Visual C++
です。

両方ともC++のコンパイラですが、C++は知らないことと、
ソースはCのつもりで書いたため、こちらで質問させていただきました。
よろしくお願いします。
542539:2008/11/20(木) 14:47:26
>>540 さっそくのお返事ありがとうございます。
計算式ですか‥
入力パターン数9の時も10の時も、作業自体は変わらなく、
いうなればループの数が増えているだけなのですが、
9の時はうまく動作しているので問題ないかと考えていました。
もう一度じっくり見直しつつこちらをのぞかせていただきます、
ありがとうございます。
543デフォルトの名無しさん:2008/11/20(木) 14:50:38
計算式があっていても、計算結果によってはNaNがはいることがある。
浮動小数点のフォーマットでは表現しきれない数値など
544539:2008/11/20(木) 14:55:21
>>543 お返事ありがとうございます。
そのようなことがあるのですか、それかもしれません。
そこで扱う値はとても小さく、ほぼ0と言ってもいいようなものなので・・
ありがとうございます、すぐにその方向で進めてみます。
545デフォルトの名無しさん:2008/11/20(木) 15:01:12
業務連絡でスレの私物化は自重!
546デフォルトの名無しさん:2008/11/20(木) 15:23:49
条件式にbit演算が使われている場合の真偽判定について教えてください.

例えば以下のようなソースは,どのように真偽判定が行われるのでしょうか?

char dat=0xaa;
int i;

for(i=0;i<8;i++){
if(dat & 0x80){
;
;
;
  }else{
;
;
;
}

dat<<=1;
}

よろしくお願いします.
547デフォルトの名無しさん:2008/11/20(木) 15:25:37
条件式にbit演算が使われている場合の真偽判定について教えてください.
例えば以下のようなソースは,どのように真偽判定が行われるのでしょうか?

char dat=0xaa;
int i;
for(i=0;i<8;i++){
if(dat & 0x80){
;
  }else{
;
}
dat<<=1;
}
よろしくお願いします.
548デフォルトの名無しさん:2008/11/20(木) 15:28:39
if(dat & 0x80)

if((dat & 0x80) != 0)
549デフォルトの名無しさん:2008/11/20(木) 15:33:11
548さん

見ている雑誌(トランジスタ技術2006年6月号)のソースコードには
if(dat & 0x80)
と書かれていましたが?
550デフォルトの名無しさん:2008/11/20(木) 15:34:47
if((dat & 0x80) != 0)と同じ意味ということ。
Cでは、条件式において0以外ならすべて真として扱われる。
551デフォルトの名無しさん:2008/11/20(木) 15:41:10
>>490
遅くなり申し訳ありません。
パソコンが壊れて動かなくなってしまい、復旧作業をしていました・・・。
"&"は下のtempに関する "=" の時につけていました。
また、t.numとs[i].numはどちらもint型の値なので、片方に"&"をつけると
ポインタと整数の比較というエラーが返されてしまいます。
552デフォルトの名無しさん:2008/11/20(木) 15:42:29
550さん

なるほど!ありがとうございました
553デフォルトの名無しさん:2008/11/20(木) 15:53:47
>>551
&を付けるのはscanfのところでは
554デフォルトの名無しさん:2008/11/20(木) 16:53:11
fgets(buf,10,stdin);
で標準入力に「test」と入力すると、
bufには必ず"test\n"と格納されているのでしょうか?
それとも、Windows環境では"test\r\n"となるのでしょうか?
555デフォルトの名無しさん:2008/11/20(木) 16:56:07
テキストモードでオープンしているなら前者
stdinがテキストモードのままなら\n
556デフォルトの名無しさん:2008/11/20(木) 17:00:16
>>555はWindows環境の話ね
557デフォルトの名無しさん:2008/11/20(木) 17:19:16
内部では必ず\nになるのですか。ありがとうございました。
558デフォルトの名無しさん:2008/11/20(木) 17:21:29
内部?
前者って「必ず」にはかからん、すまん。
\r\n → \n の変換があるのがテキストモード
559デフォルトの名無しさん:2008/11/20(木) 17:37:28
stdinがテキストモードならCRLFがLFに変換されてbufには"test\n"が格納され、
そうでなければそのままbufには"test\r\n"が格納される、
ということでいいのでしょうか?
560デフォルトの名無しさん:2008/11/20(木) 17:53:07
キーボードでリターンキー入れた場合はそうだね。
試しに、_setmode(fileno(stdin), O_BINARY); と比べてみるのもいいかも。
561デフォルトの名無しさん:2008/11/20(木) 20:05:28
EOFも
562デフォルトの名無しさん:2008/11/20(木) 20:55:52
メイン関数の型がvoidだとどうなるのでしょうか?
またint型との違いはなんでちゅか?
563デフォルトの名無しさん:2008/11/20(木) 20:57:01
www
訂正です。
なんでちゅか→なんですか
564デフォルトの名無しさん:2008/11/20(木) 21:14:48
戻り値の型が void なのは規格違反。
プログラム終了後に異常動作が起こっても文句は言えない。
565デフォルトの名無しさん:2008/11/20(木) 21:17:12
いやいや、開始前からおかしなことになっても文句言えないだろ。
566デフォルトの名無しさん:2008/11/20(木) 21:19:50
そもそもコンパイルエラーになっても文句は言えないな。
567デフォルトの名無しさん:2008/11/20(木) 21:20:49
どうしてexit関数があるのかと
568デフォルトの名無しさん:2008/11/20(木) 21:22:55
深い所で終了するため。
569デフォルトの名無しさん:2008/11/20(木) 21:28:19
>>564
規格違反ではないだろ。void main'void)でコンパイラは通るわけだし。
570デフォルトの名無しさん:2008/11/20(木) 21:45:21
>>569
さんざん引用されておりますが、規約違反なのでは?

個人的には規約云々をもちだすまでもなく、スタートアップコードが int の返り値を仮定している以上、void main() と書いてはいけないと
思います。スタックに返り値を載せる言語処理系ならば、呼び出し側と呼び出され側で仮定する返り値の型が異なるとアウトです。
571デフォルトの名無しさん:2008/11/20(木) 21:50:13
>>570
ではなんで、void main(void)がコンパイルエラーにならないんでしょうか?
572デフォルトの名無しさん:2008/11/20(木) 21:51:32
>>571
規格違反でもコンパイル通るし、動く記法なんざ他にもいくらでもあるだろ
Cじゃ 動く= 規格に沿ってる とは限んないんだよ
573デフォルトの名無しさん:2008/11/20(木) 21:58:05
double main(void)
これはコンパイラ通りますか?
574デフォルトの名無しさん:2008/11/20(木) 21:58:05
>>571
gcc だとデフォで警告になるし、コンパイルオプションによってはエラーになる。
575デフォルトの名無しさん:2008/11/20(木) 22:02:18
>>574
そりゃ警告をエラーにするオプションあるんだから後半は無意味だろwwww
576デフォルトの名無しさん:2008/11/20(木) 22:02:46
void main(void)
は古い形式であるということですか?
つまり、昔はOKだったもので、移植性のために保持されたものであるということですか?
577デフォルトの名無しさん:2008/11/20(木) 22:04:49
>>575
-ansi -pedantic-errors でエラーになる。
別に -Werror なんか不要。
578デフォルトの名無しさん:2008/11/20(木) 22:06:56
>>576
そんなものが正式な形式になったことは今までにない。
579デフォルトの名無しさん:2008/11/20(木) 22:07:28
void main(void)と書いてある参考書は窓から投げ捨てろ
580デフォルトの名無しさん:2008/11/20(木) 22:12:52
正確には void main(void) は規格違反ではない。
int main(int, char**) と int main(void) と
それらと等価な定義を必ずサポートしなくてはならないだけであって、
それ以外の定義をコンパイラが独自にサポートしていても良いことになっている(処理系定義)。
もしそのコンパイラが void main(void) を独自にサポートしていると明言しているのであれば、
void main(void) が使えるからといってそのコンパイラが規格を違反しているわけではない。
移植性は無いがな。
581デフォルトの名無しさん:2008/11/20(木) 22:13:30
>>564
なかなか巧みな話術だが未定義という用語が使えないわけか
582デフォルトの名無しさん:2008/11/20(木) 22:14:23
レビューん時に、上司がメインでexitするなら、voidでいいっていうから、今voidのが動いてるんですけどw
何か気になって、いろいろ調べて、ここに質問なげたわけなんだけど。。。
大丈夫かな
583デフォルトの名無しさん:2008/11/20(木) 22:15:04
そのコンパイラで大丈夫なら大丈夫なんじゃね。
移植性は無いがな。
584デフォルトの名無しさん:2008/11/20(木) 22:15:25
>>582
みんな脅してるだけでほんとに、おかしな動作することないから気にするな
585デフォルトの名無しさん:2008/11/20(木) 22:16:00
>>582
そんな細かいこと気にスンナよ。
586デフォルトの名無しさん:2008/11/20(木) 22:16:21
でも、別に無理に exit してまで void にする必要も無いよな・・・
587デフォルトの名無しさん:2008/11/20(木) 22:18:39
次回からしれっとintにしとこう
というか、移植性を考えてexitはstdlibのマクロ使えっても言ってたな
なんか矛盾してきたかこれ
588デフォルトの名無しさん:2008/11/20(木) 22:22:01
mainでのexitとreturnってなんか違うの?
mainの戻り値となる点で同じだと思ってた
589デフォルトの名無しさん:2008/11/20(木) 22:22:05
exit がマクロな処理系があるのか。
590デフォルトの名無しさん:2008/11/20(木) 22:23:02
>>588
意味的には同じ。
591デフォルトの名無しさん:2008/11/20(木) 22:23:21
>>582
常にintと書け
それで問題ない
592デフォルトの名無しさん:2008/11/20(木) 22:25:32
>>589
EXIT_FAILERとかだろ
あ〜スペルがわからんw
593デフォルトの名無しさん:2008/11/20(木) 22:26:37
やっぱり一緒だよね。

その上司的に、EXIT_SUCCESSマクロをつかえという話をしているのであれば、やっぱりvoid mainはダメじゃないだろうか
594デフォルトの名無しさん:2008/11/20(木) 22:27:02
>>592
ああ、戻り値マクロのことか。
EXIT_SUCCESS と EXIT_FAILURE だな。
595デフォルトの名無しさん:2008/11/20(木) 22:27:22
>>580
なるほど、よくわかりました。
596デフォルトの名無しさん:2008/11/20(木) 22:27:28
>>584
たまたま自分の目の届く範囲で問題が起きないからといって
間違いを放置しておくのはよくない
少なくとも、voidと書くことは規格が保障していないと「知っている」のは絶対必要

知っててvoidと宣言するのは個人個人の問題だから好きにすればいい(他人に迷惑をかけない限り
597デフォルトの名無しさん:2008/11/20(木) 22:28:02
重ねて言うが、void main(void) はその処理系で使用可と定義されていれば規格違反ではない。
ただ、移植性を気にするのであれば避けた方が良い。
598デフォルトの名無しさん:2008/11/20(木) 22:30:19
むしろ、どうしてそこまでvoid…と宣言したがる人間がいるのかが気になる
intのほうが文字数少なくすらあるのに
599デフォルトの名無しさん:2008/11/20(木) 22:33:41
return 書くのが面倒なんだろw
C99 なら書かなくても良いが・・・。
600デフォルトの名無しさん:2008/11/20(木) 22:33:43
明日grepしてみるか
void mainとかあるとは思えんが
601デフォルトの名無しさん:2008/11/20(木) 23:08:13
for(){

for(){
if() break;

}


}

このbreakでは中のfor文からぬけて1番外のforはまだ継続されますか?
602デフォルトの名無しさん:2008/11/20(木) 23:10:09
実行環境なくて座学で勉強してるのかぁ。
大変だね。
603デフォルトの名無しさん:2008/11/20(木) 23:10:37
継続されるけど
試せば分かるだろ
604デフォルトの名無しさん:2008/11/20(木) 23:11:41
>>600
初めて書いたhello worldが発掘されるよ
605デフォルトの名無しさん:2008/11/20(木) 23:13:32
>>601
breakは常にループ(またはswitch)を一つだけ抜ける
606デフォルトの名無しさん:2008/11/20(木) 23:40:56
if(no % i == 0)
この行で左辺値が必要とかでエラーが出るのですがなんでですか?
教科書丸写しなんですが・・・
607デフォルトの名無しさん:2008/11/20(木) 23:41:58
== じゃなくて = になってんじゃねーの?
608デフォルトの名無しさん:2008/11/21(金) 00:08:35
if ((no % i) == 0)
これはどう?
609デフォルトの名無しさん:2008/11/21(金) 00:11:09
>>494 RedHatLinux9のCD-ROM8枚組が/cdに納められているようです。
ディレクトリやファイルの内容です。
ap cd.txt doc inst1 inst2 inst3 rpm.txt src1 src2 src3
インストールの仕方がわかりません。
宜しくです。

>>495 こういうときのためにかっておいた方が良いようですね。

>>499 isoファイルが落とせると言うことですが英語がわかりませんでした。
わかりしだい落としてみます。
610デフォルトの名無しさん:2008/11/21(金) 00:11:53
>>609
分かりました、がんばって英語を読んでください
611デフォルトの名無しさん:2008/11/21(金) 00:21:25
void main(void)はISO/IEC9899:1999にはどう書かれているの?
それに極力従おうぜ
環境依存の話は下で

【初心者歓迎】C/C++室 Ver.61【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1226347371/
612デフォルトの名無しさん:2008/11/21(金) 00:29:53
>>611
そもそも void main(void) という記述が現れないが、
規格的には処理系が定義していればおk。
613デフォルトの名無しさん:2008/11/21(金) 00:34:26
5.1.2.2.1 プログラム開始処理
プログラム開始処理において呼び出される関数の名前は main とする。
処理系は、この関数に対して関数原型を宣言しない。
この関数は、次の4種類の方法のいずれかで定義しなければならない。

- 返却値の型 int を持ち仮引数を持たない関数
      int main(void) { /* ... */ }
- 二つの仮引数をもつ関数(仮引数は、これらが宣言された関数に対して局所的であるため、
 どのような名前を使用してもよいが、ここでは argc 及び argv とする。)
      int main(int argc, char * argv[]) { /* ... */ }
- 上に揚げた二つの方法のいずれかと等価な方法(9)
- 上に揚げた三つの方法のいずれでもない処理系定義の方法
----------------------------------------------------------------
(9) したがって、int は、int として定義された型定義名で置き換えることができるし、
  argv の型は、char ** argv と書くこともできる。

最後の処理系定義おkの項目があるから、
処理系が void main(void) を使っていいと定義していれば問題ない。
614デフォルトの名無しさん:2008/11/21(金) 01:45:24
int main
にしとくべき。
void mainが許せないバカよけ対策として。
この手の話でなんレス潰れたか・・・・・
615デフォルトの名無しさん:2008/11/21(金) 01:51:52
元凶は処理系がvoid mainを許しているわけでもないのに
問題が起きないからってvoidは正しいんだと勘違いしてるバカのほうだろ
616デフォルトの名無しさん:2008/11/21(金) 01:52:45
return 0; っていちいち書くのがめんどい。
617デフォルトの名無しさん:2008/11/21(金) 02:01:55
>>615
問題が発生するような処理系では、
コンパイラがチェックをかけて通さなくするんじゃない?
618デフォルトの名無しさん:2008/11/21(金) 02:07:23
Cのソースで、これはすごいって思ったテクニックを教えてください。

619デフォルトの名無しさん:2008/11/21(金) 02:11:44
>>617
標準外で処理系による定義もないってことはそれは未定義
チェックされる保障なんてありません
620デフォルトの名無しさん:2008/11/21(金) 02:13:14
>>619
お前は読解力が足りないな
621デフォルトの名無しさん:2008/11/21(金) 02:15:06
>>612
その「規格的には処理系が定義していればおk」というのは
ISO/IEC 9899:1999のどこに書いてありますか?
622デフォルトの名無しさん:2008/11/21(金) 02:15:39
>>620
お前は人間性が欠けてるな
623デフォルトの名無しさん:2008/11/21(金) 02:17:06
>>622
お前もな
624デフォルトの名無しさん:2008/11/21(金) 02:20:20
問題が発生するとかしないとか、そんな個別の問題を言っても仕方ないんですよ
前置きなくCの話をするときは、それは当然標準Cの話であって、
規格に反しているなら「それは間違いです」としか言いようがないんです
625デフォルトの名無しさん:2008/11/21(金) 02:36:04
規格に反しているなら「それは規格に反しています」としか言いようがない
の間違いでは?
626デフォルトの名無しさん:2008/11/21(金) 02:45:05
C++ JIS X3014:2003より引用
> 処理系は,関数 main をあらかじめ定義しておいてはならない。その返却値の型は,int とする。
> これを除いて,関数 main の型は,処理系定義とする。処理系は,次に示すどちらの形での関数
> main の定義も受理できなければならない。
>      int main(void) { /* ... */ }
>      int main(int argc, char* argv[]) { /* ... */ }

C++ならば、void mainは規格違反。
Cは>>613からvoid mainは規格違反ではない。(JIS X3010:2003)
627デフォルトの名無しさん:2008/11/21(金) 02:55:17
追加
C99(JIS X3010:2003)以前のANSI−Cでは>>613

- 上に揚げた三つの方法のいずれでもない処理系定義の方法

がなかったので、void mainは規格外
628デフォルトの名無しさん:2008/11/21(金) 04:09:28
int main (void){
int a,b;
a = 5,b = 10;
printf("a = %d b = %d \n",a,b);
swap(&a,&b);
printf("a = %d b = %d \n",a,b);
return 0;
}

void swap(int *sa,int *sb){
int *tmp;

*tmp = *sa;
*sa = *sb;
*sb = *tmp;

}

void swap(int *sa,int *sb){
int tmp;

tmp = *sa;
*sa = *sb;
*sb = tmp;

}

swap関数は上下どちらでも結果は同じですが、プログラムとしてどちらの方がいいとかはあるのでしょうか?
629デフォルトの名無しさん:2008/11/21(金) 04:10:23
>>609
何度聞かれても答えは同じなんだが。。。
rpm -ivh /path/to/gcc.rpm
最近はrpmファイルダブルクリックでインストールできたりすんのかな。よくわかんね。
630デフォルトの名無しさん:2008/11/21(金) 04:12:45
>>628
上はだめ。
下がいいとかじゃなく、上はだめ。
631デフォルトの名無しさん:2008/11/21(金) 04:12:45
>>628
上は問題外
絶対にやるな
確保してない領域を使うな
632デフォルトの名無しさん:2008/11/21(金) 04:14:19
ああ、俺もついに結婚する日が。。。
>>631が女なら。
633デフォルトの名無しさん:2008/11/21(金) 07:11:32
>>626
>これを除いて,関数 main の型は,処理系定義とする。
だから、処理系が void main を定義してれば大丈夫だろw
634デフォルトの名無しさん:2008/11/21(金) 08:28:31
このプログラムを簡略化するにはどういった手法がありますか?
struct cell{
int value;
struct cell *next;
};
int main(void){
struct cell *head,*temp,*new;
int x;
new=(struct cell *)malloc(sizeof(struct cell));
head = new;
temp = new;
scanf("%d",&x);
head->value = x;
for(;;){
scanf("%d", &x);
if(x==0)
break;
new=(struct cell *)malloc(sizeof(struct cell));
new->value = x;
temp->next = new;
temp = new;
}
temp->next = NULL;
new = head;
while(new!=NULL){
printf("%2d",new->value);
new = new->next;
}
635デフォルトの名無しさん:2008/11/21(金) 08:31:30
>>634
・高高int一個のデータのためにリスト構造は無駄なので、メモリ戦略を見直す。
# vectorのような倍倍戦略でもいいし、そこは適当に。
・scanf()は基本的に融通が利かず危険だから避ける。
・main()はコマンドライン(コマンドインタプリタ)とのI/F関数だから、作業を詰め込まない。
636デフォルトの名無しさん:2008/11/21(金) 09:12:36
new は C++ の予約語。 将来C++に移植することがあるかもしれないので、Cでも避けておく。
637デフォルトの名無しさん:2008/11/21(金) 11:03:11
>>553
仰る通りで、&の場所を変えたらきちんと動作しました。
ありがとうございました。
638デフォルトの名無しさん:2008/11/21(金) 15:33:50
void MakeBMNextTable(wchar_t *p, int *next)
{
int n, k;

n = (int)wcslen(p);
for(k = 0; k < 65536; k++)
next[k] = n;
for(k = 0; k < n - 1; k++)
next[p[k]] = n - k - 1;
}
639デフォルトの名無しさん:2008/11/21(金) 15:35:12

int BMSearch(wchar_t *buf, wchar_t *str)
{
static int next[65536];
int buf_len = (int)wcslen(buf);
int str_len = (int)wcslen(str);
int i = 0, j = 0;

MakeBMNextTable(str, next);

i = str_len - 1;
while(i < buf_len) {
j = str_len - 1;
while(str[j] == buf[i]) {
if (j == 0) return i;
--i, --j;
}

if (next[i] > str_len - j)
i += next[buf[i]];
else
i += str_len - j;
}
return -1;
}
BM法のアルゴリズムなのですが、BMSearch関数の検索速度を上げるためにはどのような改善をすればいいでしょうか?
640634:2008/11/21(金) 16:18:34
>>635 >>636
アドバイスありがとうございます(__)
とても勉強になりました!!
641デフォルトの名無しさん:2008/11/21(金) 16:30:36
double data[5][20]={0.0}

こう宣言すれば100個の要素はすべて0.0になりますか?
642デフォルトの名無しさん:2008/11/21(金) 16:34:42
なります
643デフォルトの名無しさん:2008/11/21(金) 17:42:52
変数Aと変数Bが10^n (nは任意に決める) 倍以上違うっていう条件式はどう書きますか?
644デフォルトの名無しさん:2008/11/21(金) 17:45:55
fabs(log10(A) - log10(B)) >= n
645デフォルトの名無しさん:2008/11/21(金) 17:54:46
答えてる後に言うのもなんだがC言語の質問じゃないな
646デフォルトの名無しさん:2008/11/21(金) 18:00:19
【△】DELLの新モデル安すぎワロタwC2D・メモリ2G・G45マザーに20インチ液晶付きで52,979円!!!
http://dubai.2ch.net/test/read.cgi/news/1227257466/
647デフォルトの名無しさん:2008/11/21(金) 18:22:30
>>639
マルチ死ね
648デフォルトの名無しさん:2008/11/21(金) 18:28:53
>>647
フヒヒwwwwwwサーセンwwwwwww
649デフォルトの名無しさん:2008/11/21(金) 18:29:09
>>647
アナクロねらーモナー
650デフォルトの名無しさん:2008/11/21(金) 18:32:55
Printf関数が存在する言語は何ですか?
651デフォルトの名無しさん:2008/11/21(金) 18:57:21
>>350
グ グ れ
652デフォルトの名無しさん:2008/11/21(金) 19:41:10
[1] 授業単元:プログラミング2
[2] 問題文(含コード&リンク):以下に示す条件を満たしたFile Aの内容をFile Bへコピーするプログラムを作成せよ.
コマンドライン引数を用いプログラムの実行時に,コピー元とコピー先のファイル名が指定できること.
strcmpを使いコピー元のファイル名とコピー先のファイル名が同じかどうかを判定し,同じ場合には,strcatを使いコピー先のファイル名をファイル名1と変更する処理を書け.
例) 「file」を「file1」とかにする.単にファイル名に1を加えるだけ.

[3] 環境
 [3.1] OS:Linux
 [3.2] gcc
 [3.3] 言語:C
[4] 期限:2008年11月25日まで
653デフォルトの名無しさん:2008/11/21(金) 19:47:18
654デフォルトの名無しさん:2008/11/21(金) 19:50:37
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):名前,年齢,身長,体重,性別(M:男性,F:女性)についてのデータファイルを使って以下のことを行なうプログラムを作成せよ. †
コマンドライン引数を導入し,データファイルと出力ファイル,実行モードを指定せよ.
使い方> ./a.out 入力ファイル名 出力ファイル名 モード
使い方> ./a.out personal_data.txt result.txt 1
実行モードとして,下記三つのモードを用意せよ
1. 男性のデータのみをファイルに書き込む
2. 女性のデータのみをファイルに書き込む
3. 全員のデータをファイルに書き込む
※ 書き込む場合は,名前,身長,体重,年齢の順とする.
データファイルから,全員分のデータを読み込む.ただし,データの終わりを判定して,読み込みを終了すること.
全員分のデータを標準出力に出力する.
データファイル
名前 年齢 身長 体重 性別
A  18 175.8 62.3 M
B 23 154.2 49.5 F
C 28 180.1 75.2 F
D 32 169.5 59.8 M
E 35 158.4 54.3 F
F 40 175.8 80.9 M
[3] 環境
 [3.1] OS:Linux
 [3.2] gcc
 [3.3] 言語:C
[4] 期限:2008年11月24日まで
[5] strtok・atof・fputsは習っていません。
よろしくおねがいします。
655デフォルトの名無しさん:2008/11/21(金) 19:51:23
>>652
何を聞きたいの?
656デフォルトの名無しさん:2008/11/21(金) 19:56:52
>>654
おい糞餓鬼
中学以上は義務じゃねぇんだ、勉強する気が無いならやめろ
習ってないならググれ、書籍買って学べ
657デフォルトの名無しさん:2008/11/21(金) 20:00:33
いや、勉強しないで死んでくれたほうがいい気がする
658デフォルトの名無しさん:2008/11/21(金) 20:27:23
>>654
宿題スレへ行け
659デフォルトの名無しさん:2008/11/21(金) 20:27:43
C/C++の宿題を片付けます 118代目
http://pc11.2ch.net/test/read.cgi/tech/1226847424/
660デフォルトの名無しさん:2008/11/21(金) 20:53:06
二つ質問があります。

1. quarter int 型 (1 byte) という整数型を作るにはどうしたらよいでしょうか。
 short int 型 (2 byte) のさらに半分です。

2. その変数が「int 型だ」などと記憶しているのはどこの領域でしょうか。
 ふと思いついてしまって、不思議で気になってしまってしょうがありません。
661デフォルトの名無しさん:2008/11/21(金) 20:58:29
正直初心者はパソコンの性能考えずに、おもいっきり領域とってプログラムかくべきだと思う。
パソコンがばぐるようなプログラムは初心者レベルではないから。

しかし演習のTAやってて、何のボケだよ的なプログラムみたw
662デフォルトの名無しさん:2008/11/21(金) 21:03:19
一次元配列を二次元配列にいれてくれと注文したら

for(i=0;i<maxA;i++){
for(j=0;j<maxB;j++){
data2[maxA][maxB]=dnum[i];
}
}

とかかいて実行しだしたw
663デフォルトの名無しさん:2008/11/21(金) 21:07:34
>>660
1)charを使え。
2)コンパイラが管理している。プログラムの中に組み込まれているわけではない。
664デフォルトの名無しさん:2008/11/21(金) 21:12:04
>>663
ありがとうございます

2番の質問は、
コンパイルが終了してプログラムを実行させた時、メモリのどの領域でどうやって管理しているのだろう、
のようなことです。
665デフォルトの名無しさん:2008/11/21(金) 21:12:50
>>660
1. 「quarter int」な型は存在しないし、作ることもできない
(Cではそもそもchar以外の整数型のサイズはきっちり決まっているわけではない)
1バイトの整数型が必要ならcharを使うこと

2. そんな領域はない
「型」とは言語とコンパイラがメモリ領域を扱うときの約束ごとであって、
生成された実行ファイルや、その実行時メモリ空間の問題ではない
666デフォルトの名無しさん:2008/11/21(金) 21:17:03
なんのボケだよwww
667デフォルトの名無しさん:2008/11/21(金) 21:18:07
>>660
C99なら stdint.hを読んでください。
int8_tとかね。使うの面倒だけど。

無理矢理char型で代用する手もあるが、必ずしも8bitでないので、お薦めしない。
668デフォルトの名無しさん:2008/11/21(金) 21:18:08
>>664
型というのは、メモリの「大きさ」と「用途」を抽象化したもので、
プログラマが書いてコンパイラが読み取るまでの間しか意味がない。
実際にメモリをどう操作するかという命令はコンパイラが作り出す(コンパイルする)。
669デフォルトの名無しさん:2008/11/21(金) 21:18:28
charだって、1バイトは1バイトだけど、サイズが決まってるわけじゃないしな。
670デフォルトの名無しさん:2008/11/21(金) 22:09:19
charが8bitでない処理系があるというのは、
トリビアとして知ってれば十分。
671デフォルトの名無しさん:2008/11/21(金) 22:11:41
1バイトが1オクテットじゃない処理系なんて今でもある?
672デフォルトの名無しさん:2008/11/21(金) 22:41:37
ファイルのMD5を取得する関数はありませんか?
673デフォルトの名無しさん:2008/11/21(金) 22:42:34
>>672
探せばあるだろうけど、標準関数にはない。
674デフォルトの名無しさん:2008/11/21(金) 22:44:23
>>673
標準じゃなくてもかまわないので教えてください
675デフォルトの名無しさん:2008/11/21(金) 22:45:37
md5のソース見てみな。亜留是。
676デフォルトの名無しさん:2008/11/21(金) 22:46:34
後、Cでも正規表現が使えるようになるライブラリとか無いですか?
677デフォルトの名無しさん:2008/11/21(金) 22:46:44
OpenSSL とか
678デフォルトの名無しさん:2008/11/21(金) 22:51:51
>>676
標準の regex.h
他には PCRE など
679デフォルトの名無しさん:2008/11/21(金) 22:59:01
>>675>>677>>678
アドバイスありがとうございます。
もうちょっと調べてみます。
680デフォルトの名無しさん:2008/11/21(金) 23:05:08
ほそく。md5のソースは、md5を計算する部分が
ライブラリとして分離されている。
681デフォルトの名無しさん:2008/11/21(金) 23:05:42
682デフォルトの名無しさん:2008/11/22(土) 02:13:48
Cプログラムをプリコンパイルした後、コンパイルした際にできる「.obj」ファイルを、ひとかたまりのライブラリファイルにすることは可能でしょうか?
「aaaaa.pc」 →prec→ 「aaaaa.c」 →cl→ 「aaaaa.obj」作成
「bbbbb.pc」 →prec→ 「bbbbb.c」 →cl→ 「bbbbb.obj」作成
「ccccc.pc」 →prec→ 「ccccc.c」 →cl→ 「ccccc.obj」作成
aaaaa.obj,bbbbb.obj,ccccc.obj から libraryファイル作成

もともとUNIX上でコンパイルした「.o」ファイルより「library.a」ファイルを作成し、COBOLプログラム(呼び出し元)のコンパイル時にリンクさせておりました。
それをWINDOWSで行いたいと思っております。
コンパイルはBATファイルを作成(Oracleインストール時にあった、pcmake.batをカスタマイズ)して、「prec」コマンドでプリコンパイルして、VisualStadioのC++をコマンドライン「cl -c(リンクなし)」でコンパイルして、最終的に中間ファイル「.obj」を作成しております。

ご説明が分かりにくくて申し訳ございませんが、具体的な方法・ご指摘がございましたら、宜しくお願い致します。
683デフォルトの名無しさん:2008/11/22(土) 02:18:49
>>682
プロジェクトの新規作成時に「Win32 Static Library」を選択すればlibを作成する為のプロジェクトが出来上がります。
684デフォルトの名無しさん:2008/11/22(土) 04:04:41
超初歩で申し訳ないのだが

プログラミングを学ぶべくvisual Studio C++ 2008をインストールして

C言語は何処を操作すれば作成可能になるの?初歩でスマソ
685デフォルトの名無しさん:2008/11/22(土) 04:08:32
ファイル→新規作成→プロジェクト
プロジェクトの種類:
Win32→Win32コンソールアプリケーション
686デフォルトの名無しさん:2008/11/22(土) 04:10:41
>>684
メニューで「プロジェクトの新規作成」を選択して「コンソールアプリケーション」を選択。
main関数がでてくるから、そこにprintf("Hello world");の行を追加して、「ビルド」。
エラーがなければ「実行」。

じゃないか?VCはちょっとまえのものしか知らないけど、こんなかんじ?

プロジェクトを作らないと話にならないことはたしか。
687デフォルトの名無しさん:2008/11/22(土) 04:26:25
返答どうもありがとう!

>>685の通りにWin32コンソールアプリケーションを実行したら 
.cppの拡張子のファイルができたよ!

おかげで「ビルド」できました>>686もサンクス!
688デフォルトの名無しさん:2008/11/22(土) 04:43:18
たびたびで申し訳ない

確かに「ビルド」はできたのだがエラーが発生してしまった

#include<stdio.h>

int main(void);

int main(void)
{
printf("Hello,world.\n");
  return(0);
}

と入力したのだが原因が入力ミスと思えないのと
.cppファイルを作成したときにstdafx.cppというファイルも同時にできたのだけど
これって何? 長文スマソ
689デフォルトの名無しさん:2008/11/22(土) 04:50:56
VS2003で申し訳ないが、
・コンソールアプリケーションプロジェクトを作る時に、オプションで空のプロジェクトにチェックを入れる
・プロジェクトを右クリック、新規項目の追加でCPPファイルを選択し、ファイル名はhoge.cと拡張子込みで指定する
・プロジェクトを右クリック、プロパティ、C/C++の詳細、コンパイル言語の選択でCコードとしてコンパイルを選択
こんなかんじでどう。
690デフォルトの名無しさん:2008/11/22(土) 04:51:41
あと、エラーの内容を貼らないとわからない。
しいていうなら、mainのプロトタイプ宣言はいらない
691デフォルトの名無しさん:2008/11/22(土) 04:55:47
>>688
Standard Afxというやつですね。できますねえ。おまじないだと思って無視してかまいません。
ビルドは出来ますか?
692デフォルトの名無しさん:2008/11/22(土) 05:01:56
返答レスありがと

最初の項目のオプションで空のプロジェクトにチェックを入れたところ
ソース・ヘッダー・リソースどのファイルにもCPPファイルが作成されていなかったよ
自分でCファイル作って起こしてみたんだがやっぱりビルドは失敗だった。

わざわざ返答してくれたのにすまんね
693デフォルトの名無しさん:2008/11/22(土) 05:09:43
最初から勉強するならstdafxとかじゃまだろうと思って空のプロジェクトにしてもらったわけだけれど。
もう一回聞くけど、エラーの内容が分からないと解決しづらい。
ソースのフォルダにCファイルはできてる?
コンパイルエラーが出る?
694デフォルトの名無しさん:2008/11/22(土) 05:10:13
Win32コンソールアプリケーション(空のプロジェクトはチェック無し)から作成し
// bjk.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
にhellow worldの奴を入力すると
1>------ ビルド開始: プロジェクト: bjk, 構成: Debug Win32 ------
1>コンパイルしています...
1>bjk.cpp
1>c:\program files\microsoft visual studio 9.0\visualcpp2008_samples\bjk\bjk\bjk.cpp(19) : error C2084: 関数 'int wmain(int,_TCHAR *[])' は既に本体を持っています。
1> c:\program files\microsoft visual studio 9.0\visualcpp2008_samples\bjk\bjk\bjk.cpp(7) : 'wmain' の前の定義を確認してください
1>ビルドログは "file://c:\Program Files\Microsoft Visual Studio 9.0\VisualCpp2008_Samples\bjk\bjk\Debug\BuildLog.htm" に保存されました。
1>bjk - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
となった
逆にhellow worldの奴だけだと
1>------ ビルド開始: プロジェクト: bjk, 構成: Debug Win32 ------
1>コンパイルしています...
1>bjk.cpp
1>c:\program files\microsoft visual studio 9.0\visualcpp2008_samples\bjk\bjk\bjk.cpp(10) : fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?
1>ビルドログは "file://c:\Program Files\Microsoft Visual Studio 9.0\VisualCpp2008_Samples\bjk\bjk\Debug\BuildLog.htm" に保存されました。
1>bjk - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========となった
695デフォルトの名無しさん:2008/11/22(土) 05:10:59
ちなみに
  return(0);
とかいてるけど、この空白は書き込むために全角空白にした?
ソースファイルの字下げに全角空白は使えないよ
696デフォルトの名無しさん:2008/11/22(土) 05:14:51
>>693

Win32コンソールアプリケーション
空のプロジェクトに
チェック→あり .cppファイルが作成されない
      なし .cppファイルは作成される
(もちCファイルそのままは作成されない)

空のプロジェクトにチェックなしでも>>694の症状です。はい。
697デフォルトの名無しさん:2008/11/22(土) 05:15:22
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

int main(void)
{
...
}
と書いたということ?

後者はプロジェクトの設定で「プリコンパイル済みヘッダーを使用しない」と設定しないとだめかな。
2008だと使用するがデフォになってるのかな。
698デフォルトの名無しさん:2008/11/22(土) 05:20:18
>>697
>>697に書いてもらった文はデフォです
今から「プリコンパイル済みヘッダーを使用しない」を探してみます。
699デフォルトの名無しさん:2008/11/22(土) 05:22:07
(VS2003参考)プロジェクトのプロパティ→C/C++→プリコンパイル済みヘッダー
700デフォルトの名無しさん:2008/11/22(土) 05:29:45
>>697で言われた通りチェック外してみると
1>------ ビルド開始: プロジェクト: asdsasda, 構成: Debug Win32 ------
1>コンパイルしています...
1>スキップ中... (関連する変更は検出されませんでした)
1>asdsasda.cpp
1>ビルドログは "file://c:\Program Files\Microsoft Visual Studio 9.0\VisualCpp2008_Samples\asdsasda\asdsasda\Debug\BuildLog.htm" に保存されました。
1>asdsasda - エラー 0、警告 0
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

となり成功です!この後コンパイルもして上と同じ文になったのですが
実行ファイルがフォルダの中にみあたりません。
701デフォルトの名無しさん:2008/11/22(土) 05:34:04
>>700
Cで開発するなら拡張子はCにして、「Cコードとしてコンパイルする」にしといた方がいいよ。
実行ファイルはDebugフォルダの中にでもできてるんじゃないかな
702デフォルトの名無しさん:2008/11/22(土) 05:36:05
あー、んで、実行ファイルをダブルクリックしたら一瞬黒いのが出て終わりましたっていう展開になりそうなので、
コマンドプロンプト開いて、そのフォルダに移動して実行するといいです。
ファイル名を指定して実行 cmd と入力
cd "Program Files\Microsoft Visual Studio 9.0\VisualCpp2008_Samples\asdsasda\asdsasda\Debug"
asdsasda.exe
703デフォルトの名無しさん:2008/11/22(土) 05:37:06
cd "c:\Program Files\Microsoft Visual Studio 9.0\VisualCpp2008_Samples\asdsasda\asdsasda\Debug"
か。
704デフォルトの名無しさん:2008/11/22(土) 05:38:09
すいません>>700の修正です
コンパイルして.exeファイルは作成されたのですが
一瞬開いて瞬く間に閉じるような状態なのですがどうして直に閉じてしまうのでしょうか?

又これまで問題にお付き合いいただきありがとうございました!
705デフォルトの名無しさん:2008/11/22(土) 05:39:14
>>702の通りすぎててワロタww
706デフォルトの名無しさん:2008/11/22(土) 05:47:30
ありがちな出来事だからねw
ともあれ、プログラミング言語Cで実行ファイルを作ることに成功した訳だね。
おめでとう!
すばらしいソフトを作れるようになることを願ってるよー
707デフォルトの名無しさん:2008/11/22(土) 05:49:48
>>702の言うとおりにコマンドプロントを開いてみて
C:\Documents and Settings\[myドキュメント名]>cd"略"のcdより前は無視してOkですか?
708デフォルトの名無しさん:2008/11/22(土) 05:52:26
絶対パス指定するなら今どの場所にいようが関係ないから無視していいよ
709デフォルトの名無しさん:2008/11/22(土) 05:56:21
今までお付き合いありがとう!
ただコマンドプロントに上のように入力してみたところ
ファイル名、ディレクトリ名、またはボリューム ラベル構文が間違っています。
と出てきたのだけど、このコマンドプロントは入力後Enter押すとそのファイルが実行される
ものなの?
710デフォルトの名無しさん:2008/11/22(土) 05:57:57
>>703をコピペしてもだめかね。
cd と "〜〜" の間に空白入れてないとかじゃ?
711デフォルトの名無しさん:2008/11/22(土) 05:59:30
そういう意味じゃあ、
"C:\Program Files\Microsoft Visual Studio 9.0\VisualCpp2008_Samples\asdsasda\asdsasda\Debug\asdsasda.exe"
と入力してEnterを押してみるのも悪くないかもしれない。
ダブルクォーテーション("←これね)も必要だよ
712デフォルトの名無しさん:2008/11/22(土) 06:10:09
>>709

int a;
printf("Hello world\n");

printf("Hit ENTER to exit ");
a = getchar(); /*入力待ち*/

return 0;

こうすると、returnする前に入力待ちになるから、
コマンドプロンプトに表示された内容は確認できる。
713デフォルトの名無しさん:2008/11/22(土) 06:13:49
それやるとscanf使ってすぐに終了するようになってしまったのですけど何でですか!
と、なる未来が見える
714デフォルトの名無しさん:2008/11/22(土) 06:16:31
今日はみんな優しいな
715デフォルトの名無しさん:2008/11/22(土) 06:17:28
ただcdと””の間にスペースがなかっただけっだた(スマソ)

そのかわり入力した文が\asdsasda\asdsasda\Debugだと
C:\Documents and Settings\[myドキュメント名]と
入れ替わっただけで実行ファイルは即消えます。
他には
\asdsasda\asdsasda\Debug\asdsasda.exeは指定されたパスが見つかりません。
\asdsasda\Debug\asdsasda.exeはディレクトリが無効でした。になりました。
716デフォルトの名無しさん:2008/11/22(土) 06:19:16
>>712サンクス!

メモって覚えとく
717デフォルトの名無しさん:2008/11/22(土) 06:20:10
"...\asdsasda.exe"まで含める場合はcd要らない
718デフォルトの名無しさん:2008/11/22(土) 06:23:31
C:\Documents and Settings\[myドキュメント名]>
とだけ表示されている黒い画面で
"C:\Program Files\Microsoft Visual Studio 9.0\VisualCpp2008_Samples\asdsasda\asdsasda\Debug\asdsasda.exe"
と入力して、Enterを押すとどうなるの?

Enterを押す直前の画面は、
C:\Documents and Settings\[myドキュメント名]>"C:\Program Files\Microsoft Visual Studio 9.0\VisualCpp2008_Samples\asdsasda\asdsasda\Debug\asdsasda.exe"
こんな感じになるよ
719デフォルトの名無しさん:2008/11/22(土) 06:29:51
そろそろ実行されてもいい頃のように思うが、はたしてw
720デフォルトの名無しさん:2008/11/22(土) 06:30:25
>>718
Hellow,world.

やっ、やったどー!できた!
いやホンッッッットみんなありがと、おかげさまでできました!
みんなの助力のおかげです。
721デフォルトの名無しさん:2008/11/22(土) 06:31:27
そろそろ自分で調べる姿勢を見せた方が懸命な気もするが・・・
そのままenter押すとその場所のファイルを開こうとするだけ

ちなみにcdコマンドはChange Directoryのことで
それ以降に指定したディレクトリ(ファイル)へ移動するコマンド

cd付きで実行ファイルの場所を指定してもそんなディレクトリ無い
と言われるのは当たり前ね
722デフォルトの名無しさん:2008/11/22(土) 06:32:20
>>720
Helloのスペルがちがうけど、まあいいか
723デフォルトの名無しさん:2008/11/22(土) 06:34:36
ごめん訂正ディレクトリ(ファイル)じゃなくて(フォルダ)の間違い
寝ぼけてるな・・・
724デフォルトの名無しさん:2008/11/22(土) 06:35:05
あ、やっぱりできたか。
>>711のレスを見た時はファイル名に指定して実行のとこにかいちゃったのかなあ。
できれば>>702の方法でも実行できるようになってね。

コマンドプロンプトとか最初は意味分からんと思うけど、慣れると楽なものだから。
725デフォルトの名無しさん:2008/11/22(土) 06:36:17
printf("こんにちわ\n");
とか
printf("いやっほー!でてるー!?\n");
とかそういう風に変えるだけでも楽しい時代の幕開けだなw
726デフォルトの名無しさん:2008/11/22(土) 06:36:34
>>721サンクス、なるほどね自分が何打ち込んで何していたかわかったよ。
一通り完了したんでしばらくは自力でがんばってみます。

>>722 あまりの嬉しさに草生やしてしまったんだよ(←言い逃れ)
727デフォルトの名無しさん:2008/11/22(土) 06:42:26
たまに優しくなるなこのスレ
728デフォルトの名無しさん:2008/11/22(土) 13:16:07
bccからvc++に乗り換えたときビルド方法とか設定がよくわからなかった時を思い出した
まあいまでもビルド方法はともかく細かい設定はわかってないけど・・・
729デフォルトの名無しさん:2008/11/22(土) 13:22:33
ポインタのポインタがわからん。まいったぜ。
730デフォルトの名無しさん:2008/11/22(土) 13:35:06
□→□→□
↑  ↑  ↑int
|  |int*
|int**
731デフォルトの名無しさん:2008/11/22(土) 13:48:19
それはポインタが良く分っていないってことだな。
732デフォルトの名無しさん:2008/11/22(土) 13:48:41
二次元配列の動的確保を一回やってみるとなんとなくわかるよ
733デフォルトの名無しさん:2008/11/22(土) 14:30:45
fopenで一太郎やワードファイルをread出来ないのですが、どうすればよいのでしょうか。
734デフォルトの名無しさん:2008/11/22(土) 14:38:18
ソース貼ってみて
735デフォルトの名無しさん:2008/11/22(土) 14:40:50
void main()
{
fopen("test.doc", "r")+
}
736デフォルトの名無しさん:2008/11/22(土) 14:42:48
fopenで一太郎やワードファイルをread出来ると
ソフトが売れなくなるので
ジャストシステムやマイクロソフトがC標準化委員会に圧力をかけたのさ。
今この世に存在する全てのC言語は
一太郎やワードファイルをreadできないようになっていて
そうしようとした奴の個人情報をインターネットを使って通報するようになってる。
それが損害賠償を請求する裁判を起こすための証拠になるのさ。
未だに信じられないようだけど、全部作り話です。
737デフォルトの名無しさん:2008/11/22(土) 14:43:41
void main()
{
char s[1000];
FILE *fp;
fp = fopen("test.doc", "r");
fscanf(fp, "%s", s);
puts(s);
}

すいません途中送信しました
としてるのですが読めませんどうしたらいいですか
738デフォルトの名無しさん:2008/11/22(土) 14:53:17
>>737
それだとプレーンテキストて言って、単純に文字コードが並んでるようなファイルしか読めないよ。
739デフォルトの名無しさん:2008/11/22(土) 15:11:09
>>736 ワロタw
740デフォルトの名無しさん:2008/11/22(土) 15:40:37


strにabc_defみたいな文字列が入っています。

sscanf(str,"%s_%s",name,name2);

で_で区切りで読みたかったんですが、すべてnameのほうに入ってしまいます・・・
741デフォルトの名無しさん:2008/11/22(土) 15:44:05
sscanf(s, "%[^_]_%s", s2, s3);
742デフォルトの名無しさん:2008/11/22(土) 15:45:42
それはどういういみですか?
743デフォルトの名無しさん:2008/11/22(土) 15:52:17
調べろよ
744デフォルトの名無しさん:2008/11/22(土) 15:55:10
>>740
マニュアルひけ、マニュアル。以下は man sscanf より:
> %s ホワイトスペースではない文字で構成された文字列に対応する。《略》
> 文字列の入力は、ホワイトスペースが入力されるか、最大フィールド幅に達
> するか、のどちらかが起こると停止される。

%[...]なら使えるかもしれん。(が、処理系依存かも)
745デフォルトの名無しさん:2008/11/22(土) 15:58:16
セパレータってやつだったんですね。わかりました。

_が何個かわからない場合どうすればいいでしょうか?

abcd_efg_hij

abcd_efg_hij_k_l

みたいな場合も全部読めるようにしたいです
746デフォルトの名無しさん:2008/11/22(土) 17:01:40
>>738 別にfopenでなくてもいいのです。
全てのtextファイル中から特定の文字を検索するツールを作りたいのですが、
他の関数や方法があれば教えて下さい。
747デフォルトの名無しさん:2008/11/22(土) 17:10:00
まずtextファイルって何なのか知らんが
一太郎やWordを作ってる人らがそれらのフォーマットを公開しない限り、
それらを独自に読み込むのは基本的には無理
748デフォルトの名無しさん:2008/11/22(土) 17:11:10
>>737
>>736の最初の方はある意味真実。
利用者を囲い込むため、他社のソフトでは読めないようになっている。
そのあおりで、自分の文書でさえその会社のソフトで無ければ読めない。
RMSが怒ったってのもうなづける。
749デフォルトの名無しさん:2008/11/22(土) 17:22:00
一太郎やWordで作ったファイルとノートパッドで作ったファイルと
全て同じだと思ってるわけじゃないよな・・・?
750デフォルトの名無しさん:2008/11/22(土) 17:36:06
>>745
fgetcで1文字ずつ読みながら処理していくか、fgetsで1行読み込んでから、読み込んだデータをスキャンするのが一番カタい。
sscanf等は、仕様の範囲の処理をやらせるには楽だが、それを超えたことをさせようとすると、とたんに役に立たなくなる。(上のようなケースはまだ工夫次第でなんとかなりそうだが)
751:2008/11/22(土) 17:42:02
はじめまして。

コマンドラインでcdを使うときは「cd program files」
で思った通りに移動できますが、
しかし、octaveというソフトのコマンドラインで同様の操作をすると
スペースが悪さをするようでうまくいきません。

どうすればいいのでしょうか?
(C言語とは関係なくてすみません)
752デフォルトの名無しさん:2008/11/22(土) 17:42:22
>>746
自分で作ろうとしなくても、既にGoogleデスクトップがあるじゃないか。
753:2008/11/22(土) 17:44:45
すみません。自己解決しました。”で囲めばいいのですね。
754:2008/11/22(土) 17:51:22
もう1つ、質問させてください。

コマンドラインでコンパイルをしたいのでclとlinkの
パスを通しておきたいのですが、
vsvars32.batを実行してもそのウインドウだけでしか有効にならないし、
ウインドウを閉じると効果が消えます。
どうすれば全体的&永続的にパスを通すことができますか?
755デフォルトの名無しさん:2008/11/22(土) 17:57:35
>>745
%[...] や %n を使えば、一応こういうこともできる

char buf[] = "acd_efg_hij_kl";
char name[16];
int len = 0;
char *p = buf;

while (sscanf(p, "%[^_]%n", name, &len) != EOF) {
puts(name);
p += len;
if (*p == '_')
p++;
}
756:2008/11/22(土) 18:23:53
自己解決(?)しました。

batファイルを開いて、@setの部分を全部手動で設定すると、
思った通りになりました。
しかし、もっと上手い方法があるはず。。。
757デフォルトの名無しさん:2008/11/22(土) 18:41:18
>>752 グーグルは知っていました。
ただ、勉強も兼ねて自作したかっただけです。
正直出来ないってことに驚きました。
業界絡みで出来ない事ってあるのですね。
情報提供頂いた皆さんどうもありがとうございました。
758デフォルトの名無しさん:2008/11/22(土) 18:47:07
おまえは何を信じてるんだ?
759デフォルトの名無しさん:2008/11/22(土) 19:15:54
>>757
釣りだよな? 釣りだと言ってくれ。
760デフォルトの名無しさん:2008/11/22(土) 19:22:04
>>757
wordのファイルフォーマットは公開されてるから、できないことはないけど、素人には無理。
761デフォルトの名無しさん:2008/11/22(土) 19:25:21
>>757
誰もできないとは言っていないはずだ。面倒だったり難しかったりするだけ。

1つにはオートメーションなど既存ライブラリを利用する手がある。
Wordも一太郎も、人の手による操作だけでなく、
プログラムからの操作も受け付けており、それを使うことをオートメーションと言う。
特にdocは世界的に需要があるので、それ以外に第三者によるライブラリの存在も期待できる。

もう1つは 、もちろん自分で読み取るプログラムを書くこと。
ただのテキストではないが、依然としてただのファイルである。
話の上では、構造さえ分かればバイナリモードで開いて欲するデータを取り出せる。
さっき言った第三者のライブラリと同じことをするわけだ。
もちろん、まずはファイルの構造を調べるとこから始めなければならないが、
すべて一から調べなくても参考になる先駆者の情報を見掛けることはあるだろう。
ちなみに、司法省が五月蠅かったか、最近MSはdocxでないほうのdocの仕様も公開していたはずだ。
一太郎は知らないが。
762デフォルトの名無しさん:2008/11/22(土) 19:26:30
>>757
できないわけじゃない。
ただ、自作する場合はちょっと手間がかかるだけだ。
具体的には、Excelのファイル読む場合C++で2万行くらい。
763デフォルトの名無しさん:2008/11/22(土) 19:43:03
mallocってどういうときに使うべきなの?
いまいちよくわからん。
764デフォルトの名無しさん:2008/11/22(土) 19:43:58
>>763
そう思うならあなたには必要ないのでしょう
765デフォルトの名無しさん:2008/11/22(土) 19:51:45
>>748
いや>>736>>733がプレーンテキストのファイルとバイナリファイルとの区別が付いてないと睨んで
こまごまとしたことを説明するのが面倒だから
企業の陰謀をでっちあげて出来ないということを納得させるつもりで書いた

どの道初心者が簡単に出来ることじゃないし
ちょっとやそっとで出来るか出来ないかだけ分かれば大抵の場合はそれで十分なんだから
その手の御伽噺で煙に巻いておけばいい
すぐにCに飽きてJavaだの.NETだのへでも転向するさ
766デフォルトの名無しさん:2008/11/22(土) 20:10:11
そもそも、ワードやワープロソフトは、文字のみのテキストファイルではなく、
レイアウト、その他ページ設定などの情報が含まれているしね・・・
767デフォルトの名無しさん:2008/11/22(土) 20:13:08
Microsoft Word の仕様書さえあればWordファイルの読み書きはできる。
ただ、その仕様書がA4で200枚近くあるのが難点だ。
768デフォルトの名無しさん:2008/11/22(土) 20:19:10
読めるか読めないかだけが質問者にとって重要なのさ
そして質問者の脳みそで理解できるほど簡単な方法を教えてくれることを期待している
読めないという回答は全く期待していない

そこでスケープゴートが必要になる
悪い報告をする相手を憎むのは防ぎようがないがそれを和らげるためにも
でなければ質問者の憎悪は100%回答者へ向かうだろう
たとえ回答が100%正しくても
769デフォルトの名無しさん:2008/11/22(土) 20:19:36
一太郎3までのフォーマットなら、
本文のプレインテキストが先頭に来て、
その後ろにそれと同じ長さの属性リストがくるから、
テキストだけを抜き出すのは容易だよ。
難点は、いまどきそんな古いソフトが使えるかどうかだが。
770デフォルトの名無しさん:2008/11/22(土) 20:23:41
正直に書いたせいで恨まれてもいいじゃない。
そのための匿名だ。
771デフォルトの名無しさん:2008/11/22(土) 20:27:02
でもそれで純真なガキ^H^H若者が傷ついたりしたら、寝起きが悪いじゃないか。
772デフォルトの名無しさん:2008/11/22(土) 20:53:02
>>762
OLE通してアクセスする方が万倍ましだな。
773デフォルトの名無しさん:2008/11/22(土) 21:15:29
テキスト抽出する部分は xdoc2txt に任せるってのもありなんじゃね?
774デフォルトの名無しさん:2008/11/22(土) 21:22:49
openofficeからパクればいいじゃない
775デフォルトの名無しさん:2008/11/22(土) 21:53:52
>>737 には、まず、普通のテキストを検索できるツールを作れるようになってから、
また挑戦しようってアドバイスしてあげるのが正しいと思う。
776前スレ899です。:2008/11/22(土) 21:54:00
以前にC言語を勉強すると言った者です。
参考書を買って勉強を始めたのですが最初でまったくわからなくなりました。
そこで教えてもらいたいです。
参考書に載っている通りに書いてみます。
一応BorlandC++Compiler5.5というコンパイラを参考書の付属CDからインストールしました。

■ソースファイルの保存先
ソースプログラムを入力したらソースファイルとして保存します。保存するフォルダはどこでも構いませんが、本書では、C:\tmcsフォルダに保存したものと仮定して進めさせていただきます。

まずここでわかりません。
フォルダ名に\や:など使用出来ませんよね?ここでは「仮定して」と書いてあるので別に問題なしですか?

■ソースファイルを保存したフォルダに移動する
ソースファイルを保存したフォルダに移動します。コマンドプロンプトで、フォルダを移動するには、「cd」コマンドを使います。本書では、C:\tmcsにsample.cを保存したので、「cd C:\tmcs」とコマンドを打ち込みます。

ここでのsample.cとはソースプログラム(サンプル)です。
この一文が全く理解出来ません。そもそもコマンドプロンプトの使い方がわかりません。参考書を何回も読んだのですが?マークしか頭に浮かびません。
C:\Documents and settings\name>cd フォルダ名であってますか?
参考書と同じく「C:\tmcs」のフォルダにソースファイルsample.cを保存したかったのですが、
「ca」というフォルダに保存したので、C:\Documents and settings\name>cd caとやってみたのですが失敗しました。

長文でわかりづらいかも知れませんがよろしくお願いいたします。
777デフォルトの名無しさん:2008/11/22(土) 21:55:28
まずはPCの基礎について勉強しましょう
778デフォルトの名無しさん:2008/11/22(土) 21:56:15
マイドキュメント以外の適当なフォルダを開いてみ。
アドレスバーに C:\ から始まる名前が表示されるから。
779デフォルトの名無しさん:2008/11/22(土) 21:59:43
>>776
とりあえず全部ルートディレクトリに置くようにすれば?

ファイルを保存するときは、たとえばソースが test.c なら、\test.c と頭に\をつけるようにして、
cdで移動するときは、どこにいても、cd \ で一発で移動できるから。

780前スレ899です。:2008/11/22(土) 22:14:49
>>777
すいません。
>>778
よくわかりません。すいません。
PCの基礎から覚えないでC言語は無理なのでしょうか?
>>779
ルートディレクトリ?
781デフォルトの名無しさん:2008/11/22(土) 22:16:00
>>780
諦めてください
782デフォルトの名無しさん:2008/11/22(土) 22:16:35
基礎どころか、仕組みまで理解しないとC言語は無理です。
783デフォルトの名無しさん:2008/11/22(土) 22:16:56
>>780
プログラミング以前の問題。
まずはパソコンの勉強からはじめよう。
784デフォルトの名無しさん:2008/11/22(土) 22:19:38
>>780
ディレクトリって、フォルダのこと。
同じものと考えておけばいいよ。

フォルダ(ディレクトリ)って、階層構造になってるってのはわかるよな?

「ルートディレクトリ」は階層構造になってるフォルダの一番上のところって意味。
785デフォルトの名無しさん:2008/11/22(土) 22:20:27
PCにはハードディスクが付いてるだろ?

それが、マイコンピューターを開いたときにある
大抵はローカルディスク(C:)とか
Cドライブ、Dドライブってと書かれてる奴のことだ

そのCドライブを開くと色々とフォルダやファイルがあるだろ?
その場所を C:\ と書くわけだ

さらにその場所から例えばProgram Filesと言うフォルダを開くと
今の場所はC:\Program Files\となる訳だ

つまりC:\tmcsとはCドライブを開いた直下にtmcsと言うフォルダを
作れと言ってる
786前スレ899です。:2008/11/22(土) 22:21:27
>>781 >>782 >>783
すいません。ではパソコンの仕組みについて載ってるおすすめの本とかありませんか?
amazonとかにありますかね?
787デフォルトの名無しさん:2008/11/22(土) 22:22:21
DOSコマンドから覚えた時代はもう遠い昔なんだな
そんな面倒なことしなくても簡単にコンピュータが使えるような時代になったってことなんだけど
788デフォルトの名無しさん:2008/11/22(土) 22:24:38
>>786
http://www.amazon.co.jp/dp/4891005769/

こういう画面写真とかいっぱい載ってて、とりあえずそのとおり操作すれば動くって
本を買って、やればいいんじゃね?

細かいことはおいおいわかってくるよ。

俺も昔、環境変数とか知らないで、コンパイラを買って、コンパイルできる
環境を構築する段階で挫折して、何万も無駄にしたって経験ある。
789前スレ899です。:2008/11/22(土) 22:35:42
>>784 >>785
ありがとうございます。出来ました。
>>788
ありがとうございます。参考にしてみます。
790デフォルトの名無しさん:2008/11/22(土) 22:50:23
>>780
> >>779
> ルートディレクトリ?
本当の初心者は、こういったキモの単語は質問しない。
ググりゃ一発だしな。
ネタ認定です。
791デフォルトの名無しさん:2008/11/22(土) 22:53:10
>>790
疑心暗鬼すぎワロタwwwwwww
792デフォルトの名無しさん:2008/11/22(土) 22:54:29
ぶっちゃけプログラムしてたら勝手にOSとかの知識も付いてくるからOSの勉強を先にまとめてやる必要はないよ
793デフォルトの名無しさん:2008/11/22(土) 22:59:29
いや、これはそんな生易しいレベルじゃないよ
794Cの達人:2008/11/22(土) 23:01:22
こんばんは、私、Cの達人といふ者です。
困ったら私を呼んでください。
いつ現れるかは、気分次第です。
では、失礼します。

                     by Cの達人
795ストラウストラップ:2008/11/22(土) 23:59:26
こんばんは、私、C++の達人といふ者です。
困ったら私を呼んでください。
いつ現れるかは、気分次第です。
では、失礼します。

                     by C++の達人
796デフォルトの名無しさん:2008/11/23(日) 00:16:49
こんばんは、私、C#の達人といふ者です。
困ったら私を呼んでください。
いつ現れるかは、気分次第です。
では、失礼します。

                     by C#の達人
797デフォルトの名無しさん:2008/11/23(日) 00:21:50
>>795-796
スレ違い
798デフォルトの名無しさん:2008/11/23(日) 00:36:53
スレってなんですか?
                     by Cの日下部
799デフォルトの名無しさん:2008/11/23(日) 00:40:47
スレはマルチスレッドのことだからスレ違い
800デフォルトの名無しさん:2008/11/23(日) 01:18:19
こんばんは、私、COBOLの達人といふ者です。
困ったら私を呼んでください。
いつ現れるかは、気分次第です。
では、失礼します。

                     by コボちゃん
801デフォルトの名無しさん:2008/11/23(日) 01:24:12
C言語でカレンダープログラムを作成しています。
年月を与えて、その年月のカレンダーを表示させるプログラムです。
悩んでいるのは、そのプログラムを拡張して、年だけ与えたとき、
その年の12か月分のカレンダーを表示させるというものです。
月の入力があるかないかを判定すればできると思ったんですが、
どうプログラムすればいいかがわかりません。
助言願います。
802デフォルトの名無しさん:2008/11/23(日) 01:26:24
今はどのようにしてユーザからの入力を得ているのさ
803801:2008/11/23(日) 01:31:13
printf("年:");
scanf("%d",&year);
printf("月:");
scanf("%d",%month);
という感じにしています。
804801:2008/11/23(日) 01:32:18
すいません、4行目が%ではなく&です。
805デフォルトの名無しさん:2008/11/23(日) 01:34:17
>>801
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8080.c
まぁなんだ、とりあえず参考までに。月に0を入力すると、その年の1年分を、
1月から順に12月まで。
806デフォルトの名無しさん:2008/11/23(日) 01:37:29
やりようは色々あるけど

printf("月を入力しますか?Y/N");
scanf("%c",&month_f);
if(month_f == 'Y'){
//月指定の処理
}else{
//12ヶ月分の処理
}
とか
月に特殊な値(13とか0とか)を指定するとか
あるいはargvでオプション指定させるとか
807801:2008/11/23(日) 01:50:22
ありがとうございました。
助かりました。
808デフォルトの名無しさん:2008/11/23(日) 02:03:17
あ〜、なんか変な指定してた。1853って、グレゴリオ暦は1582年10月15日金曜日から
始まり、現代に至るが、日本はそれまでの暦を1872年12月3日まで使用し、
その年月日を1873年1月1日として使い始めた歴史があるんだが・・・
その辺を考慮するなら、

if(y<1853)

の部分を適当に変えておいて。すまそ。
809デフォルトの名無しさん:2008/11/23(日) 10:25:25
米国基準なら1752年9月
810デフォルトの名無しさん:2008/11/23(日) 13:06:55
cal コマンドみたいに、
入力が1個なら年が、入力が2個なら月と年が入力されたと思えばいいのよ。
811デフォルトの名無しさん:2008/11/23(日) 13:08:10
>>808
1872 までは太陰暦を表示するってか?
閏月を実装する必要があるぜ。
812デフォルトの名無しさん:2008/11/23(日) 13:35:01
グレゴリオ暦の前はユリウス暦。太陽暦だよ
813デフォルトの名無しさん:2008/11/23(日) 13:35:42
って日本の話か
814デフォルトの名無しさん:2008/11/23(日) 13:42:17
↑キーを押すとボールが上昇し、画面の途中で止まるようにする命令を作れと言われたのですがどうしたらよいでしょうか
for文っぽい気もしますし、「もし↑キーが〜」という文脈からif文っぽい気もするので、どちらを使えばいいのか迷っています
815デフォルトの名無しさん:2008/11/23(日) 13:43:19
すいません。正確には画面の途中でいったん止まって、今度は重力に引かれるように下に落ちていくようにするプログラムを作れと言われました
816デフォルトの名無しさん:2008/11/23(日) 13:43:46
両方だ!
817デフォルトの名無しさん:2008/11/23(日) 13:45:09
両方使えばいいじゃん
818デフォルトの名無しさん:2008/11/23(日) 13:46:38
どっちを使えばいいか分かれば作れそうな口ぶりだけど、それが分かっても作るの無理だろ。
819デフォルトの名無しさん:2008/11/23(日) 15:53:59
if( ( ( (unsigned int&)z & ~( (unsigned int&)x | (unsigned int&)y ) ) & 0x80000000 ) != 0 )

↑これを普通の大なり小なりみたいな条件式に直せないでしょうか?
何をやってるのか良くわからないのですがコメントは下のようになっておりました。

Take the bitwise AND of z and the complement of the inclusive OR of x and y,
then bitwise AND the result with 0x80000000 and return it. A bitwise result
of zero equals false, while any other value equals true.
820デフォルトの名無しさん:2008/11/23(日) 15:59:20
x,y,zが全てint型でなおかつ32bitであると仮定すると
if ( z < 0 && (x>=0|y>=0) )

821デフォルトの名無しさん:2008/11/23(日) 16:00:27
別のスレではfloatって言ってたな
822デフォルトの名無しさん:2008/11/23(日) 16:03:11
>>820
すいません、書き忘れました。
xyzは全部floatです。

32bitかどうかっていうのはちょっとわからないのですが・・・
823デフォルトの名無しさん:2008/11/23(日) 16:06:38
C++だからスレ違い
824820:2008/11/23(日) 16:07:04
>>822
IEEE的なfloatと仮定するけど
floatでもNANとか考えないなら820の解釈でおk
825デフォルトの名無しさん:2008/11/23(日) 16:15:26
>>824
~を考慮してる?

z が負数、かつ、x が負数でない、かつ、y が負数でない場合
では?
826820:2008/11/23(日) 16:27:04
>>825
わ、|と&間違えてたthx
考慮はしてたけど間違えてたら意味ないなぁorz
827デフォルトの名無しさん:2008/11/23(日) 16:36:21
>>819
お前もうここで聞いて答え貰っているだろ。マルチすんな。
http://pc11.2ch.net/test/read.cgi/tech/1225648701/714
828デフォルトの名無しさん:2008/11/23(日) 16:44:28
それ間違いだし
829デフォルトの名無しさん:2008/11/23(日) 17:06:26
>>826

if ( z < 0 && (x>=0 && y>=0) )

こういうことですか?
830デフォルトの名無しさん:2008/11/23(日) 17:20:11
>>827
人がどこにアクセスしてるかなんて
いちいち追跡してんじゃねーよストーカー野郎
831デフォルトの名無しさん:2008/11/23(日) 17:22:54
>>830
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
832デフォルトの名無しさん:2008/11/23(日) 18:44:38
>>809
>>811
意味不明。
833デフォルトの名無しさん:2008/11/23(日) 18:46:57
ツェラーの公式がグレゴリオ暦に対応している式だから、
考慮するならその辺は自分で指定しろってことだろ。
834デフォルトの名無しさん:2008/11/23(日) 18:53:38
まともに「西暦」を扱いたいんなら
calコマンドと同じ結果になるかチェックすればいい。
あれは色んな事を全部考慮に入れてある。
835デフォルトの名無しさん:2008/11/23(日) 19:04:09
ファイルの入出力まで勉強を進めてきました。

while(!feof(fp)){
ch = fgetc(fp);
putchar(ch);
}

↑の場合、feof()というのはファイルの終端でも0を返して、終端を越えてる時に0以外を返すから
「abc」というファイルをcまで読み込んだ時、

1.putchar()で画面にcが表示される
2.whileの継続条件で、ファイルポインタは終端だからfeof(fp)が0を返す
3.ch = fgetc(fp)が実行される
4.putchar(ch)で画面にわけわからないのが表示される
5.whileの継続条件で、feof(fp)が0以外を返してwhileループを抜ける

という流れになるんですか?
836デフォルトの名無しさん:2008/11/23(日) 19:13:15
>>835
なんで2.から3.になるんだ。
feofの前の!を見落としてる?
837デフォルトの名無しさん:2008/11/23(日) 19:16:52
>>835
それでいいよ。
838デフォルトの名無しさん:2008/11/23(日) 19:17:39
>>819
そもそもビット演算する意味って何ですか?
速度?
839デフォルトの名無しさん:2008/11/23(日) 19:20:16
速度以外に考えられない
840835:2008/11/23(日) 19:28:54
>>836
2.でまだfeof(fp)が0を返す為にまだwhileから抜けずに4.の
わけわからないのが1つ余計に表示されちゃうのかなと思ったんです。
841デフォルトの名無しさん:2008/11/23(日) 19:30:19
状況によるけど、FP演算をするとそのプロセスのコンテキストスイッチの
ときに、FPレジスタも保存しなければならなくなって、
コンテキストスイッチが遅くなる、というデメリットを生じることがある
842デフォルトの名無しさん:2008/11/23(日) 19:58:29
>>839
そうですか・・・

if ( z < 0 && (x>=0 && y>=0) )

それで↑で正しいんでしょうか
どうもうまく動かないんです
843デフォルトの名無しさん:2008/11/23(日) 20:13:12
素直に z < 0 && ! (x > 0 || y > 0) としたらどうよ
844デフォルトの名無しさん:2008/11/23(日) 20:13:53
間違えた。z < 0 && ! (x < 0 || y < 0) だ。
845デフォルトの名無しさん:2008/11/23(日) 20:32:16
>>842
NaNとか-0あたりで想定外の挙動してんじゃね?
(この二つが入ってると違う結果になる)

正直、全体の流れを読まんとそれ以上はわからん。
あと、俺は浮動小数点の規格には精通してないから
他にも例外的な理由でうまく動かんのかもね
846デフォルトの名無しさん:2008/11/23(日) 21:33:31
>>845
ありがとう。
なんか違うところが原因な気がしてきたorz
ひとまず別なところの原因究明します。
本当にありがとう。
847デフォルトの名無しさん:2008/11/23(日) 21:36:57
以下のように記述しておりますが,コンパイル時にエラーが出ます.
エラーは下に載せます.

ファイル:main.cc
#include<stdio.h>
#include"sub.h"
int main(){
   int tmp = get_int(10);
   fprintf(stderr, "tmp:%d\n", tmp);
   return(0);
}

ファイル:sub.h
#include<stdio.h>
extern int get_int(int num);

ファイル:sub.cc
#include<stdio.h>
int get_int(int num){
   return(num);
}

エラー:
underined reference to `get_int(int)`

このとき,main.ccの #include "sub.h" を #include "sub.cc" に変更すると
コンパイルでき,実行も出来ます.どこが可笑しいのでしょうか?
よろしくお願いします.
848847:2008/11/23(日) 21:38:32
申し訳ありません, sub.h の中身を間違えていました.

#ifndef __SUB_H__
#define __SUB_H__
extern int get_int(int num);
#endif

です.よろしくお願いします.
849デフォルトの名無しさん:2008/11/23(日) 21:42:54
リンクに失敗しているのかな
$ g++ main.cc sub.cc
とやってもダメ?
850847:2008/11/23(日) 21:52:57
>>849
初歩的なミスでした・・・
$ g++ main.cc

としか書いていませんでした.
お手を煩わせてしまい申し訳ありません.
ありがとうございました.
851デフォルトの名無しさん:2008/11/23(日) 22:49:02
便乗質問。
普通のプロトタイプ宣言とexternつけた宣言に、何か違いがありますか?
852デフォルトの名無しさん:2008/11/23(日) 22:50:24
ないです
デフォルトでexternなので書かない人が多い
853デフォルトの名無しさん:2008/11/23(日) 22:52:21
>>852
よく見るプロトタイプ宣言はexternが省略された形と考えればよいのですね。
ありがとうございました。
854デフォルトの名無しさん:2008/11/23(日) 22:57:08
extern宣言からプロトタイプ宣言に発展。
855デフォルトの名無しさん:2008/11/24(月) 00:46:53
質問です。
キーボードから入力した文字列を逆順に表示するプログラムを作成してみたのですが
cygwinで実行すると如何しても文字化けしてしまいます。どこがいったい駄目なのでしょうか?
ご教授ください。
#include <stdio.h>
void str_reverse(char src[]);
int main ( void )
{
char src[128];

printf("文字列を入力して下さい >>> ");
gets(src);
str_reverse(src);
return 0;

}
856デフォルトの名無しさん:2008/11/24(月) 00:47:49

void str_reverse(char src[])
{
int i, j, n;
char dst[128];

for(i=0; src[i]!='\0';i++)
;
n=i-1;
for(j=0;n>=0;j++,n--)
{
dst[j]=src[n];
}
printf("%s",dst);
dst[j]='\0';
}

857デフォルトの名無しさん:2008/11/24(月) 00:55:20
>>856
printf()を関数の最後にもってこないと、まずいんじゃないの?
858デフォルトの名無しさん:2008/11/24(月) 01:02:57
>>855
入力してるのは日本語? Cygwinだとcp932(≒Shift_JIS)で入力されるが、
cp932の日本語文字は「2バイト」文字だ。2バイトの1バイト目と2バイト目
が入れ替わったら、そりゃ化けるだろう。
対策はいくつかあるが、ぶっちゃけ初心者向けとは言えない。
UNIX系OSならwchar系APIに逃げる手もあるが……。
859デフォルトの名無しさん:2008/11/24(月) 01:10:46
>>858
無知で申し訳ないのですが、具体的な例でいえばどこを
どのように修正すればよろしのでしょうか?
860デフォルトの名無しさん:2008/11/24(月) 01:11:56
>>858
ちなみに入力しているのはアルファベッドです
861デフォルトの名無しさん:2008/11/24(月) 01:11:59
全角入力してなかったら、文字化けは考えなくていいよ。
862デフォルトの名無しさん:2008/11/24(月) 01:14:14
>>861
文字列を入力して下さい >>> asdfg
gfdsa0aXl
このような感じなんですがこれでも大丈夫なんでしょうか?
ちなみに
文字列を入力して下さい >>> asd
dsaといったように3文字以内ならなんともないのですが・・・
863デフォルトの名無しさん:2008/11/24(月) 01:14:32
君は、値をとりかえたいんだろう?
しかしそのコードは値を代入してるだけだ
864デフォルトの名無しさん:2008/11/24(月) 01:15:01
答えありきで質問してる?
865デフォルトの名無しさん:2008/11/24(月) 01:17:01
>>857
で答え出てる気がするんだが
866デフォルトの名無しさん:2008/11/24(月) 09:29:48
単にdstを初期化すればいいんじゃないの?
char dst[128]; → char dst[128] = {0};
867デフォルトの名無しさん:2008/11/24(月) 09:31:07
ああ、printf と dst[j]=0 が逆なのか
868デフォルトの名無しさん:2008/11/24(月) 12:13:22
>>854
ん?static な関数でもプロトタイプ宣言は有効ですよ。static/extern とプロトタイプは関係ないのでは?
869デフォルトの名無しさん:2008/11/24(月) 12:20:40
関数のプロトタイプ宣言 と 定義
変数の宣言 と 定義
static/extern によるスコープ制御
870デフォルトの名無しさん:2008/11/24(月) 15:59:26
>>868
プロトタイプがいかにして生まれたかを述べてるんだろ
871854:2008/11/24(月) 17:51:35
>>870
んだんだ。

>>868
温故知新ですよ
872デフォルトの名無しさん:2008/11/24(月) 17:53:08
C++から輸入しただけ。
C++でどのような経緯があったかは知らん。
873デフォルトの名無しさん:2008/11/24(月) 18:17:50
長いですがお願いします。

構造体を使って、行列の要素を入力して足し算するプログラムです。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8096.txt
ここのmain関数内の
struct Matrix ma1, ma2, ma3;

struct Matrix *ma1, *ma2, *ma3;
にして作り直しなさい、という課題なんですが
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8097.txt
のようにしたのですがうまくいきません。
(変更点は setMatrix addMatrix の引数の数を変更と、リターンでアドレスを返すことと、ma1,2,3の&を消した)

このようにmalloc絡みのリターンでポインタを返すのは
そもそもタブーなのでしょうか?
874デフォルトの名無しさん:2008/11/24(月) 18:26:36
>>873
関数 setMatrix で mat 自体に領域の確保が必要ですよ
875873:2008/11/24(月) 18:31:29
>>874
mat=(struct Matrix*)malloc(sizeof(struct Matrix));

ってことですね。
お早い回答ありがとうございます。
無事出来ました。
876868:2008/11/24(月) 20:41:19
>>871
ん、御意。
877デフォルトの名無しさん:2008/11/25(火) 00:18:11
あげ
878デフォルトの名無しさん:2008/11/25(火) 15:11:50
doubleについてなんですが数値の範囲が
仮数部2^52、指数部2^11って書いてあったり
1.7E-308〜1.7E+308って書いてあったりするんですがどういうことですか?
879デフォルトの名無しさん:2008/11/25(火) 15:16:38
>>878
使ってるコンパイラの float.h を見れ
DBL_MIN 〜 DBL_MAX が正のとりえる範囲で
DBL_MANT_DIG が仮数部のビット数
880デフォルトの名無しさん:2008/11/25(火) 15:36:09
>>879
ありがとうございます
881デフォルトの名無しさん:2008/11/25(火) 16:14:20
>>878
数値は2進数で表現されるので、指数部が 2^11 = 2048 ってことは
2^2048 ≒ 3.2×10^616 程度の値を表現できるってことだ
ただし負の指数も表現したければ取れる範囲は -1024〜+1024 になるので (実際には少し違うけど説明が面倒いので)、
2^1024 ≒ 1.7×10^308 程度の値が最大値ということになる
882デフォルトの名無しさん:2008/11/25(火) 17:35:48
関数ポインタ エディタ
883デフォルトの名無しさん:2008/11/25(火) 18:59:46
関数ポインタを使う事のデメリットを教えてください。
884デフォルトの名無しさん:2008/11/25(火) 19:03:18
いいかげんな実装してるとわけわかめになる?
885デフォルトの名無しさん:2008/11/25(火) 19:08:20
>>884
関数ポインタを使う上でいい加減な実装にならないようにするためには、
どのようなコーディング(どんな事に注意)をすればよいですか?
886デフォルトの名無しさん:2008/11/25(火) 19:16:01
なんにでも当てはまるけど、仕様(動作)をよく理解することかな。
仕様の読み間違いしてるとあらぬ方向にいく可能性が高い。
887デフォルトの名無しさん:2008/11/25(火) 19:21:00
>>886
はぁ・・そうですか
888デフォルトの名無しさん:2008/11/25(火) 19:23:55
>>887
   *      *
  *     +  うそです
     n ∧_∧ n
 + (ヨ(* ´∀`)E)
      Y     Y    *
889デフォルトの名無しさん:2008/11/25(火) 19:31:49
なんだうそか
890デフォルトの名無しさん:2008/11/25(火) 20:28:14
ゆっくりしていってね
891デフォルトの名無しさん:2008/11/25(火) 21:17:10
NOOBです。
入力を最大8桁にするにはどうすればいいんですかね?
MAXCHAR 8 使用したいけどまったくわからん・・・
#include <stdio.h>

main(void)
{
int a[3];
int i;

for(i = 0; i < 3; i++) {
scanf("%d", &a[i]);
}

printf("%d\n", a[0] + a[1] + a[2] );

return 0;
}
892デフォルトの名無しさん:2008/11/25(火) 21:25:24
>>891
標準入力から入力させてると、桁数の制限は無理。

行単位で読み込んで、8桁以上だったらエラーにしてもう一回入力させるとかじゃだめなの?
893デフォルトの名無しさん:2008/11/25(火) 21:28:44
>>892むしろエラー表示させて終了させたい

かわいい俺に優しく教えてくれ
894デフォルトの名無しさん:2008/11/25(火) 21:37:15
>>893
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
  char str[100];
  int n;

  fgets(str, sizeof(str), stdin);
  if (strlen(str) > 8) {
    puts("桁数多いよ");
    return 1;
  }

  n = atoi(str);  
  printf("%d\n", n);
  return 0;
}

数字以外が入力されたときのエラーチェックとかないけど。
895894:2008/11/25(火) 21:39:35
>>894
改行も入ってくるから、それにも対応しないといけないか。
896デフォルトの名無しさん:2008/11/25(火) 21:48:43
>>894,<<895 thx
atoi関数は初めて見たかな

でもgetchar関数を使用したいとわがまま言ってみる
897デフォルトの名無しさん:2008/11/25(火) 21:55:06
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void getline(char* s, int size)
{
  int i;
  for (i = 0; i < size; i++) {
    s[i] = getchar();
    if (s[i] == '\n') {
      s[i] = '\0';
      return;
    }
  }
}

main()
{
  char str[100];
  int n;

  getline(s, sizeof(str));
  if (strlen(str) > 8) {
    puts("桁数多いよ");
    return 1;
  }

  n = atoi(str);  
  printf("%d\n", n);
  return 0;
}
898デフォルトの名無しさん:2008/11/25(火) 21:56:00
数値以外が入力されたらエラーになる処理は、自分で挑戦してみそ。
899デフォルトの名無しさん:2008/11/25(火) 21:57:45
>>897thx
ゆっくり解読してみる
900デフォルトの名無しさん:2008/11/25(火) 21:57:54
p = strchr(str, '¥n');
if (p) *p = '¥0';
n = strtol(str, &end, 10);
if (!(*str && !*end) || end - str > 8) {
errx(1, "error¥n");
}
901897:2008/11/25(火) 21:57:57
getline()は、サイズより長い行を入力されたら最後に0がつかないな。
まあいいか。
これも自分でやってくれ。
902デフォルトの名無しさん:2008/11/25(火) 22:03:20
<<901 やってみるお
903デフォルトの名無しさん:2008/11/25(火) 22:25:23
error LNK2019: 未解決の外部シンボル _runge が関数 _main で参照され
ました。
fatal error LNK1120: 外部参照 1 が未解決です。
この意味ってどういう意味?
904デフォルトの名無しさん:2008/11/25(火) 22:25:29
fabs(tmp);と

if(tmp < 0) tmp = tmp*-1;


ってどっちが早い?
905デフォルトの名無しさん:2008/11/25(火) 22:29:23
>>903
runge って関数がどこにもない。
906デフォルトの名無しさん:2008/11/25(火) 22:29:57
>>904
計測しないとわからない。
907デフォルトの名無しさん:2008/11/25(火) 22:35:55
>>905
サンクス!

908デフォルトの名無しさん:2008/11/25(火) 22:44:02
>>904
何で tmp = -tmp って書かないの? まぁコンパイルされたらどっちも一緒のような気はするけど。
909デフォルトの名無しさん:2008/11/25(火) 22:47:52
>>908
それだと動作がちがうんじゃね?
910909:2008/11/25(火) 22:48:41
ああ、ifの下か。
911デフォルトの名無しさん:2008/11/25(火) 22:53:18
>>904
浮動小数点型だと大概前者の方が早い
912908:2008/11/25(火) 22:58:11
>>910
スマソ、言葉が足りんかった。
913デフォルトの名無しさん:2008/11/25(火) 23:05:47
標準ライブラリにちょうど良い関数あるなら、それを使うのが原則
大抵はアルゴリズムの専門家が組んだ高速なものだし、
処理系によってはライブラリ関数を認識してインライン展開とか
自前実装には難しいことをやってくれたりもするそうな
914デフォルトの名無しさん:2008/11/25(火) 23:09:08
条件を書くときなんですが
(i++<a)が比べてから足す
(++i<a)が足してから比べる
で合ってますか?
915デフォルトの名無しさん:2008/11/26(水) 00:22:55
設計をキチンとしないとまともなソフトウェアを作れない事に今更気付いた
……面倒だな
916デフォルトの名無しさん:2008/11/26(水) 00:40:56
>>914
前者が足す前の値で比べる、後者が足した後の値で比べる
917デフォルトの名無しさん:2008/11/26(水) 01:19:27
C言語のプログラムを走らせて

wrong value
Segmentation fault

とだけエラーが出て終了します。
wrong value は勿論自分で書いた標準出力もしくは標準エラーではありません.
このようなエラーが出る原因は分かりますでしょうか?
ある関数の中でメモリ領域を確保しているのですが、
その確保の時点で以上のエラーが出ているようです。

このエラーは初めての遭遇で、対処できません。
またググっても良い検索結果が得られませんでした。
よろしくお願いします。
918デフォルトの名無しさん:2008/11/26(水) 01:24:26
メモリ領域確保のパラメタが間違っていて、かつ、
エラーを無視して 0番地をアクセスしてるんだろう

エスパースレじゃないんだから、ソースか関数名ぐらい書け
919デフォルトの名無しさん:2008/11/26(水) 01:24:42
>>917
malloc関数のサイズの引数が間違っているんじゃないか?−>wrong value
mallocが失敗しているのに、戻り値をチェックしないで0番地書き込み−>Segmentation fault
920デフォルトの名無しさん:2008/11/26(水) 01:33:32
どこかでバッファオーバーランでもしてんじゃ?
921デフォルトの名無しさん:2008/11/26(水) 01:35:00
   ●民主党が知らない間に韓国支援を始めるぞ!●

民主党はIMF経由でなく直接に日本は特定国へ金融支援する法案を出そうとしている。
これはどう見ても「韓国への金融支援」以外何者でもないぞ!



10年前の金を返さず温仇にして反日する韓国を支援する必要なし!
韓国に媚びる民主党を許すな!

【政治】「IMFだけでなく、特定国に個別支援せよ」 民主党金融チームが金融危機対応の追加策を発表★3
http://mamono.2ch.net/test/read.cgi/newsplus/1227626168/
【売国】 民主党の韓国金融支援に反対 【媚韓】
http://schiphol.2ch.net/test/read.cgi/offmatrix/1227628557/
922デフォルトの名無しさん:2008/11/26(水) 01:38:31
>>914
>>916に補足すると、比べるのと実際に足されるのがどっちが先かはわからない
あくまで比べる値が足されてるか足されてないかだけ
923917:2008/11/26(水) 01:52:50
>>918
申し訳ありません。
ソースは膨大なので貼りませんでした。

>>919-920
mallocが失敗していて0番地に書き込んでいる点は確認できました。
しかし、読み込んでいる関数は多所で使用しており、
関数を複数回読んだ時点でエラーが出るのです。
エラーを出す箇所(関数を読む回数)は同じで、再現性があります。

924917:2008/11/26(水) 01:55:36
連続投稿失礼します。

mallocに渡す引数は『他所で使用している』
場合と同様の渡し方をしています。
単純に正整数を与えるだけです。

メモリの解放も忘れずに行っているのですが・・・
よろしくお願いします。
925デフォルトの名無しさん:2008/11/26(水) 01:58:11
うるせえ黙ってソース貼れ
926デフォルトの名無しさん:2008/11/26(水) 01:59:07
×貼れ
○うpれ
927917:2008/11/26(水) 02:01:58
>>925-926
申し訳ありません。
ソースの開示は出来ません。
スレ汚し失礼しました。
928 :2008/11/26(水) 02:02:30
#include <stdio.h>
main()
{
printf("Hello World!!\n");
}


CのHello Worldってこれでいいの?
929デフォルトの名無しさん:2008/11/26(水) 02:03:17
使ってるうちにメモリのフラグメンテーションが発生して新たなメモリ確保に失敗することもあるよ
930デフォルトの名無しさん:2008/11/26(水) 02:24:46
>>928
いいよ
931デフォルトの名無しさん:2008/11/26(水) 02:28:52
windowsでncursesを使いたいのですが、Cygwinを使わないと無理でしょうか?
932デフォルトの名無しさん:2008/11/26(水) 02:41:42
>>927
再現する最小範囲を作れないあなたが悪い。
ポインタ宣言および実引数の値の流れが明白となっている部分、加えてmallocを呼び出す部分、
これだけのソースで問題を解決する手がかりが得られるかもしれませんが、それを見せることすら嫌うのでしょうか?

のはさておき、『他所で使用している』時と同じ値が変数に格納されていますか?
933デフォルトの名無しさん:2008/11/26(水) 02:42:44
まぁデバッガの使い方覚えるといいと思うよ
934デフォルトの名無しさん:2008/11/26(水) 02:45:19
>>931
http://pdcurses.sourceforge.net/
これとかどう?
Nintendo DSとかかいてるけど誰が使うんだろう。自作アプリを動かすHACKとかあるのかな?
935931:2008/11/26(水) 02:59:37
>>934
せっかくお答えいただいたのですが、
PDCursesではなく、ncursesを使いたいんです。
936デフォルトの名無しさん:2008/11/26(水) 03:18:21
なんでncursesにこだわるの?
937デフォルトの名無しさん:2008/11/26(水) 03:24:16
>>928
だめ。引数がないなら int main(void) ついでに return 0; といった感じで
int型の値を何か返すのが標準スタイル。
938928:2008/11/26(水) 03:41:54
>>930,937
レスありがとうございます。
両方をコンパイルしてみました。
どちらも警告など出ず無事に実行ファイルが出来ました。
で、ファイルサイズを見てみたのですが、同じサイズです。
Hello Worldくらいじゃサイズは変わらないのですかね?
標準スタイルということで、>>937さんが指摘された
ほうを覚えておくことにしました。
939デフォルトの名無しさん:2008/11/26(水) 03:43:06
>>938
コンパイラが勝手にこっそり>>937としてコンパイルしてるからだと思うよ
940デフォルトの名無しさん:2008/11/26(水) 03:48:44
>>937
ん? main() と返り値を省略すれば int がかえることにならないのでしょうか?
int main(void) には異論もあるようですよ。
941デフォルトの名無しさん:2008/11/26(水) 03:50:48
>>940
なるわけないじゃん、馬鹿なの?死ぬの?
942デフォルトの名無しさん:2008/11/26(水) 03:53:25
戻り値を省略なんて許されない
943デフォルトの名無しさん:2008/11/26(水) 03:54:07
またこの展開かよ
944デフォルトの名無しさん:2008/11/26(水) 03:55:40
intを返す関数と仮定します

という警告をなんどかみた
945デフォルトの名無しさん:2008/11/26(水) 03:55:52
厳密にどうとかどうでもいいからとりあえず書いとけ、な!
そうするだけで何も問題は起きないから
これで良いだろ
946デフォルトの名無しさん:2008/11/26(水) 04:17:57
もうやめてぇえええええええええええええええええええええええ
947デフォルトの名無しさん:2008/11/26(水) 04:29:48
もちつけ、コンパイラが都合よく解釈してくれている部分は、確かにある。
まぁ、標準スタイルというのは、あくまでもISO、ANSIという標準化機構で、
世界的に工業製品やらその他、標準的な規格を決めている団体だから
とりあえず従っておけば、どのコンパイラでも無難に通るだろうということだ。
独自の環境では、別にvoid mainだろうと、知ったこっちゃない。
また、ISO、ANSI準拠では、プログラムの開始、主体となる関数が
mainであるという前提もあるが、独自の環境では必ずしもmainが
開始とは限らない。くどいが、とりあえず世界的な標準スタイルということで。

ただし、C++だと int main() と、引数が無い場合は省略しているんだなw
948デフォルトの名無しさん:2008/11/26(水) 06:28:47
>>947
どこぞで相談したところ、C99 では関数を定義するところで引数を func() とした場合、
これは引数がない場合と同じ、すなわち C++ と同じということでした。それ以前はよくわかりません。

>>941 >>942
ほー、それはそれは。
こちらへどうぞ。http://pc11.2ch.net/test/read.cgi/tech/1201153965/
949デフォルトの名無しさん:2008/11/26(水) 06:33:05
>>945
それでいいと思いますが、
>>928
がいいか悪いかを判断するのであれば、根拠が必要となります。
950デフォルトの名無しさん:2008/11/26(水) 06:39:27
for(j=0;j<8;j++){
PORTA = port[j];
PORTB = abc[(i+j)%32];
皆はこの3行を文章で説明しろと言われたらどう説明しますか?
951デフォルトの名無しさん:2008/11/26(水) 06:54:53
>>950
それだけじゃ説明できません。
PORTA ってなんですか?
PORTB ってなんですか?
952デフォルトの名無しさん:2008/11/26(水) 08:00:00
>>928
省略するなら #include モナー
953デフォルトの名無しさん:2008/11/26(水) 08:18:38
>>952
それはダメw printf()があるし
954デフォルトの名無しさん:2008/11/26(水) 08:34:40
>>953
やってみれ
955デフォルトの名無しさん:2008/11/26(水) 08:47:28
>>954
いや、警告を出して通すものもあるが、理屈としては成り立たんぞ・・・w
956デフォルトの名無しさん:2008/11/26(水) 08:56:45
>>955
おまえ C++ と勘違いしてる
957デフォルトの名無しさん:2008/11/26(水) 08:58:50
>>956
???意味不明。printfについて調べてこいw
958デフォルトの名無しさん:2008/11/26(水) 09:02:15
っつか、コンパイラが都合よく解釈してくれるものは良いが、
そういうのを抜きで、ある標準ライブラリを用いる際に、
必要なヘッダを取り込まなくて通るものだろうか?
我々特派員は、その真相を探るべく・・・
959デフォルトの名無しさん:2008/11/26(水) 09:12:08
C言語なら関数プロトタイプがなくてもなんとかしてくれる(もちろん間違う場合はあるw)
C++なら関数プロトタイプは必須
960デフォルトの名無しさん:2008/11/26(水) 09:23:40
>>957
これは printf に限った話ではない

> 警告を出して通すものもあるが

通さない C 処理系を1つでも知っているか?
また通すなと規格にあるか?

あくまで C でだぞ、C++ ではなく
961デフォルトの名無しさん:2008/11/26(水) 10:05:51
includeさぼったらまずハマるのはmath.hだな
962デフォルトの名無しさん:2008/11/26(水) 10:08:52
グローバル変数は無理だな
963デフォルトの名無しさん:2008/11/26(水) 10:56:53
>>928
> CのHello World
964デフォルトの名無しさん:2008/11/26(水) 11:09:56
死のHello World
965デフォルトの名無しさん:2008/11/26(水) 11:25:31
__declspec(dllimport) int puts(const char *);
main(){puts("Hello, world!\n");}
966デフォルトの名無しさん:2008/11/26(水) 11:34:11
スレチかもしれませんがここで質問させてください。

C言語やって半年くらいです。
ポインタや構造体なのど基本事項は「明解C言語 入門編」や学校などで
ほぼ完璧に網羅しました。

あとはいろいろ演習問題など解いて実戦経験をえたいんですが
何か役に立つ問題集的な本ってありますか?

最終的に
ttp://www.i.u-tokyo.ac.jp/edu/course/ci/pdf/2008_2_ci_practice_all.pdf
のような問題を解けるようになりたいです。
967デフォルトの名無しさん:2008/11/26(水) 11:35:33
死ね
968デフォルトの名無しさん:2008/11/26(水) 12:43:25
>>959
だからさ、それはコンパイラが都合よく工面してくれているからでしょ?
そういうのは不適切だって。
969デフォルトの名無しさん:2008/11/26(水) 12:46:02
都合よくって、言語仕様なんだが。
970デフォルトの名無しさん:2008/11/26(水) 12:47:00
>>966
ここにはCに詳しい住人は多いかもしれないが、
入試に詳しい住人は少ないと思う
何にせよ問題傾向を見るべきでしょ?という程度の一般的な回答しかできないだろう
971デフォルトの名無しさん:2008/11/26(水) 12:50:04
戻り値省略したらintになるとかプロトタイプなくても動くとか知らない人は結構多い
972デフォルトの名無しさん:2008/11/26(水) 13:15:57
プロトタイプ無しの関数呼び出しは
戻り int 仮定で 引数は呼び出し元の型をその型のまま積むんだっけ?
浮動小数点数は常に double へ格上げ?

float a;
double b;
func(a,b); /* func(float,double) として呼ぶ? */

ま、include するなりして、プロトタイプ宣言を確実に行えば、こういうこと気にする必要はないw
973デフォルトの名無しさん:2008/11/26(水) 14:58:01
>>972
省略時はdoubleに格上げ
974デフォルトの名無しさん:2008/11/26(水) 15:06:07
リテラル定数 1.0f は格上げかかってたのは記憶してたけど
変数値も格上げでしたか…

って printf とかの可変引数部と同じルールだわな
975デフォルトの名無しさん:2008/11/26(水) 19:50:29
>>966
プログラミングといっても、数値計算からシミュレーション、OS/デバイスドライバ/言語からアプリケーションまで、と非常に幅広い内容を含みます。
まずは、何を題材にプログラミングしたいかを考えて、興味を持てる分野でプログラミングを実践していくのがいいかと思います。
実際に課題にむかってとにかく書くことによって、プログラムの記述能力自体も高まるはずです。
もし、なにがしたいかわからないのであれば、こちらはいかが?http://pc11.2ch.net/test/read.cgi/tech/1226847424/
976デフォルトの名無しさん:2008/11/26(水) 20:17:26
>>957
Lattice-Cで、Dモデルにするとアウト。
977デフォルトの名無しさん:2008/11/26(水) 20:23:17
>>974
>って printf とかの可変引数部と同じルールだわな
そりゃそうだ。つーか、昔はプロトタイプが無かったんだから当然だね。
978デフォルトの名無しさん:2008/11/26(水) 20:33:45
ドライバーのinfファイルが右クリックしてもインストールと出ず、
このままではダウンロードのしようがないのでプログラムとして動作させたいのですが可能でしょうか?
979デフォルトの名無しさん:2008/11/26(水) 20:33:52
でも規格では (...) と ( ) は別物扱いなんだよな。
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 118代目
  http://pc11.2ch.net/test/read.cgi/tech/1226847424/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 39
  http://pc11.2ch.net/test/read.cgi/tech/1226693085/
過去スレ
  http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
981デフォルトの名無しさん:2008/11/26(水) 21:07:18
この質問はあくまで初心者のふとした疑問なので気軽にこたえてあげてください

昔はプロトタイプ宣言無かったってことは、返り値がintじゃない関数は呼び出し元より
前に書いておかなきゃいけなかったんですか?

相互に呼び出すときどうしてたんですか?

なんだか殺伐としているので断りをいれてみました
982デフォルトの名無しさん:2008/11/26(水) 21:15:04
>>981
プロトタイプ宣言は昔からありましたよ。
ただ、使用している箇所より前に、プロトタイプ宣言もしくは関数の定義がない場合は
戻り値がintの関数としてみなされるということ。
983デフォルトの名無しさん:2008/11/26(水) 21:19:10
配列から要素を消してなくなった分は詰める
みたいなことはどうやったらできますか?
984デフォルトの名無しさん:2008/11/26(水) 21:20:35
memmove
985デフォルトの名無しさん:2008/11/26(水) 21:23:02
関数原型と関数宣言を混同している悪寒
986デフォルトの名無しさん:2008/11/26(水) 21:24:07
>>981
引数の型はノーケアーなプロトタイプ宣言 (結局戻りの型のみ宣言) という時代を経由して
引数の型も宣言するプロトタイプ宣言が出てきた
987デフォルトの名無しさん:2008/11/26(水) 21:40:56
>>982>>986
ありがとうございます
引数の話とプロトタイプ宣言全文の話をごちゃごちゃに混ぜて勘違いしていたみたいです
988931:2008/11/26(水) 22:09:19
>>936
UNIXやLinuxへ移植する際に、PDCursesよりncursesの方が便利そうなので。
989デフォルトの名無しさん:2008/11/26(水) 22:14:43 BE:113605643-PLT(31170)
次スレ立てました
C言語なら俺に聞け(入門篇) Part 40
http://pc11.2ch.net/test/read.cgi/tech/1227705211/
990デフォルトの名無しさん:2008/11/27(木) 00:00:51
>>981
K&R1 の頃は、

double sub1();
double sub2();
main() {
sub1(0);
sub2(0);
}
sub1()
int a;
{
}
sub2()
int a;
{
}
という感じでした。
991デフォルトの名無しさん:2008/11/27(木) 00:05:35
>>990
流石にそれは大嘘過ぎ。

double
sub1(a)
{
}
だろ。
992デフォルトの名無しさん:2008/11/27(木) 05:04:13
>>988
具体的にどの関数で移植につまづいたの
993デフォルトの名無しさん:2008/11/27(木) 07:08:14
>>991
そうだった、すっかり忘れてしまいました。訂正。
double sub1();
double sub2();
main() {
sub1(0);
sub2(0);
}
sub1(a)
int a;
{
}
sub2(a)
int a;
{
}
994indent test:2008/11/27(木) 08:46:26
double sub1();$
double sub2();$
main()$
{$
sub1(0);$
sub2(0);$
}$
sub1(a)$
int a;$
{$
}$
sub2(a)$
int a;$
{$
}$
995デフォルトの名無しさん:2008/11/27(木) 09:29:01
foo(a)
int a;
{
}

ってなんか気持ち悪い
foo(int a)にしろよ
996デフォルトの名無しさん:2008/11/27(木) 09:45:36
>>995
何が気持ち悪いのかはっきりせんようならどっちもどっちだろ
997デフォルトの名無しさん:2008/11/27(木) 10:46:12
$ってなんか気持ち悪い
998デフォルトの名無しさん:2008/11/27(木) 10:54:35
998 !!!!!!!!!!!!!!!!!!!!!!!1
999デフォルトの名無しさん:2008/11/27(木) 10:55:20
次スレあったのか

C言語なら俺に聞け(入門篇) Part 40
http://pc11.2ch.net/test/read.cgi/tech/1227705211/
1000デフォルトの名無しさん:2008/11/27(木) 10:55:44
何か気持ち (・∀・)イイ!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。