C言語なら俺に聞け( ..
[2ch|▼Menu]
116:デフォルトの名無しさん
08/11/02 08:57:22
scanf・・・恐ろしい子・・・

117:デフォルトの名無しさん
08/11/02 09:07:04
とにかくdoubleとの相性が最悪よね。どうしたのかしら。


118:114
08/11/02 09:13:07
>>116-117
つまりプログラムでのミスというよりは、仕様での異常という事でしょうか?
そうなると、別の入力方法を考えないといけないわけですね・・・

ご解答有難うございました。

119:デフォルトの名無しさん
08/11/02 09:19:02
>>118
アホかい。自分が使い方間違っているだけだって。
つーか、そのミスに警告も出てないとしたら、コンパイラの使い方も間違っているかもしれないぞ。

120:114
08/11/02 09:31:16
>>119
そうだったのですか。
コンパイラはVisualC++2008の方に混同されているものですが
使い方などは考えたことありませんでした。

もう一度よく調べて見ます。
有難うございました。

121:デフォルトの名無しさん
08/11/02 09:40:45
誰か>>105について教えて下さい

122:デフォルトの名無しさん
08/11/02 09:42:15
>>121
struct です

123:デフォルトの名無しさん
08/11/02 09:57:31
1 は何故 int型なの?
'A' は何故 char 型なの?
0は何故偽値なの?
if文は何故式じゃないの?


124:デフォルトの名無しさん
08/11/02 09:58:46
>>122
何故オブジェクト型なのですか?
何故構造体型では無いのですか?

125:デフォルトの名無しさん
08/11/02 10:01:37
構造体だって書いてあるじゃん。
バカなの?

126:デフォルトの名無しさん
08/11/02 10:07:09
>>125
JIS X3010:2003にはオブジェクト型であると説明されているのですが、
あなたは構造体型であると言いたいのですか?

127:デフォルトの名無しさん
08/11/02 10:08:12
YES

128:デフォルトの名無しさん
08/11/02 10:12:13
>>127
どうして構造体型なの?

129:デフォルトの名無しさん
08/11/02 10:17:02
いや、間違った。別に構造体である必要は無いか。
規格でそこまでは決められてないな。
構造体以外で実装されている処理系は見たこと無いが。

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

Q.なぜオブジェクト型なのか。
A.規格でそう決められてるから。


130:デフォルトの名無しさん
08/11/02 10:18:58
>>129
、別に構造体型じゃなくても構わないッスw適当にやっちゃってよw、
って事?

131:デフォルトの名無しさん
08/11/02 10:21:37
規格に書かれていないことは実装者の自由。
もっとも規格に沿ってない実装だってあるわけだから、
目指すものによって守るべきルールも決まってくる。
規格に無くても、世の中にはデファクトスタンダートと言うものもあるしな。

132:デフォルトの名無しさん
08/11/02 10:21:57

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

いいのですか

133:デフォルトの名無しさん
08/11/02 10:25:09
>>131
なるほど、ありがとうございます。

134:デフォルトの名無しさん
08/11/02 13:00:04
っていうか、Cの規格のオブジェクトってのは、オブジェクト指向のオブジェクトとは別物だろ。


135:デフォルトの名無しさん
08/11/02 14:27:09
perlの処理系をC言語で作る事はできますか?

136:デフォルトの名無しさん
08/11/02 14:28:18
できますというかできてます

137:デフォルトの名無しさん
08/11/02 14:30:26
Perlの処理系はLarryの優しさから出来ています
とりあえずこちらをご覧下さい
URLリンク(www.cpan.org)

138:デフォルトの名無しさん
08/11/02 14:36:02
他にもC言語でできてる、代表的なソフトを教えて下さい。

139:デフォルトの名無しさん
08/11/02 14:39:41
Unix系OS

140:デフォルトの名無しさん
08/11/02 14:51:23
Cの処理系

141:デフォルトの名無しさん
08/11/02 14:57:40




YO YO エビバーデー








142:デフォルトの名無しさん
08/11/02 15:29:45
フィンガー5じゃないが、リンリンしなくて良いからw

143:デフォルトの名無しさん
08/11/02 16:02:55
>>115
scanf("%f",&y);
↓ ^^
scanf("%lf",&y);
^^

printf("その電化製品で掛かる月の電気代は%e¥で、基本料金は%d¥です\n",ene,x);
↓ ^^^
printf("その電化製品で掛かる月の電気代は%.3f¥で、基本料金は%d¥です\n",ene,x);
^^^

これでいかがでしょう?(printfのほうは自分の好みで変更しました)
ただ、xが使われていないような・・・

144:デフォルトの名無しさん
08/11/02 16:08:18
>>143です
思いきりずれました
つまり、scanfのフォーマット指定を"%f"→"%lf"
pritnfのフォーマット指定を"%e"→"%.3f"(この3は小数点以下桁数なのでお好みで)
でいかがでしょう?


145:デフォルトの名無しさん
08/11/02 17:49:25
いまひとつ有り得ない桁数というのが分からないのと
それであってるのか分からないのだが
eneは電気代じゃなくて一ヶ月分の消費電力しか計算して無くないか?

146:デフォルトの名無しさん
08/11/02 17:51:19
普通、¥は接頭です。

147:デフォルトの名無しさん
08/11/02 17:55:35
計算するときは、常に単位を意識するといい。
y * z * 30は、即ち y[W] * z[h/day] * 30[days/month]だからつまり、ene[Wh/month]となる。
つまり、月当たりの電力量と言うことだ。

148:デフォルトの名無しさん
08/11/02 18:10:45
unsigned charの変数は初期化をしなくても問題は無いのですか?
大学の課題のサンプルプログラムの中に初期化も代入もせずに
値を参照している部分を見つけたもので気になって質問しました
試したところ確かに初期値?として0が格納されているみたいなんですが
これをそのまま利用していいんでしょうか?
自分の知識や習慣だと変数を初期化等をしないまま参照するのは
おかしい気がするのですが何かこうすることで問題が発生したりはしますか?

149:デフォルトの名無しさん
08/11/02 18:14:53
グローバルスコープやstaticな変数なら0で初期化される。
ローカル変数ならゴミが入ってる。

150:デフォルトの名無しさん
08/11/02 18:15:40
型の問題ではなく、定義されている場所の問題。
関数内のローカル変数でstaticでないなら、初期化しないと不定値になる。

151:デフォルトの名無しさん
08/11/02 18:16:34
グローバル変数なら0で初期化される

152:デフォルトの名無しさん
08/11/02 18:19:43
>>149
あれ?関数内のstaticな変数は0初期化されないんじゃなかったっけ?

153:デフォルトの名無しさん
08/11/02 18:22:04
されます。

154:デフォルトの名無しさん
08/11/02 18:26:30
>>149->>151
おお、ありがとうございます!
なるほど、型ではなくスコープの問題だったんですね
確かにそのプログラムではグローバル変数でした
今までそんなこと全く知らずに使ってました^^;
勉強になりました

155:デフォルトの名無しさん
08/11/02 18:32:39
スコープっていうか静的か動的かの話じゃないかな
コンパイル時なら0で初期化とかやっても遅くならないし

156:152
08/11/02 18:36:12
>>153
確かにそうみたい。なんか勘違いしてた

157:デフォルトの名無しさん
08/11/02 18:40:33
テキストファイルから1行ずつ読み込んで、
それをスペースを間に入れて表示したいです。
例えばテキストファイルの中身が
a
b
だったら「a b」という感じに表示したいのですが、
以下のコーディングで正しいでしょうか?
環境はWindowsXP、VisualC++2008 ExpressEditionです。

  char buf[1024];
  FILE *fp = fopen("test.txt", "r");
  while(fgets(buf, sizeof(buf), fp) != NULL){
    buf[strlen(buf)-1] = '\0';
    printf("%s ", buf);
  }


158:デフォルトの名無しさん
08/11/02 18:49:43
>>157
だいたいそれでいいんじゃないの?

一行が1024文字以上だったらどうするとか、細かいことは考えないで。

159:デフォルトの名無しさん
08/11/02 18:56:06
>>158
大丈夫そうですか?
あ、でもこれだとテキストファイルの最後に空白行
入れないと駄目っぽいですね。

160:デフォルトの名無しさん
08/11/02 19:09:00
聞く前に試せよ

161:デフォルトの名無しさん
08/11/02 19:24:35
俺に聞けスレで試せで終わらすなんて。

162:デフォルトの名無しさん
08/11/02 19:33:25
何故ダメなのか聞くためのスレだろ

163:デフォルトの名無しさん
08/11/02 19:35:35
>>159
fgetc()とfputc()で、一文字単位でしょりして、\nだったら空白に置き換えるってほうが、
簡単なんじゃね?

164:デフォルトの名無しさん
08/11/02 19:36:01
できることできるだけやってから質問するのは当たり前だろ

165:デフォルトの名無しさん
08/11/02 19:38:22



一番ダメな考え方

「動くからこれでいい」


動くからと言って、CPUの演算処理を独占するようなコードはクソである。
だから動くからいいと言うものではない

166:デフォルトの名無しさん
08/11/02 19:38:39
>143です

>>145-146さん
皆さん指摘の通り、中途半端な回答になっていました。
>>115さん
URLリンク(kansai2channeler.hp.infoseek.co.jp)
に修正版をうpしたので許してください

167:デフォルトの名無しさん
08/11/02 19:45:17
>>163
その方が簡単ですね。効率性も考えるとfgetsですかね?

168:デフォルトの名無しさん
08/11/02 19:50:27
>>167
たぶん、大差ないんじゃないの?

昔、setvbuf()ってので、バッファのサイズを増やしたら速度が向上してたけど、
Windowsの時代になってから、同じようなことをやってもあんまり変わらなかった。
OSレベルでのバッファリングされてるからだと思うけど。


169:デフォルトの名無しさん
08/11/02 20:19:51
仮に、CPUの処理速度が無限大あって
ビットシフトなんか使っても速くならないとしても
常に最適化を忘れてはいけない

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


これが出来ない奴はルータも携帯電話も作れない

170:デフォルトの名無しさん
08/11/02 20:21:34
携帯やルータってCで出来てるの?

171:デフォルトの名無しさん
08/11/02 20:29:30
基本は読みやすさ。
要件をみたせないときに、最適化。

172:デフォルトの名無しさん
08/11/02 20:32:53
Cではありません。スパゲッティーで出来てます。

。。。ごめん

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

右シフト演算がちょっとめんどくさいことになってることは
覚えてるんだけど。

174:デフォルトの名無しさん
08/11/02 20:37:28
なぜコードを最適化するのですか?

175:デフォルトの名無しさん
08/11/02 20:40:24
めんどくさいものは使わない。

176:デフォルトの名無しさん
08/11/02 20:48:13
組み込みは未だに、CとASMで出来ている

177:デフォルトの名無しさん
08/11/02 20:59:00
>>172
ざる蕎麦ではできていないのか

178:デフォルトの名無しさん
08/11/02 20:59:47
>>173
#include <stdio.h>
#include <limits.h>
#define UPPER_BIT (1 << (sizeof(int) * CHAR_BIT - 1))
void print_bit_s(int n){
  unsigned int mask = UPPER_BIT;
  for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
  putchar('\n');
}
void print_bit_u(unsigned int n){
  unsigned int mask = UPPER_BIT;
  for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
  putchar('\n');
}
int main(){
  int n1 = (-1);
  int n2 = n1 & ~UPPER_BIT;
  unsigned int m1 = n1;
  unsigned int m2 = n2;
  print_bit_s(n1 >> 1);
  print_bit_u(m1 >> 1);
  print_bit_s(n2 << 1);
  print_bit_u(m2 << 1);
  return 0;
}
// output
11111111111111111111111111111111
01111111111111111111111111111111
11111111111111111111111111111110
11111111111111111111111111111110


179:デフォルトの名無しさん
08/11/02 21:25:30
>>174
そこにコードがあるから

180:173
08/11/02 21:44:14
んー、たとえば右シフト演算について言えば、符号付き整数型の負値に対して演算を
適用した結果は処理系に依存しますよね。output の1行目でいうと、算術シフトするか
論理シフトするかは処理系に依存すると。。
上の2行は
01111111111111111111111111111111
01111111111111111111111111111111
こうなる可能性があるわけですよね。下の2行に関しては同様に処理系依存の問題は
大丈夫なのでしょうか。コードを解読し切れてないので結論が良く見えないのですが。

181:デフォルトの名無しさん
08/11/02 21:50:37
>>173
っMSDN
と思ったけど、検索しても見つけにくかったので、ローカルから。
Shift Operators: >> and << (ごめん、英語なんだ)
とりあえず適当訳。

左シフトは0埋め。論理シフト。

右シフトはunsignedは0埋め。signedは符号ビットで埋める。
unsignedは論理シフト。signedは算術シフト。

・Microsoft Specific
signed の負の数の右シフトは、実装によります。
MicrosoftのC++の場合は、MSBで空いたビットを埋めます。
MSのC++以外の場合は知らん。

だそうです。


182:デフォルトの名無しさん
08/11/02 21:53:03
なんでこういう細かいところ統一しないの?

183:173
08/11/02 22:12:18
わざわざ和訳までしてもらってすいません。Cの規格的な部分ではどうなんでしょうね。。
Microsoft仕様ではCとC++とでまた違うんですか。こちらでももうちっとしらべてみます。
あふん。。

184:デフォルトの名無しさん
08/11/02 22:20:14
>>182
なんでOSは統一しないの?なんで通貨も、言語も。
所詮、こんなものは、規格化した集団が幅広い用途を考慮して
決めるか、一部の団体の意見の押し付けでしかないってことだよ。
そして俺らはそれを使うだけ。開発、発案、研究するわけでもない・・・
まぁ、俺はとある有名大学で研究、実験はしたがな。

185:デフォルトの名無しさん
08/11/02 22:28:45
>>182
効率を重視するから

186:デフォルトの名無しさん
08/11/02 22:32:34
>>183
MSの場合Cでも>>181と同じ。
そこに書いてある「MSのC++以外」とは、MS以外のC++という意味。

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

CはJIS X3010、C++はJIS X 3014が国際規格の翻訳として存在する。
URLリンク(www.jisc.go.jp)

187:173
08/11/02 22:57:15
おお!そのものズバリのご回答ありがとうございます。
負値の左シフトは未定義でしたか。
正値ならば符号付き・無しに関わらず論理シフトすると、こういうことですね。
ややこしいなあ。。
ともかくこれでスッキリしました。
ありがとうございました。

188:デフォルトの名無しさん
08/11/02 23:05:13
左シフト?

189:デフォルトの名無しさん
08/11/02 23:06:46
「右も左も分かりません」

190:デフォルトの名無しさん
08/11/02 23:14:23
アホか

191:デフォルトの名無しさん
08/11/02 23:16:59
↑うん、お前アホ。

192:デフォルトの名無しさん
08/11/02 23:27:23
肝心のシフト演算子について話せない奴はすっこんでろ

193:デフォルトの名無しさん
08/11/02 23:28:34
>>187
算術左シフトという言葉があったとしても、負の値のそれはやっぱり0埋めだよ。
論理左シフトと全く同じだから、わざわざ算術と言わないだけ。

算術右シフトが負値で1埋めするのは符号を維持するための結果であって、
1埋めするから算術というわけではない。

194:デフォルトの名無しさん
08/11/02 23:29:41
自分の論理を自分に適用できない奴はすっこんでろ

195:デフォルトの名無しさん
08/11/02 23:49:20
そんなに符号のことが気になるなら、unsignedをしっかり指定しとけ、な?

196:デフォルトの名無しさん
08/11/02 23:53:00
>>177
ざる蕎麦ではだめです。 もり蕎麦に、のりを盛るところから始めなくては。
きしめんでも可。 たぶん、時期的に、そうめんはだめだと思う。

(って何の話だっけ


197:187
08/11/02 23:55:37
言葉の定義って難しいですね。。ややこしくて頭がパンクしそうです。
単純に 0埋め=論理シフト、1埋め=算術シフトと覚えてました。
算術(右シフト)だから符号を維持する必要がある→結果として1埋めになる
論理(右シフト)だから符号を維持する必要がない→結果として0埋めになる
こういうことなのかな。考えたことも無かった。

198:デフォルトの名無しさん
08/11/03 00:00:01
そんなに心配なら shl, sal, shr, sar を直に使えよ

199:デフォルトの名無しさん
08/11/03 00:04:35
算術シフトは
左にnビットシフトすると,元の数の2^n  倍
右にnビットシフトすると,元の数の1/2^n倍

これを保障するシフト演算。だから算術という。

200:デフォルトの名無しさん
08/11/03 00:10:33
RCL、RCR、ROL、RORとか混ぜると、さらにパンク。


201:187
08/11/03 00:20:29
なんで知らなかったんだろう今まで。。恥ずかしい。
算術って言うのは単に符号を維持するっていうことじゃなくて、そういうことなのね。。
それを保証するために符号の維持も当然必要で、その結果1埋めになる(右シフトの
場合)ということかな。

202:デフォルトの名無しさん
08/11/03 11:49:20
>>184
多様性のもつ可能性を吟味しなければなりません。

203:デフォルトの名無しさん
08/11/03 13:53:42
scanfで入力してもらった数字、例えば1234を合計した数字を変数に入れる方法を教えて下さい。(入門者にも理解できる範囲でお願いします)

204:デフォルトの名無しさん
08/11/03 13:59:03
数字は1 2 3 4とバラバラに入力するのかそれとも連続で1234と入れるのか?

205:203
08/11/03 14:02:37
連続で入力するほうでお願いします。

206:デフォルトの名無しさん
08/11/03 14:06:53
文字列で受け取って、一文字づつバラして、数値に変換して、全部足す

207:デフォルトの名無しさん
08/11/03 14:16:20
>205
まず、%d指定子を使って1234という数字をまるごとあるint変数(仮にt)に読み込む
次に、合計を得る変数(仮にs)をゼロに初期化する
そして、以後tが0より大きい間、tを10で割った余り(%演算子を使うこと)をsに加算してからtを10で割るということを繰り返す

※Cでは、正の整数の割り算は端数を切り捨てる

流れ:
 s:0 t:1234(読み込み)
 s:4 t:123(1234を10で割った余り4をsに足しtを123に)
 s:7 t:12(123を10で割った余り3をsに足しtを12に)
 s:9 t:1(12を10で割った余り2をsに足しtを1に)
 s:10 t:0(1を10で割った余り1をsに足しtを0に)
 (tが0になったので終了)



208:デフォルトの名無しさん
08/11/03 14:21:45
int a;
scanf("%d", &a);
printf("%dの合計を暗算して入力してください");
scanf("%d", &a);
printf("はい、ご名算!");

209:デフォルトの名無しさん
08/11/03 14:50:08
宿題は宿題スレへ じゃないのか?

210:デフォルトの名無しさん
08/11/03 15:04:53
そういうのって、getchar() ループの方が楽じゃね?
#include <stdio.h>

void main( void )
{
 int loop = TRUE;
 int sum = 0;
 char c;

 while ( loop ) {
  c = (char)getchar();  // 1文字入力
  switch ( c ) {
   case '0':   // 0〜9が入力された場合、sumに足しこむ
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
    sum += (int)( c - '0' );
    break;

   case EOF:
    loop = FALSE;
    break;
  }
  printf( "合計値は %d \nです。", sum );
 }
}

211:デフォルトの名無しさん
08/11/03 15:08:52
'0'-'9'は連続が保障されてるから、そんなことしなくても

212:デフォルトの名無しさん
08/11/03 15:22:36
int c, sum = 0;
while (isdigit(c = getchar())) sum += c - '0';
printf("%d\n", sum);

これだけでいいじゃん

213:>212
08/11/03 15:25:30
0〜9以外を無視していないから却下

214:デフォルトの名無しさん
08/11/03 15:27:06
え?

215:デフォルトの名無しさん
08/11/03 15:29:13
123x4 と入力したら 10 が返ってくる仕様が求められてるのか?

216:デフォルトの名無しさん
08/11/03 15:30:18
>>209
丸投げでなければわからないことを聞くのは一向にかまわない

>>210-212
scanfでって言ってるのにgetcharはないだろ

217:デフォルトの名無しさん
08/11/03 15:41:17
こういうので、質問者にscanf()が必須条件なのか、それ以外でもいいのかって質問してもめったに返事が返ってこないよな。


218:210
08/11/03 15:43:37
>>216
こういうのはふつうキーイベントループ制御だべよー。
WindowsのようなGUIでもテキストボックスに「1234」なんて連続して入力させるかぁ?

219:203
08/11/03 15:49:26
みなさん、お答えいただきありがとうございます。
アドバイスを受け、色々と試してはいるのですが、一向にうまくいきません。

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

char str[5];

scanf("%s",str);

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

atoi(str)で整数値に変換

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

アドバイスお願いします。


220:デフォルトの名無しさん
08/11/03 15:52:30
>>219
4 = 1234 % 10;
123 = 1234 / 10;

221:デフォルトの名無しさん
08/11/03 16:07:33
文字列入力ってテーマを見ると、すぐにgetchar()で一文字ずつ判断するロジック書く奴っているよね。
そういう奴に限ってろくでもないバグを仕込むから笑えない。

222:デフォルトの名無しさん
08/11/03 16:09:19
例えば、>212はまぁ無難な方で、>210なんてわざわざバグを埋め込むための無駄な努力の跡さえ見えてしまう事実。

223:デフォルトの名無しさん
08/11/03 16:23:58
>>221
本番では2バイト文字に気を付ければいいだけだろ
>>222
レビューでデバッグしてくれ

224:デフォルトの名無しさん
08/11/03 16:35:49
標準入力から0xffを入力すると、EOFと誤解釈して終了してしまうね。
この程度のサンプルならどうでもいいけど、ファイルをリダイレクトして使うようなツールだと恐怖だね。

225:デフォルトの名無しさん
08/11/03 16:42:38
>219
ソースはれ

あと、ほかに制約がないのなら、%sからatoi()なんかしないで素直に%dで読みなさい

226:デフォルトの名無しさん
08/11/03 17:00:30
>>224
それ、0xffイコールEOFだから誤解釈じゃないよ。それも正常系の解釈と処理。
まあサンプルプログラムだし、EOFは入力の終了条件のために設けた
だけだから、そこは削除して他の方法に置き換えても構わないし。

227:デフォルトの名無しさん
08/11/03 17:06:47
違います
EOFは決して0xffではありません

228:203
08/11/03 17:07:34
#include<stdio.h>

int main()
{
int w,x,y,z,goukei;
int w2,x2,y2,z2,goukei2;
int yosou[4];
int yosou2;
printf("前回の当選数字を入力:\n");
scanf("%d,%d,%d,%d",&w,&x,&y,&z);
goukei = w + x + y + z;
printf("前々回の当選数字を入力:\n");
scanf("%d,%d,%d,%d",&w2,&x2,&y2,&z2);
goukei2 = w2 + x2 + y2 + z2;
printf("今回予想した数字を入力:\n");
scanf("%d,%d,%d,%d",&yosou[0],&yosou[1],&yosou[2],&yosou[3]);
yosou2 = yosou[0] + yosou[1] + yosou[2] + yosou[3];
if(goukei == yosou2 || goukei2 == yosou2){
printf("%d Is a NG\n",yosou2);
}else if(yosou2 > 9 || yosou2 < 27){
printf("%d NG",yosou2);
}else{
printf("%d OK\n",yosou2);
}
return 0;
}

ナンバー4の当たり数字過去2回の合計値と一致した場合、NGと出力するプログラムです。
また、予想した数字の合計値が9〜27に入ってなくてもNGと出力します。
ほんとくだらなくてすいません。

229:デフォルトの名無しさん
08/11/03 17:13:14
>>226
いや、大誤解だと思いますね。>>224 ではなくて、>>>226 が。
>>210 は getchar() の戻り値を char でうけているのが、センスがないというか、そもそも本質を理解していない、というべきか。
もしかして、いつものあなたですか?これはつり?

230:デフォルトの名無しさん
08/11/03 17:17:14
いつものあなたって・・
お前は誰と戦ってるんだ

231:デフォルトの名無しさん
08/11/03 17:22:56
非科学的=厨はマ板にまではびこっている

232:デフォルトの名無しさん
08/11/03 17:25:19
糖質かこいつ

233:デフォルトの名無しさん
08/11/03 17:33:18
どいつ?

234:デフォルトの名無しさん
08/11/03 17:34:13
229

235:デフォルトの名無しさん
08/11/03 17:34:35
>>228
scanfを使うことは必須条件?
あと入力するのは「1234」なのか「1,2,3,4」なのか
前者だったら>>207でできないかな
後者だったらsscanfとかを調べてみるといいかも


236:デフォルトの名無しさん
08/11/03 17:51:07
>>227
ですよね。というか、標準入力からの入力値が、つうつうで getchar() ≒ fgetc() の返り値になるわけではないのですが。
>>230-234
やっぱりIDをつけたほうがいいのでしょうかね。

237:デフォルトの名無しさん
08/11/03 18:04:03
>>228
"%d,%d,%d,%d"と書いたら、それは1,2,3,4と入力させることを意味する
1234と入力するのなら>>207のようにすること

238:デフォルトの名無しさん
08/11/03 18:21:31
fgetsじゃなくてgetsでいいよ
どうせ両関数の仕様すら理解していないんだろ

239:203
08/11/03 18:26:55
スレ汚しすいませんでした。


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

皆さんご回答本当にありがとうございます。

240:デフォルトの名無しさん
08/11/03 19:38:12
URLリンク(kansai2channeler.hp.infoseek.co.jp)
画面内の球をクリックすると初速度v0で鉛直投げ上げするプログラムです
空中にある状態の球をクリックするとまたその位置から投げ上げされて
球をクリックするたびにどんどん球が上がるようにしたいんですが、
空中の球をクリックしても何も起こしません。
ボールが跳んでるときに、最初にボールがあった場所をクリックするとおかしなことに。

241:デフォルトの名無しさん
08/11/03 19:43:31
あっそう

242:240
08/11/03 20:22:33
どこが間違ってますかね?

243:受付番号001
08/11/03 20:25:58
>>242
いま診てやるから待ってろ

244:デフォルトの名無しさん
08/11/03 20:34:54
たぶんここだな

if(bally+ball >= 500){
KillTimer(hWnd,ID_MYTIMER);
bTimer = FALSE;
mytime = 0;
}

245:質問
08/11/03 20:55:23
ファイルの直ぐ下に任意のファイルの内容を
そのままコピー、連結できる関数ありますか?お願いしますm(__)m

246:デフォルトの名無しさん
08/11/03 20:58:55
>>245
ないです。

247:デフォルトの名無しさん
08/11/03 21:00:06
自分でアペンドモードで開いてコピーしる

248:デフォルトの名無しさん
08/11/03 21:00:38
下はどっちだ?

249:デフォルトの名無しさん
08/11/03 21:02:24
>>245
C/C++の宿題を片付けます 117代目
スレリンク(tech板)

250:245
08/11/03 21:02:52
ということはファイルの内容を読み込んで
fopenのaで逐一書き込んでいくのが最良の方法ですね?

251:デフォルトの名無しさん
08/11/03 21:03:23
system

252:デフォルトの名無しさん
08/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)


253:245
08/11/03 21:12:33
ありがとうございましたm(__)m

254:240
08/11/03 21:18:46
>>244
問題ないような気が・・?すみません分からないです

255:受付番号001
08/11/03 22:24:32
>>254
診ましたよ〜。

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

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

また、WM_TIMERメッセージ内では常に地面からの座標計算でボールの高さを計算して
しまっているので、上手くボールにヒットしたらballyの位置から計算しなおす様に変更する
必要があります。

256:デフォルトの名無しさん
08/11/03 22:25:18
>>245
COPYやcatで連結は駄目なの?

257:デフォルトの名無しさん
08/11/03 22:35:13


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

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


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

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




258:質問
08/11/03 23:27:00
下記の違いを教えていただけますでしょうか?
return
exit
あ、あと
EXIT_FAILUER
ってなんですか?

259:デフォルトの名無しさん
08/11/03 23:28:00
FAILUARE

260:デフォルトの名無しさん
08/11/03 23:28:50
こういう人にはgoogleの使い方を教えたほうが親切なんでしょうか?

261:デフォルトの名無しさん
08/11/03 23:29:38
return は予約語
exit はライブラリ関数
EXIT_FAILURE はマクロ定数
です。

262:デフォルトの名無しさん
08/11/03 23:40:04
return は関数から抜ける
exit はプロセスから抜ける
EXIT_FAILUER は書いた者に聞け(煽り口調で)

263:デフォルトの名無しさん
08/11/03 23:41:28
EXIT_FAILURE はマクロ定数の意味が分りません

264:240
08/11/03 23:44:28
>>255
うまくいきました!  
大変わかりやすい説明ありがとうございます!


265:デフォルトの名無しさん
08/11/03 23:51:02
>>257
空気を読むって言うのはさ
自分と空気を一体化させる作業なんだ
「俺は今どうなっているのか」と考えながら読むんだ
無意識にみんなやってると思うぜ
他の何かがどうなってるかではない、自分がどうなってるか

しかし、鏡を見ると、場に合わない容姿・・・

266:デフォルトの名無しさん
08/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
08/11/04 00:06:58
>>264
乙! 面白いトレーニングプログラムだねw
わしもSetTimer、KillTimer、WM_TIMERメッセージは、テトリスを作ってみた時に使ったよ。
同じように素のWindows SDKとC言語だけでね。

>>265
大人になれば空気なんて読まなくなる。いや読む必要がなくなるのだ。
その代わり、盤面の様子や流れ、相手のニーズや考えを読むように変化する。

268:デフォルトの名無しさん
08/11/04 00:30:14
自分がmainになるんだよ
mainになって、forなどで値の計算や操作をやっていると考えると
どこがおかしいのか分かりやすい

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

っていうか、みんなイメージしてると思うが!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

269:デフォルトの名無しさん
08/11/04 00:35:49
>>266
printf() の後に fflush(stdout); をおいてみるとどうなりますか?fflush(NULL); ではどうなりますか?

270:デフォルトの名無しさん
08/11/04 00:36:28
>>268
新しい芸ですか?

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

みんなのも教えてください。

272:デフォルトの名無しさん
08/11/04 00:39:26
>>271
> ・strcpyよりmemcpy
状況にもよりますが、これは賛同しかねます。

273:デフォルトの名無しさん
08/11/04 00:45:27
>>272
あ、すいません。
そうですね。\0つけたい時ありますもんね。
strcpy→strncpyに訂正します。


274:デフォルトの名無しさん
08/11/04 00:50:17
>>271
入れ子2つだけじゃ厳しいなぁ

275:デフォルトの名無しさん
08/11/04 00:52:42
memcpy()でコピーしてるのに、コピーの長さをstrlen()で取ってるコードをこのまえ見たな。
strcpy()でいいじゃんって思うけど。

276:デフォルトの名無しさん
08/11/04 00:53:10
>>271
>一行は80文字。
まあほとんどないことですが、意味の上で 80文字を超えるようであれば、それはそれでこだわりません。

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

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

>キャメル式
初耳です。よろしければ意味を教えてください。

277:デフォルトの名無しさん
08/11/04 00:56:34
>・一行は80文字。
これは無い

278:デフォルトの名無しさん
08/11/04 00:57:33
>>276
Wikipedia項目リンク

279:デフォルトの名無しさん
08/11/04 00:59:40
>>277
そういうスタイルの人もいるよ。
Cだと80くらいでも十分書けるし。

280:デフォルトの名無しさん
08/11/04 01:04:14
いや居るのは知ってるよ

281:デフォルトの名無しさん
08/11/04 01:06:24
>>276
動的独自ライブラリから独自関数を使う場合、引数間違っててもコンパイルが通る。んで、実行時にコア吐いて初めて気付く事がある。プロトタイプ書いてると、コンパイルエラーでるから、書くようにしてる。好みかな。
キャメル式は、確か、ラクダみたいな意味だったかな。大文字と小文字だけでつけるやつ。こういうの。
FileCopy()
区切り方の違いかな。変数はアンダーバー使うし、マクロは大文字とか。



282:デフォルトの名無しさん
08/11/04 01:06:58
ああそう。

283:デフォルトの名無しさん
08/11/04 01:08:54
うん

284:デフォルトの名無しさん
08/11/04 01:08:55
>>281
下位のサブルーチンから書いていって、main()を最後に書くってスタイルの人なんじゃないの?

285:デフォルトの名無しさん
08/11/04 01:09:11
コーディング規約のスレがあったような

ここでもいいんですよ、はい

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

>>278 >>281
キャメル式+ハンガリアンでかいてみることもあります。気分しだいですが。

287:デフォルトの名無しさん
08/11/04 01:16:37
>>284
昔はそういう人も居たし俺もそうだった。技巧賞ノミネート作品のように。
でもある時から改めた。

288:デフォルトの名無しさん
08/11/04 01:18:18
>>275>>273を読んでないのか

289:デフォルトの名無しさん
08/11/04 01:20:25
>>287
技巧賞とあるんだ
ぐぐるわ

290:デフォルトの名無しさん
08/11/04 01:25:01
>>288
別に責めてるわけじゃないから、気にしなくていいよ。

291:デフォルトの名無しさん
08/11/04 01:25:48
>>287
技巧賞っていうか、Pascalの影響も多分にあると思う。

292:デフォルトの名無しさん
08/11/04 01:28:07
>>286 ハンガリアン記法はダメだろ

293:デフォルトの名無しさん
08/11/04 01:30:20
>>287
さしつかえなければ、かえた理由を教えてください。
たしかに私も厳密な意味で下から上にかいているわけではなく、コンパイルOKれべるですので、技巧賞はむりですね。

294:デフォルトの名無しさん
08/11/04 01:32:58
>>292
私のはいわゆる「アプリケーションハンガリアン」ってやつですね。MicroSoft 流 pszXXX とかいうのは私も嫌いで、これはやらないです。
そもそも全部の変数をハンガリアンにするわけではありません。
節操がないといえば、それまでですが。

295:デフォルトの名無しさん
08/11/04 01:36:38
しかしアプリケーションハンガリアンって、あんまり使う機会がないっていうか。
システムハンガリアンはダメだって言われてるけど、Cのときは、ポインタはpをつけてる。

296:デフォルトの名無しさん
08/11/04 01:41:43
>>269
どちらでも実行結果は変わりませんでした。

297:デフォルトの名無しさん
08/11/04 01:52:53
>>296
more の内容をください。more にも fflush(NULL) をいれるとどうなりますか?

298:デフォルトの名無しさん
08/11/04 01:58:06
fflush(stdout); を入れるのは一つ目のprintfですよね?

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

となりました。

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

more が標準出力をバッファリングしており、自作のプログラムの出力をその都度画面に出力していないのでは?と思いますが、いかがでしょう。


300:デフォルトの名無しさん
08/11/04 02:14:20
ごめんなさい、何言ってるか分かりません・・・
自分の不勉強のようなので出直してきます。

301:デフォルトの名無しさん
08/11/04 02:19:23
>>300
いえいえ、そんなつもりはないです。
バッファリングについてかいておきますね。
printf() で出力した時点で、それが画面にそのままでるわけではなくて、いったん別のところにたくわえられており、
ある程度たまった時点で画面に出力される、という仕組みになっているのが普通です。

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

なにかわからないことがあれば遠慮なくきいていただいていいと思いますよ。レスポンスがあるかどうかは運まかせかもしれませんが。

302:デフォルトの名無しさん
08/11/04 03:00:02
strncpyは仕様が腐ってるので使うのやめとき。


303:デフォルトの名無しさん
08/11/04 03:08:05
どう腐ってるの?

304:デフォルトの名無しさん
08/11/04 03:09:44
終端文字列の扱いのこといってんだろう多分

305:デフォルトの名無しさん
08/11/04 09:28:37
strncpy()を使うくらいなら、spritf()を使いこなすか、いっそ自前で管理した方がいい希ガス。

306:デフォルトの名無しさん
08/11/04 13:08:21
つ strncat()

307:デフォルトの名無しさん
08/11/04 16:12:50
spritf

308:デフォルトの名無しさん
08/11/04 16:32:53
>305s/spritf/sprintf/

309:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/04 18:35:29
>for(k = 1;k <= i;k++);{
この行に注目。


311:デフォルトの名無しさん
08/11/04 18:44:17
>>310
printf("* %d",k);にしたところ

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

となりました・・・なぜ毎回k=1にならないんだ。

312:デフォルトの名無しさん
08/11/04 18:45:47
>>311
>310
他は見なくていい。

313:デフォルトの名無しさん
08/11/04 18:47:45
>>312
注目したのですがとくにおかしくないような・・・
i回の繰り返し文のはずです。

314:デフォルトの名無しさん
08/11/04 18:53:12
やっと気付きました。 for(k = 1;k <= i;k++);←ここですね{
くだらない質問で失礼致しました。ご指摘ありがとうございました。

315:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/05 01:42:04
do{

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

}while(0)

時々みるこれどうなのよ?テクッてて見易いとかいうやつは程がしれてるな

317:デフォルトの名無しさん
08/11/05 01:53:25
>>316
while (1) {if()break; if() break;}
とか
for(;;) {if () break; if () break; }
はよくみます。lint にひっかからないように for(;;) {} を使う、ていう意見も。
ループの脱出条件が2つ以上ある、というのであれば、これらのやり方もありだと思います。

318:デフォルトの名無しさん
08/11/05 02:18:01
>>317
論点がずれてる

319:デフォルトの名無しさん
08/11/05 02:22:47
大文字と小文字を区別しないコンパイラはありませんか?

320:デフォルトの名無しさん
08/11/05 02:24:46
そこまで大胆に規格を逸脱した実装は見たことないな。
せいぜいDOS/Windowsでヘッダ名が大文字でも行けるくらいしか知らない。

321:デフォルトの名無しさん
08/11/05 02:39:26
>316
どうなのよってお前の感想どおりだ

322:デフォルトの名無しさん
08/11/05 03:13:09
>>316
別にテクッてるとは思わないがいいんじゃないの

323:デフォルトの名無しさん
08/11/05 08:06:33
>>316
その書き方は嫌いだが goto 禁止なら仕方ないな

324:デフォルトの名無しさん
08/11/05 10:25:39
int main(){
(略)
 printf("test\n");
関数(Dname);
}

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

というプログラムがあったときに、testが表示されて
2が表示されずにセグメンテーションエラーでるのはどこに原因があると考えられますか?


325:デフォルトの名無しさん
08/11/05 10:27:13
略されたところに魔物が棲んでいると考えられます

326:デフォルトの名無しさん
08/11/05 10:58:22
324ですけど解決しました
関数の中の定義した配列のサイズがおおきすぎたためでした。

327:デフォルトの名無しさん
08/11/05 11:33:44
>>316
美しくないとは思ってたんだがそれに近い書き方だ
0じゃなくて条件1個だけど
どう書くべきなの?
条件をいっぱい書くとして抜けるタイミングが異なる場合はどうしたらいい?

328:デフォルトの名無しさん
08/11/05 11:37:59
>>316
初心者なのでよくわからないのですが
これはif ・・・・・ else if  ・・・
じゃだめなんですか?

329:デフォルトの名無しさん
08/11/05 11:39:58
>>328
それで組んでもさほど代わらないと思うよ。
むしろネストが増えるし

330:デフォルトの名無しさん
08/11/05 12:04:32
qsortでIPアドレスをキーにソートしたいんですが、うまくいきません。

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

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

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

どうやら割り当てされていないメモリ領域を参照しているみたいなんですけど、qsortをする際に変な領域を参照することとかあるのでしょうか。

331:デフォルトの名無しさん
08/11/05 12:08:08


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



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

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




332:デフォルトの名無しさん
08/11/05 12:55:18
>>330
デバッガってのはデバッグするためのツールなんだけどね・・・
まぁたぶんスタックが足りないんだろう。どーんと増やしてみては?

333:デフォルトの名無しさん
08/11/05 13:05:48
>>327
ループ条件が存在するならループで書いたって問題ないだろ

334:デフォルトの名無しさん
08/11/05 14:34:11
while(条件式)

if(){

continue;
}
if(){

}

}
1個目のifでcontinueした場合2個目のifはとばされて、whileの頭にもどりますよね?

335:デフォルトの名無しさん
08/11/05 14:46:20
やってみれ

336:デフォルトの名無しさん
08/11/05 14:47:34
なんでその程度の規模のプログラムで聞くかね・・・

さくっとサンプル作って、どういう動きするか
テストしてみればいいじゃん。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5391日前に更新/118 KB
担当:undef