C言語なら俺に聞け(入門編)Part 61
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/03/05(金) 23:27:18★前スレ
C言語なら俺に聞け(入門編)Part 60
http://pc12.2ch.net/test/read.cgi/tech/1264920499/
★過去スレ
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
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 134代目
http://pc12.2ch.net/test/read.cgi/tech/1263824755/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0002デフォルトの名無しさん
2010/03/05(金) 23:30:36/ ,.―`.ヽ
/ | /:/: :ィ: : : : :\
/ .f⌒h/`:/l:/^\:/l:/: :|` ゲ な
〈 _! l /ムl: :/ _ '^jノ| ソ .ん
_| 人_|: l ,, ̄ =l: |,_ ?. で
{:::_~,.:::}」: |. 「 7 '''}!::::|__
/ /.,.=、|:!:.ト . l_/ ,.ィ_└┐:|__
( └勹ノl:| |\、 // '|!�V〉\;/
0003デフォルトの名無しさん
2010/03/05(金) 23:42:31局所変数は関数呼び出し時に、スタック領域に確保されるということでおkですよね。
局所変数の大きさはソース見ればわかる、という回答者の方もいますが
実行時にソースを読んでいるわけではないですよね。
そうするとコンパイル時に大きさを求めて、そんで実行時、スタック領域に
局所変数に必要な大きさのフレームを確保する必要があると思うのですが
その大きさは、、、やはりどこから求めているのかわかりません。
0004デフォルトの名無しさん
2010/03/05(金) 23:43:51コンパイル時に変数の個数はわかってるだろ。
0005デフォルトの名無しさん
2010/03/05(金) 23:46:19局所変数は関数内で有限個だから、コンパイル時に種類と個数を(どうにかして)数え上げれば、スタック上に準備すべきサイズもわかります。
実行時に求めるわけではありません。コンパイル時に判明することです。
0006デフォルトの名無しさん
2010/03/05(金) 23:51:41ばっちりわかってないと、コンパイルできないだろ。
C99は実行時に配列の長さを指定できるけど、べつにそういうの気にしてるわけじゃないよな。
質問者は。
0007デフォルトの名無しさん
2010/03/05(金) 23:52:20> スタック上に準備すべきサイズもわかります。
それはコンパイル時に判明したサイズですよね。
実行時もそのサイズを知る必要があると思うのですが、どこにあるのですか。
実行バイナリファイルにあるのでしょうか。
プロセスの仮想空間にロードされた後もわかるのでしょうか。
0008デフォルトの名無しさん
2010/03/05(金) 23:56:32スタックの大きさは決めうち
コンパイルオプションで変えられる
実行時に呼ばれた関数が必要としている分だけ
スタック領域を準備しようとするけど実行時に不足していればスタックオーバーフローで止まる
再帰関数で油断してたり、巨大な配列を自動変数で確保しようとしたりするとよく起こること
0010デフォルトの名無しさん
2010/03/06(土) 00:00:56コンパイル時に自動変数に必要なサイズが判明しておれば、それにしたがってスタックポインタを変化させるコードをコンパイル時に生成すればいいのでは。
実行時にあらためて自動変数のサイズを求める必要はないはずです。仮想メモリの話は関係ないと思います。
0011デフォルトの名無しさん
2010/03/06(土) 00:06:08http://homepage1.nifty.com/~sha_w/masm/model.html
このページのPROC 〜 ENDPのところにスタックフレームを作ってるアセンブラのコードが
あるでしょ。
add sp, 0FFFCh ;ローカル変数領域の作成
のところで、たとえば、intの変数が三つあったら、add sp, 12 ってコードが生成される。
それだけの話。
0012デフォルトの名無しさん
2010/03/06(土) 00:06:37つまり、局所変数のサイズが300バイトだとしたら
スタックポインタ = (現在の)スタックポインタ + 300バイト + その他情報の大きさ
みたいな命令を、関数呼び出し毎にしているってことなのでしょうか。
質問ばかりですみません。
0013デフォルトの名無しさん
2010/03/06(土) 00:07:42まちがえた。add sp, -12 だな。
0014デフォルトの名無しさん
2010/03/06(土) 00:08:26なるほど。少し納得しました。
これで寝られそうです。みなさん、ありがとう。
0015デフォルトの名無しさん
2010/03/06(土) 00:34:25http://fx.104ban.com/up/src/up13600.jpg
0016デフォルトの名無しさん
2010/03/06(土) 00:38:03みゃくらくもなくグロ
0017デフォルトの名無しさん
2010/03/06(土) 00:39:170018デフォルトの名無しさん
2010/03/06(土) 00:44:480019デフォルトの名無しさん
2010/03/06(土) 01:25:51とにかくグロ注意
みゃくらくは不明だが...
(誰か削除依頼したほうが良さげ)
0020デフォルトの名無しさん
2010/03/06(土) 01:34:210021デフォルトの名無しさん
2010/03/06(土) 01:36:47すまんwwww
これで許してwwwhttp://img.f.hatena.ne.jp/images/fotolife/g/gatinko-uragazou/20080315/20080315232919.jpg
0022デフォルトの名無しさん
2010/03/06(土) 01:38:490023デフォルトの名無しさん
2010/03/06(土) 09:14:42しかし、なんでここまで気にするんだろ?
0024デフォルトの名無しさん
2010/03/06(土) 12:13:050025デフォルトの名無しさん
2010/03/06(土) 12:45:360026デフォルトの名無しさん
2010/03/06(土) 15:05:44ここまで気にする人だから、Cを学ぼうとしているんだろう。
低レベルに興味ない奴はVBとかJavaに行くだろ。
0027デフォルトの名無しさん
2010/03/06(土) 15:09:150028デフォルトの名無しさん
2010/03/06(土) 15:14:130029デフォルトの名無しさん
2010/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 );
という問題があったとして、答え合わせの解答集を無くしてしまったとして、答え合わせにこまってます。
ここの住人の方々は、みんな超スーパーハカーぞろいだという噂を聞きました。
どうか皆様がたのウルトラハイパー知識をくしして、この超難問の答えを導き出していただけませんでしょうか…! よろしくおねがいします。
0030デフォルトの名無しさん
2010/03/06(土) 15:44:535
6 int i=10;
7 do{
8 *(a+i-0) *= 0x3L; *(a+i-1) *= 0x3L;
9 i--; i--;
10 }while( i > 0 );
すみません、こうでしたw
0031デフォルトの名無しさん
2010/03/06(土) 15:47:43まだ間違ってるんじゃね?
0032デフォルトの名無しさん
2010/03/06(土) 17:00:02なんでお前に命令されなきゃいけないわけ?
0033デフォルトの名無しさん
2010/03/06(土) 17:23:150034デフォルトの名無しさん
2010/03/06(土) 17:36:02ごめんな。
0035デフォルトの名無しさん
2010/03/06(土) 17:46:26そもそも仮定からしておかしい
0036デフォルトの名無しさん
2010/03/06(土) 19:00:29>インラインアセンブラによるSSE3を駆使したコード
どういう頭の構造だと、これが C の質問だと思えるのかと。
0037デフォルトの名無しさん
2010/03/06(土) 19:38:27void (*func)(void) = sayHello;
このとき、'func()' と '(*func)()' の違いって何ですか?
結果は同じなのですが...
0038デフォルトの名無しさん
2010/03/06(土) 19:47:52関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね?
もともとはどっちが正しいの?
282 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 01:06:42
元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、
世間に受け入れられたなんて話を聞いたことがある。
0039デフォルトの名無しさん
2010/03/06(土) 19:49:50ありがとう.
0040デフォルトの名無しさん
2010/03/06(土) 21:54:41int 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);
}
004140
2010/03/06(土) 21:57:233a={369c333333333333,368000000000000,b036000000000000,9d02000000000000,69b0000000000000,369c000000000000,368000000000000,b036000000000000,9d02000000000000,69b0000000000000}
3a={369c333333333333,368000000000000,b036000000000000,9d02000000000000,69b0000000000000,369c000000000000,368000000000000,b036000000000000,9d02000000000000,69b0000000000000}
ってなりました… 意味が分かりません… 動くはずないのに… なんで動いてるんですか…(orz
0042デフォルトの名無しさん
2010/03/06(土) 22:57:36dirなどのコマンドを呼び出す方法を教えて欲しいです。
仮に代替できるWin32APIやC言語の関数があったとしても、dirを直接呼び出す方法を教えてください。
よろしくお願いします。(dir以外の他のコマンドも将来的に呼び出したいため)
環境はWindowsNTだけサポートしてれば大丈夫です。
0043デフォルトの名無しさん
2010/03/06(土) 23:08:33winexeとか
dirだけでいいならopendirとか
0044デフォルトの名無しさん
2010/03/06(土) 23:41:000045デフォルトの名無しさん
2010/03/07(日) 00:28:51DOS画面出さず出力をメモリに入れられる
0046デフォルトの名無しさん
2010/03/07(日) 01:03:39つスレタイ
0047デフォルトの名無しさん
2010/03/07(日) 07:59:22どっちも定数を定義するんだよね?
0048デフォルトの名無しさん
2010/03/07(日) 08:47:35http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q128719177
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200510/05100021.txt
0049デフォルトの名無しさん
2010/03/07(日) 10:20:16作ってくださいお願いします
0050デフォルトの名無しさん
2010/03/07(日) 10:23:470051デフォルトの名無しさん
2010/03/07(日) 10:37:04define ・・・最も古くから使われている
enum ・・・ヒゲさん曰く見えない圧力に押されて追加、いまいちらしい
const ・・・禿と共同開発
定数を返す関数という手もあり
これが実は最も融通が利く
0052デフォルトの名無しさん
2010/03/07(日) 10:55:25だからマクロとして使えるし、関数丸ごとdefineしてみるとか変なこともできる
__LINE___や__TIME___みたいなコンパイル時に決まるやつもある
事項時はもうすでに置き換わっているのでaaaaとかって名前でdfineしてデバッカでaaaa探してもない
constはメモリ上に固定でそいつがずっといるだけ
つまりデバッカで値も見れる
0053デフォルトの名無しさん
2010/03/07(日) 10:55:26これ↓も似たような質問かな?
C言語のdefineとグローバル関数について - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1237313677
0054デフォルトの名無しさん
2010/03/07(日) 10:57:160055デフォルトの名無しさん
2010/03/07(日) 10:59:460056デフォルトの名無しさん
2010/03/07(日) 11:00:500057デフォルトの名無しさん
2010/03/07(日) 11:12:236ビット目が1になったら他のビットが1でも0でも関係なく特定の処理をする動作はどのようにすればよいでしょうか。
0058デフォルトの名無しさん
2010/03/07(日) 11:17:020059デフォルトの名無しさん
2010/03/07(日) 11:17:36特定の処理
}
0060デフォルトの名無しさん
2010/03/07(日) 11:36:45という問題は、ループ制御構造(whileやfor)を使わずに、という意味でいいのかな?
関数の再帰呼び出しでもできそうだけど、goto文使ったらだめ?
0061デフォルトの名無しさん
2010/03/07(日) 11:38:53それはCの問題ではなく日本語の問題じゃね?
どういう意図で書いたのかを書いた人に聞けよ
0062デフォルトの名無しさん
2010/03/07(日) 11:43:04このホワイトボードプログラミングのところ:
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;
}
0063デフォルトの名無しさん
2010/03/07(日) 11:47:310064デフォルトの名無しさん
2010/03/07(日) 11:49:50だったら「ループを使わずに」じゃなくて「再帰を使って」、と書けばいいのに。。
0065デフォルトの名無しさん
2010/03/07(日) 11:51:03Cというよりは関数型言語でやらせるような問題
0066デフォルトの名無しさん
2010/03/07(日) 11:52:09答え出てるぞ
* ループを使わずに配列の順序を逆にする。
答え:順次、配列を画面に表示して行ってオペレーターにメモさせておき、
メモした値を逆順に入力するよう促すダイアログを出す。
0067デフォルトの名無しさん
2010/03/07(日) 13:21:02参考サイトがあれば紹介して頂きたいです。
0068デフォルトの名無しさん
2010/03/07(日) 13:30:160069デフォルトの名無しさん
2010/03/07(日) 13:34:37VC そのものなら Xen という手もある
0070デフォルトの名無しさん
2010/03/07(日) 13:35:53その画像が矩形なのか矩形以外の多角形なのかで変わる
>68
Anjuta, Emacs, Geany
0071デフォルトの名無しさん
2010/03/07(日) 13:38:38矩形を想定しています。
0072デフォルトの名無しさん
2010/03/07(日) 13:44:12ドラッグして範囲選択みたいな感じ?
考え方っていうか、サンプルコード見たほうが早いんじゃない?
マウスダウンのイベントでマウスカーソルをキャプチャして、マウスの
ボタンが離されたれらそこまでが選択範囲だけど。
0073デフォルトの名無しさん
2010/03/07(日) 13:49:130074デフォルトの名無しさん
2010/03/07(日) 13:53:45一定の矩形の範囲内をクリックすることで、処理が行われるようにしたいと
思っています。
0075デフォルトの名無しさん
2010/03/07(日) 13:58:16確かやねうさんはビット演算でやっていたな
自分で紙に矩形とポイントを描いて条件を考えてみれば自ずと答えが見えてくるよ
0076デフォルトの名無しさん
2010/03/07(日) 14:20:51矩形の上境界線と下境界線の間にマウスの縦座標があって
左境界線と右境界線の間にマウスの横座標があればいいだけじゃないの?
0077デフォルトの名無しさん
2010/03/07(日) 14:30:090078デフォルトの名無しさん
2010/03/07(日) 14:30:29むかしBMPファイル(って予備領域とか拡張可能になってるから)に勝手にホットスポットっていうか
クリック可能位置を付け足してクリックすると話が進む紙芝居、見たいなの作った
言語も環境も書いてないからあれだけど
クリッカブルマップ、とかでググってみるとなんとかくやり方わかると思うよ
あとは環境しだいで同じ様な事を違うやり方でやれば
0079デフォルトの名無しさん
2010/03/07(日) 14:44:28全て参考にさせて頂きます。
0080デフォルトの名無しさん
2010/03/07(日) 15:18:45>>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 こんど算数の先生に聞いてみまーす。
0081デフォルトの名無しさん
2010/03/07(日) 15:22:250082デフォルトの名無しさん
2010/03/07(日) 16:35:50#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;
}
0083デフォルトの名無しさん
2010/03/07(日) 21:51:15下手をすればスタック領域が蓄積されていってメモリ不足に陥りますよね。
再帰を使わなくても他に解決できる手段があればみなさんはどちらを選択しますか
0084デフォルトの名無しさん
2010/03/07(日) 21:54:10間違いが少ないほう
0085デフォルトの名無しさん
2010/03/07(日) 21:56:59問題領域そのものが再帰的なら可読性と保守性があがる
C言語ではあまり利点がないので他の手段で頑張る
関数型言語とかだとまた別の話しになる
0086デフォルトの名無しさん
2010/03/07(日) 22:10:59利便性っていうか、再帰的な処理は再帰で書いた方がわかりやすいな。
0087デフォルトの名無しさん
2010/03/07(日) 22:11:17逆に再帰で書いているのを繰り返し制御などで書き直す方が頭良さげ
最近再帰使ったのはビット単位でファイルに書き込む関数の下請け関数だわ
0088デフォルトの名無しさん
2010/03/07(日) 22:28:25そのことにより再帰アルゴリズムを使うのに比べて20ナノ秒も実行時間が改善される
どうしても再帰なんつう場面は数年に一度
それ以外は、再帰アルゴリズムがぱっとわからないと馬鹿にされるという理由だけで使用する
プログラマってそんなもん
0089デフォルトの名無しさん
2010/03/07(日) 22:52:19可読・保守性があがるという利点は納得です。
逆にプログラマが再帰プログラムを創り出すほうが大変そう。
階乗求める以外に再帰を使ったほうがいいケースは思いつきにくいですね
0090デフォルトの名無しさん
2010/03/07(日) 22:53:103D オブジェクトを扱うときは必須だよ
0091デフォルトの名無しさん
2010/03/07(日) 22:54:050092デフォルトの名無しさん
2010/03/07(日) 23:00:410093デフォルトの名無しさん
2010/03/07(日) 23:01:26ディレクトリをおりていく処理とか、ループで書くとめんどくさいだろ。
0094デフォルトの名無しさん
2010/03/07(日) 23:12:27教材的な意味だろ
0095デフォルトの名無しさん
2010/03/07(日) 23:46:110096デフォルトの名無しさん
2010/03/07(日) 23:47:170097デフォルトの名無しさん
2010/03/07(日) 23:56:03自コードと同じスタックでライブラリ的利用させてもらう場合特に
0098デフォルトの名無しさん
2010/03/08(月) 00:55:01「お、スタックが空いてる再帰でなんとかしろ」とかあるよ
0099デフォルトの名無しさん
2010/03/08(月) 01:18:44再帰だとシンプルに書けるものはたくさんある。
もちろんスタックオーバーフローには注意が必要だけど、
プログラマの差ってのはこういうところから来るんだと思う。
例えば、テキストファイルの行を逆順に出力する(いわゆるtacコマンド)
を作ろうとすると、再帰だとこんなにシンプル
#include <stdio.h>
void rev()
{
char buf[1000];
if(fgets(buf, 1000, stdin) != 0) {
rev();
fputs(buf,stdout);
}
}
main() {
rev();
}
0100デフォルトの名無しさん
2010/03/08(月) 01:21:16再帰関数で大きな自動変数の配列を使うのはナシだろ
0101デフォルトの名無しさん
2010/03/08(月) 01:25:220102デフォルトの名無しさん
2010/03/08(月) 01:50:03これは再帰の悪い例としていつか使わせてもらう
0103デフォルトの名無しさん
2010/03/08(月) 02:14:39文字列の中から、正規表現によって単語検索をする場合、正規表現の文字列の並びを、配列から、一旦、順序木の構造に変換してしまって、
木のノードを順番に辿りながら、文字列を検索していくと、一連の検索を、共通の操作であつかえて簡単だとおもいます。
たとえば括弧で囲まれて1まとめになった複数条件も、あるノードの子としてまとめて、”あるノードの子というひとまとまりの単位”であつかえるので、
たとえば単純な ”A" という条件も、複雑な ”[AかBかC]”みたいな括弧で囲まれた条件も、どちらも同一の「”このノード”を使って検索する」という操作で扱えます。
これが再帰を使って得られる簡単さという恩恵だと思います。 簡単に素直にするために再帰を使うんだと思います。
たとえば括弧に囲まれた複数文字も、囲まれてない単一文字も、どちらも同じように考えて検索できるのだから、
木がどんなに複雑な形をしてても、逆にどんなに単純な形だとしても、
どちらも同じ要領で「”このノード”を使って検索する」という共通の操作だけで最後まで処理できます。
この順序木を巡っていくという操作を、単一のループだけでやろうとすると、
「さまざまな形の木を想定」して、それぞれに専用の動作を書いたりするケースが出てきやすいと思います。
(たとえば "A"の場合と "[AかBかCか]"の場合とでの動作の違いを、「わざわざ専用に用意」しないといけいない。などのメンドクササ。
これがループだけでやる場合のメンドクササだと思います。)
だけど、純粋に繰り返しの処理速度だけでみれば、やっぱり for ループみたいなモノの方が優れてるような気がします。よく知りませんが。
普通はループで十分事足りるので、たとえば「シンプルな int[1000] の配列全部に0を代入する」だけのことに、わざわざ再帰を使う必要は無いと思うし、
無理やり再帰なんか使ったら、逆に、わかりづらくなるだけだろうし、わかり辛いとミスも増えますし。
あたりまえですけど、「より簡単に、より素直に書ける方」を選んで使えばいいだけのことかとおもいます。どっちも便利だとおもいます。
0104デフォルトの名無しさん
2010/03/08(月) 04:41:46この場合反則になるんで)できる位の力量が無いのに
再帰(間接再帰を含む)を使いまくったコードを書くと
後で地獄を見る可能性も視野に...
0105デフォルトの名無しさん
2010/03/08(月) 05:08:48よく分からん縛りだけど
人に強要するのは勘弁してね
0106デフォルトの名無しさん
2010/03/08(月) 05:11:09どこがスタック積まれるか判らないし、スタックオーバーフローもいつ起こるか特定できない。
0107デフォルトの名無しさん
2010/03/08(月) 07:41:46逆順にならない。
0108107
2010/03/08(月) 18:48:090109デフォルトの名無しさん
2010/03/08(月) 18:51:24手元にあるテキストは、1行当たり数キロバイトとか逆に数十万行とか普通にあるんだが。
まぁ発想方法としては、悪くないんだけどね。
0110デフォルトの名無しさん
2010/03/08(月) 18:58:51それでもファイルサイズが大きすぎると面倒だけど。
tacコマンドは、ファイルの末尾にseekしてから表示しているな。
seekできないストリームに対しては、テンポラリファイルにコピーしてから。
まあちゃんと読んだわけではないから詳しくは知らないけど。
0111デフォルトの名無しさん
2010/03/08(月) 20:21:44ソースを見れる形でファイルを上げれるcodepadのようなアップローダって他にある?
なんか似たような感じで見やすいところがもう一つあった気がするんだけど
0112デフォルトの名無しさん
2010/03/08(月) 20:27:44ここ?
0113デフォルトの名無しさん
2010/03/08(月) 20:32:06codepadみたいにソースが表示されてdownloadボタンが付いてる感じで
0114デフォルトの名無しさん
2010/03/08(月) 20:35:20ここ?
0115デフォルトの名無しさん
2010/03/08(月) 20:44:110116デフォルトの名無しさん
2010/03/08(月) 20:44:290117デフォルトの名無しさん
2010/03/08(月) 20:52:010118デフォルトの名無しさん
2010/03/08(月) 20:54:140119デフォルトの名無しさん
2010/03/08(月) 21:41:02void 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;
}
これでいいですか?
0120デフォルトの名無しさん
2010/03/08(月) 21:55:530121デフォルトの名無しさん
2010/03/08(月) 22:27:03まぁこの手の話題は定期的にあがるもんだけど
0122デフォルトの名無しさん
2010/03/08(月) 22:28:310123デフォルトの名無しさん
2010/03/08(月) 22:30:220124デフォルトの名無しさん
2010/03/08(月) 22:30:22わかれば簡単だと思うよ
0125デフォルトの名無しさん
2010/03/08(月) 22:30:56文法自体はかなり簡単な部類
ポインタで躓かなかったらな
0126デフォルトの名無しさん
2010/03/08(月) 22:32:030127デフォルトの名無しさん
2010/03/08(月) 22:33:37難しいともいえるしやさしいともいえる。
低機能の言語なので、文法自体はシンプルで覚えることは少ない。(やさしい?)
低機能の言語なので、なんかやろうとするとめちゃくちゃ手間がかかる。(難しい?)
0128デフォルトの名無しさん
2010/03/08(月) 22:39:03出来た方がいいに決まってるが、
そんな質問するアホには必要ない。
0129デフォルトの名無しさん
2010/03/08(月) 22:39:54読みやすいプログラムはそれ自体英文として読めるプログラムだから(俺流の解釈)
読みやすいプログラムを書くためには英語は必要。
英語のできない人が書いたプログラムは大変。
CにしてもJavaにしても英語圏の産物なんだな。
0130デフォルトの名無しさん
2010/03/08(月) 22:54:340131デフォルトの名無しさん
2010/03/08(月) 23:24:31こんなこというやつの変数や関数は長くてむかつく
ReadDataFromUserFileToImageBuffer()
みたいなやつ
あるいはアンダーバーでつなげてみたりして
今時補完機能があるからへいきだろう、とか言い出してさ
>読みやすいプログラムを書くためには英語は必要。英語のできない人が書いたプログラムは大変。
こういうこと言うやつは俺がnamaeみたいな変数とかyomikomi()みたいな関数作ると怒り出すよな
いいじゃん、日本人なんだから日本語にしただけで読みずらくなったりしないよ
と見ず知らずの129にすげえむかつく
0132デフォルトの名無しさん
2010/03/08(月) 23:26:24childs とか serch とか、ありえないスペルミスがあって、読みにくくてかなわん。
0133デフォルトの名無しさん
2010/03/08(月) 23:26:400134デフォルトの名無しさん
2010/03/08(月) 23:26:53日本語があやふやなお前が言っても説得力は無い
0135デフォルトの名無しさん
2010/03/08(月) 23:42:490136デフォルトの名無しさん
2010/03/08(月) 23:44:490137デフォルトの名無しさん
2010/03/09(火) 02:41:32ReadDataとToImageBufferが意味的にかぶってない?
UserFileというのもちょっと。
ReadImageFromFileじゃだめかい?
英文として読めるように、というのはよくある指針だね。
0138デフォルトの名無しさん
2010/03/09(火) 03:58:43とか書かれたらキレそう
0139デフォルトの名無しさん
2010/03/09(火) 05:21:39(※腐ったルールだとしても)を遵守しているなら、あまり気にしないレベル
0140デフォルトの名無しさん
2010/03/09(火) 07:16:23そうそう、こういう人
上記のやうは例じゃん、適当に作ったさ
それにたいしてまで、こんな事言ってくる
そういう点がむかつくんだって事
ReadImageFromFileじゃだめじゃん
長々と英文を関数名にしてるやつが居るよねって例としては短すぎる
ここは多少英語としておかしくても長くして置かないと駄目
0141デフォルトの名無しさん
2010/03/09(火) 07:17:31JYOHO のような適当ローマ字で書かれているのを見るとためいきが出る。
0142デフォルトの名無しさん
2010/03/09(火) 07:32:31readdata2
readdata3
readdataEX
readdataEX2
みたいにされるのもむかつく、混在してたりするとさらに
0143デフォルトの名無しさん
2010/03/09(火) 08:15:36関数名は英語とローマ字のどちらかに統一されていれば気にしない
混在してるとイラッとくるが
0144デフォルトの名無しさん
2010/03/09(火) 08:17:50シンプルだが単語のせいで長くなる場合は仕方ない
i18nのようにごまかすのもいいけど、やりすぎはよくない
複数の意味を含めた名前になるのならそれは関数化が足りない
0145デフォルトの名無しさん
2010/03/09(火) 10:05:36intもcharもbufだってそう
memcmpとかやっちゃうし
昔の本とかのソース見るとインデントもあって目を細めると螺旋模様のように見える
今のソースはBASICのようにブロック並べたみたい
0146デフォルトの名無しさん
2010/03/09(火) 10:09:310147デフォルトの名無しさん
2010/03/09(火) 10:35:16端末に表示できる文字数の問題もあったし、環境に合わせてその辺は変化していってもいいと思うんだ
0148デフォルトの名無しさん
2010/03/09(火) 11:45:10ソリュージョンのディレクトリの作成はオンにするのとオフにするのはどちらがよろしいのでしょうか?
参考に2つのサイトを見て勉強したいと思います
苦C http://9cguide.appspot.com/p_vc2005.html
猫 http://homepage2.nifty.com/c_lang/net2005/project.htm
苦Cでは特にオフにしろとは書かれてなく、猫のほうはオフにしろと書かれてましてオンとオフどちらにしたらいいのか分かりません
0149デフォルトの名無しさん
2010/03/09(火) 11:58:44どうしてもrisutoと書かなきゃいけないのか、listにしちゃいけないのか
そして無意識のうちにlistと書いちゃってコンパイルエラー
0150デフォルトの名無しさん
2010/03/09(火) 12:00:28両方やってみて違和感が少なかったほうにすればいいよ
0151デフォルトの名無しさん
2010/03/09(火) 12:01:36最初は確かにいろいろそわそわしたなぁと思い出したので追記
0152デフォルトの名無しさん
2010/03/09(火) 12:25:15オフにしてやってみます
0153デフォルトの名無しさん
2010/03/09(火) 12:26:20COBOL 屋かてめーわ
0154デフォルトの名無しさん
2010/03/09(火) 13:52:42コードの量が大きいので一つの変数の型を変更するとそれに関連するものを変更する作業が大変です。
例えばint型だったものを制度をよくしたいのでdouble型に変えたとします。
それに関連する関数の戻り値や引数、代入される変数等、膨大な数になってしまいます。
なにか自動で型を変換する方法ってありませんか?
0155デフォルトの名無しさん
2010/03/09(火) 15:09:540156デフォルトの名無しさん
2010/03/09(火) 15:33:170157デフォルトの名無しさん
2010/03/09(火) 15:42:44見ながら1こ1こかえるしかねーべ、そういうものとあきらめて
0158デフォルトの名無しさん
2010/03/09(火) 15:47:01javascriptで作って、それをコードメンテに使ってるみたい
dehydraとかいうやつだっけか
0159デフォルトの名無しさん
2010/03/09(火) 16:08:52釣りかい?
0160デフォルトの名無しさん
2010/03/09(火) 16:14:02(x == y)みたいなのは、型を変えただけじゃだめだしなぁ
結局>>157しかないな
0161デフォルトの名無しさん
2010/03/09(火) 16:21:18自動でやるのはとても不可能だろうなあ。
0162デフォルトの名無しさん
2010/03/09(火) 16:22:10. /////_ハ ヽ< 釣れた!> ハ
レ//j け ,fjlリ / ∨∨V ヽ h. ゚l;
ハイイト、"ヮノハ // |::: j 。
/⌒ヽヾ'リ、 // ヾ、≦ '
. { j`ー' ハ // ヽ∧∧∧∧∧∧∨/
k〜'l レヘ. ,r'ス < 初めてなのに >
| ヽ \ ト、 ヽ-kヾソ < 釣れちゃった!>
. l \ `ー‐ゝ-〈/´ / ∨∨∨∨∨∨ヽ
l `ー-、___ノ
ハ ´ ̄` 〈/‐-、
0163デフォルトの名無しさん
2010/03/09(火) 16:32:510164デフォルトの名無しさん
2010/03/09(火) 16:35:48アルゴリズムとデータ構造が少ない希ガス
0165デフォルトの名無しさん
2010/03/09(火) 16:41:12コマンドラインオプションでの整数取得・切り分けがうまくいかないです。
助言お願いします。
0166154
2010/03/09(火) 16:59:15全intをfloat(double)に変換するとか強引な方法をとってはダメでしょうか?
0167デフォルトの名無しさん
2010/03/09(火) 17:04:35なんでそんなことわかるの?
でもきっとコンパイルエラーがわんさか出るだろうな
sprintfとかの辺とかビット演算の辺とかまずそう
switch文とかもまずそう
サイズをsize_tじゃなくてintでやってるところとかあればまずそう
戻り値をintでエラーで分岐してたらまずそう
0168デフォルトの名無しさん
2010/03/09(火) 17:04:560169デフォルトの名無しさん
2010/03/09(火) 18:19:45void hack(void){
printf("実行可能\n");
exit(0);
}
void func(void){
int iArray[2];
iArray[4] = (int)hack;
}
void main(void){
func();
}
VC++のDebugで、
どうしてこれが実行できてしまうのでしょうか?
0170デフォルトの名無しさん
2010/03/09(火) 18:42:090171デフォルトの名無しさん
2010/03/09(火) 18:44:52つ codepad
瞬殺でアドバイスが得られると思います。
0172デフォルトの名無しさん
2010/03/09(火) 19:15:010173165
2010/03/09(火) 19:53:43ttp://codepad.org/ESKYLo9R
うまい具合に引数を整数にしたいです。
例えば、
factor 123451234512345
のときも動いてほしいです。
OSはwindows vistaでコンパイラはgcc、バージョンは
gcc version 3.4.5 (mingw-vista special r3) です。
その時のint型(4bytes)の上限は +2,147,483,647 (10桁)です
0174デフォルトの名無しさん
2010/03/09(火) 20:23:07gmp みたいな多倍長整数ライブラリを使う
0175デフォルトの名無しさん
2010/03/09(火) 20:40:0720桁未満ならgccはlonglong使えるんじゃないか
0176165
2010/03/09(火) 21:15:02試してみます。
>>175
桁数を増やすのと、
例えばint型を使っていて、
引数argv[1]がその上限を超えたときに
エラーにしてくれるようなチェック方法を知りたいです。
0177デフォルトの名無しさん
2010/03/09(火) 21:45:35コマンドラインオプションの解析は getopt(3)でいいんじゃない?
自分で判定するのは面倒でしょ。
パラメタを整数にするのも、strtol とかstrtoll あたりでいいかと。
上限超えたらどうなるかは、man 見れば載ってると思う
0178デフォルトの名無しさん
2010/03/09(火) 23:12:10#define RED 1
#define BLUE 2
.....
#define YELLOW 100
と数百個定義しているのですが(全部定義しているわけではない)
結構順番を入れ替えます.そこでインクリメンタル的なものをつかえないかと思っているのですが,
よい方法ございますでしょうか?
よろしくお願いします.
0179デフォルトの名無しさん
2010/03/09(火) 23:14:010180デフォルトの名無しさん
2010/03/10(水) 16:36:160181デフォルトの名無しさん
2010/03/10(水) 16:37:55スタックは頻繁にアクセスされるためCPUキャッシュに乗った状態の可能性が高い
0182デフォルトの名無しさん
2010/03/10(水) 17:09:32C言語がやりくりする一定値のメモリがスタック。OSに問い合わせしないので解放取得が速い。
ヒープはOSに問い合わせる。
スタックもプログラム開始時にOSに問い合わせて取得する。
OSはこの二つの違いは認識しない。使われていなければ、スタックでもページアウトする。
0183デフォルトの名無しさん
2010/03/10(水) 17:12:31確保できたとしてスタックでも同じ程度の速度。
はじめに一定値を確保してあるか無いかの違いだけ。
0184デフォルトの名無しさん
2010/03/10(水) 17:13:310185デフォルトの名無しさん
2010/03/10(水) 17:28:47されるる時にOSに問い合わせます。
0186デフォルトの名無しさん
2010/03/10(水) 17:31:37vistaからはそうなったか。
0187デフォルトの名無しさん
2010/03/10(水) 18:12:17OSが許容するスタック上限値よりずっと低いスタック量で
プロセスを起動しても、行儀の良いプログラムだったら
問題がないんでそうしてるわけですね。
少し「仕事をする」(再帰とか使ってたり、ローカル変数に
配列とか大量に確保する)プログラムだったら当然それでは
足りないからスタックオーバーフローする。そのタイミングで
OSはスタックを追加してプロセスを停止させず続行するわけ
です。
0188デフォルトの名無しさん
2010/03/10(水) 18:30:49プログラムであることを望んでいるというわけですね
0189デフォルトの名無しさん
2010/03/10(水) 18:43:30MS-DOS Windwos3.1では区別はあったとおもうが。
Windwos3.1はスタックの固定領域を指定して使い切ったら駄目だった気がする。
0190デフォルトの名無しさん
2010/03/10(水) 19:00:26ほとんどのコンピュータでは、この空間にBIOS ROMやメモリマップドI/O、VRAMなどの空間も存在するため、
アクセス可能なメモリ空間は最大でも640KBから768KB程度であった。
ただし、バンクメモリやEMS、プロテクトメモリ(80286/386以降)等のコンベンショナルメモリ以外の領域・手段の利用が一般化していたため、
「貴重な」コンベンショナルメモリがこれらの領域によって圧迫されることはなかった。
日本語入力用のFEPなどの常駐型のデバイスドライバを使用すると一度に使用できるユーザーメモリはさらに減少するため、
ユーザーはEMSやXMS、HMAやUMBなどの拡張メモリの管理機能を利用して、
辞書や常駐部やMS-DOSシステムの一部をそれらへ配置し、コンベンショナルメモリの圧迫を少しでも避けることが重視されるようになった。
「とりあえず動く」という状態を作るだけであればエンドユーザーがこれらを直接操作する必要はほぼ無かったが、
「とりあえず」に飽き足らず無駄を省き最適な設定をするためには知見と試行錯誤が要求されるある種の職人芸的な資質が要求されたため、
これらの事情が「MS-DOSの環境設定は非人間的で困難なものであった」とする後世の評価を招く原因ともなった。
MS-DOS - Wikipedia
0191デフォルトの名無しさん
2010/03/10(水) 19:32:23デスクトップアプリケーションヒープ、非対話型サービスヒープの設定可能。
ここ変えないといくらメモリふやしても、メモリ不足改善しないことある。
0192デフォルトの名無しさん
2010/03/10(水) 20:22:20もので生成出来るコードでGUIアプリが作れるという
のが基本設計
8086ではスタックの動的変更を行う一般的
方法のCPUアーキテクチャーレベルのサポートは
殆ど無いしコンパイラでもサポートしている例は
皆無。
0193デフォルトの名無しさん
2010/03/10(水) 20:26:14スタックというのは、OSから見たら特別な領域でない。
スタックとヒープというのは、C言語(その他)から呼ばれているだけ。
どっちもOSに合わせたメモリ取得関数を呼び出して確保する。同じもの。
0194デフォルトの名無しさん
2010/03/10(水) 20:30:58いまのメモリ確保はどれ使っても、OSレベルでは結局は一通りのメモリ確保しかないだろ。
レジスタとかGPUとかは別。
0195デフォルトの名無しさん
2010/03/10(水) 20:39:53ありがとうございました.
うまくいきました.
0196デフォルトの名無しさん
2010/03/10(水) 21:20:04同じくらい環境依存なのに
startupコードやセクションの話になるとサクッと黙るんだよな
0197デフォルトの名無しさん
2010/03/10(水) 23:15:37WindowsはCPUレジスタそのものを管理しないって?
んなことない。ないからこそ他のプロセッサ向けに移植
されていない。初期のWinNT(4.0まで)はプロセッサ
が今のように分化してないから対応できたんだろうが
さすがに無理になってしまって現在はIntel以外は非対応
0198デフォルトの名無しさん
2010/03/10(水) 23:19:13スタックとヒープを区別して扱う命令はない。
OSではこれらの差はない。
0199デフォルトの名無しさん
2010/03/10(水) 23:19:18の互換性があるだけでメモリアーキテクチャーはIntel版とは全然違ってると考えたいね。HD非搭載なマシンでも動作させる必要がある
わけだから違って当然だけど
0200デフォルトの名無しさん
2010/03/10(水) 23:25:220201デフォルトの名無しさん
2010/03/10(水) 23:33:17alpha とかサポートやめた主な理由は商業的なことで
儲かるとなれば技術的な問題はどうとでもなったはず
0202デフォルトの名無しさん
2010/03/11(木) 01:06:16何を根拠にそういうこと言い切っちゃうの?
OSが無い環境もあるし、物理的にアクセス速度が違うメモリに振り分けられることもあるだろう。
結局は環境を絞らないと何も言えない。
0203デフォルトの名無しさん
2010/03/11(木) 02:11:180204デフォルトの名無しさん
2010/03/11(木) 02:36:130205デフォルトの名無しさん
2010/03/11(木) 02:55:40それが付いてないCPUでも、スタック、ヒープメモリは使えないといけない。
これより、C言語のスタックとヒープはソフトウェアとしての用語。
0206デフォルトの名無しさん
2010/03/11(木) 02:58:52スタックもヒープも同一のメモリ確保関数を使っているだろう。
すべてのコンパイラを知っているわけではないが。
CPUレジスタやCPUキャッシュのみをスタックに使う実装も出来ないことはないけど
ないんでは。
0207デフォルトの名無しさん
2010/03/11(木) 03:24:29呼んではいけない」
という意見には必ずしも賛成ではないが、付いていることを
前提とするかしないかでは、OSのカーネル開発の開発者の
集団力学には大きな影響が発生し、それがOS全体に
作業環境全体に与える影響力は計り知れず、スタック支援命令が
ついたプロセッサ上のOSしか知らない俺にとっては
とてもじゃないが反対だとも言えない。
0208デフォルトの名無しさん
2010/03/11(木) 04:07:46名前と動作は似ていても別物。
C言語のスタックメモリは複雑だろ。auto変数や関数呼び出しや再帰とか。
ハードウェアの機能に丸任せできないだろ。
0209デフォルトの名無しさん
2010/03/11(木) 04:14:510210デフォルトの名無しさん
2010/03/11(木) 04:23:33データ構造の総称的名称としてのスタックやヒープと
CPUが決定する「具体的な」ものとでは使われる
コンテクストが全く違うだろうな(特に範疇性)
同じ用語を用いていてもコンテクストが全く異なる
ので同じコンテクストで使われていると決めつける
と何かと混乱の原因になりやすい鴨
0211デフォルトの名無しさん
2010/03/11(木) 04:48:24マイナスや小数が誤判定されてしまいますが
これらも正しく数値と判定させるためには自前で関数用意するしかないのでしょうか。
0212デフォルトの名無しさん
2010/03/11(木) 04:52:39isdigitは数字かどうかを判定する(一般には)マクロ
なんで、数値かどうかの判定を一発でするのは
無理
受け取った文字列をsscanf等で数値に直したものを
人の目を通して確認してもらうのが一番
0.9994242123123232132という文字列を数値
に直したのを表示させた時に
0.9994242123123456789
となった場合にそれが問題なのかどうかは状況に
依存。
0213デフォルトの名無しさん
2010/03/11(木) 05:41:48atoiやatof等で不満なら自作するしかないね。
0214デフォルトの名無しさん
2010/03/11(木) 06:01:50sscanfだと"1xyz"みたいに先頭だけ数字の文字列も数値として通ってしまうなぁ・・
と試行錯誤してたらatofで完璧でしたどうもありがとうございます。
0215デフォルトの名無しさん
2010/03/11(木) 06:10:060216デフォルトの名無しさん
2010/03/11(木) 06:32:11べつに、auto変数や再帰や関数の引数で特別なことはやっていないし C 言語のスタックメモリが複雑とも思えませんけれども。
0217デフォルトの名無しさん
2010/03/11(木) 07:00:12じゃぁ、自作だね。
チェック関数だけ書いて後はatofに流すのが無難かなっと思うけど
用途や目的次第なのでお好きにどうぞ。
0218デフォルトの名無しさん
2010/03/11(木) 13:54:53#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;
}
0219デフォルトの名無しさん
2010/03/11(木) 15:01:300220デフォルトの名無しさん
2010/03/11(木) 18:54:28http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1137870116
これ、答えて下さいませんか?
0221デフォルトの名無しさん
2010/03/11(木) 18:56:35スライドショー フリーソフト でggrks
0222デフォルトの名無しさん
2010/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;
}
0223デフォルトの名無しさん
2010/03/11(木) 20:05:17多いのは大丈夫
不足するのはダメ
0224デフォルトの名無しさん
2010/03/11(木) 21:59:524バイト単位で大きさ調整しても意味なさそう。
0225デフォルトの名無しさん
2010/03/11(木) 23:24:21普通はビット演算を使うと思う
(size + 0x00000003) & 0xfffffffc
0226デフォルトの名無しさん
2010/03/11(木) 23:46:52それはsize_tが何バイトだと想定しているわけ
いや、むしろ何ビットといった方が良いのかな
0227デフォルトの名無しさん
2010/03/12(金) 01:10:36だな
0228デフォルトの名無しさん
2010/03/12(金) 01:54:07それなら、0xfffffffcを~(size_t)3にでもすればいいと思う。
0229デフォルトの名無しさん
2010/03/12(金) 02:32:040230デフォルトの名無しさん
2010/03/12(金) 02:41:42今のCPUだとコストに差はないのかな
(size + 3) >> 2 << 2
0231デフォルトの名無しさん
2010/03/12(金) 02:48:41意図をそのまま表現するのが良いとされるようになってきたような
0232デフォルトの名無しさん
2010/03/12(金) 02:59:550233デフォルトの名無しさん
2010/03/12(金) 03:35:43どんなに簡単な処理でもコメントがあった方が読みやすいし
とくに何年も前に書いたソースだと
0234デフォルトの名無しさん
2010/03/12(金) 15:01:25まさかとは思うが、こんなコードは書かんでくれよ。
++count; // カウントのインクリメント
0235デフォルトの名無しさん
2010/03/12(金) 15:08:47システムソフト開発の会社に入ってそろそろ10年。
サポートや試験担当ということもあって、
まったく言語というものを知らずに来ました。
最近、なんかまずいかな?
と思い始めて「猫C」を買って勉強しています。
でも、特に目的がないせいか、
この本やったあと次はなにを勉強すればいいかわかりません。
なにかおすすめの書籍があれば教えてください。
0236デフォルトの名無しさん
2010/03/12(金) 15:11:000237デフォルトの名無しさん
2010/03/12(金) 15:11:31実用で使われないやつやっても無用の長物
配置転換でリストラにならないように現場で使われる率高いやつ
0238デフォルトの名無しさん
2010/03/12(金) 15:13:50基礎が出来ても完成品が出来るまでの道のりは険しい
自分でした独習など焼け石に水状態
会社でやってるのをピンポイントでやるべき
0239デフォルトの名無しさん
2010/03/12(金) 15:17:38.NET(C#?)の問い合わせが多いので
その言語のサンプルを読めるようになると
サポートの幅は広がるよね。
とは言われました。
そうか、と思いつつ、
基本である(と思っている)C 言語の初歩本くらい
やっといた方がいいのかな、
と思ってせこせこやっていました。
0240デフォルトの名無しさん
2010/03/12(金) 15:20:59GUIとかゲームとかネットワークとか。
その分野を重点してやる。
0241デフォルトの名無しさん
2010/03/12(金) 15:25:070242デフォルトの名無しさん
2010/03/12(金) 17:16:54土方を目指すのでなければCは必須
0243デフォルトの名無しさん
2010/03/12(金) 18:00:220244デフォルトの名無しさん
2010/03/12(金) 18:37:40case YES:
printf( "Cができるとは素晴らしいですね\n" );
default:
c->status = "土方"
break;
}
0245デフォルトの名無しさん
2010/03/12(金) 19:05:31浮動小数を文字列に変換する方法について教えてください。
求める動作は次のとおりです:
* double型を文字列に変換
* printf系などの外部関数で変換しない
* 整数は整数として表示(小数点を付けない)
* 小数点以下の不必要な0は付けない
* 有効な精度(15桁程度?)で適当に丸める
* 出力が長い場合も扱える(例えば、「12340000000000000000000」など)
いろいろやってみたのですが思い通りのものが作れなかったので・・・
アイデア・ヒントいただければと
自分で作ってみたものも一応晒しておきます。
↓だと、「456」のときに「459.9999...」となってしまいうまくいきません。
http://codepad.org/lEqBv5Qz
0246245
2010/03/12(金) 19:07:20申し訳ない。
0247デフォルトの名無しさん
2010/03/12(金) 19:44:29どうすればいいでしょうか?
0248デフォルトの名無しさん
2010/03/12(金) 19:46:36[50] を除けばいいかも
0249デフォルトの名無しさん
2010/03/12(金) 19:58:47int test[10];
func( &test );
a = test[ n ];
というつもりでした
0250デフォルトの名無しさん
2010/03/12(金) 21:00:10質問がよく判らんが、こういうことか?
void func(int * test)
{
test[0] = 1;
}
void caller()
{
int test[10];
func(test);
int a = test[0];
}
0251デフォルトの名無しさん
2010/03/12(金) 21:47:19それだと関数の中で1を代入しても関数を呼ぶ側では変化しないと思うんですが
普通の変数をポインタで引数を渡して変更した値を取得するプログラムの配列バージョンみたいなのは可能でしょうか?
0252デフォルトの名無しさん
2010/03/12(金) 21:56:56http://codepad.org/OGLPv5dF
0253デフォルトの名無しさん
2010/03/12(金) 22:57:46解決しました
ありがとうございます
0254デフォルトの名無しさん
2010/03/12(金) 23:31:42違うね
「基礎ができて」ない奴の道のりが険しいだけ
計算をしっぱなしな奴と、ちゃんと検算する習慣がある奴の違いは
小学校で受けた教育の質から来る
0255デフォルトの名無しさん
2010/03/12(金) 23:33:45簡単なプログラム書くときでもホーア論理とか記述的意味論とか使って検証しながら書くとかさ
0256デフォルトの名無しさん
2010/03/12(金) 23:58:26mallocがアライメント調整してるのに自前でもやる意味あるのかな?
0257デフォルトの名無しさん
2010/03/13(土) 00:04:47こういうタイプは一生伸びない。
応用できるのは何故そうなったか、つまりプロセスの部分であり、解は応用できないからである。
0258デフォルトの名無しさん
2010/03/13(土) 00:12:55既解決問題の証明を一生再生産してろ
0259デフォルトの名無しさん
2010/03/13(土) 00:19:190260デフォルトの名無しさん
2010/03/13(土) 01:23:10malloc()がアライメント調整してない場合も、pragma指定かAPIで調整できる場合が多いね。
0261デフォルトの名無しさん
2010/03/13(土) 05:35:2610年っていったらもう30前後なんだろ?
今更言語やっても身につかないし
そんな奴は役に立たない
0262デフォルトの名無しさん
2010/03/13(土) 08:36:240263デフォルトの名無しさん
2010/03/13(土) 12:47:32お前使えねーな
0264デフォルトの名無しさん
2010/03/13(土) 12:52:07ごめん。相当気持ち悪いな、お前
0265デフォルトの名無しさん
2010/03/13(土) 13:06:550266デフォルトの名無しさん
2010/03/13(土) 13:16:180267デフォルトの名無しさん
2010/03/13(土) 17:04:470268デフォルトの名無しさん
2010/03/13(土) 19:58:55ってのを格好よく書くにはどうしたらいいかな
あればエラー無ければ作成ってオプションならfopen()にあるけど
逆なんだよな〜access()使うの面倒くさいな〜
0269デフォルトの名無しさん
2010/03/13(土) 20:04:45ネストって一般的に何重が限度ですか?
0270デフォルトの名無しさん
2010/03/13(土) 20:12:560271デフォルトの名無しさん
2010/03/13(土) 20:14:300272デフォルトの名無しさん
2010/03/13(土) 20:17:32if文のです
0273デフォルトの名無しさん
2010/03/13(土) 20:40:30間に沢山あるとわかりにくくなる
for{}つかえときはcontinue;で括弧を引きずらないようにするといい
場合によってはgotoもいい
長い部分は関数化
0274デフォルトの名無しさん
2010/03/13(土) 20:51:43> 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
> - ...
0275デフォルトの名無しさん
2010/03/13(土) 20:52:04みっつくらいじゃね?
0276デフォルトの名無しさん
2010/03/13(土) 20:55:31ISO/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
その一つ下じゃないか
0277デフォルトの名無しさん
2010/03/13(土) 20:56:03ネスト深くてもわかりやすい言語なんかねーよ
安易にgoto勧めんなよ
場合によって、の解釈でとんでもないことになるし
goto排斥主義者の人が来ちゃったら揉めるだろ
0278デフォルトの名無しさん
2010/03/13(土) 20:58:540279デフォルトの名無しさん
2010/03/13(土) 21:10:33"conditional includion" は 6.10.1 にある #if とかの話。
0280デフォルトの名無しさん
2010/03/13(土) 21:13:57あっ、ほんとだ
プリプロセッサの話だ
0281デフォルトの名無しさん
2010/03/13(土) 21:21:24許してやる
0283デフォルトの名無しさん
2010/03/13(土) 22:19:58カッコを入れるタイミングと位置がよく理解できていません。
なんで下記のように2回連続カッコが続いて記述されるのでしょうか?
きっとそれぞれのカッコがどこで始まり終わっているのかが理解できていないと思います。
必ず対になるので偶数個になるのは理解できていますが・・・
おかしな日本語で大変申し訳ありませんが、どなたかわかりやすく解説をお願いできますでしょうか。
よろしくお願いします
if (条件1) {
if (条件2) {
文1;
}
else {
文2;
}
} ←これは何に対してのカッコ?なんで2回連続なんだろう???
else {
文3;
}
0284デフォルトの名無しさん
2010/03/13(土) 22:25:092回連続しているけど、意味は別もの。
ネストしているカッコをそれぞれ別のカッコと考えれば分かると思うよ
if(条件1)「
if(条件2)『
文1
』else『
文2
』
」
else
0285デフォルトの名無しさん
2010/03/13(土) 22:26:00例にあげた if 文自体が間違っています。
わからなくて当然です。
なんの本にかいてあったんですか?どこのサイトですか?
0286デフォルトの名無しさん
2010/03/13(土) 22:31:48解説ありがとうございます。いまからじっくり読んで見ます。汗
サイトはこちらです。コピペした時におかしくなっただけかもしれません 汗
http://www9.plala.or.jp/sgwr-t/c/sec06-1.html
0287デフォルトの名無しさん
2010/03/13(土) 22:51:51初心者の私にはこのように見えます。
if(条件1)「 �@
if(条件2)『 �A
文1
�A』else『 �B
文2
�B 』
」�@ ←上記の番号がきっとそれぞれ対になっていると思っています。ただ、
条件1が満たされなかったら下のelse文に続くからこの閉めカッコは何?とも感じます。
きっと私は文の構成の初期的なところを理解していないと思われます 汗
else
0288デフォルトの名無しさん
2010/03/13(土) 22:56:51おまえがC言語をやらなくてもかわりはいくらでもいる
ゴミなんだよお前は
0289デフォルトの名無しさん
2010/03/13(土) 22:58:460290デフォルトの名無しさん
2010/03/13(土) 22:59:35if (条件1)
{
if (条件2)
{
文1;
}
else
{
文2;
}
}
else
{
文3;
}
0291デフォルトの名無しさん
2010/03/13(土) 23:00:310292デフォルトの名無しさん
2010/03/13(土) 23:01:36「ネスト」で調べてみましょう
0293デフォルトの名無しさん
2010/03/13(土) 23:12:57ま、正直、あまりに根本的なところで、なんで?なんで?って聞かれるとイラっとはする。
0294デフォルトの名無しさん
2010/03/13(土) 23:13:35視野が狭いな
まさに土方の考え方だわ
0295デフォルトの名無しさん
2010/03/13(土) 23:15:27はぁ?じゃあお前がちゃんと答えればいいじゃねえか!てめえがびしっとこたえねえからこんな事になってんだろ!クソが!
0296デフォルトの名無しさん
2010/03/13(土) 23:17:04おまえらが半端に親切にするからチャット状態で何も考えずに質問しちゃうんだよ
0297デフォルトの名無しさん
2010/03/13(土) 23:18:520298デフォルトの名無しさん
2010/03/13(土) 23:21:26可哀想だなお前ら。。
0299デフォルトの名無しさん
2010/03/13(土) 23:25:000300デフォルトの名無しさん
2010/03/13(土) 23:25:07疑問の回答になってるかわからないけど、
if( 条件1 ){
略
} ←このカッコ
else {
略
}
このカッコは、"else"があれば終わりが分かるんだから
不要じゃないか?っていう疑問なら、確かにその通り。
でもそれは"else"が来る場合限定の話で、else の来ない場合はそうじゃない。
C言語は、カッコでくくったブロックが基本単位になってるんだけど、
この辺りの感覚が分かってくると、閉じカッコが2重につくのも納得いくと思うよ
0301デフォルトの名無しさん
2010/03/13(土) 23:26:58んで、引っ掛かりが取れたらグンと伸びることも結構ある
283もそうなのかは分からんけどね
0302デフォルトの名無しさん
2010/03/13(土) 23:28:060303デフォルトの名無しさん
2010/03/13(土) 23:28:08条件1が満たさた場合、「 �@から」�@までが実行される。
どこからどこまでか範囲を指定してるから、どこまでを示す閉めカッコが必要。
範囲じゃない場合は省略できるが、最初のうちは必ず{}でくくっておいた方がいいと思う。
0304デフォルトの名無しさん
2010/03/13(土) 23:29:55if (条件2) {
文1;
}
else {
文2;
}
}
else {
文3;
}
は
if ( (条件1) && (条件2){ 文1;}
else if( 条件1) { 文2; }
else {文3;}と等価でよいでしょうか?
0305デフォルトの名無しさん
2010/03/13(土) 23:32:550306デフォルトの名無しさん
2010/03/13(土) 23:33:00if (条件2) {
文1;
}
else {
文2;
}
}
else {
文3;
}
0307デフォルトの名無しさん
2010/03/13(土) 23:34:32一般的には等価ではない。条件1を再度評価したとき同じ結果が
返るとは限らないから
0308デフォルトの名無しさん
2010/03/13(土) 23:35:21条件1が評価時に変化しなければ等価
0309デフォルトの名無しさん
2010/03/13(土) 23:38:280310デフォルトの名無しさん
2010/03/13(土) 23:40:240311デフォルトの名無しさん
2010/03/13(土) 23:41:36int 条件1結果;
条件1結果=(条件1)?1:0;
if ( (条件1) && 条件2 ){文1;}
else if(条件2) {文2;}
else {文3;}
と書くのがもっとも無難じゃないかと...
0312デフォルトの名無しさん
2010/03/13(土) 23:41:390313デフォルトの名無しさん
2010/03/13(土) 23:44:410314デフォルトの名無しさん
2010/03/13(土) 23:47:31「C言語なら俺に聞け(入門編)」
です
煽るだけの奴は去れ
0315デフォルトの名無しさん
2010/03/13(土) 23:48:00お前が質問するのは自由だが、それに答えるかどうかもこっちの自由だ。
0316デフォルトの名無しさん
2010/03/13(土) 23:49:480317デフォルトの名無しさん
2010/03/13(土) 23:50:22スレタイにだまされるな。
初心者の質問をネタに雑談するスレだ。
0318デフォルトの名無しさん
2010/03/13(土) 23:50:52>C言語の*入門者*向け解説スレッドです。
質問または答えない奴はここにいる資格は無い
0319デフォルトの名無しさん
2010/03/13(土) 23:51:47スレタイをC言語なら入門書を読んだ上でたまになら俺に質問してもいいよ(入門編)に改名するべきです
0320デフォルトの名無しさん
2010/03/13(土) 23:53:010321デフォルトの名無しさん
2010/03/13(土) 23:53:140322デフォルトの名無しさん
2010/03/13(土) 23:53:20それでいいんだよ
通ぶってても規格票と違っている事を固く信じ込んでいる事はよくある
0323デフォルトの名無しさん
2010/03/13(土) 23:53:54「俺に聞け」なんて不遜な言い方、ジョークに決まってるだろ。
0324285
2010/03/13(土) 23:54:08んー、私が間違っていましたね。
これであっています。失礼いたしました。
で、こういう書き方をすればわかりやすいかもしれませんが、いかがでしょうか。
if (a == 0) {
if (b == 0) {
x = 0;
} else {
y = 0;
}
} else {
z = 0;
}
0325デフォルトの名無しさん
2010/03/13(土) 23:54:370326デフォルトの名無しさん
2010/03/13(土) 23:57:570327デフォルトの名無しさん
2010/03/13(土) 23:59:010328デフォルトの名無しさん
2010/03/14(日) 00:05:41あそこらは「君たちは質問の意図を理解してませんね。
そういうことはいいから早く質問にこたえなさい」系の物言いも許されるイメージ。
あんまり見てないから知らんけど。
0329デフォルトの名無しさん
2010/03/14(日) 00:17:35条件式を工夫してみろ
条件式をいじってうまくいかなったら
if文のネストを工夫してみろ
両方駄目だったらあきらめろ
言えることはこれくらいかな
0330デフォルトの名無しさん
2010/03/14(日) 00:29:35ただし答えるとは誰も言ってない
0331デフォルトの名無しさん
2010/03/14(日) 00:32:420332デフォルトの名無しさん
2010/03/14(日) 00:34:530333デフォルトの名無しさん
2010/03/14(日) 00:34:56value="http://www.youtube.com/v/n-PyrgNSGHA&hl=ja_JP&fs=1&">
</param><param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="http://www.youtube.com/v/n-PyrgNSGHA&hl=ja_JP&fs=1&"
type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"
width="480" height="385"></embed></object>
このプログラムを教えてください。私のレベルは、cを少しかじっただけです。
0334デフォルトの名無しさん
2010/03/14(日) 00:35:56最初から理屈だけで覚えようとすると得てして失敗しやすいからな
0335デフォルトの名無しさん
2010/03/14(日) 00:38:15Cをかじったなら、それはCじゃないってわかるだろ。
0336デフォルトの名無しさん
2010/03/14(日) 00:40:140337デフォルトの名無しさん
2010/03/14(日) 01:08:450338デフォルトの名無しさん
2010/03/14(日) 11:08:49fopen、fscanf、for、ifのみを使ってそのようなプログラムを作ることって可能なのでしょうか?
0339デフォルトの名無しさん
2010/03/14(日) 11:11:260340デフォルトの名無しさん
2010/03/14(日) 11:12:15ならないから、相当難しいだろうな。
しかも使える関数や構文にも強い制限があるみたいだし....
0341デフォルトの名無しさん
2010/03/14(日) 11:16:100342デフォルトの名無しさん
2010/03/14(日) 11:16:210343デフォルトの名無しさん
2010/03/14(日) 11:17:060344デフォルトの名無しさん
2010/03/14(日) 11:40:260345デフォルトの名無しさん
2010/03/14(日) 12:26:11それでfopenを上書きすればいいんじゃね
あるいはランダムな数字が入ってるテキストファイル用意しておくとか
0346デフォルトの名無しさん
2010/03/14(日) 12:27:130347デフォルトの名無しさん
2010/03/14(日) 13:00:38できるよ
0348デフォルトの名無しさん
2010/03/14(日) 13:26:37カッコや演算子もないとプログラムの書きようがない。
0349デフォルトの名無しさん
2010/03/14(日) 13:29:570350デフォルトの名無しさん
2010/03/14(日) 13:30:270351デフォルトの名無しさん
2010/03/14(日) 13:36:400352デフォルトの名無しさん
2010/03/14(日) 13:37:04なんか小学生みたいだな
0353デフォルトの名無しさん
2010/03/14(日) 15:05:35全然関係ない所から、#include "hoge.h"をしてhoge.hのint num;を使うと
numのスコープはどうなるのですか?
0354デフォルトの名無しさん
2010/03/14(日) 15:10:57どっかのコンパイル単位でint numで定義すればいい
0356デフォルトの名無しさん
2010/03/14(日) 15:42:23寿命をスコープと言わない。スコープってのは名前の有効範囲。
0357デフォルトの名無しさん
2010/03/14(日) 16:00:40fopen()で開いたストリームは、プログラムが終了すると自動で閉じられるんで、
閉じるのは省略しても問題ないって場合もある。
0358353
2010/03/14(日) 16:06:29staticのまとめ
1.#include "hoge.h"とした時に初期化(定義)される
2.staticは何度も#include "hoge.h"としても、1度しか初期化されない
3.プログラムのすべてが終わると自動的に、削除される
4.オブジェクト指向のpublic?
externのまとめ
1.#include "hoge.h"とした時に初期化(定義)される
2.#include "hoge.h"とする度に初期化されてしまうので、多重定義になってしまう
3.プログラムのすべてが終わると自動的に、削除される
0359デフォルトの名無しさん
2010/03/14(日) 16:29:24#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は同じように書き換えられる。
0361デフォルトの名無しさん
2010/03/14(日) 17:56:37C言語では普通ヘッダを作らないのでしょうか?
ちなみに、*.cを*.hにするだけじゃダメなんですか
0362デフォルトの名無しさん
2010/03/14(日) 18:37:33{〜}
else
{〜}
elseブロックは最適化で消滅する?
0363デフォルトの名無しさん
2010/03/14(日) 18:46:39ちょっと規模が大きいとファイルを複数にわけるんで、ヘッダを作るのが普通。
ヘッダには定数とか関数のプロトタイプを入れるもんなので、.cを.hに変えるだけじゃだめ。
0364デフォルトの名無しさん
2010/03/14(日) 18:51:500365デフォルトの名無しさん
2010/03/14(日) 18:52:32おまえさんが使っているコンパイラに聞いてみろ
0366デフォルトの名無しさん
2010/03/14(日) 19:05:19ソース見たら、たぶん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 はずぅ〜〜い
0367デフォルトの名無しさん
2010/03/14(日) 19:25:05thx
0368デフォルトの名無しさん
2010/03/14(日) 20:40:380369デフォルトの名無しさん
2010/03/14(日) 20:50:210370デフォルトの名無しさん
2010/03/14(日) 20:51:50どんな願いも一つだけ
聞き流してやろう…
0371デフォルトの名無しさん
2010/03/14(日) 22:05:450372デフォルトの名無しさん
2010/03/14(日) 22:40:35pow()のアルゴリズムを知っているか? 知っていればすぐに判ることだが非常に誤差が発生しやすい。
従って、第二パラメータが整数になるなら使わない方が無難。
後は、その分の計算量をどこでどう分散させるかだな。
0373デフォルトの名無しさん
2010/03/15(月) 01:32:380374デフォルトの名無しさん
2010/03/15(月) 11:29:44ミドルウェアってのはOSとソフトウェアの中間に値する物
ミドルウェア = DBMSって覚えておけばok
0375デフォルトの名無しさん
2010/03/15(月) 11:49:530376デフォルトの名無しさん
2010/03/15(月) 12:44:340377デフォルトの名無しさん
2010/03/15(月) 12:50:48そもそも、ヘッダファイルで定義をしてはいけません。
0378デフォルトの名無しさん
2010/03/15(月) 15:01:240379デフォルトの名無しさん
2010/03/15(月) 15:04:540380デフォルトの名無しさん
2010/03/15(月) 21:58:35#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++; }}
}
くじびき的な何か?
0381デフォルトの名無しさん
2010/03/15(月) 22:02:18fopen、fscanf、for、ifのみを使って
という条件を満たしていない気がするのだが、いいのか。
0382デフォルトの名無しさん
2010/03/15(月) 22:10:580383デフォルトの名無しさん
2010/03/15(月) 22:11:06fgets()の第二パラメータの意味を誤解していそうだ。
0384デフォルトの名無しさん
2010/03/15(月) 22:45:47制限が厳しすぎる
0385デフォルトの名無しさん
2010/03/15(月) 23:27:100386デフォルトの名無しさん
2010/03/15(月) 23:53:320387デフォルトの名無しさん
2010/03/16(火) 00:14:56特に乱数や、乱数の種、ましてや暗号関係で使うのは厳禁
あと初期化されていない変数って、規格上は読んでいいんだっけ?
0388デフォルトの名無しさん
2010/03/16(火) 00:18:330389デフォルトの名無しさん
2010/03/16(火) 00:39:10#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++; }}
}
な、なんか意味あんのん?… この制限て…(・_; ばたり…
0390デフォルトの名無しさん
2010/03/16(火) 00:43:090391デフォルトの名無しさん
2010/03/16(火) 00:47:440392デフォルトの名無しさん
2010/03/16(火) 00:53:39#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++; }}
}
もぅ寝まつ…(つ_\
0393デフォルトの名無しさん
2010/03/16(火) 01:08:23これでどうだ
ウチでは実行するたびに結果が変わったよ
#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;
}
0394デフォルトの名無しさん
2010/03/16(火) 02:27:07こんな問題を出した意図とか。
どうせ>>338が問題を書き間違えて重要な情報が抜け落ちてたってオチだろうけど。
0395デフォルトの名無しさん
2010/03/16(火) 16:26:460396デフォルトの名無しさん
2010/03/16(火) 16:30:290397デフォルトの名無しさん
2010/03/16(火) 16:36:06JAVAを使いましょう
0398デフォルトの名無しさん
2010/03/16(火) 16:37:080399デフォルトの名無しさん
2010/03/16(火) 16:37:440400デフォルトの名無しさん
2010/03/16(火) 22:08:09洒落じゃね?
0401デフォルトの名無しさん
2010/03/16(火) 22:45:29"%04d",i みたいに前をゼロで埋める指定で、0で埋める個数って変数にできないんですかね?
0402デフォルトの名無しさん
2010/03/16(火) 22:49:040403デフォルトの名無しさん
2010/03/16(火) 23:05:00ありがとうございます
0404デフォルトの名無しさん
2010/03/17(水) 23:08:23Macでも使えて軽いコンパイラってありますか?
0405デフォルトの名無しさん
2010/03/17(水) 23:26:550406デフォルトの名無しさん
2010/03/18(木) 06:44:000407デフォルトの名無しさん
2010/03/18(木) 14:35:100408デフォルトの名無しさん
2010/03/18(木) 15:30:455年前のノートPCなのに、円周率計算させると2秒で5億桁まで出力する。
VisualStudio2008ってソフトなんだけど。
0409デフォルトの名無しさん
2010/03/18(木) 15:42:31http://gmplib.org/pi-with-gmp.html
0410デフォルトの名無しさん
2010/03/19(金) 00:39:07例えば、buff=(char *)malloc(sizeof(char) * 10);とメモリを確保したあと
配列が不足するたびにreallocでメモリを増やしていこうと考えてます。
buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。
そこで悩んだのですが、ある時点でbuffにどれくらいメモリが割り当てられてるか
確認する方法ってないですか?
「* 10」を「* i」みたいに変数を使って確認するしかないんでしょうかね?
0411デフォルトの名無しさん
2010/03/19(金) 00:41:370412デフォルトの名無しさん
2010/03/19(金) 00:46:46ありがとう。そうします。
0413デフォルトの名無しさん
2010/03/19(金) 01:11:33> buff=(char *)realloc(buff, sizeof(char) * 20);という具合に。
出たよ。メモリ確保できないときにリークが確定するパターン。
初心者に realloc() 教えるとすぐこれをやらかす。
0414デフォルトの名無しさん
2010/03/19(金) 01:16:08喜びすぎだろ
0415デフォルトの名無しさん
2010/03/19(金) 01:20:57うんざりしてるんだよ。
0416デフォルトの名無しさん
2010/03/19(金) 02:32:19#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(^_^
0417デフォルトの名無しさん
2010/03/19(金) 02:52:10怒りはしないが、ダメダメ。
ロードする関数でrealloc()しても、増えた領域に何にも書いてないから不定値が返るぞ。
それに、セーブする方も任意のindexを指定できるのに一度に伸ばせるのが高々10文字だから簡単に範囲外書き込みになってしまう。
それに、sizeof(char)なんて無意味なことは書くべきじゃない。
0418デフォルトの名無しさん
2010/03/19(金) 02:55:55出たよ。問題の本質と関係ない話をする奴。
buffの宣言がないじゃん、と言ってるのと同レベルだぜそれ。
初心者じゃなくなったと思い込んでる初心者はすぐこれをやらかす。
0419デフォルトの名無しさん
2010/03/19(金) 02:56:520420デフォルトの名無しさん
2010/03/19(金) 02:57:080421デフォルトの名無しさん
2010/03/19(金) 03:00:21とりあえず、ポインタを元にアロケーションしているサイズを知ることはできないので他で管理しましょう
>>420
ええと。
0422デフォルトの名無しさん
2010/03/19(金) 09:12:57余裕をもとって大きめに領域確保するほうがよっぽどマシ。
0423デフォルトの名無しさん
2010/03/19(金) 09:15:29すぐそのあとに、if (buff == NULL) exit(1); と書けば問題なし。
メモリ不足なら、ほかのところだってまともに動くわけないんだから。
0424デフォルトの名無しさん
2010/03/19(金) 09:32:48それはそれでイヤン
0425デフォルトの名無しさん
2010/03/19(金) 11:07:20サイズをオーバーするかどうかちゃんとチェックするならありじゃね?
0426デフォルトの名無しさん
2010/03/19(金) 14:55:30オーバーしそうになったらどうすんの?
0427デフォルトの名無しさん
2010/03/19(金) 15:50:24・ごめんなさい、私には無理です
・オーバーする分はなかったことにしていいよね
どちらでもお好きに。
0428デフォルトの名無しさん
2010/03/19(金) 16:08:53一行が長いと後ろのほうが切り捨てられるエディタ
どっちもいやだなぁ
0429デフォルトの名無しさん
2010/03/19(金) 16:10:430430デフォルトの名無しさん
2010/03/19(金) 16:27:264GB以上のファイルを普通に扱える環境なら、64ビットアドレッシングで使うのが当たり前だから特に工夫は要らないよ。
32ビット環境で扱いたいなら、一度に全部開かなければいいだけだからやはり、4GB以上だからといって別段大仰な手間は要らない。
>>428
初心者が作るのなら、取り敢えずそれでもいいのでは? まさか、そのまま保存するわけでもあるまいし。
0431デフォルトの名無しさん
2010/03/19(金) 19:50:57char buf[6] = {'A', 'B', 'C', 'D', 'E', '\0'};
と宣言したとします。
このとき
buf[1]は 'B'が格納されており文字コードが例えば66だとします
buf[1]は数値そのものであるので、if(buf[1] == 66)もしくはif(buf[1] == 'B')のような比較が可能です。(ですよね?)
ここでbufとするとABCDEという文字列を表すことになりますが、このときbuf自体の数値は
bufのアドレスが入っています。(ですよね?)
ここで疑問なのですが、bufは一体どこのアドレスが入っているのでしょうか?
例えば、buf[0]のアドレスと同じものであればAとしか表示されないはずです。
ABCDE\0をもってくるにはbuf[0]からbuf[5]までのアドレスが必要なはずです。
buf自体はアドレスの開始地点で終端文字の\0が現れる部分までのオフセットを割りだし
そのアドレスをすべて与えて文字列を表示しているということでよろしいでしょうか?
回答よろしくお願いします。
0432デフォルトの名無しさん
2010/03/19(金) 20:01:01buf と等価なのは &buf[0]
0433デフォルトの名無しさん
2010/03/19(金) 20:04:08だいたい合ってるが、1点だけ。
> ここでbufとするとABCDEという文字列を表すことになりますが、
bufがABCDEという文字列を表しているわけではない。
あくまで文字列の先頭のアドレスを保持しているにすぎない。
buf == &(buf[0])
puts(buf)で"ABCDE"と表示されるのは、以下のような処理をしているため。
for(char *p = buf; *p != '\0'; p++) { *pを出力; }
0434デフォルトの名無しさん
2010/03/19(金) 20:07:07配列は配列であってポインタじゃない
0435デフォルトの名無しさん
2010/03/19(金) 20:10:42char *p = buf;
buf
↓
'h' 'o' 'g' 'e' '\0'
↑
0x00..... ← p
0436デフォルトの名無しさん
2010/03/19(金) 20:13:390437デフォルトの名無しさん
2010/03/19(金) 20:14:09>ここでbufとするとABCDEという文字列を表すことになりますが
ここでってどこだよw
0438デフォルトの名無しさん
2010/03/19(金) 20:26:53言っていることはその通り何だけど
NUL('\0')終端文字列はNULが現れるまでを文字列とみなすから表示させたい最初の文字のアドレスを渡すだけでいいのよ
あなたにお薦めなサンプルプログラム
#include <stdio.h>
#include <string.h>
int
my_print(char const*str)
{
size_t i;
for ( i = 1; i < str[0]+1; ++i ) {
putchar(str[i]);
}
return i-2;
}
int
main(int argc, char **argv)
{
char foo[6] = {'a', 'b', 'c', 'd', 'e', '\0'};
char bar[16] = {'a', 'b', 'c', 'd', 'e'};
char baz[] = {3, 'b', 'a', 'z'};
memset(bar+5, '\100', 10); /* ゴミを入れる */
bar[15] = '\0'; /* NUL終端させる */
printf("%s\n", foo);
printf("%s\n", &foo[0]);
printf("%s\n", &foo[3]);
printf("%s\n", bar);
my_print(baz);
return 0;
}
0439デフォルトの名無しさん
2010/03/19(金) 21:22:55コンパイラは &buf[5] を &buf[0] + (5 * sizeof(char)) と捉えます。
0440デフォルトの名無しさん
2010/03/19(金) 21:33:350441デフォルトの名無しさん
2010/03/19(金) 21:37:200442デフォルトの名無しさん
2010/03/19(金) 21:43:310443デフォルトの名無しさん
2010/03/19(金) 21:44:010444デフォルトの名無しさん
2010/03/19(金) 22:17:57fuck u
0445431
2010/03/19(金) 22:18:43buf自体がが先頭アドレスなのは↓に書いたように知ってます
>buf自体はアドレスの開始地点
結局全部
for(char *p = buf; *p != '\0'; p++) { *pを出力; }
これやってるだけなんですね…
0446431
2010/03/19(金) 22:24:21buf[5]を例えばprintfするときはオフセットで
文字列を全部表示するときはポインタをズラす方法で表示しているのですか?
for(char *p = buf; *p != '\0'; p++) { *pを出力; }
このようにポインタをズラしているのか、
それとも
&buf[5] を &buf[0] + (5 * sizeof(char))
のようにオフセットで計算しているのか
内部の処理はどっちなんでしょうか?
それが>>431の質問で一番知りたいことなんですが
0447431
2010/03/19(金) 22:26:02オフセットで計算したものか、ポインタをズラしたものなのか
格納されたアドレス見るだけじゃわからないんですよ…
0448デフォルトの名無しさん
2010/03/19(金) 22:26:32きっと、前者だろうなって気はするけど
0449デフォルトの名無しさん
2010/03/19(金) 22:27:390450431
2010/03/19(金) 22:28:24そうなんですか…
どっちが主流なのか知りたかったのですが(速度とかいろんな意味で)
0451デフォルトの名無しさん
2010/03/19(金) 22:30:390452デフォルトの名無しさん
2010/03/19(金) 22:31:24おまえはなにか?コンパイラは全て同じ中身じゃないといけないと思ってんのか?主流ってなんだ?どの環境の主流だ?
クソして寝ろや
0453デフォルトの名無しさん
2010/03/19(金) 22:33:28もう答えは出てるだろう。文字列探索程度のコストを気にするより
もっと他の所の速度を気にしろ。
0454デフォルトの名無しさん
2010/03/19(金) 22:35:29ペンティアム以降になると急に難しくなるから、LSICの試食版あたりからははじめて
あるいはgccならprintfもソースみれるよ
そうやって3,4個調べてみれば主流もわかるんじゃね
0455デフォルトの名無しさん
2010/03/19(金) 23:38:500456デフォルトの名無しさん
2010/03/19(金) 23:41:38char c[1234]
ってのを
putchar( c[0] ); putchar( c[1] ); putchar( c[2] ); putchar( c[3] ); putchar( c[4] ); putchar( c[5] ); 〜〜〜ずーっとつづく
って書くよりも
char* p=c;
putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); putchar( *p++ ); 〜〜〜ずーっとつづく
って書く方が、コピペが楽なので好きですw
0457デフォルトの名無しさん
2010/03/19(金) 23:43:530458デフォルトの名無しさん
2010/03/19(金) 23:44:020459デフォルトの名無しさん
2010/03/19(金) 23:52:530460デフォルトの名無しさん
2010/03/19(金) 23:53:210461デフォルトの名無しさん
2010/03/19(金) 23:59:130462デフォルトの名無しさん
2010/03/20(土) 00:06:12ってのは、使うときは putchar( c[3] ) みたいにして使います。 c[0] なら最初の文字、c[3]なら3番目の文字です。
&c[3] みたいに、頭に&マークをつけると、このデータがメモリのどこに書かれてるかがわかります。配列の先頭が、メモリのどこにあるかは &c[0] でわかります。
使うときにカッコを取って c って書くと、 &c[0] って書いたときと同じ数字がわかります。 この c そのものを c++ ってやって一個増やすと、
char型の配列なら、char一個分だけメモリをさしてる場所が増えます。 だから c++ とすると、つぎに使うときは c は &c[1] といういみになります。
int型の配列なら、int i[1234];
0463デフォルトの名無しさん
2010/03/20(土) 00:08:19や〜めた
0464デフォルトの名無しさん
2010/03/20(土) 00:14:26またまたご冗談を
0465デフォルトの名無しさん
2010/03/20(土) 00:19:03そんなコンパイラなんて…
あるかもしれないが規格無視じゃないか
0466デフォルトの名無しさん
2010/03/20(土) 00:27:03その場合cは定数だからc++なんて出来ないだろアホ
0467デフォルトの名無しさん
2010/03/20(土) 12:12:22アホは君だよ
0468デフォルトの名無しさん
2010/03/20(土) 13:03:44ほー
char c[1234]; c++; とやってエラーが出ないとでもいうのかい
0469デフォルトの名無しさん
2010/03/20(土) 13:13:090470デフォルトの名無しさん
2010/03/20(土) 13:37:16落としどころはどこですか?
意味不明なんだけど
コンパイラはコンパイルエラーを吐きますが
0471デフォルトの名無しさん
2010/03/20(土) 14:40:580472デフォルトの名無しさん
2010/03/20(土) 14:44:08煽っても何がどう違うのかは説明できないから、答えは返ってこない。
放置しましょう。
0473デフォルトの名無しさん
2010/03/20(土) 17:26:23単に理解できなかっただけってことか
0474462
2010/03/20(土) 19:25:20べんきょうになるなぁ〜
0475デフォルトの名無しさん
2010/03/20(土) 19:42:00ソースをページに表示するときに、そのまま貼り付けるだけだと
TABで字下げされなかったり、コメントが色分けされなかったりして
見にくくなってしまうのですが、なにかいい方法はないでしょうか?
0476デフォルトの名無しさん
2010/03/20(土) 19:44:330477デフォルトの名無しさん
2010/03/20(土) 19:53:25<PRE>タグと<TT>タグ
0478デフォルトの名無しさん
2010/03/20(土) 19:55:35どこのブログでもソースをそのまま貼る機能くらいあるだろ。
0479デフォルトの名無しさん
2010/03/20(土) 19:58:14色分けについては自動でタグつけ(CSS使ってclass指定)してくれるツールを自分で作る
0480デフォルトの名無しさん
2010/03/20(土) 19:58:340481デフォルトの名無しさん
2010/03/20(土) 20:04:31SyntaxHighlighter
0482デフォルトの名無しさん
2010/03/20(土) 20:14:30おお、これはラクチンだ
0483デフォルトの名無しさん
2010/03/20(土) 20:33:45fputs(buf, stdout);
↑が意図どおりに動かないことがわかれば終端文字の意味もわかる
0484デフォルトの名無しさん
2010/03/20(土) 20:35:570485デフォルトの名無しさん
2010/03/20(土) 20:40:04たいていは意図どおりに動くような気がする
0486デフォルトの名無しさん
2010/03/20(土) 20:41:290487デフォルトの名無しさん
2010/03/20(土) 20:47:070488475
2010/03/20(土) 21:09:05>>481
これダウンロードして、中に入っていたtest.htmlに自分のソース貼り付けて試してみたのですが
日本語コメの部分が文字化けしちゃいました・・・orz 残念
日本語コードとかによっては文字化けしないで使えるのかな・・・みなさんはいかがですか?
0489475
2010/03/20(土) 21:10:02でも、行番号まで表示されるのはすばらしいですね!
0490デフォルトの名無しさん
2010/03/20(土) 21:15:470491デフォルトの名無しさん
2010/03/20(土) 21:18:52コンパイルしましたか?
>>462 の c はインクリメントできないという指摘は間違いないのですが。
0492デフォルトの名無しさん
2010/03/20(土) 21:34:46日本語エンコーディングに注意すればおk
0493デフォルトの名無しさん
2010/03/20(土) 21:56:51下のコードのようにあらかじめ十分大きなサイズの配列を確保する、という方法がいいんじゃないかなぁと思うんですが、
あまり見ない方法ということは、あんましよくない方法なんでしょうか?もしそうなら理由を教えていただきたいです
int func(BYTE n)
{
int temp[BYTE_MAX]; // int *temp = (int *)malloc(sizeof(int) * n); の代わり
/* tempを使って処理、少なくともn個のint領域が同時に必要 */
return temp[0]; // tempのデータから最終的にintを一つ取り出す
}
0494デフォルトの名無しさん
2010/03/20(土) 22:16:07・BYTE_MAXの値によってはスタックオーバーフローが起きるかもしれない
0495475
2010/03/20(土) 22:22:56test.htmlのヘッダ部の charset=UTF-8 を charset=SHIFT-JIS に変えたら
ちゃんと日本語で表示されました。
自分の貼ったソースが(意識してなかったけど)SHIFT-JISだったからみたいです。
ただし載せようとしてるのがFC2ブログでEUC-JPなので、その差異をどうしようかなって感じですが。
0496デフォルトの名無しさん
2010/03/20(土) 22:23:040497デフォルトの名無しさん
2010/03/20(土) 22:24:02スタックを使うからスタックオーバーフローの可能性は十分ある
0498デフォルトの名無しさん
2010/03/20(土) 22:27:21アップロードするときに自動で文字コード変換するようにするとか
最初からEUC-JPで書くとか
0499デフォルトの名無しさん
2010/03/20(土) 22:28:210500デフォルトの名無しさん
2010/03/20(土) 22:30:18BYTE_MAXが大きくなかったらそれでもぜんぜん問題ないよ。
0501デフォルトの名無しさん
2010/03/20(土) 22:31:08再帰使うときに要注意だし、作業用の配列を他で使うかもしれないというリスクも増える
それなら関数内で static で確保したほうがマシ
0502デフォルトの名無しさん
2010/03/20(土) 22:33:01C99は初めてか?力抜けよ
0503デフォルトの名無しさん
2010/03/20(土) 22:33:410504デフォルトの名無しさん
2010/03/20(土) 22:33:52そのくらいのサイズだったら、ローカルに配列で持っても
ぜんぜんふつー。
数キロとか数十キロくらいのサイズならぜんぜんおk。
0505デフォルトの名無しさん
2010/03/20(土) 22:55:03「十分大きなサイズ」があらかじめわかっていて、スタックに十分な余裕があるならそれでいい
あとはうっかり再帰させなければおk
0506デフォルトの名無しさん
2010/03/20(土) 23:32:040507デフォルトの名無しさん
2010/03/20(土) 23:36:240508デフォルトの名無しさん
2010/03/20(土) 23:39:430509デフォルトの名無しさん
2010/03/20(土) 23:44:21今時alloca()が用意されているコンパイラならc99でも通るだろ。
0510デフォルトの名無しさん
2010/03/20(土) 23:50:35お前だけ99
0511デフォルトの名無しさん
2010/03/20(土) 23:58:420512デフォルトの名無しさん
2010/03/20(土) 23:59:49知らないことは素直に知らないと認めた方が宜しいかと。
知らないことは罪ではないが、自分を偽るのは罪だ。
0513デフォルトの名無しさん
2010/03/21(日) 00:02:250514デフォルトの名無しさん
2010/03/21(日) 00:03:20VC++にalloca()は実装されているの?
0515デフォルトの名無しさん
2010/03/21(日) 00:03:340516デフォルトの名無しさん
2010/03/21(日) 00:07:580517デフォルトの名無しさん
2010/03/21(日) 00:12:48http://msdn.microsoft.com/ja-jp/library/wb1s57t5.aspx
0518デフォルトの名無しさん
2010/03/21(日) 00:17:190519475
2010/03/21(日) 00:54:08ここに乗ってるやり方でやってたら、表示できるようになりました。
文字コードの件は、編集用のページにソースをコピペした段階でEUC-JPに変換させるみたいで、あらかじめ変換しなくても大丈夫でした。
あと、改行の扱いをHTMLタグのみにしないとちゃんと表示されませんでした。
以上ご参考まで。
0520デフォルトの名無しさん
2010/03/21(日) 02:05:550521デフォルトの名無しさん
2010/03/21(日) 09:42:46alloca()はふるい関数だから、C99でなくてalloca()が通るコンパイラとか余裕。
0522デフォルトの名無しさん
2010/03/21(日) 12:11:49/* main.h */
const int TEISU = 10;
/* main.c */
#include "main.h"
if((テキストから読み込んだシンボル) == TEISU){
処理
}
/* テキスト */
TEISU
0523デフォルトの名無しさん
2010/03/21(日) 12:17:260524493
2010/03/21(日) 12:18:27どうやら今やってるケースでは大丈夫そうなのでこのままやろうと思います
0525デフォルトの名無しさん
2010/03/21(日) 12:27:01できない
0526デフォルトの名無しさん
2010/03/21(日) 12:54:34なんで具体例を挙げないの?w
0527デフォルトの名無しさん
2010/03/21(日) 12:56:160528デフォルトの名無しさん
2010/03/21(日) 13:18:42ブラウザによってはアンダーバーがところどころ消えて半角スペースになってしまいます。
(例:IEだとダメ、Safariだと問題なし)
対処法ご存知の方いませんか?
0529デフォルトの名無しさん
2010/03/21(日) 13:20:310530デフォルトの名無しさん
2010/03/21(日) 13:40:100531デフォルトの名無しさん
2010/03/21(日) 14:57:04お騒がせしました
0532デフォルトの名無しさん
2010/03/21(日) 17:44:08main()
{
printf("Hello\nWorld!\n");
}
なにか間違いはありますか?
0533デフォルトの名無しさん
2010/03/21(日) 17:50:090534デフォルトの名無しさん
2010/03/21(日) 17:54:45戻り値といと?
初心者なので詳しくお願いします
0535デフォルトの名無しさん
2010/03/21(日) 17:56:180536デフォルトの名無しさん
2010/03/21(日) 17:56:250537デフォルトの名無しさん
2010/03/21(日) 17:57:48買った本に書いてあることそのまま書き写しただけなんですが
0538デフォルトの名無しさん
2010/03/21(日) 18:02:31本には載ってません
ちなみに本はCの絵本「http://utun.jp/3uA」ってやつです
0539デフォルトの名無しさん
2010/03/21(日) 18:04:18そんな本捨ててしまったほうがいい。
0540デフォルトの名無しさん
2010/03/21(日) 18:04:390541デフォルトの名無しさん
2010/03/21(日) 18:06:560542デフォルトの名無しさん
2010/03/21(日) 18:07:24そんなにひどいんですか?
どこかいいサイトを教えてくれませんか?
0543デフォルトの名無しさん
2010/03/21(日) 18:07:480544デフォルトの名無しさん
2010/03/21(日) 18:09:23古いっていうか、新しいCやC++でmainのreturnは省略化とはっきり決まった。
古いCでも、K&Rのhello worldとか省略してある。
0545デフォルトの名無しさん
2010/03/21(日) 18:09:29>初心者でも、入門編を一通り読みこなした人でなければ
>いきなり読んでも良く分からないと思う。
>細部までの解説が不十分なので
結論、今すぐ捨てろ。
>>542
C言語で調べれば出てくる上位のサイトで勉強すれ
0546デフォルトの名無しさん
2010/03/21(日) 18:12:36Visual C++2008でデバッグをしたところビルドエラーが出たからです
下のほうには「'#include "stdafx.h"' をソースに追加しましたか?」とでています
0547デフォルトの名無しさん
2010/03/21(日) 18:14:280548デフォルトの名無しさん
2010/03/21(日) 18:14:50してあると、わかってるやつっぽいな。
2chあたりで、数行のサンプルだからと思って、returnを省略すると
揚げ足を取りたくてしょうがない厨房が、煽ってきて、
returnが省略できるって知らないのって煽り返すと、涙目で
暴れだして、省略してはいけないって屁理屈を延々と続けるって
いつものパターン。
0549デフォルトの名無しさん
2010/03/21(日) 18:15:460550デフォルトの名無しさん
2010/03/21(日) 18:17:330551デフォルトの名無しさん
2010/03/21(日) 18:17:54「http://utun.jp/3uR」と「http://utun.jp/3uJ」どちらがいいと思いますか?
0552デフォルトの名無しさん
2010/03/21(日) 18:17:56落ち着け。
0553デフォルトの名無しさん
2010/03/21(日) 18:25:59よくわからないけど、IDEからプロジェクトの新規作成ってやるか、
パスの設定とかしてコンソールでやるのとどっちがいいかって話?
どちらでもいいけどIDEからやればいいんじゃない?
0554デフォルトの名無しさん
2010/03/21(日) 18:27:32[http://homepage3.nifty.com/ishidate/vcpp08_1/vcpp08_1.htm]を見てやりました
0555デフォルトの名無しさん
2010/03/21(日) 18:27:43そのサイトに作成方法載ってる
0556デフォルトの名無しさん
2010/03/21(日) 18:35:36もう、何が何だか分かりません
0557デフォルトの名無しさん
2010/03/21(日) 19:17:44素直にhtmlでTable作る練習でもしてなさい。
0558デフォルトの名無しさん
2010/03/21(日) 19:29:03それをやらずにすむ方法はないのでしょうか。
スタック変数の場合、関数呼び出しが終わった際に自動で解放されるのでプログラマは
解放を意識する必要はないからいいのですが。
それずるくありませんか。
0559デフォルトの名無しさん
2010/03/21(日) 19:34:120560デフォルトの名無しさん
2010/03/21(日) 19:35:290561デフォルトの名無しさん
2010/03/21(日) 19:44:19returnの後にfree処理を経由して戻る
0562デフォルトの名無しさん
2010/03/21(日) 19:46:51一般に、領域の生存期間は静的に決定できない
したがってプログラマ側が明示的に操作してやるしかない
あるいは、ガーベジコレクタを使うか
0563デフォルトの名無しさん
2010/03/21(日) 19:53:230564デフォルトの名無しさん
2010/03/21(日) 20:00:36どうするのが理想的?
0565デフォルトの名無しさん
2010/03/21(日) 20:01:590566デフォルトの名無しさん
2010/03/21(日) 20:03:060567デフォルトの名無しさん
2010/03/21(日) 20:03:200568デフォルトの名無しさん
2010/03/21(日) 20:19:46新しいコンパイラを使う。
0569デフォルトの名無しさん
2010/03/21(日) 20:23:490570デフォルトの名無しさん
2010/03/21(日) 20:25:310571デフォルトの名無しさん
2010/03/21(日) 20:25:36intを返すよと宣言しといて何も返さないんじゃ、いわばプロトタイプエラーだ。
0572デフォルトの名無しさん
2010/03/21(日) 20:57:34規格への対応状況は有益な情報ですね。
0573デフォルトの名無しさん
2010/03/21(日) 20:58:340574デフォルトの名無しさん
2010/03/21(日) 21:00:09main()は特別扱いだから。
そもそも、リターン値がvoidでない関数で、returnを忘れても
エラーにならないCの仕様をなんとかしてほしい。
0575デフォルトの名無しさん
2010/03/21(日) 21:11:030か1を返すだけでもメモリ使うからな
0576デフォルトの名無しさん
2010/03/21(日) 21:18:11規格でmainの型はintと決められてる。
0577デフォルトの名無しさん
2010/03/21(日) 21:57:420578デフォルトの名無しさん
2010/03/21(日) 22:11:50消えないよ。
0579デフォルトの名無しさん
2010/03/21(日) 22:22:33スレをお間違えでは?
0580デフォルトの名無しさん
2010/03/21(日) 22:32:57「石立 喬の旅行」はこちらへ
http://homepage3.nifty.com/ishidate/vcpp.htm
そのサイトで紹介しているのはC++/CLIだから、別のサイトにしたほうがいい。
Google[C言語 勉強]
0581デフォルトの名無しさん
2010/03/22(月) 00:21:03http://homepage3.nifty.com/ishidate/vcpp05_1/vcpp05_1.htm
既存のプログラム(たとえばSample.cppなど)をファイルから読み込み、プロジェクトを作成して実行する
0582デフォルトの名無しさん
2010/03/22(月) 00:25:27VisualStudioの使い方ならVisualStudioスレへ。
0583デフォルトの名無しさん
2010/03/22(月) 00:41:56ガーベジコレクタをC言語で実装することは可能ですか
0584デフォルトの名無しさん
2010/03/22(月) 00:49:150585デフォルトの名無しさん
2010/03/22(月) 01:02:13C++なんて私にはとても。Cでもっと学ばなあかんことがたくさんあるんです。特にポインタとか構造体なんかは…
0586デフォルトの名無しさん
2010/03/22(月) 01:16:19勿論可能ですが、こんなところでそんな質問をするような人には難しかろうと思われます。
大人しくSTLの勉強をしてC++を使うか、いっそC#でも使っててください。
0587デフォルトの名無しさん
2010/03/22(月) 12:44:23えっ・・・
0588デフォルトの名無しさん
2010/03/22(月) 13:27:01きもいんだけど。
0589デフォルトの名無しさん
2010/03/22(月) 14:25:21え?
0590デフォルトの名無しさん
2010/03/22(月) 14:28:43最低限サポートしなくてはならないだけであって
環境依存で他の型をとることに問題は無い
実際 int main(int, char**, char**) とか普通にあるしな(3つ目は環境変数)
0591デフォルトの名無しさん
2010/03/22(月) 14:37:05なんでCにしがみついているの?
適材適所だと思うけど。
そりゃさぁ、40過ぎで新しいことを吸収できなくなってしまったようなロートルなら無理もないとは思うけどね。
0592デフォルトの名無しさん
2010/03/22(月) 14:54:150593デフォルトの名無しさん
2010/03/22(月) 15:01:000594デフォルトの名無しさん
2010/03/22(月) 15:11:140595デフォルトの名無しさん
2010/03/22(月) 15:38:53引数の事は話題になってないとおもわれ。
0596デフォルトの名無しさん
2010/03/22(月) 16:54:00ロートルとかじゃなくても組み込みの仕事だとアセンブラはさすがに減ってるけどCが多いよ
あんたが使ってるPCのOSやドライバはC++つかえるかもしれんけど
キーボードやマウスやディスプレイやハードディスクや、掃除機や洗濯機や
おそらくほとんどはC++なんか使えないし使えても無駄だから使わないぜ
つまりCを使わざるを得ないから使ってんでしょ、
そうじゃないならC++を普通に使うじゃん
スレタイトル読んでみればわかるとおもうけどC++を使えって言うほうが、よりおかしい
0597デフォルトの名無しさん
2010/03/22(月) 17:03:03なんでC++使えないの?
コンパイラが無いの?
0598デフォルトの名無しさん
2010/03/22(月) 17:04:360599デフォルトの名無しさん
2010/03/22(月) 17:06:230600デフォルトの名無しさん
2010/03/22(月) 17:06:46しったかもいいところw
0601デフォルトの名無しさん
2010/03/22(月) 17:07:21> 使えても無駄だから使わないぜ
※ここにミッシングリンクの顕著な例が見られます。
> つまりCを使わざるを得ないから使ってんでしょ、
> そうじゃないならC++を普通に使うじゃん
0602デフォルトの名無しさん
2010/03/22(月) 17:07:220603デフォルトの名無しさん
2010/03/22(月) 17:08:28少しでも部品をケチるとCだよ
コンパイラ自体も多いしね(つまり枯れてるから問題も少ない)
炊飯器で、飯炊きクラス継承しておかゆクラスとか作ってるの馬鹿っぽいじゃん
0604デフォルトの名無しさん
2010/03/22(月) 17:10:510605デフォルトの名無しさん
2010/03/22(月) 17:12:300606デフォルトの名無しさん
2010/03/22(月) 17:15:18さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが簡単に生産されるようになってる。
正直いって、C を選ぶ理由が C++ プログラマーを追っぱらうため”だけ”だったとしても
それ自体、C を使う強力な理由になりうる。
0607デフォルトの名無しさん
2010/03/22(月) 17:18:150608デフォルトの名無しさん
2010/03/22(月) 17:18:19コメントとか//が使えたり構造体の宣言をC++風に書いても大丈夫なくらいのCだったけど
0609デフォルトの名無しさん
2010/03/22(月) 17:20:33おまえがエレガントといえるCのソースを晒してみろよ
おそらく晒せないと思うがなw
0610デフォルトの名無しさん
2010/03/22(月) 17:20:58http://warp.povusers.org/OpenLetters/ResponseToTorvalds.html
> Just this paragraph alone has so many logical fallacies in it that it's hard to even decide where to start.
0611デフォルトの名無しさん
2010/03/22(月) 17:24:54Cの質問スレで、質問者にC++使えよ、とか断りもなくC++の回答しちゃうやつとか
頭沸いてるんじゃねーの?
0612デフォルトの名無しさん
2010/03/22(月) 17:28:53まさにC++で解決される問題についてC++を勧めるのは間違ってないと思うよ。
質問者がC++を使えない(使わない)と明示してない限りはね。
だって多くの環境ではCと同時にC++も使えるんだから。
0613デフォルトの名無しさん
2010/03/22(月) 17:29:350614デフォルトの名無しさん
2010/03/22(月) 17:33:09>質問者がC++を使えない(使わない)と明示してない限りはね。
明示して無くても、質問者がC++を知っている前提で回答しているのがムカツク。
混乱させてどうするのかと。
せめて一言「Cじゃないけど...」ぐらい付け加えておけ。
0615デフォルトの名無しさん
2010/03/22(月) 17:34:46それは「断りもなくC++で回答しちゃう」やつだろ。それがダメだってのに反対してる人は居ないよ。
0616デフォルトの名無しさん
2010/03/22(月) 17:39:370617デフォルトの名無しさん
2010/03/22(月) 17:40:14スレたい嫁よ
Qホモにもてますが女にもてません、どうすればいいですか?
Aまさにホモになれば解決する問題ホモを進めるのは間違っていないと思うよ
0618デフォルトの名無しさん
2010/03/22(月) 17:41:23\ l ,ッィrj,rf'"'"'" lミ::::::: く れ モ ま
Y ,!ミ::::::: ヽ な 以 な
`ヽ、 | くミ:::::::: ノ い 外 い
|、__ ャー--_ニゞ `i::::,rく か は
``''ー- ゝ、'l  ゙̄´彑,ヾ }::;! ,ヘ.) ! 帰
゙ソ """"´` 〉 L_ っ
/ i , /| て r
≡=- 〈´ ,,.._ i 't-'゙ | ,へ ,r┘
,、yx=''" `ー{゙ _, -、 ; l レ' ヽr、⌒ヽ'
゙、`--─゙ /! `、
_,,、- ゙、 ー'' / ; `、
-''"_,,、-''" ゙、 /;;' ,' / 、\
-''" / `ー─''ぐ;;;;' ,' ノ
// / ヾ_、=ニ゙
0619デフォルトの名無しさん
2010/03/22(月) 17:48:14C++を使うことはホモになるのと同じぐらい難しいわけではない。
0620デフォルトの名無しさん
2010/03/22(月) 17:50:250621デフォルトの名無しさん
2010/03/22(月) 17:53:24>まさにC++で解決される問題についてC++を勧めるのは
回答者を馬鹿にしすぎてる。
0622デフォルトの名無しさん
2010/03/22(月) 17:57:560623デフォルトの名無しさん
2010/03/22(月) 17:58:490624デフォルトの名無しさん
2010/03/22(月) 18:17:35ここに来て聞いてる時点でCの話だと思う
そこでC++の話されて、
「ああ、そうか」とか「なるほどその手があったか」なんて人はそもそも極めて少ないと思う
>まさにC++で解決される問題
おそらくこういった質問をしてくる場合の一番多いパターンはc++の使用を考えたこともない人ではなくて
C++だとXXがあるんだけどなぁCにはないのかな
みたいな人だと思う
0625デフォルトの名無しさん
2010/03/22(月) 18:20:36可変長配列なんかはその典型で、C++なら比較的簡単に実装できることを知らない人は実際多いし。
# VCを使っていてさえ知らない輩も!
まぁ、いずれにしても噛み付く馬鹿が一番鬱陶しいわけで。
0626デフォルトの名無しさん
2010/03/22(月) 18:26:04って思う人が、このスレの質問者の中にどれだけいるかね?
普通は「Cの回答」を期待するでしょ。
C++の知識があって切り分けられるならいいけど、知らなかったとしたら混乱するだけ。
0627デフォルトの名無しさん
2010/03/22(月) 18:29:070628デフォルトの名無しさん
2010/03/22(月) 18:31:38C++はスレ違いだし、インラインアセンブラは環境への依存を少なくして書くのは難しいし
0629デフォルトの名無しさん
2010/03/22(月) 18:31:43あたま大丈夫?
Cで実装しなくちゃいけないのに、C++でやれよとかC++の回答もらっても嬉しくないだろ。
(しかも頼んでもないのに!)
むしろぶち切れるわ。
0630デフォルトの名無しさん
2010/03/22(月) 18:31:51どうしてそうなるんだw
C++の知識を必要なだけ補充して切り分ければいいだけじゃないか。
0631デフォルトの名無しさん
2010/03/22(月) 18:33:13それをこのスレで強要するのは間違い。
しかもスレ違い。
0632デフォルトの名無しさん
2010/03/22(月) 18:35:15単純なことで、C++がCの機能を使えるからって
CがC++の機能を使えるって訳じゃないでしょ
0633デフォルトの名無しさん
2010/03/22(月) 18:36:010634デフォルトの名無しさん
2010/03/22(月) 18:38:45一言Cじゃないよって断っておけよ。。
0635デフォルトの名無しさん
2010/03/22(月) 18:40:000636デフォルトの名無しさん
2010/03/22(月) 18:41:38初めからそういう結論だろ
0637デフォルトの名無しさん
2010/03/22(月) 18:41:400638デフォルトの名無しさん
2010/03/22(月) 18:43:27いやこのスレ見てると質問者の意図無視して断りもなくC++の回答するヤツが
たくさんいるから、つい。すまんかった。
0639デフォルトの名無しさん
2010/03/22(月) 19:13:170640デフォルトの名無しさん
2010/03/22(月) 19:47:26始めて学んだ言語がC++で、ずっとC++を使ってた結果
それ以外を認めることができなくなってるようにみえるよ
0641デフォルトの名無しさん
2010/03/22(月) 19:54:050642デフォルトの名無しさん
2010/03/22(月) 19:54:07始めて学んだ言語がCで、ずっとCを使ってた結果
それ以外を認めることができなくなってるようにみえるよ
0643デフォルトの名無しさん
2010/03/22(月) 19:55:100644デフォルトの名無しさん
2010/03/22(月) 19:58:140645デフォルトの名無しさん
2010/03/22(月) 19:58:530646デフォルトの名無しさん
2010/03/22(月) 19:59:250647デフォルトの名無しさん
2010/03/22(月) 20:00:510648デフォルトの名無しさん
2010/03/22(月) 20:19:20\ l ,ッィrj,rf'"'"'" lミ::::::: く れ 厨 ま
Y ,! ミ::::::: ヽ な 以 な
`ヽ、 | くミ:::::::: ノ い 外 い
|、__ ャー--_ニゞ `i::::,rく か は
``''ー- ゝ、'l  ゙̄´彑,ヾ }::;! ,ヘ.) ! 帰
゙ソ """"´` 〉 L_ っ
/ i , /| て r
≡=- 〈´ ,,.._ i 't-'゙ | ,へ ,r┘
,、 yx=''" `ー{゙ _, -、 ; l レ' ヽr、⌒ヽ'
゙、`--─゙ /! `、
_,,、- ゙、 ー'' / ; `、
-''"_,,、-''" ゙、 /;;' ,' / 、\
-''" / `ー─''ぐ;;;;' ,' ノ
// / ヾ_、=ニ゙
0649デフォルトの名無しさん
2010/03/22(月) 20:28:58ここがC言語のスレだからじゃね?
きのこスレでたけのこマンセーしてれば殺されても文句は言えんところだ
0650デフォルトの名無しさん
2010/03/22(月) 20:32:17これはかなりCに近い
0651デフォルトの名無しさん
2010/03/22(月) 20:32:280652デフォルトの名無しさん
2010/03/22(月) 21:05:27いい加減「C/C++なら俺に聞け」ってスレタイに変えてもいいと思うけど
Cだけに固執する意味が分からん
0653デフォルトの名無しさん
2010/03/22(月) 21:14:00「C++なら俺に聞け」
スレ立ててそこで勝手にやれ
0654デフォルトの名無しさん
2010/03/22(月) 21:18:36それなら別のスレがいくつかあるじゃん
0655デフォルトの名無しさん
2010/03/22(月) 21:18:57Cほど初心者に優しい言語は他にないと思うのです
0656デフォルトの名無しさん
2010/03/22(月) 21:27:180657デフォルトの名無しさん
2010/03/22(月) 21:30:03いい加減「C/N88-BASIC(86)なら俺に聞け」ってスレタイに変えてもいいと思うけど
Cだけに固執する意味が分からん
0658デフォルトの名無しさん
2010/03/22(月) 21:32:00下さい。直系の類似文法であるので答えますが、合っていると
は限りません。なるべく専用スレへ。
0659デフォルトの名無しさん
2010/03/22(月) 21:35:440660デフォルトの名無しさん
2010/03/22(月) 21:35:57誰も聞いてないでしょw
回答者がお節介しているだけ
0661デフォルトの名無しさん
2010/03/22(月) 22:11:490662デフォルトの名無しさん
2010/03/22(月) 23:47:29だからなんでもかんでもC++で回答して、プログラム書ける俺スゲーwwとか思ってんだろ。
0663デフォルトの名無しさん
2010/03/23(火) 00:11:480664デフォルトの名無しさん
2010/03/23(火) 00:15:080665デフォルトの名無しさん
2010/03/23(火) 00:19:100666デフォルトの名無しさん
2010/03/23(火) 00:21:58普通にいるよ。同様にC++を知らずにJava覚えた人もたくさんいる。
0667デフォルトの名無しさん
2010/03/23(火) 00:35:170668デフォルトの名無しさん
2010/03/23(火) 00:37:490669デフォルトの名無しさん
2010/03/23(火) 00:41:02C++を知らずにJavaを覚えることは
同様ではない
0670デフォルトの名無しさん
2010/03/23(火) 00:42:27製造するのは非常に難しいと思われ
Javaはある程度ここから始めてもC/C++をどっかで自習する
限り問題無い水準にあるんじゃねぇがと.
さすがにJava一辺倒で押していくのは無謀。
JavaScriptという逃げ道があるんで、行き詰まったらそこに
逃げて充電しながらリタイヤか再挑戦かを決めるのが吉かと
C++はCは勿論Javaの素養が必須。
Objective-C?シラね
0671デフォルトの名無しさん
2010/03/23(火) 00:45:50C++はいつかチャレンジしたい
0672デフォルトの名無しさん
2010/03/23(火) 00:46:590673デフォルトの名無しさん
2010/03/23(火) 00:49:250674デフォルトの名無しさん
2010/03/23(火) 00:51:30全く同じだよタコw
0675デフォルトの名無しさん
2010/03/23(火) 00:56:03C++で大規模なプログラムを書こうとすると散々なことになるよ
>>674
全っ然違う。Javaを覚える前にC++を覚えましょうなんて習慣はない
0676デフォルトの名無しさん
2010/03/23(火) 00:57:10これからはC#だ
0677デフォルトの名無しさん
2010/03/23(火) 00:58:020678デフォルトの名無しさん
2010/03/23(火) 00:58:12しかしその5%の部分が意外な程その後の運命を決定付ける。
Cを選ぶかC++にするかJavaにするか....結構悩ましい問題
じゃないかと...
0679デフォルトの名無しさん
2010/03/23(火) 00:58:200680デフォルトの名無しさん
2010/03/23(火) 01:10:13Java自体がC++を参考にして作られてるのに、お前は何を言ってるんだ…
0681デフォルトの名無しさん
2010/03/23(火) 01:13:34やっぱりね。C→C++→Javaの歴史的な流れのことを言ってるんだと思ったよ
別にこの順で学ぶ必要はない。C++の前にはCを学ぶのが一般的だが
Javaはこの限りではないし、初心者がJavaから入るのも良しとされている。GCもあるしね
0682デフォルトの名無しさん
2010/03/23(火) 01:16:590683デフォルトの名無しさん
2010/03/23(火) 01:19:09Java= ((C++)--)++
C++=(Java--)++
0684デフォルトの名無しさん
2010/03/23(火) 01:19:29なんでJavaScriptがでてくんだ?
CやJavaと同じ考えをしてたらまともなものができないからこその気分転換ってことかなぁ。。。
0685デフォルトの名無しさん
2010/03/23(火) 01:19:330686デフォルトの名無しさん
2010/03/23(火) 01:22:05新しい怒首領蜂(東方でもいい)よりも古い達人王の方が難しいだろ?
けど、達人王よりも新しいゲームのほうが覚えることが多いだろ?
そういうことだ。
0687デフォルトの名無しさん
2010/03/23(火) 01:23:16単に習慣ってだけならC++の前にCを学ぶ道理もないよ
なぜならCで使えるものがC++で使えないことがあるから
言い換えればC++からαを引いてもCにはならない
0688デフォルトの名無しさん
2010/03/23(火) 01:23:49最初のプログラミング学習に最適だとは思うけど
0689デフォルトの名無しさん
2010/03/23(火) 01:33:22C++からα引いてCにならないことと
Javaからα引いてC++にならないことは次元が違う
0690デフォルトの名無しさん
2010/03/23(火) 01:42:25は?JavaはC++ + αではないんだろ?αって何よw
0691デフォルトの名無しさん
2010/03/23(火) 01:45:230692デフォルトの名無しさん
2010/03/23(火) 01:46:16新しい言語ってのは、古い言語の欠点を補うために必死なわけだよ。
そのために大抵は何かが犠牲になってる。
C→C++は互換性を保ちつつ新しい要素を入れた。これにより、C++本来の思想とは異なった、
ベターCとして利用するプログラマが現れた。
信じられないかもしれないが、boostはおろか、STLまでもを禁止するプロジェクトが存在する。
C++→JavaはCの部分を切り捨て、VMにより、移植の手間を大幅に省いた。
しかし、パフォーマンスが落ち、VMの制限により、ネイティブなやり取りは難しくなった。
C#は実行時に環境に応じた最適化を行うことで、パフォーマンスの劣化という欠点を補った。
しかしそれでもシステムの深いところを触ることは難しかった。代わりに架け橋となる技術を提供した。
どんどん言語仕様も変化していった。これにより、他のプラットフォームがついてこれなくなり、
結果として同一言語による移植ということが困難になってしまった。
初心者こそCを学べ、という意見も分かるし、初心者はとっつきやすいC#あたりを学べという意見もよく分かる。
個人的にはCから入ったほうが、あとが楽なんではないかなと思っている。
スレ汚しだったらスマソ。
0693デフォルトの名無しさん
2010/03/23(火) 01:50:480694デフォルトの名無しさん
2010/03/23(火) 01:53:460695デフォルトの名無しさん
2010/03/23(火) 02:00:18逆だろ能無しw
おまえがJavaからα〜つったんだろw
つーかおまえこそ詭弁並べてるだけじゃん
習慣のみをもって学習の順序とか言ってるし
Cを知らずにC++覚えるヤツは存在する
同様にC++を知らずにJAVA覚えるヤツも存在する
これだけが事実だ
0696デフォルトの名無しさん
2010/03/23(火) 02:02:43C++を飛ばしてJavaを覚えるのは
同様ではない
後者は飛ばすという概念すら存在しない
0697デフォルトの名無しさん
2010/03/23(火) 02:03:350698デフォルトの名無しさん
2010/03/23(火) 02:04:36Javaの教材でC++の知識を要求されることは普通ない
0699デフォルトの名無しさん
2010/03/23(火) 02:06:49>C++本来の思想とは異なった
これって本当なの?
状況によってはベターCとして利用できるのは
狙ったものだと思ってたんだけど
0700デフォルトの名無しさん
2010/03/23(火) 02:11:00なんで同列に並べるんだろ
Cを知らずにC++なんて例外的で普通じゃない
C++やらずにJavaの方は、perlやらずにRubyくらい普通
0701デフォルトの名無しさん
2010/03/23(火) 02:33:46それらの習慣の話が>>663の「CやらずにC++始められる人はいない」の理由になると思ってんの?
現実にオレの知人だけでも数人いるんだからそんなもの根拠にすらならないよ
おまえらが理由と思ってることは単に「知っていた方が入るのにラク」レベルの話
実際はCの書き方とC++の書き方は同じ部分のほうが少ない
それも当然で同じ書き方をするのであればC++を使うメリットが無いからだ
0702デフォルトの名無しさん
2010/03/23(火) 02:44:19あくまでCとして、融通の効かないところはC++を使う
これがベターCとしてのC++を使うメリットでしょ
C++から始めるとそうは思わないから、Javaから始めることと同様に語っちゃうのかな
0703デフォルトの名無しさん
2010/03/23(火) 02:55:05UNIXプログラマ : Cを知らずしてC++が習得できるわけない
0704デフォルトの名無しさん
2010/03/23(火) 03:58:340705デフォルトの名無しさん
2010/03/23(火) 03:59:17}
と書くと条件分岐がうまくいかないようなのですがこの場合はどうなっているんでしょうか。
0706デフォルトの名無しさん
2010/03/23(火) 04:00:500707デフォルトの名無しさん
2010/03/23(火) 04:24:49if(x==y==z)
↓
if(2==2==2)
↓
if((2==2)==2)
↓
if((1)==2)
0708デフォルトの名無しさん
2010/03/23(火) 04:42:06かけて不毛な話題tnx
ただし、なんだかんだいってCは星の数ほどあるプログラミング
言語の中でもやはり別格。まともにOSを作った実績があるのは
ほぼCのみ
0709デフォルトの名無しさん
2010/03/23(火) 06:05:42a++;
}
void Func01(int &a){
a++;
}
void Func02(int *a){
a++;
}
int main(void){
int n = 0;
Func00(n); printf("%d\n", n);
Func01(n); printf("%d\n", n);
Func02(&n); printf("%d\n", n);
}
このプログラムを実行させる前は「0、1、(不定値)」
と表示されると予想していたのですが、実際は「0、1、1」と表示されます。
nのアドレスをFunc02へ渡して、そのポインタのアドレスをインクリメント(a++)しているので、
可笑しな値が表示されると思ったのですが・・・
関数へ変数のアドレスを渡して、そのアドレスの場所を変えているのに、
なぜ呼び出しもとのアドレスは変わらないのでしょうか?(*a)++の場合は値が変わりますが・・・。
0710デフォルトの名無しさん
2010/03/23(火) 06:06:55”アドレスのコピー”を渡しているから、変わらないのですね。
書き込んだ直後に理解しました。
0711デフォルトの名無しさん
2010/03/23(火) 06:08:22Func00 を呼んでも n が 0 のままなのはわかるんだよね?
それなのになんで Func02 を呼んだら n のアドレスが変わると思うのか
よくわからないよ。
0712デフォルトの名無しさん
2010/03/23(火) 06:09:050713デフォルトの名無しさん
2010/03/23(火) 06:17:48ポインタ自体も普通の変数だということを忘れそうになる。
0714デフォルトの名無しさん
2010/03/23(火) 13:24:490715デフォルトの名無しさん
2010/03/23(火) 13:46:190716デフォルトの名無しさん
2010/03/23(火) 14:12:02それで怒り狂って誤爆
なんていうかDelphiとそのユーザーの生き様をあらわしてるよな
けっしてDelphi悪くない、というか結構良くできてんだけどな
なんでか流行らんよな
0717デフォルトの名無しさん
2010/03/23(火) 14:25:580718デフォルトの名無しさん
2010/03/23(火) 14:27:320719デフォルトの名無しさん
2010/03/23(火) 14:28:42すぐできると思う理由が分からない
書き換えたければコピーして使えばいいだけのこと
0720デフォルトの名無しさん
2010/03/23(火) 14:44:180721デフォルトの名無しさん
2010/03/23(火) 14:49:50char* p = "abc"
として、aが1000番地、bが1001番地、cが1002番地に格納されているとして、
p[1] = 'd';
と書いたら1001番地の内容を'b'から'c'に書き換えるだけだと思うんですが
コンパイラの人の立場ではこれは難しいんでしょうか。
できないことは知ってるけどできない理由が分からない。
0722デフォルトの名無しさん
2010/03/23(火) 15:02:01セキュリティの観点からコード領域は保護されるべきということでわざわざ書き換えができないようになっている
0723デフォルトの名無しさん
2010/03/23(火) 15:10:16荘蜷フというのはCP/M用のWhitesmiths-CとかBDS-Cとか。
0724デフォルトの名無しさん
2010/03/23(火) 15:15:390725デフォルトの名無しさん
2010/03/23(火) 15:30:340726デフォルトの名無しさん
2010/03/23(火) 15:34:28デメリットの方が大きい。
わざわざクラッカーに攻撃手段を与える必要もないだろう。
文字列リテラルは、変更を要しないので、メモリ空間上ではコード領域と同じページに置かれる。
変更したければ、>>719のように変更可能な領域にコピーして使えばいいだけの話。
0727デフォルトの名無しさん
2010/03/23(火) 15:49:300728デフォルトの名無しさん
2010/03/23(火) 15:52:19char* p;
{
p = "abc";
}
printf("p[1]:%c\n", p[1]);
こういうプログラムも間違いじゃないのか。。
0729デフォルトの名無しさん
2010/03/23(火) 15:54:20loaderの話だろ。
0730デフォルトの名無しさん
2010/03/23(火) 16:26:36それは逆で、昔の環境&コンパイラだと普通にできた。
データけでなく、自身のコードの書き換えもできた。
最近はそれをできないようにする環境(保護機能)が整ったので、
コンパイラもそれをサポートするようになった。
0731デフォルトの名無しさん
2010/03/23(火) 16:36:21DOSでもできたよ。(できたというのは保護されないという意味ねw)
Lattice C、MS-C では普通にやってたから。
そもそもCである以上キャストすればできるわけで、
それを例外とするのはシステム側の機構だよね。
0732デフォルトの名無しさん
2010/03/23(火) 16:38:55コンパイラだよ。
そこからコンパイル時にアドレスを確定できるメリットが発生する。
0733デフォルトの名無しさん
2010/03/23(火) 16:43:09こういう関数もありだよ。つーか、割と常套手段だったりする。
static const char * foo() {return "foo";}
0734デフォルトの名無しさん
2010/03/23(火) 17:07:09たしか -pedantic だか何かだった。
同じ内容のリテラル文字列でも同一化せずに
別々に用意して、書き替えに対応してたはず。
char *a, *b;
a = "hoge";
b = "hoge";
これで最適化しても a != b になる。
0735デフォルトの名無しさん
2010/03/23(火) 17:13:420736デフォルトの名無しさん
2010/03/23(火) 17:17:06これってどういうことなの?
あらかじめ確保してないところに書き込むとエラー起きるんじゃないの?
0737デフォルトの名無しさん
2010/03/23(火) 17:20:05環境をkwsk
0738デフォルトの名無しさん
2010/03/23(火) 17:26:52うざい。
>>737
環境は言えない。
0739デフォルトの名無しさん
2010/03/23(火) 17:30:13内容が同じリテラル文字列が別々のところで定義されていると、
それらをまとめてメモリを無駄遣いしないように最適化を行うコンパイラが存在する。(こっちのが主流だけどw)
そうすると別のところで定義していても a == b となる。
このためリテラル文字を書き換えると全然関係ないところの文字列も変わってしまい笑えることがある。
昔のCのプログラマなら常識。けど今の子たちは知らないw
そこから教えてあげないと。
0740デフォルトの名無しさん
2010/03/23(火) 17:30:320741デフォルトの名無しさん
2010/03/23(火) 17:31:39> a = "hoge";
これは、どこかに確保された文字列リテラル"hoge"の先頭のアドレスをaに代入しているだけ。
"hoge"をコピーしているわけではない。
>>738
> 環境は言えない。
なんで?
0742デフォルトの名無しさん
2010/03/23(火) 17:34:04>>>738
>> 環境は言えない。
>なんで?
ほんとは -pedantic じゃなくて -fwritable-strings なのに、間違えたのが恥ずかしかったから。
0743デフォルトの名無しさん
2010/03/23(火) 17:35:50文字列リテラルを書き換えようとしたときにそういう風にコンパイラがエラーを言ってくれればいいのに。
ただsegmentation faultとだけ言われても分からんし。
0744デフォルトの名無しさん
2010/03/23(火) 17:40:500745デフォルトの名無しさん
2010/03/23(火) 17:42:03書き換えるのは実行時だよ、コンパイル時じゃないんだから、コンパイルエラーにはならんよ。
だから実行時にメモリを書き込もうとしたときにシステムが検知して例外エラーが発生している。
これはCの駄目なところであり、良いところでもある。
0746デフォルトの名無しさん
2010/03/23(火) 17:42:31違う。
知らずに文字列が書きかえられるとバグのもとだから、書きかえが禁止されている。
char *getTemporaryFilename()
{
return "/tmp/temporaryfilename";
}
char* p = getTemporaryFilename();
strcpy(p, "/etc/hosts");
されるといやじゃん。
0747デフォルトの名無しさん
2010/03/23(火) 17:48:53数値リテラルも文字列リテラルもユニーク(意味などないのですが
当然意味も変わることがありません)
そしてアドレスなどありません。(アドレス演算子も使えません)
次の書式
char *q="ABCDEFGGH";
char p[]="ABCDEFGHJ";
これらはシンタックスシュガー(慣用表現)に
過ぎず「正式」なものではありません。多くのコンパイラが
鷹揚に
char p[]={'A','B','C','D','E','F','G','H','I','J','¥0'};
char *q=(char*)&p[0];
と解釈してくれるだけのことです。
0748デフォルトの名無しさん
2010/03/23(火) 17:49:51いやそれは違うぞ。
C言語は文字列の書き換えを検出する方法がないんだよ。
>知らずに文字列が書きかえられるとバグのもとだから、書きかえが禁止されている。
C言語で書き換えに禁止にしたりはしない。リテラル文字列を警告なしで char * で受けれるんだから。
書き換えられて困る場合は、プログラムが
const char *getTemporaryFilename()
と宣言して、少しだけ抵抗することができる。
0749デフォルトの名無しさん
2010/03/23(火) 17:52:42あほですか?
char *q = "abc";
と
char p[] = "abc";
は全然違う。それに、昔は
char p[] = "abc";
とは書けず、
static char p[] = "abc";
しか許されていなかった。
その心を理解してから書き込まなきゃだめね。
0750デフォルトの名無しさん
2010/03/23(火) 17:53:44またまたご冗談をw
0751デフォルトの名無しさん
2010/03/23(火) 17:55:55char *p="ABC";
は
少なからずのコンパイラは
const char pp[]={'A','B','C',0}
char *p=(char*)&pp[0];
と何故か解釈してくれます。
さらに「親切な」コンパイラはおせっかいにも
書き換えるとエラーになる領域にppを初期化して
くれることでしょう。
"ABC"は何故書き換えられないかという問いは
"ABC"は変数ではないから
というのが正解ですが、書き込み不能な変数
だとか書き込み不能な領域に勝手に設定するのは
一部のコンパイラです。
0752デフォルトの名無しさん
2010/03/23(火) 17:56:41で?
0753デフォルトの名無しさん
2010/03/23(火) 17:59:060754デフォルトの名無しさん
2010/03/23(火) 17:59:46またまたアホですか?
char *p="abc";
と書くとき "abc" が格納される領域はスタックとはかぎらない、ことを再三申し上げているのですが。
0755デフォルトの名無しさん
2010/03/23(火) 18:04:140756デフォルトの名無しさん
2010/03/23(火) 18:08:45この範囲を超えたアドレスはどのように表すんですか?
0757デフォルトの名無しさん
2010/03/23(火) 18:09:56スタックとかヒープとかテキスト領域、BSS とかを意識していない。
0758デフォルトの名無しさん
2010/03/23(火) 18:11:00その昔、アドレスをあらわすのにセグメント+オフセットで表現していた環境がありまして‥‥‥。
0759デフォルトの名無しさん
2010/03/23(火) 18:11:39>この範囲を超えたアドレスはどのように表すんですか?
アドレスがその範囲しかないなら、この範囲を超えたアドレスって存在しないんじゃないですか?
アルファベットってAからZまでの26個しかないじゃないですか。
この範囲を超えたアルファベットはどのように表すんですか?
0760デフォルトの名無しさん
2010/03/23(火) 18:13:14あるいは、バンク切り替え命令みたいなのがある
後半***あたりを(物によって違う)ごそっとバンク切り替えて使ったりする
0761デフォルトの名無しさん
2010/03/23(火) 18:15:35後者には答えがある。記号を付加して使う。
á, ä, à, ã, ç, ÿ などがそう。
0762デフォルトの名無しさん
2010/03/23(火) 18:19:450763デフォルトの名無しさん
2010/03/23(火) 18:20:22その答えは、質問が
「メモリのアドレスって0000からFFFFまでしかないじゃないですか。」
というときに使ってくださいw
0764デフォルトの名無しさん
2010/03/23(火) 18:30:140765デフォルトの名無しさん
2010/03/23(火) 18:32:13C言語のアドレス演算子で求められるアドレスは8桁の16進数じゃないですか。
C言語で4GB以上のメモリの扱いはどうなっているの?ということです。
0766デフォルトの名無しさん
2010/03/23(火) 18:33:08コンパイルオプションを変えたら分かるさ
0767デフォルトの名無しさん
2010/03/23(火) 18:35:37そんなもん、C言語の種類による
君が使ってるC言語の種類を書けばすぐに答えてやるから
0768デフォルトの名無しさん
2010/03/23(火) 18:37:10僕のパソコンはRGBをプレーン切り替えしてるんだぞ。すごいだろ。
0769デフォルトの名無しさん
2010/03/23(火) 18:41:11Borland C++Compiler 5.5.1です。
0770デフォルトの名無しさん
2010/03/23(火) 18:49:28それ 32bit だからアドレスは 4GB までしか扱えない。
0771デフォルトの名無しさん
2010/03/23(火) 18:52:46環境やコンパイラしだい
0772デフォルトの名無しさん
2010/03/23(火) 18:58:49Borland C++ Compiler 5.5.1 が 32ビット CPU のためのコンパイラだから
32ビットになってるだけ。
アドレス長が 64 ビットの CPU 用のコンパイラならアドレスは 64 ビットで 8 バイト。
0773デフォルトの名無しさん
2010/03/23(火) 19:30:440774デフォルトの名無しさん
2010/03/23(火) 19:31:54func(...)(xxxxx);
の形をした関数あるんですが、なんでこんな形なの、どう解釈するの
関数に()()が2つあるって...
0775デフォルトの名無しさん
2010/03/23(火) 19:35:45... と xxxxx の部分をちゃんと書けよw
0776デフォルトの名無しさん
2010/03/23(火) 19:38:07#include<stdio.h>
typedef void (*func)(void);
void hello(void){
printf("hello\n");
}
func foo(void){
return hello;
}
int main(void){
foo()();
return 0;
}
0777デフォルトの名無しさん
2010/03/23(火) 19:39:420778デフォルトの名無しさん
2010/03/23(火) 19:45:220779デフォルトの名無しさん
2010/03/23(火) 19:45:26今時流行らないって
カッコつけて書くと
( *( foo() ) ) ()
わかりやすい
0780デフォルトの名無しさん
2010/03/23(火) 19:57:06これが全然理解できません。
解説してくれる方はいないでしょうか?
0781デフォルトの名無しさん
2010/03/23(火) 19:58:39func が関数へのポインタを返すので、その関数のポインタが示す関数を呼び出しているだけのこと。
関数へのポインタから関数へは自動的にキャストされる。
0782デフォルトの名無しさん
2010/03/23(火) 20:00:54余計にわかりにくいぞ。
百歩譲って
(*foo())()
だな
0783デフォルトの名無しさん
2010/03/23(火) 20:05:24しかしtime_tは32ビットです。これは何か理由があるのでしょうか。
0784デフォルトの名無しさん
2010/03/23(火) 20:15:510785デフォルトの名無しさん
2010/03/23(火) 20:20:16long longが使える32ビットCPU
でlong long が使えないのは何故か?
というのならわからない。
使えるのは何故かというのはわかる?
time_tが32ビットなのはきっと2038年
問題とかを発生させたいという理由じゃないかと..
キミは邪推するのかな?
0786デフォルトの名無しさん
2010/03/23(火) 20:21:580787デフォルトの名無しさん
2010/03/23(火) 20:23:34ソフト的に複雑な計算をしているから
>しかしtime_tは32ビットです。これは何か理由があるのでしょうか。
その環境の制限
0788デフォルトの名無しさん
2010/03/23(火) 20:26:05回答ありがとうございました。
0789デフォルトの名無しさん
2010/03/23(火) 20:39:53アンダースコアをスペースに変換してみると、32ビット符号無し整数の内部形式(2進数)を
考え、1のビットを左詰めにしてるようだ。このソースだと 0〜0x7fffffffの間は動作するけど
0x80000000を超えるとバグる。宿題スレでも質問してるみたいだけど、2進数、ビット演算、
3項演算子の知識が無いと、ソース見ても分からないかもね
0790デフォルトの名無しさん
2010/03/23(火) 21:29:03atof の逆のftoaを外部関数を呼ばずに書こうと思ったのですが float d=456.456 を ftoa(s,d) すると 456.456000000.... となってしまうのでこまってます(コードパッドの出力、23行目)
自分の環境では(ubuntu10.04(64bit) gcc4.4.3)なぜか 456.456 となります。コードパッドでも456.456と出力されるようにする方法がわかりません
0792デフォルトの名無しさん
2010/03/23(火) 21:32:59%.3fとかにすりゃいいじゃん
.20って欲張りさんだろ
0793デフォルトの名無しさん
2010/03/24(水) 07:08:01これを ABCDに変換したい場合どうすればいいのですか?
たとえば 41に0xをつければいいような気がするのですが、
どうやってつければいいかわかりません。
41読み込んだエリアがbufとして、"0x"+bufとかはだめっすよね。
お願いします。
0794デフォルトの名無しさん
2010/03/24(水) 07:12:36十進の41を十六進にして、なの?
sprintf("0x%d",buf) か
sprintf("%x",buf) じゃね
0795デフォルトの名無しさん
2010/03/24(水) 07:16:22buf / 10 * 16 + buf / 10
最初から16進数として読み込むなら
fscanf(fp,
0796デフォルトの名無しさん
2010/03/24(水) 07:17:23fscanf(fp, "%2x", &buf);
0797デフォルトの名無しさん
2010/03/24(水) 07:20:11buf / 10 * 16 + buf % 10
だった。
0798デフォルトの名無しさん
2010/03/24(水) 07:23:190799デフォルトの名無しさん
2010/03/24(水) 10:01:590800デフォルトの名無しさん
2010/03/24(水) 14:48:490801デフォルトの名無しさん
2010/03/24(水) 19:04:442. bufに2バイトずつ読み込む
3. x = strtol(buf, NULL, 16);
4. xの内容をどうにかする
5. 2へ戻る
0802デフォルトの名無しさん
2010/03/24(水) 19:06:202バイト読むの?
0803デフォルトの名無しさん
2010/03/24(水) 19:14:45つーか間違ってた。char buf[3]だなw
読み込みはasciiでもbinaryでもいい。
0804デフォルトの名無しさん
2010/03/24(水) 19:30:05テキストファイルで4142〜なんだから、binary表示すると34 31 34 32〜でしょ
0805デフォルトの名無しさん
2010/03/24(水) 19:34:56いやいや 33 34 33 31 33 34 33 32 という状態で読まないといけないから4バイトずつ読むべき
って流れに持っていけばよろしい?
0806デフォルトの名無しさん
2010/03/24(水) 19:38:38/ 、゙ヽ、 ‐-'´ ヽ‐- / / ヽ
,/´ .., ヽ,,l_)' zェェェァ' ;rfァt ヽ ,ト/ / ヽ
/ ヽ,r' ,l′ _,,, . __,, ,l゙.-〈__r,'、 ヽ_
_.l ヽ」 ,l .イてソ` l イにj`,/ ゙‐ヽ、_,, /l ここおかしいんじゃねえか?
,l l| −'´ll ,l rソi" ヽ じ'' f゙l .,//゙l //\
l`l| l|ヽ v'⌒ヽ .,ノ j/ |l // }
l \ l| ,l l_U> r‐--‐ァ ,l |,l // l
/ '\ l|`l ゝ_,´ ゙ヽ__r′ .,.' ___l ヽ // |
,l '\ l| .lヽ__lL..,,, __ ,, _イ___./ | ∨/ ,}
| ヽl | ,| .ヽ \ //ヽ ,| ,l
| l ,l ヽ \// l \ /
ヽ | \. ヽ/ l ヽ /j
\ / ヽ ヽ | l /
゙l\.. / ヽ ヽj | , /
ヾ ヽ ヽ ヽ / ,l
ヽ、 ヽ l } / ,r′
ヽ ヽ | /′ ,,...''
`'':..、 ___ ___,..-.. |, ,l , :..-‐'"´
 ̄ /lr‐‐‐'--、_..... l_,..-'''""'
0807デフォルトの名無しさん
2010/03/24(水) 19:43:570808デフォルトの名無しさん
2010/03/24(水) 20:26:03.net系の言語にある、timer関数。
一定期間ごとに指定関数を呼び処理を行う関数ですが、
この機能と類似した処理を行うのに参考になるページを教えてください。
例:Aメソッドの処理時間 20-350ms
Aメソッドの処理時間に関係なく、500ms毎にAメソッドを呼び出す。
ちなみにgccです。
0809デフォルトの名無しさん
2010/03/24(水) 20:30:57は危険
0810デフォルトの名無しさん
2010/03/24(水) 20:36:350811デフォルトの名無しさん
2010/03/24(水) 20:53:23wait する前に現在時刻と以前の時刻を調べればよかろ
0812デフォルトの名無しさん
2010/03/24(水) 21:03:29時間が着たら教えてくれる子プロセス作るとかは?
あとよくわからんけど、Aメソッドの処理時間に関係なくってことは割り込みみたいに
関数が2重3重に動く必要があるんじゃねーの?
0813デフォルトの名無しさん
2010/03/24(水) 22:12:37forkでもいいけど
0814デフォルトの名無しさん
2010/03/24(水) 23:22:48switch((gettime()>t+500)?0:++i){
case 0:t=gettime();A();break;
case 1:
// 物凄く時間のかかる処理を分割した其の1
goto ck;
case 2:
// 物凄く時間のかかる処理を分割した其の2
goto ck;
defaulet:break;}
0815デフォルトの名無しさん
2010/03/24(水) 23:43:36おもちゃつくった
0816デフォルトの名無しさん
2010/03/25(木) 08:18:53void main() (笑)
0817デフォルトの名無しさん
2010/03/25(木) 09:40:040818デフォルトの名無しさん
2010/03/25(木) 09:49:40細かいことグダグだ抜かすなよ低脳が
0819デフォルトの名無しさん
2010/03/25(木) 10:33:28main 関数は必ず int を返すように教わったんだろうな、ぷっ
0820デフォルトの名無しさん
2010/03/25(木) 11:13:05INTを返すのが仕様なんだろ?仕様である証拠もってこいや。
0821デフォルトの名無しさん
2010/03/25(木) 11:21:190822デフォルトの名無しさん
2010/03/25(木) 11:25:28main()については
1. int main()
2. int main(int argc, char **argv)
3. 1.2.のコンパチ
4. 環境による
と定義されてる。環境次第で void main() もあるということ。
余談だが、main()の戻り値が省略されたとき、C99では
戻り値がintだったら0を返す、とも規定されてる。
つまり、「戻り値がintでないこともある」ということがここでもわかる。
0823デフォルトの名無しさん
2010/03/25(木) 12:15:18void main() はやっぱりダメでしょ。
http://www.kijineko.co.jp/tech/superstitions/void-main.html
0824デフォルトの名無しさん
2010/03/25(木) 12:34:47void でいい場合があるのに、駄目とか言う方がおかしいだろ。
そもそもCの規格なんて何種類もあるのに、
全部に当てはまるコードなんて書けるわけないんだよ。
もし最初質問者が「〇〇の仕様に準拠する形でお願いします。」
とか書いてあるんなら別だが、そうでないのにどんなコードで書こうと自由だろ。
あと参考までに聞きたいが
君の推奨する「JIS X3010:2003」に完全準拠したC言語って実在するのか?
0825デフォルトの名無しさん
2010/03/25(木) 12:51:21> void でいい場合があるのに、駄目とか言う方がおかしいだろ。
今まで何度かPC環境で void main(void) で終了コードが不定なプログラムに
悩まされたことがある。やめてほしいんだ。
> そもそもCの規格なんて何種類もあるのに、
> 全部に当てはまるコードなんて書けるわけないんだよ。
誰もそんなことは頼んでない。
> もし最初質問者が「〇〇の仕様に準拠する形でお願いします。」
> とか書いてあるんなら別だが、そうでないのにどんなコードで書こうと自由だろ。
それは自由だが、無駄に対象環境を絞る意味も無い。
> 君の推奨する「JIS X3010:2003」に完全準拠したC言語って実在するのか?
特定の規格を推奨した覚えはないんだけど、「完全」というなら実在しない
可能性のほうが高いだろうね、とは言える。だからどうだということもないんだけど。
0826デフォルトの名無しさん
2010/03/25(木) 13:00:290827デフォルトの名無しさん
2010/03/25(木) 13:01:14PC環境っていう環境に限定した話だろ、それ
0828デフォルトの名無しさん
2010/03/25(木) 13:01:450829デフォルトの名無しさん
2010/03/25(木) 13:05:480830デフォルトの名無しさん
2010/03/25(木) 13:08:38>今まで何度かPC環境で void main(void) で終了コードが不定なプログラムに
>悩まされたことがある。やめてほしいんだ。
void で宣言してるんだから、終了コードを返す意思などないということだよ。
終了コードを返さないプログラムの戻り値を見るというのが間違い。
もし int で宣言されていて固定の0が帰ってきても、正しいエラー番号が帰ってくる保証などない。
こんなことはプログムの仕様がどうなっているかの問題であり、それがわからない状態で
エラーコードに依存した処理を行おうとしていることが根本的な過ち。アホ過ぎる。
main を int で宣言したところで、なんの問題解決にもならない。
0831デフォルトの名無しさん
2010/03/25(木) 13:09:58>無駄に対象環境を絞る意味も無い
そのとおり! いいこと言うね!
前提もなしに「PC環境」とやらにいきなり限定する必要も無いからな。
想定できることは全て想定してから、ひとつずつ潰すのが大事だ。
いきなりPC環境の話に絞った話を始めてもしょうがないし。
0832デフォルトの名無しさん
2010/03/25(木) 13:13:55悪いことは言わないから、
JISの仕様を気にする前に、社内の仕様を確認した方がいいよ。
0833デフォルトの名無しさん
2010/03/25(木) 13:19:000834デフォルトの名無しさん
2010/03/25(木) 13:21:44戻り値を見る必要があるのにvoidで宣言したプログラマに
仕様を問いただすのが先決だと思うよ。
そしてコードレビュアをひっぱたくのも忘れずに。
もし、組込み分野等から持ってきたソースを流用してるとか
そういうのなら自分の脳の出来を疑うのが先。
このあたりは特に動作環境や言語仕様には関係ない話かな。
これを以ってvoid mainは撲滅じゃい!と言い出すのはお門違いだね。
0835デフォルトの名無しさん
2010/03/25(木) 13:22:100836デフォルトの名無しさん
2010/03/25(木) 13:24:040837デフォルトの名無しさん
2010/03/25(木) 13:25:150838デフォルトの名無しさん
2010/03/25(木) 13:43:110839デフォルトの名無しさん
2010/03/25(木) 13:45:41プロトタイプ宣言無しで未定義の関数を
バシバシ書いたCコードがコンパイルで
きた古き良き時代と重なる
今では考えられないくらい小さなシステ
ムだけど(メモリ8Mバイト、HD
20Mバイトw プロセッサクロック
20MHz。これでも当時200万円
はした)
0840デフォルトの名無しさん
2010/03/25(木) 13:48:30お前がプロセスの戻り値を使ったことが無いだけじゃね?
0841デフォルトの名無しさん
2010/03/25(木) 13:50:36この時代のC言語は void というキーワードすらなかったよね。
0842デフォルトの名無しさん
2010/03/25(木) 14:01:15LinuxだろうとDOSだろうとWindowsアプリだろうと
プロセスの戻り値は今でも重要な意味を持っています。
0843デフォルトの名無しさん
2010/03/25(木) 14:09:28Windows のアプリなんて 0 しか返さないよ。
そんなもんチェックして何がわかるの?
0844デフォルトの名無しさん
2010/03/25(木) 14:17:04使わないほうが(精神衛生上)良い
使えないツールが増えているから
軽量DB経由ってのがよさげ
0845デフォルトの名無しさん
2010/03/25(木) 14:24:390846デフォルトの名無しさん
2010/03/25(木) 14:25:23強制終了されたりすると0以外(1とか)が返る。
電卓を起動して、タスクマネージャで殺してみるといいよ。
0847デフォルトの名無しさん
2010/03/25(木) 14:26:44起動スクリプトを読んでからもう一度ここに来い。
0848デフォルトの名無しさん
2010/03/25(木) 16:02:20ただ半分の256には死んだ理由が入ってるよ
メモリ取れないとか、強制終了とか
正常終了なら自分が返してるやつ
0849デフォルトの名無しさん
2010/03/25(木) 16:22:49あのね、それはシステムが1を返してるんだよ。
プログラムの main で値を返すようにしてあっても無視されるの。
だから意味がないと言ってるんだよ。
Windows標準のプログラムでさえ、戻り値は常に0としてるのに、
他のところで作ったプログラムの戻り値に統制などあるはずもない。
常識知らずにも程があるよ。
0850デフォルトの名無しさん
2010/03/25(木) 16:24:31強制終了した場合は返らない。
0851デフォルトの名無しさん
2010/03/25(木) 16:27:03あれのDr.ナントカのコラムで
「ねえねえドクター、ウインドウズはmain関数はvoidで良いの?」みたいな外人の質問があって
「WindowsもOSがプロセスの戻り値見てるからゼロ意外だと処理が違う
さらにvoidだと余計なことしなくちゃいけない
小さいことだけどmainから始まるプログラム書く人はWINDOWSに優しい気持ちになって
voidやめてreturn 0をちゃんとしてくれ」
って書いてたよ
もちろんUnix系ならなおさらint mainだろうけど
Windowsに冷たくても平気な人だけvoidにすれば?
0852デフォルトの名無しさん
2010/03/25(木) 16:28:10main の戻り値なんかに頼るとか。もうアホかと。
エラー処理ならそのままexit関数呼ぶでしょ。なんで main まで戻すの。
それに Windows のアプリケーションで main 関数なんか定義しないでしょ。
0853デフォルトの名無しさん
2010/03/25(木) 16:29:49これって何に使うAPIだと思う?
GetExitCodeProcess
0854デフォルトの名無しさん
2010/03/25(木) 16:31:18例は不適切だったな。
とにかく失敗したら0以外、成功したら0が返るってのが
仕様として決められてるので、それに則るべきだろう。
わからないときは0にしとけってことだ。
0855デフォルトの名無しさん
2010/03/25(木) 16:32:05あ?本当にそうか?んなわけねーべ
今まで何度も子供に仕事させてその成否を親に返すみたいなプログラム作ったぞ
お前らにとってGetExitCodeProcessとかは何なの?
0856デフォルトの名無しさん
2010/03/25(木) 16:32:13いい加減なことばっかり言うな。
>WindowsもOSがプロセスの戻り値見てるからゼロ意外だと処理が違う
どう違うの言えよ!
int main() で宣言して return 1; したらどうなるんだよ?
システムがクラッシュするの????
0857デフォルトの名無しさん
2010/03/25(木) 16:34:34exitで返すのとmainのreturnで返すのは
意味的にどっちも同じです。
0858デフォルトの名無しさん
2010/03/25(木) 16:35:50しねーよ、それは値を返しているのだから
ゼロとは違うけどクラッシュはしねえ
voidでもクラッシュはしねえ
でもなんか余計なことやらんといけないからintで書いてくれって話だよ
もちろんいい加減な記憶で書いてるよ
>return 1; したらどうなるんだよ?
親プロセスが起こした子供ならその値を取得できるよ
0859デフォルトの名無しさん
2010/03/25(木) 16:36:46>>855
GetExitCodeProcessで得られるのは、終了ステータスであって、
プログラムが返すリータンコードじゃないよ。こんなことの知らずに使ってるの???
リターンコードの時もあるけど、そうじゃないときもある。
というかこれを利用してどういうプログラム組んでるの君ら?
これで main の戻り値拾ってるの?????
0860デフォルトの名無しさん
2010/03/25(木) 16:37:51その場合、そのプログラムはエラーを検知して終了したとみなす。
外部アプリを起動するプログラムを書くときは
そのプログラムが正常に動作したかどうかを戻り値でチェックする。
だから、わからないときはゼロにしとけとなってる。
0861デフォルトの名無しさん
2010/03/25(木) 16:38:50ビジュアル系のプログラマの方ですね
世の中にはまだまだmainから始まる黒い画面見て仕事してる人もいっぱいいますよ
0862デフォルトの名無しさん
2010/03/25(木) 16:39:25GUI しか知らないっぽかったからお前のために Windows API を挙げただけだよ
0863デフォルトの名無しさん
2010/03/25(木) 16:39:30>親プロセスが起こした子供ならその値を取得できるよ
できる場合もある。だろ。
0864デフォルトの名無しさん
2010/03/25(木) 16:40:35いや、それ同じだよ。実験してみそ。
0865デフォルトの名無しさん
2010/03/25(木) 16:41:41>世の中にはまだまだmainから始まる黒い画面見て仕事してる人もいっぱいいますよ
だから、Windows 環境では通用しないと言ってるんだろ。
0866デフォルトの名無しさん
2010/03/25(木) 16:44:37同じじゃない。
プロセスが既に終了した場合は、終了ステータスとして次の「「「「「いずれか」」」」」が格納されます。
?ExitProcess または TerminateProcess 関数で指定した終了コード。
?プロセスの main または WinMain 関数の戻り値。
?プロセスを終了させた、まだ処理されていない例外の例外コード。
0867デフォルトの名無しさん
2010/03/25(木) 16:44:41あのなー世のすべてのWindowsプログラムがWindowを持ってるわけじゃないのな
cmdで立ち上がってくるコマンドラインってもしかしてWindows環境じゃないと思ってるのか?
0868デフォルトの名無しさん
2010/03/25(木) 16:46:41同じだよ ちょっと上のほうで誰かが書いてるだろ
Unixでも強制終了のときはreternの引数なんか入らないで
osが詰めた強制終了とかメモリ確保失敗とかが入るって
0869デフォルトの名無しさん
2010/03/25(木) 16:50:05それ意外で拾えねえだろ
0870デフォルトの名無しさん
2010/03/25(木) 16:50:54コマンドプロンプトでの %errorlevel% でも同じなんだよ。
プログラムが特定のエラーコード返していても
強制終了すれば %errorlevel% は1 になる。
>コマンドラインってもしかしてWindows環境じゃないと思ってるのか?
それはお前のことだろ。
0871デフォルトの名無しさん
2010/03/25(木) 16:51:34お前は一辺WinMainの戻り値の型見てみろよ
0872デフォルトの名無しさん
2010/03/25(木) 16:52:51で、それが理由で main は必ず int で宣言するの。
すごいな会社だな。もう笑うしかないな。
0873デフォルトの名無しさん
2010/03/25(木) 16:53:18いずれかが入って当然
それを拾える*場合*もあるだろ、とかえらそうにさ
子供が万引きして、「取れるような状況にしておくのが悪い!」とか言う親みてえ
0874デフォルトの名無しさん
2010/03/25(木) 16:53:57だからね、見れば main の int 宣言が意味ないことがわかるだろ。
0875デフォルトの名無しさん
2010/03/25(木) 16:56:38見当違いのお馬鹿さん
0876デフォルトの名無しさん
2010/03/25(木) 16:57:00ふつう何も考えなくintだよなあ
っていうか、そういう小さいけどちゃんとした理由すらあるのにvoidにしてる会社のほうがすごくね?
0877デフォルトの名無しさん
2010/03/25(木) 16:58:52警告気にしない人なのかな
0878デフォルトの名無しさん
2010/03/25(木) 16:59:050879デフォルトの名無しさん
2010/03/25(木) 16:59:05mainからのreturnもExitProcessだって知らないの
0880デフォルトの名無しさん
2010/03/25(木) 17:00:31void mainの方はただの遊びだろ
void main()は文法上許されてるわけだし特に問題ない。
returnしろといわれてる環境でvoidでいいじゃんというやつは
頭がおかしいけどな
0881デフォルトの名無しさん
2010/03/25(木) 17:01:03>強制終了すれば %errorlevel% は1 になる。
強制終了じゃなくて、子供が仕事終わってそいつが正常に終了したときに
値を見たいんですよ、どうだったかとか
0882デフォルトの名無しさん
2010/03/25(木) 17:05:21何にも考えてないから int なだけであって、
真面目にプロセスの実行結果を利用することを考えるのであれば、
もっと意識しなければいけないことがあるということ。
そういうこともわからず、盲目的に int にすればいいと思ってるのが馬鹿なの。
リターンコードのことを意識して組まれていないプログラムであれば、
int でも void でも変わらん。
0883デフォルトの名無しさん
2010/03/25(木) 17:10:18int意味なしとか、戻り値0とか威張ってなかったっけ?
0884デフォルトの名無しさん
2010/03/25(木) 17:12:17「盲目的にint」は推奨こそしても批判する理由なくね?
gotoとかと違ってさ
0885デフォルトの名無しさん
2010/03/25(木) 17:12:45で、その時にどんな値を返せばいいの?
わからないでしょ。
そういうことがわかった上で、リータンコードに関しての仕様も決めて、
そういう状況で始めてリターンコードが使えるようになるんだよ。
何にも決まってない状況なら、何を返しても問題ない。
DOS、Windows、Unix、Linux、、、等の処理系であれば、
どんなリターンコードを返しても問題ないことが保証されている。
つまり void でも問題ない。
そうじゃない処理系があるんだったら、そのときはその処理系の条件を
満たすようにリータンコードを返してやる必要があるのは当然だけどね。
0886デフォルトの名無しさん
2010/03/25(木) 17:17:31void を盲目的に否定するのがおかしいと言ってる。
最初から変わってない。
元は >>816 の発言に対するもの。これがおかしい。
0887デフォルトの名無しさん
2010/03/25(木) 17:17:42>わからないでしょ。
お前馬鹿じゃないの?わかるよ
unixだと下位バイトしか使えないから256通りの値を遅れるよ
上位バイトには強制終了とかの時にOSが値を入れる
(Windowsでもそうだと思ったが64bitWindowsで確認してない)
そう言うのって何を意味させるかは仕様で決めるんだよ
0888デフォルトの名無しさん
2010/03/25(木) 17:21:12void盲目的に否定はアリじゃね?
何も困らないじゃん
0889デフォルトの名無しさん
2010/03/25(木) 17:22:48そんな処理系はないだろw
仮にあったとしても、その処理系では return 0; が問題かもしれないよ。
リターンコードは意味はないわな。
0890デフォルトの名無しさん
2010/03/25(木) 17:26:53だから、そういうはっきりした仕様があって、
それに準拠するプログラムを作る必要があるときに、
int にする必要があるということでしょ。それ以外はvoid でいい。
なんでここで質問に回答するときに、そういう仕様調べて準拠する必要があんの?
質問者が要望してるんならわかるけどね。
0891デフォルトの名無しさん
2010/03/25(木) 17:27:36少なくとも、DOS及びLinux系Unix系では
戻り値はちゃんと返してもらわないと、困る。
戻り値が0以外のときは検知して異常シーケンスに突入
ってのが一般的だからな
0892デフォルトの名無しさん
2010/03/25(木) 17:29:19って書いてたらめちゃくちゃ馬鹿にしそうww
「〜って理由がアンだよ!プンプン」ってかんじで
なんか書き込みとか違う人が書いたことにしようとしてるし
0893デフォルトの名無しさん
2010/03/25(木) 17:32:58ぼこぼこにされると
0894デフォルトの名無しさん
2010/03/25(木) 17:34:11遊びと言われれたら返す言葉はないな。
>>884
だよね。
>>886
偏見だけど
void main() とわざわざ書いちゃうような人は
定型文ですら毎回毎回全部手入力してる馬鹿に思っちゃう。
0895デフォルトの名無しさん
2010/03/25(木) 17:40:20確かに何も考えず int としてる奴は多いからな。
0896デフォルトの名無しさん
2010/03/25(木) 17:45:56なに他人の振りしてんだよww めっちゃバレバレな感じで
voidでも許されてるってだけで意味なんかひとつもなかったじゃんww
0897デフォルトの名無しさん
2010/03/25(木) 17:46:510898デフォルトの名無しさん
2010/03/25(木) 17:47:07逆だ。
voidにする明確な理由が無いときは、
int型にして戻り値を0とする のが正解になる。
普通は戻り値を見ることになってるから。
0899デフォルトの名無しさん
2010/03/25(木) 17:47:440900デフォルトの名無しさん
2010/03/25(木) 17:48:11「仮に見る人がいなくたって戻り値を適切に設定する」 が正解だな。
0901デフォルトの名無しさん
2010/03/25(木) 17:51:180902デフォルトの名無しさん
2010/03/25(木) 17:54:07俺じゃないけど。
>>891-900
はいはい、質問には答えず、文句ばっかりご苦労さん。
0903デフォルトの名無しさん
2010/03/25(木) 17:54:57>>816が全部悪い。
0904デフォルトの名無しさん
2010/03/25(木) 17:56:10おめーのバカな質問疑問に答えてやっただろ
0905デフォルトの名無しさん
2010/03/25(木) 18:02:510906デフォルトの名無しさん
2010/03/25(木) 18:08:54int main() にしとけ →ぐだぐだ論争の種になるので
アプリ終了時に malloc したものは free すべきなの? →それは聞いちゃイカン
0907デフォルトの名無しさん
2010/03/25(木) 18:22:30freeしといた方がいいよな。
終了時の解放はただの親切機能だし。
喰らいボムが実装されてるようなもんだろ。
0908デフォルトの名無しさん
2010/03/25(木) 18:31:33もうアプリは死ぬんだからfree書かなくても良いなんて
「生理だからゴムなしでいっか」って言うようなもの
書いちゃってから「あ、ここ最後だからいらないんだ」とか言ってわざわざ消してるやつは性病で死ね
0909デフォルトの名無しさん
2010/03/25(木) 18:32:59初対面でも見た目がいかにもという人はそれ相応の対処を取るだろ?
void mainも同じ
最初にカマしとけば相応の目で注意深く見てくれる
ま、ある種の優しさだな
0910デフォルトの名無しさん
2010/03/25(木) 18:36:57クソな参考書見分けるコツは?ってのに対して
void mainって書いてるやつは買うなってのがあったと思う
>>909
後輩がお前のこと笑ってるぞ「voidの、あ、voidさんのソースってくそっすよね 読む気しねー」って
0911デフォルトの名無しさん
2010/03/25(木) 18:38:33困ったときに、
助けてくれたパンチパーマの人と何にもしてくれなかった七三分けの人だったら、
僕はパンチパーマの人に感謝しますよ。
0912デフォルトの名無しさん
2010/03/25(木) 18:39:11Cの絵本のことだな
0913デフォルトの名無しさん
2010/03/25(木) 18:40:37参考書に書いてあることは丸暗記できるけど、
応用力はなくて自分ではコード書けない人の典型ですね。
0914デフォルトの名無しさん
2010/03/25(木) 18:45:17俺voidじゃねーし
君は洞察力がないな
>>911
君は読解力がない
0915デフォルトの名無しさん
2010/03/25(木) 18:59:00ということにしたいのですね。
0916デフォルトの名無しさん
2010/03/25(木) 19:08:27作ったおもちゃを見てもらいたかっただけなんすよね >>815
それをみんな、よってたかってフルボッコにして
あ、でも先輩ちょっと俺に話しかけるの止めてもらえないですかね
ホラ俺達までvoid mainだと思われるのはちょっと
0917デフォルトの名無しさん
2010/03/25(木) 19:10:34そういうこと気にしてたら exit 関数が使えない。
大きなプログラムではエラー処理が滅茶苦茶煩雑になる。
こいうのはケースバイケースで、メモリリークを起こさなければ問題ないでしょ。
自分でフリーしない方が速いし。
0918デフォルトの名無しさん
2010/03/25(木) 19:12:19どんな結末を夢見てる?
何も考えてない?
0919デフォルトの名無しさん
2010/03/25(木) 19:13:36メモリリークを起こさないようにプログラムを組んでたら
普通はalloc/freeの対応は付くと思うのだが・・・
0920デフォルトの名無しさん
2010/03/25(木) 19:14:49みんなでボッコしてたのは>>816じゃね?
>>815の内容なんて誰一人1行も見て無い気がするが
0921デフォルトの名無しさん
2010/03/25(木) 19:17:09煽りとかじゃなく、純粋に知りたいんですが
0922デフォルトの名無しさん
2010/03/25(木) 19:17:34例外的に明示的にexit()するときは、もうどうでもいいだろ
0923デフォルトの名無しさん
2010/03/25(木) 19:19:46エラーとかの例外処理でそれを貫くは無理でしょ。
大きなプログラムの場合だよ。
致命的なエラーだったら、エラー報告してそのまま終了することもあるでしょ。
0924デフォルトの名無しさん
2010/03/25(木) 19:21:12この次元の議論
0925デフォルトの名無しさん
2010/03/25(木) 19:21:18聞いた話だが、alloc/freeにラッパーかかってたときかな
メモリの代わりになんか違うリソースを取得してたらしい
malloc/freeで作ってたのを単純置換したとかなんとかで
0926デフォルトの名無しさん
2010/03/25(木) 19:22:37不具合が出るとすれば、そっちの方が問題だよ。
メモリリークじゃないんだから。
0927デフォルトの名無しさん
2010/03/25(木) 19:22:53お前のプログラムは致命的なエラーしか起こらないのかw
0928デフォルトの名無しさん
2010/03/25(木) 19:27:14ケースバイケースだろうと言ってるのに。どっちの場合もあるんだよ。
逆に君は致命的エラーで終了処理だけして、終了するプログラムを組んだことがないのか?
だとしたら経験がなさすぎるんだよ。
0929デフォルトの名無しさん
2010/03/25(木) 19:28:06そんな話じゃなくて、mallocの話なんですが
0930デフォルトの名無しさん
2010/03/25(木) 19:29:47ないんじゃね?
デバッグ中は「freeしてねーよ」警告が山ほどでるが
0931デフォルトの名無しさん
2010/03/25(木) 19:31:26こんだけ否定されてんだからwww
0932デフォルトの名無しさん
2010/03/25(木) 19:33:46そんな時にvoid main(void)を使ったりする。ただそれだけの話だな。
0933デフォルトの名無しさん
2010/03/25(木) 19:33:53否定してるの一人だからw
0934デフォルトの名無しさん
2010/03/25(木) 19:33:55exitの前にも
if(aaa_buf)free(aaa_buf);
if(bbb_buf)free(bbb_buf);
if(ccc_buf)free(ccc_buf);
とかってやるべき できればすぐ死ぬとしても
aaa_buf = NULL;
・
・
もやるべき、これはスピードとかではなく本人の生き方の問題
やりたくなければやらんでよろしい でも俺がリーダーの場合の開発では必須な
ちなみにaaa_bufは命名規則的にはいくないけど、説明のために使った
0935デフォルトの名無しさん
2010/03/25(木) 19:35:03こいつは、底抜けの馬鹿だな
0936デフォルトの名無しさん
2010/03/25(木) 19:37:050937デフォルトの名無しさん
2010/03/25(木) 19:39:25↓
mainの戻り値
↓
malloc/free ←今ココ
次は後藤さん?
0938デフォルトの名無しさん
2010/03/25(木) 19:43:17そういう時代もあったってことでしょ
今でもたまにOSなしでやらされるが
0939デフォルトの名無しさん
2010/03/25(木) 19:43:41exit を呼んでいるところで、aaa_buf とか参照できない場合があるでしょ。
実際にexit を呼ぶのはライブラの奥の方だったりするんだよ。
参照できるようにしようと思えば、その関数に関係ないポインタを延々と渡し続けないといけない。
0940デフォルトの名無しさん
2010/03/25(木) 19:45:20これはexit()関数使わなくて済むようなプログラム例だろw
そんな時の話はしてないぞ。
0941デフォルトの名無しさん
2010/03/25(木) 19:46:450942デフォルトの名無しさん
2010/03/25(木) 19:47:33プログラムが必ずOSから呼ばれると思っているお前の方が馬鹿な気がする
0943デフォルトの名無しさん
2010/03/25(木) 19:47:550944デフォルトの名無しさん
2010/03/25(木) 19:48:43コードをコピペして再利用するときに不具合がでやすい
0945デフォルトの名無しさん
2010/03/25(木) 19:48:450946デフォルトの名無しさん
2010/03/25(木) 19:49:48mainを抜けた後にまだ続きがあったとき、かな。
そういう変態コードは稀に良くある。
0947デフォルトの名無しさん
2010/03/25(木) 19:49:58それはexit前にfreeをすれば解決されるの?
0948デフォルトの名無しさん
2010/03/25(木) 19:50:12exitの前にも
if(aaa_buf)free(aaa_buf);
if(bbb_buf)free(bbb_buf);
if(ccc_buf)free(ccc_buf);
これやると対じゃなくなるけどいいの?
ことあるごとにポインタをヌルポインタにしないと動かないけどそれは美しいの?
0949デフォルトの名無しさん
2010/03/25(木) 19:52:320950デフォルトの名無しさん
2010/03/25(木) 19:53:25どれだけ手間かかるんだろうなー
0951デフォルトの名無しさん
2010/03/25(木) 19:53:540952デフォルトの名無しさん
2010/03/25(木) 19:55:250953デフォルトの名無しさん
2010/03/25(木) 19:56:250954デフォルトの名無しさん
2010/03/25(木) 19:56:530955デフォルトの名無しさん
2010/03/25(木) 19:57:49お前根本的に勘違いしてるぞ。
malloc して free するのは基本。これをするなと言ってるのではない。
けど malloc してから free するまでの間に、
そのデータとは関係ない関数を呼び出す必要があって、
その関数の中でexitするような場合に free できないのはしょうがない場合もあるだろうと言ってるんだよ。
malloc で確保したメモリは終了時に free されることが保証されてるんだしね。
0956デフォルトの名無しさん
2010/03/25(木) 19:59:190957デフォルトの名無しさん
2010/03/25(木) 20:00:34OSがやっていることとfree()のそれを混同しすぎ。
0958デフォルトの名無しさん
2010/03/25(木) 20:01:23「ten2hex」で萎えた。
0959デフォルトの名無しさん
2010/03/25(木) 20:01:32共有リソースの中には自分で開放する必要のあるものもたまにあるんじゃないの
0960デフォルトの名無しさん
2010/03/25(木) 20:04:07ここではmallocを使ってexitの前のfreeの話をしているのです
0961デフォルトの名無しさん
2010/03/25(木) 20:04:25おれかよ。俺と同じこといってんのに。
0962デフォルトの名無しさん
2010/03/25(木) 20:06:06基本はそうだけど、それやってられないことがあるの。
そもそもそうやって関数の呼び出し元に戻れるんなら、
exit() 関数など使わないようにコード書けるでしょ。
けど実際にはexit() 関数が必要なわけで、
C++ではtry chatch が用意されているよ。
exit() が必要 → free() できない場合もある
ということなんだよ。
0963デフォルトの名無しさん
2010/03/25(木) 20:08:15その辺を一々管理するのが大変だから終了時にまとめてやるのもありでしょ。
で、malloc はそうなってる。
0964デフォルトの名無しさん
2010/03/25(木) 20:08:510965デフォルトの名無しさん
2010/03/25(木) 20:09:38なんで例外がここで出てくるのか分からんが、try-catchが欲しいなら
gotoやlongjmp使ってそれらしくすればよろしい
exitを使わざるを得ない状況ってのがわからん
0966デフォルトの名無しさん
2010/03/25(木) 20:11:290967デフォルトの名無しさん
2010/03/25(木) 20:13:18状況によっては終了時にまとめてリソース開放でもいいけど、大抵はそれじゃだめかな
0968デフォルトの名無しさん
2010/03/25(木) 20:13:260969デフォルトの名無しさん
2010/03/25(木) 20:14:10どんな状況?
0970デフォルトの名無しさん
2010/03/25(木) 20:16:20終了処理の中で分岐入れれば済む話では?
0971デフォルトの名無しさん
2010/03/25(木) 20:16:40exit の必要性がわからないんだったら、わかるはずがない。黙ってなさい。
小さなプログラムなら要らんからね。
exit は積極的に使うものではないけど、状況によってはコードが煩雑にならないで済むから使うんだよ。
まぁ君にはわからんだろうけど。
0972デフォルトの名無しさん
2010/03/25(木) 20:16:59データが明らかに壊れてて
終了処理を走らせるのが逆に危険な場合とか
まあバグでしかないが
0973デフォルトの名無しさん
2010/03/25(木) 20:18:16正規の終了処理のところまで、戻すのが大変な場合があるの。
0974デフォルトの名無しさん
2010/03/25(木) 20:19:00だから、どうやったらそんな状態になるのか、そしてfreeしたらそれが解決されるのか聞きたいんですが
0975デフォルトの名無しさん
2010/03/25(木) 20:19:130976デフォルトの名無しさん
2010/03/25(木) 20:24:20exitを使うことで便利になる場面があるのは分かるよ。
> exit は積極的に使うものではないけど、状況によってはコードが煩雑にならないで済むから使うんだよ。
これは、利便性を考慮して、exitを選択しただけ。
でもそれは「使わざるを得ない状況」ではないでしょう?
> まぁ君にはわからんだろうけど。
そうすか。
0977デフォルトの名無しさん
2010/03/25(木) 20:29:18だとすると、そいつはexitを必要としていない人だ
0978816
2010/03/25(木) 20:30:380979デフォルトの名無しさん
2010/03/25(木) 20:35:230980デフォルトの名無しさん
2010/03/25(木) 20:40:410981デフォルトの名無しさん
2010/03/25(木) 20:46:49C言語なら俺に聞け(入門編)Part 62
http://pc12.2ch.net/test/read.cgi/tech/1269517734/
0983デフォルトの名無しさん
2010/03/25(木) 20:55:01aaaが確保できたbbbがまだでも死ななきゃいけないって時に
確認しないでフリーしたらエラーじゃん
NULLつめとけば
2重のフリーも防げるし
0984デフォルトの名無しさん
2010/03/25(木) 20:56:01何でエラーになるんだよ
0985デフォルトの名無しさん
2010/03/25(木) 20:59:010986デフォルトの名無しさん
2010/03/25(木) 21:01:060987デフォルトの名無しさん
2010/03/25(木) 21:01:370988デフォルトの名無しさん
2010/03/25(木) 21:04:05bbbをNULLで初期化していれば、な
0989デフォルトの名無しさん
2010/03/25(木) 21:04:54未初期化の変数がifを通り抜けてfreeされてエラーになるだけだろw
0990デフォルトの名無しさん
2010/03/25(木) 21:06:390991デフォルトの名無しさん
2010/03/25(木) 21:06:56エラーになればいいけど、もしも偶然が怖いだろ!
0992デフォルトの名無しさん
2010/03/25(木) 21:07:160993デフォルトの名無しさん
2010/03/25(木) 21:07:27いや、初期化しろと
0994デフォルトの名無しさん
2010/03/25(木) 21:07:50だから初期化をするんだよ
0995デフォルトの名無しさん
2010/03/25(木) 21:08:160996デフォルトの名無しさん
2010/03/25(木) 21:08:58まともにfreeできないコードはそもそもどこかがおかしい
0997デフォルトの名無しさん
2010/03/25(木) 21:12:38コードを読んで即座に意味が通じるかどうかが重要だからな
free()をしていないコードを読んで、終了間際だからサボってるのか
単なる解放漏れなのかの区別が瞬時につかない。
0998デフォルトの名無しさん
2010/03/25(木) 21:14:22NULLで初期化には誰もけちつけてないのにw
0999デフォルトの名無しさん
2010/03/25(木) 21:16:45死ぬときあるよね
1000デフォルトの名無しさん
2010/03/25(木) 21:18:3610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。