C言語なら俺に聞け(入門篇) Part 38
at TECH
1:デフォルトの名無しさん
08/10/31 20:15:31
C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題を片付けます 117代目
スレリンク(tech板)
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 37
スレリンク(tech板)
過去スレ
URLリンク(makimo.to:8000)
2:デフォルトの名無しさん
08/11/01 00:13:27
高速な文字列置き換えはどのようにしたら出来ますか?
3:デフォルトの名無しさん
08/11/01 00:17:57
>>2
高速なCPUとメモリを用意してRTOSを使いDMA転送や1クロックでも速くアセンブラでコールするなどハードウェアの限界までチューンすると出来る
4:デフォルトの名無しさん
08/11/01 00:24:59
最近プログラミングを始めたんですが
コマンドプロンプトの画面ばかりで、最近食傷気味です。
別のウィンドウを表示したり、そこで文字やグラフィックを表示させるような命令文の例などはありますか?
あるいは、SDLやDXライブラリなどを使用して
それ用にプログラムを組むしかないんでしょうか?
5:デフォルトの名無しさん
08/11/01 00:28:01
ちょっとお聞きしたいのですが、先ほどコマンドプロントでの主要なコマンドなどを見ていたのですが
ディレクトリ削除をあつかうrdコマンドで
rd /s \ とやったらcドライブのすべてのファイルとフォルダが削除されるってことでいいんでしょうか?
6:デフォルトの名無しさん
08/11/01 00:28:02
>>4
ライブラリ使うか、直でAPI呼ぶしかない。
7:デフォルトの名無しさん
08/11/01 00:29:36
>>5
管理者アカウントでやってたらほとんどきえるんじゃねーのかな。
起動中のexeとか、消えないのもあるだろうけど。
8:デフォルトの名無しさん
08/11/01 00:30:05
ビットフィールドでこんな定義はだめなんでしょうか?
struct bitTST {
bool bit[8];
};
bitTST->bit[0]を参照するとboolではなくcharとして値が返ってきます。
↓これだとboolとして参照できますがループで処理したいと思っています。
struct bitTST {
bool bit0 : 1;
bool bit1 : 1;
bool bit2 : 1;
bool bit3 : 1;
bool bit4 : 1;
bool bit5 : 1;
bool bit6 : 1;
bool bit7 : 1;
};
9:デフォルトの名無しさん
08/11/01 00:30:10
>>5
いいえ
消えないかもしれません
10:デフォルトの名無しさん
08/11/01 00:31:24
>>6
なるほど、自分で打ち込むだけではやはり厳しいのですね
諦めてDXライブラリ使うことにします。
ご返答有難うございました
11:デフォルトの名無しさん
08/11/01 00:31:47
たかだか8bitくらいループで書かなくてもいいじゃん
12:デフォルトの名無しさん
08/11/01 00:32:38
摂氏から華氏を求めるプログラムを作っているのですが
小数点以下を入力しても整数部分しか認識してくれません
#include <stdio.h>
float convC2F(double C)
{
double F;
F = (double)C*(double)1.8+(double)32.0;
return F;
}
int main()
{
int C;
float F;
printf("摂氏は何度ですか?\n");
scanf("%d", &C);
F = convC2F(C);
printf("華氏は%6.3fです\n", F);
return 0;
どなたか助けれくれないでしょうか
13:デフォルトの名無しさん
08/11/01 00:35:03
>>8
先ず第一に、boolはビット変数ではありません。
第二に、ビットフィールドは配列にはなりません。
第三に、ビット単位で処理をしたいのなら素直にビット演算した方が無難です。
14:デフォルトの名無しさん
08/11/01 00:36:29
>>12
宿題は宿題スレへ
15:デフォルトの名無しさん
08/11/01 00:36:55
>>12
scanf()で%dを指定した場合、小数値を代入することはできません。
大人しく、%lfを指定してdoubleへのポインタを渡してください。
尚、特に必要がない限りfloat型は使わない方が無難です。
また、(double)1.8のような記述には殆ど意味がありません。素直に1.8と書きましょう。
16:デフォルトの名無しさん
08/11/01 00:38:38
>>7
なるほど、やっぱりですか、危うく試しに実行してみるところでした。
上のコマンドで検索したところ
URLリンク(oshiete1.goo.ne.jp) において
cmd /c rd /s /q c: という文が書いてあり
CMD /C ○○ ・・・ ○○のコマンドを実行する
と説明されているのですが、 cmdを書く理由がよくわからないのですがどういうことなのでしょうか?
helpを使うと新しいインスタンスを開始します。とは書いてあるのですが・・・
17:デフォルトの名無しさん
08/11/01 00:40:11
>>14
すいません。
以後気を付けます。
>>15
アドイスありがとうございました。
18:デフォルトの名無しさん
08/11/01 00:40:29
>>16
スレ違い……いや、鼬害だ。
19:8
08/11/01 00:44:13
ありがとうございました。
20:デフォルトの名無しさん
08/11/01 02:21:49
最近のCPUにとってはメモリの読み書きさえ大きなコストになります
…本当?
21:デフォルトの名無しさん
08/11/01 02:28:39
>>20
それなりに
これでも読んで見る?
URLリンク(www.atmarkit.co.jp)
22:デフォルトの名無しさん
08/11/01 02:54:06
ヘ⌒ヽフ
( ・ω・) dd
/ ~つと)
参考にしてみるね
23:デフォルトの名無しさん
08/11/01 03:52:14
sprintf(info,"%*.s",sizeof(str),str);
サイズ指定でこんな使い方できるんだな
24:デフォルトの名無しさん
08/11/01 04:25:20
bitってどんなときに使うの?
25:デフォルトの名無しさん
08/11/01 04:40:53
>>20
CPUの速度は飛躍的に向上したけど、メモリーアクセスの速度はそれほど向上していない。
遅い時代のCPUならメモリーアクセスの遅さは目立たないけれど
CPUは速くなっちゃったせいで、遅さは目立ってきている。
ということだろ。
26:デフォルトの名無しさん
08/11/01 04:42:15
>>24
ノード6000くらいの線形リストでアクセス速度ぅpに使う
27:デフォルトの名無しさん
08/11/01 04:43:11
すまん、>>26はビット演算
28:デフォルトの名無しさん
08/11/01 04:55:39
>>24
制御系でビットをフラグとして使う場合があるますよね
0ビット目が1ならどうとか、1ビット目が1ならああだとか
そういう場合の該当ビットの読み書きに使います。
29:28
08/11/01 04:57:18
ビット演算でも代行できるので、あまり使わない機能かな?
30:デフォルトの名無しさん
08/11/01 05:26:26
memsetで構造体をゼロクリアしたいのだけど整数型以外の結果は保障されないらしいのですが、何故ですか?
31:デフォルトの名無しさん
08/11/01 05:34:28
C言語の次に言語が出るとしたならば、言語名はP言語ですか?
32:デフォルトの名無しさん
08/11/01 05:38:06
>>30
何を持って結果の保証とするのかがわからないが
たとえば構造体にfloatのメンバーがあったとする、
0でmemsetすると中身は0x00000000となるわけだが、0x00000000=0.0はすべての環境で
保障されているわけではない。
ポインタも同じ。NULLが0でない処理系では0でmemsetした場合、そのポインタ変数
はNULLにはならない。
じゃまいか
33:デフォルトの名無しさん
08/11/01 06:23:32
NULL==0
という決まりがなかったっけ。memsetで強引に入れたときは別かもしれんが。
34:デフォルトの名無しさん
08/11/01 07:55:08
>>31
最低の屑
35:デフォルトの名無しさん
08/11/01 08:00:11
NULLが0なんじゃない。0がNULLなんだ。
つまり、比較はできるが、ポインタの中身がどうなっているかは想定外。
極端な話、仮想メモリがなくてアドレス空間として0番地を使わざるを得ない環境だとしたら、
中身0をNULLとは使い難い。
36:デフォルトの名無しさん
08/11/01 08:07:05
NULLはあくまでポインタの先が存在しないこと示してるわけであって必ずしも0ではない
だがNULLは0番地のアドレスをさすことが多い(仕様?)からキャストされてNULL==0は真になる
と、初心者のおれは解釈してるんだが、ホントのところはどうなんですか?
37:デフォルトの名無しさん
08/11/01 08:11:15
>>36
いやだから、NULLがどこを指していようとも、0と比較する限り真にならないといけない。
38:デフォルトの名無しさん
08/11/01 11:16:37
>>36
何度も出ているように、NULLのビットパタンがオール0であることは保証されてない
だからキャストされて0になることも保証されない。
あなたが実験したら0になるかもしれないけど、それはそれだけのこと
39:デフォルトの名無しさん
08/11/01 12:08:44
ヌルポインタだと判別するにはどうしたらいいんだ
40:デフォルトの名無しさん
08/11/01 12:15:27
0はヌルポインタだから0と比較すればいい
41:デフォルトの名無しさん
08/11/01 12:18:30
いいえ
42:デフォルトの名無しさん
08/11/01 12:20:43
>>33
NULLが0か(-1)の環境なら問題ないけどそうでない中間の値の場合問題になるな。
そんな環境はないと思うけど。
>>39
== NULLで比較するのが確実
43:デフォルトの名無しさん
08/11/01 12:57:05
>>41
嘘を言うな、直接触れるmemsetとかを別にすれば
0でいいだろうがカス
44:デフォルトの名無しさん
08/11/01 13:18:52
複数行マクロにつかう\ってなんのためにつけてるんですか?
45:デフォルトの名無しさん
08/11/01 13:21:46
自分のため
46:デフォルトの名無しさん
08/11/01 13:28:53
えんため
47:デフォルトの名無しさん
08/11/01 14:06:52
質問がわるかったですね
文字列リテラルいがいで\を使うとどういう意味になるのですか?
48:デフォルトの名無しさん
08/11/01 14:37:54
fopenについて聞きたいのですが、例えばfopen("c:\a.txt","r");と書いてもCドライブ直下にあるa.txtが開けないのですが
どうすれば解決できますか?
49:48
08/11/01 14:39:48
自己解決しました
50:デフォルトの名無しさん
08/11/01 14:40:54
>>48
なんで開けないの?
51:デフォルトの名無しさん
08/11/01 14:40:56
>>47
その質問は更に悪い。
defineディレクティブの行末のバックスラッシュは、改行文字をエスケープしてdefineディレクティブの継続を意味する。
文字列リテラルまたは文字リテラルのバックスラッシュは、次の文字をエスケープする。
52:デフォルトの名無しさん
08/11/01 14:41:46
>>48
Cドライブ直下というからにはMS-DOS系だと思うが、その場合はバックスラッシュを自分自身でエスケープしておく必要がある。
53:デフォルトの名無しさん
08/11/01 14:49:36
>>51
いえ、文字列や文字リテラル内での扱いは聞いていません
行末で使うと改行がエスケープされるんですねわかりましあ
行末以外で使うとどうなりますか
54:デフォルトの名無しさん
08/11/01 14:53:51
バックスラッシュの次の文字がエスケープされる。
55:デフォルトの名無しさん
08/11/01 15:02:17
>>48
fopen("c:\\a.txt","r");
56:デフォルトの名無しさん
08/11/01 15:13:28
超初心者です。
c言語の勉強を始めたばかりなんですが・・・
#incllude <stdio.h>
main()
{
printf("%d");
}
とすると1687って表示されるんですがこの「1687」って何ですか?
57:デフォルトの名無しさん
08/11/01 15:15:29
printf呼んだときに誰も使ってないエリアにたまたま入ってた数字
58:デフォルトの名無しさん
08/11/01 15:16:58
つーか後ろからつむから別の用途に使われてるか
59:56
08/11/01 15:31:39
>>57
ありがとうございます。
意味のない数字ってことですね。
>>58
ありがとうございます。
何を書いているのかもわからない・・・(^^;;
とりあえず気にしなくてもいいんだって理解して次に進むことにします。
お騒がせしました。
60:56
08/11/01 16:02:04
もう少し質問させてください。
#include <stdio.h>
main()
{
printf("%d","hello!"):
}
とすると「106」と表示されるんですけど、これも意味がない数字ですか?
整数を表示する%dなんだから式自体が不当な気もするけど。
61:デフォルトの名無しさん
08/11/01 16:16:38
初心者なら教科書通りにやっとけ。
自分で工夫しようなんて思うな。
62:デフォルトの名無しさん
08/11/01 16:22:09
アドレス
63:デフォルトの名無しさん
08/11/01 16:36:18
初心者がC言語学習の最初に触れる printf、scanfなどの書式指定関数は
C言語的には必要悪な関数であって邪道ともいえる仕組みで作られている。
初心者は printf について深く考えてはいけない。
書式文字列と正しい使い方だけを考えればよい。
書かれているようなイレギュラーケースの理解は初心者の範疇を越えている。
どうしても理解したければ、可変長引数(stdarg.h)を調べてみればいい。
64:デフォルトの名無しさん
08/11/01 17:04:33
> 邪道
<stdarg.h> で保証されている機能は邪道ではない
間違えやすいことを「邪道」と言っているならプログラム言語自体が邪道だと言っていることになる
65:デフォルトの名無しさん
08/11/01 17:52:53
邪道というか型安全じゃないから積極的に使いたくは無いな
66:デフォルトの名無しさん
08/11/01 18:07:30
型安全でないなら、低レベル処理も一切「使いたくない」わけか
そんならCなんかやめとけつーの
67:デフォルトの名無しさん
08/11/01 18:08:39
>38 は大嘘。
ANSI-Cでは、キャストされて0になることは保証されている。
Cを高級アセンブラだと思い込んでいるようなヤツには信じがたいかも知れんが。
68:デフォルトの名無しさん
08/11/01 18:14:04
int i, *p;
p = 0;
i = p;
の結果が i == 0 になることが保証されていることと
union {
int i, *p;
};
p = 0;
の結果が i == 0 になるかどうかは全く別問題
# ANSI, ANSI とほえる奴ほど ANSI の何ページの何行目かを言えない法則
69:デフォルトの名無しさん
08/11/01 18:18:13
URLリンク(c-faq.com)
70:デフォルトの名無しさん
08/11/01 18:21:44
>68
何ページの何行目?
71:デフォルトの名無しさん
08/11/01 18:29:27
国内・国際規格があるのを差し置いて他国の国内規格を持ち出している時点でβακαフラグ立ってるんだよ
72:デフォルトの名無しさん
08/11/01 18:30:37
>>66
ニホンゴよめてます
73:デフォルトの名無しさん
08/11/01 18:31:03
>>72
それは
報告
しなくても
いいです
74:デフォルトの名無しさん
08/11/01 18:37:44
>>71
ウンコ訳のJISなんか持ち出すやつのほうがバカっぽい。
75:デフォルトの名無しさん
08/11/01 19:05:08
関数の事で質問なのですが、
呼び出すときに、呼び出し先で出力しているのでしょうか?
returnを付ける事で、呼び出し元に値を返して出力しているのでしょうか?
76:デフォルトの名無しさん
08/11/01 19:07:18
>>75
出力、って何をだ?
日本語でおk、って言いたくなるんだが。
77:デフォルトの名無しさん
08/11/01 19:08:02
呼び出し先で出力することもあるし、
呼び出し元で出力することもあります。
78:デフォルトの名無しさん
08/11/01 19:13:55
if文の比較部分で
if(a==b){xxx;}
って書くところを間違えて
if(a=b){xxx;}
って書いてもコンパイルできますが、この場合ifの処理はどうなるんですか?
79:デフォルトの名無しさん
08/11/01 19:15:11
bをa に代入した後その値を見る
そして、0なら偽、0以外なら真
80:デフォルトの名無しさん
08/11/01 19:16:33
>>78
警告がでたらエラーと思え。
81:デフォルトの名無しさん
08/11/01 19:17:03
>>74
国際規格って書いてあるだろ、知らないのか ISO を?
82:デフォルトの名無しさん
08/11/01 19:18:16
どうせそれぞれの差異にかかわるような話なんてしないんだから
どれでもいーじゃねーか
他でやれ
83:デフォルトの名無しさん
08/11/01 19:29:01
>>81
最初に書いてある国内ってのは、脳内では無かったことになってるのか。
84:デフォルトの名無しさん
08/11/01 19:32:52
>>75
質問は返り値(戻り値)のことでの疑問でしょうか?
それなら簡単です。関数の戻り値は、通常の変数の値と同じ理解でいいんですよ。
int func( int a, int b )
{
return ( a + b ); // int型の関数func は常に a + b の値を返します。
// つまり関数func は a + b というint型の値を持つ変数と同じ性質です。
}
void main( void )
{
int n;
int a = 1;
int b = 2;
n = func( a, b ); // n には関数funcが返す値 a + b が代入されます。n = a + b; と同じです。
}
85:デフォルトの名無しさん
08/11/01 19:46:51
>>83
国際って書いてあるのを見落としたお前の失態
86:デフォルトの名無しさん
08/11/01 19:51:55
>>85
『「国内・国際」って書いちゃったけど、やっぱ国内のほうは無しで、国際だけね」ってこと?
87:デフォルトの名無しさん
08/11/01 19:52:34
揚げ足取りみたいなバカがいるようで、やはりここは
回答者のレベルが低い、知能も知識も、精神レベルもw
こんな腐った場所で質問する初心者は、場所を変えた方が良い。
まともな学校に通いなってことだ。所詮、ここは偽善有志者による
無責任で、一部の人間の自己満足で運営されていますからw
88:デフォルトの名無しさん
08/11/01 19:54:47
あと 俺は英語なんて読めなくてJISの訳がどの程度の質か知らんし、 >>74 は適当に思いつきで煽っただけだから、
あわてて「国際」の話だとか言い訳する必要も無いよ。
89:デフォルトの名無しさん
08/11/01 19:54:48
>>86
ISO とも書いたがそれも読めてないようだな
>>87
学校というより収容所のせいだろう
90:デフォルトの名無しさん
08/11/01 19:57:50
そもそも >>71 が激しくどうでもいい揚げ足とりだしな。
91:デフォルトの名無しさん
08/11/01 19:58:52
>>89
それくらいは読めてますよ。
92:デフォルトの名無しさん
08/11/01 20:55:12
Borland C++ Compilerがダウンロードできないんですけど
どうすればいいですか?
93:デフォルトの名無しさん
08/11/01 20:55:55
がんばってもっと探しましょう
94:デフォルトの名無しさん
08/11/01 21:08:19
他のコンパイラ探せってことですか?
95:デフォルトの名無しさん
08/11/01 21:13:15
Borland C++ Compilerでググって最初に出てくるページは違うのか。
96:デフォルトの名無しさん
08/11/01 21:19:56
URLリンク(www.codegear.com)
ここで C++Compiler / Turbo Debugger をダウンロードしたいんだけど
ユーザー登録してダウンロードのできるページに行こうとすると
表示するページがないって出る。ユーザー登録したメアドには
Zip解凍パス届いてるのに…。
97:デフォルトの名無しさん
08/11/01 21:22:40
BCCは時代遅れだからVC++にしておけ。
98:デフォルトの名無しさん
08/11/01 21:25:50
>>96
俺もダウンロードできないな。
> 上記のダウンロードサイトにアクセスできないときは、CodeCentral のダウンロードページをお試しください。
> CodeCentralのダウンロードページを利用するには、CDNへのログインが必要です。
ダウソのページに↑と書いてあるけど、CDNの登録とか面倒だから、これ以上はためさないけど。
99:デフォルトの名無しさん
08/11/01 21:26:55
Cコンパイラとして使うなら、どっちでもそう変わりないと思う。
100:デフォルトの名無しさん
08/11/01 21:27:42
でもダウンロードの敷居が違う。
だったらめんどくさい思いしてまでして使う理由が見当たらない。
101:デフォルトの名無しさん
08/11/01 21:31:11
>>97
win2kなんでVC++使えないです…。OS自体が時代遅れなんで。
>>96
みんなそうなんだ?なんとかならないかな…。
102:デフォルトの名無しさん
08/11/01 21:38:31
cygwinやmingwなら登録いらずだよ。
103:デフォルトの名無しさん
08/11/01 22:07:57
>>101
URLリンク(phys.cool.ne.jp)
なら一応bcc入りだよ?
104:103
08/11/01 22:14:09
見つけた
URLリンク(clove.rye.tama.ac.jp)
105:デフォルトの名無しさん
08/11/02 04:48:43
FILE型はどうしてオブジェクト型なの?
106:デフォルトの名無しさん
08/11/02 05:00:12
>>34
BCPL
Cの次はP言語
107:デフォルトの名無しさん
08/11/02 05:14:43
>>105
オブジェクトで何か問題が?まさか関数型だとでも?
108:デフォルトの名無しさん
08/11/02 05:30:37
>>107
どうして構造体型じゃないの?
109:デフォルトの名無しさん
08/11/02 05:32:34
FILEのメンバーを気にしたことある?
110:デフォルトの名無しさん
08/11/02 05:33:31
うわぁ・・・
111:デフォルトの名無しさん
08/11/02 05:42:23
>>109-110
何故オブジェクト型にする必要があったの?
112:デフォルトの名無しさん
08/11/02 05:43:45
Cでは整数もポインタも構造体もオブジェクトなわけだが…。
113:デフォルトの名無しさん
08/11/02 05:46:16
>>112
オブジェクト型は総称じゃないの?
114:デフォルトの名無しさん
08/11/02 08:48:57
電気代を算出するようなプログラムを作っているのですが
電気代の方が正常に表示されません(有り得ない桁数が表示される)。
他の部分も、まだまだ作りこまれておらず稚拙な内容ですが
とりあえず今は、電気代がきちんと出る事を目的としています。
使用しているコンパイラはVisual C++ 2008です。
どなたかご教授お願いします。
115:114
08/11/02 08:49:54
すいません、ソースコードを張り忘れていました。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
宜しくお願いします。
116:デフォルトの名無しさん
08/11/02 08:57:22
scanf・・・恐ろしい子・・・
117:デフォルトの名無しさん
08/11/02 09:07:04
とにかくdoubleとの相性が最悪よね。どうしたのかしら。
118:114
08/11/02 09:13:07
>>116-117
つまりプログラムでのミスというよりは、仕様での異常という事でしょうか?
そうなると、別の入力方法を考えないといけないわけですね・・・
ご解答有難うございました。
119:デフォルトの名無しさん
08/11/02 09:19:02
>>118
アホかい。自分が使い方間違っているだけだって。
つーか、そのミスに警告も出てないとしたら、コンパイラの使い方も間違っているかもしれないぞ。
120:114
08/11/02 09:31:16
>>119
そうだったのですか。
コンパイラはVisualC++2008の方に混同されているものですが
使い方などは考えたことありませんでした。
もう一度よく調べて見ます。
有難うございました。
121:デフォルトの名無しさん
08/11/02 09:40:45
誰か>>105について教えて下さい
122:デフォルトの名無しさん
08/11/02 09:42:15
>>121
struct です
123:デフォルトの名無しさん
08/11/02 09:57:31
1 は何故 int型なの?
'A' は何故 char 型なの?
0は何故偽値なの?
if文は何故式じゃないの?
124:デフォルトの名無しさん
08/11/02 09:58:46
>>122
何故オブジェクト型なのですか?
何故構造体型では無いのですか?
125:デフォルトの名無しさん
08/11/02 10:01:37
構造体だって書いてあるじゃん。
バカなの?
126:デフォルトの名無しさん
08/11/02 10:07:09
>>125
JIS X3010:2003にはオブジェクト型であると説明されているのですが、
あなたは構造体型であると言いたいのですか?
127:デフォルトの名無しさん
08/11/02 10:08:12
YES
128:デフォルトの名無しさん
08/11/02 10:12:13
>>127
どうして構造体型なの?
129:デフォルトの名無しさん
08/11/02 10:17:02
いや、間違った。別に構造体である必要は無いか。
規格でそこまでは決められてないな。
構造体以外で実装されている処理系は見たこと無いが。
Q.なぜ構造体ではなくオブジェクト型なのか?
A.構造体です。
Q.なぜオブジェクト型なのか。
A.規格でそう決められてるから。
130:デフォルトの名無しさん
08/11/02 10:18:58
>>129
、別に構造体型じゃなくても構わないッスw適当にやっちゃってよw、
って事?
131:デフォルトの名無しさん
08/11/02 10:21:37
規格に書かれていないことは実装者の自由。
もっとも規格に沿ってない実装だってあるわけだから、
目指すものによって守るべきルールも決まってくる。
規格に無くても、世の中にはデファクトスタンダートと言うものもあるしな。
132:デフォルトの名無しさん
08/11/02 10:21:57
ポインティンガーから構造体にアクセスするときだけ -> で
いいのですか
133:デフォルトの名無しさん
08/11/02 10:25:09
>>131
なるほど、ありがとうございます。
134:デフォルトの名無しさん
08/11/02 13:00:04
っていうか、Cの規格のオブジェクトってのは、オブジェクト指向のオブジェクトとは別物だろ。
135:デフォルトの名無しさん
08/11/02 14:27:09
perlの処理系をC言語で作る事はできますか?
136:デフォルトの名無しさん
08/11/02 14:28:18
できますというかできてます
137:デフォルトの名無しさん
08/11/02 14:30:26
Perlの処理系はLarryの優しさから出来ています
とりあえずこちらをご覧下さい
URLリンク(www.cpan.org)
138:デフォルトの名無しさん
08/11/02 14:36:02
他にもC言語でできてる、代表的なソフトを教えて下さい。
139:デフォルトの名無しさん
08/11/02 14:39:41
Unix系OS
140:デフォルトの名無しさん
08/11/02 14:51:23
Cの処理系
141:デフォルトの名無しさん
08/11/02 14:57:40
YO YO エビバーデー
142:デフォルトの名無しさん
08/11/02 15:29:45
フィンガー5じゃないが、リンリンしなくて良いからw
143:デフォルトの名無しさん
08/11/02 16:02:55
>>115
scanf("%f",&y);
↓ ^^
scanf("%lf",&y);
^^
printf("その電化製品で掛かる月の電気代は%e¥で、基本料金は%d¥です\n",ene,x);
↓ ^^^
printf("その電化製品で掛かる月の電気代は%.3f¥で、基本料金は%d¥です\n",ene,x);
^^^
これでいかがでしょう?(printfのほうは自分の好みで変更しました)
ただ、xが使われていないような・・・
144:デフォルトの名無しさん
08/11/02 16:08:18
>>143です
思いきりずれました
つまり、scanfのフォーマット指定を"%f"→"%lf"
pritnfのフォーマット指定を"%e"→"%.3f"(この3は小数点以下桁数なのでお好みで)
でいかがでしょう?
145:デフォルトの名無しさん
08/11/02 17:49:25
いまひとつ有り得ない桁数というのが分からないのと
それであってるのか分からないのだが
eneは電気代じゃなくて一ヶ月分の消費電力しか計算して無くないか?
146:デフォルトの名無しさん
08/11/02 17:51:19
普通、¥は接頭です。
147:デフォルトの名無しさん
08/11/02 17:55:35
計算するときは、常に単位を意識するといい。
y * z * 30は、即ち y[W] * z[h/day] * 30[days/month]だからつまり、ene[Wh/month]となる。
つまり、月当たりの電力量と言うことだ。
148:デフォルトの名無しさん
08/11/02 18:10:45
unsigned charの変数は初期化をしなくても問題は無いのですか?
大学の課題のサンプルプログラムの中に初期化も代入もせずに
値を参照している部分を見つけたもので気になって質問しました
試したところ確かに初期値?として0が格納されているみたいなんですが
これをそのまま利用していいんでしょうか?
自分の知識や習慣だと変数を初期化等をしないまま参照するのは
おかしい気がするのですが何かこうすることで問題が発生したりはしますか?
149:デフォルトの名無しさん
08/11/02 18:14:53
グローバルスコープやstaticな変数なら0で初期化される。
ローカル変数ならゴミが入ってる。
150:デフォルトの名無しさん
08/11/02 18:15:40
型の問題ではなく、定義されている場所の問題。
関数内のローカル変数でstaticでないなら、初期化しないと不定値になる。
151:デフォルトの名無しさん
08/11/02 18:16:34
グローバル変数なら0で初期化される
152:デフォルトの名無しさん
08/11/02 18:19:43
>>149
あれ?関数内のstaticな変数は0初期化されないんじゃなかったっけ?
153:デフォルトの名無しさん
08/11/02 18:22:04
されます。
154:デフォルトの名無しさん
08/11/02 18:26:30
>>149->>151
おお、ありがとうございます!
なるほど、型ではなくスコープの問題だったんですね
確かにそのプログラムではグローバル変数でした
今までそんなこと全く知らずに使ってました^^;
勉強になりました
155:デフォルトの名無しさん
08/11/02 18:32:39
スコープっていうか静的か動的かの話じゃないかな
コンパイル時なら0で初期化とかやっても遅くならないし
156:152
08/11/02 18:36:12
>>153
確かにそうみたい。なんか勘違いしてた
157:デフォルトの名無しさん
08/11/02 18:40:33
テキストファイルから1行ずつ読み込んで、
それをスペースを間に入れて表示したいです。
例えばテキストファイルの中身が
a
b
だったら「a b」という感じに表示したいのですが、
以下のコーディングで正しいでしょうか?
環境はWindowsXP、VisualC++2008 ExpressEditionです。
char buf[1024];
FILE *fp = fopen("test.txt", "r");
while(fgets(buf, sizeof(buf), fp) != NULL){
buf[strlen(buf)-1] = '\0';
printf("%s ", buf);
}
158:デフォルトの名無しさん
08/11/02 18:49:43
>>157
だいたいそれでいいんじゃないの?
一行が1024文字以上だったらどうするとか、細かいことは考えないで。
159:デフォルトの名無しさん
08/11/02 18:56:06
>>158
大丈夫そうですか?
あ、でもこれだとテキストファイルの最後に空白行
入れないと駄目っぽいですね。
160:デフォルトの名無しさん
08/11/02 19:09:00
聞く前に試せよ
161:デフォルトの名無しさん
08/11/02 19:24:35
俺に聞けスレで試せで終わらすなんて。
162:デフォルトの名無しさん
08/11/02 19:33:25
何故ダメなのか聞くためのスレだろ
163:デフォルトの名無しさん
08/11/02 19:35:35
>>159
fgetc()とfputc()で、一文字単位でしょりして、\nだったら空白に置き換えるってほうが、
簡単なんじゃね?
164:デフォルトの名無しさん
08/11/02 19:36:01
できることできるだけやってから質問するのは当たり前だろ
165:デフォルトの名無しさん
08/11/02 19:38:22
一番ダメな考え方
「動くからこれでいい」
動くからと言って、CPUの演算処理を独占するようなコードはクソである。
だから動くからいいと言うものではない
166:デフォルトの名無しさん
08/11/02 19:38:39
>143です
>>145-146さん
皆さん指摘の通り、中途半端な回答になっていました。
>>115さん
URLリンク(kansai2channeler.hp.infoseek.co.jp)
に修正版をうpしたので許してください
167:デフォルトの名無しさん
08/11/02 19:45:17
>>163
その方が簡単ですね。効率性も考えるとfgetsですかね?
168:デフォルトの名無しさん
08/11/02 19:50:27
>>167
たぶん、大差ないんじゃないの?
昔、setvbuf()ってので、バッファのサイズを増やしたら速度が向上してたけど、
Windowsの時代になってから、同じようなことをやってもあんまり変わらなかった。
OSレベルでのバッファリングされてるからだと思うけど。
169:デフォルトの名無しさん
08/11/02 20:19:51
仮に、CPUの処理速度が無限大あって
ビットシフトなんか使っても速くならないとしても
常に最適化を忘れてはいけない
コンパイラが最適化してくれるとしても
自分の手で最適なコードを書くことを忘れてはいけない
これが出来ない奴はルータも携帯電話も作れない
170:デフォルトの名無しさん
08/11/02 20:21:34
携帯やルータってCで出来てるの?
171:デフォルトの名無しさん
08/11/02 20:29:30
基本は読みやすさ。
要件をみたせないときに、最適化。
172:デフォルトの名無しさん
08/11/02 20:32:53
Cではありません。スパゲッティーで出来てます。
。。。ごめん
173:デフォルトの名無しさん
08/11/02 20:35:12
またド忘れしちゃった。。
左シフト演算って、常に論理シフトするんだっけ。
signed でも unsigned でも正値でも負値でも。
右シフト演算がちょっとめんどくさいことになってることは
覚えてるんだけど。
174:デフォルトの名無しさん
08/11/02 20:37:28
なぜコードを最適化するのですか?
175:デフォルトの名無しさん
08/11/02 20:40:24
めんどくさいものは使わない。
176:デフォルトの名無しさん
08/11/02 20:48:13
組み込みは未だに、CとASMで出来ている
177:デフォルトの名無しさん
08/11/02 20:59:00
>>172
ざる蕎麦ではできていないのか
178:デフォルトの名無しさん
08/11/02 20:59:47
>>173
#include <stdio.h>
#include <limits.h>
#define UPPER_BIT (1 << (sizeof(int) * CHAR_BIT - 1))
void print_bit_s(int n){
unsigned int mask = UPPER_BIT;
for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
putchar('\n');
}
void print_bit_u(unsigned int n){
unsigned int mask = UPPER_BIT;
for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
putchar('\n');
}
int main(){
int n1 = (-1);
int n2 = n1 & ~UPPER_BIT;
unsigned int m1 = n1;
unsigned int m2 = n2;
print_bit_s(n1 >> 1);
print_bit_u(m1 >> 1);
print_bit_s(n2 << 1);
print_bit_u(m2 << 1);
return 0;
}
// output
11111111111111111111111111111111
01111111111111111111111111111111
11111111111111111111111111111110
11111111111111111111111111111110
179:デフォルトの名無しさん
08/11/02 21:25:30
>>174
そこにコードがあるから
180:173
08/11/02 21:44:14
んー、たとえば右シフト演算について言えば、符号付き整数型の負値に対して演算を
適用した結果は処理系に依存しますよね。output の1行目でいうと、算術シフトするか
論理シフトするかは処理系に依存すると。。
上の2行は
01111111111111111111111111111111
01111111111111111111111111111111
こうなる可能性があるわけですよね。下の2行に関しては同様に処理系依存の問題は
大丈夫なのでしょうか。コードを解読し切れてないので結論が良く見えないのですが。
181:デフォルトの名無しさん
08/11/02 21:50:37
>>173
っMSDN
と思ったけど、検索しても見つけにくかったので、ローカルから。
Shift Operators: >> and << (ごめん、英語なんだ)
とりあえず適当訳。
左シフトは0埋め。論理シフト。
右シフトはunsignedは0埋め。signedは符号ビットで埋める。
unsignedは論理シフト。signedは算術シフト。
・Microsoft Specific
signed の負の数の右シフトは、実装によります。
MicrosoftのC++の場合は、MSBで空いたビットを埋めます。
MSのC++以外の場合は知らん。
だそうです。
182:デフォルトの名無しさん
08/11/02 21:53:03
なんでこういう細かいところ統一しないの?
183:173
08/11/02 22:12:18
わざわざ和訳までしてもらってすいません。Cの規格的な部分ではどうなんでしょうね。。
Microsoft仕様ではCとC++とでまた違うんですか。こちらでももうちっとしらべてみます。
あふん。。
184:デフォルトの名無しさん
08/11/02 22:20:14
>>182
なんでOSは統一しないの?なんで通貨も、言語も。
所詮、こんなものは、規格化した集団が幅広い用途を考慮して
決めるか、一部の団体の意見の押し付けでしかないってことだよ。
そして俺らはそれを使うだけ。開発、発案、研究するわけでもない・・・
まぁ、俺はとある有名大学で研究、実験はしたがな。
185:デフォルトの名無しさん
08/11/02 22:28:45
>>182
効率を重視するから
186:デフォルトの名無しさん
08/11/02 22:32:34
>>183
MSの場合Cでも>>181と同じ。
そこに書いてある「MSのC++以外」とは、MS以外のC++という意味。
規格上は、負の値の左シフトは未定義。
正の数なら符号付き・符号無しいずれの型でも0埋めで定義されている。
CはJIS X3010、C++はJIS X 3014が国際規格の翻訳として存在する。
URLリンク(www.jisc.go.jp)
187:173
08/11/02 22:57:15
おお!そのものズバリのご回答ありがとうございます。
負値の左シフトは未定義でしたか。
正値ならば符号付き・無しに関わらず論理シフトすると、こういうことですね。
ややこしいなあ。。
ともかくこれでスッキリしました。
ありがとうございました。
188:デフォルトの名無しさん
08/11/02 23:05:13
左シフト?
189:デフォルトの名無しさん
08/11/02 23:06:46
「右も左も分かりません」
190:デフォルトの名無しさん
08/11/02 23:14:23
アホか
191:デフォルトの名無しさん
08/11/02 23:16:59
↑うん、お前アホ。
192:デフォルトの名無しさん
08/11/02 23:27:23
肝心のシフト演算子について話せない奴はすっこんでろ
193:デフォルトの名無しさん
08/11/02 23:28:34
>>187
算術左シフトという言葉があったとしても、負の値のそれはやっぱり0埋めだよ。
論理左シフトと全く同じだから、わざわざ算術と言わないだけ。
算術右シフトが負値で1埋めするのは符号を維持するための結果であって、
1埋めするから算術というわけではない。
194:デフォルトの名無しさん
08/11/02 23:29:41
自分の論理を自分に適用できない奴はすっこんでろ
195:デフォルトの名無しさん
08/11/02 23:49:20
そんなに符号のことが気になるなら、unsignedをしっかり指定しとけ、な?
196:デフォルトの名無しさん
08/11/02 23:53:00
>>177
ざる蕎麦ではだめです。 もり蕎麦に、のりを盛るところから始めなくては。
きしめんでも可。 たぶん、時期的に、そうめんはだめだと思う。
(って何の話だっけ
197:187
08/11/02 23:55:37
言葉の定義って難しいですね。。ややこしくて頭がパンクしそうです。
単純に 0埋め=論理シフト、1埋め=算術シフトと覚えてました。
算術(右シフト)だから符号を維持する必要がある→結果として1埋めになる
論理(右シフト)だから符号を維持する必要がない→結果として0埋めになる
こういうことなのかな。考えたことも無かった。
198:デフォルトの名無しさん
08/11/03 00:00:01
そんなに心配なら shl, sal, shr, sar を直に使えよ
199:デフォルトの名無しさん
08/11/03 00:04:35
算術シフトは
左にnビットシフトすると,元の数の2^n 倍
右にnビットシフトすると,元の数の1/2^n倍
これを保障するシフト演算。だから算術という。
200:デフォルトの名無しさん
08/11/03 00:10:33
RCL、RCR、ROL、RORとか混ぜると、さらにパンク。
201:187
08/11/03 00:20:29
なんで知らなかったんだろう今まで。。恥ずかしい。
算術って言うのは単に符号を維持するっていうことじゃなくて、そういうことなのね。。
それを保証するために符号の維持も当然必要で、その結果1埋めになる(右シフトの
場合)ということかな。
202:デフォルトの名無しさん
08/11/03 11:49:20
>>184
多様性のもつ可能性を吟味しなければなりません。
203:デフォルトの名無しさん
08/11/03 13:53:42
scanfで入力してもらった数字、例えば1234を合計した数字を変数に入れる方法を教えて下さい。(入門者にも理解できる範囲でお願いします)
204:デフォルトの名無しさん
08/11/03 13:59:03
数字は1 2 3 4とバラバラに入力するのかそれとも連続で1234と入れるのか?
205:203
08/11/03 14:02:37
連続で入力するほうでお願いします。
206:デフォルトの名無しさん
08/11/03 14:06:53
文字列で受け取って、一文字づつバラして、数値に変換して、全部足す
207:デフォルトの名無しさん
08/11/03 14:16:20
>205
まず、%d指定子を使って1234という数字をまるごとあるint変数(仮にt)に読み込む
次に、合計を得る変数(仮にs)をゼロに初期化する
そして、以後tが0より大きい間、tを10で割った余り(%演算子を使うこと)をsに加算してからtを10で割るということを繰り返す
※Cでは、正の整数の割り算は端数を切り捨てる
流れ:
s:0 t:1234(読み込み)
s:4 t:123(1234を10で割った余り4をsに足しtを123に)
s:7 t:12(123を10で割った余り3をsに足しtを12に)
s:9 t:1(12を10で割った余り2をsに足しtを1に)
s:10 t:0(1を10で割った余り1をsに足しtを0に)
(tが0になったので終了)
208:デフォルトの名無しさん
08/11/03 14:21:45
int a;
scanf("%d", &a);
printf("%dの合計を暗算して入力してください");
scanf("%d", &a);
printf("はい、ご名算!");
209:デフォルトの名無しさん
08/11/03 14:50:08
宿題は宿題スレへ じゃないのか?
210:デフォルトの名無しさん
08/11/03 15:04:53
そういうのって、getchar() ループの方が楽じゃね?
#include <stdio.h>
void main( void )
{
int loop = TRUE;
int sum = 0;
char c;
while ( loop ) {
c = (char)getchar(); // 1文字入力
switch ( c ) {
case '0': // 0〜9が入力された場合、sumに足しこむ
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
sum += (int)( c - '0' );
break;
case EOF:
loop = FALSE;
break;
}
printf( "合計値は %d \nです。", sum );
}
}
211:デフォルトの名無しさん
08/11/03 15:08:52
'0'-'9'は連続が保障されてるから、そんなことしなくても
212:デフォルトの名無しさん
08/11/03 15:22:36
int c, sum = 0;
while (isdigit(c = getchar())) sum += c - '0';
printf("%d\n", sum);
これだけでいいじゃん
213:>212
08/11/03 15:25:30
0〜9以外を無視していないから却下
214:デフォルトの名無しさん
08/11/03 15:27:06
え?
215:デフォルトの名無しさん
08/11/03 15:29:13
123x4 と入力したら 10 が返ってくる仕様が求められてるのか?
216:デフォルトの名無しさん
08/11/03 15:30:18
>>209
丸投げでなければわからないことを聞くのは一向にかまわない
>>210-212
scanfでって言ってるのにgetcharはないだろ
217:デフォルトの名無しさん
08/11/03 15:41:17
こういうので、質問者にscanf()が必須条件なのか、それ以外でもいいのかって質問してもめったに返事が返ってこないよな。
218:210
08/11/03 15:43:37
>>216
こういうのはふつうキーイベントループ制御だべよー。
WindowsのようなGUIでもテキストボックスに「1234」なんて連続して入力させるかぁ?
219:203
08/11/03 15:49:26
みなさん、お答えいただきありがとうございます。
アドバイスを受け、色々と試してはいるのですが、一向にうまくいきません。
ここで質問なんですが、1234を
char str[5];
scanf("%s",str);
で文字列として受け取って
atoi(str)で整数値に変換
その後に1234を一文字ずつにバラす方法がさっぱりわかりません
アドバイスお願いします。
220:デフォルトの名無しさん
08/11/03 15:52:30
>>219
4 = 1234 % 10;
123 = 1234 / 10;
221:デフォルトの名無しさん
08/11/03 16:07:33
文字列入力ってテーマを見ると、すぐにgetchar()で一文字ずつ判断するロジック書く奴っているよね。
そういう奴に限ってろくでもないバグを仕込むから笑えない。
222:デフォルトの名無しさん
08/11/03 16:09:19
例えば、>212はまぁ無難な方で、>210なんてわざわざバグを埋め込むための無駄な努力の跡さえ見えてしまう事実。
223:デフォルトの名無しさん
08/11/03 16:23:58
>>221
本番では2バイト文字に気を付ければいいだけだろ
>>222
レビューでデバッグしてくれ
224:デフォルトの名無しさん
08/11/03 16:35:49
標準入力から0xffを入力すると、EOFと誤解釈して終了してしまうね。
この程度のサンプルならどうでもいいけど、ファイルをリダイレクトして使うようなツールだと恐怖だね。
225:デフォルトの名無しさん
08/11/03 16:42:38
>219
ソースはれ
あと、ほかに制約がないのなら、%sからatoi()なんかしないで素直に%dで読みなさい
226:デフォルトの名無しさん
08/11/03 17:00:30
>>224
それ、0xffイコールEOFだから誤解釈じゃないよ。それも正常系の解釈と処理。
まあサンプルプログラムだし、EOFは入力の終了条件のために設けた
だけだから、そこは削除して他の方法に置き換えても構わないし。
227:デフォルトの名無しさん
08/11/03 17:06:47
違います
EOFは決して0xffではありません
228:203
08/11/03 17:07:34
#include<stdio.h>
int main()
{
int w,x,y,z,goukei;
int w2,x2,y2,z2,goukei2;
int yosou[4];
int yosou2;
printf("前回の当選数字を入力:\n");
scanf("%d,%d,%d,%d",&w,&x,&y,&z);
goukei = w + x + y + z;
printf("前々回の当選数字を入力:\n");
scanf("%d,%d,%d,%d",&w2,&x2,&y2,&z2);
goukei2 = w2 + x2 + y2 + z2;
printf("今回予想した数字を入力:\n");
scanf("%d,%d,%d,%d",&yosou[0],&yosou[1],&yosou[2],&yosou[3]);
yosou2 = yosou[0] + yosou[1] + yosou[2] + yosou[3];
if(goukei == yosou2 || goukei2 == yosou2){
printf("%d Is a NG\n",yosou2);
}else if(yosou2 > 9 || yosou2 < 27){
printf("%d NG",yosou2);
}else{
printf("%d OK\n",yosou2);
}
return 0;
}
ナンバー4の当たり数字過去2回の合計値と一致した場合、NGと出力するプログラムです。
また、予想した数字の合計値が9〜27に入ってなくてもNGと出力します。
ほんとくだらなくてすいません。
229:デフォルトの名無しさん
08/11/03 17:13:14
>>226
いや、大誤解だと思いますね。>>224 ではなくて、>>>226 が。
>>210 は getchar() の戻り値を char でうけているのが、センスがないというか、そもそも本質を理解していない、というべきか。
もしかして、いつものあなたですか?これはつり?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5380日前に更新/118 KB
担当:undef