C言語なら俺に聞け(入門篇) Part 38

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 117代目
  http://pc11.2ch.net/test/read.cgi/tech/1225320579/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 37
  http://pc11.2ch.net/test/read.cgi/tech/1224000127/
過去スレ
  http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2デフォルトの名無しさん:2008/11/01(土) 00:13:27
高速な文字列置き換えはどのようにしたら出来ますか?
3デフォルトの名無しさん:2008/11/01(土) 00:17:57
>>2
高速なCPUとメモリを用意してRTOSを使いDMA転送や1クロックでも速くアセンブラでコールするなどハードウェアの限界までチューンすると出来る
4デフォルトの名無しさん:2008/11/01(土) 00:24:59
最近プログラミングを始めたんですが
コマンドプロンプトの画面ばかりで、最近食傷気味です。
別のウィンドウを表示したり、そこで文字やグラフィックを表示させるような命令文の例などはありますか?
あるいは、SDLやDXライブラリなどを使用して
それ用にプログラムを組むしかないんでしょうか?
5デフォルトの名無しさん:2008/11/01(土) 00:28:01
ちょっとお聞きしたいのですが、先ほどコマンドプロントでの主要なコマンドなどを見ていたのですが
ディレクトリ削除をあつかうrdコマンドで

rd /s \  とやったらcドライブのすべてのファイルとフォルダが削除されるってことでいいんでしょうか?
6デフォルトの名無しさん:2008/11/01(土) 00:28:02
>>4
ライブラリ使うか、直でAPI呼ぶしかない。
7デフォルトの名無しさん:2008/11/01(土) 00:29:36
>>5
管理者アカウントでやってたらほとんどきえるんじゃねーのかな。
起動中のexeとか、消えないのもあるだろうけど。
8デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/01(土) 00:30:10
>>5
いいえ
消えないかもしれません
10デフォルトの名無しさん:2008/11/01(土) 00:31:24
>>6
なるほど、自分で打ち込むだけではやはり厳しいのですね

諦めてDXライブラリ使うことにします。
ご返答有難うございました
11デフォルトの名無しさん:2008/11/01(土) 00:31:47
たかだか8bitくらいループで書かなくてもいいじゃん
12デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/01(土) 00:35:03
>>8
先ず第一に、boolはビット変数ではありません。
第二に、ビットフィールドは配列にはなりません。
第三に、ビット単位で処理をしたいのなら素直にビット演算した方が無難です。
14デフォルトの名無しさん:2008/11/01(土) 00:36:29
>>12
宿題は宿題スレへ
15デフォルトの名無しさん:2008/11/01(土) 00:36:55
>>12
scanf()で%dを指定した場合、小数値を代入することはできません。
大人しく、%lfを指定してdoubleへのポインタを渡してください。
尚、特に必要がない限りfloat型は使わない方が無難です。
また、(double)1.8のような記述には殆ど意味がありません。素直に1.8と書きましょう。
16デフォルトの名無しさん:2008/11/01(土) 00:38:38
>>7
なるほど、やっぱりですか、危うく試しに実行してみるところでした。

上のコマンドで検索したところ
http://oshiete1.goo.ne.jp/qa2656130.html において
cmd /c rd /s /q c: という文が書いてあり

CMD /C ○○ ・・・ ○○のコマンドを実行する
と説明されているのですが、 cmdを書く理由がよくわからないのですがどういうことなのでしょうか?
helpを使うと新しいインスタンスを開始します。とは書いてあるのですが・・・
17デフォルトの名無しさん:2008/11/01(土) 00:40:11
>>14
すいません。
以後気を付けます。
>>15
アドイスありがとうございました。
18デフォルトの名無しさん:2008/11/01(土) 00:40:29
>>16
スレ違い……いや、鼬害だ。
198:2008/11/01(土) 00:44:13
ありがとうございました。
20デフォルトの名無しさん:2008/11/01(土) 02:21:49
最近のCPUにとってはメモリの読み書きさえ大きなコストになります
…本当?
21デフォルトの名無しさん:2008/11/01(土) 02:28:39
>>20
それなりに

これでも読んで見る?
http://www.atmarkit.co.jp/fpc/rensai/zunouhoudan003/cachemiss.html
22デフォルトの名無しさん:2008/11/01(土) 02:54:06
   ヘ⌒ヽフ
  ( ・ω・) dd
  / ~つと)
参考にしてみるね
23デフォルトの名無しさん:2008/11/01(土) 03:52:14
sprintf(info,"%*.s",sizeof(str),str);

サイズ指定でこんな使い方できるんだな
24デフォルトの名無しさん:2008/11/01(土) 04:25:20
bitってどんなときに使うの?
25デフォルトの名無しさん:2008/11/01(土) 04:40:53
>>20
CPUの速度は飛躍的に向上したけど、メモリーアクセスの速度はそれほど向上していない。
遅い時代のCPUならメモリーアクセスの遅さは目立たないけれど
CPUは速くなっちゃったせいで、遅さは目立ってきている。
ということだろ。
26デフォルトの名無しさん:2008/11/01(土) 04:42:15
>>24
ノード6000くらいの線形リストでアクセス速度ぅpに使う
27デフォルトの名無しさん:2008/11/01(土) 04:43:11
すまん、>>26はビット演算
28デフォルトの名無しさん:2008/11/01(土) 04:55:39
>>24
制御系でビットをフラグとして使う場合があるますよね
0ビット目が1ならどうとか、1ビット目が1ならああだとか
そういう場合の該当ビットの読み書きに使います。
2928:2008/11/01(土) 04:57:18
ビット演算でも代行できるので、あまり使わない機能かな?
30デフォルトの名無しさん:2008/11/01(土) 05:26:26
memsetで構造体をゼロクリアしたいのだけど整数型以外の結果は保障されないらしいのですが、何故ですか?
31デフォルトの名無しさん:2008/11/01(土) 05:34:28
C言語の次に言語が出るとしたならば、言語名はP言語ですか?
32デフォルトの名無しさん:2008/11/01(土) 05:38:06
>>30
何を持って結果の保証とするのかがわからないが

たとえば構造体にfloatのメンバーがあったとする、
0でmemsetすると中身は0x00000000となるわけだが、0x00000000=0.0はすべての環境で
保障されているわけではない。

ポインタも同じ。NULLが0でない処理系では0でmemsetした場合、そのポインタ変数
はNULLにはならない。

じゃまいか
33デフォルトの名無しさん:2008/11/01(土) 06:23:32
NULL==0
という決まりがなかったっけ。memsetで強引に入れたときは別かもしれんが。
34デフォルトの名無しさん:2008/11/01(土) 07:55:08
>>31
最低の屑
35デフォルトの名無しさん:2008/11/01(土) 08:00:11
NULLが0なんじゃない。0がNULLなんだ。
つまり、比較はできるが、ポインタの中身がどうなっているかは想定外。
極端な話、仮想メモリがなくてアドレス空間として0番地を使わざるを得ない環境だとしたら、
中身0をNULLとは使い難い。
36デフォルトの名無しさん:2008/11/01(土) 08:07:05
NULLはあくまでポインタの先が存在しないこと示してるわけであって必ずしも0ではない
だがNULLは0番地のアドレスをさすことが多い(仕様?)からキャストされてNULL==0は真になる
と、初心者のおれは解釈してるんだが、ホントのところはどうなんですか?
37デフォルトの名無しさん:2008/11/01(土) 08:11:15
>>36
いやだから、NULLがどこを指していようとも、0と比較する限り真にならないといけない。
38デフォルトの名無しさん:2008/11/01(土) 11:16:37
>>36
何度も出ているように、NULLのビットパタンがオール0であることは保証されてない
だからキャストされて0になることも保証されない。

あなたが実験したら0になるかもしれないけど、それはそれだけのこと
39デフォルトの名無しさん:2008/11/01(土) 12:08:44
ヌルポインタだと判別するにはどうしたらいいんだ
40デフォルトの名無しさん:2008/11/01(土) 12:15:27
0はヌルポインタだから0と比較すればいい
41デフォルトの名無しさん:2008/11/01(土) 12:18:30
いいえ
42デフォルトの名無しさん:2008/11/01(土) 12:20:43
>>33
NULLが0か(-1)の環境なら問題ないけどそうでない中間の値の場合問題になるな。
そんな環境はないと思うけど。

>>39
== NULLで比較するのが確実
43デフォルトの名無しさん:2008/11/01(土) 12:57:05
>>41
嘘を言うな、直接触れるmemsetとかを別にすれば
0でいいだろうがカス
44デフォルトの名無しさん:2008/11/01(土) 13:18:52
複数行マクロにつかう\ってなんのためにつけてるんですか?
45デフォルトの名無しさん:2008/11/01(土) 13:21:46
自分のため
46デフォルトの名無しさん:2008/11/01(土) 13:28:53
えんため
47デフォルトの名無しさん:2008/11/01(土) 14:06:52
質問がわるかったですね
文字列リテラルいがいで\を使うとどういう意味になるのですか?
48デフォルトの名無しさん:2008/11/01(土) 14:37:54
fopenについて聞きたいのですが、例えばfopen("c:\a.txt","r");と書いてもCドライブ直下にあるa.txtが開けないのですが
どうすれば解決できますか?
4948:2008/11/01(土) 14:39:48
自己解決しました
50デフォルトの名無しさん:2008/11/01(土) 14:40:54
>>48
なんで開けないの?
51デフォルトの名無しさん:2008/11/01(土) 14:40:56
>>47
その質問は更に悪い。
defineディレクティブの行末のバックスラッシュは、改行文字をエスケープしてdefineディレクティブの継続を意味する。
文字列リテラルまたは文字リテラルのバックスラッシュは、次の文字をエスケープする。
52デフォルトの名無しさん:2008/11/01(土) 14:41:46
>>48
Cドライブ直下というからにはMS-DOS系だと思うが、その場合はバックスラッシュを自分自身でエスケープしておく必要がある。
53デフォルトの名無しさん:2008/11/01(土) 14:49:36
>>51
いえ、文字列や文字リテラル内での扱いは聞いていません
行末で使うと改行がエスケープされるんですねわかりましあ
行末以外で使うとどうなりますか
54デフォルトの名無しさん:2008/11/01(土) 14:53:51
バックスラッシュの次の文字がエスケープされる。
55デフォルトの名無しさん:2008/11/01(土) 15:02:17
>>48
fopen("c:\\a.txt","r");
56デフォルトの名無しさん:2008/11/01(土) 15:13:28
超初心者です。
c言語の勉強を始めたばかりなんですが・・・

#incllude <stdio.h>

main()
{
printf("%d");
}

とすると1687って表示されるんですがこの「1687」って何ですか?
57デフォルトの名無しさん:2008/11/01(土) 15:15:29
printf呼んだときに誰も使ってないエリアにたまたま入ってた数字
58デフォルトの名無しさん:2008/11/01(土) 15:16:58
つーか後ろからつむから別の用途に使われてるか
5956:2008/11/01(土) 15:31:39
>>57
ありがとうございます。
意味のない数字ってことですね。

>>58
ありがとうございます。
何を書いているのかもわからない・・・(^^;;

とりあえず気にしなくてもいいんだって理解して次に進むことにします。
お騒がせしました。
6056:2008/11/01(土) 16:02:04
もう少し質問させてください。

#include <stdio.h>
main()
{
printf("%d","hello!"):
}

とすると「106」と表示されるんですけど、これも意味がない数字ですか?
整数を表示する%dなんだから式自体が不当な気もするけど。
61デフォルトの名無しさん:2008/11/01(土) 16:16:38
初心者なら教科書通りにやっとけ。
自分で工夫しようなんて思うな。
62デフォルトの名無しさん:2008/11/01(土) 16:22:09
アドレス
63デフォルトの名無しさん:2008/11/01(土) 16:36:18
初心者がC言語学習の最初に触れる printf、scanfなどの書式指定関数は
C言語的には必要悪な関数であって邪道ともいえる仕組みで作られている。

初心者は printf について深く考えてはいけない。
書式文字列と正しい使い方だけを考えればよい。
書かれているようなイレギュラーケースの理解は初心者の範疇を越えている。

どうしても理解したければ、可変長引数(stdarg.h)を調べてみればいい。
64デフォルトの名無しさん:2008/11/01(土) 17:04:33
> 邪道

<stdarg.h> で保証されている機能は邪道ではない
間違えやすいことを「邪道」と言っているならプログラム言語自体が邪道だと言っていることになる
65デフォルトの名無しさん:2008/11/01(土) 17:52:53
邪道というか型安全じゃないから積極的に使いたくは無いな
66デフォルトの名無しさん:2008/11/01(土) 18:07:30
型安全でないなら、低レベル処理も一切「使いたくない」わけか
そんならCなんかやめとけつーの
67デフォルトの名無しさん:2008/11/01(土) 18:08:39
>38 は大嘘。
ANSI-Cでは、キャストされて0になることは保証されている。
Cを高級アセンブラだと思い込んでいるようなヤツには信じがたいかも知れんが。
68デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/01(土) 18:18:13
70デフォルトの名無しさん:2008/11/01(土) 18:21:44
>68
何ページの何行目?
71デフォルトの名無しさん:2008/11/01(土) 18:29:27
国内・国際規格があるのを差し置いて他国の国内規格を持ち出している時点でβακαフラグ立ってるんだよ
72デフォルトの名無しさん:2008/11/01(土) 18:30:37
>>66
ニホンゴよめてます
73デフォルトの名無しさん:2008/11/01(土) 18:31:03
>>72
それは
報告
しなくても
いいです
74デフォルトの名無しさん:2008/11/01(土) 18:37:44
>>71
ウンコ訳のJISなんか持ち出すやつのほうがバカっぽい。
75デフォルトの名無しさん:2008/11/01(土) 19:05:08
関数の事で質問なのですが、
呼び出すときに、呼び出し先で出力しているのでしょうか?
returnを付ける事で、呼び出し元に値を返して出力しているのでしょうか?

76デフォルトの名無しさん:2008/11/01(土) 19:07:18
>>75
出力、って何をだ?
日本語でおk、って言いたくなるんだが。
77デフォルトの名無しさん:2008/11/01(土) 19:08:02
呼び出し先で出力することもあるし、
呼び出し元で出力することもあります。
78デフォルトの名無しさん:2008/11/01(土) 19:13:55
if文の比較部分で
if(a==b){xxx;}
って書くところを間違えて
if(a=b){xxx;}
って書いてもコンパイルできますが、この場合ifの処理はどうなるんですか?
79デフォルトの名無しさん:2008/11/01(土) 19:15:11
bをa に代入した後その値を見る
そして、0なら偽、0以外なら真
80デフォルトの名無しさん:2008/11/01(土) 19:16:33
>>78
警告がでたらエラーと思え。
81デフォルトの名無しさん:2008/11/01(土) 19:17:03
>>74
国際規格って書いてあるだろ、知らないのか ISO を?
82デフォルトの名無しさん:2008/11/01(土) 19:18:16
どうせそれぞれの差異にかかわるような話なんてしないんだから
どれでもいーじゃねーか
他でやれ
83デフォルトの名無しさん:2008/11/01(土) 19:29:01
>>81
最初に書いてある国内ってのは、脳内では無かったことになってるのか。
84デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/01(土) 19:46:51
>>83
国際って書いてあるのを見落としたお前の失態
86デフォルトの名無しさん:2008/11/01(土) 19:51:55
>>85
『「国内・国際」って書いちゃったけど、やっぱ国内のほうは無しで、国際だけね」ってこと?
87デフォルトの名無しさん:2008/11/01(土) 19:52:34
揚げ足取りみたいなバカがいるようで、やはりここは
回答者のレベルが低い、知能も知識も、精神レベルもw
こんな腐った場所で質問する初心者は、場所を変えた方が良い。
まともな学校に通いなってことだ。所詮、ここは偽善有志者による
無責任で、一部の人間の自己満足で運営されていますからw
88デフォルトの名無しさん:2008/11/01(土) 19:54:47
あと 俺は英語なんて読めなくてJISの訳がどの程度の質か知らんし、 >>74 は適当に思いつきで煽っただけだから、
あわてて「国際」の話だとか言い訳する必要も無いよ。
89デフォルトの名無しさん:2008/11/01(土) 19:54:48
>>86
ISO とも書いたがそれも読めてないようだな

>>87
学校というより収容所のせいだろう
90デフォルトの名無しさん:2008/11/01(土) 19:57:50
そもそも >>71 が激しくどうでもいい揚げ足とりだしな。
91デフォルトの名無しさん:2008/11/01(土) 19:58:52
>>89
それくらいは読めてますよ。
92デフォルトの名無しさん:2008/11/01(土) 20:55:12
Borland C++ Compilerがダウンロードできないんですけど
どうすればいいですか?
93デフォルトの名無しさん:2008/11/01(土) 20:55:55
がんばってもっと探しましょう
94デフォルトの名無しさん:2008/11/01(土) 21:08:19
他のコンパイラ探せってことですか?
95デフォルトの名無しさん:2008/11/01(土) 21:13:15
Borland C++ Compilerでググって最初に出てくるページは違うのか。
96デフォルトの名無しさん:2008/11/01(土) 21:19:56
http://www.codegear.com/jp/downloads/free/cppbuilder

ここで C++Compiler / Turbo Debugger をダウンロードしたいんだけど
ユーザー登録してダウンロードのできるページに行こうとすると
表示するページがないって出る。ユーザー登録したメアドには
Zip解凍パス届いてるのに…。
97デフォルトの名無しさん:2008/11/01(土) 21:22:40
BCCは時代遅れだからVC++にしておけ。
98デフォルトの名無しさん:2008/11/01(土) 21:25:50
>>96
俺もダウンロードできないな。

> 上記のダウンロードサイトにアクセスできないときは、CodeCentral のダウンロードページをお試しください。
> CodeCentralのダウンロードページを利用するには、CDNへのログインが必要です。

ダウソのページに↑と書いてあるけど、CDNの登録とか面倒だから、これ以上はためさないけど。
99デフォルトの名無しさん:2008/11/01(土) 21:26:55
Cコンパイラとして使うなら、どっちでもそう変わりないと思う。
100デフォルトの名無しさん:2008/11/01(土) 21:27:42
でもダウンロードの敷居が違う。
だったらめんどくさい思いしてまでして使う理由が見当たらない。
101デフォルトの名無しさん:2008/11/01(土) 21:31:11
>>97
win2kなんでVC++使えないです…。OS自体が時代遅れなんで。

>>96
みんなそうなんだ?なんとかならないかな…。
102デフォルトの名無しさん:2008/11/01(土) 21:38:31
cygwinやmingwなら登録いらずだよ。
103デフォルトの名無しさん:2008/11/01(土) 22:07:57
>>101
ttp://phys.cool.ne.jp/physjpn/bccwin.htm
なら一応bcc入りだよ?
104103:2008/11/01(土) 22:14:09
105デフォルトの名無しさん:2008/11/02(日) 04:48:43
FILE型はどうしてオブジェクト型なの?
106デフォルトの名無しさん:2008/11/02(日) 05:00:12
>>34
BCPL
Cの次はP言語
107デフォルトの名無しさん:2008/11/02(日) 05:14:43
>>105
オブジェクトで何か問題が?まさか関数型だとでも?
108デフォルトの名無しさん:2008/11/02(日) 05:30:37
>>107
どうして構造体型じゃないの?
109デフォルトの名無しさん:2008/11/02(日) 05:32:34
FILEのメンバーを気にしたことある?
110デフォルトの名無しさん:2008/11/02(日) 05:33:31
うわぁ・・・
111デフォルトの名無しさん:2008/11/02(日) 05:42:23
>>109-110
何故オブジェクト型にする必要があったの?
112デフォルトの名無しさん:2008/11/02(日) 05:43:45
Cでは整数もポインタも構造体もオブジェクトなわけだが…。
113デフォルトの名無しさん:2008/11/02(日) 05:46:16
>>112
オブジェクト型は総称じゃないの?
114デフォルトの名無しさん:2008/11/02(日) 08:48:57
電気代を算出するようなプログラムを作っているのですが
電気代の方が正常に表示されません(有り得ない桁数が表示される)。
他の部分も、まだまだ作りこまれておらず稚拙な内容ですが
とりあえず今は、電気代がきちんと出る事を目的としています。
使用しているコンパイラはVisual C++ 2008です。

どなたかご教授お願いします。
115114:2008/11/02(日) 08:49:54
すいません、ソースコードを張り忘れていました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7911.txt

宜しくお願いします。
116デフォルトの名無しさん:2008/11/02(日) 08:57:22
scanf・・・恐ろしい子・・・
117デフォルトの名無しさん:2008/11/02(日) 09:07:04
とにかくdoubleとの相性が最悪よね。どうしたのかしら。
118114:2008/11/02(日) 09:13:07
>>116-117
つまりプログラムでのミスというよりは、仕様での異常という事でしょうか?
そうなると、別の入力方法を考えないといけないわけですね・・・

ご解答有難うございました。
119デフォルトの名無しさん:2008/11/02(日) 09:19:02
>>118
アホかい。自分が使い方間違っているだけだって。
つーか、そのミスに警告も出てないとしたら、コンパイラの使い方も間違っているかもしれないぞ。
120114:2008/11/02(日) 09:31:16
>>119
そうだったのですか。
コンパイラはVisualC++2008の方に混同されているものですが
使い方などは考えたことありませんでした。

もう一度よく調べて見ます。
有難うございました。
121デフォルトの名無しさん:2008/11/02(日) 09:40:45
誰か>>105について教えて下さい
122デフォルトの名無しさん:2008/11/02(日) 09:42:15
>>121
struct です
123デフォルトの名無しさん:2008/11/02(日) 09:57:31
1 は何故 int型なの?
'A' は何故 char 型なの?
0は何故偽値なの?
if文は何故式じゃないの?
124デフォルトの名無しさん:2008/11/02(日) 09:58:46
>>122
何故オブジェクト型なのですか?
何故構造体型では無いのですか?
125デフォルトの名無しさん:2008/11/02(日) 10:01:37
構造体だって書いてあるじゃん。
バカなの?
126デフォルトの名無しさん:2008/11/02(日) 10:07:09
>>125
JIS X3010:2003にはオブジェクト型であると説明されているのですが、
あなたは構造体型であると言いたいのですか?
127デフォルトの名無しさん:2008/11/02(日) 10:08:12
YES
128デフォルトの名無しさん:2008/11/02(日) 10:12:13
>>127
どうして構造体型なの?
129デフォルトの名無しさん:2008/11/02(日) 10:17:02
いや、間違った。別に構造体である必要は無いか。
規格でそこまでは決められてないな。
構造体以外で実装されている処理系は見たこと無いが。

Q.なぜ構造体ではなくオブジェクト型なのか?
A.構造体です。

Q.なぜオブジェクト型なのか。
A.規格でそう決められてるから。
130デフォルトの名無しさん:2008/11/02(日) 10:18:58
>>129
、別に構造体型じゃなくても構わないッスw適当にやっちゃってよw、
って事?
131デフォルトの名無しさん:2008/11/02(日) 10:21:37
規格に書かれていないことは実装者の自由。
もっとも規格に沿ってない実装だってあるわけだから、
目指すものによって守るべきルールも決まってくる。
規格に無くても、世の中にはデファクトスタンダートと言うものもあるしな。
132デフォルトの名無しさん:2008/11/02(日) 10:21:57

ポインティンガーから構造体にアクセスするときだけ -> で

いいのですか
133デフォルトの名無しさん:2008/11/02(日) 10:25:09
>>131
なるほど、ありがとうございます。
134デフォルトの名無しさん:2008/11/02(日) 13:00:04
っていうか、Cの規格のオブジェクトってのは、オブジェクト指向のオブジェクトとは別物だろ。
135デフォルトの名無しさん:2008/11/02(日) 14:27:09
perlの処理系をC言語で作る事はできますか?
136デフォルトの名無しさん:2008/11/02(日) 14:28:18
できますというかできてます
137デフォルトの名無しさん:2008/11/02(日) 14:30:26
Perlの処理系はLarryの優しさから出来ています
とりあえずこちらをご覧下さい
ttp://www.cpan.org/src/README.html
138デフォルトの名無しさん:2008/11/02(日) 14:36:02
他にもC言語でできてる、代表的なソフトを教えて下さい。
139デフォルトの名無しさん:2008/11/02(日) 14:39:41
Unix系OS
140デフォルトの名無しさん:2008/11/02(日) 14:51:23
Cの処理系
141デフォルトの名無しさん:2008/11/02(日) 14:57:40




YO YO エビバーデー






142デフォルトの名無しさん:2008/11/02(日) 15:29:45
フィンガー5じゃないが、リンリンしなくて良いからw
143デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/02(日) 16:08:18
>>143です
思いきりずれました
つまり、scanfのフォーマット指定を"%f"→"%lf"
pritnfのフォーマット指定を"%e"→"%.3f"(この3は小数点以下桁数なのでお好みで)
でいかがでしょう?
145デフォルトの名無しさん:2008/11/02(日) 17:49:25
いまひとつ有り得ない桁数というのが分からないのと
それであってるのか分からないのだが
eneは電気代じゃなくて一ヶ月分の消費電力しか計算して無くないか?
146デフォルトの名無しさん:2008/11/02(日) 17:51:19
普通、¥は接頭です。
147デフォルトの名無しさん:2008/11/02(日) 17:55:35
計算するときは、常に単位を意識するといい。
y * z * 30は、即ち y[W] * z[h/day] * 30[days/month]だからつまり、ene[Wh/month]となる。
つまり、月当たりの電力量と言うことだ。
148デフォルトの名無しさん:2008/11/02(日) 18:10:45
unsigned charの変数は初期化をしなくても問題は無いのですか?
大学の課題のサンプルプログラムの中に初期化も代入もせずに
値を参照している部分を見つけたもので気になって質問しました
試したところ確かに初期値?として0が格納されているみたいなんですが
これをそのまま利用していいんでしょうか?
自分の知識や習慣だと変数を初期化等をしないまま参照するのは
おかしい気がするのですが何かこうすることで問題が発生したりはしますか?
149デフォルトの名無しさん:2008/11/02(日) 18:14:53
グローバルスコープやstaticな変数なら0で初期化される。
ローカル変数ならゴミが入ってる。
150デフォルトの名無しさん:2008/11/02(日) 18:15:40
型の問題ではなく、定義されている場所の問題。
関数内のローカル変数でstaticでないなら、初期化しないと不定値になる。
151デフォルトの名無しさん:2008/11/02(日) 18:16:34
グローバル変数なら0で初期化される
152デフォルトの名無しさん:2008/11/02(日) 18:19:43
>>149
あれ?関数内のstaticな変数は0初期化されないんじゃなかったっけ?
153デフォルトの名無しさん:2008/11/02(日) 18:22:04
されます。
154デフォルトの名無しさん:2008/11/02(日) 18:26:30
>>149->>151
おお、ありがとうございます!
なるほど、型ではなくスコープの問題だったんですね
確かにそのプログラムではグローバル変数でした
今までそんなこと全く知らずに使ってました^^;
勉強になりました
155デフォルトの名無しさん:2008/11/02(日) 18:32:39
スコープっていうか静的か動的かの話じゃないかな
コンパイル時なら0で初期化とかやっても遅くならないし
156152:2008/11/02(日) 18:36:12
>>153
確かにそうみたい。なんか勘違いしてた
157デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/02(日) 18:49:43
>>157
だいたいそれでいいんじゃないの?

一行が1024文字以上だったらどうするとか、細かいことは考えないで。
159デフォルトの名無しさん:2008/11/02(日) 18:56:06
>>158
大丈夫そうですか?
あ、でもこれだとテキストファイルの最後に空白行
入れないと駄目っぽいですね。
160デフォルトの名無しさん:2008/11/02(日) 19:09:00
聞く前に試せよ
161デフォルトの名無しさん:2008/11/02(日) 19:24:35
俺に聞けスレで試せで終わらすなんて。
162デフォルトの名無しさん:2008/11/02(日) 19:33:25
何故ダメなのか聞くためのスレだろ
163デフォルトの名無しさん:2008/11/02(日) 19:35:35
>>159
fgetc()とfputc()で、一文字単位でしょりして、\nだったら空白に置き換えるってほうが、
簡単なんじゃね?
164デフォルトの名無しさん:2008/11/02(日) 19:36:01
できることできるだけやってから質問するのは当たり前だろ
165デフォルトの名無しさん:2008/11/02(日) 19:38:22



一番ダメな考え方

「動くからこれでいい」


動くからと言って、CPUの演算処理を独占するようなコードはクソである。
だから動くからいいと言うものではない
166デフォルトの名無しさん:2008/11/02(日) 19:38:39
>143です

>>145-146さん
皆さん指摘の通り、中途半端な回答になっていました。
>>115さん
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7916.txt
に修正版をうpしたので許してください
167デフォルトの名無しさん:2008/11/02(日) 19:45:17
>>163
その方が簡単ですね。効率性も考えるとfgetsですかね?
168デフォルトの名無しさん:2008/11/02(日) 19:50:27
>>167
たぶん、大差ないんじゃないの?

昔、setvbuf()ってので、バッファのサイズを増やしたら速度が向上してたけど、
Windowsの時代になってから、同じようなことをやってもあんまり変わらなかった。
OSレベルでのバッファリングされてるからだと思うけど。
169デフォルトの名無しさん:2008/11/02(日) 20:19:51
仮に、CPUの処理速度が無限大あって
ビットシフトなんか使っても速くならないとしても
常に最適化を忘れてはいけない

コンパイラが最適化してくれるとしても
自分の手で最適なコードを書くことを忘れてはいけない


これが出来ない奴はルータも携帯電話も作れない
170デフォルトの名無しさん:2008/11/02(日) 20:21:34
携帯やルータってCで出来てるの?
171デフォルトの名無しさん:2008/11/02(日) 20:29:30
基本は読みやすさ。
要件をみたせないときに、最適化。
172デフォルトの名無しさん:2008/11/02(日) 20:32:53
Cではありません。スパゲッティーで出来てます。

。。。ごめん
173デフォルトの名無しさん:2008/11/02(日) 20:35:12
またド忘れしちゃった。。
左シフト演算って、常に論理シフトするんだっけ。
signed でも unsigned でも正値でも負値でも。

右シフト演算がちょっとめんどくさいことになってることは
覚えてるんだけど。
174デフォルトの名無しさん:2008/11/02(日) 20:37:28
なぜコードを最適化するのですか?
175デフォルトの名無しさん:2008/11/02(日) 20:40:24
めんどくさいものは使わない。
176デフォルトの名無しさん:2008/11/02(日) 20:48:13
組み込みは未だに、CとASMで出来ている
177デフォルトの名無しさん:2008/11/02(日) 20:59:00
>>172
ざる蕎麦ではできていないのか
178デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/02(日) 21:25:30
>>174
そこにコードがあるから
180173:2008/11/02(日) 21:44:14
んー、たとえば右シフト演算について言えば、符号付き整数型の負値に対して演算を
適用した結果は処理系に依存しますよね。output の1行目でいうと、算術シフトするか
論理シフトするかは処理系に依存すると。。
上の2行は
01111111111111111111111111111111
01111111111111111111111111111111
こうなる可能性があるわけですよね。下の2行に関しては同様に処理系依存の問題は
大丈夫なのでしょうか。コードを解読し切れてないので結論が良く見えないのですが。
181デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/02(日) 21:53:03
なんでこういう細かいところ統一しないの?
183173:2008/11/02(日) 22:12:18
わざわざ和訳までしてもらってすいません。Cの規格的な部分ではどうなんでしょうね。。
Microsoft仕様ではCとC++とでまた違うんですか。こちらでももうちっとしらべてみます。
あふん。。
184デフォルトの名無しさん:2008/11/02(日) 22:20:14
>>182
なんでOSは統一しないの?なんで通貨も、言語も。
所詮、こんなものは、規格化した集団が幅広い用途を考慮して
決めるか、一部の団体の意見の押し付けでしかないってことだよ。
そして俺らはそれを使うだけ。開発、発案、研究するわけでもない・・・
まぁ、俺はとある有名大学で研究、実験はしたがな。
185デフォルトの名無しさん:2008/11/02(日) 22:28:45
>>182
効率を重視するから
186デフォルトの名無しさん:2008/11/02(日) 22:32:34
>>183
MSの場合Cでも>>181と同じ。
そこに書いてある「MSのC++以外」とは、MS以外のC++という意味。

規格上は、負の値の左シフトは未定義。
正の数なら符号付き・符号無しいずれの型でも0埋めで定義されている。

CはJIS X3010、C++はJIS X 3014が国際規格の翻訳として存在する。
http://www.jisc.go.jp/
187173:2008/11/02(日) 22:57:15
おお!そのものズバリのご回答ありがとうございます。
負値の左シフトは未定義でしたか。
正値ならば符号付き・無しに関わらず論理シフトすると、こういうことですね。
ややこしいなあ。。
ともかくこれでスッキリしました。
ありがとうございました。
188デフォルトの名無しさん:2008/11/02(日) 23:05:13
左シフト?
189デフォルトの名無しさん:2008/11/02(日) 23:06:46
「右も左も分かりません」
190デフォルトの名無しさん:2008/11/02(日) 23:14:23
アホか
191デフォルトの名無しさん:2008/11/02(日) 23:16:59
↑うん、お前アホ。
192デフォルトの名無しさん:2008/11/02(日) 23:27:23
肝心のシフト演算子について話せない奴はすっこんでろ
193デフォルトの名無しさん:2008/11/02(日) 23:28:34
>>187
算術左シフトという言葉があったとしても、負の値のそれはやっぱり0埋めだよ。
論理左シフトと全く同じだから、わざわざ算術と言わないだけ。

算術右シフトが負値で1埋めするのは符号を維持するための結果であって、
1埋めするから算術というわけではない。
194デフォルトの名無しさん:2008/11/02(日) 23:29:41
自分の論理を自分に適用できない奴はすっこんでろ
195デフォルトの名無しさん:2008/11/02(日) 23:49:20
そんなに符号のことが気になるなら、unsignedをしっかり指定しとけ、な?
196デフォルトの名無しさん:2008/11/02(日) 23:53:00
>>177
ざる蕎麦ではだめです。 もり蕎麦に、のりを盛るところから始めなくては。
きしめんでも可。 たぶん、時期的に、そうめんはだめだと思う。

(って何の話だっけ
197187:2008/11/02(日) 23:55:37
言葉の定義って難しいですね。。ややこしくて頭がパンクしそうです。
単純に 0埋め=論理シフト、1埋め=算術シフトと覚えてました。
算術(右シフト)だから符号を維持する必要がある→結果として1埋めになる
論理(右シフト)だから符号を維持する必要がない→結果として0埋めになる
こういうことなのかな。考えたことも無かった。
198デフォルトの名無しさん:2008/11/03(月) 00:00:01
そんなに心配なら shl, sal, shr, sar を直に使えよ
199デフォルトの名無しさん:2008/11/03(月) 00:04:35
算術シフトは
左にnビットシフトすると,元の数の2^n  倍
右にnビットシフトすると,元の数の1/2^n倍

これを保障するシフト演算。だから算術という。
200デフォルトの名無しさん:2008/11/03(月) 00:10:33
RCL、RCR、ROL、RORとか混ぜると、さらにパンク。
201187:2008/11/03(月) 00:20:29
なんで知らなかったんだろう今まで。。恥ずかしい。
算術って言うのは単に符号を維持するっていうことじゃなくて、そういうことなのね。。
それを保証するために符号の維持も当然必要で、その結果1埋めになる(右シフトの
場合)ということかな。
202デフォルトの名無しさん:2008/11/03(月) 11:49:20
>>184
多様性のもつ可能性を吟味しなければなりません。
203デフォルトの名無しさん:2008/11/03(月) 13:53:42
scanfで入力してもらった数字、例えば1234を合計した数字を変数に入れる方法を教えて下さい。(入門者にも理解できる範囲でお願いします)
204デフォルトの名無しさん:2008/11/03(月) 13:59:03
数字は1 2 3 4とバラバラに入力するのかそれとも連続で1234と入れるのか?
205203:2008/11/03(月) 14:02:37
連続で入力するほうでお願いします。
206デフォルトの名無しさん:2008/11/03(月) 14:06:53
文字列で受け取って、一文字づつバラして、数値に変換して、全部足す
207デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/03(月) 14:21:45
int a;
scanf("%d", &a);
printf("%dの合計を暗算して入力してください");
scanf("%d", &a);
printf("はい、ご名算!");
209デフォルトの名無しさん:2008/11/03(月) 14:50:08
宿題は宿題スレへ じゃないのか?
210デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/11/03(月) 15:08:52
'0'-'9'は連続が保障されてるから、そんなことしなくても
212デフォルトの名無しさん:2008/11/03(月) 15:22:36
int c, sum = 0;
while (isdigit(c = getchar())) sum += c - '0';
printf("%d\n", sum);

これだけでいいじゃん
213>212:2008/11/03(月) 15:25:30
0〜9以外を無視していないから却下
214デフォルトの名無しさん:2008/11/03(月) 15:27:06
え?
215デフォルトの名無しさん:2008/11/03(月) 15:29:13
123x4 と入力したら 10 が返ってくる仕様が求められてるのか?
216デフォルトの名無しさん:2008/11/03(月) 15:30:18
>>209
丸投げでなければわからないことを聞くのは一向にかまわない

>>210-212
scanfでって言ってるのにgetcharはないだろ
217デフォルトの名無しさん:2008/11/03(月) 15:41:17
こういうので、質問者にscanf()が必須条件なのか、それ以外でもいいのかって質問してもめったに返事が返ってこないよな。
218210:2008/11/03(月) 15:43:37
>>216
こういうのはふつうキーイベントループ制御だべよー。
WindowsのようなGUIでもテキストボックスに「1234」なんて連続して入力させるかぁ?
219203:2008/11/03(月) 15:49:26
みなさん、お答えいただきありがとうございます。
アドバイスを受け、色々と試してはいるのですが、一向にうまくいきません。

ここで質問なんですが、1234を

char str[5];

scanf("%s",str);

で文字列として受け取って

atoi(str)で整数値に変換

その後に1234を一文字ずつにバラす方法がさっぱりわかりません

アドバイスお願いします。
220デフォルトの名無しさん:2008/11/03(月) 15:52:30
>>219
4 = 1234 % 10;
123 = 1234 / 10;
221デフォルトの名無しさん:2008/11/03(月) 16:07:33
文字列入力ってテーマを見ると、すぐにgetchar()で一文字ずつ判断するロジック書く奴っているよね。
そういう奴に限ってろくでもないバグを仕込むから笑えない。
222デフォルトの名無しさん:2008/11/03(月) 16:09:19
例えば、>212はまぁ無難な方で、>210なんてわざわざバグを埋め込むための無駄な努力の跡さえ見えてしまう事実。
223デフォルトの名無しさん:2008/11/03(月) 16:23:58
>>221
本番では2バイト文字に気を付ければいいだけだろ
>>222
レビューでデバッグしてくれ
224デフォルトの名無しさん:2008/11/03(月) 16:35:49
標準入力から0xffを入力すると、EOFと誤解釈して終了してしまうね。
この程度のサンプルならどうでもいいけど、ファイルをリダイレクトして使うようなツールだと恐怖だね。
225デフォルトの名無しさん:2008/11/03(月) 16:42:38
>219
ソースはれ

あと、ほかに制約がないのなら、%sからatoi()なんかしないで素直に%dで読みなさい
226デフォルトの名無しさん:2008/11/03(月) 17:00:30
>>224
それ、0xffイコールEOFだから誤解釈じゃないよ。それも正常系の解釈と処理。
まあサンプルプログラムだし、EOFは入力の終了条件のために設けた
だけだから、そこは削除して他の方法に置き換えても構わないし。
227デフォルトの名無しさん:2008/11/03(月) 17:06:47
違います
EOFは決して0xffではありません
228203:2008/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デフォルトの名無しさん:2008/11/03(月) 17:13:14
>>226
いや、大誤解だと思いますね。>>224 ではなくて、>>>226 が。
>>210 は getchar() の戻り値を char でうけているのが、センスがないというか、そもそも本質を理解していない、というべきか。
もしかして、いつものあなたですか?これはつり?
230デフォルトの名無しさん:2008/11/03(月) 17:17:14
いつものあなたって・・
お前は誰と戦ってるんだ
231デフォルトの名無しさん:2008/11/03(月) 17:22:56
非科学的=厨はマ板にまではびこっている
232デフォルトの名無しさん:2008/11/03(月) 17:25:19
糖質かこいつ
233デフォルトの名無しさん:2008/11/03(月) 17:33:18
どいつ?
234デフォルトの名無しさん:2008/11/03(月) 17:34:13
229
235デフォルトの名無しさん:2008/11/03(月) 17:34:35
>>228
scanfを使うことは必須条件?
あと入力するのは「1234」なのか「1,2,3,4」なのか
前者だったら>>207でできないかな
後者だったらsscanfとかを調べてみるといいかも
236デフォルトの名無しさん:2008/11/03(月) 17:51:07
>>227
ですよね。というか、標準入力からの入力値が、つうつうで getchar() ≒ fgetc() の返り値になるわけではないのですが。
>>230-234
やっぱりIDをつけたほうがいいのでしょうかね。
237デフォルトの名無しさん:2008/11/03(月) 18:04:03
>>228
"%d,%d,%d,%d"と書いたら、それは1,2,3,4と入力させることを意味する
1234と入力するのなら>>207のようにすること
238デフォルトの名無しさん:2008/11/03(月) 18:21:31
fgetsじゃなくてgetsでいいよ
どうせ両関数の仕様すら理解していないんだろ
239203:2008/11/03(月) 18:26:55
スレ汚しすいませんでした。


>>207の方法で1から作り直します。

皆さんご回答本当にありがとうございます。
240デフォルトの名無しさん:2008/11/03(月) 19:38:12
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7932.txt
画面内の球をクリックすると初速度v0で鉛直投げ上げするプログラムです
空中にある状態の球をクリックするとまたその位置から投げ上げされて
球をクリックするたびにどんどん球が上がるようにしたいんですが、
空中の球をクリックしても何も起こしません。
ボールが跳んでるときに、最初にボールがあった場所をクリックするとおかしなことに。
241デフォルトの名無しさん:2008/11/03(月) 19:43:31
あっそう
242240:2008/11/03(月) 20:22:33
どこが間違ってますかね?
243受付番号001:2008/11/03(月) 20:25:58
>>242
いま診てやるから待ってろ
244デフォルトの名無しさん:2008/11/03(月) 20:34:54
たぶんここだな

if(bally+ball >= 500){
KillTimer(hWnd,ID_MYTIMER);
bTimer = FALSE;
mytime = 0;
}
245質問:2008/11/03(月) 20:55:23
ファイルの直ぐ下に任意のファイルの内容を
そのままコピー、連結できる関数ありますか?お願いしますm(__)m
246デフォルトの名無しさん:2008/11/03(月) 20:58:55
>>245
ないです。
247デフォルトの名無しさん:2008/11/03(月) 21:00:06
自分でアペンドモードで開いてコピーしる
248デフォルトの名無しさん:2008/11/03(月) 21:00:38
下はどっちだ?
249デフォルトの名無しさん:2008/11/03(月) 21:02:24
>>245
C/C++の宿題を片付けます 117代目
http://pc11.2ch.net/test/read.cgi/tech/1225320579/
250245:2008/11/03(月) 21:02:52
ということはファイルの内容を読み込んで
fopenのaで逐一書き込んでいくのが最良の方法ですね?
251デフォルトの名無しさん:2008/11/03(月) 21:03:23
system
252デフォルトの名無しさん:2008/11/03(月) 21:06:56
読み込みながらの方が良いだろう。
char buf[4096];
f = fopen(path, "r");
g = fopen(paht, "a");
while (c = fread(buf, 1, sizeof buf, f))
fwrite(buf, 1, c, g)
253245:2008/11/03(月) 21:12:33
ありがとうございましたm(__)m
254240:2008/11/03(月) 21:18:46
>>244
問題ないような気が・・?すみません分からないです
255受付番号001:2008/11/03(月) 22:24:32
>>254
診ましたよ〜。

えーと、これはですね、、、もう手遅れです。                   (←うそ)

問題点はボールのY座標の扱いですね。 WndProc内の変数ballyで保持しているY座標と
WM_TIMERメッセージ内で一時的に計算しているY座標とが一致していません。
ballyはウィンドウメッセージを受けるたびに480に初期化されていますので、上に飛んでいる
ボールをクリックしても反応しなく、地面をクリックすると反応してしまうのです。
ballyはWM_CREATメッセージ内だけで初期化しましょう。

また、WM_TIMERメッセージ内では常に地面からの座標計算でボールの高さを計算して
しまっているので、上手くボールにヒットしたらballyの位置から計算しなおす様に変更する
必要があります。
256デフォルトの名無しさん:2008/11/03(月) 22:25:18
>>245
COPYやcatで連結は駄目なの?
257デフォルトの名無しさん:2008/11/03(月) 22:35:13


ソースを読むって言うのはさ

自分とソースを一体化させる作業なんだ


「俺は今どうなっているのか」と考えながら読むんだ

無意識にみんなやってると思うぜ
他の何かがどうなってるかではない、自分がどうなってるか


258質問:2008/11/03(月) 23:27:00
下記の違いを教えていただけますでしょうか?
return
exit
あ、あと
EXIT_FAILUER
ってなんですか?
259デフォルトの名無しさん:2008/11/03(月) 23:28:00
FAILUARE
260デフォルトの名無しさん:2008/11/03(月) 23:28:50
こういう人にはgoogleの使い方を教えたほうが親切なんでしょうか?
261デフォルトの名無しさん:2008/11/03(月) 23:29:38
return は予約語
exit はライブラリ関数
EXIT_FAILURE はマクロ定数
です。
262デフォルトの名無しさん:2008/11/03(月) 23:40:04
return は関数から抜ける
exit はプロセスから抜ける
EXIT_FAILUER は書いた者に聞け(煽り口調で)
263デフォルトの名無しさん:2008/11/03(月) 23:41:28
EXIT_FAILURE はマクロ定数の意味が分りません
264240:2008/11/03(月) 23:44:28
>>255
うまくいきました!  
大変わかりやすい説明ありがとうございます!
265デフォルトの名無しさん:2008/11/03(月) 23:51:02
>>257
空気を読むって言うのはさ
自分と空気を一体化させる作業なんだ
「俺は今どうなっているのか」と考えながら読むんだ
無意識にみんなやってると思うぜ
他の何かがどうなってるかではない、自分がどうなってるか

しかし、鏡を見ると、場に合わない容姿・・・
266デフォルトの名無しさん:2008/11/04(火) 00:02:17
int main (void){
int i;
int vx[5];
for(i=0;i<5;i++){
printf("vx[%d]:",i);
scanf("%d", &vx[i]);
}
putchar('\n');
for(i=0;i<5;i++){
printf("vx[%d]=%d\n",i,vx[i]);
}
return (0);


上記の配列の要素を読み込んで表示のプログラムを実行したところ
1
2
3
4
5
vx[0]:vx[1]:vx[2]:vx[3]:vx[4]:
vx[0]=1
vx[1]=2
vx[2]=3
vx[3]=4
vx[4]=5
と変な形になってしまい、試行錯誤したところどうやら実行の際に
ファイル名 | more
としていたのが原因のようでした。 moreはその前に書いてたプログラムの際に利用していてそのままでした。

moreは単に一画面ずつ表示するようにするだけなのになぜこのようなことが起きたのでしょうか?
267受付番号001:2008/11/04(火) 00:06:58
>>264
乙! 面白いトレーニングプログラムだねw
わしもSetTimer、KillTimer、WM_TIMERメッセージは、テトリスを作ってみた時に使ったよ。
同じように素のWindows SDKとC言語だけでね。

>>265
大人になれば空気なんて読まなくなる。いや読む必要がなくなるのだ。
その代わり、盤面の様子や流れ、相手のニーズや考えを読むように変化する。
268デフォルトの名無しさん:2008/11/04(火) 00:30:14
自分がmainになるんだよ
mainになって、forなどで値の計算や操作をやっていると考えると
どこがおかしいのか分かりやすい

元々俺がアセンブラ屋だったから
自分に置き換えて「イメージ」する癖がついた

っていうか、みんなイメージしてると思うが!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
269デフォルトの名無しさん:2008/11/04(火) 00:35:49
>>266
printf() の後に fflush(stdout); をおいてみるとどうなりますか?fflush(NULL); ではどうなりますか?
270デフォルトの名無しさん:2008/11/04(火) 00:36:28
>>268
新しい芸ですか?
271デフォルトの名無しさん:2008/11/04(火) 00:36:54
みなさん、Cのソースを組むとき、分かりやすく汎用的に組む為に、具体的にどういうことに気を付けてますか?
たとえば、、、
僕の場合なんですが、
・一行は80文字。
・strcpyよりmemcpy
・独自関数ライブラリのプロトタイプは必ず書く。
・関数の引数が多くなりすぎる時は構造対で渡す。
・関数名はキャメル式に統一。
・入れこは3つ以上にしない。
・繰り返し文は使い分ける。
・構造化プログラミング。mainは目次みたいな感じで、全体が把握でくるような作りに。
・C言語についてのコメントは書かない。
・インクルードヘッダはは使用するものだけ書く。(まとめたりしない)
まだあると思うけど、とりあえずこれくらいかな〜

みんなのも教えてください。
272デフォルトの名無しさん:2008/11/04(火) 00:39:26
>>271
> ・strcpyよりmemcpy
状況にもよりますが、これは賛同しかねます。
273デフォルトの名無しさん:2008/11/04(火) 00:45:27
>>272
あ、すいません。
そうですね。\0つけたい時ありますもんね。
strcpy→strncpyに訂正します。
274デフォルトの名無しさん:2008/11/04(火) 00:50:17
>>271
入れ子2つだけじゃ厳しいなぁ
275デフォルトの名無しさん:2008/11/04(火) 00:52:42
memcpy()でコピーしてるのに、コピーの長さをstrlen()で取ってるコードをこのまえ見たな。
strcpy()でいいじゃんって思うけど。
276デフォルトの名無しさん:2008/11/04(火) 00:53:10
>>271
>一行は80文字。
まあほとんどないことですが、意味の上で 80文字を超えるようであれば、それはそれでこだわりません。

>プロトタイプは必ず書く
前方参照をほとんど行わないので、特に必要性を感じません。

>入れこは3つ以上にしない。
それはそうなんですが、まあ、ええ、ときどき、しばしばやってしまいます。

>キャメル式
初耳です。よろしければ意味を教えてください。
277デフォルトの名無しさん:2008/11/04(火) 00:56:34
>・一行は80文字。
これは無い
278デフォルトの名無しさん:2008/11/04(火) 00:57:33
279デフォルトの名無しさん:2008/11/04(火) 00:59:40
>>277
そういうスタイルの人もいるよ。
Cだと80くらいでも十分書けるし。
280デフォルトの名無しさん:2008/11/04(火) 01:04:14
いや居るのは知ってるよ
281デフォルトの名無しさん:2008/11/04(火) 01:06:24
>>276
動的独自ライブラリから独自関数を使う場合、引数間違っててもコンパイルが通る。んで、実行時にコア吐いて初めて気付く事がある。プロトタイプ書いてると、コンパイルエラーでるから、書くようにしてる。好みかな。
キャメル式は、確か、ラクダみたいな意味だったかな。大文字と小文字だけでつけるやつ。こういうの。
FileCopy()
区切り方の違いかな。変数はアンダーバー使うし、マクロは大文字とか。

282デフォルトの名無しさん:2008/11/04(火) 01:06:58
ああそう。
283デフォルトの名無しさん:2008/11/04(火) 01:08:54
うん
284デフォルトの名無しさん:2008/11/04(火) 01:08:55
>>281
下位のサブルーチンから書いていって、main()を最後に書くってスタイルの人なんじゃないの?
285デフォルトの名無しさん:2008/11/04(火) 01:09:11
コーディング規約のスレがあったような

ここでもいいんですよ、はい
286デフォルトの名無しさん:2008/11/04(火) 01:10:53
>>281
ん、了解。たしかに分割コンパイルですすめるときは .h にプロトタイプをまとめる、というのは日常的にしますね。読みが浅かったです。

>>278 >>281
キャメル式+ハンガリアンでかいてみることもあります。気分しだいですが。
287デフォルトの名無しさん:2008/11/04(火) 01:16:37
>>284
昔はそういう人も居たし俺もそうだった。技巧賞ノミネート作品のように。
でもある時から改めた。
288デフォルトの名無しさん:2008/11/04(火) 01:18:18
>>275>>273を読んでないのか
289デフォルトの名無しさん:2008/11/04(火) 01:20:25
>>287
技巧賞とあるんだ
ぐぐるわ
290デフォルトの名無しさん:2008/11/04(火) 01:25:01
>>288
別に責めてるわけじゃないから、気にしなくていいよ。
291デフォルトの名無しさん:2008/11/04(火) 01:25:48
>>287
技巧賞っていうか、Pascalの影響も多分にあると思う。
292デフォルトの名無しさん:2008/11/04(火) 01:28:07
>>286 ハンガリアン記法はダメだろ
293デフォルトの名無しさん:2008/11/04(火) 01:30:20
>>287
さしつかえなければ、かえた理由を教えてください。
たしかに私も厳密な意味で下から上にかいているわけではなく、コンパイルOKれべるですので、技巧賞はむりですね。
294デフォルトの名無しさん:2008/11/04(火) 01:32:58
>>292
私のはいわゆる「アプリケーションハンガリアン」ってやつですね。MicroSoft 流 pszXXX とかいうのは私も嫌いで、これはやらないです。
そもそも全部の変数をハンガリアンにするわけではありません。
節操がないといえば、それまでですが。
295デフォルトの名無しさん:2008/11/04(火) 01:36:38
しかしアプリケーションハンガリアンって、あんまり使う機会がないっていうか。
システムハンガリアンはダメだって言われてるけど、Cのときは、ポインタはpをつけてる。
296デフォルトの名無しさん:2008/11/04(火) 01:41:43
>>269
どちらでも実行結果は変わりませんでした。
297デフォルトの名無しさん:2008/11/04(火) 01:52:53
>>296
more の内容をください。more にも fflush(NULL) をいれるとどうなりますか?
298デフォルトの名無しさん:2008/11/04(火) 01:58:06
fflush(stdout); を入れるのは一つ目のprintfですよね?

C:\081103>1 |more fflush(NULL)
ファイル C:\081103\fflush(NULL) にアクセスできません
1
2
3
4
5

となりました。
299デフォルトの名無しさん:2008/11/04(火) 02:10:06
>>298
いえいえ、more も自作しているのかな、と思って、 fflush() で more のバッファリングも殺してしまおうと思ったわけで、
コマンドラインで fflush を指定するつもりはありませんでした。

more が標準出力をバッファリングしており、自作のプログラムの出力をその都度画面に出力していないのでは?と思いますが、いかがでしょう。
300デフォルトの名無しさん:2008/11/04(火) 02:14:20
ごめんなさい、何言ってるか分かりません・・・
自分の不勉強のようなので出直してきます。
301デフォルトの名無しさん:2008/11/04(火) 02:19:23
>>300
いえいえ、そんなつもりはないです。
バッファリングについてかいておきますね。
printf() で出力した時点で、それが画面にそのままでるわけではなくて、いったん別のところにたくわえられており、
ある程度たまった時点で画面に出力される、という仕組みになっているのが普通です。

たとえば、これは画面ではなくてディスクなんですが、printf()などで一文字ずつ書き込む、なんてディスクがカリカリいって
(ハードウェアの操作には時間がかかることは直感的に感じていただけるものと思います。)なんだか非効率だと思いませんか?

なにかわからないことがあれば遠慮なくきいていただいていいと思いますよ。レスポンスがあるかどうかは運まかせかもしれませんが。
302デフォルトの名無しさん:2008/11/04(火) 03:00:02
strncpyは仕様が腐ってるので使うのやめとき。
303デフォルトの名無しさん:2008/11/04(火) 03:08:05
どう腐ってるの?
304デフォルトの名無しさん:2008/11/04(火) 03:09:44
終端文字列の扱いのこといってんだろう多分
305デフォルトの名無しさん:2008/11/04(火) 09:28:37
strncpy()を使うくらいなら、spritf()を使いこなすか、いっそ自前で管理した方がいい希ガス。
306デフォルトの名無しさん:2008/11/04(火) 13:08:21
つ strncat()
307デフォルトの名無しさん:2008/11/04(火) 16:12:50
spritf
308デフォルトの名無しさん:2008/11/04(火) 16:32:53
>305s/spritf/sprintf/
309デフォルトの名無しさん:2008/11/04(火) 18:24:34
int i,j,k,count;
printf("何段?");
scanf("%d",&count);

for(i = 1;i <= count;i++){
for(j = 1;j <= count-i;j++){
putchar(' ');
}
for(k = 1;k <= i;k++);{
printf("*");
}
putchar('\n');
}


上記のプログラムで右下が直角の三角形が表示されるつもりなのですが

何段?5
----*
---*
--*
-*
*
となってしまいました(半角スペースを-としました)。kがうまくいってないような気がするのですが、ご指摘お願いします。

310デフォルトの名無しさん:2008/11/04(火) 18:35:29
>for(k = 1;k <= i;k++);{
この行に注目。
311デフォルトの名無しさん:2008/11/04(火) 18:44:17
>>310
printf("* %d",k);にしたところ

----*2
---* 3
--* 4
-* 5
* 6

となりました・・・なぜ毎回k=1にならないんだ。
312デフォルトの名無しさん:2008/11/04(火) 18:45:47
>>311
>310
他は見なくていい。
313デフォルトの名無しさん:2008/11/04(火) 18:47:45
>>312
注目したのですがとくにおかしくないような・・・
i回の繰り返し文のはずです。
314デフォルトの名無しさん:2008/11/04(火) 18:53:12
やっと気付きました。 for(k = 1;k <= i;k++);←ここですね{
くだらない質問で失礼致しました。ご指摘ありがとうございました。
315デフォルトの名無しさん:2008/11/05(水) 01:32:51
int k,i,j,n;

printf("何段?");
scanf("%d",&n);

for(k=0;k<=n;k++){

for(i=0;i<(n-k);i++){
printf(" ");
}
for(j=0;j<k;j++){
printf("*");
}
printf("\n");
}

布団入ってから作ったから動くかどうかわからん。
316デフォルトの名無しさん:2008/11/05(水) 01:42:04
do{

if(){
break;
}
if(){
break;
}

}while(0)

時々みるこれどうなのよ?テクッてて見易いとかいうやつは程がしれてるな
317デフォルトの名無しさん:2008/11/05(水) 01:53:25
>>316
while (1) {if()break; if() break;}
とか
for(;;) {if () break; if () break; }
はよくみます。lint にひっかからないように for(;;) {} を使う、ていう意見も。
ループの脱出条件が2つ以上ある、というのであれば、これらのやり方もありだと思います。
318デフォルトの名無しさん:2008/11/05(水) 02:18:01
>>317
論点がずれてる
319デフォルトの名無しさん:2008/11/05(水) 02:22:47
大文字と小文字を区別しないコンパイラはありませんか?
320デフォルトの名無しさん:2008/11/05(水) 02:24:46
そこまで大胆に規格を逸脱した実装は見たことないな。
せいぜいDOS/Windowsでヘッダ名が大文字でも行けるくらいしか知らない。
321デフォルトの名無しさん:2008/11/05(水) 02:39:26
>316
どうなのよってお前の感想どおりだ
322デフォルトの名無しさん:2008/11/05(水) 03:13:09
>>316
別にテクッてるとは思わないがいいんじゃないの
323デフォルトの名無しさん:2008/11/05(水) 08:06:33
>>316
その書き方は嫌いだが goto 禁止なら仕方ないな
324デフォルトの名無しさん:2008/11/05(水) 10:25:39
int main(){
(略)
 printf("test\n");
関数(Dname);
}

void 関数(char *fname){
printf("2\n");
}

というプログラムがあったときに、testが表示されて
2が表示されずにセグメンテーションエラーでるのはどこに原因があると考えられますか?
325デフォルトの名無しさん:2008/11/05(水) 10:27:13
略されたところに魔物が棲んでいると考えられます
326デフォルトの名無しさん:2008/11/05(水) 10:58:22
324ですけど解決しました
関数の中の定義した配列のサイズがおおきすぎたためでした。
327デフォルトの名無しさん:2008/11/05(水) 11:33:44
>>316
美しくないとは思ってたんだがそれに近い書き方だ
0じゃなくて条件1個だけど
どう書くべきなの?
条件をいっぱい書くとして抜けるタイミングが異なる場合はどうしたらいい?
328デフォルトの名無しさん:2008/11/05(水) 11:37:59
>>316
初心者なのでよくわからないのですが
これはif ・・・・・ else if  ・・・
じゃだめなんですか?
329デフォルトの名無しさん:2008/11/05(水) 11:39:58
>>328
それで組んでもさほど代わらないと思うよ。
むしろネストが増えるし
330デフォルトの名無しさん:2008/11/05(水) 12:04:32
qsortでIPアドレスをキーにソートしたいんですが、うまくいきません。

IPアドレスとchar型の文字列を要素に持つ構造体のソートをしたいのですが
比較関数内にprintfを置いてみると、どうやら比較関数を数回参照しただけで
デバッガが立ち上がってしまいます。

IPアドレスはCSVから読み込んでいますが、5MB程度のCSVなら問題なく読み込み、ソートまでできます。
全く同じフォーマットの150MBのCSVからIPアドレスを全て読み込んでソートしようとするとデバッガが立ち上がります。

比較関数内の数箇所にprintfを置いてみたところ、比較関数の先頭と最後のprintfはセットで表示されるので、
比較関数内ではデバッガは出ていません。

どうやら割り当てされていないメモリ領域を参照しているみたいなんですけど、qsortをする際に変な領域を参照することとかあるのでしょうか。
331デフォルトの名無しさん:2008/11/05(水) 12:08:08


・複数プラットフォームで運用するものでない
・仮に複数プラットフォームがあるとしても、ウチは個別にソースを用意する
・社風なのか、ソースの流用は好まない



なのに、「typedefで調べろよ!んったく何やってんだよもー」

とかグチグチ言い出す不満の塊
お前ストレス解消するために会社来てんのか


332デフォルトの名無しさん:2008/11/05(水) 12:55:18
>>330
デバッガってのはデバッグするためのツールなんだけどね・・・
まぁたぶんスタックが足りないんだろう。どーんと増やしてみては?
333デフォルトの名無しさん:2008/11/05(水) 13:05:48
>>327
ループ条件が存在するならループで書いたって問題ないだろ
334デフォルトの名無しさん:2008/11/05(水) 14:34:11
while(条件式)

if(){

continue;
}
if(){

}

}
1個目のifでcontinueした場合2個目のifはとばされて、whileの頭にもどりますよね?
335デフォルトの名無しさん:2008/11/05(水) 14:46:20
やってみれ
336デフォルトの名無しさん:2008/11/05(水) 14:47:34
なんでその程度の規模のプログラムで聞くかね・・・

さくっとサンプル作って、どういう動きするか
テストしてみればいいじゃん。
337デフォルトの名無しさん:2008/11/05(水) 15:02:59
それがゆとり
338デフォルトの名無しさん:2008/11/05(水) 15:18:58
何度も言うけど、Cは動作の詳細を網羅しない言語だから「やってみろ」はダメ
i=i++とか、やってみてその結果が正しいと思い込んだらどうすんの?

こういうのに素直に答える気がないなら「教科書読み直せ」でいいんだよ

>>334
そうだよ
339デフォルトの名無しさん:2008/11/05(水) 15:22:50
どうもしねーよゆとり
340デフォルトの名無しさん:2008/11/05(水) 15:25:46
>>338
ここで散々論争になってきたようなところは
はまったときに聞けばいいんだよ。
どうせはまるところはそういうところって大体結論でてるんだし。
341デフォルトの名無しさん:2008/11/05(水) 16:21:34
>>340
いつどこでそんな結論が出たの?
むしろ最初から正しい知識を与えないからそういうところではまるんじゃないの

問題にしているのは「やってみて確かめる」という姿勢はトラブルの種を抱えているということで
後になってトラブルが起きてから解決できるかどうかではない
342デフォルトの名無しさん:2008/11/05(水) 17:57:50
>>341
それを言うなら、動作保証の有無を 2ch で聞く姿勢にこそ問題があるだろう
正しい知識だ? そもそもそんなのを与える義理がない者をつかまえて何を説くやら
343デフォルトの名無しさん:2008/11/05(水) 18:57:39
質問です。
プログラムの練習で数のべき乗を計算するプログラムをCで作ってみたのですが、ちゃんと計算してくれません。
出来れば、どこが間違っているか教えていただけないでしょうか?
コードは下記のとおりです。
#include <stdio.h>
double multi(double x,int y);
int main(void){
double a,b,mul;
printf("数字aを入力してください\n");
scanf("%d",&a);
printf("aを何乗するか入力してください\n");
scanf("%d",&b);
mul = multi(a,b);
printf("%d",mul);
return 0;
}
double multi(double x,int y)
{
int i;
double mu;
for(i=1;i<=y;i=i+1)
{
mu*=x ;
}
return mu;
}
344デフォルトの名無しさん:2008/11/05(水) 19:01:12
>>343
scanf("%d",&a); → scanf("%lf",&a);
scanf("%d",&b); → scanf("%lf",&b);
printf("%d",mul); → printf("%f",mul);
double mu; → double mu=1;
345343:2008/11/05(水) 19:10:21
>>344
ありがとうございました。
桶下で、ちゃんと動作するようになりました。
346343:2008/11/05(水) 19:11:26
桶下→おかげ
です。
失礼しました・・・・・
347デフォルトの名無しさん:2008/11/05(水) 19:41:50
%fより%gを使おう。
348デフォルトの名無しさん:2008/11/05(水) 19:45:36
なんかちがうんでげすか?
349デフォルトの名無しさん:2008/11/05(水) 19:55:55
if ( (a=Func()) == 8 )

aにFuncの返り値を代入しつつ比較ってできる?


350デフォルトの名無しさん:2008/11/05(水) 19:58:11
できる
351デフォルトの名無しさん:2008/11/05(水) 20:00:22
>>349
やってみてうまくいかないのか?
352デフォルトの名無しさん:2008/11/05(水) 20:19:04
入門以前に、環境について質問なのですが、Microsoft Visual C++.net ExpressとBCC5.5では、どちらが使い易いですか?
353デフォルトの名無しさん:2008/11/05(水) 20:26:03
どう考えても前者
354デフォルトの名無しさん:2008/11/05(水) 20:29:21
IDEとコンパイラ単体では比較にすらならん
355デフォルトの名無しさん:2008/11/05(水) 20:29:30
>>351
うまくいったが、その動作が保証されてるかどうかを気にしてるんじゃないの?
356デフォルトの名無しさん:2008/11/05(水) 20:43:12
>>342
なぜ問題が?
ネットの情報の信用性云々言い出すならそもそもこんなスレの存在意義自体がない
あと正しい知識を与えろと言ってるのではない
答えたくないなら「やってみろ」ではなく「教科書読め」と返せと言ってるだけ
357デフォルトの名無しさん:2008/11/05(水) 20:47:50
どう答えるかはその人の勝手で、お前がグダグダ言おうとかわらんけどな。
まあ、好きなだけ言っててくれw
358デフォルトの名無しさん:2008/11/05(水) 20:52:58
>>355
推測なんざ聞きたかねえ
すっこんでろ

>>356
教科書じゃねえ、保証者(メーカなり規格なり)が発行する資料で確認することだろうが
だいたい回答者サマがそんなこともわかってないような 2ch で聞くことに問題がないとでも言うのか
359デフォルトの名無しさん:2008/11/05(水) 21:00:47
>>358
教科書を文字通りに取られたか
そこはそういったものに読み替えてくれればいいよ

で、2chで質問することを問題視する君はなんでこのスレにいるわけ?
帰れば?むしろ帰ってくれない?邪魔だから
360デフォルトの名無しさん:2008/11/05(水) 21:02:18
いつものageのバカじゃないか
相手しても無駄っていうかお前も邪魔だからやめろ
361デフォルトの名無しさん:2008/11/05(水) 21:07:35
要するにこのスレを潰したいから荒らしてるんだろ?
362デフォルトの名無しさん:2008/11/05(水) 21:12:26
>>359
いーや、おまえは教科書と言った

それからあんたには邪魔かも知れないが
俺はスレタイどおり参加しているだけで荒らしているわけでもない(スレは荒れているかも知れないがな)
難癖つけられる筋合いはないので勝手にするぜ
おまえこそ正義があるなら運営にでも訴えてはどうだ、あ?
363デフォルトの名無しさん:2008/11/05(水) 21:16:37
printf("%d %d %d", ++i, ++i, ++i);
364355:2008/11/05(水) 21:53:55
>>358
すっこまねえよ。
要はお前が規格に沿った回答、または引用をすることができないから、
2chで質問することに意味がないと思いこんでるだけだろ?
お前が「やってみた?どうだった?」とかアホ面ひっさげたレスをしなければ
規格に沿った回答の密度があがるんだよ。
すっこんでろ。
365デフォルトの名無しさん:2008/11/05(水) 22:04:15
>>364
>>351 をどう読めばそうなるのかは知らんし興味もないが
推測なんざ聞きたかねえ、と言ったはずだ
だからその部分に対しては答えない

すっこまねえのは確かにあんたの勝手だが
それはこちらにも言えることだ
同じ言葉を返しさえすれば痛烈だとでも思っていて自己矛盾に気づかないなら小学生なみだぜ
366デフォルトの名無しさん:2008/11/05(水) 22:05:21
>>365
だからすっけんどろっての
367デフォルトの名無しさん:2008/11/05(水) 22:08:21
>>366
うっせえ ぼけ
368デフォルトの名無しさん:2008/11/05(水) 22:18:24
まだすっこんでないよな?

Cの教科書っていったらK&Rで異論ないと思うんだが、
それで何の問題があるんだ?
369デフォルトの名無しさん:2008/11/05(水) 22:23:38
>>368
甘いんだよ、後出し設定なんか聞いてやらん
370デフォルトの名無しさん:2008/11/05(水) 22:40:38
>>369
お前教科書って聞いて何思い浮かべたの?
371368:2008/11/05(水) 22:42:33
後出しも何も俺>>356じゃねえよ?
寒くなってきたんだから布団にすっこんでぽかぽかになっとけよ
372デフォルトの名無しさん:2008/11/05(水) 22:45:49
で、別人のふりくらいしかすることなくなったわけか
373デフォルトの名無しさん:2008/11/05(水) 22:48:16
このスレには極端にレベルの低い小学生が二人いるのかな
374デフォルトの名無しさん:2008/11/05(水) 22:49:49
よそでやれ
375デフォルトの名無しさん:2008/11/05(水) 22:58:36
次の方どうぞ〜♪
376デフォルトの名無しさん:2008/11/05(水) 23:53:51
>>316
それ好きな人が身近にいる。else ifだとデコボコになるからこれが好きとのこだ。
そいつは、構造対のメンバ名が長い時も、最初にそのメンバのアドレスを短くて意味のわかるポインタに移す。
最初は何でいちいちそんな事すんだよとか思ってたが、正直、そいつのソースは読みやすい。
好みだな
377デフォルトの名無しさん:2008/11/05(水) 23:59:17
確かに、構造体ん中に構造体ある時とか、長くなるね。
378デフォルトの名無しさん:2008/11/05(水) 23:59:33
複数ソースファイルがあるとき
ソースファイルその絡みがあるじゃないですか
例えばその値がどこから来たかを見つけたいとき
どうやればいいのですか。



1.c
から
10000000000000.c
くらいまであるとして

そのうちの23460001.cにある関数から
5986293.cに渡されたとしたら
わからないじゃ
ないですか

5986293.cのincludeには782365.cと23435.cしかない
というように、「渡りに渡って行き着いた」やつは非常に見つけにくい。
379デフォルトの名無しさん:2008/11/06(木) 00:01:30
>>378
それは設計が悪くないか?
380デフォルトの名無しさん:2008/11/06(木) 00:01:38
__FILE__
381デフォルトの名無しさん:2008/11/06(木) 00:01:42

ゲームに限らず、携帯電話やATMなど
「仕事」のソースは例外なく大量のファイルに分かれているのに


「この値はどこから来たのか」
「それをはじき出すものはどこにあるのか」

っていうコメントがないことがほとんどです!!!!!!!!!!!!!!!!!!!!!!!!!!
382デフォルトの名無しさん:2008/11/06(木) 00:04:02
>>378
Java見たら泣くよ
383デフォルトの名無しさん:2008/11/06(木) 00:04:39
今時デバッガ使えば、その時点でどの関数がどの関数を呼び出しているかなんてすぐ分かる。
それとは別に、プログラムを実行させなくても静的に解析するツールだってちらほら存在する。
384デフォルトの名無しさん:2008/11/06(木) 00:06:47
研修期間中に読んだものの中で最長の渡りが

30ファイル先

まず先に値を出す1.c -> それを利用する2.c -> 2.cで出た値を利用する3.c .................................................


30.cだけ見ると、「この値はどこから来たの」ってことしか分からず、
includeを見て追っていくと何十も何百も元のファイルから来てたとわかるのみです。
しかもそのincludeも、標準ライブラリ除いて20くらいincludeされていることもザラで
それら全部調べるとなるとたいへんな時間がかかります!!!!!!!!!!!


今仕事でバリバリやってる人らはどうやって調べているの
385デフォルトの名無しさん:2008/11/06(木) 00:07:21
>>378
1.関数呼び出しの構造図を書く

func_a
func_b
func_c
func_d

2.データフローを書く
func_a - x ->func_b
386デフォルトの名無しさん:2008/11/06(木) 00:08:38
関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ・・・・
きつい時あるね
387デフォルトの名無しさん:2008/11/06(木) 00:09:43
>>386
でも昔のDOSのころのようなミニマムな開発じゃなければ
そういうのはざらでしょ。
388デフォルトの名無しさん:2008/11/06(木) 00:10:14
保守って点から見りゃ、およそ最悪だろ。
389デフォルトの名無しさん:2008/11/06(木) 00:14:51
>>386
みたいなのをどうしても調べにゃならん時に、たどり着いたソースが新規1985年だったのがある。俺産まれた年(笑)
昔の人は英語好きだよね〜JISに対応してなかったのかね〜
390デフォルトの名無しさん:2008/11/06(木) 00:18:22
>>389
時代的にはこんな感じだよ。
マシンによるんじゃないかな?

http://www.eonet.ne.jp/~building-pc/pc/pc1985.htm
391デフォルトの名無しさん:2008/11/06(木) 00:22:45
とりあえずincludeで追いかけるってのはありえない
ライブラリならドキュメントがあるはずだし
ソースがあるならgrepかければ済む
392デフォルトの名無しさん:2008/11/06(木) 00:32:05
for(;;)
{
int d = 0;
(dを用いた適当な処理)
}

int d;
for(;;)
{
d = 0;
(dを用いた適当な処理)
}
を比べると上のほうがオーバヘッドが大きいでしょうか?
dはfor文内でしか利用しませんのでスコープを限定したいのですが.
393デフォルトの名無しさん:2008/11/06(木) 00:32:14
以前、関数から参照する外部変数や値の影響についてなどを関数仕様書に書いた。
すると技術の若造が「そういう事は止めてくれ。」と言われた。
「どうして?」の問いに、「そんな事を書いたら分かっちゃうだろ。」の回答。

C言語好きでNE○の系列会社に入社する奴はヲタクなお山の大将が多かった。
394デフォルトの名無しさん:2008/11/06(木) 00:34:30
>>393
ドキュメントとソースの乖離が発生することを懸念して、じゃなくて、分かっちゃうからってところがwww
395デフォルトの名無しさん:2008/11/06(木) 00:35:35
>>393
日本語でおk
396デフォルトの名無しさん:2008/11/06(木) 00:38:36
>>392
{
int d;
for(;;)
{
d = 0;
(dを用いた適当な処理)
}
}

とかは?
これってgccしかできなかったっけ?

>>393-394
意味がわからねえw
397デフォルトの名無しさん:2008/11/06(木) 00:40:28
メーカー製の場合、見えてはいけないものが多い。

特に地上デジタル放送関連は、結局はドライバで制御している以上、

「バレるとB-CASなしでも見られてコピーし放題」って芸当も出来るようになる。
398デフォルトの名無しさん:2008/11/06(木) 00:50:07
コメントなしね〜HTMLならしかたないとこあるけどね〜
399デフォルトの名無しさん:2008/11/06(木) 00:52:21
>>397
外に見せる?資料と内部では違うだろ・・
内部のものまで「書かない」が徹底されてるのか?
400デフォルトの名無しさん:2008/11/06(木) 00:56:22
>396
VC6なんで出来るけどステートメントが深くなるからあんまりやりたくないです.

それよりfor文の中に入れたときに何度もdが宣言されるけどそのときのオーバヘッドが気になります.
401デフォルトの名無しさん:2008/11/06(木) 00:57:17
>>393 ソフトさんですか。
402デフォルトの名無しさん:2008/11/06(木) 00:59:12
オーバーヘッド気になるなら実測なりアセンブリ見るなりすればいいだろ。
403デフォルトの名無しさん:2008/11/06(木) 00:59:44
for(ここにおけば?;;)

vc6だとグローバルスコープだったような気がするけど
でもそれはc++だったような期もするけど
404デフォルトの名無しさん:2008/11/06(木) 01:03:51
>>400
宣言文は実行ステートメントではないから、
実行時のオーバヘッドにはならないだろ。
405デフォルトの名無しさん:2008/11/06(木) 01:06:48
           ____
  .ni 7      /ノ   ヽ\  内部にも見せないよ
l^l | | l ,/)   / /゚ヽ  /゚ヾ\      .n  以前、それで営業がポカやらかしたし
', U ! レ' / /   ⌒   ⌒  \   l^l.| | /) 絶対に流出させられないから
/    〈 |  (____人__)  |   | U レ'//)
     ヽ\    |lr┬-l|   /  ノ    /
 /´ ̄ ̄ノ    ゙=ニ二"   \rニ     |
                      `ヽ   l
406デフォルトの名無しさん:2008/11/06(木) 01:41:40
B-CAS廃止されたんじゃなかったか?
407デフォルトの名無しさん:2008/11/06(木) 01:48:54
まだよ
408デフォルトの名無しさん:2008/11/06(木) 01:51:04
>>401
妙に納得した。

>>392
そのケースなら、コンパイラはどちらも同じようにコンパイルしてしまう。
スコープを限定してくれた方が読むにも判り易いからどんどん限定してくれたまえ。
# それこそ某N∈Sみたいな所の仕事だと全て関数の先頭で宣言しろとか言われかねないけど。
409393:2008/11/06(木) 02:10:15
>>397
そういうカッコいい理由ならまだいいんだがw
NE○の通信系には変な田舎者の高専や専卒出身の奴が多いのは確かだよ。
カモフラージュ気取りのアメージングコード、騙しの#includeなどは当たり前。
例えば、ANSIの定数をコソーリとトリッキーなビットシフトで何重にも再定義してたりで
デバッガで動かすと、EOFが5に見えたりするんだが、奴らはその自分達の技術に対する
他人の反応を見て楽しんでたんだよ。(家で人知れず独りでオナニーしてろってwww)

>>401
昔はT芝相手で設計部門向けのCADなどのソフトもやってましたよ。その他にも監査に
似た評価・検証系もしてたので、よく使うコンパイラ数本のC標準ライブラリのヘッダやソースまで
ほぼ暗記してました。
410デフォルトの名無しさん:2008/11/06(木) 09:12:19
>>352
遅レスだけど、エラーの指摘はTURBO C1.0対MS-C3.0の頃からborlandの方が出来が良い。
使いやすさじゃ勝負にならないけど、学習用途なら色々動かして、気に入った物を使うといいよ。
411デフォルトの名無しさん:2008/11/06(木) 09:12:56
悪いがマ板でやってくれ
412デフォルトの名無しさん:2008/11/06(木) 15:14:28
>>378
やっぱ一回実行して呼び出しスタック覗くのが一番早い気が。
gdbにもあったはずなんで、大抵の環境で可能だと思う。
413デフォルトの名無しさん:2008/11/06(木) 17:19:50
fnameに/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data
とかはいってたとして、次のファイル操作
printf("%s",fname);

if((fp = fopen(fname, "rb")) == NULL ) {
fprintf(stderr,"ERR;入力ファイル error;read_inputfile\n");
exit(EXIT_FAILURE);
}

これをかいて実行すると開けないってエラーがでるんですけども。なぜだと
考えられますか?ちなみに、emacsから/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data
だと開けます。開けるからわからないんですけど。ファイルネームにラストに改行はいってるみたいで。
ただそれでエラーがくるのかと。3.dataはバイナリのデータです。
414デフォルトの名無しさん:2008/11/06(木) 17:26:44
改行入ってたら、実際のファイルの名前にも改行入ってないと開けないぞ
415デフォルトの名無しさん:2008/11/06(木) 18:13:23
>ただそれでエラーがくるのかと
ファイルを指す文字列をどう解決するかは当然OSに依存する
あいにく君の使っている環境は、末尾の\nを排除してファイルを探すことができなかった
それだけのことであって、そもそもCの話ではない
416デフォルトの名無しさん:2008/11/06(木) 18:14:42
C言語を志すならばやはりK&Rは買わないとダメでしょうか?

417デフォルトの名無しさん:2008/11/06(木) 18:17:30
別になくても困りはしないよ
418デフォルトの名無しさん:2008/11/06(木) 18:19:39
もちろんあったほうがいいけど必須ではないよ
CFAQを読んだ上で、規格合致ギリギリのラインを攻め込んだりしない限り問題ないと俺は思う
419デフォルトの名無しさん:2008/11/06(木) 18:20:37
>>416
K&R自体は買わなくても他に手はいくらでもあるが
たかが3千円弱の自己投資をためらうようならお先真っ暗だ
420デフォルトの名無しさん:2008/11/06(木) 18:22:34
買ったけど内容は入門書と変わらない
正直要らないよ
421デフォルトの名無しさん:2008/11/06(木) 18:24:44
K&Rってのは、C言語をマスターしている人間が買う入門書。

マスターしてるなら買うわけないじゃん、と思うだろうが
まさにその通り。

あの本は、読んでる人間はC言語を完全にマスターしてること前提で書いている。


辞書で言うならこんな感じだな

レバレッジ
 株用語のひとつ。

リスクヘッジ
 リスクをヘッジすること。


ってな
422デフォルトの名無しさん:2008/11/06(木) 18:56:30
>>416
優れた医者は毒を薬とするという例えがあるようにその本を毒とするか薬とするかは自分次第
他人の評価を聞いて悩むより本屋でちょっと覗いてみて興味を持ったら買うのが一番
図書館で借りたって良いんだしさ
百聞は一見に如かずだよ
423デフォルトの名無しさん:2008/11/06(木) 19:50:09
>>416
そうそう、積読の価値はあると思います。いつか、ふとしたときに手にとって、おもわず読みふけってしまう、ということがあると思います。
424デフォルトの名無しさん:2008/11/06(木) 21:41:57
>>421
そんなことはない。
Prefaceに書いてあるとおり、他の言語は知ってるけど、C言語は
知らないって人向け

Cの文法は知ってるけど、書き方を知らないような人にも向いてると思う


425デフォルトの名無しさん:2008/11/06(木) 21:44:04
でも本に書いてあるものは全部よい書き方だと思っちゃうようなひとには向いていない
426デフォルトの名無しさん:2008/11/06(木) 22:04:00
「よい書き方」について論じている本ではないことくらいわかれ・・・・無理なのか?
427デフォルトの名無しさん:2008/11/06(木) 23:00:10
趣味でプログラムを覚えようと思うのですが、最初はC言語でいいんですよね?
おすすめの入門書、サイトがありましたら教えて下さい。
428デフォルトの名無しさん:2008/11/06(木) 23:04:30
>>427
いきなりCだなんて。えっち。
それはともかく、おすすめしない。
429デフォルトの名無しさん:2008/11/06(木) 23:12:41

time_t tp;
time(&tp);
sprintf(buf,sizeof(buf),"%Y%m%d",localtime(&tp));

↑こんな感じのを

sprintf(buf,sizeof(buf),"%Y%m%d",localtime(time(&tp));

↑こんな感じで一行で書きたいんだけど。

もちろん、この書き方が駄目なのは分かるんだけど。

関数の戻り値のアドレスを渡したいんだよねー

430デフォルトの名無しさん:2008/11/06(木) 23:13:07
はじめてのC
431デフォルトの名無しさん:2008/11/06(木) 23:14:31
>>429 上のもダメですが
432デフォルトの名無しさん:2008/11/06(木) 23:16:55
>>429
なんでこだわるの?

433デフォルトの名無しさん:2008/11/06(木) 23:18:29
つーか、それstrftime()の間違いだろ。
434デフォルトの名無しさん:2008/11/06(木) 23:51:25
>>427
 C言語に興味があるのならC言語にすればよい。
入門書は、本屋に置いてあるのでいいと思うよ。
例えば、ポニョのとかLepton先生のとかカニハンのおっちゃんのとか。
ああ、でも『はじめての~』は買わない方がいいと思う。
厨房のとき読んでコードギアスの2ndOPになった。
あまり評価高くないけど、河西本とかもオヌヌメ。もう記述が古いけど厨房でも理解できた。
 ウェブサイトは、使わない方がいいよ。コピー&ペーストで終わらせようとする衝動に負けるだろうから。
手で打って覚えるんだよ。目でコードの美しさに感動するんだよ。体でプログラミングの楽しさを感じるんだよ。

 本気でC言語を使って思い通りにプログラミングできるようになりたければ、
他人の評価は気にせずに自分の直観を信じて本を読んでいった方がいいよ。
そのレビューをした人と自分の言語理解度が必ずしも同じであるわけではないのだから。
1冊読んでいい気になるなよ、そこの自称中級者。

 うわっキモ。米大統領選:オバマ氏、共和党地盤・インディアナ州奪取 まで読んだ。
435デフォルトの名無しさん:2008/11/07(金) 00:15:14
猫Cのこのページ
ttp://www.kumei.ne.jp/c_lang/intro/no_13.htm

のPGMをコーディングして実行したんだけど
結果が
「time1=1225984391 time2=0」となってしまう。

printf ("time2=%ld\n",t2)
と単独で出力すればちゃんと「time2=1225984392」になる。

何が間違ってるんでしょうか
436デフォルトの名無しさん:2008/11/07(金) 00:16:03
実行環境はMicrosoft Visual C++ 2008 Express Editionの
Win32 コンソールアプリケーションです
437デフォルトの名無しさん:2008/11/07(金) 01:35:33
TCP/IPのソケットを使って互いに通信するプログラムを作りたいのですが、正直さっぱりわかりません
どこか詳しい説明とサンプルプログラムがあるサイトはないでしょうか?
438デフォルトの名無しさん:2008/11/07(金) 01:38:07
439デフォルトの名無しさん:2008/11/07(金) 02:21:40
>>435
%ld に対応するのは long 型であって、time_t 型ではありません。
long 型と time_t 型のサイズが等しい環境では上手くいくかもしれませんが、
あらゆる環境で常にそれが成立するわけではありません。
440デフォルトの名無しさん:2008/11/07(金) 02:57:52
ネコなんかで勉強しようなんてするから嵌まるんだ。
long(t1)とでもすれば"%ld"で出力されるだろ。
441デフォルトの名無しさん:2008/11/07(金) 09:14:22
>>440
やってみたけどダメです。。。

じっさい、t1のほうは「%ld」でちゃんと出力されてるんですが。
ブレイクポイント設定して見てみるとちゃんと変数の中身は変わってます。

なのに「"\ntime1=%ld time2=%ld\n"」で標準出力するとtime2=0 になっちゃう
442デフォルトの名無しさん:2008/11/07(金) 09:41:07
>>441
64bit環境?
%ld のかわりに、%I64d でやるとどうなる?
443デフォルトの名無しさん:2008/11/07(金) 09:54:50
って環境は>>436
time_tは
typedef __int64 __time64_t; /* 64-bit time value */
typedef __time64_t time_t; /* time value */
だから64bit整数だな。%I64dか%lldで。
444デフォルトの名無しさん:2008/11/07(金) 09:57:58
つーか、longが64bitじゃないんだから、>>440でいいはずだな。
>>441はなにをやってみたんだ?
printf("\ntime1=%ld time2=%ld\n", long(t1), long(t2));だぞ?
445デフォルトの名無しさん:2008/11/07(金) 10:07:02
>>444
その通りやってみたんですがダメですね・・・

printf ("time2=%ld\n",t2)

だと正常に出力されるので%ldの型指定に問題があるとは思えないのです。

なんで0が出力されるのか、全く見当が付きません・・・
446デフォルトの名無しさん:2008/11/07(金) 10:12:17
本についてるプログラム(C言語を習得する類の本ではありません)で
ただのint型変数にファイルから100000という値を読み込んでる
ものがあったんですが、一般的に見てこのコードは正しいんでしょうか?
447デフォルトの名無しさん:2008/11/07(金) 10:13:42
>>446
どのあたりが疑問なんだ?
448デフォルトの名無しさん:2008/11/07(金) 10:21:58
>>447
int型で表せる値の範囲についてです。
環境によるかもしれませんが
参考書には-32767〜32767と載っていたもので
449デフォルトの名無しさん:2008/11/07(金) 10:23:22
>>445
えーとだな、まず64ビット整数はたとえば0x0000000012345678 という数値なわけだ。
これをスタックに積んで、32ビットで取り出すと、0x12345678 と 0x00000000の2つの数字がとれるわけ。
なんで2番目が0になるかわかったろ?
450デフォルトの名無しさん:2008/11/07(金) 10:26:17
>>445
>printf ("time2=%ld\n",t2)
この場合も、0x0000000012345678を積んで、0x12345678だけ取り出したから
たまたまうまくいってるように見えるだけで、上位32ビットは切り捨てられている。
451デフォルトの名無しさん:2008/11/07(金) 10:26:44
>>448
それは少し古い時代のint型だな
今は大抵4バイトなんで-2147483648 to 2147483647 を表せることが多い
452デフォルトの名無しさん:2008/11/07(金) 10:26:45
intが16ビットなんて8ビットパソコンの時代じゃないか(80年代)
参考書が古すぎ
453デフォルトの名無しさん:2008/11/07(金) 10:35:38
>>451
そうですか、分かりました。
どうもありがとうございます。
454デフォルトの名無しさん:2008/11/07(金) 10:52:02
>>449-450

ありがとうございます。上手くいきました。

t1-long(t2) ってやってました。>>445を読むまで理屈が判りませんでした。

VC6とかだと上手くいってたのかな?サンプルコードも油断ならないですね
455デフォルトの名無しさん:2008/11/07(金) 10:56:54
× >>445を読むまで理屈が判りませんでした。
○ >>449を読むまで理屈が判りませんでした。

安価間違えたorz
456デフォルトの名無しさん:2008/11/07(金) 11:00:00
>>454
long(t1)は、time_t型のt1の値を、long型にキャストすると言うことだ。
t1 - long(t2)では、time_t型のt1からlong型にキャストされたt2の値を引こうとしてしまうので、
time_t型の実態であるlong long型にキャストして引き算を行なってしまうので結果はlong long型のまま。
引き算する場合はlong(t1 - t2)としなくては意味がない。

そもそもtime_t型は実態が32ビット整数だった時代が長いから無理もないとは思うが、
32ビット整数である保証がないのでちゃんとキャストするべき。それをしていないサンプルは、当てにならないと言うこと。

尚、time_t型同士の引き算は本来なら、difftime()を使うべき。
457デフォルトの名無しさん:2008/11/07(金) 11:09:00
>>456
結局のところ、printf("%g\n", difftime(t1, t2))ってことね。
# だからといって、printf("%g\n", difftime(t1, 0))する奴ぁいねぇと思うが。
458デフォルトの名無しさん:2008/11/07(金) 11:34:56
対角要素に0があっても正しく動く逆行列を求めるソースおちてないですかね?
459デフォルトの名無しさん:2008/11/07(金) 12:48:52
同じx86-64bitでも、Windows系の64と、Unix/BSD/Linux系の64アーキテクチャの違いも・・・
460デフォルトの名無しさん:2008/11/07(金) 13:07:30
>>427
自分もプログラミング入門者なんだが、苦しんで覚えるC言語ってサイトがわかりやすいと思う

お互い頑張りましょう。
461デフォルトの名無しさん:2008/11/07(金) 13:13:02
>>446
コードそのものは正しい
16bit環境には対応していないというだけ
462デフォルトの名無しさん:2008/11/07(金) 13:23:20
>>460
俺も昔、苦しんで覚えたなw
血便、下血、終電、睡眠デバッグ・・・
463デフォルトの名無しさん:2008/11/07(金) 13:32:19
>>460
「苦しんで覚えるC言語」リンク先のsetjump/longjump
>プログラムの流れをグチャグチャにする凶悪な関数であり、よほどの事情でもない限り使用してはいけない。
ワラタ
後に例外処理 try 〜 chatch に衣替えして支持を得る、元祖例外処理サポート関数のデビュー作なのに、
誰も正しい使い方を広められず、gotoと併せて鵜呑み受け売りで語り継がれて忌み嫌われたんだよね。
464デフォルトの名無しさん:2008/11/07(金) 13:39:18
longjumpが悪だとは決して思わないけれど
忌み嫌われる程度には危険で使いにくいと思う
465デフォルトの名無しさん:2008/11/07(金) 13:41:11
海の怖さを知って初めて一人前の猟師
そういうことさ
466デフォルトの名無しさん:2008/11/07(金) 13:44:09
コードの海は俺の海
467デフォルトの名無しさん:2008/11/07(金) 13:51:00
そして怖い膿を知った
468デフォルトの名無しさん:2008/11/07(金) 13:57:00
まあデストラクタが呼ばれないから実際使えなかったわな。
469デフォルトの名無しさん:2008/11/07(金) 18:26:41



「今は大抵○バイト」



一番ダメな考え方

こうやって決め打ちすると、そこから変わった場合に一切対処できずに泣いて誰かに助けを頼むことになる


「ママが○バイトだって言ってたから○バイトじゃなきゃダメなんだあああウワアアアアン!」


470デフォルトの名無しさん:2008/11/07(金) 18:30:46
分かったからお前が解説してやってくれ
471デフォルトの名無しさん:2008/11/07(金) 18:47:01
>>468
おまえC使いのくせにスタックの巻き戻し程度のものが自分で実装できんのか?
472デフォルトの名無しさん:2008/11/07(金) 19:17:37
関数にn次の2次元配列を渡す場合はどう書けばいいですか?

double data[n][n]とかいう配列です
473デフォルトの名無しさん:2008/11/07(金) 19:31:08
void func(double **data)
474デフォルトの名無しさん:2008/11/07(金) 19:32:14
>>472
void hoge(double *pData)
とか
void hoge(double Data[n][n])
じゃだめ?
475デフォルトの名無しさん:2008/11/07(金) 19:35:34
>>473
渡すときは func(data)ですか?
476デフォルトの名無しさん:2008/11/07(金) 19:38:37
ああ間違えた。>>473が正しい。
ポインタじゃなくて実体そのものをコピーしていいなら俺のでもいい・・・はず・・・

http://pc11.2ch.net/test/read.cgi/tech/1225320579/
の379の質問か。
477デフォルトの名無しさん:2008/11/07(金) 19:40:15
>>475
そう

>>476
間違っています
勉強しなおしましょう
478デフォルトの名無しさん:2008/11/07(金) 19:40:44
>>476
>>475+>>473だとコンパイルがとおらないんです
479デフォルトの名無しさん:2008/11/07(金) 19:43:19
>>473 であるべき、と強硬に言い張る奴が昔いた
一生懸命 malloc してたw
480デフォルトの名無しさん:2008/11/07(金) 19:44:01
>>473は大嘘
普通は func(double data[][n])
481476:2008/11/07(金) 19:45:25
>>477
あ、下のほうって意味だったんですが、VC++で動くけど問題なんでしょうか?
以下のソースで動きました。

void test(int data[2][2])
{
printf("%d\n", data[0][0]);
printf("%d\n", data[0][1]);
printf("%d\n", data[1][0]);
printf("%d\n", data[1][1]);
}
int main(int argc, char *argv[])
{
int data[2][2] = {0,1,2,3};
test(data);

return(0);
}
482デフォルトの名無しさん:2008/11/07(金) 19:48:29
void test(int data[][2])
{
printf("%d\n", data[0][0]);
printf("%d\n", data[0][1]);
printf("%d\n", data[1][0]);
printf("%d\n", data[1][1]);
}
int main(int argc, char *argv[])
{
int data[2][2] = {0,1,2,3};
test(data);

return(0);
}

これでいい
483476:2008/11/07(金) 19:50:57
>>482
関数で一次限の配列の要素数を書かない理由はポインタ渡しにしたいからですか?
それとも別の理由?
484デフォルトの名無しさん:2008/11/07(金) 19:50:58
K&R で書くなら ANSI 混ぜるなよ
485デフォルトの名無しさん:2008/11/07(金) 19:56:33
>>472
関数に配列を渡すことはできない。渡されるのは常に配列の戦闘要素へのポインタである。
double data[X][Y] という配列があるとき、data は double の配列の配列であり、
これを関数呼び出しの引数に書くと、それは double の配列へのポインタに変換される。
実際に関数にわたるのはこのポインタで、その型は double (*)[Y] である。
だから関数の仮引数の宣言は以下のようになる。

int func(double (*data)[Y]) …@

ただし、これは次のように書いてもいい。

int func(double data[X][Y]) …A
int func(double data[][Y])  …B

Aは配列そのものを表しているが、既に述べたように関数が配列そのものを受け取ることはない。
そこで、関数の仮引数に配列が書かれたときには、配列がその先頭要素へのポインタに置き換わるのと同様に、
その配列要素へのポインタを宣言したのと同じに扱われることになっている。だからAの持つ意味は@と同じである。
ここでAがポインタに置き換わるとき、当然最初の添字Xは無視されることとなる。つまりBのように省略が可能である。
486デフォルトの名無しさん:2008/11/07(金) 19:59:26
>>483
最初の添字が無意味だから
したかろうがしたくなかろうが配列を引数に書いたら 絶 対 に ポインタ渡しになる
487デフォルトの名無しさん:2008/11/07(金) 20:02:33
配列を値渡ししようとしてもポインタの値渡しになるから

値そのものは渡せない
488476:2008/11/07(金) 20:09:51
>>485-487
丁寧な説明ありがとうございます。
おかげでポインタの理解が深まりました。
人の質問に答えて見るもんですね。
同様に構造体の配列も要素数書いてもポインタになるのを始めて知りました。
試してみたらアドレス一緒でビックリ!
でも、なんでdata[0]->data1じゃなくてdata[0].data1なんでしょうか?

typedef struct{
int data1;
int data2;
}TEST_TABLE;

void test(TEST_TABLE data[2])
{
printf("%d\n", data[0].data1);
printf("%d\n", data[0].data2);
printf("%d\n", data[1].data1);
printf("%d\n", data[1].data2);
}

int main(int argc, char *argv[])
{
TEST_TABLE data[2] = {0,1,2,3};

test(data);
return(0);
}
489デフォルトの名無しさん:2008/11/07(金) 20:23:24
まったく理解できてねぇwwwwwww
490デフォルトの名無しさん:2008/11/07(金) 20:40:40
>>429
これでいいじゃない。
struct tm *v_localtime(time_t t)
{
return localtime(&t);
}

strftime(buf, sizeof buf, "%Y%m%d", v_localtime(time(0));
491デフォルトの名無しさん:2008/11/07(金) 20:41:33
>>488
dataがポインタだから
data[0]は構造体自体
492デフォルトの名無しさん:2008/11/07(金) 20:42:27
>>488
[]演算子に*の意味が入っているから。
493デフォルトの名無しさん:2008/11/07(金) 21:03:43
1 TEST_TABLE data[10]; TEST_TABLEを要素とする配列。
2 data[0] 先頭要素。
3 &data[0] 先頭要素のポインタ。
4 data だけ書いたら↑3と同じ。
5 TEST_TABLE *p = &data[0]; 配列先頭要素へのポインタで変数 p を初期化。
6 TEST_TABLE *p = data; ↑5 と同じ。
7 p->data1 ポインタを使って要素へアクセス。
8 data->data1 ↑6,7 から、これは 7 と等価。
9 data と p は等価だから、data[0] は p[0] と等価。
10 つまり *p は p[0]。
11 (*p).data1 *演算子はポインタから実体を返す。だから要素アクセスはドット。
12 (*data).data1 上と同じ。
13 data[0].data1 ↑2で書いたように要素なのでアクセスはドット。
14 data[1] 二番目の要素。
15 &data[1] 二番目の要素のポインタ
16 以下 data[0] と同じ。
17 data[2] 三番目の要素。
18 以下↑と同じ。
19 p = dataのとき、 data[1] は *(p + 1) と同じ。
20 つまり、&data[1] は p + 1
21 data[1] は data[0] の後ろにくっついてるわけだから
22 &data[1] と &data[0] の間のアドレス距離は data[0] の大きさ分ある。
23 つまり、 p+1 と p では data[0] の大きさだけ移動してる。
24 等価等価言ってきたけど、 p++ はできて、data++ はできない。

25 以上とは関係なく、関数の仮引数では data[] は配列じゃなくポインタ。
494476:2008/11/07(金) 21:11:52
>>491-493
またまた詳しい説明、ありがとうございました。
ポインタに関して理解していないところの多さを感じました。
まだまだ勉強不足ですね。
さて、名無しに戻って元々したかった質問をします。
495デフォルトの名無しさん:2008/11/07(金) 21:16:40
VC++でファイルからデータを読み込み分解するプログラムを作りたいです。
ファイルには
hoge:aaa\r\n
hage:bbb\r\n
のように記述されていて、
hoge:に対する記述は
hoge:aaa\r\n
hoge:bbbb;012\r\n
と";"の後にもデータが続いている場合があります。
aaaやbbbbの文字数は一定ではないです。
これを読み出すときに、
sscanf(bBuf,"hoge: %s",&data[HOGE][0]);
としているのですが、";"以降がdataに入りません。
どうしたらいいでしょうか?
496デフォルトの名無しさん:2008/11/07(金) 21:33:13
>>493
> 3 &data[0] 先頭要素のポインタ。
> 4 data だけ書いたら↑3と同じ。

ダウト
sizeof &data[0] != sizeof data
497デフォルトの名無しさん:2008/11/07(金) 21:46:16
>>496
それは例外事項

data だけなら先頭要素のアドレスで正しい
498デフォルトの名無しさん:2008/11/07(金) 21:49:47
ん?
499デフォルトの名無しさん:2008/11/07(金) 21:52:25
不毛だ
500デフォルトの名無しさん:2008/11/07(金) 21:58:46
うるせーな
気にしてんだよ
501デフォルトの名無しさん:2008/11/07(金) 22:18:19
data と p が等価で、 sizeof data が例外なのか。
p = data ができるのが例外なのか。
502デフォルトの名無しさん:2008/11/07(金) 22:40:55
すごいサイト見つけました
最新ビジネスソフトが格安でした
「格安PCサイト」で検索して
格安PCサイトってところです。
後払いで安心して買えました
503デフォルトの名無しさん:2008/11/07(金) 22:45:18
>>501
どちらかというと後者
504デフォルトの名無しさん:2008/11/07(金) 23:29:42
すみませぬが、このコードの間違いを指摘して頂けませんか?
どうにも答え通りに表示されなくて…
このままだと偶数番目に数字が入力できないのです。
scanf("%1f", &weight[i]);の「%1f」を「%f」にすると入力が出来ても
どうもscanfで入力した数字がweight[NUMBER]に入ってないといいますか…

よろしくお願いします。
・5人の学生の体重を読み込んで最も重い人の体重・最も軽い人の体重を表示
#include <stdio.h>
#define NUMBER 5 /* 人数 */
int main(void)
{ int i;
double weight[NUMBER];
double max, min;

puts("体重を入力してください");
for (i = 0; i < NUMBER; i++)
{ printf("%2d番:", i + 1);
scanf("%1f", &weight[i]);
}
min = max = weight[0];
for (i = 1; i < NUMBER; i++)
{ if (weight[i] > max) max = weight[i];
if (weight[i] < min) min = weight[i];
}
printf("最も重い人の体重:%.1f\n", max);
printf("最も軽い人の体重:%.1f\n", min);
return (0);
}

505デフォルトの名無しさん:2008/11/07(金) 23:37:28
うぜえから宿題スレへ行け
506デフォルトの名無しさん:2008/11/07(金) 23:53:02
scanfでは%lfな、エルエフ
507デフォルトの名無しさん:2008/11/07(金) 23:58:44
>>505 すみません。申し訳ない。
>>506 恥かしい限りです。ありがとうございました。
508デフォルトの名無しさん:2008/11/08(土) 00:01:36
>501
pとdataは評価したときに得られるポインタ値が同じだけで、絶対に等価ではない

sizeofは配列がポインタに成り下がるという「特別な動作」に対する例外で
例外ではあるがその時の配列の扱い自体は本来的なもの

p=dataが出来るのは例外ではない
509デフォルトの名無しさん:2008/11/08(土) 00:07:09
data = p;
ができないのも例外で片付ける気かこいつ
510デフォルトの名無しさん:2008/11/08(土) 00:45:21
指すアドレスが書き込み可能でないというだけだな
511デフォルトの名無しさん:2008/11/08(土) 02:11:46
ポインタってのは宣言した段階で実際の入れ物が用意されないのは
なぜですか


double *a なら、
「倍精度データ型のa」ちゅう入れ物が出来てていいはずや
ないですか

512デフォルトの名無しさん:2008/11/08(土) 02:15:57
>>511
ひとつの入れ物に対して、2つのポインターを使うこともあります。
だから、入れ物とポインターの定義は分けたのだろう。
513デフォルトの名無しさん:2008/11/08(土) 02:16:13
いや、入れ物はできてるよ
aの中身が無いから参照できないんだよ?
514デフォルトの名無しさん:2008/11/08(土) 02:19:53
>>511
メモリの無駄だから
ポインタだけ欲しくて入れ物は要らないシチュエーションもよくある
配列の中身を順番に舐める時とか
515デフォルトの名無しさん:2008/11/08(土) 02:31:35
ポインタを入れる入れ物が用意されてる。
int や double と同じように、 int* や double* もそれぞれ別の型。
int 変数を宣言すると int のサイズのメモリが確保されるのと同じように。
int* 変数を宣言すれば、 int* サイズのメモリが確保される。
516デフォルトの名無しさん:2008/11/08(土) 02:34:31
>>513
中身が無いってどういう意味かわからないが、
中身の無い変数なんて C じゃ存在し得ないよ。

double *a と宣言すれば、 その時点でメモリ上に領域が確保され、
なんらかの値が入っている。無効値かもしれないが空っぽってことは無い。
NULL だって値を持っている。
517でけへんが:2008/11/08(土) 02:43:58

doube *a;

a = 1;
518デフォルトの名無しさん:2008/11/08(土) 02:48:56
多くの行を含むテキストファイルを読み込む実用プログラムではscanfは使わないほうがいいんだけどな・・・
フォーマットを外れた行に遭遇すると死ぬケースもあってアンセーフだし、コメントも書けないからね。
519デフォルトの名無しさん:2008/11/08(土) 02:50:41
>>517
ど・・どうぶ?

いやもういいから寝るんだ。寝た方が良い。
520デフォルトの名無しさん:2008/11/08(土) 03:02:09
scanfで本当に防げないのは数値のオーバーフローだけだろ?
521デフォルトの名無しさん:2008/11/08(土) 03:05:16
ポインタを入れ物として理解したつもりになってると混乱するという事例ですね。
522デフォルトの名無しさん:2008/11/08(土) 03:11:07
入れ物として理解するのはいいが何を入れるための入れ物かを理解しなければ
523デフォルトの名無しさん:2008/11/08(土) 03:35:41
ポインタをポインタとして使うには、

何をポインタにしたいのかを指定しないといけない

*aだから、aというポインタがあるだけであって

このままではaは何も指し示していない

aが入れ物を指し示して初めて使える
524デフォルトの名無しさん:2008/11/08(土) 03:39:21
Cって何でこんなに穴ばっかなの?

よく考えないで作ったうえ、規格化もされないうちに広まりすぎたからです

なんで直さないの?

直したくても、今までの資産が使えなくなるので直せないのです
混乱するし



みんなで学ぼうだいじなこと(ひらがなにするとまさに官公庁発行って感じがしてムカつくのがわかるだろう)


・まず、穴がないように設計してから広めよう


穴だらけの状態でグローバル化すると
「別の言語」としてリリースするより手がなくなってしまう
いい反面教師であると
俺は思う
525デフォルトの名無しさん:2008/11/08(土) 03:41:24
intだって最初はどんな数値が入ってるかわからないわけだし、
ポインタだってそこらへんは一緒でしょ
526デフォルトの名無しさん:2008/11/08(土) 05:38:32
>>524
その答えがC#!

 熱烈なマニアに支持されたC言語はgdgdで未成熟のまま普及へ。
  ↓
 高い移植性=実際は力技で移植w という実情からANSI標準化。
  ↓
 多くのキボンヌ!に応えてC拡張、更にC++化で何でも許す状態に。
  ↓
 工学系の学生・研究者援護企業であるSunによりJava言語が誕生
  ↓
 プログラミング言語の第一人者がプロの観点で成熟させたC#を生む♪

これにより、プロフェッショナル(C#) > 廃アマチュア(Java) であることを見せ付けて今日に至る。
527デフォルトの名無しさん:2008/11/08(土) 05:49:59
その情熱を仕事に活かせば?
528デフォルトの名無しさん:2008/11/08(土) 08:04:48
>>520
文字列の長さもマジックナンバーで埋め込まないといけないんでイマイチ。

scanf("%10s", s);

とか。

printf()系みたいにパラメータで渡せればよかったのに。
529デフォルトの名無しさん:2008/11/08(土) 08:20:41
"%10s"
これをsprintfで作れば。
530デフォルトの名無しさん:2008/11/08(土) 08:26:43
scanf("%*s", 10, s)
531デフォルトの名無しさん:2008/11/08(土) 08:43:31
>>530
このスレで冗談はやめとくれ。
532デフォルトの名無しさん:2008/11/08(土) 08:54:46
>>529
そこまでするのもなんだかなぁ。
533デフォルトの名無しさん:2008/11/08(土) 09:29:03
>>510
data が書き込み可能でないアドレスだというのなら、
sizeof(p + 1) == sizeof data というのだな
534デフォルトの名無しさん:2008/11/08(土) 09:38:51
>>533
なんという無限ループ
535デフォルトの名無しさん:2008/11/08(土) 17:10:46
正常終了を知らせる返り値が0なのに
どうしてif文では条件に0渡すと偽の扱いになるの?
分かりづらい
536デフォルトの名無しさん:2008/11/08(土) 17:14:28
ユニックスの仕業です
537デフォルトの名無しさん:2008/11/08(土) 17:32:04
>>535
関数の話であれば、異常を検出しやすくするため。
--
int func()
{
if (異常) return -1;
return 0;
}
int main()
{
if (func()) {
// ここでエラー処理
}
return 0;
}
--
シェルの場合は、ややこしいことになってしまったけどね。
538デフォルトの名無しさん:2008/11/08(土) 17:50:40
負論理?
539デフォルトの名無しさん:2008/11/08(土) 17:59:12
>>537
そんな話は初めて聞いた。
540デフォルトの名無しさん:2008/11/08(土) 18:07:04
C言語の仕様策定した人間が馬鹿だったんだろうね
0=正常、真
というのが通常の考え方だから。
DBの設計でもフラグなんかは0が正常値だしね
541デフォルトの名無しさん:2008/11/08(土) 18:09:31
あんまり普通じゃない。
542デフォルトの名無しさん:2008/11/08(土) 18:13:33
>>540
おい、情報工学でもデジタル回路論でも、論理では真=1だろ!
真・偽の論理値と、処理結果のステータス値とは違うカテゴリだぞ。
543デフォルトの名無しさん:2008/11/08(土) 18:24:42
ブーリアンとしては、0=偽が慣例的だけど、
シェルコマンドの戻り値は、エラーコードにバリエーションを持たせたかったんだろうな。
システムが正常に処理を終えたらそれでよし、エラーが起きたら何のエラーなのかを知りたい。
544デフォルトの名無しさん:2008/11/08(土) 18:40:37
パソコンAで作ったソースファイルを違うパソコンBに移してコンパイラしたら
何故かchar型の変数の中にCのソースファイルが存在する場所のパス(C\なんちゃら〜)が入っちゃうんですけど・・・
パソコンAでコンパイルした時の変数の文字列は正常でした
コンパイラは両方ともボーランドです・・・
545デフォルトの名無しさん:2008/11/08(土) 18:45:36
初期化してないな
546デフォルトの名無しさん:2008/11/08(土) 18:51:06
Borlandでか? VC6 でなく
547デフォルトの名無しさん:2008/11/08(土) 19:01:03
>>546
#include<stdio.h>
int main(void){
char unknown[1024];
unknown[1024-1]='\0';
puts(unknown); // 何が出るかな?
return 0;
}
548544:2008/11/08(土) 19:01:54
>>545
トンクスです
初期化した後に文字列を渡したら正常に動きました
549デフォルトの名無しさん:2008/11/08(土) 19:10:59
>>547
不定ってことだろ? それはわかってる
同じソースを同じコンパイラで翻訳してるのに結果が違うのが変だと思ったんだよ
通常ホスト環境ではコンパイラとソースが同じならバイナリも同じで、
それゆえ不定は不定なりに同じ値が出るはず

DOS だとか、VC6(と xp)みたいに特殊なケースを除いて
550デフォルトの名無しさん:2008/11/08(土) 20:48:14
>>549
スタックに何が乗っているかは開発環境依存ではなく、実行環境実実行状況依存。
551デフォルトの名無しさん:2008/11/08(土) 21:05:08
実行環境が >>544 の文中のように限定されている場合、
記憶域は割付時点ではゼロ初期化されていて他のプロセスの情報が影響(露呈)することはない
0 以外の「不定」が入っているとすると、例えば >>547 のようなケースではスタートアップの残骸くらいだろ?
552デフォルトの名無しさん:2008/11/08(土) 21:05:22
>>549
分かってないようだけど、ソースとコンパイラが同一かどうかは関係ない。
バイナリが完全に同一であっても、同じ値になるかどうかはわからない。
553デフォルトの名無しさん:2008/11/08(土) 21:06:03
エラーログってどこでだす?メイン?サブ?
554デフォルトの名無しさん:2008/11/08(土) 21:06:43
>>551
ヒント:OSから直接mainに飛ぶわけじゃない
555デフォルトの名無しさん:2008/11/08(土) 21:22:12
>記憶域は割付時点ではゼロ初期化されていて
556デフォルトの名無しさん:2008/11/08(土) 21:27:13
おまいら、こまけえな
>>544は初期化したらおkだったといってんだから、それでおしまい。
557デフォルトの名無しさん:2008/11/08(土) 21:38:09
>>552
保証があるかどうかって話は今してないぞ
>>544 が訴えている症状から何を考えたかを言っているんだ
558デフォルトの名無しさん :2008/11/08(土) 22:01:58
超素人質問で悪いんだが、ヘッダーファイルの実体(例えばstdio.h)ってどこにあるの?
559デフォルトの名無しさん:2008/11/08(土) 22:09:54
>>558
環境による
もうちょっと言えば、たぶんコンパイラの手の届く場所にある
560デフォルトの名無しさん:2008/11/08(土) 22:11:01
>>557
「同じになるはず」と言う時点でお前はわかってないんだって

>>558
UNIXだと /usr/include、あるいはコンパイラをインストールしたところ付近
Windows だとコンパイラをインストールしたところ付近
561デフォルトの名無しさん:2008/11/08(土) 22:16:33
>>560
いいだろう、お主が「わかっている」なら、このプログラムの出力を俺以上に説明できるか?

#include <stdio.h>

int main(void)
{
int a[1], i;

for(i = -2048; i < 0; i += 16) {
int j;

printf("%p", &a[i]);
for(j = 0; j < 16; j++) {
printf(" %02x", a[i + j] & 0xff);
}
printf("\n");
}
}

「不定だから」ではなく、何の残骸かを俺以上に言い当てられるか?
俺の説は「スタートアップの残骸くらい」と述べたぞ
562デフォルトの名無しさん:2008/11/08(土) 22:17:12
確か厳密には標準ライブラリのヘッダは、ファイルとして存在している必要はないんだっけ?
563デフォルトの名無しさん:2008/11/08(土) 22:20:56
>>558
一般的な答えは「処理系定義である」

コンパイラの品種と、それをどこのディレクトリに(またはデフォルトで)インストールしたかを書いてくれれば
そのコンパイラを使っている人ならたいてい答えられる
564デフォルトの名無しさん:2008/11/08(土) 22:21:05
まーた馬鹿が頑張ってるなあ
そろそろ引き際ってものを覚えろよ
565デフォルトの名無しさん:2008/11/08(土) 22:22:03
未定義釣りが始まった。
566558:2008/11/08(土) 22:27:33
>>559
>>560
>>563

ありがとうございます。ということはLinuxを使っている場合には/usr/includeになるんですね!
では、OSごとにヘッダーファイルの実装は異なるんでしょうか?CPUが違えばシステムコールの
実装もことなるのと同じなのでしょうか?
567デフォルトの名無しさん:2008/11/08(土) 22:28:35
ゴハンダヨ♪|▽゜)ノ ⌒゜゜・ ゞ●)))彡
568デフォルトの名無しさん:2008/11/08(土) 22:35:37
>>566
ヘッダファイルの実装、の意味がよくわからんが、
たとえばマクロやtypedefの定義の中身が違ったりするのかという意味なら、そう
569デフォルトの名無しさん:2008/11/08(土) 22:35:59
>>566
Linux は UNIX ではない
570デフォルトの名無しさん:2008/11/08(土) 22:36:51
>>569
はいはい、unix系でいいでちゅかー?
571デフォルトの名無しさん:2008/11/08(土) 22:45:44
UNIX系つーと、また違う
572デフォルトの名無しさん:2008/11/08(土) 22:49:05
どーでもいーよ。
語りたいなら該当板行けよ。
573デフォルトの名無しさん:2008/11/08(土) 23:02:55
>>566
ヘッダーファイルの実相=ヘッダーファイルの中身
という意味なら、ヘッダーファイルは処理系=コンパイラによって違う。
574デフォルトの名無しさん:2008/11/08(土) 23:39:49
struct test{
  int **A;
};

int main{
int i,j
struct test *doragon;

doragon->A=(int **)malloc(sizeof(int)*10);

for(i=0 ; i<10 ; i++){
 doragon->A[i]=(int *)malloc(sizeof(int)*10);
}

for(i=0 ; i<10 ; i++){
  for( j=0 ; j<10 ; j++){
    A[ i ][ j ]=i; 
  }

}

}

という風に構造体のポインタのメンバのAにintを10*10個用意して
それを二次元配列として使うプログラムを作ろうとしたのですが
アクセス違反が起こります。 なぜでしょうか?
575デフォルトの名無しさん:2008/11/08(土) 23:45:15
doragonってw

それはともかく、doragonに実体がねーよ。
576デフォルトの名無しさん:2008/11/08(土) 23:45:35
ドラゴンにメモリ確保してないから

追加 doragon = (struct test *)malloc(sizeof(struct test));
修正 doragon->A=(int **)malloc(sizeof(int *)*10);
577デフォルトの名無しさん:2008/11/08(土) 23:46:48
A[i][j]はdoragon->A[i][j]のミスでいいのかな?
578デフォルトの名無しさん:2008/11/08(土) 23:46:53
大きさ的にエラーの原因ではないだろうが
前者のsizeof(int)もおかしいね
579デフォルトの名無しさん:2008/11/08(土) 23:47:04
>>574
doragon = malloc(sizeof(struct test)); を最初のほうに追加。

それと
doragon->a = (int **)malloc(sizeof(int*) * 10);
にしたほうがいい。
580デフォルトの名無しさん:2008/11/09(日) 00:37:58
>>577すいませんミスでした
>>578
>>579
>>576
ありがとうございました1できました。
581デフォルトの名無しさん:2008/11/09(日) 02:56:28
char型に入力された英文字によって処理を変えるプログラムを作りたいのですが

char com;

if (com == A || a)
{
・・・
}

などと書くとエラーが出てしまいます
Aまたはaの時に処理をしたい、という場合はどのように書けばいいのでしょうか?
582デフォルトの名無しさん:2008/11/09(日) 02:58:24
>>581
Aでなく'A'と比較です。
583デフォルトの名無しさん:2008/11/09(日) 02:58:57
if (com == 'A' || com == 'a')

入門書か、そこらのサイト一通り読んだほうがいいと思う
584デフォルトの名無しさん:2008/11/09(日) 03:07:19
>>582>>583
ほんと初歩的な事で申し訳ありません・・
ありがとうございます
585デフォルトの名無しさん:2008/11/09(日) 03:39:59
転職で会社探してたときだけど
全ての社員がrailsしかできないベンチャー会社なら見たぜ
市販のrailsの本で勉強して会社作りましたとさ
情報工学なんかを学んでる人もいないし
Javaは時代遅れだ、とおっしゃっておられました
こんなんで仕事請けられる時代になったんだね
586デフォルトの名無しさん:2008/11/09(日) 03:40:42
すまん。超誤爆だ
587デフォルトの名無しさん:2008/11/09(日) 04:13:59
誤爆レス。
RoRが廃れたらどこいくんだろうね。
それでもRoRにしがみつくって展開になるんだろうけど。
588デフォルトの名無しさん:2008/11/09(日) 08:20:02
まぁ、COBOLしかできないのを売りにしている会社もあることだし。
589デフォルトの名無しさん:2008/11/09(日) 08:42:25
ファイルの名前をループして作っていくときに
001
002
...
010
という形にしていきたいんだけどどうすればいいんですかね。
590デフォルトの名無しさん:2008/11/09(日) 08:49:13
%03d
591デフォルトの名無しさん:2008/11/09(日) 10:29:39
switchで処理を分岐するより関数ポインタの配列使ったほうが早いの?
592デフォルトの名無しさん:2008/11/09(日) 10:34:16
>>591
ケースバイケース。そこがボトルネックになることが判っているのなら、実測してみるしか。
まぁ、大抵はそういうケースがボトルネックになることはないと思うが。
593デフォルトの名無しさん:2008/11/09(日) 13:08:25
char *p = "dagane";
char *p2 = "dagane";
とした場合アドレスは同じになりますか?
594デフォルトの名無しさん:2008/11/09(日) 13:21:35
どのアドレスか知らないが、
char型へのポインタpとchar型へのポインタp2のそれぞれの値および変数のアドレスなら、
いいえ、違います。それは、ペスです。

char型へのポインタpの値と代入による初期化をしているp = の右辺値の文字列リテラルである"dagane"の値('d'のアドレス)なら、
はい、同じです。p2も同様にして導かれる。

まぁ、試してみればわかることだろ。
595デフォルトの名無しさん:2008/11/09(日) 13:37:34
'd'のアドレスは同じなのにp p2の値はことなるんだ
596デフォルトの名無しさん:2008/11/09(日) 13:38:51
ああ、pの値と'd'のアドレスが同じって書いてたのか
読み間違いスマソ。
597デフォルトの名無しさん:2008/11/09(日) 14:33:36
環境依存じゃね?
2つ作るのと1つを使うものがある
598デフォルトの名無しさん:2008/11/09(日) 14:52:52
http://akita-nct.jp/yamamoto/lecture/2004/5E/linear_equations/how_to_make_GJ/html/node2.html

ここの一番したのソースなんですが、 double a[][MAXN+10]という引数を使う理由がわかりません double a[][MAXN]ではダメなんでしょうか?
コンパイラにも警告されますし・・・
599デフォルトの名無しさん:2008/11/09(日) 15:01:27
警告はでないと思うんだけどMAXNに変数つかってる
600デフォルトの名無しさん:2008/11/09(日) 15:02:30
る?
601デフォルトの名無しさん:2008/11/09(日) 15:26:29
>>598
要素数MAXN+10の配列へのポインタを受け取るからに決まってる

なぜ最初から10込みでMAXNを宣言しないのかは知らないけど、
バッファオーバーランに悩まされた経験のある古いタイプのプログラマで
+??というセーフマージン(と称するもの)を取る習慣がついてるタコの一派がいるので、
そのたぐいかもしれない
602デフォルトの名無しさん:2008/11/09(日) 15:36:30
>>599
#define MAXN 10 みたいにやってます


警告無視して実行したら、落ちます・・・
603デフォルトの名無しさん:2008/11/09(日) 15:39:00
警 告 の 内 容 ぐ ら い 読 め
604デフォルトの名無しさん:2008/11/09(日) 15:40:10
>602は赤信号で道路を渡って車に轢かれて死ぬタイプ
605デフォルトの名無しさん:2008/11/09(日) 15:50:19
warning C4048: 'double (*)[14]' と 'double [4][4]' で配列の添字が異なります。

警告はこうです

MAXN 4としました
606デフォルトの名無しさん:2008/11/09(日) 15:59:51
めんどくせーから

int gauss_jordan(int n, double a[][MAXN+10], double b[]){
 ↓
int gauss_jordan(int n, double a[][], double b[]){

にしとけ。
607デフォルトの名無しさん:2008/11/09(日) 16:03:11
それだとコンパイルとおりません・・・
608デフォルトの名無しさん:2008/11/09(日) 16:04:18
通るようにしろ。
609デフォルトの名無しさん:2008/11/09(日) 16:05:35
情報が断片的過ぎてアドバイスできない。
610デフォルトの名無しさん:2008/11/09(日) 16:06:25
int gauss_jordan(int n, double a[][MAXN], double b[]){

こうっすかね?
でもコンパイルは通るんですが、実行すると逆行列がないってなるんですが・・・

double a[4][4]={{2,-2,4,2},{2,-1,6,3},{3,-2,12,12},{-1,3,-4,4}};とかの行列で試しました
611デフォルトの名無しさん:2008/11/09(日) 16:09:06
>>610
gauss_jordan関数はそのままにして、呼び出す変数を直すべき

dobule a[MAXN][MAXN];

とかにしているなら、正しく

double a[MAXN+10][MAXN+10]:

とかにする。
612デフォルトの名無しさん:2008/11/09(日) 16:16:41
int gauss_jordan(int n, double a[][MAXN+10], double b[]){

}
int main(){

double a[MAXN+10][MAXN+10];
double b[4]={1.0};
int n=4;

a[0][0] = 2;
a[0][1] = -2;
a[0][2] = 4;
a[0][3] = 2;
a[1][0] = 2;
a[1][1] = -1;
a[1][2] = 6;
a[1][3] = 3;
a[2][0] = 3;
a[2][1] = -2;
a[2][2] = 12;
a[2][3] = 12;
a[3][0] = -1;
a[3][1] = 3;
a[3][2] = -4;
a[3][3] = 4;
if(gauss_jordan(n, a, b) == 0){
printf("singular matrix !!!\n");
exit(0);
};
} うまくいきません・・・・

613611:2008/11/09(日) 17:06:03
その関数のソース見ると、配列の添え字は1からだと
してるみたいなんで、データはこうなるかと

a[1][1] = 2;
a[1][2] = -2;
a[1][3] = 4;
a[1][4] = 2;
a[2][1] = 2;
a[2][2] = -1;
a[2][3] = 6;
a[2][4] = 3;
a[3][1] = 3;
a[3][2] = -2;
a[3][3] = 12;
a[3][4] = 12;
a[4][1] = -1;
a[4][2] = 3;
a[4][3] = -4;
a[4][4] = 4;
614デフォルトの名無しさん:2008/11/09(日) 18:08:20
質問です。

int x;
char a[64];
などとした場合に x と a[64] のアドレスが全く同じところ指してしまい
aにデータを入れると内容が破損してしまうのですが原因としては何が考えられるでしょうか。
char a[64]を char a[60]などと減らすと正常に動作します。
他の変数もいくつか宣言していますが、別のプログラムを作っていても時々このような現象が起こります。
615デフォルトの名無しさん:2008/11/09(日) 18:10:51
ソースを全部うpすると親切な人が教えてくれますよ
616デフォルトの名無しさん:2008/11/09(日) 18:11:26
>などとした場合に x と a[64] のアドレスが全く同じところ指してしまい
そんなことは有り得ません。あなた自身が何か勘違いをしているのでしょう。
必要でしたら、再現する最小限のコードを提示してみてください。
617614:2008/11/09(日) 18:19:19
>>614-616
すみません、ソースはこちらになります。

#include <stdio.h>
int main(void){
int x;
char a[64];

printf("%p\n",&x);
printf("%p\n",&a[64]);

exit(0);
}

これを実行したら下のようになります。
$ gcc -Wall hoge.c
$ ./a.out
0xbfc23df0
0xbfc23df0
618デフォルトの名無しさん:2008/11/09(日) 18:21:27
>>614
0から64まで数えるといくつある?
619デフォルトの名無しさん:2008/11/09(日) 18:22:39
アンパがいらん気がする
620デフォルトの名無しさん:2008/11/09(日) 18:25:26
>>618-619
すみません、勘違いしてました。
他の原因を探してみます。
お騒がせしました。
621デフォルトの名無しさん:2008/11/09(日) 18:26:10
ちょうどスタックの位置がxになってるのね
622デフォルトの名無しさん:2008/11/09(日) 18:28:10
a[64]と定義したら、有効なのは
a[0]〜a[63]。
最後の直後、a[64]をさすポインタは作り、比較にもちいてもいいが、
dereferenceしてはならない。
623デフォルトの名無しさん:2008/11/09(日) 19:54:50
sinxの級数展開を5項まで求めるプログラムを作っているんですが、項数と角度を渡すと値を返すような定義関数って作れますか?
624デフォルトの名無しさん:2008/11/09(日) 20:36:32
while(fgets(buf,sizeof(buf),fp) != NULL){

 }

これはどういう意味ですか?
625デフォルトの名無しさん:2008/11/09(日) 20:42:15
>>591
関数ポインタを使っても、関数ポインタを選ぶのにswitch 〜 caseと等価な判定が入る。
626デフォルトの名無しさん:2008/11/09(日) 20:44:06
>>624
わかりづらい
これだからCは嫌になる
627デフォルトの名無しさん:2008/11/09(日) 20:53:13
fgetsの戻り値とNULLを比較してるだけ
628デフォルトの名無しさん:2008/11/09(日) 20:54:06
>>624
fpから1行入力して、読めている間はループ。
629デフォルトの名無しさん:2008/11/09(日) 20:54:08
>>624
fgets(buf,sizeof(buf),fp) != NULL が0でない間ループを繰り返すという意味
630デフォルトの名無しさん:2008/11/09(日) 20:54:45
>>623
作れるよ
631デフォルトの名無しさん:2008/11/09(日) 20:55:47
>>624
fgetsがNULLを返さないというのがループを継続する条件。
基本的に、ファイルを最後まで読みこんだときfgetsはNULLを返すので、
ようするに全部読み込むまでループを続けるということ。

>>626
それでもwhile ((c = getc(fp)) != EOF)に比べれば遥かにましだと思う。
632624:2008/11/09(日) 20:55:55
ありがとございます。そのループ内で


while((cp = strtok(cp," \t\r\n")) != NULL){
tmp[cnt++] = atof(cp);//文字列cpをdouble型とする
        cp = NULL;


}

というwhile文を回したいんですが、空白の行は飛ばされますか?

横にdoubleの20個のデータがあってそれをtmpに入れています
633デフォルトの名無しさん:2008/11/09(日) 21:00:16
>>631
while (fread(&c, 1, 1, fp) == 1)
// ただし、cはintではなくcharでなければならない。
634624:2008/11/09(日) 21:03:41
空白の行があると、前の行のデータがもう一度読まれる気がするんです
635623:2008/11/09(日) 21:05:00
>>630
すいません
どんな感じで作ればいいのでしょうか?
636デフォルトの名無しさん:2008/11/09(日) 21:08:49
宿題ものよりひでえ質問だな
637デフォルトの名無しさん:2008/11/09(日) 21:11:40
>>632
空白行を読み飛ばすのは自分でやらんとダメ。
それと、strtok()を使うくらいならsscanf()を使った方がいい。
638デフォルトの名無しさん:2008/11/09(日) 21:17:48
横にデータ数が多いと

sscanf(buf,"%lf %lf %lf %lf・・・・・・・・・・",&tmp[0],&tmp[1],&tmp[2],&tmp[3]・・・・・・・・・);

みたいに長くなっちゃうかなぁと思ってstrtok使ったんですが・・・
639デフォルトの名無しさん:2008/11/09(日) 21:25:54
>>638
http://www.kt.rim.or.jp/~kbk/zakkicho/08/zakkicho0809b.html#D20080914-4
こういうやり方なら、行の中で、ループでまわして読める。
640デフォルトの名無しさん:2008/11/09(日) 21:36:03
switch caseって長くなるの、なんとかなんないの

キーボードから入力されるアーファベットで分岐させるとしても、
小文字だけ見ても26個もcase作らないといけないじゃない

これはスマートではない!
641デフォルトの名無しさん:2008/11/09(日) 21:38:21
アーファベットをキーにしてジャンプテーブルを作ればいいじゃん
642デフォルトの名無しさん:2008/11/09(日) 21:40:44
>>640
アルファベットごとにそれぞれ違う処理するなら、どうかいても長くなるじゃん。
643デフォルトの名無しさん:2008/11/09(日) 22:04:30
C++でCの入出力使うのはダサい?
644デフォルトの名無しさん:2008/11/09(日) 22:11:54
ダサいといえばダサい
C++ならC++の入出力のほうがいい
645デフォルトの名無しさん:2008/11/09(日) 22:13:02
まぁ好きにすればいんじゃね
646デフォルトの名無しさん:2008/11/09(日) 22:19:01
>>643
ある意味 C++ らしい使い方ではある
647デフォルトの名無しさん:2008/11/09(日) 22:19:13

1×4行列Aがa[4]に、4×4行列Bがb[4][4]に入っています。

このときA×Bの1×4行列をc[4]に入れたいんですが・・・
どう書けばいいんですか?


for(i=0; i<4; i++){
for(j=0 ;j<4; j++){
c[j] += (a[i] * b[j][i]);

}
}

かなと思ったんですが、なんか違うきがします
648デフォルトの名無しさん:2008/11/09(日) 22:21:25
それ以前に掛け算できなくね?その組み合わせ
649デフォルトの名無しさん:2008/11/09(日) 22:26:14
for(i=0; i<4; i++){
for(j=0 ;j<4; j++){

c[i] += ( a[j] * b[j][i] );

}
}

こうですか?
650デフォルトの名無しさん:2008/11/09(日) 22:27:59
>>648
えっと
行列の掛け算が定義できないという意味ですか?

(a1 a2 a3 a4)(x11 x12 x13 x14)
(x21 x22 x23 x24)
(x31 x32 x33 x34)
(x41 x42 x43 x44)

で出来るとおもうんですが。。
651デフォルトの名無しさん:2008/11/09(日) 22:33:42
if(color<=15){
newpen(win,color);
color=color+1;
}
else{
color=1;
}


↑これだと15番目?の色が連続になってしまうのですが、理由が分かりません
なぜ1、2、3・・・14、15、1、2、・・・とならないのでしょうか?
652デフォルトの名無しさん:2008/11/09(日) 22:37:25
日本語でおk
653デフォルトの名無しさん:2008/11/09(日) 22:42:29
>>651
elseのときにnewpenしてないからじゃね?
654デフォルトの名無しさん:2008/11/09(日) 22:43:56
>>647
まあ合ってそうな感じ
Bのi行j列の要素がb[i][j]で得られるとする
(逆ならiとjを入れ替えて)

まず要素一つぐらい手計算
c[0] = a[0]*b[0][0] + a[1]*b[1][0] + a[2]*b[2][0] + a[3]*b[3][0]

つまり、c[j]は
c[j] = a[0]*b[0][j] + a[1]*b[1][j] + a[2]*b[2][j] + a[3]*b[3][j]

さらにまとめるなら、ループ変数iを用いて
c[j] = a[i] * b[i][j]
655デフォルトの名無しさん:2008/11/09(日) 22:48:51
>>653
すみません、elseでnewpenしなくてもいける気がするのですが。。。
あと、

if(color<=15){
color=color+1;
}
else{
color=1;
}
newpen(win,color);

↑このようにしても同じ色が連続できました。。。
なぜですか;;
656デフォルトの名無しさん:2008/11/09(日) 22:54:02
変数の変化をよく考えてみれ
657デフォルトの名無しさん:2008/11/10(月) 00:42:49
解決しました、ありがとう
658デフォルトの名無しさん:2008/11/10(月) 04:14:00
char * disp_bn(int n)
{
char * c;
int i;
const int BS = sizeof(n)*8;
c = (char*)malloc(BS);

for (i=BS; i>0; i--) {
if(n&(1<<(i-1)))
c[abs(i-BS)]='1';
else
c[abs(i-BS)]='0';
}
return c;
}

intを2進数の文字列にする関数なんですが、もっと上手くて鮮やかな方法ってないでしょうか?
659デフォルトの名無しさん:2008/11/10(月) 04:23:37
そもそも完成してなくね
660デフォルトの名無しさん:2008/11/10(月) 04:25:50
動いてるのか知らんが、if-elseどけて、bit+'0'みたいな方法でいいんじゃね?
661デフォルトの名無しさん:2008/11/10(月) 04:35:18
char * disp_bn(int n)
{
char * c;
int i;
const int BS = sizeof(n)*8;
c = (char*)malloc(BS);

for (i=0; i<BS; i++)
c[i] = (n&(1<<(BS-i-1))) ? '1' : '0';
return c;
}
見通し悪かったのでちょっと直しました。absとか要らなかったです。

>>660
それはどういう意味でしょうか?
662デフォルトの名無しさん:2008/11/10(月) 04:44:43
こういうことじゃないか?
c[i] = (n&(1<<(BS-i-1))) + '0';
663デフォルトの名無しさん:2008/11/10(月) 04:46:27
>>662
はーなるほど。'0'をunsigned charとして扱うわけですね。勉強になりました。
664デフォルトの名無しさん:2008/11/10(月) 05:53:03
それはいいけど、ナル文字ターミネートしてなくて使いにくくない?
もう一つついでに言えば、ループ内で毎回ビットシフトするのも効率悪そうだし。
最下位ビットをチェックして後ろから詰めていけばいいじゃん。
665デフォルトの名無しさん:2008/11/10(月) 06:21:01
2進文字列に変換させるだけの関数でmallocしたままメモリを放置プレーするは
お勧めしないよ。
呼び出し側で char buf[sizeof(int)+1] とでもしておいて引数で渡す方がいいよ。
666665:2008/11/10(月) 06:41:02
あースマン、char buf[sizeof(int)*8+1]; に訂正だね。
char * disp_bn(int n, char *buf)
{
 int i;
 for ( i = 0; i < sizeof(int)*8; i++ )
   buf[i] = (n&(1<<(BS-i-1))) ? '1' : '0';
 buf[i] = '\0';
 return buf;
}

他は特に問題になるところは無いからいいんじゃね?
(個人差による手癖は気にしていない)
レビュー終了。
667デフォルトの名無しさん:2008/11/10(月) 08:27:15
えらそうに言うならもう少しちゃんと見ろよw
668デフォルトの名無しさん:2008/11/10(月) 12:51:32
void disp_bn(unsigned n, char * buf)
{
char * p = buf + sizeof(int) * 8;
* p = '\0';
do {
* --p = (n & 1) ? '0' : '1';
n /= 2;
} while (p != buf);
}
669665:2008/11/10(月) 15:50:57
>>667
最近は別なところが忙しくてコードのレビュー量が減っててw スマソ
670デフォルトの名無しさん:2008/11/10(月) 16:23:49
画像ファイルを読み込みたいのですが下のようにすると読み込み後のデータが減っています。
バイナリエディタで確認したところ、どうやら 00 にあたる部分が消失しているようです。
00も正常に読み込ませるにはどのようにしたら良いでしょうか?

char a;
while(fread(&a, 1, 1, fp){
---処理---
}
671デフォルトの名無しさん:2008/11/10(月) 16:26:01
普通に読むよ。確認のしかたが悪いんじゃない?
672デフォルトの名無しさん:2008/11/10(月) 16:35:31
>>670
fread()は1,1で使っちゃダメ。それくらいなら、fgetc()を使うべき。
673デフォルトの名無しさん:2008/11/10(月) 16:42:36
助けて下さい
674デフォルトの名無しさん:2008/11/10(月) 16:45:25
どうしたんだい?
何でも言ってごらん
675デフォルトの名無しさん:2008/11/10(月) 16:48:54
場合によっては110番を視野に入れた方がいいよ
676デフォルトの名無しさん:2008/11/10(月) 17:27:41
>>671-672
ありがとうございます。
freadをfgetcに変えましたが変化はありませんでした。
画像も複数のファイルを用意して試してみたのですが
やはり 00 にあたる部分だけが消失してしまいます。

FILE *fp;
int c;

fp = fopen("ファイル", "r");
while((c = fgetc(fp)) != EOF){
---処理---
}
fclose(fp);
677デフォルトの名無しさん:2008/11/10(月) 17:39:31
だからなんで00が入ってないことを判断した部分を書かないの?
678デフォルトの名無しさん:2008/11/10(月) 17:40:10
>>676
ファイルのオープンモードをバイナリにするため、以下のように、fopen の第2引数を変更してみそ。

 fp = fopen( "ファイル", "r" );
  ↓
 fp = fopen( "ファイル", "rb" );
679デフォルトの名無しさん:2008/11/10(月) 17:40:52
あとバイナリーデータなら "rb" で。
改行コードと同じ数値があると減るぞ。
680デフォルトの名無しさん:2008/11/10(月) 17:41:44
>>677
釣りだからに決まってる
681デフォルトの名無しさん:2008/11/10(月) 17:50:34
>>677
すみません、ループ中にダンプ処理を加えて確認したところ
正常に読み込んでいましたが
ご指摘頂いたループ中の他の処理に問題があるようです。

FILE *fp;
int c;
char a[256];
char b[10240];

fp = fopen("ファイル", "r");
while((c = fgetc(fp)) != EOF){
sprintf(a,"%c",c);
strcat(b,a);
}
fclose(fp);

>>678->>679
バイナリモードでも結果は同じでした。
682デフォルトの名無しさん:2008/11/10(月) 17:53:04
まあstrcatがあると思ったわ・・・
str系は0x00は終端扱いするからバイナリーデータに0が含まれてると扱えないぞ。
普通に配列用意してそこに入れていこう。つーか、配列用意したらfread()で一発で読めるけどな。
683デフォルトの名無しさん:2008/11/10(月) 17:53:38
00は終端文字列になるからだろ
684デフォルトの名無しさん:2008/11/10(月) 18:06:28
>>682->>683
ありがとうございます。
freadにしたところ最初の 00 の部分で終了してしまい数バイトしか読めませんでした。

a[10240]
fread(a,sizeof a,1,fp);
printf("%s",a);
685デフォルトの名無しさん:2008/11/10(月) 18:15:38
count = fread(a,1,sizeof a,fp);
for (i = 0; i < count; ++i) {
printf("%02X", a[i]);
}

くらいやってみ
686デフォルトの名無しさん:2008/11/10(月) 18:17:35
>>684
printfするなwwwww
687デフォルトの名無しさん:2008/11/10(月) 18:30:10
>>686
なんで?
688デフォルトの名無しさん:2008/11/10(月) 18:31:21
>>687
どこまで読み込んだか確認のために出力してるんだよな?
689デフォルトの名無しさん:2008/11/10(月) 18:31:26
0x00で止まるからだろw
>>680正解なのか
690デフォルトの名無しさん:2008/11/10(月) 18:31:49
>>685->>>686
すみません、正常に読み込めました。
勉強になりました。
アスキーコードに変換せずバイナリのまま配列に渡すことは不可能でしょうか?
691デフォルトの名無しさん:2008/11/10(月) 18:33:52
memcpyとか
692デフォルトの名無しさん:2008/11/10(月) 19:40:12
直接fread()で読めばいいじゃん。
693デフォルトの名無しさん:2008/11/10(月) 19:41:41
test
694デフォルトの名無しさん:2008/11/10(月) 20:09:42
まず文字列から勉強しなおせ
695デフォルトの名無しさん:2008/11/10(月) 20:24:38
バイナリで扱いたいデータは、文字列を扱う関数に放り込んではいけない。
それだけのこと。
696デフォルトの名無しさん:2008/11/10(月) 20:26:26
バイナリと文字列を混在させる必要がある場合は?
697デフォルトの名無しさん:2008/11/10(月) 20:27:33
バイナリとして扱えば?
698デフォルトの名無しさん:2008/11/10(月) 20:47:25
>>696
まず文字列がなんだかわかっているのか?
699デフォルトの名無しさん:2008/11/10(月) 20:54:03
アスキーコードに変換って何のことを言ってるの?
データ自体は変換なんかされないよ?
700デフォルトの名無しさん:2008/11/10(月) 22:21:31
よろしくお願いします。
defineできった文字列は必ずnull保障されますでしょうか?
701デフォルトの名無しさん:2008/11/10(月) 22:24:24
日本語でOKあるよ。
702デフォルトの名無しさん:2008/11/10(月) 22:37:21
>defineできった
意味不明
>null保障
意味不明
703デフォルトの名無しさん:2008/11/10(月) 22:59:08
>>702
これくらい察せカスwwwww
>>700の日本語微妙だけど、まぁ言いたいことわかるよ。確かにそういう言い方するの聞いたことあるよ。
マクロ定義は型が保障されてないからね〜どうなんだろ〜
俺の認識ではNULL保障されてると思うんだが。
704デフォルトの名無しさん:2008/11/10(月) 23:01:30
まぁおちつけ
705デフォルトの名無しさん:2008/11/10(月) 23:03:11
NULL保障ってなんだよ。
706デフォルトの名無しさん:2008/11/10(月) 23:05:59
なんだろうな
教えてエロい人
707デフォルトの名無しさん:2008/11/10(月) 23:09:16
ヒント:C言語の文字列
708デフォルトの名無しさん:2008/11/10(月) 23:21:29
NULLターミネートされるかどうかって事なんかなあ
709デフォルトの名無しさん:2008/11/10(月) 23:25:05
ターミーネーターって
710デフォルトの名無しさん:2008/11/10(月) 23:25:57
もうぬるぬるなの。
711デフォルトの名無しさん:2008/11/10(月) 23:42:32
NULL保障ってどこの言語?
少なくともCではない
712デフォルトの名無しさん:2008/11/11(火) 00:02:35
NULLであることを保障する意義・必要性のある言語……?
わかったぞ!つまりはGCがある言語、オブジェクト指向の言語だ
したがってCではないのだよ!
713デフォルトの名無しさん:2008/11/11(火) 00:07:53
>>700
> defineできった文字列は必ずnull保障されますでしょうか?
#defineで定義された文字列定数の最後は
必ずヌル文字\0がついているでしょうか。
だろ?
714デフォルトの名無しさん:2008/11/11(火) 00:12:36
必ずナルターミネートされるかと言う質問なら、defineを使うかどうかに関わらず、必ずされるわけではないという回答になります。
例えば、#define FOO "foo"した場合にputs(FOO FOO);という使い方もできるわけですから。
715デフォルトの名無しさん:2008/11/11(火) 00:26:42
ターミネーターって何をターミネートする人なんだろ。
716デフォルトの名無しさん:2008/11/11(火) 00:38:57
>>713 は、入所相談員とかで福祉施設や精神科病院にすぐにでも転職できるぞw
717デフォルトの名無しさん:2008/11/11(火) 00:44:51
SCSI全盛の頃、終端の装置にアレ取り付ける際に

「ダダンダンダダン ダダンダンダダン」って言いながらつける奴が

必ずいたもんだ
718デフォルトの名無しさん:2008/11/11(火) 00:46:09
それはない
719デフォルトの名無しさん:2008/11/11(火) 00:51:32
>>714
それは " " でくくられた文字列が連続した場合には、連結される、という意味ですから‥‥‥。
たしかにおっしゃるとおりですね。:-)
720デフォルトの名無しさん:2008/11/11(火) 00:52:30
>>716
それはあなた。
721デフォルトの名無しさん:2008/11/11(火) 00:53:47
>>720
コラ!
722デフォルトの名無しさん:2008/11/11(火) 01:00:03
みんなどの程度のプログラム作れるの?
723デフォルトの名無しさん:2008/11/11(火) 01:01:42
hello worldとか
724デフォルトの名無しさん:2008/11/11(火) 01:04:18
hello woodとか
725デフォルトの名無しさん:2008/11/11(火) 01:09:44
gcc: hello.c: No such file or directory とか
726デフォルトの名無しさん:2008/11/11(火) 02:40:32
coreファイル作成プログラムなら作れると思う。
あんまり自信ないけど。
727デフォルトの名無しさん:2008/11/11(火) 04:54:24
読み込んだファイルがテキストかバイナリか判定するにはどうすればいいですか?
728デフォルトの名無しさん:2008/11/11(火) 08:13:19
>>727
よーく考えると分かると思いますが、ファイル自体にはテキストやバイナリを区別する仕組みは無いのですよ。
あなたも、「このファイルの中身ががテキストかバイナリかどうか・・・。」を判断するには、まず拡張子などで
見当を付けていると思います。
そして、テキストエディタで開いて画面に表示された内容を見て何気なく「ああ、やっぱりテキストだな。」とか
「なんだこの変な記号や文字の羅列は! もしかしてバイナリ?」というように判断してると思います。

プログラムで判断するなら、このような仮定と推測をそのままプログラムで書くしかないです。
729デフォルトの名無しさん:2008/11/11(火) 12:47:23
>>727
極端な話「ほげ」とだけ書かれたファイルがあったとします
「ほ」には今日の全為替相場の意味があり「げ」には
去年の地球の地軸の傾きの意味があるかもしれません
ビット列に割り当てる意味は無限に存在するので判定はできません
周りの情報によって推測できるだけです
730729:2008/11/11(火) 13:09:48
それでは何にも判定できないということになってしまうのでどんな推測をするかですが
ビット列のパターン全てに意味を割り当てていないようなデータの場合
データのパターンに偏りが生じます
例えば奇数バイトは最下位ビットが立たないとか
そいういった特徴を判定することで高確率でデータを判定できます
テキストデータの場合は言語や文字コードで特徴が異なるので
判定したい文字コードの特徴を調べてみて下さい
731デフォルトの名無しさん:2008/11/11(火) 13:25:31
全く、入門編スレで何を偉そうに語っているんだか。
>727が何をしたいのかにも拠るが、先頭に特徴的なヘッダがあればそのデータ、
そうでなくて非可読文字があればその他のバイナリ、そうでなければテキストってことで通常は充分だろ。
732デフォルトの名無しさん:2008/11/11(火) 13:42:16
+ ;
* ☆_+
: , xヾ:、__,..-‐‐:、、,へ.........._
         く '´::::::::::::::::ヽ
          /0:::::::::::::::::::::::',  テキストファイルからBOMを拾ってくるのですね
       =  {o:::::::::(´・ω・):::}
         ':,:::::::::::つ:::::::つ
      =   ヽ、__;;;;::/
           し"~(__)
733デフォルトの名無しさん:2008/11/11(火) 13:58:51
ってゆーかスレ違いもはなはだしいだろ
734デフォルトの名無しさん:2008/11/11(火) 14:22:18
鼻肌C
735デフォルトの名無しさん:2008/11/11(火) 15:56:35
perlの-Tを参考にしてみては
736デフォルトの名無しさん:2008/11/11(火) 16:07:42
文字コードなんて嫌いだ
737デフォルトの名無しさん:2008/11/11(火) 20:05:41
そういやLinuxはファイルの種別を拡張子で判別してないよな。
738デフォルトの名無しさん:2008/11/11(火) 20:08:14
そもそも拡張子なんて窓だけのものだし
739デフォルトの名無しさん:2008/11/11(火) 20:38:17
それは言いすぎだろw
740デフォルトの名無しさん:2008/11/11(火) 20:42:39
下のプログラムで配列の要素がすべて0になるんだけど
int_set関数で配列vc[]をすべて0にしてるけど、それがmain関数の
配列ary[]になんで反映されるの?
int_set関数で何をしようがvc[]には反映されないんじゃないの?
ary配列をグローバル変数?にしてなら反映されるのはわかるんだけど。



#include <stdio.h>

void int_set(int vc[],int no){
int i;
for(i = 0;i < no; i++)
vc[i] = 0;
}

int main (void){
int i;
int ary[] = {1,2,3,4,5};
int_set(ary,5);
for(i = 0;i<5;i++)
printf("ary[%d]=%d\n",i,ary[i]);
return 0;
}
741740:2008/11/11(火) 20:44:04
追記
ある関数内での処理をmain関数に反映させるには(返り値ではなく)
ポインタを使ってやると学校では習ったんだけど・・・
742デフォルトの名無しさん:2008/11/11(火) 20:49:19
引数のint vc[]はint *vcと同じだから
743デフォルトの名無しさん:2008/11/11(火) 20:50:55
配列を全てコピーするのは手間なので、先頭のアドレスを渡してる
744デフォルトの名無しさん:2008/11/11(火) 20:51:36
そう、逆説的に言えば、つまりそれはポインタだということ。
関数の仮引数では、最外周の配列はポインタに変えられるという決まりなので、
int *vcと書くのと同じ、関数の仮引数においてのみだが。
745デフォルトの名無しさん:2008/11/11(火) 20:54:04
スレマトメテチョ
746740:2008/11/11(火) 20:57:21
なるほど、そういえば思い出しました。
学校である関数内で処理をしてもmain関数に影響しないみたいな例は
配列ではなくただのint i;とかでした。
740のプログラム例でいうと仮にint no の変数noをint_set関数内で変えても
main関数には反映はされないとかいう例でした。
747デフォルトの名無しさん:2008/11/11(火) 21:03:35
>最外周の配列は
正確には、Cには多次元配列というものはない(配列の要素に配列をとることができるだけ)ので、
最外周とか言わずにただ配列でいい
748デフォルトの名無しさん:2008/11/11(火) 21:07:01
引数と仮引数は型が同じでないといけないんですよね?
int_set(ary,5);と書くと
aryはたしか配列の先頭の要素のアドレス(&ary[0])と習いました。
void int_set(int vc[],int no)
の int vc[]は単に配列を宣言をしているように見えるのですが、
関数の仮引数においてのみ記述形式が異なる

みたいなことを>>744さんは言われてるということでいいんですか?
749デフォルトの名無しさん:2008/11/11(火) 21:23:26
C言語では、親分から子分へ関数の引数として配列の中身を丸ごと渡せない仕様でしたので、

親方: 「代わりに配列の先頭アドレスをポインタの値で渡してやろう。後は頼んだぞ!」
子分: 「へい、おいらはそのポインタの値を配列の先頭アドレスとして扱えばいいんですね。」

というように、ポインタ(コピー値)で渡すのです。その結果、配列データというオブジェクトの観点で
見ると、値型でなくてポインタによる参照型の振る舞いになるんです。
750デフォルトの名無しさん:2008/11/11(火) 21:31:20
あーまたアレが沸くんだろうなぁw
751デフォルトの名無しさん:2008/11/11(火) 21:32:13
なんとなくわかったと思います。
2次元配列に値を入力したいのですが

scanf("%s",ma[i][j]);

これでやるとうまくいかないのですが、
scanfで調べたところ%sのときはポインタを渡すとあったので
&ma[i][j]とやったのですが、これでもうまくいきません。
どうすればいいんでしょうか?
752デフォルトの名無しさん:2008/11/11(火) 21:35:43
%sは文字型配列の先頭へのポインタを要求するから
maがchar ma[][][]と宣言されていないとうまくいかない
753デフォルトの名無しさん:2008/11/11(火) 21:50:42
>>750
そう書いて湧くのをのを待ってんのか?w
754デフォルトの名無しさん:2008/11/11(火) 21:55:06
フォントが豆腐になったのかと思った
755デフォルトの名無しさん:2008/11/11(火) 22:04:34
まだ勉強し始めですが、少し不安に思うところがあります。

C#やVBには小数点数の丸め誤差がない「Decimal」や「Currency」といった型がありますが、
C言語にはfloat, double しか無いとのこと。
十進による固定小数点/浮動小数点演算をする場合どうするんですか?

データに10000かけて、計算後に10000で割る、とかいうみっともない方法しかないんでしょうか
756デフォルトの名無しさん:2008/11/11(火) 22:06:40
>>755
他の方法はあるけど、どのみちその型はないので自分でなんとかするかライブラリ利用するしかないね
757デフォルトの名無しさん:2008/11/11(火) 22:21:54
>>755
256掛けて256でわると、ちょとカコイイよ!
758デフォルトの名無しさん:2008/11/11(火) 22:22:37
2つのボールがぶつかり跳ね返る条件式が分かりません
ボールA の X座標軸を xa  Y座標軸を ya
ボールB の X座標軸を xb  Y座標軸を yb
として、どのような条件でそれぞれのボールの加速度を逆にすればよいですか?
互いのボールの半径は10としてお願いいます
759デフォルトの名無しさん:2008/11/11(火) 22:23:42
固定小数点も浮動小数点も、ふつーは十進じゃなけどな。
760デフォルトの名無しさん:2008/11/11(火) 22:26:54
>データに10000かけて、計算後に10000で割る、とかいうみっともない方法しかないんでしょうか

VBのCurrencyも内部的には同じようなことやってんじゃね?
761デフォルトの名無しさん:2008/11/11(火) 22:27:30
でもVBのCurrencyは10000基準なんだな。
762デフォルトの名無しさん:2008/11/11(火) 22:43:01
どこかでみっともない処理をやってるもんだよ
763デフォルトの名無しさん:2008/11/11(火) 22:47:45
abcdなど?
764デフォルトの名無しさん:2008/11/11(火) 22:50:11
>>758
用途によって条件式なんて変わるもんでしょ。
物理だかゲ製だかの板にでも行けば?
765デフォルトの名無しさん:2008/11/11(火) 22:51:51
>>764
一番単純な方法で構いません、、、お願いします
766デフォルトの名無しさん:2008/11/11(火) 22:53:41
条件そのものはCの話ではない
条件をお前が理解した上で、それをどう記述していいかわからないならともかく
767デフォルトの名無しさん:2008/11/11(火) 23:03:21
>>765
接触の瞬間境界面の直線対してに線対称に速度ベクトルを変換

768デフォルトの名無しさん:2008/11/11(火) 23:06:38
>>758
まず数学を勉強しなおすこと
769デフォルトの名無しさん:2008/11/11(火) 23:08:16
>>767
速さと質量一緒じゃないとそれダメじゃね?
770デフォルトの名無しさん:2008/11/11(火) 23:12:36
>>758です
それぞれの中心からの距離が20になったら加速度を逆にすればいいんですよね?
(xa-xb==10) && (ya-yb==10) の時に加速度を逆にすればいいのですか?
771デフォルトの名無しさん:2008/11/11(火) 23:13:42
>(xa-xb==10) && (ya-yb==10) の時に加速度を逆にすればいいのですか?
だから数学からやりなおせっての
772デフォルトの名無しさん:2008/11/11(火) 23:14:14
C以前の問題
773デフォルトの名無しさん:2008/11/11(火) 23:14:36
774デフォルトの名無しさん:2008/11/11(火) 23:15:03
>>770
数学板行け
775デフォルトの名無しさん:2008/11/11(火) 23:15:09
コンパイルしたら、
「配列または、ポインタでない変数に添字が使われました」って怒られました。
この場合どこを直せばいいのでしょうか?
776デフォルトの名無しさん:2008/11/11(火) 23:16:21
>>775
ソース貼れよ
777デフォルトの名無しさん:2008/11/11(火) 23:16:36
>>775
怒られたところを見て、それに関連するところを直せばいいよ
778デフォルトの名無しさん:2008/11/11(火) 23:17:07
>>775
エラーに行番号くらいついてくるだろ
779デフォルトの名無しさん:2008/11/11(火) 23:22:53
加算 +
減算 -
乗算 * は分かるのですが、二乗とルートの記号が分かりません
どなたか教えてください
780デフォルトの名無しさん:2008/11/11(火) 23:24:00
そんなものありませんよ。ファンタジーやメルヘンじゃないんだから
781デフォルトの名無しさん:2008/11/11(火) 23:25:53
2つの図形を同時に描写したいのですが、
1つめの図形が消えた後でないと2つめの図形が表示されません
1つめの図形が表示されてる間(sleepで止めています)
解決法をお願いします
782デフォルトの名無しさん:2008/11/11(火) 23:26:37



どうしても多次元配列のイメージが出来ないのですが
どうしたらいいですか。


2次元配列 縦と横 Y軸とX軸
3次元配列 x個の家の中にそれぞれ2次元配列がある

4以上は
わかりもはん
783デフォルトの名無しさん:2008/11/11(火) 23:27:17
>>780
知りませんでした・・・
ありがとうございました
784775:2008/11/11(火) 23:27:55
これがソースです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8010.txt
20,22,23,52,54行目がエラーでした。お願いします。
785デフォルトの名無しさん:2008/11/11(火) 23:35:29
t=0.0,x[1]=2.0;x[2]=0.0;x[3]=0.0;x[4]=0.5;
786デフォルトの名無しさん:2008/11/11(火) 23:35:48
>>784
x[]は配列として定義されてないからだよね。
787デフォルトの名無しさん:2008/11/11(火) 23:37:27
>>755
みっともない方法が嫌な場合には、加減乗除の算術を10進で評価して
計算させるためのBCD計算ライブラリってのを自作するかサードパーティ
から購入するのが一般的です。

  どんなに単純な足し算も
  BCDの関数をつかえば
  ちゃんとこたえがでるよ!
                    ハ_ハ  ソースの見た目も
                  ('(゚∀゚∩ がらっと変わるよ!
                   ヽ  〈
                    ヽヽ_)
788デフォルトの名無しさん:2008/11/11(火) 23:37:53
>>779ですが、√2 はプログラム上でどのように書けばよいですか?
できれば2の100乗などもお願いします
789775:2008/11/11(火) 23:38:57
>>785
>>786
ありがとう!やってみます!
790デフォルトの名無しさん:2008/11/11(火) 23:41:38
791大輔:2008/11/11(火) 23:53:48
for文の入れ子(二重のforループ)を使って、九九の表を作成するプログラムを作りたいのですが、
どういうプログラムを組めばいいのですか?

   1 2 3 4 5 6 7 8 9
 1 1 2 3 4 5 6 7 8 9
 2 2 4 6 8 10 12 14 16 18
 3 3 6 9 12 15 18 21 24 27
 4 4 8 12 16 20 24 28 32 36
 5 5 10 15 20 25 30 35 40 45
 6 6 12 18 24 30 36 42 48 54
 7 7 14 21 28 35 42 49 56 63
 8 8 16 24 32 40 48 56 64 72
 9 9 18 27 36 45 54 63 72 81
792デフォルトの名無しさん:2008/11/12(水) 00:03:52
>>781
どなたかお願いします;;
793デフォルトの名無しさん:2008/11/12(水) 00:05:14
int kuku[9][9];

for ( int i = 0; i < 9; i++ ) {
 for ( int j = 0; i < 9; i++ ) {
  kuku[i][j] = (i+1) * (j+1);
 }
}
794デフォルトの名無しさん:2008/11/12(水) 00:05:25
>>792
どういう環境で作ってるかもわからないし、エスパーじゃないので応えれません。
795デフォルトの名無しさん:2008/11/12(水) 00:06:01
>>792
答えられる人はいないと思う。
796793:2008/11/12(水) 00:06:24
for ( int i = 0; i < 9; i++ ) {
 for ( int j = 0; j < 9; j++ ) {   ←訂正
  kuku[i][j] = (i+1) * (j+1);
 }
}
797デフォルトの名無しさん:2008/11/12(水) 00:08:32
C/C++の宿題を片付けます 117代目
http://pc11.2ch.net/test/read.cgi/tech/1225320579/l50
798デフォルトの名無しさん:2008/11/12(水) 00:14:20
fillarcで円を描いて
msleep(500)で1つめの円を止めておき
またfillarcで円を描きました
この2つの円を同時に描きたいのです;;
799デフォルトの名無しさん:2008/11/12(水) 00:15:51
fillarcでぐぐるとJavaってでてくるけど・・・
C言語だよ、ここ
800デフォルトの名無しさん:2008/11/12(水) 00:45:12
>>798
msleepで止めずに描けばいいんじゃなくて?
801デフォルトの名無しさん:2008/11/12(水) 01:16:06
fillarcがスレッドセーフで尚且つマルチスレッド対応じゃなければ描画処理がロックされて
同時(描画開始→描画終了が2つ重なる)に見える描画は無理ですよ。
802デフォルトの名無しさん:2008/11/12(水) 02:11:31
int *a[4]という宣言は何を指すのでしょうか?
803デフォルトの名無しさん:2008/11/12(水) 02:13:56
int型のポインタの配列 長さは4

決してint型の配列のポインタではない
804デフォルトの名無しさん:2008/11/12(水) 02:21:17
↑はい間違い
805デフォルトの名無しさん:2008/11/12(水) 02:26:38
↑はい間違い
806デフォルトの名無しさん:2008/11/12(水) 02:28:52
↑はい間違い
807デフォルトの名無しさん:2008/11/12(水) 02:29:02
↑はい
808デフォルトの名無しさん:2008/11/12(水) 02:30:08
>>802
int* a[4];
こうすると、、、、もう分かった?
809デフォルトの名無しさん:2008/11/12(水) 02:34:43
>>802
そういうことならここ読め。
http://kmaebashi.com/programmer/pointer.html
810デフォルトの名無しさん:2008/11/12(水) 02:43:08
>>809
読んでみます
811デフォルトの名無しさん:2008/11/12(水) 04:46:46
>>782
2 100ますノートの1ページ
3 100ますノート
4 100ますノートが入ってる本棚の1段
5 100ますノートが入ってる本棚
6 100ますノートが入ってる本棚がいっぱいある図書館

マトリョーシカを想像した方が楽か?
812デフォルトの名無しさん:2008/11/12(水) 06:19:37
>>782
多次元配列か。。。
縦・横とか、XYZ座標に置き換えて考えると3次元以降の壁が破れず破綻するぞw。
位置関係でイメージせず、論理的な入れ子で考えれば拡張できるよ。

グリコのポッキーを扱う配列を考えてみると → _Bool Pocky[r][q][p][o][n][m];
中袋(m本)、外箱(n袋)、ロット梱包(o箱)、ボール箱(p包)、パレット(q箱)、カーゴ(rパレット)
というように、カーゴ単位の膨大な本数のポッキー1本1本の有無を6次元で表現することも
へっちゃらです。
813デフォルトの名無しさん:2008/11/12(水) 06:38:22
>>812
多次元配列がイメージしにくければ2次元配列を構造体で
くるんでその構造体をさらに2次元配列にすればいいし。
814デフォルトの名無しさん:2008/11/12(水) 13:10:06
>>808
その説明はint (*a)[4]が理解できなくなるからやめとけ
815デフォルトの名無しさん:2008/11/12(水) 15:01:11
>>812
1次元だろうが多次元だろうがある塊の複数形と考えれば良い訳ですね
816デフォルトの名無しさん:2008/11/12(水) 16:33:34
テスト中orz
1.から100までの整数で3の倍数の整数の合計を求めるプログラムをFor文を利用して作ってください。
2.1の問題をForの変わりにWhile文で頼む
817デフォルトの名無しさん:2008/11/12(水) 16:36:36
>>814
それはどういう意味なんですか?
818デフォルトの名無しさん:2008/11/12(水) 16:37:51
>>817
int4個の配列へのポインタである、a。
819デフォルトの名無しさん:2008/11/12(水) 16:40:46
>>818
そんな宣言の仕方があったんですね
820デフォルトの名無しさん:2008/11/12(水) 16:54:20
え?それって意味あるの?
int *a; との違いって?
821デフォルトの名無しさん:2008/11/12(水) 17:10:08
func(int(*pa)[4]){}

int main()
{
int(*pi)[3];
func(pi);
}

警告は出るけどコンパイルはできちゃった
822デフォルトの名無しさん:2008/11/12(水) 17:22:16
2次元配列をまるごとmallocしたいときとかに使える。
void func(int pa[][4]){}
int main()
{
int (*x)[4];
x = (int (*)[4])malloc(sizeof (int [10][4]));
func(x);
}
823デフォルトの名無しさん:2008/11/12(水) 17:29:00
質問です
配列で変数を宣言したときに数値を入力しなかった変数の中身はどうなっているのでしょうか?
値を入力せずに実行すると0になったんですが
初期設定として0になってるってことですか?
824デフォルトの名無しさん:2008/11/12(水) 17:30:08
宣言した場所による。
関数内の自動変数なら不定。
825デフォルトの名無しさん:2008/11/12(水) 17:40:29
>>824
勝手に常に0だと思ってましたwww
助かりました。ありがとうございます
826デフォルトの名無しさん:2008/11/12(水) 18:16:37
構造体の下線に続くタグ名は予約済み識別子ですか?
827デフォルトの名無しさん:2008/11/12(水) 18:22:34
>>826
違う
828デフォルトの名無しさん:2008/11/12(水) 18:23:20
訂正
下線の次が大文字または下線でないかぎり、予約済みではない
829デフォルトの名無しさん:2008/11/12(水) 18:44:27
そもそもCならタグ名はアンダーバーが先行しても問題ない。
830デフォルトの名無しさん:2008/11/12(水) 18:44:47
>>828
なるほど、ありがとうございます。
831デフォルトの名無しさん:2008/11/12(水) 19:27:23
DLL2を使って実行していたプログラムからDLL1を作ることってできますか?
832デフォルトの名無しさん:2008/11/12(水) 19:42:44
日本語でおk
833デフォルトの名無しさん:2008/11/12(水) 20:02:02
>>823-825
int a[10] = {1, 2, 3};のようにいくつかは初期化したという状況なら、
自動変数でも残りは0になるぞ。
834デフォルトの名無しさん:2008/11/12(水) 20:28:15
初期化してないって書いてるじゃないか
835デフォルトの名無しさん:2008/11/12(水) 20:40:51
>>833
それは
int a[10] = {1, 2, 3,0,0,0,0,0,0,0};
という意味に変換されるということですか?
836デフォルトの名無しさん:2008/11/12(水) 21:11:58
>>829
__と_[A-Z]は全ての名前空間で予約済み

>>835
そう
837デフォルトの名無しさん:2008/11/12(水) 21:31:09
>>831
ヘッダファイル+インポートライブラリ+クライアントから DLL 本体を作ることはできない

誘導
http://pc11.2ch.net/test/read.cgi/tech/1224745158/
838812:2008/11/12(水) 21:46:23
>>815
OK !
そう、だから2次元配列も配列であって、表(テーブル)構造ではないんだよね。
実際のメモリ上だってそうなんだから。。。
839デフォルトの名無しさん:2008/11/12(水) 22:56:27
初心者にオススメのテキストってなんでしょうか?
840デフォルトの名無しさん:2008/11/12(水) 23:06:31
独習C
841デフォルトの名無しさん:2008/11/12(水) 23:09:40
C#ってかいてあるやつがおすすめ
842デフォルトの名無しさん:2008/11/12(水) 23:11:56
独習を初心者に勧めるのはバカ
もっと簡単なの教えてやれよ
843デフォルトの名無しさん:2008/11/12(水) 23:13:28
>>839
『これならわかる C 入門の入門』

本当に入門だからこれやって物足りなかったら
独習でも買って頑張ってみればいい
844デフォルトの名無しさん:2008/11/12(水) 23:14:40
質問があります。
あるソースコードを見ていたら、以下のような書き方で書かれていた文がありました。

文法的にどのような意味を持つのか
どういった時につかえるのか

など、誰か教えていただけないでしょうか?
尚、下のソースは、質問の意図を掴んで頂こうと、書き換えました。
gcc 上でコンパイルは通ります。

よろしくお願いします。

struct point2{
int x;
int y;
};
void
doit(name)
struct point2 *name;
{
name->x = 10;
name->y = 20;
}

int main(){
return 0;
}

よろしくお願いします。
845デフォルトの名無しさん:2008/11/12(水) 23:18:01
わからないところは、
void
doit(name)
struct point2 *name{
....
}
となっている部分です。
doitとは関数名だとは思いますが、
引数が、そのまま変数のように定義され使われています。
これは、つまり、
doit(struct point2 *name){...}
==
doit(name)
struct point2 *name{...}
いう意味、認識でよいのでしょうか?
846デフォルトの名無しさん:2008/11/12(水) 23:19:45
おそらく、わかんないところはコレだと思うんだが↓
void
doit(name)
struct point2 *name;
{

以下と同じ。
void doit(struct point2 *name)
{

ANSI−C以前は上のようにコーディングした
847デフォルトの名無しさん:2008/11/12(水) 23:20:36
ああ、そうなんですか!
たしかに古い(99年)のソースコードを見てました!
ありがとうございます。大変参考になりました!!
848デフォルトの名無しさん:2008/11/12(水) 23:20:39
たぶん、この部分だろうけど
void
doit(name)
struct point2 *name;
{

昔の書き方だから
void
doit(struct point2 *name)
{

と同じこと
849デフォルトの名無しさん:2008/11/12(水) 23:22:55
>> 848
さん。
>>846
さん

すいません。ありがとうございます。
サイトで探しても理由がわからず困惑していました。
こんな書き方があるんですね。
今ではこのような書き方をするのは良くないのでしょうか?
それとも
見習うべきですか(使い方に依ってなど)


850デフォルトの名無しさん:2008/11/12(水) 23:25:45
>>845
そう、それは関数の引数リストの旧来の書き方です。

int hoge( a, s )    // ANSI以前のK&R時代
int a;
char *s;
{
  :
}
     ↓現在はこう書いてますね

int hoge( int a, char *s )
{
  :
}
851デフォルトの名無しさん:2008/11/12(水) 23:26:31
>>850
さん

ありがとうございます。
では、現在の書き方で統一します。
852デフォルトの名無しさん:2008/11/12(水) 23:28:04
さすがに詳しい人が多いですね。
WEB上に、こういった情報がなく、途方にくれていました。
みなさんありがとうございます。
853デフォルトの名無しさん:2008/11/12(水) 23:28:10
>>840-843
お答えくださってありがとうございます。
明日、書店で『これならわかる C 入門の入門』を
購入してみようと思います
854デフォルトの名無しさん:2008/11/12(水) 23:31:19
>>846>>848
被っちゃったなw

>>849
コンパイラに、K&Rスタイルを許容するというオプションがあれば
それを使ってコンパイルを通すことができるケースが多いのですが、
ルーズなので弊害が多く、推奨はいたしません。
855デフォルトの名無しさん:2008/11/12(水) 23:38:10
きょうびプログラミング学んでるやつで2chやってないのがいたら逆に尊敬する
856デフォルトの名無しさん:2008/11/12(水) 23:40:58
初学者を突き放したかんじのサイト多いからね
初学者に対してK&Rが理解できないようじゃあなたはプログラミングに向いてません。やめたほうがいいです
みたいなサイトどっかにあったな
857デフォルトの名無しさん:2008/11/12(水) 23:43:41
>>822
なんだこれ、知らなかった
858デフォルトの名無しさん:2008/11/12(水) 23:51:08
int(*F)(int);
int(*A)[5];
859デフォルトの名無しさん:2008/11/13(木) 00:09:50
K&Rで分からなかったら、まじ向いてないよ。
860デフォルトの名無しさん:2008/11/13(木) 00:11:45
プログラミング初心者にかかれたもんでもないだろあれ
861デフォルトの名無しさん:2008/11/13(木) 00:13:22
K&R分からない
862デフォルトの名無しさん:2008/11/13(木) 00:14:52
かにめしでも食ってろ
863デフォルトの名無しさん:2008/11/13(木) 01:21:14
BM法による文字列検索で、文字列をワイド版にした場合のNext表はどうすればいいですか?
文字種分の配列を宣言するか、動的に確保するか悩んでいます。
864デフォルトの名無しさん:2008/11/13(木) 01:46:52
K&Rの書は当時、Cコンパイラのルーズさ、ズボラなところをフォローするための書として
重宝だったことは確かだ。 ただし逆に解釈した人が増えたので聖書扱いとなった。
865デフォルトの名無しさん:2008/11/13(木) 01:50:51
やっぱよくは書かれてないな
ttp://homepage3.nifty.com/mmgames/c_guide/c_kandr.html
866デフォルトの名無しさん:2008/11/13(木) 02:16:44
コンピュータ界にとっての1980年代は、社会文化でいえばアメリカの西部開拓時代。
今となっては物語「大草原の小さな家」と一緒だよ。後で古典書として読むならいいが
教科書にはならない。
867デフォルトの名無しさん:2008/11/13(木) 02:28:19
>>865
>現在は、コンパイラの最適化によって、この程度のループプログラムなど、
>よほど変則的な書き方をしないかぎり速度差はほとんどありません。
・・・・・・最近の処理系でも、ポインタ周りの最適化は困難を極める
C99ではrestrictが導入されたぐらい
最大限のパフォーマンスを(やろうと思えば)追及できることが
場合によっては重要だし、Cはそういう局面でも使われる言語でないの
868デフォルトの名無しさん:2008/11/13(木) 05:35:48
>>865
strcpy を「わけのわからない」などと書いている筆者自身が「向いていない」な
869デフォルトの名無しさん:2008/11/13(木) 06:52:05
C言語はこのままでいいんじゃね?
ドライバもアプリも書けるマルチパーパスなプログラミング言語は他に無く、
ミニコンのUNIX時代からの制約と理不尽さを多く引き継いでいながらも、
アセンブラと高級言語との中間に位置するから長らく生き残ってきたんだし。
今でもスループットやパフォーマンスを強く要求されるミドルウェアなどでは、
C言語が現役でバリバリ使われている。
870デフォルトの名無しさん:2008/11/13(木) 08:55:42
>>865
>つまり、現在でもポインタでプログラムを書くことで高速化できるようです。
>といっても、特別高速化したい部分以外は配列で問題ないと思います。
>最近のCPUは、命令を変換し、並び替え、先読みするなど複雑な動作をしており、
>アセンブラレベルでのカスタマイズが速度差として如実に表れるわけではないので。

あの・・・たまにでいいので組み込み系のことも思い出してあげてください・・・(´;ω;`)
871デフォルトの名無しさん:2008/11/13(木) 09:13:56
そのサイトも私の取り扱い注意のリストに入っている。
初心者には向かないと思うのだよね。
872デフォルトの名無しさん:2008/11/13(木) 10:01:24
すみません質問です。
C言語DXライブラリという環境でアクションゲームを製作しています。
int stage1[5][15] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,2},
{0,0,0,0,0,0,0,0,0,0,0,5,0,0,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
};

というのをfopenを使いtxtファイルから読み込んで配列をソースにかきこむのではなくしたいのですが、
fopenの使い方が調べてみたところうまく理解できません。
どのように使えばうまくいくのでしょうか・・・
よろしければ教えてください。
873デフォルトの名無しさん:2008/11/13(木) 10:03:54
バイナリーファイルにして丸ごと読むのが楽だけど、
TEXTでもやってみりゃいい、fopen使って。
で、どんなコード書いてみたの?
874デフォルトの名無しさん:2008/11/13(木) 10:20:57
>>782
↓ここを参考にすれば必要なことがすべて得られると思うぞ
ttp://www9.plala.or.jp/sgwr-t/lib/fread.html
875デフォルトの名無しさん:2008/11/13(木) 11:01:04
FILE *fp;
fp = fopen('stage.dat', "r");
for(i = 0; i < 5; i++) fgets(stage[i], sizeof(stage[i]), fp);
fclose(fp);
876デフォルトの名無しさん:2008/11/13(木) 12:21:32
教師の、ポインタ渡しって表現になんか違和感を覚えます。

ポインタの実体渡しじゃないんですか?結局関数の引数に渡してるの値ですよね?
877デフォルトの名無しさん:2008/11/13(木) 12:29:17
実体渡しというか、ふつう値渡しという
「ポインタ渡し」は、「ポインタの値渡し」の省略としてしばしば使われる

>結局関数の引数に渡してるの値ですよね?
そうです
878デフォルトの名無しさん:2008/11/13(木) 12:33:14
すっきりしました!
879デフォルトの名無しさん:2008/11/13(木) 12:55:59
ポインタ渡し=ポインタの値渡し=ポインタの実体渡し でいいです。
ポインタ=指し示すもの≒参照情報w ですから。
880デフォルトの名無しさん:2008/11/13(木) 13:16:05
わけのわからんこと書くな
881デフォルトの名無しさん:2008/11/13(木) 13:20:57
>>670
亀だが、これはフォーマットが何の画像を読み込もうとしたのだろうか?
24ビットBMPか?
882デフォルトの名無しさん:2008/11/13(木) 13:22:23
ちーげんごってむずかちいね。

むずかしいことやりたい人は「アセンブラ」
オブジェクトな感じでやりたい人は「Java」
オフィスをバリバリつかう人は「VB」

これで整理したらいいのに。ほかはいらない
883デフォルトの名無しさん:2008/11/13(木) 13:40:52
JAVAこそいらん
884デフォルトの名無しさん:2008/11/13(木) 14:28:08
C/C++ですべておk
885デフォルトの名無しさん:2008/11/13(木) 15:09:55
中小規模の軽量アプリやフリーウェアはC/C++で十分。
商用・業務系アプリは.NET軍団のC#/VBで十分。
Javaは、、、、Sun系のITスクール教材として十分。
886デフォルトの名無しさん:2008/11/13(木) 15:29:21
COBOLのこと、時々でいいから思い出してあげてください
887デフォルトの名無しさん:2008/11/13(木) 15:32:55
スレ違いだ
失せろゴミども
888デフォルトの名無しさん:2008/11/13(木) 16:57:26
質問です。
C言語においては関数の最初に変数の宣言をしなければいけないとのことですが
ポインタ変数の宣言は関数の最初じゃなくてもいいのですか?
889デフォルトの名無しさん:2008/11/13(木) 17:00:55
>>888
キリ番だけど話が切れてませんw
890デフォルトの名無しさん:2008/11/13(木) 17:04:14
>>888
ポインタもアドレスを入れる変数です
最初じゃないとだめです
891デフォルトの名無しさん:2008/11/13(木) 17:05:04
関数というより、ブロックの最初だけどな
892デフォルトの名無しさん:2008/11/13(木) 17:49:58
質問なんですが
switch文では表現できないif文はあるのでしょうか?
893デフォルトの名無しさん:2008/11/13(木) 17:52:20
無い
894デフォルトの名無しさん:2008/11/13(木) 17:52:49
複雑な条件判断?
895デフォルトの名無しさん:2008/11/13(木) 17:52:50
回答ありがとうございます。
896デフォルトの名無しさん:2008/11/13(木) 17:53:51
そりゃまあ、case 0: とdefault:があればすべて可能ではあるなw
897892:2008/11/13(木) 17:56:16
場合に応じて使い分けるのがいいとはわかっているのですが
すべて書き換え可能なのか知りたかったのです
反例みたいなものがあればおしえていただきたかったのですが
可能なのですね
ありがとうございました。
898デフォルトの名無しさん:2008/11/13(木) 19:10:32
case に変数は突っ込めないこととか
899デフォルトの名無しさん:2008/11/13(木) 19:31:33
初めまして。調べてみたのですが全くわからないので質問いたします。
C言語を覚えたいのですが、これは絶対知ってろ!て言う事はありますか?
調べてるとアルゴリズム言語を知らなくちゃやれないみたいで・・・
C言語を使えるようになったら、サウンドプログラムを使いたいと思っています。
関係ないとは思いますが、エクセルは基本的なことしか出来ません。
パソコンに関してもほぼ無知です。

よろしくおねがいします。
900デフォルトの名無しさん:2008/11/13(木) 19:33:40
"これだけ"なんていう部分はないので普通に勉強してください
901デフォルトの名無しさん:2008/11/13(木) 19:41:08
C言語以外のことで、という意味なら、
実際にプログラムを作る上ではその環境のことを知ってないと話にならない
たとえばWindowsならWinAPI
あとは現実に流通しているテクノロジ(画像、音声、通信、圧縮技術etc)を使いたいなら
もちろんそれについても勉強しなきゃいけない
902デフォルトの名無しさん:2008/11/13(木) 19:50:01
日本語(母国語)と英語(世界共通語)

あとエクセルではなく基本的なコンピュータの知識
自動車の運転ではなく、飛行機の操縦並に専門知識が要る世界、Cは
903899:2008/11/13(木) 19:50:29
>901
C言語以外でって事です。
900さんの言われた通りに勉強するので、順番で一番はじめになにを覚えればいいでしょうか?
904デフォルトの名無しさん:2008/11/13(木) 19:57:23
>>903
windows向けのプログラムであればコンソールアプリかそうでないか。
それ以外のマイコン上で動く物とか某メーカーのゲーム機の非公式開発
とかターゲットで導入は変わるかなあ。
どっちにしろ開発環境を整えるというのが第一関門

それが終わって初めて初歩的な文字を出すプログラムを作って・・・
と徐々にスキルアップかな。
905デフォルトの名無しさん:2008/11/13(木) 20:18:15
入門書を買いなよ
906デフォルトの名無しさん:2008/11/13(木) 20:27:24
doubleのNaNを表す定数は無いのでしょうか。
907872:2008/11/13(木) 20:27:57
>>873>>875
返答ありがとうございます。

stage01.txtという
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
0,0,0,0,1,0,0,0,0,0,0,0,0,0,2
0,0,0,0,0,0,0,0,0,0,0,5,0,0,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
というテキストを作成し
それをstage1[5][15]に入れたいのですが、
FILE *fp;
fp = fopen( "stage01.txt","r") ;
for(i = 0; i < 5; i++)
fgets(stage1[i], sizeof(stage1[i]), fp);
fclose( fp );
というソースにして実行したら
'fgets' : 1 番目の引数を 'int [15]' から 'char *' に変換できません
というエラーがでました・・・
何が間違って言うのでしょうか・・・
よろしければ教えてください・・・おねがします
908899:2008/11/13(木) 20:30:40
おすすめの入門書はありますか?
そこら辺の本屋などで売っていますでしょうか?
やはり通販で買わなければ無いものなのでしょうか?
そこら辺で売っているなら明日買いに行きます。

教えてくれた方々ありがとうごさいます。
909デフォルトの名無しさん:2008/11/13(木) 20:41:39
C言語は第三者から教えられて勉強したりするものじゃないので、学校の生徒のような
一方通行の教育を受けている時と同じ心構えではやっていけないよ。教科でなく学科。
どうやって学ぶか、そして何から始めればいいかは、総て自分で考えて決めなくてはならない。
学ぶ過程では何回も理解の壁にぶち当たり、試行錯誤でプログラムを組むことも多いだろう。
とにかく何が何でも理解して前に進み、一定の成果を得ようという、己の本能と信念だけが
修得の原動力であり牽引力だ。
910デフォルトの名無しさん:2008/11/13(木) 20:46:09
>>908
そのへんの本屋に売ってる
本は人によって価値が変わるから立ち読みしてみて良さそうなのを買えばいい
もしそのへんの本屋に良さそうなのがなかったらAmazonでレビューを参考にしながら買えばいい


つーか初心者用質問スレってなんでこんなに語りたがりが多いんだろうな
911デフォルトの名無しさん:2008/11/13(木) 20:48:11
普段下っ端だから上に立った気分を味わいたいのだろうきっと
912デフォルトの名無しさん:2008/11/13(木) 21:59:41
回答者なんて基本語りたがりだろう
913デフォルトの名無しさん:2008/11/13(木) 22:00:50
>>907
まずfgetsの仕様を声に出して3回読んで
その上でわからないことを他人に伝わるように書き込むこと
914デフォルトの名無しさん:2008/11/13(木) 22:03:21
良く見たら>875がものすごい大嘘書いてるwwwwwwwwww
915デフォルトの名無しさん:2008/11/13(木) 22:06:25
>>906
無い。
916デフォルトの名無しさん:2008/11/13(木) 23:35:25
Cみたいに高級と低級の間ぐらいでCよりスマートな言語ってないの?
917デフォルトの名無しさん:2008/11/13(木) 23:46:19
objcとか
918デフォルトの名無しさん:2008/11/13(木) 23:48:17
D
919デフォルトの名無しさん:2008/11/14(金) 00:07:49
printfでコンソール一行出力しますよね。
その一度出力した行を書き換えることってできないんでしょうか?
920デフォルトの名無しさん:2008/11/14(金) 00:14:21
'\b'とかsystem("cls") とか
921デフォルトの名無しさん:2008/11/14(金) 00:15:45
>>907
int stage[5][15]; としているだろう?
char stage[5][15]; にすると警告は消えるはず

ただし、整数値を読み込みたいのなら知ってのとおり char ではなく int な
入力関数は文字列を読むなら fgets、文字列を数値として読むなら fscanf だ

どこかのバカが吹聴しているように一旦 fgets してから sscanf する気なら
stage01.txt のような形式に対しては char stage[5][30]; が必要だぞ
922デフォルトの名無しさん:2008/11/14(金) 00:34:21
>>920
出した文字数分printf("\b\b\b・・・・・・")
ですよね。やってみます。
923デフォルトの名無しさん:2008/11/14(金) 00:35:39
>>906
VC++でならあるよ
924デフォルトの名無しさん:2008/11/14(金) 01:52:45
for(i=0;i<N;i++){
x[i]=x[i]+a*dt
y[i]=y[i]+a*dt
}



struct{
double x;
double y;
}position[N];

for(i=0;i<N;i++){
potision[i].x+=a*dt;
potision[i].y+=a*dt;
}

で計算時間を比べた場合、構造体の方が時間かかってしまうものですかね?
925デフォルトの名無しさん:2008/11/14(金) 01:54:06
すいません
positionの下のつづりが間違ってますが
926デフォルトの名無しさん:2008/11/14(金) 01:56:36
>>924
実測すればいい
構造体のほうが早くなる場合が多いと思うが、環境によるんだろうな
927デフォルトの名無しさん:2008/11/14(金) 01:57:04
>>924
Nが巨大だと、キャッシュの使い方が変わるので一概には言えなくなる。
要は、実測ありき。案外、大差ないかもしれないし。
928デフォルトの名無しさん:2008/11/14(金) 01:58:41
同じと思っていい。分かりやすい後者を選ぶべき。

突き詰めればCPUキャッシュに乗るかどうかで大違いだが、
よっぽどのことがない限りそこまで気にすることはない。
(速さを求めるならそれ以前にやるべきことがたくさんある)
929デフォルトの名無しさん:2008/11/14(金) 02:00:06
>>924
キャッシュを考慮に入れると、構造体のほうが速いかもしれない。
930デフォルトの名無しさん:2008/11/14(金) 02:03:04
>>926-929
返答どうもありがとうございます。
構造体の方でやってみます。
931デフォルトの名無しさん:2008/11/14(金) 02:04:48
>>922
\rでよかったのでは
932デフォルトの名無しさん:2008/11/14(金) 07:48:04
>>931
それは環境依存
933デフォルトの名無しさん:2008/11/14(金) 08:12:33
\rも\bも、何が起きるかは環境依存だ。
カーソル位置が戻ることについてはどちらも同程度には期待できる。
934デフォルトの名無しさん:2008/11/14(金) 16:01:24
>>933
うそこけ
ISO/IEC9899 5.2.2 Character display semantics
で規定されているだろ
935デフォルトの名無しさん:2008/11/14(金) 16:16:00
「90%である処理をする」という条件のif文を書きたいんですけど
if (rand () % ○○){}
else {}
の○○の部分には何と書けばいいのでしょうか?
936デフォルトの名無しさん:2008/11/14(金) 16:19:13
100 < 90
937デフォルトの名無しさん:2008/11/14(金) 16:19:43
%演算子の意味わかってる?
938デフォルトの名無しさん:2008/11/14(金) 16:23:37
>>935
10にすれば余りは0〜9になって、
90%で非0になるな。
気分的にはもにょるがw
939デフォルトの名無しさん:2008/11/14(金) 16:26:48
>>935
正確に90%になることは保障できない
rand関数は0からRAND_MAXまでの数字を返す
つまり返される値はRAND_MAX+1通りなので、これが10の倍数でなかったらどうやっても90%にならない

近似でよいなら、if(rand()%100 < 90) を使う
ただし、下位のビットを使用するため乱数としては問題があるかもしれない
940デフォルトの名無しさん:2008/11/14(金) 16:31:39
%の意味はわかっていましたが
テキストのrandの例文に%があったのでそのまま載せてしまいました
むしろrandの意味がわからないのですorz

回答レスくださった方々ありがとうございます
とても参考になりました。
100<90でいきたいと思います

今つくっているプログラムが完成したら
またrandの解説をwebで探してみます
お世話になりました
941デフォルトの名無しさん:2008/11/14(金) 16:33:22
失礼します、質問です。

1
2
3
4
5
3
7
5
6

のようなデータの1〜5行目を読み込んだあと、
2〜6、3〜7、4〜8・・・と連続で読み込んでいくプログラムを教えてください。
よろしくお願いいたします。
942デフォルトの名無しさん:2008/11/14(金) 16:33:23
>>940
0〜RAND_MAXまでの間のランダムな数字を返すんだお
943デフォルトの名無しさん:2008/11/14(金) 16:40:26
>941
「のようなデータ」の意味は?
ファイルなのか?標準入力なのか?テキストなのか?バイナリなのか?
読みこむとはどのように読み込むのか?
文字?文字列?数値?
944デフォルトの名無しさん:2008/11/14(金) 16:42:17
>>941
宿題丸投げは宿題スレへ
945デフォルトの名無しさん:2008/11/14(金) 16:42:59
>>942
ありがとうございます
意味がわからないまま使うよりも知っていたほうがはるかにいいので助かりました。
946デフォルトの名無しさん:2008/11/14(金) 16:44:44
>>941

1〜5行まで一括で読む → 配列なりにつっこむ a[0]〜a[4]
※1
 (なんか知らんが やりたい処理)
先頭へ配列をシフトする a[i-1] ← a[i] : i=1→4
次の行を読む → a[4] に突っ込む
※1からループ

ところてんをイメージしてくれ
947デフォルトの名無しさん:2008/11/14(金) 16:45:21
>>941
1行目を読んだあとにfgetpos()で位置を記憶して、
2〜5行目を読んでからfsetpos()で2行目に戻る
後はくりかえし
948デフォルトの名無しさん:2008/11/14(金) 16:46:28
941です。
おかげさまで解決しました
ありがとうございました!
949デフォルトの名無しさん:2008/11/14(金) 16:47:53
ありえねえwwwwwwwwwwwwwwwww
950デフォルトの名無しさん:2008/11/14(金) 16:58:15
読み込んだ行と配列のindexの関係がちょと特殊だが
上のほうで % が出ているのでついでに

1行読む a[i%5] に突っ込む i++
i が 5以上の時にやりたいことやる
951デフォルトの名無しさん:2008/11/14(金) 17:03:34
>>949
宿題スレ行ったみたい 解決したのは投稿先w
952デフォルトの名無しさん:2008/11/14(金) 17:11:17
?と:を使った制御文みたいなのがあるじゃないですか。
あれの使い方を詳しく説明したページないでしょうか?
?で検索しても引っかからなくて困ってます。
953デフォルトの名無しさん:2008/11/14(金) 17:17:36
>>952
三項演算子、という。
954952:2008/11/14(金) 17:21:44
>>953
検索できました!ありがとうございます。
955デフォルトの名無しさん:2008/11/14(金) 17:24:16
C言語で、ツェラーの公式を使って、与えた年月日の曜日を判定する
プログラムを作っているのですが、計算結果が負の値になることがあって
そのときだけうまくいきません。
(例;2009年4月1日。関数printfを使って計算結果を出力すると-3と出てきます。)
wikipediaでは、プログラミング言語上では変形式が用いられるとありましたが
どのように公式を記述とうまくいくようになりますか?
956デフォルトの名無しさん:2008/11/14(金) 17:46:41
デバッグの基本をやるだけじゃないか
957デフォルトの名無しさん:2008/11/14(金) 19:11:58
>>956  
言い方がまずかったと思うので書き直します。
今、ツェラーの公式の部分は、
h = (q + ((m + 1)*26/10) + k + (k/4) + (j/4) - 2*j) % 7
と、そのまま書いていますが、
別の記述の方法があるのですか?
ということです
958デフォルトの名無しさん:2008/11/14(金) 19:16:32
C言語で配列の要素数を求める方法ってありましたっけ? 例えばPerlだと、

$cnt = @list;

ってやれば、@listの要素数が$cntに代入されますけど・・。
959デフォルトの名無しさん:2008/11/14(金) 19:19:04
>>958
配列のサイズを配列の1要素のサイズで割れば個数出るよ
960デフォルトの名無しさん:2008/11/14(金) 19:32:55
wikiみてんならもう少し検索すればいいのにね。
961デフォルトの名無しさん:2008/11/14(金) 19:38:05
どのwikiを?
962デフォルトの名無しさん:2008/11/14(金) 19:44:04
>>955が見てるのはwikipediaであってwikiじゃないのに、
このスレのどこからwikiが出てきたんだ
963デフォルトの名無しさん:2008/11/14(金) 20:01:59
wikipediaをwikiと略す人たちが世の中にはいるんだよ
964デフォルトの名無しさん:2008/11/14(金) 20:45:04
wikipediaなんぞwikiと同等程度の信頼性しかないって皮肉を込めてwikiって言ってんじゃないの?
965デフォルトの名無しさん:2008/11/14(金) 20:52:35
>>957
期待値は何で、いつの時点から期待値から逸れるのかをはっきりしろよ
966デフォルトの名無しさん:2008/11/14(金) 20:56:42
>>965
そういう話じゃないし。
>>955と同程度に頭悪い
967デフォルトの名無しさん:2008/11/14(金) 21:00:28
>>966
じゃ、どういう話だよ
968デフォルトの名無しさん:2008/11/14(金) 21:04:41
まじすか。。。

> wikipediaでは、プログラミング言語上では変形式が用いられるとありました

> そのまま書いていますが、別の記述の方法があるのですか?

蒟蒻畑をそのまま飲み込むと死んじゃいます、と注意書きがありました。

蒟蒻畑を食べさせたら死にました。そのまま飲み込ませたのですが何が悪かったのでしょうか?
969デフォルトの名無しさん:2008/11/14(金) 21:17:03
カップラーメンの説明では、お湯を注いで3分待つと食べられるとありました。

お湯の注ぎ方と3分の待ち方がわかりません。だれかお湯を注いで3分待って見せてください。
970デフォルトの名無しさん:2008/11/14(金) 21:18:52
>>969
みそ汁の作り方までは授業でやりました。
971デフォルトの名無しさん:2008/11/14(金) 21:22:50
>>957
jの値がおかしいとか?
972デフォルトの名無しさん:2008/11/14(金) 21:25:36
>>957
最後にさらに 7 足してもっかい % 7する
973デフォルトの名無しさん:2008/11/14(金) 21:27:09
そして1を引きます
974デフォルトの名無しさん:2008/11/14(金) 21:29:09
さらに4をかけて5で割ります
975デフォルトの名無しさん:2008/11/14(金) 21:36:40
>>964
やっぱりわかってない
976デフォルトの名無しさん:2008/11/14(金) 22:23:08
負の値に成ったら、正になるまで7を加え続ければよい。
(7を法として合同な0..6の数を見つけるということ。)
977デフォルトの名無しさん:2008/11/14(金) 22:24:17
>>962
ヒント:ファイファン派
978デフォルトの名無しさん:2008/11/14(金) 22:26:08
>>977
FFもファイファンもどっちも元は同じだけど
wikiとwikipediaは全然違うじゃん
979デフォルトの名無しさん:2008/11/14(金) 22:30:49
ツェラーの公式を使うのが、そんなにつぇらい(辛い)のかね?
980大僧正ファンザナ・ファイナム:2008/11/14(金) 22:34:21
呼んだかね。
981デフォルトの名無しさん:2008/11/14(金) 22:38:45
ちょっwwwwwwおまっwwwwwwwww節子、それファイ・ファンやない、
ファン・ファイや。
982デフォルトの名無しさん:2008/11/14(金) 23:11:02
983デフォルトの名無しさん:2008/11/15(土) 03:22:29
returnについて聞きたい事があるんだ.詳しいやつ教えてくれ.…教えてください.

以下の質問は,C90かC99に準拠した処理系での話で頼む.移植性が失われると困るんだ.

本題.
関数でreturnにはstaticな変数を用いろって話はよくわかるんだ.ローカル変数だと,関数終了時に解放さ

れてしまうっていう話だって本で読んだ.引数みたいに,返値も値渡しだったらこんな心配は起きないんだ

けど.

staticを使うっていうと,例えば,こんな感じだよな.
int func(int a) {
static ret;ret = a*a*a;
return ret;
}
(こんな関数マクロでやれよってのは無しで.あくまで例えだよ.)


(1)これだとどうなるんだ?これは大丈夫なのか?
int func1(int a) {
static ret;ret = a;
return ret*ret*ret;
}

(2)いっそこんなのどうだ?これは大丈夫なのか?
int func2(int a) {
return a*a*a;
}
984デフォルトの名無しさん:2008/11/15(土) 03:25:28
>>983
>関数でreturnにはstaticな変数を用いろ
そんな馬鹿なことどこで聞いたんだ?

(2)で全く問題ない、たしかに関数終了時に変数は解放されるが、値だもの
985デフォルトの名無しさん:2008/11/15(土) 03:33:15
>>978
全然違うって言うほど違わないよ。
wikipediaはwikiに含まれるわけだし。
986デフォルトの名無しさん:2008/11/15(土) 03:33:45
むしろstatic使わない方がいいというかその例だと必然性がないだろ
987デフォルトの名無しさん:2008/11/15(土) 03:34:18
>>983
盛大に勘違いしているようだが、staticにしなければならないのはローカル変数へのポインタをreturnする場合だ
ローカル変数自体をreturnするときは常にその値のコピーが生成されて呼び出し元に戻される
988デフォルトの名無しさん:2008/11/15(土) 03:35:16
int func(int a) {
static int ret;
ret += a;
return ret;
}
とか
int func() {
static int ret;
return &ret;
}

みたいなのとかと勘違いして無いかね
989デフォルトの名無しさん:2008/11/15(土) 03:35:21
>>983
値を返すよ。
static使えよって話のはたぶんオート変数のアドレスが値になるケースかな。
990デフォルトの名無しさん:2008/11/15(土) 03:45:03
はっきり言うと、君はC90だのなんだのを気にするようなレベルにはぜんぜん達してない
991デフォルトの名無しさん:2008/11/15(土) 03:48:06
移植性という意味ではマルチスレッドに対応できなくなってるね
992デフォルトの名無しさん:2008/11/15(土) 03:48:26
>>990 うっ
993デフォルトの名無しさん:2008/11/15(土) 03:49:39
>>983
return は、続く式の値を関数の戻り値として呼び出し元に返す。
だから、戻り値として返される値そのものは、その式に使われた変数が
局所変数であるかに関わらず、常に確実であることが保障されている。

問題は、値そのものが確実であっても、それがポインタであった場合、
その値の指す先の領域が正しくアクセス可能であるとはかぎらないことにある。
自動変数のために確保された領域は関数を抜けた時点で不定となるので、
そのような領域へのポインタを返すことは安全でないということになる。
そのため、static な変数として宣言するという手法が存在する。

念のために言っておくが、static なポインタを宣言しても何の意味もない。
static な領域を宣言して、そこへのポインタを返す。

ただし、static な変数はプログラムの起動時から終了時まで、
関数の呼び出された場所や数に関わらず常に1つだけ存在するもので、
呼出しごとの独立性もなければ初期化式の意味も異なることを忘れてはいけない。
規格の互換性を気にする前に、記憶クラス指定子についてもっと理解を深めること。
994デフォルトの名無しさん:2008/11/15(土) 04:14:40
(3)もしくは定数を用いて,こんなのは?これは絶対に50が帰ってくるんだろうか?
int func3(void) {
return 50;
}

(4)最後に配列で.例が酷くてすまん.いいのが思いつかなかった.
引数のnはN[]の大きさ.これは,配列N[n]の中で,a<N[i]<bを満たす,一番最初のN[i]を返す関数.
int lookup(int N[],a,b,n) {
int i;
for(i=0;i<n;i++) { if( N[i]>a || N[i]<b ) return N[i]; }
return EOF;
}
これだと,returnにN[i]を用いてる.N[]はポインタが渡されてるから問題ないと思うんだ.
でも,iがstaticじゃないから,N[i]のiの部分に不安が残る.これちゃんと動くだろうか?
995983:2008/11/15(土) 04:16:23
10分に一回しか書き込めないから二回にわけて書き込んだらすでにレスがあった.

996デフォルトの名無しさん:2008/11/15(土) 04:18:28
動く
997デフォルトの名無しさん:2008/11/15(土) 04:23:13
まずは式を評価するということから理解が必要だな
998デフォルトの名無しさん:2008/11/15(土) 04:24:02
値渡しだということについてだな
999デフォルトの名無しさん:2008/11/15(土) 04:25:07
> 返値も値渡しだったらこんな心配は起きない
値渡しだから心配しないでね
1000デフォルトの名無しさん:2008/11/15(土) 04:26:03
いまだせんげっとー
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。