トップページ⇒tech
1001コメント263KB

C言語なら、俺に聞け! <32>

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001SHOW-A孫NGNG
漏れ10才。3才のときから父SHOW-A息子にプログラムを叩き込まれてきたんだ。
いろいろな言語を極めたけど、一番漏れになじんだのはCかな。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。

便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃないよ。
課題丸投げなら別スレにいってね。あと、至急父に仕事を与えてやってください。

コンパイラ、過去ログなどのリンクは>>2-5 あたり
0809デフォルトの名無しさんNGNG
same?commonってことか?
俺も威張れやせんが、厨房英語も程々にしとけ
0810デフォルトの名無しさんNGNG
鮫
0811デフォルトの名無しさんNGNG
顧問
0812デフォルトの名無しさんNGNG
鮫亀
0813 NGNG
>>808
WinMainの方がよくない?
つーかmain関数を使っているなら,分割していないってこと?
DOS?
0814デフォルトの名無しさんNGNG
>>813
UNIX系OSは考慮外ですか…(涙
0815デフォルトの名無しさんNGNG
>>813
( ´,_ゝ`) プッ
0816813NGNG
どういう反応が返ってくるか楽しみにしていたが,満足だ
0817デフォルトの名無しさんNGNG
C言語=Windows

( ´,_ゝ`) プッ
0818名無しさん@EmacsNGNG
>>814
>>815
厨学生はそっとしておいてあげなよ。
0819デフォルトの名無しさんNGNG
>>816
やっやめろ、はらわたがよじれる〜。
0820813NGNG
もっと罵声を浴びせて
0821デフォルトの名無しさんNGNG
>>813
まあゆっくりしてけ
0822デフォルトの名無しさんNGNG
>>813
まあゆっくり氏んでいけ
0823デフォルトの名無しさんNGNG
つまんないよ
0824デフォルトの名無しさんNGNG
東工大のスパコンコンテストで優勝した高校生ってやっぱすげーのか?
0825デフォルトの名無しさんNGNG
画像がでなくて困ってます。やりたいことは数字を濃度(明暗)にして
写真のように出力することです。
 いまCodeWarrior7をMacで使っていて、簡単な例プログラムを試しに
動かそうとしたら、"graph.h"が見つかりません と出てしまいます。
Cの問題というよりCodeWarriorの問題のような気もするんですが全く分からず
困っています。誰か分かる方教えて下さい。おながいします。
0826デフォルトの名無しさんNGNG
>>825
グラフィック用の関数、全部置き換えて、
#include <graph.h>
を外せ。
0827デフォルトの名無しさんNGNG
>>825
そもそも、その例プログラムは Mac用なのか?
0828825NGNG
点を濃淡付きで打つことだけができれば、その後はなんとかなるはずなので
とりあえず例プログラムはこんな感じです。
#include <stdio.h>
#include <graph.h>

void main ()
{
_setvideomode(_98RESCOLOR);

_setcolor(6);
_setpixel(100,100);

getchar();
_clearscreen(_GCLEARGRAPH);
_setvideomode(_DEFAULTMODE);

}
 
グラフィック用の関数を全部置き換えるというのはどのようにすれば
いいんでしょうか?何に置き換えればいいのかがわからないんですが・・・

Mac用でないとだめなんですか?CodeWarrior上でつくってCodeWarrior上で
動かしているんですが。
0829デフォルトの名無しさんNGNG
>>828
それはPC98用のTurboCのコードなんじゃないの?
0830825NGNG
ええっと、これはQuick Cのプログラムと書いてあります。
本屋で調べたとき、graph.hが普通にでてきていたので、Cの標準的な
ものかなー?と思ってしまったわけです。
CodeWarriorに似たようなgraphとかつくようなものをハードディスクから
探したんですが、それらしいものが見当たらなくて分かりません。
CD-ROM上のマニュアルにも見つからない状態です。
0831デフォルトの名無しさんNGNG
グラフィック関数というのは標準ではなくプラットフォームに依存します。
Macのサンプルを探してください、私は林檎はサパーリ
0832デフォルトの名無しさんNGNG
>>830
ディレクトリを扱うための関数すらないくらいだし。
汎用言語だからしかたないか。
0833デフォルトの名無しさんNGNG
>>830
いまどきQuickCの本が売ってあるのか…
ちょっとビクーリ。
Mac&CodeWarrior用の本を見つけて、それ買ってくださいです。
0834825NGNG
いま売っている本ではないです。手元にあるのは1989年の「C言語グラフィック入門」
という本です。
昨日、八重洲ブックセンターに行ってMacとCodeWarriorの本を探したんですが
1冊出てきたものでも、欲しい内容がありませんでした。
0835デフォルトの名無しさんNGNG
>>834
そろそろスレ違いだから他スレに行ってね。
なければ立てればいい。
0836デフォルトの名無しさんNGNG
>>830
そもそも、Mac(OS9まで)では標準入出力という概念すらない世界なの
で(CodeWarriorにはそれをエミュレートするライブラリがあるけど)、
DOS/UNIX系の書籍はほぼ役に立たないと思っていいです。
0837825NGNG
わかりますた。逝ってきます。
0838ななしさん♪NGNG
今RSAについて勉強中のものですが、
http://www8.big.or.jp/~000/CyberSyndrome/rsa/rsa2.html
ここを見て、Cでプログラム組んでたのですが、
1=de mod φ(n)となるd(秘密指数)を計算する
この部分でつまずいています。。。
eとφ(n)はもう知っているのですが、dを出す方法がわかりません。
どなたか教えてくださいなヽ(゚▽、゚)ノ
0839デフォルトの名無しさんNGNG
次に,拡張Euclidアルゴリズム(第3章で触れますが 鍵生成アプレットを使う場合
理解する必要はありません)を用いて秘密指数dを計算します。 つまり,
e^-1=d mod φ(n) のdを計算して求めます。
    d=3988493
となります。つまり,秘密鍵(d,n)は(3988493,5621977)となります。
0840マイクロシステムズNGNG
http://www.alpha-net.ne.jp/users2/microsys/index.htm
0841839NGNG
e^-1=d mod φ(n) のdを計算して求めます。
    d=3988493
となります。つまり,秘密鍵(d,n)は(3988493,5621977)となります。

これよく考えると無理じゃないですか?
e^-1って1/eで、eは6万くらいだから、すごい小さいかずになっちゃいますよ・・・
0842デフォルトの名無しさんNGNG
>>841は釣り師。
0843839NGNG
いや、本人なんですが、(;´Д`)
なんなんだよあんたw>842
0844839NGNG
>>841 >>843
誰?
0845839NGNG
>>844いや、おれまじめなんであんま煽らんでねヽ(゚▽、゚)ノ
なんか相手にされてないようなので、消えます(゜ДÅ)
0846839NGNG
>>845
まさかとは思うが、838のつもりで839って書いてるのか?
0847デフォルトの名無しさんNGNG
チョーワラタ
0848デフォルトの名無しさんNGNG
関数に引数として渡すのと,関数内にstaticを作るのとどっちがいいんだろう?
0849デフォルトの名無しさんNGNG
それぞれ、全然必要となる場面が違うと思うんだが
0850848NGNG
再帰関数で使います。
0851デフォルトの名無しさんNGNG
>>848
関数内にstaticを作るとマルチスレッドに対応できない
0852デフォルトの名無しさんNGNG
そうなんですか。
マルチスレッドまだ勉強してないので,そん時は手直しするかな。他のところでも使ってるし。
0853デフォルトの名無しさんNGNG
>>851
それは迷信。
すべてのケースで使えないわけでもない
0854デフォルトの名無しさんNGNG
>>852
というか、再帰関数ならマルチスレッドでなくても
staticが問題になる可能性があることはわかってるのか?
0855デフォルトの名無しさんNGNG
age
0856 NGNG
再帰で関数内にstatic変数作るヤシは氏ね。
0857デフォルトの名無しさんNGNG
関数にはいってきたときの1回だけstaticの変数をいじるんですが,
それでもあかんですか?
0858デフォルトの名無しさんNGNG
再帰の文脈は構造体にするのが一番まともかな
0859デフォルトの名無しさんNGNG
>>857
なにが死体んだ?
0860デフォルトの名無しさんNGNG
>>857
目的を果たせていれば別にそれでいいんじゃないの?
0861デフォルトの名無しさんNGNG
>>858
どういうこと?
0862デフォルトの名無しさんNGNG
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/bsearch.3.html

これを見る限り、bsearchは必ずバイナリサーチで実装することとなっているみたいですが、
規格上もそうなっていますか?
整列した配列から探索するのでバイナリサーチ以外の探索法を使う人はいないと思いますが。
0863デフォルトの名無しさんNGNG
>>857
再帰の場合の「1回だけ」とstatic変数の意味は
ちゃんと分かって実装しているんだよな?
もしそうだとしたら、シングルスレッドでは
別に問題ないぞ、ボケナス。
0864デフォルトの名無しさんNGNG
>>838 に混じれ洲していいですか?
0865デフォルトの名無しさんNGNG
>>862
ISO/IEC 9899には"binary search"という言葉は出てこない。
0866デフォルトの名無しさんNGNG
>>519
>>472 のこのプログラムの断片では、
true, false が
それぞれ #t, #f (というデータの内部表現への) ポインタなのかも。
0867デフォルトの名無しさんNGNG
関数をポインタで呼び出す時に、引数を渡す事はできますか?
また、出来るとして、CとC++で方法/挙動が違ったりしますか?
0868デフォルトの名無しさんNGNG
>>867
できます。しません。
0869デフォルトの名無しさんNGNG
>867
てきとーにやりまくれ

int (*func)(int hage);
int hogera( int hage) { printf( "gora %d\n", hage); return 0; }

int gora = 100;
func = hogera;
func( gora);

C/C++ を混ぜるときは extern "C" を忘れずに
0870デフォルトの名無しさんNGNG
>>866
??? >>518 と何が違うんだ ?
0871デフォルトの名無しさんNGNG
再起を使うとスタックエリアがえらい状態になる。
0872デフォルトの名無しさんNGNG
だからといって再帰を使うなということではない。
0873デフォルトの名無しさんNGNG
>>871
スタックエリアは空になるよ。








再起 = 再起動の略だろ ?
0874デフォルトの名無しさんNGNG
n+++n って、n++が先に解釈されんだよね。
0875デフォルトの名無しさんNGNG
int m,n;のとき、
n=0;
m=n+++n;
printf("%d",m);
で、0が出力されました。

n=0;
m=(n++)+n;
printf("%d",m);
で、0が出力されました。

n=0;
m=n+(++n);
printf("%d",m);
で、2が出力されました。
0876デフォルトの名無しさんNGNG
>>875
あ、というか、++と+の優先順位から考えたら当然のことで
聞くまでもないしましてや実験するまでもなかったですね。
ほんとうに全く意味の無い実験をさせてしまいすみません。
0877デフォルトの名無しさんNGNG
>>874-876
お前等、いいかげん C-FAQ ぐらい読めよ。
ttp://www.catnet.ne.jp/kouno/c_faq/c3.html#0

結果は、「未定義」だぞ。
0878デフォルトの名無しさんNGNG
未定義age!!
0879デフォルトの名無しさんNGNG
>>877
あの・・・わかってますか?
i++が同一行内の複数の式にあれば その動作は未定ですけど
同一の式内に複数あるときはその動作は一意に決定されますよ。
0880デフォルトの名無しさんNGNG
>>877
お前が読み直せよ。
未定義なのは
n = n+++n;
だっつーの
0881デフォルトの名無しさんNGNG
>>877は2ch名物知ったか教えたがり君
0882デフォルトの名無しさんNGNG
>>881は2ch名物煽(以下略

>>882は2ch(以下略
0883デフォルトの名無しさんNGNG
━━━━━仕切り…………………………厨は俺ですが何か?━━━━━━━
0884デフォルトの名無しさんNGNG
よくしらんけど、式内の評価順は規定されてないのでは?
つまり、
 m = n++ + n
   ↑(1)  ↑(2)
(1)と(2)のどちらが先に評価されるかは処理系依存?なわけで、
(1)が先なら1
(2)が先なら0
がmに代入されるのでは?

同様に、
 m = n + (++n)
   ↑(1)  ↑(2)
の場合、
(1)が先なら1
(2)が先なら2
がmに代入されるはず。

で、これは「未定義」や「不定」ではないけど
「処理系定義」なのでは?
コンパイルオプションによっても変わりそうだし。
printf("%d %d", ++i, --i)の結果が確定できないのと同じだと思うけど。
0885デフォルトの名無しさんNGNG
あ、printfは(言語仕様上はどうか知らないけど)呼出側が引数の領域をクリアするので
右からスタックにつまれる。
だけど、これは必ずしも「右の引数(--i)から評価される」を意味するわけではないので。
0886デフォルトの名無しさんNGNG
 m = n++ + n
   ↑(1)  ↑(2)
(1)と(2)のどちらが先に評価されるかは処理系依存?なわけで、
(1)が先なら1

どちらが先に評価されようとも、式の値はそれぞれnである。
後置インクリメントはシーケンスポイントが来て始めて値に反映される
0887デフォルトの名無しさんNGNG
コード中に、例えば、HOGE という定数を置いて、コンパイル時(プリプロセス?)
に、それが出現するたびに HOGEを1づつインクリメントしていく、というような
ことはできるのでしょうか?(VC++6)

・・・
int a = HOGE; //ここでは HOGE=1で展開される
・・・
int b = HOGE; //ここでは HOGE=2で
・・・
int c = HOGE; //ここでは HOGE=3で
・・・
0888デフォルトの名無しさんNGNG
n=3のとき、(++n)+(++n)+(++n)+(++n)がどうなるか考えよう。
答えは「未定義」なんだけど、コンパイラは「とりあえず」計算してくれる。
gcc2.95だと 23 になったけど、どうでもいいな。
0889デフォルトの名無しさんNGNG
#define HOGE (asoaiuzoixyhzophaazxhxufzighiaern.krjbrr++)
int asoaiuzoixyhzophaazxhxufzighiaern.krjbrr=1;

main()
{
 int a = HOGE;
 int b = HOGE;
 int c = HOGE;
}
0890デフォルトの名無しさんNGNG
”定数”の意味がわかっとらんようだな。
ムリだよ。
0891デフォルトの名無しさんNGNG
>後置インクリメントはシーケンスポイントが来て始めて値に反映される
??
m = n+(++n)
が2になるのはなぜ?
0892デフォルトの名無しさんNGNG
>>891
それは前置インクリメントだから評価順により左右されるだけだろ
0893デフォルトの名無しさんNGNG
>どちらが先に評価されようとも、式の値はそれぞれnである
こっちの方が意味不明だな。
「式の評価」はそれがどの変数に入っていたかなど全く関係ない。
評価された結果(の数値)が全てであり、それを元に+演算し、その結果をmに代入する。

#include<stdio.h>
int main()
{
 int n;
 n = printf("abcde") + (printf("12345") + 3);
 printf("\n");
 n = printf("abcde") + (printf("12345") + 0);
 return n;
}
bccだと、1行目と2行目で表示が変わった。
gccだと変わらない。
0894デフォルトの名無しさんNGNG
あ、ごめん、わかった。
m = n++ + n  の結果は必ず0で、
m = n + (++n)  の結果は未定義なのね。
0895デフォルトの名無しさんNGNG
>>893
n=0とあるとき、
(n++)の値は?
(++n)の値は?
0896デフォルトの名無しさんNGNG
>>894
それも未定義。
m=(n++)+(n++)+(n++)+(n++);
とかやってみ。運がよければ0かも知れんけど。

ところで、未定義でもコンパイルできるのはコンパイラの過剰なサービスだよな。
「未定義」ならWarningなりなんなり出せよって感じだ。
0897デフォルトの名無しさんNGNG
>>896
あんた馬鹿だろ
n++ + nと n++ + n++は別物。
一つの式に複数の副作用を生じる式が入っているんだから
0898デフォルトの名無しさんNGNG
>>897
A+B

Aが n++、Bが n なわけだが
n++ のインクリメントの実行が A の評価後なのは確実なんだけど
それがさらに A+B の評価後なのかは 未定義 なのよ。
0899デフォルトの名無しさんNGNG
>>898
わかんない奴だな、あんたは。
後置インクリメントが反映されるのは、副作用完了点を通過した時点。
n++ + nには副作用完了点が存在しないので、間違いなく0として評価される。

n = 0としたとき、
n++ == 0 が1となるかは未定義だとでもいうのですか
0900デフォルトの名無しさんNGNG
「それは未定義だ(意味:俺は知らない)!やめとけ!」が口癖になってる人って、居そう
0901デフォルトの名無しさんNGNG
>>899
n++ +nには副作用完了点が存在するよ
nが2回以上出てきてるから
0902デフォルトの名無しさんNGNG
>n++ +nには副作用完了点が存在するよ
>nが2回以上出てきてるから

勝手に副作用完了点を作るなよ。
完了点はC FAQにも記載されてるからよく見ておけ。

で、一つの式中に*副作用を伴う式*が2回以上出てきた場合の動作は未定義。
n++ は副作用を伴うが、 nは副作用を伴わない。

わかる?
0903デフォルトの名無しさんNGNG
わかんないよ
0904デフォルトの名無しさんNGNG
>>902
すまないけど、その説明じゃ誰もわかんないぞ。
もうちっと筋道立てて話してよ
0905デフォルトの名無しさんNGNG
C-FAQもう一度読んでみたよ。
3.2

後置増分演算子++も後置減分演算子--も元の値を返した後で、その演 算を行う。
この"後"の意味付けがしばしば誤解を招く。前回値を産み 出したすぐ後で、
かつ式のその他の部分が評価される前に、++や--が 増分や減分を行うことは保証されていない。
単に式が"終了"する前 (ANSI Cの用語でいえば次の"副作用完了点"(sequence point)の前。
質問3.8を参照)のどこかで更新が実行されることが保証されているだ けである。

これを読むと、>>898が正しくて>>899(つまり>>886)は間違っている。
後置インクリメントは、シーケンスポイントに来て初めての結果が反映される   ×
後置インクリメントは、シーケンスポイントまでの間のどこかで結果が反映される   ○

どこで結果反映されるかは規定されていない。
0906デフォルトの名無しさんNGNG
n==0のとき
n++ + n の後ろのnを評価したときに 1 か 0 かは未定義。
副作用完了点の前にnが参照されてるから。
C FAQ の3.1がなぜ未定義なのか、考えれ。

0907デフォルトの名無しさんNGNG
つまり、
m=n++ + n
において、
 n++を評価し、(1)
 nに1を加え
 再度nを評価し、(2)
 (1)と(2)を加算する
ということもありうる。

ってことだね。
0908デフォルトの名無しさんNGNG
>>905
CのFAQも、もう少し素人にもわかりやすく書かないと
>>899のような誤解を生むってことだね。
>>899さんも挫けず勉強がんばってくれぃ
レス数が900を超えています。1000を超えると表示できなくなるよ。