【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
1 :
デフォルトの名無しさん :
2007/02/01(木) 23:08:46
2げと
いちもつ
5 :
デフォルトの名無しさん :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); } これどこがまちがってるのかすごくわからないです おねがいしますおしえてくださいです。
printf("&c → printf("%d printf("%c → printf("%d
クマーーーーー!!
8 :
デフォルトの名無しさん :2007/02/02(金) 01:40:23
>>6 レスありがとうございます。
やってみたのですが・・・
うまくいきません・・・ごめんなさい
10回まわっていくはずなのに6回だけになってしまい
1
数値:&c数値&c数値&2
・
・
という感じになってしまいます
。・゚゚・(>_<;)・゚゚・。
誤:for(i = 0; i <= 10; i++){ 正:for(i = 0; i < 10; i++){
誤:printf("数値:&c",kei[i]); 正:printf("数値:%c",kei[i]);
数値→int型 文字→char型
12 :
デフォルトの名無しさん :2007/02/02(金) 03:01:29
>>11 うっどうしてもできないです・・・
ごめんなさいごめんなさい(*ノ-;*)エーン
13 :
デフォルトの名無しさん :2007/02/02(金) 03:02:35
#include <stdio.h> /*手操作入力で数値を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); } というふうにかえてみたのですが
ASCIIな環境なら kei[i] = getchar(); を kei[i] = getchar() - 0x30; にするとか で、 printfの中の %c は全部 %d に替えろ
数値を読み込むならscanf関数を使う手もある。
16 :
デフォルトの名無しさん :2007/02/02(金) 03:13:16
>>15 ですよね・・・
わたしもscanfならgetcharよりわかるのですが
こんかいはgetcharでということなんですよね・・・
;;;;(;・・)ゞウーン・・・むずかしぃですね
17 :
デフォルトの名無しさん :2007/02/02(金) 03:16:08
>>14 ASCII環境かどうかは正直よくわからないですが
表示される数値が1を入力すると49とでるので
ASCIIコードで表示されているのかな?とおもってたりします
0x30なんて絶対書くなよ。 必ず'0'にしろ。
19 :
デフォルトの名無しさん :2007/02/02(金) 04:08:41
>>18 立った一問に私何十時間かかってるんだろう・・・なみだでてきた
でもまけない
そうなんですか・・・わかりました・・・ありがとうです
>>19 getcharは1文字ずつ読み込む関数。
入力で打ったキーは全部1文字ずつ読み込む。
for(i=0; i<10; i++){
…
kei[i] = getchar();
…
}
だと、10文字読み込んで終わりだぞ。
21 :
デフォルトの名無しさん :2007/02/02(金) 07:32:49
>>20 キーボードの上に手を置いたままねてた・・・(o;TωT)o" ビクッ!
キーボード入力で整数10個となってるから
10文字でいいとおもっているんですが・・・どうなんでしょう?
そのさいgetchar()をしようするという指定なんです・・・涙
本などみたのですがscanf()関数の詳しいことを書いてる本はおおい
のですがgetchar関数はあまりくわしくかかれてないので
飲み込みがわかりません・・・・
printf()関数で入力した文字を出力なのか・・.
などと
混乱しています。
~(=^‥^A アセアセ・・・
getchar() の代わりにこれ。多分出題者の意図するところはこういう事じゃないすか。 int 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; }
23 :
デフォルトの名無しさん :2007/02/02(金) 07:56:17
>>22 すみません・・・
ちょっとわからないです・・・
でも、帰ってくるまでには調べておこうと思います。
ありがとうございますです(o*。_。)oペコッ
24 :
デフォルトの名無しさん :2007/02/02(金) 10:37:28
>>23 文字定数を整数型に変換しないと計算できなくない?
ここまで誰も「宿題スレ逝け」と言わないことに驚愕
#include <ctype.h> /* 文字の種類を判別するためのライブラリ */ #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すること */ }
書いてから気付いたが、これは整数ではなく自然数しか想定していない 負の数にまで対応する気ならもっとややこしくなるが、 上のが理解できないようならどっちみち無理だ
28 :
デフォルトの名無しさん :2007/02/02(金) 13:58:51
なんでめんどくさいことするの? 全部文字で読み込んでから数字に変換して計算すればいいじゃん^^;;
>28 どうせ1文字1文字読み取るという動作は同じだからたいして変わらんし 文字列に読み込む場合はバッファがあふれないようにする手間が それを理解する手間こみで必要だから
どう考えても初級練習問題のレベルじゃないんだよなぁ… 「数字を10個連続で入力させてその合計を求めろ」って問題じゃないのかぁ?
>>31 >>22 だと何も数字打たずにEnter叩いた場合0が返るぞ
それでいいってんならいいけどさ
数字が出るまで読み飛ばしてるからそれはないと思う
35 :
デフォルトの名無しさん :2007/02/02(金) 22:31:15
最高にわろた
int n = 0; printf("%d %d", n++, n++); って未定義なの?
実引数の評価される順が処理系定義なだけだと思うのだが。
>>36 2つの副作用完了点(シーケンスポイント)の間で同じ値を2回変更しているので、
未定義動作になります。
sprintfを使ったときstdio.hをインクルードし忘れていて、スタックを壊し サブルーチンからリターンするアドレスが0x00000000になって、おかしくした俺がきましたよ。 ・・・不思議と1ステップずつデバッガで操作したら吹っ飛ばなかったのだが。
>>39 それなら
printf("%d %d", n+=1, n+=2);
みたいなのも未定義?
int f(int *n){return (*n)++;} ・・・ printf("%d %d\n", f(&n), f(&n)); は、未定義じゃないよね? 結果は処理系依存だけど。
いいえ。
>>43 うん。 return 文の完了にシーケンスポイントがあるので大丈夫。
顔文字 (o*。_。)oペコッ ~(=^‥^A アセアセ・・・ とか使う馬鹿に おまいらよく真面目に答えられるな どう考えてもここはスルーするべき所じゃないのか?
47 :
デフォルトの名無しさん :2007/02/03(土) 23:30:48
みなさんありがとうございます。 いちおう理解して自分のなかで消化できました・・・ いろいろな助言ありがとうございました。 いいわけなんですが、学校では今までscanf()を使ってたり 簡単な関数で表現をしてきたので いざ自分が社会人になって頑張っていこうと思うと・・・ 自分が使えない人間である とひしひしとわかってきました。 エンジニアという職業は常に勉強ですから 考えることがおおいですが すこしずつ・・・皆さんに近づけるよう がんばりたいとおもいます。 本当にありがとうございました!!!
~(=^‥^A アセアセ
スルーしてるじゃんw
ちっともスルーできてないし、おまけにぶり返している
スルーは規格外らしい。
54 :
デフォルトの名無しさん :2007/02/05(月) 22:02:11
value=value*10+c-'0'; /* valueに値を取り込む(この計算式の意味についてはよく考えること) */ わかんね
'0'から'9'が連続していることは保証されていますか?
保証されています
規格のどのあたりに書いてるか分かりますか?
保証されていません
規格のそのあたりに書かれています
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ │ │ │ おしえてあげないよ。 ジャン! │ │ │ \_________________________/ V V V _,∩_ _,∩_ _,∩_ (_____)ゝ、 (_____) y (_____) / :: :: :: ヽ 〉 /-‐:: ::‐-ヽ / / :: :: :: ヽ _./ (・ )ll(・ ) ∨ _/ 0) i! 0) ∨ _/ ( ・)i!(・ ) ゙、_ // :: :: ∈ゝ :: ::ヽ // :: ‐-‐ :: ヽ // :: ー一 :: ヽ\ . ゝ/:: :: :: :: :: ::ヽ ゝ/ :: :: :: :: :: ヽ ゝ/ :: :: :: :: :: ヽく  ̄ ̄ | ̄ ̄ | ̄ ̄  ̄ ̄ | ̄ ̄ | ̄ ̄  ̄ ̄ | ̄ ̄ | ̄ ̄ | | | | | | ⊂! !つ ⊂! !つ ⊂! !つ
62 :
デフォルトの名無しさん :2007/02/05(月) 22:31:23
分かりません~(=^‥^A アセアセ
>>61 Cでは常にASCIIコードが使われると保証されていると?
>>63 CではASCIIでなければならないという規定はないが、
基本文字集合で、'0'から'9'がこの順で並んでいなければならないという規定はある。
>>55-63 JIS X3010:2003では5.2.1。ISO/IEC 9899:1999でも同じ位置にあると思う。
ねーよw
JIS X 3010:2003 抜粋 5.2.1 文字集合 ・・・ ソース基本文字集合及び実行基本文字集合は,少なくとも次に揚げる要素をもっていなければならない。 ・・・ ― 10個の10進数字(digit) 0 1 2 3 4 5 6 7 8 9 ・・・ ソース基本文字集合及び実行基本文字集合の双方において,10進数字に関する上の並びにおいて, 0の右側に並んでいる各文字の値は,一つ左側にある文字の値に比べ1だけ大きくなければならない。 ・・・
保証されています。
>>67 該当箇所を見て確かに保証されていることは理解出来たのですが、
アルファベットはどうなのですか?書き方が微妙で判断がつきにくいんですが
さっさと教エロや(゜Д゜#)
>>69 保証されていません
10進数字以外の文字は一般的に数値との関連性は薄いためでしょう
16進用の文字は大文字小文字の都合で一本化はできませんし
ほかに保証されているのは、ヌル文字が全ビットゼロであることだけです
>71 良く分かりました 詳しい説明どうもありがとう
全然わかりません~(=^‥^A アセアセ
分からない奴には必要ない事
ちょっとは文字コード体系見るぐらいしろやおまえら
すみません~(=^‥^A アセアセ
俺に謝れ
#defineMOV_SEGTBL_USER(str){\ a->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" を貼付けましたが正常なプリプロセッサトークンとなりません
ごめん、途中で書き込んじゃった。
>>78 の続き
というコンパイルエラーが出てコンパイルできない。
どうしたらいい?
お帰りください(o*。_。)oペコッ
>>78 正常なプリプロセッサトークンとするために "." と "test" を貼り付けなければいいんだろ。
>>81 じゃこういうマクロの使い方は出来ないってこと?
トークン連結演算子はトークンとトークンを連結するんであって トークンと演算子との間に書いたらおかしくなるのはあたりまえ
じゃ代替案なにかありませんか?
##をはずして代わりにカッコでくくれ
あ、まちがった くくるな
88 :
デフォルトの名無しさん :2007/02/06(火) 14:14:55
ちょっと文字列比較のベンチマーク取ってみたら char 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の方法で書くべき?
暑いですね~(=^‥^A アセアセ
90 :
88 :2007/02/06(火) 14:25:34
ゴメン、手元にstrcmpのソースあったわww
お前は全部マシン語で組んでればいいよ
>>88 たぶん2に最適化かけたら文自体が消えるぞ
ミシン語って何ですか?(o*。_。)oペコッ
94 :
デフォルトの名無しさん :2007/02/06(火) 15:54:04
質問です! Ⅽ初心者で、今MFCを使用しない前提でプログラムを組んでいます。 そこでMessageBox関数というのを見つけたのですが、 これはMFCとは無関係なのでしょうか?
無関係なので使ってかまいません
96 :
デフォルトの名無しさん :2007/02/06(火) 16:00:36
>>93 わかってると思うけどパソコン自体がI抵抗、コンデンサ
、コイル、ダイオード、トランジスタ等々(意味的には同じ
ととらえて良い部分がありますが)でできた回路です。
で、CPU(たぶんメモリも)5V〜0V(正確には0Vに近い小さな電圧)
のいんか電圧から、電流が流れています。
この5Vで流れる電流を1とし0Vで流れる電流を0としてCPUの中で
の要はダイオードの組み合わせみたいなもので出来た回路で・・・
説明めんどくせ!
要はマシン語ってのは1と0の羅列。それの事となる。
けど、そんなもん全部理解するには頭の中にパソコンの回路構成
が入ってて、なおかつそれを・・・
説明めんどくせ!
まぁ、アセンブラで書けってことじゃないの?
わかりません~(=^‥^A アセアセ
98 :
デフォルトの名無しさん :2007/02/06(火) 16:03:44
>>94 大いに結構!!
他にもいっぱいwin32apiの関数あるから使っていこう。
そして全部覚えよう。そして覚えれたなら、君を神様と呼ばしていただこう
99 :
94 :2007/02/06(火) 16:11:00
やさしい方ばかりで涙がでそうです;; ありがとう
わろた~(=^‥^A アセアセ
101 :
デフォルトの名無しさん :2007/02/06(火) 18:56:34
>>93 マシン語はアセンブラ言語とほぼ同じとみて差し支えない
ちょっとスレタイから離れすぎですよ、藻前等。
;;;;(;・・)ゞウーン・・・むずかしぃですね
>>103 初心者向けのスレで揉まれて来ることをお勧めします。
遠慮します(o*。_。)oペコッ
106 :
デフォルトの名無しさん :2007/02/07(水) 11:41:37
[1] 授業単元:数値計算法 [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);}} ここからどういじるのでしょうか?
宿題は宿題スレ逝け
分からないんですね~(=^‥^A アセアセ
分かる分からない以前の問題だな
分かる分からない以前の問題なんですねw~(=^‥^A アセアセ
分かる分からない以前の問題だと分かってないのはお前だぜ
/ \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ | |r┬-| | 分かる分からない以前の問題だと分かってないのはお前だぜ \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // だっておwwwwwwwwwwwww~(=^‥^A アセアセ | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / バ | | l||l 从人 l||l l||l 从人 l||l バ ン ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
次の患者さんどうぞ
16歳独身 最近、朝起きるとき、非常に気持ち良い快感で目覚めると パンツがカピカピになってます。 何か尿道あたりに細菌が混入し、病気になっているのでしょうか。 心配で夜もねむれません。まぁ寝れますが。 これはどういった症状なのでしょう。 追伸: 最近SEXという言葉をしりましたが、意味はまだ理解してません。
/ \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ | |r┬-| | 分かる分からない以前の問題だと分かってないのはお前だぜだっておwwwwwwwwwwwww~(=^‥^A アセアセ \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // だっておwwwwwwwwwwwww | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / バ | | l||l 从人 l||l l||l 从人 l||l バ ン ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
ははは・・・~(=^‥^A アセアセ
次の患者さんどうぞ
クラミジアにかかってしまいました 痒いです
剃毛した後に消毒用エタノールで綺麗にした後 この抗生剤を飲み、下着を適度に履き替え局部を清潔に保つようにしてください 一週間ほどで良いでしょう
122 :
デフォルトの名無しさん :2007/02/11(日) 23:46:18
ここ数年、仕事でC言語使って開発しています。 動くものは作れるのですが、 設計?構造でいつも悩んでいます。(状態遷移とか。。) 1つのイベントと複数のトリガを管理する定石とか、 状態遷移を管理するときの定石とか まとまった書籍/HPないでしょうか? デザインパターンのように拡張性を考慮した設計が知りたいです。
正直、スレ違い。
int a[42] = {}, b[42] = {0} 配列を0で初期化するのにこの二通りを目にするんだけど、 規格上はどちらも等価ですか?
規格上は、{}の中には一つ以上の初期値を書かなければならないことになっている
なるほど。ありがとうございます
>125 便乗だけど、その理由が何なのか知りたいのだが。
>>127 つ【規格でそう決まっているから】
まあマジレスすると、配列(構造体とかもだが)の宣言時の{}は、
複合文のくくりである{}とは違うもので、「初期化子となる式のリスト」を意味する。
(もちろん、中のカンマもカンマ区切りであってカンマ演算子ではない)
つまり、「=」が暗示するように、そこには何らかの式が少なくとも1つなければいけない。
ということ。構文上の問題だから、a[42]={}; でもOKなコンパイラもあるだろうけどね。
= {} だったら、何も代入しないのか、空を代入するのか、よく分かんないんだよな。
char str[SIZE] = ""; は全部ヌル文字になる?それとも char str[SIZE] = {'\0'}; と書かなきゃダメ?
>>130 前者後者ともローカル変数であるならば、関数突入時に毎回毎回、0のコピーか代入が発生する。
恐らく前者は、SIZEbyte分""のためのスペースが確保されることになる。
まぁ、全部ナル文字になることを当てにするロジックは推奨できないが。
memset
>>130 どっちも同じ。
char配列の文字列リテラルでの初期化は、
下のように1つずつ文字定数を指定したかのように扱われる。
C++のstring.substr()のようなことがやりたいのですが、Cで文字列を抜き出す関数は何ですか?
>>134 無いと思っていい。強いて言えば memcpy() ?
ないんですか。道理で検索しても出てこなかったんですね。 memcpyから自作してみます。ありがとうございました。
っていうかいつからsubstrはC++の標準になった?
最初にISOで規格化されたときから クラステンプレートstd::basic_stringの非静的メンバ関数になっている。
>137 (゚д゚)
>>134 memcpy()なんぞ使わずに、こんな関数でも用意しろ。
char * substr(char * buf, const char * str, int pos, int n)
{
sprintf(buf, "%.*s", n, str + pos);
return buf;
}
>>140 関数用意するのはいいとして、こんな処理に sprintf() は高すぎる。
ここは memcpy() の出番だろ。
| | 人| | | | (_ .| | | | strncpy → .(・∀|_| |_|ω・`) ←strncat (⊃ |糞| |質|と ) |∧.| ̄| | ̄|u'
strncpyはともかく、strncatをカスと言うな
質問です 4バイト(32bit)で1が立っているかどうかを、1ビットずつ判定していきたいのですが、 for( i=0 ; i<32 ; i++ ) { if( (unsigned long)abc & (1<<i) == 1<<i ) { } } こんな感じでいいでしょうか? 全然違うぞとかアドバイスありましたらよろしくお願いします。
間違ってはないけど if (abc & (1<<i)) { } で十分じゃね
>>145 キャスト要らない。
1 だと int なので、符号ビットなど移植性を考えると 14 回までしか左シフトできない。
マスクした結果は 0 と比較したほうが効率がいいし、ソースが簡単にできる。
ってことで
if( (abc & (1UL<<i)) != 0 )
または
if(abc & (1UL<<i))
あたりがお勧め。
あれ << って算術シフトだっけ? 1 << i だったら最上位ビットは動かないのか
>>148 この場合は負の数が関係なので符号ビットとか言ったのは混乱の元だった。
ごめん。
どの環境でも保証されている INT_MAX の最小値は 32767 なので、
16384 になる 1 << 14 までしか移植性のある動作は保証されない。
それ以上シフトすると未定義動作になる。
1UL だと型が unsigned long になり、 ULONG_MAX の最小値の定義は
4294967295 なので 2147483648 になる 1UL << 31 まで大丈夫。
150 :
145 :2007/02/18(日) 00:27:04
みなさんありがとうございます 言われてifの使い方調べて勉強になりました。 if(a) a≠0:真 a=0:偽 なので !=0や==0を省略できるのですね あとULですが、どの環境でも使えるものなのでしょうか?
>>150 整数リテラルのサフィックス UL は標準。どこでも使える。
あと>149が言い忘れてるけど、移植性考えるならabcもintではなくunsigned longで定義すること
abc のコピーを順次右シフトして 1 と and を取れば 1 の型を気にする必要なんかないのにな
154 :
145 :2007/02/18(日) 06:11:09
多くのアドバイスありがとうございます。 int i ; unsigned long abc ; if( (abc & (1UL<<i)) != 0 ) または unsigned long saveabc ; saveabc = abc ; if( ((saveabc>>i) & 1) != 0 ) こんな感じでどうでしょうか?
155 :
145 :2007/02/18(日) 06:18:55
下のsaveabcは意味ないですね・・・コピーを順次右シフトどうやるんでしょう
>>=1
saveabc=abc; for (i+......) { if (saveabc & 1) { ... } /* 最下位ビットのみチェック */ /* チェック対象自身を右シフトしてしまえー */ saveabc >>= 1; /* saveabc = saveabc >> 1; */ } 順次右シフトは、上記を示唆してるんだと思うよ
158 :
145 :2007/02/18(日) 13:16:34
なるほど、どうもありがとうございました
159 :
145 :2007/02/18(日) 13:30:49
すみません今思いついたのですが、 int i ; unsigned long abc ; for( i=0 ; i<32 ; i++ ){ if( (abc>>i & 1) !=0 ){...} } これだとabcはunsigned longだし右に31シフトもできますでしょうか?
・ abc>>i & 1 ・ abc & 1<<i ・ copyabc & 1 ... copyabc>>=1 ・ mask=1 ... abc & mask ... mask<<=1 abcの値がその後必要ないなら ・ abc & 1 ... abc>>=1 も使える
162 :
145 :2007/02/18(日) 15:46:30
大変勉強になりましたm(__)m ありがとうございました
free()でメモリ領域を解放する時、何故解放するメモリ領域へのポインタだけで解放できるんでしょうか? 解放するメモリ領域のサイズも必要な気がするのですが。
>>163 その情報をポインタだけで引き出せるように管理しているから。
malloc/freeの実装の一例はK&Rに載ってる。
もちろんこれは一例で他にも実装方法はある。
回答ありがとうございます。 malloc()したときに割り当てた領域へのポインタとサイズを一緒に記録しておいて free()するときに引数として渡されたポインタを元に割り当てた領域のサイズを計算して解放するというような感じですかね? K&R持ってないので買って読んでみます。
>>165 そういう実装もあると思う。
K&Rのやり方は、
・mallocするときに管理用ヘッダ+要求されたサイズのメモリを確保
・mallocは管理用ヘッダのサイズ分アドレスを進めたポインタを返す
・freeは渡されてきたポインタから管理用ヘッダのサイズだけ戻して管理情報を得る
・各メモリ領域はリンクポインタで辿れるようになっている
という感じの実装だった(はず。今手元に本がない)。
>>166 空き領域の線形リストで、渡されたポインタで挟まれる部分を探す方式でなかったっけ?
K&R 探すか
>>167 うーん、そうだったかもしれない。ごめん。
>>168 いやいや。 俺も記憶だけで書いてるから…
>>165 とまあ、なんとかしてポインタから領域情報をひねりだしてるですよ
ちょっとK&R引っ張ってくる
171 :
デフォルトの名無しさん :2007/02/24(土) 17:08:02
標準化される前(つまりC89以前)の文字列リテラルの型はなんでしょうか? 現行規格では static char[] 型 です。
staticはautoなんかと同じ記憶クラス指定子だから、変数を修飾していて、型を修飾してるわけじゃないよ
まあでも静的記憶期間だと言いたいことはわかる
標準化される前は処理系依存なんだからその質問は無意味な気がするが
sizeof("ab") == sizeof("cde") が真ならchar*で、偽ならchar[]なんじゃね? *"" = '\0'; でソレっぽいコンパイルエラーが出るならconstなんじゃね?
176 :
171 :2007/02/24(土) 17:34:48
標準化される前だから
>>174 の言う通りですね、、、
ところで、文字列リテラルの型がなんであるのかを知りたい理由が聞きたいんだが
179 :
171 :2007/02/25(日) 20:06:13
>>178 sizeof("1234567890") は char[11] のサイズか char* のサイズかを知る為
現行規格では char[11] のサイズ 11 になる
標準化前については、処理系依存で納得です。
180 :
171 :2007/02/25(日) 20:09:09
>>179 補足
標準化される前は 文字列リテラルの型は char* だと某所で見た。
>>179 いやそうじゃなくて、文字列リテラルの型を知って
それを何に応用出来るの?って話だと思うぞ。
豆知識?
182 :
171 :2007/02/25(日) 20:20:32
>181 だから 標準化前の sizeof("1234567890") の値を知る為。 その為に文字列リテラルの型が必要 でも処理系依存で納得した。
>>182 無限ループになりそうだからもうやめとく。
184 :
171 :2007/02/25(日) 20:24:12
>>183 >>178 には「知りたい理由」 とありますが?
「何に応用出来るか?」とは書いてません。
くだらね
変なのにからまれて、171 の中の人も大変だな。
187 :
178 :2007/02/25(日) 22:20:33
わかったわかった言い直すよ どうして sizeof("1234567890") の値を知りたいのか教えてくれ
>>182 逆ではないのか?
文字列リテラルの型を間接的に測る手段としてsizeofを使うんだろうが。
189 :
デフォルトの名無しさん :2007/02/25(日) 23:13:57
ファイル操作に関して質問です。 GB単位のファイルを処理しているんですが ファイルの一部を上書きする標準関数てあるのでしょうか? あと指定した位置から後ろ全てを削除するような関数も探してます。
fseekして書き込めばいいんじゃないかな
ググればサンプルも見付かるよ。
192 :
189 :2007/02/25(日) 23:27:21
fseek して fwrite ということですね! ありがとうございます。 ファイルの後半を削るというのはやっぱり無理なんでしょうか?
Cの標準ライブラリではそういうことするのはないな。 Windows限定だったらSetEndOfFileなんてものもあるけど。
UNIXならtruncateか。
195 :
189 :2007/02/25(日) 23:41:21
ありがとうございます。 fseek で調べたら上書きができるということはわかりました。 ただ挿入というようなことはできないと考えてよいのかな? 後半削除はないのですね。 ということは実現するには必要な部分だけファイルコピーということですね。 Windows 限定のコードではないので残念です。 差分とメタデータ使って実現するしかなさそうだな・・・。
0バイトをwriteするとそこから先が削れる場合もあるけど 処理系依存(そもそもwrite自体が処理系依存だが)
stdioでできることは、 ファイルを作ること ファイルをリネームすること ファイルの任意の位置から読むこと ファイルの任意の位置に書くこと だけで、ファイルのサイズやレコードのオフセットを変更することはできない。 というかそれらはファイルの中身ではなく、ファイルの管理方法に関わることなので、 必然的に処理系のファイルシステムに依存する。 ありとあらゆる環境で動作することを保証したいなら、 それはファイルをまるごと読んで必要な構成で別ファイルに書き出し 元ファイルを消してから元の名前にリネームするしかない。 ある程度ターゲットの環境が決まっていて、それぞれに有効な環境依存の技があるなら、 それぞれの環境のためのコードを書いて、プリプロセッサで処理系に適合させるのが有効。
そういうファイル処理するプロセスを環境ごとに作り、主プログラムからはそれを呼び出すというのも一つの手。
199 :
171 :2007/02/26(月) 19:52:50
200 :
デフォルトの名無しさん :2007/02/28(水) 15:50:13
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
>>201 C++相談室の「STLを使うと」から始まるコピペみたいに
テンプレ化せんとダメなんかなぁ?
ANSI Cの仕様について質問です。 mainはANSI Cではint main(void)またはint main(int argc, char *argv[]) と決まってるけど K&Rではmain()となっていて戻り値intと引数voidを省略していますよね? これもANSI準拠と言えるんでしょうか?
JIS X 3010では 関数定義: 宣言指定子列opt 宣言子 宣言並びopt 複合文 宣言子: ポインタopt 直接宣言子 直接宣言子: 識別子 ( 宣言子 ) 直接宣言子 [ 定数式opt ] 直接宣言子 ( 仮引数型並び ) 直接宣言子 ( 識別子並び ) だからmain()は許されてるように読めるけど。どこかで明示的に禁止されてたっけ?
識別子並びの後ろにoptが抜けてた。
>>203 だと関数定義なのか関数宣言なのか曖昧だな
Cの場合は省略時はintじゃなかったっけ C++は確かダメだったような
許されてはいるけど、 コンパイラによっては警告が出るから鬱陶しい。
210 :
デフォルトの名無しさん :2007/03/10(土) 02:33:54
よくqsortに渡す関数ポインタを int cmp(int* a,int* b) { return *a-*b; } と書いてるサイトを見かけるんですが、これは qsortのプロトタイプの int(*func)(const void* a, const void* b)) と関数ポインタの互換性が無いと思うんですが、これはアリなんですか?
intの配列ならこうだな int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; }
>>210 それはオーバーフローを起こすアホコードだから絶対に真似しちゃダメ。
214 :
210 :2007/03/10(土) 02:43:22
>>211 ですよねぇ・・・
更には
return *a-*b;
も何かやばい感じがするんですが
aに大きい負数が渡されるとおかしな事になるような・・・
216 :
デフォルトの名無しさん :2007/03/10(土) 03:06:11
多分、このスレの前スレで、Linuxのカーネルソースは $ lint 〜 にパスしないと受け付けられない、みたいな書込みがあったように思うのですが、 この「〜」の部分のオプションが分かる方いらっしゃいますでしょうか?
サイトからソースを取得するプログラムについて質問したいのですが・・・ 誰かいますか??
219 :
デフォルトの名無しさん :2007/03/12(月) 23:00:34
ANCI C言語辞典だと return *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); }
int int_cmp(const void *a, const void *b) { return *(int *)a == *(int *)b ? 0 : ( *(int *)a > *(int *)b ? 1 : -1 ); }
やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。 >やはり、intを返すという基本設計がまずいな。 >やはり、intを返すという基本設計がまずいな。
よし、doubleを返すようにすればいいんだな! アホかい
えーとじゃぁオレchar返すよ
たぶん彼は3値論理の型が欲しいと言っているんだろう
#define UNDER -1 #define EQUAL 0 #define OVER 1
そこはenumだろ常識的に考えて
_Bool返せよ。
おまえからそんなもの借りてないよ
>>228 _Boolじゃ3種類の値は返せないだろ
別に3種類も返す必要ないだろ。
qsortの比較関数か? なら最低3値返す必要があるよ。
クィックソートは3値ないとアルゴリズム的に実行不可能なわけ?
アルゴリズム的に実行不可能という意味がよくわからないけど、 qsortの仕様がそれを要求している。それだけ。知らなかったの?
>やはり、intを返すという基本設計がまずいな。 という流れできてるんだけど・・・・・・
>>233 C++のstd::sort()の場合、要求してるのは2値(bool値)のPredicateだし
別に不可能ってわけじゃない。
例えばcmp() は a > b ならtrue, さもなくばfalseを返すという仕様であると
して、もし同値かどうかの判定が必要であれば、
cmp(a,b)、cmp(b,a)の両者がfalseならば a == b と判断できるわけで。
>>234 の言うように、C標準のqsort()の仕様が3値の比較関数を求めている
ってだけだ。
>>233 qsortはクイックソートではない
内部でどういうアルゴリズムで実装されててもいいことになっている
そういうわけで、a==bに対して非0を返すと、ソートが終わらなくなる可能性がある。
>>235 ああ、なるほど。流れはわかった。
が、intを返すのってそんなにまずい設計か?
ちょっとその辺の説明が欲しい。
むしろループの中で何度も呼ばれる関数なわけで、
intを返すのは性能の観点から当然の選択だと思うけどな。
三値を返すのが不味いんだろ。型が問題なわけじゃない。
ネーミングから誰でも一度はする誤解だよな>qsortはクイックソート
要は、整数の比較関数を減算で行なうサンプルが問題なんだろ。
値の差が INT_MAX を超えるとアウトだからね…
まぁ必ずしも必要とは限らないのに、比較が2回必要な3値の関数を 求める仕様は糞と言ってもよいだろうな。
必要なソートアルゴリズムもあるから、そうなってるんだろ
>>237 ×qsortはクイックソートではない
○qsortはクイックソートとは限らない
248 :
デフォルトの名無しさん :2007/03/13(火) 15:20:00
strcatを使用しないでchar型配列(str1とstr2)を連結したいのですが、 文字列str1の最後の'\0'に文字列str2の0からを一つずつ代入していけばいいのは 分かるのですが、やり方がわかりません。 どうすればできますか?
マルチすんなアホ
>>242 というかクイックソートを念頭に置いて名付けたんだろ。
単にこのスレ的にそう決めつけるのは誤ってるってだけで
>>244 実際の差を返す必要はないでしょ? 必要なのは符号だけで
>>250 の意味が分かってもらえてないって事だろ。
>>213 なんでオーバーフロー起こすか解説きぼん
問:負の数が弐の補数の処理系において、 *a=0, *b=INT_MINの場合、どうなるか?
ダメだこりゃ。
>>213 なんて分かりきった上で、全然別の次元の話をしているだけなのだが?
INT_MINの符号反転はINT_MINのままだから
int a = 0; int b = INT_MIN;のとき
>>210 だと
cmp(&a, &b) < 0となってしまうのでダメってことか
で
>>220 だと
cmp(&a, &b) > 0となり正しいと。
>>250 =256=260
だと最高なんだがなーw
263 :
デフォルトの名無しさん :2007/03/14(水) 01:58:02
450Kのコードっていったらどれくらいの規模のこと? 45万行ってこと?
450KiBかも知れず。
>>262 違うよ。いつまでもそんな下らない話題引っ張られても邪魔だから
引っ込んでろといってる。
stdc++のstd::sort()もソートアルゴリズムを指定していない点では同じだが 要求しているのは2値のPredicateだ。 何度も繰り返すが、3値のPredicateは要らないんだよ本来は。 整数のオーバーフローとかいう低レベルの下らない話とは全然別問題。
>>266 なんでここで全然関係のないstdc++が出てくるのかわからんがな。
規格においてqsortは安定でないことになっているから、
本来は3値も要らず、2値で十分てことだろ。
>>267 実際には順序付け集合に対する2値の述語関数があれば、
3値と同等のことは実現できる。だから、仮に3値が必要な場合であっても
2値の述語関数で十分なの。
>>236 を読めよ。
結論: 比較関数をいっぱい呼びたい奴はC++を使っとけ
>>268 まったくだ。ifとwhileだけで構造化は実現できるのにforなんて無駄きわまりないな。
breakやcontinueなんてもっての他だ。gotoやlongjmpに至っては(ry
>>270 意味不明。馬鹿じゃないの。
構造化のための構文は*ユーザにとって*便利であり
*ユーザが*見通しの良いプログラムを書くのに役に立つ。
2値の述語関数で十分なのに3値の述語関数を要求するのは
*ユーザにとって*便利でも何でもないし、
それによって効率があがりもしない。
結局3値の比較が*実際に*必要である箇所では、比較が2度必要になるからだ。
しかし、3値の比較を*常に*ユーザ側に求めた場合、実際には必要でない
箇所でも2度の比較を行う羽目になる。
つまり、不便なだけでなく、効率が悪くなるのだ。
それはライブラリ側の怠慢であり手抜きであり仕様の欠陥でしかないよ。
>>270 まったくだ。lambdaさえあれば他になにも(ry
>>269 アホか。C++のほうがはるかにソートを楽に記述できる。
順序集合をソートする場合において、等値かどうかの比較が常に必要とは 限らないんだが、 わざわざそれを常にユーザに強いているのがCのqsort()の仕様。 C++のstd::sort()の場合は、そんな馬鹿なまねはしない。必要な場合は、 そして必要な場合のみに限って、2値のPredicateだけで等値かどうかの 判定をできるからだ。
そして、2値を返すなら、compの素直な実装方法による オーバーフローがどうこうという面倒な話も発生しない。
Perlにはsortのために(としか思えない)わざわざ3値比較のための 演算子なんてものが用意されてるよね。 <=> とか cmp とか。これは笑ってしまう。
それはここでやる話じゃないだろ。
ここまで読んだ とりあえず論点が完全にズレたまま進行してることはわかった
いつまでソートの話してんだよ。
例えば以下のような構造体をファイルで宣言した時 初期値として、 hoge.bar == NULL と hoge.foo == NULL は保証されているのでしょうか? struct { char *bar; char **foo; } hoge;
されるわけないでござる
え?その定義ならされるだろ。 まさかあれか、全ビット0がNULLとは限らないというあの流派か。
自動変数でも?
大域変数か静的変数なら初期化される。 ゼロフィルではなく、全てのメンバが0に。
ファイルで宣言ってのは、自動変数説を否定している、と俺は見たが。 関数で宣言、なら自動変数かもね。 深読みしすぎといわれればその通り。
286 :
デフォルトの名無しさん :2007/03/14(水) 22:06:00
C言語初心者です。 「C言語プログラミング能力認定試験」って取るメリットありますか?
スレ違いだよ 1級ならまだ許せるけど、履歴書に2級とか書かれたら(´,_ゝ`)プッ
私はまだ何も分からないのですが プログラミングをするにあたってまず何をそろえて何をすればいいんでしょうか?
まずはパソコンを買うことから始めます。
>>288 ボーランドコンパイラかVisual C++ Express。どっちも無料
インストール後、適当にPATH通せ
Knoppixをお勧めしてみるテスト
293 :
288 :2007/03/14(水) 22:49:47
Visual C++ Expressのダウンロード及びセットアップ完了しました。
>>280 「ファイルで」というのが「関数の外で」宣言されたという意味なら、される。
この初期化は、配列でも構造体でも、全ての要素について「=0」と書いたかのように行われる。
よって不動小数点数は0.0に、ポインタはヌルポインタに正しく初期化される。
>>293 入門書を買って言語仕様を覚えろ。
関数内でもstatic付けた静的変数ならやっぱり0初期化される
>よって不動小数点数は0.0に、ポインタはヌルポインタに正しく初期化される。 大間違い。
>>296 俺は294じゃないけど間違いというならその理由を示してよ。
K&R A8.7初期化 より引用
> 明示的に初期化されない静的オブジェクトは、それ(あるいはそのメンバー)に定数
> 0が代入されたかのように初期化される。明示的に初期化されない自動オブジェク
> トの初期値は、不定である。
>>297 根拠を示さず「大間違い」とだけ言うのは小学生だってできる。
無視してかまわんだろう。
>>299 関係ないでしょ。だって
void *p = 0;
と書いてあるように初期化されるんでしょ。
これはpには全ビットが0の値が入るのではなくて、
NULLポインタが入るんだよ。
段階を追って詳しい説明になっていくのにワラタw
ゼロフィルで済む処理系ならBSSをロードする時に全部ゼロ埋めするだけだが、 それで済まない処理系で規格を満たすためには、初期化専用のコードを コンパイラが吐き出して、スタートアップルーチンで呼ばれるようにする んだろね。 なんかC++みたいだなw
不動じゃなくて浮動だろと言うつっこみだったんだよ!たぶん
>>302 それ実は俺もずっと気になってたんだけど
ポインタに0代入したらそれはNULLポインタと等価なの?
というか全ビット0がNULLとは限らない処理系ってあるの?
>306 CFAQには、そういう処理系も実在すると書いてあったよ
というか ヌルポインタの内部表現が未既定なのも ポインタがくるべき場所に整数定数0を書いたらヌルポインタに変換されるのも 規格がそう定めているからであって、そのような処理系が実在するからではない
>>306 > ポインタに0代入したらそれはNULLポインタと等価なの?
Yes.
ポインタの文脈では0はいつでもnull pointer constantとして扱われる。
ポインタに「値が0の整数定数式」を代入したり、(暗黙にでも)比較したりしたときは、 コンパイラが整数定数0を正しいヌルポインタの値に変換する。 値が0である整数変数を代入する場合はこれにあてはまらない。 あくまで定数だけである。
>>280 が変数宣言を書けば、こんなにモメなかったろうにw
ぶっちゃけauto変数以外はリンカーがプログラムに引っ付けて実行形式で出力する。
実行するとローダーがフォーマットに従い元通りに展開してくれる
auto変数で使うスタック領域もローダーがフォーマットに従いサイズ分用意してくれるが、
0クリアする決まりが無いので未初期化として扱うのが決まりになってる。
ROMで実行されるプログラムでない限りは、こんな覚え方でいいような気がする。
NULLの定義が #define NULL 0 #define NULL ((void*)0) 以外の処理系って見たことある? 俺は無いけど。
>>312 BSS(未初期化のstatic変数を格納する領域)も実行形式に
埋め込む処理系は少ないのでは。
スペースの無駄だからね。
315 :
306 :2007/03/15(木) 01:37:05
物凄い参考になった。皆thx
316 :
313 :2007/03/15(木) 01:39:15
ちなみに俺はC++の癖でCでもNULLと書かずに0と書いてしまう。
>>313 最近のgccとかは __null とかになってなかった?
そうだと困るハードがあるからNULLが0x00000000とは定めてないわけだよねぇ?
>>318 ハードにかかわらず、NULLを整数値として評価した場合は 0 として評価されるって規格で定められてたと思うけど。
NULLを使わず0で初期化してる人がいるようだけど 俺したこと無い。 例えば int *foo = 0; とか typedef struct{ int a; char *p; }hoge; hoge *ho = 0; とかしちゃったりするの?
標準ライブラリに含まれてる型名って、ファイルスコープの名前だから 関数ローカルや構造体メンバでその名前使っても問題ないよね? jmp_buf とか va_list とか、マイナーなやつをうっかり使ってしまうことが 無いとは言えないんで、エディタのキーワードハイライトに全部 突っ込んでおこうかと思ったんだけど、よくよく考えたら ファイルスコープでやらかさなけりゃ全然問題ないんじゃないかと。
>>313 DOSでラージメモリモデルの環境では0Lになっていると思う。
少なくともLSI C-86のヘッダではそうだった。
>>324 いや、それらはグローバルなので問題ありまくり。
衝突を避けたければ、ユーザコードの名前に特定のPrefixを付けるといった
規約を考えたほうがよい。
>>326 jmp_buf なんて何の規則も無い名前との衝突を避けようと思ったら、
関数ローカルや構造体メンバに int a; とすら書けないと思うんだが、
正気か?
>>327 は?
構造体タグ名、変数名、メンバー名は別の名前空間に属するから、
そのような例で同一の名前を用いても問題が生じるわけがないよ。
>321 単に「NULL」という言葉を「ヌルポインタ」という意味で使うと誤解を招きかねないのでやめたほうがいい マクロNULLとヌルポインタは別のものであるから、区別できるように書くべき
>>328 元の質問 >324 がそう言って「問題ないよね?」って聞いたのに対して
>326 が「問題ありまくり」と返しているんだが。
>>330 同一の名前空間で同じ名前を重複させたら当然問題あるでしょ。
あなたがC言語の仕様に対する無知によって、的外れな例を挙げただけ。
>>331 構造体メンバは問題が生じるわけないってことか?
なら残りはローカル変数ってことでいいかい?
ファイルスコープの typedef である jmp_buf の名前空間は
ローカル変数といっしょで変数名だよね?
でもローカル変数ならスコープが重なるだけなんで、ライブラリの
jmp_buf を使うつもりじゃなくてうっかり(知らずに)ローカル変数名として
使っただけなら問題ないんじゃないの?
どうせ内側で宣言されたローカル変数しか参照しないんだから。
>>332 ヒント: 他人にものを聞く態度
>>336 を読まなかったのかい?
jmp_bufは「ファイルスコープ」の名前ではありません。
typedef名と変数名の名前空間も別物です。 だから、 typedef int i; i i; のようなコードも合法。良いスタイルではないけどね。
>>333 「ファイルスコープ」じゃなくて「グローバルスコープ」って言いたいの?
ISO C99 の最新ドラフトを見てしゃべってるんだが、規格には
「グローバル」なんてスコープは無いよ。
6.2.1 で列挙されてるのは "file scope", "block scope",
"function prototype scope" の3種類だけ。 "global scope" で
検索してもひとつもヒットしない。なので >326 の言ってる
「グローバル」ってのはファイルスコープのことだと思った。
336 :
333 :2007/03/15(木) 11:14:40
>>335 あーごめん。嘘ついたかも。
リンケージまで考えるとファイルスコープって一般にstaticなオブジェクトのこと
を指すと思うんだけど、今は名前の話だったな。ごっちゃになってたわ。
「C99 の最新ドラフト」はおかしいな。
>>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
338 :
334 :2007/03/15(木) 11:20:54
あー名前空間同じだけど、typedef定義と変数宣言を スコープ違う形で試したから受け入れられたっぽいな。 こっちもすまん。
340 :
324 :2007/03/15(木) 11:57:28
えーと。つまり >324 はやっぱり問題ないってことでおk?
>>337 struct a {
int a;
};
typedef struct a a;
a b:
void c()
{
b.a = 0;
goto a;
a: ;
}
ってこと?
343 :
341 :2007/03/23(金) 09:26:10
処理自体には意味ない。 ただ名前空間の分類としては、こういうことかな?と aは全部違う名前空間ということで。
>>343 そうだよ。ちゃんとコンパイルできただろ?
345 :
デフォルトの名無しさん :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
はいはいわろすわろす
348 :
デフォルトの名無しさん :2007/04/09(月) 14:46:42
ファイルの作成された日時をゲットする方法を教えてくれい!
アイコンを右クリックしてプロパティを見る。
350 :
デフォルトの名無しさん :2007/04/09(月) 14:56:45
>349 そんなアホナ。。。
ワロタ stat とか fstat で
環境依存
353 :
デフォルトの名無しさん :2007/04/10(火) 12:13:30
program.exe arg1 arg2 arg3 .... と何個でも、何文字でも無制限にいけるのか?
引数の長さには通常制限があるが、環境依存。 ARG_MAXでぐぐれ。
制限はあるけどそれはプログラムの方の制限じゃないよ
ARG_MAXはPOSIXだと思う
うん
シェルの制限かと思ってた
>359 mjky
361 :
デフォルトの名無しさん :2007/04/13(金) 15:40:58
malloc とか free に一枚皮を被せるって常識なの? void Free(void *ptr) { if (ptr != NULL) free(ptr); } こんなようなの、、、
少なくとも、free() にNULL渡すのは問題ない仕様だから それは意味無いな。
違った delete に渡すのが問題無いんだった
>>361 常識ではないし、標準Cなら
| free 関数は、ptr が指す領域を開放し、その後の割付けに使用できるようにする。
| ptr が空ポインタの場合、何もしない。
ので、まったくの無駄。
もっとも、malloc/free のトレースをしたいという目的で
ラップするのはアリ。
メモリリーク検出には役立つかも知れない
>>361 ペアである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;
}
void**はないだろ、常識的に考えて…
スレタイを100回音読すべきだな
>>367 間違えやすいよな.C++なら参照使えばいいけど,
Cならマクロ使った方がいい局面かも.
自分用ツールだったら、よくmallocが0を返したら即exit(1)するラッパを使う。 C++を使えるときにはnewを使えばいいんだけど。
>>366 my_freeは、渡されてきたポインタがNULLの時にのみ解放してるけど、それでいいの?
というか単純ミスだよなw
my_free(NULL);
linuxの場合は、malloc()が成功したかどうかは、実際にメモリにアクセスするまで分からないから、 malloc()の戻り値をチェックするのは無駄だって説もあるな。
>>373 カーネルの設定換えれば検出できるようになるね。
さもなくば、calloc()で検出できるんじゃないか?
そんな環境依存の話を書かれても
つまり、このスレ的にはmalloc()の戻り値を検出するためだけのラッパは要らないということで。
仕様的にはmallocの時点で割り当て失敗かどうか検出できないのってどうなの?
WindowsもたぶんVirtualAlloc使うと、実際にアクセスするまで確保されない ってこのスレじゃ関係ないね
今ググても見つからなかったけど、俺が読んだ文章だと「近代的なOSだと、そういうふうになってる」みたいな言い方だったね。 mallic()で0を返さないって。
マリックwwwww
>>373 malloc()は、システムコールじゃないよ。libcの関数だよ。
わかってる?
>>377 駄目。
malloc()の実装のサンプル(システムコールとの関係)はK&Rにも載ってるから
興味がある人は目を通して理解しておくと良いよ。
知ったかぶりすると恥ずかしいから。
Windowsで言うなら、
VirtualAllocは確保できなくても0以外を返すかもしれない(実際は知らない)けど
HeapAlloc(OSからもらったメモリを必要な分だけに区切って渡す)は
確保出来ないときは0(NULL)を返すということ。
(サイズ情報等を埋め込むから、必ず実際のメモリにアクセスする)
VC++なんかのmallocは、HeapAllocをそのまま呼んでるだけだし。
ヒント: 管理情報はアプリケーションに返すメモリブロックに隣接している必要はない malloc()がどう実装されてるかなんてそれこそ環境依存以外の何者でもない とはいえ利用可能でないのにNULLを返さないのは規格違反だろうな
なるほど、 アドレス空間が足りない時等「一般的にmallocがNULLを返す状況」では無く、 システム全体(カーネルと各プロセス最小限使用分)の「物理メモリ」が不足する状況で プロセスの存在そのものが抹消されるわけね。 それも、自分自身とは限らないプロセスが。
とはいえ、どう考えても、これが「近代的なOS」と関係あるとは思えない。 「近代的なOS」が使っているのは、仮想記憶とデマンドページングだろ。 mallocが失敗してもNULLを返さないのとは関係ない。
つまり、このスレ的にはLinuxのlibc(におけるmalloc()の実装)は間違いだということですね。
Linuxはカーネルだけだから理論的にはまともな実装をしたlibcに置き換えることもできる。 glibcと言っておこう
>>384 でも、とりあえず、manでヒープの破壊について触れているくらいだから
今話題のLinuxのglibcの実装に関しては、
確保したブロックの前後に管理ブロックがあると、仮定しても構わないでしょ。
じゃあどういう状況でNULLを返さないことがあり得るんだろう。 アプリケーションに返すメモリがたまたまページ境界にまたがったときかな
>>390 いや、
>>385 な状況で、実際に物理メモリが足りないと判明する時でしょ。たぶん。
ページ境界の可能性もあるけど、大きなブロックを確保して真ん中にアクセスした時とかも。
ていうか、この場合、メモリ不足が
「アクセスするまでわからない」じゃなくて「絶対にわからない」だな。
分かった瞬間に検出することも出来ないまま殺されちゃうんだから。
>>373 の「NULLチェックが無駄かも」という結論は一緒かもしれないけど。
あとページサイズを超える大きなメモリブロックを割り当てた場合 最初のページだけは管理情報の書き込み時点でコミットされるけど 2ページ目以降を踏んだとたん落とされる可能性がある
2秒差でかぶったorz
ハードウェアの制限で256の倍数でデータを書き出しを行いたいのですが 端数が出た場合の処理はどのように実現するのがスマートなのでしょうか。 データは必ずシーケンシャルに確実に書き込まれる必要があって困っています。 携帯開発辛い...
>>394 言語と何ら関係がない質問なので、スレ違い。
まぁ、切り捨てていいなら切り捨てるし切り捨ててはいけないなら補うだけだな。
尤も、補う方法もダミーを詰めるだけでいいのか適当に間引く必要があるのか知らんが。
>>394 許されるバッファサイズと
書き込みサイズ > 256
書き込みサイズ ~= 256
書き込みサイズ <<< 256
で, 解が 異なると思うんだが...
n: アライメント 書き出しサイズ (data_size + (n-1)) / n * n n が2の累乗数なら (data_size + (n-1)) & ~(n-1) で代用可能
>>382 VirtualAllocがメモリの予約やコミットに失敗した時は
NULLを返すのは保証されてるよ〜
完璧にスレ違いだけどな
フラッシュの書き込みとかやったなあ、なつかしい
402 :
デフォルトの名無しさん :2007/04/22(日) 23:30:12
ファイルのサイズを取得する方法として fseek()でSEK_ENDに移動して ftell()の戻り値を取得する方法を使っていたんですが、 どこかのサイトに 「バイナリモードでファイルをオープンした時はSEEK_ENDの値が保証されない」 みたいな事が書いてありました 理由がよくわからないんですが、なぜなんでしょう
その管理者に「日本語でおk」とメールしろ
ISO/IEC 9899:1999 7.19.9.2 The fseek function / Para.3 3 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. だそうだ、詳しくは知らない
>>402 SEEK_ENDの値が保証されない
でググって最初のやつ
>>402 http://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'').
ファイルサイズをバイト単位で管理しないファイルシステムがあった大昔のためだろ。 テキストファイルはファイル終端を表すEOFコードを書き込んでいたが、 バイナリファイルではそうもいかないため終端へのシークができない (あえてやるとすればブロックなどといったもう少し大きな単位での終端までいってしまう) ということのはず。
>406のページは他にも嘘が……
>>407 CP/Mがそんなだったかな。
EDLINEとかDOS用のエディタでテキストファイルを作ると最後に^Zが付くのはその名残。
410 :
デフォルトの名無しさん :2007/04/23(月) 19:21:07
副作用完了点について質問があります。 1) どこだったか忘れてしまったのですが、ネット上の文書で 「カンマ演算子はインクリメント/デクリメントの副作用完了点にならない」 というような記述を読みました。これは正しいのでしょうか? 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*/ が呼ばれる順序は定義されていますか? よろしくお願いします。
++i と i++ で処理が変わるようなプログラムは 今の時代書くべきじゃない。
++i や i++ を何かに突っ込んだプログラムもな。 a[i++] = b; とか。 読みやすいプログラムを書け。
>>411 ,412
なんで乞われてもいないのに語りだすん?
引数を列挙する時のコンマは副作用完了点にならないけど、 コンマ演算子は副作用完了点になるはずだと思うんだけど。
論理積 (&&)、論理和 (||)、カンマ演算子 (,)、三項演算子 (?:) の評価順は左から。
その他の演算子は不定。なので
1) は「正しくない」
2) は「合法」
3) は「定義されていない」
>>413 >>411-412 は、今何の話をしているかをまったく理解できていないものと思われる。
でも、よく下のような使い方は見るよね int a,b for(i=0;i<10;i++) { *a++ = *b++; }
>>416 以下を、突っ込んで欲しい順に並べてください。
ア・「でも」は何処に掛かってんだ!?
イ・更に話題を発散させるつもりか!?
ウ・aとbはポインタちゃうやろ!!
>>419 ウ・aとbはポインタちゃうやろ!!
ア・「でも」は何処に掛かってんだ!?
イ・更に話題を発散させるつもりか!?
421 :
402 :2007/04/23(月) 22:26:44
みなさん回答ありがとうございます
> A binary stream need not meaningfully support fseek calls with a whence value of SEEK_END.
という事は厳密には移植性が無いって事でいいんですかね
と思ったんですが
>>406 マジすか?混乱してきました
>>408 後学のためにどこか教えていただけますか?
カンマ演算子について、 while ((c = getchar()) != EOF) {} なんて書き方を良く見るが、たまに while (c = getchar(), c != EOF) {} の方が分かりやすい人も居るんじゃないかと思ったりする。 (優先順位等が分かっている人には) ただ、K&R等で上の書き方が使われているし、 一般的に「慣れている方が分かりやすい」という観点からは やはり上の形なのかな、と思う。 K&Rで上の形式なのは、大昔の非最適化コンパイラの都合もあるだろう。
424 :
デフォルトの名無しさん :2007/04/25(水) 15:10:10
dirent_t構造体のメンバ変数でd_typeというのがあるのですが、 これの示す値がどのように定義されているのかが分かりません。 とりあえず実際に動かして調べてみたところ、 ファイルの場合は8、ディレクトリの場合は4が入ってくるようなのですが、 他にも何か値が入ってくる場合があるのでしょうか? 御教授ください
sys/stat.h
>>423 確かにカンマ演算子使うのはいいかもな、
ま、俺もどうせ今更だから使わないけど
>>423 下の方が分かりやすいとは思うんだけど、
c を2回書かないといけない点は気持ち悪い。
悩ましいところ。
すみませんお願いします。 scanfで10桁までの数字を入力し、その10桁の数字を配列に格納するにはどうしたら良いでしょうか? こんな感じの↓問題なのですが、お願いします。 1.10桁までの任意の数字を入力し、入力した値を配列に格納し、 「何桁目を表示しますか?」を出力し1〜10までの任意の数字を入力後 「○○桁目の数字は○です」と出力されるプログラムを作成せよ ググってもわからないし、全然できないです…orz どなたか解いてください。
429 :
428 :2007/04/25(水) 22:52:19
あ、使用しないとならない関数はscanf printf switch case になります。
宿題スレにいけば教えてくれるよ
出題者にswitch case は関数じゃない、とつっこんどけ
while (GetChar(&c) != EOF) {} でええやんw
なんですかそれは
int pos,list[10]; setNum(&list[], sizeof(list)); pos=getPos("何桁目を表示しますか?", sizeof(list)); printf("%d桁目の数字は%dです\n", pos, list[pos] ); こんな感じでおk
setNumとかgetPosって何やねん
setNum() 配列サイズの個数の任意の数字を入力し、入力した値を配列に格納 getPos() メッセージを出力し1〜サイズ以下の任意の数字を入力させ、それを返却
標準Cにそんな関数あるのか?
無いなら作れ
最初から「宿題は自分でやれ」でええやん
御教授ください とありましたが、「御教示ください」と言ふべきです。
「あいにくですが教授の知り合いはいません」と答えておけばいい
「教えたまえ」でいいじゃん
はらいたまえ、きよめたまえ
444 :
デフォルトの名無しさん :2007/05/01(火) 17:07:22
質問です、プログラムAから別のプログラムBを立ち上げて、 Bの出力する標準出力はディスプレイに出さず全てAが受け取り、 Bが行うscanfなどの標準入力要求時には、すべてAから入力を与えるようにするにはどうすればよいでしょうか。 system,popen等の関数を調べたのですが、実現できません。 一見popenで出来るかと思いきや入力か出力のどちらかしかできないようで困ってます。 手順やキーワードだけでも結構ですので教えてもらえませんでしょうか。
符号なし 32bit の変数 a と b があります。 >> unsigned long a; unsigned long b; a と b には任意の値が格納済みであるとして、加算するとオーバー フロー(0xFFFFFFFFを超える)の場合、"Overflow"、オーバーフロー しない場合、"(a+b) OK" を出力するプログラム 教えてください 条件: if((a + b) > 0xFFFFFFFF) の判定は使えません。 if((a + b) <= 0xFFFFFFFF) の判定は使えません。 a と b を加算してはなりません。
>>444 popenの第2引数に"rw"使えなかったっけ
あとはforkで起動してパイプつなぐとか
thanks
昔、if (x || y || z) よりも if ((x | y | z) != 0) の方が 速くなる可能性がある(コメント必須)という話があったが 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つを整数定数に変えたものが最速か。 もちろん、このコードは移植性も無いし可読性もない 最悪のコードではあるのだが。
stdioのFILE系で読み書きを同時にするのはトラブルの元だって たしかrubyの人が言ってた気がする。
宿題の答えとしては条件に合わない方法 unsinged 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 ならばオーバーフローしている。
>>449 分岐は基本的にコストが高いから
分岐が少ない方が速くなる可能性はあるけど、
どのくらい速くなるかは
環境と実行条件によるとしか言えない。
だから、よく使われると想定する環境下で実測するしかない。
ただ、よほどじゃないと問題にならない程度の差しかないと思うけどね。今の時代。
数兆周のループの中に入ってるとかでもない限り。
a > 0xFFFFFFFF - b ではいかんか?
氏ね
>>445 Hacker's Delightの2-12でも読めば?
リモートの機器から日、時、分、秒を取得して、 ローカルの日時から、年月を補ってtime_t型通算病 (所謂UNIXタイム)を求めたいのだけど・・ 単純にtime, localtime, mktimeで作ると、月替わりタイミングでバグるよね。 スマートなやり方があった気がするが・・思い出せない、おながいします。 ※リモートとの時刻誤差は数分以内程度を想定してます。
日が違ってる場合に年月の補正をすればいいんじゃない?
C言語の問題じゃねー気がするが 日が取得できるのならそれをつき合わせて補正でイナフ
年が今年なら、年月日だけあわせて0時の通産を求めて時分秒足したら
>>451 このスレ的には加算を禁じる理由は何もないからいいんじゃね
>>457-459 サンクス、思い出した。言語は関係ないな、こんなイメージで、ぶちこんどいた。
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;
462 :
444 のものです。 :2007/05/02(水) 02:04:03
あるプログラムから別のプログラムから立ち上げて、 その標準入出力を掴むプログラムを作っていたものです。 その呼ばれたプログラムのstdin,stdoutを呼び出し元プログラムで制御するまでに一立ったのですが。 仮にsshやftpを立ち上げてみると、ログインパスワード入力時の 「Password:」 の表示が標準出力じゃないみたいで、 呼び出し元プログラムを通さず、画面に出てきてしまいます。 一体何故でしょうか?
463 :
462訂正 :2007/05/02(水) 02:04:43
>あるプログラムから別のプログラムから立ち上げて、 あるプログラムから別のプログラムを立ち上げて、
465 :
デフォルトの名無しさん :2007/05/02(水) 03:03:04
んじゃ別のところで;^^)
つ【stderr】
パスワード系はエコーバックもあれしてるからなあ
つ/dev/tty
469 :
デフォルトの名無しさん :2007/05/03(木) 04:12:22
話ぶった切って悪いんですがILP64環境で4バイト長の整数を使いたいときってどうなるの?
471 :
デフォルトの名無しさん :2007/05/09(水) 11:36:43
ヘッダにコードを書いてはいけないと聞いたのですが 何かあるのでしょうか? 別に書いても動きますよね?
動く事は動くが再利用性やコードの見通しが悪くなるからあんまり書かない方がいい
>>471 規格の 6.9 External definitions で、一つの関数または変数に対する定義は
プログラム全体で一つ以下(使われなければ無くてもいい)と制限されている。
ただし inline 関数や初期化子の無い外部変数定義は例外。
ヘッダは複数のコンパイル単位に取り込まれるので、うかつに関数や変数の
定義を置くとプログラム全体としては同じ名前に対する定義を複数持ってしまう
ことになり、未定義動作となる。
現行の一般的な処理系では、この規則に反するほとんどの場合がリンク時に
「重複した定義」などのエラーとして報告される。
474 :
デフォルトの名無しさん :2007/05/09(水) 12:03:53
>>472 473
なるほど、わかりました。
ありがとうございます。
475 :
デフォルトの名無しさん :2007/05/09(水) 13:41:50
3次元配列を使ってプログラムを組んだんですが、これをポインタを使ったプログラムに書き換えたいです。 簡単な方法があれば教えて欲しいです。 いまいちポインタが分かってないもんで、よろしくお願いします。 3次元配列は、2000*2000*2000の配列です。
>>475 配列とポインタって中でやることはほとんど同じだから、
書き換えたってたいして意味無い(動かないものが動くようになったりしない)よ?
> 3次元配列は、2000*2000*2000の配列です。
これ、一般人が買うようなPCだとオンメモリでは扱えない大きさだよ?
(わかってるならいいんだけど)
477 :
デフォルトの名無しさん :2007/05/09(水) 14:22:57
>>476 ありがとうございます。やっぱり動作が軽くなったりはしないですよね・・・
何十ギガという単位で実メモリがあれば速くなるんじゃないかな。
479 :
デフォルトの名無しさん :2007/05/09(水) 14:47:12
今FDにはいっている会員IDとPCの中にあるDATファイルの会員IDを照らし合わせて、同じ会員IDの名前だけとりだすというプログラムをつくっているんですがどなたか優しいできる方プログラムをのせていただけませんか?おねがいします!
まずは両方のデータをアップしなさいな。 データのフォーマットがわかないと作れないじゃん。
訂正:わかないと→わからないと
482 :
デフォルトの名無しさん :2007/05/09(水) 14:55:28
データとは会員IDのナンバーとかですか?ほんと初心者ですいません。
483 :
デフォルトの名無しさん :2007/05/09(水) 15:26:41
FDの中のデータは会員IDのみになっていて、1001がはいっています。PCのDATファイルには会員ID、名前、生年月日、住所の順に 1001 田中 19840908 千葉県 1002 高橋 19841203 埼玉県 1003 吉田 19840405 山形県 1004 佐藤 19841112 沖縄県 がはいっています。この2つを照らし合わせて1001のIDの田中だけ表示させたいというプログラムです。やさしいかた教えてください!お願いします!
>1001 田中 19840908 千葉県 「1001」と「田中」の間には何があるの? 半角スペース? 他の項目の区切りも同じ?
485 :
デフォルトの名無しさん :2007/05/09(水) 15:41:40
区切りは全部タブです!よろしくお願いします!
何日までに作ってほしい?
488 :
デフォルトの名無しさん :2007/05/09(水) 16:16:07
早ければ早いほどうれしいですが忙しいなら無理には大丈夫です。今週いっぱいにはつくりたい予定ですが。丸投げですいません。よろしくお願いします。
代金は銀行振り込みでいい?
490 :
デフォルトの名無しさん :2007/05/09(水) 16:28:26
#include <stdio.h> const 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に整数が入るのがイマイチわかりません
ユーザがどういう入力をすると想定してるの? もしかして"20070509"(YYYYMMDD)とか?
492 :
490 :2007/05/09(水) 17:05:15
そうです。2007 5 9 って半角スペースで区切ると曜日が表示されます。 2007 5 9みたいに入力してなぜnが3とか-1とかになるんですか?
-1 ではなく EOF と書け。
>n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,); この%cは何を得ようとしてるの?
標準関数のリターン値の意味を質問しているのか? ヘ ル プ 読 め。 manとかMSDNとかググるとか、ヘルプ読めない環境でプログラミングなんて無茶だから。
>>483 #include <stdio.h>
int main(void)
{
system("grep -f fddata.dat pcdata.dat");
return 0;
}
497 :
490 :2007/05/09(水) 18:14:30
簡単に書き直したらうまく出来ました。 ありがとうございました
WindowsでもLinuxでもいいんだけど共有メモリ使う時に 構造体にキャストして使う方法とわざわざmemcpyで各要素ごとにコピーする方法が 等価だって言い張る人にどうやって違うんだよって説明すればいいですか? 相手は37歳のシナです。
>>498 比較用のコードを書いて、ベンチマークの結果をみせてやるとか。
>>498 そのシナさんはキャストでもコピーが作成されると思ってんの?
だとしたら、キャストの場合はアドレスが変わってないことを
見せてあげればいいんじゃない?
>>498 まず
>>1 を読み直せ。それでも相談を続けるなら2つの方法に
対応するコードと、双方の主張を理由をつけて挙げてくれ。
>>499 それが、そうやって今しがたみせてやりましたが今度は
このような書き方は一般的じゃないとかいって怒り出して机をめちゃめちゃに
して帰りました。おまえの低能ぶりには呆れるとか捨て台詞を吐いて行ってしまいました。
正直な話、共有メモリの一番うまい使いかたってOpenMPとか見たいに自作のデータ構造を
そのまま共有メモリで共有できる形が理想なのにそれを言っても解かってもらえないのだろうか。
よそでやれ
Cの話じゃないよね そいつの人格か理解力の問題か そういう人とのコミュニケーションの取り方の問題だよね
>>502 シナさんがこんな時間まで残業付き合ってくれてたんなら少しは大目に見てやれ。
マ板でやれ
507 :
デフォルトの名無しさん :2007/05/10(木) 11:03:51
483ですがどなたか本当におねがいします。新社会人でこまっています。やさしい方おねがいします。
Excel でも使えば?
>>483 Cじゃないとだめ?
C#とかJavaは?
>507 上司に「できません」って言え
>>507 仕事なのか? だったらコマンドラインで grep 使えよ。
わざわざ作れもしないCプログラムで仕事を遅らせるのはアホ。
上にもあるように、scanfつかえ
515 :
デフォルトの名無しさん :2007/05/10(木) 18:10:54
ごめんなさい。でも真剣に困ってるし助けてほしいんです。よろしくお願いします。
だからscanfつかえよ
帰れ
常識知らずにかける情けは無い
スレ違い
だーから相手すんなってば。 相手するなら誘導してやれ。
521 :
デフォルトの名無しさん :2007/05/10(木) 22:03:02
>>515 ですけどもういいです。もっとできる人探しておしえてもらいます。
ここにいる人達はどうせこのプログラムがかけないんでしょ?
こんなしたてに聞いているのにひどい人達ですね。みなさんわからない
時期はなかったんですか?
君は自分の要求を受け入れる人の言うことにだけ耳を傾けるのかね。
>ここにいる人達はどうせこのプログラムがかけないんでしょ? こういうこと言うやつに何も教える気は無い、消えろ。 その聞き方じゃどこ行っても同じだぞ、初心者にしか相手してもらえない
少なからず相手しちゃってる件
ネタにマジレスカコイイ
でしょでしょエヘヘ
でも実際こういう新入社員は居る事実。
>>521 を本人が書いているという保証はどこにもないなあ・・・。
だから?
疑問文に感嘆符つけて質問する奴は俺の中ではスルー対象だわ。 非常に高い確率でDQNだからな。相手してられん。
疑問文に感嘆符とはどういうことだね!
?!
>>530 感嘆符つけて質問する奴なんてお前のレス以前に見たこと無い。
勘違いしつつぼやく奴は俺の中ではスルー対象だわ。 非常に高い確率でDQNだからな。相手してられん。
インテロバーング
疑問符と感嘆符を間違える奴は俺の中ではスルー対象だわ。 非常に高い確率でDQNだからな。相手してられん。 って、スルーできてねーっつーの。
今こそスルー力が試されるとき!
throw new NullPointerException("ぬるぽ");
try {
>>538 } catch(Exception e) {
System.out.println("ガッ");
}
Javaはスレ違い。 C言語で書け!!
>>483 あんまり暴れるな
「IDが一致してたら表示」でいいんだよね
FDからIDを1つ取ってくる
それをPCのファイルのIDを照らし合わせて一致したら表示
次のIDをFDから持ってきて上を繰り返す
という手順でいいんじゃない?
いまケータイだからソースは載せられんけど
>>541 >あんまり暴れるな
君みたいに、いちいち反応する連中がいなくなってくれれば
もっと早く収束してたんだろうけどね。
あまりにくだらない
てst
548 :
デフォルトの名無しさん :2007/05/15(火) 23:15:56
550 :
デフォルトの名無しさん :2007/05/20(日) 06:03:52
整数12ビットの列を扱うには、構造体のビットフィールドを使うしかないのでしょうか?
16bitなり32bitなりで読み込んで 必要な部分だけマスクして取りだしゃいい。 それでも外部に記録されているものを読み書きする場合には エンディアン依存は避けられないが ビットフィールドよりはまし。
charを介して変換すればマシンのエンディアンには依存しない どう変換するかは元データのエンディアンによる(6ビット1バイトだとすれば)
どうせ外部とのI/Fなら、コンパイラもセットで依存し捲くってもいいというコンセンサスを得た上で ビットフィールドを使うのが一番楽だと思うが。 #後は野とn(ry
そしてBeOSの悲劇
555 :
デフォルトの名無しさん :2007/05/21(月) 16:02:25
1000までの素数を求めて出力するプログラムの作成を教えてください。 mod使う方法で。
mod 素数 C言語あたりでググったほうがはやい
つか、Cでmod使えとは。
>>555 宿題スレへ行け。そしてもう来るな。
#define mod(a, b) ((a) % (b))
inline int mod(int a, int b) { return (a % b); }
ファイルの行数を数えてその分配列を確保したいのですが、 このような配列の使い方(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]: ^^^^^^^^^^^^^^ : : }
>>560 対象とする規格による。いわゆる C99 なら標準で認められている。
C99 より前の C の規格や現行の C++ では認められていない。
>>560 そのような可変長の配列はC99で採用された仕様だから、
一部のC89信者に蛇蠍の如く忌み嫌われる。
まぁ、C99限定でいいのなら使っていいと思うよ。
但し、スタックサイズに注意すること。
関係ないけどファイルの行数を数える関数で戻り値使わないでポインタ渡しなのが気持ち悪い・・・
昔あった、関数は全部voidで宣言しろっていうとんでもないコーディングルールを思い出した
>>564 戻り値を表示できるデバッガが無かったとか?
でも結構しっかりしたC用のAPIだと戻り値はエラー状態を表すのに使われていて、 本来戻り値になるであろうものもポインタの引数になるというのはよく見かける。
MPI とかそんな感じだったような。
余計 void はありえないなw
戻り値のチェックを忘れる馬鹿がいるから、とかじゃね?
is〜な問い合わせ関数でも、戻り void でステートをポインタ引数に取るのか… たまんねーコーディング規約だな
>>570 うんにゃ
ポインタは渡さない
後はわかるな?
よりよってグローバル変数かよ。
573 :
572 :2007/06/04(月) 23:33:55
"に"が抜けた。 ×よりよってグローバル変数かよ。 ○よりによってグローバル変数かよ。
576 :
560 :2007/06/05(火) 00:03:24
>>571 まあ、N88-BASIC のコードを移植するプロジェクトならアリかもしれんが・・・。
>>572 eax だってグローバル変数だー (i86系)
スマン環境依存スレじゃなかった
>>578 いくらなんでもスレ違い。どっか他所でやってくれ。
レジスタはスレッド切り替わる時に退避されるからスレッドセーフで、 グローバル変数なんかとは格が違う。
583 :
デフォルトの名無しさん :2007/06/13(水) 23:07:43
http://pc11.2ch.net/test/read.cgi/prog/1175485506/758 char *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++ では思ったとおりエラーになった。
暗黙の・・・
585 :
デフォルトの名無しさん :2007/06/22(金) 04:01:03
ファイルサイズの取得方法って、「ftell」を使用するのが常道なんでしょうか。
Cでファイルサイズを取得する場合、自分は「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のファイルサイズ */
586 :
585 :2007/06/22(金) 04:01:52
で、Bです。 ======================== 【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ってキャストできそうだからサイズの値が取れると思ったのですが。。。 */ ========================
環境依存の方法を使うのが普通じゃないかな。
>>586 全然本質じゃない細かいところで
> fpos_t *pos;
これは
fpos_t pos;
だよね。多分わかってはいるとは思うんだけど。
589 :
デフォルトの名無しさん :2007/06/22(金) 04:14:58
fpos_tって別の変数にキャストしたりするとき困らない? fpos_tって環境依存だからlong long型とは限らないと聞いたことがある。
590 :
デフォルトの名無しさん :2007/06/22(金) 04:19:29
横からすみません。
この
>>585 って、もしhogehoge.jpegのファイルサイズが巨大だった場合、
どうなっちゃんですか?
標準Cでは2GBを超えるファイルのサイズを知る手段はないって結論になる。 fpos_tがキャスト可能であることは保障されていないことだし。 ファイル関連は標準Cだけで書くのを諦めて、64ビット系のstat()相当の関数を使うのが無難じゃない?
592 :
デフォルトの名無しさん :2007/06/22(金) 06:19:36
>>587 〜のみなさん、ありがとうございました(588さんご指摘ありがとうございます)。
ファイルのサイズが大きい場合のことまで頭が回っていませんでした。
標準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にファイルサイズが入る */
}
593 :
デフォルトの名無しさん :2007/06/22(金) 07:49:47
相乗り質問ですいませんが ファイルサイズ自体を知りたいのではなくて ファイルサイズがある一定値を超えているか否かを判定したい場合も、 やはりstatなりftellなりでバイトサイズを一度取得してから if文で判定するしかないですよね。 2GBだろうが3GBだろうが、とにかくある値を 超えてるか超えてないかだけわかればいいのですが。。。
ファイル開いたらある値まで無理矢理ファイルポインタ動かしてみて エラーが出るかを拾うってのはどうだろう やっぱ2GB超えちゃうとダメなのかな
そもそもファイルが開けないとサイズが調べられないプログラムはどうかと思うんで、 stat64 なりで調べた方がいいと思うよ。
ていうかPOSIX環境だと_FILE_OFFSET_BITS=64が無ければ 2G以上のサイズはのopen/fopen自体が失敗する。 Windows環境だとopenは出来るけど、seekが出来ない(シーケンシャルには読める)。 それぞれ、open64や_lseek64(bccには無い)を使う。 もちろん、_FILE_OFFSET_BITS=64なら、openだけでよい。 また、statも同様に、_FILE_OFFSET_BITS=64ならstatだけで良いが それ以外はstat64等を使う。
そもそもfseek()はエラーを返せない。
598 :
デフォルトの名無しさん :2007/06/22(金) 09:54:27
stat構造体のst_sizeはoff_t型だから、…… long int型になるのかな、 そうするとlong int型に格納しきれないバイト数のファイルは 桁あふれするのかな? 0? 再現させてテストしたいが 環境が手元にないのだが。。。。。。
だからoff_t型の大きさは_FILE_OFFSET_BITSや_LARGEFILE64_SOURCEによって変わる。 off_tに格納できないようなサイズのファイルは、そもそもstat自体が失敗する。
あ、Windowsだとstatは失敗しないな。たぶん。 で、結果がどうなるかは処理系(ライブラリ)依存。 何故ならstatはエミュレーションしているので、 stat("c:/*", &st)が成功してしまったりする処理系があるから。
ファイルサイズというのが何を意味するかによる。 OS上でのサイズのことなら、 そもそも環境依存なので環境に用意されたAPIを好きなように使えばいい。 Cの入出力関数で読んだときのバイト数のことなら、 読めないようなものは無視してしまえばいい。 まあ、なんでファイルサイズを知りたいのかってとこまで 一回さかのぼって考えてみるのも一計。
サイズは「サイズ」以外ないだろ。 「文字数」とは違う。
昔のCP/Mはセクタ数でしか管理してなかったなぁ
>>603 今のCP/Mとやらはどう管理しているの?
>>603 最終セクタの0x1Aまでがファイルの「サイズ」だろ?
でもそれは管理されてない。
ん、「管理されているかどうか」という話なの? 「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの? だったらそれでいいけど。
あっと、 「ファイルのサイズとはOSに管理されていなければならない」という 話の流れとは関係ないことを言いたかっただけで 「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。
バイナリファイルは「0x1aまで」というルールを採用できないからセクタ単位でしかサイズを得られない。
ファイルシステムがファイルのサイズをセクタ単位でしか管理してない上に、 テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。 統一した「ファイルサイズを得る方法」なんてあるわけがない。 あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。
ファイルサイズを取得する関数が標準で用意されなかったのは、 そのあたりが理由なのかな?
>>611 そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし
ファイル操作もストリーム処理系を除くとremove()位しかない。
MS-DOS 1.0 もディレクトリないんだっけ?
汎用機もねーよ
615 :
デフォルトの名無しさん :2007/06/24(日) 22:22:42
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
そのネタ飽きた
そういや、xmodemプロトコル(無印)もファイルサイズの概念無かったな 128バイトのブロック単位だったからファイルの後ろにはゴミがついていた Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・
マックバイナリができた事情はリソースフォークの管理のためだが詳細はスレ違いにつき割愛。
リソースフォークの話は出してくるやつが出ると思った リソース/データフォークのサイズもファイルサイズの指定の意味で 書いたんだがわからなかったんだろう
>リソース/データフォークのサイズもファイルサイズの指定の意味で >書いたんだがわからなかったんだろう これ日本語なの?
まるでXMODEM対応のためにマックバイナリが作られた様な表現はどうと思う。
どうと思う! いや、どうかと思う、だorz
MFCでCString型の変数strにメタ文字の.が入っている場合\記号と連結するのに str = "\\" + str; これで全然問題ないのですが、標準のCで char str[MAX_PATH]; strcpy(str, "."); starcat("\\", str); こうするとアクセスバイオレーションが発生します どうしたらええの? strcpy(str, "\.");これでも駄目だった そうそう環境はWinXPSP-2、VC6です
>>623 starcat なる謎の関数の仕様をよーく確認しろ。
星猫
スマンstrcatだったMSDN見ても問題ないと思うのだが? 文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが
>>626 じゃぁ strcat の仕様をよーく確認しやがれこのバ
そりゃ文字列リテラルに文字列を追加しようとしたら落ちるわな。
それでもstarcatならきっとやってくれるさ
MFC 使える環境なら CString か std::string 使えば? そっちの方が幸せになれるよ。セキュリティ的にも。
>>628 ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww
>>630 だからMFCなら全然無問題なのだが、Cの事も知りたいからよ
>>626 strcatでは、後ろに追加することしか出来ないんだ。
"//"には、後ろにstrを追加する余裕なんて無い。
>>631 ならリテラル以外で問題が再現するコードを書いてみやがれ
>>631 C は面倒臭いよ。
バッファオーバーフローをいちいち気にしないといけないから。
sprintf()一回ですむことをstrcpy(), strcat()を駆使しようとするからそうなる。 しかし、やりたいことがよく判らないからサンプルを書けない。 例えばディレクトリとファイル名を連結したいだけならこうなるのだが。 sprintf(path, "%s\\%s", dir, file)
>>631 どうせ初期化してないのに strcat とかしたんじゃないのか?
元のCStringを使ったコードはこうなっていると解釈するぞ。 CString 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にしておいた。
BoehmGCのようなライブラリを使えば char *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<>使ったほうがいいよ
MFC使っているならCStringもありさ
strcpy -> strncpy strcat -> strncat sprintf -> snprintf
>>640 残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。
結局C++でstd::basic_string<>なりMFCのCStringなりを使えということになる。 何より楽だし。
バッファオーバーフロー脆弱性の話を聞くたびに、 敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。 それができないなら C++ にしる、と。
>641 C99は未だ存在しないのか・・・
C99 が使える環境では snprintf を使って、 使えない環境なら等価な関数に #define すればいいんじゃない?
snprintf()に等価な関数なんてないっしょ。環境によってはあるんだっけ?
VC++ には _snprintf がある。
char *s; FILE *fp = fopen("/dev/null", "w"); size_t len = fprintf(fp, ...); /* 長さを数えてもらう */ fclose(fp); s = malloc(len + 1); sprintf(s, ...); 勿論こんなコードを使うぐらいならapacheあたりのコードをパクるのが良いが それぐらいならやっぱりC++を使うべきという結論に
>>648 必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。
C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。
問題は移植性の低さだな 標準とはいえC99未対応のCコンパイラは多い
snprintf 程度なら、C99 に対応してない処理系でも大抵独自に用意されてるんじゃない?
>>652 あってもC99と同じ仕様とは限らん
たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか
その場合は自分でラッパ関数を定義すればいいんじゃないかな?
*BSD LIBCあたりから掻っ払って来りゃええやん。
ねぇねぇおまえらちょっと教えてくんない ファイルの行数を取得する標準関数なんてないよね そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数 数えるとかやってんの? どうよ
そうする
それ以外の方法があるなら是非とも教えてもらいたいもんだ
fp = fopen(filePath,"r");
while(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++];
こうしてもなおんないんだよねぇこれってどうよ
スマン訂正 int maxLine; 罰char szItem[7][((const int)maxLine++]; 丸char szItem[7][(const int)maxLine++];
C99じゃない限り配列の大きさはコンパイル時に固定=定数
あきらめきれなくて 回避策はないのかと聞いてみる
663 :
デフォルトの名無しさん :2007/07/05(木) 00:09:15
そこらへんの入門書に書いてある。 残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。
>>662 寧ろ、C++でstd::vector使えばいいんじゃない?
ドウシテC99ヲツカワナイノデスカ
ドウシテC99ガフキュウシテルトオモウノデスカ
C99 使うくらいなら C++ 使う
んだな
単項演算子の+って、どう言ったときに役に立つのでしょうか? Cだけの話ではないかもしれませんが。
メジャーなコンパイラでC99に対応してないのってあるの? 俺趣味グラマでgccしか使わんからわからん。
>>672 桁合わせくらいには役に立つことはあるかも。
昔、 #ifdef xx # define SYM 10 #else # define SYM #endif のような時に int num = SYM +0; というような使い方をした覚えがあるような無いような。
マクロ関連で役に立つことがたまにありそうではあるな。
正確には、式に単項演算子をつけない場合は+を省略したものとみなされる・・・じゃなかったっけ?
単項+のオペランドも式だし、 単項+のオペランドになれない式もあるだろ。
#ifdef xx # define SYM 10 #else # define SYM 0 #endif では、何故ダメだったのか教えてほしい。
学校でC言語実習やったんだがどうしてもわからないことがあったんで聞いてみる。 ○×ゲームを作るプログラムを作っていたんですが。 1〜9の数字キーでどこのマスを使うか決めるプログラムなんです。 line1[10]=" 789\n", line2[10]=" 456\n", line3[10]=" 123\n", という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが 何故Tabキー使っては駄目なのか教えていただけませんか?
>>682 書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな
いやコンパイルエラーになるんだろ。 たぶん、構文的に駄目になっているのだろうとしか言えない。 後できちんと規格書に当たってみる。 とりあえず、文字列リテラルの中でタブ文字を表現したければ、 タブを直接入力する代わりに\tを使えばいいと言っておく。
>>683 ほんとにCはかじったばっかりなんでよく分からない上に
今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`)
"と7のスペースね。
strlenって言ったら文字列の長さだよね?
Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?
>>684 指導書に基づいてプログラム作ってるんだ。
基本的に書き換え不可だからそういうことはできないんだ
>>686 ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)
環境もないのに実習なんて言うのか?
>>688 ヒント:やるのは学校今は家にいる
学校のPCは勝手に使っちゃいけないんだ。
じゃぁ学校でやれよ。ここで文句言われてもどうしようもない。
>>689 今書き込みをしているのが自分の自由に使えるPCからなら、
開発環境をインストールすることを勧める
>>691 今やってみたがページが真っ白のまま止まってしまう。
ダメみたいだ/(^o^)\
とりあえずお前はCの勉強する前にPCの勉強をしろ。
やっぱり聞くんじゃなかったかな。 もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。
そりゃあんた、初心者スレなりに行けばいいものをこんなスレに書くからだ。
寿司食いたい
基本的に書き換え不可なのに、なんでスペースをタブにしようとすんの?
スペースをタブにできるなら、スペースを\tにもできるだろう
700 :
デフォルトの名無しさん :2007/07/12(木) 10:53:19
ファイルがテキストファイルかバイナリーファイルかを Cプログラムで判定したいのだけれど、方法を教えてくれ。
>>700 ファイルの内容を1バイトずつ全て調べて、テキストファイルに通常含まれない
コードが含まれているかどうかをチェックするしかない。
ただし fopen() でバイナリモードで開くのを忘れずに。
つ[/usr/bin/file]
文字データって言ってもいくつかの体系を考慮したら・・・ヘッダとか考えてみたけど それも当てにならんか・・・っつーことで、ちゃんと拡張子を付けい。
そもそもテキストファイルとは何なのか。
SUBをファイルの終わりとして認識すべきファイルのこと。
発注元がどうしても欲しい、というのでフローチャートを書いているのですが #if を if文とフローチャート上で区別する方法はありますか? 具体的には #if defined(MODEL_xx) if (zzz) { processYYY(); } #endif ソフトは MODEL_xx が定義してあるやつとそうでないもの、両方納品します。
両方納品するんならフローチャートは2セット要るんじゃないか?
>>708 定義してあるかどうかで動作が変わる関数のみ
複数書けばいい希ガス。
if文は実行時に働くものだからフローチャートの一部だが #ifはコンパイル時に働くものだからそもそも異なる実行ファイルができるわけで よってフローチャートもその数だけ必要になる っていうかCの話かこれ?
712 :
デフォルトの名無しさん :2007/07/13(金) 16:31:31
char型のcharってcharacterの略で%nのnはnewlineの略ですよね? こういう略してある語の元の単語が載ってるサイトってないですかね? 探してもこの2つしかわからなくて
念のために言っとくが\nな 語なんてそんなに多くないから何がわからないか聞けばここで全部答えてもいいぞ(一回にまとめるなら)
714 :
デフォルトの名無しさん :2007/07/13(金) 18:17:06
\nでしたすいません stdioとhの意味 printfのprintとfの意味 scanfのscanとfの意味 int型 int double型 double %f f %c c %s s \t t 全部でこれだけなんですがお願いできますか?stdioはstandard input outputかなとも思うんですが
とおりがかりだけど、 hはheader、fはformat、intはinteger(整数)、doubuleはDouble Precision(倍精度(実数))、 %f はfloat(floating point 浮動小数点)、%c はcharacter、%sはstring、\t はTAB あとは想像通り、辞書ひいてもいいし。 まあ誰かまとめてくれるかな。
printfはprint formatted
stdioはStandard IO(InputOutput)
714は挙げていないけど、%gはe、fの次の文字だからという理由。 ANSI C言語辞典にはそう書いてある。
>>712 新ANSI C言語辞典って本にたいがい載ってるけど、それだけに買うのはもったいないしな。
俺あれもってるけど、一度も引いたことないわ manかぐぐればいいだけの話しだしな
721 :
名無し :2007/07/14(土) 05:10:14
723 :
デフォルトの名無しさん :2007/07/16(月) 03:14:46
(a+1)x^2+(b+1)x+(c+1)=0を 解くプログラムがわからない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; } ではダメみたいなんよ よくわからない、たすけておくれ
マルチすんな
elxe これなに
C99で、 for(int i = 0; i < 10; i++) /* something */ ; みたいにforの中で変数宣言できますけど、 while( int i = f() ) /* something */ ; みたいなことはできないんですね。不便。
>>727 C99だとできないんだっけ?
その書き方ができるとどこが便利なのかわからないけど
条件判定のところで変数宣言して何の意味があるんだい?
判定のたびにブチ壊しては作り直すのであろうよ おほほほ
731 :
727 :2007/07/16(月) 22:49:06
while( obj = nextObj() ) { // something } みたいなことしません?
int obj; while( obj = nextObj() ) { // something } でいいじゃんとか思ったら負け?
>>727 for文の第一節はループ開始前に一回だけ実行される。
だから for(int i=0; … は、ループ開始前に変数iを確保して0に初期化し、
ブロック(forループ)を抜けたら破棄することを意味する。
対してwhile文の条件節は、処理がループするごとに実行される。
もしここに while(int i= … と書いたとしたら、
それは処理の先頭にくるたびにiを宣言するという意味になるが、
まだその時点ではブロックを抜けていないから、
前に宣言したiは有効で、これは文法上エラーとなる。
もし while(static int= … と宣言してうまくいくとしても、
それはおそらく何の利益もない。
for(i=0;i=f();i=0){ とでも書いとけ
そんなにループ内だけで変数を使いたいなら関数にでもしてしまえばよろしい
736 :
734 :2007/07/16(月) 23:10:44
まちがったが訂正はしない わかって おねがい
{ int obj; while( obj = nextObj() ) { // something } } みたいにブロックで囲めばいいじゃん。
つーか for (int obj; obj = nextObj(); ) { // something; } でおk
はんのーした香具師らは負け組
>>733 >それは処理の先頭にくるたびにiを宣言するという意味になるが
ブロック先頭での宣言と同様に扱えばいいわけですが
規格ではそうはしなかった、ってだけの話では?
>>740 そもそもそんな話じゃない。
規格では while に書いたステートメントは値を返さないといけないが、
int i = ... のような変数の宣言は値を返さないので書けないだけの事。
>>741 > while に書いたステートメント
> 変数の宣言は値を返さない
現行の規格の話するんなら正確にな。
文法的に while の条件に文は書けない。
式だけ。そして文には値とかないから。
なんというマジレスの嵐
for (;int i = hoge();)
寿司食いたい
C++でできるんだから、C99でできるようにすることも可能だったとは思う。
どういう経緯があったかは知らないが、結果として制定されたC99では、
できるようになっていないけど。
以下チラシの裏
これは、こういうコード
Tok* ct;
if (ct = gettok()) { /* ... */ }
に対して、条件式のところで変数を宣言できれば、未初期化の変数を減らせ、
ついでに条件文内に変数の有効範囲を閉じ込められるというアイデアだった。
if (Tok* ct = gettok())
{
// ctはスコープ内
}
// ctはスコープ外
参考『C++の設計と進化』 3.11.5.2 条件文の中の宣言
C++では、C以上に初期化と代入が区別されるので、
>>737-738 のような書き換えができないこともある。
それもあって、俺はたまに使うし、C++からは無くなれと思わない。
この文でコンパイルできるんだが結果が正しくでません。 どこか誤りありますか? #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); } }
>>748 「何をやろうとしているのか、また何が正しいのかは
コードから読みやがれ」ってか。大した奴だ。
…とか思ってたら、ひと目で変な記述が。
>if( a == b == c ){
>if( a >= b >= c ){
:(略)
そんな書き方できない。
面倒でも
if (a == b && b == c) {
if (a >= b && b >= c) {
:(略)
と書かないと。
>>749 スマソ。そしてありがとう。
そうやったら、できました。
751 :
c言語初心者 :2007/07/17(火) 19:38:16
突然すいません!!学校の問題でc言語の問題が3つ出たのですがまったくわからないです。問題書き込むんで誰か解いてもらえませんか? よろしくお願いします。
OKとりあえず宿題スレ逝け。
753 :
c言語初心者 :2007/07/17(火) 19:43:22
宿題すれってあるんですか??
754 :
デフォルトの名無しさん :2007/07/17(火) 19:45:11
755 :
c言語初心者 :2007/07/17(火) 19:50:54
ここならしていただけるんですか??
756 :
デフォルトの名無しさん :2007/07/17(火) 19:53:03
ただし回答者の気が向いたら 気に入られなければスルーされる
もう立ってるね
761 :
デフォルトの名無しさん :2007/07/19(木) 01:02:10
cの入門書とポインタ攻略本を読んでほぼ理解できたんだけど次に何読めばいいかわからん 何かお勧めの参考書教えてください
アルゴリズムとデータ構造
30日でできる! OS自作入門
K&R
アルゴリズム辞典
>>761 >読んでほぼ理解できたんだけど
本当なら大したもんだけど、
>cの
も少しケースセンシティブになろうね。
ケースセンシティブにもう少しもないものだ
たしかにw まぁ、ポインタは理解したんだろう。 面倒なのはポインタよりも、ポインタの絡んだ型宣言の方だから。
えーとintの配列へのポインタを受け取って関数へのポインタへのポインタを返す関数・・・
typedef って便利だよな。
俺は、typedef void (*func)(int)っていうのを見て 何をtypedefしてんだ?と思った時期もありました。
void (*const *foo(const int (*p)[10]))(void (T::*)(int (U::*)()));
typedef様様だな
>>771 それ何をtypedefしてるの?
初めて見た
>>774 intの引数が1つで値を返さない関数を func にtypedef
例えば、、、
void foo(int);
func f = foo;
とか
なるほどー 自分に使う機会が来るかはわからんけど覚えておこう thx
777 :
デフォルトの名無しさん :2007/07/20(金) 18:12:25
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
typedef int (U::*FP1)(); typedef void (T::*FP2)(FP1); typedef void (*FP3)(FP2); const FP3* foo(const int p[][10]);
「作る」じゃなくて「操作する」だな。すまん。
そういえばどうしてローテートはないんだろ
>>777 コレ見るの、3回目か4回目くらいなんだけど、ギャグかなんかなの?
不定期テンプレ
ただの荒らし あるいは風物詩 あるいは新参の受ける洗礼
>>783 ローテートをサポートしない CPU も多いんじゃね?
知らんけど。
&a->bって&(a->b)か(&a)->bかどっち?
「演算子 順位」とかでぐぐれ
&(a->b)ですね。ありがとう。
つか、やってみりゃ分かるだろ。
その態度は良くない。 ・規格を読んで正しい挙動を把握する ・実際に処理系で実験してみる ・結果が規格と異なった場合パッチを書いてしかるべき所に送りつける(オプション)
規格読んで来て、理解して&(a->b)を常に&a->bとか書くように なる人と仕事組んだら俺泣きそうw
&a->b は普通に書くだろw
>・規格を読んで正しい挙動を把握する =「演算子 順位」とかでぐぐれ >・実際に処理系で実験してみる =つか、やってみりゃ分かるだろ。
正しい挙動を把握してから実験で確認するのと、 実験して結果を見て予想するのは、大きな違いがある。
その態度はよくない。 実験して結果を見て法則を導くスタイルが無いと。
はいはい、そうですね
実験した後に確かめた方がいい。
演算子の優先順位は、処理系依存ってことはないだろうから、実験でいいんじゃね?
規格読む→実験する→2chで煽りつつ確かめる
規格読む前に実験した方が実感しやすいな。
その通りだ。実験して、壁にぶち当たって、その壁をぶっ壊せ! フラグメンテーションエラーで、メモリーもぶっ壊せ! そして泣きながら規格読んで実感だ!
>>804 >そして泣きながら規格読んで実感だ!
お疲れ様です。
C++ だが、export は色んな意味で泣ける。
俺の胸でなけ
俺の下であがけ
実験だけじゃ優先順位なのか結合の方向なのか解らない、と。 まぁ、&a->bくらいなら、どっちでもいいけど。
&a->b が (&a)->b と見做されるんだとしたら 皆 a.b と書くと思うんだわ。
&a.bじゃないか?
終電まで仕事してて疲れてた。
>>811 はお願いだから忘れて
CD-R に保存しました
石版に刻みました
DNAに移植しました
アカシックレコードに刻まれました。
C++ の STL に感動しました C言語で STL に似たことをしたいと思ったらどうすれば良いですか?
C++に乗り換える。
やっぱりそれが確実ですよね
マクロを使う。
そういえば、templateが使えない時代にはgeneric.hってのがあったな
FILE *t=tmpfile(); で作成したtを fclose(t); してもいいですか? なんか危なくて、こわいです。
なんで危ないんだよw まあ、またその内容を使うことがあるなら閉じちゃだめだが。
ええ! fclose(t)ってやってよかったの?
C言語辞典見てみたけど、やっていいみたい。
用がなくなったら閉じないとダメだろ。常考。
tmpfile()は、そのファイルがクローズされたか、またはプログラムが終了したときに 自動的に削除されるファイルを生成し、そのストリームへのポインタを返す。 何も問題はない。
自分ならOOライクにたとえ1行で済んだとしても生成と破棄を対にして両方の関数を作る
なら別にC使わないで他のOO使えばいいじゃん。頭かたいね。
生成と破棄を対にすることがOOライクだと思うくらいならそれでもいいんじゃね?
ぷっ
>>822 面白そうなものがあるんですね
GPLじゃないところもイイ!
ただ、著作表示だけはしないといけないようですね
いや修正BSDって中のファイルに書いてるじゃん
////(main.h) #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の 両方で定義されている」と警告されます。 これはどういうことで何が悪いのでしょうか? グローバル関数を使いながら、ファイルを分割してみたいのですがどうしたらいいのでしょうか?
>>837 ////(main.cpp)
#include "main.h"
#include "move.cpp"←いらなくね?
int X; ~
840 :
837 :2007/08/05(日) 18:15:40
>>838 それを消したら、未定義の関数moveを呼び出したなどとエラーだ出ます。
>>839 掲示板に書き込む時に簡略化したら忘れてしまいました。
>>837 宣言と定義の区別をしっかりと。ヘッダには変数や関数の宣言だけ置くこと。
プロトタイプ宣言でググれ
////(main.h) #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を操作する処理) } ////
まちがった ////(main.cpp) #include "main.h" #include "move.h" int X; int main(){ move(); } ////
ね
テスト
>>843-844 俺なら、
extern int X; はmove.h側に入れて、int X; は move.cpp に入れて、
main.hは消すかな。細かいことですんませんね。
>>837 安心しなさい。あなたの方が、うちの元請けより優秀です!
ちゃんと #ifndef使うあたりが。
すいません最近c言語を習い始めたのですが、円の半径(double型)をあたえて、円周の長さと と円の面積を表示するプログラムがどうしてもできません。 どうすればよいのでしょうか?
お前さんが書いたコードを晒せ
その前に初心者スレに行け。
>>848 が出来ない可能性
・scanfで&忘れ、%dを指定している
・式中にint型とかを使っている
・まともに調べてない、読んでない
・円周の長さ、円の面積が分からない
#define PI 3
ゆとりな定義だな
#define ENSYUURITSU 3
>>848 どぞ。
double 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);
どうでもいいが円周はlな方がしっくりくる
#include <math.h> double pi = atan(1) * 4;
>857 ありがとうございます。あと家でc言語使えるようにしようと思って microsoft.net Framework version 2.0 再頒布可能パッケージ microsoft.net Framework version 2.0 SDK 日本語版 をダウンロードしたのですが友達の話によると microsoft.net Framework version 2.0 日本語版 language pack が必要らしいのですがmicrosoftの公式サイトに行っても見つからないのですが どうやったら手に入るのでしょうか? すごい初歩的な質問ですいません。
>>858 初歩的以前にスレ違いなんだが自覚あるか?
math.hインクルードするならM_PI使ったほうが早い
ここは世界レベルでの標準に関わる内容のスレです。標準的ではない手法はお断りします。
M_PIが無い最近の環境って何がある?
つ MS Visual C++
gccでもansi適合モードにするとスルーされる。
VC++は定義されてないのがデフォで、_USE_MATH_DEFINESを定義すると使えるようだね
関数から構造体を受けることはできたんですが,構造体を渡して,受け取る関数を作りたいのですが どのように記述すれば良いですか struct Initset getinfo(struct Initset *syoki2) ↑のような記述はできないですか?
それでいいです
869 :
867 :2007/08/24(金) 15:10:45
入力した自然数nの正の約数をすべて表示するプログラムを今、作っているのですが、 int main(void) { int a = 1; int n = 500; int f = n / a; while(a < n) { a += 1; } printf("%d\n",f); return 0; } 上のものは自分がわからないながらも作ったものです。 でもできませんでした。 改善点お願いします。
while(a < n) { と a += 1; の間に if (n % a == 0) { printf("%d\n", a); } とか入れてみ まあ約数なら 1/2 以上はありえないから省くとかするけどな。 入力とかはとりあえずscanfかなんかで。
>>870 まず処理の流れ自体がわかってないだろう
もう一回教科書を読み直せ
入力した自然数nの正の約数をすべて表示するプログラムを今、作っているのですが、 int main(void) { int a = 1; int n = 500; int f = n / a; while(a < n) { a += 1; } printf("%d\n",f); return 0; } 上のものは自分がわからないながらも作ったものです。 でもできませんでした。 改善点お願いします。
改善というか、まずプログラムを使わずに 正の約数を全て列挙する方法すら分かってないように思える。 プログラム以前の問題。
どういう順番での実行を予想してるんだ?
870ですが約数をすべて列挙する方法ってnまでの数ですべて割る条件式つくって それが成立するやつを表示するプログラムでよいのですか?
よくない
「nまで」がどこからnまでなのか、まら「まで」とは未満なのか以下なのか 「全て割る条件式」とは何のことなのか 本当にわかってるか?
すいません。たとえば500だったら1,2,3,4,5,6,7,8、という風に して割り切れる、割り切れないのif文を作ればよいのかと思ったのですがそれではだめですか?
>>879 そこまではいい
問題は「割り切れる」の意味がわかってるかどうかだ
自然数nの正の約数を列挙する ↓ 自然数nを割り切れる正の整数を列挙する ↓ 自然数nを割り切れる可能性のある正の整数すべてについて、 その数で本当に割り切れるかどうかを調べ、 割り切れるときはその数を画面に表示する 一応言っとくが「割り切れる」とは除算して余りが出ないことだからな
とりあえず「nをaで割り切れるならば」を意味するif文を書いてみろ
ありがとうございます。実は今もう一個悩んでいるのがあってかけ算の九九の表をつくるというプログラムをやっているのですが 自分なりにつくったのは /* 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; } なのですが表になりません。おとといから始めたばかりなのでちんぷんかんぷんです。 いろいろとすいませんがご指導をお願いします。
一 個 ず つ や れ
>883 初心者スレ逝け
>>883 printf("%d\n",a*b); → printf("%3d",a*b);
がんばれ!
>>883 処理の流れ、つまり「まずこれが起きて、次にこれが起きて……」という順番をたどりながら考えろ。
漠然と書いて走らせて出来なかったーわかんないーじゃいつまでも理解できん。
そしてここは基本的に「ある程度Cがわかってる人」が「標準C」というものについて少しつっこんだ質問をする場所だから
まずは初心者スレへ行くことをお勧めする。
>886 ありがとうございます。できました。
だって約数はその数自身も含まれるから ありえないなんて事はありえませんもん
まあ順番を問わなければもっと速いが if(!n%a){ if(n/a < a)break; printf("%d\n",a); if(n/a != a)printf("%d\n",n/a) }
!
893 :
デフォルトの名無しさん :2007/09/03(月) 18:47:21
bool a,b,c,d,e,f; とか int a,b,c,d,e,f; みたいに並べて書いた変数を一気に同じ値で初期化する書き方ってありますか? あったら教えてください。
a = b = c = d = e = f = 0;
895 :
デフォルトの名無しさん :2007/09/03(月) 18:57:51
>>893 static int a,b,c,d,e,f;
これで全部0で初期化される。
struct foo {
int a,b,c,d,e,f;
} foo = {0};
これでも全部0で初期化されるな。
まぁ、横着するなってことだ。
int a,b,c,d,e,f;a = b = c = d = e = f = 0;
それほど面白くはない
>>898 そんなので笑えるなんて君の人生楽しそうでうらやましいわ
>>893 同じ値で初期化するような変数なら同じような扱いをするんだろう
配列で宣言しろ
過疎ってますね ビットシフトでも入れてみますか?
聞くことがないならそれでよし わざわざ増やさんでいいw
ビットシフト入れたかったのに・・・
じゃビットシフト絡みで MMXの様に、4Byteの整数型を1Byte単位で飽和演算する方法を 昔どこかで見た気がするんだけど、どうやるんだっけ 0xFEFEFEFE に 各バイトに3を加算 ↓ 0xFFFFFFFF 画像処理に使おうと思ったけど思い出せない
MMX対応のプロセッサを使う。
907 :
905 :2007/09/06(木) 21:56:42
if文を任意の位置でぬけるbreakとかcontinueみたいな 命令ってないですか?
>>908 こんなイメージ?
if (...) {
...;
if (...) ifBreak;
...;
}
これくらいしか手がない気が。
if (...) {
...;
if (...) goto endIf;
...;
}
endIf:
goto
do { if(...) { } else if(...) { .... break; } } while(0) とか
俺がよく使うのは if(...){ do{ ... if(...) break; ... }while(0); }
何その隠れgoto
んな隠れgoto使うくらいなら、素直にgotoで書いた方が未だ見やすい希ガス。 そもそも、ロジックを整理すべきじゃないかとは思うが。
if (...){ ... if(!...){ ... } } でいいんじゃないの?
int i; scanf("%d",&i); while( i<1 || i>9999 ) { printf("もう一度入力してください"); scanf("%d",&i); } iに数字じゃなく、aaaaなどの文字列を入れると”もう一度入力〜”がえんえんループ表示されてしまいます。 これを防ぐにはどうしたらいいのでしょうか?
919 :
917 :2007/09/07(金) 01:23:41
>>918 その方法もどうかと思うな。
scanf()は行単位の処理じゃないのに、バッファクリアだけ行単位になってしまう。
それではどうすればいいかってのは、このスレでガイシュツです。
922 :
デフォルトの名無しさん :2007/09/07(金) 10:37:17
typedef struct _st { char ** 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; }
923 :
デフォルトの名無しさん :2007/09/07(金) 10:38:36
int 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; }
924 :
デフォルトの名無しさん :2007/09/07(金) 10:40:37
メモリの解放が上手くいきません。よろしくお願いします。 (正誤) if(pst->ppsz != NULL) { ← × if(pst[i].ppsz != NULL) { ← ○
>>923 typedef 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;
}
int 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; }
>>922-924 固定サイズなら無理にmalloc()/free()を使う必要はないと思うぞ。
typedef struct _st {
char ppsz[2][10];
} st;
でいいやん。
メモリ動的確保/解放の練習とかじゃない?
>>927
C89 の規格票ってどこかで見れない?
過去ログにURLが転がってたような。 印刷できないPDFでよければJISCのサイトで閲覧できる
JISCって過去の規格票まで見れたっけ? 現在有効のX3010:2003はC99相当だけど。
最新版以外はなかったことになるから。 ふつーはそれでも問題ないんだよ。非互換な改訂しなければ。 JIS漢字とかJIS漢字とかJIS漢字とか、あとJIS漢字とか
そうなんだよな。それにJIS漢字も追加で。
おいおい、JIS漢字を忘れちゃいないか?
規格票
無粋なヤツだな
無粋
938 :
デフォルトの名無しさん :2007/09/12(水) 03:48:23
今日学校でプロトタイプ宣言に関する問題を習ったんですが 問題:再帰関数を使って、Xのn乗を求めるプログラムを作成しなさい プロトタイプ宣言:int Power(int x,int n); 実行画面 文字列入力==>2 文字列入力==>0 値:1 文字列入力==>2 文字列入力==>3 値:8 文字列入力==>6 文字列入力==>4 値:1296 この問題だけどうしても判らなくて困っています^^; 何方かわかる方がいましたら教えてください
>>938 int 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;
}
再帰じゃないじゃん
941 :
939 :2007/09/12(水) 04:06:40
あ、再帰だったんだ、出直してくる。
942 :
939 :2007/09/12(水) 04:16:22
再帰版 int Power(int x,int n) { if(n == 0) return 1; else return x*Power(x,n-1); }
int Power(int x, int n) { if(x == 0 && n == 0) exit(1); if(n < 0) return 0; if(n == 0) return 1; return Power(x, n - 1) * x; }
static int power(int x, int n, int v) { 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);} これで末尾再帰で最適化が利いてループになるはず。
特定の範囲の整数(例えば1〜10000)だけを入力させたいのですが、 fgets()使用時に桁溢れを完全に抑止することは可能ですか? char *buf[10]; unsigned int value; while(1) { fgets(buf, 10, stdin); 〜isdigit()とかで数値のみかを判定して、atoi()でvalueに格納してbreak〜 } fprintf(stdout, "%u\n", value); こんな感じで書いてるんですが、わざと入力を10桁以上にしたときに入力バッファに残ってしまってうまくいきません。 何かイイ方法あるでしょうか?(fflush(stdin)は無しで)
946 :
945 :2007/09/13(木) 09:14:22
>>945 × char *buf[10]
○ char buf[10]
orz
>>945 fgets の後で
fscanf(stdin,"%*[0-9]");
>>947 通常の入力をした場合(桁数が少ない場合)に入力待ちにならない?
fflush(stdin)と置換可能な関数を自作するのは厳しい とはいえ、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; }
もっといい方法あるのかもしれないけど、こんなんでどうかな int 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; }
951 :
945 :2007/09/13(木) 13:55:57
scanf("%*[^\n]%*c");なんてできなかったっけ?
>>952 それだと、次の文字が\nだと[^\n]にマッチしないので、その時点でひっかかり
読み捨てることが出来ない。
scanf("%*[^\n]"); scanf("%*c");
ならおk
954 :
デフォルトの名無しさん :2007/09/15(土) 02:24:20
うーん勉強になるなあ。ここに書き込みしている人達て通算何年くらい勉強してきたんですか。 俺には凄過ぎっすよ。
955 :
デフォルトの名無しさん :2007/09/15(土) 02:26:09
名プログラマになる為に猛勉強だぜ。
ここは知ったかばっかり
知ったかな〜知ったかな〜うにゃうにゃ はれってほれってひれんら〜
SHRT_MIN >= INT_MIN && SHRT_MAX <= INT_MAX 常に成り立つと思うのですが sizeof(short) <= sizeof(int) は処理系に関係なく成り立ちますか?
はい。
ANSI C99準拠の標準ライブラリについて、詳しく説明しているサイトありませんか? 素直に本買ったほうがいいでしょうか?
っ[JIS X 3010]
963 :
961 :2007/09/18(火) 19:21:05
>>962 ありがとう。でも高いねコレ…素直に本買います。
965 :
デフォルトの名無しさん :2007/09/19(水) 15:50:54
設計(PAD)でファイルを開いて読み込んでファイルの情報を構造体に格納するのって どうやるか教えていただけませんか?
たぶんCの話じゃないと思うぞ
967 :
デフォルトの名無しさん :2007/09/19(水) 17:28:22
今C言語の勉強をしていて、ファイルの情報を構造体に格納して それをメモリに展開するってゆーのをやってまして
fread
そんなもんファイルにどういう形式でデータが記録されていて 格納する構造体はどんなものかによるとしか言えん
PADは関係あるのか?
971 :
デフォルトの名無しさん :2007/09/19(水) 17:34:18
JIS X 3010-1993 を読むと 3.4 バイト 実行環境の基本文字集合の任意の要素を保持するために十分な大きさを持つデータ記憶域の単位。 1 バイト中のビット数は,処理系定義とする。 5.2.4.2.1 CHAR_BIT ビットフィールドでない最小オブジェクト(バイト)におけるビット数 6.3.3.4 sizeof演算子の結果は,そのオペランドの(バイト数での)大きさとする。 sizeof(char) == 1 となっているのですが,ここから char 型オブジェクトのデータ記憶域での大きさは 1 バイトで 1 バイトは CHAR_BIT ビットと判断できるでしょうか?
マジっすか。バイト=8bitだと信じてました。 int型が、その処理系で一番速く処理できるビット幅、というのは聞いたことありますが・・・
973 :
967 :2007/09/19(水) 17:58:00
今PADの最中なんです。 問題としてはファイルにある社員IDと氏名を構造体に格納し、 メモリに展開するというものです
C言語の規格改定って今でも進められているんでしょうか?
>>971 そう思って構わないはず。
>>973 常に8ビットを表す単位が必要なら、オクテットを使う。
976 :
967 :2007/09/19(水) 19:03:57
文字の長さが2-10で変化するってどゆ意味ですか? そもそも文字の長さってなんですか?
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は ↓ GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は 何か気になるから変えてくれたら嬉しい
(char *)*char_list->c という式が表す値は (char *)型のポインタcが指しているデータ (char *)型のデータ のどっちなんでしょうか?
演算子の優先順位から、(char *)(*(char_list->c))
>>982 その式を見るとカッコ(キャスト)よりも*演算子のほうが優先されている
みたいなんですが、(1+2)*(3*3)のようなカッコとキャストとしてのカッコは
別物として扱われているんでしょうか?
そりゃ意味からして別物だろうが
ついでに言うと、関数呼出演算子の括弧も別物。
>>985 全部一緒くたにして考えてました。orz
最後にもう一つ、
char c = 'a';
char *pc = &c
printf("%d\n", (int)*pc);
予想では上のコードは4バイト分の整数を出力すると思ったのに、
実際にやってみたらa一つ分の97しか出力しませんでした。
これは何故なんでしょうか?
何を言ってるんだ、お前は
*(int*)pc とでもやりたかったのか?
>>986 何が言いたいか分からん。
97は2桁だろ。何が出て欲しいんだか。
>>986 charだろうがintだろうが10進数で出力したら97だろ
>>986 >4バイト分の整数
この部分を具体例をあげつつ詳細に説明してくれ
char c = 'a'; char *pc = &c; printf("%d\n", sizeof((int)*pc)); 4バイト(intの大きさ)分の整数が出力されているってのはあってるぞ
>>986 これでどうだ。
printf("%.8X\n", (unsigned int)(unsigned char)*pc);
ここにunsigned intへのキャスト演算子は不要だがサービスしておいた。
>>973 PADって構造化フローチャートみたいなやつ?
99というのはISOの年度だからANSI C99というのはおかしくないか
おかしいね。 ANSI C89 ISO C90 ISO C95(と言っていいのか) ISO C99
個人的にはC89とかC99の前にANSIとかISOとか付いてる時点でキモい。 まぁキモいだけで、だからどうしようってほどじゃないけど。
埋め
梅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。