【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/02/01(木) 23:08:46まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc10.2ch.net/test/read.cgi/tech/1159613789/
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/
C/C++の宿題を片付けます 82代目
http://pc10.2ch.net/test/read.cgi/tech/1169575464/
0002デフォルトの名無しさん
2007/02/01(木) 23:09:040003デフォルトの名無しさん
2007/02/01(木) 23:09:27> ◆ ちょっとしたネタ・雑談・質問は、雑談or攻略質問スレッドで。
> 一つの質問のために一つのスレを立てるのはやめてね。
>>296
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc10.2ch.net/test/read.cgi/tech/1170338926/
0004デフォルトの名無しさん
2007/02/01(木) 23:28:550005デフォルトの名無しさん
2007/02/02(金) 01:18:52#include <stdio.h>
/*整数10個入力しその合計を出力せよ*/
int main()
{
char kei[10];
int goukei = 0;
int i;
for(i = 0; i <= 10; i++){
kei[i] = getchar();
printf("数値:&c",kei[i]);
goukei += kei[i];
}
printf("合計は:%c",goukei);
}
これどこがまちがってるのかすごくわからないです
おねがいしますおしえてくださいです。
0006デフォルトの名無しさん
2007/02/02(金) 01:20:34printf("%c → printf("%d
0007デフォルトの名無しさん
2007/02/02(金) 01:33:470008デフォルトの名無しさん
2007/02/02(金) 01:40:23レスありがとうございます。
やってみたのですが・・・
うまくいきません・・・ごめんなさい
10回まわっていくはずなのに6回だけになってしまい
1
数値:&c数値&c数値&2
・
・
という感じになってしまいます
。・゚゚・(>_<;)・゚゚・。
0009デフォルトの名無しさん
2007/02/02(金) 02:26:27正:for(i = 0; i < 10; i++){
0010デフォルトの名無しさん
2007/02/02(金) 02:27:45正:printf("数値:%c",kei[i]);
0011デフォルトの名無しさん
2007/02/02(金) 02:51:18文字→char型
0012デフォルトの名無しさん
2007/02/02(金) 03:01:29>>11
うっどうしてもできないです・・・
ごめんなさいごめんなさい(*ノ-;*)エーン
0013デフォルトの名無しさん
2007/02/02(金) 03:02:35/*手操作入力で数値を10個入力しその合計を画面に出力する*/
int main()
{
int kei[10];
int goukei = 0;
int i;
printf("数値を入力せよ\n");
for(i = 0; i < 10; i++){
kei[i] = getchar();
printf("数値:%c\n",kei[i]);
goukei += kei[i];
printf("-------------------------------------------------\n");
}
printf("合計は:%c",goukei);
}
というふうにかえてみたのですが
0014デフォルトの名無しさん
2007/02/02(金) 03:09:26kei[i] = getchar(); を
kei[i] = getchar() - 0x30; にするとか
で、
printfの中の %c は全部 %d に替えろ
0015デフォルトの名無しさん
2007/02/02(金) 03:11:590016デフォルトの名無しさん
2007/02/02(金) 03:13:16ですよね・・・
わたしもscanfならgetcharよりわかるのですが
こんかいはgetcharでということなんですよね・・・
;;;;(;・・)ゞウーン・・・むずかしぃですね
0017デフォルトの名無しさん
2007/02/02(金) 03:16:08ASCII環境かどうかは正直よくわからないですが
表示される数値が1を入力すると49とでるので
ASCIIコードで表示されているのかな?とおもってたりします
0018デフォルトの名無しさん
2007/02/02(金) 04:06:41必ず'0'にしろ。
0019デフォルトの名無しさん
2007/02/02(金) 04:08:41立った一問に私何十時間かかってるんだろう・・・なみだでてきた
でもまけない
そうなんですか・・・わかりました・・・ありがとうです
0020デフォルトの名無しさん
2007/02/02(金) 05:06:47getcharは1文字ずつ読み込む関数。
入力で打ったキーは全部1文字ずつ読み込む。
for(i=0; i<10; i++){
…
kei[i] = getchar();
…
}
だと、10文字読み込んで終わりだぞ。
0021デフォルトの名無しさん
2007/02/02(金) 07:32:49キーボードの上に手を置いたままねてた・・・(o;TωT)o" ビクッ!
キーボード入力で整数10個となってるから
10文字でいいとおもっているんですが・・・どうなんでしょう?
そのさいgetchar()をしようするという指定なんです・・・涙
本などみたのですがscanf()関数の詳しいことを書いてる本はおおい
のですがgetchar関数はあまりくわしくかかれてないので
飲み込みがわかりません・・・・
printf()関数で入力した文字を出力なのか・・.
などと
混乱しています。
~(=^‥^A アセアセ・・・
0022デフォルトの名無しさん
2007/02/02(金) 07:45:50int next_int() {
int c, n = 0;
do { if((c = getchar()) == EOF) return 0; } while(!isdigit(c));
do { n = c - '0' + n * 10; } while((c = getchar()) != EOF && isdigit(c));
return n;
}
0023デフォルトの名無しさん
2007/02/02(金) 07:56:17すみません・・・
ちょっとわからないです・・・
でも、帰ってくるまでには調べておこうと思います。
ありがとうございますです(o*。_。)oペコッ
0024デフォルトの名無しさん
2007/02/02(金) 10:37:28文字定数を整数型に変換しないと計算できなくない?
0025デフォルトの名無しさん
2007/02/02(金) 12:02:520026デフォルトの名無しさん
2007/02/02(金) 12:46:51#include <stdio.h>
int main()
{
int c, /* getchar()で「いま読んだ1文字」を覚えておく変数 */
flag =0, /* 読んでいた部分が数値なのかそうでないのかを覚えておくフラグ */
value=0, /* 入力された整数ひとつぶんを覚えておく変数 */
total=0, /* 入力された整数の合計を覚えておく変数 */
count=0; /* 入力された整数の数を数えている変数 */
while(count<10){ /* 10個読み込むまで繰り返す */
c=getchar(); /* 一文字読む */
if(isdigit(c)){ /* もし数字なら、 */
value=value*10+c-'0'; /* valueに値を取り込む(この計算式の意味についてはよく考えること) */
flag=1; /* いま数字を読みましたというしるし */
}
else if(flag==1){ /* 数字でないものを読んだとき、直前に読んだものが数字なら、そこで一つの整数が終わったということだから、 */
printf("数値:%d\n",value); /* valueに取り込んだ値を印字する */
total+=value; /* valueの値をtotalに足し込む */
count++; /* 読み込んだ数を数える */
value=0; /* 次の数のためにvalueを初期化する */
flag=0; /* 数字でないものを読みましたというしるし */
}
}
printf("合計は:%d\n",total); /* totalを印字する */
return 0; /* 必ずreturnすること */
}
0027デフォルトの名無しさん
2007/02/02(金) 12:57:18負の数にまで対応する気ならもっとややこしくなるが、
上のが理解できないようならどっちみち無理だ
0028デフォルトの名無しさん
2007/02/02(金) 13:58:51全部文字で読み込んでから数字に変換して計算すればいいじゃん^^;;
0029デフォルトの名無しさん
2007/02/02(金) 15:01:00どうせ1文字1文字読み取るという動作は同じだからたいして変わらんし
文字列に読み込む場合はバッファがあふれないようにする手間が
それを理解する手間こみで必要だから
0030デフォルトの名無しさん
2007/02/02(金) 15:10:53「数字を10個連続で入力させてその合計を求めろ」って問題じゃないのかぁ?
0031デフォルトの名無しさん
2007/02/02(金) 16:38:05>>29
>>22 じゃ駄目なのか?
0032デフォルトの名無しさん
2007/02/02(金) 17:58:03>>22だと何も数字打たずにEnter叩いた場合0が返るぞ
それでいいってんならいいけどさ
0033デフォルトの名無しさん
2007/02/02(金) 18:13:100034デフォルトの名無しさん
2007/02/02(金) 19:44:36>>32は見なかったことに
0035デフォルトの名無しさん
2007/02/02(金) 22:31:150036デフォルトの名無しさん
2007/02/02(金) 22:53:53printf("%d %d", n++, n++);
って未定義なの?
0037デフォルトの名無しさん
2007/02/02(金) 22:54:47確か、未定義のハズ。
0038デフォルトの名無しさん
2007/02/03(土) 00:13:240039デフォルトの名無しさん
2007/02/03(土) 01:22:242つの副作用完了点(シーケンスポイント)の間で同じ値を2回変更しているので、
未定義動作になります。
0040デフォルトの名無しさん
2007/02/03(土) 14:23:51サブルーチンからリターンするアドレスが0x00000000になって、おかしくした俺がきましたよ。
・・・不思議と1ステップずつデバッガで操作したら吹っ飛ばなかったのだが。
0041デフォルトの名無しさん
2007/02/03(土) 14:50:06それなら
printf("%d %d", n+=1, n+=2);
みたいなのも未定義?
0042デフォルトの名無しさん
2007/02/03(土) 15:14:43もちろん
0043デフォルトの名無しさん
2007/02/03(土) 16:58:48・・・
printf("%d %d\n", f(&n), f(&n));
は、未定義じゃないよね? 結果は処理系依存だけど。
0044デフォルトの名無しさん
2007/02/03(土) 17:05:310045デフォルトの名無しさん
2007/02/03(土) 17:29:16うん。 return 文の完了にシーケンスポイントがあるので大丈夫。
0046デフォルトの名無しさん
2007/02/03(土) 23:14:24おまいらよく真面目に答えられるな
どう考えてもここはスルーするべき所じゃないのか?
0047デフォルトの名無しさん
2007/02/03(土) 23:30:48いちおう理解して自分のなかで消化できました・・・
いろいろな助言ありがとうございました。
いいわけなんですが、学校では今までscanf()を使ってたり
簡単な関数で表現をしてきたので
いざ自分が社会人になって頑張っていこうと思うと・・・
自分が使えない人間である
とひしひしとわかってきました。
エンジニアという職業は常に勉強ですから
考えることがおおいですが
すこしずつ・・・皆さんに近づけるよう
がんばりたいとおもいます。
本当にありがとうございました!!!
0048デフォルトの名無しさん
2007/02/04(日) 00:25:52お前は向いてないから諦めた方がいい
0049デフォルトの名無しさん
2007/02/04(日) 00:31:140050デフォルトの名無しさん
2007/02/04(日) 06:53:08そういうおまえはなぜスルーしない。
0051デフォルトの名無しさん
2007/02/04(日) 07:09:080052デフォルトの名無しさん
2007/02/04(日) 18:58:560053デフォルトの名無しさん
2007/02/04(日) 20:05:590054デフォルトの名無しさん
2007/02/05(月) 22:02:11わかんね
0055デフォルトの名無しさん
2007/02/05(月) 22:12:300056デフォルトの名無しさん
2007/02/05(月) 22:15:240057デフォルトの名無しさん
2007/02/05(月) 22:17:080058デフォルトの名無しさん
2007/02/05(月) 22:17:360059デフォルトの名無しさん
2007/02/05(月) 22:18:230060デフォルトの名無しさん
2007/02/05(月) 22:20:40│ │
│ おしえてあげないよ。 ジャン! │
│ │
\_________________________/
V V V
_,∩_ _,∩_ _,∩_
(_____)ゝ、 (_____) y (_____)
/ :: :: :: ヽ 〉 /-‐:: ::‐-ヽ / / :: :: :: ヽ
_./ (・ )ll(・ ) ∨ _/ 0) i! 0) ∨ _/ ( ・)i!(・ ) ゙、_
// :: :: ∈ゝ :: ::ヽ // :: ‐-‐ :: ヽ // :: ー一 :: ヽ\
. ゝ/:: :: :: :: :: ::ヽ ゝ/ :: :: :: :: :: ヽ ゝ/ :: :: :: :: :: ヽく
 ̄ ̄ | ̄ ̄ | ̄ ̄  ̄ ̄ | ̄ ̄ | ̄ ̄  ̄ ̄ | ̄ ̄ | ̄ ̄
| | | | | |
⊂! !つ ⊂! !つ ⊂! !つ
0061デフォルトの名無しさん
2007/02/05(月) 22:27:47http://ja.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
0062デフォルトの名無しさん
2007/02/05(月) 22:31:230063デフォルトの名無しさん
2007/02/05(月) 22:31:50Cでは常にASCIIコードが使われると保証されていると?
0064デフォルトの名無しさん
2007/02/05(月) 22:31:55英語でお願いします。
0065デフォルトの名無しさん
2007/02/05(月) 22:40:12CではASCIIでなければならないという規定はないが、
基本文字集合で、'0'から'9'がこの順で並んでいなければならないという規定はある。
>>55-63
JIS X3010:2003では5.2.1。ISO/IEC 9899:1999でも同じ位置にあると思う。
0066デフォルトの名無しさん
2007/02/05(月) 22:46:080067デフォルトの名無しさん
2007/02/05(月) 22:46:215.2.1 文字集合
・・・
ソース基本文字集合及び実行基本文字集合は,少なくとも次に揚げる要素をもっていなければならない。
・・・
― 10個の10進数字(digit)
0 1 2 3 4 5 6 7 8 9
・・・
ソース基本文字集合及び実行基本文字集合の双方において,10進数字に関する上の並びにおいて,
0の右側に並んでいる各文字の値は,一つ左側にある文字の値に比べ1だけ大きくなければならない。
・・・
0068デフォルトの名無しさん
2007/02/05(月) 22:49:200069デフォルトの名無しさん
2007/02/05(月) 23:27:17該当箇所を見て確かに保証されていることは理解出来たのですが、
アルファベットはどうなのですか?書き方が微妙で判断がつきにくいんですが
0070デフォルトの名無しさん
2007/02/05(月) 23:31:330071デフォルトの名無しさん
2007/02/05(月) 23:42:13保証されていません
10進数字以外の文字は一般的に数値との関連性は薄いためでしょう
16進用の文字は大文字小文字の都合で一本化はできませんし
ほかに保証されているのは、ヌル文字が全ビットゼロであることだけです
0072デフォルトの名無しさん
2007/02/06(火) 00:12:48良く分かりました
詳しい説明どうもありがとう
0073デフォルトの名無しさん
2007/02/06(火) 00:21:340074デフォルトの名無しさん
2007/02/06(火) 00:53:000075デフォルトの名無しさん
2007/02/06(火) 00:54:260076デフォルトの名無しさん
2007/02/06(火) 01:16:040077デフォルトの名無しさん
2007/02/06(火) 03:32:200078デフォルトの名無しさん
2007/02/06(火) 10:20:48a->regs.##str##.value= b->##str##.value;\
a->regs.##str##.addr = b->##str##.addr;\
}
こういうマクロ作って、例えば。
{ a->regs.test.value = b->test.value; a->regs.test.addr = b->test.addr; };
と展開されることを期待したんだけど
Emacsのcc-modeのマクロ展開機能だと、うまくこのように展開されてるんだけど
コンパイルすると。
"." と "test" を貼付けましたが正常なプリプロセッサトークンとなりません
0079デフォルトの名無しさん
2007/02/06(火) 10:21:30>>78の続き
というコンパイルエラーが出てコンパイルできない。
どうしたらいい?
0080デフォルトの名無しさん
2007/02/06(火) 10:29:370081デフォルトの名無しさん
2007/02/06(火) 10:53:23正常なプリプロセッサトークンとするために "." と "test" を貼り付けなければいいんだろ。
0082デフォルトの名無しさん
2007/02/06(火) 10:57:06じゃこういうマクロの使い方は出来ないってこと?
0083デフォルトの名無しさん
2007/02/06(火) 10:59:32トークンと演算子との間に書いたらおかしくなるのはあたりまえ
0084デフォルトの名無しさん
2007/02/06(火) 11:00:370085デフォルトの名無しさん
2007/02/06(火) 11:06:050086デフォルトの名無しさん
2007/02/06(火) 11:08:40くくるな
0087デフォルトの名無しさん
2007/02/06(火) 11:09:40Thx!!
0088デフォルトの名無しさん
2007/02/06(火) 14:14:55char hoge[] = "BenchMarkTest";
1: if (strcmp(hoge, "BenchMarkTest") == 0) {}
2: if (hoge[0] == 'B' && hoge[1] == 'e' && hoge[2] == 'n'
hoge[3] == 'c' && hoge[4] == 'h' ・・・・・・・・・・続く・・・・・・・) {}
コンパイラはgccで最適化オプション -O -O2 -O3 をそれぞれ試した。
2 のほうが全開早いんだけど、そんなもん?
文字列比較は、2の方法で書くべき?
0089デフォルトの名無しさん
2007/02/06(火) 14:16:24009088
2007/02/06(火) 14:25:340091デフォルトの名無しさん
2007/02/06(火) 15:11:420092デフォルトの名無しさん
2007/02/06(火) 15:13:19たぶん2に最適化かけたら文自体が消えるぞ
0093デフォルトの名無しさん
2007/02/06(火) 15:14:360094デフォルトの名無しさん
2007/02/06(火) 15:54:04Ⅽ初心者で、今MFCを使用しない前提でプログラムを組んでいます。
そこでMessageBox関数というのを見つけたのですが、
これはMFCとは無関係なのでしょうか?
0095デフォルトの名無しさん
2007/02/06(火) 15:59:590096デフォルトの名無しさん
2007/02/06(火) 16:00:36わかってると思うけどパソコン自体がI抵抗、コンデンサ
、コイル、ダイオード、トランジスタ等々(意味的には同じ
ととらえて良い部分がありますが)でできた回路です。
で、CPU(たぶんメモリも)5V〜0V(正確には0Vに近い小さな電圧)
のいんか電圧から、電流が流れています。
この5Vで流れる電流を1とし0Vで流れる電流を0としてCPUの中で
の要はダイオードの組み合わせみたいなもので出来た回路で・・・
説明めんどくせ!
要はマシン語ってのは1と0の羅列。それの事となる。
けど、そんなもん全部理解するには頭の中にパソコンの回路構成
が入ってて、なおかつそれを・・・
説明めんどくせ!
まぁ、アセンブラで書けってことじゃないの?
0097デフォルトの名無しさん
2007/02/06(火) 16:02:560098デフォルトの名無しさん
2007/02/06(火) 16:03:44大いに結構!!
他にもいっぱいwin32apiの関数あるから使っていこう。
そして全部覚えよう。そして覚えれたなら、君を神様と呼ばしていただこう
009994
2007/02/06(火) 16:11:00ありがとう
0100デフォルトの名無しさん
2007/02/06(火) 16:34:030101デフォルトの名無しさん
2007/02/06(火) 18:56:34マシン語はアセンブラ言語とほぼ同じとみて差し支えない
0102デフォルトの名無しさん
2007/02/06(火) 20:00:450103デフォルトの名無しさん
2007/02/07(水) 00:31:480104デフォルトの名無しさん
2007/02/07(水) 03:25:55初心者向けのスレで揉まれて来ることをお勧めします。
0105デフォルトの名無しさん
2007/02/07(水) 09:58:300106デフォルトの名無しさん
2007/02/07(水) 11:41:37[2] 問題文(含コード&リンク):以下の常微分方程式をホイン法で解くためのプログラムを作成しなさい。また
0<=t<=10におけるx(t)およびy(t)のグラフをエクセルで作成しなさい。
dx/dt=2x(t)-0.01x(t)y(t)
初期条件にx(0)=300,y(0)=150
dy/dt=-y(t)+0.01x(t)y(t)
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語:c言語
[4] 期限:2007年2月9日まで
#include <stdio.h>
double func(double x, double y);
void heun(double x, double y, double a,double b, int n,double (*f)(double,double));
int main(void)
{ int n;
print("分割数を入力してください--->")
scanf("%d",&n);
heun(0.0,1.0,0.0,1.0,n ,func);
return 0;}
void heun(double x, double y, double a, double b, int n, double (*f)(double,double))
{ double k1,k2,h;
int i;
h = (b-x)/n;
for (i = 0 ; i<n ; i++)
{ k1=f(x,y); k2 = f(x+h,y+h*k1);
y = y+h/2.0 * (k1 +k2);
x = x+h;
print("x=%f \t y=%f \n" , x,y);}}
ここからどういじるのでしょうか?
0107デフォルトの名無しさん
2007/02/07(水) 11:44:330108デフォルトの名無しさん
2007/02/07(水) 12:00:030109デフォルトの名無しさん
2007/02/07(水) 13:18:430110デフォルトの名無しさん
2007/02/07(水) 13:20:230111デフォルトの名無しさん
2007/02/07(水) 13:23:220112デフォルトの名無しさん
2007/02/07(水) 13:33:04. / (ー) (ー)\
/ ⌒(__人__)⌒ \
| |r┬-| | 分かる分からない以前の問題だと分かってないのはお前だぜ
\ `ー'´ /
ノ \
/´ ヽ
| l \
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、.
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / // だっておwwwwwwwwwwwww~(=^‥^A アセアセ
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー'´ ヽ / / バ
| | l||l 从人 l||l l||l 从人 l||l バ ン
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
0113デフォルトの名無しさん
2007/02/07(水) 15:18:000114デフォルトの名無しさん
2007/02/07(水) 15:56:36最近、朝起きるとき、非常に気持ち良い快感で目覚めると
パンツがカピカピになってます。
何か尿道あたりに細菌が混入し、病気になっているのでしょうか。
心配で夜もねむれません。まぁ寝れますが。
これはどういった症状なのでしょう。
追伸:
最近SEXという言葉をしりましたが、意味はまだ理解してません。
0115デフォルトの名無しさん
2007/02/07(水) 19:51:18. / (ー) (ー)\
/ ⌒(__人__)⌒ \
| |r┬-| | 分かる分からない以前の問題だと分かってないのはお前だぜだっておwwwwwwwwwwwww~(=^‥^A アセアセ
\ `ー'´ /
ノ \
/´ ヽ
| l \
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、.
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / // だっておwwwwwwwwwwwww
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー'´ ヽ / / バ
| | l||l 从人 l||l l||l 从人 l||l バ ン
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
0116デフォルトの名無しさん
2007/02/07(水) 19:52:570117デフォルトの名無しさん
2007/02/07(水) 22:29:420118デフォルトの名無しさん
2007/02/09(金) 15:42:29痒いです
0119デフォルトの名無しさん
2007/02/09(金) 16:04:10この抗生剤を飲み、下着を適度に履き替え局部を清潔に保つようにしてください
一週間ほどで良いでしょう
0120デフォルトの名無しさん
2007/02/09(金) 23:41:05つテトラサイクリン
0121デフォルトの名無しさん
2007/02/10(土) 04:26:29残念だが、もうチンコは諦めてくれ。
0122デフォルトの名無しさん
2007/02/11(日) 23:46:18動くものは作れるのですが、
設計?構造でいつも悩んでいます。(状態遷移とか。。)
1つのイベントと複数のトリガを管理する定石とか、
状態遷移を管理するときの定石とか
まとまった書籍/HPないでしょうか?
デザインパターンのように拡張性を考慮した設計が知りたいです。
0123デフォルトの名無しさん
2007/02/12(月) 08:21:440124デフォルトの名無しさん
2007/02/12(月) 13:06:15配列を0で初期化するのにこの二通りを目にするんだけど、
規格上はどちらも等価ですか?
0125デフォルトの名無しさん
2007/02/12(月) 14:13:000126デフォルトの名無しさん
2007/02/12(月) 14:26:140127デフォルトの名無しさん
2007/02/12(月) 23:27:37便乗だけど、その理由が何なのか知りたいのだが。
0128デフォルトの名無しさん
2007/02/13(火) 00:03:24つ【規格でそう決まっているから】
まあマジレスすると、配列(構造体とかもだが)の宣言時の{}は、
複合文のくくりである{}とは違うもので、「初期化子となる式のリスト」を意味する。
(もちろん、中のカンマもカンマ区切りであってカンマ演算子ではない)
つまり、「=」が暗示するように、そこには何らかの式が少なくとも1つなければいけない。
ということ。構文上の問題だから、a[42]={}; でもOKなコンパイラもあるだろうけどね。
0129デフォルトの名無しさん
2007/02/13(火) 04:40:040130デフォルトの名無しさん
2007/02/13(火) 13:51:56は全部ヌル文字になる?それとも
char str[SIZE] = {'\0'};
と書かなきゃダメ?
0131デフォルトの名無しさん
2007/02/13(火) 14:06:56前者後者ともローカル変数であるならば、関数突入時に毎回毎回、0のコピーか代入が発生する。
恐らく前者は、SIZEbyte分""のためのスペースが確保されることになる。
まぁ、全部ナル文字になることを当てにするロジックは推奨できないが。
0132デフォルトの名無しさん
2007/02/13(火) 16:57:450133デフォルトの名無しさん
2007/02/13(火) 17:44:28どっちも同じ。
char配列の文字列リテラルでの初期化は、
下のように1つずつ文字定数を指定したかのように扱われる。
0134デフォルトの名無しさん
2007/02/14(水) 21:38:400135デフォルトの名無しさん
2007/02/14(水) 21:49:18無いと思っていい。強いて言えば memcpy() ?
0136デフォルトの名無しさん
2007/02/14(水) 23:25:41memcpyから自作してみます。ありがとうございました。
0137デフォルトの名無しさん
2007/02/14(水) 23:35:040138デフォルトの名無しさん
2007/02/14(水) 23:40:41クラステンプレートstd::basic_stringの非静的メンバ関数になっている。
0139デフォルトの名無しさん
2007/02/14(水) 23:43:01(゚д゚)
0140デフォルトの名無しさん
2007/02/15(木) 01:27:58memcpy()なんぞ使わずに、こんな関数でも用意しろ。
char * substr(char * buf, const char * str, int pos, int n)
{
sprintf(buf, "%.*s", n, str + pos);
return buf;
}
0141デフォルトの名無しさん
2007/02/15(木) 01:37:12関数用意するのはいいとして、こんな処理に sprintf() は高すぎる。
ここは memcpy() の出番だろ。
0142デフォルトの名無しさん
2007/02/15(木) 06:40:40| | (_ .| |
| | strncpy → .(・∀|_|
|_|ω・`) ←strncat (⊃ |糞|
|質|と ) |∧.| ̄|
| ̄|u'
0143デフォルトの名無しさん
2007/02/15(木) 06:47:18いいの、おまえらはカスだから。
0144デフォルトの名無しさん
2007/02/15(木) 23:38:340145デフォルトの名無しさん
2007/02/17(土) 23:25:424バイト(32bit)で1が立っているかどうかを、1ビットずつ判定していきたいのですが、
for( i=0 ; i<32 ; i++ )
{
if( (unsigned long)abc & (1<<i) == 1<<i )
{
}
}
こんな感じでいいでしょうか?
全然違うぞとかアドバイスありましたらよろしくお願いします。
0146デフォルトの名無しさん
2007/02/17(土) 23:41:51if (abc & (1<<i))
{
}
で十分じゃね
0147デフォルトの名無しさん
2007/02/17(土) 23:42:55キャスト要らない。
1 だと int なので、符号ビットなど移植性を考えると 14 回までしか左シフトできない。
マスクした結果は 0 と比較したほうが効率がいいし、ソースが簡単にできる。
ってことで
if( (abc & (1UL<<i)) != 0 )
または
if(abc & (1UL<<i))
あたりがお勧め。
0148デフォルトの名無しさん
2007/02/17(土) 23:49:551 << i だったら最上位ビットは動かないのか
0149デフォルトの名無しさん
2007/02/18(日) 00:10:41この場合は負の数が関係なので符号ビットとか言ったのは混乱の元だった。
ごめん。
どの環境でも保証されている INT_MAX の最小値は 32767 なので、
16384 になる 1 << 14 までしか移植性のある動作は保証されない。
それ以上シフトすると未定義動作になる。
1UL だと型が unsigned long になり、 ULONG_MAX の最小値の定義は
4294967295 なので 2147483648 になる 1UL << 31 まで大丈夫。
0150145
2007/02/18(日) 00:27:04言われてifの使い方調べて勉強になりました。
if(a) a≠0:真 a=0:偽 なので
!=0や==0を省略できるのですね
あとULですが、どの環境でも使えるものなのでしょうか?
0151デフォルトの名無しさん
2007/02/18(日) 00:33:45整数リテラルのサフィックス UL は標準。どこでも使える。
0152デフォルトの名無しさん
2007/02/18(日) 02:09:520153デフォルトの名無しさん
2007/02/18(日) 03:36:360154145
2007/02/18(日) 06:11:09int i ;
unsigned long abc ;
if( (abc & (1UL<<i)) != 0 )
または
unsigned long saveabc ;
saveabc = abc ;
if( ((saveabc>>i) & 1) != 0 )
こんな感じでどうでしょうか?
0155145
2007/02/18(日) 06:18:550156デフォルトの名無しさん
2007/02/18(日) 06:30:430157デフォルトの名無しさん
2007/02/18(日) 06:33:17for (i+......) {
if (saveabc & 1) { ... } /* 最下位ビットのみチェック */
/* チェック対象自身を右シフトしてしまえー */
saveabc >>= 1; /* saveabc = saveabc >> 1; */
}
順次右シフトは、上記を示唆してるんだと思うよ
0158145
2007/02/18(日) 13:16:340159145
2007/02/18(日) 13:30:49int i ;
unsigned long abc ;
for( i=0 ; i<32 ; i++ ){
if( (abc>>i & 1) !=0 ){...}
}
これだとabcはunsigned longだし右に31シフトもできますでしょうか?
0160デフォルトの名無しさん
2007/02/18(日) 13:33:400161デフォルトの名無しさん
2007/02/18(日) 15:07:39・ abc & 1<<i
・ copyabc & 1 ... copyabc>>=1
・ mask=1 ... abc & mask ... mask<<=1
abcの値がその後必要ないなら
・ abc & 1 ... abc>>=1
も使える
0162145
2007/02/18(日) 15:46:30ありがとうございました
0163デフォルトの名無しさん
2007/02/20(火) 20:56:53解放するメモリ領域のサイズも必要な気がするのですが。
0164デフォルトの名無しさん
2007/02/20(火) 21:25:58その情報をポインタだけで引き出せるように管理しているから。
malloc/freeの実装の一例はK&Rに載ってる。
もちろんこれは一例で他にも実装方法はある。
0165デフォルトの名無しさん
2007/02/20(火) 21:51:42malloc()したときに割り当てた領域へのポインタとサイズを一緒に記録しておいて
free()するときに引数として渡されたポインタを元に割り当てた領域のサイズを計算して解放するというような感じですかね?
K&R持ってないので買って読んでみます。
0166デフォルトの名無しさん
2007/02/20(火) 22:03:57そういう実装もあると思う。
K&Rのやり方は、
・mallocするときに管理用ヘッダ+要求されたサイズのメモリを確保
・mallocは管理用ヘッダのサイズ分アドレスを進めたポインタを返す
・freeは渡されてきたポインタから管理用ヘッダのサイズだけ戻して管理情報を得る
・各メモリ領域はリンクポインタで辿れるようになっている
という感じの実装だった(はず。今手元に本がない)。
0167デフォルトの名無しさん
2007/02/20(火) 22:07:11空き領域の線形リストで、渡されたポインタで挟まれる部分を探す方式でなかったっけ?
K&R 探すか
0168デフォルトの名無しさん
2007/02/20(火) 22:15:24うーん、そうだったかもしれない。ごめん。
0169デフォルトの名無しさん
2007/02/20(火) 22:18:11いやいや。 俺も記憶だけで書いてるから…
>>165 とまあ、なんとかしてポインタから領域情報をひねりだしてるですよ
0170デフォルトの名無しさん
2007/02/21(水) 17:55:410171デフォルトの名無しさん
2007/02/24(土) 17:08:02現行規格では static char[] 型 です。
0172デフォルトの名無しさん
2007/02/24(土) 17:13:480173デフォルトの名無しさん
2007/02/24(土) 17:18:060174デフォルトの名無しさん
2007/02/24(土) 17:24:150175デフォルトの名無しさん
2007/02/24(土) 17:29:41*"" = '\0'; でソレっぽいコンパイルエラーが出るならconstなんじゃね?
0176171
2007/02/24(土) 17:34:480177デフォルトの名無しさん
2007/02/24(土) 18:03:14真っ赤な嘘書くなや。
0178デフォルトの名無しさん
2007/02/25(日) 01:33:020179171
2007/02/25(日) 20:06:13sizeof("1234567890") は char[11] のサイズか char* のサイズかを知る為
現行規格では char[11] のサイズ 11 になる
標準化前については、処理系依存で納得です。
0180171
2007/02/25(日) 20:09:09補足
標準化される前は 文字列リテラルの型は char* だと某所で見た。
0181デフォルトの名無しさん
2007/02/25(日) 20:17:40いやそうじゃなくて、文字列リテラルの型を知って
それを何に応用出来るの?って話だと思うぞ。
豆知識?
0182171
2007/02/25(日) 20:20:32だから
標準化前の sizeof("1234567890") の値を知る為。
その為に文字列リテラルの型が必要
でも処理系依存で納得した。
0183デフォルトの名無しさん
2007/02/25(日) 20:21:50無限ループになりそうだからもうやめとく。
0185デフォルトの名無しさん
2007/02/25(日) 20:30:160186デフォルトの名無しさん
2007/02/25(日) 21:46:090187178
2007/02/25(日) 22:20:33どうして sizeof("1234567890") の値を知りたいのか教えてくれ
0188デフォルトの名無しさん
2007/02/25(日) 23:02:42逆ではないのか?
文字列リテラルの型を間接的に測る手段としてsizeofを使うんだろうが。
0189デフォルトの名無しさん
2007/02/25(日) 23:13:57GB単位のファイルを処理しているんですが
ファイルの一部を上書きする標準関数てあるのでしょうか?
あと指定した位置から後ろ全てを削除するような関数も探してます。
0190デフォルトの名無しさん
2007/02/25(日) 23:15:270191デフォルトの名無しさん
2007/02/25(日) 23:17:050192189
2007/02/25(日) 23:27:21ありがとうございます。
ファイルの後半を削るというのはやっぱり無理なんでしょうか?
0193デフォルトの名無しさん
2007/02/25(日) 23:31:32Windows限定だったらSetEndOfFileなんてものもあるけど。
0194デフォルトの名無しさん
2007/02/25(日) 23:39:190195189
2007/02/25(日) 23:41:21fseek で調べたら上書きができるということはわかりました。
ただ挿入というようなことはできないと考えてよいのかな?
後半削除はないのですね。
ということは実現するには必要な部分だけファイルコピーということですね。
Windows 限定のコードではないので残念です。
差分とメタデータ使って実現するしかなさそうだな・・・。
0196デフォルトの名無しさん
2007/02/25(日) 23:41:47処理系依存(そもそもwrite自体が処理系依存だが)
0197デフォルトの名無しさん
2007/02/26(月) 00:13:07ファイルを作ること
ファイルをリネームすること
ファイルの任意の位置から読むこと
ファイルの任意の位置に書くこと
だけで、ファイルのサイズやレコードのオフセットを変更することはできない。
というかそれらはファイルの中身ではなく、ファイルの管理方法に関わることなので、
必然的に処理系のファイルシステムに依存する。
ありとあらゆる環境で動作することを保証したいなら、
それはファイルをまるごと読んで必要な構成で別ファイルに書き出し
元ファイルを消してから元の名前にリネームするしかない。
ある程度ターゲットの環境が決まっていて、それぞれに有効な環境依存の技があるなら、
それぞれの環境のためのコードを書いて、プリプロセッサで処理系に適合させるのが有効。
0198デフォルトの名無しさん
2007/02/26(月) 04:57:470200デフォルトの名無しさん
2007/02/28(水) 15:50:13ビットシフトはなんの役に立つのでしょうか?
0201デフォルトの名無しさん
2007/02/28(水) 16:11:58楽しいか?
0202デフォルトの名無しさん
2007/03/01(木) 00:55:09C++相談室の「STLを使うと」から始まるコピペみたいに
テンプレ化せんとダメなんかなぁ?
0203デフォルトの名無しさん
2007/03/05(月) 22:32:01mainはANSI Cではint main(void)またはint main(int argc, char *argv[])
と決まってるけど
K&Rではmain()となっていて戻り値intと引数voidを省略していますよね?
これもANSI準拠と言えるんでしょうか?
0204デフォルトの名無しさん
2007/03/05(月) 22:50:07戻り値の省略はANSI準拠でない
0205デフォルトの名無しさん
2007/03/05(月) 23:56:49関数定義:
宣言指定子列opt 宣言子 宣言並びopt 複合文
宣言子:
ポインタopt 直接宣言子
直接宣言子:
識別子
( 宣言子 )
直接宣言子 [ 定数式opt ]
直接宣言子 ( 仮引数型並び )
直接宣言子 ( 識別子並び )
だからmain()は許されてるように読めるけど。どこかで明示的に禁止されてたっけ?
0206デフォルトの名無しさん
2007/03/05(月) 23:57:220207デフォルトの名無しさん
2007/03/05(月) 23:58:240208デフォルトの名無しさん
2007/03/06(火) 00:16:26C++は確かダメだったような
0209デフォルトの名無しさん
2007/03/06(火) 00:18:29コンパイラによっては警告が出るから鬱陶しい。
0210デフォルトの名無しさん
2007/03/10(土) 02:33:54int cmp(int* a,int* b)
{
return *a-*b;
}
と書いてるサイトを見かけるんですが、これは
qsortのプロトタイプの
int(*func)(const void* a, const void* b))
と関数ポインタの互換性が無いと思うんですが、これはアリなんですか?
0211デフォルトの名無しさん
2007/03/10(土) 02:36:130212デフォルトの名無しさん
2007/03/10(土) 02:41:41int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
0213デフォルトの名無しさん
2007/03/10(土) 02:41:50それはオーバーフローを起こすアホコードだから絶対に真似しちゃダメ。
0214210
2007/03/10(土) 02:43:22ですよねぇ・・・
更には
return *a-*b;
も何かやばい感じがするんですが
aに大きい負数が渡されるとおかしな事になるような・・・
0215デフォルトの名無しさん
2007/03/10(土) 02:43:290216デフォルトの名無しさん
2007/03/10(土) 03:06:11$ lint 〜
にパスしないと受け付けられない、みたいな書込みがあったように思うのですが、
この「〜」の部分のオプションが分かる方いらっしゃいますでしょうか?
0217デフォルトの名無しさん
2007/03/10(土) 03:46:02誰かいますか??
0218デフォルトの名無しさん
2007/03/10(土) 03:47:05環境依存スレへどうぞ。
0219デフォルトの名無しさん
2007/03/12(月) 23:00:34return *a-*b;みたいな書き方してるけど
この辞典のサンプルソースはあてにならん
int型の配列のqsortの比較関数は下のような
感じになるんじゃないかな
int int_cmp(const void *a, const void *b)
{
if (*(int *)a < *(int *)b)
return (-1);
else if (*(int *)a > *(int *)b)
return (1);
return (0);
}
0220デフォルトの名無しさん
2007/03/12(月) 23:16:43{
return *(int *)a == *(int *)b ? 0 : ( *(int *)a > *(int *)b ? 1 : -1 );
}
0221デフォルトの名無しさん
2007/03/12(月) 23:21:230222デフォルトの名無しさん
2007/03/12(月) 23:23:46>やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。
0223デフォルトの名無しさん
2007/03/12(月) 23:28:40アホかい
0224デフォルトの名無しさん
2007/03/12(月) 23:42:350225デフォルトの名無しさん
2007/03/12(月) 23:43:550226デフォルトの名無しさん
2007/03/12(月) 23:58:36#define EQUAL 0
#define OVER 1
0227デフォルトの名無しさん
2007/03/13(火) 05:33:230228デフォルトの名無しさん
2007/03/13(火) 06:17:150229デフォルトの名無しさん
2007/03/13(火) 06:39:410230デフォルトの名無しさん
2007/03/13(火) 06:44:58_Boolじゃ3種類の値は返せないだろ
0231デフォルトの名無しさん
2007/03/13(火) 06:47:540232デフォルトの名無しさん
2007/03/13(火) 06:52:190233デフォルトの名無しさん
2007/03/13(火) 06:55:270234デフォルトの名無しさん
2007/03/13(火) 06:56:51qsortの仕様がそれを要求している。それだけ。知らなかったの?
0235デフォルトの名無しさん
2007/03/13(火) 07:09:43という流れできてるんだけど・・・・・・
0236デフォルトの名無しさん
2007/03/13(火) 07:42:29C++のstd::sort()の場合、要求してるのは2値(bool値)のPredicateだし
別に不可能ってわけじゃない。
例えばcmp() は a > b ならtrue, さもなくばfalseを返すという仕様であると
して、もし同値かどうかの判定が必要であれば、
cmp(a,b)、cmp(b,a)の両者がfalseならば a == b と判断できるわけで。
>>234の言うように、C標準のqsort()の仕様が3値の比較関数を求めている
ってだけだ。
0237デフォルトの名無しさん
2007/03/13(火) 07:58:04qsortはクイックソートではない
内部でどういうアルゴリズムで実装されててもいいことになっている
そういうわけで、a==bに対して非0を返すと、ソートが終わらなくなる可能性がある。
0238デフォルトの名無しさん
2007/03/13(火) 08:12:540239デフォルトの名無しさん
2007/03/13(火) 08:42:20ああ、なるほど。流れはわかった。
が、intを返すのってそんなにまずい設計か?
ちょっとその辺の説明が欲しい。
むしろループの中で何度も呼ばれる関数なわけで、
intを返すのは性能の観点から当然の選択だと思うけどな。
0240デフォルトの名無しさん
2007/03/13(火) 08:46:49>>221 がまずいって言い出したから、みんなで何がまずいんだよって叩いてる流れ
0241デフォルトの名無しさん
2007/03/13(火) 08:54:110242デフォルトの名無しさん
2007/03/13(火) 09:29:510243デフォルトの名無しさん
2007/03/13(火) 10:31:220244デフォルトの名無しさん
2007/03/13(火) 12:23:160245デフォルトの名無しさん
2007/03/13(火) 12:57:11求める仕様は糞と言ってもよいだろうな。
0246デフォルトの名無しさん
2007/03/13(火) 13:03:140247デフォルトの名無しさん
2007/03/13(火) 13:12:03×qsortはクイックソートではない
○qsortはクイックソートとは限らない
0248デフォルトの名無しさん
2007/03/13(火) 15:20:00文字列str1の最後の'\0'に文字列str2の0からを一つずつ代入していけばいいのは
分かるのですが、やり方がわかりません。
どうすればできますか?
0249デフォルトの名無しさん
2007/03/13(火) 15:22:360250デフォルトの名無しさん
2007/03/13(火) 20:15:26というかクイックソートを念頭に置いて名付けたんだろ。
単にこのスレ的にそう決めつけるのは誤ってるってだけで
>>244
実際の差を返す必要はないでしょ? 必要なのは符号だけで
0251デフォルトの名無しさん
2007/03/13(火) 20:17:15おまえは何もわかってないな
0252デフォルトの名無しさん
2007/03/13(火) 21:22:59いちいち言われんと解らんのか。
>>213
0253デフォルトの名無しさん
2007/03/13(火) 21:42:38誰か解説してくれ。
0254デフォルトの名無しさん
2007/03/13(火) 21:52:190255デフォルトの名無しさん
2007/03/13(火) 22:22:010256デフォルトの名無しさん
2007/03/14(水) 00:21:36なんでオーバーフロー起こすか解説きぼん
0257デフォルトの名無しさん
2007/03/14(水) 00:25:00*a=0, *b=INT_MINの場合、どうなるか?
0258デフォルトの名無しさん
2007/03/14(水) 00:35:24>>236を読め。2値さえ貰えれば十分のはずだから。
0259デフォルトの名無しさん
2007/03/14(水) 01:29:020260デフォルトの名無しさん
2007/03/14(水) 01:32:050261デフォルトの名無しさん
2007/03/14(水) 01:41:12int a = 0; int b = INT_MIN;のとき
>>210だと
cmp(&a, &b) < 0となってしまうのでダメってことか
で>>220だと
cmp(&a, &b) > 0となり正しいと。
0262デフォルトの名無しさん
2007/03/14(水) 01:47:31だと最高なんだがなーw
0263デフォルトの名無しさん
2007/03/14(水) 01:58:0245万行ってこと?
0264デフォルトの名無しさん
2007/03/14(水) 02:01:410265デフォルトの名無しさん
2007/03/14(水) 02:18:51違うよ。いつまでもそんな下らない話題引っ張られても邪魔だから
引っ込んでろといってる。
0266デフォルトの名無しさん
2007/03/14(水) 02:21:24要求しているのは2値のPredicateだ。
何度も繰り返すが、3値のPredicateは要らないんだよ本来は。
整数のオーバーフローとかいう低レベルの下らない話とは全然別問題。
0267デフォルトの名無しさん
2007/03/14(水) 03:36:11なんでここで全然関係のないstdc++が出てくるのかわからんがな。
規格においてqsortは安定でないことになっているから、
本来は3値も要らず、2値で十分てことだろ。
0268デフォルトの名無しさん
2007/03/14(水) 03:46:23実際には順序付け集合に対する2値の述語関数があれば、
3値と同等のことは実現できる。だから、仮に3値が必要な場合であっても
2値の述語関数で十分なの。
>>236を読めよ。
0269デフォルトの名無しさん
2007/03/14(水) 03:59:52比較関数をいっぱい呼びたい奴はC++を使っとけ
0270デフォルトの名無しさん
2007/03/14(水) 05:38:34まったくだ。ifとwhileだけで構造化は実現できるのにforなんて無駄きわまりないな。
breakやcontinueなんてもっての他だ。gotoやlongjmpに至っては(ry
0271デフォルトの名無しさん
2007/03/14(水) 05:47:10意味不明。馬鹿じゃないの。
構造化のための構文は*ユーザにとって*便利であり
*ユーザが*見通しの良いプログラムを書くのに役に立つ。
2値の述語関数で十分なのに3値の述語関数を要求するのは
*ユーザにとって*便利でも何でもないし、
それによって効率があがりもしない。
結局3値の比較が*実際に*必要である箇所では、比較が2度必要になるからだ。
しかし、3値の比較を*常に*ユーザ側に求めた場合、実際には必要でない
箇所でも2度の比較を行う羽目になる。
つまり、不便なだけでなく、効率が悪くなるのだ。
それはライブラリ側の怠慢であり手抜きであり仕様の欠陥でしかないよ。
0272デフォルトの名無しさん
2007/03/14(水) 05:47:59まったくだ。lambdaさえあれば他になにも(ry
0273デフォルトの名無しさん
2007/03/14(水) 05:56:40アホか。C++のほうがはるかにソートを楽に記述できる。
0274デフォルトの名無しさん
2007/03/14(水) 06:00:15限らないんだが、
わざわざそれを常にユーザに強いているのがCのqsort()の仕様。
C++のstd::sort()の場合は、そんな馬鹿なまねはしない。必要な場合は、
そして必要な場合のみに限って、2値のPredicateだけで等値かどうかの
判定をできるからだ。
0275デフォルトの名無しさん
2007/03/14(水) 06:59:21オーバーフローがどうこうという面倒な話も発生しない。
0276デフォルトの名無しさん
2007/03/14(水) 07:34:36演算子なんてものが用意されてるよね。
<=> とか cmp とか。これは笑ってしまう。
0277デフォルトの名無しさん
2007/03/14(水) 08:02:250278デフォルトの名無しさん
2007/03/14(水) 09:12:15とりあえず論点が完全にズレたまま進行してることはわかった
0279デフォルトの名無しさん
2007/03/14(水) 20:42:330280デフォルトの名無しさん
2007/03/14(水) 21:31:47初期値として、
hoge.bar == NULL と hoge.foo == NULL は保証されているのでしょうか?
struct {
char *bar;
char **foo;
} hoge;
0281デフォルトの名無しさん
2007/03/14(水) 21:33:290282デフォルトの名無しさん
2007/03/14(水) 21:40:01まさかあれか、全ビット0がNULLとは限らないというあの流派か。
0283デフォルトの名無しさん
2007/03/14(水) 21:43:230284デフォルトの名無しさん
2007/03/14(水) 21:56:14ゼロフィルではなく、全てのメンバが0に。
0285デフォルトの名無しさん
2007/03/14(水) 22:01:03関数で宣言、なら自動変数かもね。 深読みしすぎといわれればその通り。
0286デフォルトの名無しさん
2007/03/14(水) 22:06:00「C言語プログラミング能力認定試験」って取るメリットありますか?
0287デフォルトの名無しさん
2007/03/14(水) 22:09:521級ならまだ許せるけど、履歴書に2級とか書かれたら(´,_ゝ`)プッ
0288デフォルトの名無しさん
2007/03/14(水) 22:16:35プログラミングをするにあたってまず何をそろえて何をすればいいんでしょうか?
0289デフォルトの名無しさん
2007/03/14(水) 22:19:21MSのサイトからコンパイラをダウソ。
0290デフォルトの名無しさん
2007/03/14(水) 22:21:240291デフォルトの名無しさん
2007/03/14(水) 22:24:13ボーランドコンパイラかVisual C++ Express。どっちも無料
インストール後、適当にPATH通せ
0292デフォルトの名無しさん
2007/03/14(水) 22:29:360293288
2007/03/14(水) 22:49:470294デフォルトの名無しさん
2007/03/14(水) 23:22:34「ファイルで」というのが「関数の外で」宣言されたという意味なら、される。
この初期化は、配列でも構造体でも、全ての要素について「=0」と書いたかのように行われる。
よって不動小数点数は0.0に、ポインタはヌルポインタに正しく初期化される。
>>293
入門書を買って言語仕様を覚えろ。
0295デフォルトの名無しさん
2007/03/14(水) 23:27:150296デフォルトの名無しさん
2007/03/15(木) 00:19:35大間違い。
0297デフォルトの名無しさん
2007/03/15(木) 00:39:01俺は294じゃないけど間違いというならその理由を示してよ。
K&R A8.7初期化 より引用
> 明示的に初期化されない静的オブジェクトは、それ(あるいはそのメンバー)に定数
> 0が代入されたかのように初期化される。明示的に初期化されない自動オブジェク
> トの初期値は、不定である。
0298デフォルトの名無しさん
2007/03/15(木) 00:52:49根拠を示さず「大間違い」とだけ言うのは小学生だってできる。
無視してかまわんだろう。
0299デフォルトの名無しさん
2007/03/15(木) 00:53:35知らんがたぶん、>>282 じゃないのかな
0300デフォルトの名無しさん
2007/03/15(木) 00:59:15違う。
0301デフォルトの名無しさん
2007/03/15(木) 01:00:15>>297が示している通り、プログラマーが =0 と書いたのと同じように初期化される。
0302デフォルトの名無しさん
2007/03/15(木) 01:01:03関係ないでしょ。だって
void *p = 0;
と書いてあるように初期化されるんでしょ。
これはpには全ビットが0の値が入るのではなくて、
NULLポインタが入るんだよ。
0303デフォルトの名無しさん
2007/03/15(木) 01:01:370304デフォルトの名無しさん
2007/03/15(木) 01:02:24それで済まない処理系で規格を満たすためには、初期化専用のコードを
コンパイラが吐き出して、スタートアップルーチンで呼ばれるようにする
んだろね。
なんかC++みたいだなw
0305デフォルトの名無しさん
2007/03/15(木) 01:06:450306デフォルトの名無しさん
2007/03/15(木) 01:07:23それ実は俺もずっと気になってたんだけど
ポインタに0代入したらそれはNULLポインタと等価なの?
というか全ビット0がNULLとは限らない処理系ってあるの?
0307デフォルトの名無しさん
2007/03/15(木) 01:09:10CFAQには、そういう処理系も実在すると書いてあったよ
0308デフォルトの名無しさん
2007/03/15(木) 01:11:14ヌルポインタの内部表現が未既定なのも
ポインタがくるべき場所に整数定数0を書いたらヌルポインタに変換されるのも
規格がそう定めているからであって、そのような処理系が実在するからではない
0309デフォルトの名無しさん
2007/03/15(木) 01:15:45> ポインタに0代入したらそれはNULLポインタと等価なの?
Yes.
ポインタの文脈では0はいつでもnull pointer constantとして扱われる。
0310デフォルトの名無しさん
2007/03/15(木) 01:16:21コンパイラが整数定数0を正しいヌルポインタの値に変換する。
値が0である整数変数を代入する場合はこれにあてはまらない。
あくまで定数だけである。
0311デフォルトの名無しさん
2007/03/15(木) 01:25:21なっとく。
0312デフォルトの名無しさん
2007/03/15(木) 01:27:00ぶっちゃけauto変数以外はリンカーがプログラムに引っ付けて実行形式で出力する。
実行するとローダーがフォーマットに従い元通りに展開してくれる
auto変数で使うスタック領域もローダーがフォーマットに従いサイズ分用意してくれるが、
0クリアする決まりが無いので未初期化として扱うのが決まりになってる。
ROMで実行されるプログラムでない限りは、こんな覚え方でいいような気がする。
0313デフォルトの名無しさん
2007/03/15(木) 01:29:48#define NULL 0
#define NULL ((void*)0)
以外の処理系って見たことある?
俺は無いけど。
0314デフォルトの名無しさん
2007/03/15(木) 01:32:02BSS(未初期化のstatic変数を格納する領域)も実行形式に
埋め込む処理系は少ないのでは。
スペースの無駄だからね。
0315306
2007/03/15(木) 01:37:050316313
2007/03/15(木) 01:39:150317デフォルトの名無しさん
2007/03/15(木) 02:15:30最近のgccとかは __null とかになってなかった?
0318デフォルトの名無しさん
2007/03/15(木) 03:16:080319デフォルトの名無しさん
2007/03/15(木) 03:17:01構わないと思う。
0320デフォルトの名無しさん
2007/03/15(木) 03:27:38ハードにかかわらず、NULLを整数値として評価した場合は 0 として評価されるって規格で定められてたと思うけど。
0321デフォルトの名無しさん
2007/03/15(木) 03:43:29あ、いやNULLの番地がって意味で
0322デフォルトの名無しさん
2007/03/15(木) 05:00:16俺したこと無い。
例えば
int *foo = 0;
とか
typedef struct{
int a;
char *p;
}hoge;
hoge *ho = 0;
とかしちゃったりするの?
0323デフォルトの名無しさん
2007/03/15(木) 05:01:380324デフォルトの名無しさん
2007/03/15(木) 05:06:01関数ローカルや構造体メンバでその名前使っても問題ないよね?
jmp_buf とか va_list とか、マイナーなやつをうっかり使ってしまうことが
無いとは言えないんで、エディタのキーワードハイライトに全部
突っ込んでおこうかと思ったんだけど、よくよく考えたら
ファイルスコープでやらかさなけりゃ全然問題ないんじゃないかと。
0325デフォルトの名無しさん
2007/03/15(木) 08:35:49DOSでラージメモリモデルの環境では0Lになっていると思う。
少なくともLSI C-86のヘッダではそうだった。
0326デフォルトの名無しさん
2007/03/15(木) 08:38:48いや、それらはグローバルなので問題ありまくり。
衝突を避けたければ、ユーザコードの名前に特定のPrefixを付けるといった
規約を考えたほうがよい。
0327デフォルトの名無しさん
2007/03/15(木) 09:54:39jmp_buf なんて何の規則も無い名前との衝突を避けようと思ったら、
関数ローカルや構造体メンバに int a; とすら書けないと思うんだが、
正気か?
0328デフォルトの名無しさん
2007/03/15(木) 10:22:35は?
構造体タグ名、変数名、メンバー名は別の名前空間に属するから、
そのような例で同一の名前を用いても問題が生じるわけがないよ。
0329デフォルトの名無しさん
2007/03/15(木) 10:22:58単に「NULL」という言葉を「ヌルポインタ」という意味で使うと誤解を招きかねないのでやめたほうがいい
マクロNULLとヌルポインタは別のものであるから、区別できるように書くべき
0330デフォルトの名無しさん
2007/03/15(木) 10:27:24元の質問 >324 がそう言って「問題ないよね?」って聞いたのに対して
>326 が「問題ありまくり」と返しているんだが。
0331デフォルトの名無しさん
2007/03/15(木) 10:30:11同一の名前空間で同じ名前を重複させたら当然問題あるでしょ。
あなたがC言語の仕様に対する無知によって、的外れな例を挙げただけ。
0332デフォルトの名無しさん
2007/03/15(木) 10:40:58構造体メンバは問題が生じるわけないってことか?
なら残りはローカル変数ってことでいいかい?
ファイルスコープの typedef である jmp_buf の名前空間は
ローカル変数といっしょで変数名だよね?
でもローカル変数ならスコープが重なるだけなんで、ライブラリの
jmp_buf を使うつもりじゃなくてうっかり(知らずに)ローカル変数名として
使っただけなら問題ないんじゃないの?
どうせ内側で宣言されたローカル変数しか参照しないんだから。
0333デフォルトの名無しさん
2007/03/15(木) 10:43:47ヒント: 他人にものを聞く態度
>>336を読まなかったのかい?
jmp_bufは「ファイルスコープ」の名前ではありません。
0334デフォルトの名無しさん
2007/03/15(木) 10:52:50だから、
typedef int i;
i i;
のようなコードも合法。良いスタイルではないけどね。
0335デフォルトの名無しさん
2007/03/15(木) 11:11:43「ファイルスコープ」じゃなくて「グローバルスコープ」って言いたいの?
ISO C99 の最新ドラフトを見てしゃべってるんだが、規格には
「グローバル」なんてスコープは無いよ。
6.2.1 で列挙されてるのは "file scope", "block scope",
"function prototype scope" の3種類だけ。 "global scope" で
検索してもひとつもヒットしない。なので >326 の言ってる
「グローバル」ってのはファイルスコープのことだと思った。
0336333
2007/03/15(木) 11:14:40あーごめん。嘘ついたかも。
リンケージまで考えるとファイルスコープって一般にstaticなオブジェクトのこと
を指すと思うんだけど、今は名前の話だったな。ごっちゃになってたわ。
0337デフォルトの名無しさん
2007/03/15(木) 11:16:45>>334
で、同じく ISO C の最新ドラフトから、 6.2.3 に列挙されてる
名前空間は、ラベル名、タグ名、メンバ名、その他の4つ。
変数名も typedef 名も最後のその他で同じ名前空間です。
どんなコンパイラがそのコードを受け付けてくれるの?
手元の gcc ではやっぱりエラーになるよ。
:2: error: 'i' redeclared as different kind of symbol
:1: error: previous declaration of 'i' was here
0338334
2007/03/15(木) 11:20:54スコープ違う形で試したから受け入れられたっぽいな。
こっちもすまん。
0339デフォルトの名無しさん
2007/03/15(木) 11:22:19確かに。お粗末でした。
0340324
2007/03/15(木) 11:57:280341デフォルトの名無しさん
2007/03/23(金) 00:03:57struct a {
int a;
};
typedef struct a a;
a b:
void c()
{
b.a = 0;
goto a;
a: ;
}
ってこと?
0342デフォルトの名無しさん
2007/03/23(金) 01:52:18何がしたいのかわからん。
0343341
2007/03/23(金) 09:26:10ただ名前空間の分類としては、こういうことかな?と
aは全部違う名前空間ということで。
0344デフォルトの名無しさん
2007/03/23(金) 10:34:48そうだよ。ちゃんとコンパイルできただろ?
0345デフォルトの名無しさん
2007/03/30(金) 01:20:19何分↓スレに専門知識を持った人間がおらず、真偽が分からなかったので
ここで質問させていただきました
558 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:06:29 ID:ENSP49sq
そうだ
一応書いておくわ
CとかJavaとか言語でわけてる現状がそもそもおかしいから
ソースコード翻訳機作ってやってるよ
おまえも参加しろwww
役に立たない下っ端を使えるようにする秘策だぞwwww
561 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:12:11 ID:ENSP49sq
意味分からないのか??
コンパイラじゃなく
ソースコードをそれぞれに変換するってことだぞ
意味分からないかな??
564 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:14:33 ID:ENSP49sq
たとえば
Cで書いたコード100万行を
自動変換で
Javaコードに変換するって奴だwwwwww
分かるかな???
ttp://human6.2ch.net/test/read.cgi/dame/1174933496/l50
0346デフォルトの名無しさん
2007/03/30(金) 01:27:44マルチ氏ね!
0347デフォルトの名無しさん
2007/03/30(金) 02:31:560348デフォルトの名無しさん
2007/04/09(月) 14:46:420349デフォルトの名無しさん
2007/04/09(月) 14:50:360350デフォルトの名無しさん
2007/04/09(月) 14:56:45そんなアホナ。。。
0351デフォルトの名無しさん
2007/04/09(月) 15:00:27stat とか fstat で
0352デフォルトの名無しさん
2007/04/09(月) 15:11:310353デフォルトの名無しさん
2007/04/10(火) 12:13:30と何個でも、何文字でも無制限にいけるのか?
0354デフォルトの名無しさん
2007/04/10(火) 12:27:41ARG_MAXでぐぐれ。
0355デフォルトの名無しさん
2007/04/10(火) 12:39:200356デフォルトの名無しさん
2007/04/10(火) 20:30:120357デフォルトの名無しさん
2007/04/11(水) 00:27:460358デフォルトの名無しさん
2007/04/11(水) 00:30:270359デフォルトの名無しさん
2007/04/12(木) 22:37:03できました! ありがとうございます!
0360デフォルトの名無しさん
2007/04/13(金) 01:54:24mjky
0361デフォルトの名無しさん
2007/04/13(金) 15:40:58void Free(void *ptr)
{
if (ptr != NULL) free(ptr);
}
こんなようなの、、、
0362デフォルトの名無しさん
2007/04/13(金) 15:50:03それは意味無いな。
0363デフォルトの名無しさん
2007/04/13(金) 15:50:400364デフォルトの名無しさん
2007/04/13(金) 15:51:15常識ではないし、標準Cなら
| free 関数は、ptr が指す領域を開放し、その後の割付けに使用できるようにする。
| ptr が空ポインタの場合、何もしない。
ので、まったくの無駄。
もっとも、malloc/free のトレースをしたいという目的で
ラップするのはアリ。
0365デフォルトの名無しさん
2007/04/13(金) 16:46:050366デフォルトの名無しさん
2007/04/13(金) 23:45:45ペアであるmalloc/freeのインターフェイスをよりペアらしくできるから、
オレはこんな感じにすることがある。
result_type my_malloc(void **ptr, int size)
{
*ptr = malloc(size);
return (NULL != *ptr) ? result_success: result_faild;
}
result_type my_free(void **ptr)
{
if (NULL == *ptr)
{
free(*ptr);
*ptr = NULL;
}
return result_success;
}
0367デフォルトの名無しさん
2007/04/14(土) 00:02:530368デフォルトの名無しさん
2007/04/14(土) 00:04:430369デフォルトの名無しさん
2007/04/14(土) 00:25:26間違えやすいよな.C++なら参照使えばいいけど,
Cならマクロ使った方がいい局面かも.
0370デフォルトの名無しさん
2007/04/14(土) 00:42:17C++を使えるときにはnewを使えばいいんだけど。
0371デフォルトの名無しさん
2007/04/14(土) 02:43:50my_freeは、渡されてきたポインタがNULLの時にのみ解放してるけど、それでいいの?
というか単純ミスだよなw
0372デフォルトの名無しさん
2007/04/14(土) 02:57:190373デフォルトの名無しさん
2007/04/14(土) 09:31:55malloc()の戻り値をチェックするのは無駄だって説もあるな。
0374デフォルトの名無しさん
2007/04/14(土) 09:45:08カーネルの設定換えれば検出できるようになるね。
さもなくば、calloc()で検出できるんじゃないか?
0375デフォルトの名無しさん
2007/04/14(土) 10:05:410376デフォルトの名無しさん
2007/04/14(土) 10:12:330377デフォルトの名無しさん
2007/04/14(土) 10:23:450378デフォルトの名無しさん
2007/04/14(土) 10:31:26ってこのスレじゃ関係ないね
0379デフォルトの名無しさん
2007/04/14(土) 11:49:59mallic()で0を返さないって。
0380デフォルトの名無しさん
2007/04/14(土) 11:54:590381デフォルトの名無しさん
2007/04/14(土) 15:47:16malloc()は、システムコールじゃないよ。libcの関数だよ。
わかってる?
0382デフォルトの名無しさん
2007/04/14(土) 15:58:38駄目。
malloc()の実装のサンプル(システムコールとの関係)はK&Rにも載ってるから
興味がある人は目を通して理解しておくと良いよ。
知ったかぶりすると恥ずかしいから。
Windowsで言うなら、
VirtualAllocは確保できなくても0以外を返すかもしれない(実際は知らない)けど
HeapAlloc(OSからもらったメモリを必要な分だけに区切って渡す)は
確保出来ないときは0(NULL)を返すということ。
(サイズ情報等を埋め込むから、必ず実際のメモリにアクセスする)
VC++なんかのmallocは、HeapAllocをそのまま呼んでるだけだし。
0383デフォルトの名無しさん
2007/04/14(土) 16:11:45> デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が
> NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。
> これは本当にまずいバグである。
なるほど、確かにこれはバグだと言っている
0384デフォルトの名無しさん
2007/04/14(土) 16:19:02malloc()がどう実装されてるかなんてそれこそ環境依存以外の何者でもない
とはいえ利用可能でないのにNULLを返さないのは規格違反だろうな
0385デフォルトの名無しさん
2007/04/14(土) 16:23:15アドレス空間が足りない時等「一般的にmallocがNULLを返す状況」では無く、
システム全体(カーネルと各プロセス最小限使用分)の「物理メモリ」が不足する状況で
プロセスの存在そのものが抹消されるわけね。
それも、自分自身とは限らないプロセスが。
0386デフォルトの名無しさん
2007/04/14(土) 16:25:23「近代的なOS」が使っているのは、仮想記憶とデマンドページングだろ。
mallocが失敗してもNULLを返さないのとは関係ない。
0387デフォルトの名無しさん
2007/04/14(土) 16:26:270388デフォルトの名無しさん
2007/04/14(土) 16:30:32glibcと言っておこう
0389デフォルトの名無しさん
2007/04/14(土) 16:31:52でも、とりあえず、manでヒープの破壊について触れているくらいだから
今話題のLinuxのglibcの実装に関しては、
確保したブロックの前後に管理ブロックがあると、仮定しても構わないでしょ。
0390デフォルトの名無しさん
2007/04/14(土) 16:33:25アプリケーションに返すメモリがたまたまページ境界にまたがったときかな
0391デフォルトの名無しさん
2007/04/14(土) 16:38:02いや、>>385な状況で、実際に物理メモリが足りないと判明する時でしょ。たぶん。
ページ境界の可能性もあるけど、大きなブロックを確保して真ん中にアクセスした時とかも。
ていうか、この場合、メモリ不足が
「アクセスするまでわからない」じゃなくて「絶対にわからない」だな。
分かった瞬間に検出することも出来ないまま殺されちゃうんだから。
>>373の「NULLチェックが無駄かも」という結論は一緒かもしれないけど。
0392デフォルトの名無しさん
2007/04/14(土) 16:38:04最初のページだけは管理情報の書き込み時点でコミットされるけど
2ページ目以降を踏んだとたん落とされる可能性がある
0393デフォルトの名無しさん
2007/04/14(土) 16:38:280394デフォルトの名無しさん
2007/04/14(土) 21:09:29端数が出た場合の処理はどのように実現するのがスマートなのでしょうか。
データは必ずシーケンシャルに確実に書き込まれる必要があって困っています。
携帯開発辛い...
0395デフォルトの名無しさん
2007/04/14(土) 21:14:10言語と何ら関係がない質問なので、スレ違い。
まぁ、切り捨てていいなら切り捨てるし切り捨ててはいけないなら補うだけだな。
尤も、補う方法もダミーを詰めるだけでいいのか適当に間引く必要があるのか知らんが。
0396デフォルトの名無しさん
2007/04/15(日) 02:13:31許されるバッファサイズと
書き込みサイズ > 256
書き込みサイズ ~= 256
書き込みサイズ <<< 256
で, 解が 異なると思うんだが...
0397デフォルトの名無しさん
2007/04/15(日) 08:03:22馬鹿晒さなくていいから。
0398デフォルトの名無しさん
2007/04/15(日) 12:16:27書き出しサイズ (data_size + (n-1)) / n * n
n が2の累乗数なら (data_size + (n-1)) & ~(n-1) で代用可能
0399デフォルトの名無しさん
2007/04/15(日) 17:27:09VirtualAllocがメモリの予約やコミットに失敗した時は
NULLを返すのは保証されてるよ〜
0400デフォルトの名無しさん
2007/04/15(日) 19:59:290401デフォルトの名無しさん
2007/04/21(土) 04:35:160402デフォルトの名無しさん
2007/04/22(日) 23:30:12fseek()でSEK_ENDに移動して
ftell()の戻り値を取得する方法を使っていたんですが、
どこかのサイトに
「バイナリモードでファイルをオープンした時はSEEK_ENDの値が保証されない」
みたいな事が書いてありました
理由がよくわからないんですが、なぜなんでしょう
0403デフォルトの名無しさん
2007/04/23(月) 00:08:580404デフォルトの名無しさん
2007/04/23(月) 00:10:453 For a binary stream, the new position, measured in characters from the beginning of the
file, is obtained by adding offset to the position specified by whence. The specified
position is the beginning of the file if whence is SEEK_SET, the current value of the file
position indicator if SEEK_CUR, or end-of-file if SEEK_END. A binary stream need not
meaningfully support fseek calls with a whence value of SEEK_END.
だそうだ、詳しくは知らない
0405デフォルトの名無しさん
2007/04/23(月) 00:11:27SEEK_ENDの値が保証されない
でググって最初のやつ
0406デフォルトの名無しさん
2007/04/23(月) 00:24:42http://takagi.in/modules/xoopsfaq/index.php?cat_id=1
このページか? 大嘘だから無視していい
The fseek() function sets the file position indicator for the stream
pointed to by stream. The new position, measured in bytes, is obtained
by adding offset bytes to the position specified by whence. If whence is
...
The fgetpos(), fsetpos(), fseek(), ftell(), and rewind() functions con-
form to ISO/IEC 9899:1990 (``ISO C90'').
0407デフォルトの名無しさん
2007/04/23(月) 00:31:34テキストファイルはファイル終端を表すEOFコードを書き込んでいたが、
バイナリファイルではそうもいかないため終端へのシークができない
(あえてやるとすればブロックなどといったもう少し大きな単位での終端までいってしまう)
ということのはず。
0408デフォルトの名無しさん
2007/04/23(月) 05:10:490409デフォルトの名無しさん
2007/04/23(月) 05:26:59CP/Mがそんなだったかな。
EDLINEとかDOS用のエディタでテキストファイルを作ると最後に^Zが付くのはその名残。
0410デフォルトの名無しさん
2007/04/23(月) 19:21:071) どこだったか忘れてしまったのですが、ネット上の文書で
「カンマ演算子はインクリメント/デクリメントの副作用完了点にならない」
というような記述を読みました。これは正しいのでしょうか?
i++, i++; としてはならないと書いてありました。
2) int *f(int *p) { return p; } という関数があったとして、
以下の例は合法でしょうか?
int i;
*func(&i) = 1;
*func((++i, &i)) = 1;
3) 関数 int g(int); について、式 (++i * g(++i)) の 二つの ++i の評価される順序や、
式 (g/*1*/(i) + g(g/*2*/(i))) で g/*1*/ と g/*2*/ が呼ばれる順序は定義されていますか?
よろしくお願いします。
0411デフォルトの名無しさん
2007/04/23(月) 19:54:58今の時代書くべきじゃない。
0412デフォルトの名無しさん
2007/04/23(月) 19:56:19a[i++] = b; とか。
読みやすいプログラムを書け。
0413デフォルトの名無しさん
2007/04/23(月) 19:57:42なんで乞われてもいないのに語りだすん?
0414デフォルトの名無しさん
2007/04/23(月) 20:08:42コンマ演算子は副作用完了点になるはずだと思うんだけど。
0415デフォルトの名無しさん
2007/04/23(月) 21:05:46その他の演算子は不定。なので
1) は「正しくない」
2) は「合法」
3) は「定義されていない」
>>413
>>411-412 は、今何の話をしているかをまったく理解できていないものと思われる。
0416デフォルトの名無しさん
2007/04/23(月) 21:27:43int a,b
for(i=0;i<10;i++)
{
*a++ = *b++;
}
0417デフォルトの名無しさん
2007/04/23(月) 21:43:380418デフォルトの名無しさん
2007/04/23(月) 21:47:41見ないし、見たくない。
0419デフォルトの名無しさん
2007/04/23(月) 22:15:36以下を、突っ込んで欲しい順に並べてください。
ア・「でも」は何処に掛かってんだ!?
イ・更に話題を発散させるつもりか!?
ウ・aとbはポインタちゃうやろ!!
0420デフォルトの名無しさん
2007/04/23(月) 22:20:26ウ・aとbはポインタちゃうやろ!!
ア・「でも」は何処に掛かってんだ!?
イ・更に話題を発散させるつもりか!?
0421402
2007/04/23(月) 22:26:44> A binary stream need not meaningfully support fseek calls with a whence value of SEEK_END.
という事は厳密には移植性が無いって事でいいんですかね
と思ったんですが
>>406 マジすか?混乱してきました
>>408 後学のためにどこか教えていただけますか?
0422デフォルトの名無しさん
2007/04/23(月) 22:44:09例えばこの辺。
> Linux などの Unix 系 OS の環境では、テキストモードとバイナリモードの区別がないという表現がよく見受けられますが、
>それはあくまでもナロー文字を扱っている場合のことであり、ワイド文字を扱う場合には当てはまりません。
>また、たとえ Unix 環境でナロー文字しか扱わない場合であっても、移植性の高いコードを書くには、
>テキストモードとバイナリモードを等価なものと考えてはいけません。
ここを見れば判るが、POSIXではそもそもそんなモードがない。
>ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html
0423デフォルトの名無しさん
2007/04/24(火) 00:44:29while ((c = getchar()) != EOF) {}
なんて書き方を良く見るが、たまに
while (c = getchar(), c != EOF) {}
の方が分かりやすい人も居るんじゃないかと思ったりする。
(優先順位等が分かっている人には)
ただ、K&R等で上の書き方が使われているし、
一般的に「慣れている方が分かりやすい」という観点からは
やはり上の形なのかな、と思う。
K&Rで上の形式なのは、大昔の非最適化コンパイラの都合もあるだろう。
0424デフォルトの名無しさん
2007/04/25(水) 15:10:10これの示す値がどのように定義されているのかが分かりません。
とりあえず実際に動かして調べてみたところ、
ファイルの場合は8、ディレクトリの場合は4が入ってくるようなのですが、
他にも何か値が入ってくる場合があるのでしょうか?
御教授ください
0425デフォルトの名無しさん
2007/04/25(水) 15:14:060426デフォルトの名無しさん
2007/04/25(水) 19:11:37確かにカンマ演算子使うのはいいかもな、
ま、俺もどうせ今更だから使わないけど
0427デフォルトの名無しさん
2007/04/25(水) 19:31:06下の方が分かりやすいとは思うんだけど、
c を2回書かないといけない点は気持ち悪い。
悩ましいところ。
0428デフォルトの名無しさん
2007/04/25(水) 22:49:49scanfで10桁までの数字を入力し、その10桁の数字を配列に格納するにはどうしたら良いでしょうか?
こんな感じの↓問題なのですが、お願いします。
1.10桁までの任意の数字を入力し、入力した値を配列に格納し、
「何桁目を表示しますか?」を出力し1〜10までの任意の数字を入力後
「○○桁目の数字は○です」と出力されるプログラムを作成せよ
ググってもわからないし、全然できないです…orz
どなたか解いてください。
0429428
2007/04/25(水) 22:52:190430デフォルトの名無しさん
2007/04/25(水) 22:52:360431デフォルトの名無しさん
2007/04/26(木) 10:21:100432デフォルトの名無しさん
2007/04/28(土) 13:57:29でええやんw
0433デフォルトの名無しさん
2007/04/28(土) 14:03:400434デフォルトの名無しさん
2007/04/28(土) 14:33:14setNum(&list[], sizeof(list));
pos=getPos("何桁目を表示しますか?", sizeof(list));
printf("%d桁目の数字は%dです\n", pos, list[pos] );
こんな感じでおk
0435デフォルトの名無しさん
2007/04/28(土) 15:20:440436デフォルトの名無しさん
2007/04/28(土) 15:37:00配列サイズの個数の任意の数字を入力し、入力した値を配列に格納
getPos()
メッセージを出力し1〜サイズ以下の任意の数字を入力させ、それを返却
0437デフォルトの名無しさん
2007/04/28(土) 16:24:150438デフォルトの名無しさん
2007/04/28(土) 16:42:570439デフォルトの名無しさん
2007/04/28(土) 16:46:460440デフォルトの名無しさん
2007/04/28(土) 20:09:57とありましたが、「御教示ください」と言ふべきです。
0441デフォルトの名無しさん
2007/04/28(土) 22:21:300442デフォルトの名無しさん
2007/04/28(土) 22:25:400443デフォルトの名無しさん
2007/04/30(月) 19:09:200444デフォルトの名無しさん
2007/05/01(火) 17:07:22Bの出力する標準出力はディスプレイに出さず全てAが受け取り、
Bが行うscanfなどの標準入力要求時には、すべてAから入力を与えるようにするにはどうすればよいでしょうか。
system,popen等の関数を調べたのですが、実現できません。
一見popenで出来るかと思いきや入力か出力のどちらかしかできないようで困ってます。
手順やキーワードだけでも結構ですので教えてもらえませんでしょうか。
0445gost
2007/05/01(火) 17:22:26>>
unsigned long a;
unsigned long b;
a と b には任意の値が格納済みであるとして、加算するとオーバー
フロー(0xFFFFFFFFを超える)の場合、"Overflow"、オーバーフロー
しない場合、"(a+b) OK" を出力するプログラム 教えてください
条件:
if((a + b) > 0xFFFFFFFF) の判定は使えません。
if((a + b) <= 0xFFFFFFFF) の判定は使えません。
a と b を加算してはなりません。
0446デフォルトの名無しさん
2007/05/01(火) 17:32:29popenの第2引数に"rw"使えなかったっけ
あとはforkで起動してパイプつなぐとか
0447デフォルトの名無しさん
2007/05/01(火) 17:43:29宿題臭いな。宿題スレに行けば。
0448gost
2007/05/01(火) 17:46:030449デフォルトの名無しさん
2007/05/01(火) 17:51:05速くなる可能性がある(コメント必須)という話があったが
if (memcmp(p, "924", 3) != 0) より
if (p[0] != '9' || p[1] != '2' || p[2] != '4') より
if ((p[0] ^ '9' | p[1] ^ '2' | p[2] ^ '4') != 0) の方が
速くなる可能性もあるのかな。(コメント絶対必須で)
もちろん、ショートサーキットの起こる率によっても違うだろうが。
まあ、このケースに限れば(バスエラーが起きない状況なら)
if (*(DWORD *)p & *(DWORD *)"\xFF\xFF\xFF" == *(DWORD *)"924")
の右2つを整数定数に変えたものが最速か。
もちろん、このコードは移植性も無いし可読性もない
最悪のコードではあるのだが。
0450デフォルトの名無しさん
2007/05/01(火) 17:51:27たしかrubyの人が言ってた気がする。
0451デフォルトの名無しさん
2007/05/01(火) 18:00:03unsinged long c = a + b;
if(c < a) {
puts("Overflow");
} else {
puts("(a+b) OK");
}
∵)
オーバーフローしたとすると、
c = a + b - m (m = 0x100000000)
c >= a だと仮定すると b >= m となるが、b < m なので矛盾する。
従って、オーバーフローした場合は必ず c < a となる。
逆に、オーバーフローしていない場合に
必ず c >= a になるのは自明。
∴ c < a ならばオーバーフローしている。
0452デフォルトの名無しさん
2007/05/01(火) 18:06:40分岐は基本的にコストが高いから
分岐が少ない方が速くなる可能性はあるけど、
どのくらい速くなるかは
環境と実行条件によるとしか言えない。
だから、よく使われると想定する環境下で実測するしかない。
ただ、よほどじゃないと問題にならない程度の差しかないと思うけどね。今の時代。
数兆周のループの中に入ってるとかでもない限り。
0453デフォルトの名無しさん
2007/05/01(火) 18:32:01ではいかんか?
0454デフォルトの名無しさん
2007/05/01(火) 18:47:240455デフォルトの名無しさん
2007/05/01(火) 19:25:10Hacker's Delightの2-12でも読めば?
0456デフォルトの名無しさん
2007/05/01(火) 20:51:40ローカルの日時から、年月を補ってtime_t型通算病
(所謂UNIXタイム)を求めたいのだけど・・
単純にtime, localtime, mktimeで作ると、月替わりタイミングでバグるよね。
スマートなやり方があった気がするが・・思い出せない、おながいします。
※リモートとの時刻誤差は数分以内程度を想定してます。
0457デフォルトの名無しさん
2007/05/01(火) 20:55:260458デフォルトの名無しさん
2007/05/01(火) 23:47:23日が取得できるのならそれをつき合わせて補正でイナフ
0459デフォルトの名無しさん
2007/05/02(水) 00:24:310460デフォルトの名無しさん
2007/05/02(水) 01:02:14このスレ的には加算を禁じる理由は何もないからいいんじゃね
0461デフォルトの名無しさん
2007/05/02(水) 01:23:14サンクス、思い出した。言語は関係ないな、こんなイメージで、ぶちこんどいた。
time_t now = time(0);
struct tm local = *localtime(&now);
time_t adjust = (local.tm_mday - remote->tm_mday) * (24 * 60 * 60);
if (adjust > issenwokoeta) {
throw new AdjustOverflowException();
}
local.tm_mday = remote->tm_mday;
local.tm_hour = remote->tm_hour;
local.tm_min = remote->tm_min;
local.tm_sec = remote->tm_sec;
return mktime(&local) + adjust;
0462444 のものです。
2007/05/02(水) 02:04:03その標準入出力を掴むプログラムを作っていたものです。
その呼ばれたプログラムのstdin,stdoutを呼び出し元プログラムで制御するまでに一立ったのですが。
仮にsshやftpを立ち上げてみると、ログインパスワード入力時の
「Password:」 の表示が標準出力じゃないみたいで、
呼び出し元プログラムを通さず、画面に出てきてしまいます。
一体何故でしょうか?
0463462訂正
2007/05/02(水) 02:04:43あるプログラムから別のプログラムを立ち上げて、
0464デフォルトの名無しさん
2007/05/02(水) 02:41:30スレ違い。
0465デフォルトの名無しさん
2007/05/02(水) 03:03:040466デフォルトの名無しさん
2007/05/02(水) 04:58:460467デフォルトの名無しさん
2007/05/02(水) 09:34:100468デフォルトの名無しさん
2007/05/02(水) 11:25:370469デフォルトの名無しさん
2007/05/03(木) 04:12:220470デフォルトの名無しさん
2007/05/03(木) 04:23:57ttp://seclan.dll.jp/c99d/c99d09.htm#dt19990621
0471デフォルトの名無しさん
2007/05/09(水) 11:36:43何かあるのでしょうか?
別に書いても動きますよね?
0472デフォルトの名無しさん
2007/05/09(水) 11:42:370473デフォルトの名無しさん
2007/05/09(水) 11:55:36規格の 6.9 External definitions で、一つの関数または変数に対する定義は
プログラム全体で一つ以下(使われなければ無くてもいい)と制限されている。
ただし inline 関数や初期化子の無い外部変数定義は例外。
ヘッダは複数のコンパイル単位に取り込まれるので、うかつに関数や変数の
定義を置くとプログラム全体としては同じ名前に対する定義を複数持ってしまう
ことになり、未定義動作となる。
現行の一般的な処理系では、この規則に反するほとんどの場合がリンク時に
「重複した定義」などのエラーとして報告される。
0474デフォルトの名無しさん
2007/05/09(水) 12:03:53なるほど、わかりました。
ありがとうございます。
0475デフォルトの名無しさん
2007/05/09(水) 13:41:50簡単な方法があれば教えて欲しいです。
いまいちポインタが分かってないもんで、よろしくお願いします。
3次元配列は、2000*2000*2000の配列です。
0476デフォルトの名無しさん
2007/05/09(水) 14:03:38配列とポインタって中でやることはほとんど同じだから、
書き換えたってたいして意味無い(動かないものが動くようになったりしない)よ?
> 3次元配列は、2000*2000*2000の配列です。
これ、一般人が買うようなPCだとオンメモリでは扱えない大きさだよ?
(わかってるならいいんだけど)
0477デフォルトの名無しさん
2007/05/09(水) 14:22:57ありがとうございます。やっぱり動作が軽くなったりはしないですよね・・・
0478デフォルトの名無しさん
2007/05/09(水) 14:28:480479デフォルトの名無しさん
2007/05/09(水) 14:47:120480デフォルトの名無しさん
2007/05/09(水) 14:50:45データのフォーマットがわかないと作れないじゃん。
0481デフォルトの名無しさん
2007/05/09(水) 14:53:310482デフォルトの名無しさん
2007/05/09(水) 14:55:280483デフォルトの名無しさん
2007/05/09(水) 15:26:411001 田中 19840908 千葉県
1002 高橋 19841203 埼玉県
1003 吉田 19840405 山形県
1004 佐藤 19841112 沖縄県
がはいっています。この2つを照らし合わせて1001のIDの田中だけ表示させたいというプログラムです。やさしいかた教えてください!お願いします!
0484デフォルトの名無しさん
2007/05/09(水) 15:35:58「1001」と「田中」の間には何があるの?
半角スペース?
他の項目の区切りも同じ?
0485デフォルトの名無しさん
2007/05/09(水) 15:41:400486デフォルトの名無しさん
2007/05/09(水) 16:00:39丸投げするような莫迦の相手をするな。
0487デフォルトの名無しさん
2007/05/09(水) 16:07:230488デフォルトの名無しさん
2007/05/09(水) 16:16:070489デフォルトの名無しさん
2007/05/09(水) 16:21:330490デフォルトの名無しさん
2007/05/09(水) 16:28:26const int BUFFER_SIZE = 100;
int main()
{
int y,m,d,days,n;
char buf[BUFFER_SIZE],c;
printf("年月日を入力してください\n");
while(true){
fgets(buf,BUFFER_SIZE,stdin);
n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,);
if(n==3){
break;
}
else if(n==-1){
continue;
}
else{
printf("error\n");
return 0;
}
}
年月日を入力して曜日を求めるプログラムの一部なんですが、
fgets(buf,BUFFER_SIZE,stdin);
n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,); の部分はどういう処理になるんでしょうか?nに整数が入るのがイマイチわかりません
0491デフォルトの名無しさん
2007/05/09(水) 16:44:15もしかして"20070509"(YYYYMMDD)とか?
0492490
2007/05/09(水) 17:05:152007 5 9みたいに入力してなぜnが3とか-1とかになるんですか?
0493デフォルトの名無しさん
2007/05/09(水) 17:10:270494デフォルトの名無しさん
2007/05/09(水) 17:22:59この%cは何を得ようとしてるの?
0495デフォルトの名無しさん
2007/05/09(水) 17:27:22ヘ ル プ 読 め。
manとかMSDNとかググるとか、ヘルプ読めない環境でプログラミングなんて無茶だから。
0496デフォルトの名無しさん
2007/05/09(水) 18:04:25#include <stdio.h>
int main(void)
{
system("grep -f fddata.dat pcdata.dat");
return 0;
}
0497490
2007/05/09(水) 18:14:30ありがとうございました
0498デフォルトの名無しさん
2007/05/09(水) 22:44:15構造体にキャストして使う方法とわざわざmemcpyで各要素ごとにコピーする方法が
等価だって言い張る人にどうやって違うんだよって説明すればいいですか?
相手は37歳のシナです。
0499デフォルトの名無しさん
2007/05/09(水) 22:56:06比較用のコードを書いて、ベンチマークの結果をみせてやるとか。
0500デフォルトの名無しさん
2007/05/09(水) 22:57:49そのシナさんはキャストでもコピーが作成されると思ってんの?
だとしたら、キャストの場合はアドレスが変わってないことを
見せてあげればいいんじゃない?
0501デフォルトの名無しさん
2007/05/09(水) 22:58:49まず >>1 を読み直せ。それでも相談を続けるなら2つの方法に
対応するコードと、双方の主張を理由をつけて挙げてくれ。
0502デフォルトの名無しさん
2007/05/09(水) 22:58:50それが、そうやって今しがたみせてやりましたが今度は
このような書き方は一般的じゃないとかいって怒り出して机をめちゃめちゃに
して帰りました。おまえの低能ぶりには呆れるとか捨て台詞を吐いて行ってしまいました。
正直な話、共有メモリの一番うまい使いかたってOpenMPとか見たいに自作のデータ構造を
そのまま共有メモリで共有できる形が理想なのにそれを言っても解かってもらえないのだろうか。
0503デフォルトの名無しさん
2007/05/09(水) 23:02:040504デフォルトの名無しさん
2007/05/09(水) 23:10:58そいつの人格か理解力の問題か
そういう人とのコミュニケーションの取り方の問題だよね
0505デフォルトの名無しさん
2007/05/09(水) 23:12:08シナさんがこんな時間まで残業付き合ってくれてたんなら少しは大目に見てやれ。
0506デフォルトの名無しさん
2007/05/10(木) 00:32:140507デフォルトの名無しさん
2007/05/10(木) 11:03:510508デフォルトの名無しさん
2007/05/10(木) 11:12:270509デフォルトの名無しさん
2007/05/10(木) 11:14:59Cじゃないとだめ?
C#とかJavaは?
0510デフォルトの名無しさん
2007/05/10(木) 11:17:50>>1 を100回音読後、首吊って詫びろ阿呆。
0511デフォルトの名無しさん
2007/05/10(木) 11:33:06上司に「できません」って言え
0512デフォルトの名無しさん
2007/05/10(木) 14:37:05仕事なのか? だったらコマンドラインで grep 使えよ。
わざわざ作れもしないCプログラムで仕事を遅らせるのはアホ。
0513デフォルトの名無しさん
2007/05/10(木) 15:00:16もしやそれは練習課題?
0514デフォルトの名無しさん
2007/05/10(木) 17:29:150515デフォルトの名無しさん
2007/05/10(木) 18:10:540516デフォルトの名無しさん
2007/05/10(木) 18:12:270517デフォルトの名無しさん
2007/05/10(木) 18:13:240518デフォルトの名無しさん
2007/05/10(木) 18:13:550519デフォルトの名無しさん
2007/05/10(木) 18:20:370520デフォルトの名無しさん
2007/05/10(木) 19:38:09相手するなら誘導してやれ。
0521デフォルトの名無しさん
2007/05/10(木) 22:03:02ですけどもういいです。もっとできる人探しておしえてもらいます。
ここにいる人達はどうせこのプログラムがかけないんでしょ?
こんなしたてに聞いているのにひどい人達ですね。みなさんわからない
時期はなかったんですか?
0522デフォルトの名無しさん
2007/05/10(木) 22:07:500523デフォルトの名無しさん
2007/05/10(木) 22:24:34こういうこと言うやつに何も教える気は無い、消えろ。
その聞き方じゃどこ行っても同じだぞ、初心者にしか相手してもらえない
0524デフォルトの名無しさん
2007/05/10(木) 22:26:540525デフォルトの名無しさん
2007/05/10(木) 22:26:590526デフォルトの名無しさん
2007/05/10(木) 22:30:260527デフォルトの名無しさん
2007/05/11(金) 01:53:210528デフォルトの名無しさん
2007/05/11(金) 16:58:230529デフォルトの名無しさん
2007/05/11(金) 17:41:560530デフォルトの名無しさん
2007/05/11(金) 21:21:44非常に高い確率でDQNだからな。相手してられん。
0531デフォルトの名無しさん
2007/05/11(金) 21:23:120532デフォルトの名無しさん
2007/05/11(金) 21:35:480533デフォルトの名無しさん
2007/05/11(金) 21:37:02感嘆符つけて質問する奴なんてお前のレス以前に見たこと無い。
0534デフォルトの名無しさん
2007/05/11(金) 21:39:36非常に高い確率でDQNだからな。相手してられん。
0535デフォルトの名無しさん
2007/05/11(金) 21:43:230536デフォルトの名無しさん
2007/05/11(金) 21:46:44非常に高い確率でDQNだからな。相手してられん。
って、スルーできてねーっつーの。
0537デフォルトの名無しさん
2007/05/14(月) 13:03:180538デフォルトの名無しさん
2007/05/14(月) 13:34:270539デフォルトの名無しさん
2007/05/14(月) 15:05:17>>538
} catch(Exception e) {
System.out.println("ガッ");
}
0540デフォルトの名無しさん
2007/05/14(月) 15:06:41C言語で書け!!
0541デフォルトの名無しさん
2007/05/14(月) 15:06:53あんまり暴れるな
「IDが一致してたら表示」でいいんだよね
FDからIDを1つ取ってくる
それをPCのファイルのIDを照らし合わせて一致したら表示
次のIDをFDから持ってきて上を繰り返す
という手順でいいんじゃない?
いまケータイだからソースは載せられんけど
0542デフォルトの名無しさん
2007/05/14(月) 16:43:12>あんまり暴れるな
君みたいに、いちいち反応する連中がいなくなってくれれば
もっと早く収束してたんだろうけどね。
0543デフォルトの名無しさん
2007/05/14(月) 16:47:370544デフォルトの名無しさん
2007/05/14(月) 17:24:35いちおう>>541はやり方書いてるけど?
0545デフォルトの名無しさん
2007/05/14(月) 18:18:25は?関係ねえよ。
>>486
0546デフォルトの名無しさん
2007/05/14(月) 18:36:300547デフォルトの名無しさん
2007/05/14(月) 21:56:34とりあえずおまいが氏ね
0548デフォルトの名無しさん
2007/05/15(火) 23:15:56http://www.cns.ci.ritsumei.ac.jp/~kitano/exp1/ex3.html
の08、09の解析をしていただけないでしょうか?
0549デフォルトの名無しさん
2007/05/15(火) 23:22:45スレ違い
0550デフォルトの名無しさん
2007/05/20(日) 06:03:520551デフォルトの名無しさん
2007/05/20(日) 06:33:12必要な部分だけマスクして取りだしゃいい。
それでも外部に記録されているものを読み書きする場合には
エンディアン依存は避けられないが
ビットフィールドよりはまし。
0552デフォルトの名無しさん
2007/05/20(日) 13:14:54どう変換するかは元データのエンディアンによる(6ビット1バイトだとすれば)
0553デフォルトの名無しさん
2007/05/20(日) 17:36:09ビットフィールドを使うのが一番楽だと思うが。
#後は野とn(ry
0554デフォルトの名無しさん
2007/05/20(日) 22:00:060555デフォルトの名無しさん
2007/05/21(月) 16:02:25mod使う方法で。
0556デフォルトの名無しさん
2007/05/21(月) 16:14:040557デフォルトの名無しさん
2007/05/21(月) 16:15:12>>555
宿題スレへ行け。そしてもう来るな。
0558デフォルトの名無しさん
2007/05/21(月) 16:18:270559デフォルトの名無しさん
2007/05/21(月) 17:27:290560デフォルトの名無しさん
2007/06/04(月) 00:15:06このような配列の使い方(foo関数の部分)をしていいのでしょうか?
malloc()した方がいいんでしょうか。
よろしくお願いします。
int main()
{
int line_count;
file_line_count(&line_count); //ファイルの行数を数える関数
foo(line_count);
}
void foo(int line_count) //foo関数
{
int array[line_count]:
^^^^^^^^^^^^^^
:
:
}
0561デフォルトの名無しさん
2007/06/04(月) 00:33:19対象とする規格による。いわゆる C99 なら標準で認められている。
C99 より前の C の規格や現行の C++ では認められていない。
0562デフォルトの名無しさん
2007/06/04(月) 00:34:16そのような可変長の配列はC99で採用された仕様だから、
一部のC89信者に蛇蠍の如く忌み嫌われる。
まぁ、C99限定でいいのなら使っていいと思うよ。
但し、スタックサイズに注意すること。
0563デフォルトの名無しさん
2007/06/04(月) 02:47:440564デフォルトの名無しさん
2007/06/04(月) 02:51:170565デフォルトの名無しさん
2007/06/04(月) 04:45:24戻り値を表示できるデバッガが無かったとか?
0566デフォルトの名無しさん
2007/06/04(月) 08:22:36本来戻り値になるであろうものもポインタの引数になるというのはよく見かける。
0567デフォルトの名無しさん
2007/06/04(月) 08:33:370568デフォルトの名無しさん
2007/06/04(月) 09:41:440569デフォルトの名無しさん
2007/06/04(月) 11:30:550570デフォルトの名無しさん
2007/06/04(月) 11:36:05たまんねーコーディング規約だな
0571デフォルトの名無しさん
2007/06/04(月) 23:25:39うんにゃ
ポインタは渡さない
後はわかるな?
0572デフォルトの名無しさん
2007/06/04(月) 23:33:040573572
2007/06/04(月) 23:33:55×よりよってグローバル変数かよ。
○よりによってグローバル変数かよ。
0574デフォルトの名無しさん
2007/06/04(月) 23:52:320575デフォルトの名無しさん
2007/06/05(火) 00:02:58○>>572-573が妙にムラッと来る
0577デフォルトの名無しさん
2007/06/05(火) 05:00:17まあ、N88-BASIC のコードを移植するプロジェクトならアリかもしれんが・・・。
0578デフォルトの名無しさん
2007/06/05(火) 13:40:27eax だってグローバル変数だー (i86系)
0579デフォルトの名無しさん
2007/06/05(火) 13:42:300580デフォルトの名無しさん
2007/06/05(火) 13:42:38いくらなんでもスレ違い。どっか他所でやってくれ。
0581デフォルトの名無しさん
2007/06/05(火) 13:53:48グローバル変数なんかとは格が違う。
0582デフォルトの名無しさん
2007/06/05(火) 14:01:55>580
0583デフォルトの名無しさん
2007/06/13(水) 23:07:43char *data = 30000;
↑これに対して↓を行うと
gcc -fsyntax-only -x c -std=c99 -pedantic -Wall -Wextra
:1: warning: initialization makes pointer from integer without a cast
と警告は出るけどエラーにはならない。あれ?と思って規格を見た。
6.7.8 Initialization p11 に
"the same type constraints and conversions as for simple assignment apply"
とあったので 6.5.16.1 Simple assignment の Constraints を見たけど、
左辺ポインタで右辺が整数というのは認められないように見える。
規格ではエラーになるべきなんじゃないの?
ちなみに C++ では思ったとおりエラーになった。
0584デフォルトの名無しさん
2007/06/13(水) 23:09:150585デフォルトの名無しさん
2007/06/22(金) 04:01:03Cでファイルサイズを取得する場合、自分は「fgetpos」を使用すのかなーと漠然と考えていて【B】のようなソースを考えていたんですが、
>>402がファイルサイズの取得方法として「ftell」を利用してるとのことだったので、【A】のようなソースも考えてみました。
やはりAのほうがよいのでしょうか。。。
========================
【A】
========================
long size = 0L;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
/* エラー処理 */
} else {
if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
/* エラー処理 */
} else {
size = ftell( fp );
if (size == -1L ) {
/* エラー処理 */
}
if ( fclose( fp ) != 0 ) {
/* エラー処理 */
}
}
}
/* sizeの値がhogehoge.jpegのファイルサイズ */
0586585
2007/06/22(金) 04:01:52========================
【B】
========================
fpos_t *pos;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
/* エラー処理 */
} else {
if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
/* エラー処理 */
} else {
if ( fgetpos( fp, &pos ) != 0 ) {
/* エラー処理 */
}
if ( fclose( fp ) != 0 ) {
/* エラー処理 */
}
}
}
/* posの値がhogehoge.jpegのファイルサイズ */
/* fpos_tってキャストできそうだからサイズの値が取れると思ったのですが。。。 */
========================
0587デフォルトの名無しさん
2007/06/22(金) 04:02:020588デフォルトの名無しさん
2007/06/22(金) 04:04:05全然本質じゃない細かいところで
> fpos_t *pos;
これは
fpos_t pos;
だよね。多分わかってはいるとは思うんだけど。
0589デフォルトの名無しさん
2007/06/22(金) 04:14:58fpos_tって環境依存だからlong long型とは限らないと聞いたことがある。
0590デフォルトの名無しさん
2007/06/22(金) 04:19:29この>>585って、もしhogehoge.jpegのファイルサイズが巨大だった場合、
どうなっちゃんですか?
0591デフォルトの名無しさん
2007/06/22(金) 05:16:26fpos_tがキャスト可能であることは保障されていないことだし。
ファイル関連は標準Cだけで書くのを諦めて、64ビット系のstat()相当の関数を使うのが無難じゃない?
0592デフォルトの名無しさん
2007/06/22(金) 06:19:36ファイルのサイズが大きい場合のことまで頭が回っていませんでした。
標準Cでは難しそうですね。
stat等の機能を持つ関数使用が無難といったところでしょうか。
一応stat使用時のソースも考えてみましたが…
struct stat fInfo;
if ( stat( "hogehoge.jpeg", fInfo ) != 0 ) {
/* エラー処理 */
} else {
/* fInfo.st_sizeにファイルサイズが入る */
}
あるいは・・・非 POSIX 標準 API インタフェースで(UX上で動作)
struct stat64 fInfo;
if ( stat64( "hogehoge.jpeg", fInfo ) != 0 ) {
/* エラー処理 */
} else {
/* fInfo.st_sizeにファイルサイズが入る */
}
0593デフォルトの名無しさん
2007/06/22(金) 07:49:47ファイルサイズ自体を知りたいのではなくて
ファイルサイズがある一定値を超えているか否かを判定したい場合も、
やはりstatなりftellなりでバイトサイズを一度取得してから
if文で判定するしかないですよね。
2GBだろうが3GBだろうが、とにかくある値を
超えてるか超えてないかだけわかればいいのですが。。。
0594デフォルトの名無しさん
2007/06/22(金) 08:16:12エラーが出るかを拾うってのはどうだろう
やっぱ2GB超えちゃうとダメなのかな
0595デフォルトの名無しさん
2007/06/22(金) 08:36:48stat64 なりで調べた方がいいと思うよ。
0596デフォルトの名無しさん
2007/06/22(金) 08:45:052G以上のサイズはのopen/fopen自体が失敗する。
Windows環境だとopenは出来るけど、seekが出来ない(シーケンシャルには読める)。
それぞれ、open64や_lseek64(bccには無い)を使う。
もちろん、_FILE_OFFSET_BITS=64なら、openだけでよい。
また、statも同様に、_FILE_OFFSET_BITS=64ならstatだけで良いが
それ以外はstat64等を使う。
0597デフォルトの名無しさん
2007/06/22(金) 09:31:140598デフォルトの名無しさん
2007/06/22(金) 09:54:27long int型になるのかな、
そうするとlong int型に格納しきれないバイト数のファイルは
桁あふれするのかな? 0? 再現させてテストしたいが
環境が手元にないのだが。。。。。。
0599デフォルトの名無しさん
2007/06/22(金) 10:00:42off_tに格納できないようなサイズのファイルは、そもそもstat自体が失敗する。
0600デフォルトの名無しさん
2007/06/22(金) 10:07:58で、結果がどうなるかは処理系(ライブラリ)依存。
何故ならstatはエミュレーションしているので、
stat("c:/*", &st)が成功してしまったりする処理系があるから。
0601デフォルトの名無しさん
2007/06/22(金) 11:44:19OS上でのサイズのことなら、
そもそも環境依存なので環境に用意されたAPIを好きなように使えばいい。
Cの入出力関数で読んだときのバイト数のことなら、
読めないようなものは無視してしまえばいい。
まあ、なんでファイルサイズを知りたいのかってとこまで
一回さかのぼって考えてみるのも一計。
0602デフォルトの名無しさん
2007/06/22(金) 22:25:44「文字数」とは違う。
0603デフォルトの名無しさん
2007/06/23(土) 08:17:340604デフォルトの名無しさん
2007/06/23(土) 08:53:01今のCP/Mとやらはどう管理しているの?
0605デフォルトの名無しさん
2007/06/23(土) 09:23:37最終セクタの0x1Aまでがファイルの「サイズ」だろ?
0606デフォルトの名無しさん
2007/06/23(土) 09:45:360607デフォルトの名無しさん
2007/06/23(土) 09:54:38「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの?
だったらそれでいいけど。
0608デフォルトの名無しさん
2007/06/23(土) 09:57:38「ファイルのサイズとはOSに管理されていなければならない」という
話の流れとは関係ないことを言いたかっただけで
「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。
0609デフォルトの名無しさん
2007/06/23(土) 10:25:400610デフォルトの名無しさん
2007/06/24(日) 03:19:11テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。
統一した「ファイルサイズを得る方法」なんてあるわけがない。
あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。
0611デフォルトの名無しさん
2007/06/24(日) 03:23:51そのあたりが理由なのかな?
0612デフォルトの名無しさん
2007/06/24(日) 04:03:56そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし
ファイル操作もストリーム処理系を除くとremove()位しかない。
0613デフォルトの名無しさん
2007/06/24(日) 04:31:090614デフォルトの名無しさん
2007/06/24(日) 04:43:310615デフォルトの名無しさん
2007/06/24(日) 22:22:42ビットシフトはなんの役に立つのでしょうか?
0616デフォルトの名無しさん
2007/06/24(日) 22:24:170617デフォルトの名無しさん
2007/06/25(月) 10:05:04128バイトのブロック単位だったからファイルの後ろにはゴミがついていた
Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・
0618デフォルトの名無しさん
2007/06/25(月) 10:55:570619デフォルトの名無しさん
2007/06/25(月) 11:58:13リソース/データフォークのサイズもファイルサイズの指定の意味で
書いたんだがわからなかったんだろう
0620デフォルトの名無しさん
2007/06/25(月) 15:09:30>書いたんだがわからなかったんだろう
これ日本語なの?
0621デフォルトの名無しさん
2007/06/25(月) 19:06:140622デフォルトの名無しさん
2007/06/25(月) 19:07:17いや、どうかと思う、だorz
0623デフォルトの名無しさん
2007/07/01(日) 14:39:59str = "\\" + str;
これで全然問題ないのですが、標準のCで
char str[MAX_PATH];
strcpy(str, ".");
starcat("\\", str);
こうするとアクセスバイオレーションが発生します
どうしたらええの?
strcpy(str, "\.");これでも駄目だった
そうそう環境はWinXPSP-2、VC6です
0624デフォルトの名無しさん
2007/07/01(日) 14:41:45starcat なる謎の関数の仕様をよーく確認しろ。
0625デフォルトの名無しさん
2007/07/01(日) 14:42:520626デフォルトの名無しさん
2007/07/01(日) 14:46:52文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが
0627デフォルトの名無しさん
2007/07/01(日) 14:48:00じゃぁ strcat の仕様をよーく確認しやがれこのバ
0628デフォルトの名無しさん
2007/07/01(日) 14:48:550629デフォルトの名無しさん
2007/07/01(日) 14:50:020630デフォルトの名無しさん
2007/07/01(日) 14:50:05そっちの方が幸せになれるよ。セキュリティ的にも。
0631デフォルトの名無しさん
2007/07/01(日) 14:56:52ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww
>>630
だからMFCなら全然無問題なのだが、Cの事も知りたいからよ
0632デフォルトの名無しさん
2007/07/01(日) 14:56:54strcatでは、後ろに追加することしか出来ないんだ。
"//"には、後ろにstrを追加する余裕なんて無い。
0633デフォルトの名無しさん
2007/07/01(日) 14:59:06ならリテラル以外で問題が再現するコードを書いてみやがれ
0634デフォルトの名無しさん
2007/07/01(日) 15:00:41C は面倒臭いよ。
バッファオーバーフローをいちいち気にしないといけないから。
0635デフォルトの名無しさん
2007/07/01(日) 15:04:06しかし、やりたいことがよく判らないからサンプルを書けない。
例えばディレクトリとファイル名を連結したいだけならこうなるのだが。
sprintf(path, "%s\\%s", dir, file)
0636デフォルトの名無しさん
2007/07/01(日) 15:08:05どうせ初期化してないのに strcat とかしたんじゃないのか?
0637デフォルトの名無しさん
2007/07/01(日) 15:12:33CString str = ".";
str = "\\" + str;
char str[MAX_PATH] = ".";
size_t size = strlen(str) + 1;
if (size >= MAX_PATH)
abort(); /*好きにしてくれ*/
memmove(str + 1, str, strlen(str) + 1);
str[0] = '\\';
WindowsならTCHAR系使えという気もするが、とりあえずcharにしておいた。
0638デフォルトの名無しさん
2007/07/01(日) 15:39:04char *str = ".", *tmp;
tmp = GC_MALLOC(strlen(str) + strlen("\\") + 1);
sprintf(tmp, "\\%s", str);
str = tmp;
でいいよ
んでも毎回strlen()とかすんのはウザいので、
typedef struct string_t { char *s; size_t len; } string_t;
とかして、string_tに対する操作を関数で一通り作るといいよ
んでもそんなアホくさい作業をするくらいならC++で素直に
std::basic_string<>使ったほうがいいよ
0639デフォルトの名無しさん
2007/07/01(日) 15:53:400640デフォルトの名無しさん
2007/07/01(日) 19:19:12strcat -> strncat
sprintf -> snprintf
0641デフォルトの名無しさん
2007/07/01(日) 20:09:50残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。
0642デフォルトの名無しさん
2007/07/01(日) 21:07:18何より楽だし。
0643デフォルトの名無しさん
2007/07/01(日) 22:28:15敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。
それができないなら C++ にしる、と。
0644デフォルトの名無しさん
2007/07/01(日) 23:19:51C99は未だ存在しないのか・・・
0645デフォルトの名無しさん
2007/07/01(日) 23:22:59使えない環境なら等価な関数に #define すればいいんじゃない?
0646デフォルトの名無しさん
2007/07/01(日) 23:26:400647デフォルトの名無しさん
2007/07/01(日) 23:33:000648デフォルトの名無しさん
2007/07/02(月) 00:13:07FILE *fp = fopen("/dev/null", "w");
size_t len = fprintf(fp, ...); /* 長さを数えてもらう */
fclose(fp);
s = malloc(len + 1);
sprintf(s, ...);
勿論こんなコードを使うぐらいならapacheあたりのコードをパクるのが良いが
それぐらいならやっぱりC++を使うべきという結論に
0649デフォルトの名無しさん
2007/07/02(月) 00:38:37必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。
C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。
0650デフォルトの名無しさん
2007/07/02(月) 00:48:37そいつらの代替実装の話だろ。
0651デフォルトの名無しさん
2007/07/02(月) 00:48:40標準とはいえC99未対応のCコンパイラは多い
0652デフォルトの名無しさん
2007/07/02(月) 01:00:520653デフォルトの名無しさん
2007/07/02(月) 01:09:55あってもC99と同じ仕様とは限らん
たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか
0654デフォルトの名無しさん
2007/07/02(月) 03:06:170655デフォルトの名無しさん
2007/07/02(月) 21:29:010656デフォルトの名無しさん
2007/07/04(水) 22:59:02ファイルの行数を取得する標準関数なんてないよね
そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数
数えるとかやってんの?
どうよ
0657デフォルトの名無しさん
2007/07/04(水) 23:03:130658デフォルトの名無しさん
2007/07/04(水) 23:34:140659デフォルトの名無しさん
2007/07/04(水) 23:50:13while(fgets(szBuff, MAX_PATH, fp) != NULL)
{
maxLine++;
}
fclose(fp);
char szItem[7][maxLine++];
じゃぁこれはどうよ、二次元配列が作りたくてこうやったら
error C2057: 定数式が必要です、MSDNとか調べてhttp://support.microsoft.com/kb/142493/ja
char szItem[7][((const int)maxLine++];
こうしてもなおんないんだよねぇこれってどうよ
0660デフォルトの名無しさん
2007/07/04(水) 23:52:13int maxLine;
罰char szItem[7][((const int)maxLine++];
丸char szItem[7][(const int)maxLine++];
0661デフォルトの名無しさん
2007/07/04(水) 23:59:580662デフォルトの名無しさん
2007/07/05(木) 00:07:53回避策はないのかと聞いてみる
0663デフォルトの名無しさん
2007/07/05(木) 00:09:15のwikiに載っていたリサージュのプログラムで
x = cos(2 * PI * a * t);
y = sin(2 * PI * b * t);
の2の値を自由に変えられる(自分で入力できる)ように
したいんですけど、どうやったらいいですか?
0664デフォルトの名無しさん
2007/07/05(木) 00:10:28malloc使えばいいんじゃない
0665デフォルトの名無しさん
2007/07/05(木) 00:12:44クワシク
0666デフォルトの名無しさん
2007/07/05(木) 00:17:10残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。
0667デフォルトの名無しさん
2007/07/05(木) 00:53:10寧ろ、C++でstd::vector使えばいいんじゃない?
0668デフォルトの名無しさん
2007/07/05(木) 01:32:500669デフォルトの名無しさん
2007/07/05(木) 16:48:510670デフォルトの名無しさん
2007/07/05(木) 16:50:550671デフォルトの名無しさん
2007/07/05(木) 16:52:170672デフォルトの名無しさん
2007/07/05(木) 23:13:16Cだけの話ではないかもしれませんが。
0673デフォルトの名無しさん
2007/07/05(木) 23:13:35俺趣味グラマでgccしか使わんからわからん。
0674デフォルトの名無しさん
2007/07/05(木) 23:16:17VC++
0675デフォルトの名無しさん
2007/07/05(木) 23:20:05桁合わせくらいには役に立つことはあるかも。
0676デフォルトの名無しさん
2007/07/05(木) 23:47:34-があるから+も装備したらしい
0677デフォルトの名無しさん
2007/07/06(金) 00:45:33#ifdef xx
# define SYM 10
#else
# define SYM
#endif
のような時に
int num = SYM +0;
というような使い方をした覚えがあるような無いような。
0678デフォルトの名無しさん
2007/07/06(金) 01:20:070679デフォルトの名無しさん
2007/07/06(金) 01:35:030680デフォルトの名無しさん
2007/07/06(金) 01:36:20単項+のオペランドになれない式もあるだろ。
0681デフォルトの名無しさん
2007/07/07(土) 03:44:31# define SYM 10
#else
# define SYM 0
#endif
では、何故ダメだったのか教えてほしい。
0682デフォルトの名無しさん
2007/07/09(月) 22:11:51○×ゲームを作るプログラムを作っていたんですが。
1〜9の数字キーでどこのマスを使うか決めるプログラムなんです。
line1[10]=" 789\n",
line2[10]=" 456\n",
line3[10]=" 123\n",
という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが
何故Tabキー使っては駄目なのか教えていただけませんか?
0683デフォルトの名無しさん
2007/07/09(月) 22:17:17書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな
0684デフォルトの名無しさん
2007/07/09(月) 22:37:32たぶん、構文的に駄目になっているのだろうとしか言えない。
後できちんと規格書に当たってみる。
とりあえず、文字列リテラルの中でタブ文字を表現したければ、
タブを直接入力する代わりに\tを使えばいいと言っておく。
0685デフォルトの名無しさん
2007/07/09(月) 22:44:18ほんとにCはかじったばっかりなんでよく分からない上に
今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`)
"と7のスペースね。
strlenって言ったら文字列の長さだよね?
Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?
0686デフォルトの名無しさん
2007/07/09(月) 22:48:07やってみたほうがよく分かる
0687デフォルトの名無しさん
2007/07/09(月) 23:05:02指導書に基づいてプログラム作ってるんだ。
基本的に書き換え不可だからそういうことはできないんだ
>>686
ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)
0688デフォルトの名無しさん
2007/07/09(月) 23:12:540689デフォルトの名無しさん
2007/07/09(月) 23:28:53ヒント:やるのは学校今は家にいる
学校のPCは勝手に使っちゃいけないんだ。
0690デフォルトの名無しさん
2007/07/09(月) 23:30:220691デフォルトの名無しさん
2007/07/09(月) 23:32:15今書き込みをしているのが自分の自由に使えるPCからなら、
開発環境をインストールすることを勧める
0692デフォルトの名無しさん
2007/07/09(月) 23:36:48今やってみたがページが真っ白のまま止まってしまう。
ダメみたいだ/(^o^)\
0693デフォルトの名無しさん
2007/07/09(月) 23:38:110694デフォルトの名無しさん
2007/07/09(月) 23:40:29Windows Vista と予想
0695デフォルトの名無しさん
2007/07/09(月) 23:49:11もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。
0696デフォルトの名無しさん
2007/07/09(月) 23:54:590697デフォルトの名無しさん
2007/07/09(月) 23:59:160698デフォルトの名無しさん
2007/07/10(火) 09:13:410699デフォルトの名無しさん
2007/07/10(火) 10:29:560700デフォルトの名無しさん
2007/07/12(木) 10:53:19Cプログラムで判定したいのだけれど、方法を教えてくれ。
0701デフォルトの名無しさん
2007/07/12(木) 11:01:37ファイルの内容を1バイトずつ全て調べて、テキストファイルに通常含まれない
コードが含まれているかどうかをチェックするしかない。
ただし fopen() でバイナリモードで開くのを忘れずに。
0702デフォルトの名無しさん
2007/07/12(木) 11:23:160703デフォルトの名無しさん
2007/07/12(木) 11:33:10それも当てにならんか・・・っつーことで、ちゃんと拡張子を付けい。
0704デフォルトの名無しさん
2007/07/12(木) 12:26:31ここをどこだと思ってるんだ
0705デフォルトの名無しさん
2007/07/12(木) 12:27:180706デフォルトの名無しさん
2007/07/12(木) 12:28:400707デフォルトの名無しさん
2007/07/12(木) 15:25:59CP/M の世界から、ようこそ!
0708デフォルトの名無しさん
2007/07/13(金) 00:46:50#if を if文とフローチャート上で区別する方法はありますか?
具体的には
#if defined(MODEL_xx)
if (zzz) {
processYYY();
}
#endif
ソフトは MODEL_xx が定義してあるやつとそうでないもの、両方納品します。
0709デフォルトの名無しさん
2007/07/13(金) 00:58:460710デフォルトの名無しさん
2007/07/13(金) 09:42:40定義してあるかどうかで動作が変わる関数のみ
複数書けばいい希ガス。
0711デフォルトの名無しさん
2007/07/13(金) 10:21:15#ifはコンパイル時に働くものだからそもそも異なる実行ファイルができるわけで
よってフローチャートもその数だけ必要になる
っていうかCの話かこれ?
0712デフォルトの名無しさん
2007/07/13(金) 16:31:31こういう略してある語の元の単語が載ってるサイトってないですかね?
探してもこの2つしかわからなくて
0713デフォルトの名無しさん
2007/07/13(金) 16:36:42語なんてそんなに多くないから何がわからないか聞けばここで全部答えてもいいぞ(一回にまとめるなら)
0714デフォルトの名無しさん
2007/07/13(金) 18:17:06stdioとhの意味
printfのprintとfの意味
scanfのscanとfの意味
int型 int
double型 double
%f f
%c c
%s s
\t t
全部でこれだけなんですがお願いできますか?stdioはstandard input outputかなとも思うんですが
0715デフォルトの名無しさん
2007/07/13(金) 18:28:06hはheader、fはformat、intはinteger(整数)、doubuleはDouble Precision(倍精度(実数))、
%f はfloat(floating point 浮動小数点)、%c はcharacter、%sはstring、\t はTAB
あとは想像通り、辞書ひいてもいいし。
まあ誰かまとめてくれるかな。
0716デフォルトの名無しさん
2007/07/13(金) 20:07:170717デフォルトの名無しさん
2007/07/13(金) 20:26:520718デフォルトの名無しさん
2007/07/13(金) 20:42:49ANSI C言語辞典にはそう書いてある。
0719デフォルトの名無しさん
2007/07/13(金) 22:22:38新ANSI C言語辞典って本にたいがい載ってるけど、それだけに買うのはもったいないしな。
0720デフォルトの名無しさん
2007/07/14(土) 00:13:43manかぐぐればいいだけの話しだしな
0721名無し
2007/07/14(土) 05:10:14ここの「ファイル入出力」ってやつ分かりません。
助けてください
0722デフォルトの名無しさん
2007/07/14(土) 05:18:33初心者スレへどうぞ。
0723デフォルトの名無しさん
2007/07/16(月) 03:14:46解くプログラムがわからないorz
a=1b=1c=1を入れるのだが
#include<stdio.h>
int main(void)
{
int a=1,b=1,c=1,d,x,y;
scanf("a=%f",&a);
scanf("b=%f",&b);
scanf("c=%f",&c);
d=b^2-4*a*c;
if(d>0)
x=(-b+sqr(d))/a;
y=(-b-sqr(d))/a;
printf("x=%d,%d\n",x,y);
elxe
printf("解なし\n");
return 0;
}
ではダメみたいなんよ
よくわからない、たすけておくれ
0724デフォルトの名無しさん
2007/07/16(月) 03:37:420725デフォルトの名無しさん
2007/07/16(月) 10:19:32これなに
0726デフォルトの名無しさん
2007/07/16(月) 10:23:46http://pc11.2ch.net/test/read.cgi/tech/1184003625/
0727デフォルトの名無しさん
2007/07/16(月) 21:36:40for(int i = 0; i < 10; i++) /* something */ ;
みたいにforの中で変数宣言できますけど、
while( int i = f() ) /* something */ ;
みたいなことはできないんですね。不便。
0728デフォルトの名無しさん
2007/07/16(月) 22:26:34C99だとできないんだっけ?
その書き方ができるとどこが便利なのかわからないけど
0729デフォルトの名無しさん
2007/07/16(月) 22:27:050730デフォルトの名無しさん
2007/07/16(月) 22:28:33おほほほ
0731727
2007/07/16(月) 22:49:06// something
}
みたいなことしません?
0732デフォルトの名無しさん
2007/07/16(月) 22:55:17while( obj = nextObj() ) {
// something
}
でいいじゃんとか思ったら負け?
0733デフォルトの名無しさん
2007/07/16(月) 23:03:09for文の第一節はループ開始前に一回だけ実行される。
だから for(int i=0; … は、ループ開始前に変数iを確保して0に初期化し、
ブロック(forループ)を抜けたら破棄することを意味する。
対してwhile文の条件節は、処理がループするごとに実行される。
もしここに while(int i= … と書いたとしたら、
それは処理の先頭にくるたびにiを宣言するという意味になるが、
まだその時点ではブロックを抜けていないから、
前に宣言したiは有効で、これは文法上エラーとなる。
もし while(static int= … と宣言してうまくいくとしても、
それはおそらく何の利益もない。
0734デフォルトの名無しさん
2007/07/16(月) 23:04:35とでも書いとけ
0735デフォルトの名無しさん
2007/07/16(月) 23:08:040736734
2007/07/16(月) 23:10:44わかって
おねがい
0737デフォルトの名無しさん
2007/07/16(月) 23:15:49int obj;
while( obj = nextObj() ) {
// something
}
}
みたいにブロックで囲めばいいじゃん。
0738デフォルトの名無しさん
2007/07/16(月) 23:25:36for (int obj; obj = nextObj(); ) {
// something;
}
でおk
0739デフォルトの名無しさん
2007/07/17(火) 08:18:310740デフォルトの名無しさん
2007/07/17(火) 10:40:12>それは処理の先頭にくるたびにiを宣言するという意味になるが
ブロック先頭での宣言と同様に扱えばいいわけですが
規格ではそうはしなかった、ってだけの話では?
0741デフォルトの名無しさん
2007/07/17(火) 15:04:07そもそもそんな話じゃない。
規格では while に書いたステートメントは値を返さないといけないが、
int i = ... のような変数の宣言は値を返さないので書けないだけの事。
0742デフォルトの名無しさん
2007/07/17(火) 15:10:43> while に書いたステートメント
> 変数の宣言は値を返さない
現行の規格の話するんなら正確にな。
文法的に while の条件に文は書けない。
式だけ。そして文には値とかないから。
0743デフォルトの名無しさん
2007/07/17(火) 16:31:460744デフォルトの名無しさん
2007/07/17(火) 17:23:120745デフォルトの名無しさん
2007/07/17(火) 17:32:030746デフォルトの名無しさん
2007/07/17(火) 17:35:08ガリでも食ってろ
0747デフォルトの名無しさん
2007/07/17(火) 18:50:31どういう経緯があったかは知らないが、結果として制定されたC99では、
できるようになっていないけど。
以下チラシの裏
これは、こういうコード
Tok* ct;
if (ct = gettok()) { /* ... */ }
に対して、条件式のところで変数を宣言できれば、未初期化の変数を減らせ、
ついでに条件文内に変数の有効範囲を閉じ込められるというアイデアだった。
if (Tok* ct = gettok())
{
// ctはスコープ内
}
// ctはスコープ外
参考『C++の設計と進化』 3.11.5.2 条件文の中の宣言
C++では、C以上に初期化と代入が区別されるので、
>>737-738のような書き換えができないこともある。
それもあって、俺はたまに使うし、C++からは無くなれと思わない。
0748デフォルトの名無しさん
2007/07/17(火) 19:06:31どこか誤りありますか?
#include<stdio.h>
void main()
{
int a, b,c;
printf("a = ");
scanf("%d",&a);
printf("b = ");
scanf("%d",&b);
printf("c = ");
scanf("%d",&c);
if( a == b == c ){
printf("%d\n",a);
}else if( a >= b >= c ){
printf("%d\n",a);
}else if( a >= c >= b ){
printf("%d\n",a);
}else if( b >= a >= c ){
printf("%d\n",b);
}else if( b >= c >= a ){
printf("%d\n",b);
}else if( c >= a >= b ){
printf("%d\n",c);
}else if( c >= b >= a ){
printf("%d\n",c);
}
}
0749デフォルトの名無しさん
2007/07/17(火) 19:14:43「何をやろうとしているのか、また何が正しいのかは
コードから読みやがれ」ってか。大した奴だ。
…とか思ってたら、ひと目で変な記述が。
>if( a == b == c ){
>if( a >= b >= c ){
:(略)
そんな書き方できない。
面倒でも
if (a == b && b == c) {
if (a >= b && b >= c) {
:(略)
と書かないと。
0750デフォルトの名無しさん
2007/07/17(火) 19:16:46スマソ。そしてありがとう。
そうやったら、できました。
0751c言語初心者
2007/07/17(火) 19:38:16よろしくお願いします。
0752デフォルトの名無しさん
2007/07/17(火) 19:40:080753c言語初心者
2007/07/17(火) 19:43:220754デフォルトの名無しさん
2007/07/17(火) 19:45:11http://pc11.2ch.net/test/read.cgi/tech/1184003625/
0755c言語初心者
2007/07/17(火) 19:50:540756デフォルトの名無しさん
2007/07/17(火) 19:53:03>>751
> 学校の問題
C/C++の宿題を片付けます 93代目
http://pc11.2ch.net/test/read.cgi/tech/1184506311/
0757デフォルトの名無しさん
2007/07/17(火) 19:55:22気に入られなければスルーされる
0758デフォルトの名無しさん
2007/07/18(水) 05:49:19スレタイ: 【初心者歓迎】C/C++室 Ver.40【環境依存OK】
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
age 推奨ですが、自己判断で。
◆ 前スレ: 【初心者歓迎】C/C++室 Ver.39【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1182740506/
◆ アップローダー (質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0759デフォルトの名無しさん
2007/07/18(水) 11:05:17何故このスレで……
0760デフォルトの名無しさん
2007/07/18(水) 13:58:470761デフォルトの名無しさん
2007/07/19(木) 01:02:10何かお勧めの参考書教えてください
0762デフォルトの名無しさん
2007/07/19(木) 01:05:400763デフォルトの名無しさん
2007/07/19(木) 01:10:140764デフォルトの名無しさん
2007/07/19(木) 01:13:030765デフォルトの名無しさん
2007/07/19(木) 01:41:380766デフォルトの名無しさん
2007/07/19(木) 10:10:47>読んでほぼ理解できたんだけど
本当なら大したもんだけど、
>cの
も少しケースセンシティブになろうね。
0767デフォルトの名無しさん
2007/07/19(木) 21:12:030768デフォルトの名無しさん
2007/07/20(金) 01:15:22まぁ、ポインタは理解したんだろう。
面倒なのはポインタよりも、ポインタの絡んだ型宣言の方だから。
0769デフォルトの名無しさん
2007/07/20(金) 01:38:290770デフォルトの名無しさん
2007/07/20(金) 11:12:340771デフォルトの名無しさん
2007/07/20(金) 13:33:33何をtypedefしてんだ?と思った時期もありました。
0772デフォルトの名無しさん
2007/07/20(金) 16:53:230773デフォルトの名無しさん
2007/07/20(金) 17:03:500774デフォルトの名無しさん
2007/07/20(金) 17:16:19それ何をtypedefしてるの?
初めて見た
0775デフォルトの名無しさん
2007/07/20(金) 17:29:32intの引数が1つで値を返さない関数を func にtypedef
例えば、、、
void foo(int);
func f = foo;
とか
0776デフォルトの名無しさん
2007/07/20(金) 17:38:57自分に使う機会が来るかはわからんけど覚えておこう
thx
0777デフォルトの名無しさん
2007/07/20(金) 18:12:25ビットシフトはなんの役に立つのでしょうか?
0778デフォルトの名無しさん
2007/07/20(金) 18:13:29typedef void (T::*FP2)(FP1);
typedef void (*FP3)(FP2);
const FP3* foo(const int p[][10]);
0779デフォルトの名無しさん
2007/07/20(金) 20:18:26ビットフラグのクリアとか?
0780デフォルトの名無しさん
2007/07/20(金) 20:45:24ビットの配列を作るときに使う
0781デフォルトの名無しさん
2007/07/20(金) 20:45:550782デフォルトの名無しさん
2007/07/20(金) 21:50:27ビットシフトはなんの役に立つのでしょうか?
でぐぐれ
0783デフォルトの名無しさん
2007/07/20(金) 21:56:190784デフォルトの名無しさん
2007/07/20(金) 22:20:58コレ見るの、3回目か4回目くらいなんだけど、ギャグかなんかなの?
0785デフォルトの名無しさん
2007/07/20(金) 23:02:060786デフォルトの名無しさん
2007/07/20(金) 23:14:02あるいは風物詩
あるいは新参の受ける洗礼
0787デフォルトの名無しさん
2007/07/21(土) 00:56:47ローテートをサポートしない CPU も多いんじゃね?
知らんけど。
0788デフォルトの名無しさん
2007/07/21(土) 01:07:00少ないなw
0789デフォルトの名無しさん
2007/07/21(土) 02:04:140790デフォルトの名無しさん
2007/07/21(土) 02:09:290791デフォルトの名無しさん
2007/07/21(土) 02:19:040792デフォルトの名無しさん
2007/07/21(土) 02:25:360793デフォルトの名無しさん
2007/07/21(土) 02:39:22・規格を読んで正しい挙動を把握する
・実際に処理系で実験してみる
・結果が規格と異なった場合パッチを書いてしかるべき所に送りつける(オプション)
0794デフォルトの名無しさん
2007/07/21(土) 03:25:22なる人と仕事組んだら俺泣きそうw
0795デフォルトの名無しさん
2007/07/21(土) 04:28:590796デフォルトの名無しさん
2007/07/21(土) 04:41:50=「演算子 順位」とかでぐぐれ
>・実際に処理系で実験してみる
=つか、やってみりゃ分かるだろ。
0797デフォルトの名無しさん
2007/07/21(土) 04:45:12実験して結果を見て予想するのは、大きな違いがある。
0798デフォルトの名無しさん
2007/07/21(土) 05:26:51実験して結果を見て法則を導くスタイルが無いと。
0799デフォルトの名無しさん
2007/07/21(土) 05:30:110800デフォルトの名無しさん
2007/07/21(土) 05:48:500801デフォルトの名無しさん
2007/07/21(土) 10:00:560802デフォルトの名無しさん
2007/07/21(土) 10:02:370803デフォルトの名無しさん
2007/07/21(土) 10:11:190804デフォルトの名無しさん
2007/07/21(土) 10:36:58フラグメンテーションエラーで、メモリーもぶっ壊せ!
そして泣きながら規格読んで実感だ!
0805デフォルトの名無しさん
2007/07/21(土) 11:26:38>そして泣きながら規格読んで実感だ!
お疲れ様です。
0806デフォルトの名無しさん
2007/07/21(土) 11:51:310807デフォルトの名無しさん
2007/07/21(土) 12:27:130808デフォルトの名無しさん
2007/07/21(土) 13:02:060809デフォルトの名無しさん
2007/07/21(土) 14:42:57まぁ、&a->bくらいなら、どっちでもいいけど。
0810デフォルトの名無しさん
2007/07/21(土) 16:25:12皆 a.b と書くと思うんだわ。
0811デフォルトの名無しさん
2007/07/22(日) 00:30:440812デフォルトの名無しさん
2007/07/22(日) 00:31:410813デフォルトの名無しさん
2007/07/22(日) 10:05:190814デフォルトの名無しさん
2007/07/24(火) 03:59:190815デフォルトの名無しさん
2007/07/24(火) 09:46:040816デフォルトの名無しさん
2007/07/24(火) 10:10:450817デフォルトの名無しさん
2007/08/01(水) 00:15:00C言語で STL に似たことをしたいと思ったらどうすれば良いですか?
0818デフォルトの名無しさん
2007/08/01(水) 00:16:190819デフォルトの名無しさん
2007/08/01(水) 00:17:240820デフォルトの名無しさん
2007/08/01(水) 00:20:580821デフォルトの名無しさん
2007/08/01(水) 02:11:510822デフォルトの名無しさん
2007/08/01(水) 21:08:58こんなんあった。かなりSTLに近いんじゃないか?
マクロを使ってるからデバッグがむずかしそうだが
>http://sourceforge.jp/projects/cstl
>CSTLは、C言語で使えるC++のSTLライクなコンテナライブラリです。
>vector, deque, list, set, multiset, map, multimap, stringを提供します。
0823デフォルトの名無しさん
2007/08/02(木) 10:16:24で作成したtを
fclose(t);
してもいいですか?
なんか危なくて、こわいです。
0824デフォルトの名無しさん
2007/08/02(木) 10:24:04まあ、またその内容を使うことがあるなら閉じちゃだめだが。
0825デフォルトの名無しさん
2007/08/02(木) 10:44:31fclose(t)ってやってよかったの?
0826デフォルトの名無しさん
2007/08/02(木) 10:56:000827デフォルトの名無しさん
2007/08/02(木) 11:09:090828デフォルトの名無しさん
2007/08/02(木) 11:52:56自動的に削除されるファイルを生成し、そのストリームへのポインタを返す。
何も問題はない。
0829デフォルトの名無しさん
2007/08/03(金) 06:35:210830デフォルトの名無しさん
2007/08/03(金) 07:59:090831デフォルトの名無しさん
2007/08/03(金) 08:38:000832デフォルトの名無しさん
2007/08/03(金) 09:21:230833デフォルトの名無しさん
2007/08/03(金) 11:09:16固いんじゃなく、弱いんだろう。
0834デフォルトの名無しさん
2007/08/03(金) 23:43:24面白そうなものがあるんですね
GPLじゃないところもイイ!
ただ、著作表示だけはしないといけないようですね
0835デフォルトの名無しさん
2007/08/04(土) 00:29:40BSDライセンスらしいから緩いでしょ
0836デフォルトの名無しさん
2007/08/04(土) 00:34:520837デフォルトの名無しさん
2007/08/05(日) 18:02:02#ifndef MAIN_H
#define MAIN_H
int X
#endif
////
////(main.cpp)
#include "main.h"
#include "move.cpp"
main(){
move();
}
////
////(move.cpp)
#include "main.h"
move(){
(Xを操作する処理)
}
////
ゲームプログラミングを勉強中で、大筋で感じな状況になってます。
これをコンパイルすることも実行することもできるのですが
BCCでコンパイルすると、「パブリックモジュール_Xが、main.objとmove.objの
両方で定義されている」と警告されます。
これはどういうことで何が悪いのでしょうか?
グローバル関数を使いながら、ファイルを分割してみたいのですがどうしたらいいのでしょうか?
0838デフォルトの名無しさん
2007/08/05(日) 18:03:42////(main.cpp)
#include "main.h"
#include "move.cpp"←いらなくね?
0839デフォルトの名無しさん
2007/08/05(日) 18:06:54~
0840837
2007/08/05(日) 18:15:40それを消したら、未定義の関数moveを呼び出したなどとエラーだ出ます。
>>839
掲示板に書き込む時に簡略化したら忘れてしまいました。
0841デフォルトの名無しさん
2007/08/05(日) 18:21:04宣言と定義の区別をしっかりと。ヘッダには変数や関数の宣言だけ置くこと。
0842デフォルトの名無しさん
2007/08/05(日) 18:23:310843デフォルトの名無しさん
2007/08/05(日) 20:04:20#ifndef MAIN_H
#define MAIN_H
extern int X;
#endif
////
////(main.cpp)
#include "main.h"
#include "move.h"
int main(){
move();
}
////
////(move.h)
#ifndef MOVE_H
#define MOVE_H
int move();
#endif
////
////(move.cpp)
#include "main.h"
int move(){
(Xを操作する処理)
}
////
0844デフォルトの名無しさん
2007/08/05(日) 20:05:03////(main.cpp)
#include "main.h"
#include "move.h"
int X;
int main(){
move();
}
////
0845わ ◆V92eIRyEPU
2007/08/14(火) 14:48:110846拿 ◆J/ZoJAt3T2
2007/08/14(火) 14:50:070847デフォルトの名無しさん
2007/08/15(水) 23:58:55俺なら、
extern int X; はmove.h側に入れて、int X; は move.cpp に入れて、
main.hは消すかな。細かいことですんませんね。
>>837
安心しなさい。あなたの方が、うちの元請けより優秀です!
ちゃんと #ifndef使うあたりが。
0848名無しさん@お腹いっぱい
2007/08/19(日) 03:09:14と円の面積を表示するプログラムがどうしてもできません。
どうすればよいのでしょうか?
0849デフォルトの名無しさん
2007/08/19(日) 03:47:300850デフォルトの名無しさん
2007/08/19(日) 04:10:290851デフォルトの名無しさん
2007/08/19(日) 10:50:59・scanfで&忘れ、%dを指定している
・式中にint型とかを使っている
・まともに調べてない、読んでない
・円周の長さ、円の面積が分からない
0852デフォルトの名無しさん
2007/08/19(日) 10:57:200853デフォルトの名無しさん
2007/08/19(日) 12:33:210854デフォルトの名無しさん
2007/08/19(日) 12:39:380855デフォルトの名無しさん
2007/08/19(日) 18:23:29double pi = 3.14159265358979323846
double r = 1.0;
double s = pi * r * r;
double d = 2 * pi * r;
printf("s=%f,d=%f\n",s,d);
0856デフォルトの名無しさん
2007/08/19(日) 20:58:270857デフォルトの名無しさん
2007/08/19(日) 21:16:49double pi = atan(1) * 4;
0858名無しさん@お腹いっぱい
2007/08/20(月) 02:27:48ありがとうございます。あと家でc言語使えるようにしようと思って
microsoft.net Framework version 2.0 再頒布可能パッケージ
microsoft.net Framework version 2.0 SDK 日本語版
をダウンロードしたのですが友達の話によると
microsoft.net Framework version 2.0 日本語版 language pack
が必要らしいのですがmicrosoftの公式サイトに行っても見つからないのですが
どうやったら手に入るのでしょうか?
すごい初歩的な質問ですいません。
0859デフォルトの名無しさん
2007/08/20(月) 05:52:55初歩的以前にスレ違いなんだが自覚あるか?
0860デフォルトの名無しさん
2007/08/20(月) 09:16:000861デフォルトの名無しさん
2007/08/20(月) 09:20:12M_PIは標準ではない。
0862デフォルトの名無しさん
2007/08/20(月) 09:45:410863デフォルトの名無しさん
2007/08/20(月) 10:10:120864デフォルトの名無しさん
2007/08/20(月) 10:18:590865デフォルトの名無しさん
2007/08/20(月) 10:28:000866デフォルトの名無しさん
2007/08/20(月) 13:43:090867デフォルトの名無しさん
2007/08/24(金) 14:00:16どのように記述すれば良いですか
struct Initset getinfo(struct Initset *syoki2)
↑のような記述はできないですか?
0868デフォルトの名無しさん
2007/08/24(金) 14:07:520870名無しさん@お腹いっぱい
2007/08/24(金) 16:41:08int main(void)
{
int a = 1;
int n = 500;
int f = n / a;
while(a < n) {
a += 1;
}
printf("%d\n",f);
return 0;
}
上のものは自分がわからないながらも作ったものです。
でもできませんでした。
改善点お願いします。
0871デフォルトの名無しさん
2007/08/24(金) 16:52:01if (n % a == 0) {
printf("%d\n", a);
}
とか入れてみ
まあ約数なら 1/2 以上はありえないから省くとかするけどな。
入力とかはとりあえずscanfかなんかで。
0872デフォルトの名無しさん
2007/08/24(金) 16:57:44まず処理の流れ自体がわかってないだろう
もう一回教科書を読み直せ
0873デフォルトの名無しさん
2007/08/24(金) 23:19:39int main(void)
{
int a = 1;
int n = 500;
int f = n / a;
while(a < n) {
a += 1;
}
printf("%d\n",f);
return 0;
}
上のものは自分がわからないながらも作ったものです。
でもできませんでした。
改善点お願いします。
0874デフォルトの名無しさん
2007/08/24(金) 23:30:37正の約数を全て列挙する方法すら分かってないように思える。
プログラム以前の問題。
0875デフォルトの名無しさん
2007/08/25(土) 00:30:500876名無しさん@お腹いっぱい
2007/08/25(土) 00:41:32それが成立するやつを表示するプログラムでよいのですか?
0877デフォルトの名無しさん
2007/08/25(土) 01:09:540878デフォルトの名無しさん
2007/08/25(土) 01:12:07「全て割る条件式」とは何のことなのか
本当にわかってるか?
0879名無しさん@お腹いっぱい
2007/08/25(土) 01:18:28して割り切れる、割り切れないのif文を作ればよいのかと思ったのですがそれではだめですか?
0880デフォルトの名無しさん
2007/08/25(土) 01:22:00そこまではいい
問題は「割り切れる」の意味がわかってるかどうかだ
0881デフォルトの名無しさん
2007/08/25(土) 01:22:31↓
自然数nを割り切れる正の整数を列挙する
↓
自然数nを割り切れる可能性のある正の整数すべてについて、
その数で本当に割り切れるかどうかを調べ、
割り切れるときはその数を画面に表示する
一応言っとくが「割り切れる」とは除算して余りが出ないことだからな
0882デフォルトの名無しさん
2007/08/25(土) 01:24:000883名無しさん@お腹いっぱい
2007/08/25(土) 01:26:01自分なりにつくったのは
/* kuku.c */
int main(void)
{
int a, b;
int n = 9;
for(a = 1; a <= n; a = a + 1 ){
for(b = 1; b<=n; b = b + 1 ){
printf("%d\n",a*b);
}
printf("\n");
}
return 0;
} なのですが表になりません。おとといから始めたばかりなのでちんぷんかんぷんです。
いろいろとすいませんがご指導をお願いします。
0884デフォルトの名無しさん
2007/08/25(土) 01:28:22一 個 ず つ や れ
0885デフォルトの名無しさん
2007/08/25(土) 01:32:20初心者スレ逝け
0886デフォルトの名無しさん
2007/08/25(土) 01:35:55printf("%d\n",a*b); → printf("%3d",a*b);
がんばれ!
0887デフォルトの名無しさん
2007/08/25(土) 01:37:43処理の流れ、つまり「まずこれが起きて、次にこれが起きて……」という順番をたどりながら考えろ。
漠然と書いて走らせて出来なかったーわかんないーじゃいつまでも理解できん。
そしてここは基本的に「ある程度Cがわかってる人」が「標準C」というものについて少しつっこんだ質問をする場所だから
まずは初心者スレへ行くことをお勧めする。
0888名無しさん@お腹いっぱい
2007/08/25(土) 01:45:23ありがとうございます。できました。
0889デフォルトの名無しさん
2007/08/25(土) 11:17:580890デフォルトの名無しさん
2007/08/25(土) 12:49:26ありえないなんて事はありえませんもん
0891デフォルトの名無しさん
2007/08/25(土) 13:24:42if(!n%a){
if(n/a < a)break;
printf("%d\n",a);
if(n/a != a)printf("%d\n",n/a)
}
0892デフォルトの名無しさん
2007/08/26(日) 01:28:440893デフォルトの名無しさん
2007/09/03(月) 18:47:21とか
int a,b,c,d,e,f;
みたいに並べて書いた変数を一気に同じ値で初期化する書き方ってありますか?
あったら教えてください。
0894デフォルトの名無しさん
2007/09/03(月) 18:55:120895デフォルトの名無しさん
2007/09/03(月) 18:57:51宣言と合わせて一行でかけませんか。
0896デフォルトの名無しさん
2007/09/03(月) 18:58:05static int a,b,c,d,e,f;
これで全部0で初期化される。
struct foo {
int a,b,c,d,e,f;
} foo = {0};
これでも全部0で初期化されるな。
まぁ、横着するなってことだ。
0897デフォルトの名無しさん
2007/09/03(月) 18:59:100898デフォルトの名無しさん
2007/09/03(月) 19:25:37ワロタ
0899デフォルトの名無しさん
2007/09/03(月) 19:29:010900デフォルトの名無しさん
2007/09/03(月) 19:59:10そんなので笑えるなんて君の人生楽しそうでうらやましいわ
0901デフォルトの名無しさん
2007/09/03(月) 20:07:29同じ値で初期化するような変数なら同じような扱いをするんだろう
配列で宣言しろ
0902デフォルトの名無しさん
2007/09/06(木) 16:40:24ビットシフトでも入れてみますか?
0903デフォルトの名無しさん
2007/09/06(木) 16:52:28わざわざ増やさんでいいw
0904デフォルトの名無しさん
2007/09/06(木) 17:00:560905デフォルトの名無しさん
2007/09/06(木) 17:24:08MMXの様に、4Byteの整数型を1Byte単位で飽和演算する方法を
昔どこかで見た気がするんだけど、どうやるんだっけ
0xFEFEFEFE に 各バイトに3を加算
↓
0xFFFFFFFF
画像処理に使おうと思ったけど思い出せない
0906デフォルトの名無しさん
2007/09/06(木) 21:51:570907905
2007/09/06(木) 21:56:42http://www.emit.jp/prog/prog_b.html
しかし原理がよくわかんね
0908デフォルトの名無しさん
2007/09/06(木) 21:58:04命令ってないですか?
0909デフォルトの名無しさん
2007/09/06(木) 22:00:49こんなイメージ?
if (...) {
...;
if (...) ifBreak;
...;
}
これくらいしか手がない気が。
if (...) {
...;
if (...) goto endIf;
...;
}
endIf:
0910デフォルトの名無しさん
2007/09/06(木) 22:01:580911デフォルトの名無しさん
2007/09/06(木) 22:15:29サンクス
0912デフォルトの名無しさん
2007/09/06(木) 22:38:47if(...)
{
}
else if(...)
{
....
break;
}
} while(0)
とか
0913デフォルトの名無しさん
2007/09/06(木) 23:43:12if(...){
do{
...
if(...) break;
...
}while(0);
}
0914デフォルトの名無しさん
2007/09/07(金) 00:12:330915デフォルトの名無しさん
2007/09/07(金) 00:51:35そもそも、ロジックを整理すべきじゃないかとは思うが。
0916デフォルトの名無しさん
2007/09/07(金) 00:54:57...
if(!...){
...
}
}
でいいんじゃないの?
0917デフォルトの名無しさん
2007/09/07(金) 01:11:34scanf("%d",&i);
while( i<1 || i>9999 )
{
printf("もう一度入力してください");
scanf("%d",&i);
}
iに数字じゃなく、aaaaなどの文字列を入れると”もう一度入力〜”がえんえんループ表示されてしまいます。
これを防ぐにはどうしたらいいのでしょうか?
0918デフォルトの名無しさん
2007/09/07(金) 01:14:43http://ja.wikipedia.org/wiki/Scanf#.E7.95.B0.E5.B8.B8.E3.81.AA.E5.85.A5.E5.8A.9B.E3.81.8C.E8.A1.8C.E3.82.8F.E3.82.8C.E3.81.9F.E6.99.82.E3.81.AE.E5.87.A6.E7.90.86
0919917
2007/09/07(金) 01:23:41ありがとうございます!
0920デフォルトの名無しさん
2007/09/07(金) 01:26:09その方法もどうかと思うな。
scanf()は行単位の処理じゃないのに、バッファクリアだけ行単位になってしまう。
0921デフォルトの名無しさん
2007/09/07(金) 01:34:260922デフォルトの名無しさん
2007/09/07(金) 10:37:17char ** ppsz;
} st;
void freeif(st* pst) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 2; j++) {
if(*pst->ppsz != NULL) {
free((void*)pst[i].ppsz[j]);
}
}
}
for(int i = 0; i < 3; i++) {
if(pst->ppsz != NULL) {
free((void*)pst[i].ppsz);
}
}
if(pst != NULL) {
free(pst);
}
return;
}
0923デフォルトの名無しさん
2007/09/07(金) 10:38:36int main(void) {
st* pst;
// make struct object
pst = (st*)malloc(3);
if(pst == NULL) {
printf("st is null\n");
}
else {
for(int i = 0; i < 3; i++) {
// make struct member
pst[i].ppsz = (char**)malloc(2);
for(int j = 0; j < 2; j++) {
// make member area
pst[i].ppsz[j] = (char*)malloc(10);
}
}
// free memory
freeif(pst);
}
return 0;
}
0924デフォルトの名無しさん
2007/09/07(金) 10:40:37(正誤)
if(pst->ppsz != NULL) { ← ×
if(pst[i].ppsz != NULL) { ← ○
0925デフォルトの名無しさん
2007/09/07(金) 11:03:01typedef struct _st {
char ** ppsz;
} st;
static const char STRINGS[3][2][11] = {
{ "idx1:data1", "idx1:data2", },
{ "idx2:data1", "idx2:data2", },
{ "idx3:data1", "idx3:data2", },
};
void freeif(st* pst) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 2; j++) {
if(pst[i].ppsz[j] != NULL) {
printf("pst[%d].ppsz[%d]:FREE\n", i, j);
free((void*)pst[i].ppsz[j]);
}
}
}
for(int i = 0; i < 3; i++) {
if(pst[i].ppsz != NULL) {
printf("pst[%d].ppsz:FREE\n", i);
free((void*)pst[i].ppsz);
}
}
if(pst != NULL) {
printf("pst:FREE\n");
free(pst);
}
return;
}
0926デフォルトの名無しさん
2007/09/07(金) 11:03:55int main(void) {
st* pst;
// make struct object
pst = (st*)malloc(3 * sizeof(st));
if(pst == NULL) {
printf("st is null\n");
}
else {
for(int i = 0; i < 3; i++) {
// make struct member
pst[i].ppsz = (char**)malloc(2 * sizeof(char*));
for(int j = 0; j < 2; j++) {
// make member area
pst[i].ppsz[j] = (char*)malloc(11 * sizeof(char));
lstrcpy(pst[i].ppsz[j], STRINGS[i][j]);
}
}
// debug
printf("---------------------\n");
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 2; j++) {
printf("pst[%d].ppsz[%d] >> %s\n", i, j, pst[i].ppsz[j]);
}
}
printf("---------------------\n");
// free memory
freeif(pst);
}
_getch();
return 0;
}
0927デフォルトの名無しさん
2007/09/07(金) 11:31:28固定サイズなら無理にmalloc()/free()を使う必要はないと思うぞ。
typedef struct _st {
char ppsz[2][10];
} st;
でいいやん。
0928デフォルトの名無しさん
2007/09/07(金) 11:36:050929デフォルトの名無しさん
2007/09/11(火) 22:08:230930デフォルトの名無しさん
2007/09/11(火) 22:38:18印刷できないPDFでよければJISCのサイトで閲覧できる
0931デフォルトの名無しさん
2007/09/11(火) 23:14:17現在有効のX3010:2003はC99相当だけど。
0932デフォルトの名無しさん
2007/09/11(火) 23:19:57ふつーはそれでも問題ないんだよ。非互換な改訂しなければ。
JIS漢字とかJIS漢字とかJIS漢字とか、あとJIS漢字とか
0933デフォルトの名無しさん
2007/09/12(水) 00:31:370934デフォルトの名無しさん
2007/09/12(水) 00:53:090935デフォルトの名無しさん
2007/09/12(水) 01:01:560936デフォルトの名無しさん
2007/09/12(水) 01:15:460937デフォルトの名無しさん
2007/09/12(水) 02:38:120938デフォルトの名無しさん
2007/09/12(水) 03:48:23問題:再帰関数を使って、Xのn乗を求めるプログラムを作成しなさい
プロトタイプ宣言:int Power(int x,int n);
実行画面
文字列入力==>2
文字列入力==>0
値:1
文字列入力==>2
文字列入力==>3
値:8
文字列入力==>6
文字列入力==>4
値:1296
この問題だけどうしても判らなくて困っています^^;
何方かわかる方がいましたら教えてください
0939デフォルトの名無しさん
2007/09/12(水) 04:00:01int Power(int x,int n)
{
int i;
int sum = 1;
if(n == 0)
return 1;
else{
for(i = n; i > 0; i--)
sum *= x;
}
return sum;
}
0940デフォルトの名無しさん
2007/09/12(水) 04:04:510941939
2007/09/12(水) 04:06:400942939
2007/09/12(水) 04:16:22int Power(int x,int n)
{
if(n == 0)
return 1;
else
return x*Power(x,n-1);
}
0943デフォルトの名無しさん
2007/09/12(水) 04:21:11{
if(x == 0 && n == 0) exit(1);
if(n < 0) return 0;
if(n == 0) return 1;
return Power(x, n - 1) * x;
}
0944デフォルトの名無しさん
2007/09/12(水) 06:51:52{
if (n < 0) return 0;
if (n == 0) return v;
return power(x, n - 1, x * v);
}
int Power(int x, int n) {return power(x, n, 1);}
これで末尾再帰で最適化が利いてループになるはず。
0945デフォルトの名無しさん
2007/09/13(木) 09:13:16fgets()使用時に桁溢れを完全に抑止することは可能ですか?
char *buf[10];
unsigned int value;
while(1)
{
fgets(buf, 10, stdin);
〜isdigit()とかで数値のみかを判定して、atoi()でvalueに格納してbreak〜
}
fprintf(stdout, "%u\n", value);
こんな感じで書いてるんですが、わざと入力を10桁以上にしたときに入力バッファに残ってしまってうまくいきません。
何かイイ方法あるでしょうか?(fflush(stdin)は無しで)
0947デフォルトの名無しさん
2007/09/13(木) 09:19:36fgets の後で
fscanf(stdin,"%*[0-9]");
0948デフォルトの名無しさん
2007/09/13(木) 11:18:05通常の入力をした場合(桁数が少ない場合)に入力待ちにならない?
0949デフォルトの名無しさん
2007/09/13(木) 11:22:42とはいえ、fflush(stdin)は未定義
面倒くさいけど、fgetsで読み込んだbufに'\n'が有るかチェックして、
'\n'が無いなら'\n'が出てくるまで読み捨てることになる
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[10];
char *p;
int c;
while (fgets(buf, sizeof buf, stdin) != NULL) {
if ((p = strchr(buf, '\n')) != NULL) {
*p = '\0';
}
else {
while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
}
puts(buf);
}
return 0;
}
0950デフォルトの名無しさん
2007/09/13(木) 12:33:40int get_unsigned(unsigned *v)
{
char buf[16];
char *p;
int c;
if (fgets(buf, sizeof buf, stdin) == NULL)
return EOF;
if (strchr(buf, '\n') == NULL)
while ((c = fgetc(stdin)) != '\n' && c != EOF) {}
*v = strtoul(buf, &p, 10);
return *p;
}
int main(void)
{
unsigned val;
int end;
while (printf(">>"), (end = get_unsigned(&val)) != EOF) {
if (end == '\0' || isdigit(end)) printf("W:入力が切り捨てられました.\n");
else if (end != '\n') printf("W:不正文字がありました. '%c'\n", end);
if (val < 1 || 10000 < val) printf("W:入力範囲外です.\n");
printf("<<%u\n", val);
}
return 0;
}
0952デフォルトの名無しさん
2007/09/13(木) 14:16:480953デフォルトの名無しさん
2007/09/13(木) 14:20:57それだと、次の文字が\nだと[^\n]にマッチしないので、その時点でひっかかり
読み捨てることが出来ない。
scanf("%*[^\n]"); scanf("%*c");
ならおk
0954デフォルトの名無しさん
2007/09/15(土) 02:24:20俺には凄過ぎっすよ。
0955デフォルトの名無しさん
2007/09/15(土) 02:26:090956デフォルトの名無しさん
2007/09/15(土) 09:32:530957デフォルトの名無しさん
2007/09/17(月) 15:28:45はれってほれってひれんら〜
0958デフォルトの名無しさん
2007/09/17(月) 18:37:190959デフォルトの名無しさん
2007/09/18(火) 17:05:01sizeof(short) <= sizeof(int) は処理系に関係なく成り立ちますか?
0960デフォルトの名無しさん
2007/09/18(火) 17:07:560961デフォルトの名無しさん
2007/09/18(火) 18:26:29素直に本買ったほうがいいでしょうか?
0962デフォルトの名無しさん
2007/09/18(火) 18:35:590964デフォルトの名無しさん
2007/09/18(火) 20:47:240965デフォルトの名無しさん
2007/09/19(水) 15:50:54どうやるか教えていただけませんか?
0966デフォルトの名無しさん
2007/09/19(水) 16:06:490967デフォルトの名無しさん
2007/09/19(水) 17:28:22それをメモリに展開するってゆーのをやってまして
0968デフォルトの名無しさん
2007/09/19(水) 17:30:390969デフォルトの名無しさん
2007/09/19(水) 17:32:23格納する構造体はどんなものかによるとしか言えん
0970デフォルトの名無しさん
2007/09/19(水) 17:34:000971デフォルトの名無しさん
2007/09/19(水) 17:34:183.4
バイト
実行環境の基本文字集合の任意の要素を保持するために十分な大きさを持つデータ記憶域の単位。
1 バイト中のビット数は,処理系定義とする。
5.2.4.2.1
CHAR_BIT
ビットフィールドでない最小オブジェクト(バイト)におけるビット数
6.3.3.4
sizeof演算子の結果は,そのオペランドの(バイト数での)大きさとする。
sizeof(char) == 1
となっているのですが,ここから char 型オブジェクトのデータ記憶域での大きさは
1 バイトで 1 バイトは CHAR_BIT ビットと判断できるでしょうか?
0972デフォルトの名無しさん
2007/09/19(水) 17:36:24int型が、その処理系で一番速く処理できるビット幅、というのは聞いたことありますが・・・
0973967
2007/09/19(水) 17:58:00問題としてはファイルにある社員IDと氏名を構造体に格納し、
メモリに展開するというものです
0974デフォルトの名無しさん
2007/09/19(水) 18:06:040975デフォルトの名無しさん
2007/09/19(水) 18:47:35そう思って構わないはず。
>>973
常に8ビットを表す単位が必要なら、オクテットを使う。
0976967
2007/09/19(水) 19:03:57そもそも文字の長さってなんですか?
0977デフォルトの名無しさん
2007/09/19(水) 19:09:43【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。
【初心者歓迎】C/C++室 Ver.42【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1188748806/
C/C++の宿題を片付けます 95代目
http://pc11.2ch.net/test/read.cgi/tech/1187944110/
0978デフォルトの名無しさん
2007/09/19(水) 19:15:34↓
GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は
何か気になるから変えてくれたら嬉しい
0979デフォルトの名無しさん
2007/09/19(水) 19:58:51お前前も来たな
帰れ
いや
死ね
0980デフォルトの名無しさん
2007/09/19(水) 19:59:210981デフォルトの名無しさん
2007/09/19(水) 20:22:18という式が表す値は
(char *)型のポインタcが指しているデータ
(char *)型のデータ
のどっちなんでしょうか?
0982デフォルトの名無しさん
2007/09/19(水) 20:37:540983デフォルトの名無しさん
2007/09/19(水) 20:47:49その式を見るとカッコ(キャスト)よりも*演算子のほうが優先されている
みたいなんですが、(1+2)*(3*3)のようなカッコとキャストとしてのカッコは
別物として扱われているんでしょうか?
0984デフォルトの名無しさん
2007/09/19(水) 20:52:450985デフォルトの名無しさん
2007/09/19(水) 20:56:270986デフォルトの名無しさん
2007/09/19(水) 21:04:19全部一緒くたにして考えてました。orz
最後にもう一つ、
char c = 'a';
char *pc = &c
printf("%d\n", (int)*pc);
予想では上のコードは4バイト分の整数を出力すると思ったのに、
実際にやってみたらa一つ分の97しか出力しませんでした。
これは何故なんでしょうか?
0987デフォルトの名無しさん
2007/09/19(水) 21:06:350988デフォルトの名無しさん
2007/09/19(水) 21:07:450989デフォルトの名無しさん
2007/09/19(水) 21:09:33何が言いたいか分からん。
97は2桁だろ。何が出て欲しいんだか。
0990デフォルトの名無しさん
2007/09/19(水) 21:11:57charだろうがintだろうが10進数で出力したら97だろ
0991デフォルトの名無しさん
2007/09/19(水) 21:13:08>4バイト分の整数
この部分を具体例をあげつつ詳細に説明してくれ
0992デフォルトの名無しさん
2007/09/19(水) 21:15:21char *pc = &c;
printf("%d\n", sizeof((int)*pc));
4バイト(intの大きさ)分の整数が出力されているってのはあってるぞ
0993デフォルトの名無しさん
2007/09/19(水) 21:16:26これでどうだ。
printf("%.8X\n", (unsigned int)(unsigned char)*pc);
ここにunsigned intへのキャスト演算子は不要だがサービスしておいた。
0994デフォルトの名無しさん
2007/09/19(水) 22:21:24PADって構造化フローチャートみたいなやつ?
0995デフォルトの名無しさん
2007/09/19(水) 22:24:57大学でやった記憶が
0996デフォルトの名無しさん
2007/09/20(木) 02:05:030997デフォルトの名無しさん
2007/09/20(木) 02:12:12ANSI C89
ISO C90
ISO C95(と言っていいのか)
ISO C99
0998デフォルトの名無しさん
2007/09/20(木) 08:33:04まぁキモいだけで、だからどうしようってほどじゃないけど。
0999デフォルトの名無しさん
2007/09/20(木) 09:18:441000デフォルトの名無しさん
2007/09/20(木) 09:20:0410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。