10/03/05 23:27:18
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 60
スレリンク(tech板)
★過去スレ
URLリンク(makimo.to:8000)
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
スレリンク(tech板)
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 134代目
スレリンク(tech板)
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
2:デフォルトの名無しさん
10/03/05 23:30:36
,.――‐ 、
/ ,.―`.ヽ
/ | /:/: :ィ: : : : :\
/ .f⌒h/`:/l:/^\:/l:/: :|` ゲ な
〈 _! l /ムl: :/ _ '^jノ| ソ .ん
_| 人_|: l ,, ̄ =l: |,_ ?. で
{:::_~,.:::}」: |. 「 7 '''}!::::|__
/ /.,.=、|:!:.ト . l_/ ,.ィ_└┐:|__
( └勹ノl:| |\、 // '|!'〉\;/
3:デフォルトの名無しさん
10/03/05 23:42:31
すみません前スレのスタックフレームの者ですが、
局所変数は関数呼び出し時に、スタック領域に確保されるということでおkですよね。
局所変数の大きさはソース見ればわかる、という回答者の方もいますが
実行時にソースを読んでいるわけではないですよね。
そうするとコンパイル時に大きさを求めて、そんで実行時、スタック領域に
局所変数に必要な大きさのフレームを確保する必要があると思うのですが
その大きさは、、、やはりどこから求めているのかわかりません。
4:デフォルトの名無しさん
10/03/05 23:43:51
>>3
コンパイル時に変数の個数はわかってるだろ。
5:デフォルトの名無しさん
10/03/05 23:46:19
>>3
局所変数は関数内で有限個だから、コンパイル時に種類と個数を(どうにかして)数え上げれば、スタック上に準備すべきサイズもわかります。
実行時に求めるわけではありません。コンパイル時に判明することです。
6:デフォルトの名無しさん
10/03/05 23:51:41
どうにかして数え上げればっていうか、どの型の変数が何個使われてるとか
ばっちりわかってないと、コンパイルできないだろ。
C99は実行時に配列の長さを指定できるけど、べつにそういうの気にしてるわけじゃないよな。
質問者は。
7:デフォルトの名無しさん
10/03/05 23:52:20
>>5
> スタック上に準備すべきサイズもわかります。
それはコンパイル時に判明したサイズですよね。
実行時もそのサイズを知る必要があると思うのですが、どこにあるのですか。
実行バイナリファイルにあるのでしょうか。
プロセスの仮想空間にロードされた後もわかるのでしょうか。
8:デフォルトの名無しさん
10/03/05 23:56:32
>>3
スタックの大きさは決めうち
コンパイルオプションで変えられる
実行時に呼ばれた関数が必要としている分だけ
スタック領域を準備しようとするけど実行時に不足していればスタックオーバーフローで止まる
再帰関数で油断してたり、巨大な配列を自動変数で確保しようとしたりするとよく起こること
9:5
10/03/05 23:56:51
>>6
んー、確かにC99可変長配列の扱いはありましたね。
10:デフォルトの名無しさん
10/03/06 00:00:56
>>7
コンパイル時に自動変数に必要なサイズが判明しておれば、それにしたがってスタックポインタを変化させるコードをコンパイル時に生成すればいいのでは。
実行時にあらためて自動変数のサイズを求める必要はないはずです。仮想メモリの話は関係ないと思います。
11:デフォルトの名無しさん
10/03/06 00:06:08
>>7
URLリンク(homepage1.nifty.com)
このページのPROC ~ ENDPのところにスタックフレームを作ってるアセンブラのコードが
あるでしょ。
add sp, 0FFFCh ;ローカル変数領域の作成
のところで、たとえば、intの変数が三つあったら、add sp, 12 ってコードが生成される。
それだけの話。
12:デフォルトの名無しさん
10/03/06 00:06:37
>>10
つまり、局所変数のサイズが300バイトだとしたら
スタックポインタ = (現在の)スタックポインタ + 300バイト + その他情報の大きさ
みたいな命令を、関数呼び出し毎にしているってことなのでしょうか。
質問ばかりですみません。
13:デフォルトの名無しさん
10/03/06 00:07:42
>>11
まちがえた。add sp, -12 だな。
14:デフォルトの名無しさん
10/03/06 00:08:26
>>11
なるほど。少し納得しました。
これで寝られそうです。みなさん、ありがとう。
15:デフォルトの名無しさん
10/03/06 00:34:25
これは酷い
URLリンク(fx.104ban.com)
16:デフォルトの名無しさん
10/03/06 00:38:03
>>15
みゃくらくもなくグロ
17:デフォルトの名無しさん
10/03/06 00:39:17
こんな板でも貼る奴いるんだな
18:デフォルトの名無しさん
10/03/06 00:44:48
寝る前に見てしまった...orz
19:デフォルトの名無しさん
10/03/06 01:25:51
>>15
とにかくグロ注意
みゃくらくは不明だが...
(誰か削除依頼したほうが良さげ)
20:デフォルトの名無しさん
10/03/06 01:34:21
そんなもんどうでもいい
21:デフォルトの名無しさん
10/03/06 01:36:47
誤爆だったw
すまんwwww
これで許してwwwURLリンク(img.f.hatena.ne.jp)
22:デフォルトの名無しさん
10/03/06 01:38:49
コラなんか要らんわぼけ
23:デフォルトの名無しさん
10/03/06 09:14:42
アセンブラを勉強すれば関数呼び出し時のスタック操作とか自分でやるから理解が深まるけどな。
しかし、なんでここまで気にするんだろ?
24:デフォルトの名無しさん
10/03/06 12:13:05
たぶん自分独自のコンパイラ開発しようとしてるんだろ。ううんきっとそう
25:デフォルトの名無しさん
10/03/06 12:45:36
エラー時にスタックトレースを出力したいとか
26:デフォルトの名無しさん
10/03/06 15:05:44
>>23
ここまで気にする人だから、Cを学ぼうとしているんだろう。
低レベルに興味ない奴はVBとかJavaに行くだろ。
27:デフォルトの名無しさん
10/03/06 15:09:15
知らなくても察しが付くことだけどな
28:デフォルトの名無しさん
10/03/06 15:14:13
そうか?それって天才じゃね?
29:デフォルトの名無しさん
10/03/06 15:29:55
問題:
配列a[10]に対して、以下のコードと同等の結果になるコードを、gcc c言語のインラインアセンブラによるSSE3を駆使したコードで書け
なお、long long型のサイズは8バイト。
4 long long a[10] = { 0x1234L, 0x5678L, 0x9012L, 0x3456L, 0x7890L, 0x1234L, 0 x5678L, 0x9012L, 0x3456L, 0x7890L };
5
6 int i=5;
7 do{
8 *(a+i+0) *= 0x3L; *(a+i+1) *= 0x3L;
9 i--;
10 }while( i > 0 );
という問題があったとして、答え合わせの解答集を無くしてしまったとして、答え合わせにこまってます。
ここの住人の方々は、みんな超スーパーハカーぞろいだという噂を聞きました。
どうか皆様がたのウルトラハイパー知識をくしして、この超難問の答えを導き出していただけませんでしょうか…! よろしくおねがいします。
30:デフォルトの名無しさん
10/03/06 15:44:53
4 long long a[10] = { 0x1234L, 0x5678L, 0x9012L, 0x3456L, 0x7890L, 0x1234L, 0 x5678L, 0x9012L, 0x3456L, 0x7890L };
5
6 int i=10;
7 do{
8 *(a+i-0) *= 0x3L; *(a+i-1) *= 0x3L;
9 i--; i--;
10 }while( i > 0 );
すみません、こうでしたw
31:デフォルトの名無しさん
10/03/06 15:47:43
>>30
まだ間違ってるんじゃね?
32:デフォルトの名無しさん
10/03/06 17:00:02
>>29
なんでお前に命令されなきゃいけないわけ?
33:デフォルトの名無しさん
10/03/06 17:23:15
その前にいくらよいしょしてもここにそんなに知識のある奴はいないと思うが。
34:デフォルトの名無しさん
10/03/06 17:36:02
おれ>>32 だけど、ちょっと頭がおかしくなってた。
ごめんな。
35:デフォルトの名無しさん
10/03/06 17:46:26
> 問題があったとして、 解答集を無くしてしまったとして
そもそも仮定からしておかしい
36:デフォルトの名無しさん
10/03/06 19:00:29
つーか
>インラインアセンブラによるSSE3を駆使したコード
どういう頭の構造だと、これが C の質問だと思えるのかと。
37:デフォルトの名無しさん
10/03/06 19:38:27
/* sayHello() 関数へのポインタ */
void (*func)(void) = sayHello;
このとき、'func()' と '(*func)()' の違いって何ですか?
結果は同じなのですが...
38:デフォルトの名無しさん
10/03/06 19:47:52
281 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 00:27:05
関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね?
もともとはどっちが正しいの?
282 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 01:06:42
元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、
世間に受け入れられたなんて話を聞いたことがある。
39:デフォルトの名無しさん
10/03/06 19:49:50
↑
ありがとう.
40:デフォルトの名無しさん
10/03/06 21:54:41
#include <stdio.h>
int main ()
{
unsigned long long a[10]={ 0x1234111111111111L, 0x5678000000000000L, 0x9012000000000000L, 0x3456000000000000L, 0x7890000000000000L, 0x1234000000000000L, 0x5678000000000000L, 0x9012000000000000L, 0x3456000000000000L, 0x7890000000000000L };
unsigned long long b[2]={3,3};
printf("3a={%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx}\n", a[0]*3,a[1]*3,a[2]*3,a[3]*3,a[4]*3,a[5]*3,a[6]*3,a[7]*3,a[8]*3,a[9]*3 );
unsigned long long* ap = a;
unsigned long long* bp = b;
int i=5;
while(i-->0){
asm volatile ("\
movdqa (%0),%%xmm0;\
movdqa (%0),%%xmm1;\
paddq %%xmm1, %%xmm0;\
paddq %%xmm1, %%xmm0;\
movdqa %%xmm0,(%0);\
" : "+r" (ap) : "r" (bp));
ap++; ap++;
}
printf ("3a={%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx}\n", a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
return(0);
}
41:40
10/03/06 21:57:23
を実行したら
3a={369c333333333333,368000000000000,b036000000000000,9d02000000000000,69b0000000000000,369c000000000000,368000000000000,b036000000000000,9d02000000000000,69b0000000000000}
3a={369c333333333333,368000000000000,b036000000000000,9d02000000000000,69b0000000000000,369c000000000000,368000000000000,b036000000000000,9d02000000000000,69b0000000000000}
ってなりました… 意味が分かりません… 動くはずないのに… なんで動いてるんですか…(orz
42:デフォルトの名無しさん
10/03/06 22:57:36
WindowsNT系のコマンドをC言語で呼び出す方法を教えてください。
dirなどのコマンドを呼び出す方法を教えて欲しいです。
仮に代替できるWin32APIやC言語の関数があったとしても、dirを直接呼び出す方法を教えてください。
よろしくお願いします。(dir以外の他のコマンドも将来的に呼び出したいため)
環境はWindowsNTだけサポートしてれば大丈夫です。
43:デフォルトの名無しさん
10/03/06 23:08:33
systemとか
winexeとか
dirだけでいいならopendirとか
44:デフォルトの名無しさん
10/03/06 23:41:00
_poepn
45:デフォルトの名無しさん
10/03/07 00:28:51
CreateProcessだろ
DOS画面出さず出力をメモリに入れられる
46:デフォルトの名無しさん
10/03/07 01:03:39
>>45
つスレタイ
47:デフォルトの名無しさん
10/03/07 07:59:22
const と define の違いが今ひとつわからない
どっちも定数を定義するんだよね?
48:デフォルトの名無しさん
10/03/07 08:47:35
ココでも読め。
URLリンク(detail.chiebukuro.yahoo.co.jp)
URLリンク(rararahp.cool.ne.jp)
49:デフォルトの名無しさん
10/03/07 10:20:16
C言語でrailsのActiverecord
作ってくださいお願いします
50:デフォルトの名無しさん
10/03/07 10:23:47
自分でやれよ
51:デフォルトの名無しさん
10/03/07 10:37:04
>>47
define ・・・最も古くから使われている
enum ・・・ヒゲさん曰く見えない圧力に押されて追加、いまいちらしい
const ・・・禿と共同開発
定数を返す関数という手もあり
これが実は最も融通が利く
52:デフォルトの名無しさん
10/03/07 10:55:25
defineはコンパイル時に置き換えてくれるだけ
だからマクロとして使えるし、関数丸ごとdefineしてみるとか変なこともできる
__LINE___や__TIME___みたいなコンパイル時に決まるやつもある
事項時はもうすでに置き換わっているのでaaaaとかって名前でdfineしてデバッカでaaaa探してもない
constはメモリ上に固定でそいつがずっといるだけ
つまりデバッカで値も見れる
53:デフォルトの名無しさん
10/03/07 10:55:26
>>47
これ↓も似たような質問かな?
C言語のdefineとグローバル関数について - Yahoo!知恵袋
URLリンク(detail.chiebukuro.yahoo.co.jp)
54:デフォルトの名無しさん
10/03/07 10:57:16
おれ52だけど なんでアンダーバーが3っつなんだろ??
55:デフォルトの名無しさん
10/03/07 10:59:46
コンパイル時というかプリプロセス時
56:デフォルトの名無しさん
10/03/07 11:00:50
キーリピート間隔を短く設定していたんじゃないのか
57:デフォルトの名無しさん
10/03/07 11:12:23
8bitのデータで、
6ビット目が1になったら他のビットが1でも0でも関係なく特定の処理をする動作はどのようにすればよいでしょうか。
58:デフォルトの名無しさん
10/03/07 11:17:02
& (1 << 5)
59:デフォルトの名無しさん
10/03/07 11:17:36
if(data&0x20){
特定の処理
}
60:デフォルトの名無しさん
10/03/07 11:36:45
ループを使わずに配列の順序を逆にせよ。
という問題は、ループ制御構造(whileやfor)を使わずに、という意味でいいのかな?
関数の再帰呼び出しでもできそうだけど、goto文使ったらだめ?
61:デフォルトの名無しさん
10/03/07 11:38:53
>>60
それはCの問題ではなく日本語の問題じゃね?
どういう意図で書いたのかを書いた人に聞けよ
62:デフォルトの名無しさん
10/03/07 11:43:04
>>61
このホワイトボードプログラミングのところ:
http://japan.zdnet.com/sp/feature/07tenthings/story/0,3800082984,20409456-2,00.htm
一応、こんな感じで(^^
int *
reverse(int ary[])
{
int i = 0;
int j = SIZE - 1;
int tmp;
loop:
if (i >= j) goto end;
tmp = ary[i];
ary[i++] = ary[j];
ary[j--] = tmp;
goto loop;
end:
return ary;
}
63:デフォルトの名無しさん
10/03/07 11:47:31
gotoつかってもループだろ
64:デフォルトの名無しさん
10/03/07 11:49:50
goto文はループ制御構造ではないんですよね。
だったら「ループを使わずに」じゃなくて「再帰を使って」、と書けばいいのに。。
65:デフォルトの名無しさん
10/03/07 11:51:03
たぶん出題意図としては、再帰を使ってほしいんじゃないかね
Cというよりは関数型言語でやらせるような問題
66:デフォルトの名無しさん
10/03/07 11:52:09
>>62
答え出てるぞ
* ループを使わずに配列の順序を逆にする。
答え:順次、配列を画面に表示して行ってオペレーターにメモさせておき、
メモした値を逆順に入力するよう促すダイアログを出す。
67:デフォルトの名無しさん
10/03/07 13:21:02
画像の範囲内をマウスのクリックで判定させるにはどのような考え方をすればよいのでしょうか?
参考サイトがあれば紹介して頂きたいです。
68:デフォルトの名無しさん
10/03/07 13:30:16
UNIX環境でVCの代わりになるような物ってないですかねぇ
69:デフォルトの名無しさん
10/03/07 13:34:37
VC のどんな特徴の「代わり」ができればいいんだ?
VC そのものなら Xen という手もある
70:デフォルトの名無しさん
10/03/07 13:35:53
>67
その画像が矩形なのか矩形以外の多角形なのかで変わる
>68
Anjuta, Emacs, Geany
71:デフォルトの名無しさん
10/03/07 13:38:38
>>70
矩形を想定しています。
72:デフォルトの名無しさん
10/03/07 13:44:12
>>71
ドラッグして範囲選択みたいな感じ?
考え方っていうか、サンプルコード見たほうが早いんじゃない?
マウスダウンのイベントでマウスカーソルをキャプチャして、マウスの
ボタンが離されたれらそこまでが選択範囲だけど。
73:デフォルトの名無しさん
10/03/07 13:49:13
単にヒットした座標か画素が欲しいだけだろ
74:デフォルトの名無しさん
10/03/07 13:53:45
範囲選択ではなく、画像のスイッチのような感じです。
一定の矩形の範囲内をクリックすることで、処理が行われるようにしたいと
思っています。
75:デフォルトの名無しさん
10/03/07 13:58:16
ゲームでも作りたいんじゃないの
確かやねうさんはビット演算でやっていたな
自分で紙に矩形とポイントを描いて条件を考えてみれば自ずと答えが見えてくるよ
76:デフォルトの名無しさん
10/03/07 14:20:51
マウスの位置と矩形の位置を取得しておいて
矩形の上境界線と下境界線の間にマウスの縦座標があって
左境界線と右境界線の間にマウスの横座標があればいいだけじゃないの?
77:デフォルトの名無しさん
10/03/07 14:30:09
left <= x && x <= rignt && bottom <= y && y <= top
78:デフォルトの名無しさん
10/03/07 14:30:29
>>67
むかしBMPファイル(って予備領域とか拡張可能になってるから)に勝手にホットスポットっていうか
クリック可能位置を付け足してクリックすると話が進む紙芝居、見たいなの作った
言語も環境も書いてないからあれだけど
クリッカブルマップ、とかでググってみるとなんとかくやり方わかると思うよ
あとは環境しだいで同じ様な事を違うやり方でやれば
79:デフォルトの名無しさん
10/03/07 14:44:28
様々なご回答ありがとうございます。
全て参考にさせて頂きます。
80:デフォルトの名無しさん
10/03/07 15:18:45
>>68 : kdevelop (書こうとしてる字を予測して、自動補完してくれるからラクちんです)
>>71 : 三角形がいっぱいあるとおもってやるほうほうもあるみたいですよ。
double OuterProduct(
double ax, double ay, double az,
double bx, double by, double bz,
double cx, double cy, double cz
) {
double Ax=bx-ax; double Ay=by-ay; double Az=bz-az;
double Bx=cx-bx; double By=cy-by; double Bz=cz-bz;
double opx = (Ay*Bz-Az*By); double opy = (Az*Bx-Ax*Bz); double opz = (Ax*By-Ay*Bx);
return opz;
}
B
A △ C
3角形ABC の中に、点P が「中かな?外かな?」ってのを知りたいときは、
「AB と P」、「BC と P」、「CA と P」 の3つについて、この関数で調べてみて、戻り値が3つとも全部プラス、または3つとも全部マイナスなら
点Pは 3角形ABCの内側ってことらしいです。 なんでか理由はよくわかりませんがw
符号1 = OutarProduct( Aのx座標、Aのy座標, 0、 Bのx座標、Bのy座標、0、 Pのx座標、Pのy座標、0 );
符号2 = OutarProduct( Bのx座標、Bのy座標, 0、 Cのx座標、Cのy座標、0、 Pのx座標、Pのy座標、0 );
符号3 = OutarProduct( Cのx座標、Cのy座標, 0、 Aのx座標、Aのy座標、0、 Pのx座標、Pのy座標、0 );
if( 符号1と符号2と符号3が、3つともプラス。 または3つともマイナスなら){ 点Pは、さんかっけいABCのうちがわ♪ }
ってなるみたいです。 なんでか理由はよくわかりませんがw こんど算数の先生に聞いてみまーす。
81:デフォルトの名無しさん
10/03/07 15:22:25
外積で左右判定してるんでしょ
82:デフォルトの名無しさん
10/03/07 16:35:50
>>67 三角形の内部の点かどうか判定するプログラム
#include<stdio.h>
#include<math.h>
int is_inner(double ax, double ay, double bx, double by, double cx, double cy, double px, double py)
{
double Ax, Ay, Bx, By, Px, Py, alpha, beta, divisor;
Ax=ax-cx;
Ay=ay-cy;
Bx=bx-cx;
By=by-cy;
Px=px-cx;
Py=py-cy;
divisor=Ax*By-Bx*Ay;
if(fabs(divisor)<1.0e-6) return 0;
alpha=(By*Px-Bx*Py)/divisor;
beta=(-Ay*Px+Ax*Py)/divisor;
if(0.0<alpha && alpha<1.0 && 0.0<beta && beta<(1.0-alpha)) return 1;
return 0;
}
int main(void)
{
printf("%d\n", is_inner(1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 0.5, 0.499));
return 0;
}
83:デフォルトの名無しさん
10/03/07 21:51:15
再帰的アルゴリズムの利便性がわかりません。
下手をすればスタック領域が蓄積されていってメモリ不足に陥りますよね。
再帰を使わなくても他に解決できる手段があればみなさんはどちらを選択しますか
84:デフォルトの名無しさん
10/03/07 21:54:10
>>83
間違いが少ないほう
85:デフォルトの名無しさん
10/03/07 21:56:59
ほらループなしで処理が書けたよ!と頭よさげにアピールできる
問題領域そのものが再帰的なら可読性と保守性があがる
C言語ではあまり利点がないので他の手段で頑張る
関数型言語とかだとまた別の話しになる
86:デフォルトの名無しさん
10/03/07 22:10:59
>>83
利便性っていうか、再帰的な処理は再帰で書いた方がわかりやすいな。
87:デフォルトの名無しさん
10/03/07 22:11:17
関数に状態を持たせるのがどうじゃこうじゃ
逆に再帰で書いているのを繰り返し制御などで書き直す方が頭良さげ
最近再帰使ったのはビット単位でファイルに書き込む関数の下請け関数だわ
88:デフォルトの名無しさん
10/03/07 22:28:25
本物のプログラマは自己書き換えプログラミング・コードを記述する。
そのことにより再帰アルゴリズムを使うのに比べて20ナノ秒も実行時間が改善される
どうしても再帰なんつう場面は数年に一度
それ以外は、再帰アルゴリズムがぱっとわからないと馬鹿にされるという理由だけで使用する
プログラマってそんなもん
89:デフォルトの名無しさん
10/03/07 22:52:19
再帰は、数学の階乗を求めるプログラムをかじった程度です。
可読・保守性があがるという利点は納得です。
逆にプログラマが再帰プログラムを創り出すほうが大変そう。
階乗求める以外に再帰を使ったほうがいいケースは思いつきにくいですね
90:デフォルトの名無しさん
10/03/07 22:53:10
>>89
3D オブジェクトを扱うときは必須だよ
91:デフォルトの名無しさん
10/03/07 22:54:05
階乗こそ単純ループで十分で再帰にする必要なんてないんだが。
92:デフォルトの名無しさん
10/03/07 23:00:41
無向グラフの経路探索とか再帰使わないと面倒でやってられんけど
93:デフォルトの名無しさん
10/03/07 23:01:26
>>89
ディレクトリをおりていく処理とか、ループで書くとめんどくさいだろ。
94:デフォルトの名無しさん
10/03/07 23:12:27
>>91
教材的な意味だろ
95:デフォルトの名無しさん
10/03/07 23:46:11
教材としてあげるにしても、せめてユークリッドの互除法とか、フェボナチ数列(など漸化式)とかが出てこないものか
96:デフォルトの名無しさん
10/03/07 23:47:17
再帰関数の教材ならハノイの塔の問題を解く奴が好き
97:デフォルトの名無しさん
10/03/07 23:56:03
他人のコードで見つけるとループに書き換えられないかと難癖付けてみたくなる要素
自コードと同じスタックでライブラリ的利用させてもらう場合特に
98:デフォルトの名無しさん
10/03/08 00:55:01
組み込み系だと、変数を取れるキャパが決まってたりして
「お、スタックが空いてる再帰でなんとかしろ」とかあるよ
99:デフォルトの名無しさん
10/03/08 01:18:44
>>89
再帰だとシンプルに書けるものはたくさんある。
もちろんスタックオーバーフローには注意が必要だけど、
プログラマの差ってのはこういうところから来るんだと思う。
例えば、テキストファイルの行を逆順に出力する(いわゆるtacコマンド)
を作ろうとすると、再帰だとこんなにシンプル
#include <stdio.h>
void rev()
{
char buf[1000];
if(fgets(buf, 1000, stdin) != 0) {
rev();
fputs(buf,stdout);
}
}
main() {
rev();
}
100:デフォルトの名無しさん
10/03/08 01:21:16
>>99
再帰関数で大きな自動変数の配列を使うのはナシだろ
101:デフォルトの名無しさん
10/03/08 01:25:22
なにこの制限だらけのtac
102:デフォルトの名無しさん
10/03/08 01:50:03
>99
これは再帰の悪い例としていつか使わせてもらう
103:デフォルトの名無しさん
10/03/08 02:14:39
>>再帰
文字列の中から、正規表現によって単語検索をする場合、正規表現の文字列の並びを、配列から、一旦、順序木の構造に変換してしまって、
木のノードを順番に辿りながら、文字列を検索していくと、一連の検索を、共通の操作であつかえて簡単だとおもいます。
たとえば括弧で囲まれて1まとめになった複数条件も、あるノードの子としてまとめて、”あるノードの子というひとまとまりの単位”であつかえるので、
たとえば単純な ”A" という条件も、複雑な ”[AかBかC]”みたいな括弧で囲まれた条件も、どちらも同一の「”このノード”を使って検索する」という操作で扱えます。
これが再帰を使って得られる簡単さという恩恵だと思います。 簡単に素直にするために再帰を使うんだと思います。
たとえば括弧に囲まれた複数文字も、囲まれてない単一文字も、どちらも同じように考えて検索できるのだから、
木がどんなに複雑な形をしてても、逆にどんなに単純な形だとしても、
どちらも同じ要領で「”このノード”を使って検索する」という共通の操作だけで最後まで処理できます。
この順序木を巡っていくという操作を、単一のループだけでやろうとすると、
「さまざまな形の木を想定」して、それぞれに専用の動作を書いたりするケースが出てきやすいと思います。
(たとえば "A"の場合と "[AかBかCか]"の場合とでの動作の違いを、「わざわざ専用に用意」しないといけいない。などのメンドクササ。
これがループだけでやる場合のメンドクササだと思います。)
だけど、純粋に繰り返しの処理速度だけでみれば、やっぱり for ループみたいなモノの方が優れてるような気がします。よく知りませんが。
普通はループで十分事足りるので、たとえば「シンプルな int[1000] の配列全部に0を代入する」だけのことに、わざわざ再帰を使う必要は無いと思うし、
無理やり再帰なんか使ったら、逆に、わかりづらくなるだけだろうし、わかり辛いとミスも増えますし。
あたりまえですけど、「より簡単に、より素直に書ける方」を選んで使えばいいだけのことかとおもいます。どっちも便利だとおもいます。
104:デフォルトの名無しさん
10/03/08 04:41:46
Cの場合、非再帰で記述(スタックを自前で構築ってのは
この場合反則になるんで)できる位の力量が無いのに
再帰(間接再帰を含む)を使いまくったコードを書くと
後で地獄を見る可能性も視野に...
105:デフォルトの名無しさん
10/03/08 05:08:48
>>104
よく分からん縛りだけど
人に強要するのは勘弁してね
106:デフォルトの名無しさん
10/03/08 05:11:09
ライブラリ、長く使うものに再帰はないな。
どこがスタック積まれるか判らないし、スタックオーバーフローもいつ起こるか特定できない。
107:デフォルトの名無しさん
10/03/08 07:41:46
>>99
逆順にならない。
108:107
10/03/08 18:48:09
失礼、行を単位に逆になるという意味だったんですね。ちゃんとうごきました。
109:デフォルトの名無しさん
10/03/08 18:51:24
1行毎に1000バイトずつスタックに積むとか使えない。
手元にあるテキストは、1行当たり数キロバイトとか逆に数十万行とか普通にあるんだが。
まぁ発想方法としては、悪くないんだけどね。
110:デフォルトの名無しさん
10/03/08 18:58:51
一行読んで、それを連結リストで繋いでおく方がいいな。
それでもファイルサイズが大きすぎると面倒だけど。
tacコマンドは、ファイルの末尾にseekしてから表示しているな。
seekできないストリームに対しては、テンポラリファイルにコピーしてから。
まあちゃんと読んだわけではないから詳しくは知らないけど。
111:デフォルトの名無しさん
10/03/08 20:21:44
Cと直接関係してる質問じゃないけど
ソースを見れる形でファイルを上げれるcodepadのようなアップローダって他にある?
なんか似たような感じで見やすいところがもう一つあった気がするんだけど
112:デフォルトの名無しさん
10/03/08 20:27:44
URLリンク(kansai2channeler.hp.infoseek.co.jp)
ここ?
113:デフォルトの名無しさん
10/03/08 20:32:06
いや、もっと企業がやってるようなオシャレな感じで掲示板では無かったんだけど。
codepadみたいにソースが表示されてdownloadボタンが付いてる感じで
114:デフォルトの名無しさん
10/03/08 20:35:20
URLリンク(gist.github.com)
ここ?
115:デフォルトの名無しさん
10/03/08 20:44:11
おおそれだ、探しても見つかんなかったんだありがとう。
116:デフォルトの名無しさん
10/03/08 20:44:29
言われてから探して見つけてきたけど
117:デフォルトの名無しさん
10/03/08 20:52:01
アップローダとか無駄なキーワード入れてたのが駄目っだのかな・・
118:デフォルトの名無しさん
10/03/08 20:54:14
codepadの類似サービスだから一緒くたに紹介されてると思って、はてブでcodepadと検索したら出てきた
119:デフォルトの名無しさん
10/03/08 21:41:02
#include <stdio.h>
void rev(void)
{
char *buf;
if ((buf = malloc(sizeof(char) * 1000)) == NULL) {
fputs("memory allocate error.", stderr);
exit(1);
}
if (fgets(buf, 1000, stdin) != 0) {
rev();
fputs(buf,stdout);
}
free(buf);
}
int main(void) {
rev();
return 0;
}
これでいいですか?
120:デフォルトの名無しさん
10/03/08 21:55:53
malloc()で動的に確保しても、領域計算量が大きければ意味なし。
121:デフォルトの名無しさん
10/03/08 22:27:03
最近も再起なんて使う?みたいなレスを見たなぁと思ったら図書スレでか
まぁこの手の話題は定期的にあがるもんだけど
122:デフォルトの名無しさん
10/03/08 22:28:31
C言語って難しいんですか??
123:デフォルトの名無しさん
10/03/08 22:30:22
難しいの定義による。
124:デフォルトの名無しさん
10/03/08 22:30:22
>>122
わかれば簡単だと思うよ
125:デフォルトの名無しさん
10/03/08 22:30:56
>>122
文法自体はかなり簡単な部類
ポインタで躓かなかったらな
126:デフォルトの名無しさん
10/03/08 22:32:03
英語とかって、出来てたほうがいいですかね??
127:デフォルトの名無しさん
10/03/08 22:33:37
>>122
難しいともいえるしやさしいともいえる。
低機能の言語なので、文法自体はシンプルで覚えることは少ない。(やさしい?)
低機能の言語なので、なんかやろうとするとめちゃくちゃ手間がかかる。(難しい?)
128:デフォルトの名無しさん
10/03/08 22:39:03
>>126
出来た方がいいに決まってるが、
そんな質問するアホには必要ない。
129:デフォルトの名無しさん
10/03/08 22:39:54
>>126
読みやすいプログラムはそれ自体英文として読めるプログラムだから(俺流の解釈)
読みやすいプログラムを書くためには英語は必要。
英語のできない人が書いたプログラムは大変。
CにしてもJavaにしても英語圏の産物なんだな。
130:デフォルトの名無しさん
10/03/08 22:54:34
プログラミング言語は、アルファベット使うけど英語じゃなくて数学に近いな
131:デフォルトの名無しさん
10/03/08 23:24:31
>読みやすいプログラムはそれ自体英文として読めるプログラムだから
こんなこというやつの変数や関数は長くてむかつく
ReadDataFromUserFileToImageBuffer()
みたいなやつ
あるいはアンダーバーでつなげてみたりして
今時補完機能があるからへいきだろう、とか言い出してさ
>読みやすいプログラムを書くためには英語は必要。英語のできない人が書いたプログラムは大変。
こういうこと言うやつは俺がnamaeみたいな変数とかyomikomi()みたいな関数作ると怒り出すよな
いいじゃん、日本人なんだから日本語にしただけで読みずらくなったりしないよ
と見ず知らずの129にすげえむかつく
132:デフォルトの名無しさん
10/03/08 23:26:24
英語できないやつのプログラムは、
childs とか serch とか、ありえないスペルミスがあって、読みにくくてかなわん。
133:デフォルトの名無しさん
10/03/08 23:26:40
いや読みにくいから
134:デフォルトの名無しさん
10/03/08 23:26:53
>>131
日本語があやふやなお前が言っても説得力は無い
135:デフォルトの名無しさん
10/03/08 23:42:49
俺が普段書くスクリプトなんて一文字変数、スペースけちって詰め詰めばっかりだよ
136:デフォルトの名無しさん
10/03/08 23:44:49
SQL?
137:デフォルトの名無しさん
10/03/09 02:41:32
>>131
ReadDataとToImageBufferが意味的にかぶってない?
UserFileというのもちょっと。
ReadImageFromFileじゃだめかい?
英文として読めるように、というのはよくある指針だね。
138:デフォルトの名無しさん
10/03/09 03:58:43
RiyousyaFileKaraGazouBufferHeYomikomi()
とか書かれたらキレそう
139:デフォルトの名無しさん
10/03/09 05:21:39
プログラムが正しく動作して、開発スタート時に決めた関数の命名規約
(※腐ったルールだとしても)を遵守しているなら、あまり気にしないレベル
140:デフォルトの名無しさん
10/03/09 07:16:23
>>137
そうそう、こういう人
上記のやうは例じゃん、適当に作ったさ
それにたいしてまで、こんな事言ってくる
そういう点がむかつくんだって事
ReadImageFromFileじゃだめじゃん
長々と英文を関数名にしてるやつが居るよねって例としては短すぎる
ここは多少英語としておかしくても長くして置かないと駄目
141:デフォルトの名無しさん
10/03/09 07:17:31
JISYO のように複数のローマ字方式をミックスしたり、
JYOHO のような適当ローマ字で書かれているのを見るとためいきが出る。
142:デフォルトの名無しさん
10/03/09 07:32:31
readdata
readdata2
readdata3
readdataEX
readdataEX2
みたいにされるのもむかつく、混在してたりするとさらに
143:デフォルトの名無しさん
10/03/09 08:15:36
とりあえず読みにくいのはお断り
関数名は英語とローマ字のどちらかに統一されていれば気にしない
混在してるとイラッとくるが
144:デフォルトの名無しさん
10/03/09 08:17:50
>>140
シンプルだが単語のせいで長くなる場合は仕方ない
i18nのようにごまかすのもいいけど、やりすぎはよくない
複数の意味を含めた名前になるのならそれは関数化が足りない
145:デフォルトの名無しさん
10/03/09 10:05:36
つかもともとCは単語を略す文化だよね
intもcharもbufだってそう
memcmpとかやっちゃうし
昔の本とかのソース見るとインデントもあって目を細めると螺旋模様のように見える
今のソースはBASICのようにブロック並べたみたい
146:デフォルトの名無しさん
10/03/09 10:09:31
スパゲティコードより読みにくいという説もあるいわゆるうねりコードですね
147:デフォルトの名無しさん
10/03/09 10:35:16
文化じゃなくて制限。creatとか今思えばひどいもんだよね
端末に表示できる文字数の問題もあったし、環境に合わせてその辺は変化していってもいいと思うんだ
148:デフォルトの名無しさん
10/03/09 11:45:10
Visual C++ 2008 Expressで1から勉強を始めたいのですが
ソリュージョンのディレクトリの作成はオンにするのとオフにするのはどちらがよろしいのでしょうか?
参考に2つのサイトを見て勉強したいと思います
苦C URLリンク(9cguide.appspot.com)
猫 URLリンク(homepage2.nifty.com)
苦Cでは特にオフにしろとは書かれてなく、猫のほうはオフにしろと書かれてましてオンとオフどちらにしたらいいのか分かりません
149:デフォルトの名無しさん
10/03/09 11:58:44
すべてローマ字で書くことに決めたとしても、簡単なカタカナ語をどうするか悩む
どうしてもrisutoと書かなきゃいけないのか、listにしちゃいけないのか
そして無意識のうちにlistと書いちゃってコンパイルエラー
150:デフォルトの名無しさん
10/03/09 12:00:28
>>148
両方やってみて違和感が少なかったほうにすればいいよ
151:デフォルトの名無しさん
10/03/09 12:01:36
あ、気に入らなかったらフォルダごと捨てれば大丈夫だから、神経質にならずにためせばいいよって意味も含んでるよ
最初は確かにいろいろそわそわしたなぁと思い出したので追記
152:デフォルトの名無しさん
10/03/09 12:25:15
ありがとうございます
オフにしてやってみます
153:デフォルトの名無しさん
10/03/09 12:26:20
> 読みやすいプログラムはそれ自体英文として読めるプログラムだから
COBOL 屋かてめーわ
154:デフォルトの名無しさん
10/03/09 13:52:42
他人のコードを改造しているんですが
コードの量が大きいので一つの変数の型を変更するとそれに関連するものを変更する作業が大変です。
例えばint型だったものを制度をよくしたいのでdouble型に変えたとします。
それに関連する関数の戻り値や引数、代入される変数等、膨大な数になってしまいます。
なにか自動で型を変換する方法ってありませんか?
155:デフォルトの名無しさん
10/03/09 15:09:54
typedefしておけばいい
156:デフォルトの名無しさん
10/03/09 15:33:17
理解力がなくてすみませんがtypedefでどう解決するのでしょうか?
157:デフォルトの名無しさん
10/03/09 15:42:44
全部変えてしまうのは、まずいだろ
見ながら1こ1こかえるしかねーべ、そういうものとあきらめて
158:デフォルトの名無しさん
10/03/09 15:47:01
mozillaではパーザで構文木作ってそれを木の変換技法を使って自在に書き換えするっていうのを
javascriptで作って、それをコードメンテに使ってるみたい
dehydraとかいうやつだっけか
159:デフォルトの名無しさん
10/03/09 16:08:52
検討の例えで整数変数を実数に入れ替えにしてるのは
釣りかい?
160:デフォルトの名無しさん
10/03/09 16:14:02
んだなぁ
(x == y)みたいなのは、型を変えただけじゃだめだしなぁ
結局>>157しかないな
161:デフォルトの名無しさん
10/03/09 16:21:18
たとえばビット演算を使っていたりしたらアルゴリズムから検討する必要が出てくるので
自動でやるのはとても不可能だろうなあ。
162:デフォルトの名無しさん
10/03/09 16:22:10
, -‐--、 ヽ∧∧∧ // |
. /////_ハ ヽ< 釣れた!> ハ
レ//j け ,fjlリ / ∨∨V ヽ h. ゚l;
ハイイト、"ヮノハ // |::: j 。
/⌒ヽヾ'リ、 // ヾ、≦ '
. { j`ー' ハ // ヽ∧∧∧∧∧∧∨/
k~'l レヘ. ,r'ス < 初めてなのに >
| ヽ \ ト、 ヽ-kヾソ < 釣れちゃった!>
. l \ `ー‐ゝ-〈/´ / ∨∨∨∨∨∨ヽ
l `ー-、___ノ
ハ ´ ̄` 〈/‐-、
163:デフォルトの名無しさん
10/03/09 16:32:51
すいません、苦Cの事を一通り覚えた後は何をしたらいいでしょうか?
164:デフォルトの名無しさん
10/03/09 16:35:48
>>163
アルゴリズムとデータ構造が少ない希ガス
165:デフォルトの名無しさん
10/03/09 16:41:12
コマンドラインで動作する素数判定プログラムprimeを作っているのですがうまくいきません。
コマンドラインオプションでの整数取得・切り分けがうまくいかないです。
助言お願いします。
166:154
10/03/09 16:59:15
多くのレスありがとうございます。
全intをfloat(double)に変換するとか強引な方法をとってはダメでしょうか?
167:デフォルトの名無しさん
10/03/09 17:04:35
駄目かもしれないしOKかもしれない
なんでそんなことわかるの?
でもきっとコンパイルエラーがわんさか出るだろうな
sprintfとかの辺とかビット演算の辺とかまずそう
switch文とかもまずそう
サイズをsize_tじゃなくてintでやってるところとかあればまずそう
戻り値をintでエラーで分岐してたらまずそう
168:デフォルトの名無しさん
10/03/09 17:04:56
ダメだって書いてあんだろーが
169:デフォルトの名無しさん
10/03/09 18:19:45
#include <stdio.h>
void hack(void){
printf("実行可能\n");
exit(0);
}
void func(void){
int iArray[2];
iArray[4] = (int)hack;
}
void main(void){
func();
}
VC++のDebugで、
どうしてこれが実行できてしまうのでしょうか?
170:デフォルトの名無しさん
10/03/09 18:42:09
そういう風にできてるから
171:デフォルトの名無しさん
10/03/09 18:44:52
>>165
つ codepad
瞬殺でアドバイスが得られると思います。
172:デフォルトの名無しさん
10/03/09 19:15:01
運がいいから
173:165
10/03/09 19:53:43
素数判定ではなく素因数分解factorでした
URLリンク(codepad.org)
うまい具合に引数を整数にしたいです。
例えば、
factor 123451234512345
のときも動いてほしいです。
OSはwindows vistaでコンパイラはgcc、バージョンは
gcc version 3.4.5 (mingw-vista special r3) です。
その時のint型(4bytes)の上限は +2,147,483,647 (10桁)です
174:デフォルトの名無しさん
10/03/09 20:23:07
>>173
gmp みたいな多倍長整数ライブラリを使う
175:デフォルトの名無しさん
10/03/09 20:40:07
引数は整数になってると思うけど桁数を増やしたいって話?
20桁未満ならgccはlonglong使えるんじゃないか
176:165
10/03/09 21:15:02
>>174
試してみます。
>>175
桁数を増やすのと、
例えばint型を使っていて、
引数argv[1]がその上限を超えたときに
エラーにしてくれるようなチェック方法を知りたいです。
177:デフォルトの名無しさん
10/03/09 21:45:35
>>176
コマンドラインオプションの解析は getopt(3)でいいんじゃない?
自分で判定するのは面倒でしょ。
パラメタを整数にするのも、strtol とかstrtoll あたりでいいかと。
上限超えたらどうなるかは、man 見れば載ってると思う
178:デフォルトの名無しさん
10/03/09 23:12:10
ヘッダファイルで
#define RED 1
#define BLUE 2
.....
#define YELLOW 100
と数百個定義しているのですが(全部定義しているわけではない)
結構順番を入れ替えます.そこでインクリメンタル的なものをつかえないかと思っているのですが,
よい方法ございますでしょうか?
よろしくお願いします.
179:デフォルトの名無しさん
10/03/09 23:14:01
enum
180:デフォルトの名無しさん
10/03/10 16:36:16
ヒープメモリとスタックメモリって読み書き速度に差はあるの?
181:デフォルトの名無しさん
10/03/10 16:37:55
>>180
スタックは頻繁にアクセスされるためCPUキャッシュに乗った状態の可能性が高い
182:デフォルトの名無しさん
10/03/10 17:09:32
スタックもヒープも物理的に差はない。
C言語がやりくりする一定値のメモリがスタック。OSに問い合わせしないので解放取得が速い。
ヒープはOSに問い合わせる。
スタックもプログラム開始時にOSに問い合わせて取得する。
OSはこの二つの違いは認識しない。使われていなければ、スタックでもページアウトする。
183:デフォルトの名無しさん
10/03/10 17:12:31
100Mとか多めに確保したヒープにランダムアクセスしたら遅くなるが
確保できたとしてスタックでも同じ程度の速度。
はじめに一定値を確保してあるか無いかの違いだけ。
184:デフォルトの名無しさん
10/03/10 17:13:31
スタックはメモリプールという機能と同じってこと。
185:デフォルトの名無しさん
10/03/10 17:28:47
Windowsを初め、比較的新しいOSではスタックも追加確保
されるる時にOSに問い合わせます。
186:デフォルトの名無しさん
10/03/10 17:31:37
XPはスタックオーバーフローするが。
vistaからはそうなったか。
187:デフォルトの名無しさん
10/03/10 18:12:17
>>185
OSが許容するスタック上限値よりずっと低いスタック量で
プロセスを起動しても、行儀の良いプログラムだったら
問題がないんでそうしてるわけですね。
少し「仕事をする」(再帰とか使ってたり、ローカル変数に
配列とか大量に確保する)プログラムだったら当然それでは
足りないからスタックオーバーフローする。そのタイミングで
OSはスタックを追加してプロセスを停止させず続行するわけ
です。
188:デフォルトの名無しさん
10/03/10 18:30:49
OS的には、変数は極力グローバル変数に確保し、再帰を使わない
プログラムであることを望んでいるというわけですね
189:デフォルトの名無しさん
10/03/10 18:43:30
OSはスタック追加などしないぞ。OSから見たらカタックとヒープの違いはない。
MS-DOS Windwos3.1では区別はあったとおもうが。
Windwos3.1はスタックの固定領域を指定して使い切ったら駄目だった気がする。
190:デフォルトの名無しさん
10/03/10 19:00:26
MS-DOSにおいて、カーネルを含むプログラムの実行に確保できるメモリ空間(コンベンショナル・メモリ)は8086のアドレス空間の最大1MBである。
ほとんどのコンピュータでは、この空間にBIOS ROMやメモリマップドI/O、VRAMなどの空間も存在するため、
アクセス可能なメモリ空間は最大でも640KBから768KB程度であった。
ただし、バンクメモリやEMS、プロテクトメモリ(80286/386以降)等のコンベンショナルメモリ以外の領域・手段の利用が一般化していたため、
「貴重な」コンベンショナルメモリがこれらの領域によって圧迫されることはなかった。
日本語入力用のFEPなどの常駐型のデバイスドライバを使用すると一度に使用できるユーザーメモリはさらに減少するため、
ユーザーはEMSやXMS、HMAやUMBなどの拡張メモリの管理機能を利用して、
辞書や常駐部やMS-DOSシステムの一部をそれらへ配置し、コンベンショナルメモリの圧迫を少しでも避けることが重視されるようになった。
「とりあえず動く」という状態を作るだけであればエンドユーザーがこれらを直接操作する必要はほぼ無かったが、
「とりあえず」に飽き足らず無駄を省き最適な設定をするためには知見と試行錯誤が要求されるある種の職人芸的な資質が要求されたため、
これらの事情が「MS-DOSの環境設定は非人間的で困難なものであった」とする後世の評価を招く原因ともなった。
MS-DOS - Wikipedia
191:デフォルトの名無しさん
10/03/10 19:32:23
XPでもコンベンショナル・メモリのような設定あるんだがな。
デスクトップアプリケーションヒープ、非対話型サービスヒープの設定可能。
ここ変えないといくらメモリふやしても、メモリ不足改善しないことある。
192:デフォルトの名無しさん
10/03/10 20:22:20
Win3.1の場合、8086向けのコンパイラを若干改造した
もので生成出来るコードでGUIアプリが作れるという
のが基本設計
8086ではスタックの動的変更を行う一般的
方法のCPUアーキテクチャーレベルのサポートは
殆ど無いしコンパイラでもサポートしている例は
皆無。
193:デフォルトの名無しさん
10/03/10 20:26:14
おまえは勘違いしている。
スタックというのは、OSから見たら特別な領域でない。
スタックとヒープというのは、C言語(その他)から呼ばれているだけ。
どっちもOSに合わせたメモリ取得関数を呼び出して確保する。同じもの。
194:デフォルトの名無しさん
10/03/10 20:30:58
昔のOSは区別してあった領域があるかもしれないが
いまのメモリ確保はどれ使っても、OSレベルでは結局は一通りのメモリ確保しかないだろ。
レジスタとかGPUとかは別。
195:デフォルトの名無しさん
10/03/10 20:39:53
>>179
ありがとうございました.
うまくいきました.
196:デフォルトの名無しさん
10/03/10 21:20:04
暴れてる長文バカも
同じくらい環境依存なのに
startupコードやセクションの話になるとサクッと黙るんだよな
197:デフォルトの名無しさん
10/03/10 23:15:37
>>193
WindowsはCPUレジスタそのものを管理しないって?
んなことない。ないからこそ他のプロセッサ向けに移植
されていない。初期のWinNT(4.0まで)はプロセッサ
が今のように分化してないから対応できたんだろうが
さすがに無理になってしまって現在はIntel以外は非対応
198:デフォルトの名無しさん
10/03/10 23:19:13
レジスタやGPUメモリは専用命令で扱えるが
スタックとヒープを区別して扱う命令はない。
OSではこれらの差はない。
199:デフォルトの名無しさん
10/03/10 23:19:18
おっとMovail (CE)とかは上位レイヤーや言語インターフェース
の互換性があるだけでメモリアーキテクチャーはIntel版とは全然違ってると考えたいね。HD非搭載なマシンでも動作させる必要がある
わけだから違って当然だけど
200:デフォルトの名無しさん
10/03/10 23:25:22
入門スレであまり難しい話しないでよ
201:デフォルトの名無しさん
10/03/10 23:33:17
>>197
alpha とかサポートやめた主な理由は商業的なことで
儲かるとなれば技術的な問題はどうとでもなったはず
202:デフォルトの名無しさん
10/03/11 01:06:16
>>198
何を根拠にそういうこと言い切っちゃうの?
OSが無い環境もあるし、物理的にアクセス速度が違うメモリに振り分けられることもあるだろう。
結局は環境を絞らないと何も言えない。
203:デフォルトの名無しさん
10/03/11 02:11:18
Javaならどうだろうか?
204:デフォルトの名無しさん
10/03/11 02:36:13
Intelと一口に言っても、x86/x86-64とIA-64はまったく別物だしね。
205:デフォルトの名無しさん
10/03/11 02:55:40
CPUが特殊命令持っていて、スタック動作を速くすることが出来たとしても
それが付いてないCPUでも、スタック、ヒープメモリは使えないといけない。
これより、C言語のスタックとヒープはソフトウェアとしての用語。
206:デフォルトの名無しさん
10/03/11 02:58:52
コンパイラの実装次第だがWindowsXP以降では、
スタックもヒープも同一のメモリ確保関数を使っているだろう。
すべてのコンパイラを知っているわけではないが。
CPUレジスタやCPUキャッシュのみをスタックに使う実装も出来ないことはないけど
ないんでは。
207:デフォルトの名無しさん
10/03/11 03:24:29
「スタック処理支援命令が付いていないプロセッサなどCPUと
呼んではいけない」
という意見には必ずしも賛成ではないが、付いていることを
前提とするかしないかでは、OSのカーネル開発の開発者の
集団力学には大きな影響が発生し、それがOS全体に
作業環境全体に与える影響力は計り知れず、スタック支援命令が
ついたプロセッサ上のOSしか知らない俺にとっては
とてもじゃないが反対だとも言えない。
208:デフォルトの名無しさん
10/03/11 04:07:46
ハードウェアのスタック機能と、C言語のスタックとヒープは
名前と動作は似ていても別物。
C言語のスタックメモリは複雑だろ。auto変数や関数呼び出しや再帰とか。
ハードウェアの機能に丸任せできないだろ。
209:デフォルトの名無しさん
10/03/11 04:14:51
>>181で答え出てるのにまだ続けるのか
210:デフォルトの名無しさん
10/03/11 04:23:33
C言語に限らずプログラミングで頻繁に出現する
データ構造の総称的名称としてのスタックやヒープと
CPUが決定する「具体的な」ものとでは使われる
コンテクストが全く違うだろうな(特に範疇性)
同じ用語を用いていてもコンテクストが全く異なる
ので同じコンテクストで使われていると決めつける
と何かと混乱の原因になりやすい鴨
211:デフォルトの名無しさん
10/03/11 04:48:24
文字列が数値かどうか判定するのにisdigitを使うと
マイナスや小数が誤判定されてしまいますが
これらも正しく数値と判定させるためには自前で関数用意するしかないのでしょうか。
212:デフォルトの名無しさん
10/03/11 04:52:39
>>211
isdigitは数字かどうかを判定する(一般には)マクロ
なんで、数値かどうかの判定を一発でするのは
無理
受け取った文字列をsscanf等で数値に直したものを
人の目を通して確認してもらうのが一番
0.9994242123123232132という文字列を数値
に直したのを表示させた時に
0.9994242123123456789
となった場合にそれが問題なのかどうかは状況に
依存。
213:デフォルトの名無しさん
10/03/11 05:41:48
>>211
atoiやatof等で不満なら自作するしかないね。
214:デフォルトの名無しさん
10/03/11 06:01:50
レスどうもです。
sscanfだと"1xyz"みたいに先頭だけ数字の文字列も数値として通ってしまうなぁ・・
と試行錯誤してたらatofで完璧でしたどうもありがとうございます。
215:デフォルトの名無しさん
10/03/11 06:10:06
とおもったらatofでもやはり先頭が数字だとだめでした;;
216:デフォルトの名無しさん
10/03/11 06:32:11
>>208
べつに、auto変数や再帰や関数の引数で特別なことはやっていないし C 言語のスタックメモリが複雑とも思えませんけれども。
217:デフォルトの名無しさん
10/03/11 07:00:12
>>215
じゃぁ、自作だね。
チェック関数だけ書いて後はatofに流すのが無難かなっと思うけど
用途や目的次第なのでお好きにどうぞ。
218:デフォルトの名無しさん
10/03/11 13:54:53
>>215
#include<stdio.h>
double get_value(const char *str)
{
double value;
int n;
if(sscanf(str, "%lf%n", &value, &n)==1)
{
if(str[n]=='\0') return value;
}
return -1.0;
}
#define TEST(str) printf("[%s]=%f\n", str, get_value(str))
int main(void)
{
TEST("0.12345");
TEST(" 0.12345");
TEST("0.12345 ");
TEST("1xyz");
return 0;
}
219:デフォルトの名無しさん
10/03/11 15:01:30
素直にstrto{l,ul,d,f,ld}を教えてやれよ
220:デフォルトの名無しさん
10/03/11 18:54:28
スレチかもしれませんが
URLリンク(detail.chiebukuro.yahoo.co.jp)
これ、答えて下さいませんか?
221:デフォルトの名無しさん
10/03/11 18:56:35
>>220
スライドショー フリーソフト でggrks
222:デフォルトの名無しさん
10/03/11 19:57:20
断片化対策にこういうことってやっていいの?
サイズ違うのにキャストしても大丈夫かな?
void *my_allocate(size_t size)
{
return malloc(size / 4 * 4 + 4);
}
void my_deallocate(void *address)
{
free(address);
}
int main(void)
{
char *pc = (char *)my_allocate(sizeof char);
*pc = 'c';
printf("%c", *pc);
my_deallocate(pc);
return 0;
}
223:デフォルトの名無しさん
10/03/11 20:05:17
>>222
多いのは大丈夫
不足するのはダメ
224:デフォルトの名無しさん
10/03/11 21:59:52
>>222
4バイト単位で大きさ調整しても意味なさそう。
225:デフォルトの名無しさん
10/03/11 23:24:21
その式だと、最初から4の倍数だった時、必要なサイズより4バイト大きくなってしまう
普通はビット演算を使うと思う
(size + 0x00000003) & 0xfffffffc
226:デフォルトの名無しさん
10/03/11 23:46:52
>225
それはsize_tが何バイトだと想定しているわけ
いや、むしろ何ビットといった方が良いのかな
227:デフォルトの名無しさん
10/03/12 01:10:36
(size + 3) / 4 * 4
だな
228:デフォルトの名無しさん
10/03/12 01:54:07
>>226
それなら、0xfffffffcを~(size_t)3にでもすればいいと思う。
229:デフォルトの名無しさん
10/03/12 02:32:04
~((size_t)3)かな
230:デフォルトの名無しさん
10/03/12 02:41:42
昔は乗除算は必ずシフトに展開しろと教わったもんだが
今のCPUだとコストに差はないのかな
(size + 3) >> 2 << 2
231:デフォルトの名無しさん
10/03/12 02:48:41
演算子の強度低減ぐらいなら処理系がうまく最適化してくれるので
意図をそのまま表現するのが良いとされるようになってきたような
232:デフォルトの名無しさん
10/03/12 02:59:55
/ 4 * 4 も >> 2 << 2 も & 0xfffffffc に最適化してくれるね
233:デフォルトの名無しさん
10/03/12 03:35:43
素直に「4の倍数に切り上げ」ってコメントに書くわ
どんなに簡単な処理でもコメントがあった方が読みやすいし
とくに何年も前に書いたソースだと
234:デフォルトの名無しさん
10/03/12 15:01:25
>>233
まさかとは思うが、こんなコードは書かんでくれよ。
++count; // カウントのインクリメント
235:デフォルトの名無しさん
10/03/12 15:08:47
教えてください。
システムソフト開発の会社に入ってそろそろ10年。
サポートや試験担当ということもあって、
まったく言語というものを知らずに来ました。
最近、なんかまずいかな?
と思い始めて「猫C」を買って勉強しています。
でも、特に目的がないせいか、
この本やったあと次はなにを勉強すればいいかわかりません。
なにかおすすめの書籍があれば教えてください。
236:デフォルトの名無しさん
10/03/12 15:11:00
なにがまずいの?
237:デフォルトの名無しさん
10/03/12 15:11:31
会社の言語やってるやつに聞け
実用で使われないやつやっても無用の長物
配置転換でリストラにならないように現場で使われる率高いやつ
238:デフォルトの名無しさん
10/03/12 15:13:50
C言語などいくらやっても徒労に終わる
基礎が出来ても完成品が出来るまでの道のりは険しい
自分でした独習など焼け石に水状態
会社でやってるのをピンポイントでやるべき
239:デフォルトの名無しさん
10/03/12 15:17:38
ありがとうございます。
.NET(C#?)の問い合わせが多いので
その言語のサンプルを読めるようになると
サポートの幅は広がるよね。
とは言われました。
そうか、と思いつつ、
基本である(と思っている)C 言語の初歩本くらい
やっといた方がいいのかな、
と思ってせこせこやっていました。
240:デフォルトの名無しさん
10/03/12 15:20:59
あとC#で何分野やってるのかも聞くといい。
GUIとかゲームとかネットワークとか。
その分野を重点してやる。
241:デフォルトの名無しさん
10/03/12 15:25:07
C#で開発ってXbox360かと思った。
242:デフォルトの名無しさん
10/03/12 17:16:54
>>239
土方を目指すのでなければCは必須
243:デフォルトの名無しさん
10/03/12 18:00:22
Cできたところで結局ドカタなんすけどね
244:デフォルトの名無しさん
10/03/12 18:37:40
switch(c->programming){
case YES:
printf( "Cができるとは素晴らしいですね\n" );
default:
c->status = "土方"
break;
}
245:デフォルトの名無しさん
10/03/12 19:05:31
浮動小数を文字列に変換する方法について教えてください。
求める動作は次のとおりです:
* double型を文字列に変換
* printf系などの外部関数で変換しない
* 整数は整数として表示(小数点を付けない)
* 小数点以下の不必要な0は付けない
* 有効な精度(15桁程度?)で適当に丸める
* 出力が長い場合も扱える(例えば、「12340000000000000000000」など)
いろいろやってみたのですが思い通りのものが作れなかったので・・・
アイデア・ヒントいただければと
自分で作ってみたものも一応晒しておきます。
↓だと、「456」のときに「459.9999...」となってしまいうまくいきません。
URLリンク(codepad.org)
246:245
10/03/12 19:07:20
↑の「459.9999...」は「455.9999...」の間違いでした。
申し訳ない。
247:デフォルトの名無しさん
10/03/12 19:44:29
配列を関数に渡して、その値を取得したいんですが、上手くいきません
どうすればいいでしょうか?
248:デフォルトの名無しさん
10/03/12 19:46:36
>>247
[50] を除けばいいかも
249:デフォルトの名無しさん
10/03/12 19:58:47
すみません、取得したいというのは
int test[10];
func( &test );
a = test[ n ];
というつもりでした
250:デフォルトの名無しさん
10/03/12 21:00:10
>>249
質問がよく判らんが、こういうことか?
void func(int * test)
{
test[0] = 1;
}
void caller()
{
int test[10];
func(test);
int a = test[0];
}
251:デフォルトの名無しさん
10/03/12 21:47:19
>>250
それだと関数の中で1を代入しても関数を呼ぶ側では変化しないと思うんですが
普通の変数をポインタで引数を渡して変更した値を取得するプログラムの配列バージョンみたいなのは可能でしょうか?
252:デフォルトの名無しさん
10/03/12 21:56:56
変化しましたけど。。
URLリンク(codepad.org)
253:デフォルトの名無しさん
10/03/12 22:57:46
勘違いしてました
解決しました
ありがとうございます
254:デフォルトの名無しさん
10/03/12 23:31:42
>>238
違うね
「基礎ができて」ない奴の道のりが険しいだけ
計算をしっぱなしな奴と、ちゃんと検算する習慣がある奴の違いは
小学校で受けた教育の質から来る
255:デフォルトの名無しさん
10/03/12 23:33:45
基礎からやればいいじゃん
簡単なプログラム書くときでもホーア論理とか記述的意味論とか使って検証しながら書くとかさ
256:デフォルトの名無しさん
10/03/12 23:58:26
>>222
mallocがアライメント調整してるのに自前でもやる意味あるのかな?
257:デフォルトの名無しさん
10/03/13 00:04:47
「何故かは分からんが出来たからいいや」
こういうタイプは一生伸びない。
応用できるのは何故そうなったか、つまりプロセスの部分であり、解は応用できないからである。
258:デフォルトの名無しさん
10/03/13 00:12:55
うるせーばか
既解決問題の証明を一生再生産してろ
259:デフォルトの名無しさん
10/03/13 00:19:19
こうしてHTMLは死んだ
260:デフォルトの名無しさん
10/03/13 01:23:10
>>256
malloc()がアライメント調整してない場合も、pragma指定かAPIで調整できる場合が多いね。
261:デフォルトの名無しさん
10/03/13 05:35:26
>>239
10年っていったらもう30前後なんだろ?
今更言語やっても身につかないし
そんな奴は役に立たない
262:デフォルトの名無しさん
10/03/13 08:36:24
確かに>>261は役に立たない
263:デフォルトの名無しさん
10/03/13 12:47:32
>>261
お前使えねーな
264:デフォルトの名無しさん
10/03/13 12:52:07
>>261
ごめん。相当気持ち悪いな、お前
265:デフォルトの名無しさん
10/03/13 13:06:55
261の人気にシット☆
266:デフォルトの名無しさん
10/03/13 13:16:18
shit?
267:デフォルトの名無しさん
10/03/13 17:04:47
執刀
268:デフォルトの名無しさん
10/03/13 19:58:55
ファイルが存在すれば追記でオープン
ってのを格好よく書くにはどうしたらいいかな
あればエラー無ければ作成ってオプションならfopen()にあるけど
逆なんだよな~access()使うの面倒くさいな~
269:デフォルトの名無しさん
10/03/13 20:04:45
質問です
ネストって一般的に何重が限度ですか?
270:デフォルトの名無しさん
10/03/13 20:12:56
何のネストだよ
271:デフォルトの名無しさん
10/03/13 20:14:30
>>268 "r+" でよくね?
272:デフォルトの名無しさん
10/03/13 20:17:32
>>270
if文のです
273:デフォルトの名無しさん
10/03/13 20:40:30
C言語の弱点はネストだな。短い文で使えばいいけど
間に沢山あるとわかりにくくなる
for{}つかえときはcontinue;で括弧を引きずらないようにするといい
場合によってはgotoもいい
長い部分は関数化
274:デフォルトの名無しさん
10/03/13 20:51:43
>>269,272
> 5.2.4.1 Translation limits
> The implementation shall be able to translate and execute at least one
> program that contains at least one instance of every one of the
> following limits:
> - 127 nesting levels of blocks
> - ...
275:デフォルトの名無しさん
10/03/13 20:52:04
>>272
みっつくらいじゃね?
276:デフォルトの名無しさん
10/03/13 20:55:31
>269
ISO/IEC 9899:1999 (E)
5.2.4.1 Translation limits
1 The implementation shall be able to translate and execute at least one program that
contains at least one instance of every one of the following limits:13)
127 nesting levels of blocks
63 nesting levels of conditional inclusion
63 nesting levels of parenthesized declarators within a full declarator
63 nesting levels of parenthesized expressions within a full expression
13) Implementations should avoid imposing fixed translation limits whenever possible. number of characters as the corresponding universal character name, if any)14)
14) See ``future language directions'' (6.11.3).
15 nesting levels for #included files
1023 case labels for a switch statement (excluding those for any nested switch statements)
63 levels of nested structure or union definitions in a single struct-declaration-list
ネスト以外の限界については省かせてもらった
やっぱり63か
>274
その一つ下じゃないか
277:デフォルトの名無しさん
10/03/13 20:56:03
>>273
ネスト深くてもわかりやすい言語なんかねーよ
安易にgoto勧めんなよ
場合によって、の解釈でとんでもないことになるし
goto排斥主義者の人が来ちゃったら揉めるだろ
278:デフォルトの名無しさん
10/03/13 20:58:54
だからgoto使わなければいいだけ
279:デフォルトの名無しさん
10/03/13 21:10:33
>>276
"conditional includion" は 6.10.1 にある #if とかの話。
280:デフォルトの名無しさん
10/03/13 21:13:57
>276
あっ、ほんとだ
プリプロセッサの話だ
281:デフォルトの名無しさん
10/03/13 21:21:24
>>280
許してやる
282:268
10/03/13 21:21:26
>>271
あー、オープンしてから自分でシークすりゃいいだけか。
ありがとう。
283:デフォルトの名無しさん
10/03/13 22:19:58
プログラム勉強始めたばかりの初心者です。例えば以下のようなif文があるとします。
カッコを入れるタイミングと位置がよく理解できていません。
なんで下記のように2回連続カッコが続いて記述されるのでしょうか?
きっとそれぞれのカッコがどこで始まり終わっているのかが理解できていないと思います。
必ず対になるので偶数個になるのは理解できていますが・・・
おかしな日本語で大変申し訳ありませんが、どなたかわかりやすく解説をお願いできますでしょうか。
よろしくお願いします
if (条件1) {
if (条件2) {
文1;
}
else {
文2;
}
} ←これは何に対してのカッコ?なんで2回連続なんだろう???
else {
文3;
}
284:デフォルトの名無しさん
10/03/13 22:25:09
>>283
2回連続しているけど、意味は別もの。
ネストしているカッコをそれぞれ別のカッコと考えれば分かると思うよ
if(条件1)「
if(条件2)『
文1
』else『
文2
』
」
else
285:デフォルトの名無しさん
10/03/13 22:26:00
>>283
例にあげた if 文自体が間違っています。
わからなくて当然です。
なんの本にかいてあったんですか?どこのサイトですか?
286:デフォルトの名無しさん
10/03/13 22:31:48
>>283です
解説ありがとうございます。いまからじっくり読んで見ます。汗
サイトはこちらです。コピペした時におかしくなっただけかもしれません 汗
URLリンク(www9.plala.or.jp)
287:デフォルトの名無しさん
10/03/13 22:51:51
>>284さんありがとうございます。
初心者の私にはこのように見えます。
if(条件1)「 ①
if(条件2)『 ②
文1
②』else『 ③
文2
③ 』
」① ←上記の番号がきっとそれぞれ対になっていると思っています。ただ、
条件1が満たされなかったら下のelse文に続くからこの閉めカッコは何?とも感じます。
きっと私は文の構成の初期的なところを理解していないと思われます 汗
else
288:デフォルトの名無しさん
10/03/13 22:56:51
才能無い奴はやめてしまえ
おまえがC言語をやらなくてもかわりはいくらでもいる
ゴミなんだよお前は
289:デフォルトの名無しさん
10/03/13 22:58:46
むやみに煽りすぎだろ。
290:デフォルトの名無しさん
10/03/13 22:59:35
最初のうちは↓のような書き方をした方が分かりやすいかも
if (条件1)
{
if (条件2)
{
文1;
}
else
{
文2;
}
}
else
{
文3;
}
291:デフォルトの名無しさん
10/03/13 23:00:31
煽り?どこがだよ!お前もそうおもうだろ!正直に言えよ!
292:デフォルトの名無しさん
10/03/13 23:01:36
ifの中にifがはいってるってことはわかってる?
「ネスト」で調べてみましょう
293:デフォルトの名無しさん
10/03/13 23:12:57
>>291
ま、正直、あまりに根本的なところで、なんで?なんで?って聞かれるとイラっとはする。
294:デフォルトの名無しさん
10/03/13 23:13:35
>>288
視野が狭いな
まさに土方の考え方だわ
295:デフォルトの名無しさん
10/03/13 23:15:27
>>294
はぁ?じゃあお前がちゃんと答えればいいじゃねえか!てめえがびしっとこたえねえからこんな事になってんだろ!クソが!
296:デフォルトの名無しさん
10/03/13 23:17:04
まず落ち着いて入門書を読むレベルだろコレ
おまえらが半端に親切にするからチャット状態で何も考えずに質問しちゃうんだよ
297:デフォルトの名無しさん
10/03/13 23:18:52
九九の表を覚えないのに掛け算するレベル。
298:デフォルトの名無しさん
10/03/13 23:21:26
この程度で才能なのかよ。
可哀想だなお前ら。。
299:デフォルトの名無しさん
10/03/13 23:25:00
この程度もできないのはまさに才能だろうな。
300:デフォルトの名無しさん
10/03/13 23:25:07
>>287
疑問の回答になってるかわからないけど、
if( 条件1 ){
略
} ←このカッコ
else {
略
}
このカッコは、"else"があれば終わりが分かるんだから
不要じゃないか?っていう疑問なら、確かにその通り。
でもそれは"else"が来る場合限定の話で、else の来ない場合はそうじゃない。
C言語は、カッコでくくったブロックが基本単位になってるんだけど、
この辺りの感覚が分かってくると、閉じカッコが2重につくのも納得いくと思うよ
301:デフォルトの名無しさん
10/03/13 23:26:58
変なところでひっかかる人はたまにいる
んで、引っ掛かりが取れたらグンと伸びることも結構ある
283もそうなのかは分からんけどね
302:デフォルトの名無しさん
10/03/13 23:28:06
んじゃとりあえず期待。
303:デフォルトの名無しさん
10/03/13 23:28:08
>>287
条件1が満たさた場合、「 ①から」①までが実行される。
どこからどこまでか範囲を指定してるから、どこまでを示す閉めカッコが必要。
範囲じゃない場合は省略できるが、最初のうちは必ず{}でくくっておいた方がいいと思う。
304:デフォルトの名無しさん
10/03/13 23:29:55
if (条件1) {
if (条件2) {
文1;
}
else {
文2;
}
}
else {
文3;
}
は
if ( (条件1) && (条件2){ 文1;}
else if( 条件1) { 文2; }
else {文3;}と等価でよいでしょうか?
305:デフォルトの名無しさん
10/03/13 23:32:55
実際に条件式書いてコンパイルしてみたら分かるでしょ。
306:デフォルトの名無しさん
10/03/13 23:33:00
if (条件1) {
if (条件2) {
文1;
}
else {
文2;
}
}
else {
文3;
}
307:デフォルトの名無しさん
10/03/13 23:34:32
>>304
一般的には等価ではない。条件1を再度評価したとき同じ結果が
返るとは限らないから
308:デフォルトの名無しさん
10/03/13 23:35:21
>>304
条件1が評価時に変化しなければ等価
309:デフォルトの名無しさん
10/03/13 23:38:28
そんな条件の条件があるのなら等価じゃないだろ
310:デフォルトの名無しさん
10/03/13 23:40:24
そもそもコーディングの意図が明らかに違う
311:デフォルトの名無しさん
10/03/13 23:41:36
だから適当な変数を用意して
int 条件1結果;
条件1結果=(条件1)?1:0;
if ( (条件1) && 条件2 ){文1;}
else if(条件2) {文2;}
else {文3;}
と書くのがもっとも無難じゃないかと...
312:デフォルトの名無しさん
10/03/13 23:41:39
質問に答えてください
313:デフォルトの名無しさん
10/03/13 23:44:41
ここで聞くより入門書を買って読んだ方が手っ取り早い
314:デフォルトの名無しさん
10/03/13 23:47:31
ここは
「C言語なら俺に聞け(入門編)」
です
煽るだけの奴は去れ
315:デフォルトの名無しさん
10/03/13 23:48:00
>>312
お前が質問するのは自由だが、それに答えるかどうかもこっちの自由だ。
316:デフォルトの名無しさん
10/03/13 23:49:48
煽るだけじゃなく、例えば荒らしもする奴は居てもいい。
317:デフォルトの名無しさん
10/03/13 23:50:22
>>314
スレタイにだまされるな。
初心者の質問をネタに雑談するスレだ。
318:デフォルトの名無しさん
10/03/13 23:50:52
>>1
>C言語の*入門者*向け解説スレッドです。
質問または答えない奴はここにいる資格は無い
319:デフォルトの名無しさん
10/03/13 23:51:47
じゃあ俺に聞けなんて自信満々にいわないでください
スレタイをC言語なら入門書を読んだ上でたまになら俺に質問してもいいよ(入門編)に改名するべきです
320:デフォルトの名無しさん
10/03/13 23:53:01
質問を議題とし、初心者同士がディスカッションするスレだよ
321:デフォルトの名無しさん
10/03/13 23:53:14
自信満々に答えられないなら来なきゃいいのに。
322:デフォルトの名無しさん
10/03/13 23:53:20
>>317
それでいいんだよ
通ぶってても規格票と違っている事を固く信じ込んでいる事はよくある
323:デフォルトの名無しさん
10/03/13 23:53:54
>>319
「俺に聞け」なんて不遜な言い方、ジョークに決まってるだろ。
324:285
10/03/13 23:54:08
>>283
んー、私が間違っていましたね。
これであっています。失礼いたしました。
で、こういう書き方をすればわかりやすいかもしれませんが、いかがでしょうか。
if (a == 0) {
if (b == 0) {
x = 0;
} else {
y = 0;
}
} else {
z = 0;
}
325:デフォルトの名無しさん
10/03/13 23:54:37
マジに、ただひたすら初心者様に奴隷のように教えるだけのスレになったら回答者なんてだれもよりつかなくなるよな。
326:デフォルトの名無しさん
10/03/13 23:57:57
低レベルな回答者はいらないです。
327:デフォルトの名無しさん
10/03/13 23:59:01
逆ギレすんなよ
328:デフォルトの名無しさん
10/03/14 00:05:41
ヤフの質問箱とかOKWebとかなら、むやみに煽られないんじゃないのかね。
あそこらは「君たちは質問の意図を理解してませんね。
そういうことはいいから早く質問にこたえなさい」系の物言いも許されるイメージ。
あんまり見てないから知らんけど。
329:デフォルトの名無しさん
10/03/14 00:17:35
if文のネストで巧くいかなかったら
条件式を工夫してみろ
条件式をいじってうまくいかなったら
if文のネストを工夫してみろ
両方駄目だったらあきらめろ
言えることはこれくらいかな
330:デフォルトの名無しさん
10/03/14 00:29:35
聞くだけならいくらでも聞いてやる
ただし答えるとは誰も言ってない
331:デフォルトの名無しさん
10/03/14 00:32:42
答えないならせめてずっと黙ってろ
332:デフォルトの名無しさん
10/03/14 00:34:53
いや質問があるなら俺に聞けよ
333:デフォルトの名無しさん
10/03/14 00:34:56
<object width="480" height="385"><param name="movie"
value="URLリンク(www.youtube.com)">
</param><param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="URLリンク(www.youtube.com)"
type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"
width="480" height="385"></embed></object>
このプログラムを教えてください。私のレベルは、cを少しかじっただけです。
334:デフォルトの名無しさん
10/03/14 00:35:56
>>329
最初から理屈だけで覚えようとすると得てして失敗しやすいからな
335:デフォルトの名無しさん
10/03/14 00:38:15
>>333
Cをかじったなら、それはCじゃないってわかるだろ。
336:デフォルトの名無しさん
10/03/14 00:40:14
おCりかじり虫~
337:デフォルトの名無しさん
10/03/14 01:08:45
鉄分ミネラルビタミンCは
338:デフォルトの名無しさん
10/03/14 11:08:49
保存済みのメモ帳に書いてある10個の数字からランダムに5個読み取りたいんですけど、
fopen、fscanf、for、ifのみを使ってそのようなプログラムを作ることって可能なのでしょうか?
339:デフォルトの名無しさん
10/03/14 11:11:26
不可能
340:デフォルトの名無しさん
10/03/14 11:12:15
手書きだったら、スキャナで読み取って画像認識しなければ
ならないから、相当難しいだろうな。
しかも使える関数や構文にも強い制限があるみたいだし....
341:デフォルトの名無しさん
10/03/14 11:16:10
/dev/randomとかある環境ならいけるんじゃね?とか思うけど
342:デフォルトの名無しさん
10/03/14 11:16:21
宿題はC/C++宿題スレへ。テンプレート持って。
343:デフォルトの名無しさん
10/03/14 11:17:06
ってnotepad.exeで作成したテキストファイルじゃなくてリアルメモ帳かよ!
344:デフォルトの名無しさん
10/03/14 11:40:26
木綿生地以外は全部ナイロンに分類してしまう某民族みたいな話だな
345:デフォルトの名無しさん
10/03/14 12:26:11
randとかの関数のアドレス調べておいて
それでfopenを上書きすればいいんじゃね
あるいはランダムな数字が入ってるテキストファイル用意しておくとか
346:デフォルトの名無しさん
10/03/14 12:27:13
却下
347:デフォルトの名無しさん
10/03/14 13:00:38
>>338
できるよ
348:デフォルトの名無しさん
10/03/14 13:26:37
fopen、fscanf、for、ifだけじゃ無理だろ。
カッコや演算子もないとプログラムの書きようがない。
349:デフォルトの名無しさん
10/03/14 13:29:57
糞スレ
350:デフォルトの名無しさん
10/03/14 13:30:27
開くだけ開いて閉じないってのはなぁ
351:デフォルトの名無しさん
10/03/14 13:36:40
必要な関数を全部挙げろよカス
352:デフォルトの名無しさん
10/03/14 13:37:04
>>348
なんか小学生みたいだな
353:デフォルトの名無しさん
10/03/14 15:05:35
hoge.hにint num;というグローバル変数を宣言?します
全然関係ない所から、#include "hoge.h"をしてhoge.hのint num;を使うと
numのスコープはどうなるのですか?
354:デフォルトの名無しさん
10/03/14 15:10:57
記憶クラス指定子にextern付けとけ
どっかのコンパイル単位でint numで定義すればいい
355:353
10/03/14 15:36:26
>>354
ひとまず、グローバル変数にはexternをつければいいことは分かりました
でも、いつグローバル変数が死ぬかわかりません
356:デフォルトの名無しさん
10/03/14 15:42:23
グローバルに限らず静的変数はmain()が始まってから終わるまで生きてる。
寿命をスコープと言わない。スコープってのは名前の有効範囲。
357:デフォルトの名無しさん
10/03/14 16:00:40
>>350
fopen()で開いたストリームは、プログラムが終了すると自動で閉じられるんで、
閉じるのは省略しても問題ないって場合もある。
358:353
10/03/14 16:06:29
すみません、まだexternとグローバル変数について分からないので教えてください
staticのまとめ
1.#include "hoge.h"とした時に初期化(定義)される
2.staticは何度も#include "hoge.h"としても、1度しか初期化されない
3.プログラムのすべてが終わると自動的に、削除される
4.オブジェクト指向のpublic?
externのまとめ
1.#include "hoge.h"とした時に初期化(定義)される
2.#include "hoge.h"とする度に初期化されてしまうので、多重定義になってしまう
3.プログラムのすべてが終わると自動的に、削除される
359:デフォルトの名無しさん
10/03/14 16:29:24
>>358
#includeと切り離して説明すると、
file1.cとfile2.cで、それぞれ、static int n = 1; とstatic int n = 2; と宣言されていたら、
この二つのnはそれぞれ別の変数になる。
それぞれ1と2で初期化される。
file1.cで宣言されたnはfile1.cの中からしかアクセスできない。よそからは見えない。
file2.cで宣言されたnはfile2.cの中からしかアクセスできない。よそからは見えない。
file1.cとfile2.cで、それぞれ、int n = 1; とextern int n; と宣言されていたら、
この二つのnは同じ変数になる。
1で初期化される。
file1.cとfile2.cでnを書き換えると、同じ変数だから、とうぜん、file1.cとfile2.cから
みえるnは同じように書き換えられる。
360:353
10/03/14 16:52:37
>>359
わかりました、ありがとうございます
また、疑問に思う事があったら質問します
361:デフォルトの名無しさん
10/03/14 17:56:37
C言語の入門サイトではヘッダの作り方がかかれていませんが、
C言語では普通ヘッダを作らないのでしょうか?
ちなみに、*.cを*.hにするだけじゃダメなんですか
362:デフォルトの名無しさん
10/03/14 18:37:33
if(1)
{~}
else
{~}
elseブロックは最適化で消滅する?
363:デフォルトの名無しさん
10/03/14 18:46:39
>>361
ちょっと規模が大きいとファイルを複数にわけるんで、ヘッダを作るのが普通。
ヘッダには定数とか関数のプロトタイプを入れるもんなので、.cを.hに変えるだけじゃだめ。
364:デフォルトの名無しさん
10/03/14 18:51:50
だめだお。
365:デフォルトの名無しさん
10/03/14 18:52:32
>>362
おまえさんが使っているコンパイラに聞いてみろ
366:デフォルトの名無しさん
10/03/14 19:05:19
>>245
ソース見たら、たぶん20行から28行までのところを、なんかしたら、なんかなるかもなぁ~~って気がしたんで、
そこのところをあてずっぽうでいじったら、456 って出た(^_^/わーい
ソースの、ここのところを
/* 各桁の数字を、有効な桁まで計算しておく */
for(i = 0, trunc = 0; i < 15; ++i) {
m = modf(n, &n);
buf[i] = (int)n;
n = m * 10.0;
↓
こういうふうに変えてみたです。あとはいっしょです
/* 各桁の数字を、有効な桁まで計算しておく */
double def = n; // ここと
for(i = 0, trunc = 0; i < 15; ++i) {
m = modf(n, &n);
buf[i] = (int)n;
n = ( modf( ((def+pow(10.0,-15)) * pow(10.0,i)), &n ) * 10.0 ); // ここ
わかんないけど、「誤差とかが、掛け算で、かける10ってのを何度もしてると、誤差がでるのかなぁ~」とかおもったので、
まいかい全部バ~~って、かける1000とかして一気にやったらどうかな?って思ってやったけどダメだったので、
しょうがないので0.00000......1 て小さい1足して、四捨五入しちゃえ~~ えいや~~ってやったら、なんか偶然456 ってなった。 よかった。
すいません、ぜんぜん知的じゃなくて(・_; 算数的な根拠はないです。なんかラッキー頼りですみません(orz はずぅ~~い
367:デフォルトの名無しさん
10/03/14 19:25:05
>>363
thx
368:デフォルトの名無しさん
10/03/14 20:40:38
C言語のことならなんでも聞いてくれるんですか。
369:デフォルトの名無しさん
10/03/14 20:50:21
難しいのはちょっと・・・
370:デフォルトの名無しさん
10/03/14 20:51:50
さあ願いを言え
どんな願いも一つだけ
聞き流してやろう…
371:デフォルトの名無しさん
10/03/14 22:05:45
いくらでも聞くよ
372:デフォルトの名無しさん
10/03/14 22:40:35
>>366
pow()のアルゴリズムを知っているか? 知っていればすぐに判ることだが非常に誤差が発生しやすい。
従って、第二パラメータが整数になるなら使わない方が無難。
後は、その分の計算量をどこでどう分散させるかだな。
373:デフォルトの名無しさん
10/03/15 01:32:38
いまだにミドルウェアっていうのがよくわからない
374:デフォルトの名無しさん
10/03/15 11:29:44
>>373
ミドルウェアってのはOSとソフトウェアの中間に値する物
ミドルウェア = DBMSって覚えておけばok
375:デフォルトの名無しさん
10/03/15 11:49:53
ヘッダファイルには全ての関数/変数に、extern/staticを付けなければならないんですか?
376:デフォルトの名無しさん
10/03/15 12:44:34
いいえ
377:デフォルトの名無しさん
10/03/15 12:50:48
>>375
そもそも、ヘッダファイルで定義をしてはいけません。
378:デフォルトの名無しさん
10/03/15 15:01:24
中間搾取w
379:デフォルトの名無しさん
10/03/15 15:04:54
元ダフ屋が金券ショップになりやがて中央銀行になったようなもの
380:デフォルトの名無しさん
10/03/15 21:58:35
>>338
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char** argv ) {
char str[0xFF]; double n[1000]; int n_max = 0; int i=0;
FILE* fp = fopen( argv[1], "r"); while( fgets(str,0xFF-1,fp) != NULL ){ n[n_max++]=strtod( str, NULL ); }
srand((unsigned)(time(NULL)));
while( i < 5 ) { int r = rand()%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}
くじびき的な何か?
381:デフォルトの名無しさん
10/03/15 22:02:18
↑
fopen、fscanf、for、ifのみを使って
という条件を満たしていない気がするのだが、いいのか。
382:デフォルトの名無しさん
10/03/15 22:10:58
うむ、randが使えないのが難点だな
383:デフォルトの名無しさん
10/03/15 22:11:06
>>380
fgets()の第二パラメータの意味を誤解していそうだ。
384:デフォルトの名無しさん
10/03/15 22:45:47
せめて現在時刻がわかれば乱数のように使えるのに
制限が厳しすぎる
385:デフォルトの名無しさん
10/03/15 23:27:10
__asm は使ってもいいですか? 関数じゃないからいいよね?
386:デフォルトの名無しさん
10/03/15 23:53:32
乱数の代わりに初期化していない自動変数の中身を読むってのは無し?
387:デフォルトの名無しさん
10/03/16 00:14:56
厳密なことをいうと、十分にランダムである保証がない
特に乱数や、乱数の種、ましてや暗号関係で使うのは厳禁
あと初期化されていない変数って、規格上は読んでいいんだっけ?
388:デフォルトの名無しさん
10/03/16 00:18:33
定義されていないだけで、読むのは別にいいんでない
389:デフォルトの名無しさん
10/03/16 00:39:10
>>381
#include <stdio.h>
#include <stdlib.h>
static double s;
static int rnd(void){ int p; if(s>1e+8){s*=1e-4;}; if(s<0){s*=1e+8;} s += 0.1*s; return((s<0.0)?-s:s); }
void main(int argc, char** argv ) {
char str[0xFF]; double n[1000]; double d; int n_max = 0; int i=0;
FILE* fp = fopen( argv[1], "r"); for( ; fscanf( fp, "%lf", &d ) != EOF ; ){ n[n_max++]=d; }
s=((double)((long)&str)); rnd();
for( i=0; i<5 ; ){ int r = rnd()%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}
な、なんか意味あんのん?… この制限て…(・_; ばたり…
390:デフォルトの名無しさん
10/03/16 00:43:09
もうひとつ制限がありました。7行で書いてください
391:デフォルトの名無しさん
10/03/16 00:47:44
改行しなきゃいいだけ
392:デフォルトの名無しさん
10/03/16 00:53:39
>>390
#include <stdio.h>
static int rnd(double* s){ int p; if(*s>1e+8){*s*=1e-4;}; if(*s<0){*s*=1e+8;} *s += *s*0.1; return((*s<0.0)?-*s:*s); }
void main(int argc, char** argv ) {
double n[1000]; double d; int n_max = 0; int i=0; double s =(double)((long)&n); rnd(&s);
FILE* fp = fopen( argv[1], "r"); for( ; fscanf( fp, "%lf", &d ) != EOF ; ){ n[n_max++]=d; }
for( i=0; i<5 ; ){ int r = rnd(&s)%n_max; if( n[r] != 1e+306 ) { printf( "%f\n", n[r] ); n[r]=1e+306; i++; }}
}
もぅ寝まつ…(つ_\
393:デフォルトの名無しさん
10/03/16 01:08:23
>>338
これでどうだ
ウチでは実行するたびに結果が変わったよ
#include<stdio.h>
#define DATA_NUM 1000
int main(void)
{
unsigned long rand_pool[DATA_NUM], rand_num[5];
int value[10], i, index;
FILE *fp;
if((fp=fopen("hoge.txt", "r"))==NULL) return 1;
for(i=0;i<10;i++) if(fscanf(fp, "%d", &value[i])!=1) return 2;
for(i=0;i<DATA_NUM;i++) rand_num[i%5]^=rand_pool[i];
for(i=0;i<5;i++)
{
index=rand_num[i]%(10-i);
printf("%d\n", value[index]);
value[index]=value[10-1-i];
}
return 0;
}
394:デフォルトの名無しさん
10/03/16 02:27:07
回答が知りたい。
こんな問題を出した意図とか。
どうせ>>338が問題を書き間違えて重要な情報が抜け落ちてたってオチだろうけど。
395:デフォルトの名無しさん
10/03/16 16:26:46
関数で参照渡しするときの所作を詳細に教えてくささい
396:デフォルトの名無しさん
10/03/16 16:30:29
まず、参照渡しの定義をしてから質問してください
397:デフォルトの名無しさん
10/03/16 16:36:06
C言語では参照渡しはできません
JAVAを使いましょう
398:デフォルトの名無しさん
10/03/16 16:37:08
もどきはできるじゃん
399:デフォルトの名無しさん
10/03/16 16:37:44
ポインタによる間接参照
400:デフォルトの名無しさん
10/03/16 22:08:09
>>395
洒落じゃね?
401:デフォルトの名無しさん
10/03/16 22:45:29
sprintfを使って整数から文字列に変換しようとするとき
"%04d",i みたいに前をゼロで埋める指定で、0で埋める個数って変数にできないんですかね?
402:デフォルトの名無しさん
10/03/16 22:49:04
*
403:デフォルトの名無しさん
10/03/16 23:05:00
なるほど、%0*d , (int) , i でいけました
ありがとうございます
404:デフォルトの名無しさん
10/03/17 23:08:23
超初心者ですがよろしくお願いします。
Macでも使えて軽いコンパイラってありますか?
405:デフォルトの名無しさん
10/03/17 23:26:55
gccでいいだろうに
406:デフォルトの名無しさん
10/03/18 06:44:00
軽いコンパイラって、どんなコンパイラだよ。
407:デフォルトの名無しさん
10/03/18 14:35:10
じゃ軽いライブラリで
408:デフォルトの名無しさん
10/03/18 15:30:45
俺の作ったコンパイラすごいぜ。
5年前のノートPCなのに、円周率計算させると2秒で5億桁まで出力する。
VisualStudio2008ってソフトなんだけど。
409:デフォルトの名無しさん
10/03/18 15:42:31
ネタだろうけど、GMPより糞速いじゃん
URLリンク(gmplib.org)
410:デフォルトの名無しさん
10/03/19 00:39:07
gccでプログラム作ってます。
例えば、buff=(char *)malloc(sizeof(char) * 10);とメモリを確保したあと
配列が不足するたびにreallocでメモリを増やしていこうと考えてます。
buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。
そこで悩んだのですが、ある時点でbuffにどれくらいメモリが割り当てられてるか
確認する方法ってないですか?
「* 10」を「* i」みたいに変数を使って確認するしかないんでしょうかね?
411:デフォルトの名無しさん
10/03/19 00:41:37
サイズを保存するしか無いよ
412:デフォルトの名無しさん
10/03/19 00:46:46
>>411
ありがとう。そうします。
413:デフォルトの名無しさん
10/03/19 01:11:33
>>410
> buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。
出たよ。メモリ確保できないときにリークが確定するパターン。
初心者に realloc() 教えるとすぐこれをやらかす。
414:デフォルトの名無しさん
10/03/19 01:16:08
鬼の首でも取ったのか?
喜びすぎだろ
415:デフォルトの名無しさん
10/03/19 01:20:57
喜んでるわけが無いだろjk
うんざりしてるんだよ。
416:デフォルトの名無しさん
10/03/19 02:32:19
#include <stdio.h>
#include <stdlib.h>
// 構造体 B
typedef struct tagB { int max_size; char* buff; } B;
// B を初期化する命令
void B_init( B* b ) { b->max_size=10; b->buff =(char*)malloc(sizeof(char) * b->max_size); }
// B のメモリを10ふやす命令
void B_realloc( B* b ) { b->max_size += 10; b->buff = (char*)realloc( b->buff, sizeof(char) * b->max_size ); }
// Bに char を一文字セーブする命令 ( B の buff が短かったら自動的に伸ばしてくれる )
void B_write( B* b, char c, int index ) { if( index >= b->max_size ){ B_realloc(b); B_write( b, c, index ); } b->buff[index] = c; }
// Bから char を一文字ロードする命令 ( B の buff が短かったら自動的に伸ばしてくれる )
char B_read ( B* b, int index ) { if( index >= b->max_size ){ B_realloc( b ); B_read( b,index ); } return( b->buff[index] ); }
void main() { B b; B_init( &b ); B_write( &b, 'A', 12345 ); printf("%c\n", B_read( &b, 12345 ) ); }
おこられそう…w(^_^
417:デフォルトの名無しさん
10/03/19 02:52:10
>>416
怒りはしないが、ダメダメ。
ロードする関数でrealloc()しても、増えた領域に何にも書いてないから不定値が返るぞ。
それに、セーブする方も任意のindexを指定できるのに一度に伸ばせるのが高々10文字だから簡単に範囲外書き込みになってしまう。
それに、sizeof(char)なんて無意味なことは書くべきじゃない。
418:デフォルトの名無しさん
10/03/19 02:55:55
>>413
出たよ。問題の本質と関係ない話をする奴。
buffの宣言がないじゃん、と言ってるのと同レベルだぜそれ。
初心者じゃなくなったと思い込んでる初心者はすぐこれをやらかす。
419:デフォルトの名無しさん
10/03/19 02:56:52
そもそも、メモリ確保ができなくなる心配をする前にすることがあるだろうと。
420:デフォルトの名無しさん
10/03/19 02:57:08
その程度のサイズでrealloc使うとか、何の冗談だよw
421:デフォルトの名無しさん
10/03/19 03:00:21
足りなければ倍にするというやんちゃな方式が時として功を奏することもあるよ
とりあえず、ポインタを元にアロケーションしているサイズを知ることはできないので他で管理しましょう
>>420
ええと。
422:デフォルトの名無しさん
10/03/19 09:12:57
どうしても必要ならともかく、入門レベルでrealloc使わせるのはどうかと思うが。
余裕をもとって大きめに領域確保するほうがよっぽどマシ。
423:デフォルトの名無しさん
10/03/19 09:15:29
>>413
すぐそのあとに、if (buff == NULL) exit(1); と書けば問題なし。
メモリ不足なら、ほかのところだってまともに動くわけないんだから。
424:デフォルトの名無しさん
10/03/19 09:32:48
>>422
それはそれでイヤン
425:デフォルトの名無しさん
10/03/19 11:07:20
>>424
サイズをオーバーするかどうかちゃんとチェックするならありじゃね?
426:デフォルトの名無しさん
10/03/19 14:55:30
>>425
オーバーしそうになったらどうすんの?
427:デフォルトの名無しさん
10/03/19 15:50:24
>>426
・ごめんなさい、私には無理です
・オーバーする分はなかったことにしていいよね
どちらでもお好きに。
428:デフォルトの名無しさん
10/03/19 16:08:53
一行が長いテキストファイルを開くと落ちるエディタ
一行が長いと後ろのほうが切り捨てられるエディタ
どっちもいやだなぁ
429:デフォルトの名無しさん
10/03/19 16:10:43
4G以上のファイルとかどうやって扱ってんのか気になる