1 :
デフォルトの名無しさん :
2009/12/15(火) 23:42:55
998で質問する度胸
#define HOGE 0x3FFFC020 だと、コンパイラ君に怒られることがあるかも?
ふう
volatile が重要で、ここは最適化するなということをコンパイラに知らせる。 メモリマップドIOや、別スレッドとの共有メモリなど。
↑ >>前スレの998 #define HOGE ((volatile unsigned int *)(0x3FFFC020)) この文の意味がわかりません。 #define HOGE 0x3FFFC020 ではだめなのでしょうか?
あ、 #define HOGE 0x3FFFC020 じゃ、それ以前に駄目だな。
>>5 は、 #define HOGE ((unsigned int *)(0x3FFFC020)) じゃダメな理由ね。
>998 >6 それはこのマクロをどう使うかによる。 キャストしているところを見ると、メモリ領域を示しているのだろうから、 ポインタとして使うだろう。 全スレでも話題になったが、int とvolatile unsigned int *では型が違うからね。 単に0x3FFFC020なら、intとして扱われる。
int* a; があったとき a=(int*)calloc(100,sizeof(int)); *a=(int*)calloc(100,sizeof(int)); a=(int)calloc(100,sizeof(int)); *a=(int)calloc(100,sizeof(int)); a=(int*)calloc(100,sizeof(int*)); *a=(int*)calloc(100,sizeof(int*)); a=(int)calloc(100,sizeof(int*)); *a=(int)calloc(100,sizeof(int*)); どれが正しいか分からない
10 :
デフォルトの名無しさん :2009/12/16(水) 00:56:00
>>9 たかが8通り
全部コンパイルして試せばいいよ
正常に処理されたものだけ正しい
どれも正常に処理されなければ、おまでの常識は崩れ去る
キャストすんなうぜえ
>10 コンパイルできるから正しい訳じゃないぞ。 *a=(int)calloc(100,sizeof(int)); *a=(int)calloc(100,sizeof(int*)); はコンパイルは正常に完了するが、その後 正しくコーディングできるとは思えない。
バグなんてコンパイルを通ったからこそあるものだろうから
>>9 int*a=calloc(100,sizeof(int));
結論:キャストなどいらぬ
シンタックス上はどれも正しい セマンティクス上では全ては正しくない
>>11 a=calloc(100,sizeof(int));
*a=calloc(100,sizeof(int));
a=calloc(100,sizeof(int*));
*a=calloc(100,sizeof(int*));
どれが正しいの?
19 :
12 :2009/12/16(水) 01:21:35
>10 追記 a=(int*)calloc(100,sizeof(int*)); もコンパイルは通るけど、間違いだろうな。 この後メモリリークや、領域破壊しないでコードが書けるなら、 そもそもこんな書き方はしない。 正しい書き方といえるのは a=(int*)calloc(100,sizeof(int)); だけかな。>11のいうようにCではキャスト不要なのだから キャストしないほうがよいスタイルだと思う。
20 :
デフォルトの名無しさん :2009/12/16(水) 01:22:09
過去にC言語の入門書2〜3冊ほど読んだがどれもキャストしてた。
>18 左辺と右辺の型を考えようね。 a=calloc(100,sizeof(int)); a=calloc(100,sizeof(int*)); は文法上はどちらも正しい。 しかし a=calloc(100,sizeof(int*));は普通は誤り。
CとC++共通に使えるライブラリにしたいならmallocの戻り値キャストは必要。 (その場合はextern "C"も必要だが。) Cだけで使うならキャストは不要。
>>11 アフォ
calloc は、void* を返す。コンパイル通るからいいなんて言うなよ!
26 :
22 :2009/12/16(水) 01:31:25
なぜa=calloc(100,sizeof(int*));が誤りかというと int *a;である場合、aが指す領域はaが指している型のサイズの整数倍の 領域が確保されなければならないから。 ポインタは指している型のサイズ分、アドレスが進むし、参照したときには 型サイズ分の領域を読むことになるから、実用上は 型Tと正の整数Nがあったときに T *a = malloc(sizeof(T) * N); となっていないと間違いと思ってよい。
>>9 ,11
まとめ
Cだけで使うなら
a=calloc(100,sizeof(int));
が正しい(Cはキャストいらない)
C++でも使いたいなら
a=(int*)calloc(100,sizeof(int));
が正しい
C#では使えない
>25 Cでは void*は関数ポインタ型以外のポインタ型の値を、キャスト無しで格納できるし、 元の型に戻したときに同じになることが保証されている。 C++ではmallocなんて使わずにnew使え。
ファー!ファー!
FAR
ポインタは入門者には難しいから覚えなくていいよ
入門者が覚えることはたくさんある。ポインタなんて一番最後にちょろっとやればいい
実際の現場でポインタなんて滅多に使わないのに入門書にはさも重要かのように扱われているのが残念でならない。
ポインタはプロ中のプロと呼べるレベルのプログラマーだけに扱える分野。 入門者はまず制御文や条件文を目を閉じてでも書けるように上達するのが先
プログラマー ・・・ グラマラスな女性モデルのうちプロフェッショナルのことの略
38 :
デフォルトの名無しさん :2009/12/16(水) 01:49:44
質問あるならじゃんじゃん書いちゃって!分かる人が答えてくれるから!
>>29 君が言ってることは正しいが、
>>9 は、void* を int* あるいは int にキャストしようとしているので、
その例には当てはまらない。int* → void* ならC++でもキャストいらない。
キャストしない場合a=calloc(100,sizeof(int)); と キャストした場合a=(int*)calloc(100,sizeof(int)); と 何か内部的なことに違いがあるの? 「キャストしなくていい」の? 「キャストしないほうがいい」の? 「キャストしてはいけない」の?
人に訊けば何でもすぐ分かると思って自分で調べようともしない 自分で調べてみて分からなかった時だけ質問しやがれ
国会図書館に保管してある文献を一通り読んでみたけど分かりませんでした
海外の文献もちゃんと調べたのか?
はい
とりあえず、コンパイルしたものを逆アセンブルしてくらべてミソ。
逆アセンブルは違法です
>>44 世界中の文献を調べて分からないようなことを知る人物などおりゃせん
スレの存在意義が消滅しました
法律で決まっているわけでもなんでもないでしょ、そんなもの。 それはそれとして、君は日本国憲法を読んでいるか。 逆アセンブルは何て書いてある。それはどういう風に書いてある、憲法に。
逆アセンブルは著作権法違反
特許侵害
逆アセンブル・逆コンパイラ・絶対ダメ
醍醐味だと思うけど
>>49 何故に憲法w
「憲法」の定義から始めようかw
最近ずっと話題になってる小沢の暴論のコピペだよ。天皇の部分を変えただけ
コピペの誤用のほうを詰るべきだろ
>>40 そろそろ本題へ。
できるコードには基本的には違いありません。
基本はキャストするです。
キャストしないとコンパイラの警告レベルを上げるとwarning が出ますが、しなくてもコンパイルはできます。
昔は今の void* の代わりにintが使われていましたが、その頃はキャストしないのが普通だったようです。
>>40 「キャストしなくていい」 ・・・ 個人の趣味レベルのプログラム
「キャストしないほうがいい」 ・・・ 学校の授業レベルのプログラム
「キャストしてはいけない」 ・・・ プログラマー
C関連のスレではキャストの話でいつも盛り上がるね
見た目が面白いよね、うん。
安全だろうが安全でなかろうが男ならどんな言語でも明示キャスト
>59 最後の文は正しいのか
可読性を重視したコーディングを心がけなさい>入門者たちよ
何が真実なのかさっぱりわからねえ
>>67 自分で調べずに人に訊くからこうなる。まず自分で調べなさい
クライアントから要求された以上のプログラムを実現する必要性は無い。余計なことは技術の無駄遣いだ。
71 :
デフォルトの名無しさん :2009/12/16(水) 02:55:34
何の話かわからないけど キャストは別にしなくていいんじゃないかな? 必要ないんならしないほうがすっきりして読みやすいよ
配列の全要素を同じ値にする関数があったと思うんですが名前を失念しました なんという名前でしたっけ? 関数名(配列,値) ってかんじだったはず
ありがとう!
関数内に宣言されるauto変数について教えてください。 staticを付けないと関数から抜けたときメモリが開放されますが以下の書き方だと 開放されないようです。なぜ開放されないのかが理解できません。 *sには見えないstaticが付いているのでしょうか? char *func(void) { char *s=malloc(20); (省略) return s; }
解放されるのは変数sに割り当てられてるメモリであって、 変数sに入ってる値じゃないから。
char *s=alloca(20); にすれば期待した動作に成るよ
ビットフィールドなるものがあるのを先日知りお試しPGを作成したのですが、ちょっとわからない箇所が。 struct tag1{ unsigned int a :1; unsigned int :2; unsigned int b :4; short id; }; struct tag2{ unsigned int b :4; short id; }; 構造体tag1、tag2ともsizeofでサイズを見てみると6でした。 なぜ6となったのでしょうか? ------------------------------------------------------------------ int型のサイズは4バイト、short型のサイズは2バイトのOS(WinXP)で実行。 VCの設定項目である構造体メンバのアライメントは1バイトに設定しています。 ------------------------------------------------------------------
ビットフィールドは悪魔だ できるなら使わない方がいい 速度も大幅に低下するし
その通りだ よくぞ言った
>>78 ビットフィールドを理解していれば何の疑問もない筈だが?
いくつになるべきだと思うんだ?
3になるとか思ったんじゃね?
78です。 ビットフィールドを知ったのが最近なので理解不足であります。 知っているのは、コロンの後ろの数値が :4 なら0x0〜0xFまでが格納出来るエリアが確保されるくらいでしょうか。 このビットエリアが明らかにtag1、tag2違うのに同じサイズになるのが理解できません(´д`)
使ってるビットだけのエリアが確保されるんじゃなくて、 unsigned intのエリアを確保してそこから、そのビットの分を使用してるだけ。
それはない
あるってw
ビットフィールドはできるだけ局在化したほうがいいとは思うが、必要なら積極的に使えばいいと思う。 一々シフトしてアンドマスクかけて取り出すなんて面倒だし間違いやすい。 # 勿論、環境依存になるのでその旨ドキュメントに明記するのは当然として。
test
>>84 が正解。
だが、マスク・アンマスク方が、結局わかりやすい。
(値の取り出し用、設定用のマクロも作る)
90 :
デフォルトの名無しさん :2009/12/16(水) 18:55:11
あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ ぬああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ PowerPCいい!!!!!!!!!!!! 割り込み処理ラク!!!!!!!!!!! ベクタとかいらねえ、まんま関数を置けばいいんじゃん!!!!!!!!!!!!!!!!!!!!!!!!! でも俺の中ではSH >>>> PowerPC だけどな!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
91 :
デフォルトの名無しさん :2009/12/16(水) 19:15:14
やっぱ割り込みコントローラを自分で持ってる奴はいいなあ!!!!! チョー気持ちいい x86みたいにメンドクセーことしないで済む ええなあ ええ ええぞ
92 :
デフォルトの名無しさん :2009/12/16(水) 19:49:49
ああもう素晴らしい カウンタもついてる SHみたいにナノセカンド単位でのカウンティングができる!!!!!!!!! すばらしい!!!!!!!!! OSのミリセカンドオーダーのスリープなんぞに頼らなくてもよい!!!!!!!!!!!! 蕎麦らしい!!!!!!!!!!
すーぱーひたちとかネーミングがダサすぎて話しにならん
はなしし?
95 :
デフォルトの名無しさん :2009/12/16(水) 21:03:00
ハードわからん奴カワイソス
91 :デフォルトの名無しさん [] :2009/12/16(水) 19:15:14 なんか91というラベルがあって デフォルトの名無しさんという配列があるように見える俺の専用ブラウザ。
ncursesを使ってプログラム作ってます。(debian&gcc) 画面(端末)の背景全体を、特定の色にしようと思ったら init_pairで指定した上でスペースで埋めないといかんのでしょうか?
98 :
デフォルトの名無しさん :2009/12/16(水) 22:02:07
*(unsigned int *)(0xAAAA) というのが示すのは int型のポインタが示す実体ですか?
>>98 アラインメントを考えないことにすれば、そのとおりでしょうね。
ハードウェアよりな言い方をすれば、アドレス 0xaaaa から始まる int 型の変数の値ですね。
謎のトリさん現る
>98 「int型のポインタ」という言葉使いからして型がわかってないぞ。 *(unsigned int *)(0xAAAA) の意味は 0xAAAAからsizeof(unsigned)分をunsignedとみたてて アクセスしている。
103 :
デフォルトの名無しさん :2009/12/16(水) 22:24:14
>>99 ありがとうございます。
>>101 ではどのようにいったらよいのですか?
unsigned int型のポインタ??
unsigned int*型の変数 まぁ別に難でもい伊田ろ。いい太古とはわ軽んだから
そうそう、ポインタっつってもメモリのどっかに記憶されてる変数だから
>>102 具体的には?
例えば、文字色を白、文字背景を青にして
なんも手を加えてない状態の端末背景が黒だと
文字のある所だけ背景が青になるんで、文字のないとこも
青色にしたいんですが。
バカの言うことに惑わされんなよ ポインタは通常の変数として規定されていない。
バカがバカと罵るスレ
>103 型名は宣言から識別子を抜いたもの。 よって int *a; の型名は「int *」日本語なら「intを指すポインタ型」だろうな。 よく「int型のポインタ」という人がいるが int *a[10]; とかよめないだろ。 この場合の型名は「int *[10]」で日本語なら「intを指すポインタの配列[要素数10]」型。 int (*a)[10]; だったら 型名は「int (*)[10]」で日本語なら「intの配[要素数10]を指すポインタ」型
C言語のプログラムをVisualC++で書いていて、そっちでは普通に動いていたのですが、 メモ帳にこぴぺしてCygWinで実行したら、 parse error before~ だとか braces around scalar initializer というようなエラーが出ます。 主に配列の宣言・初期化のあたりで発言するのですが。 何が原因なのでしょうか
データの「型」を指すってのは有り得ない事だよな。 型は変数でもメモリのアドレスでもない。
int *p=(int*)214F23BC; pは214F23BCを指しているがintは指していない。
int *p[10]は「int型の変数のアドレスを指すポインタ変数の配列[要素数10]」型 決して「intを指すポインタの配列[要素数10]」型ではないので間違えないように。
115 :
デフォルトの名無しさん :2009/12/16(水) 23:18:25
unsigned char TITLE[]="HOGE" これはどういうこと?
??
>>115 HOGEという文字列の先頭へのchar型の変数を指すポインタ変数
おいおい……
>>177 char *x="abcde"
char x[]="abcde"
の区別ができてないバカ発見
配列の初期化
入門以前のやつは来るなよww 来ても良いけど回答者の側には来るなw
アウトプットは学習効率を良くするからなあ
>>119 117と177の区別ができてない馬鹿発見
>>115 わざわざunsingedがついているところで、深読みをしてしまう。
昔は、char が unsigned のコンパイラも多かったなあ。
>>115 書く場所によって意味が変わる。
関数の外なら
unsigned char TITLE[5]={'H','O','G','E','\0'};
の糖衣構文。
また、関数の中なら
auto unsigned char TITLE[5];
TITLE[0]="HOGE"[0];TITLE[1]="HOGE"[1];
TITLE[2]="HOGE"[2];TITLE[3]="HOGE"[3];
TITLE[4]="HOGE"[4];
の糖衣構文になる。
補足すると、代入を strcpy に置き換えるコンパイラもある。
>125 関数の外も中も同じ意味だぞ。 >126 (== 125?) 代入とstrcpyは別だろ。 unsigned char TITLE[]="HOGE" は初期化であって代入ではない。 なんか昨日からポインタの知識が怪しい奴が回答側にいるな。 初級者は注意すること。 中級者は間違い探しをするとイイかも。
入門者が入門者に適当を答えるスレです。 上級者様は上級者様専用のむずかしーいスレにいって戻ってくるなよ
129 :
127 :2009/12/16(水) 23:43:58
言い忘れたけど unsigned char TITLE[]="HOGE" のunsignedはない方がよいかも。 文字列リテラルの型はconst charの配列だから。
125は、初心者が陥りやすい大きな間違いをしている。
>114 またわけのわからない読み方をするね。 宣言 int *p[10]; があるとき、pの型はint *[10] ここまでは確定。 日本語にどう変換するかは規定されていないけどね。 あなたの日本語はよくわからない。 ポインタはポインタであって、アドレスではない。 アドレスを指すポインタ変数?
127にとっては int x=100; これは初期化であって代入ではないらしい
データ型ってのはサイズを示す指針だから、指しようがねえよw
マイナスの値を取らない、取り得ないものだったら 明示的にunsignedを付けたほうがいい。 他人に読ますときは特に
>113 >int *p=(int*)214F23BC; >pは214F23BCを指しているがintは指していない。 pは214F23BCを指しているわけではない。 pの値が214F23BCであると言うだけ。 pは自分がどんな型を指しているか知っているので *が適用されたときにどうやって値を取り出せばよいかわかる。 pが指しているのがintか、charか、struct{char x; short y; long z}なのかで 値の取り出し方が変わる。
>134 >int x=100; >これは初期化であって代入ではないらしい その通りですがなにか?
int *p[10]; これは普通に使うけど、 int (*p)[10]; これって使い道ある? 使ったことないぞ。
上級者さまうぜぇ 関係ない話するなや こんなところで「入門者バーカ」って言って悦にいってないでさっさと首つって市ね。
>139 2次元配列を引数にとる変数の型。 void func(int p[10][10]); のpの型がint (*p)[10] 後は組み込みでVRAMの先頭が与えられたときに 2次元配列として扱いたいときに、この型で領域の先頭を 指したりする。
質問に答えず、質問とは無関係などうでもいい話には必死。 自分で回答する気はぜんぜんないくせに、間違った解答を見つけたとたん待ってましたとばかりにたたきにくる。 マジうぜぇわ。
すくなくとも、このスレになってからは上級じゃなきゃできないような回答はひとつもないように見える。
>>139 typedef int (*p)[10]
なら、稀によく使う
145 :
厨房 ◆hfigpiEhOM :2009/12/17(木) 00:05:38
ゲームの改造とかやりたいんですけど、C言語でできるようになりますか?
プロアクションリプレイかコードフリークでも使ってろ
このスレのローカルルール 上級者は荒らし
ハッカーになりたいならCだけじゃ無理
150 :
厨房 ◆hfigpiEhOM :2009/12/17(木) 00:10:45
>>147 >>148 ポインターがどうのとか言っていたので改造コードにはC言語の知識が必要なのかと思いました。
以前
>>138 そうなんだけどさ、セクション配置かスタックに積むかで
バイナリレベルじゃ変わってくるじゃん?てことを言いたいんじゃないかとおも
>>145 とりあえず、アセンブラだけでなく機械語も覚えろ。
改造だけなら、言語としてはこれだけの知識しか使用しない。
実は、この5つすべて(Python, Java, C/C++, Perl, LISP)を勉強しておくのがいちばんいいのです。 これらはもっとも重要なハッキング用言語だというだけでなく、 それぞれプログラミングに対してまったく違ったアプローチをしているので、どれも非常に有益な勉強となるでしょう。
154 :
厨房 ◆hfigpiEhOM :2009/12/17(木) 00:43:26
>>152 アセンブリとか難しそうですね。
せめて自分でチートコード作れるくらいになりたいです。
まったくの初心者ですか今後ともよろしくお願いします。
ちなみに以前C言語も学習していましたが、ポインタで投げました。
また1からやり直したいと思います。
これ試してみろ。違いが解るから。 #include <stdio.h> char glob[]="HOGE"; void func(int n){ static char sta[]="HOGE"; char aut[]="HOGE"; printf("d%回目\n", n); printf("global: %s\n", glob); printf("static: %s\n", sta); printf("auto: %s\n", aut); glob[1] = 'A'; sta[1] = 'A'; aut[1] = 'A'; } int main(){ func(1); func(2); return 0; }
Cに固執するアンチC++の哀れなこと
条件によって変数の型を変えるプログラムって無理? 例えば int a; scanf("%d", &a); switch (a) { case 1: int b; break; case 2: double b; break; case 3: char b; break; } こんな感じで。
C++のポジションはすでにレガシーとなっているよ。 普及してるが、FORTRAN、COBOLと同じ道を歩み始めている。
int a; scanf("%d", &a); viod b; switch (a) { case 1: int c=(int)b; break; case 2: double c=(double)b; break; case 3: char c=(char)b; break; }
>>158 通常は、必要に応じてキャストすればいい。
つか、どうしたいんだ?
>>158 無理。
たとえば、Windows の COM なら VARIANT型を使えば、なんとなくそれっぽいことができるが、入門レベルではない。
目的にもよるんだが、「共用体」を調べてみるといい。 つか、その質問だけでは何がしたいのかが伝わってこないから答えられん。
ユーザ関数に引数を渡す際に型を指定せずに処理がしたいんです。具体的には ここをintでもcharでもいけるにしたい ↓ void function(double *v1) { int i; for(i=0;i<10;i++) { //型の関係のない数値計算 P[i]=〜 } } ていうことです。
んでいろいろ考えた結果 ユーザ関数ではとりあえずvoid*型でポインタを引数を受け取って、引数の中に型のタイプの情報(上のscanfのa) を入れて、それに応じてキャストすればいけるかなと思ったわけです。 void function(void *v1,char a) { int i; switch(a) { case 1: int *P; P=(int*)v1; break; case 2: double *P; P=(double*)v1; break; case 3: char *P; P=(char*)v1; break; } for(i=0;i<10;i++) { //型の関係のない数値計算 P[i]=〜 } }
ありえないな。 設計からやり直した方がいいよ。
struct DATA { int iheight; int iweight; } この様に定義された構造体データ(idataNum件)を 身長順にダブルポインタを使ってソートをかけたいのですが、 そのダブルポインタのスワップ処理が分からず困っています・・・。 void swap( DATA** stData_ptr, int idataNum) { DATA* stSwap; for( int i = 0; i < idataNum-1; i++ ) { for( int n = i + 1; n < idataNum; n++ ) { if( (*stData_ptr + i )->iheight > (*stData_ptr + n )->iheight ) { stSwap = ( *stData_ptr + i ); ( *stData_ptr + i ) = ( *stData_ptr + n ) ; ( *stData_ptr + n ) = stSwap ; } } } } てな感じで自分なりに試行錯誤してみたのですが、どうしてもスワップ部でエラーが出てしまいます。 どうか、お力をお貸しして頂けないでしょうか?
*(ポインタ+i)
p[i]って書けばいいものをわざわざ足し算したりするからわけわからなくなってるっつーねん。 なんで変な書き方したがるかなぁ?
え?
>>168 ありがとうございます。
stSwap = *(stMyData+i);
*(stMyData+i) = *(stMyData+n);
*(stMyData+n) = stSwap;
このようにやってみたところ、一応コンパイルは通るのですが、
実行させてみるとメモリー違反っとなってしまいます・・・。
>>168 ごめんなさい。その書き方もあまり分からないので・・・・
ありとあらゆるものをキャストする この世の事実はすべてint型。 つまりint*型とint[]型とint型さえ使うことができればあらゆるプログラムの困難は解決する。
>>164 マクロで無理矢理やるというおよそ非実用的な手段がある。
#define DEFINE_FUNCTION(type) \
void function_ ## type(type *v1) \
{ \
int i; \
for(i=0;i<10;i++) \
{ \
P[i]=〜 \
} \
}
そして、こんな風に引数として使いたい型だけマクロを並べる。
DEFINE_FUNCTION(int)
DEFINE_FUNCTION(dobule)
すると、それぞれ型に応じたfunction_int、funciton_doubleって関数が出来上がる。
こんなことするくらいだったら、C++のテンプレートを使ったほうがましなんだけど、ここはCのスレだし。
テンプレートとかただのアヒルタイプだし。マジうける。 そんなものもint*型の前にはひれふすことになる。
>>165 そういうときは、union使うといい
struct hoge {
int data_type; // 0:int 1:char 2:double ...
union {
char c;
int i;
double d;
...
} u;
};
void function(void *v1,char a) { int i; for(i=0;i<10;i++) { //型に応じた数値計算 switch(a) { case 1: //((int*)v1)[i]; break; case 2: //((double*)v1)[i]; break; case 3: //((char*)v1)[i]; break; } } } こうはできないものかと妄想したが
目的がわからんのだよ。 そんなのが必要になる状況なんてありえないだろ。
型を別の引数で指定するくらいなら関数を分けるのが最善手。 そうでなけりゃ C++ で template 使え。
template利用する場合でも数値を扱うなら実数と整数では別けて特殊化するがね
漢字やひらがなでソートしたいのですが可能なのでしょうか もしできるのなら詳しくソースコードを教えてください
文字コードそのままでソートしてるんじゃねえの
辞書データと比較してだな
並べたい順に並べるだけだな。
kwsk
住所録ソフトとか見たことないの? 漢字使ってる場合とかは読みを別に入力して、その読みの順でソートするんだよ? 読みはローマ字表記のものもあればかな表記のものあるけど どちらにせよその後は普通のソートだよ
漢字に順番なんてものは無いんだから、 比較して自分が並べたい順に並べるしかないだろ。 「太郎」と「次郎」はどっちが先だ?
あいうえお順なら、次郎が先、逆順なら太郎 文字コード順なら太郎が咲き
DQNネームが流行ってる今、あいうえお順なんてふりがながふってないとムリ
太郎と書いて「ジャスティス」と読ませたり 次郎と書いて「つぐろう」と読ませたり 出生届けの読みが自由ってどうなんだろうな
>>190 読み仮名を登録しないだけかんだから「読ませ方」も自由なら「読み方」も自由
自分の好きな読み方で処理すれば良い
それでも客は無茶を言う
OPをEDより先にしたいとか、前編より後編を先にしたい場合に 読み以外の何で整列させればいいんだろ
× 前編より後編を先にしたい場合に ○ 前編を後編より先にしたい場合に
>>193 「この顧客リストを強い順にソートしてくれ」
「グー・チョキ・パーを強い順番にソートしてくれ」
テキストファイルの中身を文字コードで出力する方法ないでしょうか?
16進ダンプ?
>>201 ん〜000000とかの付属情報なしに純粋に文字コードだけ抜き出したいです。
文字コードって言ってることがわからないんだけど
テキストファイルの中身がunicodeで”あいうえお”と書かれていたら ”3042304430463048304a”と書き出されるイメージです。
意外と難しいのがセンタリング フィールドの大きさをまず測る 一文字だけなら、その中心部分、半分に割った位置にフォントの中心部分を置けばいいが 文字数が増えたときのオフセットの取り方が意外とパッと出てこないもの。 普通にやると 「堀 川 掘 ら れ た 町」 にならず、 「堀川掘 られた町」 みたいになってしまう
16進ダンプを基本にして目的のものを書けばいいだけじゃ
,. ‐''三ヾ´彡シ,=`丶、ヾ´彡シ,=`丶、シ,=`丶、,=`丶、丶、 /'".:=≡ミ_≧_尨彡三:ヽ、≧_尨彡三:ヽ、彡三:ヽ、三:ヽ、:ヽ、 //.:;:彡:f'"´‐------ ``'r=:l------ ``'r=:l-- ``'r=:l ``'r=:l 'r=:l /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉 ̄ ̄,.=、 |ミ:〉,.=、 |ミ:〉、 |ミ:〉|ミ:〉 'y=、、:f´===tr==、.___,. ==、._ゞ{=、.___,. ==、._ゞ{,. ==、._ゞ{==、._ゞ{._ゞ{ {´yヘl'′ | /⌒l′ |`Y} /⌒l′ |`Y}′ |`Y} |`Y}|`Y} ああきあきらあきらめあきらめた ゙、ゝ) `''''ツ_ _;`ー‐'゙:::::l{ノ_ _;`ー‐'゙:::::l{_;`ー‐'゙:::::l{‐'゙:::::l{゙:::::l{ そそこそこでそこで試そこで試合 . ヽ.__ ,ィnmmm、 .:::|!mmm、 .::|!m、 .::|! .::|! .::|! ,.ィ'´ト.´ ´`"`"`゙″ .::::;'`"`"`゙″ .:::;'`゙″ .:::;'″ .:::;' .:::;' イ´::ノ|::::l \ "' :::/ "' :::/' :::/ :::/ :::/ ::::::::::::|:::::l ヽ、 ..:: .:::/.、 ..:: .:::/.、 ..:: .:::/.、: .:::/.、::/.、 :::::: ::: |:::::ヽ ヽ、.......::::/..:::/!\\:/..:::/!\\::/!\\ !\\ \ ::::::::::: |::::::::ヽ ``''‐--ァt''′ |!:::ヽ:::\t''′ |!:::ヽ:::\|!:::ヽ:::\:::ヽ:::\:\ :::::::::::::|::::::::::::ヽ、 /i|iト、 |l:::::::ヽ:::::\ |l:::::::ヽ:::::\::::ヽ:::::\:ヽ:::::\:\ :::::::::::::|::::::::::::::/:ヽ、 ∧|i|i|i|〉. ||::::::::::ヽ:::::::\||::::::::::ヽ:::::::\:::ヽ:::::::\ヽ::::::\:\
改行はどうするんだろ。
>>206 16進ダンプのことあまり理解してなかったみたいなので出直してきます
それでいい
>>199 パ
/ | \
チ | グ
/ チ \
グ | チ
| \ | / |
| チ グ グ |
パ \ / グ
| パ パ チ |
| / | \ |
チ | パ
\ チ /
パ | チ
\ | /
グ
これはひどい
>>211 天才現る!
と思ったら、ソートできてねぇ!w
あらら
>>211 まず配置のルールがわからない
発想はともかくもっと根本的な部分を調整しろよ
ポインタって、バグがあるのに正常にうごくことがあるから厄介なのかね。 int *p; { int x; p=&x; } p[1]=500; こんなのでも正常にうごいてる(ようにみえる)かもしれないし。
>176 >175の方法は普通によくやる。 ていうか>165を見てはじめに思いつくのはこれ。 >178 共用体は、引数に汎用性を持たせたいフレームワーク、メッセージインターフェイス とかでよく利用する。 後はジャンプテーブルを使うために、関数のプロトタイプ宣言をそろえたいけど、 引数はいろいろあり得るような場合は、引数をvoid*にしたり共用体で渡したりする。 >179 関数のプロトタイプ宣言をそろえるのがミソなので、templateは使えない。
>217 そうだね。不具合が発生するのが、全然別の場所、タイミングだったりするのが やっかいだよね。
>>218 これだけ勘違いカキコする奴もメヅラシイな
普段何やってんだろ??
俺も
>>218 はフツーのことを言ってるだけに見える。
別におかしくは無い。
>>222-224 最後の行は何か勘違いしているように思えてならないが、
まあスレ違いだしどうでもいいや。
ようは、VBでいうVariant型を作りたいのか?
かなりダメな気がしてきた、、、
C++ならboost::anyが使えるんだけどな
変わっていないな。
なんだよこのグダグダ
え?ディグダグ?
判ってない奴が頑張りカキコ 判ってる奴は奴では一行レスのチャチャ入れるだけだからグダグダになるのは仕方がない
それじゃできない。だけど、なにがしたいか分からんので、茶々入れるしかない。
>>235 > なにがしたいか分からんので、茶々入れるしかない。
もう一度 冷静に自分の言っていることを検証したまえ。
お、おれは分かってるよ。 キャッチコピーは「戦略的穴掘りゲーム」だろ?
ほとんど全てのレスに対して間違い探しゲームが成立してしまうのがこのスレッドの凄いところ
ライアーゲームは情報弱者には辛かろうな
:: よくバイソンとかシーインクリメントとかで見るんだけど なんこれ。
アッー
int main(void) { int num = 567; num = num / 10; num = num % 10; printf( "%d\n", num ); return 0; } これを剰余演算を使わずに書きたいんですが、できますか?
dividend = quotient * divisor + remainder remainder = dividend - quotient * divisor
num % 10 を num - (num / 10) * 10 にする。
以上です。
That's all.
>240 シーインクリメントとは斬新な呼び方だね。 けどなぜCスレで聞く? もしかしてスルーが正解だったか?戦略的穴掘りに落ちちゃった?
252 :
デフォルトの名無しさん :2009/12/19(土) 08:42:08
fread()とfwrite()の意味を教えてください!
#include<stdio.h> int main(void) { int data1 , data2, total, average; printf("データ1? "); scanf("%d",&data1); printf("データ2? "); scanf("%d",&data2); total = data1 + data2; average = total / 2; printf("合計 : %d\n",total); printf("平均 : %d\n",average); return 0 ; } 何が間違っているか教えてくれないでしょうか?
最初のscanfの前の全角スペース?
>>253 何を聞きたいのか書いてないから
質問の仕方が間違ってるんじゃないの?
ディグダグ?
double average; average=total/2.0; もしかしてこれがしたいのでは無かろうか
>>257 言っておくがそれも間違いだからな
average = (double)total / 2.0;
じゃなきゃおかしなことになる
お前は何を言っているんだ
また、scanfを連続させるときは scanfが取ったバッファをクリアしてからでないとうまく取れない。 stdinから取ったら、stdinバッファをカラにしてから別のを取らないといけない scanfは対象の変数のアドレスに値を入れるのではなく stdinから取得バッファに入れてそこからアドレスに入れるのだ
malloc→freeと処理すると使っていたポインタはNULLポインタを指しますか? それともmallocで確保したときのアドレスを保持したままですか? まったく別でしょうか?
mallocで確保したときのアドレスを保持したままです NULLを指すようにしたければ自分でNULLを代入してください
ありがとうございます
いえいえ
なんかいでもfreeしてやる
ポインタをfreeとかで開放するのって メモリが有限だから? 仮にメモリ領域が無限だったらfreeしなくていいの?
駄目に決まってんだろカス
メモリが有限だからです 無限だったらしなくていいかもね
無限のメモリ領域なんて実現不可能なんだからその仮定は無意味
アドレスが足りなくなるからアウトだろ雑魚が
仮想メモリか。
俺が気に入らないもの シミカァロン(英語は発音大事)抜き ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING) if(ThisIsAPointerForMalloc == NULL) Fucking なんかムカつく 普通は if( (ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)) == NULL) だろ
一生懸命長い綴り打ち込んでるのかと思うと目頭が熱くなる
また、defineは大文字で っていう縛りもムカつく ネイティブから見ると、大文字ってのは大声で叫んでるようにしか見えない。 つまり FUCKINGOSINGXING ってのは FuckingOSingXing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! って怒りながら叫んでいるように見えるのだ。 それと自分で書いておいてなんだが is の i だけ大文字にするとすげえ不自然きわまる。
そうだねピカチュウだね
カビゴン♀って何かムラムラくるよね
例えばこんなものがあるとしよう free(void*) char *Memory_of_Love; Memory_of_Love = (char *)malloc(MemorySize512); ここで free((void *)Memory_of_Love) これも何だかなあと思う void * は別の型にキャストできても 他の型からvoid* にはできないはずである。 またvoid*は「何の型でもいい」から、そのまま渡せば何が来てもウェルカムだから キャストしても意味あらへん
誰も聞いてないから、チラシの裏にでも書いといてくれる?
ヤキソバうまかったわ 満足です
妄想上の相手とシャドーボクシングを始めたら、 林先生の出番だろw
亀田が勝ってしまったねえ
>>240 シーインクリメントインクリメントのことなら、
俺はシーイクイクって略してる
ちょっと心温まる豆知識 インクリメント・デクリメント・サクラメント・ハラスメント Cだと++って書けば自動的に値が1増えるし --って書けば自動的に値が1減るが CPUの機能として、そのようなものを持っていないものが多い。 特にRISC。 これらのCPUではアセンブラになると逆にそういうことができない。 1命令で値を増減させることが出来ないだけで、ADDなどで増やしてやればいいだけだが。 残るサクラメントとハラスメントだが、CPUには何の関係もない。 単なる語呂合わせに過ぎん。
CISC はアセンブラで書くために命令が高級なんだよな。 今はもうアセンブラで書くやつはいないから CISC はレガシーだな。
>>285 いかにもわかったような口ぶりでウソ書いてるやつってちょくちょく
見るけど、どういうつもりなのかマジで疑問。
>>286 SSE3だのSSE4だのコンパイラが上手く扱えない妙な命令が次々に増えていく現状をどう見るかね
俺の大好きなSHや、PowerPC、ARMはアセンブリ命令としてインクリメント・デクリメント命令がある。 が、いろんなところでよく使われるMIPSはそんな便利な命令はない。 むしろ、インクリメントなどの命令があるSHとかがRISC陣営では異端中の異端
SPARCのinc %regは add %reg, 1, %reg のマクロだけど 結局1命令なので実質あるのと同じ
また湧いてきたか
インクリメントするやつはちゃんとCPUさんありがとうコンパイラさんありがとうって 感謝しながら使えよ あと風呂でションベンするときはお風呂の神様ごめんなさい だ
>>279 > void * は別の型にキャストできても
> 他の型からvoid* にはできないはずである。
逆だ。
>>294 いやあってる。
char *p;
if ((p = malloc(sizeof(struct hoge))) == NULL)
とかけるのは
>>279 があっている証拠
296 :
デフォルトの名無しさん :2009/12/19(土) 19:14:04
できる/できない、で言えば間違いだろ
>>294-296 279は暗黙のキャストも知らないような
自称上級者なんだから触れんな。
>>297 あえて明示的にキャストすることでソースの可読性がうんたらかんたら
とかゴチャゴチャ言い出すぞきっと
>>279 の
>void * は別の型にキャストできても
>他の型からvoid* にはできないはずである。
>他の型からvoid* にはできないはずである。
が、まさしく「自分は初心者です」ってアピールしてるんだよな。
自分は初心者なはずである。
ポインタ変数なんてどんなものだろうが実態はただのINT型の整数なんだからキャストできないわけないじゃん。 12345678って書くか[12345678]って書くかの違いだけで。
>>301 ポインタが int という仮定は例外が多い。
>>301 ポインタは「整数型」への変換は保証されているが
「int」への変換は保証されていない。
(逆変換で戻したときに情報が失われる可能性がある)
倍数判定機を作ろうと思ったのですが、エラーが出てうまくコンパイルできません どこが間違っているのでしょうか #include<stdio.h> void baisuu(int y) { int b; for(b=2;b<=20;b++) { if(y%b) printf("%dの倍数です",b); } int main(void) { int x; printf("整数を入力してください\n小数点以下は切り捨てます\n"); scanf("%d",&x); baisuu(x); return 0; }
(無保証な)ヒント: 論理式に単項式だけを書くやり方 そう if( y % 3)とかwhile( !p )とか はかっこいい ように見えて実は 古くダサい し、下らないミスの温床 if( (y % 3) != 0)とか while( p != 0 )とか 書く癖のほうが類似書式のプログラミング言語(Javaとか) も使うようになった時を考えるといい
>>304 void baisuu(int y)にも}が足らん
とりあえず
>>306 >>307 の指摘部分を直したのですが
今度は「左辺値が必要」というエラーが出て
うまく倍数判定もできません
void baisuu(int y)
{
int b;
for(b=1;b<=20;b++)
{
if((y%b)=0)
printf("%dの倍数です\n",b);
}
}
int a,shidt; ととして ((a-shift)?(a-shift):2) の演算でおかしな挙動するので調べてみたら a-shiftがマイナスでも真と判定されてた (((a-shift)>0)?(a-shift):2) としたらちゃんと動いた 真と偽の動作を勘違いしてました
>>308 それは代入だろ。
y % b == 0
>>310 おお、ちゃんと動きました
=と==の違いを忘れてました
意外と中級車も=と==を間違えるんだよなぁ さすがに上級者はそんな間違いをする人はいなくなるが。
代入演算子 = が悪い。 どうしてこうなったのか。 おかげで等価演算子は == という悲しさ。。
比較式より代入式の方がソースコード中の出現確率が多いを思ったから代入を=にして比較を==にしたんだろ 面倒なことはできるだけしない、可能な限りシンプルにしたい、そう考えると納得がいく
五目並べの盤面評価関数ってどんなふうに作ったらいいと思う?
>>314 pascal のように代入を := にし、比較は == にすれば公平でいいかも。
317 :
デフォルトの名無しさん :2009/12/19(土) 23:02:43
pascal が嫌いな人が作った言語でか
=と==を間違えるなんて都市伝説だろ? おれはめっちゃ初心者のときしか間違えてないよ。
確かに、ほとんど間違えないんだが、コーディング規則がちゃんとしていないと、いったん間違えると発見困難になることがある。 20年前は、 char *p, *q; ... if (p = q) {...} で、この = は間違ってないというような書き方が普通に行われていた。
ソースは可能な限り短いほうがいい。 …みたいな考え方のアフォとは一緒に仕事したくないな。
>>319 それは、今は警告でるし。
>>320 そういうのは状況によるとしかいいようがない。
「冗長に書けば書くほどわかりやすい」とか思ってるやつも勘弁して欲しいし。
変数は可能な限り少ない方が良い。 繰返し回数は可能な限り少ない方が良い。
>>319 30年前の間違いだろ。
20年前は既に警告出すコンパイラが主流だし
わかりやすさを優先することが当然になっていたよ。
まあ類は友を呼ぶというから
そういう人達の間ではそれが普通だったのかもしれんがね。
>>320 そういうひとって
printfもpfとかに名前をかえて
int a;
void f(){
pf("asdf");
}
こんなことしたがるような人?
いや、それは論外すぎるだろ…
326 :
デフォルトの名無しさん :2009/12/19(土) 23:48:26
>>253 です。
質問内容はコンパイルの出来ない理由を御聞きしました。
どうやら原因は全角スペースに問題があったみたいです。
回答してくれた方ありがとうございます。
>>322 そういう考えでできたのが構造体やクラスや配列なんだろうな
int Taro_age;
int Taro_ID;
char* Taro_Name;
char* Taro_EmailAddress;
int Hanako_age;
int Hanako_ID;
・
・
・
みたいに一個一個作ってたら大変だし。
int x; int* p; p=&x; printf("%d",p); この結果が毎回違うのはなぜ? アドレス固定することはできないの?
>>328 pに格納しているxのアドレスを表示している
変数xが格納されているメモリの位置はOSが管理している
int x; int* p; p=&x; printf("%d",p); int x; int* p; p=&x; printf("%d",&x); int x; int* p; p=&x; printf("%d",*p); int x; int* p; p=&x; printf("%d",x);
332 :
319 :2009/12/20(日) 00:28:57
>>323 少々遅レスで悪いが、30年前だと、K&Rの出版年になっちゃいますね。
20年じゃなくてもう2,3年前かも知らんけど、warningがたくさん出るようになったのは ANSI-C普及と同時期だったような気がする。
前のは例が悪かったけど、少なくとも当時は、
while (!(p = p->next)) { ... }
といった書き方はごく普通だったと思うし、悪いともされてなかったと思う。
このスレでもキャストうざい派がいるように、いまだに警告無視する人はいるみたいですよ。
333 :
デフォルトの名無しさん :2009/12/20(日) 00:32:26
>>318 俺もそう思ってたが
先週 != を ! = と書いて
すっげー落ち込んだ
警告ってなんなん?問題があるならエラーにしろや
>>332 確かに、警告を出すのは比較的あたらしいコンパイラって印象がある。
そもそもこの警告って、C言語の文法に違反してるとかじゃなくて
よくある間違いだから、って理由だしね
int main()は値を返すべき
>>330 プゲラ
トーシロは黙ってろよwww
仮想メモリ。。
>309 それは可読性を考えたらこっちがよくないか? (( a > shift) ? (a-shift) : 2)
>328 そのコードで&xの値が毎回同じになることを期待してはいけない。 自分でメモリ管理するのでなければ、変数やmallocの具体的な 値については、知らなくてイイし、依存するようなコードを書くべきではない。
関数外でxを宣言してみたら
せっかくCをやるんだからメモリのことは熟知したい
初心者です。文字列のコピーについてです。 char a[10]; strcpy_s(a, "こんにちわ"); ・・・・・・・ これは正常に動きます。 a = "こんにちわ" ・・・・・・・ これはエラーになります。なぜでしょう。 a は配列の先頭アドレスです。"こんにちわ"も配列の先頭アドレスです。 a = "こんにちわ"は、アドレスをコピーするだけなので正常に動く気がしてしまうのです。 エラーメッセージは、「const char [11]' から 'char [20]' に変換できません。」です。 変換?「=」は代入を行っているわけではないのでしょうか?
344 :
343 :2009/12/20(日) 02:38:14
char a[10]; は char a[20]; にしてください。
配列の場合、変数なのは中身であって、配列を示す a 自体は変えられない。
"こんにちは"
347 :
343 :2009/12/20(日) 02:58:26
>>345 ありがとうございます。ですが難しく、頭の中で理解ができていません。
もう少し優しく教えていただけると助かるのですが・・・。
char *a; a = "こんにちわ";
エラーメッセージをよく読みませう
>>343 これを試してみ
char a[11];
a = "こんにちわ";
VBとかJavaに慣れてると、Cの配列や文字列は扱いづらいよね
最初のうちは参考書をちゃんと見た方がいいよ
a[10]が '\0' ってこと?
>>347 配列と文字列リテラルは一緒じゃないよ。
文字列リテラル"こんにちは"は、その時点でメモリのどこかに確保されてるわけじゃない。
確保されてない領域のアドレスを代入しても意味が無い。
配列がポインタに成り下がるのは"右辺"のみ。配列の内容はあくまで[20]の部分。
アドレスじゃなくて配列の内容を書き換えたいのだから、単純な代入ではできない。
char a[20] = "こんにちわ"; と char *p = "こんにちわ"; は全くの別物。
将来的に char a[20]="因習文法"; は禁止される予定 SJISとして char a[20]={ 0["一貫文法"],1["一貫文法"],2["一貫文法"],3["一貫文法"], 4["一貫文法"],5["一貫文法"],}; てな感じしか許されなくなる可能性も示唆
>>343 配列とポインタ、アドレスの理解がごちゃごちゃになってるからそうなる。
だそうです!
モンスターが勝手に穴掘って落石連鎖に巻き込まれてる雰囲気 もちろん特点加算無し
残機も無し
あと数十年後 メモリが100GB、CPUの処理速度も今の数百倍とかになったら C言語も変わるかなぁ
>>361 そりゃスタイルは多少変化するだろうけど
コンピュータの仕様が根本的に変わらない限りCに望まれる働きも変わらないはず
新しい環境に合わせたプログラミングモデルを作るのはむしろ派生言語の役目だと思う
>343 とりあえず、「配列には代入できないから」と思ってください。 正確には、配列は式の中では、「その先頭要素を指すポインタ」 として評価されるが、それは「代入できない左辺値」であるから。 ついでに(初期化付き)宣言と式では文法が別物になっている。 char a[20] = "hello"; はOK char a[20]; a = "hello"; はNG
>343 疑問の主旨とは変わるけど strcpy_sだったら、そのコードコンパイル通らないんじゃないの? CRT-Cだと思うから、こんなコードじゃね? strcpy_s(a, sizeof(a), "hello");
初期化付き宣言でややこしくなってるのだなぁ と思う
まあちょっと、誰もが一度は通る道だよな。 そして、だれもが曖昧な理解だけで通り過ぎていく箇所だわな。
>352 ちょっと説明が怪しいぞ。 Cの文法のイヤらしいところでわかりにくいのだけれどさ。 文字列リテラルの型はconst char[文字列長]で、普通は 書込不能な静的メモリ領域に置かれる。これは>343 でエラーになることとは直接関係ない。 「配列がポインタに成り下がるのは"右辺"のみ。」 はそんな感覚でよいと思うけど、正確には 「配列を評価すると代入できない左辺値となる」 char a[10]; a[0] = 1; は左辺だけど、ポインタとして評価されている。
メモリ管理は、いっぺん自分でやってみたほうがいい。 最近は大学でさえ教えないからな 俺のときはやったのに
メモリ管理って? Z80を使ったアセンブラ演習はした。 テンキーでマシン語入力して実行させるんだよな。 ステップ実行でメモリを観察しながら。
言ってみれば、自分でOSを構築するってことだな メモリ管理に留まらず、スレッディングやマネジメントも含まれる。 聞いたら、そういうの今の大学じゃやってねえっちゅう話じゃねえか なもんで、リバースエンジニアリングすらも満足に出来ないと。 それできないとウィルスのリバースエンジニアリングも出来ない=検知できない だからセキュリティ業界は人材の確保が大変だとよ
アセンブラのみでBIOSを構築したり、OS作ったり とにかくありとあらゆる既存のライブラリやミドルウェアなどを使わずに 自分で何もかも構成した。売り物には、かなわないにしろな HDDの制御やファイルシステムなども自分で考えて構成したりした。 普通大学つったらそういうことやるだろ が、今は何かねむたいことを言ってやらないと。
だから独り言なら他所でやれよ
やだやだー
char a[10]; の a の部分はラベルだとでも考えたら良い。
ツェーの仕様上、アドレスの受け渡しは 明白に誰が何に使っているか分かってないものは渡せません! っていうお約束がある。 「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」 状態である。そのソースを呼んだ感じで言えば。 「文字列は連続したアドレスに入れられるよ」って言うのは人間だから分かっているだけで、 コンピュータ内部では「まだどこにもンなもんあらへんやん」という未知の物体なのである。 それと、アドレスだけでは「どこからどこまでか」が分からないので これも単純にやりとりするわけには行かんのである。 配列は長さが明白に分かってるポインタのようなものだから、 それが分からないポインタには単純に代入できない。
___ ξ _ ヽ  ̄ ├-┤ / ̄ ̄ ̄\)〆 | | \ | ‐∩∩―┐ || |・ ・ | |│ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ┗ ^ ┛ | | | < ツェー!!! /777^l | || \ ) ̄ ̄_ノ__| lヽl|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ,―  ̄ ̄_η_|/V^ | l  ̄ ̄|_Ξ)/ | `‐―┬┘\/ | | | | 〇 | | | |__∧___| | | | ∩ | |__|_ __ ∫ ) | \ ̄ ノ `―┬‐―┬‐┘ ̄ / / / / / / ,〜^⌒\__/
byte* p=malloc(10000); free(p); これを行うと何がおこる? mallocで確保した10000個の領域が全部開放されるの?
連続したbyte10000個分の領域1つが解放される
だよね。 じゃあbyte* p=malloc(10000); ってのは悪いやりかた?
何でそう思うの? byteのサイズがいくつになるかわからんから、 sizeof (byte) * 10000 で
つ「メモリリーク」 一般的なOS上で動く寿命の短いソフトなら起こっても大した問題は起きない デーモンとかサービスみたいな起動しっぱなしのソフトや低レベルなソフトとかだと死亡
って可変にしたけりゃrealloc使えばいい
>>371 Z80 にステップ実行させる機能(内部割込み)はない。それはZ80 ではないのでは?
>>384 過去にmalloc()/realloc() したときに取得したサイズを、現在 get できればいいのですが。
やっぱりどこかに覚えとくしかないか。
Z80 のエミュレータかもしれない
疑問の全てに実用性を求めることの意味を問いたい
>>389 答えられない質問には、その質問自体が無意味であることを主張した方が
自分の優位性を保てるから
391 :
デフォルトの名無しさん :2009/12/20(日) 18:25:15
すいません。流れをぶった切って質問します。 今、10日くらいでhelloから始まり今if文とかの入門書に書いてある 関数の基礎を一回ずつコンパイルしました。 それから配列についてちょこっとやってます。 それで今 実行の引数やポインタに進んでいます。 そこで、勉強法としてそのまま先に進めていっていいのでしょうか? それとも変数や配列を極めたほうがいいでしょうか? ちなみに自分はあんまり関係ない機械関係の運用の仕事をしていてすぐに実務に使用するわけではありません。 目的は、プログラミングの勉強をしてゲームプログラムを自分で作れるようになりたいです。
>>387 内部的には持ってるだろうけど、通常の方法では無いね。
まあ最後のメンバーが可変長の構造体作って管理する手もある。
>>391 訳分からなくてもとりあえず最後までやる
同じ本を何度かやってりゃ分かるようになる
クズ本じゃなければの話だけど
まあ先に進んでも、いずれどこが理解してないのかが分かってくるんじゃね? 途中の部分を極めるって考えはどうなのかね
いいんじゃないかな。どうでも
一回だけしかコンパイルしないんじゃ、理解しないまま先に進んでないか?
>>386 ICEとかエミュとか上位互換のカスタムチップとかクロックそのものを止めるとか、
いくらでもステップ実行させる方法はある。
今は学習用だとWin上でエミュが主流だから、テンキー入力するのはちょっと前の世代か
ハンダ付けの実習も兼ねてるか。
じゃあここをこう変えたらどうなるんだ?という疑問が沸く。 ↓ ↑ コンパイル&検証orエラー このプロセスを経ずして理解できたなどと、おこがましいとは思わんかね?
⊂⌒~⊃。Д。)⊃ ピクピク
>380 まちがい。なぜわざわざ嘘を教えるの?それともマジ? C++のnew、deleteと勘違いしていないか? >379, >381 >380は間違い。 >379自体は問題ない。 ただし1000がsizeof(byte)の倍数になっていないと、 pを使うときに問題が起こるかも。>382はそのことを言っている。
401 :
デフォルトの名無しさん :2009/12/20(日) 20:43:49
setupファイルが簡単に作れるC++の統合開発環境を教えてください.net以外で
教えてくれるといいですね
質問です。コマンドラインで-Dと指定したときに条件付けしようとしています。 次のように書くと動作するのですが while(--argc > 0 && (*++argv)[0] == '-') if((*argv)[1] == 'D') debug = 1; while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D') と書くと動作しません。 2個目の条件(*++argv)[0]でargvが1進み、3個目の条件では+1されたargvが参照されると期待しているのですが、 こうはいかないのでしょうか。 ちなみに、 while(--argc > 0 && (*++argv)[0] == '-' && (*++argv)[1] == 'D') とした場合segmentation errorとなります。 また3番目の条件をargv[0][1]=='D'などと指定してもうまくいきません。 whileの条件中だけで全て条件付けることはできないのでしょうか。
>>403 目的を達するために getopt を使うとか strcmp で比較するのはどう?
3つ並べた時の短絡評価って保障されてんの?
>377 ネタにマジレスするのは、どうかと思うが、つっこんでみる。 怪しい知識をたとえ話にするから、よくわからんぞ。 知らない人は理解できないだろうから、誤解しようも無いが・・・・・・。 >明白に誰が何に使っているか分かってないものは渡せません!っていうお約束がある。 そんな約束はない。Cのポリシーは、明示的にせよ、暗黙にせよソースにかかれたものは その通り実行する、である。だからポインタにどんな値がセットされていようが、その通り動作しようとする。 >「こんにち波」っていうのは、あくまでも「まだどこにも属しておらず、アドレスともデータとも認められていない」 状態である。 リテラルはコードの中に埋め込まれている。メモリ上に置かれているからポインタも取れる。 >配列は長さが明白に分かってるポインタのようなものだから 配列とポインタは別物。
クラックするのにC言語使ってる人っているの?
>>403 最初の引数が -D じゃなかったらwhileループから抜けてしまって2個め以降の引数を見ないのでは?
>403 とりあえず while(--argc > 0 && (*++argv)[0] == '-' && (*argv)[1] == 'D') でも問題なさそうだけど。どういう動作を期待しているの? ちなみに次のように、[]演算子を使って書く方がわかりやすいと思う。 while(--argc > 0 && argv[argc][0] == '-' && argv[argc][1] == 'D')
値が0のint型変数2つどうしで引算をすると すごくでかいint型限界値の値が出ますけど これって値が0同士の変数で計算はするなということでしょうか? int table[UCHAR_MAX+1]; char *text = "nanntokakanntoka"; int shift; int i; 問題の演算: (BMWCT[(UINT)text[i]]-shift) 演算時のそれぞれの値 BMWCT[(UINT)text[i]] ==0; shift==0; iは任意
412 :
403 :2009/12/20(日) 21:35:01
>>404 getopt調べてみました。かなり便利そうですね。ありがとうございます。
>>409 それでした。この行以前に違うコマンドで認識させている部分があって、-Dは2番目の引数になっていたためでした。
こんな1種類の引数を検出する方法はそもそも汎用性がなさそうですね。
実際に使う時はcaseで場合分けなどしようと思います。
ただ条件文の評価の仕方は疑問が取れてすっきりしました。ありがとうございました。
自分で0を代入してないなら、その変数は0じゃないぞ
>>411 意味が分からないので動作するソースを貼ってちょ
415 :
403 :2009/12/20(日) 21:39:06
>>410 その方がシンプルですね。参考にします。
bool型を返す関数foo(), bar()があるとき、 foo()&&bar() と foo()&&bar() の違いを教えてください。
>>416 同じじゃね?
bool の表現が 0 1 だけじゃないかもしれないし
foo() && bar() と bar() && foo() は違うけどな。
420 :
416 :2009/12/20(日) 21:52:18
申し訳ございません。 foo()&&bar() と foo()&bar() の違いでございました。。。
>>415 ごめん解決したわ
unsigned int とint で演算やってたんだがintのみでやったら変な値でなくなった
>>421 え。それじゃ、 (unsigned int)0 - 0 が、0 にならなかったってこと?
配列はポインタじゃねえ!というのに なんで **argv と *argv[]は 同じに見てくれるのですか。コンパイラは。(倒置法)
因襲というもんです 立ち入らないで下さい。
例
UINT shift
shift==0
(UINT)text[i]==110 正常
BMWCT[(UINT)text[i]]==0 正常
(BMWCT[(UINT)text[i]]-shift)==4294967289 異常
>>423 こんな感じ
BMWCTとshiftとかをUINTにしたりintにしたりと変えてみた結果int同士だとうまくいった
UINT同士だとだめだった
>>424 配列もポインタも、アドレスを表現しているという意味で同じだから。
配列ってポインタよりも高級な構造という扱いなんでしょ?
否、シンタックスシュガーという名の因襲と 理解するのが一番。深入りしない。苦労して 覚えない。その為にコンパイラにシンタックスチェッカーが 付いているんだからさw エラーを指摘せず勝手に内部でコード作って実行しちゃう JavaScriptとかと違ってCは良心的。但し生産性が高い 言語では無くなってるけどね。
もともと場当たり的に作られた言語だし
431 :
デフォルトの名無しさん :2009/12/20(日) 23:45:31
>>427 という説明が char argv[][] という有名な落とし穴へ子羊を蹴落とす
*(hoge + i) と hoge[i] は等価。つまり配列とはアドレス演算である。 なお、後者は前者のシンタックスシュガー、C言語規格によるただの"親切"である。 i はインデックスではなく、hoge が示すアドレスからのオフセットである。 これでいいですか?
>424 「関数のプロトタイプ宣言の中では」配列とポインタは同じ。 Cでは関数に配列を渡すことはできない。 しかし使う場合は実引数として配列名を書くことが多く、それは配列の 先頭を指すポインタとして評価され、ポインタを渡していることになる。 以下の3つは全て同じ意味。 void func(int *a); void func(int a[]); void func(int a[N]);
>>397 上位互換チップはありだと思いますが、一般にICE ではどうやって実行を一命令ごとに停止させるのでしょうか?
やっぱりCPU のステップ実行割り込みを利用してそうなんですが。
色々あるけど、ROMやRAMを乗っ取って1命令後に停止させる命令を埋め込むのは、力技だなと感心したことがある
>>419 ショートカットの有無かな?&& で前の式が偽だったら、後の式は評価すらされない、という。
>427 君大間違い。配列とポインタは全く別物。 >432 「つまり配列とはアドレス演算である。」 この一文が致命的な誤り。その他の部分はあっている。 1番目のポイント 宣言と式では文法が別物になっている 2番目のポイント &, *のオペランドになったとき以外は配列名のみを書くと、 配列の先頭要素を指すポインタとして評価される。 二項演算子[]はポインタと整数型をオペランドとし以下のように定義する。 *(p + i) ≡ p[i]
>>437 オメー 何書いてあるかわかんねネーンダy
ポインタはアドレスを指している場合が多いが、アドレスはポインタではない
>>438 *(hoge + i) と hoge[i]以外で、配列とポインタで異なる事例はいくらでもあるから、
配列 == ポインタという図式は成り立たないということ。
>>437 &, *ではなくて&, sizeofだよね。
Cには実はアドレスという概念すらないぞ &変数はあくまでも整数定数値。&を省略出来るケースも 多い。それを適切なポインタにキャストするだけ そのポインタが&を指定した変数を指してくれてるかどうかは コンパイラの気分次第。あんまし曖昧だととんでもないところ を指すかも知れない。
>Cには実はアドレスという概念すらないぞ ( ゚Д゚)ハァ?
1行目を読んで、メモリアドレスを抽象化した存在だからという説明に向かうのかと思ったが、 2行目以降が残念な文章だった。
>>434 Z80のデバッガだと、止めたいアドレスをRST命令に書き換えて、デバッガを実現していた。
int a[10]; &a[2]は「アドレス」としてコンパイル時に定められる 翻って int a[10],i; &a[i]は文法上はアドレスとしては定義不能。 あくまでもコンパイラに恣意的な解釈裁量権がある。 従って「アドレス」という概念は定まっているとは言い切れないんだ な。これがw。
446 :
437 :2009/12/21(月) 01:13:37
>440 そう、*じゃなくてsizeofでした。 実はもう一つ文字列リテラルを配列の初期化子として与えたとき というものがあるのだが、これは宣言の中だからね。
慣習的解釈がされている部分もあるということですね
>>440 もとの質問
>>424 は、ポインタと配列とではどこが同じなのか(意訳)ということを聞いてるんだよ。
>445 根比べになっているけどさ、「アドレス」が無いってのは正しい。 ポインタの内部表現がどうなるべきかは定められていない。 その割には単項&がアドレス演算子だったりするのだけれど。 型T,識別子xにたいして T x; という宣言があったとき、&xがxを指すポインタを生成し、 *(&x)の評価結果がxでアリさえすればよい。 >&a[i]は文法上はアドレスとしては定義不能。 この文章の意味不明。 &a[i]は文法上何の問題もなくコンパイラも実行もできる。 ただし実行結果が保証されるのは0〜9だけ。
>445 >&a[i]は文法上はアドレスとしては定義不能。 iがゴミの値だからどこにアクセスするかわからないのだけれど、そういう意味なの? &a[i]→&(*(a + i))でiの値は不定。
452 :
451 :2009/12/21(月) 01:28:43
ごめん、舌足らずだった。 &a[i]→&(*(a + i))→a + i でiの値は不定なので、ポインタの値も不定。
*(&x)って表現は許されていいでしょうか?
はい、もちろん
>>450 &a[2]がコンパイル時定数になると書かれているように見える点については突っ込まなくていいのか?
>>427 をみて
>>437 が出てくる意味がわからん。
intとdoubleはどちらも数値と言う意味で一緒
↓
intは整数でdoubleは実数だからまったく別物!int==doubleはまったく違う!
つってるやつと同じ感じだな。
>>386 失礼、68000じゃった…。68000シリーズのどれかの石じゃった。
>>457 おじいちゃーん、免許更新の際にはに認知症のテストを受けてね
うちは8085だったなぁ
461 :
デフォルトの名無しさん :2009/12/21(月) 18:42:26
>>459 Z80 の人気はどうしてなのか?と今でも首を傾げています。
nop
>>465 そんな答えじゃったら、なんで8080互換は人気なの?
>>462 たまたま、パソコンがたくさん売れ始めた時代にZ80を採用した機種が多数派で
みんながそれで育ったから。
パソコンに限った話じゃないれけど、世の中性能とか関係なく「売れたもん勝ち」なんだよ。
472 :
デフォルトの名無しさん :2009/12/21(月) 22:06:12
構造体のメンバにポインタ配列を持つ場合どのようにメモリ確保すればいいのですか? typedef struct{ char id[ID_LEN + 1]; int *num; } HOGE; int main(void) { HOGE *hoge; if((hoge = malloc(sizeof(HOGE))= NULL){ fprintf(stderr, "Out of memory!\n"); exit(1); } if((hoge->num = malloc(sizeof(int) * 10)) == NULL){ fprintf(stderr, "Out of memory!\n"); exit(1); } ...... とやってるのですが,hoge->numの領域を確保するところで落ちます. よろしくお願いします.
>>472 if((hoge = malloc(sizeof(HOGE))= NULL){
を
if ((hoge = (HOGE *)malloc(sizeof(HOGE))) == NULL){
にしてみてくれ。
474 :
466 :2009/12/21(月) 22:29:43
>>468 スレ違いですが、
一番大きい理由は、ザイログ社がセカンドソースのライセンスを
ヒモなしでどこの企業にも売ったからでしょう。
8080は6800や6502といい勝負で、ぶっちぎりだったわけではない だが68系の後継の6809は6800と互換がなかったため、 68系はソフト資産が分散・死亡してしまった
476 :
デフォルトの名無しさん :2009/12/22(火) 00:13:42
いいじゃんx86の機械語体系が滅茶苦茶でも 速くて正確に動けばそれでいい
出て行けw
479 :
デフォルトの名無しさん :2009/12/22(火) 01:00:31
68系の衰退は80系との勝負じゃなくRISCの台頭によることだろ
68を知るようなジジイが珍答披露してるのか・・・ どんな人生送ってきたんだ
4桁の68系はOSに恵まれなかった・・・
482 :
デフォルトの名無しさん :2009/12/22(火) 01:15:25
あんなもんにOSなんか求めてなかったし、あるのを知っててスルーが当時の答えだった # ジジィ発言は気持ちわかる # 当時の俺も同じ心境だったから
灰列便利だな 配列があれば複雑な数値計算もできそう
スレタイ読め ふざけんな!
多次元配列って結局人間がわかりやすいってだけで 一次元配列とかわらん? a[100]ってやるのもa[10][10]ってやるのも確保されるメモリは一緒でしょ?
多次元配列の学習をする時、例題とかやらなかったのか
型が違う
というか、ベクトルとスカラーほど違う
489 :
デフォルトの名無しさん :2009/12/22(火) 01:49:13
4桁68に対してはOSどころかBIOSにさえ抵抗があったが BIOSの考え方自体は後のマシンとの付き合い方にSVCとはまた違った方向性を示してくれたことには違いない 当時はアセンブラ主体だったが、そこでのノウハウが後にCを始めてから**や(*)への一挙跳躍をもたらしてくれた
しつこいなあ
>>489 お前いい加減にしろよ
みんなうんざりしてんだよ
当事者ならこんなとこで想い出語らないよ 最近調べたんでしょ
入門スレでの知ったかはよくあること。上級者スレに行くほどのまともな知識は無い ただのガス抜き
せめてアセンブラスレに行けよなあ スレ違いもいい所だ
495 :
466 :2009/12/22(火) 11:58:54
C使いと8ビットCPU経験者は、かなり重なるから食い付きがいいんだろ。
クズが開き直ってんじゃねえよw
今までPerl、Javaとやってきたんだけどもうランタイムが必要な実行ファイルにはうんざり。 ネイティブの何も必要としない純粋ピュアな.exeを作りたいと思って 手頃な入門サイトでCを押さえて今Win32APIをやってるんだけど、これが中々おもしろい。 なんの仲介もなく直にWindowsとふれあってる感じがする。 今までダブルクリックで起動するjar(関連付けによっては動かなかったりする)を使ったり それをexewrapでexe化したりなんだかなぁという事ばっかりやってたのでCで普通のexeが作れて感動。 Cはポインタが難しいとよく言うけど実際やってみるとこれPerlのリファレンスじゃんって感じで飲み込めた。 他にもPerlやJavaの仕様の前身となったようなものが見受けられてあぁ、これが元ネタなんだなと思うこと多数。 なんの質問でもないけど、C言語っておもしろいですね。
そのうちmsvcrt.dllに憤ったりするのだろうか それにしてもサクサク動くから楽しいかな Perlと比べると文字列の処理が貧弱すぎてびっくりするかも知れんけどがんばってー
単なる時代錯誤だな
>>497 Win32API やってるなら
windows.h を少しずつでも見たほうが良いよ。
>>497 アセンブラおすすめ。
APIの呼び方さえ覚えておけば実行ファイルがあまりにも小さくなって感動する。
今までのWindowsアプリはなんだったんだって思う。
APIの呼び方を覚えるのが手軽なら誰もC言語なんてやらないわ。
503 :
466 :2009/12/23(水) 11:03:44
>>502 APIの呼び方は、アセンブラでも手軽だぞ。
それ以外が大変だけど。
呼び方を覚えるくらいなら手軽だぞ アセンブラはコードがいちいち長くなって書くのも読むのも非常に面倒なだけ
今どきは構造体だのローカル変数だのも使えるアセンブラもあるからな。
アセンブラでもwindowsのバージョンごとに どのDLLがあるとか無いとかから開放されないようが気がする。
またか・・・・・・・・w
>>511 > #define N 50
>
> void sort(int x[], int N)
#defineでシンボルNを定義しているので、2行後が
void sort(int x[], int 50)
と置換される。
>>512 深夜にありがとうございます!
仮引数になっていないのが原因だったってことでしょうか?
Nを小文字のnに変えてもみたのですが、今度は
report5.c : In function `sort':
report5.c : 9 : error : 'x' redeclared as different kind of symbol
report5.c : 7 : error : previous definition of 'x' was here
と出てしまいました…
ググってみるとxが衝突してるとのことですが、関数部とデータ入出力部の両方でxを使用しても問題ないはずですよね?
514 :
511 :2009/12/24(木) 02:39:11
連投すみません!
自己解決しました
どうやら7行目と9行目の両方で変数xを定義していたのが問題だったようで…
>>512 様ありがとうございました
食ったー 満足じゃー
516 :
デフォルトの名無しさん :2009/12/25(金) 10:34:07
宿題スレがあるのにスレ違いと分かっててなんで質問するんだ?あほ? このスレの方が勢いがあるから?当然のようにageてるし
大抵宿題スレも見てるから、ここにマルチすると逆効果なんだけどね
520 :
デフォルトの名無しさん :2009/12/25(金) 13:46:35
>>517 ,518,519
すみません。すれ違いでした。でも本当に急いでいて・・
みなさん、無駄にスレ使ってしまってすみませんでした。
>>520 逆効果なんだけど特別に許してあげるよ
感謝すればね
522 :
デフォルトの名無しさん :2009/12/25(金) 14:11:41
書き込めば書き込むほど、答えが返ってくる確率が下がるんだがw
524 :
デフォルトの名無しさん :2009/12/25(金) 17:01:15
sprintfのところでエラーもでず勝手にPGが終了されるんだがなんだこれ?
ソース見せてみ
すみませんうつし先のバッファサイズが足りてなかったみたいデス しかし何も出ず終了とは
バッファ足りてないとか
バッファ足りてないとか
おぉリロード…
531 :
デフォルトの名無しさん :2009/12/25(金) 18:31:07
PGが終了って、マ板ネタか?
マは常に終了してるからな^^
SEは終了してないとか
defineってどういうときにつかうん?
気持ちよくなりたいときに使う
>>534 そりゃあプログラムを変更したい時に一か所一か所変更するのは面倒でしょ
defineに限らず構造体の定義などもまとめてヘッダファイルに記述する。 あとで変更したくなったときに、ロジック側を弄らなくて済むようにしておく。 あとはデバッグスイッチとかの条件コンパイル用かな。
多用するとタコ殴り
539 :
466 :2009/12/25(金) 22:38:24
MFCは、すごいマクロ使ってるね。あれはあれでありだとは思うが。
540 :
デフォルトの名無しさん :2009/12/25(金) 23:19:37
クリスマスにKFCでも食って気が上機嫌なんだろ
気が上機嫌って何かおかしい気がしたけどよく考えたらそうでもない気がしないでもなかった
いや、おかしい。気が狂ってると書こうとして それはあんまりだと思って、上機嫌に変えた、つもりだったのです。
>>537 defineも構造体定義も、ヘッダファイルに書く場合は複数のソースファイルに公開する必要がある場合。
ひとつのソースファイルだけで使用するなら、そのソースファイルで定義するのが基本。
>>530 あたまわるいなぁ、とか言われなかったんだな
>>539 MFCのマクロは、Cプリプロセッサの究極をいってるな。
いっちゃってるけど。
誰かMFCのマクロを見せてくれ
Boost.Preprocessor はもう天才的。 プリプロセッサメタプログラミングだぜ? 本当にやりやがった・・・的な衝撃が走る。
×天才的 ○病的
メタプロ見てるとなんかもう新しい使いやすい言語でもつくりゃいいのにって思う
552 :
デフォルトの名無しさん :2009/12/26(土) 19:00:45
思うね
すいません。 feofというのは一体何の略なんでしょうか?
File EOF だと思うよ EOF は End Of File 細かいことはキニシナイ
>>553 eof = End Of File
FILE *fp を取り扱う関数は、一般に fopen(), fclose(), fseek() のように頭に f がつくので、
f + End Of File = feof()
本当のところは知らないのですけど。
556 :
553 :2009/12/26(土) 19:26:58
略称の語源じゃなくて用途を調べてたのかよw
whileとSleepを使わずに 変数の値が変更されたときに自動で関数に飛ぶことって出来ないんですか? atexit()みたいな感じに
atexitは自動じゃないよ
561 :
デフォルトの名無しさん :2009/12/26(土) 23:09:56
if ((flag & BIT1) && (flag & BIT2)) { これをもう少しスマートにやる方法ないですか?
コンパイラに最適化してもらいたい気分だ
すいません。
http://codepad.org/3p4Q55et 本に書いてある内容を要約するとこんな感じになるんですが、
( !feof( stdin) )
というのは一体何を表しているのでしょうか。
stdinの中身がEOFにならなかったら〜という風に読めるのですが、
stdinとはcfPtrを指しているのでしょうか?
stdinでググると標準入力だというようなことが出てくるのですが、
標準にそのままキーボードから打たれたものがEOFになったら〜という意味でいいのでしょうか?
>>563 戻り値
feof は,指定したストリーム上の最後の入力操作でファイル終了標識が
検出されると 0 以外の値を返し,ファイル終了標識に達しなければ 0 を返します。
とあるから、標準入力からWindowsならCTRL+Z、Unix系ならCtrl+Dが押される
と !演算子によって条件が反転し真になる
>>563 そうだよ。
ソースに書いてある通り、ctrl-zでEOFが入力される。
>>561 それぞれ1bitなら
if ((flag & (BIT1|BIT2)) == (BIT1|BIT2))
>>564 >>566 標準にキーボードから入力していてEOFが検出されなかった場合〜という意味ですね。
ありがとうございました。
キーボードとはかぎらないしCtrl-Zともかぎらないがな
>>570 C言語にはストリームという概念がある。
ここに結び付けられるものは何でも良い。ファイルでも入出力デバイスでもC言語から見れば一緒。
ただ、一般的なPCではディスプレイ、キーボードが付いてるので"デフォルト(標準)"をそこにしてあるだけ。
標準入力がシリアル通信ポートだったり、標準出力がファイルだったりする環境もあるってこと。
>>558 あきらめてアクセサメソッドを介して変数を参照するようにしてはいかがでしょうか。
DOSやWindowsならCtrl+ZだがUNIX系ならCtrl+Dだったかな
何でもいいわけじゃない 何が割り当てられてるかだ
>>567 &&がなくなるから、速くはなりそうな気もするけど、
最適化でチャラになるかもしれないし、読みやすさなら
元のコードのほうがいいと思う。
main(){ char hello[] = {'h', 'e','l','l','o'}; puts(hello); } 結果がおかしくなります
char hello[] = {'h', 'e','l','l','o'}; じゃなくて char hello[] = {'h', 'e','l','l','o','\0'};
>>581 ありがとう、期待する動作になりました。
もしくは char hello[] = "hello";
>>578 例えばBIT1が ((1<<0)|(1<<1)) だった場合
flagの下位2bitがそれぞれ 01,10,11 のどれであっても
(flag & BIT1) は非0になるが
(flag & BIT1) == BIT1 となるのは、11の場合のみ。
>>579 普通は"(BIT1|BIT2)"をそのまま使うなんてやり方しないよ。
const mask = BIT1 | BIT2; // constじゃなくてdefineだろうがenumだろうが構わんが。
if ((flag & mask) == mask)
これを可読性が悪いとか言うならどうかしてる。
元の
>if ((flag & BIT1) && (flag & BIT2)) {
よりわかりやすいだろうに。
どっちも特に難解な記述だとは思わないけどさ (1) if ((flag & mask) == mask) (2) if ((flag & BIT1) && (flag & BIT2)) どうみても(2)の方が分かりやすい
うーん、どうだろう 個人的には識別子が1個少ない分、(1)の方が読みやすい
ビット演算には三項演算子を使うべきだと思う
>>585 どうみても(2)の方が分かりやすいよね!
(1) auto hoge_mask=BIT1|BIT2|BIT3|BIT4|BIT5|BIT6|BIT7|BIT8|BIT9;
if((flag&hoge_mask)==hoge_mask)
(2) if((flag&BIT1) && (flag&BIT2) && (flag&BIT3) && (flag&BIT4) && (flag&BIT5) && (flag&BIT6) && (flag&BIT7) && (flag&BIT8) && (flag&BIT9))
mask)==mask 部分が冗長に見えるから違和感感じるんDA !^(flag|^mask) // こうだな
>>589 ドモルガン使ってこう書いた方が見た目は奇麗。
!(~flag&mask)
まぁ~maskは定数になるだろうから
>>589 と計算量は殆ど同じだろうけど
ビットビットうるせーよ
>>591 禿同
可読性云々以前にコメントつければすむ問題
今の時代、ビットフラグなんて使わないでフラグごとに変数使うんじゃねーの?
>>593 時代は関係ないし、それいうならC使う事自体がどうなんだって話に。
移植性考えないならビットフィールドでもいいかも知れん。
>>594 ただのフラグならビットフィールドでも移植性は関係無いだろ。
移植性考えるなら、ビットフィールドのほうがいい。
やりたいことが フラグAが立つ、かつ、フラグBが立つ なのか ビットAとビットBの両方がセットされてる なのかで使いわけろよ フラグの実装がビットだからビット演算使うのは短絡的
移植性考えるならドトネトのほうがいい
上位ビット/下位ビットのどっちから割り振られるかが処理系次第な ビットフィールド使うくらいなら、_Bool 使えばいいのに。
ビットフィールド云々は置いといて、 ビット演算についてだけ言えば if (value & 0x0001) 奇数かどうか、を見るこれだけでも ビット演算はコメントを必ず入れるべきと思う。
>>599 > 上位ビット/下位ビットのどっちから割り振られるかが処理系次第な
どんなもん、どっちでもいいだろ。
思わない
ビットビットうるせーよ
思う気がする
コメントよりマクロの方がいいだろ if(IS_ODD(value))
♪ひ〜とびと〜のビットビット〜
607 :
デフォルトの名無しさん :2009/12/28(月) 14:40:05
ビット命
>>602 どっちでもいいだろ。
問題になるのはハードにマップされてるとかそういう時だけで、フラグで使ってるだけならメモリの配置は関係ない。
どっちでもいいね
いいんじゃないかな。どっちでも
1bit毎のビットフィールドならエンディアンの影響は受けないでしょ。
ビットビットうるせーよ
Cのスレだから仕方ないだろjk
ある整数の最上位の1であるビットが何桁目かを計算したいんだけど一発で計算剃る方法ってある? ビット数分だけ判定繰り返すしかないかな
あっぱれビット天国〜
>>614 どんな方法があるのか教えてくれたら教えるお(´・ω・`)クフゥ
一発じゃないけど 最上位ビットの位置が記された256個のテーブルを使う
log をとるとかw
人間の性能を表現するには何ビットあればいいですか?
冬休みか
どうしたの?君たち 警戒心起たせちゃって
>>614 32bit なら 5回
下の関数みたいなのをマクロで作ればおk
int leftbit(unsigned long x)
{
int bit=0;
if(x&0xffff0000) bit+=16,x>>=16;
if(x&0xff00) bit+=8,x>>=8;
if(x&0xf0) bit+=4,x>>=4;
if(x&0xc) bit+=2,x>>=2;
if(x&0x2) bit+=1,x>>=1;
return bit;
}
みんなが笑ってる お日様も笑ってる るーるるるるっるー 今日もいいテンキー だからどうしたというのですか。 っていうか何故テンキーが重要なのですか。
ループしたらええやん for(bit=0; result != 1; bit << 1){ result = (BITCHECK & bit); }
最上位か ほな逆にMSBから
result = (int)ceil(log((double)x) / log(2.0)); 実数演算だけど、logで計算したほうが、条件分岐が入るより速いんじゃないか?
こういうときに、キャリーフラグの便利さを思い出す。
実数は誤差が入るからダメ
誰か超高速なreplace関数作ってけろ
>>633 なんで誤差とは関係ないの?
浮動小数点演算である以上、誤差はあるはず
誤差が1未満だから ceil()で消えるってこと?
>>629 ceil じゃなくて floor じゃないの?
>>635 そう。
整数部にまで及ぶような誤差がでないと結果に誤差が反映しない。
はるか下のほうの桁にしか、誤差はでないと思われ。
よくみたら、切り上げだと桁が繰り上がるところで正しい結果がでないね。
+1してfloor()だ。
#define mx(a,x,m,b) ((x)&m>(x)~m?(x)&=m,(a)|b:(x)&=~m,(a)) mx(mx(mx(mx(mx(a,x,0xaaaaaaaa,1),x,0xcccccccc,2),x,0xf0f0f0f0,4),x,0xff00ff00,8),x,0xffff0000,16);
>629 浮動小数点数使うんなら frexp(x, &result) でいいじゃん。
logって中の人がフーリエ展開とかしてるからおそいのかね?
>>637 を推考し直してみました
#define mx(b,m,x,a) (x&m>x&~m)?(a)|b,(a))
=mx(1,0x55555555,x,mx(2,0xaaaaaaaa,x,mx(4,0xf0f0f0f0,x,mx(8,0xff00ff00,x,mx(16,0xffff0000,x,0)))));
expは兎も角logは余り使われないから金がかかっておらず相対的に 「計算」が早くは無い。CPUレベルのサポートで 並列化を促進すれば何倍も速くなる筈だが、コストパフォーマンス が低くやる価値が少ないと判断されてるだけ。
さすがに6秒も差が出来ると主任も「ウーム」と改善を要求してくるレベル
>>644 「試行回数を減らせば早くなりますよ!」
>>644 回数が少なければ「わかりやすい」コードがお勧め
え?一番早い方法を模索してるんじゃないの?
ウチの上司は元組み込み屋なので 「呼んだ関数が処理してる時間は極力短く」 「呼んだ関数だけじゃなく処理時間そのものも極力短く」 「デッドラインを設ける」 とまあ常に組み込み状態 すべての処理コードが割り込みの考え方で動いてる (他の誰も入って来れない時間を短く=CPU占有の時間を短く)
>>641 底の変換してからFYL2X使ってるみたい
二回計算しないといけないから遅いのかもね
つーかあれか logは底がネイピア数だからそのままFYL2Xでいいのか その周囲の面倒臭いコードはDOMAIN ERRORとかチェックしてるだけか そうなるとlog10ならもっと遅いだろうね
>>648 昔組み込みやってた
小さいものはパズルみたいで楽しかったけど
大きなものだと死にそうになるんだよな・・・・
653 :
デフォルトの名無しさん :2009/12/30(水) 23:12:36
n分置きに何かを処理する ってのはどうすればいいの? Sleepだと遅れることあるんでしょ?
>>653 ズレが積算しなければ多少ズレてもいいの?
真っ当なやり方、ぜひやるべき方法としては CPUのクロックパルスをカウントする方法がある。 OSのタスクスリープ類は、オーダーが不足する。いいとこミリセカンド単位だろ これは十分ではない!(直訳した英文ふうに) CPUのクロックパルスならナノセカンド単位で管理できる。
こういうとき、SHシリーズとかPowerPCのようにタイマユニットを持ってるCPUはラクできるんだ 分周率決めて初期値入れてカウントダウンして それがアンダーフローしたと同時に割り込みを入れてくれる。 割り込みが来たらベクタを参照して然るべき関数を呼び出すだけ。 PowerPCならベクタもいらねえ まんま関数を置くだけ このカウントはタスク外、OSの関知外、CPUの処理外だから 実行速度に何の影響も及ぼさずいくらでもタイマー処理ができる。 これを一回味わうとOSのタスクスリープに頼りたくなくなる。 んでx86系統で苦労する。
>>653 遅れることが本当に許されないなら、リアルタイムOSを使うしかない。
自分は、経験ない。
その手のタイマは、カーネルとかドライバが使うもので、 アプリが使うものじゃない。 複数のプロセスから同時に使えないだろう?
OSや言語命令に丸投げするのが一番ラクだが、「実行環境の気分次第」を受け入れなければならない。 本当にシビアにデッドラインが決まっているならハードウェアをお友達にならなければならない。 いくつも同時にカウントできるのはSHでさえ3つまでだが 本当に遅れが許されないものに絞って使えばよい
660 :
デフォルトの名無しさん :2009/12/30(水) 23:48:31
>>653 許される誤差の範囲は具体的にどのくらい?
nanosleep使えるんだっけか?
sleep()なんて秒単位でしか指定できないんだから、 0.5秒でも後れたら大問題とか、そういうところでは そもそも使われないだろ。
POSIXで使えそうなものはclock_nanosleepとかだけど 本当に使用できるのかどうか誰も知らない。 ドライバ書いたこともないしマルチタスクを意識したアプリも書いた事がないから。
普通の Unix、Windows なら何使っても遅れる可能性を0にはできない。
てなると、設計の問題になる。 格闘ゲームのように「1ピコセカンドだって遅れたら勝てねえ!」ちゅう ウメハラのようなもんをメインターゲットに据えている格闘ゲームなら 本格的にCPUた、割り込みコントローラと付き合わないといかぬわい
36協定みたいに、 「一時トリプルボギーでも後でアルバトロス出せば差し引きチャラHEAD-CHARAであって胸がパチパチするほど騒ぐ元気玉」 みたいなシステムなら、スリープ時間を動的に増減したらいい。 「1フェムトセカンドでも遅れたら死!後からのリカバリは認めない」 ってシステムなら、ハードウェアとフレンドになる。 特段遅れてもどーってことないシステムでもハードウェアと友達になっておいて損はないのだが。
668 :
デフォルトの名無しさん :2009/12/31(木) 12:45:11
フェムト秒ってペタヘルツの世界だぞ? 具体的にどんな「ハードウエア」君と友達になれって?
相対論とも友達にならないとな
ですね
そういやニュースサイトで 現金を盗んだ が 元気を盗んだ になってたときがあった
ボケが進行してますね
演算子とは何か 3+4の+が演算子 10==5+5の==も演算子 int* p=&x; *p=7; の*も演算子 なんかよくわからんけど特殊な意味をもった記号を演算子っていうのか?
何かに作用するもの
複数の項を入力として新しい結果を作り出す記号
1〜10文字の間で書き込まれた文字を8けたの数字にする方法おしえて
1〜10文字の間で書き込まれた文字を8けたの数字にすればいいよ
>>677 それは10進数で入力された文字列を数値に変換するってこと?
10桁入力されたときは、どうすればいいんだろう。
680 :
677 :2010/01/01(金) 22:39:47
>>679 半角英数で適当に打ち込まれた1〜10文字を手っ取り早く8ケタの数字にしたいんだ
>>680 「1234567890」って10桁打ち込まれたら、8桁の数字にならないんだけど
どうすんの?
682 :
677 :2010/01/01(金) 22:47:43
>>681 そういうことでしたか・・・
8ケタじゃなくて10ケタでおねがいします!
atoi() じゃダメなの貝?
ひょっとして「0〜9の文字を入力されたら」という意味かと思ったが、 それだと「10文字」ってのがナゾになるな だれかキバヤシ呼んできてくれ
>>677 crypt とか md5 計算して頭のほうだけ使えばいいんじゃね?
>>682 少しわかってきたが、わざわざ「英数」とか「文字」って言ってるのだから、
「0〜9」以外の文字も入力される可能性があるって意味だよな?
>>682 #include <stdio.h>
int main()
{
char s[20];
int n;
fgets(s, 10, stdin);
n = atoi(s);
printf("%d\n", n);
return 0;
}
688 :
677 :2010/01/01(金) 22:58:47
ほらできた #include<stdio.h> unsigned long str2num(const unsigned char *str) { unsigned long value=0x22360679; for(;*str;str++) value=value*(9012583+*str)+3003779; return value%100000000; } int main(void) { printf("%08lu\n", str2num("hello")); printf("%08lu\n", str2num("hello!")); printf("%08lu\n", str2num("Hello")); return 0; }
restrict 修飾子とやらの存在を知りました。 みなさんrestrict は現実のプログラムで使っていますか?
>>690 付け忘れて困ったためしがないからなあ。
693 :
デフォルトの名無しさん :2010/01/02(土) 00:11:10
fopenを読み書き両方で使って fprintf使うと上書きじゃなくて追加書き込みになるけど 上書きで使うにはどうすれば良いの?
>>693 "r+b" で開いて fseek で移動
ありがとう
実行したときにコマンドプロンプト上でなくて普通のウィンドウに表示させるにはどうしたら良いんですか
printf("printf");
winで一番使えるコンパイラはMinGWってやつなの?
atoi atol 頼むから「アトイ」だの「アトル」だの言うな! どこのラノベ主人公やねん
プログラムってのはだ 常にストールなく流れているもんちゃうで たまにはキャッシュミスしたり分岐予測が外れてしまうことも あるんやで
704 :
デフォルトの名無しさん :2010/01/02(土) 19:11:16
ミンジーダボユーは ライセンスとか特に気をつけないと 民事ー訴訟沙汰になる
>>705 MinGW?
Cygwinよりもってこと?
ライブラリの一部がGPLだったと思う。
民事ーW
>>703 GUIアプリが作れないのか?
それともVCとか方が作りやすいって意味?
GUIってのはコンパイラあんまり関係ない。 「windows.hがあって」 「Windowsのプログラミング作法を知っていれば」 できるものだから、特にコンパイラを問うものでない。 コンパイラよりも「何をどうすればWindows上やLinux上でGUIが出るのか」 を、プログラマ自身が知らないと話にならんのだ
ウィンドウを出すだけならそこらのサイトに載ってるようなコードを書くだけだが プログラミング作法をしらないと 「ウィンドウの中身が更新されない」 「消えない」 「メッセージが送られない」 とか、まるでGUIの意味がないことになるから まず作法を知るほうが早い。
712 :
デフォルトの名無しさん :2010/01/03(日) 05:02:01
みなさんが、Cの仕様を把握して後、初めて作った本格的なプログラムって何でしたか? 参考にしたいので、教えてください><
まず君の言う「本格的」の定義をしてくれ。
714 :
696 :2010/01/03(日) 08:30:38
715 :
デフォルトの名無しさん :2010/01/03(日) 09:50:12
>>713 そうですねー、確かに「本格的」って何だかよく分りませんね
無理して定義すれば、ゲームであればオセロとか、仕事なら初めて1から書き上げたルーチンとか、
自分のPCを便利にする為にユーティリティ作ったとかとか、
頭の中の知識、実際にプログラミングで使った機会と、いったイメージです
あるいは、このオープンソースのコードをみっちり読んだ、とかでも結構です
716 :
706 :2010/01/03(日) 09:57:36
>706 Cygwin はランタイムである cygwin1.dll 自体が(オープンソースなものに対する例外条項付き)GPLだから、 Cygwin 使う時点でバイナリ配布するなら(GPLである必要性はないが)オープンソースライセンスにせざるを得ない。 MinGW はランタイムそのものは Public Domain なんで問題ないけどライブラリを使う場合はそれぞれの ライセンスに従う必要がある(これは Cygwin でも同じ)。
int foo(); って関数の中で int a; が変更されるとき if( foo() && a ){ ... } って書くのアリなの? 普通書かないだろうけど、言語的にどうなのよ
>>718 論理演算氏は左から評価されるから、大丈夫なんじゃね?
インタプリタとコンパイルは違う!って言いますが Cでもコードの位置を変えると動作が変わるということは インタプリタと同じじゃないんですか。
別にインタプリタとコンパイルが同じと考えようが違うと考えようがどっちでもいいよ。 ただインタプリタは一行一行機械語に翻訳していくのに対しコンパイラはビルドしてexeにして 一気にやっちゃうだけの違いでしかない。 そんなもん知らなくても何の支障もでない。
最近はjitだしね
>>721 のコンパイラとインタプリタの基準が知りたい。
>>718 int a はどこで宣言されていますか? int a がfoo() のなかだと意味がない。
>>721 インタープリタは単独で実行可能なファイル(実行ファイル)を出力しない。
strcpyみたいな文字列関連の関数は コピー先を参照渡しじゃなくて戻り値として取得することは出来ないの?
>>724 グローバルです。
正確には、関数ポインタなんですが
int f1() { return 0; }
int f2() { return 1; }
int (*a)() = f1;
int f() { a = f2; return 1; }
int main() {
if( f() && a() ) { // ← これ
....
}
}
&& や || が左からってのは知ってて a() が後から実行されるのは
わかるんですが a の値そのものも後から評価されるのかなぁと
不安になりました
LSI C-86 は16bitのコンパイラじゃないか 別のにしなさい
Windows.hがそもそも含まれてないはず。 別のコンパイラを使いましょう。
有り難うございます
>>727 char *strcpy(s, ct) の戻り値は s だが、それでは不満?
とすれば、C 言語には文字列型はないので、それは不可能。
というか、C 言語の malloc()/free() について経験と考察が必要と思われます。
strcpy が文字列を戻り値として返してきたとして、それを解放するのは誰?
>>728 この例では f() は 0 を返すので、 a() 、正確には (*a)() は実行されません。
>>734 失礼、f() は1を返すんですね。とすれば a() は実行されますね。
>>734 f() は return 1; だぜよ。手持ちの VC6 では if の中実行される。
ところで話違うけど a() って (*a)() って書くのが正しいの?
>>736 ご指摘ありがとうございます。
で、a は関数のポインタだから、(*a) と書いて呼び出しますね。a だけでもいいんですけれども。
738 :
706 :2010/01/03(日) 18:12:14
>>717 なるほど。丁寧にどうもありがとう。
それをヒントに探してみたら、
MinGW について頻繁に尋ねられる質問と回答(MinGW FAQ)
ttp://www.sixnine.net/cygwin/translation/mingw-doc/mingwfaq.html > MinGW とは何ですか?
> (中略)
> MinGW は Windows オペレーティングシステムと共に配布されている
> Microsoft のランタイムライブラリを利用します。
> Windows に対して移植された他の GCC とは異なり、
> このランタイムライブラリは
> GNU 一般公有使用許諾契約書の元では配布されていません。
> 従って、あなたのプログラムと共にあなたのソースコードも配布する必要はありません。
> 勿論、あなたのプログラムが GPL のライブラリを利用していない限りですが…
こんなんが見つかった。
ってことは、
色々聞いて申し訳ないんですけれども、
MinGW上で
PublicDomainのライブラリX
標準Cライブラリ
標準C++ライブラリ
を使って全部staticリンクしてクローズドソースな実行ファイル.exeを一般に配布する
ということは可能だと解釈してよろしいです?
>>727 環境によっちゃstrdupがあったりするけど、コピー先決められないのって不便じゃね?
今だと、ローカルルールでstr系の関数を使用禁止にしてたりしない?
>>740 なぜに、というか strncpy() 推奨ってことかも。
>>742 しかしstrncpyもstr系には入らないのか?
>>739 strdup() にしても使用後にはちゃんと解放しなければならないし。
strncpyって罠が多すぎるうえに非効率極まりないゴミという印象しかない
>>746 場合によっては '\0' をつけないときがあるのがややこしいですね。
もっとゴミなのは、strcpy_s とか独自の関数を作って しかもそれを推奨するコンパイラ
strnlcpyってのもあるが GCCなどワガママが作ってるコンパイラには入ってない お前ンとこのポリシーがどうかじゃなく 安全かどうかだっつうに
>>727 ,742-751
bccでlstrcatでも使ってろ
>>750 > 安全かどうかだっつうに
それこそお前だけのポリシーじゃねぇか
お前本当に職業プログラマかよw
移植性とか標準規格とか考えたこともないの?哀れな。
何の手も加えずにどこでも動くもんなんか存在しねえよ
職業プログラマ(笑)は黙ってろよ
>>754 ん?オープンソースで活躍している人も
ほとんどが(元)職業プログラマですけど。。。
ここは入門スレだから元だろうが現だろうがプロ(笑)はいらねーんだよ
758 :
デフォルトの名無しさん :2010/01/03(日) 23:30:59
正規表現を扱おうとすると 鬼車以外に無い? regex.h はGPLなので除外。
>>740 隣の席の人のやってるプロジェクトが、str系使わないで、
memcpy()とかmemcmp()を使って、文字列のサイズをことごとく、
直接書いてるのな。
memcpy(a, b, 10); みたいに。
str系はセキュアじゃないみたいなのが、間違って伝わってるんだろうなって
推測してる。
車輪の再発明は危険だよ
>>748 独自って言っても、そのうち標準になるんでしょ?
Cで char *head; if( (head = (char *)malloc(SIZE1024)) == NULL){ fprintf(DISPLAY, "Process couldn't get Memory space\r\n"); return -1; } ・・・ ・・・ ・・・ free(head); /* free */ head = NULL; /* headは他からもfreeされる恐れあり */ ってやると「やり直せ!」と言われるんだけどなして?
SIZE1024の意味
最大255文字を取る文字列の操作のために1024バイトを確保
mallocと言えば、キャストするしないでえらい怒られたなあ。 俺は単純に見た目分かりやすいのを好むのと、 C++ではvoid*は明示的にキャストしないといけないからやっていただけだっつうのに。 なんぞ悪いんかい。って思った。
(char *)malloc(SIZE1024 * sizeof(char)) かなぁ 名前の付け方とか
>sizeof(char) 何ひとつ解っていない、と思われても仕方ないレベル
>>769 不必要にキャストするのはバグの元だし、C++ならCのキャストは使わない方がいいし
どっちにしろ怒られるのは仕方がないことかと
void* の関数なんか実際のソースだといろいろあるわけじゃん。 特にリエントラントとか言い出すと それすら「やんな」ちゅうんだぜ
test
775 :
デフォルトの名無しさん :2010/01/04(月) 02:04:16
>>771 こーゆー奴に限ってmainの特別視とか何とも思わねーのな
「規格で決められた」範囲でしか思考できておらず
本質的に何かという観点が完全に欠如している
救いようもなく終わってる奴ね
どうでもいいよ
>>775 済まんが、誰に何を言っているのか解らない。
>head = NULL; /* headは他からもfreeされる恐れあり */ ローカル変数のheadが他からもfreeされる恐れってなんぞ
makeしたら負けだと思う.
if((sizeof(CopySource) + sizeof(CopyDestination)) < String) { strncpy() else{ printf("you are fucked\n");
782 :
デフォルトの名無しさん :2010/01/04(月) 11:07:13
逆やん
783 :
デフォルトの名無しさん :2010/01/04(月) 12:35:22
すんません 教えてくだしあ Linux/GCC ver4.1.2 普段はシェルスクリプトで書いているんだけど hoge.shを Cで実行したらどうなるのか試してみたいんです --huga.sh-- #!/bin/sh /bin/hoge.sh /bin/hoge2.sh これをCで書くにはどうすりゃいいの? CとシェルとUnixのエロい人おしえてぇ〜
質問の意図がよくわからんが、こんな感じ? #include <stdlib.h> int main() { system("/bin/hoge.sh "); system("/bin/hoge2.sh "); return 0; }
785 :
729 :2010/01/04(月) 14:46:27
何度もすいません コンパイラを Borland C++Compiler に変えてみたのですができませんでした 助けて下さい
786 :
デフォルトの名無しさん :2010/01/04(月) 14:56:40
ベーツェーツェーでWindowsアプリを作るときは -W スイッチが必要だぞ まずコンパイラの使用を熟知したほうがいい
みんな集まれペンギン村に(つまりLinuxやれと、いうこと。) どんなことが起こるかな それゆけベーツェーツェーツェー 甲斐性なし(ってけてっ)
>>785 何をしてどうなった?
できないと判断したのはどういう状況で?
そうじゃないだろ まずインストールしたのか、コンソールのHalloWorldくらいはコンパイルできたのか ヘッダーのインクルードに失敗してないか、リンクするライブラリはちゃんと指定してるか いろいろ確認することあるだろ
a[5]と5[a]が同じ意味になると知ったのですが、 後者のやり方を使う意義ってなんでしょうか?
bcc32 -W *.c
>>793 a[b] は、*(a + b) の略記というだけ。
797 :
デフォルトの名無しさん :2010/01/04(月) 15:48:00
stdio.hの意味をくわしい人に聞いたら、 正常位中出しエッチと教えてくれました。 信じていいのでしょうか?
>>798 略記だから、人間がどう捉えるかの問題。
>>793 コンパイラの都合。使う意義はない。
コンパイラ作ってみればわかる。
a[5]は許可して5[a]を禁止するのってめんどくさいから、両方許可してるだけ。
めんどくさいってほどめんどくさいわけでもないと思うけど、 わざわざ禁止する理由もないしな
なんでどっちもいいの? *(a+5)だから?
そう *(5+a)でも一緒だろ?
A+BとB+Aが何で同じなのって言ってるような気がするが… アドレスにオフセットを足すか、オフセットにアドレスを足すか、っていう違いじゃないのかな
aを、0x12345678 とかアドレスに置き換えてみれば
なんだかCをマスターした気がする
>>802 禁止する理由、というか禁止「すべき」理由はあるでしょ。
だからこの文法に関して「意義」とか言ってもただの愚問だね。
本来あるべき理想からいったら、正しくないわけだから。
そもそも「Cの精神」とやらが矛盾だらけの分裂症患者の妄言みたいなものだからさw
一方で「自分の足だって撃てる自由」を望んでおいて(だからこんなありえない文法を
あえて許容したんだろうたぶん)、他方で型安全なフールプルールを主張してるわけで。
[]を演算子とするか、略記とするかの違い。 C#は前者、Cは後者。 もともとのCには void 型もなかったぐらい古い言語なので、 今日的な視点だけでこうあるべきだから禁止すべきというのはナンセンス。
>>808 よく判ってないなら恥かくだけだから黙ってたほうがいいぞ
>>809 >今日的な視点だけでこうあるべきだから禁止すべきというのはナンセンス。
それこそナンセンスな意見だ。
今日だろうと当時だろうと、プログラムを書くのは同じ人間なんだけど、
それを理解してるのかな。
もちろん「当時は技術的に困難だった」事柄や「当時には一般的じゃなかった知見」
についてはこの限りではない。
だが、30年前だって5[a]を禁止することが技術的に困難だったとも思えないし、
こんなものを許すより許さない方が好ましいことが理解されないほど
低レベルな世界じゃなかったと思うけど。
>>784 dクスー!!まさにそれそれそれですよ
エスパーのエロい人ありがd!
>>811 >30年前だって5[a]を禁止することが技術的に困難だったとも思えないし
困難だったんだよ。
CPUは8MHz、RAMは256KB、フロッピーディスクでコンパイルしてたような時代を憶測で語ろうとする無謀さに気づけ。
それが仮に困難なら、交換法則が成立しない演算子を実装することも 同じように困難なはずだと思うけどねw
815 :
デフォルトの名無しさん :2010/01/04(月) 19:46:04
offset[base] はアセンブラではごく普通 抽象アセンブラを目指した言語にあるのは何の不思議もない
今のPCで、高級言語しか触ったことないんじゃないのか オペランドの1つ目と2つ目を交換できない機械語なんか普通に存在するのだけど
CFAQ、じゃねーな
どこかに書いてあったんだが忘れた。
>>815 と似たようなこと(思想的な部分)が回答として書かれていたはず。
>>814 まったく意味が違う。
ポインタ[オフセット] は古いCでは 整数A[整数B] と展開されるから、整数Aと整数Bを区別できなかっただけ。
今時のC99とかC++とかの型付けの感覚で語るなと何度言えば。いや何度言ってもムダか・・・
>整数A[整数B] と展開されるから 「その」展開そのものにはアンタッチャブルで文句言わないお約束なの?w よくわからん思考をするお方。
アセンブリ言語も勉強しないといけないなー ちょっとAVRやってくる
821 :
738 :2010/01/04(月) 21:18:19
スレチなんで他スレ行ってきます。
もうC99とかC++とかやるまえにJavaに行った方が良いな…
Java++的なScalaに行くべきよ
824 :
デフォルトの名無しさん :2010/01/04(月) 21:42:30
なんだっけ ブール代数か何かで 等価交換の法則だか半島の法則だか何だか忘れたが A+B は B+Aと等しい(キリッ ちゅう法則があったような気もするが
825 :
デフォルトの名無しさん :2010/01/04(月) 21:43:23
構造体で生徒の番号 身長 体重をセットして、 キーボ入力で身長の下限および体重の下限を入力し, その範囲の学生の学籍番号とその身長および体重を表示するには どうすればよいですか?
>>824 > ブール代数か何かで
もっとレベルを落として小学生ないし中学生まで戻っても
交換法則
って用語があるだろ?
それのことじゃないのかい?
Rationale for American National Standard for Information Systems Programming Language C 3.3.2.1 には、 The Committee found no reason to disallow the symmetry that permits a[i] to be written as i[a]. と書いてある。ANSI の委員会の考え方は、このとおり。
配列はポインタじゃないというのに、ポインタとして操作できるのもおかしな話だ。
829 :
デフォルトの名無しさん :2010/01/04(月) 21:54:33
830 :
デフォルトの名無しさん :2010/01/04(月) 22:07:21
>>784 師匠!もう1つおながいします
10:00:00になったら
/bin/hoge.sh を起動したいのですが
その場合時間をどこで見るようにしたらいいのでしょうか?
バックグラウンドプロセスとして動かせるように出来ると
涙チョチョ切れものです szo
cronに書いとけヴォケってのは許してww
enumってのは型の保証が無いんですか?
数値をn個入力したいときに、n回forで回すのではなくて、 1 2 3 4 …n な感じで数値の間に半角スペースを入れて入力したいのですが、 どうすればいいですか?
>>832 char s[0x100];
fgets(s, 0x100, stdin);
nptr = strtok(s, " ");
while (nptr) {
atoi(nptr); /* 返り値が数値。エラー処理を厳しくしたいなら strtol(...) */
nptr = strtok(NULL, " ");
}
テストしてないし適当ですまん。こんなんで理解してくれればうれしい
>>830 crontabに書けない理由は述べないのか
10:00:00になるまでsleepすればいいよ
>>834 あ、どもsleepは気が付きませんでしたw
cronを使えないというのは
cronで実行すると約1秒ほど時間が掛かるので
んじゃ、Cならどうかな〜?と
軽く考えてみただけっすw
ちょっとC本漁ってきます
1秒の遅れが問題になるのならSleepも短い時間でやるしかないような
一秒を争うってことは特価品の注文スクリプトか何かかな
だとしたら勝手に密かにやって欲しいな
ろだのDL競争かもしれん
ちょww、平リーマンの趣味レベルっす
注文受けるほど何かできるわけなすなす
って
>>784 師匠のおかげでだいぶ早くなったので
もうどうでもいいやとか思いつつもBashって限界あるのな〜とか思った
玄箱でWebカメラと音声を連続で取り込んで
コマコマムービー作ろうと思ったんだけど
1秒ズレるんでCならば・・・と思っただけです
ではではおせわさまですたたたた〜
でも、結局 system() でシェルに投げるんじゃ一緒じゃねーの? w
なんで速くなったのか謎だ
プラシーボ効果
system() 呼ぶ毎に sh の起動と終了が入るから むしろ遅くなって然るべきだな。
char *p; p="foo"; p="bar"; これって同じ領域に代入されてるの? それとも別の場所?
>>845 p という領域にリテラルのアドレスを代入してる
本人もよく分かってない場合の答えっぽくて
p という同じ領域に代入してるけれど、代入しているのはリテラルを指すアドレス
そのリテラルのアドレスはそれぞれ違う、ってこと?
質問者が領域っていってる時点で...
char *p; p="foo"; printf("%d %d\n",&p,p); p="bar"; printf("%d %d\n",&p,p); とかで確認してみるといいかもね
なるほど サンクス
浮動小数点ってfloatとdoubleがありますよね 何やら10バイト浮動小数点という型も世の中にはあるようで、調べてみたんですが FPUって10バイトのスタックに積んで計算をしているという記事をどこかで見ました どうせ10バイトのスタックにつまれるなら同じものになるはずですよね なのにfloatとdoubleで速度が違うという話を聞く(doubleの方が速い?)のですが、 速度の差ってどこから来るんでしょうか
それはC言語とは関係ありません 適切なスレへ行ってください
>>854 math.hの数学関数が軒並みdoubleを引数に取るので、
floatで計算する場合、それらの関数を使うといちいちdoubleとの変換が必要で遅くなるというC固有の事情もある。
C95/C99でfloat版関数も揃えられたからこの問題は解消されたと言えるけど。
結局はi8087がデファクトスタンダードになってIEEEに採用されたとか、そういう歴史的な事情が
むしろ、8087をスタンダードにするべくieee754が出来た、というかんじ
たくさんの関数が入った自前のライブラリを作成する際に、 1つのCファイルにすべての関数を入れてライブラリにするより、 関数ごとにCファイルを作ってライブラリにした方が、 そのライブラリを使って動くCプログラムのバイナリサイズが 小さくなるのではと思い比較してみたのですが、 結果的には後者のライブラリを用いた方がバイナリサイズが大きくなってしまいました。 なぜこのようなことが起きるのか、お分かりになる方、ご教授ください。
なぜ細かくわければサイズが小さくなると思ったのかわからん。
862 :
デフォルトの名無しさん :2010/01/07(木) 04:01:57
ソースの冒頭に /* Author : Nanashi-San * 01/07/2010 Last Update * */
863 :
862 :2010/01/07(木) 04:04:20
途中で投稿してすみませんorz ソースの冒頭に、このソースの大まかな説明、作者、バージョンなどがコメントされていますが、 皆さんはどういうスタイルで記述されていますか? あるいは、参考になるような神プログラマのソースがあったら、お教えくだちい><
>>862-863 /*
* cdjpeg.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
* This file contains common support routines used by the IJG application
* programs (cjpeg, djpeg, jpegtran).
*/
大切なことは読んだ人がわかることだと。
ルールがあればそれに従う。
>>864 レス感謝です
>大切なことは読んだ人がわかることだと。
なるほど!分りにくいところを簡素に説明、ってのがコメントの基本ですよね
初めてこのソースを読む人の気持ちを忘れないようにします
>ルールがあればそれに従う。
チームを組んで、大きなプログラムを作ってゆく時は大切そうですね・・・覚えておきます。
ありがとうございました!
>>859 コンパイル単位に.oやら.objが作成される。
.obj .oは純粋にコードだけで出来ているのでは
なく、いくらか不純物を含む。(コンパイラやリンカ
が使用する情報)この不純物の量は.obj .oのサイズに
関わらずほぼ一定。つまり一つの.oや.objにコード
を詰め込んだほうが概して「純度」があがる。
リンクした際にも、この「不純物」はいくらか混入
する。よってリンクする.o .objが増えたらサイズが
それなりにでかくなってもおかしくはない。
>>859 MAPファイル出力するようにしてそれを見てみたら
http://codepad.org/hpmEDghf 内積をだすプログラムを作ろうとしましたが型をうまく使えません。
この場合エラーをどうすれば消せるのでしょうか?
又、&変数と変数[]は同じだというのを見たのですが、
visualc++でデバッグすると書き換えるとエラーの文章が変わる時があります。どう使い分ければいいのでしょうか
初心者のギモン 例えば配列で int a[5]; の値が全部1だったら〜ってのを if(a[0]==1 && a[1]==1 && a[2]==1 && a[3]==1 && a[4]==1) なんてやんないでスマートにやるにはどうすればいいんだい
for(i=0;i<5;i++)
ループか、ビット演算でもできるかも if (1 == (a[0] & a[1] & a[2] & a[3] & a[4]))
アホだ普通にできないし
a[0]==7
やはり汎用性に定評のあるfor様の出番なのか。サンクス
if (a[0..4].sum() == 5) { }
>>877 C言語でおk
ついでに 0 と 1 以外の値でアボン
C言語はint x[5]ってやっても x[10]=20; みたいにできる、配列の最大要素数が無い欠陥言語だから 870のようにやるにはちょっと面倒なことしなきゃならん。
書き方わからないと欠陥言語になるのかも
包丁に安全装置がついてないって怒ってる人だね
てかC言語に配列ってないし。
このように配列と区別のついてない人もいるけど 入門スレだからしょうがないね
回答者が入門レベルという意味だったのか
何を今さら
ほんとうにわかってる奴なんてあんまりいないよ
まじめな話です。「本当にわかる」ってどのくらいの認識でいいのでしょうか。 C と付き合い始めて25年、いろいろやったけれども、まだわからないことが多いです。
> まだわからないことが多いです。 たとえば?
ポインタが分かればおk
言語仕様を覚えただけじゃただの役立たず 資料とにらめっこばかりで全然コーディングしないここの回答者連中のこと
25年もやってまだわからないことが多いなら才能なし
Cとつきあって十数年になるが、他の言語も平行してるからその都度ちょびっとづつわすれちゃう コボラーなら一つの言語だけで食っていけるのだろうか
困ったときに何調べたらいいのか分かれば十分だろ
25年やってわからないことって何だろう?
言語仕様を覚えただけて・・・ とりあえずルールだけ覚えた将棋みたいなものか
言語仕様を覚えただけ、とは言うが、 規格を(右辺がどの左辺がどうのなども)丸暗記してる奴がいたら、 あいまいな理解であいまいな表現をしてあいまいなコード書く奴よりはいい。
丸暗記の方があいまいなことやりそうな
書き方うんぬんより、デバッグ能力のある人の方が...
mem c cpyとか mem p cpyのcやpが何なのかわからん
>>898 こりはいよいよデバッガの参上か、と毎回おもいつつ、printf() とひらめきだけでなんとかおさまっていますう。
int(*)[10]さまのお通りだ!
>>902 使い道がわからない。あと引数があるときはどう指定するの?
904 :
デフォルトの名無しさん :2010/01/08(金) 00:48:18
>>894 例えばgoto文やグローバル変数を否定する理由を明確に答えられる奴はその歳でも少ないよ
明確というか、条件無しに唯一無二の答えがあるのなら長年の論議にはなってないんだよ
907 :
デフォルトの名無しさん :2010/01/08(金) 01:06:27
>>905 うん、答えられるよ
おまえには教えないけどね
XPユーザーならやってみる価値あり 1.適当なフォルダにあるEXEファイルを右クリック→[スタート]メニューにアイコンを追加を選択 2.先ほどのEXEファイルがあるフォルダ自身の名前を変更する 3.スタートメニューを開いて上記の手順で追加したリンクを右クリック→プロパティを選択 4.無効なリンクになっているので、[変更]ボタンを押す 5.該当ファイルの変更後の正しい場所を指定する 6.・・・なにぃ!! 感想きぼんぬ ※ 一人でニヤニヤした後は設定を元に戻しておきましょう
>>905 goto 文は、今は否定されていだいだろ。
古いコピペだな 今頃ひっかかってよっぽどくやしかったのかな
911 :
デフォルトの名無しさん :2010/01/08(金) 01:15:09
>>909 部分的に認められているけど、「やっちゃいけないパターン」は今でも健在
>>908 へぇどうなんの?
vistaだから分からないや
>>913 これやるとexeをどのクリックしても、5で選んだアプリが起動するようになる
つうか、何が起こってるか最初わからず、泣きそうになったw
C言語の前に日本語でおk
ググればすぐ解決するようなオリジナリティもユーモアセンスも全くないコピペを ム板に貼ってなんか意味あんのかなあ
>>909 goto禁止厨がいるかぎりgotoをしようすべきではない
触らぬ神に祟りなし
ごとーに関してはC言語を始めたばかりの人でもわかるからだろう。 「gotoはいついかなる状況でも絶対つかっちゃいけません。」 ならgotoキーワード廃止しろよと思うが。 浦島太郎さんこの箱をあげましょう、でも絶対にあけないでくだしあ。 玉手箱ですかw
getsよりは使い所あるだろ 脱出とか
gotoもswitchもラベルを使うがラベルの乱用はコード
を極度に読みにくく出来るので、乱用を恐れて
禁止するケースが多い。例:
http://codepad.org/UFWzPjxr 業務PGでは変数名、関数名、ファイル名など管理しなければ
ならないものが多いので、ラベルまで管理対象に入れたくないが
使われると入れざるを得ないという理由で禁止されるケース
が多いが、これも一見まっとうに見えて実は何かが間違っている
922 :
デフォルトの名無しさん :2010/01/08(金) 01:46:07
Document generator は Doxygen 以外に良いものありますか?
923 :
デフォルトの名無しさん :2010/01/08(金) 01:50:30
>>919 goto文を「使うべき」ケースが藤原さんのページでごく軽く示されているが
泣き所が関数をまたげないことで、この点はK&Rの説明でさえダメだからな・・・
>>921 キミの会社ではローカル変数まで部署管理なのかw?
ウチでは関数までは部署管理で追加する場合や新規に
呼び出す場合や呼び出しを廃止する場合とかはイチイチ
報告書書かなければならないけど。さすがにローカルauto変数
の追加、廃止、使用方法変更で報告書までは書かされないよ。
名称はコーディング規約で厳格に規制されてるけど。
ラベルはどうかは知らない。switchラベルレベルだと自由に
使えるみたいだが関数内ラベルだと恐らく自由だとは思うが
変数名制約に抵触する場合を考えると完全に自由というわけでも
なさそう。
>>924 コーディング規約で改行の入れ方も規定したほうがいい
>>908 このバグまだ直ってなかったのか。
拡張子の.exe が別のアプリに関連づけられてシェルからプログラムが
起動できなくなるからやらんほうがいいよ。
修正はここに .exeが登録されてるから削除すればいい。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\
未だに縦読みを気にする人が居るとは....
928 :
859 :2010/01/08(金) 09:21:10
929 :
デフォルトの名無しさん :2010/01/08(金) 10:07:57
プログラミングの問題なんですが、if文と繰り返し(for,whileのいずれか)を利用して次の問題を作成します。 米ドル紙幣としては次のような紙幣とコインがある。 100ドル、50ドル、20ドル、10ドル、5ドル、2ドル、1ドル 50セント、25セント、10セント、5セント、1セント 問題は、キーボードから日本円を入力し、まずドルに変換した後ドルを紙幣とコインに振り分けるプログラムを作成しなさい。但し1ドルを92.69円として換算しなさい。そして、日本円が0円の時にプログラムを終了する。 例 ¥195,865 2,112,89$ 100$…21枚 50$ 20$ 10$…1枚 5$ 2$…1枚 1$ 50¢…1枚 25¢…1枚 10¢…1枚 5¢ 1¢…4枚 このような問題なんですがプログラムとして最適なものが分かる方は是非教えてください。 * グレード
宿題は宿題スレへ
#include <stdio.h> #define RATE 92.69 int main(int argc, char *argv[]) { int i; float yen = 0.0;; long dollar = 0; long exchange; long k[] = {10000, 5000, 2000, 1000, 500, 200, 100, 50, 25, 10, 5, 1, 0}; char *str[] = {"100$", "50$", "20$", "10$", "5$", "2$", "1$", "50k", "25k","10k","5k","1k", ""}; scanf("%f", ¥); if(yen == 0.0) return 0; /* ドル円変換式、例題のような変換値にならなかったので固定 */ /*dollar = (long)((yen / RATE) * 100000);*/ dollar = 211289; for(i=0; k[i] != 0; i++) { exchange = dollar / k[i]; printf("%s... %d枚\n", str[i], exchange); dollar = dollar - (exchange * k[i]); } return 0; }
&がバグって表示されているが、訂正はしない
16進法の文字列の各桁をint型の配列に格納するにはどうすればいいのでしょうか? 例えば"5b7c"だと以下のように格納します。 int digits[]; digits[0] = 0xc digits[1] = 7 digits[2] = 0xb digits[3] = 5
>>935 すみません、10進法でもわかりませんorz
sscanf("5b7c", "%1x%1x%1x%1x", digits+3, digits+2, digits+1, digits+0); とか
938 :
デフォルトの名無しさん :2010/01/08(金) 16:46:52
>>936 たとえば10進数の 7654 の4桁の場合、
digits[0]: 10 で割った余り(を 1 で割った答え)
digits[1]: 100 で割った余りを 10 で割った答え
digits[2]: 1000 で割った余りを 100 で割った答え
digits[3]: (10000 で割った余りを) 1000 で割った答え
int ctoi16(char c) {
c = tolower(c);
return 'a' <= c && c <= 'f' ? 10 + c - 'a' : c - '0';
}
int main() {
char *cs = "5b7c", *p;
int digits[4], i;
for (i = 0; i < strlen(cs); i++) digits[i] = ctoi16(cs[i]);
for (i = 0; i < 4; i++) printf("digits[%d] = %x\n", i, digits[i]);
return 0;
}
みたいな。けど、
>>937 みたいにするのがスマートだと思う。
ありゃ。ctoi16(cs[strlen(cs) - 1 - i]); という動きだな
>>934 は。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define SA ('a' - 10) int main(int argc, char *argv[]) { char *str = "5b7c"; /*大文字アルファベットが混じると落ちる*/ int *digits; int i, len; char work[2]; len = strlen(str); digits = (int *)malloc(sizeof(int) * len); memset(digits, 0, sizeof(int) * len); memset(work, 0, sizeof(work)); for(i=(len - 1); 0<=i; i--) { work[0] = *(str + i); if(isdigit( *(str + i) )) { *(digits + i) = atoi(work); } else { *(digits + i) = work[0] - SA; } } free(digits); return 0; }
>>907 いや別に知りたくねぇよ。
低能の戯れ言を信じるやつはいねぇ
944 :
デフォルトの名無しさん :2010/01/08(金) 20:03:34
ストップウォッチ書いてお〜 100分の1秒も表示したいお AAがで表示したいw
ストップウォッチできたよ #include <time.h> int main(void) { time_t t = time(0); srand(t); getchar(); printf("stop: %d.%02d\n", time(0) - t, rand() % 100); }
だがたいがい間に合う
平均以上の数値を表示する問題です #include <stdio.h> main() { int a1, a2, a3, a4; int a[]={ 35, 40, 45, 50}; int i, c; double ave; for (i=0; i<4; i++) { c += a[i]; ave = c/4.0; if ( a[i] >= ave ); } printf("平均以上=\n", a[i]); return 0; } 平均値を超えている数値の数なら出せるのですが、数値そのものを出せ、という問題が出来ません。 どこが間違ってるか教えてください。
>>948 こういうのってCの問題でも何でもないよな
int a1, a2, a3, a4が一度も使われておりません とかって警告でるんじゃねえの
間違い多すぎて笑えるw
>>948 ・cが初期化されてないのに+=で代入している
・if ( a[i] >= ave );という意味のなさない文がある
・バグの原因ではないがaveに4回も代入する必要はない
・偶然にも2になったとしても表示してるのは平均以上の数ではない
・曲がりなりにもコンパイルと実行できるのが奇跡に思える
・っていうか釣りじゃないよね?
#include <stdio.h> main() { int a1, a2, a3, a4; int a[] = {35, 40, 45, 50}; int i, c; double ave; for(i=c=0; i<4; i++) c += a[i]; ave = c / 4.0; for(i=0; i<4; i++) { if(a[i] >= ave) printf("平均以上=%d\n", a[i]); } return 0; } こういうことがやりたいのかなあ?
相変わらず入門者を笑ったり釣り扱いする人がいるな。 入門者なんてとんでもない勘違いをしてることが多いのにいちいちワライにきてるのかね。
笑って何が悪い?悪くないよね。
性格が悪い
それがなにか?
960 :
デフォルトの名無しさん :2010/01/08(金) 22:36:28
>>945 ちょww なんかrandって気になるんですけどwww
気にしたら負けなんですか?
>>960 些細なことよりも全体を見るべき
意味がわかればそれでいい
なんか悟りの境地だな 木を見て森はどうでもイイw
#include <stdio.h>
main() {
int a[] = {35, 40, 45, 50};
int i, c;
c=0;
for(i=0; i<4; i++) {
c += a[i];
}
for(i=0; i<4; i++) {
if(a[i] >= c/4.0);
}
printf("平均以上=\n", a[i]);
return 0;
}
直しました。皆さんすみません。釣りじゃないです。
>>953 今回は2を出したいわけじゃありません。45、50という数値を出したいです。
コンパイルすると確かに,if文に警告が出ます。printの文がググっても分かりません。
正しい書き方を教えてください。
どうしてせっかく出た見本を無視する おまえは人の親切心をブチ壊すのが趣味か 最低だな
もっというとi<4とかc/4.0の4っていう数字は配列の要素数から出すべきだと思う
Cは難解すぎるからもっと入門にはライトな言語が良いと言う人もいれば 入門用に最適。シンプルでわかりやすいから初心者に勧める という2人がいますが、どっちが正しいんでしょうか
968 :
デフォルトの名無しさん :2010/01/09(土) 01:01:21
どっちも正しい
970 :
デフォルトの名無しさん :2010/01/09(土) 01:05:34
>>967 「入門」がどういうレベルかによるが、
ローティーンにはインタープリタ方式の方が頭の柔らかさを活かせると思う
それで育った幅広い発想力を土台に、専門分野へチャレンジするときがCの出番だと思う
Cから入って、さっさと卒業した方が良い
>>967 前者が正しい。
Cがシンプルでわかりやすい?初心者に勧める?とんでもない大ウソだ。
シンプルでわかりやすく、初心者でも扱えるような言語で、UNIXが記述できるはずがない。
こだわる人のために補足すれば、Cは「難解」ではなく、「危険」だ。ちょっとしたミスが大怪我を引き起こす。
それだけ細かいことが出来るからこそ、OS記述言語として使われている。
>>967 最初かと言われると微妙だけど、フォンノイマン型コンピュータを扱う上でいつかはCに触れて欲しい。
アセンブリよりシンプルで分かりやすいよ
>>967 アセンブラと比べると難解すぎるし、
C++と比べればシンプルでわかりやすい。
馬鹿らしい。目的と手段が逆転してる
質問です。 できますか?
できますん
俺は
>>971 の意見に賛成。
> 入門にはライトな言語が良い
これは、勉強する人がくじけそうな性格ならそうだろう。
しかしC言語が書けないプログラマはもはやプログラマではない
と言って差し支えないほどC言語は普及しているので、
どうせやるなら最初はC言語がいいんではないかと。
Cができれば他の言語は全部できたも同じ
>>967 ・ネットで読めるサンプルの数
・質問のできる場、対する回答者の数
・入門者向けのために「正確さ」を端折った解説の量
C言語はこれらが圧倒的に多いため入門用に最適。
ただ、コードの読み書きだけで見れば、他のLL言語が良い。
どちらにしても初心者ってのは、何がわからないのかがわからない。
調べる方法と聞ける相手と場を与えることが大切で、それさえ教えてしまえば
もう初心者ではなく、どんな言語でもあとは
読んで触って試して改造してテストしまくってもらえば身につく。
本当にどんな言語のコードでも読んだことも見たことも無い人向けならば
俺なら構造と階層の意味と、プログラムにおける当たり前の
開いたら閉じる書式を知ってもらうために、まずはXHTML薦めるわ。
IEバグに関連付けてソフトウェアのバージョン違いを意識してもらうことと
更新の大切さも教えられるから。
C言語でもLL言語でも入るのはそれからだな。
Cからjavaに来てあいかわらずCライクな 書き方しかできないおっさんとかゴロゴ ロいるからCができれば他もできるって のは賛成できない。
>>983 あるあるw
Cやった上で、JavaなどのOOPL行くのが最良と思う。
Cで溜まったある種のフラストレーションを、
OOPでの抽象化によって開放させてみてほしいと思う。
N88Basicから入ってアセンブラ→Cと きたオッサンとしては、今の時代、 LLから入門してもいいじゃないかって 気もする。
BASIC、PASCAL、C、Prolog、Java、Perl、PHP、C++、Ruby、C#の順で学んだ。 Javaが教えてくれたものがやっぱり大きいと思う。
>>982 LL言語ってなに?HTML言語みたいにLと言語って重ねるもんなの?
988 :
sage :2010/01/09(土) 11:31:29
釣る場合は先に釣りと書かないとルール違反だよ
>>987 書いてて今気付いたわすまん、LLにすべきで
LL言語だと頭痛が痛いと同じだな……
「LLな言語」と書ける日本語は素晴らしいよね
Mr.社長さん
>>987 TCPプロトコルなんかと同じで、LLだけだと短くて居心地が悪い人が多いんだろう
またパーサの話か・・・
995 :
sage :2010/01/09(土) 13:35:47
C言語なんかと同じで、Cだけだと短くて居心地が悪い。
997 :
デフォルトの名無しさん :2010/01/09(土) 14:40:04
埋め
埋め
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。