09/03/02 00:39:37
janeの隠し機能
1.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
3:デフォルトの名無しさん
09/03/02 00:40:06
36年間悩んでます。お力をお貸しください。
PSのアークザラッドⅡというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッドⅡは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
・URLリンク(www.gradius2.com)
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
4:デフォルトの名無しさん
09/03/02 00:40:12
>前スレ997
お前はあんなことのために2^32バイトだか2^64バイトだかの配列を確保するのか?
バカだろ?
5:デフォルトの名無しさん
09/03/02 00:41:28
テンプレートの使い方で分からないんだけど、
template <typename T>
class Myclass
{
public:
T mem;
//他、Tを使ったメンバ関数・メンバ変数が多数
int foo(int x){std::cout << x << std::endl;return x;}
double foo(double x){std::cout << x << std::endl;return x;};
unsigned long foo(unsigned long x){std::cout << x << std::endl;return x;};
};
のようなクラスがあって、呼び出すときは
Myclass<char> hoge;
hoge.foo((int)-1);
hoge.foo((double)3.14);
hoge.foo((unsigned long)42);
のように使っている状況。
で、この3つのfooをテンプレートにしてまとめたいんだけど、どうすりゃいいかね??
template <typename T,typename U>
class Myclass
{//~~};
とは意味合いが違うじゃん。。。
6:デフォルトの名無しさん
09/03/02 00:44:32
>>1
乙。
7:デフォルトの名無しさん
09/03/02 00:46:14
>>1
乙彼。
あと>>5はかわいそうな人による釣りだから皆様 無視してくださってかまいません。
8:デフォルトの名無しさん
09/03/02 00:49:39
>>1
乙
9:デフォルトの名無しさん
09/03/02 00:55:15
>>5 に対して複雑怪奇な提案したいけど思いつかない。。。
10:デフォルトの名無しさん
09/03/02 01:03:32
>>4
状況にもよるが全然ありだろ
大規模なNUMAマシンとかならおそらく最速だ
マルチスレッドにもしやすいしな
11:デフォルトの名無しさん
09/03/02 01:05:16
>>4
草ついてないとこを見ると……もしかして天然?
だとしたら痛いぞ。
12:デフォルトの名無しさん
09/03/02 01:08:59
メモリのことより比較する配列がある程度長くないと、素直にやるより遅くならない?
13:デフォルトの名無しさん
09/03/02 01:21:17
いや、まずその「素直」を提案せな。……というだけだとさみしいんで提案。
a1[0]を仮の共通要素とおく。
aM(Mは1-5)について仮値以上になるまで添え字インクリメント。
->越えたらその値を仮値としてM=1からやりなおし。
->同値なら次のMへ。M>5なら仮値を共通値として保持。保持した共通値を超えるまでa1の添え字をインクリメントし、その要素を仮値とする。
いずれかの添え字が範囲外になったら終了。
これよりはint分配列確保の方が、計算量は少ないな(終了条件が早期に成立した場合は別)。
a1-a4はインクリメントのみ。a5は比較のみ(インクリメントは不要)で済む。
14:12
09/03/02 01:26:31
前スレでそもそもの質問者が出したやつのことな
>>13
変に凝ってばかみたいだね
15:デフォルトの名無しさん
09/03/02 01:41:12
最終的にサイズUNIT_MAXの配列をひと舐めするワケだしな
16:デフォルトの名無しさん
09/03/02 02:14:44
両方の最大最少値から if 条件を最適化する位しか思いつかんね
17:デフォルトの名無しさん
09/03/02 02:17:01
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
18:デフォルトの名無しさん
09/03/02 02:22:38
可変長引数のコンストラクタを持つクラスの継承を行いたいのですが、引数の受け渡しがうまくいきません。
class hoge{
hoge(int i,...);
}
class piyo:public hoge{
piyo(int i,...):hoge(ここが分からない){
~
}
}
上記のような感じです、
hogeのコンストラクタを丸々コピーする以外に何か方法があればご教授お願いします。
19:デフォルトの名無しさん
09/03/02 07:05:32
>>15
氏んでEYo!
20:デフォルトの名無しさん
09/03/02 08:16:00
>>19
死ね
21:デフォルトの名無しさん
09/03/02 08:21:52
>>12
素直なやり方を書いて実際に比較してみたら?
っていうか、あんたの言う素直なやり方ってどんなのか、ソースあげてみてよ。
22:デフォルトの名無しさん
09/03/02 08:26:06
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
23:デフォルトの名無しさん
09/03/02 08:42:05
>>18
そんな事してねーで孝三隊のポインタに氏たら?
24:デフォルトの名無しさん
09/03/02 09:17:58
>>18
piyoてなにおまえ? ふざけてんの? ヒヨコなの?
25:デフォルトの名無しさん
09/03/02 09:24:52
うん
26:デフォルトの名無しさん
09/03/02 10:33:34
ここはいつからこんなクソスレになった?
27:デフォルトの名無しさん
09/03/02 12:08:47
>>18
テンプレート構造体つかえ。
28:デフォルトの名無しさん
09/03/02 12:42:39
>>18
可変長の引数は止めたほうがいい。
オブジェクトを作って渡す様にしたほうがいい。
29:デフォルトの名無しさん
09/03/02 19:10:19
可変長の引数はやめたほうがいい…誰かがそんなこといってたな。
30:デフォルトの名無しさん
09/03/02 20:07:51
template<typename T, int len>class A{
T (&X)[len];
public:
A(T(&x)[len]): X(x){};
};
int B[10];
A<int, 10> B(b); // error:b is not a type
オレ何勘違いしてるか教えてくれ。
31:デフォルトの名無しさん
09/03/02 20:09:35
訂正。
A<int, 10> a(B); // error:b is not a type
32:デフォルトの名無しさん
09/03/02 20:22:50
>>30
通った。 VC9, gcc4.3.2
33:デフォルトの名無しさん
09/03/02 20:33:06
あのぅ、
あるクラスがlistとそのlistのカレント要素をメンバでもつ場合、
カレント要素をiteratorにするのは好ましいでしょうか?
好ましくない場合どのようにカレント要素を
持つのが一般的でしょうか?
34:デフォルトの名無しさん
09/03/02 20:35:53
ちなみにそのlistは途中でaddやdeleteされる場合があります
35:30
09/03/02 20:51:55
class C{
int B[10];
A<int, 10> a(B); // error:B is not a type
};
・・・ 当然ですな 疲れてるようだから寝ます。
36:デフォルトの名無しさん
09/03/03 01:22:51
キーボードから文字を入力する際、scanfはなるべく使わないほうが良いのですか?
参考書ごとに違いが有って、scanfを使用するものもありましたが中には
int c
c = getchar()
で一文字ずつ入力させるプログラムがありましたがどちらの方が良いのでしょうか
37:デフォルトの名無しさん
09/03/03 01:26:04
そんなことも理解できないヤツがプログラムなんてやるな。自明だろ
38:デフォルトの名無しさん
09/03/03 02:14:02
答えることができない奴ほど自明なんて言うよな
39:デフォルトの名無しさん
09/03/03 02:23:35
>>36
scanfをあまり使わないほうがいいとは思うが、理由を知らないと意味が無い類のものなので
調べてください
40:デフォルトの名無しさん
09/03/03 04:05:36
>>36
case by case
41:デフォルトの名無しさん
09/03/03 06:13:07
>>36
参考書による違いは、参考書を読まないと判らない。
何故なら、getchar()でやる方法を練習のために示す本もあるから。
scanf()は万能ではないし問題点もあるから使わないに越したことはないが、
だからと言って取り敢えず使うためのプログラムにgetchar()で作るのは愚。
まぁ、余程のことがない限り、fgets()(+sscanf()かatoi()かstrtol()か)で事が足りる。
# そして、余程のときはやはりgetchar()では事が足りないので環境依存の方法が必要。
42:デフォルトの名無しさん
09/03/03 12:26:07
>>39-41
ありがとうございました
43:デフォルトの名無しさん
09/03/03 12:30:08
>>36
scanfにはちゃんとバッファオーバーフローさせない方法もあるから
その点を理解して正しく使う分には問題ないよ。
実際scanfは便利。
44:デフォルトの名無しさん
09/03/03 12:38:13
>>38=>>36 ?
45:デフォルトの名無しさん
09/03/03 21:21:53
おまいらscanfなんてどうでもいいから早く>>33を誰か答えろ
ここにはscanfしか語れない初心者しかいねぇのかYO
46:デフォルトの名無しさん
09/03/03 21:44:23
カレント要素って何?
47:デフォルトの名無しさん
09/03/03 21:46:48
33はC++よりも日本語をまず勉強すべきだと思う
48:デフォルトの名無しさん
09/03/03 22:07:53
エスパーすると
リストの内部イテレータが外部インターフェースに対してスタティックに成るけど
オレ様の用途に十分かどうか教えてくれ。
と 33 は問いかけてると読む。
49:33
09/03/03 22:37:54
>>48
その通り。君はプロだ。やっぱプロは違うなぁ
で見解は?
>>46>>47
チミたち、C++ならいたての学生には用はないのだよ
気安くレスしないでくれ
50:デフォルトの名無しさん
09/03/03 22:40:10
そのlistが最早更新されないのならiteratorで医院で内科医?
51:デフォルトの名無しさん
09/03/04 00:40:04
とある関数のソースで、
void test(char yui,...) とある場合、...の意味するものはなんでしょうか?
52:デフォルトの名無しさん
09/03/04 00:41:47
可変引数リスト
va_start、va_end、va_arg
URLリンク(www.geocities.co.jp)
53:デフォルトの名無しさん
09/03/04 05:28:00
char str[MAX_PATH];
memset(str, `\0`, MAX_PATH);
lstrcpy(str, ゙53゙);
if(str[0]==`5`)
{
MessageBox(hWnd,゙ウンコ―(・∀・)゙,゙今夜のメニュー゙,MB_OK|MB_ICONHAND);
}
else
{
MessageBox(hWnd,゙チンコ―(・∀・)゙,゙今夜のメニュー゙,MB_OK|MB_ICONHAND);
}
今夜のメニューがウンコ―になるためには、
if(str[0]==0x52)のようにしなきゃ駄目ですか
54:デフォルトの名無しさん
09/03/04 07:11:26
lstrcpyをstrcpyにしてみては?
55:51
09/03/04 07:14:51
>>52
そのリンク先で、myfunc( "test" , 100 );とよびだされた場合、
"test"というのはどう扱われるのでしょうか?
56:デフォルトの名無しさん
09/03/04 07:23:32
>>55
URLリンク(www.geocities.jp)
なるたけ単純な具体例のあるページ
57:デフォルトの名無しさん
09/03/04 07:43:01
>>55
そこは引数の数があってないので参考にするな
ちなみに"test"は引数の開始位置を得るだけにしか使われていない
58:デフォルトの名無しさん
09/03/04 08:16:17
>>55
...の直前の引数(va_startの第2引数)に入る。
59:デフォルトの名無しさん
09/03/04 08:49:08
>>37
そんなことに、まともに答えられないお前もどうかと
60:デフォルトの名無しさん
09/03/04 11:01:27
指定したディレクトリ以下のファイル、ディレクトリをすべて
取得するような関数ないでしょうか?
61:デフォルトの名無しさん
09/03/04 11:02:42
opendir readdir
62:デフォルトの名無しさん
09/03/04 11:32:24
>>60
環境依存
63:デフォルトの名無しさん
09/03/04 12:02:15
>>62
64:デフォルトの名無しさん
09/03/04 12:10:11
多数の変数を単なるバイト列にその場でパックする方法で質問です。
通常なら
uint8_t buff[1024]; memcpy(buff, var1, sizeof(var1); ...
callfunc(buff);
などするか、
struct { var1_t a; var2_t b; ... } buff = { var1, var2, ... };
callfunc(&buff);
とすると思いますが、両者ともサイズ計算とか型情報をその場に
書く必要があり、長いこともあり簡潔にできないかなと考えています。
実はgcc拡張ですらない、環境依存な挙動レベルでは
uint8_t *buff = (uint8_t *)&(struct {}){ var1, var2, ... };
というのが動いたりして、ソース記述としては一番気に入っているのですが、
当然使えません。そこで質問ですが、これくらい簡潔(冗長な情報を
書かずに済ませられる)に書け、さらにせめて実装別の拡張程度で済ませられる
バイト列へのパッキング方法ってないでしょうか?
65:デフォルトの名無しさん
09/03/04 12:25:13
struct buff{buff, ite};
テンプレート関数(&buff, T) {memcpy(buf, ite, sizeof(T))~; buf.ite+sizeof(t); return &buf}
66:デフォルトの名無しさん
09/03/04 12:45:58
C++が使えるならテンプレート引数の類推かね
でもなんとなくCに見える
class Pack
{
char buff_[1024];
int size_;
public:
Pack() : size_(0) {}
operator char const *(){ return buff_; }
int size(){ return size_; }
template<class T> friend Pack &operator <<(Pack &pack, T t)
{
memcpy(pack.buff_ + pack.size_, &t, sizeof(T));
pack.size_ += sizeof(T);
}
};
// Pack p; p << val1 << val2 << val3;
67:デフォルトの名無しさん
09/03/04 12:57:41
struct<T, l> BI{ T &buff[l]; ite};
BI& <T>push(BI&, T&){ memcpy(if(BI.ite + sizeof(T) < sizeof(Bi.buff))BI.buff[ite], T, sizeof(T)); BI.ite += sizeof(T); return BI}
int buff[99];
BI<int, 99> b = { buff, 0};
b = push(b, Z) = push(b, Y) = push(b, X);
68:デフォルトの名無しさん
09/03/04 13:44:38
構造体のコンストラクタでは駄目なの?
69:64
09/03/04 20:18:52
すみません、言語はCなのでなかなかうまいのがないですね・・・
とりあえず
memcpy方式
-> オフセット計算が煩雑だし、エンディアン変換でさらに冗長になるので却下
struct方式
-> 型情報と構造定義と代入側の順序をメンテするのが面倒だが、
型チェックもしてくれるだろうしこれが妥当か・・・
sprintf方式(mprintf(buf, "NVc", v1, v2, v3) みたいなのを自分で作る)
-> 一番見通しがいいけど、型チェックが不可になる
という感じに考えが行きつつあります。具体的なコードだと
#define T(n) typeof(n) _ ## n /* require gcc */
void myfunc(uint8_t a, uint32_t b) {
typedef struct __attribute__((packed)) { T(a); T(b) } in_t;
nextcall((uint8_t *)&(in_t){ a, htonl(b) });
みたいな感じです。が、やってみると型チェックしてくれないので、まだ悩み中。
70:デフォルトの名無しさん
09/03/04 20:23:15
C言語のソースをJavaなどへの移植性が向上するようにコードを修正してくれるツールは無いでしょうか?
たとえば以下のようなコードがあった場合
int a;
if(a){
を
int a;
if(a != 0){ //
と変更したり、
boolean c()
{
int r = 0;
略
return r;
}
を
boolean c()
{
int r = 0;
略
return (r != 0);
}
する。
71:デフォルトの名無しさん
09/03/04 20:27:21
正規表現でどうとでもなるんじゃね?
72:デフォルトの名無しさん
09/03/04 20:42:14
>>69
扱う型の種類、パックする環境、アンパックする環境、を可能な限り詳しく教えて下さい。
特になぜエンディアンが問題になるのか解るように。
73:70
09/03/04 20:58:04
変数の型を調べる必要があるので正規表現では無理なような気がします。
boolean a;
if(a)
{
とか
boolean c()
{
boolean r = 0;
略
return r;
}
の場合は修正の必要は無いです。
74:デフォルトの名無しさん
09/03/04 21:04:05
そもそもC標準にbooleanなんて型はない
75:デフォルトの名無しさん
09/03/04 21:13:52
>>72
char 配列 可変長要素 エンディアン とくれば UTF-8 系の処理だろうな
76:64
09/03/05 00:32:45
>>72
いまCodeWarriorっていうIDEのOSSなプラグインを改造して、WIN(VC++)+UNIX(gcc)で
使えるツールに仕立てようとしています。機能は組み込み開発用デバッグアダプタの
USB越しのコマンド制御で、レジスタ読んだりMCUステップ実行させたりします。
扱う型自体はu?int(8|16|32)_t(かそれをtypedefした/enumで結果的にいずれかに
落ちた)型だけです。パック・アンパックはホスト側でだけですが、ターゲットのエンディアンは
MCUで異なるのと、ホストもx86以外もあるのでhtonlなどの他、htoll(host-to-littelong)
なども用意して使っています。
memcpyだとエンディアン変換で面倒云々は
myfunc(uint32_t hoge) {
hoge = htoll(hoge);
memcpy(buff, &hoge, 4)
などアドレス取るために行数が倍になるという話です。ここは一行にまとめて書けるstructや
パッキング関数に渡す方法のほうがすっきりします。
既に一度ざっと移植したのですが、元ソースが
*(unsigned int *)(data + 2) = hogehoge;
data[6] = hoge;
*(unsigned char *)(data + 7) = fugafuga & 0xFF;
とかややぐちゃっとしてるので、もっとすっきりとUSBで流し込むバイト列の生成が
できないかなぁと質問してみました。まあせいぜいコマンド1つあたり5変数程度
パックするだけなんで、大問題というより途中から面白くなってきたのでやってるのですが。
77:64
09/03/05 00:42:26
>>69 で型チェックしてくれないというのは間違いで、gccではオプションが漏れてました。
gcc -pedantic --std=(gnu|c)99 -Wall -Wextra -Werror -Wconversion
でいけた(-Wconversionがチェック用)ので、今のところstruct方式がエレガントかなぁと。
いまはVC++で使える方法を探してます。こっちはC++なんで、元のキャスト代入方式より
簡潔にはしたいですが、もっと色々とできそう。typeof/decltypeを見つけて小躍りしましたが、
これはVC++では使えないのですね・・・
78:デフォルトの名無しさん
09/03/05 00:58:00
>>76
ターゲットのMCUによってエンディアンが異なるなら、
memcpyだけではなく、structでも、自作sprintfでも、要素ごとにエンディアンの変換は必要ではないですか?
なぜmemcpyでだけエンディアン変換が問題になるのでしょうか。
79:デフォルトの名無しさん
09/03/05 01:01:42
memcpy(buff, &hoge, 4);は*(uint32_t*)buff = hogeに機械的に書き換えられると思う。
80:64
09/03/05 01:22:25
>>78
もちろんそうですが、memcpyベースだと2つの文になります。
引数やstructの中なら横に{ htons(v1), htonl(v2), v3, ...} と}羅列できるので、
やや行数的にお得かなと気持ちが傾いてます。
>>79
はい、元コードがキャスト方式です。ただ、キャストとmemcpyは書き込み先バッファの
オフセット位置を明示的に調節する必要があるので、「とりあえず変数を並べると
よろしくパッキングされる」みたいにできないかなぁと。
まあベタに書いてく元コードでいいじゃん?てな気もする程度の問題ですが、
色々方法がありそうで面白いので深追いしてみようかなと。
81:デフォルトの名無しさん
09/03/05 07:36:42
>>80
重要なのはソースの行数だけですか?
(1)ソースの行数、(2)ソースの文字数、(3)ソースの可読性、(4)オブジェクトのサイズに優先順位を付けるとどうなりますか?
82:デフォルトの名無しさん
09/03/05 08:35:55
ドメストがおすすめ
83:64
09/03/05 09:18:13
>>81
各項目での自分的評価だと、こんな感じです(1が最も短い・速い・わかりやすい・etc):
cast: 3321
標準的な記法で、外部知識を要しない。オブジェクトサイズも最小。ただ、キャストの嵐が目に
やさしくない(マクロで対処は可能)のとオフセット計算が間違えやすい。パックされた構造の把握は
縦に読む必要がある。縦の行数はパック対象変数分程度。バッファコピーが必要になるとmemcpyが必要。
例: *(uint32_t *)(dst + 4) = (uint32_t)htonl(src); <- これがN行続く
memcpy: 4211
標準関数なので、外部知識を要さず、サイズも呼び出しのみで小さい。キャストも不要。
オフセット計算は必要で、転送データ構造のイメージは縦に読んで把握する必要がある。
縦の行数は最大で対象変数の数+エンディアン変換数程度で最大。
例: src = htonl(src); memcpy(dst + 4, &src, sizeof(src)); <- これがN行続く
struct: 2222
外部知識は要しないが、一般性で劣る。サイズはキャスト方式と同等か、スタック消費分劣る。
オフセット計算が不要で、構造イメージは横に並んだ順そのままで把握はしやすい。しかし、
構造定義が長くなりがちで、変数の使用位置から離れるとズレやすいかも。バッファコピーが必要に
なるとmemcpyが必要。
例: struct { uint32_t _a; uint8_t _b, ... } buf = { htonl(src1), htonl(src2), ... }; <- スタック利用
or typedef struct { uint32_t _a; uint8_t _b, ... } in_t;
*(int_t *)(buf + 4) = { htonl(src1), htonl(src2), ... }; <- 既存バッファへの書き込み
mprintf: 1113
フォーマット表記の知識を得る必要があるが、処理部分のコードはかなり簡潔にデータ構造を
表現・理解できる。ただし、mprintfの実装分、メモリと処理速度で劣る。処理の中身はmemcpy。
例: mprintf(buf + 4, "NN...", src1, src2, ...);
84:デフォルトの名無しさん
09/03/05 10:58:37
Cを勉強しているのですが
虚数を含んだ計算式を作る必要があるのですが
色々調べたところ、<complex.h>をインクルードすると
虚数iを大文字Iとしてプログラムを書くことで虚数を扱える、とあったのですが
下のようなビルドエラーが出てしまいます(complex.hが無い、という意味か?)。
fatal error C1083: include ファイルを開けません。'complex.h': No such file or directory
ちなみに、VC++2008を使って勉強していますが
ソース自体はCの文法で書いています。
webでも色々調べたんですが、解決方法は見つからず・・・どなたか助言下さい。
85:デフォルトの名無しさん
09/03/05 11:24:30
>>84
C++用の
<complex>
ならあるみたい
86:デフォルトの名無しさん
09/03/05 11:51:19
複素数は C99 からなので、手元のコンパイラが対応していなくても泣いちゃだめ。
87:デフォルトの名無しさん
09/03/05 14:58:34
printf("ロベール先生の第27章から忌み不明になってきた");
88:デフォルトの名無しさん
09/03/05 15:58:16
#include <iostream>
using namespace std;
#include <math.h>
#define FNC void fnc();
FNC;
int main()
{
fnc();
return 0;
}
FNC
{
cout<<"FOFOOFOF"<<endl;
}
どこが間違っているんでしょうか?
89:デフォルトの名無しさん
09/03/05 16:01:21
#define FNC void fnc()
セミコロン入れたらダメじゃね? 知らんけど。
90:デフォルトの名無しさん
09/03/05 16:04:49
>>89
ハイパーサンクス
91:デフォルトの名無しさん
09/03/05 18:27:57
>>84
そんな事に手間取るくらいなら自前で作った方が早いだろ。
加減算、乗算は一瞬でしょ。
割り算は意味わからなくても公式で一発だし。
92:デフォルトの名無しさん
09/03/05 18:31:38
>>83
fputcの要領で、16ビットや32ビットなど必要なものを
(中身はエンディアン変換とfwriteを使い)自分で関数を作っていくのはどう?
と思ったが、VC++だとfmemopenがないから駄目だよな。
93:デフォルトの名無しさん
09/03/05 18:45:46
>>84
適当に探せば外部のライブラリがありそうじゃない?
それでしのいでいるうちに猛勉強してC++も使えるようになれればおk。…無茶か?
94:デフォルトの名無しさん
09/03/05 19:15:15
try catchをnew以外に使えてない素人なんだけど、try catchってほかにどんなときに使うの?
95:デフォルトの名無しさん
09/03/05 19:31:37
例外をキャッチするときに使う。キャッチしたい例外がないなら別に使わなくても良い。
「自分で書くコードが、どんなときに例外をスローすべきなのか」
となると別の話になるけど。そういうことが聞きたいの?
96:デフォルトの名無しさん
09/03/05 19:40:34
h = FindFirstFile( path, &data );
で FindFirstFile( )関数の失敗した値
INVALID_HANDLE_VALUE
が返ってきた時
if( INVALID_HANDLE_VALUE == h )
{
FindClose(h);
}
ってやるんだけど 失敗したときのハンドル値で FindClose() していいの?
失敗してるこの場合 FindClose() はいらないの?
97:デフォルトの名無しさん
09/03/05 19:47:00
>>96
していい。
URLリンク(msdn.microsoft.com)
98:デフォルトの名無しさん
09/03/05 19:48:43
ごめん。間違えた。
いらなかった。
99:デフォルトの名無しさん
09/03/05 19:49:18
ごめん。間違えた。
いらなかった。
100:デフォルトの名無しさん
09/03/05 20:00:59
ごめん。間違えた。
助かった。
101:デフォルトの名無しさん
09/03/05 22:29:35
構造体の中に、別の構造体のポインタがあるとして、そのポインタが
指し示すアドレスから、そのデータ型の構造体が連続して配置されている場合、
n番目のデータにアクセスしたい場合、どうしたら良いでしょうか。(下記サンプル参照)
typedef struct {
unsigned char test1;
unsigned char test2;
} Test_set1;
typedef struct {
unsigned short test3;
unsigned short test4;
} Test_set2;
typedef struct {
Test_set1* test5;
Test_set2* test6;
} Test_all;
volatile const Test_all Test_struct = {
(Test_set1*)0x3FFFFFA0,
(Test_set2*)0x3FFFFFB0 ←メモリ上では、Test_set2型がn個連なっている。
};
void Test_func(unsigned char index){
unsigned short tmp1, tmp2;
tmp1 = Test_struct.test6->test3;
tmp2 = Test_struct.test6[index]->test3; ←コレはダメぽい・・・
}
やっぱポインタを任意回数インクリメントか、indexを足すしかないでしょうか?
102:デフォルトの名無しさん
09/03/05 22:34:24
tmp2 = Test_struct.test6[index].test3;
103:101
09/03/05 22:54:33
>>102
おぉ・・・・・素早いレスありがとうございます。
確かにコンパイル出来るようですっ! 明日アセンブラで狙ったところに
アクセスしているか確認してみます。
この場合、test6 はポインタですが、Test_struct.test6[index] と書くと、Test_set2型の
RAM扱いになるんでしょうか?(ショボイ質問ですいません)
104:デフォルトの名無しさん
09/03/05 22:59:24
p[n]は*(p + (n))と同じ
105:デフォルトの名無しさん
09/03/05 22:59:54
RAMってw
106:デフォルトの名無しさん
09/03/05 23:23:12
Random Access Machomen
107:デフォルトの名無しさん
09/03/05 23:44:50
こんなのがわかってないうちからアセンブリやってるの?
順番ちがくね?
108:デフォルトの名無しさん
09/03/06 00:04:27
ハード屋なんじゃない?
109:デフォルトの名無しさん
09/03/06 00:08:36
int nFibo[16] = { 1, 1 };
これの = { 1, 1 };
って・・・・なんでしょうか・・?
こんなの見たことありません・・!
これはどういう意味なんですか・・?
110:デフォルトの名無しさん
09/03/06 00:23:18
nFibo[0] と nFibo[1] を1で初期化して残りは0で初期化。
111:デフォルトの名無しさん
09/03/06 00:28:44
わかりやすい説明サンクス!
112:デフォルトの名無しさん
09/03/06 00:54:22
ロベールのC++教室はC++と銘打っているが、ほとんどCの勉強という感じだ。
Effective C++などには配列はやめてvectorとstringを使おうと書かれているが、
ロベールでは徹底的に配列を使う(というより全編にわたってほぼ余すところなく登場する)。
配列はポインタと表裏一体なので、初心者は最初からCの一番の鬼門と真正面から向き合うことになる。
メモリ操作に関する知識は絶対に必要なのでこのスタンスもわからなくはないが初心者にはやや厳しくはないか?
他にも、ビット列の再解釈がしばしば登場したり、ハンガリアン記法が採用されていたり。
まぁ、いずれも必要な知識だけどさ。
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]とするのを尊重してやりたいというか。
318:デフォルトの名無しさん
09/03/11 12:35:50
>>317
よく判らんのだが、まさかとは思うが*(p + i)なんて本当に書くの?
argv[i]と書くのと同様に、件のstrcpy()の例ならsrc[index]という書き方になると思うのだけれど。
# 細かい言い訳は兎も角、main()だけは別扱いと言うことなら未だ理解できるが。
319:デフォルトの名無しさん
09/03/11 12:49:43
>>318
p[ i ]は *(p + i)のシンタックスシュガーだし
320:デフォルトの名無しさん
09/03/11 12:50:07
[i]でアクセスしたいってことは、
範囲がargcでわかってるからしたいこと。
そうでないときゃ、for (p = src; *p != '\0'; p++)としたりするでしょ。
あくまで[i]でやりたいならstrlenで一回文字列を調べてから、
for (i = 0; i < len; i++)とするでしょ。
上記のstrcpyだって、
char *strcpy(char *d, char *s) {
while ( *d++ = *s++);
return d;
}
ていうのもある。
長さを先に測りたい人は[i]すればよろし。
長さをパラメータで与えたい人は(int len)でも渡せばよろし。
ポインタでどうこうやるときは、つねに*(p + i)しなくたっていい。
321:なんだかなぁ……
09/03/11 12:53:46
>>320
いやだから、for (int index = 0; src[index] != '\0'; ++index)とは書かないの?
なんで? >319の事実があるのに? 某組み込み系のガイダンスだとポインタ演算禁止なのに?
長さを先に測りたいなら[i]ってどんな理屈? 長さを先に測ってから*(p + i)しちゃいけないの?
322:デフォルトの名無しさん
09/03/11 13:10:39
つーか、オプション指定を避けるのにargv++することだって普通にあると思うがな。
>321もいい加減構うのやめとけ。
323:デフォルトの名無しさん
09/03/11 13:24:42
好きにしろってことで終了
324:デフォルトの名無しさん
09/03/11 13:39:49
そうやって個々に任せた結果が使えないプログラマばかりが跋扈する現状というわけだが
325:デフォルトの名無しさん
09/03/11 13:41:36
そうやって自分のやり方をおしつけるから
326:デフォルトの名無しさん
09/03/11 13:59:10
「前の会社ではこうやってたの!!」
327:デフォルトの名無しさん
09/03/11 14:14:09
誰も>>320のstrcpyに突っ込まないのはなぜ?
328:デフォルトの名無しさん
09/03/11 15:00:16
スレチだから
329:デフォルトの名無しさん
09/03/11 15:23:08
いちようMSDNでは↓のようになっとるの
int main( );
または、次の引数も使えます。
int main( int argc[ , char *argv[ ] [, char *envp[ ] ] ] );
330:デフォルトの名無しさん
09/03/11 15:34:10
windowsでVisual Studio 2005を使用しています。
過去に作ったコンソールアプリケーションを編集しようと思ったのですが
不幸なことに.hファイルと.cppファイルを消してしまったために
編集ができない状態です。現状ではobjファイルが残っており、
デバッグコマンドなどでプログラムを動かすことはできるものの、
どうしても元のソースファイルを手に入れる必要があるのですが
objファイルからcppファイルに逆コンパイルする方法はありますでしょうか?
331:デフォルトの名無しさん
09/03/11 15:51:29
>>330
ありません。
332:デフォルトの名無しさん
09/03/11 15:55:41
大体どのコーディング標準でも
重要なのは一貫性を保つことであって、些細なことは個人の自由としている。
他人のコードに手を入れるときは、その人の流儀に従うべきで、
自分の宗教を持ち込んで後の読み手のリズムを狂わせてはいけない、とある。
333:デフォルトの名無しさん
09/03/11 16:26:23
>>330
objも消しちゃえば諦めがつくぞ
すっきりしてまた一から出直そう
334:デフォルトの名無しさん
09/03/11 16:31:44
逆アセならぬ逆コンパイラってないのかな。
objファイルはリンク前のコンパイル済みファイルなので
逆アセでもできそうな気がするけど。
335:デフォルトの名無しさん
09/03/11 16:39:07
>>331,333
どうしても諦めがつかなくてorz
>>334
確かに、逆コンパイルというと語弊があったかもしれません…
なんとか逆アセンブル出来ませんかね?orz
336:デフォルトの名無しさん
09/03/11 17:15:26
>>335
逆アセンブルならできるよ、まぁお前に読めるとは思えないけどさw
いっぱいあるから探してみなよ
確実に1から書き直したほうが早いだろうが
337:デフォルトの名無しさん
09/03/11 18:03:23
自分が書いたコードなら関数名見れば大体流れが読めるはずだしな
338:デフォルトの名無しさん
09/03/11 18:27:51
>>332
あまりに酷いコードの時はそうも言ってられないw
339:デフォルトの名無しさん
09/03/11 19:45:07
>>335
逆アセンブラならvisual studioについてるよ。
340:デフォルトの名無しさん
09/03/11 22:44:10
寧ろディスクから消したのが最近ならサルベージしてみてもいいかも。
案外、オートバックアップのサーバ上に残っていたりしてw
341:デフォルトの名無しさん
09/03/12 09:08:14
Linux環境においてLL言語、シェルスクリプトなどでちょっとしたことをするのには、適切と言われていますが
C言語では、そういったお手軽なライブリなどは、整備されていないのでしょうか?
LL言語、シェルスクリブトが適している分野をCで書くのは、どうなんでしょうか?
Cに偏った使い方をするなら、binコマンドなどのcoreutiltyのmanやソースを読んで、巧みに使うのがいいんでしょうか?
住めば都で慣れれば、C言語での保守も苦では、なくなるものなのでしょうか?
342:デフォルトの名無しさん
09/03/12 10:57:37
データのスムージングを行う処理を作りたいんですけど、
Savitzky-GolayアルゴリズムのCサンプルコードとかないですか?
343:デフォルトの名無しさん
09/03/12 12:19:52
>>342
NumericalRecipesにある。
URLリンク(www.nrbook.com)
尤も、これ見ただけで実装できるかどうかは知らんが。
344:デフォルトの名無しさん
09/03/12 14:11:05
初心者なのですが、ファイルからテキストを読み込んで一番大きい数字を発見したいです
43,2,21,23,みたいなテキストなのですが、質問があります
・テキスト中のスペースは無視されるのですか?
・メモリについてmallocとか全くわかってないのですが使わないとかなりヤバイですか?
345:デフォルトの名無しさん
09/03/12 14:29:37
>>344
・無視されるように読めば無視される。
Ex.:scanf()系, atoi()
・使わなくてもできなくはないが、どっちみちポインタの扱いには慣れが必要なので、そういう意味ではやばい。
つーか、課題か何かでなければ言語の選択の段階で間違っている。
346:デフォルトの名無しさん
09/03/12 14:33:55
実際はC#でするつもりなんですが何でするべきですか?CとC#しか知りません
347:デフォルトの名無しさん
09/03/12 14:45:09
C/C++は他の言語に比べて文字列解析が簡単ではない
C#なら正規表現が使えるからかなり楽になると思うが
一般にはこの手の作業にはスクリプト系の言語がより向いている
まあ、CとC#の選択なら、最初からC#のスレで聞いとけって話だ
348:デフォルトの名無しさん
09/03/12 14:46:58
すみません
Cでも正規表現使えると思ってますたw
ありがとうございました
349:デフォルトの名無しさん
09/03/12 14:55:57
>>348
Cの場合、C#みたいに標準で用意されていないの。
350:デフォルトの名無しさん
09/03/12 14:59:55
何かインクルードしたら使えるとか?
351:デフォルトの名無しさん
09/03/12 15:01:12
>>348
今できたけど…「 ./a.out < ファイル名 」で使ってみて
#include <stdio.h>
#include <ctype.h>
int main()
{
int c;
int max = 0, num = 0;
while((c = getchar()) != EOF){
if(isdigit(c)) num = num * 10 + c - '0';
else {
max = (num > max) ? num : max;
num = 0;
}
}
max = (num > max) ? num : max;
printf("max = %d\n", max);
return 0;
}
352:デフォルトの名無しさん
09/03/12 15:15:02
できればC#に組み込めるようにして頂きたい^^;
適当にコピペしたらインクルードやgetcharが使えなかった
353:デフォルトの名無しさん
09/03/12 15:25:25
ここはC/C++スレだ
移植は手前の仕事
354:デフォルトの名無しさん
09/03/12 15:28:52
フヒヒw
355:デフォルトの名無しさん
09/03/12 15:43:03
wwwwwwwwwwwwwww
356:デフォルトの名無しさん
09/03/12 15:46:18
サーセン
357:デフォルトの名無しさん
09/03/12 19:42:09
ソースコード書くなんて、下っ端の仕事
358:デフォルトの名無しさん
09/03/12 19:46:46
ソースも書けない糞上司
359:デフォルトの名無しさん
09/03/12 19:47:38
ソースしか書けない専門学校卒
360:デフォルトの名無しさん
09/03/12 19:51:35
ソースも書けない落ちこぼれに言われてもなー
361:デフォルトの名無しさん
09/03/12 19:59:11
高卒の叩き上げが最強ってことで、ゆるして
362:デフォルトの名無しさん
09/03/12 20:19:56
就職||卒業出来ないからって荒らすなよ。
>>342
numerical recipes in CやC++に載ってる。C++もベタに書いてあるので、
++の意味はほとんど無いw あとはqtiplotだっけ? originのfree implementationの
ソース読むとか、MSDNにも解説があるな。しかし簡単な式だから、すぐ作れるだろ
携帯からなので、PCでググればもっと探せそう。
363:デフォルトの名無しさん
09/03/13 13:46:55
>>362
>343
携帯だとすぐ下のレスも見られないのか?
つーか、元質はCだと書いているのさえ見えてないのか。
364:デフォルトの名無しさん
09/03/13 18:01:41
>>363
>>343はPCのFoxit readerでさえ読み込めないんだけど?
どうせ貼るなら、こっち貼れ
URLリンク(www.fizyka.umk.pl)
365:デフォルトの名無しさん
09/03/13 18:55:28
>>364
>Foxit readerでさえ
「でさえ」?
そりゃ Adobe Reader で読めなかったときに使う言葉だろ。
366:デフォルトの名無しさん
09/03/13 19:15:04
>>365
>>363は携帯で読めないのかって書いてるじゃん。
まあもちろん携帯のadobe readerでも読めない訳だが。
367:343
09/03/13 19:21:33
>>364
普通にIE+AcrobatReaderで見えるけど。怪しげなクローンより本家の方がいいと思ったんだけどな。
# そして私は>363ではない。
368:デフォルトの名無しさん
09/03/13 20:26:31
PCのAcrobat Readerでも開かない。
なんか、変なプラグイン入れろって出る。
IEからでも。
369:デフォルトの名無しさん
09/03/14 03:35:05
暗号化してあるみたいだね。headerがどうたらって出た
どうせnumeric recipiは信用できないからいいけど。
370:デフォルトの名無しさん
09/03/14 18:25:38
作ったソフトをオープンソースで公開しようかと考えているのですが、
ネット上のサンプルをコピペしたコードが多々あって、勝手にオープンソースにしていいのかわかりません。
ライセンス表記がされていないものも多いので確認のしようがないのです。
こういう場合でも勝手にBSDライセンスとか付けて配布してしまっていいのでしょうか?
出所はもちろん明記するつもりですが。
371:デフォルトの名無しさん
09/03/14 18:31:47
バレてトラブルになった時の対処ができるなら。
372:デフォルトの名無しさん
09/03/14 18:55:18
コピペでオープンソースですか、笑っちゃいます。
コードを書けないのなら無茶な事しない。
ネット公開されてれば、使ってよいの判断ですが、
それでも、自身でコードを書き直して公開するのが本当でしょう。
動けば良いだけのコードをオープンソースですか、違うでしょ
373:デフォルトの名無しさん
09/03/14 21:00:58
そうですよねぇ。
でも反面、せっかく既にあるコードまで自分で書き直さなきゃならないのか?とも思うのです。
しかもサンプルの書き方が一番スマートなのに、あえて別の書き方をするのも無意味に思えてなりません。
サンプルを利用して書くのは普通のことだと思いますが、皆どうしているのでしょうか。
とりあえず今回はクローズドでいきます。ありがとうございます。
374:デフォルトの名無しさん
09/03/14 21:54:26
>>370
もともとライセンス表記もせずパブリックドメイン同然で公開しているコードなら
コピペのままではなく、君がそのコードを理解して、作りなおせば問題ないだろ。
出所も明かす必要無し。
コードって作り直せないくらい長かったり何回だったりするの?
375:デフォルトの名無しさん
09/03/14 21:56:48
何回→難解
376:デフォルトの名無しさん
09/03/14 22:21:17
>>374
いや逆に、数十行程度のサンプルが多くて直しようがないんです。
そのまで洗練されているのでいじると無駄にこんがらがります。
変数名やカッコの書き方を変えるといったしみったれたことしかできず…。
377:デフォルトの名無しさん
09/03/14 22:40:02
モジュールを丸ごとじゃなくてサンプルコードか・・・
サンプルコードをかき集めた場合は、いろんな流儀で書かれているわけだから、自分の流儀に書き直したほうがメンテしやすくなるぞ。変数名や括弧を直すだけでも効果的だ。
そうすれば改良できるところが見えてくるぞ。
378:デフォルトの名無しさん
09/03/14 22:44:48
なるほど、書き方は自分流に統一した方がいいですね。ありがとうございます。
小さいところでも直していけばいいのですね。そういう方向でいってみます。
379:デフォルトの名無しさん
09/03/14 22:59:23
つーか、数十行程度ならサンプルを理解した上で、自分で書けばいいじゃん。
その程度だったら記憶を手繰りながら書けるべ。
380:デフォルトの名無しさん
09/03/14 23:05:01
その二度手間が無駄って話じゃねーの
381:デフォルトの名無しさん
09/03/14 23:07:19
Linuxなんかは、著作権回避のために書き直しとかしてるだろ?
382:デフォルトの名無しさん
09/03/14 23:09:05
コピペしただけでは解ったつもりで解ってないことがほとんど。自分の手でコードを書かないと理解できない。それは無駄ではない。
383:デフォルトの名無しさん
09/03/14 23:18:43
せっかく再利用を前提としてソースコードを書いても
ほとんど再利用されることはない
参考にすることはあっても
384:デフォルトの名無しさん
09/03/14 23:21:50
それは再利用性の設計が不十分なんだよ。
385:デフォルトの名無しさん
09/03/14 23:26:41
再利用されることが無いのに再利用性の設計なんてそもそも不要だし
386:デフォルトの名無しさん
09/03/14 23:35:47
再利用なんて、幻想だよ。
結局、作り直して使ってるだろ
387:デフォルトの名無しさん
09/03/15 00:52:54
再利用性なんて、無駄なコード入れて行数増やすための方便になってるからなあ
388:デフォルトの名無しさん
09/03/15 01:06:40
まだ行数とか言ってんのかこの業界は
389:デフォルトの名無しさん
09/03/15 01:16:57
リファクタリングしたら負けかなと思ってる
390:デフォルトの名無しさん
09/03/15 02:17:37
わかりやすいコード記述を心掛け且つ
流用者が理解するのを諦める難解な操作を
程よく織り込むのがプロの仕事だ
391:デフォルトの名無しさん
09/03/15 02:30:08
チンケなプロだなぁ
392:デフォルトの名無しさん
09/03/15 08:58:28
自分で恰好良く書いたつもりが
「何それ?だっせーソース」
とか笑われたことがあるんだろ
393:デフォルトの名無しさん
09/03/15 11:41:41
libファイル配布
394:デフォルトの名無しさん
09/03/16 14:12:14
あるテーブルより、KOJIN_ID(数値型8桁)を一旦ホスト変数H_KOJIN_IDに入れ
それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める)
下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに
セットするときに、現状のままだと余った桁に0が入ってしまいます。
データセット部
sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID);
余った桁に半角スペースが入るようなsprintf指定方法はありませんか?
395:デフォルトの名無しさん
09/03/16 14:24:22
"%11d"
396:デフォルトの名無しさん
09/03/16 14:43:45
%11dで試しましたが0で埋められてしまいます。
397:デフォルトの名無しさん
09/03/16 14:46:47
失礼しました!
間違えて%11.11dで試しましたが、%11dだけにしたら
できました。
ありがとうございました。
398:デフォルトの名無しさん
09/03/16 14:51:24
>>394
マルチすんなゴミ
399:デフォルトの名無しさん
09/03/17 00:50:51
C++の書籍を買おうと思っているのですが、大体何円くらいなんでしょうか?
教えてください
400:デフォルトの名無しさん
09/03/17 00:55:30
そんくらいamazonで調べろよ
401:デフォルトの名無しさん
09/03/17 00:56:09
Cの書籍は何円ぐらいしたよ?
だいたい相場はかわらんさ
402:デフォルトの名無しさん
09/03/17 01:00:51
>>399
1800-4500円
403:デフォルトの名無しさん
09/03/17 02:17:46
>402
ただし、○冊セットの中の1冊のお値段、というオチが付くことも多そう。
404:デフォルトの名無しさん
09/03/17 02:49:33
C++のセット本なんかあったか? 見た事無いが
>>403不味い本買ってんじゃねぇか?
405:デフォルトの名無しさん
09/03/17 03:12:49
週刊C++、創刊号は980円
406:デフォルトの名無しさん
09/03/17 03:32:14
それを言うなら、創刊号1800円で、二号から4500円だろ…
407:デフォルトの名無しさん
09/03/17 04:00:40
3号は9450円か?
408:デフォルトの名無しさん
09/03/17 06:25:56
まず創刊号の付録を教えてくれ
409:デフォルトの名無しさん
09/03/17 06:27:57
VC++EEとGCCの豪華セット
410:デフォルトの名無しさん
09/03/17 06:30:29
↑エラー起きた場所が分かりやすいように、AAに変換してしくれる機能搭載
411:403
09/03/17 10:03:10
>404
あー、C++であったかどうかは分かんない。
でもVC++とかだと何シリーズか見かけた気がする。
412:デフォルトの名無しさん
09/03/17 16:30:39
毎週付録のモジュールをリンクしていくことでオリジナルIDEが完成
413:デフォルトの名無しさん
09/03/17 18:27:14
//////////////////////////////// a.h
template<typename T>
class test {
public:
test();
void _inc(T n);
void _dec(T n);
private:
T m_n;
};
//////////////////////////////// a.cpp
#include "a.h"
template<typename T>
test<T>::test() : m_n(0) { }
template<typename T>
void test<T>::_inc(T n){ return m_n++; }
template<typename T>
void test<T>::_dec(T n){ return m_n--; }
test<int> aaa;