そしたらアクセス不可能な物が出てくるじゃん。utf8に変換なら良いけど。 utf8にしたら大工事が必要なのが難点。
windowsにはutf8の関数がないからね。全ての関数のラッパーを作らないといけない。 渡すときだけ、utf8toutf16という関数挟めば良いだけか。
クロスプラットフォームなものなら、内部UTF-16に統一しているのが多 い印象だなあ。Windowsはwchar_t=WCHAR=UTF-16だけど、それ以外では wchar_tのサイズや中身はマチマチだからけっきょくwchar_tも使われな い。
>>5 同印象。
バイト数と文字数が(概ね)比例する方が、中身は作り易いからかなぁ。
そもそも Win だと大文字小文字の区別がないんだから a.txt と A.txt があったらどうなるんだ?
8 :
デフォルトの名無しさん :2009/12/06(日) 00:37:46
同じ型なのに、 Surface* ABC; Surface *BCD; ってするのは何か意味があるのですか。
前者は馬鹿がよく使う表記。 普通は後者を使う。
型としてchar*とcharは別で、char*自体は存在するからな。
Type* foo,bar; と宣言したら sizeof(foo)とsizeof(bar)が一致しました。 このコンパイラは馬鹿ですか?
括弧つけんなボケ
見た目が違うだけです
>>9 バカってゆーな!!
1行に複数の変数宣言すんの嫌いだから上で書いてるんだい
sizeof(Type)とsizeof(Type*)が同じになっちゃいけないってきまりはないしな。
Surface* ABC;//センスある人が使う Surface *BCD;//頭すっからかんが使う
Surface* ABC, BCD; 自分がセンスあると勘違いして間違える。
Surface* ABC; // C以外もよく使う人が使う Surface *BCD; // 年配の人がよく使う
間を取ってSurface*ABC; か Surface * BCD; でいいだろ、もう。
Surface* ABC; // これはねーよww
>>18 センスのある人は変数ごとに個別に宣言するから
>>22 それはありそうもない。まとめて宣言するのは普通のこと。
typedef Surface* LPSurface ;
>>6 まじめに作るなら、UTF16もマルチバイト文字と同じ手間が必要。
このまえ有料の2chブラウザがそれで失敗して祭られてた。
27 :
デフォルトの名無しさん :2009/12/06(日) 11:34:05
うてふはち(いやマジでこういう奴がおんねんて) 以上は、「何故こういうセットなのか」を深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く深く 理解していないと、いわゆるセキュリチーホールを作ってしまう。 どこからどこまでのバイトが無効なのか知らないと、そのままメモリに乗っけるアホなプログラムソースになる。
うてふはち?
うてふじゅーろく うてふさんじゅーに うてふろくじゅーよん
うにこーど?
//と/**/どっちが良いんでしょうか
良いとか悪いとかいうことは無いので、好みで
そうですか、ありがとうございます
一行コメントの場合は//の方が便利だし、 範囲をコメントアウトする場合は/**/の方が便利。
#if !defined #if defined #ifndef #ifdef これを使い出すようになると、なにやら俺もマルチプラットフォーマーになった気分さえ味わえる、で、あ ろう・・・
#ifdef の嵐...
>>23 汚いコード書く人ほどそうするよね
普通は初期化もするから複数宣言したら見辛いだけ
int i, j; for (i = 0; ...
カウンタは例外だな・・・ ポインタじゃないからどうでもいいけど
>>40 有料でやっちゃったら叩かれるよなあ
てか有料の専ブラとかあんのか
c99はまだ前提にして話出来るほど流行ってないと思う
最近は C のコンパイラって無いよね。 大抵は C/C++ コンパイラだったりするし。 純粋な C コンパイラ欲しいな。
gccでいいじゃん。
>>43 読みにくい気がするのだが、、、
俺だけか。
>>43 それ { } の外なのに中の扱いになって違和感あるから好きじゃないな。
>>43 の書き方は、i のスコープが分かりづらい
>>48 俺も最初違和感あったけど、便利すぎてやめられんw
C99, C++, Java, C# あたりで
>>43 の書き方してないやつはダメだろ。
なんか不思議なレッテル貼りが始まった
違和感あるとか、スコープがわからないとか、ありえない。
ループ終了時のiの値が必要になる場合は結局外で宣言しなきゃいけないし、 最初っから頭で宣言しといたほうが楽。
>>55 だよね。使い分けも出来ずにこれが最高、これ以外ありえないって言ってる感じが
C++なら当然かも知れないけど、ここCのスレだし
そらスコープのforの外で見る必要があるとか、そういうことがるのは知ってるよ。 あと「おれはC#で、そもそもループなんてめったに書かないよww」みたいな 的外れな反論もいいからね。
>>57 for (int i ・・・
みたいな書き方ができたらって前提で話が始まってるじゃん。
C89なら使えるし。
C99からだぞ
使えませんw
>>60 間違えたスマソ。
>>56 でも、違和感があるとか、スコープがわからないとか言ってる連中は
状況によって、スコープがわかりやすくなったりしないだろうから、
状況によらずに、使わないってことだろ?
forのカッコ内で宣言してたり、してなかったりで統一されてないのは気持ち悪いから、 最初から全部外だな。
>>63 それ言ったの俺じゃないから知らないが
この使い方出来なきゃダメ、これが上級者のやり方
とか言ってる奴も同じだろ
>>63 君はこれが使えるようになってからプログラム始めた口だね?
そうでなきゃ、教わったことをそのまま使って応用の利かないタイプかな。
使えないころからプログラミングやってきて、自分で考えるような人は
最初は違和感感じるもんだよ。
for (int i = 0;...) ... は {int i; for (i = 0;...) ...} と同義だしな。
>>65 でも、実際ある程度以上(っていうか普通以上)のレベルの人は
for()の中で宣言するスタイルだし。
流れ読めない子?
>>66 べつに「最初は違和感あったけど今は便利に使ってる」みたいな人は問題にしてないよ。
ずっと違和感あって、使ってないって人はアレだけど。
>>55 >>64 その理屈だと、ローカル変数使わないで最初から全部グローバルに
しとけばいいってことになるね。
別に便利でもねえだろ。
宗教論争だなw それぞれ長所と短所が分類されて久しい罠
>>71 こそまさにスコープがなんなのか理解できてないアホw
>>71 ワロタ。
ちなみに、スコープをループの中だけに限定すれば
難しいこと考えなくていい。
for (int i; ...; ...;)
for (int j; ...; ...;)
if (i の条件式)
if (jの条件式)
... 処理 ...
>>77 それ見るとイラッとする。
どんだけネストするんだよ、と。
77がちっとも便利に見えない
>>67 違うだろ。それなら誰もスコープについて文句言わない
kwsk
違わないと思うが。
>>75 こういう議論になると、宗教論争(どっちでもいい、俺の言い分にも理がある)
とか言い出すやつがいるなぁ。
for(int i … を使わないやつなんて、ヘタクソだけじゃん。
まったく理はないよ。
C++じゃなくてCを使い続ける意味が分からない C++を使わない奴なんて、ヘタクソだけじゃん。 まったく理はないよ。
>>73 おなじだ。
「広いスコープが必要になる場合があるから、デフォで広いスコープにスコープに
変数を置く」って理屈だろ。
>>55 は。
ローカル変数の意義をぜんぜん理解してない。
>>84 もう一回言うけどC89は問題にしてない。
結論 ・同じ行で異なるものを複数宣言しない ・宣言と同時に初期化 ・スコープは狭く
C++じゃなくてCを使い続ける意味が分からない C++を使わない奴なんて、ヘタクソだけじゃん。 まったく理はないよ。
C++はどこで変数宣言しても良いってことがCとの違いの一つってなってるからね 上級者はC++だよ
cell *p; for (p = 先頭セル; *p; p = p->next) if (p->id == ID) break; /* Not found... */ if (!p) return NULL; ... p に対する処理 ...
逆に言えば、C++使えば上級者
Linus君が、C++とそのプログラマはクソだと言ってたよ。
自分が便利だと思うところだけ使ったらええねん
C++しか使えない上級者ですが何か?
>>90 for (p = 先頭セル; p; p = p->next) ?
C++ より C♯ のほうが上級だろ。 C++ なんか使ってる奴は下級者だよ。
C#プログラマはうんこだとESR君が言ってたよ。
C#は糞だと俺が常々言ってるだろ
>>90 for (cell *p = 先頭セル; p; p = p->next) {
if (p->id == ID)
:
... p に対する処理 ...
:
:
return p;
}
/* Not found... */
return NULL;
ネスト深くするな
C99でも変数はどこで宣言しても良かったはずだが
この話題は深めるべきじゃない
じゃあ終わり
>>66 今頃「最初」はないだろ。。
どんだけプログラミングから離れてたんだよっていう。
このスレがC99に限定するんじゃないなら全部無駄な話だろ それが当たり前に使える言語のスレで議論すればいいじゃん
K&R準拠にする?
108 :
デフォルトの名無しさん :2009/12/06(日) 19:32:30
C++厨は専スレ立ててそっち行け。ここではお前らは「用無し」だ。
for (int i = 0; … への反論が「C89じゃ使えないだろ」 だったらそれで終わってたけど、「違和感がある」とか「スコープが分かりにくい」 だから、そこはツッコまざるをえない。
流れ読めない子?
上級者云々五月蠅かったらツッコまざるをえない
上級者っていうか、普通以上なら、ループのカウンタは for()の中に入れるわな。
>>110 そのツッコみってなんか意味ある、内容のある意見なわけ?
ただの罵倒なら終わらないんだけど
>>113 Cに限っていえば例え対応してても中に入れない人の方が多いと思うけど
なんだよ、上級者とか普通以上とか。さっさとC卒業しろよw
んで、結局
>>90 みたいにループで回して、ループの外でも
変数を使う、という話はどうなったんだ?
論点はそこじゃないのか。
ループの中に入れるのが上級者なら C99まではどうやってたんだよw 全員が初級かw
C++ はひどい言語だ。これは、多くの平均以下のプログラマーが 使ってるためにさらに輪をかけてゲロゲロになっていて、どうし ようもないゴミが簡単に生産されるようになってる。正直いって、 C を選ぶ理由が C++ プログラマーを追っぱらうため *だけ* だっ たとしても、それ自体、C を使う強力な理由になりうる。 Linus Torvalds
>>114 罵倒なんかしてないよ。
「お前の態度は気に食わない」レベルの書き込みって、
俺以外のやつがしてる。
おれはそれに対して、反論してるだけ。
OOPが理解出来ない奴の泣き言は聞き飽きた
>>117 それの話をしてる人はそれが論点なんだろうね。
おれは教条主義みたいに、ぜったいすべきって話はしてないし。
いや、終わった話をツッコまざるを得ないとか言って続けてる奴はなんだよw
>>121 OOPはいいけど、C++は良い言語とは言えない。
>>118 C89は除外してるって言ってるじゃん。
議論してるとき相手に原理主義者ってラベルはって、攻撃するやつ多すぎ。
Cでは関数直下の{} グローバル領域以外の場所での 変数や型の定義は「禁止」されている。 グローバル領域以外の場所での関数の定義も「禁止」されている (これはC系言語では共通) 制限が緩い言語はそれなりの利点もあるが、リスクもまた持つ。 なんで、あんまし制約の緩さとか厳しさを言語の優劣にすり替 えない方がいいと思うね。自慢しているのは単なるアホなファン に過ぎないんだけど数は多くて五月蝿くてさ
>>127 うん。口喧嘩は終わってないみたいだねw
○×刑務所のほうが△○刑務所より規則緩くていいよ〜 なんて自慢しているような話だなw
じゃあC89こそ至高ってことかね
>>128 > Cでは関数直下の{} グローバル領域以外の場所での
> 変数や型の定義は「禁止」されている。
これは間違ってるけど、まあいいや。
関数やメソッドのはじめ以外で変数宣言しないのって、
メリットははいよ。
COBOLからCに入ってきて、変数をファイルの最初のほうで
全部グローバル変数で宣言して「こっちのほうがわかりやすい」とか
CからJavaに入ってきて、変数をメソッドの先頭で全部宣言して、
「これのほうがきれいだ」とか、言ってるPGは何度となくみてるけど、
勉強不足すぎ。
C89以前ならこう、 C99以降ならこうする、 みたいな形で場合わけすればいいと思うよ。
どの参考書はそんな風に場合分けしてるんだ
全部グローバル変数で宣言するようなプログラマーはいないと思うけど
>>135 どちらでも、C89のスタイルがいいって考えの人がいるっぽい。
基本C99のスタイルで、C89のときはしかたなくC89のスタイルだよな。
C89以前なら int i; for(i = 0; ...) { } C99以降なら for(int i= 0; ...) { }
141 :
デフォルトの名無しさん :2009/12/06(日) 20:15:30
自分以外の人が読むことを想定していないからこんなバカがいるんだろうな。 関数のどこかに宣言されている変数を「探させる」なんて、もっとも邪悪な作法だ。
>>139 だからさー、使い分けじゃないのか?
forループの外で、その変数iを参照したくなったときどうするにだ。
>>134 禁止されていないのはCじゃない別言語とすら言えるかも
(C言語規格団体がいくら違うと言っても、コアな部分は
動かしようが無い)
文法上の規制が最も厳しい言語の一つであるが故に高い
信頼性があり使われてきた。
>>141 天才現る。
ここ10年、20年のプログラミング言語の進展にまっこうから反対する意見。
>>142 そのfor文の部分を関数にして、
その参照したいカウンタ変数iを戻り値にした方が
余計な変数を増やさないという点でスマートに書けると思う。
>>145 変数の宣言位置が関数の先頭にまとめられてるから信頼性が高いって
意見ってだれか言ってた?
>>142 その場合は、iを外にだすなり、フラグを作るなり好きにすれば?
「常にループカウンタをfor()の外に出す」って意見に反論してるのに、
「常にfor()の中に入れるべき」って発言してるかのようにすりかえられて困る。
だからCっつったらC89もあるんだから あっちこっちで宣言したい奴はどっか行けって。うん、Javaでいいんじゃない?
どう見ても味方同士で誤解してつぶしあってる図
gcc だと -std=c98 になってる? さっき試したらエラーで怒られた。 -std=c99 にしたら通ったけど。
c89の間違い
>>142 func(n){
int e;
for (int i=0;i<n;i++){ 処理
……
e = i;
}
// ループ外で e が有効
}
>>151 > だからCっつったらC89もあるんだから
そんなこと最初から繰り返し言及されてるだろ。
「for (int i = 0; …はつねにダメ」って言ってるやつはヘボいねって
議論なんだから、それに対しての反論がなくなったってことは、そうだって
ことでいいんだな。
>>157 常に駄目じゃないけどダメな場合は非常に多い
>>158 ループを途中で抜けて、iの値を見たいときくらいでしょ。
当然、他の変数でも使う段階になって宣言してるんだろうな? ループカウンタだけが例外なんて無様なことしてないよな?
第一に、C89の時だよ
二つのforで1つのiを使いまわし int i; for(i = 0; i < 32; i++){ 何らかの処理 } for(i = 0; i < 64; i++){ 何らかの処理 } return 0; }
>>160 あたりまえだろ。
使う直前で宣言&初期化。
言語の制約とか、処理の流れでそうならないときもあるけど基本は。
括弧無し for の場合は有効範囲どうなるんだ? for (int i=0; i<8; i++) ...;
>>162 ははは、i とか j ってもうカウンタ用の変数っていう暗黙の了解があるから
俺もそんな感じで使っているよ。。
変数/型は別に関数定義ブロックと関数定義ブロックの間でも 定義できるんだけどそれを先頭に持っていかないとコンパイラ が怒ると言う人が居て笑える。 太古のCだと、特にプロトタイプ宣言をしなくとも複数の 関数の相互呼び出しも可能だったが、コンパイラの処理速度が 著しく遅くなる原因として嫌われ、プロトタイプ宣言をしないと 文句を言ってコンパイルを中止するような標準が作られた。 現在のコンパイラはそれに準拠しているものが殆ど。 プログラムを何百のモジュールに分けて分割コンパイルする 開発方法が一般的になった時代と重なってる。 (Cのコンパイルはヘッダファイルを多重に大量に読み込むことが 多いので概して遅い)
C89どっぷりのバカは 変数のスコープはなるべく小さくした方がいいとか 考えた事もないんだろうな
そんなことないよ。C89の主張は全部グローバル変数にすれば良いと言ってるのと同じって主張の方が明らかに狂ってる
この議論はスコープ問題とは別だ。 変数を「その変数を最初に使う部分」で宣言するかどうかの問題だ。
そもそも、議論をC89vsC99にするメリットはC99側にはないと思うけど
>>170 とか完全にC89バカとか言ってるし、もうねw
>>173 C89のスタイルがいいと思って、そうでない環境でも
そのスタイルを持ち込んだり、宣伝するやつってすごいデメリット。
じゃあ市販のCの本の多くはデメリットの塊だな
そのソースを見た人がどっちだとしても使えるという最大のメリットがあるわな
>>175 C89前提なら別にいいよ。
無条件にそれが(ほかの環境でも)いいってことになると迷惑。
>>172 そんなの厳密にやってる奴はいないよ。
ループカウンタのスマート(笑)な使い方を覚えてトクイになってるだけだろ。
>>177 Cの場合、迷惑だってことはつまりそれはC99前提だってことだろ?
それとも上の方でJavaがどうとか言ってたやつ?
常識中の常識を知らないやつがいるんで、それを指摘したけど、 トクイになってるようにみえるのか。 まあ、相手が明らかに間違ってる、自分が正しいって議論だから あいてがムキなってがんばってるのは面白いけどな。
>>180 最後の二行に必死さを感じるのは俺だけだろうか
別のやり方を提示しただけで、間違いを指摘したわけではないだろ なんでトクイになってんのか
C89の推敲されてないコードのデバッグでは未使用なローカル 変数とか、使用目的が曖昧な変数があると酷く苦痛なことは 事実。その変数がいつ「使用済み」になったのかがわかりにくい から。
だからこれはスコープの話じゃないっつってるだろ。 変数を宣言する場所の議論だろ。
>>179 C99でもC89の書き方がをすべしって書いてる本があったら迷惑だわな。
そんな本あるの?
Cでは、ブロックの初めだよ
>>185 もとよりC89のスタイルで書いてあるのばっかりだけど?
>>117 あれはどこに書くかとかそういう問題以前にバグがあるし。
>>183 書いた本人が推敲すれば良い。逆に言えばそういう状態のコード
のデバッグを引き受けるのが悪い。C89でも推敲すれば
そういう曖昧な変数があっても自然にそうわかるように出来る。
>>186 それがなにか問題でも?
C89の本なら、C89の書き方になるのは当たり前でしょ?
C99の本でそうなら勘弁してほしいね。
>>184 ちげーよ
C89, C99どちらのスタイルがいいかっていう議論です。
C89のスタイルでもC99のコンパイルは通るが逆は出来ない。圧倒的だろ
C89にこだわってる人って、当然コメントも // こういうインラインコメント 使ってないよね?
>>190 に補足しておくと、C89でC99のスタイルを採用しろって
言ってるわけじゃないからね。
自明のことだと思うけど「C89でどうすんの?」ってカキコが多い。
>>188 C99とかC++とかの「洗練された」言語では推敲が
怠られることがあるね。スマートに書きやすいと
動作確認した後の手入れとか仕上げみたいな
ソースレベルでの再確認作業が甘くなり
それが禍根を残しやすいというのはあると思う。
野暮ったい書き方しか出来ない(許可されない)
言語の場合は別の理由からかも知れないが
結果的に推敲がなされて信頼性が向上するっての
もあると思う
enumの定義が最後カンマで終わるのを許してくれなかったりとか、C89は微妙なところで不便なんだよな。
>>194 完全に普及すれば、C99でもいいんじゃない?
>>197 そんなこと言うと、C89とかまだ完全に普及してないんでK&Rスタイルでいくしかない。
よっしゃ、おっちゃんまとめちゃうぞ。 C89スタイルのメリット ・必然的に変数一覧が作成されるため、命名ルールによっては処理内容まで把握できる。 ・先頭と決まっているため、保守時に探す必要がない。 ・採用例(開発現場、書籍等)が圧倒的に多い。 C99スタイルのメリット ・スコープが宣言時からブロック終了まで、またはループブロック内に制限されるため、未初期化変数の使用を抑止できる。 ・使う直前に宣言するため、変数の使用範囲がわかりやすい。 ・メモリ節約。
C99の大きなデメリット ・x86プラットフォームに限って言えば、完全準拠コンパイラは Intel C++ Compilerしかない gccですら部分準拠に過ぎない
>>199 >・必然的に変数一覧が作成されるため、命名ルールによっては処理内容まで把握できる。
>・先頭と決まっているため、保守時に探す必要がない。
これをメリットと考える人はほとんどいないだろう。
>・メモリ節約。
メモリの節約にはなってないと思われ。
不毛地帯
僕ちん、もう寝るから あまり加速しないでね ★
無毛痴態
C99やC++やJava使いは、Cの単に推敲が良くされてない 段階のコードを見て(自分の言語で)気に入る形に書き直 すのは勝手だが、わざわざその欠点をあげつらうのは見苦 しいだけ。洗練された言語には無い強さがあるんでCを敢 えて使う人も多い。
サブルーチンやプログラムの先頭でしか変数を宣言できない言語って、 60年代70年代の言語で、新しい言語(メジャーなやつ)はまったく採用 されてない。 まともな人は、ほとんどメリットを見出してないだろうね。 大昔、BASICのソースがPC雑誌に掲載されていた時代に変数表 って載ってたけど、C89で「変数一覧」とか「探さないでいい」とか思う人は そのころの発想から進歩してない。
常に使う直前に確保・初期化したら実行時のペナルティ大きそうだなあ
じゃなくてC++とかJavaを使えよw
>>207 関係ないと思うけど、たとえばどういう場合?
CスレでありながらのC批判って意味不明 C99は免罪符にはならないよ。Cであることに変わりはない C99も十分時代遅れだ
あ、それは関係ないよ。 どこに書いてもコンパイル結果は同じになるから。
>>195 そういうことは、リファレクタリングと称して新しい言語のほうがさかんに行われている気がする。
「新しい」はC99とかC++なんかではないよ。少なくともJava以降。
少なくとも、プリコンパイル時点で確保するのに対し 1サイクルは無駄にする。少なくとも。 変数の確保がメモリ管理と等価であるCでは1サイクルでは終わらないがな
>>207 シビアな条件の組み込み機器とかにも使われてる理由がわかってないんだよな
自称進化したニュータイプな人はw
「使う前に」なんぞというから、動的にやってるんだろ? そうでなきゃ仕様的に許されるどこに書いたって同じなんだから議論の余地はない。
218 :
210 :2009/12/06(日) 22:32:49
ああ、ループ内で、リソースの確保、開放を繰り返す場合とかあるか。 まあ、原理主義者じゃないからそういう場合は臨機応変に対応すればいい。 実行時のパフォーマンスと、読みやすさを天秤にかけて。
219 :
210 :2009/12/06(日) 22:34:23
>>217 動的にってわけじゃないよ。
よく言われる「使う直前に宣言&初期化」ってのはソース上のこと。
C89なら自分こう書いちゃうぞ。 int i; for (i = 0; i < M; i++) { int j; for (j = 0; j < N; j++) { /* …… */
>>37 むしろ、宣言と同時に値を代入するよりも、コード中の関係ある部分の近くで初期値を代入するのが普通でしょうね。
だいたい、auto 変数の宣言と同時に値を代入することを「初期化」というのでしょうか。
>>87 >宣言と同時に「初期化」
には反対ですね。使う直前で値を代入すればいいだけで。
そもそもauto変数を「初期化」するという用語はあるのですか?
コードの中での役割が似てる者は一緒に宣言するよね? それも個別に宣言するもの?
>>223 そうですね。一緒に宣言しますね。
そもそもこの話は
int* a;
と書くやからがいること
そして、往々にして
int *a, *b;
を
int* a, b;
と間違えて書いてしまうことから発したものですが、
C++御大禿げのいうことには、ときどき変なのがありますね。
>>221-222 auto変数だろうとその他の変数だろうと、規格ではint i = 0;などのように宣言と同時に値を与えるのは初期化ということになっている。
つまり、auto変数を初期化するということも当然存在する。
もちろん、その使用の是非は別として。
>>225 ふーん、そうなんですね。
初期化と代入の区別はあいまいになってきているんですね。
昔は auto 変数は「初期化」できなかったんですけどね。
int n = 0; が言語の定義上で初期化と呼ぶか代入と呼ぶかって、 議論の筋と関係ないしな。
228 :
デフォルトの名無しさん :2009/12/06(日) 23:12:07
>>206 60-70 年代の言語で新しい言語ってのがよくわからんが
DATA DIVISION. で変数宣言し終えてから PROCEDURE DIVISION. で手続きを書き始める言語は一時期メジャーだったよね
BASIC の掲載記事は大部分が結果オーライで変数表はあまりついておらず、
ただ編集部よりの偉い(偉そうな)人が変数表を作るようアドバイスはしていたようだが
検索が早い貴重な1文字変数を使い回しなんて常套手段だったりしたよね
だったらマシン語使えやと言ってもグローバル癖はもはやパラダイムですらあり渋々変数表作ってた
という立場からは
>>207 の言わんとするところが、わからんでもない
いちいち SP 相対で即値を書き込みとかイラついてたし
そんな状況下で K&R C を使ってありがたみを痛感したのがローカル変数の存在なんだが・・・C89?
>>211 C スレだからこそ C に対する批判ができる場だろjk
ここは信者スレではないぞ
>>228 ここは入門スレなので、哲学問題はよそでやってくれ。
auto var の場合は初期値入れるのも代入のルーチンだもんな。
>>227 そうそう、もともとは
int *a;
か
int* a;
かの話だったんですよね。で、
int* a;
をセンスのある書き方、と主張する輩が沸いてできたのが、笑止というか。
>>230 そうそう、初期化と代入の差は希薄になってきたんですね、K&R1 の時代からすれば。
>>228 >60-70 年代の言語で新しい言語ってのがよくわからんが
「新しい言語」はそこにはかかってないよ。
234 :
デフォルトの名無しさん :2009/12/06(日) 23:48:18
>>229 じゃあ、じゃあああああ、どこでやれっっちゅううねえんん!!! 鬼気迫る勢いで
C99の信者スレじゃんw
だからそういうスレ立てろっての。OOP厨もろともな。
>>235 うそでしょ?どちらかというと C89信者の方が多いのではありませんか?
238 :
デフォルトの名無しさん :2009/12/06(日) 23:59:13
>>207 むしろ、条件によっては使わないかもしれない変数を確保して初期化するコストを考えるべきでは?
240 :
デフォルトの名無しさん :2009/12/07(月) 00:11:21
>>229 C の持つ独特の「哲学」を学ぶことは、十分に「入門」の領域に含まれると思うぞ
char a[10];
a = "foo";
明らかな間違いを見せて、どうしようってんだ?
初期化と代入の違いを見せようとしてるんだろう
別にC89でも{}で囲んでブロック作ればいいだけで、 割と好きなところで変数宣言できたけどなぁ ちょっとしたテストでmainだけで済ますときとかやってたよ int main(arg[]){ //処理1 {int i; ・・・ } //処理2 {int i; ・・・ } }//end of main とか
>>243 そうですよね。
その気になれば、使う直前で宣言するように書くことだって可能だし、宣言しておいて直前に「初期化」すれば済む話だし。
そもそも、
>>22 が int* a; まんせー、int *a; はセンスがない、ってほざいたのが、話の発端だったのです。
*を型にくっつける派が変数の宣言は一行に一つとか言い出したからだな。
いや、可能であることと、そのスタイルで書くことは違うだろ。
>>245 そうそう、彼らは、宣言と一緒いちいち初期かも行うそうで。そんなことは、そうそう、あることじゃないし、使う直前に代入すればすむこと。
そもそも彼らは初期化と代入の区別もつかない、いや、これは、最近は区別が希薄になっていることは認めます。
>>248 いや、for(int i = 0; ... ) の話ではなかったか。
まあ
>>22 int* マンセー派にセンスがないことはよくわかりました。禿げのいうことを妄信してはいけないですね。
もうまとめか
>>249 そのセンスのないint* マンセー派がfor(int i=0;が絶対だって主張したってことなんだが。
典型的な自称上級者だったってことか
どうせ未初期化の変数の値を読み出そうとしたら警告になるから、 必ず初期化することにこだわる必要はないよね。
>>253 いやいや
>>22 int* マンセーは、宣言と同時に「初期化」するのが普通、って主張していたんですよ、確か。
まとめて、int a, b, c, d, x, y, z; と書くのはセンスがないそうで。
だいたい彼らは初期化と代入の区別もついていないようですね。
>>255 え? int* a; のほうがセンスがあるのですか?信じられないなあ。
>>256 ご説明いただきましょうか。
馬鹿を理解してない話
なんでint* aだめなん
センスないから
実用上デメリットは無いの? 個人的に気に入らないってだけ?
>>261 別にダメってわけじゃない。許されてるんだから使いたければ使うよろし。
ただし、厳密には「iniへのポインタ型」ではなく「int型へのポインタ」である。
型 変数名
という宣言の文法に倣えばint* aはおかしいってのを理解できてれば。
>>263 int *a, *b;
という意味を表現したいにもかかわらず、
int* a, b;
とかいてしまった、
ということがなければ、べつにどっちでもいいんです。わかっておれば。
ただし、
>>22 ,
>>37 のような言い分はかなりおかしい。
そんなことよりdim[i] と i[dim]はどっちがクールか決めようぜ
先頭に*がついた変数名は*を取るとポインタとして機能する みたいな中途半端な仕様はどうも好きになれない。
>>266 甘いお菓子しか食べられないお子様は黙ってろw
Cの仕様はそこかしこで洗練されてないからしょうがない
int* func(void); int *func(void);
int * const a;
コーディング規約なんてソース中統一しててくれればなんでもいい その上でみんなはどう?って質問なのに あれはカスこれはハイセンスとか言って煽っちゃう低脳
既約も糞もあるかよ。コーディング既約なんてのはCにあるという 考え方自体がおかしいんだよC的には。 文法がコーディング既約でそれ以上の既約は無い。 要するに、意味深な記号が多用されるから、括弧を付けて、 どれがどれにかかってるのかわかるように書いたほうがいいぞ という話だろ int* func(void) という目糞な書き方よりか int *func(void)のほうが鼻糞だが int (*func)(void)のほうが「正しい」 え?コンパイル通らないって? それはそのコンパイラ制作者がタコなんだよ
関数ポインタという海坊主が出てきた
ボケなのかバカなのか微妙なのが多いな。
>>273 とか
前スレでも似たようなこと書いてたから、本人としては面白いとでも思ってんじゃねーの
んなまさか
微妙なのが多いと言うか、微妙じゃない奴が一人でもいるようには思えないが
>>267 俺は逆に
「*をつけた変数の値をアドレスとしてメモリを参照する」と解釈してから
割とスムーズ。
質問抜粋
・自分の解答を、どのように修正すればよいか?
・部品ごと? に分けて作るやり方でよいか?
・↑の考え方はオブジェクト指向?
<以下本文>
今、苦Cとcodepadにて勉強中のものでポインタの所で四苦八苦して飽き始めたため、
他サイトにて練習問題で遊んでいます。
今、挑戦中のは
http://www.geocities.jp/rabenschwarz_ritter/Creidai/reidai2.html で、自分が作った解答は次に書き込みます。
解答を見た瞬間、あまりの簡素さと自分の解答のごちゃごちゃっぷりに笑ってしまいました。
自分が作った解答をいろいろ修正しましたが、コンパイルできずに困っています。
どのように修正すれば、うまくコンパイルできるでしょうか?
また、自分は一つの中にごちゃごちゃとまとまっていると、頭の中が混乱してしまうので、
グローバル関数かstatic関数を使って機能ごとに分けて作ろうと考えたのですが、この作り方を
いい傾向でしょうか? それとも悪い傾向でしょうか?
またにわか知識で、この考え方がオブジェクト指向? と思ったのですがこれは正しいでしょうか?
#include<stdio.h> int x,y,z; int nyu(void); int tas(int,int); int main() { nyu(void); hikaku(x,y); printf("数値X=%dから数値Y=%dまで足した数値は、%dです。",x,y,z); return 0; }
int nyu(void) { do{ printf("XからYまでの整数を足した数字を表示します。\nX > Yの時は再入力します。\n開始値Xを入力してください\nX = "); x = 10;//scanf代用 printf("%d\n",x);//scanf代用 printf("終了値Yを入力してください。\nY = "); y = 10;//scanf代用 printf("%d\n",x);//scanf代用 } while (x < y); tas(x,y); return z; } int tas(int x,int y) { for (;x <= y;x++) { z = z + x; } return z; }
アドレスおよびエラーメッセージです。
http://codepad.org/A2GOlpsq 1 In function 'main':
2 Line 9: error: expected expression before 'void'
3 Line 9: error: too many arguments to function 'nyu'
>>281 1.エラーメッセージに9行目がおかしいって出てるよ。英語がわからないなら辞書を引くといいよ。
2.オブジェクト指向ではないね。「構造化プログラミング」でググるといいよ。
すいません。>282にあるhikakuの一行は削除でお願いします。
最初は、入力→比較→結果と作ろうとしていた名残です。
また、現在入力部をmainの中に入れることでコンパイルはできるようになりました。
一部修正したところ、何とか希望通りの結果を得ることができました。
http://codepad.org/6a4jrjyK そのため>281の質問一番目は、どうすればコンパイルできるか? を、なぜ失敗したか?
に変更します。連レス失礼しました。
>>273 型定義と初期化を同時に行うことが出来るというシンタックスシュガー
が無ければ、コンテクストで十分に区別出来る。
逆に言えば、型定義と初期化を同時に行うことが許可される
コンパイラの文法レベル(非常時用簡潔表現の許容)では、
禁止されるべきかもしれない。
>>285 ありがとうございます。
自分も9行目のエラーから、voidを削ってみたり(x,y)に変えたりと、にらめっこしながら
いろいろ修正してたのですが、どこが原因でエラーが起きているのかわかりませんでした。
構造化プログラミングですね。早速ググって、色々と読んでみます。
>>287 int hoge(int x);
int (*func)(int)=hoge;
のように型定義と変数宣言と初期化を同時に行うことが出来る
文法は非常時用文法ということ?
このスレ的に苦Cってどうなの?
>>290 今ちょっとだけ見てきたけど、悪くないね。
最初に HelloWorld から始めないのも好感触。
このスレ的にマナやさCはどうなの?
>>290 可もなく不可もなくだな
俺のほうがもっと良い物作れる自信はある。
>>290 若干ツンデレっぽいところが好感触
しかし偏屈そうな管理人だなw
このコードをもっと効率良くというか、スマートになりませんか? // deg を -180 以上 180 未満の範囲に正規化する float deg_normalize(float deg) { while (deg < -180.0f) deg += 360.0f; while (deg >= 180.0f) deg -= 360.0f; return deg; }
deg→rad かけて atan2(sin(rad),cos(rad)) を deg に戻すのも値域があわないか…
floor関数と dn(t)とdn(-t)の間の関係を使う。 ただしdegの絶対値が大きい時の精度保証無し
float deg_norm(float deg) { if(deg>0){ if(deg>180){ deg-=360; if(deg>0) deg = deg_norm(deg); } }else{ deg*=-1; deg = deg_norm(deg); deg*=-1; } return deg; } なんという変態^p^ あれほど意味の無い再帰はやめろと
303 :
デフォルトの名無しさん :2009/12/07(月) 20:09:19
配列から同一要素を取り除く関数を書いたところ以下のようになりました 内側のループがトリッキーに感じるのでなおしたいのですがもう少し単純明快な書き方はありませんか? int unique(T array[], int size) { for ( i=0; i<size; i++ ) for ( j=i; j<size; ) if ( array[j] == array[i] ) { delete_and_shift(array, j); size--; } else { j++; } return size; }
vector unique つかえよ
えっ?
>304 逝ってよし
307 :
303 :2009/12/07(月) 21:19:04
>>304 visual studioのuniqueは下のようになっていて余計にややこしいです
というか連続しない同一要素は取り除いてくれないようなので参考になりませんでした
勉強にはなりましたが・・・
int f = 0, b;
int l = size+1;
while ( ( b = f ) != l && ++f != l )
if ( array[b] == array[f] )
{
while ( ++f != l )
if ( !( array[b] == array[f] ) )
array[++b] = array[f];
return ++b;
}
return l;
>>307 順序を保持しなくていいなら先にソートしておくとか
STL使えんなら該当スレに行けば
310 :
303 :2009/12/07(月) 21:39:33
>>307 そうですね
良くありそうな関数だと思ったので何か見落としているんじゃないかという
気がしていたのですがソートしておくのが分かりやすい気がしてきました
>>308 使えるなら質問する必要も無かったんですが・・・
失礼しました
宿題でないなら、STLつかえよ。 順番記録しておいてソートしてユニークして、元の順番でソートすればいい。 5行でかけるだろ。 しかも安全。
Cpp厨がまだいる。。
スレ違かもしれませんが。 iPoneの加速とか傾きのステータスをOSSを使って自分の作ったプログラム(Cで作成)に送りたいのですが可能ですか? ライブラリと参考サイトを教えていただきたいです。
314 :
デフォルトの名無しさん :2009/12/07(月) 22:27:21
>>313 その辺の話題は答えられる知識を持った人がこのスレにいないので無駄です。
一応C入門スレですので^^
気象観測のシステムなら経験あるけど。
何なの、アイポンって。 俺プログラミングには超詳しいけど、SONY製品しか買わないから知らないぞ
俺のログにはあいぽんは無いな
C++ ソースファイルの拡張子は hoge.C だろ。
空気読めよクソ野郎
ごめ、誤爆
321 :
313 :2009/12/07(月) 22:39:43
返信ありがとうございます。 他のスレ探したほうがいいみたいですね。 C関連のスレ探してみます。
許さんよ 絶対に
なんでもそうなのだが、傾き検知の場合センサーがある そのセンサーがコントローラに繋がっている場合(それ以外ないのだが) 結果をコントローラ上のレジスタアドレスに格納する それを参照すればよい。 この考えは、すべてにおいて同じ。 あるデバイスがある デバイスがマイクロコントローラ制御なら、その結果を格納する場所が必ずある それを参照する マイコン制御じゃなかった時代は、電気的に判断していたから 回路が分からないとどうしようもなかったものだが マイコン制御ならプログラムはどうしても必要になるので プログラムが分かれば誰でもわかるようになっている。 ただ、どこのレジスタなのか どこに何のアドレスがアサインされているか は、別途調べなければならない。
傾きセンサー、加速度センサーのアドレスが、例えば 0xEFFFF800 0xEFFFFA00 こう割り振られていると分かったら、そこにアクセスすれば値が手に入るだけだ。 簡単だろう 傾きは、キャリブレーション位置からの傾きが値として入ることが多いので簡単だが 加速度の場合、キャリブレーション位置とかは関係がない。ある方向に動きさえすれば 元々どちら側に向いていようとも加速度が得られるからだ。 こういうのは、ちゃんとプログラマーが考慮して処理を書かないと加速度の値を得たことにならない。 単にその時間で何かの値が得られただけに過ぎなくなるので「加速」ではなくなる。
具体的にどうするんですか? そんなくだらない話なんていらないんです。
つまりAPIリファレンス嫁ってこと
わからないのにダラダラ講釈たれてたんですか?
それは俺じゃないが
質問者に成りすましている暇人がいるから気をつけろ
気をつけるのは知ったかぶる側だよね。
right、その通り。よく気がついたね
分からないと言いがかりをつけるチョンっているよな そりゃお前の頭が悪いだけだ っていうw
質問に答えられないのに威張る奴ってなんなの?
まずiPhone上で動くプログラムを作るのに使える言語は基本的にObjective-Cだけだから、そこはこのスレの対象外。 iPhone内のプログラムと他のコンピュータとの通信はインターネットを介すだけ。 まあ「だけ」という一言で言えるほど単純ではないけど。
335 :
デフォルトの名無しさん :2009/12/07(月) 23:14:09
普段ならスルーされる話題なのに
>>314 の書き込み見て本気出してるお前らカッコヨスw
質問者に成り済ましてんのいつものC++厨だろ。まじうぜぇ…
くたばれよ
またCしかできないやつが見えない敵と戦ってるよ。 雰囲気悪くなるから、脳内でやればいいのに。
341 :
デフォルトの名無しさん :2009/12/07(月) 23:29:02
Smalltalkくずれw
某OOP言語開発者が C++批判していたから、その酷さについては間違いないんだろうな。
実は、この5つすべて(Python, Java, C/C++, Perl, LISP)を勉強しておくのがいちばんいいのです。 これらはもっとも重要なハッキング用言語だというだけでなく、 それぞれプログラミングに対してまったく違ったアプローチをしているので、どれも非常に有益な勉強となるでしょう。
メモリmapped IO じゃなかったら違うんじゃねーの?
346 :
デフォルトの名無しさん :2009/12/07(月) 23:37:39
某: プログラミング言語は、それを使う人が何を考えることができるのかを決めてしまう >5つすべて すべて・・・ね
つーかさ、質問者がCの質問しているのにC++に話を持って行くヤツが一番困ると思うのだが。
>>343 Python, Java, C, Perl, LISP
5つ全ておkです(^^
質問者が最初っからCpp臭かった件
>>350 やっぱり妄想癖があるんだね、cpp厨は...
cpp厨は想像力豊かだな!プログラマにぴったりだ!
でも頭は硬いようだぞ
僕は自分で言うくらいのC厨だけど "Cpp厨"見るとCプリプロセッサ厨に見えるから Cxx厨かC++厨にしてくれない ほんとこのスレは言語以外の話が多いな
宿題は宿題スレがあるから
356 :
デフォルトの名無しさん :2009/12/08(火) 00:14:23
初心者、初級者もよそへ逝けと
>>1 で言ってるしな
与太話くらいしかすることねーべ
だからここは入門者の戯言スレなんだよ
自称上級者様は速やかにご退場願います
では、入門者の戯言を聞かせてもらおうか 以下の二つの変数fooとbarについて、それぞれの型をスカラ(intなどの基本型)と型修飾子およびポインタ宣言子を用いた表現に直してみてください typedef int *ip_t; typedef int const *icp_t; const ip_t foo; icp_t bar;
クイズスレじゃねえよw
361 :
デフォルトの名無しさん :2009/12/08(火) 00:34:05
マホステ *const foo; マホステ const* bar;
>>350 cppっぽくてもCで答えるくらいの力量はないのか?
あるだろjk
>>303 ループ対象の変数をいじるのは何かとバグになりやすい
空の配列を作って、重複しないものをそれに追加するアルゴリズムの方がいいと思う
>>303 単純かどうかわからないが、こういう書き方はどうよ?
int unique(T array[], int size) {
int i, j, k;
for(i=j=1; i<size; i++) {
for(k=0; k<j; k++) if(array[j]==array[k]) break;
if(k==j) array[j++] = array[i];
}
return j;
}
>for(k=0; k<j; k++) if(array[j]==array[k]) break; じゃなくて for(k=0; k<j; k++) if(array[i]==array[k]) break; だった
367 :
デフォルトの名無しさん :2009/12/08(火) 13:20:28
[課題] 年(西暦)と月を入力すると その月のカレンダーを出力するプログラムを作成せよ. <出力例> 年(西暦)を入力してください : 2010[Enter] 月を入力してください : 1[Enter] 2010年 1月 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 どうやったらいいーか分かる人いますか?
system("cal");
わかる人はいる
#include <stdio.h> main() { int year, month; printf("年(西暦)を入力してください : "); scanf("%d", &year); printf("月を入力してください : "); scanf("%d", &month); printf("2010年 1月"); printf("日 月 火 水 木 金 土"); printf("1 2"); printf("3 4 5 6 7 8 9"); printf("10 11 12 13 14 15 16"); printf("17 18 19 20 21 22 23"); printf("24 25 26 27 28 29 30"); printf("31"); }
372 :
通りすがりの草 :2009/12/08(火) 14:47:05
#include<stdio.h> int main(int argc,char *argv[]) { float year, month, day = 1, buf1, buf2; int weekf, month2, year2, key = 0, buf3, daymax; if(argc != 3){ printf("Usage: cal yyyy mm\n"); return(0); } year = atoi(argv[1]); month = atoi(argv[2]); if(month < 4){ year2 = year--; month = month + 13; month2 = month - 13; }else{ month2 = month++; year2 = year; }
373 :
通りすがりの草 :2009/12/08(火) 14:47:49
buf1 = ((year * 365.25)+(month * 30.6)+(year / 400)-(year / 100)+1-429); buf2 = (((int)buf1 / 7) * 7); weekf = buf1 - buf2 + 1; printf("西暦%d年%d月\n月 火 水 木 金 土 日\n",year2,month2); for(key = 1; key < weekf; ++key){ printf(" "); } if(month2 == 1 || month2 == 3 || month2 == 5 || month2 == 7 || month2 == 8 || month2 == 10 || month2 == 12){ daymax = 31; }else if(month2 == 4 || month2 == 6 || month2 == 9 || month2 == 11){ daymax = 30; }else{ daymax = 28; }
374 :
通りすがりの草 :2009/12/08(火) 14:49:17
for(buf3 =1; buf3 <= daymax; ++buf3,++weekf){ printf("%2d ",buf3); if(0 == weekf % 7){ printf("\n"); } } if(month2 == 2 && (((0 == year2 % 4)&& (0 != year2 % 100)) || (0 == year2 % 400))){ printf("29 "); } return(1); }
375 :
通りすがりの草 :2009/12/08(火) 14:50:30
今の会社に入社した当時、Cを覚え始めてから3日目で書いたソースです。 テラナツカシス。
float...?
>>375 すげー
三日目でそこまで書けるようになるのか
自分だったら
一日目 hello world
二日目 変数
三日目 scanf
くらいまでだわ
378 :
通りすがりの草 :2009/12/08(火) 15:23:51
カーニハンとかマジウンコだし バイブルとかバカじゃねーのwwww信者きめぇ
380 :
通りすがりの草 :2009/12/08(火) 15:34:11
カーニハンの言ってること正しいんだけど、石田晴久が分かりにくくしてる。 もったいないなぁ。
381 :
通りすがりの草 :2009/12/08(火) 15:35:05
カーニハンのいってることは正しいんだが、 石田晴久が分かりにくくしてるんだよな…。 もったいない。
382 :
通りすがりの草 :2009/12/08(火) 15:36:10
すまん、更新できてないかと思った。
曜日計算なんていう正確な答えの必要な処理に誤差入りの浮動小数点数を使うなんて怖くてできないチキンな俺様 month * 30.6 なんてそんな恐ろしい・・・
閏年がらみの挿入を分岐して判断するか 浮動小数点で演算するか 閏秒の積み上げとか考えると頭いたいのう
385 :
通りすがりの草 :2009/12/08(火) 16:39:00
まぁ、課題ならこれでいいんじゃない?
>>383 答えはわかってんだから、結果が正しいかどうか確認してから組み込めばいいんじゃね?
え?400年後に誤差が出た?そんなんサポート外に決まってんだろ。
>>384 閏秒はいつ入るか予測できないので事前に対応するのは不可能。
どうせパソコンの時計なんて誤差ありまくるんだから、タイムサーバであわせればOK
出来損ないOS、ファッキントッシュがまさにそれ あれ、NTPしかねえもん リアルタイムクロックを見ていない。
指定バイト数画面に出力って関数ないんですか
Cというより西暦とか閏の知識を問う問題なキガス
>>390 意味がよく分からないけど printf
printfはeofまでジャン
Cの知識でやるなら、 time.hをインクルードしてasctimeに丸投げ
>>393 そんな不思議な printf は知らんぞ
世の中には僕らの知らない不思議なことがまだまだある
構造体を使ってファイル内容を読み取ることはできないの?
できる
できる、しかし、やらない方が良い
やらない方が良いのはなぜ?
構造体の大きさやメンバの配置、エンディアンなどが処理系によって異なるため移植性に乏しい
↑ そういうことじゃない。
いろいろな例があるサイトないですか?
Cは動的型判定機構に乏しいからシリアライズめんどいよな
printf("%s","\0xA082"); //Shift-JIS のようなイメージで2バイト文字を文字コードから表示させたいのですがどうしたらよいでしょうか? あとWindows標準でついている文字コード表でみると"あ"は82A0とかかれてるのですがどっちが正しいのでしょうか?
恒三体って役に立つのですか。 食うメモリの量ばっかり増えて やれることは独立して宣言した変数と同じなのではないですか。
#include <ncurses.h> #include <locale.h> int main(void){ setlocale(LC_ALL,""); int c; initscr(); noecho(); raw(); keypad(stdscr,TRUE); while((c=getch())!='\x18'){ switch (c){ case KEY_UP: addstr("[↑]"); break; case KEY_ENTER: addstr("Enter"); break; case KEY_DC: addstr("DEL"); break; } refresh(); } endwin(); return 0; } Ubuntuのgccで、こういうものを作って入力されたキーを取得しようとしてるのですが Enterだけ反応しません。DELとカーソルの上とか、ここでは省きましたが他のファンクションは うまくキャッチできるのですが。 どうやったらEnterを取得できるんでしょうか?
>>379 理解できなかったのですね。よくわかります。
411 :
デフォルトの名無しさん :2009/12/08(火) 20:08:21
#include <stdio.h> #include <unistd.h> #include <termios.h> static struct termios t_orig; char Get_Key(){ char c; begin_getch(); c = getch(); return(c); } int begin_getch() { struct termios t; tcgetattr( 0, &t ); t_orig = t; t.c_lflag &= ~(ICANON|ECHO); t.c_cc[VMIN] = 1; tcsetattr( 0, TCSADRAIN, &t ); } int getch() { char c; int status = read( 0, &c, sizeof(char) ); return status ? c : (char)status; } getchの返り値をunsigned charにキャストして、 printfかなんかで16進数に印字して一文字づつ見てみるといいかも Ubuntuでできるかは知らないけど。
>>408 データ構造を意識するようになれば、おのずと構造体の意義もわかるようになるでしょう。
>>407 こんなんでどう?
char s[] = {'\x82', '\xa0', '\0'};
printf("%s", s);
>>411 とりあえず、'\0x0a'で捕まえることができました。
keypadを使ったKEY_ENTERは、諦めます。
ありがとう。
>>413 お、できますね。
なぜそのやりかたで文字コードとして認識されるんでしょうか?
>>415 charはintとかと同じ数値型。その値として文字コードを格納することで文字や文字列として振る舞う。
だから、直接ああいう風に文字コードを数値としてcharへ与えることも可能。
float型の数字ABについて、A÷(B^2)という計算をするにはどうすればいいですか? C=A/(B*B); だと、なんか変なんですが。
floatの精度を考えれ。
420 :
417 :2009/12/08(火) 21:20:30
#include<stdio.h> main() { float tall,weight,standard,bmi; printf("身長(m)と体重(Kg)の入力:"); scanf("%f %f",&tall,&weight); standard=tall*tall*22; bmi=weight/(B*B); printf("身長%.1fメートル、体重%.1fの時\n",tall,weight); printf("標準体重は%4.1fキログラム、BMI指数は%4.1fです。\n",standard,bmi); if(bmi>=25) printf("太り過ぎ\n"); else if(25>bmi>=18.5) printf("標準体重\n"); else if(bmi<18.5) printf("低体重\n"); } 全ての値に対して、0が帰ってきますw
421 :
417 :2009/12/08(火) 21:22:37
B*Bじゃなくてtall*tallでした。
double使えよ
22とか25は、22.みたいに小数を明示する方がいいはず
いや、動いとるよ。たぶんちゃんと動いてるよ。
で、
>>417 はこれ、誰かのソースをコピーしたのかな?
動作について理解してる?
>>414 Enter と Return は別なんじゃねーの?
426 :
417 :2009/12/08(火) 21:37:31
いや、自分で書きました。 コンパイルしなおしたら動きました。 何でだろう・・・?
動けばいいんだw それでおkw
floatとdoubleってどっちが良いの? まあDirectXはfloat使うみたいだけど・・・
floatなんて存在価値なし ゴミ。
特に理由がなければdouble。 精度を犠牲にしてでもよほど大量かつ高速に処理しなければならないときにfloat。 SIMD命令やGPUで一気に処理できるし、必要なメモリ量が減ることも高速化に繋がることがある。
「玄人志向」に対抗して、単精度に頼子だ割った「float志向」ちゅうブランド立ち上げたいんだっぺ・・・
昨日、人のjavaのソースを見てたら、 DBからひっぱってきたBigDecimalを文字列に変換して、さらにfloatに 変換して比較とかしててフいた。
433 :
デフォルトの名無しさん :2009/12/08(火) 22:46:27
そろそろwindowsアプリに挑戦したいと思っているのですが VC++とBCCではどちらの方がとっつきやすいですか?
おなじだよ。
VC++はごちゃごちゃしててとっつきにくいってのはあるけど どちらにしろVC++をやる羽目になるからなあ
mallocがヒープにメモリを確保するように自動変数もスタックにメモリを確保するんですよね? ということは while(1){ int var[1024]; ・・・ } と書いた場合 while(1){ スタックにint[1024]を確保 ・・・ 開放 } ということになって確保開放のコストが結構かさむと思うんですが、どうなんでしょうか?
437 :
デフォルトの名無しさん :2009/12/08(火) 23:00:04
スタックの確保と解放はヒープよりずっと速いよ
>>436 スタック領域の確保解放はレジスタを一つ書き換えるだけだから初期化がなければ超高速
>>436 ブロックの中で宣言してても、たいていの処理系は
関数に入ったタイミングで確保してるから、あんまり関係ない。
C言語がプールしている領域がスタック。 毎回、OSに問い合わせるのがヒープ。 ヒープでやっても自分で管理すれば、スタックと同速程度。 解放をしないってこと。
自動変数の確保の速度はそれほど気にしなくて良い。 1M-5Mくらいの確保したら落ちたり、失敗する。 多くはとれないから、時間も掛からない。
>>436 コンパイラの環境依存としかいいようがないが、関数に入ると同時に
そのブロックのスコープ内の領域までついでに確保してしまう処理系もある
その場合はコストゼロ
つか、whileでループするたびに、スタックフレームを 伸ばしたり縮めたりする処理系なんて無いのでは? そんなこと調べたことないけど。
だよなあ。 関数内ブロックの自動変数は単にスコープの違いだけで、 変数の寿命は関数の先頭に書いたのと変わらないだろ。 わざわざ途中でスタックポインタいじったりしないだろ。 レジスタに割り当てるにしても、最適化で同じになるだろ。
何でもかんでもOS任せにしていると忘れがちな豆知識 メモリ管理には、「その確保したメモリはどこにあるのか」ということがまず絶対に必要になる。 つまりMr.mallocはポインタに入れなければならないということ。 ハンドパワーで何とかなるもんじゃない。 うっうっうっううー。
446 :
デフォルトの名無しさん :2009/12/08(火) 23:29:38
アセンブラでやると簡単。 メモリを確保したものをセクションとして保存 セクションはあらかじめ大きさを決めておく スタックポインタを進める 内容保存 スタックポインタを進める 内容保存 ・ ・ ・ これやってりゃいいだけだし 取り出すときは目的位置から減らしてMOVEしていけばいいだけ まったく分かりやすい。 この点、逆にCのほうが分かりにくい。
角度aを入力して、sin(a)の値を表示するプログラムを作りたいのですが、 πはどの様に定義したらよいのでしょうか? double a,π=3.14159; これで動くことは確認したのですが、わざわざ数値を与えてやらなくても、 「π」として定義して処理する方法があるような気がします。
M_PIがあるなら使えば
#define PI 3.14159
math.h を見てみれば?
出せやピッピッ いっぱい出しゃいいって
const double PI = atan(1) * 4.0;
マシン依存ならアークタンジェントで計算 気にしないのならググって分かる限りの桁を
M_PI がありました。
一次元配列に、多次元配列風にアクセスする方法はありますか?
あります
そうでしたか。幸せですか?
//10x10 int data[100]; int matrix(int x, int y) { return data[x+y*10]; }
Mat[size]のような配列に、Mat[i][j]のようにしてアクセスできるのでしょうか? どのように書けばいいのでしょう
PCのメモリも、ある意味一次元配列
M_PIのMって何の略ですか 出展付きでお願いします
マスマティック
まさにパイ
メーカーに訊け
Mathライブラリ開発者がドMだったから
ドMで何が悪い
>>461 このままでは当然エラーだよねって答えが返ってくると思ってました。
それと
>>458 はリロードし忘れで見てませんでした。失礼しました。
出展付きでお願いします ~~~~~~~~~~~~~~~~~~~~~~~
>458は #define mat(a,b) data[a+b*10] に直しておけ
k = mat(i, i + j);
あっさり突っ込まれちゃって
>>470 はかっこがつかないなw
汎用性が無いし五十歩百歩だと思うが
汎用性がないのは
>>470 も同じだろ。
使い方によっては誤った結果になるものを五十歩百歩とかw
君は日本語がわからないのかね
//10x10 int data[100]; ((int [][10])&data)[x][y];
#define mat(a,b) data[a+(b)*10] こうすりゃあええんだろ
>476 が何をしたいのか理解できないのだけど
int *data=(int *)calloc(100,sizeof(int));で宣言すればdata[20]でもdata[2][0]でも参照できるって姉貴が言ってた
キャスト
warota
おまえら真面目に答えて差し上げろよw 嘘情報を初心者に与えるんじゃないよw
うん
こ
じゃあy幅が可変のときに
>>476 みたいにしたいときはどうするの?
そんな時はふつうのやり方すればいい というか何も考えずに質問するな
>476 は、コンパイル通るのか ぱっと見では、配列(非スカラな複合型)にキャストしているから無理そうなんだけど ああ、C99では、なんかあった気もするなぁ、いや、配列はさすがに無理だろ
なんかC言語をGoogleが改造した奴があるって聞いたけどあれはどうなの?
((int (*)[10])&data)[y][x]
>>489 2次元配列を関数に渡すときに使わないか?
>493 使わんなぁ 2次元配列って何、おいしいの 配列の配列でいいよね 関数の仮引数で使われるもっとも内側のブラケット(例えば、foo_t bar(baz_t [][n_1][n_2][n_3]...[n_15], ...)では、[]のこと)は、ポインタ宣言子と等価である このことは、配列がポインタに成り下がることから容易に想像できる 基本的にキャストのオペランドはスカラでないといけないので、オペレータが非スカラな複合型へのキャストであってはならない
495 :
デフォルトの名無しさん :2009/12/09(水) 12:25:24
int a[3][5]; (int*)a[1]という表現は正しい?
C言語初心者なんですがソフトってどれがオススメですか?
visual c++ 2008 ee
499 :
デフォルトの名無しさん :2009/12/09(水) 15:26:26
自分で問題を設定してオリジナルのプログラムを作れという課題が出たんですが、〇×ゲームって作れますかね?
そんなん 「入力された2つの数値の和を計算して表示する」 的な簡単な課題にしときゃあええんや
502 :
デフォルトの名無しさん :2009/12/09(水) 15:33:11
んんじゃ2次方程式の解を求めるとかでええんとちゃう?
>>502 プレイヤーからどこに○、×を書くのか入力してもらって、
それから○のところに○を表示して、×のところに×を表示すればいいと思います。
提出点くれないとかケチな先生やなぁ
学校で学んだ範囲で出来ることじゃなくて平気なの?
教えてやれよ・・・
508 :
デフォルトの名無しさん :2009/12/09(水) 15:55:07
>>504 0からつくれるほど才能ないので問題形式で教えてください
>>505 まぁ予想ですが…
どうせならいいものを作りたいですし
>>506 去年は〇×ゲームを作った人がいたらしいです
509 :
デフォルトの名無しさん :2009/12/09(水) 15:58:59
配列を使う [0][0]〜[2][2] whileで無限ループで全部埋まるか勝負かつくまで繰り返す おわり
>問題形式で 問題「○×ゲームを作りなさい」
>>499 はC言語でどんなことが出来るレベルなの?
「作れますかね?」って他人に訊くくらいだから そりゃ作れないだろう、としか答えられん。
514 :
デフォルトの名無しさん :2009/12/09(水) 16:15:26
どうせならいいものって… 自分の立場わきまえろよ無能
○×ゲームの仕様はこんな感じでおk? ゲームの操作は全てPCに繋いだゲームパッドから行う ○は赤、×は青でえんぴつで描いたようなアニメーションで表現する 勝利するとファンファーレが鳴るようにする プレイごとに先手後手がいれかわる 勝敗記録を保存しておく 対戦するコンピュータの強さは10段階
どうしてプログラミング始めたヤツってゲーム作りたがるの? ゲームって面白いの。 ポケモンしかやったことねー
学生の名前と番号と成績を保存しておいて並び替えとかできるプログラム とか作ってもつまらないからじゃね。
人に全部訊くくらいならググってコピペすりゃあいいと思うんだが、違うか?
テーマが自由なら、ネットワーク関連のプロトコル勉強してサーバでも作ればいいやん。 HTTPサーバとか、多分マルバツゲームよりは面白いぞ。
521 :
デフォルトの名無しさん :2009/12/09(水) 17:08:22
どうしてって、理由なんかなかったな それまでできなかったことが、できるようになる 能力の開花そのものを楽しんでいた 偶然にも俺の世代では当時のトレンドにプログラミングがあったというだけ 周りの大人にできないことをやるオリジナリティを今求めると別なものかも知れない
522 :
506 :2009/12/09(水) 17:17:07
>>508 あなたが学校でどんなレベルのことを学んだのか分からないとアドバイスのしようもありません
学校で学んだ範囲外のことをプログラムするとなると
あなたがプログラムの成績が非常に優れているでもない限り
必ず先生から疑われてしまいますよ
その○×ゲームを作った方はきっとプログラムに精通している方だったのでしょう
提出点を気にするあなたが無理をする意味は無いと私は思いますよ
ちなみに私が以前作った○×ゲームは約13000行になるくらい大きなものになりました
課題にゲームは不向きだと思います
ナンプレで良いじゃん
8クイーンでいいじゃん
因数分解とか素数でいいじゃん
足し算で
>>526 逆ポーランド記法で電卓ってのも面白そうだな。
529 :
499 :2009/12/09(水) 18:22:01
いろんな人の意見を聞くかぎりでは今まで習った事じゃ〇×ゲームは出来そうにないな。 じゃあ何すりゃいいんだ?orz
・2次方程式の解を求める ・因数分解 ・素因数分解 ・超ひも理論
何を習ったんだよ
532 :
デフォルトの名無しさん :2009/12/09(水) 18:27:56
>>529 PCが最低引き分けに持ち込むというならそれなりに難しいが、
あいてる所に適当に打つというなら入門レベルでOK。
たぶん、UIを作るところが一番大変。
>>516 の簡単なレベルの○×ゲームなら作れるんじゃね?
ジャンケンでいーじゃん
13000行て 不敗のcpu作っても絶対そんなにいかないわ
インベーダー作れ んで敵を倒すとマイドキュメントのファイルが消える仕様
あのウイルスか 残念なことにあれってMac専用なんだよな
移植しろってことだろ
539 :
デフォルトの名無しさん :2009/12/09(水) 18:56:11
unsigned int uint_hensu; unsigned char uc_hensu; memcpy(&uint_hensu,&kouzoutai.uc_hensu,sizeof(uint_hensu)); memcpyをしようとしコンパイルしたところ、エラーがでてしまいました。 原因は何でしょうか? uc.hensu自体は構造体できっております。 unsigned int と unsigned charでmemcpyしようとするとエラーがでてしまいます。 unsigned char 同士でするとエラーがでません。 何か変数はこのままのサイズでうまく解決できないでしょうか?
作った #include <stdio.h> #include <stdlib.h> #include <conio.h> #define UNKO(_arg) ((_arg==0) ? " " : (_arg==1) ? "@" : "X") int unko[3][3]={0}; int gyou, retu; void print(void) { printf("%s|%s|%s\n", UNKO(unko[0][0]), UNKO(unko[0][1]), UNKO(unko[0][2])); printf("-+-+-\n"); printf("%s|%s|%s\n", UNKO(unko[1][0]), UNKO(unko[1][1]), UNKO(unko[1][2])); printf("-+-+-\n"); printf("%s|%s|%s\n", UNKO(unko[2][0]), UNKO(unko[2][1]), UNKO(unko[2][2])); } void select(void) { do{ puts("select gyou"); gyou = getch(); }while((gyou < '0') || ('2' < gyou)); do{ puts("select retu"); retu = getch(); }while((retu < '0') || ('2' < retu)); } void select_enemy(void) { for(int i=0; i<3; i++){ for(int j=0; j<3; j++){ if(unko[i][j] == 0){ unko[i][j] = 2; return; } } } } bool judge(int flag) { if(unko[0][0]*unko[0][1]*unko[0][2] == flag){ return true; } if(unko[1][0]*unko[1][1]*unko[1][2] == flag){ return true; } if(unko[2][0]*unko[2][1]*unko[2][2] == flag){ return true; } if(unko[0][0]*unko[1][0]*unko[2][0] == flag){ return true; } if(unko[0][1]*unko[1][1]*unko[2][1] == flag){ return true; } if(unko[0][2]*unko[1][2]*unko[2][2] == flag){ return true; } if(unko[0][0]*unko[1][1]*unko[2][2] == flag){ return true; } if(unko[0][2]*unko[1][1]*unko[2][0] == flag){ return true; } return false; } void redraw(void) { system("cls"); print(); } int main(void) { while(1){ do{ redraw(); select(); }while(unko[gyou-'0'][retu-'0']!=0); unko[gyou-'0'][retu-'0'] = 1; if(judge(1)){ redraw(); puts("kati"); return 0; } select_enemy(); if(judge(8)){ redraw(); puts("make"); return 0; } } }
テンキーの1〜9を各マスに対応させる。 curses.hまたはconio.hを使って何かキーが押されるたびにダイレクトに全描画する。 あとはまかせた。
>>539 kouzoutai、uc、hensuがなにかの記載がない。
どのようなエラーがでたかも書くように。
543 :
デフォルトの名無しさん :2009/12/09(水) 19:03:08
conioの読み方は「コニオ」で合ってますか?
くにお
好きなように読むか
メーカに問い合わせればいい
わかったら、
>>543 はもう来ないでね
getsをゲッツと読んでました…
sprintf()はスプリントエフだよ
スーパープリントファンクション
このスレの入門者はC言語で何を作っていますか
セキュアプリントフォーマットじゃね?w
551 :
デフォルトの名無しさん :2009/12/09(水) 20:24:50
>> 549 カレンダー⇒ワードソート⇒ラインエディタ⇒オセロの順で 俺は作ったぞ。
>549 こんにちは、世界。
555 :
539 :2009/12/09(水) 21:32:16
>>542 すいません、エラーは今すぐ思い出せないのですが
たしかu int u charのコピーの際のエラーがでてました。
正確にはコンパイルはできるけど、警告という意味でエラーがでてました。
uintもucharの変数の中は数字です。kouzoutaiの中も、uchar hensu といった
似たようなのが入ってます。
いいから正確なエラー書け 書けないならもうやめろ
やめます
558 :
デフォルトの名無しさん :2009/12/09(水) 22:08:12
unsigned int uint_hensu; unsigned char uc_hensu; memcpy(&uint_hensu,&kouzoutai.uc_hensu,sizeof(uint_hensu)); memcpyをしようとしコンパイルしたところ、エラーがでてしまいました。 原因は何でしょうか? uc.hensu自体は構造体できっております。 unsigned int と unsigned charでmemcpyしようとするとエラーがでてしまいます。 unsigned char 同士でするとエラーがでません。 何か変数はこのままのサイズでうまく解決できないでしょうか?
だから出力されたエラーをそのまま書けと何度(ry
どうしてエラーメッセージをそのまま書けない?質問する気があるのか?単に面白がってるわけ? やめてしまえよ!
539と558は、別人じゃないか?
笑
別人だろ だから消えてもらいたい ほんとタヒねよ
暇人やってる成りすまし君がまだいる...
>>558 <string.h>インクルードした?
567 :
デフォルトの名無しさん :2009/12/09(水) 22:50:16
>>556 インクルードはしております
memcpy自体は成功しています
569 :
デフォルトの名無しさん :2009/12/09(水) 23:58:10
memcpy で、 intとcharと別々でも普通はいけますよね?
>569 確保されていない領域にアクセスするのだから、何が起こってもおかしくない。 >558 エスパーして、kouzoutai.uc_hensuがunsigned charだとすれば、 memcpy(&uint_hensu,&kouzoutai.uc_hensu,sizeof(uint_hensu)); 1バイト分しか確保してないのに、unsigned分(4バイトかな?) 読んでコピー仕様とするので、警告が出るだろうね。 ランタイムエラーで落ちたりするかも。
571 :
デフォルトの名無しさん :2009/12/10(木) 00:21:35
hensu は4倍と uc_hensuは1バイト これって普通では
釣りなのかマジなのかわからんが。 本当に教えて欲しいなら汚いままのソースとエラーメッセージをそのまま晒せ。 他人に聞かなきゃわからんようなレベルの人間が綺麗なコード書くなんて誰も思ってないから恥とか思うな。 プログラマが伸び悩む一番の要因がコレだ。どんどん他人に見せてバカにしてもらえ。絶対伸びるから。
573 :
デフォルトの名無しさん :2009/12/10(木) 02:00:41
以下のA*B掛け算プログラムで、なぜかAの値を入力した瞬間強制終了されてしまいます。 原因の解明、お願いいたします。 #include <stdio.h> int main(void) { int a = 0; int b = 0; for (;;){ printf("掛け算 A * B\n\nA = "); scanf("%d", a); printf("\nB = "); scanf("%d", b); printf("\n%d * %d の結果は %d です\n", a, b, a * b); } return 0; }
scanf("%d", &a);
575 :
デフォルトの名無しさん :2009/12/10(木) 02:42:41
>>574 早速ありがとうございます。お陰さまで解決できました。
それともう一つお尋ねしたいのですが、
149 * x でxに最大16777216(2^24)が入れるようにしなければならないのですが、
xが14000000を超えたあたりから答えが異常値になりました。
(149 * 15000000 では -2059967296 149 * 15000001 では -2059967147)
これをなおすには、どうしたらいいでしょうか。
int -> unsigned long %d -> %lu
>571 intのサイズがいくつになるかは環境依存。 もっとも今のPC環境ならまず4になる。intのサイズが1なら問題ないと言えるかも。 それでも、ポータビリティを考えれば好くない。
どこだよsizeof(int)が1の環境って
文字列からスペースもしくは終端値があるバイト数を 出すにはどうすればいいの? 試してみたができない while((*p==32)||(*p==0)){++p;++i;}
文字列における終端値の数は一つに決まってる気がするが。
while(*p) if(*p++ == 32) i++;
582 :
デフォルトの名無しさん :2009/12/10(木) 10:22:48
正規分布表をC言語で作りたいんやけど だれか作ってくれ
作りたいんなら、自分で作れw
つExcel
strcasestrくらい自分で作れ
はい
stristrだろJKとか思ったけどPHPだた。。。
590 :
デフォルトの名無しさん :2009/12/10(木) 15:07:15
>>529 2次関数と直線の交点が2つあるとき
その交点2つでの2次関数の接線2本の交点を求めるプログラム作れ
簡単だぞ?
atio関数のっ逆バージョンないの? 数値から文字列にするみたいな
sprintfでいいだろうitoaは非推奨だし
593 :
デフォルトの名無しさん :2009/12/10(木) 17:53:37
いい加減scanf関係覚えろ 変数に入れるんじゃない アドレスに入れると覚えろ だから、 内部ではアドレス操作である配列やポインタ変数に入れるときは&つけてはならない アドレス操作でない普通の変数の場合は&をつける
まずおまえが覚えろよwww
そもそも単に値一つ入力するだけに scanf を使うなよ。 scanf はそういう関数じゃないから。
アドレスに入れるとかワロス 使ってるのはアドレスだがアドレスに入れてるわけじゃないしw
確かにscanfの無駄使い scanfも仕事選べ
アドレスに入れなきゃ変数は存在できねえぞ すべてのデータはメモリのアドレスに入る。 アドレスに入るからメモリコントローラはタグだのCASだのRASだの使ってアドレスを参照する。
>>598 >アドレスに入れなきゃ
そもそもアドレスって何だか解っていないやも知れず。
>すべてのデータはメモリのアドレスに入る。
ダウト。
>アドレスに入るからメモリコントローラはタグだのCASだのRASだの使ってアドレスを参照する。
知ってる単語を精一杯並べると後が苦しいぞ。
え?
メモリコントローラは最終的にアドレス目指して配置してるからなw メモリそのものにもアドレスを判別できるようにチップが搭載されている メモリセルだけ繋いでも動作せんのぜ
C言語の入門にお薦めのソフトって何ですか?
Internet Explorer
LSI C-86 試食版
> すべてのデータはメモリのアドレスに入る。 C言語使ってると、そういう錯覚に陥りそうになるが、実際はそうではない。
レジスタやスタック・貧富だってアドレス管理だぜ
#define PI 3.141592 // -PI<=rad<PIになるよう正規化する double GetNormalizedRadian1(double rad) { while (rad<=-PI) rad+=PI*2; while (rad> PI) rad-=PI*2; return rad; } double GetNormalizedRadian2(double rad) { static const double PI2 = PI * 2; double i=ceil(rad/PI2); return fmod(rad+i*PI2, PI2); } 上と下では結果が違うんです GetNormalizedRadian1(-3*PI) ----> -3.141592 GetNormalizedRadian2(-3*PI) ----> 3.141592 上の関数だとループがなんかイヤだったので下の関数にしましたが、 下手に小細工するよりかは上の関数の書き方の方が良いでしょうか
>>608 丸め誤差があるので、その辺りを考慮して書き直すべき。ループするのは論外。
そもそも、%fを使うよりも%gを使おう。ついでに言えば、精度を考慮して%.20gとでもすれば様子が掴み易い。
某商用ソースで if(FuxkOSX) { FuckingToshing += FuxkJobs; FuckingToshing += FuxkJobs; FuckingToshing += FuxkJobs; FuckingToshing += FuxkJobs; FuckingToshing += FuxkJobs; } っての見たんだけど これとforなどのループを介してやるのとでは どっちが速いの。
大して変わらん ものによる 実測知る
アメリカ大陸横断するのに250CCバイクで行くのが早いか 750CCバイクで行くのが早いか議論するようなもの
アドレスは場所じゃなくて場所を示す指標だろ。 アドレスには何も入らないだろ、アドレスが示す場所に入るんだよ。
アメリカ横断ウルトラハイパークイズ 罰ゲーム でででーでででー(ずどぅどぅどぅん) 東京直行
>>610 基本的には、ループは展開した方が速い。
ループにすると、ループ回る度に終了するかどうかを判定する必要があるからね。
>>613 そういう言葉遊びの問題じゃ無いだろ
データを入れる場所を確保してそこにアドレスという情報を与えるわけで
例えるなら
C地区の4丁目4番4号の家に手紙を届けるということは、厳密には北緯30度、東経150度の地点に手紙を届けるということで、
「C地区の4丁目4番4号」という住所は手紙を配達する人間が便宜的につけたものでしかなく、
同じ地点でも何かのきっかけで住所が指し示す場所が変わってしまうこともありえる
みたいなことを言いたいんだろ
市町村合併とか?
我ながら例えがおかしいな つまり「アドレスが指し示す場所」と「メモリ上の場所」は別概念の物だってことね
配られた世界の上でアロケーションするしかないのさ。
>>617 イメージ的に「他国の侵略」が一番しっくりくる気がする
ハードディスクもメモリの一種なんだぜ?
「物理アドレス」は変わりようねえだろ アドレスって言うと論理アドレスしか思い浮かばんのか そして論理アドレスだって物理への橋渡し役でしかないから アドレスであることには変わりない
C言語にゃ関係ねぇよ。 Cのコード上で存在するデータ(変数やら関数やら)なんて 最適化で消えることすらあるのに、メモリが何だとか いつまでもグダグダとウザい ヨソでやれ
ここ以外のヨソがあるだろうか。ここがこの板全体のヨソなのに
ソースコード上とバイナリコード上ではまた違うだろ バイナリコードでどういう風に動作してるのかをイメージするのは大事だよ
626 :
質問厨 :2009/12/10(木) 22:29:02
メモリのことを主記憶装置というのは知っていますが、ハードディスクなどの事はなんというのですか?
外部記憶装置、だっけ?
>>626 外部記憶装置または固定記憶装置
Cから見れば
>>623 の言うとおり何だろうと関係ない。
アドレッシングはOSの仕事だから。ただしまともなOSがない組み込みは除く。
629 :
質問厨 :2009/12/10(木) 22:35:45
>>627 ありがとうございます。
主記憶装置って情弱はハードディスクと勘違いしてるやつ多くて困りますよね。
アセンブラはメモリ操作が主 で、その後継であるCは「メモリ操作ができる高級言語」である必要があったから 異例とも言えるほど強力なメモリ操作(ポインタ)機能を備えている。 だからCをやる限り「メモリなんか関係ない」などと寝ボケたことはいえない。 そういうやつがオーバーフローを引き起こしてセキュリティホールを作る。
>>630 なんかwikipediaの内容をそのまま書いただけのような書き込みですね。
>>630 論理アドレスは必須だけど物理アドレスは全くもって不要です。
>>630 処理系の話と言語の話の切り分けも出来ん奴は
処理系依存スレにでも引き込もっとれ
「Cをやる限りメモリなんて関係ない」 「Cをやる」ってなんだ?w
物理アドレスがなかったら論理アドレスがマッピングできずにメモリに乗せられないじゃんw 仕組みも分かってないのかw
>>635 身も蓋もない言い方をすれば、犯すってこと
>>636 意識する必要はないってことじゃないの?
論理アドレスってのはテーブルのようなもので 毎回同じメモリが空いてるとは限らないから 空いてるところに番号振ってどこが空いていても問題なく動くようにしよう と、物理アドレスを変換するためだけのもの。 ハードディスクドライブに対しても同じようにどこのシリンダーやクラスタが空いてるか固定できないので 番号振って空いてるところを使えるようにしているだけ。 で、空いてるかどうかは物理アドレスを見てみないとわからない。 イコール 「物理アドレスがなければ論理アドレスが存在し得ない」 バカだろw
ユーザランドな環境でのプログラミングは意識する必要がないって意味じゃないの?
さっきから論外な事ばかり言ってる人がいる。
642 :
デフォルトの名無しさん :2009/12/10(木) 23:27:53
_stdcallを、呼び出される関数の前につけることによって なぜつけない場合よりメモリの使用量が少なくなるのかわかりません
>>642 stdcall は引数をすべてスタックに押し込んでから call
何もつけてなければコンパイラが好きなようにしてくれるはず
スタックにいれずにレジスタに乗せたまま call したり
>642 お使いのコンパイラのメーカに問い合わせてください きっと活舌の良い方が答えてくれるでしょう 分かったらさっさとタヒんでください
647 :
デフォルトの名無しさん :2009/12/10(木) 23:37:54
>>645 だからプログラムの容量も減らせるとサンクス
>>642 呼び出しの後処理を呼び出され側でやるから。
何回も同じのを呼び出す場合は差が出る。
一回だけなら変わらん。
>>647 おまえ読解できてないぞ。
その説明だとむしろ逆になる。
逆ぢゃね?
stdcall は実行ファイルのサイズは小さくなるがメモリ使用量はむしろ増加する。
653 :
デフォルトの名無しさん :2009/12/10(木) 23:49:12
>>649 まぢで?
じゃあ見た本嘘かかれてるっぽいな
651のが結論?
今はいろんなとこの容量が大きくなってるけど 減らすのを目指すとしたらメモリ使用量の方だよね?
キャッシュ
早く終わってプログラム終了したらその分のメモリが丸々空くわけだが。
プログラム本体によるメモリ占有か
メモリ消費量が多すぎると、早く終われないこともある。
メモリ開放に手間取るのか
高速アルゴリズムのオーダーってメモリのことは考慮されてないよね?
ヒープメモリーを使え
ハードウェアのことまで考えるようになったら病気
まあ俺は最適化に -O1 を選ぶけどな。
そこは難しいところ
667 :
デフォルトの名無しさん :2009/12/11(金) 00:27:11
入門編のスレで深い話をするなぁ
× 入門編のスレで ○ 雑談スレで
>>1 これってさ
初心者、初級者、入門者の区分ってどうなってるの?どういう違いがあるのか分からんわ
俺は上級者
別に好きなスレでいいんじゃない?ダメなら誘導するだけだし このスレはこの板でも勢いがある方だから人が集まってるだけだよ
初心者……文法を一通り理解している 初級者……小規模(30000行ほど)のプログラムを作成できる 入門者……使用言語のコンパイラの実装ができる
俺的区分
初心者・・・学校の授業なら初めてのプログラミング授業レベル
変数とか関数とかサッパリわかんない段階から
市販の入門書終了までのレベル。基本的なことをほとんど知らない人たち
初級者・・・学校の授業なら次のステップの応用プログラミングの授業レベル
市販の入門書に書かれていることくらいはマスターしている人たち
入門書には書かれてない関数やライブラリ、アルゴリズムを学ぶ段階
入門者・・・
>>1 で上記の人たち以外ということで
初級者よりは知識を持っているレベル
だけどCの世界はまだまだ広い。そんな人たちの交流のスレがここ
675 :
デフォルトの名無しさん :2009/12/11(金) 00:40:23
今現在ついていけるかどうかはともかく 深い話に興味はなきゃ、お先真っ暗でしょ 今その手で打てるだけのパンチこいや 快勝と惨敗の荒波こそが人を育てる ハナタレがいつのまにか大先生を追い詰めていく それがこの国の原動力とでも言うべき泥流だ
>>675 いや暑苦しいよ、修造みたいな爽やかさもない
>>673 俺30000行とか経験無いは・・・
最高でも8000行くらいだ・・・
8000と言ってもCじゃなくVBとJAVAだし・・・Cでは1000行も書いたことないかもしれん
順番おかしくね?入門が最初だろ。 入門者→準備が済んで学習を始めた段階 初心者→参考書などを学習中の段階 初級者→参考書の学習をひととおり終えていくつかの実用プログラムを組んだ段階
>>679 それだとこのスレが(´・ω・`)ショボーンになるだろ
具体的なことを言わなくていい話は、いつでも盛り上がるなw
当たり前だろ。ここは入門スレなのだから
>>682 それはどこのどんなスレでも同じ
どこのスレも知識豊富なオタクばかりでは無いからな
ワッショイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワッショイ
つまり入門者ということは C言語にはどんな環境が必要かとか 自分のPC環境でC言語使えるかとか C言語開発にどんなソフト必要かとか どんな入門書や専門書やサイトが使いやすいかとか そういうのを尋ねるスレってこと?
入門スレで 入門者バーカ と言うキチガイ上級者様たち視ねよ
上級者はこのスレに何しに来てるんだ
それは、説教とか
>>689 相談に乗ったり
アドバイスするためだろ
入門者同士で語り合って何になるってんだよw
>>686 学習を始めてるんだから準備は終わってるだろ
無駄に盛り上がってるな
寝てもいいですか?
どうぞどうぞ
おやすみなさい
リスト構造とfread/fwrite使って住所録作れって言われたんですけど、いまいちどう使えばいいかわかりません ポインタの情報ごとファイルに保存するんですか? それとも読み込んだあとにリスト構造を使うんでしょうか
ファイルへの読み書きではポインタ情報は関係ないだろ。
>>698 例えばリストの構造体を
struct interactive_list {
char name_kana[32];
char name_kanji[32];
char address[128];
struct interactive_list *prev;
struct interactive_list *next;
} interactive_list;
とするなら、ファイルに保存するのはname_kana、name_kanji、addressの3つだけでいい。
*prevと*nextはプログラム実行のたびに変わる可能性があるので、保存しても無意味。
*prevと*nextはかわらなくて、prevとnextがかわるって言いたいのかもよ
この場合は、ポインタよりもインデックスを使った方がいいかも。 途中のデータの削除後、データを追加したときの仕様をどうするかによって、難度も異なる。
>>703 なる
>>704 課題でリスト構造といわれた場合は単方向リストでよい場合が多いと思うよ。
双方向リストの場合はそのように書かれる。
というのが俺の経験則だが、どうだろね。
住所録とやらを整列する必要性は無さそうだな とにかく継ぎ足していけばよさそう
ハッシュとツリーに決まってんだろ
>>700 住所録なら
名前
住所
電話番号
郵便番号
が妥当
10年修業してようやく入門の入り口くらいだろ。
・リスト構造をどこにどのように適用したらよいかわからない ・ファイルへどのデータをどのように保存するのかわからない これがききたいの?
不定長のデータをリストにするだろ。 つまり、住所部分。
誰がうまいことを言えと
カオスになってきたな このスレ
>>698 自由に色々試してみればいい
それでうまくゆかなかったらまたここへ来ればいい
もうすこし日本語整理して質問するといいよ
ソースだらけのスレとか汚いだけだろ
宿題スレじゃないからな。
それはうまいがな(´・ω・`)
(´・ω・`) ←これ禁止
そして以下コロッケ議論禁止
ハンバーグ派はこれだから
はいはい おまえの勝ちだよ よかったね
>>609 %g はときどき予期しない出力を出してくるので、個人的にはいやです。
>>642 昔は PASCAL 呼び出しっていってましたよね。MS-PASCAL がそうしていたから。
リターンするときにスタックの払い戻しを呼び出され側で処理するんですね。
不定長引数がつかえないなど、仕様としてスタンダードとは思えないのですが、なんでそんな名前になっているのでしょうね。
win16/32 API で採用されているから?
>>720 え?むしろソースをさらす人しか来ない強者のスレでは?
宿題を書く人はお客様。
#define WINAPI FAR PASCAL #define PASCAL _stdcall
>>730 少なくとも x86 は呼び出された側でスタックを解放する機械語命令が用意されていて
それがスタンダード。他の言語でも大抵そうなってて、C/C++ だけが異端。
unsigned long intってできれば使わない方がいいの?
なんでそう思ったんだ。
Why did you think so.
((o(´∀`)o))ワクワクなんでー?
What made you think that?
よく勘違いされる豆知識 「自動こそ正義、指定固定は邪道!」 メモリ管理やタスク管理、スレッド管理は自動でやるのが常識!と思ってるバカがいるものだが OSが自動でやれるからには、その管理領域を食っているのである。 となると、メモリが無駄に食われる。 ユーザーのPCには大容量メモリが載っていると、確証もないことを当てにする素人がよく陥る思考であるが こういうラクなゆとりに流れるとロクなもんは作れない。
誰も言わないことをさも言ったかのように言い、 それに対して罵詈雑言を持って反論したかのように振舞う。 いわゆるマッチポンプである。藁人形理論とも言われる。
スタックに大きなメモリを一度に確保しちゃダメって言ったでしょ!
ム板でオレ様意見を通そうとするならウィットな一行にマトメろよ な?
上級者が湧いてきたか
聞くこと無いなら黙ってりゃいいのにw
ハードウェアのことも考えるようになったら一人前
食べる飯の量は三人前
結婚してないやつは全員半人前なんだよ!
MainWindow(QWidget *parent = 0) 関数の宣言でこんなのを見つけました これって、どういう意味なんですか?
スレ違いです
753 :
750 :2009/12/11(金) 22:49:13
>>752 関数ポインタの存在は知っていますが、
何に使うのかとかメリットがわかりません
デフォルト引数はC++なのでスレ違いです。
スレ違いとかいいつつ デフォルト引数 というヒントを与えちゃうお前らツンデレだな
756 :
750 :2009/12/11(金) 22:58:36
>>751 で指摘してもバカには通じなかったから仕方なかったんだろw
× 食べる量の飯は三人前 ○ 食べる飯の量は三人前
s右から左へ文字列検索する関数無いの?
自分で作れカスってMSがいってた
VisualBasicにLikeという文字列を検索してくれそうな関数があった
strrchr()はあるのに、strrstr()はないんだな。
763 :
デフォルトの名無しさん :2009/12/12(土) 00:29:09
セキュアな文書管理システムを作りたいのですが、言語はやはりCでしょうか?
764 :
デフォルトの名無しさん :2009/12/12(土) 00:30:39
>>759 探したい文字列をstrrevして、strrevした文字列を、strstrする。
CとかC++は確かに強力ですが セキュアに作るにはきわめて高いスキルが必要です^^ プログラムを始める前に、オライリーの C/C++セキュアプログラミングコックファック Vol.1-3をお勧めします。
766 :
デフォルトの名無しさん :2009/12/12(土) 00:33:13
やはり、程遠いですか…サンクスですた。
セキュアってどういう意味だろう
ハイレベルすぎてついてゆけない入門者
いやいや。CやC++で作るのには高いスキルがいるという話であって たとえばJavaはもっと手軽にセキュアですし、 もっと便利でセキュアなツールとか世の中にはありますにょ。^^
上級者用のスレがあるだろw ふざけるなw
772 :
デフォルトの名無しさん :2009/12/12(土) 01:11:24
CやC++でのセキュアプログラミングは上級レベル。 Java、.NET、Flashのような VM 上で動かすことを考えなさい。
C#に構造体ってなんのためにあるんだろう クラスだと継承ができるし、いろいろできるから便利じゃね
メモリの関係とかじゃね? 処理速度が違うとか?
775 :
デフォルトの名無しさん :2009/12/12(土) 01:57:24
>>773 記法は似ているが全然違うものだ。
System.Int32 に対する int だと思ってくれ。
前者しかいらないという考えなら、構造体いらない。
>>773 スレ違いだが、構造体はスタックにのるよ
777 :
uy ◆e6.oHu1j.o :2009/12/12(土) 08:51:25
C言語でC++のSTLと同機能のリスト群を実装したいとき MapStringInt("a",0,"てすと"); これでは代入という意味が構文的に曖昧なので 下のような形式での代入をしたい A = B そのまま書くとこうなるが、コンパイルエラーになります MapStringInt("a",0) = "てすと" これを、コンパイルエラーにならないように MapStringInt関数と同名のマクロを以下のように定義したいと思いました このマクロをどのように書いたらいいのか教えてください #define MapStringInt(a,b) \ MapStringInt("a",0) = "てすと" また、このような代入が出来て、なおかつ printf("%s" , MapStringInt("a",0) ); このような表示も可能なマクロを作ってください 例を挙げると、つまりこういうことに近い int b; #define A(a) b A(1) = 999; printf("%d" , b);
>777 MapStringInt の仕様が分からない。何で引数 3 つなの? あと、文字列の代入というのがもう一段階ハードルを上げてる。 strdup されるの?それとも strcpy?あるいはポインタ値を書き換えるだけ? なお、仮に、int* MapIntInt_(int key) という関数があって *MapIntInt_(5) = 3 という使い方をするなら #define MapIntInt(key) (*MapIntInt_(key)) ってすりゃいいだろうね。
>>777 関数の戻り値は左辺値にはできない。(参照のあるC++なら別だが)
だからCではデータの取得と代入は、get関数とset関数を別々に作るのが普通。
int MapStringInt_get(const char *key);
void MapStringInt_set(const char *key, int data);
もしくは
>>778 みたいにデータへのポインタを返すようにすれば左辺値っぽく使えるが
使い方をちゃんと明記しないとわかりづらいかも
いいえ、あなたの言語仕様に対する理解度の問題です。 一応ヒントを出すと ポインタの配列は、多次元配列(配列の配列)とは違います。
>>780 int main()
{
int **b;
int a[3][5][6];
a[1][2][5]=123456;
b = (int**)a[1];
printf("%d\n",&a[1][2]);
printf("%d\n",b[2]);
return 0;
}
これでどうなると思う?同じになると思うか?
同じになると思うなら配列とポインタの関係をもう一度勉強しなおそう
int a[2][3][4]でa[0]とかa[1]をint [3][4]へのポインタに 明示的/暗黙的にキャストできるというのは規格票で定ま ってること?
>>733 PASCL : 呼び出され側で RET に引数をつけて 「RET 8 で8 バイト解放」などと呼び出す。
CDECL: POP BP -> BP レジスタの値を SP に代入する。→ RET → mov SP, BP
差があったとしても、果たして何クロック分になるのでしょうかね。
>784 その宣言では、式の中でのa[0]の型はint(*)[3][4]です。 暗黙でも何でもない。 int a[10]; という宣言でa[0]の型はintになるのと同じ。
int a[10]; と int*a; a=(int*)calloc(10,sizeof(int));
789 :
787 :2009/12/12(土) 13:47:10
ちゃんと規格の参照箇所も書いてある。 あ、型Tというのは、それが配列型であっても当然当てはまる。
ループ内でreturnしてもいいの?
条件を満たすまでループ、条件を満たしたらreturn
793 :
デフォルトの名無しさん :2009/12/12(土) 14:46:35
>>785 普通は、returnよりも、callが多いので、callが軽いことには意味がある。
また、PASCALコールの方がアセンブラから呼びたすときわかりやすいという理由もあった。
そのほか、後ろの引数から積んでいかなければならないというのも、嫌われる理由。
>>793 callとreturnは、同じなんじゃないか?
callのほうが多いって、callしっぱなしで戻ってこないケースが
たびたびあるってこと?
>>796 一つの関数はたいがい複数回呼ばれるから
>>797 「軽い」ってのは実行時の話じゃなくて、コードの量のこと?
799 :
798 :2009/12/12(土) 15:33:00
上のほうみたら「クロック」って言葉を使ってるから、 やっぱ「軽い」ってのは、実行時間のことだよな。 そりゃコードとしては、callのほうが多いだろうけど、 実行回数はcallもreturnもおんなじじゃないの?
暗黒の肩淫乱異常手技
SetClipboardViewer APIを使って簡単なクリップボード拡張プログラムを作ってます 初回起動時にクリップボードの内容が取得できないことがあります わかっているのはファイル名を指定して実行でCLIPBRD.EXEを起動後にソフトを起動したら正常に内容が取得できます クリップボードチェインが取得できないときはMessageBox APIでエラーを通知するようにしているのですがエラーも出ないで起動するときがあります クリップボードの中身はテキストなのですが、クリップボードの内容が取得できない原因として何が考えられますか?
806 :
uy ◆e6.oHu1j.o :2009/12/12(土) 19:35:28
>>777 すいません引数の数間違えました
>>778 Cでは関数を二つに分けてしまうんですね
よくわかりました ありがとうございます
>>800 C ならば void * はどのポインタ型にも代入できるから、キャストはいらない。でもC++ では必要だったかと。
C++ なら malloc calloc なんか使うなよ。
ホンマは、プログラマというのはソースコードだけ書ければいいのではない。 ・そのソースコードの何がどう最適化されるか ・出来上がったプログラムはスタックにどう乗るか ・CPU内部での動きはどうか これを頭に描けないやつは、所詮テキトーな半人前。 これが分からないと、人に教える教育側には回れない。 スタックがブチ壊れているのはデバッガで分かっても どこで壊れたのか分からないなど無様なことになるからだ。
811 :
デフォルトの名無しさん :2009/12/12(土) 21:53:05
うっうっうっううー。
ほんもののプログラマとは何か どっからどこまで半人前か みたいな主観的な定義なんかどうでもいいから技術教えれ
ソースコードのレビューでスタックオーバーフローとか見抜けない奴は(この仕事を続けるのは)難しい 型の不一致とかポインタで境界外にアクセスしようとしてるとか分かっても 実際にどうなるからヤバいのか、ということまで頭の中でシミュレートできないやつはノーサンキュー。
しかし世の中はそんなノーサンキュープログラムでいっぱい
ホンマのプログラマーとは たとえ世の中の全員が100PBのメモリを積むようになったとしてもメモリ使用量を1ビットでも削れるなら削る たとえ世の中の全員が10GHzのCPUを積むようになったとしても実行時間を削れるだけ削るためにifを減らす ソースを見たら頭の中でシミュレートでき、その結果は実際にコンパイルしたものと100%相違がない これくらいええやろ、これでチェック十分 などとバッファを甘く見ない これである
時代遅れ
その前にPvsNP問題を解決してください
>>815 この文体はオッサンやな
それも頭の固い
プログラマなら言いたいことはソ−スで示すべき。 偉そうにゴタク並べる口だけPGほど信用できないものはない。
printf("ホンマのプログラマーとは たとえ世の中の全員が100PBのメモリを積むようになったとしてもメモリ使用量を1ビットでも削れるなら削る たとえ世の中の全員が10GHzのCPUを積むようになったとしても実行時間を削れるだけ削るためにifを減らす ソースを見たら頭の中でシミュレートでき、その結果は実際にコンパイルしたものと100%相違がない これくらいええやろ、これでチェック十分 などとバッファを甘く見ない これである");
ファイルからの読み込みとかを練習してます fgets(str,20,fp) ネット上から引用しただけなので、この引数の意味がよく解りません この場合の strは、ここに一時的に格納 20は、読み込む文字数or20ビット fpはわからん これで合ってますか? よく解らないので正しい知識を、どうか教えてください
>>821 まずはC標準関数のリファレンスを何でもいいから読めとしか……
>>815 最初の二つはネタでしょ。そんなことするなという例。
三つ目、意味不明な文であるが、いまどきのコンパイラは元のコードが想像できないような最適化をしてくることがあるので100%は無理。
四つ目、バッファを使うよう場合には、普通カプセル化する。
カプセル化とか…まだいんのかよC++厨は
C言語でもカプセル化はできるよ
>>821 > fpはわからん
> これで合ってますか?
合ってるわけないだろう常識的に考えて
830 :
798 :2009/12/12(土) 23:11:13
>>821 googleで「manpage 関数名」でググれば、リファレンスはでてくるよ。
manpage fgets()とか。
でも、なんか入門書買って、それにのってるソース打ち込んで
動かすとかしたほうが近道だと思われ。
はい、わたしはOOP厨です
質問なのですが、一通り基礎を勉強し、いざ練習問題を解こうとしてもどうやってコードを書けばいいかわからず、しかし答えを見たら納得できるという状況が多々あります。 こういう場合は発想力が足りないからなのでしょうか?または基礎がまだ固まっていないからなのでしょうか? 曖昧な質問で申し訳ないです。
それでいいよ。答えみてパターンを覚えとけ。
サンプルコード打ち込んで実行しないでただ教科書読んだだけだったりしない?
>>832 知ってる語句とイディオムが足りてないんだと思います。
ただ関数の機能を覚えるだけでなくて、実際にどう使われているか、
そして実際に自分で使ってみることで自分の血肉にする作業が
私には不可欠でした。
・アルゴリズムとデータ構造 ・他人の書いたプログラムのソースコードを読む
>>832 まず練習問題を読んでコードを考える
判らない場合、構わないので、答えを見て、よく読み、理解する
理解したら、答えを伏せて、もう一度その問題を読んで、白紙の状態から考え、コードを書き出す
書けないなら理解が足りないので、もう一度答えを読み、何が理解できてなかったのか、その部分をよく理解する
理解したら、答えを伏せて、もう一度その問題を読んで、白紙の状態から考え、コードを書き出す
以下白紙から答えを書けるまでループ
あとはたくさんやって色んなパターンを覚える
int *p=new int[n]ってやってn+1個目が欲しくなったらどうすればいいの?
スレ違い
ゴメン
口より手を動かせ
手が書き方覚えるまで入力&コンパイルだな
言語の習得とアルゴリズムの習得は別だからな。 文法だけ覚えても書けないよ。
string $a1[] = `print $b`; //結果:2ch1 となった場合、2ch1に1を足して 2ch2を変数に入れるにはどうしたら良いですか。 質問が分かりにくくてゴメンナサイ エスパーな人教えて下さい
>>844 根本的なことを訊くが、それはC言語なのか?
言いたくても言えなかった
違うのれす(^q^)
数学の問題も扱うが数学とは決定的に異なる点 「コードに完成は無い」 「完成は、書き直しの始まり」 書き直し書き直しの連続
甘いな
トウガラシを混ぜれば?
答えが合ってればそれでよいという点では数学と同じだよ。 エレガントな解法を求める点でも同じだね。
答えがあってればそれでいいのはどっちかというと物理じゃないのか?
エレガントさと効率は両立しない場合が多々あるからなあ。
どうしてエレガントなのか何度も何度も問うてみたい どうみてもエレファントの解放でしかないんだが
100 0 5 6 40 50 74 75 こういうデータをファイルから1行ずつ読み取った時に、 左側と右側の数字を比較するにはどうすればいいですか?
一行ずつ読み取るってのがfgets()で読むってことなら、 sscanf()で変換すれば?
strtol(), strtoul(), strtod()を使う手もある
可読性的に100%でも実行効率的に40点のコードを読むのはつらい 可読性0%でも実行効率100%のコードを読むほうが遥かに楽しいし、ためになる
>>833-837 お答え頂いてありがとうございます。
とりあえずパターンの習得を進めていきたいと思います。
>>856-858 ありがとうございます
とりあえず調べた感じ、出来そうな
857さんの言った事をやってみます
どうしても分かりません 単純挿入ソートは単純選択と単純交換ソートとアルゴリズム的にどのように違いますか? 比較回数が少ないのかも教えて頂きたいです
>>861 あっそ。俺が教えたのは試さないんだね。ふーん。
864 :
855 :2009/12/13(日) 13:39:47
また成りすましのアホが湧いた
質問スレではよくあること
上級者が湧くよりはマシ
printf("sriop per second:%lu\n", (unsigned long int)count / (timeB - timeA)); countをunsigned long int、timeBとtimeAをdoubleで宣言しているのですがその場合これじゃ まともな結果はでないのでしょうか?
doubleなら%f
(unsigned long int)count / (timeB - timeA) 型だけ書くと (unsigned long int) / (double - double) -> (unsigned long int) / (double) -> (double) / (double) -> (double) printf()がdoubleのものを無理矢理unsigned longとして取り出そうとしている
%luに合わせたいなら(unsigned long int)(count / (timeB - timeA))
成り済ましのアホ == 自称上級者
873 :
デフォルトの名無しさん :2009/12/13(日) 20:48:46
(char *)malloc(sizeof(char))の(char *)ってどういう意味でしょう?
キャラポインタ型に変換
別に変換しなくても使えますよね? どういう意味があるんでしょう
これが、void* じゃなくて char* だってことを知ってもらうため。
変換せずに使って問題が起きたらデバッグして調べればいいよその方が頭に入るよ
コンパイラに怒られます
キャストしなくても怒られないし、問題も起きない
warning のレベルを上げよう。まさか、これをvoid*型変数へ代入しているということはないよな?
キャストすんなうぜえ
(char *) → (void *) キャストしろ。 (void *) → (char *) キャストするな。
キャストしないやつは池沼
#define NULL ((void *)0) あとは解るよな?
Cである限りWarningのレベルをいくら上げても警告でないよ。 仕様どおりだし、何もあいまいではないし。
あ〜疲れた。風呂入ってくるね。
>885 int execlp(const char *file, const char *arg, ...); に対して execlp(command, commmand, arg1, arg2, NULL); とかやって馬鹿にされるんですね、わかります
怒らないコンパイラ使ってるんだ
891 :
デフォルトの名無しさん :2009/12/13(日) 22:52:17
decという変数名って、何に使われますか? 十進法とかってこれで始まりますか?
decimal
895 :
デフォルトの名無しさん :2009/12/13(日) 22:55:19
decimal decrement decode
decaple
Data East Corp.
charもwchar_tも結局ただの固定長整数ですよね? ということはC言語側からすれば文字コードという概念は無く 文字列はただの整数の配列でしか無いということでいいんでしょうか?
整数の配列でしか無い
>>898 C言語に限らず、内部では0か1の羅列だよ。
そうなると文字コードの判別もどこかに判別用のデータを保存するか、統計から判断するしかないわけですね。うえーめんどくさい そういえばソースコードのリテラル文字列は文字コードどうなってるんでしょうかね?
日本語の判定テストレポート
対象ソフト。
universalchardet-1.0.3
http://code.google.com/p/juniversalchardet/ icu4c-4_2_1
http://site.icu-project.org/ nkf-2.0.9
http://sourceforge.jp/projects/nkf/releases/ libguess-0.2.0-d7
http://www.honeyplanet.jp/download.html 対象サンプル。
一部文字化けを含むネット上ニュースまたはwindowsXPのバイナリファイル。
個数 バイナリ 2300、 UTF8 5200、 SJIS 4100、 JIS 3800、 EUC-JP 2000
速度。
libguessがもっとも速くこれを1としたときの比較。 ICU 185、 nkf 30、 universalchardet 10
正解率。
libguess 0.99971(5個)、 ICU 0.9996(6個)、 nkf 0.998567(25個)、 universalchardet 0.969221(537個)
まとめ。
libguess( 関数 guess_jp)とnkfは日本語限定の判定。
ICUとuniversalchardetは判定可能な全ての言語での判定。
ICUは一致率60未満でバリナリと判定しこのとき4つのバイナリが西ヨーロッパ言語、2つのEUCが中国語となった。中国語と判定されたケースはもともと漢字が多く言語判定ではICUがもっとも正確といえる。
nkfの25個はSJISをバイナリと誤認した。universalchardetは、バイナリを言語、言語をバイナリなど間違えるケースが多発した。
日本語限定であればlibguess。 世界各国語が対象なら判定速度は遅いがICUがいい。
>>901 コンパイルオプションで指定できるコンパイラもある
決め打ちで固定されていて指定できないコンパイラもある
904 :
デフォルトの名無しさん :2009/12/14(月) 02:38:36
memcpy関数は memcpy(void *dst, const void *src , size_t n)になってる。 第二引数がconstになっているが、普通にバッファ間転送をやるのはどうすればいいの?
>>904 第二引数がconstになっていることでバッファ間転送に不都合がある例が思いつかないんだが。。
906 :
デフォルトの名無しさん :2009/12/14(月) 06:56:28
RunesusのM16ではmemcpyでバッファ間転送はできない。エラーは出ないが コピーできない。
907 :
デフォルトの名無しさん :2009/12/14(月) 06:59:04
906の記述は間違いかも。 ただしくは 「ICE動作ではOKだが、ROMに焼くと動作しない。」 sprintfなどもconstになっているが、これを使うとROM焼きすると 全く動作しない。
どうして動かなくなるんでしょう? ROMだから書き込む処理書いて動かないというなら分かるのですが、 constなら、むしろread onlyの意味で良さそうな気がするのですが。
ROM領域とRAM領域でアクセスの仕方が違うのかな? セグメントを切り替える必要があるとか
RAM → RAM のブロック転送のコードのつもりなのに const 付きのポインタは ROM 領域からの参照 ってコンパイラ/リンカがマッピングしちゃって ROM → RAM 呼び出ししちゃってる みたいな感じで ※ 上記のケースでセグフォしないのかな?
ICEとか見ると軍曹かと思ってしまう
そりゃC自身の問題じゃなくて、コンパイラかランタイムのバグですね。
913 :
便 :2009/12/14(月) 11:55:27
問題です。 元金、単利と複利の利率に対して、次のものを求めるプログラムを作成しなさい。 * 30年後の残高。 * 30年以内に複利の残高は単利の残高を上回るか。 上回るならば何年後か。 このプログラムがわかる人は教えてください。
914 :
デフォルトの名無しさん :2009/12/14(月) 11:57:57
自分でやれ。
単利:預金 = 元金 + 元金 × 利率 × 年数 複利:預金 = 元金 × (1 + 利率)^年数
917 :
デフォルトの名無しさん :2009/12/14(月) 14:52:20
/*入力された文字数をカウントするプログラム*/ #include <stdio.h> int main(void){ int i; char str[80]; printf("文字列を入力してください->"); gets(str);/*配列に文字を格納する*/ for(i=0; str[i] != '\n'; i++);/*文字列のカウント*/ printf("入力された文字数は%dです。\n",i); return 0; } このプログラムが上手く動きません。 for(i=0; str[i] != '\n'; i++); のところがおかしいみたいなんです。 誰か教えていただけませんか?
for(i=0; str[i]!='\0'; i++);
strlen
922 :
デフォルトの名無しさん :2009/12/14(月) 15:55:15
プログラマを薄給でこき使うのが楽なのでおすすめしますよ
アマグラマだろ
だれがアナグラマムルじゃ!!!ぼけ!!! しねねえええ!!!!!!!!
>>926 ちんたらやってるお前にアナグラマムルはありえんよなぁ
ROM->RAMへはスコンパイラ任せにしないで自分でforコピーしたほうがいい
931 :
デフォルトの名無しさん :2009/12/15(火) 08:14:47
c言語でメモリの総容量やCPUの速度を調べる方法、ご存知の方おりませんか?
API
メモリの総容量ってのは難しい問題でして、 仮想メモリが流行ってる昨今、実際の搭載メモリ量以上にメモリを確保できたりしますし CPUの速度ってのも難しい問題でして、 最近のCPUは状況に応じて速度を変えたりしますし
/procみたらわかるよ
プログラムが実行中かどうかを調べる方法をご存じのかたいらっしゃせんか?
プログラムは常に実行中です プログラムを実行しなければ、その調べる方法とやらを実行することもできません
ba-ka
>>935 常に動いているであろうosに聞くのが一番です
実行時に/tmp以下にファイルでも作って、 多重起動かどうかを調べたり、するかもしれない。
多重起動を知りたいのか 他のアプリケーションの実行状態を知りたいのか
電源の状態を知るAPIはありますか?
多重起動防止なら、mutex使う。普通のosならある。
psとかtopのソース入手できれば、他のプロセスの情報取得の方法とか わかるだろ?
口ではなんとでも言えるね
最近の質問C言語と関係ないのがおおいぞ。
質問です。 晩御飯にチャーハンを作る予定です。 何分炒めればよいのでしょうか? ご教示ください。
20分
とりあえず ハードウェアの状態を調べるのにOS越しでしか問い合わせられないやつはクソである。 メモリのことならメモリコントローラにアクセスすればよい。
951 :
デフォルトの名無しさん :2009/12/15(火) 18:52:52
ポインタというのは、 宣言時 int *P; /* これはint型のポインタPだよ */ 使用時 P; /* これはint型ポインタPのアドレスだよ */ *P; /* これはint型ポインタPのデータだよ */ で、いいのですか。いつどんなときでも、*をつければデータを表し、つけなければアドレスを表すのですか。
>>951 正確には違うが、初心者はそれで問題ない。
違う場合とはどんなものですか。 職場のソースで int* ptr; int src; int dest; ・ ・ ・ ptr = dest; というのがあるので、なぜアドレスに値をいれられるのかまったく分かりません。
>>951 つけたかつけてないかじゃなくて、個数も考えたい。
int **p; // intへのポインタへのポインタ
のとき、*pはintへのポインタだし、**pは、intだ。
>>953 そのソースを書いたやつを首にしてください
ポインタを指す位置を進める場合は、アドレスじゃなくて値を進めるのが紛らわしい。
ただのC言語だと、ポインタもINT型変数もない。 ただわかりやすさのため書いてるが 結局アドレスも実態はただのINT型数値 C++じゃ厳密になってるので無理 int x=100; int *p=x; こんなことも可能。 このあと*p=500; とか書くと、アドレス[100]を500にしろ というとんでもないことができる。
>>953 志村、それバグっとるよw
ptr = &dest; // int型変数destの「アドレス」を代入
*ptr = dest; // ptrが指す場所にあるint領域へ、destの値を代入
どっちかになるとオモ。最初の部分がタイプミスでなければ。
int *p; /* *pはint型だよ */ int **p; /* **pはint型だよ */ int ***p; /* ***pはint型だよ */
>>950 ユーザプロセスが?
ハードウェアに?
ばかなの?
>>957 入門以前の人が嘘を並べて惑わせるスレじゃないんだが。
ユーザーがメモリコントローラにアクセスできない理由がどこにあるのか。 OSを通さないのに。 32bitOSで4GB以上のメモリを積んだとき、メモリマップできない以上のメモリを RAMディスクとして用いるアプリがある どうやって実現していると思っているのか。 そもそもメモリ管理はOSしかできないことか。
そりゃOSだって結局BIOSに要求出してるわけだからな。 BIOSの制御構造がわかってれば直接制御できるだろう。
そのBIOSも、Cとアセンブラで書かれているので ますますもって出来ない理由がない。 そもそも誰も出来なかったらBIOSは存在し得ない。 BIOSが存在しなかったらOSもない。 だいたいコンピュータ自体成立しない。
>>960 何がウソなのかkwsk。
単にキミがC言語とC++の違いを把握できてないだけだと思うけど。
ウイルスやマルチユーザが無い性善説が通用した時代ならそれでよかったさ
OSってのは、言ってみれば「勝手に色々面倒見てくれる仲立ちソフト」 みたいなもん。 ハードウェアと、俺らが作る上っ面の仲立ちをしてくれる。 でも程度の差こそあれ、俺たちが通常作るソフトウェアであることには変わりない。 なら、OSができることは、「同じことをしてやれば」俺たちも出来る ってことだ。
それをさせないように、ユーザモード、カーネルモードというものがある
>>967 その仲立ちのため、アプリケーションソフトウェアが勝手にメモコンまで手を出されては困るので、
WindowsやUnixなどでは、アプリからは手を出せないようにしている。そこは役割分担。
「同じことをしてやれば」は、こっちもOSを作ればという意味でなら、その通りだ。
ちなみに、RAMディスクはカーネルモードで動くデバイスドライバ。
アプリケーションと同じ扱いではない。
969 :
968 :2009/12/15(火) 20:35:07
なんで俺の方につっこみ入れるんだ
CPUの仕様書見りゃ、メモリコントローラ内蔵のものであれば アクセスする方法が書かれているな。 ここのレジスタにアクセスしてページングせえよ、横と縦のアドレス得ろや、 そういうことが書いてあるからCなどアドレッシングが楽な言語で書くと。 アセンブリソースを別オブジェクトにしてJAVAでやってもいい。遅いが。
馬鹿に何を言っても無駄だなこりゃ
ドライバってなんだと思う? 俺らが書くような、普通のアプリケーションみたいなものなんだよ。 ただ、それはハードウェアを制御するアプリケーションという「ような」ものであって。 大したもんじゃない。 例えばCPUのレジスタEAXに1を書き込むとメシを作ってくれるとしよう EAXに1か0を書き込むソース(関数)が、デバイスドライバだ。 ソースにしたら、 int input_to_EAX(char input) { EAX = 1; } これでデバイスドライバになる。 大したもんじゃないだろ 何も特別なことをしていない。 で、デバイスドライバを呼び出すときに使われるのがAPI これもさっきの、EAXに1か0を書き込むだけの関数を呼び出すためだけのもの。 int Go_to_da_kitchin(char input) { input_to_EAX(char hogera); } これでAPIだ アクセスする関数があるなら直にユーザーに使わせりゃいいのに、 それだとなんか不都合があるらしい。
デバイスドライバを書いたことがあるかどうか知らないが、 「すごく高度な、大層なもの」というイメージを持ってるやつがいる。 大間違い。 単にデバイスのレジスタにアクセスして、値を取ったり入れたりしてるだけ。 デバイスはレジスタに値が入れば動くような設計になっていることが多い。 ただ、そこに対して値を入れているだけ。 ソフト的にはどう入れるか、OS的にはどちら側で動くかが問題なのであって、 やってることは大したことじゃない。 以上で述べたような簡単過ぎるコードだって然るべき側で動かせば立派に動く。 メシを作ってくれるCPUがあるならば、だが。
975 :
デフォルトの名無しさん :2009/12/15(火) 20:50:25
僕はまだ入門者なので素直にドライバ書ける人は尊敬する このスレにはいますか?
つまり、ルートキットやバックドアは正しい事なんです。 って事だよな。
まあ画像を出すのは面倒だわな。 ピクセル単位でのデータのやり取りになるから、制御も複雑になっていく。 でも、自分ちで自分が試すぶんには面白いものだ。
制御もらうときに制限かかってるだろ。 x86 ならリングレベルというものがある。 一般アプリではなんでもかんでもできるというわけじゃない。
>>973 不都合がある「らしい」じゃなくて実際あるから。
マルチタスクOSでは、複数アプリから同時に要求が来たときの調停をこなさないといけない。
そんなことアプリを作る度に考えるのはやっていられないので、OSとデバイスドライバの仕事になった。
逆に、
>>957 だって組込ならとんでもないなんてことはない。よくある光景。
あとC++でもキャストすれば使える。
980 :
デフォルトの名無しさん :2009/12/15(火) 20:59:53
必ず1回だけしか回らないループ ってどう書いてる? 途中でbreakを使いたいだけのとき そんなループ書くくらいならgoto使った方がマシなのかなぁ
ifやそのネストではだめ?
>>980 goto を使う
禁止されているときは do{ 〜 }while(0);
それも禁止なら関数化して途中で return
>>980 そういう用途で break を使うと、break される条件が switch 文になったり、ループの中に入ったときに発見しにくいバグになる。
私は、goto を使うべきだと信じている。
つーかifだろ
俺んとこはドライバ内でスレッドセーフだから、直に使われても どってことないようになってる。 世の中のドライバ全部が全部そうであるとは言わないがロックくらいはしてんだろ ドライバ内でもリソースの取り合いなんかザラにするわけだし、 ドライバであるから並行してどうこう、にはならない。 そういう意味でちょっとAPIの存在意義に疑問。
gotoってや 「絶対使うな」って風潮どっから来たのかねえ。 そういうふうに言ったとされる人物、Edsgerなんちゃらってのも 「私は絶対使うなとは言ってない」なんて釈明するザマだし。
(´・ω:;.:...
CPU固有のI/O制御命令、ポートマップI/Oの制御命令なんかもそうだが 「普段見慣れない命令」が入ってると、ここで何かやってる!てのが分かりやすい。 適切に使われているgotoもそうだが、読みやすいコードになると思う。 エラー起きてるのが分かりきってんのにグダグダやってんじゃねえ、ってときもそうだが わざわざbreakとかで戻らす意味を感じない。
個人で使う個人のプログラムなら好きにすりゃいいじゃん こっちは仕事でやってんだよ
>>980 逆switch-case みたいな構文が欲しいと?
ドカタ乙
gotoの何がいやかってラベルが必要なところ できればラベルは書きたくない breakでぬけられるってことは多重ループ脱出でもなさそうだし ifとか関数にするとかでどうにかなんないの?
gotoなんかは問答無用のジャンプだから、どこ見ればいいか何をしてるのか一瞬で分かるからな 俺は好きだな
basicでgotoの嵐みたいな書き方がはやったからじゃないの
ioccc に良いのがあったな。 確か goto カウンターだったかな。
へえ
組み込み系初心者です。 #define HOGE ((volatile unsigned int *)(0x3FFFC020)) この文の意味がわかりません。 #define HOGE 0x3FFFC020 ではだめなのでしょうか?
999 :
デフォルトの名無しさん :2009/12/15(火) 23:43:53
1000げと
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。