1 :
デフォルトの名無しさん :
2009/07/24(金) 23:19:03 BE:340816166-DIA(296430)
お疲れさまです。
以下、規格票も読んだことない阿呆は回答しないように
プロトタイプ宣言がない、ボトムダウンの場合について質問です 例えば、 int hoge(int a, int b) { return a + b; } int main() { hoge(10, 10); return 0; } これは、hoge(10);みたいな呼び出しはできません。それはhogeが呼ばれた時点で、引数の数が違うと判断されるのですよね でもボトムダウンの場合、 int main() { hoge(10); return 0; } int hoge(int a. int b) { return a + b; } こんな呼び出しができてしまいます。 この呼び出しがされた場合、関数が呼び出せてしまう挙動を見せます。引数の数が違うのに、です こういう書きかたの場合、呼び出し時のhogeの()の中身は無視され、ただhoge番地に飛んでいくだけ、という理解で良いでしょうか でも飛んで行くということは、用いられている引数の数がわかりますよね、ここで弾かれないのは、やむをえないCの仕様なんでしょうか
>>5 それが通るという環境は?
あと警告とかの表示に関連するオプションは?
>>5 暗黙のプロトタイプ宣言がなされる。
hogeが宣言されていないときに、hoge(10)を呼ぶと、
int hoge(int) というプロトタイプが宣言されたことになる。
そうすると、int hoge(int ,int) という定義と型が合わないので、そこでエラー。
8 :
7 :2009/07/25(土) 12:42:35
>>5 ごめんちょっと呆けてた。>7は無視してくれ。正しくは以下の通り。
----
C89では宣言のされていない関数を呼ぶと、暗黙のプロトタイプ宣言がなされる。
hogeが宣言されていないときに、hoge(10) を呼ぶと、
int hoge() というプロトタイプが宣言されたことになる。
括弧の中に何もかかないのは「引数の型チェックをしない」というプロトタイプ。
しかしながら実際のところ、hoge(10) は int hoge(int ,int) という定義と型が合わないので、未定義動作になる。
9 :
5 :2009/07/25(土) 12:51:40
>>6-8 なるほど、ありがとうございます
ちなみにbcc32をデフォルトでコンパイルさせてます -> bcc32 main.c みたいな感じです
引数の数が違っても、
hoge(10)
↓
int hoge(int a, int b)
この場合、aには10が入っていましたが、bには何かでらたらめな値が入っていました
hoge(10)が呼び出されるより前に、スタックに積まれていた値を4バイト分見てることになるんでしょうかね
引数も、型と個数が合う範囲では取って来れるということがわかったんですが、aは普通に使えそうです。こういう場合でも未定義動作とされるんですね
>hoge(10)が呼び出されるより前に、スタックに積まれていた値を4バイト分見てることになるんでしょうかね たぶん >aは普通に使えそうです。こういう場合でも未定義動作とされるんですね 未定義かどうか以前に意図しない情報を持ってきてる時点で駄目だし こんなのを許容するようならバグがあちこちに入って後で死ぬよ
やったね!これで乱数を生成できるよ!
12 :
前スレ>>990 :2009/07/25(土) 13:00:42
初期化をしています。 cos()とsin()の戻り値マップを用意して高速化しようかとおもいまして。 ラジアン値が分からない友人用のライブラリも同じように作ろうかと思ってたので
>>12 残念、私にはいい方法を思いつきませんね。
分割コンパイルですよね。少々面倒でも、マップを使うモジュールで 識別子にextern をつけるしかないでしょうね。
>>9 なにに挑戦してるの?
たまたまうまく動くようなコードのコレクション?
>>9 > aは普通に使えそうです。こういう場合でも未定義動作とされるんですね
1箇所でも未定義な動作があれば、そのプログラム全てが未定義の動作になります。
bの値を使わなくてもダメ(未定義の動作)です。
18 :
デフォルトの名無しさん :2009/07/25(土) 15:20:14
>>5 bccの挙動でCの仕様を推測するのはやめたほうがいいよ。
33歳無職童貞ですが今からでもC言語おぼえられますかねぇ そろそろ就職したいんで
33じゃあ無理だよ この業界35で定年だもん
C言語を覚えること自体は一月もあれば十分だし データベースの知識をちろっと加えれば 販売管理ソフトくらいはあっという間にかけるようになるけど 仕 事 は な い よ
同人ゲームでも作って一発狙ったほうが期待値高いよ
それ以前に業務経験のない33歳とか勘弁してください
童貞ってところはおkなのなw
25 :
19 :2009/07/25(土) 16:10:35
無理そうですね、わかりました。 スレ汚しすいません。
ガンバレ33歳っ!
27 :
デフォルトの名無しさん :2009/07/25(土) 18:23:54
#include <stdio.h> #include <stdlib.h> int main(void) { char *p; p=malloc(1); gets(p); printf("%s\n",p); return 0; } 1バイト割り当てたんだが。 16文字まで読み込めるのは何故? 2バイトになってるんだけど。
>>27 使っていいのは1バイト
それを超えてはいけない
管理できないなら
そういうのを自動で面倒見てくれる
別の言語を使えばいい
>>27 >16文字まで読み込めるのは何故?
>2バイトになってるんだけど。
意味がわかりません。
>2バイトになってるんだけど。
特にこっちは何をどう確認して2バイトなの?
>16文字まで読み込めるのは何故?
まあこっちはたまたまとか理由はあるんだろうけど
>>27 そもそもgets()って何?
どういう動作か説明できr?
31 :
デフォルトの名無しさん :2009/07/25(土) 18:30:16
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa と入力したら、1バイト割り当ててるから8文字までだろ? だが 16文字 aaaaaaaaaaaaaaaa とでるんだが。
偶然・・・かな
33 :
デフォルトの名無しさん :2009/07/25(土) 18:33:11
これって環境とかが原因してんの? 32bitPCだけど。
>>31 > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
> と入力したら、1バイト割り当ててるから8文字までだろ?
1バイト割り当ててるから0文字までだろ?
>1バイト割り当ててるから8文字までだろ? 何かものすごく勘違いされてるようで
>>31 ふつー1バイト一文字だよ。
16文字で区切られるのは、変な現象だな。
メモリをぶっ壊してるにしても、どのタイミングで文字列終了の0が入ってるんだろ。
37 :
デフォルトの名無しさん :2009/07/25(土) 18:37:02
1バイト1文字だったそうそう だが16文字読み込まれるんだけど。 意味が分からない。 独習Cにバイトを割り当てるとか書いてあったので。 1バイト割り当てたら1文字だけ読み込めるかとおもったら全然違ったんだが・・・
そのあたりはアセンブラちゃんと相談
>>37 1バイト割り当ててるから0文字までだろ?
1バイト割り当ててるから0文字までだろ?
1バイト割り当ててるから0文字までだろ?
ついでにgetsの仕様みてこいば
40 :
デフォルトの名無しさん :2009/07/25(土) 18:39:39
scanfにしても同じだったぞ。
>>37 gets()は、確保されているメモリのサイズは考慮しないで入力されただけ読み込む。
C言語って回答者もバカが多いのね。
>>40 scanf()も、サイズの指定を自分でしないと、どんどん読み込む。
1バイト分という約束で割り当ててもらったのに、それ以上に使うのは契約違反。
45 :
デフォルトの名無しさん :2009/07/25(土) 18:43:22
ただ違反だけでエラーがでないってやつ? 手動で割り当てたら。 p="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 今度は16文字以上読み込めた。全てaaaaaaaaaaaaaとでた。 狂ってる。
>>45 本気で語ってるんならバカ
冗談にしてもキチガイさが足りない
>>45 それは割り当てではない
リテラルを指してるだけ
char *x = "abcdef"; char y[] = "abcdef";
>>45 > ただ違反だけでエラーがでないってやつ?
そう。
>手動で割り当てたら。
それは入力のバッファに使っちゃだめだ。
ポインタと領域割り当てとごっちゃになってる
fgets()を使うのがふつーだな。 char s[256]; fgets(s, sizeof s, stdin);
52 :
デフォルトの名無しさん :2009/07/25(土) 19:04:20
解答者のレベルが低すぎて泣けてきた
スレタイ嫁よ。「入門篇」って書いてあるだろ。 回答者が入門篇なんだよ。
具体的にどのあたりがレベル低いか指摘できななくて、 思わせぶりなことしか書けないから、なんにも書かなくていいよ。 自信がないくせに、自己顕示欲だけは一人前。
>>54 おちつけ
回答も質問もしてない人間はこのスレには不要だ
解答が「〜だろ」「〜じゃないの」「〜と思う」など、断定を避けていたり、規格書も読まずに妄想を書き込んでいたりするところ。 はいはい、規格準拠スレに帰りますよっと。
58 :
デフォルトの名無しさん :2009/07/25(土) 19:25:15
fgetsもやってもダメだった。 諦めたwwwwwwwwwww オワタ
よく議論のときに、反論できなくなったら内容に関係なく相手の日本語の使い方がおかしい とか言い出すヤツいるじゃん。 まだ、具体的にどう日本語がおかしいって指摘できるやつならいいけど、 まえに「お前日本語おかしいよ。おれ文系ね」って、本当に頭悪そうな一行レス してるやつ見たことあるんだよ。 「お前ら規格とかしらねえの? おれ規格スレ読んでるから」って。
>>58 char *p = malloc(1);
fgets(p, sizeof p, stdin);
とかやってね?
動くから規格に準拠してるって考える輩おおいよな
そう思ってるのは規格マニアの頭の中の偶像だけだったりとは思わないのかね
>>62 いや、別に揚げ足とりたくて 言ってるんじゃなくて。。。
うん
64 :
デフォルトの名無しさん :2009/07/25(土) 19:37:24
IT系のやつは勝手に人と関わらないからコミュニケーションが低いと思って。 そのコンプレックスの裏返しで国語力とかコミュニケーションとか日本語力を過大評価してるんだと思うよ。 mallocは捨てたwwwとりあえずうまくできないから諦めとく。 回答ありがとう。
ITやっててコミュニケーションスキル低いとかもぐりだろwww
あきらめは肝心だ^^
gets()でオーバーフローするって話題で 規格のどこそに書いてあるとかいちいち 書かないとダメって、いいがかりにだろ。
だな、 人とコミュニケーションとれない割には 文書とかになると 理工系の文書はすばらしいとか 人の文章に対して ケチ付けまくるんだよな
malloc捨てたらcallocかreallocくらしかのこらない
C++に移ってnew使うかSTL使おうぜ!
Cを捨てればいい。 Cなんて データ構造とか アルゴリズム云々の話とかが好きなやつしか残らない
72 :
デフォルトの名無しさん :2009/07/25(土) 19:46:13
最近、コミュニケーションとか国語力、日本語力を重視してるせいか。 漢字ドリルとか辞書とか硬筆などなんか売れてるねww もうITに頼れば良いのにwwオールラウンドを求めたがるよね。 コミュニケーションを売りにしてる企業宣伝HPあるけど、完ぺき必要なのは技術力だと思うよ。 だいたい面接にうけにくるやつなんて、普通に会話などできるとおもうがww
プレゼンとかディスカッションで緊張してうまくしゃべれないけど リラックスしてる普段はすげぇできる学生とか普通にいたし こういうやつが就職できなかったりしたらかわいそうだって思う
>>62 思わないだろ。
例えば、
鍵屋に行って作ってもらった合い鍵がいい加減なできばえだったとして、
「作りは適当ですけど、
偶然でもとりあえず開いたから この合い鍵は有効です。
料金はお返しできません」
って言われたらこまるだろ?
ちゃんと作ってもらわなければ。
プロとして。
まあ普通、合い鍵屋は鍵が開け閉めできたら返品うけつけないけどな。
「char *p = malloc(1); gets(p); で一文字以上入力できる。なぜだ」って 質問に「gets()はオーバーフローするからww」みたいな答えがついて、それに、 「規格に基づいて回答してない。レベル低いね。プロじゃない」って言うのって、難癖つけてるだけだよな。
>>74 ちゃんと読みなよ。
>>62 はそんな鍵屋は実在しないんじゃね?と書いてる
「gets()はオーバーフローするからww」という回答はあまりよくない。 「gets()はどういう理由があっても使ってはならない」とちゃんと伝えるべき
ちょーどうでもいい流れだが、 >>「gets()はどういう理由があっても使ってはならない」とちゃんと伝えるべき は要らん。gets嫌いは宗教的だから困る。
使ってはならないことはないだろー 使っちゃ駄目なのを標準ライブラリに入れてんのかよって話になるしー
82 :
デフォルトの名無しさん :2009/07/25(土) 20:42:26
使っちゃ駄目なのを標準ライブラリに入れているんだよ
宗教的とかwww そういうレベルじゃなくて、使っちゃダメなんだわ。禁止事項。
分かってて使ってるなら別にいいんじゃないの?
後でそれをわからない人が使うかもしれないからだめ
マニュアルに「gets() は絶対に使用してはならない。」と書かれてるからだめ
getsは、次の標準改定でなくなります。
初心者はむしろgetsをどんどん使えといいたい。 セキュリティとか脆弱性とか、そんなことは初心者に要求するもんじゃない。 中級者以降になりゃ自然に使わなくなる。
89 :
デフォルトの名無しさん :2009/07/25(土) 21:10:17
ゆっくりやった結果がこれだよ!
最初はこれでいいから そろそろそれやめなよ そろそろこれもあれもやめなよ あ、これも実はやめといた方がいいんだよ言うの忘れてた 初心者から見れば教えられたことをどんどん否定されていく テンションだだ下がりコースっすね
>>86 何のマニュアル?
ヘルプには「絶対使うな」とは書いてないよね
最初に問題があること、だけど簡単だから今は目をつぶる事をしっかり伝えれば教えていい
初心者が gets 暗記するなら、 せめてこれ scanf("%99[^\n]", buf) 暗記しても同じ。
>>93 二行目を読む前に \n を飛ばさないといけない
改行のみの行を読めない
ちなみに英語だと「Never use gets().」 いずれもバグの項に記載されてる。
>>90 お前の言う通りだと思う。
初心者なんだから良いんだって。
しばらくは危険性があっても動くコードを優先して書いていて、
危険性・安全性に気を配れるような余裕が出てきた頃に
そういった使うべきでないってのを学んでいけば。
98 :
デフォルトの名無しさん :2009/07/25(土) 21:31:11
manコマンド [まんこ まんど]
>>95-96 それ linux あたりのマニュアルじゃないの?
そうじゃなきゃOSぐらい書け常識的に。
linuxのマニュアルは、宗教として強くそう信じてる人が書いたからでは?
Solarisのマニュアルみたら、特にそういう文章はなかった。
初心者が必ず上級者になるなら、そういう考えもありだろう。 しかし、初心者が初心者のまま終わる場合も多い。 getsは使わせないほうがよい。 どうしても初心者には教えていいというのなら、 自分の組織から、getsを当然に使うやつを外に出してはいけない。 社会の害悪になるので、転職させたり首にしたり、 卒業させたり中退させたりしてはいけない。
素人でも使いやすいラッパーを書いて使わせる ころあいを見て教えりゃいい
>>95-96 バッファオーバーランの危険性を覚悟の上自己責任で
使うにはいいだろ
絶対使うなは言い過ぎ
103 :
97 :2009/07/25(土) 21:36:32
>>100 うーん。
そう言われるとお前の言うことにも
正直 一理あるんだよな。
・・・ま、いっか。
プログラマにとって本当に大事なのは
納期と自由時間だし。
一ついいことおせえてやるよ。 こんなもんはな、コンパイルできて動けばいいんだよ。 勉強になったなあ、おっさん!
105 :
デフォルトの名無しさん :2009/07/25(土) 21:40:13
>>96 >>99 Solarisでもこうかいてあるぞ。
For this reason, it is strongly recommended that gets() be avoided in favor of fgets().
Micorosft
gets で読み取る文字数を制限する方法がないため、信頼されない入力ではバッファ オーバーランが発生しやすくなります。代わりに、fgets を使用してください。
FreeBSD
It is strongly suggested that the fgets() function be used in all cases.
106 :
デフォルトの名無しさん :2009/07/25(土) 21:42:04
納期というか仕事で使うようなソースでgetsは論外 素人ってのは入社したての奴も含まれるのか?
初心者でも仕事のコードでgetsは無い。
俺はいつもscanfをあぼんしているのだが、 このたびgetsもあぼんの仲間入りしました。
>>108 そんなのいちいち宣言しなくてもいいよ。
fedora man 3 gets バグ gets() は絶対に使用してはならない。前もってデータを知ることなしに gets() が何文字読むかを知ることはできず、 gets() がバッファの終わりを越えて書き込み続けるため、 gets() を使うのは極めて危険である。これを 利 用してコンピュータのセキュリティが破られてきた。代わりに fgets() を使うこと。 入力ストリームのファイルディスクリプタに対して、 stdio ライブラリの入力関数と、低レベル呼び出しの read(2) を混ぜて呼び出す事は勧められない。結果がどうなるかは分からず、おそらくあなたの望んでいる結果にはなら ないだろう。
>>110 そこまで言われると腹立つよな
わかってて使う分にはお前にそこまで言われる筋合いはないよと
言いたい
>>110 バグでも何でもないし
パンチカードの時代からgets()はある
キーボードから入力したり、後意図的にバッファオーバーランを
誘発させる馬鹿が増えただけ
つまりgetsは時代の変化についていけない老害みたいな関数ということですね なんだやっぱり削除したほうがいいじゃないですか
わかってて使うと言うが わかってたら使わないよな
もうやめて!getsのことを悪く言わないで! 代わりに俺を叩いていいから!
よし ケツを出せ
>>113 削除したほうがいいけど、動いているプログラムが動かなくなるので削除しないほうがいい
というトレードオフがあってな
バーンクラウド!!
119 :
デフォルトの名無しさん :2009/07/25(土) 23:24:33
オブジェクト指向って意味あんの? オブジェクト指向でしかできない事とかあるの? いまC言語をマスったからC++やろうとおもってんだけどww
お前は一生そのままでいい
>>87 どこの情報だよ。
WG14 N1362 Committee Draft ― March 1, 2009 ISO/IEC 9899:201x
7.19.7.7 The gets function
とやっぱり残されている。
同規格
7.27.9 Input/output <stdio.h>
2 The gets function is obsolescent, and is deprecated.
とあり、標準化委員もあまり好意的ではないみたい。
ごめんスレチだったか。
>>119 とりあえず
C++のオブジェクト指向は、
お前みたいなバカを追放することができる言語
だということだけでも覚えておくと良い。
123 :
デフォルトの名無しさん :2009/07/25(土) 23:43:42
オブジェクト指向って考え方は簡単なはずなんだが言葉が難解。
>>122 C++で何か嫌な思いでもしましたかwww
ここでC++の話をするのは止めていただきたい。 C++の話がしたいのなら別のスレッドでお願いします。
ん?悔しかったのかい?
>>128 > ん?悔しかったのかい?
> ん?悔しかったのかい?
> ん?悔しかったのかい?
何が ん? wwww
130 :
デフォルトの名無しさん :2009/07/26(日) 00:25:53
日本語でおk
せっかくだからC++で(ry
まあこんな入門者を見下すような低級言語スレにいるよりJavaスレおいでよ
マスタしたとか言ってる奴に業務やらせたら 分割コンパイルとmakeのメンテができなかったという事はあった
>>133 同意、せっかくこれからプログラミングの世界に入ってくる将来有望な若者に悪影響を与えかねない。
オブジェクト指向が学びたいのであれば、javaのほうが最適です。
makeはもうレジェンドへ追い遣られようとしてる時代だから 仕方がないよ
VARIANT型をWCHAR型に変換するにはどうすればよいでしょうか?
何がわかればコイツはCを知っている、というレベルなんでしょか
>>137 VariantChangeTypeでVT_BSTRを指定して確実に文字列にしておく。
その後、VARIANTのbstrValメンバを読み取る。
これはBSTR型だが、WCHAR*型として使用可能。
141 :
137 :2009/07/26(日) 01:44:10
gcc (GCC) 4.2.4 です、vc でのFindFirstFile に相応する フォルダ名を取得する関数名を教えてもらえないでしょうか。
>>141 です
すみません、FindFirstFile はファイル名を取得する関数でしたね
gcc でファイル名、下層のフォルダ名を取得す関数を教えてもらえませんでしょうか。
自力でopendir()していっこずつreaddir()して各エントリをstat()でしらべてディレクトリかどうか検査 いまはもっと便利な関数あるかな。scandir()とか
GCCとVCで分けて考えている・・・だと
>>142 を読んで理解できないのはよっぽどだめじゃね?
>>150 そんな「gccならnixにちげぇねぇwwww」なんて自己中な人はかわいそうだとおもう
ちがうちがう。gccだからじゃないよ。 FindFirstFile に相応する関数名が分からないという流れで 少なくともWindowsではないことは分かるじゃん
Windowsじゃないと思いながらWindowsなら同じでしょ?って聞くとかどうかしてる
>>151 >>150 をみて「「gccならnixにちげぇねぇwwww」なんて自己中な人」と決めるのもかわいそうなもので
最近他人のレスにケチつけるのが流行ってるのか?
最近じゃなく前から
という話だったのさ オープンクエスチョンはしんでいい
みんな! これからはクローズドクエスチョンで行きましょう!!
いつものことじゃん。 自演が多分に含まれてそうな気配がするのもいつものこと
>>160 IDがほしいお
IDチェンジで自演されてもいいからIDほしいお
IDつけろって話も何度も出てるのにねぇ。
164 :
162 :2009/07/26(日) 14:58:20
まあID欲しい理由は他にもあって質問者が最初に書き込んだレス番を名前欄にその後入れないことが多いからなんだよな 質問者の発言なんのかを見分けにくいときあるし質問が近い時期に重なった際はどっちのことなのかこれまた見分けにくいとかあるし
にしてもlinuxならフォルダじゃなくてディレクトリって呼んで欲しいな
166 :
デフォルトの名無しさん :2009/07/26(日) 15:06:11
急に伸びたな
167 :
デフォルトの名無しさん :2009/07/26(日) 23:14:35
read()とwrite()で画面に文字を表示するにはどうすれば…?
下記のマクロが引数なしでよばれても動作するようにするにはどうしたらいいでしょうか。 2回目のsprintfの部分でコンパイルエラーになるます #define DBG_PRINT(...) { \ FILE* fp; \ char str[100]; \ fp = fopen("dbg.txt", "a+"); \ sprintf(str, "line: %d", __LINE__); \ fputs(str, fp); \ sprintf(str, __VA_ARGS__); \ fputs(str, fp); \ fclose(fp); \ }
恐ろしい方法だが スクリーンバッファにreadで読み込めば表示は可能
>>169 無理
話は変わるけど fprintf は使わないの?
>>169 書式指定フォーマットが即値のリテラルの場合に限られる場合のみこれでおk
#define DBG_PRINT(...) { \
FILE* fp; \
fp = fopen("dbg.txt", "a+"); \
fprintf(fp, "line: %d ", __LINE__); \
fprintf(fp, "" __VA_ARGS__); \
fclose(fp); \
}
引数がどうであれ改行したいんでしょう
うそつきました。
#define の効果範囲ってどこまでなの? ソースファイルを分割してる場合とかって、#defineをしてるソースファイル内だけが定義範囲になるの?
コンパイル単位でのみ有効 .cに書いてて、それをincludeしているファイルが無ければそのファイルに閉じられるよ
Cプリプロセッサ言語はC言語と別系統
178 :
デフォルトの名無しさん :2009/07/27(月) 00:11:50
a→b→a→a→c→d→b→c→c→d のようなリストがあるときに、a,b,c,dの出現回数を調べたいときは どうやるといいですか?
普通にリストを巡回して現れた文字に対応する整数を++すればいいよ
リストを全走査
>>178 リストにぶら下がってる各情報の種別がわかるような識別情報を割り当てておいて先頭からチェック
182 :
デフォルトの名無しさん :2009/07/27(月) 00:24:55
char list[] = "a→b→a→a→c→d→b→c→c→d"; char *p = list; int count['z' % 'a' + 1] = {0}, i; while(*p) if('a' <= *p && *p << 'z') ++count[*(p++) % 'a'];
>>183 ほうっへ
こっちの方がよくね?
char list[] = "a→b→a→a→c→d→b→c→c→d";
printf("count(list(a))=%d\n", 3);
printf("count(list(b))=%d\n", 1);
printf("count(list(c))=%d\n", 3);
printf("count(list(d))=%d\n", 2);
存在するリスト全体に対して個別に定義すれば問題ない
調べると表示するは違う
自分で調べるか、プログラムを作ってコンピュータに調べさせるかの違いだな リストが1つで要素が10個なら自分で数えた方が早い
・ヒマだから ・要求が明確ではない場合にこうなるという教え ・ヒマだから
もう一つ ・IOCCCモドキの書き方をしたがる
あーたしかに。 今回のはそれにあたらないけど、、、っていうか*p <= 'z'だろ
・要求が明確ではない場合にこうなるという教え 明確になるように話を引き出せばいい あ、できないからこんなところで初心者に嫌がらせして楽しんでるのか・・・
193 :
デフォルトの名無しさん :2009/07/27(月) 10:54:24
このような外野がうるさくなる現象に何か名前をつけようず
だってテンプレに書いてあるんだもの。 今回のだってリストの実装が分からなければコードの示しようがないし 概略でいいならすでに回答者は満足を得られたようだし
>>183 2文字目でpが++されないから無限ループ
>>198 ほい
while(*p){if('a' <= *p && *p <= 'z')++count[*p % 'a'];p++;}
いやそのコードはもういいって
あほみたいな質問するのも答えるのも禁止したらこのスレなんか必要ないじゃん
言い方悪いけど、勝手に騒いでろ、って感性で行けばどうってことない
あほみたいな質問は禁止してない アホみたいな回答をするな、その回答をネタに雑談するなと言ってる
いやいいじゃないか 暇なCプログラマがじゃれ合うスレが一つぐらいあっても ここが潰れたら皆他のスレに迷惑掛けに行くだろ?w
「アホみたいな回答」にちゃちゃ入れて悦に入るのもkのスレの目的
データをそのまま配列のインデックスに使うのってありふれた手法だよなあ
バグやインデントはともかく、
>>183 がアホみたいな回答と言われる理由がわからん
いちいち説明しないとわからないほどアホなんだろうけど それに説明するのはもっとアホらしいなぁ。
質問をよく嫁 178が調べたいのは配列じゃなくてリスト 179-182で解決済
ソースコード中に直書きした文字列の文字コードはどう決まるの? コンパイラが決めるの?それともソースファイルの文字コード?
あ、それとコマンドラインから入力した文字の文字コードもよくわからないです
>>210 文字コードを決めるのはソースファイルを入力する人間。
コンパイラ、というかプリプロセッサはソースファイルの中に非アスキー文字が混じっていたら
16進の形式に変換するだけ。
で、ソースファイルの文字コードとコマンドラインの文字コードが一致していないと
プログラムがうまく動かなかったり文字化けしたり、たまにコンパイルできなかったりする。
>>211 コンパイラ次第。例えばgccの場合、ソースとバイナリと入出力のエンコーディングを個別に指定できる。
thx XPのVC++IDEだとソースもコマンドラインもshift_jisっぽいですね
Unicodeだよ? Shift JISの場合はコード変換されるので遅くなるって msdnに書いてある。
VCはBOM付きのソースファイルを扱える。 UTF-16でも、UTF-8でも可。
217 :
デフォルトの名無しさん :2009/07/27(月) 23:25:32
質問です 下のprintf(...............);に入る文を教えてください。 実行結果は下の通りです 要素x[0]は 7.526 y[0]は 2.474 z[0]は10.000 要素x[1]は 3.125 y[1]は 6.785 z]1]は10.000 #include <stdio.h> double sum(double x,double y); int main(void) { int i,n=2; double x[2]={7.526,3.125}; double y[2]={2.474,6.785}; double z[2]; for(i=0;i<n;i++) { z[i]=sum(x[i],y[i]); printf(.........................); } return 0; } double sum(double a,double b); { double c; c=a+b;return c; }
要素x[0]は 7.526 y[0]は 2.474 z[0]は10.000 要素x[1]は 3.125 y[1]は 6.785 z]1]は10.000 こういう感じで表示されればいいの?
printf("要素x[%d]は%f y[%d]は%f z[%d]は%f\n", i, x[i], i, y[i], i, z[i])
小数点表示の制限もあるっぽいな printf("要素x[%d]は%.3f y[%d]は%.3f z[%d]は%.3f\n", i, x[i], i, y[i], i, z[i]); になるのか
ああ、z]1]か。 3項演算子が放り込まれたコードが出てくるかね。
printf("要素x[0]は 7.526 y[0]は 2.474 z[0]は10.000\n要素x[1]は 3.125 y[1]は 6.785 z]1]は10.000"); あほな質問はやめろって言ってんだろ
何のひねりもなくてつまらんかった
宿題は宿題スレへ
宿題は自分でやれ
宿題終わらせないと9月が来ないからな。
9月が来ないなら、人生を終わらせておけばいいじゃない。
ハルヒを押し倒さないと9月は来ませんよ
で、ループは抜けたのか?
配列の初期化で質問です。 配列を0で埋めたい場合、 int a[100] = {0}; というサンプルを見たのですが、0xffffで埋めたい場合はどう書けばいいのでしょうか?
足りない分は0で埋める仕様 初期化時に任意の値で足りない分を埋める仕様は無い
じゃあfor文で埋めるか int i;int a[100];for ( i=0; i<100; i++ ) { a[i] = 0xffff; }
#include <stdio.h> int main() { for (int ic = 0; ic < 100; ++ic) printf("0xffff, "); return 0; } -- というプログラムを作って./a.out > foo.i とでもしてfoo.iを作ったら、 int a[100] = { #include "foo.i" }; -- でOK。
>237CXXerか。 C99なら、いや、やっぱり何でもない。オナニーは一人でするもんだ。
int a[100]; memset(a, 0xff, sizeof(a));
int が 16bit のときだけおkだ
8bitでなくて?
問題あるわ
sizeof(a) はちゃんと400になったぞ?
全部 0xff で埋めちゃだめ。
247 :
243 :2009/07/28(火) 15:27:44
ああ、0x0000ffffか。 ごめん、俺が間違えてた。
int a[10]; とか書いたらスタックメモリ(?)にプログラムの最初から最後までint 10個分のメモリは存在し続けるんでしょうか? それともその配列のあるスコープに入ったら確保されるんでしょうか?
実装依存。 スコープよりも少し広く、関数に入った時点で確保する実装もありそう。
最適化の影響もあるだろうしな。
スコープに入っている間は少なくとも有効であることは保証される っていうだけで、いつから確保するか、いつ捨てるかは特に規定されていない。
252 :
239 :2009/07/28(火) 16:18:56
ああそうか、0xffffか。 すまんかった><
ありがとうございます。 省略せずにきちんと0x0000ffffと書くべきでしたね。すみませんでした。 一発で埋める方法はなさそうなので、関数かマクロを作ることにします。
>>253 そう言う君は
C++でコンストラクタを学ぶととても幸せになれるかもしれない。
いやいや、こっちの勘違いなので。
256 :
デフォルトの名無しさん :2009/07/28(火) 19:54:51
int型をdouble型に変換してから計算することをなんというのですか?
トランスフォーメーション
>>256 全然たいした技法ではないので
特に呼び名はありません。
・・・もしかしてキャストとカンチガイしている?
259 :
デフォルトの名無しさん :2009/07/28(火) 20:59:22
>>258 下のような説明文の()に入る言葉です。
イント型変数で除算を行うと演算結果の少数部が切り捨てられて正しい値が得られない。これを避けるためにイント型の数値をdouble型に変換してから計算する。これを( )といい…
>>259 初めて聞いた。
そんなクソ参考書 捨ててしまえ。
焼却処分しろ。
その参考書を知りたいw 市販の物?それとも学校の教員とかが作ったもの?
文字通り 「尻も拭けない紙」 ってヤツか?
263 :
デフォルトの名無しさん :2009/07/28(火) 21:13:21
教員が作ったものです
264 :
デフォルトの名無しさん :2009/07/28(火) 21:23:42
ドラゴンキャストといいます
ちょwww それが答えか! もしかして高校生?
イントーダブル変換 ですかね
268 :
デフォルトの名無しさん :2009/07/28(火) 21:33:26
int i; double d,b; i = 50; b = 50.3; d = b + (double)i; みたいなことするってこと?
269 :
デフォルトの名無しさん :2009/07/28(火) 21:35:33
インド型変数… なんかすごいトリッキーな計算してくれそうじゃね?
270 :
デフォルトの名無しさん :2009/07/28(火) 21:36:31
%(剰余演算)をせずにint型の整数が奇数か偶数か判別する方法はありますか? ビット演算でできるといわれたんですが
うちの流派じゃそういうのはよくない例として禁止してる
274 :
デフォルトの名無しさん :2009/07/28(火) 21:42:03
>>272 ソースみたときに
わかりにくいからですか?
ごめん 1でいいや
「工夫」でいいんじゃね?
>>268 その例だとキャストの必要ないし
d = b + i;
あ、ごめん間違えた
>>271 intの場合(整数ならどれも同じだけど)2進数として考えた場合の各ビットの重みは
・・・32 16 8 4 2 1
という感じになります
つまり0ビット目のみ奇数か偶数を取り残りのビットは常に偶数になります
iが奇数の場合、i & 1が真になることがCの文法で保証されているの?
正数に限って、はい。
-1も16進でみると 0xFFFF・・・FFFで1は立つので問題ないか
283 :
271 :2009/07/28(火) 22:12:57
>>283 >うまくできません。
これではさっぱり分かりません
考え方がわかりません。剰余をANDで置き換える部分です
#define Free_NUM_MIN 0 #defien Free_NUM_MAX 16 int FreeNum = Free_NUM_MIN; int FreeNumGet() { int ret = FreeNum; FreeNum++; if(FreeNum > Free_NUM_MAX) FreeNum = Free_NUM_MIN; return ret; } こんな感じであいてるバッファの位置を管理する機能を作ってFreeNumGet関数が返した位置を元に バッファにアクセスすればOK
どっちが早いんやろうか?
>>285 正整数の 2 のべき乗の剰余に限り可能
x を正整数とする
x % 4 = x & 3
x % 16 = x & 0xf
x % 65536 = x & 0xffff
・4の倍数ってのは2進表記をした場合に下二桁は常に0になる ・4で割ったあまりは2進数表記をした場合の下二桁と同じ ・下二桁を取るには、二進表記での11、つまり3とandを取ることで取得できる どこから分からないのかな
x % 4 = x & 3 っておかしくないっすか?
>>291 3は二進数にすると0011
4は二進数にすると0100
4で割った余りだから2ビットを残せばいい
4で割ったことを想定してもいい 右に2ビットシフトだろ? つまり無くなるのは2ビット これが余りになる
>>291 代入するのはおかしいっていってる?
何がおかしいと思ってるか伝わらんよ
#if ↑ こういうのは何て言うんですか? C言語 シャープでググルとC#が出てしまう。
プリプロセッサ
プリプロセッシングディレクティブ preprocessing directives ISO/IEC 9899:1999 (E) 6.10 Preprocessing directives
プリプロセッサ制御子とかプリプロセッサ指示子とかプリプロセッサ命令とか言われているけど
英語は
>>297 にあるようにpreprocessing directives
300 :
デフォルトの名無しさん :2009/07/28(火) 23:50:04
クルマとか バイクの エンジンの制御プログラミングって どうなってるの? さわりとか すこしでいいから書いてみせて
302 :
デフォルトの名無しさん :2009/07/28(火) 23:55:29
エンジンの 制御とかのプログラミングソフトとかが あって 数値を 入力すれば 適正馬力とか エンジンが回転して 出力を出すように シュミレートされる とか とにかく 数値を入力していくだけでいいとかかなあ
あの手のファームはデータベースと隣り合わせだろ
小学生ですか?
interfaceでも読んでろ
>>300 さわりを教えるわけにはいかんだろ企業秘密的に
>>305 毎年なんだろうけど4月号か5月号が組み込みの基礎だったな
アセンブリから入ってC言語のポインタ辺りまでさらっと書いてあった
パチスロ制御はZ80アセンブラ
>>309 メイン基板は面白味も何もなさそうだね。
新幹線のモーターはH8で制御してる
まあリレーのオンオフできればあとは大容量の電気が流せるリレーとかをさらに制御してと 段階を踏めばいいからな
入力信号を割り込みで受け取り、うじゃうじゃと計算して出力ポートに信号を送る。
うじゃうじゃ
関数Aでva_listを宣言、va_startをし、 そのva_listを関数Bに引数で渡し、 関数Bでva_argしても、強制終了し、 また、ポインタにして渡しても、 値が指定値になってくれないのですが、 使用できないやり方なんですかね。
初心者はサンプル通りに書いとけ
318 :
デフォルトの名無しさん :2009/07/29(水) 15:26:08
0÷0の答えが「NaN」と表示されます。 答えを0にしたい場合はどうすればいいですか?
その前に0では割れない 分母が0になることがあるならif文などでチェックしておくしかない
320 :
315 :2009/07/29(水) 15:30:16
>>316 マクロで書くという方法があるんですね。
行末に \を付けるのがめんどくさいですが。
double division(a, b) { if(a == 0.0 && b == 0.0) return 0.0; else return a / b; }
>>321 a != 0.0 && b == 0.0のときは
>>321 division(1.0, 0.0) であぼん
324 :
318 :2009/07/29(水) 15:38:24
>>319 >>321 ありがとうございます!
0で割れないのなら、割り算の過程を飛ばし、0を返すってことですね。
よく分かりました。ありがとうございました。
325 :
321 :2009/07/29(水) 15:38:47
>>318 から、ただのゼロ除算については未定義だからあえて書かなかった
0÷0は計算できないって義務教育で習ったはずだけど、 その答えを0にしたいとか…、この人学校行ってないのかな?
>>327 その辺はわかってるでしょ
コンピューターだから勝手に0にしてくれると思ってたとかそういうオチじゃないの?
>>329 今年の夏はいちいちつっかかるのが流行りなのか?
331 :
328 :2009/07/29(水) 16:12:33
それを書かなければ終わってたのに・・・
>>328 のまるでよく分からない推測もいらんよね
それはそうと0/0の値はNaNではなくて不定であるべきだという疑問を持つんだが
不定で何を返すの?
not a number じゃないのw
ゼロ除算は例外を投げるべき
>>332 標準規格では0で割った場合の動作は未定義。
NaNを返そうが例外を投げようが鼻から悪魔が出ようが構わない。
ところで、標準Cとは全く関係ない蛇足だけど
IEEE 754としては不定を表すことを意図した値がNaNだろ。
>>315 それはなんか間違いをしているだけのはず。
vprintfなどva_listを引数に渡す実例はある。
1/0はNaNで問題ないと思うが、0/0は違う解釈も十分できるんじゃないかと思って。
0割りはとにかくNaNでしょ プロセッサが処理できないはず
1/0 => +Inf -1/0 => -Inf 0/0 => NaN
カレー食いたくなってきた
#include <float.h> _control87(0, _MCW_EM);
343 :
315 :2009/07/29(水) 17:53:21
void FooFoo(int marker) { printf("%d\n", marker++); } void Foo(int suu) { int i, marker = 0; for(i = 0; i < suu; i++) FooFoo(marker); } みたいなのと同じで、 関数の中で値を変更しても呼び出し元に影響しないせいでは?
345 :
315 :2009/07/29(水) 19:52:39
>>344 ありがとうございます。
なるほど、確かにそうですね。
以下のでいけました。
>>315 のも
>>343 のFooやBarみたいな感じでやりつつ、
さらに別の所にエラーがあり、落ちたのかもしれません。
//別の関数 + カウンタを別の関数で
void PiyoPiyo(va_list marker, int suu)
{
int i;
for(i = 0; i < suu; i++)
printf("%d\n", va_arg(marker, int));
}
void Piyo(int suu, ...)
{
va_list marker;
va_start(marker, suu);
PiyoPiyo(marker, suu);
va_end(marker);
}
piyoとかhogeとかfooとかふざけやがって
347 :
デフォルトの名無しさん :2009/07/29(水) 20:39:17
他の人が作ったライブラリを使って自分用のライブラリを作ろうと思ったんだけど 出来たものは前のライブラリのlibが無けりゃ動かないとんだ欠陥品だった。 自分が生成したlibファイル一個で動くようには出来ないの?
349 :
315 :2009/07/29(水) 20:51:42
>>346 すいません。
一時的に名前を使いたい時などに
hogeなどを使うといいらしいので使ってしまいました。
質問する時は、ちゃんと分かりやすい名前にした方がいいですね。
aaaaaaaaaaaaaaaaaaaaaaaaaaa
>>310 パチンコ用ハードの流通ルートは面白いよ
原価100円もしないZ80互換チップが、なぜか何十倍もの値段で……
おっと誰か来たようだ
>>351 いまはLETEC社製のCPU,ROM内蔵型のV4チップ
自決しました
C勉強して何になるんだよ。うんこが。
Cってでも入門用にはいい言語だと思う シンプルだし
信頼性のあるものを作るときはやっぱりCかなと思う
それはない
世の中、OSカーネルとかドライバとかファームウエアとかは、ほとんどCだろう アプリでも重要な部分はCで作ることが多い
あんまり関係ない
C普通に仕事で使うよ カリカリッと動くのがいいやね
使わんことはないがCで書くかどうかは信頼性で決まる事じゃないな
折角Cになって開発効率あがると思ったのに性能上げるためにキャッシュ効率まで考えなければいけない時の絶望感といったら
信頼性って具体的に何だよ
色々な事に使われてるという実績があるってだけじゃね
開発環境自体のバグは少なそうな気がする マイコン用とかASIC用とかそういう特殊な分野においては
アプリエラーで死んでもいいさ、原因不明打ち切りでもいいさ ってプログラムしか作らない人はなんでもいいんじゃね?
>>356 文法がシンプルだから入門者向けとは必ずしもいえない。
369 :
名無しさん :2009/07/31(金) 18:36:02
intへのポインタってint *x であってる?
yes
no
not yet
intへのポインタはint* 変数名まで書くと、それはポインタじゃなくてポインタ変数
またなんかメンドクサイ話に発展しそう
久しぶりにこのスレ見たんだが、相変わらずCを使わせたくない人が定期的に沸くんだな。 どういう意図かは知らんがウザいことこの上ない。
どなたか K&R の間違い集についてご存知の方はおられませんか。 昔みたときは、演算子の評価順序についてまで事細かに指摘されていたのですが。 ご存知の方はよろしくお願いいたします。
シンプルな言語だと入門用には向かないんかな? 複雑な方が入門向けってことなの?
複雑じゃないと教え甲斐がないだろ……
>>378 ポインタという概念がシンプルかどうかで異論があると思います。
pascal にポインタってありましたっけ?
PASCALでも a: ^integer; とか b: Pointer; とかポインタ型はたしかあるよ
ポインタ自体は別に難しくないと思うけど。メモリ上の位置を記憶するだけだし。 むしろ表記に問題があるんじゃないかね?*やら&やら他にも意味を持つ記号を使うあたりが。
例えばFORTRANはシンプルだ。 しかし、恐らく、多くのプログラム初心者の夢や希望には応えられない。 いまどきの初心者はWindowsやMacといったリッチなコンピュータ環境が当たり前だから 真っ黒な背景にテキストを表示するのが精一杯のような言語を学ぶのを楽しいと思うだろうか?
ゲームの改造コード自力サーチや、メモリ直接いじりなどをやっていたから ポインタ自体はすぐに理解したが、ポインタを使っているコードは中々理解できなかった
CASLをやれよ一番先に
そもそも入門書にはポインタの利点がわかるようなサンプルが少なくない? int a; int *b; b = &a; これでbは&aを指しますので、*bへの代入結果はaへの代入結果となります^^ とかいう説明で終わってる。必要性を感じれないようなサンプルの本が多い気がするのだけど気のせいかしら?
>>386 アセンブラレベルでみればポインタ使うなあという箇所もCだとそれっぽくならないからねえ
リストとか使い出してはじめてわかる
>>385 casl 実装があるならまだしも。そういう教科書はみたことがあるが思い出せない、ポインタ求む。
何を言ってるのだ。 Cでは文字列を扱うといやおうなくポインタを使う羽目になる。 そして、文字列をまったく必要としないプログラムはそれほど多くない。
文字列定数の先頭アドレスとしてポインタ渡しするって事実も、別にポインタなんかわからなくても ああ、こういう書き方するのか、ふーん、で書き方として納得して終わってしまう ポインタで書くと便利だ!ということから便利さを感じる例ってのが意外と少ないよ
まあ小さいプログラムじゃあ必要性は見出しにくいのは事実だね 規模が大きくなればポインタは使うようになるよ。 大きな配列を動的に確保して管理するために使うような簡単な物から リストとかいった若干手の込んだ使い方まで 高度になってくると、状態遷移を切り替えるためにポインタ使うとかあるけど
8bitニーモニックのモトローラ派(ポインタを意識する)とザイログ派(ポインタを( ) で包むなどポインタを意識しない)で差があったようなきが。
山積みした書類から先週月曜辺りと目算して必要な資料を取り出せるのが ぽいんた
>>386 全ての変数をポインタとメモリ割り当てで作ってみてはどうか?
int a;
という処理が
int *a = malloc(sizeof(int) * 1);
という処理とほぼ同義とすぐ理解できると思うのだが。
>>394 ありまに くなだらい ので そいうう わけの わかならい こと を いうの やめて くさだい。
バカでっかいキューを実装するのはいい経験にならないかな? 配列風に連続領域を確保すると都度コピーが必要なのに対し、リストだとデータ1つ分追加だけで済む。 で、目に見えて速度差が出てリストすげー!ポインタすげー!となったらいいなあ。
398 :
デフォルトの名無しさん :2009/08/01(土) 02:44:35
>>378 言語がシンプルだと、複雑なことを全部自分で面倒見ないといけないからな。
オートマとマニュアルの違いみたいなもんだな。
ポインタが ヒープ領域の割り当てをするために必要な場合と スタック領域の変数を示す場合に必要な場合で 前者を使わない限り特に利点がな
スタック領域をポインタでいじるの怖すぎ
402 :
名無しさん :2009/08/01(土) 09:36:28
オブジェクト指向やってから再びCを見ると なんでこんなに簡単なんだろうって思う。
C++勉強し始めると、C++は糞だからC一本で行こうっていう時期が必ず来るよね
404 :
394 :2009/08/01(土) 10:19:50
通常変数とポインタ変数の使い分けを強要されるから混乱するんだよ初心者は。 ・変数や関数は全てメモリ内のどこかのアドレスに配置されること。 ・アドレスが存在する以上ポインタと言えること。(実際ポインタで表現できること) この2つを最初に学習して、後から「実は簡単な表現方法もあるんだよ」と教えればいい。 まあコンピュータの仕組みを覚えるにはアセンブラが一番なんだが。
>>403 言い方を変えると「俺は頭が悪くてC++を理解できないや」と
自覚する時期の事だね
>・変数や関数は全てメモリ内のどこかのアドレスに配置されること。 こういう妄想に囚われていると、よりよいコードを書けなくなる訳で。
それのどこが妄想なんだ?
>>406 でもCの場合そういうことも理解してないとだめだしなあ
double型の糞でかい配列を確保してエラーになりましたとか質問してくるのは最たる例だし
>>407 変数はレジスタに割り当てられるかもしれないし、そもそも最適化で消えてなくなるかもしれない。
関数もまた然り。インライン展開で事実上存在しなくなることはよくある。
>>409 最適化されないベタイメージを知っておくのは悪くない
アクセス制御何とか汁
412 :
394 :2009/08/01(土) 12:27:33
>>409 アホか。
コード上でポインタとして使われてる関数が最適化で無くなるわけねーだろ。
おまえコンパイラの最適化を何だと思ってるんだ?
>コード上でポインタとして使われてる関数 ??? 関数ポインタのことか? 関数ポインタ経由の関数呼び出しが、インライン展開されることもなくはない。
そんなことできたらいいのにね
415 :
394 :2009/08/01(土) 13:13:18
>>413 あのさ、そもそもコーディング時の考え方と、最適化時の考え方は分けるべきだろ。
「極めて無駄な書き方をしたときだけ」という条件付きで「関数も消える」って?
それがコーディング時の「関数もメモリに存在する」という考え方と何の関係があるの?
関数ポインタがインライン展開されるコンパイラ名を是非披露してくれ
gcc 定数なら余裕でインライン展開される
418 :
デフォルトの名無しさん :2009/08/01(土) 14:20:37
たとえインライン展開されても、元の関数はメモリ上に存在するんじゃないの? 他の場所から(インライン展開されずに)呼ばれるかもしれないし。
外部リンケージならね
外部リンケージを持つ関数がインライン展開されることもある。
だからコーディング時の話とコンパイル時の話を一緒にすんなっつーのw コーディング時に「この関数はインライン展開されるはずだからポインタは使えない」とか考えるの? アフォだろどう考えても。
また無駄に伸びるな・・・
でも、みんな知ってのとおり、C言語の規格票には >変数や関数は全てメモリ内のどこかのアドレスに配置される なんてことは一言も書いてないんだよね。
関数ポインタを別な何かと勘違いしてるとか
だからなんだっつーの?関数へのポインタは規格にちゃんと存在するだろうが。 つーか考える順番が逆なんだよ。最適化が先じゃない。コードが先だ。 コード上で、どこかのメモリをアクセスするポインタが使われているなら、それはコード上はメモリにあるんだよ。 その後の最適化で実質消えても、コード上の考え方、使われ方が変わったわけじゃない。
>どこかのメモリをアクセスするポインタが使われている だから、そんなことは規格票のどこにも書いてないんだよね。 多くのコンピュータでポインタの実装にメモリアドレスを利用しているというだけで 別の原理で実装してもいい。 スタックやヒープのないコンピュータシステムだってあるのだから。 そもそもC言語ではポインタ変数やポインタ値に「型」があるけど メモリ上のアドレスにはそんなものないし、 領域の確保なんてものも言語の都合であって、コンピュータの都合じゃない。 この辺りのことは確か、ポインタ完全制覇の著者も書いてたように思う。 なんのための抽象化なのか、ってことね。 事これがC++になると、ポインタの理解で アドレスとかメモリとかの実装に縛られるのはいよいよ危険になる。
お前は「限定条件付き」で物事を否定するのが好きなの? 多くのコンピュータでメモリアドレスを使用してるならそれが一般的な考えだろうが。 それともう一つ。 どんな原理で実装されていようとも、それがC規格に準拠しているのならコーディングには影響しない。
>多くのコンピュータでメモリアドレスを使用してるならそれが一般的な考えだろうが。 「一般的」と思っているのは君だけで、標準規格がすべてだよ。 解釈が分かれたときの決定打こそが標準規格の存在価値なのだと メイヤーズ先生もおっしゃってたでしょ? 僕は別のコーディングの話がどうとかいうのはしていない。 ポインタとアドレスは別物だから、同じとみなすのは危険だよと言ってるだけ。
先生、入門者のみなさんがどん引きしてます!
>>428 めんどくさいヤツだなw
最適化がどうのインライン展開がどうのと、最終的に出来るバイナリコードの話ばっかしてたのは誰だよ?
オレは最初っから初心者のコーディングの考え方の話をしてんだろうが。
だから私はコードだけで勝手な仮定はするべきじゃないと思うのよね。
>>410 のいわれるとおり、べたイメージを踏まえた上で規格を知っておくのは、私のような初学者にはありがたいんですが、
それでも
>>428 の立場の人もいるんですね。
>>430 >最適化がどうのインライン展開がどうのと、最終的に出来るバイナリコードの話ばっかしてたのは誰だよ
僕じゃないよ^^;;; 自分は423,426,428だけ。
IDないのとレス番をつけなかったからいろいろまじっちゃったかな。
K&R第2版ではmallocの実装を通して、
抽象(ポインタ)と実装(メモリ)との関連を理解できるようになるんだけど
そういう教科書は他にあんまりないんだよね…。
IDつけてくれよ
C言語の標準云々を議論するやつらを隔離するためのスレがあったはずなんだが。。
>>435 規格スレはCの規格の文言をソースにして議論するためのスレなので、
ここで嬉々として規格規格言ってるような馬鹿には来ていただきたくないです。
バカ専用のスレに来ているあなたも相当なバカですね
438 :
デフォルトの名無しさん :2009/08/01(土) 20:20:57
int型からstd::string型への型変換はどうしたらできますか?
>>439 レスありがとうございます。
スレタイ見たらC言語だけ見たいですね・・・
スレ汚してすいませんでした。
& は address-of 演算子。
1.itoa(非標準) 2.sprintf → char配列 → std::string 3. int a; stringstream ss; ss << a; string s = ss.str();
EOFまで標準入力を読み込むプログラムを書きたいんですが、getcで一文字ずつ読み込む際、 Ctrl+Zが改行の直後のみEOFを返し、それ以外ではEOFではなく制御文字SUBを返してるっぽいです。 これは普通の挙動ですか?
ターミナルエミュレータの使い方は板違い
STREAMの挙動はスレ違い
すいません。それっぽいスレ探してきます。
>>446 てか、使っているターミナルの仕様を調べたほうがはやいんじゃね
448 :
デフォルトの名無しさん :2009/08/02(日) 02:11:59
Cコンパイラ(visual stdio 2005)とテキストエディタ(Tera Pad)をインストールしてから、visual stdioのコマンドプロンプトで動作させるにはどうすればいいですか?お願いします。
>>448 VisualStudioスレ辺りへどうぞ。
>>448 Visual C++を始めWindows上のCコンパイラは、Linuxとかの
UNIX上でC開発をある程度やった人じゃなきゃ扱いは難しいよ。
(IDEもそれなりに難しいが、コマンドラインツール群を
使うのはもっと難しい)
C/C++(特にC)がUNIXと深い関わりがあるってことは
知ってるだろ?参考書とか教科書もどうしてもUNIXを
引きずることになる。
Windows上ではそれに加えてWindows上の色々な特殊事情が
差分として加わるんで。
おもしろすぎる
452 :
デフォルトの名無しさん :2009/08/02(日) 12:03:35
449>> ありがとうございます。 450>> 授業で使う程度なので、UNIXとかは聞いたことがあるぐらいです。 普段なら、学校で使えるのですけど。
コマンドライン難しいとかこの先大丈夫かよ
学習のためにWindowsでとりあえずコンパイルできればいい、ってことならMinGWおすすめ。 できあがるバイナリもかなり小さくて済む。
bcc32が良くない?シンプルだし一瞬でコンパイル終わるし
cygwin
いまどきbccで学習するのは罠でしかない。 上級者が事情わかって使うのならいいけど。
冷めたからぶりかえすか Cの言語規格が実装と分かれてるのがおっぱい メモリがシームレスかつシーケンシャルに存在するっていう一般的な実装に準拠してない環境なんてザラ
bccってなんか悪いことがあるん? 簡単なソースのコンパイルくらいなら問題なさそうな問題?
>>460 template周りが腐っとる
それにバグてんこもり
例えばどの環境かを具体的に2,3個挙げてみて
>>459 > メモリがシームレスかつシーケンシャルに存在する
そんな主張してた人いたっけ?
>>461 C++関連のバグはVCにもある。準拠度が一番高いのはgcc。
つーかCの学習する限りはbccでも何ら問題ない。リリースが古いというのは確かだけどね。
最適化のレベルが低いかわりにコンパイルが爆速というメリットがある。
>>464 何が「何ら問題ない」だよカス
実際に使ってみて言ってんのか
>>460 ・学習するためだけに覚えないといけないことが多い
(その後、bccを実用コンパイラとして使うなら別だが)
・ユーザが少ないため問題がおきたときに情報が少ない
というのが初学者の学習用途には向いてない点。
過去スレで、bccだけが明らかに規格に違反した結果になるヤツがあった気がする。
>>468 すごく興味深いです
コンパイラは絶対だと思ってたけど、コンパイラにもバグってあるんですね
知りませんでした。恥ずかしい
>>468 だからCじゃなくてC++のバグだっての。
ここは、C言語のスレです。 Cの学習として、Cの機能だけ使うなら、Cが正しく動けば問題ない。
Cコンパイラとしてはbccでも構わないけど、 bcc32.cfgにまつわる質問が絶えないから初心者に勧めるのはやめたほうがいいと思う。
Javaしか知らないC初心者です。 質問させてください。 C言語で定数を定義する場合、 #define MAX 999 のように記述しますよね。 でも調べてみるとconstという修飾子があり、これを使うと、 const int MAX = 99; のように記述できます。 Java出身の自分にはこちらの方が自然に見えます。 定数の型も明瞭ですし。 しかし一般的に#defineの方が使われているのは何か理由があるのですか? よろしくおねがいします。
>>473 const int だと配列宣言するときにうまくいかないコンパイラが多いから
const intは定数ではないから
constでいいよ
Cだと、 const int TBL_SIZE = 100; int tbl[TBL_SIZE]; みたいなことができない。 C++だとできる。
まあ後発の言語か否かってところだねえ Cは後の言語で可能になってることができないとか結構ある。
constは変数に対して読取属性を付けるだけなので、本質は変数
そんでもってCは配列サイズに変数を指定できないから、
>>474 の言うように
配列サイズにconst intで定義された値を指定するとエラーになる
あと挙動が違うよ
#define MAX 999だと、コンパイル前にソース中からMAXという単語を探して、
そこを999に置き換えた後にソースのコンパイルが始まるという感じ
だからこの場合は、具体的に変数領域に値が確保されるというよりは、コードに値を直接書き込む感じ
constの
>>473 constは型修飾子なのでスコープが存在する。
主に、ある関数で引数として受け取った値を、不用意に変更しないように「その関数内に限り変更不可」の印を押すためのもの。
一方プリプロセッサによる置き換えはコンパイルの時点で定数として固定される。
つまり、プログラムの初めから終わりまで変わらない値を定義するなら、プリプロセッサによる置き換えを使うべき。
プルプロセッサでは重複があってもエラーにならにやい
482 :
473 :2009/08/02(日) 16:43:09
たくさんの返答ありがとうございます。
>>479 >Cは配列サイズに変数を指定できない
これは知りませんでした。。。
なるほど、constはJavaでいうfinal修飾子と同様に変数に属性を持たすだけ。
しかし#defineはプリプロセッサによって本当に定数になるので配列宣言時に使えるわけですね。
>>480 >constは型修飾子なのでスコープが存在する。
>主に、ある関数で引数として受け取った値を、不用意に変更しないように「その関数内に限り変更不可」の印を押すためのもの。
これはJavaのfinalとは違いますね。
char *strcpy(char *dest, const char *src);
のように関数定義の引数でconstが使われていたのもずっと謎でしたが(Javaのfinalをこのように使うのは不可)これも理解できました。
勉強になりました。ありがとうございました。
int hoge; if( hoge & 4 !=0) この条件式はどういう意味でしょうか?4とANDをとっている部分がわかりません
hogeの右から3ビット目が1ならば
って & より != のが優先順位高いかw
優先順位が曖昧な時は括弧付けてる
>>483 ビット演算の定数をは10進数でなく2進数にするとわかりやすい。
if( hoge & 0x0000000000000100 !=0)
0xって16進では
490 :
488 :2009/08/02(日) 17:02:13
!=0はいらない if( hoge & 0x0000000000000100) でいい。
4 != 0 ⇒ 1 hoge & 1 ⇒ hoge が奇数なら真。hogeが偶数なら偽。
492 :
488 :2009/08/02(日) 17:05:47
そうだな。16進数でやるしかないのか。
>>483 演算子の優先順位に従うと
hoge & (4 != 0)
となる。つまりhogeと1のANDだから、hogeの1ビット目が1ならば真。
494 :
デフォルトの名無しさん :2009/08/02(日) 17:10:26
0bで2進数じゃne
マジックナンバー反対!
for文回すときに for(int i=0;i!=10;i++) のように、条件判定のところに!=を使うコードは 今まで見たことがないのですが、なぜこれは書かないのでしょうか?
i==10
>>496 iが11以上になって意図しない動作をする可能性があるから。
先生それはただのバグだと思います
>>496 ・習慣による。
・例えばループ内でiに11を代入してもループを脱出できるように。
・iの型が整数型じゃなかったり初期値が外部からの引き数だったりしてもいいように。
>496 範囲として曖昧であるから C99はもういいから 経験がまだないだけで使うときには使う 例えばリストなどをイテレータのように扱いたいときに
502 :
496 :2009/08/02(日) 17:41:13
ここの住人的にswitch文ってどうなの
ラベルなのが気にくわないとかそういう議論をしたいのであれば ガチスレで聞いた方がいろいろな意見が出ると思うよ。
できるだけ使わないようにしている 異論はあるだろうが、あれはgotoと同じくらい危険だ 整数定数しか使えないこともよくない if-elseでぶら下がらせまくるかテーブルを作った方が直感的である また、switchを使うと関数が長くなる傾向にあるので作法的に良くなとされている
そうなのかーif-elseがずーっと並んでるより 見やすいときもあると思ってたんだけどな
なんでswitchの中で変数宣言できないのだよ
ブロックを使えよ
>>507 gccなんだかだと
{
}
で囲えばできるけど
swicth(hoge)
{
case 1:
{
int a;
a = ・・・・
}
break;
case 2:
・
・
・
}
むしろそれでできない環境はあるのかっていう。
VCでも同じことできるよ。でもまぁ、見た目が汚い・・・。
処理速度的にはif-elseよりswitchのほうが効率いいからな。 あまり深いif-elseは考えもの。
switch(x) { int y, z; case 0: // 〜 } でだめなの?
まあif elseもswitchもジャンプテーブルもその時々で使い分ければいいんでないの?
>>514 それはないわw
まだcase単位でスコープ切った方がましだろ
>>505 他の所も異論はあるけど。
>また、switchを使うと関数が長くなる傾向にあるので作法的に良くなとされている
初耳。
同じように書けばif-elseでも同様に長くなると思うんだが。
どういうケースでswitch-caseのが長くなるんだ?
微妙なボケにマジレスするなよ。。
for (int i = 0; i < 10; i++) { } みたいにforの条件文の中で変数宣言って出来ないんですか? 手元の書籍では int i; for (i = 0; i < 10; i++){ } のようになってます。
Cはできない C++は可能
C99からできるようになった
>>513 思い込みは捨てよう。今のコンパイラにとって、効率の差は(最適化を抑制しない限り)殆どない。
>>514 初期化できないので、コンパイラの警告を抑制しにくいと言う問題はある。
因みに、同じ理由でC++ではできない(筈)。
C++はコンストラクタ・デストラクタの実行タイミングという問題があるからなぁ。
strncpyをvc++で使おうとしたら警告されたんですけど 文字列の最後に'\0'代入を忘れなければ他は別に問題ないですよね?
ないです。VCはいちいちうるさいですよね。
#include <stdio.h> void main(void) { int a; for(a=0;a<1000000;a++){ printf("%d\n",a); } } 変数aの値が1ずつ増加するプログラムですが、これを実行するとパソコンの方は本気でこのプログラムを実行し、 幾つかコレと同じプログラムを実行するとCPU使用率がすぐ100%に到達してしまいます。 そこで パソコンがこのプログラムを一秒間に10回程度処理するくらいに控えさせる。 ようにしたいと思います。時間稼ぎ用のfor文を作ってしましたが、それでは時間稼ぎを行うためにパソコンが無駄な処理をしてしまます。 つまり複数同時に実行した時にCPU使用率がすぐ100%に到達してしまいます。 どのようにすれば解決できますか?
sleep
528 :
526 :2009/08/02(日) 21:55:49
以下の問題についてさっぱりわからないので教えてくださいますか? 任意の自然数aと実数bを受け取り,方程式 x^a=b の解を計算するプログラムを作成せよ(ここでx^aはxのa乗). ただし,累乗根の計算には,ニュートン法などの数値解法を用いること. また,解が無い場合はその旨を出力するよう例外処理をすること.
転載言われるからこっちを無しにしてから移動するのおすすめ
宿題スレ行け
宿題は自分でやれ
先生! DLLから構造体を返すと値がおかしくなります! LoadLibraryしたdllからint** suuzi_a;とか含む構造体(DLL側で2回mallocしてる)を返す関数を呼ぶと中身が意味不に。 同構造体内のint suuzi_b;とかはきちんと返されるんですが… exe側からは kouzoutai = (*dllFunc)(); みたいな呼び方で呼んでます。 dllはまんま return kouzoutai; で返してます。 これってもしかしてDLLからのリターンはコピー扱いになってるとかそういうオチですか…
>>534 C言語自体にDLLなんて機能はありません。ドザは素直にAPIスレかVisualStudioスレ辺りに引っ込んでなさい。
536 :
534 :2009/08/03(月) 05:49:36
アッー いかん寝ぼけてるなorz CじゃねぇWinAPIだ この系列のスレは半年ROMるよ…
WinAPIの問題ですらないな
>>534 こいつコールバック関数の意味もわかってなさそうだな
どこにコールバックの話が
WindowsXPはリトルエンディアンなの?
>>540 そのOSが動作しているハードのアーキテクチャがIA-32なら、内部データはリトルエンディアンで扱われているはず。
ソース見なけりゃなんとも言えないがWINAPIとか__stdcall 辺りがあやすい。 いずれにせよMS特有のC文法拡張問題があるから Windows上でC/C++を学んでしまうと別言語を学んでしま うのと同じになっちゃうって感じ
リトルエンディアンでコンパイルしたバイナリをビッグエンディアンで使うとどうなるの?
>>543 動かない
ただし bochs みたいな CPUエミュレータを使えば動かすことも可能
>>543 俺もやったことないから実験レポートよろ
そもそもバイエンディアンなCPUでないと、 リトルエンディアンのバイナリをビッグエンディアンで動かしてみることすらできないのでは
オープンエラー
ビッグエンディアン しばしばリトルエンディアンよりも優れているとされる リトルエンディアン しばしばビッグエンディアンよりも優れているとされる
どちらが正しいかで戦争までおきているからな。
ミドルエンディアンはどうでしょう
アメリカインディアンならどうでしょう
0x12345678 をバイト列に変換すると…… リトルエンディアン → 0x78, 0x56, 0x34, 0x12 ビッグエンディアン → 0x12, 0x34, 0x56, 0x78 ミドルエンディアン → 0x34, 0x12, 0x78, 0x56 アメリカインディアン → バイト列?なにそれ。
Cの浮動小数点型ってよくわからないです 例えばfloat。8388608から小数を表わせなくなりますよね これは2の23乗 floatの指数部は8ビットで+乗方向は2の127乗まで表せますよね でも上のように2の23乗から小数すら表せなくなる せっかくの小数型なのに小数点を表せなくなるくらいなら、 指数部ビット数を削って仮数部を増やせば良かったのになぁと思います 精度を大きく落としてまで大きな値(3.402823e+38)を格納できるようにしたのは、 何か理由があるんですかね それとも、「これはこういうもの」なんですかね
>指数部ビット数を削って仮数部を増やせば 指数部を 0 ビットまで削って仮数部を最大限に増やした int という型がありますよ
floatでたりなければdoubleもあるし、C言語は採用してるのIEEEで定められた規格のやつだろ? 気に入らないならIEEEに言った方がいいよ
どの言語の浮動小数点型ならよくわかるのか?
リトルエンディアンから見ればビッグエンディアンプロセッサが 解釈して書き込んだ0x12345678は0x1E6A2C48になるんじゃ? (その逆も同じ)
何か理由があるかって大きな数を格納したいからに決まってるだろ
>>559 メンドクサイので推測だがそれビットの並びまで上下変えてないか?
リトルエンディアン、ビッグエンディアンをぐぐってこい
>>554 たとえばGDI+のインターフェース
座標はfloatだろ
単純に言えばバンド幅はdoubleの半分で済む
精度はfloatで十分
そういう場合に使われる
>>559 8bit なら8bit の中まで反転するようなシステムはみたことないですね。
>>554 それはそのとおりですが、機械イプシロンの精度よりも表現できるレンジを優先するような用途はあると思います。
たしか 80x87 って double がデフォじゃなかったかと。
>>564 80bitがデフォだよ
外部インターフェースとしてfloatとdoubleのフォーマットを
持っているだけで内部計算は全部80bitで行っている
SSE関係はfloatだったと思う
FPUの話だよ
longが4byteじゃない環境なんてめったに無いよね?
>>568 そんなあいまいな確認をしないで自分の環境でsizeof(long int)とかやってサイズを調べた方がいい
というかそういう癖をつけろ
めったに?
Windows以外の64ビット環境ではsizeof (long) == 8のことが多いと思う。
って64ビットwindowsは4なの?
sizeofで調べろといわれたのはスルーかよ
ごめんごめん。
俺
>>568 じゃないんだ。
が、Windows以外のと前置きされてるから気になっただけなんだ。
実際その環境向けに作ることがあって、サイズが重要なら調べてるよ
int = longって同じサイズの型が2種類あっても無駄だよな int = 4 long = 8 でいいんじゃね
intやlongが適当な大きさなのはいいけど それとは別にint32とかint64とかの型も作ればよかったのに。
<stdint.h>
>>576 10年前に作られたんだけど、MSが無視しているんだ
int=2、long=4の環境のことも忘れないでください
今までに読んだ、これはなかなかいい入門書だ!っていうのと これはいいステップアップの書籍だ!っていうCの本があれば 教えていただけますか? ってこの内容だとスレチですかね…
わかってんなら書くなクソが
>>579 VC++ 1.5 とか、もう忘れたい…
規格で明確に固定されてるのはchar = 1だけだよな。他は環境依存。
しかし1バイトが何ビットかは決まっていないという罠
それはフォントの種類によるんじゃないの?
等幅フォントじゃないと揃えられない
等幅フォントなのに半角文字が等幅じゃないフォントもあるよ 身近なところに。
MS 明朝で フォントサイズが 1.5ポイントの倍数ではないとき ズレるんだっけか
俺にはズレてるようには見えない
私にもずれているようには見えない。 それはさておき、そんな間違いだらけのサイトでわざわざ苦しんでまで覚えようとする理由を教えて欲しい。
コピペしてテキストエディタに貼ってみたが わざわざ全角スペース入れてるんだなw
-- 結果を見てもわかる通り、数字はそのまま表示されており、 他の数字との位置関係がズレてしまっています。 もっと桁数の多い数字をいくつも表示する場合は非常に読みにくくなります。 -- 本当に桁数が多かったら桁ぞろえしたら却って読みにくくなるわけで。 結果ありきで、確認せずに文章を書いているのがばればれだよね。
>>586 どんな質問するにしてもせめて環境くらい書け。
>>593 誰か<TT>とか<PRE>タグとかスタイルシートの使い方教えてやれよ。
テーブルでもいいかもな。
>>578 stdint.hならVC++2010にはあるぞ。C++0x対応の一環としてだけど。
でも、DWORDが使われるんだろうな。
__int64とかをtypedefしとくとか
すいません質問よろしいでしょうか。 VC++2008ExpressのWin32コンソールアプリケーションで素因数分解プログラムを作っているのですが、大きい数(4ケタくらい)を入れるとこのようなエラーが出てしまいます。 --------------------------- Microsoft Visual C++ Debug Library --------------------------- Debug Assertion Failed! Program: ...A\Documents\Visual Studio 2008\Projects\素因数分解\Debug\素因数分解.exe File: f:\dd\vctools\crt_bld\self_x86\crt\src\isctype.c Line: 56 Expression: (unsigned)(c + 1) <= 256 For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) --------------------------- 中止(A) 再試行(R) 無視(I) --------------------------- Cはまだ始めたばかりなのでよくわからない点も多いのですがオーバーフローですかね? 長文失礼しました。
>>601 変数cの型は何?
256と比較してる時点でなんとなく想像はつくけど
603 :
601 :2009/08/05(水) 01:37:50
cという名の変数は使ってないんですよ。 (unsigned)(c + 1) <= 256 でググったりもしたんですけど英語のサイトばかりで…
charでやってそうだねw というかなんでメモリがアホみたいにある時代にそんな小さいエリアでやってるのやら
605 :
601 :2009/08/05(水) 01:40:16
charは使ってます。 何か改善策等ありますか?
factorコマンド
charより大きいのを使えばいいw
608 :
601 :2009/08/05(水) 01:47:26
というかソース晒せよw
610 :
601 :2009/08/05(水) 01:56:47
>>609 了解。
ファイル管理情報 6232
オリジナルファイル名 : source.txt [www.dotup.org6232.txt]
ファイル管理番号 : 6232
ダウンロードパスワード : C/C++
削除用パスワード : 非公開
パスワードなんかかけるなよめんどくさい
効率悪そうなソースだな
問題のコードはどこにあるんだ?
614 :
601 :2009/08/05(水) 02:03:21
>>611 大したソースじゃないんであまり公開されてる感を出したくなかったんですよ。
5行くらいしか書いてないのに「長文失礼しました。」とかいうのって何のネタ?
>>614 わけわからん。
人にみてほしいなら、クリック一つでみられる場所にあげてそのURLを貼るのが当然だろ。
>>610 > inta = inta;
これなんなの?ふざけてるの?
618 :
601 :2009/08/05(水) 02:06:25
>>612 サーセン総当たり式です。
>>613 奴の指摘する56行目はただ}があるだけです。
問題は他のところにあるかと。
>>615 エラーのメッセージボックスそのままコピペしたんで長いかなと思っただけです。
これ何がしたいの. if (isdigit(inta)) { inta *= i; }
620 :
601 :2009/08/05(水) 02:09:28
>>616 どうもお手数をかけてすいません。
>>617 すいません消し忘れです。
最初は最後にintaをもう一回使う予定だったのでintbに代入していたんですが使わなかったので置換でintbをintaに変えた結果がそれです。
>>620 おいおい
そういうのはコメントにしておけよ
622 :
601 :2009/08/05(水) 02:11:46
>>619 intaをiで割り過ぎて小数になることがあるのでその時割り過ぎた分を元に戻すための措置です。
>>620 どうもすいません。
もっとコメント増やした方がいいですね。
623 :
601 :2009/08/05(水) 02:13:23
素数を求めるループは無駄に処理重くするだけで意味がないw
625 :
601 :2009/08/05(水) 02:36:18
>>624 そうですか…
奇数で割ってくとか別のアルゴリズムを使うとかした方がいいですかね。
>>622 isdigitの仕様を理解していない。
とりあえず
>if (isdigit(inta)) { inta *= i; }
こいつを消して実行してみたら?
627 :
601 :2009/08/05(水) 02:43:26
>>626 行けました。
よく考えたらまずisdigitには!をつけとかないと駄目でしたね。
!をつけても駄目でしたが。
とりあえず消してうまく行ったので良かったです。
ありがとうございました。
まったくわかってないw isdigit(inta)が1を返すときにとんでもないことになるのが原因
と、isdigitが返すのは1じゃねーか。 真を返すときだな。
1じゃねえよ。
632 :
601 :2009/08/05(水) 02:53:12
>>628 よく考えればこの一文要りませんね。
要らないことをしたせいですか。
0以外であって1とは限らない(1である可能性もある)が正しいな。
634 :
601 :2009/08/05(水) 02:54:20
因数分解なんて #include <stdio.h> int main(void) { int i, j, n; scanf("%d", &n); for(i=2; n>=i; i++) { for(j=0; n%i==0; j++) n /= i; if(j) printf("%d^%d\n", i, j); } return 0; } 程度で十分だろ
636 :
601 :2009/08/05(水) 03:08:48
>>628 え?
そこでつっこむべきはisdigitのパラメータについてじゃないのか?
638 :
601 :2009/08/05(水) 08:21:43
>>637 「0から9の数値であれば」ってとこですね。
>>637 そもそもおかしいのは、
>inta *= i;
これ。
intaは文字用の変数じゃないからisdigit(inta)はだいたい偽になって実行されないが、
'0'<=inta<='9'になったときに実行されてしまい無限ループになってしまうのが問題点。
>>639 非0 であれば適合なのだから、その先は実装による。
グローバル変数で table[256] なテーブルが居て各文字の属性をビットパターンで保持
可視文字 (1<<0)
数値 (1<<1)
アルファベット小文字 (1<<2)
アルファベット大文字 (1<<3)
:
is〜 系は マスクの and で戻す ってな場合 そのマスク後の値が戻る (非0 なら適合してるからね
※ ASCII セットのみ限定の空間縛りをつければ、テーブル参照は都合よさそうだものなぁ
642 :
601 :2009/08/05(水) 09:16:42
>>640 よくわかる解説をありがとうございます。
isdigitの使い方を物凄く間違えてましたね。
助かりました。
なぜ素数かどうかを求めるループが駄目かというと、 素数かどうか確認するための除算の回数が数が大きくなるほどとんでもない回数に 膨れ上がっていくから。
644 :
601 :2009/08/05(水) 09:39:12
>>643 確かにそうですね。
そこの部分はカットします。
>>601 もう関係ないかもしれんが、仕様ではisdigitにはunsigned charの値(0〜255)およびEOFしか渡せない
その範囲外の値を渡した結果出たのがそのエラーと思われ
周期画像を作成するプログラムをお願いします
わかりました
がってんだ!
649 :
601 :2009/08/05(水) 15:28:28
>>645 そうなんですか。
勉強になります。
ありがとうございます。
>>649 Debug Assertionのメッセージが出ているじゃない。↓
Expression: (unsigned)(c + 1) <= 256
Releaseモードだとすっぽ抜けると思われる。
651 :
601 :2009/08/05(水) 15:45:06
びよーんすっぽすっぽ
Assertはリリースビルドでは無くなる
>>640 ちがうよ。
永久ループになるのは今回の主問題じゃない。
assertの直接の原因はisdigitのパラメータ不正。
657 :
601 :2009/08/05(水) 16:32:23
>>652-654 意味がわかりました。
とにかく今回の問題はisdigitの使い方だったんですね。
本屋で関数リファレンスかなんか買ってきて勉強しようと思います。
ありがとうございました。
658 :
655 :2009/08/05(水) 16:46:48
calloc の引数順 意味的には逆だた フルスクラッチで書いてみると意外に手間かかるな (所々 端折って0入れてるし…) main だけで現張りきれなかったーよ
Visual Studio 2005でシリアル通信(GPSデータの受信) を行いたいのですが、シリアルからのデータを取得する方法が分からずに困っています。 Visual Studio2005でコンパイル可能なサンプルなど有りませんでしょうか?
VC++でいいの? VSといわれても
VC++でお願いします。 C言語スレだったのでこう書けばVC++のとこでOKだと思っていました。すみません。
>>661 VCで検索すれば良かったんですね。こんな事で質問してしまってお恥ずかしいです。
ありがとうございました。
Cを勉強し始めて一週間文法はちょっとずつ覚えてきてますが アルゴリズムの理解が苦しくてくじけそうです
がんばれ
C関係ないし
667 :
デフォルトの名無しさん :2009/08/05(水) 22:37:55
6要素配列を使わなければならないのですが そのうち、任意の要素に書き込みをするときはどうすればいいのですか。 要素を定数で書けばアクセスは可能ですが柔軟性に欠けることと、 必ずそこに格納されるわけではないため、変数で制御しようとしたら今度は 「定数が必要」などとコンパイラに拒否されました。 どうすればいいのですか。 A[AI1][AI2][AI3][AI4][AI5][AI6] こんな感じで変数をそれぞれ回してチェックし、 何も書かれず空いていればそこに書き込むようにしたいのですが たとえば3要素目が空いているとして scanf("10s", &A[AI1][AI2][AI3]); などとしても入力を受け付けてくれません。
それは書き込む要素の型を間違えているから。 6次元配列の3次元目の配列が持つ要素の型は 型[AI4][AI5][AI6]となる。 もちろん、そんなものを書き込むのは無理であり ゼロから勉強しなおしたほうがいいよ。
6要素配列ってなんぞや?本当に6次元必要? char *A[6]; scanf("%s", A[2]); でいいんじゃないの? 面倒だからメモリ確保すっぽかしたけれど…
>>667 配列の宣言では要素数に変数を使えない。つまり以下はNGとなる。
int index = 6;
int array[index] = {0,};
配列の各要素にアクセスするときは変数で可。
int array[6] = {0,}, count, index = 6;
for(count=0; count < index; count++) {
if(array[index] == 0) {
scanf("%d", &array[index]);
}
}
つーか普通に要素が6個ある1次元配列だろ?多次元じゃなくて。
671 :
670 :2009/08/05(水) 23:15:13
小数を引数とし 戻り値の値だけ倍すれば小数点がなくなる(?)ようなユーザー関数を作りたいんですが どうしてもうまくいきません BorlandとCPadを使ってます #include <stdio.h> int dtoi( double d ); void main(void) { double d ; int bai ; printf("小数の入力 ==> "); scanf("%lf", &d); bai = dtoi( d ); printf("%fを%d倍すれば小数点が消える\n", d, bai); return ; } int dtoi( double d ) { int bai ; for( bai = 1 ; d * bai - (int)( d * bai ) > 0 ; bai *= 10 ){ printf("引かれる数 = %f\n", d * bai); printf("引く数 = %d\n", (int)( d * bai )); printf("差 = %f\n", d * bai - (int)( d * bai )); } return bai ; } お願いします
何のためにそんな関数がほしいの? 1/3は何桁ずらせば整数になるの?
分数の場合は他の関数に引き渡すので有限小数を前提に作りました
整数になるまで10倍していって、整数になったらその値で掛けた倍数を割る(切り上げ)
有限小数を戻すこと自体を排除できないの? ≒ 分数として戻せないの?
>>674 コンピュータの内部では小数も2進数で扱われるから、
有限小数というのは 0.5、0.25、0.125 などに限られる
0.1 とか 1.3 とかは無限小数になる
2進数的に有限小数なら、そのプログラムのままで問題なく動作している
2進数的に無限小数の場合は対象外だから問題なし
でおk?
文字列として入力するなら有限でおkじゃないかと
拡張子が「.c」のファイルをメモ帳で開くように関連付けを設定してしまったのですが、 どのプログラムで開くように変更すればいいか教えてください
>>679 あなたが開きたいプログラムで開いてください><
>>679 .cファイルを右クリックして、
プログラムから開くを選択。
XPの場合は、プログラムから開く
vistaの場合は、規定のプログラムを設定
をクリック。
そうするとプログラム一覧が現れるので、指定したいプログラムを選択。
この種類のファイルを開くときは、選択したプログラムをいつも使うっていう設定を有効にしたら、OKをクリック。
これでうまく行くと思うよ。
>>680 >>681 とくに決まってないんですか?
開くプログラムを設定してから「.c」のファイルのプログラム実行がうまくいかなくなったんですが
プログラムの質問じゃなくてWindowsの使い方の質問じゃないのそれ
>>682 別に決まってないよ。
標準で設定されているものはいくつかあるけど、それは強制じゃないし、
さらに言うなら標準では.cを実行することはできない
>>684 ありがとうございます
ほかの原因をさがしてみます
>>684 >さらに言うなら標準では.cを実行することはできない
Cインタプリタに関連づければ、或いは…ッ!
687 :
672 :2009/08/06(木) 17:32:03
みなさんありがとうございました 文字列として入力させ 小数点から¥0までの文字数を10の指数にしたいと思います
>>686 んだから標準ではそうなってないからw
どうにか実行するならそうするもしくはバッチつくってそれに関連づけるかしかないよねww
>>672 コンピュータに格納されている小数点数はすべて有限。
なのであるNに対して2^Nを掛ければ必ず整数になる
浮動少数の規格が変わったらその手は通じない。0点
浮動小数である限りそれは有効じゃないか?
規格変わるったって、3進数とか-1+i進数なんて誰も使わないよ! 2進数で表現されてる限り大丈夫だろ? 分数表現なんかになったらあれだが・・・
>>692 IEEE754では10進数の指数部を持つ表現も定義されているんだが。
>>693 ぐふっ。それは失礼。お恥ずかしい限りで・・・
・・・でも指数部は関係なくね?
695 :
デフォルトの名無しさん :2009/08/06(木) 18:55:17
IEEE754は最早古いので、 浮動小数点演算に関して定義し直した新しい規格もある
696 :
691 :2009/08/06(木) 19:10:17
そなの?それなら0.1が正しく表現できるねー 勉強不足でした
697 :
694 :2009/08/06(木) 19:15:11
ok、理解した 俺が悪かった
>>695 2008年に改訂されたばかりなんだが……
699 :
デフォルトの名無しさん :2009/08/06(木) 21:59:53
2バイト文字コートを検索したくて unsigned short int sib に2バイト文字列のデータを入れて if(sib == 0x6f81) とすると判定できるけど if(sib == '{') とキャラクタ判定だとすり抜けてしまいます。 人の目で理解しやすいキャラクタで判定するにはどうしたら いいですか?
#define FULLWIDTH_LEFT_CURLY_BRACKET 0x6f81 if (sib == FULLWIDTH_LEFT_CURLY_BRACKET)
for(i=0; i<k; i++) このfor文の意味を教えてください
断る そんなレベルの話をしてたらスレがいくつあっても足らん
for(i=0; i<k; i++){
i = 0; while (i < k) { /* 処理 */ i++; } と同じ意味。
printf("%d\n", i); }
for(i=0; i<k; i++){ dist[i] = -1.0; indexcluster[i] = -1; } の、<についてだったらHTMLの実体参照について調べるといい
>>699 if (sib == *(const unsigned short* const)"{")
{
}
710 :
デフォルトの名無しさん :2009/08/07(金) 02:29:32
エンディアン依存してないか?
711 :
デフォルトの名無しさん :2009/08/07(金) 02:31:44
してないですごめんなさい。
思いっきり依存しているがね。
713 :
デフォルトの名無しさん :2009/08/07(金) 10:17:07
エンディアン依存を気にするなら、 最初から1バイト単位で比較するべきだね
wchar_t ならいざ知らず unsigned short int なんかに入れるから…
unsigned intを使うのは 負の数が入ったらエラーを出すためっていう 意味合いも含まれてるんでしょうか? また、intもlongも同じ4バイトの環境なんですが これはどちらを使っても同じですよね?
>unsigned intを使うのは >負の数が入ったらエラーを出すためっていう いいえ。 寧ろ、負の数が入っていないと言う前提として使うことはありますが。
717 :
デフォルトの名無しさん :2009/08/07(金) 11:17:28
4バイトなら、longを使え。intのサイズは環境依存
longのサイズも環境依存だけど。
int32_t を使えばおk
>>715 > unsigned intを使うのは
> 負の数が入ったらエラーを出すためっていう
聞く前に実験してみろ。
void foo(unsigned int num)
{numを出力}
でfooに1や10や-100を渡してどうなるか見てみれば?
エラーにはならないでしょう。
日本語をいじりたいならめんどくさいからウニコードでいいだろ
722 :
699 :2009/08/08(土) 08:41:12
short int の上位8ビットと下位8ビットを入れ替えて判定したら 出来ました。 特に709の人とエディアンの話振った人ありがとうございました。
forループややwhileループ内のswitch文によりループを脱出したい場合、 ただ単にbreakしただけではswitch文から抜けるだけで、ループを脱出できません。 このような場合、gotoを使うのが一般的なのでしょうか?
swtichをif-elseに書き換える
>>723 その部分だけ別の関数にして、
returnで抜けるとか。
700が真っ当なんだろうけどね。
最終的なロジックはshortの内容をエンディアン変換して拾ってきて マルチバイトの文字とそれぞれ比較するんだよな それが「人の目で理解しやすいキャラクタで判定」に収まっただろうか 真っ当なのは、shortに格納することをやめて、strcmp(sid, "{")と書けるようにすることだと思うよ
なんでそこで文字列の判定になっちゃうのよ。
文字コードの判定ではなく文字の判定に近くなってきたからじゃね?
730 :
723 :2009/08/08(土) 15:39:08
ありがとうございました。
ポインタでつまづいてしまいました… 何かよくわかる例えみたいなもの教えていただけませんか?
Cの前にアセンブラを勉強しろ
ポインタはお手紙。 「*」の印で開封できる。
734 :
デフォルトの名無しさん :2009/08/08(土) 21:29:14
>>732 意味不明なこと教えるな
>>731 まあプログラムや変数などはメモリのどこかに配置されるのでアドレスを持っています。
そのアドレスを格納する変数のことをポインタといいます。
>>731 例えで学んでも結局は役立たないのだよ。
ポインタを理解出来ない人にプログラミングは無理なので、
どうか頑張って理解してください。
736 :
734 :2009/08/08(土) 21:29:55
文字列から一文字ずつ表示したいのですが %cだと1バイトだと扱われてしまいます。 2バイト文字の場合はどうすればいいのでしょうか?
>>737 printf("%.2s", "こんにちは");
コピペしてね
739 :
699 :2009/08/08(土) 23:32:29
よく見たら699は変な文章ですが char buf[100]に1バイト文字と2バイト文字が混合している文字列から ユニコードの文字をを判定(検索)する処理です。 判定するユニコードが何十種類もあるからキャラクタで判定希望。 (16進数は数値を調べたり意図しない結果の時数値をチェックする 手間がかかる) unsigned はbuf[]から1バイト*2をコピーする時どちらか1つ 8ビット左シフトするからunsigned付けたら安心という判断です。 ただの横着でした。レスしてくれた方ありがとうございました。
ポインタってのはショートカットみたいなもんなんだよ。 まず実体のファイルがあってそのショートカットを作ったらそれがポインタだと思えばいい。 ショートカットのショートカットはダブルポインタってことになる。 概念的にはこんな感じだけどプログラムに書くときにどう表現するかは参考書をひらいてくれ
fstreamなどC言語標準のファイル処理は使えなさすぎる。 巨大ファイルはオープンするだけで時間かかる。 異常終了すると、ファイルにアクセスできなくなる。 wchar_tが使えない。 なんでなおさないのか?
string に一行ずつ読み込む部分を楽に済まそうと、 標準関数使おうとしたらオープンだけでしばらく待つ羽目に。 その上、鈍い。
C++だけど、Cの関数も基本動作は同じ。 一方だけが優れているなんて無いだろ
>>741 1GBytes程度のファイルで試したけど、一瞬で開くし読み込みも時間かからなかったよ。
OSが足引っ張ってるんじゃない?
>>741 言語を叩く前に環境とか書いてるコードを晒せよ
実装方法の違いはあるな。 BCC最新版を常用している。 基本性能で、VC2008、ICCに劣るのは認識しているが、使いやすいので使う。
> 異常終了すると、ファイルにアクセスできなくなる。 これはどう考えても、OSがアホだからだろ。 プロセス終了してるのに、使用してるリソース開放できないとか どんだけ脆いOS使ってるんだよ。
どのOSでそうなるんだろうな
SMB?
751 :
デフォルトの名無しさん :2009/08/09(日) 06:42:13
VxWorksがプロセス終了してもリソース解放しなかったね あとはしらん
>>741 時間がかかるとかアクセスできないのは言語のせいじゃないだろ
そのコンパイラ作ったやつが無能なだけ
>>741 は言語仕様とベンダーの実装の意味を
理解出来ていない物と考えられる。
言語の実装の問題というよりはライブラリの実装の問題ではないか、
>>741 が理解できていないのは。
つまり何も理解出来ていないってことだな。
だって >fstreamなどC言語標準 こんだけでもう破綻してんだもの。
だから、このスレでC++の話や言語に関する議論はするなって。
少なくともC++の個別のライブラリ(stdすら含む)の話は 「ある程度」の範囲からは逸れてると思われ 成功事例もあれば失敗事例もまた多いし
>>759 Boostならまだしも
標準ライブラリはある程度に含まない
って、なんならある程度に含まれるんだ?
まあ次から元に戻すなら関係ないか。
C++ - クラスライブラリ≒広い意味でのC でいいんでね? C99とC++とではどっちがC89に近いコードが書けるんだ?
「C++だと○○だけどね。」と言った程度なら目鯨立てることもないと思うけど、 主題にするのはやめた方がいいでしょ。
>>762 どっちが近いも何も、どっちもc89のコードは書けるよ。
まぁ、一部制限があるってだけのことで、その意味ではC++の方が制限が多い。
例えば、プロトタイプ宣言なしではC++ではエラーになるし、構造体タグの名前空間が独立していないし。
最近のCではプロトタイプ宣言しないと文句言ってくるぞ Javaでは逆にそれが無い
自分で一から作る分には警告はエラーと同義だと思うんだよ。
全然違うよ
>>765 Javaのばあいは、そのファイルで解決出来るか、カレントディレクトリ
に解決済みのclassファイルがある限り、未宣言項目の天下り的な
使用が出来るよね。太古のC処理系もそういうのは出来たらしいけど
最近はそれはタブーになってきてるみたい。
使用人口が増えて大規模なプログラムも書かれてコンパイラの処理
速度が早いことを要求されるようになったことが関係してるんじゃ
ないかと。
>>769 理由は全く見当違いだよ。
c89以前のレガシーCでは仮引き数の宣言ができなかった。
だから、引き数の型は呼び出し側が保証する必要があった。
例えば、こんな感じ。
--
int main()
{
double sin();
printf("%g\n", sin((double)0));
return 0;
}
--
c89辺りからは仮引き数の宣言もできるようになったので提供側が保証できるようになった。
例えば、こんな感じ。
--
#include <math.h>
int main()
{
printf("%g\n", sin(0));
return 0;
}
--
でも相変わらずプロトタイプ宣言は必須ではないので、プロトタイプ宣言をうっかり忘れるとおかしなことになる。
従って、大抵のコンパイラは警告を出すことでプロトタイプ宣言を行なうことを示唆しているってこと。
>>770 >c89以前のレガシーCでは仮引き数の宣言ができなかった。
んなアホなw
int func(x,y,z){
int x,y,z;
......
}
て感じのことが強制されてただけ
>>771 それは定義。つーか、流れくらい読めよ。しかも、その例だと仮引き数の型がintだから省略可能だし。
if( 〜〜 ) { 〜処理〜 } { }から抜け出す方法はありますか?break入れてもだめでした
×から抜け出す方法 ○から途中で抜け出す方法
if(〜〜){ do{ 〜処理〜 }while(0); }
776 :
名無しさん :2009/08/10(月) 13:22:26
#include <stdio.h> int main(void) { int *u[3]; int a=3; u[3]=&a; u[0][0]=1; return 0; } int *u[3];のポインタってどう使うんだ? a は、intへのポインタの配列(要素数10)である。と書いてあるけど。 これだとエラーが出る。
>>776 int *u[1];
なら使えるとでも言いたそうな口ぶりだな
>>776 u[3]に代入してるのにu[0]を参照してたらエラーも出るだろう
782 :
名無しさん :2009/08/10(月) 13:39:58
使い方わかった #include <stdio.h> int main(void) { int *u[2]; int a=3,i=4; u[0]=&a; printf("%d\n",**u); u[1]=&i; printf("%d\n",u[0][1]); printf("%d\n",*u[1]); return 0; } こうか、変数1個1個を入れられる 1個型へのポインタか
>>782 >u[0]=&a;
単純変数を指してるだけのポインタで
>printf("%d\n",u[0][1]);
とか、もうね…
>>776 *u[3]はu[0],u[1],u[2]までしかないぞ
u[3]に代入した時点で鼻から悪魔
>>782 aとiは連続してメモリ上に並んでいるという保証はない
だからu[0][1]なんてやってはいけない
u[0][0]だけ許される
void test(char *str[]); void main() { char *str[] = { "a", "b", "c", "d" }; test(str); ←格納されていない } どうしてだぁー;; VC++ 無料版です。
どこに何が格納されてほしいのか? testの中身は?
>>786 ほんとは格納されてるのにtest関数にバグがあって何も無い様に見えるに一票。
>>786 意味が分かりません
ソースコードはそれで全てですか?
strが"abcd"になることを期待してる?
test(str); で break してstrの中身を確認してみたのだが、中身がおかしいです。 デバッグモードです。 実はC++で、test の関数はクラスのコンストラクタでメンバに格納しているだけです。 オラに知識を分けてくれ。
>>790 期待していないです。
クイックウォッチでstr[1]を見てみるとアドレスが確実におかしいです。
>実はC++で、test の関数はクラスのコンストラクタでメンバに格納しているだけです。 スレ違い。
すみません。
まことに申し訳ありませんでした。
ちゃんと格納されていました。
リリースモードになっていました。
>>786 さんが正しかったです。
僕のレスを見た人ごめんなさい。
なにこいつ。間抜けにも程がある。
夏だからだろ 全ては夏のせい こういうカイキチが現れるのが夏 あらしのような夏 さっさと巣に帰れ夏厨 どこのコピペだよ
>>784 あれ?u[3]に代入って鼻から悪魔なん?
u[4]なんかだとそうだろうけど、3は処理系定義じゃないの?
悪魔。 u[3]のアドレスを得ることは許されるが、代入はできない。
┐(´д`)┌
処理系じゃなくて言語仕様の話だな。Cじゃもちろんダメ。 でも、悪魔は存在しません。 悪魔がいないことは証明できるが、ここでやるにはちょっとスペースが足りない。
スペースは気にしなくていいからやってくれ
803 :
このプログラム作ってください!( >_ < ) :2009/08/11(火) 03:21:01
1. 以下のプログラムは、勝ち数と負け数を入力して勝率 (= 勝ち数 / ( 勝ち数 + 負け数) )を計算するプログラムである。 勝ち数、負け数に負の値が入力された場合は入力をやり直させ、 勝ち数+負け数が0 の場合は勝率計算が不能であることを表示する。 ただし、このプログラムはバグを含んでおり正しく動作しない。 デバックを行って正常動作するようにせよ。 修正したソースプログラムと実行結果を示すこと。
巻き込まれ規制うぜぇ 携帯からじゃコード書き込むのも一苦労だぜ
パソコンでコード書いてそれを携帯にメールで送って 携帯内でコピペって出来ないの?
ケータイ経由でネットにつないでPCから書き込めばいいんじゃね?
C++の個別ライブラリに深入りしなければ、C++の話題は Cの話題の延長とも捉えられるし、大規模アプリ開発が絡むとオブジェクト指向の技法は必須になってくるし、ということで 今やC++まったく知らんって人は実はCも知らん、俺に聞けなんて 言えるレベルじゃない人だと思ってもおkだと思いまつ
>>809 へー、そーなのかー
でも C++ スレがあるからそこへ誘導するといいよ
C++すれあるしね。
つーか、今や C/C++として扱うか、C++/Javaとして扱うかに分かれてるんじゃ? 純粋にCだけ取り扱うというのはCしか許されない カーネルコード扱う場合とかで、かなり特殊で専門的で 入門者向けの世界とは離れてるんじゃないかと アプリケーションで使用される基本的なアルゴリズムや プログラムフローの書き方とかを重視する場合はC/C++という 文脈で、 既存のライブラリと如何に巧く組み合わせて比較的大きな アプリケーションを崩すことなく能率的に書いていけるか という方向性を重視する場合はC++/Javaという文脈で 語られることが多い感じ
このスレは元々特殊なスレだから問題無い C++の話題は初心者に優しいスレに誘導してあげればおk
CとC++の関連スレ多すぎじゃね?
言語としての人気の問題では?
昔はこのスレ以外にもC専用の質問スレがあったしな。
Cの質問はしたことないけど、したいときに以下のどのスレに出せばいい のかオレは間違いなく悩む。 ●スレを勃てるまでもないC/C++の質問はここで 12 ●C言語なら俺に聞け(入門篇) Part 51 ●【初心者歓迎】C/C++室 Ver.67【環境依存OK】 ●【初心者お断り】ガチ規格準拠C専用スレ Part134
●スレを勃てるまでもないC/C++の質問はここで 特にC/C++と分ける必要もない一般的な質問、C++の質問が多い ●C言語なら俺に聞け(入門篇) C言語のありとあらゆる質問 ●【初心者歓迎】C/C++室【環境依存OK】 環境依存と思われるバグが発生した場合、その環境に精通している人を必要とする質問 ●【初心者お断り】ガチ規格準拠C専用スレ 規格書を引用して回答してほしい質問
今やC/(Objective-C)C++(80年代系)は余り極端に区別すべきじゃないと いう立場からは 【標準質問スレ】 ☆スレを勃てるまでもないC/C++の質問はここで 一般的な質問スレ(C/C++使いでない人が使わざるを得ない 状況があり得ることを前提) 【本格質問スレ】 ☆C言語なら俺に聞け(入門篇) 本格的にC/C++を勉強しようとしている人向けのスレ 【クイックヘルプスレ】 ☆【初心者歓迎】C/C++室【環境依存OK】 具体的なコンパイル/テスト作業中のトラブル、問題、疑問、質問に 単刀直入に答えるスレ 【文法スレ】 ☆【初心者お断り】ガチ規格準拠C専用スレ C文法/C++文法の隠された問題点、矛盾点、あいまい点を色々 議論するスレ こんな感じじゃないか?
てめーらの分類なんてどうでもいい
●【初心者お断り】ガチ規格準拠C専用スレ Part134 こんなスレがPart134まで行ったのか
あと 【丸投げスレ】 ☆C/C++の宿題片付けます
>>821 元々は、「C言語なら俺に聞け」だったと思う。要は、初心者スレや環境依存スレが分離していった残り。
旧「C言語なら俺に聞け」スレは、僅かでも環境依存なことが絡むと暴れる基地外のせいで機能不全に陥って、 現在のスレ名に変更(基地外も反対しなかったはず)した。 無事、過疎化して質問者もろとも基地外消滅という流れだったと思っている。 全部俺のいい加減な記憶だから当てにするなよ。
>>824 概ねそうなんだが
それをキチガイ呼ばわりするお前もどうかと思うな。
>>825 ああ、気に障ったらすまない。
確かに、暴れていたと言えるのは最後のごく一時期だけだったしな。
俺はあのスレで暴れていたのは 環境依存とかAPIの質問をして指摘されたヤツが逆切れしてたと見てるよ。 実際、言語仕様に含まれる質問にケチつけてるのを何回か見たし。
それよりも「スレを勃てるまでもない」と「初心者歓迎」の区別が分かんない。 一本化しないかなあと思っているんだけど。
俺はまあいくつも似たようなスレが立っていても、 言語の人気的には当然のことだと思っているからいいんだけど。 ただマルチポスト野郎が出て来るのが許し難い。
・C++言語はスレ違いですが、ある程度なら対応です。 とりあえずテンプレから↑を消そうよ。C++専用スレがあることだし。
それを消すとなんとやらと上に書いてあるぞ。
書き換えるとしたら C++固有の話題はC++スレで。このスレで聞かれても答えられるとは 限りません。(100%答えられないというわけでもありません) ↑こんなところだろ
なんで一緒にしたがるの? C++で許されてもCでは許されない書き方なんていっぱいあるじゃん。明確に別の処理系だよ。
C++ はCの完全なスーパーセットだっけ?
区別されているのが理想だと俺も思うけど、 どうせ質問する人間はそんなのお構いなしにやって来るから、 どうせガチガチに縛っても守られない結果になる。
>>834 完全じゃないよ
所々に非上位互換性がある
とはいえ、C++も対応でいいと明記する必要は無い
100%非対応だと明記しても、.cファイルを.cppにリネームして C++スレに池というレスで埋め尽くされかねない件
つーかVS2008で拡張子を.Cにする方法を知らない奴が多い件 大抵.CPPでコンパイルしてるし
C++をメインに扱うスレでCの質問もok、ってのは理解できるよ。でも逆はあり得ない。 何故ならばC規格ではC++だけに存在する書き方は当然許されないし、文法的に完全なエラーになるんだから。 C++の質問が来ても、ここがCスレである以上「そんな書き方はCに存在しない」としか答えられないだろう。
そういうのはCコンパイラの仕事で「俺」の仕事ではない
C++で書く必要が無いのに無理にC++で書いたが為に方向性を見失って 苦境に陥っている人も多いと思われ。そういう人達を救ってあげられる のならそれはそれなりに有意義かと。.cでコンパイル成功したソース を.cppにリネームさせればC++コードになるからねw
C++の質問が来たら、ここで答えないでC++のスレヘ誘導すればなんの問題もない。
丸投げ、或は易門のみ答え残った難問のみを丸投げするのはやめましょう
>>829 クロスポストができたらいいのですけれどもね。昔のfjの話でごめんなさい。
C++は卒業します。 速度必要なとこだけCで、あとはC#で楽しますw
俺もそのスタイルでやることがある
速度必要なとこだけC++でやれないあたりが
851 :
名無しさん :2009/08/13(木) 16:33:39
オブジェクト指向やったあとC言語みるとくそ簡単だな。
>>847 C++卒業じゃなくて逃げるだけだろw
一度C#の楽さを覚えると二度とC++に帰ってこれないぞ
何その土方
C#ってそんなに楽なの? インタープリタ言語並に楽? VC++とVBは状況によって使い分けてるけど (VJ++があったころはそれも) VC#だけは一度も起動してへんわ。
>>854 超^2楽だよ
ライブラリがすごく充実している
GCが付属でメモリリークとは無縁
JITコンパイラでJavaよりも遥かに速い実行速度
GUIプログラムがポトペタで組める
などなどC++プログラマの夢が叶えられている
しかし贅沢な実行環境を必要とする(特にメモリ)なので
富豪的プログラミングと言えるかも
へーそうなんだ。 D言語とどっちがいいのかな
D言語はGUIに対するサポートがほとんどC/C++と変わらん それにいつまで経ってもβなので所詮趣味にしか使えん C#は案件あるぞ
C#はある種の墓場。将来はC++以上に小流派分裂必須と思われ。
C#が墓場ならJavaは墓場に火を付けて燃やした跡だな
C/C++でゲーム作ってるんだが、データ作成支援用になんか楽な言語探してる、みたいな俺にC#はどうなの? 入力やテキストから固定フォーマットのバイナリデータ作成したり データを可視化して修正したり みたいなことをGUIでやりたい
>>861 いいんじゃない
C#でもVB.NETでも割と楽に作れる
>>861 このスレで聞くってことは、C言語で作ればいいじゃん。
C#、VB.NETなどの言語はシリアライズ機能がライブラリで ちゃんと用意されている当たりがいいよな
言語と処理系の相違は意識したほうがいいかも
すれ違いなのに延々宣伝続けるバカが使う言語なんて、誰が選ぶんだよw
for(i=0;i<10;i++){ //処理 } このように書いた所、10回だけではなく、永遠に処理が行われてしまいます どうも根本的に勘違いをしている気がするのですが、なぜでしょうか? for分の中身は完全にこぴぺしました
すみません、書いてからfor文の外側で永遠ループが発生していることに気が付きました
お騒がせしました
>>869 ありがとうございました
>>861 char buf[64];
char *str = "data.txt";
sprintf(buf, "notepad.exe %s", str);
system(buf);
素人考えだけど、こんな感じでテキストファイルにデータを書き込んで保存。
その保存したデータをプログラムの中でバイナリデータに変換とかじゃダメなのかなあ。
>>871 たとえばRPGのマップチップを並べるようなの
>>873 エクセルでお手軽にできるならそれでいいと思う
猫でも分かる、って書籍の中盤辺りで四苦八苦してる者なのだがちょっといいだろうか 配列と文字列とポインタって章で、ポインタ+数字をすると型の容量分だけ変化するから数字を一つ足せば文字列が一つ動くと書いてあって 感覚的にいまいちつかめなかったから適当に一つ組んでみたのだが コンパイルは通ったがどれもアスキーコードがずれて文字化けしてしまうみたいなんだ。多分エラーか初歩的ミスがあるんだろうが自分じゃいまいちよく分からない。何か解釈が間違っていたのだろうか int i; char *a="もみむめも"; for(i=0;i<5;i++) printf("%c\n",*(a+i)); for(i=0;i<5;i++) printf("%c\n",a[i]); printf("%c\n",*(a+1)); printf("%c\n",*(a+2)); printf("%c\n",*(a+3)); printf("%c\n",*(a+4)); printf("%c\n",*(a+5)); return 0;
つまらん冗談だな
>>875 まず
char *a="もみむめも";
これを
char *a="abcde";
とでもやってみろ
ゴメンなさい・・・ホントゴメンなさい・・・ありがとうございます・・・ ちょっと生き恥過ぎて泣きたくなってきました。何やってんの俺・・・
流れ的にはなんか面白かったから許すw
880 :
877 :2009/08/14(金) 08:14:30
後で文字コードの話に展開しようと思ったけど理解できたんだろうか
なぜ”もみむめも”だったのか? こっちのほうが気になる。
>printf("%c\n",*(a+1)); >printf("%c\n",*(a+2)); >printf("%c\n",*(a+3)); >printf("%c\n",*(a+4)); >printf("%c\n",*(a+5)); このコードだと char *a="abcde"; にしたとしてもaが表示されないだろ
本は、まあ、普通だと思うけどweb版をわかりやすいとかって初心者に勧めてる やつはなんとかしてほしい。
へえ、猫はもう古いのか。 昔必死で読んでたのが懐かしいぜ。 改訂とかしてないのけ?
Win32APIの猫本はUnicodeの扱いが雑すぎだろw でも猫本のCなら普通なんじゃないの?読んでないけどさ。 Cなんて既にほとんど大きな変更は無いんだから。
>>886 ないのは事実なんだけどアライメントの厳しいプロセッサが増えた環境で
それに対応してないコードが残ってた記憶があるんだが・・・
猫はあれで内容がシェアウェアだと謳っているからなあ よほど神経がずぶといのか、それともキ(ry
でもやさしい○○なんて本よりはマシだと思うけどな
>>889 その手はそんな内容で金取るのかよって内容だけどなw
苦しんで覚えるなんてタイトルよりはましかもしれないが、その苦しんで覚えるサイトも酷い罠。
Javaで最初書いて、C++に翻訳して、最終的にCで書くと、 明瞭性と効率性と論理性が調和した良いコードが出来る 可能性があることが最近わかってきた。 C#で書くと、どうもVBで書き直したくなってくるのは C#とJavaが似ていて本質的に異質な言語であることを 示しているのではないかと... 以上チラ裏
VBのパラダイムも勉強したほうがCプログラミング に多いに参考になると思う
うん、大いに参考になるね。
本気で信じるの
>894は>893の誤変換の指摘だろ。
オープンアーキテクチャーとノンオープンアーキテクチャー のパラダイムの相違を知ることは重要
○○オススメスレでも立ててそっちでやってくんない?
Cおすすめスレの一環ですが... 俺に聞けスレでしたね。
>>892 トップダウン・ボトムアップの両方向から書いていって、中間部分でぐだぐだになるのを防げますか?
>>892 同じプログラムでも何度も書くうちに洗練されていくのはよくあること。
>>901 最初にCで書いて何とか動かしたコード(とても新しい
機能拡張や仕様変更など出来る状態ではない)を
一旦Javaで書いてみるとすっきりとしたコードになっ
て(機能拡張や仕様変更の余裕すら出て)くる。
(但しデザパタとかの素養は多少居るかも。)
しかし実行速度はVM上のパフォーマンスであることを
差し引いてもやはり遅い。
その後C++で高速化を図り、最終的にC(出来る限りC++
の文法を使わない)でもう一度書いてみると不思議や不思
議、当初よりもずっとわかりやすく余裕があり安定してお
り、早いコードになっている。
更にコードに手を入れてから、もう一度同じプロセスを
実行する。以下繰り返し。
このプロセスは洗練ではなく多分進化プロセスに近い
ものだと思う。この方法に弊害もあるのかも知れないが
今となっては純粋にCだけで成長させていくのは
不可能ではないにしろ難しい割に迂遠で非効率であるこ
とは確か。
どんだけヒマなんだよ
一度Cで書いてみてC++のインスタンス駆動で仕上げ直すのはよくやるな
オブ臭さがでるからそのやり方嫌う人も居る。
最初からC/C++に書き直すつもりで書いてないと JavaでGCまかせに書くとC/C++に直すとき辛い
>>902 三行で。
しかもチラシの裏に書いてくれると助かる。
CはめんどうだからJavaで書いてみたが、 なんか遅いから今度はC++で書いてみたけど、 やっぱりCが一番良い気がしたからCで書き直しちゃった。
一言で書くと、 ”Cは最強” ってことだな。
もうそれでいいよ
Cが最強かどうかは別として、いまだに有効な選択肢の一つであることは間違いない。 WINDOWSなんかもC言語で書かれてるらしいし
NTからはC++じゃなかったっけか
Windowsはマルチリンガルな筈。APIとかC/C++だけで書かれてる わけでもないと思う(断定出来ないけど)
つかアセンブリ出力させたものを、手直ししてアセンブル とかあり得ると思うし、実際やると思う。逆コンパイル 防止やパフォーマンスチューニングの為に。 だから実際のところどんな言語で最初に書かれてたなん て詮索するのは無意味じゃないかと
WindowsはCで書かれてるよ(一部C++ 知人の開発者が言ってたから間違いない
その開発者、首だな。
2000とか一部とはいえソースが流出したよな
ちなみにVistaは当初C++/CLIで開発する予定だったが、途中で頓挫したらしい 何で?って聞いても理由は教えてくれなかった
>>917 闘うプログラマーによれば、CとC++とアセンブラだったような。
そういう情報って出所がばれるとMSからペナルティ食らうの?
OS作りには必要最小限のアセンブラは必要かも
NTはMIPSやPPCなど色々なCPUに対応してたからアセンブラは極力使ってないけどね
>>924 担当箇所について書かなければばれないだろ
関わってる人数多そうだし
開発言語が何かというのはメインじゃなくても知ることは可能だろうし
臭いな 寝ろよ
Glibという便利なライブラリがありますが、 自作したほうがいいでしょうか? 仕事で使えない場合があるので。
自作してよろしい。許可する。
したほうがよい(SHOULD)と、してよい(MAY)は、似ているようで違うと思うんだ
>>929 仕事で使えない場合なら自作したほうがよいでしょう
Glibつかわずに、別のライブラリ使うとか。
expressionは式だと思うのですが、 文はなんと呼べばいいでしょうか?
935 :
934 :2009/08/15(土) 21:08:48
statementで良さそうでした。
875だが、今度は練習問題の英字の大文字からなる文字列を英字の小文字に変換するプログラム作るのが出来ない。 char a1; scanf("%c",&a1); printf("a1+32=%c\n",a1+32); と、まずは英字の大文字を小文字に変換するのを作ってみたんだが文字列にしようとして配列にすると +32 がアスキーコードじゃなく配列をいじってしまうんだ ""でくくってみたり色々試してみたがどうにもよく分からない。変数を別途に32個くらい用意してswitch文で制御するようにすれば出来ない事も無いと思うんだがもう少しスマートなやり方は無いんだろうか
>>936 > 文字列にしようとして配列にすると
そのソースを書きなさいよ
よくわからんけど単に大文字で文字を入力してなかっただけなんじゃないの?
gets覚えたほうがいい気がするな
あれ・・・
>>937 に言われた通りに落とそうとして、前に作ったのはもう全部消してたから最初から組んでたらなんか成功しちった・・・
#include<stdio.h>
#include<string.h>
int main(){
int i,a1;
char a2[32];
printf("英字を入力してください。\n");
gets(a2);
a1=strlen(a2);
printf("それを小文字にすると\n");
for(i=0;i<a1;i++)
printf("%c",a2[i]+32);
printf("です。");
return 0;
}
・・・・・
>>937 様ありがとうございます
俺も初心者なんだが、この場合はctype.hをインクルードしてtolower関数使った方が楽じゃない?
ふむ。 printf("%c",a2[i]+32); が必ず小文字になる保障はないからね。 C++ならちゃんとロケールを設定して ctype::tolowerを呼び出すべき。
C++?
while文とか条件付きのループを作っていて その条件にintで定義された変数を使っている場合 scanfで数値を読み込ませたいのに、アルファベットなどの文字が入力されてしまうと 無限ループしてしまいます 次のループがきても文字が入った物は文字が入ったままになっていて 何故かscanfをすり抜けてしまうのです デバッグをしてみても分かりませんでした・・ どなたか解決策を教えていただけないでしょうか
無限ループを避けるには、scanfの戻り値を確認する ゴミが入っている場合は読み捨てる
scanfで%dとか数字を読み込む指定をすると、数字でないものは一切読もうとしない 文字が入力されると、scanfはそれを読もうとしないから、入力に残ったまま 文字が入力に残ったままなので、次のときもscanfはそれを読み込めない 永遠に文字が入力に残ったまま、永遠にscanfはそれを読み込めない scanfは読み込みに成功した値の個数を戻り値として返すから、 scanfの戻り値を調べれば読み込めたか読み込めなかったか判る
scanfってそもそも使うか?
細心の注意を払って使えば問題ないよ
じゃなくて君たちは使うのか?
使わん
そもそも、 GUI主流で、コマンドラインツールはパイプ等での使用を考慮したものが一般的な現状では コマンドラインからユーザー入力を受け取るという機会自体、滅多に無い。 sscanfなら結構使う/使われているだろうし fscanfもそれなりには使われていると思うけど。
まぁせいぜい自分で使うちょっとしたツールとか 自作ライブラリのデバッグ用くらいやね。 そんなツールにいちいち面倒なエラー処理のコーディングなんてせんよ。
fgetsとsscanfの組み合わせが基本だろ
ちょっとしたツールでC使うことってなくね? 画処理とか使い捨てだけど計算量がデカイやつぐらい?
>>955 windowsでGUIが関係するとC/C++は今となっては使いにくいな
C#ならVB6.0の代わりに使える気軽さがある
>>956 使い捨てはLL使っちゃうよな
GUIだと確かにC#は抜群に使いやすいな
なんかネイティブコードとかややこしいけど、ちょっとしたツールなら関係ない品
ちょっとしたツールならVBで十分じゃろ^^ C#を出すまでもない。C#は中途半端。 早くするのか便利にするのかどっちかにしろって感じ。 Javaみたいに可搬性があるならいいけど C#はほとんどWindows限定で、覚えるだけ無意味だし。
>>958 いやいやVB6.0は持ってない人もいるし開発ツールその物が古いところもあるしね
960 :
953 :2009/08/16(日) 16:44:09
以前はVB6とかも使ってたけど。
それだけのためにC#覚えるならVBA使うわな。
>>955 VB系だとバイナリファイル弄りとかが滅茶苦茶
めんどくさそうなイメージがある。文字列の扱いとか。
C#は「C#じゃなきゃだめっ!」っていう部分がないんだよな。
ちょっとしたツールは自分の一番なれてる言語だろ
>>958 ちょっとしたツールのためにVB勉強するのは面倒だし。
C#勉強するほうがもっと面倒だろw C#を新しく勉強するくらいならJava勉強しといたほうがまだ未来がある。
C#は未来がない。 Java厨もC++厨もC厨も、 なぜかそこは意見が一致する。
>>964 C++とかJavaやってれば、C#なんて勘で使える。
むしろC#は使い物にならないw
C#は新興宗教で未来が無い C++は複雑すぎる Cは古すぎて時代に合わない Javaはコンシューマで動かない Dはいつまでたってもベータバージョン PHP、Perl、rubyは所詮スクリプト flashはオナニーしすぎで枯れはじめてる VBはいつまでたっても負んぶに抱っこで成長しない
C++のテンプレートメタプログラミングに至っては 天才しかまともに活用できないという恐ろしい怪物である。
勘で使うなよ。 例えば、Javaの構文でポリモーフィズムさせようとすると C++ではスライシング起きちゃうぞ? C++で許される派生クラスでの冗長なvirtualキーワードは C#ではメソッドを隠蔽しちゃうぞ? 細かい文法の違いがえらい大きな落とし穴になっている例でしゅる。
974 :
デフォルトの名無しさん :2009/08/16(日) 17:46:09
ほぼ書き捨てのツールに言語なんてどれもでいいだろw
975 :
デフォルトの名無しさん :2009/08/16(日) 17:50:49
まーた始まったよ。 なんで言語を引き合いに出すとどっちが優れてるか っていう話に持っていく馬鹿が多いんだろな。
誰も優れているとか優れていないとかいう話はしていないよ。 C#はWindows限定で速度も遅くもメモリもバカぐいする上に VBよりも学ぶのは面倒、Javaの劣化コピーだから 学ぶだけ無意味 って言ってるだけで。
Java厨、VB厨は、そっとして置いてあげて、触らないように
なんで、自分で使うだけのツールを作るための言語の話なのに そういう話に持っていくんだよ、って話。
あなたがおっしゃるのならそうなのでしょう
言語厨の争いが起きているように見せかけることに 何の意味があるんだ?
最近は勝手に開発環境インスコすると怒られるから もっぱらExcelVBAとかJScriptです
こういうどうでも良いことを話していると スレが埋まってきたな。 次スレは立てる必要はないよな、不要だろ?このスレ。
と、意味不明な言動を繰り返しており…
動機は未だ不明
スレならどこでもよかった 今は後悔している。
少し分からない仕様があるので教えてください。 C言語で変数宣言する場合、 グローバル変数の宣言は、全ての関数定義の前 ローカル変数の宣言は、関数定義中の一番最初 でなければならない、という認識で合っているでしょうか? もしそうだとすれば、グローバル変数はともかくとして、ローカル変数が途中で定義できないのはソースがとても見辛くなってしまいそうです。
>>987 イメージがつかめないけど・・・
ちなみに
関数の外に書けばソースのどこに配置されていうようがグローバル扱いですよ
ただ最初に利用する関数の前にないとあれですが
>>987 C言語自体もバージョンアップしてて、C99という規格ならローカル変数を関数の途中で宣言してもおk。
実際に試してみて、駄目だったらC99に対応してないコンパイラってことで。
990 :
デフォルトの名無しさん :2009/08/16(日) 18:57:32
//ソース先頭 int g_int; //ここでも void hoge_a(int nanika) { } int g_int; //ここでも void hoge_b(int nanika) { if(g_int ....) .... //g_intをはじめて使う } void main() { }
char ch; scanf("%d", &ch); これで初めてブルーバック体験したお/(^O^)\ナンテコッタイ scanfこわすぎだおw
993 :
デフォルトの名無しさん :2009/08/16(日) 19:04:32
>>988-
>>990 ありがとうございます。曖昧な質問ですいません。
C99という規格ははじめて知りました。C言語はANCI-Cからフリーズしてるって職場の先輩に聞いたけど違ったんですね。。
ANSI-Cでは、グローバル変数はどこでも宣言可能、ローカル変数は関数定義の途中では宣言不可能。
C99になって仕様変更されて、グローバル変数もローカル変数もどこでも宣言可能になった。
ということでしょうか?
さてはお前Java厨だな
ちなみに正常に動作するのはこうだったお
int i;
char ch;
scanf("%d", &i);
ch = i;
整数拡張ってのが固定観念になってて
>>991 みたいな
アホな間違いしてしまった
めでたしめでたし
void ume(void);
生め
>>994 C99なんて幻想だよ
対応してないコンパイラの方が多いし現場でも普及してない
ってことで忘れていい
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。