スレを勃てるまでもな ..
[2ch|▼Menu]
113:デフォルトの名無しさん
09/03/06 01:11:00
C++の解説には、色々な入口から入る方法がある。
どの解説も同じでは面白くない、違う方が良い。
Cから順番に説明があったり、
いきなりクラスから説明したり、
それを読者が選ぶ事が出来る。良い時代です。
それぞれが、それぞれに良い




114:デフォルトの名無しさん
09/03/06 01:23:41
む。なるほどそういう考え方もあるか。確かに。
自分はCを学ぶにあたってポインタの習得にだいぶ苦労したので
Accelerated C++でCを勉強したときは目からうろこだった。

115:デフォルトの名無しさん
09/03/06 01:41:15
>>113
その考え方ステキだな。
俺は途中でロベールを読んだが、たま〜に知らない事が出てきて面白かった程度の記憶しか残っていない。
(逆に言えば特につっかからなかったとも言える。慣れてたからだろうけど。)
最初に読んでいたらきっと感慨も違っただろうなぁ。


116:デフォルトの名無しさん
09/03/06 01:58:46
私の考え方は他人と違う。。同じかもしれない。
機械語を逆アセンブルするときは、逆順、後ろから読む。
そして、終わったら前から順次読む。
本を読む時も同じ。逆から読む。
変かもしれない
人それぞれです、その人に合ったものを選ぶ事が出来れば幸せになります。
自分自身を知って、マッチする方法を選ぶ能力を養う
これが幸せへの法則かもしれません。





117:デフォルトの名無しさん
09/03/06 15:52:32
数値入力で1〜9999の範囲内で入力してくださいという
プログラムで範囲外だとエラー文を表示するのですが、
long型のオーバーフローする値(4294967296)を打ち込むと
入力エラーにならず読み込んでしまいます。
どういった対策をすればよいのでしょうか?
ちなみにint型で定義してあります。

118:デフォルトの名無しさん
09/03/06 15:53:13
コードは?

119:デフォルトの名無しさん
09/03/06 15:53:40
>>117
doubleで読み込めば

120:デフォルトの名無しさん
09/03/06 16:41:16
>117
入力部分と、保持する数値とを分離するとか。

>119
現実的にはともかく、理論的には変わんなくね? そうでもない?

121:デフォルトの名無しさん
09/03/06 16:45:22
string に読み込んで桁数判定した後数値変換するとか。

122:デフォルトの名無しさん
09/03/06 16:53:07
>>117
そういう時のscanf

123:デフォルトの名無しさん
09/03/06 18:15:57
scanfを恥ずかしげもなく使う男の人って。。。

124:デフォルトの名無しさん
09/03/06 18:17:48
男女以前にプログラマとしてどうか

125:デフォルトの名無しさん
09/03/06 18:18:29
別に普通

126:デフォルトの名無しさん
09/03/06 18:45:28
int64整数の補数をint32|int16へ最大値切り詰めにしても余剰bit切り捨てにしても
1〜9999条件なら 4294967296 (0x1 0000 0000)は弾いてくれると思うが
如何か

127:デフォルトの名無しさん
09/03/06 19:27:15
strtol を使えば大きすぎるのを入れたときはLONG_MAXになるから弾けるよ

128:デフォルトの名無しさん
09/03/06 19:35:05
>>126
弾けるのは4294967296とか、一部じゃないかw

129:デフォルトの名無しさん
09/03/06 21:33:28
キャストの弊害や精度不足の問題なら対処のしようがあるが
もしも 117 の不具合症状を含むライブラリや CPU が有るようなら大問題
概念的指摘ならば問題はないが数字を出して上手くいかないと主張するなら
実行環境を示して頂きたい。

130:デフォルトの名無しさん
09/03/06 21:53:18
バカは黙ってろw

131:デフォルトの名無しさん
09/03/06 21:54:39
>>117
>ちなみにint型で定義してあります。
といっているが、そもそもオーバフローする値が入力できるんだから元は
文字列とかint以外の値でしかありえない
それをintに変換した後ではじくのは不可能

面倒くさくても地道にやるしかない

1) 文字列のまま取得
2) 前後の空白とかとる
3) 数値以外のものがあったらエラー
4) 先頭の0を削除
5) 5桁以上ならエラー
6) 空文字列なら0
7) 整数変換
とか、まあがんばれ

132:デフォルトの名無しさん
09/03/06 22:31:45
まぁ、strtol()を使えば変換終了点が得られるからそこをチェックすれば事が足りるな。

133:デフォルトの名無しさん
09/03/07 01:18:09
ポインタは俺の理解を超えてやがる・・・・!!!

134:デフォルトの名無しさん
09/03/07 07:38:06
>>133
どうしたw突然何があった。
…まあ状況次第ではある意味大半の人の理解を超えているよ。

135:デフォルトの名無しさん
09/03/07 07:48:07
自分で組むだけなら、Cは良い言語だと心から言えるが、
他人のソースを読むと微妙な気分になる。
C++はまあまあ良い言語だが、他人のソースは
くそったれと思う。

って事かな?

136:デフォルトの名無しさん
09/03/07 08:22:39
俺は自分のソース見てくそったれと思う
もっときれいに書けないのかよ昔の俺

137:デフォルトの名無しさん
09/03/07 08:26:16
それはあなたの進化の証。

138:デフォルトの名無しさん
09/03/07 12:04:25
ソースなんて動けばいいよ。動くことが見た目に判ればそれでいい。

139:デフォルトの名無しさん
09/03/07 13:45:17
ポインタを解りやすく解説してくれるC++のサイト教えてください・・・
ロベール先生すいません
あなたの説明は僕の理解を超えている

140:デフォルトの名無しさん
09/03/07 13:47:43
>>139
適当な本を買った方がいいよ。
サイトは限界があると思う。
…そしてアドレスとポインタが分からないならロベール先生のせいじゃなくてまだC++に入るほどの腕じゃないと言うことだからC言語の本が良いと思うよ。

141:デフォルトの名無しさん
09/03/07 14:02:08
アセンブラやればポインタはわかる。
なのでPCプログラミングより8bitマイコンでも触るのお勧め。

ポインタが判らないという事はメモリマップとかスタックイメージも
脳内に浮かんでいないのは確実な訳で、それは計算機の知識が決定的に
欠けてる訳で、ってことはC/HWに限らずJVMやCLRも理解できない訳だから
一番見通しのいい低レベルハードウェアを触って身に付けるといいと思う。

142:デフォルトの名無しさん
09/03/07 14:39:23
>>141
あっそ。

143:デフォルトの名無しさん
09/03/07 14:53:10
#include <iostream.h>/*ロベール教室より*/

void ChangeToShohwa(int x)
{
if(1926 < x && x < 1989)
x -= 1925;
else
x = 0;
}

void Shohwa()
{
int nYear;

cout << "西暦を入力して下さい > ";
cin >> nYear;

ChangeToShohwa(nYear);
if(nYear)
cout << "その年は昭和 " << nYear
<< " 年です。" << endl;
else
cout << "その年は昭和ではありません。" << endl;
}

int main()
{
Shohwa();
Shohwa();
return 0;
}
なぜこれで失敗するのかが理解できない・・あほでごめんなさい

144:デフォルトの名無しさん
09/03/07 15:07:32
>>143
URLリンク(www7b.biglobe.ne.jp)
>

普通に理由が書かれてるじゃん。

145:デフォルトの名無しさん
09/03/07 15:08:00
>>144
手滑った

URLリンク(www7b.biglobe.ne.jp)
>引数は、新たに変数が作られ、それに値が代入されるという仕組みになっているからです。

146:デフォルトの名無しさん
09/03/07 15:17:51
>>142 何か気に障るようなこと言ったか?

147:デフォルトの名無しさん
09/03/07 15:20:35
ポインターは簡単、ポインターの解説が難しい。 上手に説明できたら天才。

148:デフォルトの名無しさん
09/03/07 15:33:45
つまり、なんだかんだでnYearの値が変更できないってこと・?

149:デフォルトの名無しさん
09/03/07 15:46:37
なんだかんだというかそのやり方だとnYearがこぴってわたされて
そのこぴったのを変更しているだけ

150:142
09/03/07 16:14:00
>>146
…俺の深読み誤解か。
スマン。

151:デフォルトの名無しさん
09/03/07 17:55:04
>>147
ポインターのような人間には解りづらく、そして機械に都合のいいように作られたものの使用を強制する言語はダメポ言語
普通は人間に合わせて言語が作られるべきだろ

152:デフォルトの名無しさん
09/03/07 18:16:59
ポインターは日本語に似合う。皆は知らぬうちに日本語会話の中でポインターを使っている。

153:デフォルトの名無しさん
09/03/07 18:33:00
>>151の考える素晴らしい言語のソースも、
ポインターを駆使して記述されています。

154:デフォルトの名無しさん
09/03/07 18:47:53
ボイン太さいこー!

155:デフォルトの名無しさん
09/03/07 19:01:39
>>152
This is it.

156:デフォルトの名無しさん
09/03/07 19:11:01
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
数秒以内にポインタiが何を指しているのか理解できないと
Cの初歩にすら達してないと言われた
お前らなら、一目瞭然で数秒どころか一瞬だろ

157:デフォルトの名無しさん
09/03/07 19:19:29
>>156
実際そんな使い方はまったくしない。
一目でわかりやすい宣言をするのが上級者。

158:デフォルトの名無しさん
09/03/07 19:25:03
実際は使わないが、錬度を試す訓練だよ

159:デフォルトの名無しさん
09/03/07 19:30:04
数秒でわかったらすごいわ
俺の場合、特に最後は()の解析で時間かかるぞ

160:デフォルトの名無しさん
09/03/07 19:33:59
そこに至るまでのコード次第
いきなり 156 が現れたら 書いた奴の精神状態を疑う。

161:デフォルトの名無しさん
09/03/07 19:59:17
>>159
俺、今でも数秒では無理だが、宣言をすらすらと解析できないとなると程度しれるよな
まだまだ初級のおれがちょっと前に新人にこのp何さしてるのって聞かれたのがこれ
int (CC::*(p[3]))(void);
これぐらいなら頻繁に使うだろうし、ム板連中なら一瞬だろ
ちなみに>>156は会社の新人PGのC言語コースの理解度試験

162:デフォルトの名無しさん
09/03/07 20:12:25
頻繁に使うか?
俺だったらまずtypedefするが…

163:デフォルトの名無しさん
09/03/07 20:24:13
爆釣

164:デフォルトの名無しさん
09/03/07 20:24:22
>>162
どういう風にtypedefするんだ?

165:デフォルトの名無しさん
09/03/07 20:28:02
URLリンク(mist000.h18.ru)
メンバーイニシャライザを使用したコンストラクタをクラス定義の外に分離したいんだが、
g++でコンパイルするとこのようなエラーが出る。
--------------------------------------------------------
uha@seven:~/dev/uhaww$ g++ -Wall -o debug debug.cpp
debug.cpp: In constructor ‘TestException::TestException(std::string&)’:
debug.cpp:8: error: ‘sCause’ was not declared in this scope
debug.cpp:8: error: expected `{' at end of input
debug.cpp: At global scope:
debug.cpp:10: error: redefinition of ‘TestException::TestException(std::string&)’
debug.cpp:8: error: ‘TestException::TestException(std::string&)’ previously defined here
--------------------------------------------------------
分離すること自体考えてはいけないのだろうか...
メンバーイニシャライザ使わなければ分離できるのに。。

間違いがあればよろしくお願いします。


166:デフォルトの名無しさん
09/03/07 20:28:56
>>162
まさか typedef int (CC::*(p[3]))(void)
なんて言わないよな
int (CC::*(p[3]))(void)が何をあらわすのか、解りやすくするtypedef頼むよ

167:デフォルトの名無しさん
09/03/07 20:29:28
実はほとんど俺の自作自演

>>164
typedef int (CC::*ccpoint)(void);
ccpoint p[3];
こんな感じにするんじゃね?

168:デフォルトの名無しさん
09/03/07 20:34:07
2ちゃんねる株式会社ではよく使います。

実際はベテランほど保守性を考慮して単純に書く。
Cの設計者でさえシンプルに書けと言ってるのに、
何を勘違いしてるんだろね。

169:デフォルトの名無しさん
09/03/07 20:38:15
むずかしっすぎる!

170:デフォルトの名無しさん
09/03/07 20:46:27
int (CC::*(p[3]))(void);
が頻繁に出てくるようでは駄目だと思うわ

171:デフォルトの名無しさん
09/03/07 20:57:19
Visual C++ 2008 Express Editionの使い方がよくわかりません。

講座サイトの解説で使ってるVisual C++はちょっと違って
現在編集中のプログラムを実行する方法がわかりません。

ご教授よろしくお願いします。

172:165
09/03/07 21:01:49
お騒がせしました、自己解決しました。

173:デフォルトの名無しさん
09/03/07 21:13:57
>>171
F1を押してヘルプを読め

174:デフォルトの名無しさん
09/03/07 21:18:57
>>171
スレ違いだろ

175:デフォルトの名無しさん
09/03/07 21:19:31
int (CC::*(p[3]))(void)のpって何を指す
日本語で書いてくれ

176:デフォルトの名無しさん
09/03/07 21:21:16
pは、配列です。何の配列かと言うと・・・次の人、どうぞ

177:デフォルトの名無しさん
09/03/07 21:22:20
パス!

178:175
09/03/07 21:26:55
あと、>>156
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
のiも頼む

179:デフォルトの名無しさん
09/03/07 21:34:36
もしかして、voidさん入店されてはります?

180:デフォルトの名無しさん
09/03/07 21:40:12
全然わからんw
1番目は多次元配列っぽくて、
2番目と3番目は関数ポインタの配列っぽいれすか?
あと>>161はメンバ関数へのポインタっぽい?

答えをたのむぅ。

181:デフォルトの名無しさん
09/03/07 21:48:22
実際のコードで、こんなの使っちゃダメだが、
Cの文法の知識として、本当におまえら、読めないのか?

javaばっかやってるから、バカになる

182:175
09/03/07 21:52:00
>>180
俺と似たような,orzレベルだな

色々レスしてる人たちって解ってるんでしょ、なら教えてくださいなーーーー

183:デフォルトの名無しさん
09/03/07 22:02:29
>>181
本当に読めないので、ぜひ、答えを

184:デフォルトの名無しさん
09/03/07 22:51:56
int **(*i[10])[4];
( ((int[10])へのポインタ)[4] )へのポインタ ×2

int (*i())[6];
(int f()のような関数へのポインタ)[4]

int *(*(*i)())[4]
( (int *f()のような関数へのポインタ)[4] )へのポインタ

ということでいいのか?

185:デフォルトの名無しさん
09/03/08 00:00:32
C言語パズルです、みたいなノリで出されるなら喜んでやるかも。

186:180
09/03/08 00:09:44
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数i。
2番目は二次元配列を戻り値とする関数i。
3番目は「関数ポインタを格納する二次元配列へのポインタ」へのポインタ。

わからーんw

187:180
09/03/08 00:50:52
んー。一番目はいきなり間違いだな。
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数iだとすると
int *(**i[10])[4]; と書く必要があるようだ。わからん・・・。答えはまだか。

188:デフォルトの名無しさん
09/03/08 01:11:50
int **(*i[10])[4]
intへのポインタのポインタの配列へのポインタの配列

int (*i())[6]
intへの配列へのポインタを返す関数

int *(*(*i)())[4]
intへのポインタの配列へのポインタを返す関数へのポインタ

189:180
09/03/08 01:21:47
なるほど、int **(*i[10])[4]の最初のint **は納されている型になるのか。
んでもって、(*変数名)[4]が多次元配列へのポインタで、
変数名の後の[10]がその変数の要素数になる、と。

だんだんわかってきた。おもしろい。w

190:デフォルトの名無しさん
09/03/08 01:39:49
外側から一つずつ剥がしていく。最初と最後の両側から剥がせるときは、最初を先に剥がす。
剥がしたものが、それぞれ
 int(などの普通の型名)であれば…… 「int」
 * であれば…… 「へのポインタ」
 [N] であれば…… 「の配列」
 (int,int) (など、カッコ内に型名)であれば…… 「が戻り値の型、(int,int)が引数の型である関数」
 MyClass:: であれば…… 「で、MyClassのメンバであるもの」
をつけていく。これで読めるはずだ。英語圏の人は逆向きにやるらしいけど。

191:デフォルトの名無しさん
09/03/08 01:45:13
あと、これとは直接関係ない話だが、intへのポインタへのポインタは、intの2次元配列とは別物だからね。
「ポインタ⇔配列」の互換ができるのは、末尾の「〜へのポインタ」「〜の配列」の部分のみ。

だから、ポインタの配列はポインタへのポインタで受けることができるし、2次元配列は配列へのポインタで受けることができるが、
2次元配列をポインタへのポインタで受けるのは不正。

192:デフォルトの名無しさん
09/03/08 01:51:13
>>190
読めないよ。

int &a
int func<int>()

193:180
09/03/08 01:52:14
大変よくわかりました。

194:デフォルトの名無しさん
09/03/08 01:56:42
167は正しいの?

195:デフォルトの名無しさん
09/03/08 02:07:28
正しいよ。

196:デフォルトの名無しさん
09/03/08 02:07:55
>>194 うん

197:デフォルトの名無しさん
09/03/08 02:26:30
C言語の宣言の文法は、もうちょっとマシな文法にならんかったの?
標準化するとき、誰からも反対が出なかったのが不思議なくらいだ。
頭がいい人がいっぱい集まってやってるハズなのに。

198:デフォルトの名無しさん
09/03/08 03:13:06
これでいいんじゃない?
っていうか、Quizみたいなみょうちくりんな宣言が必要になるプログラムは
そもそもの設計が間違っている気も。

199:デフォルトの名無しさん
09/03/08 03:21:05
Cだと、ポインタ型を別に作って欲しかった
後は関数ポインタの宣言を何とかして欲しかったくらいか

>>156をすらすら読み、161みたいなのを頻繁に使うプログラマにはなりたくない
161はtypedefしないらしいし…

200:デフォルトの名無しさん
09/03/08 04:01:48
>>199
もし>>156をtypedefを使って分りやすくしてくれと言われたらどのように
typedefする?有る意味typedefの練習になるんじゃないか


201:デフォルトの名無しさん
09/03/08 04:15:48
それらが何を意味するものとして使われているのか、それに基づいてtypedefすべきと思う。
例えばchar*をstringとしてtypedefしたり(C++ならstd::stringがあるけど)、単純に置き換えるんじゃなくて
意味が分かるようにしなければ、結局分かりやすくはならないんじゃないか。

202:デフォルトの名無しさん
09/03/08 04:37:26
>>201
普通はそうだが、練習なら良いんじゃないか
>>156を見てこれならどうtypedefしたらいいんだろと疑問に思っただけ
>>156は宣言構文解釈による頭の体操って感じかな
頭の体操なら現実では使わないものでも良いんじゃないか

203:デフォルトの名無しさん
09/03/08 04:42:15
>>201
つまり、windows.hを批判してるってことですね。

204:デフォルトの名無しさん
09/03/08 04:48:18
windows.h のそれは、int32_tとかwchar_tとかが無かった時代の産物としては存在意義があると思う。

205:202
09/03/08 04:55:42
>>203
本人のポリシーだから良いんじゃないの
ま、windowする時は、気に入らんでもwindowsの流儀に従ったほうが無難だろな

206:デフォルトの名無しさん
09/03/08 05:54:53
windows.hの場合は囲い込んで、移植させにくくしただけだろ。
gcc+Qtでなんも困らん。

207:デフォルトの名無しさん
09/03/08 09:50:09
俺もstdio.hで十分だわ

208:デフォルトの名無しさん
09/03/08 10:16:15
っつか、この世は俺1人で十分だ

209:デフォルトの名無しさん
09/03/08 10:29:48
>>208
さっさとジュース買って来い

210:デフォルトの名無しさん
09/03/08 11:34:40
つかMSはさっさとstdint.h対応しろと。C99決まってから10年なのに
何をしているのかと。

211:デフォルトの名無しさん
09/03/08 20:47:58
#include <iostream>
using namespace std;
#include <math.h>
#include <stdio.h>

void ChangeToShohwa(int x)
{
if(1926 < x && x <1989)
x -=1925;
else
x = 0;
}
int main()
{
int x;
ChangeToShohwa(x);
if
printf("昭和%d年ですよ",x);
else
cout<<"昭和じゃないです"<<endl;
}
: error C2061: 構文エラー : 識別子 'printf'
: error C2181: else 文が if と一致しません。

212:デフォルトの名無しさん
09/03/08 20:51:56
教えてください。
お師匠

213:デフォルトの名無しさん
09/03/08 21:03:52
>>212
それコンパイラか頭のバグ
コンパイラ何? 頭は何?

214:デフォルトの名無しさん
09/03/08 21:06:59
>>211
ifだけじゃだめだろ
この場合if(x)かな?
他もひどすぎて、思ったとおりには実行されないと思うが

215:デフォルトの名無しさん
09/03/08 21:08:52
>>213
VIsual C++ 2008

頭・・?

216:デフォルトの名無しさん
09/03/08 21:10:55
>>214
これのどこがひどいと言うんだ・・・!!
シンプルで無駄のないプログラムじゃないか!!

217:デフォルトの名無しさん
09/03/08 21:11:45
>>216
バカは失せろ

218:デフォルトの名無しさん
09/03/08 21:14:25
>>217
すいませんでした
出直してきます

219:デフォルトの名無しさん
09/03/08 21:18:15
>>215 じゃ、頭のバグだな。
int x = 1945;
void ChangeToShohwa(int& x)
if(x)
これで良いだろ

220:デフォルトの名無しさん
09/03/08 21:19:12
>>211から星の煌めきを感じる

221:デフォルトの名無しさん
09/03/08 21:20:14
ていうか、xを改変する意味が分からない
int返せよ

222:デフォルトの名無しさん
09/03/08 21:23:40
>>221
そう言うならおまえがそれやれよ

223:デフォルトの名無しさん
09/03/08 21:36:00
ワンパクでもいいタクマシク育ってほしい。

224:デフォルトの名無しさん
09/03/08 21:50:09
これ、ロベールからの引用じゃろ?
まともに動かなくていいのよ。この後、参照の話が出てきて
まともに動かない理由とちゃんと修正されたバージョンのコードが記載されてるから。

しかし、ロベールは2000年の記事じゃから古いぞ。
使っているコンパイラもVC++6で著者自身が
環境依存はいやだと書いているくらいだし。

225:デフォルトの名無しさん
09/03/08 21:58:42
>>221
Googleのプンソで採用されているコーディング標準では
参照パラメータはすべてconstにせよってあった。

まぁ、それはさすがに行き過ぎだと思うけど
関数の可読性という点ではなるほどとも思う。

226:デフォルトの名無しさん
09/03/08 22:31:38
プンソって何?と一瞬思ったがオプソか。

227:デフォルトの名無しさん
09/03/08 22:58:21
>>221
>>145


228:デフォルトの名無しさん
09/03/08 23:02:07
西暦と昭和を同じ変数で扱うのが気持ち悪いってことじゃねーの?

229:デフォルトの名無しさん
09/03/08 23:22:01
西暦形式で格納されてる変数がいつのまにか(ではないけど)
和暦形式に代わってるとか死ねとおもうね

230:デフォルトの名無しさん
09/03/09 00:05:10
年クラスを作って、get西暦とget和暦メソッドを用意するべきでしょうか。

231:デフォルトの名無しさん
09/03/09 00:07:37
時刻クラスを基本クラスとして、西暦クラスと和暦クラスを派生させるんだろ。

232:デフォルトの名無しさん
09/03/09 00:12:49
出来事 vector に年月変換機能を備えたイテレータが美しいと思うよ。

233:デフォルトの名無しさん
09/03/09 01:07:34
日単位で持っておいて、月以上に変換するときは暦クラス通すようにすれば。

234:デフォルトの名無しさん
09/03/09 03:14:07
「和暦表示じゃないと、絶対困る!」
って言われること、けっこう良くあるけど、
天皇が暗殺されたら、どうするのかね?

235:デフォルトの名無しさん
09/03/09 03:48:14
簡単に追加修正できるようにSQLite、CSV、XMLででも持っとけよ。
そんなの昭和64年からの常識だろ。

236:デフォルトの名無しさん
09/03/09 08:07:31
天皇が暗殺されても今までの和暦がなくなる訳じゃないしなぁ。

237:デフォルトの名無しさん
09/03/09 08:37:29
西暦だって、新宗教に宗旨替えして新西暦0年にリセットするかもしれないし、
イスラムが再び勃興してイスラム暦に切り替わるかもしれない。

UTCみたいな無色透明な基準年が必要だな。

238:デフォルトの名無しさん
09/03/09 09:31:35
UTCのどこが無色透明だって?

基準だったら皇紀でもいいわけだろ。

239:デフォルトの名無しさん
09/03/09 09:50:40
いやぁおまいらの講義はみてて勉強になります。
小生も美しいコード書けるようになりたいですハイ。

弟子入りさせて貰えませんか?

240:デフォルトの名無しさん
09/03/09 09:55:34
地球の誕生年を元年にすればいいじゃん。
俺が小学生の頃、46億年前に地球ができたって聞いたから今は46億18年だな。

241:デフォルトの名無しさん
09/03/09 09:59:49
地球の紀元は今後変動する可能性があるので基準にできません。

242:デフォルトの名無しさん
09/03/09 10:04:54
じゃあ宇宙で。
ビッグバン歴

243:デフォルトの名無しさん
09/03/09 10:07:09
同じ理由で却下

244:デフォルトの名無しさん
09/03/09 10:44:56
それにしても、1926年は殆ど昭和じゃないんだがなぁ。
同じように、1989年も殆ど昭和じゃないし。

245:デフォルトの名無しさん
09/03/09 10:51:46
VCでコンソールアプリを作成し起動します。その後外部のPGから、
SendKeysやPostmessage,標準入力などでキー送信を送ろうとしているのですが、
SendKeysの場合:通常のキーは受け付けるがファンクションキーは駄目
Postmessage、標準入力の場合:何も受け取らない
となります。
ファンクションキーを送信したいのですがどうすればいいのでしょうか?
アドバイスお願いいたします。

・DOSプロンプトだと標準入力はちゃんと受け付けるが、コンソールアプリは受け付けない
->DOSプロンプトとコンソールアプリの仕組みは別物?


246:デフォルトの名無しさん
09/03/09 11:31:49
送れないこともないだろ?
今どうやってんの、C++/CLIなのか?

247:デフォルトの名無しさん
09/03/09 11:35:00
>>245
PostMessageやSendMessageがダメなのは知ってる。
他は知らない。

248:デフォルトの名無しさん
09/03/09 11:54:27
>>246
> 送れないこともないだろ?
> 今どうやってんの、C++/CLIなのか?

VC++6.0MFCコンソールアプリ で作りました。送る方はVB.NET2005です。
PostMessageはWM_CLOSEは送れたようです。その他は
SendKes.Send(chr(0))
SendKes.Send(chr(62))
とするとchr(62)は送れるんですが、chr(0)は無視されますっていうか
SendKes.Send(chr(0)) っていうのはVBでは無謀なのかな、でもvbNullStringでも
駄目でした。

それに標準入力で送れないのはなぜなんでしょう?(DOSプロンプトへはおくれるのに)



249:デフォルトの名無しさん
09/03/09 11:54:41
[1] 授業単元:趣味
[2] 問題文(含コード&リンク):
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
 [3.1] OS: XP
 [3.2] コンパイラ名とバージョン: MSC ver.5.1
 [3.3] 言語:C

パスワードの入出力プログラムをつくりたい。
PASSは4文字とし、1文字入力される毎に'*'を1個表示し、
4文字入力後パスワードをチェック。
PASSが正しければ「システムの使用を許可します」と表示し、
間違っていれば3回再入力させて、3回を超えたらエラーを表示。
(パスワードは予めプログラム内部で定義されているという前提で)

こういうプログラムを書いてみたのですが、main以下「*password=1994」を
正解として宣言し、else文の部分でc[i]と*passwordを認識させてprintfで
c[i]を表示させたいんですけれどもうまくいきません。

何故でしょう?
何となく原因はわかるのですが、漠然としていて手が出せないんです。

上のコードをみて、名人方のアドバイスをお聞かせ願いたい。

250:デフォルトの名無しさん
09/03/09 12:00:25
>>245
SendInputはどう?

251:デフォルトの名無しさん
09/03/09 12:16:23
>>249
何をやりたいのかの説明がおかしいし、プログラムに至っては支離滅裂だ。
c[i]に文字を入れているのなら、1994なんて数値を入れちゃダメだろ。
初歩からやり直すことをお勧め。

252:デフォルトの名無しさん
09/03/09 12:21:31
>>240
位置エネルギーと一緒で無限遠を元年にすればいい

253:デフォルトの名無しさん
09/03/09 12:31:54
>>249 メモ帳べた書きでコンパイルしてない。好きにしろ。
#include <stdio.h>
#include <conio.h>
int main(){
 const char* password = "1994"; int count = 0;
 do{
  int i; char input_password[4];
  printf("パスワードを入力して下さい。(4文字): \n>");
  for(i = 0; i < 4; ++i){input_password[i] = getch(); putchar('*');}
 }while(!strcmp(password, input_password) && count++ < 3);
 if(count >= 3){
  puts("仏の顔も三度まで!\n正式なpasswordがないとシステムは使用できません!");
 }else{
  printf("password = %s\nシステムの使用を許可します。\n", password);
 }
}

254: ◆XD9CNUCqag
09/03/09 12:33:47
>>249です。

>>251
なるほど、確かにおっしゃるとおりだと思います。

説明不足で申し訳なく。
このプログラムは'1994'というPASSを定義して、c[i]に入力させてそのPASSを
入力させたら正解、それ以外なら間違いで再入力させるといった感じでつくりたかったんです。

そして、私はCを学び初めてほんの1ヶ月くらいの素人でありまして
現在進行形で勉強中の身であります。
初歩から学んでいるつもりなのですが、何分覚えることが沢山すぎて手探りな状況な次第。
もし、よければ勉強するポイントなど上げて貰えると助かるのですがお願いできますでしょうか?


255:デフォルトの名無しさん
09/03/09 12:35:41
伝統的なポイントな。

1) 初心者です、を免罪符にした発言を慎む。
2) 一歩目から他人に頼るな。努力の跡すら見えないのは相手にされない。

256:デフォルトの名無しさん
09/03/09 12:39:56
小心者です。
インポ目で他人を頼って(ry

257:デフォルトの名無しさん
09/03/09 12:40:16
>>254
一ヶ月もあれば、パスワード入力くらい書けるようになる。
それができていないのは、初歩からきちんと自分のものにしていないのではないだろうか。
まさかとは思うが、本を読んで理解した気になっただけで書けるようになるとは思っていないだろうな。

まぁ、先ずはもっと単純な文字入力からおさらいしてみようかw

258:デフォルトの名無しさん
09/03/09 12:45:28
宿題スレに張り付いて課題こなしてたら力量うp。

259:デフォルトの名無しさん
09/03/09 12:56:16
>>253
メモ帳だとその程度か
input_passwordが0終端してないぞ

260:デフォルトの名無しさん
09/03/09 13:00:26
宿題スレは単にバカな質問を受け流すためのハコだからな・・・

261: ◆XD9CNUCqag
09/03/09 13:15:40
>>255
肝に銘じます。

>>257
言われてみれば、本を読んでたら出来るようになるとは少なからず思っていました。
でも、実際やってみて全然出来ないどころか、覚えることすら出来ていないことに
自己嫌悪に陥っています。

単純な文字入力から勉強し直してみます。

>>258
宿題スレの名人方は、添削するより、ひたすら課題を自分でこなしていく
のが好ましいようなので、張り付いてだけじゃ私の力量うpには繋がりませんよね・・・。

参考にはなっていますけども。

262:デフォルトの名無しさん
09/03/09 13:25:08
>>261
本を読むだけでも相当な勉強になる。
…ただしただ読み流すだけではダメで、理解しながら読まないと、ただ字面を追っているだけになる。。
そして少しでも疑問に思ったら先へ進まないでコーディングしてみる。
この辺は中高生の数学と共通する物がある。

ってな感じが俺の認識。


263:デフォルトの名無しさん
09/03/09 13:25:40
実はここまで全て俺の自演

264:デフォルトの名無しさん
09/03/09 13:27:35
>>261
自分で回答するんだよw

265:デフォルトの名無しさん
09/03/09 13:29:31
>>261
自分でも答えを考えるんだよ。

266: ◆XD9CNUCqag
09/03/09 14:34:43
>>262
>…ただしただ読み流すだけではダメで、理解しながら読まないと、
 ただ字面を追っているだけになる。
はい、どうやら私は読んで理解したつもりだっただけで
字面を追っていることをこれまで繰り返していただけのようです。

「早くCの知識を身につけたい」という気持ちだけが先走っていたといいますか。
勉強しても早々簡単にはみにつかないものなのにおかしいですね。

>>264
もし自分で回答なんかしちゃったりしたらら駄目だしされまくりで
精神的に辛すぎるような気もしますが・・・


267:デフォルトの名無しさん
09/03/09 15:24:29
>>266
ダメだしされて何が悪い。直せばいいじゃないか。
ダメだしも指摘もなければずっと悪いままだぞ。

268:デフォルトの名無しさん
09/03/09 15:43:56
昼間に2ちゃんねるに書き込んでる人間なんてスキルも無いロクでもない人間なんだから
講釈なんて聞いても無駄だよ。

自分ができない夢を語っているだけなんだから。

269: ◆XD9CNUCqag
09/03/09 16:46:35
困りました・・・

文字入力の基礎からやり直そうと思って勉強し直してるんですけども
いつまでたっても目的のパスワードプログラムが出来そうもない・・・

何となく問題の原因はわかりかけてるんだけど、漠然としてて・・・
そっから全然前に進まない

ほんと使えないなぁ・・・私って・・・OTL

>>267
確かにその通りかもしれません
すぐには無理でしょうが、いずれ力量うpしたら実践してみたいと思います。

270:デフォルトの名無しさん
09/03/09 17:16:13
文字コード、文字列、数値

271:デフォルトの名無しさん
09/03/09 17:50:37
ゆっくりいこう

272:デフォルトの名無しさん
09/03/10 01:04:54
あるバージョンのgccでは、複数のスタティックライブラリをリンクするとき
liba.aがlibb.aの関数を使用し、libb.aがlibc.aの関数を使用しているとき
gcc -o prog main.o liba.a libb.a libc.a の順番に書かないとundefinedなんとかというエラーが出る。

もしも、liba.aとlibb.aの双方が互いの関数を使用している場合、
これらのスタティックライブラリを上記のgccでリンクするにはどうすればよいのか。

273:デフォルトの名無しさん
09/03/10 02:46:29
gcc -o prog main.o liba.a libb.a libc.a liba.a

274:デフォルトの名無しさん
09/03/10 02:49:11
>>272
そうならないようにモジュールの配置を見直す。

275:デフォルトの名無しさん
09/03/10 07:01:54
>>272
そういうのを循環参照と言って、良くない設計の兆し。


276:デフォルトの名無しさん
09/03/10 08:38:45
gccって、あるバージョンとか噂とか、不確かではっきりしない事を
よく書かれてるな。

277:デフォルトの名無しさん
09/03/10 12:32:55
>>272
昔のHP/UXにもそういうの(順序を人間が決めないといけない)があって
lorder | tsort で依存関係をトポロジカルソートして makefile に食わせた覚えが。

278: ◆XD9CNUCqag
09/03/10 13:59:34
/* getchar.c */
# include <stdio.h>
int c, cc;
main(){
printf ("getcharの実験 Ctrl + Z で終了\n");
while ((c=getchar())!=-1) {putchar('*'); putchar(c);}
printf ("getchの実験 スペースキーで終了\n");
while ((cc=getch())!=32) {putchar('*'); putchar(cc);}
}

このプログラムの「while ((c=getchar())!=-1)」の「!=-1」って
「Ctrl + Z」をあらわしてるんですかね?
それと、「while ((cc=getch())!=32)」の「!=32」ってのは
「スペースキー入力」を意味してるんでしょうか?

いま、入出力を勉強中なのですが、これがよくわからなくて。
教えて下さい、お願いします。

279:デフォルトの名無しさん
09/03/10 14:02:32
32はASCIIコードでスペース
-1はEOFだろ。Ctrl-Zかどうかは環境による。

280: ◆XD9CNUCqag
09/03/10 14:11:10
>>279
なるほど。
では、上のプログラムを数字の「1994」と入力したら終了するように
書き換えるにはどうすればいいのでしょうか?

自分では、「!=1994」と記述すれば問題ないだろうと思っていたのですが
実行してみると全く終了する気配がありません。
コンパイルも正常に通り、延々と入力させるプログラムに成り果ててしまいました。

281:デフォルトの名無しさん
09/03/10 14:15:22
数値の1994と比較したいなら
atoi(str) != 1994
まあ普通は
strcmp(str, "1994") != 0

282:デフォルトの名無しさん
09/03/10 14:29:11
そのマジックナンバーは「悪い例」として何かに載ってるのかな・・・

283:デフォルトの名無しさん
09/03/10 14:32:40
>>249からの流れか。
ってMSC5.1?
MS-DOSの頃のじゃないのかそれw

284: ◆XD9CNUCqag
09/03/10 14:49:37
>>281
なるほど、atoi関数使って整数文字列を整数値に変換してからでないと
いけなかったんですか

ということは文頭の#includeにstdlib.hを追加しないといけないのかな
ありがとうございます名人

私は名人のようなPGになりたいです!

>>283
はい、そうです。
調べてみたらPC9800シリーズに標準装備されてた頃のやつっぽいです。
まぁ、今のところ不自由はしていないので古くてもいいかなって思って
使っています。

285: ◆XD9CNUCqag
09/03/10 16:04:26
あのーまたまたへたれ過ぎる質問で恐縮なのですが、

/* getchar.c */
# include <stdio.h>
int c, cc;
main(){
printf ("getcharの実験 Ctrl + Z で終了\n");
while ((c=getchar())!=-1) {putchar('*'); putchar(c);}
printf ("getchの実験 スペースキーで終了\n");
while ((cc=getch())!=32) {putchar('*'); putchar(cc);}
}

この「while ((c=getchar())!=-1)」の「!=-1」の部分を「atoi(str) != 1994 」
に書き直すにはどうしたらいいんでしょうか?
自分でやってみたらえらい不細工な文になってしまってとても見てられたものじゃ
なかったもので・・・ご教授願いたいのです

286:デフォルトの名無しさん
09/03/10 16:14:09
まずは1文字入力したら配列に追加していく仕組みを作ってみ
別関数にするのがいいけど

287:デフォルトの名無しさん
09/03/10 16:46:12
>>285
char str[1024] = {0};
int i = 0;
とか宣言して
str[ i++ ] = c;
を追加

288:デフォルトの名無しさん
09/03/10 17:11:10
「一文字入力したら配列に追加していく仕組み」は
>>249のリンク先のコードの中にもう入ってるんだけどねー
・文字=数値(ASCIIコード)
・文字列=文字の配列
質問者が↑をまだ理解しきれてないんじゃないのか

あとatoi()をパスワード認証に使うのは同意できない
パスワードも入力も文字列なのに、なぜ数値に変換する?
例えばもしパスワードが"1994"でなく"0083"だったら、入力が
"0083"でも"083x"でも"83xx"でもOKになるんだけど、それが君の望む挙動なの?
自然に文字列どうし比較しようよ。「普通はstrcmp()」って書いてくれてるやん

『文字列は難しい』ってみんなが脅すから避けてるのかもしれないけど
『文字列(をうまく説明するの)は難しい』の意味だから気にせず勉強しろよ
理解できた後なら『俺どーしてこんな質問してたんだろ』ってなるよ、絶対


289: ◆XD9CNUCqag
09/03/10 17:25:18
>>287
こんなERRがでちゃいました;;
URLリンク(kansai2channeler.hp.infoseek.co.jp)

gch2.C
gch2.C(8) : warning C4135: conversion between different integral types
gch2.C(11) : warning C4016: 'strcmp' : no function return type, using int as default
gch2.C(11) : warning C4071: 'strcmp' : no function prototype given
gch2.C(15) : warning C4016: 'getch' : no function return type, using int as default
gch2.C(15) : warning C4071: 'getch' : no function prototype given
gch2.C(18) : warning C4035: 'main' : no return value


290:デフォルトの名無しさん
09/03/10 17:33:23
初心者で、関数の勉強中です。
テキストがカーニハン&リッチーなんですけど、ここでのハロープログラムは
#include<stdio.h>
main()
{
printf("hello,world\n);
}
と、とてもシンプルなんですけど、ネットを見ると
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
になっています。要するに
#include <stdio.h>
int hello(void);
main()
{
hello();
}
int hello(void)
{
printf("Hello, World!\n");
return 0;
}
というのが合わさったものと考えていいのでしょうか?
今コンパイラがある環境のPCからじゃないので、
上のプログラムでコンパイルされるかすら分からないのですが・・・。

291: ◆XD9CNUCqag
09/03/10 17:36:06
>>288
全然理解仕切れていないのでもう少し文字列について辺りを勉強し直そうと
思います

atoi()は、使っていて自分には荷が重い関数かもしれないと思ったので
「strcmp()」を使うことにしました。
まだ「strcmp()」も勉強不足で理解していないのでそこも勉強し直しの
範囲に入りますが。

今回、漸く自分の勉強課題が見えてきたような気がします。
>>288さんの言葉を励みにして頑張りたいと思います。

292:デフォルトの名無しさん
09/03/10 17:54:12
C言語を始めようとかいうソフトでプログラミングしてコンパイルするじゃないですか
そして完成したファイルがコマンドプロンプトで実行されるんですけど
GUIってどうやって付けるんですかね、タダでやりたいんですけど

293:デフォルトの名無しさん
09/03/10 17:58:41
>>290
それでコンパイルは通る。けど、K&Rはそういう意図で書いてるわけではない。
本来mainの戻り値は必ずintなので、厳密に文法どおりなのはネットのほう。
(戻り値をintと明記し、引数をvoidと明示し、0を返す)
K&Rのほうは警告オプション付でコンパイルすると
「戻り値の型が書いてないから勝手にintにするぜ」とか
「returnがないぜ」とか警告が出るはず。
K&Rはおそらく「一番はじめの入門だから、できるだけ例は短いほうがいいに決まってる」
ぐらいの気持ちでそう書いたんじゃないのか。信者には別の言い分があるのかもしれんが

294:デフォルトの名無しさん
09/03/10 18:03:27
K&Rを最初の本として選択するのはやめれ。
あれは他の言語をばりばり使っている人のための
「C言語仕様確認書」みたいなものであって
戻り値も知らないような初心者には難しい。

295:デフォルトの名無しさん
09/03/10 18:08:12
一応、戻り値がないときはint, mainだけは戻り値を返さなくても良いと決まっていた…ような
だから、間違ってはないはず…

記憶が曖昧なんであまり当てにしないでくれ
不親切なのには同意するが

296:デフォルトの名無しさん
09/03/10 18:13:43
そうだよ。 main は戻り値を返さなくてもいい。
なぜなら main が戻す値をどう扱うかが環境依存なので。

297:デフォルトの名無しさん
09/03/10 18:14:42
#include <conio.h>
#include <stdio.h>

int main()
{
int turn, i, ch;
char pass[5];

for (turn = 0; turn < 3; turn++) {
printf("パスワードを入力してください>");
for (i = 0; i < 4; i++) {
ch = _getch();
if (ch == EOF) return 2;
printf("*");
pass[i] = ch;
}
printf("\n");
pass[i] = '\0';
if (strcmp(pass, "1994") == 0) {
printf("Ok\n");
return 0;
}
}
printf("NG\n");
return 1;
}

298:デフォルトの名無しさん
09/03/10 18:16:04
>>293-294
ありがとうございます。
学校で押し付けられたテキストがK&Rだったので・・・。
ネットを参考にしたら何か違うぞ?ってずっと思ってました。
main()は不可侵な関数だとてっきり・・・。

明日学校でガッツリと関数の勉強します。
K&R以外のテキストで・・・。
C言語って難しいっすね。

299:デフォルトの名無しさん
09/03/10 18:17:51
>>295-296
補足ありがとうございます。
戻り値とかもまだまだあやふやですが頑張ります。

300:デフォルトの名無しさん
09/03/10 18:18:56
大昔はK&Rが仕様だったらしいな(知らんけど
その後に仕様ができたんで、「K&Rが仕様どおりでない!」
ってのはある意味あってるけどお門違いかもしらん

301:デフォルトの名無しさん
09/03/10 18:25:18
K&Rが終わって 僕等は生れた
K&Rを知らずに 僕等は育った
プログラマになって 歩き始める
オブジェクト指向を くちずさみながら
僕等の名前を 覚えてほしい
K&Rを知らない 子供たちさ

302:デフォルトの名無しさん
09/03/10 18:37:04
int main(void)とかいちいちやるようなヤツのプログラムなぞその一行見ただけで他見る気なくす

303:デフォルトの名無しさん
09/03/10 18:41:13
それはない…
「いちいち」もなにもmainは一個しかないだろうが…
暗黙の宣言やらなんやらで警告出まくりなのに
コンパイル通ってるんだからよしとするヤツのほうがきついわ

304:デフォルトの名無しさん
09/03/10 18:43:17
int main ( void )
main()
void main()
int main()



305:デフォルトの名無しさん
09/03/10 18:45:43
この話題定期的に出るな。規格準拠スレでやれ。

306:デフォルトの名無しさん
09/03/10 18:47:08
ごめんなさい

307:デフォルトの名無しさん
09/03/10 18:59:46
石田晴久さん死去 インターネットの基礎築く
URLリンク(www.j-cast.com)


308:デフォルトの名無しさん
09/03/10 19:17:14
石田晴久といえばK&R

309:デフォルトの名無しさん
09/03/10 20:03:53
しつこいようだが、ANSI、ISO準拠の標準スタイルでは
main関数への引数がないのであれば、C言語では int main(void)
C++では int main() voidを書かなくて良いとのこと。
また、main関数はint型の戻り値とのこと。あくまでも準拠。

310:デフォルトの名無しさん
09/03/10 20:20:11
さらに、プログラムの開始はmain関数とのこと。その条件も含めて標準スタイルとのこと。
個人スタイルの押し付けをしていたら、キリがない。そこんと、よろしくー

311:デフォルトの名無しさん
09/03/11 09:26:13
ポインタ天国3を、ようやく私は理解することができた・・

312:デフォルトの名無しさん
09/03/11 10:46:43
main関数への引数を使う場合、int argc , char *argv[] というのも
ANSI、ISOでは標準スタイルとして提唱している。ただし、
main関数内でその変数を用いていない場合、警告が出るので
何事も必要に応じて適切に。以上。

313:デフォルトの名無しさん
09/03/11 11:40:53
>int argc , char *argv[]
めんどいからint ac,char *av[]って書いてる。
あとchar **argvって書くべきって意見も昔聞いた。

314:デフォルトの名無しさん
09/03/11 11:53:57
4文字省略すると面倒じゃなくなるのか

315:デフォルトの名無しさん
09/03/11 12:03:58
> char **argvって書くべきって意見
覚えてる限りでいいからkwsk

俺も最初は**で書いてたけど、
mainの中で結局
for (i = 0; i < argc; i++) {
 argv[i];
}
とかして[i]でアクセスするから、
*argv[]のほうが素直だと今は思ってる。

316:デフォルトの名無しさん
09/03/11 12:09:28
どっちでも同じ意味だからどっちでもいいと思うが。

データが連続していることを連想しやすいように[]を使うと言う意見もあるが、
argvのようにポインタの指す先が連続していて更にその中身のポインタが連続していることを表現できるわけじゃないし。

>>315
例えばstrcpy()のような関数を自分で実装するとしたら
char * strcpy(char dest[], char const src[]);と書くの?
私は素直にchar * strcpy(char * dest, char const * src);と書くが。

317:デフォルトの名無しさん
09/03/11 12:30:38
> データが連続していることを連想しやすいように[]を使うと言う意見もあるが、

それはよくわからんが、
char *p;なら *(p + i)などという操作をイメージし、
char a[];なら a[i]という操作をイメージするという程度。

配列やポインタを渡す関数のパラメータは、
ポインタで統一して書いてる。
ポインタであるのに配列であるかのような書き方は嫌だ。

そういう意味では、mainのargvだけ特別扱いしてることになる。
同様の例でもmainじゃないとchar **ppとしてる。
mainのときは用途が>>315に書いたように定型化してるというか、
argcを参考にargv[i]とするのを尊重してやりたいというか。


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

5389日前に更新/124 KB
担当:undef