【初心者歓迎】C/C++室 Ver.28【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2006/06/09(金) 10:44:36
余裕で2げっとw

            ,ヘ           ,:ヘ.
               /: : \       /::  !
            /::::.....  \--―‐'.:.:::...  !       >>3 プギャーーーーーーーッ
           /::::::       .:::::::::::::     ',
          ,'::::     /\ヽ_ヽv /:  /\i
           .i::::         √___丶     !
           !:::.          / / tーーー|ヽ   !
        |::::..         ..: |    |ヽ     l             _,-,.、
           i;::::..          | |⊂ニヽ| |     !       i´ヽ    い {,-ゝ.
          ':;::::...      | |  |:::T::::| !  /        l ,人 __,!...!_}ゝ l
         _  \:::::....      ト--^^^^^┤ /         ヽ. '´    ` /
     /   `ヽ `ゝ:::::........      ....../_             /    ァ-- '
     i::.....    ;\!..-ー 、 /⌒ヽ      、\      /    .:/
     ` '''''ー- 、::::/ ,.. .  `/:::   〉‐ 、   \ \   /     ..::ノ
           .ソ'    : /::.   /::  〉     \\,/      .:/
         /i:.       :,'::.   /::  ./ヽ       \!     ..:;'
         / |::       |ヽ.:..    :'::/       \    .::/
          /  !::.    i::.:.:`:‐"ー、_,ノ          \:::/
       / ,/ヾ;:....   /:.:.:.:.:/:::.:..             ヽ、
         | :i   `ー::':.:.::.:.:./\:::::.:.:.               ':;
3デフォルトの名無しさん:2006/06/09(金) 11:45:59
>>1
4デフォルトの名無しさん:2006/06/09(金) 16:43:53
C++でGUIする場合はC++BUILDERしかない?
5デフォルトの名無しさん:2006/06/09(金) 17:04:39
VC++6.0 MFCで自作簡易HTMLレンダリングエンジンの作り方、プログラムが分かる方
居ませんか???
教えていただけると助かります。。。。
6デフォルトの名無しさん:2006/06/09(金) 17:09:01
>>5
マルチ死ね。
7デフォルトの名無しさん:2006/06/09(金) 17:52:59
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。


C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
8TOM:2006/06/09(金) 19:00:50
c言語で定期的にディレクトリの中味を監視すれにはどうしたrいいですか?
9デフォルトの名無しさん:2006/06/09(金) 19:03:32
>>8
デーモンの常駐。それかsleep()を発行して、一定時間経過後ディレクトリ内容取得。
10デフォルトの名無しさん:2006/06/09(金) 20:41:37
質問です
listで型を指定するところにクラスや構造体を指定した場合
要素を追加するときどうするんですか?
intやfloatのような型だとpush_back(10)のようにできますが、
クラスだと、どうやって記述すればいいのかわかりません。
11デフォルトの名無しさん:2006/06/09(金) 20:47:31
>>10

class Foo;
std::list<Foo> foos;
foos.push_back(Foo());
Foo foo;
foos.push_back(foo);
1210:2006/06/09(金) 20:56:38
>>11
ありがとうございました
関数でもいいんですね
13デフォルトの名無しさん:2006/06/09(金) 20:59:33
>>12
> foos.push_back(Foo());
これの引数はFooという関数を呼んでいるわけではないぞ。
Foo型の一時的なオブジェクトを(コンストラクタ引数なしで)作っている。
1410:2006/06/09(金) 21:23:14
>>13
コンストラクタを呼べばいいのですね。わかりました

あと、何度も同じような質問で申し訳ないのですが
listの要素のオブジェクトのメンバ関数を呼ぶ方法がわかりません。
15デフォルトの名無しさん:2006/06/09(金) 21:29:04
// list中の要素のメンバを順に呼ぶ例
class Foo;
std::list<Foo> foos;
...
for(std::list<Foo>::iterator it = foos.begin() ; it != foos.end() ; ++it)
  it->memberFunc();
1610:2006/06/09(金) 21:36:23
>>15
ありがとうございました
17デフォルトの名無しさん:2006/06/09(金) 22:50:21
CFOOクラスがあります。
メンバ変数の一つに、CFOO* m_focusFoo を持ち、
メンバ関数の一つに、CFOO* GetFocusFoo() を持ってます。

m_focusFooは、下のようにコンストラクタでNULLで初期化してます。
CFOO::CFOO():m_focusFoo(NULL),・・略{略}

GetFocusFoo()は、下のようにただ m_FocusFoo を返すだけです。
CFOO* CFOO::GetFocusFOO() {
return m_focusFoo;     ←ここで止まる!!!!!
}

CFOOのインスタンスは複数生成するんですが、
m_focusFooには自分自身が入ってる場合もあれば
NULLの場合もあれば
他のインスタンスが入る場合もありえます。

GetFocusFoo()を呼び出してる側では、
NULLが返ってきてもいいようになってまして、
ためしに return NULL; としてみると落ちないでちゃんと動きます。
(もちろん正規の動きでは無いですが、
少なくとも呼び出し側は仮にNULLが返されても安全なようにはしてある、という意味です。)

で、一応コンパイルは通ってまして、
win2000の環境では動くのですが、xpのマシンで走らせるとエラーで落ちます。

デバッグしてみると、return m_focusFoo;のところで止まっているようで、
CFOOのコンストラクタの初期化リストでちゃんと初期化しているはずの変数も含め
全ての変数に「式を評価できません」とエラーが出てます。

return の m_FocusFoo の評価部分で落ちて、
しかもそれが環境に依存するというのは、どこの書き方が悪いと考えられますでしょうか?
1817:2006/06/09(金) 22:57:31
一応age
19デフォルトの名無しさん:2006/06/09(金) 23:09:32
>>18
再現する最低限のソースを貼れ。
2017:2006/06/09(金) 23:13:38
長いのでエスパー的にお願いします。
21デフォルトの名無しさん:2006/06/09(金) 23:14:50
【緊急事態】日本終了のお知らせ【緊急事態】

◆北朝鮮への経済制裁等を行なうはずの「北朝鮮人権法案」だったのだが◆
◆民○党案は「脱北者」と称する棄民&工作員を呼び込む外患誘致だった◆
◆突如まともな自○党案に民○党案を織り交ぜる妥協話が・・ヤバ過ぎ!!◆

まとめサイト
http://www14.atwiki.jp/akiramenai/pages/4.html

これが通れば日本にチョンが何十万人とやってきます。13日に可決予定です。
時間がもうありません。これを見た方はコピペ&凸お願いします!!

【日本終了】朝鮮人を日本に大量移住 反対 OFF(抗議運動作戦本部)
http://off3.2ch.net/test/read.cgi/offmatrix/1149833514/l50
2217:2006/06/09(金) 23:47:41
今気づいたのですが、
GetFocusFoo()の処理の先頭に、
WinAPIのMessageBoxを差し込んで試してみたら、
なぜかWin2000の方で実行すると起動直後にGetFocusFoo()は呼ばれなくて、
xpの方で実行すると呼ばれるみたいです。

OSによって実行の順序が変わるなんてありえるんですかね?

処理的には、GetFocusFoo()が呼ばれるからにはインスタンスが出来上がってるわけで、
となれば少なくともm_focusFooはコンストラクタでNULLに初期化されてるはずだと思うのですが、
これをreturnするところで落ちるってのがいったいどういうことなのかよく分かりません。
2317:2006/06/09(金) 23:57:45
何かとりあえず直りました。
実行される順番が違うってことが分かったんで、
勘で適当に関係ありそうなところをいじって見たら直りました。
なんで直ったか分かりませんし、
説明しようにも内容が入り組みすぎてるので、無理です。すいません。
お騒がせしました。
24デフォルトの名無しさん:2006/06/10(土) 00:19:20
>>23
そんなに入り組んだプログラムを作っているから、
17のようなわけわからないことが起きるんだよ。
25デフォルトの名無しさん:2006/06/10(土) 01:42:50
OSでWindowsXPとLinuxを使っています。
プログラミングはC#をちょっとだけです。

質問なんですが、
標準Cライブラリ http://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96C%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA
ここに載っていない関数は、大まかに言うと各環境の独自拡張と考えてよいのでしょうか?
26デフォルトの名無しさん:2006/06/10(土) 01:49:39
>25
「主な機能」と書いてあるじゃないか。全部ってわけじゃない。
27デフォルトの名無しさん:2006/06/10(土) 16:24:07
>>25
「拡張」っつーと少し語弊がある気がするな。
CはもともとJavaみたいに、その言語環境だけでどうこうするように考えて
作られた言語じゃない。

CはOSのシステムコールやFORTRAN等で書かれたライブラリルーチン等を
直接呼べるように設計されているが、
別にOSのシステムコールは「C言語を拡張するため」のものではない。
28デフォルトの名無しさん:2006/06/10(土) 20:15:18
typedef class AClass
{
public:
AClass **ppMe;
};

というクラスがあったとして

AClass *pTest = new AClass();
pTest->ppMe = &pTest;

とやってppMeメンバに自分のアドレスを持つ変数のポインタを代入したいんですが
これをオペレータ等を使って見た目上1ステップで書くことは可能でしょうか?
29デフォルトの名無しさん:2006/06/10(土) 20:27:21
なんでthisじゃダメなんだ?
30デフォルトの名無しさん:2006/06/10(土) 20:32:58
「自分を参照している変数」に対してアクセス(解放時にNULL代入等)したいからです
31デフォルトの名無しさん:2006/06/10(土) 20:33:43
だから、コンストラクタでppMe = this;とでもすればいいじゃん。
32デフォルトの名無しさん:2006/06/10(土) 20:37:41
>>28 は「自分を参照している変数」じゃなく、「自分へのポインタを自分に設定している」だが?
3328:2006/06/10(土) 20:39:31
AClassのメソッドからpTestの値を書き換えたいということなんですが・・・
ちなみにthisはAClass*、ppMeはAClass**です
34デフォルトの名無しさん:2006/06/10(土) 20:41:04
AClassのメソッドからpTestを書き変えればいいじゃん。
35デフォルトの名無しさん:2006/06/10(土) 20:43:13
pTestのメンバ情報からpTestの指す先を書き換えることは無理じゃないか?
グローバル変数に保存してそれを参照しないことには。
3628:2006/06/10(土) 20:49:21
メソッドから*this->ppMeに対してアクセスすれば
外のpTestの内容を書き換えることは可能です
で、今回の質問はクラス生成、代入時に、
同時に左辺の変数のアドレスをppMeメンバに代入したいということなんですが
37デフォルトの名無しさん:2006/06/10(土) 21:00:11
コンストラクタでthisのポインタを取得しても、そのポインタのポインタを保持
しているエリアはローカル変数だから、コンストラクタを抜けた時点でppMeの
アドレスが無効になる。

やはりどこかでグローバル変数が必要か。
3828:2006/06/10(土) 21:05:46
グローバル変数ではありませんが、他もしくはAClassの別のインスタンスが
AClassのインスタンスのアドレスを保持する変数を持つことを想定しています
リストやツリーのようなもんです(根っこだけは別ですが)
39デフォルトの名無しさん:2006/06/10(土) 21:07:55
なんだよCompositeパターンか。
40デフォルトの名無しさん:2006/06/10(土) 21:10:47
>>28 は自分に自分を設定しているじゃん。だから混乱するんだよ。
41デフォルトの名無しさん:2006/06/10(土) 21:15:48
というか、>>28 や、>>33 で言ってることと、>>38 は違わね?
4228:2006/06/10(土) 21:33:50
自分のポインタを保持している変数を別のインスタンスが持っているか
どこかのスコープで保持されている変数が持っているかの違いだけで、
やっている事自体に変わりはありません
質問の主旨とかけはなれてきているので
しばらくはppMeを設定するメソッドを用意して対応することにします
ありがとうございました
43デフォルトの名無しさん:2006/06/10(土) 21:34:03
C++で時間を扱うのってどうやるんですか?
例えば、0から10までの数字をランダムで一定時間ごとに
足していって1000になるまでかかった時間を表示するプログラムみたいなの
つくるためにはどうすればいいですか?
44デフォルトの名無しさん:2006/06/10(土) 21:37:47
開始時刻を保存しておいて、終了時刻から引けばいい。
秒単位なら time() さらに高精度でほしいなら clock() で現在時刻を取得できる。
4543:2006/06/10(土) 21:40:44
>>44
ありがとうございました。
46デフォルトの名無しさん:2006/06/11(日) 01:32:06
time()やclock()ってCPUの違いによって変わらないの?
OSあたりで調整しているの?
47デフォルトの名無しさん:2006/06/11(日) 01:36:53
クラス定義でインライン記述を使っていい条件がよくわからないのですが、
何か差があるんでしょうか?
全関数のプロトタイプとインプリメンテーションは別にした
方がいいのでしょうか?
4847:2006/06/11(日) 01:42:30
すいません。言語はC++です。
templateを使うクラスを記述するときに
インラインの方が記述しやすかったもので・・・
49デフォルトの名無しさん:2006/06/11(日) 01:45:25
>>46
そりゃそうだ。
clock() はいろいろ違うだろうけど CLOCKS_PER_SEC で差を吸収することができる。
50デフォルトの名無しさん:2006/06/11(日) 01:47:28
おまえら前スレを成仏させてあげてください
51デフォルトの名無しさん:2006/06/11(日) 01:48:35
>>47
インターフェースをクラス定義で記述するつもりなら、
別にしたほうがインターフェースと実装が分かれていて良いと言える。

インターフェースを別の文書で記述するなら、
クラス内で定義してしまってもほとんど問題ない。
52デフォルトの名無しさん:2006/06/11(日) 01:51:41
ポインターの勉強を始めたんですが、分からないことがあるので教えてください。
環境は VC++2003/2005 でプロジェクトのプロパティでコンパイル言語をC言語にしています。

#include <stdio.h>

int main() {
    char exe[] = "test.exe";       /* @ */
//  char *exe = "test.exe";        /* A */
    char *p = strrchr( exe, '.' );
    if( p ) {
        strcpy( p, ".ini" );
    }
    printf("%s\n", exe);
    return 0;
}

Aの方を有効にすると実行時にエラーになってしまいます。
@もAもやっていることは同じだと思っていたのですが、何か違いがあるのでしょうか?
53デフォルトの名無しさん:2006/06/11(日) 01:53:00
どうやってOSで調整しているんだろう?>clock()
for文などで何回も空ループさせて、計測しているのか?
CPUの周波数があらかじめわかると計算できるけど
OSからみれば、どのCPUに搭載されるかわからないからね〜
54デフォルトの名無しさん:2006/06/11(日) 01:57:36
>>53
まぁあれだ。オープンソースのOSのソースみればわかるよ
55デフォルトの名無しさん:2006/06/11(日) 02:04:37
>>52
それらは全く別物。


char a[] = "abc";



char a[] = {'a','b','c','\0'};

と同義。

char *a = "abc";

は、メモリ上のどこかに確保された文字列定数「"abc"」へのポインタを、ポインタ変数「a」の初期値としている。



文字列定数は、あくまで定数だから変更しちゃいかん。
56デフォルトの名無しさん:2006/06/11(日) 02:09:51
>>52
この手の間違いはC初学者にはとても多いので、何か命名した方がいいと思った

「リテラルレイプ」とか

そうすれば回答者は「リテラルレイプでググれ」で済むし、
質問者も「リテラルレイプはCでよく陥るミスなんだな」と
理解が早まると思ったんだがどうか
5747:2006/06/11(日) 02:53:42
>>51
ありがとうございます。
ヘッダをインターフェース確認ファイルとして使うときに分ける感じでしょうか?
VisualC++ですと1クラス1ヘッダが推奨されているようなんですが、
組み込みのSTL等見るとインラインに加えて複数クラスが
ヘッダで定義されているんですが、
どっちがよいのでしょうか?
5852:2006/06/11(日) 03:04:49
>55
素早い回答ありがとうございます。

char a[] = "abc";

char *a = "abc";
では実際に確保されるメモリ領域が異なるということでしょうか?

char a[] = "abc"; はヒープ領域?に確保される。
char *a = "abc"; は静的領域?に確保される。
静的領域に確保されたメモリは変更できない。

という理解でいいんでしょうか?
59デフォルトの名無しさん:2006/06/11(日) 03:36:21
data/bss/stack/moat/heapで区別するなら文字列実態はdataセクション、
ポインタはstack(auto) or bss(static),
配列の名前はおそらく即値でアセンブラ命令に直接入るだろうな。
60デフォルトの名無しさん:2006/06/11(日) 03:43:41
>>59
ちょwwwww

どうみても初心者なのにその解説かよwwww
61デフォルトの名無しさん:2006/06/11(日) 08:09:30
>>58
# とおりすがりですが、、、、

実装される領域に注目しすぎると本質を見失うかも。
定数(const)かどうかに注目したほうが理解しやすいと思います。

char a[] = "abc";
これは、配列(メモリ上の領域)の定義。(const指定子をつけていないので書き換え可能)
char *a = "abc";
これは、ポインタの定義。
リテラル("abc")を指すように初期化される。
通常リテラルはconst属性を持つ定数配列なので、書き換えができない。
コンパイラにうるさくwarningさせれば、この初期化が問題を起こしうることは
コンパイラが指摘してくれるはずです。
また、コンパイラオプションによって、リテラルを定数として扱わないように
することができる処理系も存在します。このようなオプションを指定すれば、
Aのソフトも実行することは可能です。
ただし、この場合、処理系がどのようにリテラルをメモリ上に格納しているのか、
実装方法に対して十分に注意しないと、さらに予期せぬ動作につながるため
お勧めはできません。
6255:2006/06/11(日) 08:33:14
>>58
配列は理解してる前提で書いたら、配列は理解してなかったのか…。


前者(a[])である配列の方は、文字列「abc\0」を格納するのに必要な領域を確保し、
それ全体に「a」と言う名前を付ける、と言う配列の定義。

後者(*a)であるポインタ変数の方は、どこかの領域を指すための値を格納するのに必要な領域なを確保し、
その領域に「a」と言う名前を付け、文字列定数「abc\0」の先頭を指すポインタ値で初期化しているポインタ変数の定義。


# ちなみに、文字列定数は、一般的には文字列リテラルと呼ばれる。
# 「文字列定数」と書いた方が、「何故、変更するべきモノではないのか?」がわかりやすいかと思った。
63デフォルトの名無しさん:2006/06/11(日) 09:02:20
だから、細かいことを言えば、pはchar*よりもconst char *である方がよい。
そうすれば書き換えようとしても、コンパイル時にエラーになる。

特にC++では文字列リテラルを非constなchar*へ初期化・代入できるのは、互換性のためとなっていたはず。
64デフォルトの名無しさん:2006/06/11(日) 13:05:24
>>56
そのネーミングセンスに感動した
65デフォルトの名無しさん:2006/06/11(日) 16:09:12
すみません。
今日からプログラミングをはじめてみたんですが、
プログラムが動きません。
色々ネットであさってみたのですが、よく理解できないので
ヒントでもいいので教えてください。
66デフォルトの名無しさん:2006/06/11(日) 16:10:56
67デフォルトの名無しさん:2006/06/11(日) 16:11:30
>>65
何をどうしてどのように動かないのか書かないと口の出しようもない。
68デフォルトの名無しさん:2006/06/11(日) 18:16:31
すいません。質問です。
今日からはじめようと思うんですが、CとC++どっち覚えればいいですか?
と質問したいところですが、わからないっていわれたんで、

C++でできることはCで全部できますか?教えてください。
69デフォルトの名無しさん:2006/06/11(日) 18:21:20
C++のリファレンスがネットで観れるところはありませんか?
MSDNとかじゃなくてもうちょっと綺麗にまとまった感じで
70デフォルトの名無しさん:2006/06/11(日) 18:21:26
できるよ
71デフォルトの名無しさん:2006/06/11(日) 18:21:46
あるよ
72デフォルトの名無しさん:2006/06/11(日) 18:29:09
URLを教えてください!
73デフォルトの名無しさん:2006/06/11(日) 18:34:36
>>72
俺はC++に関してならここの「標準 C++ ライブラリ」のところを見ている。
http://www.microsoft.com/japan/developer/library/vclang/stdlbhm.htm
74デフォルトの名無しさん:2006/06/11(日) 19:35:37
>>68
「できること」というのがプログラムを作成するという意味なら可能
言語の機能を指してるなら不可能
75デフォルトの名無しさん:2006/06/11(日) 19:54:25
>>67
すみませんでした。ちょっと頭痛かったのでそこらへん忘れていました。
borlandをsetbccを使って設定までしたのですが、
作ったのを動かす(?)ことができません。
たぶんborlandの使い方が理解できていないと思うのですが・・・

作ったやつをクリックすると1.exe 1.obj 1.tbsが作成されます。
プログラムの内容は文字の表示です。

その他書くことがあればお願いします。
76デフォルトの名無しさん:2006/06/11(日) 20:04:39
>>75 「何が動かないのか」が書かれていないが。
77デフォルトの名無しさん:2006/06/11(日) 20:04:44
78デフォルトの名無しさん:2006/06/11(日) 20:51:50
>>70>>74
わかりました。ありがとうございます。
C言語から始めて、色々身に付けてC言語じゃ不便と感じるようになってからC++に手出したいと思います。
79デフォルトの名無しさん:2006/06/11(日) 21:45:41
初心者なんですがプログラムつくるまえに仕様書的なもの書くじゃないですか?
書き方とか参考になるサイトないですか?なにかけばいいやら…
80デフォルトの名無しさん:2006/06/11(日) 21:54:31
まず、マトモな日本語で概要説明が書けることが重要。
そこが欠落した人の図面はどこか破綻している事が多い。
81デフォルトの名無しさん:2006/06/11(日) 22:00:31
エラー処理がよくわからないのですが、
たとえばスタッククラスのpopメソッドで
空っぽなのに実行された場合など
どういうエラー処理をすればいいんでしょうか?
例外をthrowしたり、assert()を呼んだりの区別がよくわかりません。
82デフォルトの名無しさん:2006/06/11(日) 22:02:43
>>81
C++ ならとりあえず例外投げとけ。
83デフォルトの名無しさん:2006/06/11(日) 22:03:59
>>81
好きにしろ。ここはお前のプログラムの仕様を考えてやるスレじゃいないんだ。
84デフォルトの名無しさん:2006/06/11(日) 22:08:03
結構大事な話題だと思うけどね

表明とかEiffelの契約とか
85デフォルトの名無しさん:2006/06/11(日) 22:30:45
むしろ例外でpopした値を返せ
86デフォルトの名無しさん:2006/06/11(日) 22:33:23
>>75
その1.exeを動かせ。それがお前の作ったプログラムだ。
87デフォルトの名無しさん:2006/06/12(月) 00:00:04
システムフックに関して質問させてください。
いずれかのウィンドウがアクティブになるたびに処理をしたいので、
下記のようなシステムフッククラスを作成しました。
(長いので要点のみ)

// フックの登録
BOOL CHook::Set(HWND hWnd)
{
    m_hHook = ::SetWindowsHookEx( WH_CBT,
    (HOOKPROC)CHook::CBTProc,
    GetThisInstH(), // システムフックなのでNULLじゃなくインスタンスハンドル渡す
    GetWindowThreadProcessId(hWnd, &lpdwProcessId));
}
88デフォルトの名無しさん:2006/06/12(月) 00:00:35
// フックの処理
LRESULT CALLBACK CHook::CBTProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam)
{
    // 処理してはいけないメッセージなので、次へ渡す
    if( p_nCode < 0 || p_nCode == HC_NOREMOVE)
        return ::CallNextHookEx( m_hHook, p_nCode, p_wParam, p_lParam );

    if( p_nCode == HCBT_ACTIVATE ) // ここがアクティブウィンドウが発生したときの処理
        TRACE0(_T("アクティブ化\n"));

    return ::CallNextHookEx( m_hHook, p_nCode, p_wParam, p_lParam );// 次のフックへと繋げる
}

また、このフックハンドルや必要な変数はグローバルにし、他とかぶらないようにしてあります。

#pragma data_seg( ".CKHookData" )
HHOOKCHook::m_hHook = NULL;
#pragma data_seg()

この状態で使用すると、フックを呼び出したウィンドウがアクティブになったときにしか反応しません。
これではローカルフックと変わりません。
いろいろ試してはみたのですがどうにも・・・どなたかわかる方、ご教授願います。
MFCアプリで使用するので、DLLはMFC DLL の拡張モードで作成してあります。
89デフォルトの名無しさん:2006/06/12(月) 00:18:15
>>88
GetWindowThreadProcessId(hWnd, &lpdwProcessId));

フックを呼び出したウインドウと同じスレッドのみって自分で指定してるだろが。
システム全体にフックを有効にしたければ、ここをNULLにする。
90k ◆WFGp1NZuiw :2006/06/12(月) 00:23:36
メモリを解放せずに,デストラクタのみを呼び出す auto_ptr のようなものを
作りたいのですが,うまくいきません.アドバイスいただけないでしょうか?
(placement new と組み合わせて使用することを想定)

書いてみたのは↓みたいなコードで,「pointer_->PointerClass();」のところで
文句言われてしまいます.

template<class PointerClass> class CleanPointer
{
public:
CleanPointer(PointerClass *pointer)
: pointer_(pointer)
{

};
~CleanPointer()
{
pointer_->PointerClass();
};

private:
PointerClass *pointer_;
};
91デフォルトの名無しさん:2006/06/12(月) 00:26:25
 >「pointer_->PointerClass();」のところで
はて……コピペミスではないようだが……高度な釣りかな。
92デフォルトの名無しさん:2006/06/12(月) 00:26:32
>>90
デストラクタの呼び出しは ~PointerClass() だよ。
しかしそのクラスが何の役に立つのかわからんな。
93デフォルトの名無しさん:2006/06/12(月) 00:26:42
>>90
デストラクタを呼ぶにはpointer_->~PointerClass();だぞ。
94デフォルトの名無しさん:2006/06/12(月) 00:26:55
>>89
できた・・・orz
即答ありがとうございます。
できた…かも。
今日一日潰れた問題でしたが、解決してよかったです。
ありがとうございました。さっそく必要な処理を加えていこうと思います。
95k ◆WFGp1NZuiw :2006/06/12(月) 00:28:58
>>92, >>93
あ,ほんとだ.ありがとうございました.
96京大生www:2006/06/12(月) 01:18:09
Cです。
環境はどこまでいえばいいか分かりませんが、コンパイラはbcc32

テキストファイルのa.textが
abc
def
ghi
だとします。

char *hako[3];
で定義した配列ポインタを使って

*(hako+0) = abc
*(hako+1) = def
*(hako+2) = ghi

というかんじでファイルから配列にコピーしたいのですが、どうすればいいのでしょうか?
97デフォルトの名無しさん:2006/06/12(月) 01:23:03
>>96
宿題は宿題スレへ。
98デフォルトの名無しさん:2006/06/12(月) 01:23:57
これが今の京大生だったら泣けるw
99京大生www:2006/06/12(月) 01:24:16
宿題スレにも書いた。
早く答えて欲しい、製作意欲が失せてしまう
100629 ◆zZtDbr6Gfc :2006/06/12(月) 01:25:24
答え聞いてるのに制作意欲も何もないよね
101デフォルトの名無しさん:2006/06/12(月) 01:25:59
いつかのトリップが残ってやがったorz
102京大生www:2006/06/12(月) 01:27:55
これが出来れば先がうまくいきそうなんだけど。
分からないなら分からないって言ってくれないか?
103デフォルトの名無しさん:2006/06/12(月) 01:29:01
>>102
わかるからわからないって言わないんだろうが。
マルチは失せろそして氏ね。
104デフォルトの名無しさん:2006/06/12(月) 01:31:10
>>102
我々には到底分からないので、どうか違う場所でお尋ねください
105デフォルトの名無しさん:2006/06/12(月) 01:39:48
>狂大生
お前には一生無理なんだからもう寝ろよ
106デフォルトの名無しさん:2006/06/12(月) 01:40:13
>>102
つまりお前のこの先はうまくいかないってことだ。
これは分かる。
107デフォルトの名無しさん:2006/06/12(月) 01:42:05
>>96
何がうまくいかないのかわからなけりゃ、答えようもないだろ?
まずは自分で書いて、わからないところを質問、相談しろ。
10852:2006/06/12(月) 02:31:21
>61,62,63
回答ありがとうございます。

ポインタを使えば文字列定数でも書き換えられると誤解していました。
109デフォルトの名無しさん:2006/06/12(月) 10:47:13
>>96,99,102
BCC32で確認してある。ちなみにお前の配列はタダのポインタの配列
#include <stdio.h>
#define BUFSIZE 1000
FILE *fp;
char *fname = "testdata.txt";
unsigned char buf[BUFSIZE];
unsigned char *getnext(unsigned char *);
int main(void)
{
char *hako[3];
int i,g;
if((fp=fopen(fname,"rt"))==NULL){printf("cannot open file %s\n",fname);return 1;}
i=0;
while(1){
if(EOF==(g = fgetc(fp)))break;
buf[i++]= g;
}
//printf("%s",buf);
hako[0]=buf;
for(i=1;i<3;i++)hako[i] = getnext(hako[i-1]);
for(i=0;i<3;i++) printf("hako[%d] : %s\n",i,hako[i]);
return 0;
}
unsigned char *getnext(unsigned char *buffer){
while( *buffer != 0x0a) buffer++;
*buffer=0x00;
return ++buffer;
}
110デフォルトの名無しさん:2006/06/12(月) 18:02:04
リソースを使わずにエディットボックスを作りたいのですが
CREATEWINDOWの所を教えて下さい
111デフォルトの名無しさん:2006/06/12(月) 18:09:17
>>110
●どこまで調査したのか?
●どこまで理解したのか?
●何が理解できないのか?
●具体的に、どの様な事を試したのか?
112デフォルトの名無しさん:2006/06/12(月) 19:26:20
WISDOM SAKURAにあるソースでエディットボックスは作れましたが
リソースエディタなどで作れる物とは違い、線のみの枠なので
困っているのです
立体的な凹みのある物を作りたいのですが
113デフォルトの名無しさん:2006/06/12(月) 20:05:53
114デフォルトの名無しさん:2006/06/12(月) 20:10:58
携帯なので見れません
115デフォルトの名無しさん:2006/06/12(月) 20:19:42
>>96
各行は1023バイト以下とし、エラー処理等は割愛する。

char *hako[3];
char buffer[1024];
FILE* fp;
int i;
てな変数を用意して、

fp = fopen("a.text", "r");
for (i = 0; i < 3; i++) {
 buffer[sizeof(buffer)-1] = 0;
 fgets(buffer, sizeof(buffer)-1, fp);
 hako[0] = strdup( buffer );
}
fclose(fp);
116デフォルトの名無しさん:2006/06/12(月) 21:02:12
>>112
CreateWindowExで拡張スタイル指定すればいい
詳細はググレ
117デフォルトの名無しさん:2006/06/13(火) 17:35:50
質問です
コンパイラ C言語を始めよう! を使っているのですが実行してコマンドプロンプトに何も出ません
プログラム自体には間違いはないと思うのですが・・・
そもそもコンパイラとの受け渡しもよく理解できておりません ><

OS:windowsXP SP2
コンパイラに LSI C-86 Ver.3.30c 試食版 を使用
118デフォルトの名無しさん:2006/06/13(火) 17:46:39
開いた口蛾塞がらなくなった
119デフォルトの名無しさん:2006/06/13(火) 17:53:09
第三者だが老婆心で補足。

「C言語を始めよう!」ってのは、誰だかが作った簡易IDE機能を持つ
エディタのようなものの固有名詞のようです。

では淡々と続けてください:
120デフォルトの名無しさん:2006/06/13(火) 17:54:30
ちなみにこれです
http://homepage3.nifty.com/aokura/phoebe/phoebe.htm

プログラムは
#include <stdio.h>

main()
{
printf("ABC\n");
}
でも何もでません ><
121デフォルトの名無しさん:2006/06/13(火) 17:58:42
実行後にPAUSE にチェックを入れて、
コンパイルして実行してみたら?
122デフォルトの名無しさん:2006/06/13(火) 18:23:24
>>117
学習用としても、LSI-C86を使うことは激しくお勧めできません。
もっと近代的なコンパイラを使いましょう。
123デフォルトの名無しさん:2006/06/13(火) 18:28:14
>>122
おすすめの教えてください
124デフォルトの名無しさん:2006/06/13(火) 18:50:04
125デフォルトの名無しさん:2006/06/13(火) 19:00:13
>>123
これが良いかと思います。無料です。
 ↓
Visual C++ 2005 Express Edition 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1140806916/
126デフォルトの名無しさん:2006/06/13(火) 19:41:18
VCEEの登場で有象無象の学習用Cコンパイラとやらを使う理由がほとんどなくなったな。
127京大生www:2006/06/13(火) 19:43:27
釣りだろ
128デフォルトの名無しさん:2006/06/13(火) 19:48:15
>>127
自らの学歴を誇大するDQNキンモー☆
129デフォルトの名無しさん:2006/06/13(火) 21:43:36
109,115カワイソ
130デフォルトの名無しさん:2006/06/13(火) 23:11:16
最近C言語を始めた者です。
ヘッダファイルとCソースファイルに書くべきことは何ですか?
例えば、Cソースファイルで使う定数をヘッダファイルに書くなと聞いたことがあります。
どんなものがヘッダファイルに記述すべきで、どんなものがCソースファイルに記述すべきか教えてください。
131デフォルトの名無しさん:2006/06/13(火) 23:17:26
>>130
いろいろなソースファイルから参照される情報→ヘッダファイルへ
その他→ソースファイルへ
132デフォルトの名無しさん:2006/06/14(水) 00:44:33
APIを使ってウインドウのインスタンスハンドルを取得しようとしています。


HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE);

ここで警告がでてきます。
'型キャスト' : 'LONG' からより大きいサイズの 'HINSTANCE' へ変換します。
(VS.NET 2003 > VC++)

警告を出さないようにするにはどうすればいいんでしょうか?
133デフォルトの名無しさん:2006/06/14(水) 01:00:10
bcc55でプログラミングをしています。
平方根を求めるためにsqrt関数を使おうとしました。
#inclide<math.h>もちゃんと入れたのですが、
「エラー E2314 rego.c 27: 関数でないものを呼び出している(関数 main )」
と表示されうまくいきません。
どうすればいいのでしょうか?
134デフォルトの名無しさん:2006/06/14(水) 01:00:21
>>132
プロジェクトの設定の「C/C++」→「64bit移植への対応」を「いいえ」に
135デフォルトの名無しさん:2006/06/14(水) 01:12:51
sourceは?
136デフォルトの名無しさん:2006/06/14(水) 01:30:29
>>134
おお、見事に消えました。ありがとうございます!
137デフォルトの名無しさん:2006/06/14(水) 01:45:43
C言語をやろうと思い導入しました
ですがうまくいきません

------ ビルド開始: プロジェクト: C, 構成: Debug Win32 ------
コンパイルしています...
Cプラス.cpp
.\Cプラス.cpp(4) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
ビルドログは "file://d:\My document\Visual Studio 2005\Projects\C\C\Debug\BuildLog.htm" に保存されました。
C - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

となってエラーになります
138デフォルトの名無しさん:2006/06/14(水) 01:47:22
誤爆しました
さようなら
139デフォルトの名無しさん:2006/06/14(水) 07:28:13
>>132
<windowsx.h>のGetWindowInstanceの方が楽だよ。
中身はGetWindowLongPtrを呼んで結果をHINSTANCEへキャストするマクロ。
140デフォルトの名無しさん:2006/06/14(水) 09:48:48
>>137
まず、ソースも貼れ。
話はそれからだ。
141133:2006/06/14(水) 10:34:01
#include<stdio.h>
#include<math.h>
#define n 5

int main(void)
{
int i;
double q[n],avq,qr,s;
double p=0,r=0;

printf("%d個のQのデータを入力してください\n",n);
for(i=0; i<n ; i++)
{
scanf("%lf", &q[i]);
}
for(i=0; i<n ; i++)
{
p=p+q[i];
}
avq=p/n;
for(i=0; i<n ; i++)
{
r=r+(q[i]-avq)*(q[i]-avq);
}
qr=sqrt(r/ (n(n-1)) );
s=qr/avq;
printf("Qの相対誤差は%20.15lfです。\n",s);
return 0;
}

ソース貼ってなかったですね。冗長なソースですがよろしくお願いします。
142デフォルトの名無しさん:2006/06/14(水) 10:37:44
>>141
× n(n-1)
○ n*(n-1)

これじゃnって名前の関数をn-1を引数に呼び出してると解釈される罠
143133:2006/06/14(水) 12:03:47
>>142
ありがとうございます、解決しました。
こんな初歩のミスやってしまった・・・
144137:2006/06/14(水) 13:26:03
>>140
ソースは単純なものです

#include <stdio.h>

main()
{
printf("ABC\n");
}

初歩の文字の表示すら受け付けないんでしょうか・・・
145デフォルトの名無しさん:2006/06/14(水) 13:32:05
>>144
C言語としてコンパイルすること。

C言語は、関数の戻り値の型の省略を認めている(暗黙にint型になる)
C++は、認めていない(main()関数は、かならずint型を返さなければならない)
146623:2006/06/14(水) 14:32:17
Borland 5.5,bcpadを使用しています。
行列のプログラム計算をしようとしてて下のサイトのファイルを導入しようと思い、
ttp://www.ipc.akita-nct.ac.jp/~yamamoto/comp/cpp/class/class.html
で、matrix.hとmatrix.cppをダウンロードして、まずmatrix.hを
.hが入っているフォルダに入れてそのあとmatrix.cppをビルドしました。
しかし、Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
となってしまいました。それで解決する方法をそのあといろいろググって
保存ファイル名を「bcc32 -tW 保存ファイル名」にすればいいらしいということが
書いてあって早速やってみたのですが「エラー E2194: ファイル 'bcc32.cpp' が見つからない」
となってしまい、ビルドできません。さらに、ビルドを無視して
インクルードファイルを使ってプログラムを作って実行してみたのですがやはり、
「Error: 外部シンボル 'Matrix::~Matrix()' が未解決(Z:\○○\TORIAEZU.OBJ が参照)
Error: 外部シンボル 'Matrix::Matrix(int, int)' が未解決(Z:\○○\TORIAEZU.OBJ が参照)」
と出てきてしまいます。どうにかしてこれを使用したいのですがどうすればいいのでしょうか?
長文すみません。教えてください。よろしくお願いします。
147137:2006/06/14(水) 14:42:14
>>145
拡張子をCにしていろいろ試したらできました
148デフォルトの名無しさん:2006/06/14(水) 14:47:25
>>146
そのmatrix.cppはクラスの実装だけだからそれだけじゃ実行できない。-cオプション付けてリンク、実行ファイル生成しなければobjファイルは吐けるけど。

でtoriaezu.cppでエラー出るのはクラスの実装がリンクされてない。上の手順でコンパイル済みのobjをリンクする必要がある。
bcc32 toriaezu.cpp matrix.objな感じで。
149デフォルトの名無しさん:2006/06/14(水) 15:05:21
補足すると、
bcc32 toriaezu.cpp matrix.cppでもいける。

でも元のソースの文字コードがEUCでそのままじゃエラー出るんで、
QKCかなんか適当な手段でShift-JISに直すと吉。
150デフォルトの名無しさん:2006/06/14(水) 15:11:36
あ、あと本格的に行列演算したかったらBoost::uBLAS使った方が幸せかもしれんが
俺は使ったことがないので手放しにお勧めしない。


適当にぐぐった
ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html
151146:2006/06/14(水) 15:33:18
>>148-150さん。
小一時間考えても何をおっしゃってるのか理解出来ません( ノД`)
本当申し訳ないのですが、もう少し馬鹿にもわかるように
説明していただけませんか?本当すみません。
あと>>150のは見たんですけど、私はそれほど大規模な計算は
行わないと思いますのでこの山本さんのファイルを使用したいと思うのです。
152デフォルトの名無しさん:2006/06/14(水) 15:45:55
>151
えーと。
分割コンパイルという言葉に聞き覚えは?
153デフォルトの名無しさん:2006/06/14(水) 16:45:58
>>152
返答遅くなってすみません!!どうしても外せない用事ができてしまって
外に出てしまいました。今出先のノートパソコンからやってるのですが、
分割コンパイルという言葉に聞き覚えはありません…
帰ってみてぐぐればわかるでしょうか?本当申し訳ありません。
154デフォルトの名無しさん:2006/06/14(水) 18:20:51
>>153
なんかとてつもなくわかりにくいような気もするが置いとく

・コンパイル時の動作
 とりあえずbcc32 toriaezu.cpp matrix.cppと打ち込んだ場合、
 コンパイラはまず最初にtoriaezu.cppとmatrix.cppをコンパイルしてtoriaezu.objとmatrix.objを作成する(この時点でエラーがあればコンパイルエラーと出る)
 次に、リンカ(ilink32.exe)を呼び出して、CUIアプリケーション用スタートアップモジュール(C0X32W.OBJ)や標準関数ライブラリ(CW32.LIB)と
 先にコンパイルしたtoriaezu.objとmatrix.objをリンクしてtoriaezu.exeを吐き出させる。

・ヘッダファイルとソースファイル(コンパイル単位)
 ヘッダファイルは通常、クラスや関数の宣言のみで単独でコンパイルや他のソースファイルにインクルードしても実体は含まれない。(テンプレートは通常ヘッダに実装書くけど置いとく)
 当然、宣言だけだと呼び出す関数がそのコンパイル単位に存在しないのでそのクラスの実装(matrix.obj)から関数を呼び出す必要がある。

ついでにBCC5.5.1のライブラリファイルとかの資料
http://support.borland.com/entry!default.jspa?categoryID=90&externalID=4323

混乱するかも知らん(;´Д`)
155デフォルトの名無しさん:2006/06/14(水) 19:54:30
先日、VisualC++EEをインストールしたんですが
環境変数設定で間違えて$(PATH)の値を消してしまって困っています
$(PATH)○○
となるはずですけど○○の部分がわかりません
変な話で申し訳ありませんが教えてください
どうかお願いします
156デフォルトの名無しさん:2006/06/14(水) 20:00:55
通りすがりですが、、

・複数のソースコードからなるソフトをひとつのexeファイルにまとめることができる。
 中規模以上のソフトは通常複数のソースファイルで構成されている。
 (もしこの機能がなかったら、たとえばLINUXカーネルのソースコードは、、、、、、)
 ひとつのソフトを分割してコンパイルすることになるので、コンパイル結果を結合する
 必要がある、リンカはこの結合を行い、結合されたソフトの実行開始アドレスなどを
 exeファイル内に設定する。
 (ちなみに、単一のCソースからなるソフトでも、リンカはスタートアップ時に初期化のために
  実行されるCRTなどを、コンパイル結果に結合して実行ファイルを作成している)

・C言語(コンソールプログラム)は、int main()から実行が開始される。
 (実際にはCRT(C0X32)の中のスタートアップルーチンからmainを読んでいるのですが、、、)
 よって、mainがないとリンカさんが困ってしまう。
 Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

そしてふりだしへ、、、
157デフォルトの名無しさん:2006/06/14(水) 21:27:19
どうでもいいけどこのスレで_mainが未解決のエラーが出ると書かれたら、
十中八九WinMainから始まっているのに-Wを指定していなかったというオチ。
158デフォルトの名無しさん:2006/06/14(水) 21:40:38
>>157
不幸なことに今回はレアケースなのだよ
つまり10回のうち1、2回というか、それ以上
多分100万人に1人の…
159デフォルトの名無しさん:2006/06/14(水) 22:03:17
main.c hoge.c hoge.hをコンパイルする場合
bcc32 -etest *.h *.c
160デフォルトの名無しさん :2006/06/14(水) 23:59:17
C言語での質問なんですが
関数定義、宣言の時
例えば
static void func(void){}と
void func(void){}とするのでは
何が違うんでしょうか
どなたか教えて頂きたいです
161デフォルトの名無しさん:2006/06/15(木) 00:03:59
>>160
別のソースファイルから呼び出すことができるかどうかが違う。
162デフォルトの名無しさん:2006/06/15(木) 00:09:21
>>160
前者は非公開、後者は他ソースに公開。
例えば同じ名前の関数が他ソースにあるときに問題になる。

最適化の観点からは、
gccなら前者ならインライン展開する可能性を期待できる。
iccなら事実上殆ど差がない。
163デフォルトの名無しさん:2006/06/15(木) 00:24:07
>>156
例えばコマンドラインから、bcc32 hoge.h hoge1.c hoge2.c  ...でできるはず

>>159
*.h *.c はディレクトリ内の拡張子 .h .c の全てのファイルをコンパイル対象にしてしまう。
これやるぐらいなら、makefile の作り方を覚えた方がいい。
初心者の内は自分がどのファイルをコンパイルしているのか、
意識的に考えながらやった方がいい。
164デフォルトの名無しさん:2006/06/15(木) 03:31:01
初歩的な事で申し訳ないのですが……次のソースをコンパイルして実行すると、「セグメンテーション違反」と言われて怒られます。何が悪いのでしょう?

#include <stdio.h>

int double_malloc(double *target, int number) {
if ((target = (double *)malloc(sizeof(double) * number)) == NULL ) {
puts("Memory Unallocatable in dounle_malloc()\n") ;
return (-1) ;
}
return (0) ;
}

int main(void) {

int number ;
double *test ;

number = 2 ;
double_malloc(test, number) ;
test[0] = 1.0 ;
test[1] = 2.0 ;
printf("%f\n", test[0]+test[1]) ;
free(*test) ;
return (0) ;

}

OSはVineLinux3.2、コンパイラはOSについてきたgccを使っています。CPUはPentium4 2.66GHz、総メモリは1Gでコンパイル後も650MB程度の空きがありました。
165デフォルトの名無しさん:2006/06/15(木) 03:36:27
Cはよく分からないから勘で言うけどfree()はポインタ渡すんでない?
166デフォルトの名無しさん:2006/06/15(木) 03:40:36
double_malloc の target が double * なのがそもそも問題外。
167デフォルトの名無しさん:2006/06/15(木) 07:05:12
パラメータをdouble**にするか戻り値をdouble*にすれ。
168デフォルトの名無しさん:2006/06/15(木) 12:43:36
>>164
1. 関数の中で引数(の変数)に代入しても、渡した側の変数の値は変更されない。
2. free には malloc が返してきた値と同じ値を渡す必要がある。
 (例) a = malloc(...); としたなら free(a)。 free(*a) や free(a+1) はダメ。

C なら double* double_malloc(int n) として、 test = double_malloc(number) とするか、
int double_malloc(double** ptr, int n) として、 double_malloc(&test, number) とする。
(後者の場合 *ptr = (double*) malloc(...); として値を返す)

加えて C++ なら int double_malloc(double* &ptr, int n) として、 double_malloc(test, number) とも書ける。
(この場合 ptr = (double*) malloc(...); でOK)
169デフォルトの名無しさん:2006/06/15(木) 12:45:49
いや、C++ならそもそもmalloc()なんか使うなよ、と。
170デフォルトの名無しさん:2006/06/15(木) 12:54:37
なんで?
171デフォルトの名無しさん:2006/06/15(木) 13:05:00
俺は
#define MBYTE (1024 * 1024)
char Var[MBYTE];
こうやったらエラーでたからしかたなくmalloc()使ってる…。
172デフォルトの名無しさん:2006/06/15(木) 13:05:35
>>170
単一オブジェクトの動的生成なら new 使ったほうがよくて、
動的配列なら vector 使ったほうがいいから。
173デフォルトの名無しさん:2006/06/15(木) 13:07:51
>>172馬鹿?
174172:2006/06/15(木) 13:10:22
>>173
自分ではそんなつもりないけど、何か変なこと言ったか?
175デフォルトの名無しさん:2006/06/15(木) 13:25:51
>>172
俺もnewかコンテナ使うけど、コンテナの機能を使わない場合、malloc()でもいいんじゃね?
ビルトインタイプなんだし。
176デフォルトの名無しさん:2006/06/15(木) 13:30:00
まあnew/deleteとmalloc/freeをごっちゃにするようなトンチキなことさえしなきゃいいんじゃね
177デフォルトの名無しさん:2006/06/15(木) 13:41:41
mallocすればreallocも使える!
178デフォルトの名無しさん:2006/06/15(木) 13:48:24
vectorよりmallocの方が、微妙に速い・・
179デフォルトの名無しさん:2006/06/15(木) 13:53:00
>>178
微妙なのかよw
180デフォルトの名無しさん:2006/06/15(木) 14:39:31
そんなにクリティカルに速度を気にする奴は、
そもそもmallocなど使わずに、環境依存のメモリ確保のシステムコールなどを使う。
181デフォルトの名無しさん:2006/06/15(木) 14:53:15
結論、Cとの互換性が必要な場合と既存のソースの流用の場合を除いて、
C++で積極的にmalloc()を使用する理由はない。
182デフォルトの名無しさん:2006/06/15(木) 15:06:32
>>172
問題になるのは、コンストラクタ/デストラクタの呼び出しの有無。

呼び出されなければならない場合、new/deleteを使用するべき。
コンストラクタ/デストラクタがなければ好みの問題。
183デフォルトの名無しさん:2006/06/15(木) 16:08:58
結局>>173が馬鹿だったっていうオチ?
184デフォルトの名無しさん:2006/06/15(木) 16:21:28
>>180
システムコールの方が c のライブラリの malloc より速い OS って
例えばどんなのがある?
185164:2006/06/15(木) 17:05:49
>>167
>>168

無事解決しました。ありがとうございます。
186デフォルトの名無しさん:2006/06/15(木) 17:17:11
>>184
mallocがそのシステムコールを呼んでいるだけだったとしても、
インライン展開されない限り、mallocを呼ぶオーバーヘッドがかかる。
187デフォルトの名無しさん:2006/06/15(木) 17:20:44
>>186
理論上、1度だけ大きな領域を確保するときにはそうだね。

というような特殊事例でのバカ話は別として、
実際にはどのOSのシステムコールが、そのOSの標準的なCランタイムの
malloc より高速なの?
188デフォルトの名無しさん:2006/06/15(木) 17:22:53
ちなみに Windows はこうだ↓
http://www.google.co.jp/search?hl=ja&q=%E9%80%9F%E5%BA%A6+HeapAlloc+malloc&lr=

malloc の方がはるかに高速。Linux だって sbrk より malloc の方が速いだろ。
189デフォルトの名無しさん:2006/06/15(木) 17:33:10
>>188
まあ、そういう工夫によって、OS依存のAPIより早いという場合はあるね。
iostreamだって、内部でバッファ処理をしていて、
OSのAPIを呼び出して、ファイルに対して1バイトずつアクセスするより早いことがあるかもしれないし。
190デフォルトの名無しさん:2006/06/15(木) 18:13:53
>>188
でも近頃のVisual C++のmallocは単にHeapAllocを呼ぶようになっていたと思う。
191デフォルトの名無しさん:2006/06/15(木) 20:26:52
たぶん誤解している人がいる
ヒント:仮想記憶空間
192デフォルトの名無しさん:2006/06/15(木) 22:33:21
プログラム的には動的に割り当ててるけど、
実はプロセス起動時にまるっとある程度確保されてる場合もある
193デフォルトの名無しさん:2006/06/15(木) 23:16:49
、、、

システムにメモリを要求することはかなりかなり高価な処理であるから,
mallocの呼び出しごとにそれをするのは損である。
、、、
と古典には書かれている。
194デフォルトの名無しさん:2006/06/15(木) 23:28:44
>>193
どのレスに対するコメントか知らんが、

「だからどうした」
195デフォルトの名無しさん:2006/06/16(金) 00:17:27
多倍長整数のライブラリで MS VC++2005 で使える C++ でかかれたライブラリが
欲しいのですが、お勧めはありますか?

下のを試したんですが、VC++2003以降でいくつか古いインクルードヘッダが
なくなったせい(だと思うんですが)で、コンパイルできません。
ttp://www.vector.co.jp/soft/win95/prog/se059033.html
196デフォルトの名無しさん:2006/06/16(金) 00:33:47
>>195
これ使ってみて。
boost sandbox bigint
197デフォルトの名無しさん :2006/06/16(金) 03:00:28
>>161さん
>>162さん
遅レスですいません
レスありがとうございます。
そういう意味だったんですか。
わかりました。ありがとうございました。
198デフォルトの名無しさん:2006/06/16(金) 03:27:37
>>195
>MS VC++2005 で使える
かどうかは確認してないけど
gmpなんてのもある
199デフォルトの名無しさん:2006/06/16(金) 09:32:43
gmpはgccでしか使えない希ガス
200デフォルトの名無しさん:2006/06/16(金) 09:59:50
>>196
bigintってまだ残っていたんだ。
正式に採用される日は来るのかな。

個人的に、単純な実装でもいいから、
多倍長整数のための、標準ライブラリは必要だと思うのだけれど。
201デフォルトの名無しさん:2006/06/16(金) 12:05:43
>>195
単にC++のヘッダーファイルが*.hになってるだけだね。
気合で修正汁
202デフォルトの名無しさん:2006/06/16(金) 18:22:39
STLのmapをイテレータでアクセスする場合、
キーでソートされていることは保障されているのでしょうか?
次のコードによる出力結果が同じであることは、保障されていますか?

int main()
{
  std::map<int, int> test ;

  for (int i = 0 ; i != 100 ; ++i)
    test[i] = i ;

  for (std::map<int, int>::iterator Iter = test.begin() ;
    Iter != test.end() ;
    ++Iter)
  { std::cout << "key : " << Iter->first << ' element : ' << Iter->second << '\n' ; }

  std::cout << std::endl ;
}
203デフォルトの名無しさん:2006/06/16(金) 18:30:13
>>202
・できる限り載せるソースはコンパイル可能なものにしてくれ。
・「出力結果が同じ」とは? 何と何が同じであることを期待しているの?
204デフォルトの名無しさん:2006/06/16(金) 18:35:50
>>203
全角空白を半角空白に置換すればコンパイル可能だと思います。
VC8のDinkumwareでは、

1 1
2 2
3 3
...

のように表示されます。
デフォルトでは比較関数はstd::lessになるのは決まっていたと思いますが、
イテレータでアクセスする場合、
こういう風にソートされた形で順々に要素にアクセスできるのが、
規格として保障されているのか知りたいのですが。
205デフォルトの名無しさん:2006/06/16(金) 18:40:34
>>202
ほんとにコンパイルできた?
2バイト空白を置換してもエラーになるんだけどなぁ。
つーか、>204のようには出力されないと思うぞ。
#少し落ち着いて自分のコードをよく見てみるか自分でコピペして味噌。
##あ、すまんが本題の「規格で保証」されているかは知らない。
###でも、その筈だけどね。
####いや、保障はしてくれないのは間違いないなw
206デフォルトの名無しさん:2006/06/16(金) 19:03:59
207デフォルトの名無しさん:2006/06/16(金) 19:48:25
>>205
パッと見、elementを囲っているのがシングルクォーテーションであるって以外は問題ないコードだが
208デフォルトの名無しさん:2006/06/17(土) 00:16:35
>>199
> gmpはgccでしか使えない希ガス

ttp://www.cs.nyu.edu/exact/core/gmp/
209デフォルトの名無しさん:2006/06/17(土) 00:46:57
エラトステネスの篩を使って素数を求めるプログラムを
作ったんだけどエラーが出ます。
助けてください。
ttp://uploader.fam.cx/data/u10732.txt
210202:2006/06/17(土) 00:52:23
>>205
どうも文字列リテラルをシングルクオートでくくっていたみたいです。
すみません。

>>206
読んでみましたが、どこにもmapをイテレータでアクセスすると
ソートされているかどうかなんて、書かれていないような気がします。
211209:2006/06/17(土) 00:54:18
今見たらいろいろ間違ってた。
申し訳ないです。
212デフォルトの名無しさん:2006/06/17(土) 01:00:45
>>210
> and they also guarantee that their elements are always sorted in ascending order by key.
213202:2006/06/17(土) 01:06:07
>>212
Sorted Associative Containerの説明のほうにあったのですか。
どうもありがとうございます。
214195:2006/06/17(土) 01:58:47
レスどうも。

>>196
頑張って探したけど、見つかりませんでした><

>>201
気合入れて修正して、コンパイルはなんとか通らせることが出来ました。
サンプルプログラムも正常に動作しているみたいです。でも、警告いっぱいでちょっと不安です。

gmpの情報もありがとうございます。ドキュメント読みながら考慮してみます。
215デフォルトの名無しさん:2006/06/17(土) 02:58:57
216デフォルトの名無しさん:2006/06/17(土) 13:59:47
どなたか教えてくださいませ。

GetValue()という関数があったとして、仮引数に与えたTypeとIndexによって、
戻り値がfloatやlongとして返ってくる方法は無いでしょうか?
キャストや別関数を作成しないでまとめたいのです。

戻り値
float(or long) GetValue(long iType, long iIndex);
217デフォルトの名無しさん:2006/06/17(土) 14:04:59
>>216
思いつく方法を書いてみた。

戻り値型のクラスを作成する(別関数と同程度の手間がかかる)
unionを使う(非推奨)
void *ポインタを使って環境依存のコード(非推奨&キャスト必須ゆえNG)
boost::anyを使う(キャスト必須ゆえNG)
例外を使う(禁止)

何がいいんだろう。
218デフォルトの名無しさん:2006/06/17(土) 14:09:10
>>216
戻り値の型がfloatではいけない訳を聞こうか。
219デフォルトの名無しさん:2006/06/17(土) 14:18:42
>>216
仮にGetValueがfloatやlongを臨機応変に返せたとして、受け取る側はどうするつもりだよ

long l = GetValue(); // floatを返すかもしれない
float f = GetValue(); // longを返すかもしれない
220デフォルトの名無しさん:2006/06/17(土) 14:19:21
floatじゃ駄目な理由は特にないんですが、
取ってきたいデータがfloatはlongと混在しているので、全てfloatで返ってきてしまうのが、
なんかスッキリしなくてですね。
221デフォルトの名無しさん:2006/06/17(土) 14:23:40
確かに...破綻してました。すいません。
222デフォルトの名無しさん:2006/06/17(土) 14:24:56
>>221
エスパーしてみると、iTypeってのがlongかfloatかを決めているのかな?
だとしたらtemplate使えばいいんじゃまいか。
223デフォルトの名無しさん:2006/06/17(土) 14:28:01
>>222
はい。Typeによって決めています。
最初テンプレート関数を使おうかと思ったのですが、私が馬鹿過ぎてほぼ使い方を忘れかけてまして...。
戻り値の型だけを変更することもできるんでしたっけ。
224デフォルトの名無しさん:2006/06/17(土) 14:31:20
そういう話なら、オーバーロードで十分。
225デフォルトの名無しさん:2006/06/17(土) 14:33:27
オーバーロードじゃ駄目だろ
226デフォルトの名無しさん:2006/06/17(土) 14:34:00
え゛
227デフォルトの名無しさん:2006/06/17(土) 14:38:30
>>223
出来る、が、iTypeを見て型を判別する責務をGetValueではなく、GetValueを使う側に移さないといけない。

template <class T>
T GetValue(long iIndex);

てなのを作っておいて

long l;
float f;
if (iType == /*long型*/)
  l = GetValue<long>(index);
else
  f = GetValue<float>(index);

のような感じの使い方なら可能だが…
228デフォルトの名無しさん:2006/06/17(土) 14:40:07
なんだ。コンパイル時に決まっていればそれでいいのか。
てっきり、戻す型がもっと多くて、コンパイル時にやるのが面倒だから聞いているんだと思っていた。

//ヘッダ
template < typename T >
T getValue(int idx) ;



//実装
template < typename T >
T getValue(int idx)
{
  return 0 ;
}

//longとfloatしか使わないので、明示的なインスタンス化をしておく。
template long getValue(int idx) ;
template float getValue(int idx)


でもこれ、わざわざ使うときに、getValue<long>とかgetValue<float>とかしないといけないな。
面倒かも。
229デフォルトの名無しさん:2006/06/17(土) 14:44:43
>>225
オーバーロードだとこんな感じ?
戻り値にはできなくなるけど

void GetValue(long & dest, int idx) ;
void GetValue(float & dest, int idx) ;

//使い方
long x ;
GetValue(x, 0) ;
float f ;
GetValue(f, 1) ;
230デフォルトの名無しさん:2006/06/17(土) 14:50:10
>>229
> キャストや別関数を作成しないでまとめたいのです。

というのがあるし、データを特定のインデックスから取ってくるってだけでオーバーロードを使ってしまうと、
それぞれの関数の内容がほとんど同じになってしまって無駄。
この場合はtemplateが妥当だろ。
longとfloatの場合でよほど処理に差があるなら話は別だが
231デフォルトの名無しさん:2006/06/17(土) 15:14:05
floatでいつも返して、受け取り側でキャストすりゃいいじゃn
232デフォルトの名無しさん:2006/06/17(土) 15:19:26
テンプレート関数ってオーバーライドできんだっけ?
233デフォルトの名無しさん:2006/06/17(土) 15:33:04
>>232
いつの時代の人ですか?
とっくにできるようになりましたよ。
234デフォルトの名無しさん:2006/06/17(土) 15:34:24
煽りいくない
235デフォルトの名無しさん:2006/06/17(土) 16:39:20
>>231
一般的に、floatの方がlongより精度がないので問題が出そう。
236デフォルトの名無しさん:2006/06/17(土) 16:42:19
>>232
オーバーライドはできないなぁ。
オーバーロードならできるけど。
>>233 いつの時代の人ですか?
237デフォルトの名無しさん:2006/06/17(土) 17:06:55
structにprivate指定できるのがむかつく
238デフォルトの名無しさん:2006/06/17(土) 20:54:51
>>237
D&E読めば少しは納得する気になれるかもしれない。
239デフォルトの名無しさん:2006/06/17(土) 22:58:08
等加速度直線運動についてのプログラムを書いたんですが、もうちょっとすっきりさせたいので赤ペン先生お願いします。
初心者なのでお手柔らかにお願いします
ttp://up.spawn.jp/file/up25025.txt
240デフォルトの名無しさん:2006/06/18(日) 01:39:43
>>239
何かと思ったら計算するだけかと思いきや何で全部intなんだよ
toukasokudoの中の変数はdoubleかfloatを使うか、割り算の前に1.0を掛けておけ
241デフォルトの名無しさん:2006/06/18(日) 01:45:08
>>239
各 case 節を関数に分けるといいよ。
何度も使われてる数値入力も関数にするのがいいよ。
242デフォルトの名無しさん:2006/06/18(日) 02:58:25
Visual C++ 2005 Express Edition 使ってCの勉強最近始めたっばかりなんだが

#include <stdio.h>
int main()
{
int a = 10;
int b = 7;
double c = (double) (a+b)/2.0;
printf("%f",c);
return 0;
}

「10」と「7」の平均を求め、小数点以下まで正しく表示させる問題で
上のが答えで下のが自分でやったものでどっちとも同じ答えが出力されるのですが
これはこれでいいのでしょうか?

#include <stdio.h>
int main()
{
short a = 10;
short b = 7;
float c = (a+b)/2.0;
printf("%f",c);
return 0;
}
243デフォルトの名無しさん:2006/06/18(日) 03:07:12
>>242
その場合は問題は無い、ように見えるが、厳密に言うとキャスト演算子を用いる方が適切。
結果は問題なくても、処理の流れとしては (double) のある方が適切。
244デフォルトの名無しさん:2006/06/18(日) 03:12:23
趣味の問題だと思うがなあ。
245デフォルトの名無しさん:2006/06/18(日) 03:14:53
>>242
それじゃ、(double) をつけずに c = a/b をやってみ。
次に c = (double)(a/b) と c = (double)a/(double)b を比較してみ。
どういう結果になるか?
各々の変数に対して (double) をつけなきゃ意味がないのが分かるよ。
a+b と変数同士が足し算だったから分からなかっただろうけど
変数同士の割り算ならどう?
246デフォルトの名無しさん:2006/06/18(日) 03:15:24
>>244 そりゃ違うだろw 一個人の趣味で言語の仕様が勝手に決まったら怖いよぉ〜
247デフォルトの名無しさん:2006/06/18(日) 03:17:21
普通はintとdoubleを使う、と斜め上のレスをしてみる
248デフォルトの名無しさん:2006/06/18(日) 03:24:45
よーしパパ、long long intにlong long double使っちゃうぞ
249デフォルトの名無しさん:2006/06/18(日) 03:25:31
よーしぼくちん、キャスト演算子なんて面度だから
変数の定義はすべてdoubleにしちゃうぞぉ〜
250デフォルトの名無しさん:2006/06/18(日) 03:29:43
普段は特に気にせずdoubleを使ってるが、結構奥深いのね。

C言語:float型の精度
ttp://homepage1.nifty.com/aok2/004/c04.html
251デフォルトの名無しさん:2006/06/18(日) 03:36:39
うむ、たかが0〜1の間の細かい数値でも、数学で出てくる
近似値だの常用対数だの、円周率だの、そういった数値計算を扱わず
整数ばかりを扱う人にとっては気にせんでもやっていけるもんだねw
252デフォルトの名無しさん:2006/06/18(日) 03:42:54
小数を扱う人たちの中にも、桁オチなんかされちゃ困る人もいるんですが
253デフォルトの名無しさん:2006/06/18(日) 03:44:35
>>251
はいはい、えらいえらい。自慢はよそでやってね。ちらしの裏とか。
254デフォルトの名無しさん:2006/06/18(日) 03:45:21
誰も誰が必要とするか?については言ってないよ?
整数ばっかり扱っている奴にはほとんど気にしなくてもやっていけるくらい
その問題にぶち当たらないってことを指摘したまでだが?
どうもこういう板には自分の考えに沿わない奴を排除したがる奴がいて困るw
適切か不適切かはコンピュータがはじきだしてくれるから、安心しろw
255デフォルトの名無しさん:2006/06/18(日) 03:45:54
そこでfloatですよ!
256デフォルトの名無しさん:2006/06/18(日) 03:46:51
>>252=>>253
なんなのお前ら?自分が答えられなかった、知らなかったことを知っている奴を妬んでいるように聞こえるが?
違いに気づかないくらい、整数、あるいは除算に定数を使っている奴が多いってことだろ?
やれやれ・・・お前らじゃ変数の型にすら理解していないようだ、失せろ、専門学校程度のクズ共
257デフォルトの名無しさん:2006/06/18(日) 03:49:11
>>252
>桁オチなんかされちゃ困る
誰が桁オチを良しとした?意味を理解できない低学歴ってほんっと困るねw
258デフォルトの名無しさん:2006/06/18(日) 03:49:52
>>245は桁オチする例をモロに出したんだが・・・やっぱアホには分からんよねw
失せろ、正論も言えないバカ
259242:2006/06/18(日) 03:49:57
皆さんありがとうございます
ちょっと荒れる質問だったようで申し訳ないです
260デフォルトの名無しさん:2006/06/18(日) 03:51:58
>>259
気にせんでいいよ。キミが悪い訳ではないw
261デフォルトの名無しさん:2006/06/18(日) 03:52:28
>>244=>>252=>>253
何こいつ?自分が趣味程度にしか思わなかった程度の知識しか持ってなくて
説明を聞いて理解したとたん、小数を理解して扱う人が少ないって意見に対して
自分は小数命!みたいなレスしてんの?(プ
262デフォルトの名無しさん:2006/06/18(日) 03:53:20
>>259
そうそう、君が悪いんじゃない、桁オチを許さないって思っている頭の固い奴が
勝手に小数点以下を切り捨てても良いもんだと言った奴がいると勘違いしただけだからw
263デフォルトの名無しさん:2006/06/18(日) 04:53:01
途中のレスは鬱陶しくて読んでないが、>242に関しては2進化で桁落ちが発生することはないから全く同じだな。
勿論、右辺は2.0で割っている以上等価だし。
264デフォルトの名無しさん:2006/06/18(日) 05:06:21
除算で使われている値が定数だから見た目では分からないんだよね。
小数を扱わない型で宣言された変数を除算で扱った場合は、モロに分かる。
厳密に言えば、 a / (double)b で a に (double) をつけなくてもいけるが
とりあえず計算式を代入する変数の型に合わせておいてもおk。
265デフォルトの名無しさん:2006/06/18(日) 05:07:46
っつか、(double)a/bでもいけたおw
266デフォルトの名無しさん:2006/06/18(日) 05:30:49
C++どころかプログラム自体全然知らなくて、
少し依頼っぽくなるのですが、
窓立て2ってソフトがあるのですが、
ttp://www.ksky.ne.jp/~seahorse/mtate2/
どうしても立体化ボタンのダサさが気になり、替えたいのですが、
立体化ボタンがC++で直接書かれているのでどうにもなりません。
窓立てフォルダ内に置いた指定画像ファイルを
表示させるようなプログラムには出来ないんですか?
もし、そのような改造を施せるのであれば、教えてください。
267デフォルトの名無しさん:2006/06/18(日) 08:27:53
>>266LoadImageすればできるだろ
268デフォルトの名無しさん:2006/06/18(日) 08:57:45
>>266
作者に頼めば?
って、既に掲示板で同じこと言ってるのか。
ソースはあるけどBCCだしなぁ。
269デフォルトの名無しさん:2006/06/18(日) 09:38:25
UIがダサいので変えられないかとこれ以上なく直接的に書いててわらた
もうちょっとオブラートに包め
270デフォルトの名無しさん:2006/06/18(日) 12:01:59
自作自演ひどすぎですなぁ。
必死な奴の特徴丸分かりで笑える。
他のスレでもよく見る奴。
271デフォルトの名無しさん:2006/06/18(日) 12:03:37
宿題程度の問題で数値演算やって、鼻高々な馬鹿
272デフォルトの名無しさん:2006/06/18(日) 13:06:53
りそーすはっかー
273デフォルトの名無しさん:2006/06/18(日) 15:12:15
>>270
245=246=247=248=249=256=261=262とかw
274デフォルトの名無しさん:2006/06/18(日) 15:15:59
Cの質問です。データが(数字)(半角スペースいくつか)(文字)(改行)
例:
164 hoge
24 hogehoge
300 hog

というテキストから数字と文字を取り出したいんですが、
int num;
char str[1000][128];
int count = 1;
fp = fopen("test.txt" , "r");

while( (temp = fscanf(fp , "%d %s" , &num , &str[count-1])) != EOF){
printf("line:%d\n" , count);
count++;
if(temp == 2){
printf("%d %s\n" , num , str[count-1]);
}
else{
fgetc(fp);
}
}
として、変なのが入ったら切り捨てて、戻り値が2の場合のみとりあえず表示させてみようっていうソースを書いたつもりなんですが、出力で上手く出ないようです…。
どこがまずいのでしょうか・・・
275デフォルトの名無しさん:2006/06/18(日) 15:29:50
>>274
printf("%d %s\n", num, str[count - 2]);
276デフォルトの名無しさん:2006/06/18(日) 15:36:43
>>275
指摘通り書き換えたら正しく入ってたようです
ありがとうございました
277デフォルトの名無しさん:2006/06/18(日) 16:34:07
>>273=>>270 < こいつが自作自演で荒らしている低学歴
それ、全部イコールじゃないのは書き込んでいた奴なら分かるけど
それ以外のくだらねぇ煽りをしているのがお前だってバレバレだから
278デフォルトの名無しさん:2006/06/18(日) 16:35:52
ヒント:頭のおかしい人は相手にしないようにしましょう
279デフォルトの名無しさん:2006/06/18(日) 16:39:13
んで>>252が一番アホ。誰もプログラミングで小数を使わないとは言っておらず
キャスト演算子がなくても問題のない、あるいは気づかない人が
どっちも同じだと勘違いする例が上で挙げられていただけなのに気づかないだけ。
>>251には小数点以下の数値が重要となる一例
>近似値だの常用対数だの、円周率だの
が書かれているにも関わらず、それらの計算式を使う必要がある場合は
結果からして小数点以下が落とされると困るのは分かっているはずで
そういう計算式を扱うようになれば、プログラム言語の細かい部分にまで
目がいくようになるわけで。
まぁ、理解力のないバカは、相手の意向を無視して自分勝手な解釈で

  勘  違  い  をして恥をかくから痛々しいw
280デフォルトの名無しさん:2006/06/18(日) 16:40:42
ヒント:頭のおかしい人は相手にしないようにしましょう
281デフォルトの名無しさん:2006/06/18(日) 16:57:47
>>277
自演しまくってる本人が何言ってんだかwwww
282デフォルトの名無しさん:2006/06/18(日) 17:00:03
数値計算で注意すべきはオーバーフローする場合と桁落ちの時だ

数値計算の基礎で叩き込まれるけど、キャストしたからOKって事では無いぞ
引き算なんかは一気に演算精度落ちちゃうから
有効桁数云々言うなら式の変形も考えないと
283デフォルトの名無しさん:2006/06/18(日) 17:01:57
ヒント:頭のおかしい人は相手にしないようにしましょう
284デフォルトの名無しさん:2006/06/18(日) 17:03:23
>>281
頭のおかしい人は相手にしないようにしましょう
285デフォルトの名無しさん:2006/06/18(日) 17:05:36
ふつー、数値演算ライブラリなわけだが。
286デフォルトの名無しさん:2006/06/18(日) 17:29:27
>>282
そうだよ、だからってそんな精密な計算を必要とする計算式に
int型で宣言した変数を扱うこと自体どーとか言う前に
上で挙げられた例は気づかないものだって話じゃん。
キャスト演算子なんて使うのが面倒なら、よーしぼくちん
面倒だから全部変数をdoubleで宣言しちゃうぞー
で良いじゃんw
287デフォルトの名無しさん:2006/06/18(日) 17:30:51
>>281
言葉も理解できない低学歴(専門学校生)ごときが、何煽ってんだよ?w
せっかくの休日も煽りをするためだけに使うなんて、くせぇ人生送ってんなぁ〜お前w
あっ、もしかして、ニート?w
288デフォルトの名無しさん:2006/06/18(日) 17:35:43
ものすごく精度の高い数値の必要のない計算式を扱うだけの人は
そういう点に気づかないんだろ。問題や論点の趣旨が分かってない奴がファビョってるだけ。
誰も小数点以下の数値を扱う必要がないとは言ってないし。
扱う奴が勝手に困るとか言っただけw
こっちは扱う人間を困らせるつもりなんてないし、
扱う場合がない例について言ったところで何も困らんだろ。
289デフォルトの名無しさん:2006/06/18(日) 17:37:51
荒らしウザイのぅ
290デフォルトの名無しさん:2006/06/18(日) 17:39:23
((double)a+b)/2.0 みたいに動作に影響を与えるものなら趣味の問題じゃないが、
(double)(a+b)/2.0 みたいに動作に影響を与えないものなら趣味の問題だよなあ。
291デフォルトの名無しさん:2006/06/18(日) 17:48:03
まぁ精度云々は置いとけ、 >>242 の何が問題か?
キャスト演算子を使わなくても結果にはほんとうに影響がないが
こういう場合でも、キャスト演算子を使った例を出して質問してんだから
それについて答えてみろよ?>精度フェチ
292デフォルトの名無しさん:2006/06/18(日) 17:53:58
あぁん?どうした?結局、キャスト演算子のことについて答えられねーじゃん。
第一、キャスト演算子は何も精度を保つとかじゃなく
型の違う変数同士の計算式で使って帳尻あわせすんだろが?
何も変数の型がdoubleだけじゃないんだから、ちったぁ幅広い観点で物事を理解しろや、な?
293デフォルトの名無しさん:2006/06/18(日) 17:55:13
ヒント:頭のおかしい人は相手にしないようにしましょう
294263≠精度フェチ:2006/06/18(日) 17:56:27
>>291
また例によって途中は読み飛ばしているのだが、>242の右辺は全く等価でキャストする必要は全くないよ。
あくまでも、代入される対象の変数の型が違うだけ。
295デフォルトの名無しさん:2006/06/18(日) 17:57:06
>>282=>>286
なにが「そうだよ」だ。pgr
296デフォルトの名無しさん:2006/06/18(日) 18:03:00
>>294
>代入される対象の変数の型が違うだけ
まだわかってないのか、呆れた・・・

>>295
数学で出てくる微積分だの、常用対数だの、円周率だの
無限小数が続くような精度の重要性の問題でキャストの話をしたんじゃねーんだよ?
まだ上の議論の論点がわかってねーのか、呆れたな、ろくに勉強してこなかった
オチこぼれの「専門学校生」ってのは
297デフォルトの名無しさん:2006/06/18(日) 18:06:54
>>296
((a + b) / 2.0) と ((double)(a + b) / 2.0) が等価でないということでしょうか?
298デフォルトの名無しさん:2006/06/18(日) 18:07:05
>>242で注目しておく点とし
>float c = (a+b)/2.0;
ここ、除算に使っている値はなんだ?そもそも何型の変数でもないな?
分かったか?タコ助共。問題がないからってその前にあるint型の変数を
無視しても良いとか言い出したら笑っちゃうよ?
そもそも、除算するくらいなら浮動少数を使っとけって、うぜぇ。
まぁ、こういうと今度は小数点以下のある数値の積、和、差については良いんでちゅか〜?
って屁理屈ごねてくるんだろw
299デフォルトの名無しさん:2006/06/18(日) 18:09:40
AA貼りまくりで荒らす奴なら対処方もあるんだが、こいつの場合、一見何かを語って
いるように見えるので、始末におえない。
300デフォルトの名無しさん:2006/06/18(日) 18:10:01
>>298
> ここ、除算に使っている値はなんだ?そもそも何型の変数でもないな?
short 型の変数と、 double 型のリテラルだよ。
301300:2006/06/18(日) 18:11:40
ん?除算自体の2項のことかな?そうなると、確かに変数じゃないな。
言いたいことはよくわからんが。
302デフォルトの名無しさん:2006/06/18(日) 18:14:53
あーあ、相手しちゃってるよ・・・
303263≠精度フェチ:2006/06/18(日) 18:19:18
あーなんだ、2.0がdoubleじゃないと思い込みたい人だったのか。

>>297
そういうわけで、>296にとっては等価ではないと思い込みたいらしい。
304デフォルトの名無しさん:2006/06/18(日) 18:20:35
数値計算・・・
積み残しとかはなんか嫌だから
小さい値から加えてくようにしてる。
305デフォルトの名無しさん:2006/06/18(日) 18:27:32
「除算に使っている値」という表現で素人なのが丸バレなんですが。
306デフォルトの名無しさん:2006/06/18(日) 18:34:39
と玄人が一言
307デフォルトの名無しさん:2006/06/18(日) 18:59:04
class test {
int a;
public:
test(int i) : a(i) {};
};
上のようなコンストラクタを見たのですが、これは
test(int i) { a = i; }
と同じ意味ですか?
同じだとしたらどちらが一般的な書き方なのでしょうか。
308デフォルトの名無しさん:2006/06/18(日) 19:06:58
>>307
意味は違う。
前者は a を i で初期化している。
後者は a を初期化せず i を代入している。
309デフォルトの名無しさん:2006/06/18(日) 19:20:00
>>308
じゃあ、後者でaはいつ初期化されるんですか?
310デフォルトの名無しさん:2006/06/18(日) 19:22:11
>>309 初期化がされたうえで代入が行われる。
test(int i) : a(i) {}; なら初期化だけで済む。
311デフォルトの名無しさん:2006/06/18(日) 19:23:06
>>309
意味論的には307の前者の書き方でaが初期化されるのと同じ時に、
(初期化子が無いので)不定の値で初期化されると言えば良いかな。
312307:2006/06/18(日) 19:32:41
解答ありがとうございます。
エラーの原因が分かったみたいです。
前者の場合はコピーコンストラクタが動いていたのかな。
後者だと、intの引数無しコンストラクタと代入演算子が動く・・・。
313デフォルトの名無しさん:2006/06/18(日) 19:51:45
すいません。C言語で詰まっています。
文字列を返す関数を作っているのですが、

char *Method() {

char strA[] = "こんにちは";
return strA;;
}

これだとstrAはローカル変数へのポインタなのでもちろんダメなわけですが、
なんとかして文字列を返す方法はありませんか?
ちなみに引数は一切取りたくありません。
314デフォルトの名無しさん:2006/06/18(日) 19:55:33
static
315デフォルトの名無しさん:2006/06/18(日) 19:55:45
char *Method() {

return "こんにちは";
}
316デフォルトの名無しさん:2006/06/18(日) 19:55:46
>>313
char *Method() {

char* strA = "こんにちは";
return strA;;
}
317デフォルトの名無しさん:2006/06/18(日) 19:57:31
関数にする意味がわからない・・・
318デフォルトの名無しさん:2006/06/18(日) 20:00:41
そういう関数の宣言はconst char *Method()が良いな
319デフォルトの名無しさん:2006/06/18(日) 20:05:17
>>310-312
ちがう。後者では a は初期化されず、代入まで不定な値となる。
意味上はね。
320デフォルトの名無しさん:2006/06/18(日) 20:08:19
>>319
そもそも初期化ってなんだよ
321デフォルトの名無しさん:2006/06/18(日) 20:10:36
322デフォルトの名無しさん:2006/06/18(日) 21:04:30
>>314-316
ああなるほど。そうすると"こんにちは"は性的領域に確保されるんですね。
bufを取らないitoaを作ろうとしましたが、なぜいちいちbufを取るのか先ほど理解しました。
ありがとうございました。
323デフォルトの名無しさん:2006/06/18(日) 21:04:55
324デフォルトの名無しさん:2006/06/18(日) 21:06:29
性的領域
325デフォルトの名無しさん:2006/06/18(日) 21:07:55
>>299
何か語ってるかー?
馬鹿なだけだろ
326デフォルトの名無しさん:2006/06/18(日) 21:10:09
>303
が結論だな
327デフォルトの名無しさん:2006/06/18(日) 21:14:06
>>303
>2.0がdoubleじゃない
お前バカ?定数と型の指定のある変数の意味もわかってないのが露呈されただけ

専  門  学  校  は  こ  の  程  度  (  プ
328デフォルトの名無しさん:2006/06/18(日) 21:16:30
>お前バカ?定数と型の指定のある変数の意味もわかってないのが露呈されただけ
それはお前
329デフォルトの名無しさん:2006/06/18(日) 21:19:57
話の流れをぶった切るようで、申し訳ないですが・・・

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2099.txt

上手く、文字列の値が交換出来ないんですか、どこがダメなんでしょう…?
多分ポインタの辺りがまずいんだと思いますが…
330デフォルトの名無しさん:2006/06/18(日) 21:22:13
2.0をdoubleだと信じている椰子は専門学校生ケテーイらしいw
331デフォルトの名無しさん:2006/06/18(日) 21:25:20
>>328
なんで?まさか2.0って小数点以下を書いたら浮動少数になるの?バカだこいつ・・・
自分の知識が浅はかだってまだ気づいてないな。
キャスト演算子の括弧の中はな〜〜〜んだ?変数を宣言するときの型が入っていると思うがねぇ〜〜

>>330
決定っつーか低レベル決定。物事を理解する頭がないってこと。
定数と変数なんて、既に中学、高校の数学でやってんだし。
違いの意味に気づいてない奴は、惰性で数値計算をしているだけの
思考能力のないアホ
332デフォルトの名無しさん:2006/06/18(日) 21:30:59
>>331
> なんで?まさか2.0って小数点以下を書いたら浮動少数になるの?バカだこいつ・・・
なるよ。馬鹿だなお前。
333デフォルトの名無しさん:2006/06/18(日) 21:33:49
専門学校生乙。恥ずかしいからもう黙ってな。
筋の通った理論に基づいて話してなく、自分がバカだと思う奴がバカって
言っているだけだな。ご愁傷様。
2.0は 変数 ではなく 定数 なので、変数に使う型は関係ない。
問題は変数同士と、代入する変数の型だよ。
あの数式を見れば一目瞭然。さすがに初心者だからといって
理解力のないバカまで指導するスレじゃないんで、俺はこれで失礼するよ。
低俗な人間の問題煮まで相手にしてたら、こっちがバカになるw
334デフォルトの名無しさん:2006/06/18(日) 21:34:15
面白いなぁ。07って書いても10進数だって言い張ったりするんだろうか。
335デフォルトの名無しさん:2006/06/18(日) 21:34:58
いなくなるなら願ったりだが。
336デフォルトの名無しさん:2006/06/18(日) 21:39:10
>>333
初心者が見てるだろうから騙されないように注意しておきますが、
C/C++ のソース上で 2..0 は double 型のリテラルです。
確かに変数の型とは関係ないですが、型が決まっていないわけではありません。
337336:2006/06/18(日) 21:40:01
おっと 2..0 はまちがい。 2.0 のことね。
338デフォルトの名無しさん:2006/06/18(日) 21:46:49
>>336
上級者にバカにされたくなければ今すぐ考えを改めるよう注意しておきますが、
2.0がどこうではなく、「変数」と「定数」について述べていると思われますが?
それから、浮動小数についても理解しておられないようですね。
123.45を1.2345 x 10^2と表示することは理解していても
小数点が動くという意味までは理解しておられないようで?
>>334
いつまで屁理屈で自分勝手なお馬鹿な妄想してんの?
07については述べられていないし、2.0という値についてだよ?
っつか、0xとかつけるならまだしも、単に07って二桁にする意味ってなんだよ・・・
339デフォルトの名無しさん:2006/06/18(日) 22:04:31
あー8進数
340デフォルトの名無しさん:2006/06/18(日) 22:04:36
>>338
とりあえず以下のコードの実行結果の考察について説明してもらおうか。
#include <stdio.h>
int main()
{
printf("sizeof(long)=%d\n", sizeof(long));
printf("sizeof(float)=%d\n", sizeof(float));
printf("sizeof(double)=%d\n", sizeof(double));
printf("sizeof(2)=%d\n", sizeof(2));
printf("sizeof(2.0)=%d\n", sizeof(2.0));
return 0;
}
sizeof(long)=4
sizeof(float)=4
sizeof(double)=8
sizeof(2)=4
sizeof(2.0)=8
341デフォルトの名無しさん:2006/06/18(日) 22:05:45
初心者同士が暴れてますね
342デフォルトの名無しさん:2006/06/18(日) 22:06:21
>>341
いや、馬鹿が一人いるだけ
343デフォルトの名無しさん:2006/06/18(日) 22:07:44
>>338
まだ居るのかよ。早く消えるか、主張の内容がわかるように書いてくれ。
「変数」と「定数」について何を述べているのか伝わってないから。
344デフォルトの名無しさん:2006/06/18(日) 22:10:38
8進数ワラタ
345デフォルトの名無しさん:2006/06/18(日) 22:14:22
>>343
お前が変数と定数の意味を理解していないだけじゃね?どっちも恥ずかしいから
いい加減にしろ。特に屁理屈だけしか言わないアホ、C言語の前に数学やり直せw
346デフォルトの名無しさん:2006/06/18(日) 22:14:56
そもそもはこの2つの違いの話だよな。(この結果を代入する先のcのことはとりあえず考えない)
(A) (double)(a+b)/2.0;
(B) (a+b)/2.0;

aとbはint型。(242の後者でaとbはshort型だが、式内での格上げで結局int型として扱われる)
だから(a+b)もA, B共にint型になる。

Aでは、それをdouble型にキャストして、2.0で割っている。Bではキャストせずに2.0で割っている。
2.0は浮動小数点リテラルで、接尾辞は何も付いていないから、double型。

つまりAは「double型の値 / double型の値」、Bは「int型の値 / double型の値」となる。

Aは除算演算子の両辺の型が同じdouble型だから、double型で除算が行われる。
Bは両辺の型が違うが、規格書ではこの場合両辺をdouble型にする事になっている。(規格書を各自見てくれ)
この際にint型の値をdouble型の値に変換する方法は、
int型の値をdouble型の値へキャスト演算子で変換する場合と全く同じである。(〃)

だからAもBも(型、値含め)全く同じ結果になる。
347デフォルトの名無しさん:2006/06/18(日) 22:16:50
>>339
>>334
>07って書いても10進数だって
だから10進数だったら0を書く必要がないだろ・・・
その値が8進数かどうか言い出したら、最初の10進数で記述された数式ってなんだよ・・・
相手が知らないであろう事実を引き出そうって態度が痛すぎ。
論点を摩り替えて、お前は俺が知っている○×を知らない!ざま〜みろって
自分に有利なルールで勝負でもしてんの?w
348デフォルトの名無しさん:2006/06/18(日) 22:17:36
>>345
Cでは式の中で右辺値として用いられる限り、
共に何か型を持ち値を持つという点では同じなのだから、
この流れで定数と変数を区別する意味は無いだろ。
349デフォルトの名無しさん:2006/06/18(日) 22:18:52
>>346
>2.0は浮動小数点リテラルで、接尾辞は何も付いていないから、double型。
それについては、2.0が変数か定数かの方が論点になってるだろ・・・
お前、まさかいちいちdouble型で宣言したa,bをint型で宣言した変数cに代入する数式で
c= a+b / (int)2.0 ってやる?キャスト演算子についての話としても不適切だよ・・・
もうバカバッカw
350デフォルトの名無しさん:2006/06/18(日) 22:20:08
>>348
>定数と変数を区別する
残念、計算式の中で使われている変数の型が違うってところから話が始まっているんだが?
過去ログも読んでないで、論点ズラして何言ってんだ?
もう痛すぎ、質問でも質問者への答えでもないなら消えろ
351デフォルトの名無しさん:2006/06/18(日) 22:23:11
ちょ、暴れてる奴はコテで書いてくれ
あぼーんしづらい
352デフォルトの名無しさん:2006/06/18(日) 22:33:07
>>329
察しの通り、文字列の操作部分が怪しい。

(1) int str[MAXDATA][64]; → char str[MAXDATA][64]; じゃないか?
(2) 配列の初期化されていない部分を参照しているので適当な値で初期化するか、
  終端フラグをもうけるか、ソート範囲を有効なデータの範囲だけにすること。
(3) (1) と仮定して str は「大きさ64の文字列の配列」なので Insertion_sort の引数を
  void Insertion_sort(int num[] , char str[][64] , int data) とする。
(4) この場合、ソートする際は文字列の実体を strcpy 等でコピーする。
353デフォルトの名無しさん:2006/06/18(日) 22:33:36
>>347
素直に「私が無知でしたごめんなさい」って言えばいいのに
8進数程度のことでがたがた言うなよ
354デフォルトの名無しさん:2006/06/18(日) 22:34:29
>>349
安心しろ。 2.0 が変数だなんて言ってるやつは居ないから、それは論点にならない。
355デフォルトの名無しさん:2006/06/18(日) 22:51:57
おい、暴れてる馬鹿、>>340を無視すんなよw
356デフォルトの名無しさん:2006/06/18(日) 22:52:11
なあもうちょっと煽り抜きで主張することを覚えてくれ
双方とも
357デフォルトの名無しさん:2006/06/18(日) 23:00:39
>>352
正直、double型とかの論争?に埋もれたかと思ってたら返信が…

(1)のとおりcharでした;
(2)の意味がすこし不明なんですが、まず、データのtxtファイルは>>274の上の部分のが999個くらい入ってます。
で、num[]にそれぞれの数を str[]に英字を格納してますが…
(3)と(4)とおりに直してみました…。コンパイルできず

mainの渡し方がまずいのか、根本的にわかってないのか、両方か…。
358デフォルトの名無しさん:2006/06/18(日) 23:07:45
>>357
コンパイルできないなら、エラーメッセージ読んで直せよ。
359デフォルトの名無しさん:2006/06/18(日) 23:10:45
お前ら、8進数も知らなかった中学生に
いつまでも構うなよ・・・。
360デフォルトの名無しさん:2006/06/18(日) 23:10:45
コンパイラによるw
361デフォルトの名無しさん:2006/06/18(日) 23:26:09
ほんっとにバカって釣られやすいんだな、2chも初心者、一生ROMってろw
362デフォルトの名無しさん:2006/06/18(日) 23:32:50
ついに主張することが無くなって、煽りだけになってしまいました。
363デフォルトの名無しさん:2006/06/18(日) 23:32:57
>>357
(2) の意味は、例えば読み込んだデータの数が900個だった時
mainで Insertion_sort() を呼ぶ際、data=MAXDATA(999)になってるから
num[900]/str[900]以降のデータもあわせてソートしてるけど
じゃあ、そこに入っている値は何? ということ。

(3), (4) の通りにするとこんな感じになる。
void Insertion_sort(int num[] , char str[][64] , int data){
int i, j;
int numtemp;
char strtemp[64];
for(i = 1; i < data ; i++){
numtemp = num[i];
strcpy(strtemp, str[i]);
for(j = i; j > 0 && num[j-1] > numtemp ; j--){
num[j] = num[j-1];
strcpy(str[j], str[j-1]);
}
num[j] = numtemp;
strcpy(str[j], strtemp);
}
}

文字列のソートをポインタ操作だけで済ませたいときは >>329 のソースに
例えば char str[MAXDATA][64]; の後ろ辺りに文字列へのポインタの配列
char *ptr[MAXDATA]; を追加してデータを読み込む際にptr[]を初期化
(ptr[count] = str[count]とか)し、以降はstr[]の代わりにptr[]を操作すれば良い。
364デフォルトの名無しさん:2006/06/18(日) 23:34:34
釣り宣言きたか。さすが 2ch の伝統どおりだな。
365デフォルトの名無しさん:2006/06/18(日) 23:48:09
まぁまぁこのスレは初心者歓迎なんだから
8進数なんてchmodの時ぐらいしか使わないんだから
366デフォルトの名無しさん:2006/06/18(日) 23:51:41
>>338
プログラミングの式を数学の式と同じだと思わない方がいいと俺は思う。
理由は>>348で書いたとおり。
367デフォルトの名無しさん:2006/06/19(月) 00:00:29
>>366
>プログラミングの式を数学の式と同じだと
誰が同じって言った?また妄想か・・・ループじゃなくて
無限に屁理屈が増大しているので、ここらでビックバーンでも起こして
お前ら全員吹っ飛んでくれw
368デフォルトの名無しさん:2006/06/19(月) 00:05:33
>>363
おかげさまで動きました。と同時に(2)の話も理解しました。
そこらへんもなんとかしてみます。
お世話になりました。
369デフォルトの名無しさん:2006/06/19(月) 00:07:55
>>367
なんか喋る前に>>340についてなんか解説してくれよ。
シンプルなコードにシンプルな結果だろう?
370デフォルトの名無しさん:2006/06/19(月) 00:08:17
>>367 主張することが無いなら黙っててください。
371デフォルトの名無しさん:2006/06/19(月) 00:08:31
ねぇねぇ、予約語に触れるもんでもなく問題もないんだけど
自分で定義する関数とか変数に大文字使う人っているじゃん?
それってちょ〜〜〜〜キモイんですけどぉ〜、やめてもらえませんか〜?
大文字使う場合、変数とか関数とかじゃなくってぇ〜〜〜〜
#define MAX 10 とか変数じゃないものに使って欲しいんですけどぉ〜〜?
↓それについてあんたどう思う?
372デフォルトの名無しさん:2006/06/19(月) 00:09:08
>>369
勝手な妄想する前に>>340についてなんか解説してくれよ。
シンプルなコードにシンプルな結果だろう?

>>370
質問に対してレスすることが無いなら黙っててください。
373デフォルトの名無しさん:2006/06/19(月) 00:11:16
>>340はコンパイルエラー、何を説明しろと?w
374デフォルトの名無しさん:2006/06/19(月) 00:12:28
>>367
> 誰が同じって言った?また妄想か・・・ループじゃなくて
↓こりゃなんだ?
>>331
> 定数と変数なんて、既に中学、高校の数学でやってんだし。

別人?
375デフォルトの名無しさん:2006/06/19(月) 00:14:58
>>340
>sizeof(2.0)=8
ああ、これね。これが何か?変数じゃない値で
メモリはdoubleと同じ分だけ使っているが、それは精度を落とさぬよう
コンピュータ側がやっていることだが、それで勝手に2.0がdouble型の変数と
同じ扱いにはならない。変数と定数についてまだわかってないんだな・・・
少なくとも、変数の型が違う場合に使うキャスト演算子の話じゃないんで

  何  が  言  い  た  い  ん  だ  ?
376デフォルトの名無しさん:2006/06/19(月) 00:15:14
>>373
コンパイルはしなくていいからさ、実行結果についてなんか喋ってくれよ。
377デフォルトの名無しさん:2006/06/19(月) 00:16:19
>>375
誰も2.0が変数だなんて主張してないぞ。
378デフォルトの名無しさん:2006/06/19(月) 00:17:29
>>375
> それで勝手に2.0がdouble型の変数と同じ扱いにはならない。

式で参照される限りは同じだよ。いいかげんにどこが違うのか言ってみてよ。
379デフォルトの名無しさん:2006/06/19(月) 00:18:28
>>374
http://dictionary.goo.ne.jp/search.php?MT=%C4%EA%BF%F4&kind=jn
http://dictionary.goo.ne.jp/search.php?id=1772890-0000&kind=jn&mode=5
>変数の変化に関係なく一定な値を表す数
値が何なのか、分かっているならそれに応じて代入する変数の型を決めれば良いだけじゃね?
変数がなんで変数なのか、いい加減理解しとけよ、バカ共。
既に数値が分かっているものと、数値が定まっていない数値を扱うのとじゃ
すべき対処が変わってくる。
380デフォルトの名無しさん:2006/06/19(月) 00:21:26
「俺は正しいはずなのに、何故か誰も味方についてくれない」
という状況に陥ったら、まず前半の前提部分を疑ったほうがいいなw
381デフォルトの名無しさん:2006/06/19(月) 00:22:52
>>377
そうだね、だから変数の型によって出てくる「キャスト演算子」の話じゃねーっつってんだろ?

>>378
>いいかげんにどこが違うのか
それじゃ、お前はdouble型で宣言されたaを2.0で割った値を
int型の変数に代入する際には、ちゃんと 2.0 に (int)2.0 と書いて下さいね(ニヤニヤ
俺は2だってわかっている「定数」だったらわざわざ2.0なんて書かずに2って書くけどねw
質問の出所が分かってないから余計に悪いんだよな。
>>242 を読み直してから議論しろよ、こっちはもうくだらない屁理屈には付き合わない。
382デフォルトの名無しさん:2006/06/19(月) 00:23:44
最後に、sizeofが何なのか、それもよーーーく調べておけよ、知ったか初心者
383デフォルトの名無しさん:2006/06/19(月) 00:25:28
ID出ないって面倒ね
384デフォルトの名無しさん:2006/06/19(月) 00:26:08
話を横道にそらす前に、以下の矛盾について自己弁護してもらおうか。

>>331
>なんで?まさか2.0って小数点以下を書いたら浮動少数になるの?バカだこいつ・・・

>>376
>ああ、これね。これが何か?変数じゃない値で
>メモリはdoubleと同じ分だけ使っているが、それは精度を落とさぬよう
>コンピュータ側がやっていること
385デフォルトの名無しさん:2006/06/19(月) 00:27:53
>>375,379,381
今一度まとめて確認させてくれないか?

A. 2.0 は double 型の定数である。
B. a, b が整数型のとき ((a+b)/2.0) と ((double)(a+b)/2.0) は等価である。

どちらも真なわけだが、何か反論はあるか?
386デフォルトの名無しさん:2006/06/19(月) 00:29:00
それからこれも答えてもらおうか。

>>381
>int型の変数に代入する際には、ちゃんと 2.0 に (int)2.0 と書いて下さいね(ニヤニヤ
>俺は2だってわかっている「定数」だったらわざわざ2.0なんて書かずに2って書くけどねw

2と2.0と書いた場合では、コンピュータの扱いが違うのだが。
>>340
>sizeof(2)=4
>sizeof(2.0)=8

わざわざ2と書かずに2.0と書くのには意味があるのか無いのか説明してもらおう。
387366:2006/06/19(月) 00:30:59
>>367
331で「定数と変数なんて、既に中学、高校の数学でやってんだし。」
と書いていることから、数学がわかればプログラミングも(当然)わかると主張しているように見受けられた。

366でアンカーを張った先が338というのはおかしかったな、それはすまん。
388デフォルトの名無しさん:2006/06/19(月) 00:32:53
おいバカ、 sage るんじゃない。特定が面倒になったじゃないか。
389デフォルトの名無しさん:2006/06/19(月) 00:33:22
さらには、次の概念について、君の思うところを語っていただこう。

・暗黙の型変換
・型拡張
390デフォルトの名無しさん:2006/06/19(月) 00:37:34
ぼくちんはまだ
「2.0はdouble型のリテラルでしたごめんなさい」
が言えてないのか
391デフォルトの名無しさん:2006/06/19(月) 00:40:46
>>381
たしかにC/C++において、
(配列の要素数など)整数定数式が要求される場所以外では、2と(int)2.0は等価。

でも2.0はあくまでdouble型。
しかし(int)2.0とした場合、コンパイラは定数式だからコンパイル時にint型に変換してしまう。
392263≠精度フェチ:2006/06/19(月) 00:53:22
おや、未だやってたのか。
確か、失礼するのどうのと言ってたのじゃなかったのかな。
あーそうか、「去る」と言う意味ではなく文字通り、「失礼な行為を行なう」と言う意味だったのか。
#って、アンカーなくても被害妄想全開でレス来るんだろうなぁ。
393デフォルトの名無しさん:2006/06/19(月) 11:20:31
class out {
friend ostream &operator<<(ostream &o, out ob);
public:
int a;
int func() { return 99; }
};

ostream &operator<<(ostream &o, out ob)
{
o << "unko\n";
return o;
}

int main()
{
out ob;

cout << ob;
cout << ob.func();
}
これを実行したらプログラムが強制終了します。
ob.a = 10;を追加すると動きました。
変数に値を格納していないオブジェクトはメモリ上に存在しないということですか?
394デフォルトの名無しさん:2006/06/19(月) 11:59:21
しないぞ?
395デフォルトの名無しさん:2006/06/19(月) 11:59:51
強制終了が抜けた・・・
396393:2006/06/19(月) 12:16:21
>>394
もう一度実行してみましたがやっぱり途中で落ちます。
環境のせいだったみたいですね。
VisualC++.net2003を使っています。
397デフォルトの名無しさん:2006/06/19(月) 12:47:00
BCC,MinGW,VC++6,VC++2003,VC++2005全部落ちなかった。
398デフォルトの名無しさん:2006/06/19(月) 14:27:17
>>386  >>389
このスレは個人を特定して考えを聞くスレじゃありません。
何偉そうに 〜〜(して)いただこう?なんて催促してんの?

さて、sizeofの2.0と2について、結果が8と4バイトということだったが
それはメモリの領域のサイズのことであって、しつこいようだけど
2.0そのものは定数だし「変数じゃない」ってことは理解しているんだろうか?

そして、2.0というように、小数点以下のある値を精度を落とさずに代入するには、
浮動小数があ使えるdouble型で宣言されたものにするのが適切
というのが言語の仕様や検証結果から分かることではないだろうか?

まぁ、こっちは変数の型のキャスト演算子と計算式の中の定数について
しっかり述べているのに、 >>386  >>389 みたいな疑問を抱く奴に
いちいち答えを強要される必要はないし、答えなきゃこいつは無知だの
勝手に言われてもかまわない。俺が知らないわけじゃないし。
問題は俺が最初に何の質問に対して答えたか?
そっちを理解できない奴が勝手に自分が疑問に思ったことを
いちいちつきつけられるスレじゃないし。そんな質問は
自分で言語の仕様を知って理解すべきだろ。
どこの学校言ってんだよ、こいつら?分からなきゃ誰かに教えてもらわなきゃ
やっていけない、学習能力のない痛いお子ちゃまですか?
399デフォルトの名無しさん:2006/06/19(月) 14:31:24
>>398
君の脳内仕様はどうでもいいです><
400デフォルトの名無しさん:2006/06/19(月) 14:55:42
>>398
なんか喋る前に、>>385に答えろ、馬鹿が
お前の脳内言語仕様はちらしの裏にでもメモしとけ
401デフォルトの名無しさん:2006/06/19(月) 15:05:04
>>398
変数か定数かなんてことは誰も話題にしてないことに気づけよ。

>>349
>それについては、2.0が変数か定数かの方が論点になってるだろ・・・

その論点の発端となった、お前以外の発言番号を示せるものなら示してみろ。
402デフォルトの名無しさん:2006/06/19(月) 15:20:12
>>353とか悪質だな。8進数の数値計算の話じゃないのに
上の方で勝手に
>07って書いても10進数だって
とか言ったアホがいるから悪いんだろ。煽って荒らしているのはどっちだ?
そろそろ通報した方が良いな。ついでにどこの専門学校から書き込まれているか
調べてもらいたいね。
403デフォルトの名無しさん:2006/06/19(月) 15:20:44
>>400
>答えろ
命令しても無駄。ここで出た質問に「確実に答えてもらえる」すれじゃありません。
そろそろうざいね、低レベルな低学歴って。
404デフォルトの名無しさん:2006/06/19(月) 15:20:45
>>398
良くも悪くも周りがみんな自分と同レベルだと思わない方がいいよ。判っているとは思うけど。
405デフォルトの名無しさん:2006/06/19(月) 15:23:10
>>401
>変数か定数かなんてことは誰も話題にしてないことに気づけよ
定数の型についてが最初の話題じゃないって気づけよ?
勝手に論点すり変えて、自分勝手な議論を持ち出すなよ?
こっちが理解していないみたいなことを言うが、自分で言語の仕様を理解して
適切に記述できないことを

露 呈 し な く て 良 い か ら さ ぁ   専 門 学 校 生 w 

ついでに、2.0は定数だよ?人間の目でも小数点以下があることが分かるじゃん?
コンピュータもちゃんと8バイトで計算に使う数値を格納するメモリをとってるだろ?
それはsizeofで分かったろ?いい加減うざい。
本当に通報するね。悪質だよ、ここ。
406デフォルトの名無しさん:2006/06/19(月) 15:24:36
>>404
>りがみんな自分と同レベルだと思わない
思ってないよ。初心者歓迎でしょ?少なくともこのスレで
屁理屈や理解していない議論を持ち出しているバカは低レベル。
そんな奴らにまともなソースはかけないのは分かっているし
いつまでもつまらん質問に答えようとも思わない。
が、バカはバカだときづかぜるきっかけを与えなきゃ、いつまでも社会のお荷物で困るんだよ
犯罪者になるなよ、低学歴
407デフォルトの名無しさん:2006/06/19(月) 15:25:01
そろそろ出しとくか。

ヒント:頭のおかしい人は相手にしないようにしましょう
ヒント:強度の学歴コンプレックスを持った人も相手にしないようにしましょう
408デフォルトの名無しさん:2006/06/19(月) 15:26:41
それじゃ最後に、以下の定数で表される計算式を代入するさいに
精度が保たれる型の変数は何か?
a = 1*0.5
b = 2+2
c = 2.5 + 1
さぁ、計算結果に応じて代入するabcの適切な型を宣言してください。
また、メモリの無駄な確保はしないように答えなさい(すべてdoubleは不適切とする)

これくらいの問題に答えられなきゃ、お前ら小学生からやり直せ
409デフォルトの名無しさん:2006/06/19(月) 15:26:59
>>405
頼むから通報してくれよ。マジで。
410デフォルトの名無しさん:2006/06/19(月) 15:32:25
規格書はここから見れる。見たことが無い人は読んでおくといいよ。
http://www.jisc.go.jp/
「JIS検索」から規格番号 X3010でいわゆるC99、X3014でC++が見れる。
今言い合っている点に関してはC89からC99まで特に変化は無いはず。
411デフォルトの名無しさん:2006/06/19(月) 15:35:19
>>385の何を間違えだと言った?論点がズレてるね。
どう考えても2つめは計算の結果の 値 が等しいんであって
値として出された数値の型(精度)については考慮していない無意味な質問だよ。

>定数である
そうだよ?見て分かるじゃん。変数ってのは定まっていない値を入れるから
わざわざ何か値が入りますよって宣言してメモリを確保してんだから。
定数だけどdouble型とかは関係ない。double型って
浮動小数でしょ?2.0は固定小数だよ?頭大丈夫か・・・
既に浮動小数の表現についても過去ログにレスがあるけど?
123.45だったら1.2345 x 10^2って表したら浮動小数(double型)って思えと言うのか?ってのは
ご自由に解釈してください。少なくとも2.0は固定小数であってdouble型とは関係ない。

>等価である。
値が同じだからといって、変数の型まで不適切にして良いわけじゃない。
キャスト演算子についてもバグが報告されている。
最初っから数式が小数点以下も扱うもんだと分かったら
その計算式をの値を代入する変数の型はdoubleにしときゃ良いって話で終わるよ?

自分の目でそういう部分を判断できなきゃ、自分が適切なプログラムを作れなくて困るだけ
一生2.0が何型か?について議論してなさい。
とりあえず答えたけど?自分(質問者)はバカですが何か?って質問に対して
あ〜そうですね?って俺に答えさせただけだな。恥ずかしいね
本当に頭の弱い人って。お願いだから浅はかな考えで社会に出て
犯罪を犯さないでくれ。いつまでもあんたらみたいな「低俗な人間」に
入れ知恵をするつもりはないし、お前らもその程度じゃ賢くはなれんよ。
何でもかんでも答えてもらえる、自分の思った通りに答えない人は嫌いになる
みたいな感情まで持ち込んでどうすんだよ?プログラムは感情なんて当てにしてくれないぞw
412デフォルトの名無しさん:2006/06/19(月) 15:35:35
>>406
わかっているならバカや低レベルや初心者にもわかりやすく書いてください。
バカは死んでも直らないと言う信念をお持ちであれば、
せめて低レベルや初心者だけでも相手してやってください。
413デフォルトの名無しさん:2006/06/19(月) 15:47:31
>>411
> >>385の何を間違えだと言った?論点がズレてるね。
> どう考えても2つめは計算の結果の 値 が等しいんであって

ヒント:暗黙の型変換(キャスト)
414デフォルトの名無しさん:2006/06/19(月) 15:51:37
C/C++的には「2.0」は浮動小数点数リテラルであって、それ以上でもそれ以下でもないと思うが。
つーか定数ってなに?
415デフォルトの名無しさん:2006/06/19(月) 15:54:29
>>376
>ああ、これね。これが何か?変数じゃない値で
>メモリはdoubleと同じ分だけ使っているが、それは精度を落とさぬよう
>コンピュータ側がやっていること

だったら、>>242の下のコードは全く問題ないね!
416デフォルトの名無しさん:2006/06/19(月) 15:54:53
>>411
C/C++には“言語仕様上”、固定小数と言う概念は無い。

C/C++で数値を扱う型は数値型と分類されている。
数値型は整数型と浮動小数点数型に分かれる。
当然intは整数型、doubleは浮動小数点数型に分類される。

標準規格ではリテラル(お前の言う定数)がどんな型になるかも規定されている。(>>410から見てみろ)
それによればC/C++において2.0はdouble型になる。

俺が語っているのでは無い。規格書がそう語っているのだ。
417デフォルトの名無しさん:2006/06/19(月) 15:54:59
>>414
> C/C++的には「2.0」は浮動小数点数リテラルであって、それ以上でもそれ以下でもないと思うが。

その通り。

> つーか定数ってなに?

リテラル(Literal)の和訳。
418デフォルトの名無しさん:2006/06/19(月) 15:55:22
うお、コピペしたら、アンカー違うとこ指してるじゃん。
めんどくさいので訂正はしない。
419デフォルトの名無しさん:2006/06/19(月) 16:01:10
>>405
変数の型についてが最初の話題じゃないって気づけよ?
勝手に論点すり変えて、自分勝手な議論を持ち出すなよ?
こっちが理解していないみたいなことを言うが、自分で言語の仕様を理解して
適切に記述できないことを

露 呈 し な く て 良 い か ら さ ぁ   専 門 学 校 生 w 
420デフォルトの名無しさん:2006/06/19(月) 16:03:32
>>417
定数と書くと、#defineやconst (C++)などによって名前を付けたものというイメージを持つ人が多いんだ。
421デフォルトの名無しさん:2006/06/19(月) 16:07:23
>>411
C/C++において385の2つの式は、結果の型も同じ。
そういう規則だから。
422デフォルトの名無しさん:2006/06/19(月) 16:09:08
>>413
>ヒント:暗黙の型変換(キャスト)
それがバグの原因だよ。もっと必要な文献に目を向けたらどうだ?
だから適切にキャスト演算子を使うか、最初っから計算結果を代入する型にあわせて
計算式の中に使う変数の型もあわせておいた方が良いってのが報告されてんだよ
423デフォルトの名無しさん:2006/06/19(月) 16:11:07
>>421
だから?代入する型の変数をどうしたら良いか?って話になるなるだけじゃん。
まだわかってないな・・・精度の問題なのか、値が扱うメモリの領域の大きさがどうなのか?
議論をはっきりしろよ、おめぇ騒ぐだけで相手を無理に否定しようとしているだけじゃん。
相手がどうだろうと、言語を作った人が決めたルールや仕様書があんだろが?
424デフォルトの名無しさん:2006/06/19(月) 16:11:06
ふつー、「const定数」とか「デファインした値」とか言わないか?俺の周りではそうだが。
それとコード中に出てくる数値リテラルなどのことは「直値」と言うな。
「リテラル」は対人コミュニケーションでは使わない。相手が理解できない場合があるからな。
自分が書く文章では使うが。
425デフォルトの名無しさん:2006/06/19(月) 16:12:43
もう何がなんだか。そこで、

ヒント:頭のおかしい人の相手はしないようにしましょう
426デフォルトの名無しさん:2006/06/19(月) 16:13:33
>>422
今はバグの話をしているのではないと俺は思っている。

暗黙の型変換によって385のBの2つの式は
同じ意味(結果の型・値、途中の計算過程など全てが等価)になると主張するだけだ。
427デフォルトの名無しさん:2006/06/19(月) 16:15:24
>>423
俺が気付いていないうちに242のcがdoubleかfloatかの違いの話になっていた?
今まで俺はずっと代入式の右辺の部分(385のB)についてだけ話していると思っていたよ。
428デフォルトの名無しさん:2006/06/19(月) 16:16:22
>>422
式1 : (double) (a+b)/2.0;
演算手順
1. a+b を演算
→a、b共にint型のためint型として演算
2. (a+b) の演算結果をdouble型にキャスト
3. [2の結果] / 2.0 を演算
→[2の結果]、2.0 共にdouble型のためdouble型として演算

式2 : (a+b)/2.0;
演算手順
1. a+b を演算
→a、b共にint型のためint型として演算
2. (a+b) の演算結果をdouble型にキャスト
→暗黙の型変換
3. [2の結果] / 2.0 を演算
→[2の結果]、2.0 共にdouble型のためdouble型として演算


君は「結果の値のみ」が等しいと言った。
しかし、C/C++の規格に沿って見ると、
手順も一緒であるが、どこがどう違うというのかね?
429デフォルトの名無しさん:2006/06/19(月) 16:19:39
>>428
それだと式2の暗黙の型変換が行われるタイミングが勘違いされそう。
double型の値で割られるからdouble型へ暗黙の型変換がなされるという風に読み取れない。
430デフォルトの名無しさん:2006/06/19(月) 16:23:41
castとtype conversionって同じ概念だっけか?
431デフォルトの名無しさん:2006/06/19(月) 16:34:07
ヒント:C++には3つのキャスト演算子がある。
432デフォルトの名無しさん:2006/06/19(月) 16:44:20
ttp://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/backpr/C++/back.txt

このC++プログラムをVC++で動作させたいのですが、
ほうりこんで色々いじった結果(上の方を//で消したり・・・)
実行すると、

「入力データファイル名を指定してください。」

とだけ出るようになりました。
これはどうすればいいのでしょうか・・・。
433デフォルトの名無しさん:2006/06/19(月) 17:38:49
必死なのが複数湧くとこんなに伸びるのな。
434デフォルトの名無しさん:2006/06/19(月) 17:41:50
>>432
あのねぇ、まずはどんなソースをつくりたかったのか説明するべきだろ。
435デフォルトの名無しさん:2006/06/19(月) 17:45:08
>>432
適当にコピペしながらプロジェクトを作ったら、ちゃんとビルドできた。
引数としてファイル名が二つ必要みたいだったので、適当にファイルを作って動かしたら、
>***error ユニット番号が不適当(1 0 -858993460 -858993460)
と表示された。

で、何が聞きたいの?
436デフォルトの名無しさん:2006/06/19(月) 17:47:49
誰か>>371の質問に答えてよ?
437デフォルトの名無しさん:2006/06/19(月) 17:50:57
>>436
人それぞれ。
438デフォルトの名無しさん:2006/06/19(月) 17:53:07
シカト
439432:2006/06/19(月) 17:54:55
すみません、色々説明不足でした。
申し訳ないです。

ttp://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/18-sho.htm#e-18-4
このページのにあるニューラルネットワークの
「バックプロパゲーションアルゴリズム」というプログラムなのですが、
これをVC++6.0で正常に動作させたいです。
(学習させた出力を出したいです。)
440435:2006/06/19(月) 18:00:08
>>439
アルゴリズムが正しいかどうかの判断は出来ないが、動かして出力を見ることだけはできるから、
引数に与えるファイル1、ファイル2をコードと同じ場所にアップしてくれ。
441デフォルトの名無しさん:2006/06/19(月) 18:07:13
この流れになってから初めてこのスレ覗いたんですが、
引っ込みがつかなくなった約一名の狂態はこれ以上ないくらいくっきり浮き彫りなんで、
もう相手しなくていいと思いますよ。

こんだけログが揃えば、約一名様がいくらそれっぽく勝利宣言しても誰も騙せないでしょうし。
442435:2006/06/19(月) 18:16:38
>>439の中身を読んで、ファイルを作って実行してみたところ、以下のような出力になった。
で、質問は?

[C:\temp\backpr\Debug] backpr data1.dat data2.dat
学習回数は? 5000
何回毎に収束を確認しますか? 500
学習パターンのファイル名は? learn.dat
回数 500 誤って認識したパターン数 4
回数 1000 誤って認識したパターン数 4
回数 1500 誤って認識したパターン数 4
回数 2000 誤って認識したパターン数 4
回数 2500 誤って認識したパターン数 3
回数 3000 誤って認識したパターン数 0
入力パターン 1 0.00 0.00

出力パターン(理想) 0.000
(実際) 0.087

入力パターン 2 0.00 1.00

出力パターン(理想) 1.000
(実際) 0.907
443435:2006/06/19(月) 18:19:04
ああ、リターンを押し続けるのね。結果はこうなった。動いてるんじゃないの?
内容はわからんが。

(略)

重み
to 1 from 2 10.767 3 -4.905 4 4.892
to 2 from 3 6.506 4 -6.819

バイアス 1 -2.615 2 -3.678

未学習パターンの認識を行いますか?(=1:行う,=0:行わない) 0
[C:\temp\backpr\Debug]
444デフォルトの名無しさん:2006/06/19(月) 18:47:11
>>432
メニューからプロジェクトの設定を選んで、デバッグタブに引数を書いてから実行する。
ファイルが見つからない場合は、ファイル名をフルパスで書くか、作業用のディレクトリに
ファイルがあるディレクトリ名を書く。
445デフォルトの名無しさん:2006/06/19(月) 19:12:13
>>417
リテラルと定数は意味が違うだろう・・・。
446デフォルトの名無しさん:2006/06/19(月) 20:21:40
447デフォルトの名無しさん:2006/06/19(月) 22:00:45
まあ俺が正解を言うと
Stroustrup: C++ Glossary
constant - literal, object or value declared const, or enumerator.
literal - notation for values of bool, character types, integer types,
      or floating-point types. See also: enumerators.
      TC++PL 4.2, 4.3.1, 4.4.1, 4.5.1, 5.2.2, D&E 11.2.1.

つまりリテラル⊆定数
448デフォルトの名無しさん:2006/06/19(月) 22:09:21
C/C++に限らなければ、定数でないリテラルも結構あるきがする。
449デフォルトの名無しさん:2006/06/19(月) 22:13:51
>>448
このスレは

【初心者歓迎】C/C++室 Ver.28【環境依存OK】
450デフォルトの名無しさん:2006/06/19(月) 22:33:45
C/C++質問室じゃなくて
C/C++室ってところがうまいよなぁw
451デフォルトの名無しさん:2006/06/20(火) 00:29:29
初心者は歓迎しても、理解力のない変な自称中級〜上級者はお断りだよ
452デフォルトの名無しさん:2006/06/20(火) 00:35:49
質問です。
今度会社のコーディング規約で「//のコメント禁止」が入るらしい。
なぜかと聞くと「コメントの最後が日本語で「\」を含む場合継続行と見なされるから」
つまり下の例でb=2;が前の継続行と見なされてコメント扱いされてしまうからというのですが
本当でしょうか。
会社は組み込み系なのでCは今でも現役だし、コンパイラはCPUのメーカによって異なります。
VC++では大丈夫とかC99では採用済みとか以外の回答をお願いします。
例 
int a,b;
a=1;//○○可能
b=2;
453デフォルトの名無しさん:2006/06/20(火) 00:37:22
>>452
全くの嘘ですが、波風立てたくないなら、おとなしく従いましょう
454デフォルトの名無しさん:2006/06/20(火) 00:38:42
コンパイラが多バイトをキッチリ解釈できるなら問題なし
組み込み系ならASCIIのみというコンパイラもあるだろう
そういう場合はヤバス
455仕様書無しさん:2006/06/20(火) 00:44:14
>>452
コンパイラが日本語(2バイトコード)を含むソースに対応していなくて、
ソースがシフトJISで書かれている場合に限定される話だろ。

今時、そんなラベルの低いコンパイラは捨ててしまえ。サポートもロクに
期待できないだろう。あるいは、そんなコーディングルールを決めるような
会社はさっさと辞めたほうがいいかも。バカは伝染るぞ。
456デフォルトの名無しさん:2006/06/20(火) 00:44:52
>>452
大学のLinux端末が少し前に更新されたがそれまではその問題があった。
結構有名な話なんで覚えておいても損はない。
457デフォルトの名無しさん:2006/06/20(火) 00:45:43
>>452
全くの嘘ではありませんが、万に一つくらいの可能性でマルチバイトに対応していないコンパイラがあるかも知れません。
それを禁止するなら文字列リテラルの直接表記を禁止するとかコメント閉じの前にスペースは必須とかもコーディング規約に入れるべきだと思います。
458デフォルトの名無しさん:2006/06/20(火) 00:49:09
ソースのエンコーディング指定できるようになった 3.4 より古い gcc なんて、
まだザラにあるんじゃないか?
459デフォルトの名無しさん:2006/06/20(火) 00:52:21
>>457
組み込み系でマルチバイト文字を処理させるとは
考えにくいけどどうなんだろうね?教えれ>>452
460デフォルトの名無しさん:2006/06/20(火) 00:54:30
>>459
SJISでコメント入れたときの話だろ?
作成するプログラムでマルチバイト文字を扱うわけじゃない。
461460:2006/06/20(火) 00:55:09
ん? >>457 へのレスならいいのか。
ごめん。アンカー見間違えてた。
462デフォルトの名無しさん:2006/06/20(火) 00:55:12
>457にもあるが、//コメントは行末に必ずドットか何か置くことにすればいいと思うがねぇ。
#空白は拙いな。行末の空白を取り除く余計なお世話なエディタがあるし、毛嫌いする人もいる。
463デフォルトの名無しさん:2006/06/20(火) 00:57:27
最近趣味でC++をはじめてみたのですが、
ウィンドウのデザインを変更する事はできるのでしょうか?
よくフリーソフトでウィンドウのスキンを変更できるソフトあるじゃないですか。
私の場合はexeにした時点でウィンドウデザインを変更しておきたいのです。
ググっても載っていなかったので、
ご存知の方いらしゃいましたらアドバイスお願いします。
464デフォルトの名無しさん:2006/06/20(火) 00:59:51
exeにした時点 とやらをもうちょいと明確に
465デフォルトの名無しさん:2006/06/20(火) 01:17:22
俺のセブンセンシズは
「コンパイル時にウィンドウスタイルを変更したい」
だと語っている
466デフォルトの名無しさん:2006/06/20(火) 01:18:13
>>464
あ、不明確ですみませんorz
ビルドする前にコード打つ段階でウィンドウスタイルを変更する
コードが打てるのか、もしくはコンパイラのフォームデザインから
変更できるのか分からないのですが、ビルドしてexe形式にして
配布できる状態になった状態の時点でデザインの変更をしておきたいのです。

普通ウィンドウズですと、タイトルバーが青くてフォームがグレーじゃないですか。
それを画像を用意して張りかえるか、コードで変更できるのか、もしくはできないのか
分からないので、現在もググりながら書き込んでます。
467デフォルトの名無しさん:2006/06/20(火) 01:19:20
>>465
セイントktkr
468デフォルトの名無しさん:2006/06/20(火) 01:23:35
>>452
まぁそういう問題があるコンパイラなら、
a=1;/*○○可能*/
b=2;/*hoge*/
でもb=2はコメントアウトされてしまう(またはコンパイルエラー)から、気をつけとけ
469デフォルトの名無しさん:2006/06/20(火) 01:42:48
注釈もまともに入れられない環境なんて捨ててしまえ!
これでも見てマターリしろ
ttp://www.youtube.com/watch?v=P4mZlwuOg50
470デフォルトの名無しさん:2006/06/20(火) 02:16:04
>>466
ヒント: WM_NCHITTESTを処理せよ。
471452:2006/06/20(火) 04:09:00
皆さん、ありがとうございます。
ほとんど大丈夫だが、中には当てはまるコンパイラがあるかも知れないということですね。
コーディング規約に入れられたら反論できないわけですね。
472デフォルトの名無しさん:2006/06/20(火) 08:22:53
>>471
「その規約だと>468の問題もありますよね」って突っ込んでみると面白いかもしれない。
473デフォルトの名無しさん:2006/06/20(火) 08:59:34
>468ってなんか問題起こる?
行連結って行末の \ + 空白xn + 改行 でしか行われないような・・・
そもそもそんな構造のコンパイラがあったら"\"(0x5c)を含むコードが一切使えなくなる気が
474デフォルトの名無しさん:2006/06/20(火) 11:25:11
>>473
"能"の次の*がエスケープされて、"*/"というコメント終端文字列とはみなされず、
次の行の終わりの"*/"までをコメントとみなしてしまうおそれがある。
475デフォルトの名無しさん:2006/06/20(火) 11:35:02
そんなコンパイラ実在するのかw
って言うかそんなの気にするぐらいなら
コメント中の行連結文字を検出するツールでも
作った方がいい希ガス。
476デフォルトの名無しさん:2006/06/20(火) 11:59:59
>>474
/* */ のコメント中にエスケープなんか効かないよ。
477デフォルトの名無しさん:2006/06/20(火) 12:03:53
いや、エスケープ効くかどうかはコンパイラの自由なんじゃないか?
まあ、実在するかは(´・ω・`)知らんがな
478デフォルトの名無しさん:2006/06/20(火) 12:10:44
>>477
自由にしてたらコンパイラごとにソースの意味が変わっちゃうからダメだろ。
479デフォルトの名無しさん:2006/06/20(火) 12:16:59
>>476
/* */の中はエスケープは効かないが、//の後ろは効くという主張?
480デフォルトの名無しさん:2006/06/20(火) 12:21:58
>>479
改行のエスケープは規格で定められている。
481デフォルトの名無しさん:2006/06/20(火) 12:25:03
日本語禁止でいいんじゃね?
そういうプロジェクトいくつかあったよ
482デフォルトの名無しさん:2006/06/20(火) 12:25:46
>>480
それはコメント中もだっけ?
483デフォルトの名無しさん:2006/06/20(火) 12:25:51
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int myRand(int a)
{
return rand()%a+1;
}
int main(void)
{
srand( (unsigned)time(NULL) );
int a;
printf("整数を入力\n");
scanf("%d", &a);
printf("%d", myRand(a));
return 0;
}
このプログラムで、srand((unsigned)time(NULL));を書くとコンパイル時にエラーが出てしまうのですがなぜですか?
まったく原因が分かりません。
484デフォルトの名無しさん:2006/06/20(火) 12:26:59
行連結は翻訳段階2で行われるけど
コメント処理は翻訳段階3だからねー。
規格合致処理系なら
/\
*\
*\
/\
もコンパイルは通る。
485デフォルトの名無しさん:2006/06/20(火) 12:27:39
>>475
日本語に対応してないコンパイラ(Cygwin の gcc とか)
486デフォルトの名無しさん:2006/06/20(火) 12:28:54
ああ、* へのエスケープが効くかどうかは、今手元にないからシラネ。
487デフォルトの名無しさん:2006/06/20(火) 12:29:26
>>483
エラーメッセージ嫁。
488デフォルトの名無しさん:2006/06/20(火) 12:32:10
>>483
Cでは、変数の宣言はブロックの先頭でなければならない。
関数呼び出しの後ろで宣言するな。
489483:2006/06/20(火) 12:32:29
エラー E2140 kadai10_2.c 13: ここでは宣言できない(関数 main)
です
490483:2006/06/20(火) 12:34:42
>>488
ありがとうございます!
うまくいきました
491デフォルトの名無しさん:2006/06/20(火) 12:42:43
>>485
それは確かに。
でもそういうコンパイラを使うプロジェクトなら
それこそ日本語禁止にしないと駄目だよな。
492デフォルトの名無しさん:2006/06/20(火) 12:50:54
>>485
もう 3.4 になってるから、 -finput-charset 使えば問題なし。
493デフォルトの名無しさん:2006/06/20(火) 14:17:43
>>492
お、使えるんだ。
494432:2006/06/20(火) 15:20:14
>>435 さん
おお、ありがとうございます!

それで、質問というのは
そのプログラムをVC++に入れてコンパイルしても、エラーが沢山出てしまって
動作してくれなくて困っています。
具体的にどういじって、どんなファイルを用意すれば良いのかなど、
ご教授してくれると有難いです・・・。

程度が低すぎて申し訳ない。
495デフォルトの名無しさん:2006/06/20(火) 15:36:24
ひょっとして、
もしかして、

サンプルのtxtファイル自体をVCに食わせようとしてる?




あと、単にエラー出たとか言われてもエスパーじゃないのでエラー内容は君にしかわからん
496435:2006/06/20(火) 15:50:26
>>494
ビルドしたプロジェクトをうpしといた。受信パスはsuganuma。
ttp://www.uploda.org/uporg421601.zip.html

普通、ひとつのクラスの実装はひとつのcppで行うので、そのようにファイルを作った。
誰かへの説明のためなどの理由で、ファイルを分割するひつようがあるなら、
このビルドできるプロジェクトをいじってね。

次に質問するときは、エラーメッセージをコピペすること。
497435:2006/06/20(火) 15:57:42
んあ、ひょっとして、引数に与えるファイルの内容がわからないってこと?
ttp://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/18-sho.htm#e-18-4
にあるように、
 実行可能ファイル名 制御データファイル名 構造データファイル名
で起動する。引数に与えるデータファイルは、そのページの赤字のところそのものが
入ったファイルを用意してやればいいよ。何してるのかさっぱりわからんけど。
498435:2006/06/20(火) 16:04:22
つか、俺あのプログラム書いた本人がVCでビルドしようとして出来ないんだと思ってたよ。
499デフォルトの名無しさん:2006/06/20(火) 21:50:36
void Kansu {
  ・
  ・
  ・
  //抜けたい場所
  ・
  ・
  ・
}


whileやfor文ならbreakで抜けれますが、
returnを使わずに関数を途中で抜ける方法ってありますか?
500デフォルトの名無しさん:2006/06/20(火) 21:52:44
関数を途中で抜けるのと、returnをすることの違いとは?
501デフォルトの名無しさん:2006/06/20(火) 21:54:27
あ、returnって値を返さなきゃならないんですよね?
もしかして値を返さなくてもreturnできるですか?
502デフォルトの名無しさん:2006/06/20(火) 21:54:58
return を使う事と、関数を途中で抜ける事は等価なので、
質問自体が矛盾している。
503デフォルトの名無しさん:2006/06/20(火) 21:58:06
ああ、returnの後ろに何も書かなければ値を返さなくても関数を抜けれるんですね。
何かつけないとダメと思ってました。ありがとうございます。
504デフォルトの名無しさん:2006/06/20(火) 22:05:28
まあこの場合戻り値がvoidだしな。何かしら返す必要があるならダメ。

それか、gotoやら例外で飛ぶこともできる。前者の濫用はやるべきではないが。
505デフォルトの名無しさん:2006/06/20(火) 22:05:50
>>503
たしかCだとvoid以外の関数でも戻り値をせずにreturnが使えるはずだから、
一応念のため言っておくけど、returnに戻り値を書かなくても済むのは、
戻り値の型がvoidである関数限定だと思っておきなさい。
506デフォルトの名無しさん:2006/06/20(火) 22:06:02
引数を与えないでreturnした場合は何が戻り値になるんだろう。
たまたまEAXレジスタに入ってたゴミが返るとかそんな感じなのかな。
今まで考えたこともなかった。

関数を途中で抜けて、しかも戻り値を使わないような場合って
ほとんどエラーが起こった状況だと思うんだけど、エラーが
起こったことがわかるように戻り値を返してやるのが親切かも。
507デフォルトの名無しさん:2006/06/20(火) 22:24:25
VC++2005、bcc、gcc、ICCはeaxのゴミっぽい。
508504:2006/06/20(火) 22:28:45
うっかりしてたがgotoは同じ関数内のラベルにしか飛べないのでこの場合ダメだった
この場合setjmpとlongjmpを使う。
つっても例外使った方がいいと思うけど
509デフォルトの名無しさん:2006/06/20(火) 22:37:46
>>506
Cではたしか不定の値(ようするにごみ)が返ることになるんだったと思う。
(もしかしたら未定義だったかもしれない)

C++ではコンパイルエラー。
510デフォルトの名無しさん:2006/06/21(水) 00:19:11
>>509
実装依存なので、律儀に0を返すコンパイラもあります。
511デフォルトの名無しさん:2006/06/21(水) 03:26:58
0や1などの小さな整数しか入れない変数を定義する時、intにしないでcharを使ったほうが
メモリが節約できると思うのですが、そうすると他人に理解しにくいというか、
間違ってると思われるでしょうか?
512デフォルトの名無しさん:2006/06/21(水) 03:42:30
>>511
殆どメモリの節約にならないばかりか、最適化の妨げになるのでintで充分です。
513デフォルトの名無しさん:2006/06/21(水) 14:48:12
質問です。
gettimeofday関数を使用して実行時間を計測したいのですが、
#include <sys/time.h> が見つかりません とエラーが出てgettimeofday関数を使用できません。
このファイルは普通どこにあるんでしょうか??
VisualStudio.NET2003使用。
514デフォルトの名無しさん:2006/06/21(水) 14:55:23
そんなものはない。
515デフォルトの名無しさん:2006/06/21(水) 15:40:40
>>513
落ち着いてどんな質問がしたいのかもう一度考えて。
516デフォルトの名無しさん:2006/06/21(水) 16:29:45
gettimeofdayはlinuxの関数じゃない?
517デフォルトの名無しさん:2006/06/21(水) 16:38:19
BSDにもあるぞな。

まあ、VCのライブラリには無いようなので適当に<time.h>includeしてclock()使うとか
518デフォルトの名無しさん:2006/06/21(水) 17:06:09
man 2 gettimeofday
(略)
準拠
 SVr4, BSD 4.3
519デフォルトの名無しさん:2006/06/21(水) 17:08:49
まあ、Windowsなら普通はGetTickCountとかQueryPerformanceCounterとか使う
520デフォルトの名無しさん:2006/06/21(水) 17:35:59
>>513
実行時間の計測ならプロファイラ使え
521432:2006/06/21(水) 17:44:32
>>435
こんなにご丁寧に、親切教えて頂いて、
本当にありがとうございます!

アップして頂いたコードも落とさせて頂きました。
ビルドしたら、上手くいったのですが・・・

こんな事を聞くのも心苦しいのですが、
VC++で実行すると、***error 入力データファイルを指定してください。
と出ます。

435さんが教えてくださった通り、data1.dat、data2.datというファイルを作り、
中に制御データ、構造データを入れるところまではやったのですが
ここから起動する、というのがよく分からないです・・。

ここまで親切に教えてくださいましたし、あまり甘えるのもアレかと思うのですが
もし宜しければ、起動の方法を教えてください。
522デフォルトの名無しさん:2006/06/21(水) 18:13:28
VCから直接動かそうとしているなら、>>444
そうじゃないなら、[Windowsキー]+Rで、cmdと入力して、exeがあるところまでcdしてから>>442
523432:2006/06/21(水) 22:58:59
>>522 さん
出来ました!
ありがとうございました!

>>444さん、>>435さん
お世話になりました!
特に435さんは、とても丁寧ににして頂いてとても感謝しています。
素人の程度の低い質問に答えてくださり、
皆様本当にありがとうございました!
524デフォルトの名無しさん:2006/06/21(水) 23:11:26
>>523
まぁ全部の発言が俺なわけだが・・・。
なんにせよ、よかった。いろいろ頑張れよ。
525デフォルトの名無しさん:2006/06/21(水) 23:35:09
>>523-524
ワロタww
524親切だな
526デフォルトの名無しさん:2006/06/22(木) 00:46:16


STL の情報が網羅されている(出来れば)日本語のサイトが見たいのですが、

std::deque
std::list を使うか、 std::vector を使うかで迷っているのですが、
1. 二つのコンテナをつなげて一つのコンテナにする
2. 末尾に要素を追加
3. 先頭から要素を取り出して、削除する
4. 要素の数を取得する
という4つの操作しかしないのですが、std::listの方が速いですか?
527速度が気になるなら試せばいい:2006/06/22(木) 00:47:23
>>526
日本語でどうぞ。
つーか、文章は完結させましょう。
528526:2006/06/22(木) 00:48:21
すいません。
書く内容を纏めている途中で送信してしまいました。

でも大体書きたいことは伝わったかなと思います。よろしくお願いします。
529デフォルトの名無しさん:2006/06/22(木) 00:52:32
>>526
短く言うと、std::dequeは大抵は お そ い と知っておいてくれ。
530デフォルトの名無しさん:2006/06/22(木) 01:05:52
STLに関してはかなり纏まったページが見つかりました。
ttp://www.wakhok.ac.jp/~sumi/index.html

>>529
どうも。とりあえず std::list でやってみたいと思います。
merge() もあるようですし。
531デフォルトの名無しさん:2006/06/22(木) 01:48:20
std::list<>::size()はcomplexityが…と思って調べたらconstantなのね。
532笹井奈琴:2006/06/22(木) 03:14:41
enumって、前方参照宣言できないんでしたっけ?
次のプログラムのコンパイルが通らない...

---ファイル:bigger.h
enum e_bigger_t { MEGUMI, HOSHINO, SAAYA };

---ファイル:momu.h
enum e_bigger_t;
void momu( e_bigger_t eb );

---ファイル:momu.cpp
#include "momu.h"
#include "bigger.h"
void momu( e_bigger_t eb ) {
// なんか処理
}
$ g++ momu.cpp
ってやると
momu.h:1: error: use of enum `e_bigger_t' without previous declaration
「e_bigger_tってなんだよ?」って...
つか、e_bigger_tは列挙体だよ、って、そこで教えてるのに...
533デフォルトの名無しさん:2006/06/22(木) 03:23:49
浅はかな素人思考だな。何もわかっていない。
534デフォルトの名無しさん:2006/06/22(木) 03:43:09
という内容の指摘を素人でも書ける言葉だけでまとめるのは
ギャグでやってるのかなw
535デフォルトの名無しさん:2006/06/22(木) 03:50:45
浅はかな素人ギャグだな。何も笑えない。
536デフォルトの名無しさん:2006/06/22(木) 03:57:30
>>532
結論を言えば、ダメ。
enumは不完全型として認められていない。
537笹井奈琴:2006/06/22(木) 04:40:23
>>536
さんきゅ!
VC++ではできたように思ったんだが勘違いか、
VC++独自の仕様なんだろうなあ。

ありがと。
538デフォルトの名無しさん:2006/06/22(木) 11:09:03
>>531 linear だよ。
539432:2006/06/22(木) 11:19:02
>>524 さん
ああ、そうだったのですか、失礼しました。

はい、頑張ります!
本当にありがとうございました!
540デフォルトの名無しさん:2006/06/22(木) 11:34:47
>>538
SGIの実装がlinearなだけ
ttp://www.sgi.com/tech/stl/FAQ.html

仕様では、constant timeのほうが良いとされているけど。
541デフォルトの名無しさん:2006/06/22(木) 11:57:04
>>540
ほんとだ。
でも constant と要求されてるわけじゃないから、 constant とも言い切れないな。
困った規格だ。
542デフォルトの名無しさん:2006/06/22(木) 12:08:47
class A {
public:
void f() const {}
void f() {}
};
定義がconstの有無だけのオーバーロード?関数はどうやって呼び出しを区別するのですか?
こういう定義をする意味もよく分かりません。
どういった場合に使われるのか良ければ教えてください。
543デフォルトの名無しさん:2006/06/22(木) 12:27:22
>.542
A a;
A const ca;
a.f(); // こっちは const 付いてない f()
ca.f(); // こっちは const 付いてる f()

コンテナの operator [] とか、オブジェクトの中身への参照を返すときに
戻り値の型にも const を使い分けてよく使われる。
544デフォルトの名無しさん:2006/06/22(木) 12:57:24
>>543
回答ありがとうございます。
545デフォルトの名無しさん:2006/06/22(木) 14:01:34
WAVEファイルの取り込みってどんなプログラム書けばいいんですか?
ここ2ヶ月そのことしか考えてません。
546デフォルトの名無しさん:2006/06/22(木) 15:41:34
547デフォルトの名無しさん:2006/06/22(木) 15:46:50
>>543
確かthisにconstが付くんだっけ。typeidで表示されてみればいいか?
548デフォルトの名無しさん:2006/06/22(木) 17:36:28
理由が分からん('A`)
#include <stdio.h>
#include <stdlib.h>

typedef union {
double a;
unsigned char b[8];
} D8;

double swap(D8 s) {
return (double)((s.b[0] << 56) |(s.b[1] << 48) |
(s.b[2] << 40) |(s.b[3] << 32) |
(s.b[4] << 24) |(s.b[5] << 16) |
(s.b[6] << 8) |(s.b[7]));
}

int main() {
D8 a;
int i;
a.a = 0.0;
a.a = swap(a);
printf("%g\n", a.a);
}

gcc ttt.c
ttt.c: In function
[minomura@mozart07 minomura]$ ttt.c:10: warning: left shift count width of type
ttt.c:11: warning: left shift count width of type
ttt.c:12: warning: left shift count width of type
ttt.c:13: warning: left shift count width of type
549デフォルトの名無しさん:2006/06/22(木) 17:47:30
s.b[0] << 56 で s.b[0] の型は 56bit長もねーよ と言ってる

56bit以上の整数型 (仮に T としよう)でキャストの後ビットシフトすれ
((T)s.b[0]) << 56
550デフォルトの名無しさん:2006/06/22(木) 18:08:59
>>548
むしろ、藻前が何をしたいのかがわからん。
551デフォルトの名無しさん:2006/06/22(木) 20:19:58
エスパー

typedef union {
unsigned long long a;
unsigned char b[8];
} D8;

unsigned long long swap(D8 s) {
int i;
D8 tmp;
for(i=0;i<8;i++) tmp.b[i] = s.b[8-1-i];
return tmp.a;
}
552デフォルトの名無しさん:2006/06/22(木) 22:13:45
スレ違いだったらごめんなさい。

C言語のプログラミングをマスターするために来週から練習します。
プログラムを打つのは初心者です
C言語を覚えたら、javaなどやろうと考えています

OS:XP h

今後のことを考えて、お勧めの市販ソフト又はフリーソフトは何がいいんですか?
ご指導お願いします
553デフォルトの名無しさん:2006/06/22(木) 22:19:53
>>552
VC++ 2005 Express
554531:2006/06/22(木) 22:49:23
>>538,540
あ、たしかにshouldだった。shallと勘違いしていた。スマン
555デフォルトの名無しさん:2006/06/22(木) 23:02:52
>>553
即レスありがとうございます
これはCとC++がやれるソフトでOKですか?
556デフォルトの名無しさん:2006/06/22(木) 23:09:41
>>555
 そりゃ、CもC++もできるけど、高いよー。
プログラマでメシを食う覚悟があるならどうぞ。
単に趣味とか学校の単位のためとかならとりあえずタダのBorlandで。
557デフォルトの名無しさん:2006/06/22(木) 23:11:55
>>556
Expressは無料だろうが。
558デフォルトの名無しさん:2006/06/22(木) 23:19:59
>>556
アカデミックなら4800円。
MSの青田刈りもここまで来たかという感じがする。
559デフォルトの名無しさん:2006/06/22(木) 23:25:52
あとcygwin-gcc
560デフォルトの名無しさん:2006/06/22(木) 23:30:45
>>555-559
ありがとうございます
561デフォルトの名無しさん:2006/06/23(金) 00:29:20
VC++でWindowsアプリケーションを作ってるとログ出力機能を持たせることが多いです。
で、そのログ出力の内容を外部からhookさせる方法やソフトはないでしょうか?
ログ出力機能を持った既存のアプリの変更は無しが嬉しいです。
ようするにログの内容を別窓で見たいのです。
562デフォルトの名無しさん:2006/06/23(金) 00:49:55
>>552
Visual C++ 2005 Express (簡単な)まとめサイト
ttp://www14.atwiki.jp/garyohosu/
563デフォルトの名無しさん:2006/06/23(金) 00:53:25
この動きがいまいち理解できません。
class TestBase {
public:
print() { std::cout << "TestBase" << std::endl; }
};
class TestSub : public TestBase {
public:
print() { std::cout << "TestSub" << std::endl;}
};

これで、TestBase* testBase = new TestSub; testBase->print() をすると、TestBaseが呼ばれます。
で、TestBaseのprintにvirtualをつけると、TestSubが呼ばれます。

この動きが良くわかりません。
わかりやすく教えてください。
564デフォルトの名無しさん:2006/06/23(金) 00:58:44
>>563
printがTestBase、TestSubのどちらが呼ばれるかは
printがvirtualでないとき静的に決まり、virtualだと動的に決まる。

つまりこの場合静的と言うと、ソースコード上testBaseの型がTestBaseだからTestBase::printが呼ばれるということ。
動的と言うのは、printを呼ぶときにTestBaseへのポインタから呼び出そうとも、
newして作られたのはTestSubだから、TestSub::printが呼ばれるということ。
565デフォルトの名無しさん:2006/06/23(金) 00:59:23
C++使用で、厳しく求められる安全性とソースの共有の上で
・TCHAR [](固定長) による文字列とその処理
・(STL)std::basic_string<TCHAR> による文字列とその処理
・(MFC)CString による文字列とその処理
について考えているのですが、

C++でも文字列変数にTCHAR[]が多いのはなぜでしょうか?
安全性の要求があってもbasic_stringなどでなくTCHAR[](固定長)を使うのは
なにか理由があるのでしょうか?
566デフォルトの名無しさん:2006/06/23(金) 01:04:38
単純に、安全性が確保できているなら固定長配列でも問題ないと思う。
567デフォルトの名無しさん:2006/06/23(金) 01:04:48
>>565
WinAPIの引数がTCHARだからじゃない?
CStringはともかく、std::stringを使わない積極的理由は思いつかない。
568デフォルトの名無しさん:2006/06/23(金) 01:10:29
>>564

回答ありがとうございます。

静的か動的かということですか。

なれないと難しい動きですね。
ありがとうございました。
569デフォルトの名無しさん:2006/06/23(金) 01:28:28
>>563

デストラクタに virtualがついているのも同じ理由。
動的にデストラクタを呼び出す為。

覚えると何かと便利だ。
570デフォルトの名無しさん:2006/06/23(金) 01:54:16
>>563
TestBase*と宣言しているから、生成したのはTestSubでも
virtualをつけなければ、単純にTestBase::print() が呼ばれる。

virtualをつけても実はTestBaseのメソッドしかアクセスできない。
virtualの場合、TestBase内にTestBase::print() 関数への
ポインタ変数が作られる。
そして、TestSubで生成するとTestBase内のこのポインタに
TestSub::print() へのアドレスが格納される。

TestBase::
 virtual print() ←  実は関数へのポインタ
 print() ←TestBase::print() の実体  ↑
                        |
                         |
TestSub::                   |
 print() ←TestSub::print() の実体 ---+
         TestSubの生成時にポインタをセット
571デフォルトの名無しさん:2006/06/23(金) 07:56:09
>>563
というか、そのコードというか考え方そのものがあまりよくない。
virtualを付ける/付けないで動きが違う理由は、上記の通りだけどね。
もう一度、継承する意味と多態性について勉強したほうがいいと思う。
572デフォルトの名無しさん:2006/06/23(金) 07:57:49
あ、書き忘れた。
ベースクラスの関数を隠蔽してしまう(上書きしてしまう)ような関数定義は、あまりよくないってこと。
573デフォルトの名無しさん:2006/06/23(金) 15:26:28
>>572
それには漏れは全く同意しない。ケースバイケースですらなく、1%も。
574デフォルトの名無しさん:2006/06/23(金) 15:30:06
>>573
理由は?
575デフォルトの名無しさん:2006/06/23(金) 15:38:01
virtual を付けてオーバーライドして動作を変えることを「あまりよくない」とする
理由が(オブジェクト指向を知らない人が混乱すること以外)存在しないし、
ふつうにポリモするときにはこれは必須。

virtual をつけずに(誤って)隠ぺいしてしまうことの問題は、昔からある一般的な
シンボルの衝突の問題であって、派生だ基底だという問題ではないから。
これは単に「関数名はよく考えてつけよう」という話。

virtual をつけずに意図して隠ぺいするのはテンプレート等メンバのシグネチャレベル
でのインタフェイスを維持するときに便利だし。

「確かにこれは悪い」っていう例がこれらの利点を打ち消すほどたくさんあれば、
考えを変えるけど。
576デフォルトの名無しさん:2006/06/23(金) 15:54:15
>>575
まぁ考え方の違いなんだろうけど、言語的に便利な場面で意図的に隠蔽するような
関数定義をするのは全く問題ないけど、多態性という文脈で考えたときに、どちらが
呼ばれるか混乱するという意味で、俺は隠蔽するのは良くないと思う。

一般的なシンボルの衝突、と言ってしまえばその通りかもしれないけど、オブジェクトに
よって同一のメッセージ(という単語を出すと荒れるような気がするが)に対して異なる
振る舞いをするというのが多態性の基本的な考え方なので、そうクールに切り捨てて
いい問題とは思わない。
577デフォルトの名無しさん :2006/06/23(金) 15:59:12
//N=50で落ちるのはバグの性だったようです。これならN=100でも落ちない。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 15
void get_randam(int block[N][N]){ int *p;for(p = &block[0][0]; p <= &block[N-1][N-1]; p++)*p = rand() % 2; }
void paint(int block[N][N], int x, int y){ if( x<0 || y<0 || x>=N || y>=N || block[y][x] != 0)return;
block[y][x] = 2; paint(block, x+1, y);paint(block, x-1, y);paint(block, x, y+1);paint(block, x, y-1); }
void make_ans(int block[N][N]){ int i; for(i = 0; i < N; i++){ paint(block, 0,i);paint(block, N-1,i);paint(block, i,0);paint(block, i,N-1);
} } int main(){int block[N][N], *p, i = 1;srand(time(NULL));get_randam(block);make_ans(block);for(p = &block[0][0]; p <= &block[N-1][N-1]; p++, i++){
switch(*p){case 0: printf(" 1"); break; case 1: printf(" *"); break; case 2: printf(" -"); break; default:printf(" E"); break;
}if(i % N == 0) putchar('\n'); } return 0;}
上のソースは、宿題レスでだいぶ前に俺が適当に問題提示してみた問題の答え(どなたかが答えたソースです)
-**-**
-*-*-*
*-****
**----
の*で囲まれてる所をすべて別の文字に埋めるっていう問題
で、問題出しただけで答えは自分自身わからなかったのですが
この答えのソース見てもどうやって、再帰つかって探索してるのかが
いったいどうやったらこういうのを思いつけるのかがわからないです。
センスもあるんでしょうが、パズルの解法とかの関連ページ見ても
わからずで。
どういう風に、再帰さして結果を出してるのか。
ヒントか、参考になるページとかあれば、どなたか教えてください。
578576:2006/06/23(金) 16:00:48
例えば>>563のコードでは、
・printを多態する(俺造語)関数であると設計するなら、初めからvirtualを付けとけ
・printを多態しない関数であると設計するなら、継承したクラスではその関数名は使うな
 (似たような処理をする関数を作りたければ、別の名前にしろ)

また別の側面から考えると、あるクラスライブラリを使うということを考えたときに、
「隠蔽された関数がいたるところに散らばっている」というライブラリの場合、
使いたいクラスの規定クラスまでさかのぼって、多態という文脈でその関数を
使ってよいかどうか調べなければならなくなるかもしれないというようなことも
起こりえる。
579576:2006/06/23(金) 16:13:48
付け加えておくけど、以上はC++に限った話で、他言語だと全く違うこともあるからね。
580デフォルトの名無しさん:2006/06/23(金) 16:43:07
>>578
まぁ昔はそうだったわけだけど、WTLなんかにあるようなテンプレートベースの
クラスライブラリだと virtual なしで関数シグネチャ一致でポリモするってのは
便利に使われてるわけで・・・

たとえば(単純すぎて有効性が示せてない例かもしれないけど)
template class<T> void Log(const T& o) { o.print(); }
なんてのを使いたいとき。

Java とか C# なら >>579 には賛成します。
581576:2006/06/23(金) 16:52:46
>>580
俺はただ「1%も同意しない」にひっかかってるだけなんだけど、その「便利な場合」以外においても
C++では>>576,>>578には全く同意できないということですか?
うーん、まぁそういう考えの人もいるってことはわかりました。(あなたにとっては俺のような奴が
いるってことがわかったんでしょうが)
582576:2006/06/23(金) 17:01:30
ちなみにRubyでは、振る舞いを変える場合は単にメソッドを定義するだけであって、
呼び出される文脈でどれが呼ばれるかが変わるいうことはありません。
こっちの方が自然だと思う。
583デフォルトの名無しさん:2006/06/23(金) 17:12:56
>>565
今のところ、標準規格においてstd::basic_stringは要素がメモリ上で連続している保障がないから、
APIにバッファとして渡せないという影響も大きいと思う。(読み取りだけなら勿論c_strがあるけどね)
その点CStringはGetBufferなど、如何にもAPIにバッファとして渡すことを考慮されている分便利。

ちなみにCString以外でWindows APIにバッファとして渡すのに使えるものとしては、
std::vector<TCHAR>とか(std::vectorは要素がメモリ上連続している保障がある)、
new[]してboost::scoped_array, shared_arrayとかがある。
584デフォルトの名無しさん:2006/06/23(金) 17:38:17
>>581
主義の違いでよいような気もするけれども、質問風の文章なので一応返事してみます。

CBase::print() // オブジェクトの内部状態を表示
CDerived::print() // オブジェクトの内部状態を表示
なんていう2つの関数は同じ名前でよいと(強く)思うわけです。

CBase::basePrint() // オブジェクトの内部状態を表示
CDerived::derivedPrint() // オブジェクトの内部状態を表示
とするのは馬鹿げてると(これまた強く)思うから。

でまぁ、virtual の有無で動作が変わるからポインタベースでのポリモに使えるか
どうかわからんってのは・・・ドキュメント化するしかないでしょうね。
関数名を変えておけば使えないことは明らかなのでウマー!ってのは・・・アリなのかなぁ。
デストラクタとかは関数名変えようがないわけだし・・・
585576:2006/06/23(金) 17:52:59
>>584
うーん、主義の違いとしか言えないということかな。

>なんていう2つの関数は同じ名前でよいと(強く)思うわけです。
全く同意。ただ俺の場合はCBase::print()をvirtualにします。

俺の主義では、CBaseもCDerivedもprintに反応するなら、CFoo : CBaseも、
CBar : CDerivedもprintに反応するのが自然だと本能的に思うわけです。
どうせ全部でprintに反応すると思っているのなら、CBase::print()をvirtualに
しとけって思うんですね。

つまり、親クラスがprintに反応するのに子クラスが反応しないのはOOに
反していると感じるわけです。

やっぱり、主義の違いってことかな・・・。
586デフォルトの名無しさん:2006/06/23(金) 18:38:20
>>584
馬鹿じゃないの?
587デフォルトの名無しさん:2006/06/23(金) 20:01:58
>>573
馬鹿じゃないの?どう考えても、メンバ関数の隠蔽は、最悪ケースバイケースでそれはオッケーてな感じだろ。
いちいちそんなことされた日にやコンテナ入れるのも迷うわい。可読性とユーザビリティが著しく阻害される。
つか、純粋仮想関数使え。あ、こりゃ仮想だからNGなのかw
588デフォルトの名無しさん:2006/06/23(金) 20:02:19
>>586
能無しが無理して割り込まなくていいですよ。
589デフォルトの名無しさん:2006/06/23(金) 20:32:52
>>584=>588
ギャハハハハ
590デフォルトの名無しさん:2006/06/23(金) 21:19:23
>>585
>どうせ全部でprintに反応すると思っているのなら、CBase::print()をvirtualに
>しとけって思うんですね。

virtual にしなくても反応はするでしょう。ふつうに継承して。
virtual の有無での差はポインタ経由で呼び出すときの違いだけ。

>>587
なにか具体的な例あげて批判してくれるとわかりやすいんだけど。
っていうかみんななんでそんなに仮想関数好きなの?
漏れは純粋仮想関数以外はあんまり使わないけどなぁ。
591デフォルトの名無しさん:2006/06/23(金) 22:06:00
>>590
つまりC++の継承とポリモーフィズムの仕組みを真っ向から否定する、ということだね
592デフォルトの名無しさん:2006/06/23(金) 22:14:43
ポインタ経由でとか言っちゃう時点でお国が知れるってもんだ。
593576:2006/06/23(金) 22:32:28
>>590
うーん、なんだかもっと話がかみ合わなくなってきた気がするので、これを
最後にします。

>virtual にしなくても反応はするでしょう。ふつうに継承して。
え?そういう話だったんですか?
もともとあるクラスツリーに属するクラスでは全てprintに反応するのだが、
それぞれで実装が違うけど、virtualはお勧めしないって話では?
なぜvirtualを付けることに1%も同意できないのか良く分からなくなって
きました。

とはいうものの、実はC++の場合、俺も将来を見越してvirtualを付けておく
というのは(オーバーライドされることを考えておくというのは)、ほんの少し
違和感があります。前述のRubyの例が自然だと考えてるわけで・・・。

ただひとつ言えることは、言語仕様的にvirtualを付ける/付けないでこの
ように振る舞いがかわるからこうしろ、ということではなく、多態性を使う
のであれば仮想関数にしておくのがC++の流儀である、という認識は
多分どのように説得されても変わることはないと思います。
ではでは。
594576:2006/06/23(金) 22:35:19
s/それぞれで実装が違うけど/それぞれで実装が異なることがわかっていても/
595デフォルトの名無しさん:2006/06/23(金) 22:40:21
またこのスレ伸びてると思ったらこんなんかよ
前のよりマシだけど
596デフォルトの名無しさん:2006/06/23(金) 23:09:30
馬鹿ほど饒舌なんだよ。
利口な人間は己に欠落を見つけ次第黙々と勉強する。だから利口になる。
馬鹿はそこで間違った自分の正しさを延々と説いて回る。だから馬鹿。
597デフォルトの名無しさん:2006/06/23(金) 23:10:55
>>577
・どこまで理解できていて、何が理解できていないのか明確にせよ。
・デバッガを使ってどのような動作するのか調査する。
・printfなどを使って途中経過がわかるようにする。
、、and so on
598デフォルトの名無しさん:2006/06/23(金) 23:12:55
>>595-596
そんなことしか言えないお前らはもっと馬鹿だけどなpgr
599デフォルトの名無しさん:2006/06/24(土) 00:03:38
ほら来た。逆ギレも馬鹿の特徴のひとつ。
600デフォルトの名無しさん:2006/06/24(土) 00:04:28
俺の予想:こいつは2.0の奴だ
601デフォルトの名無しさん:2006/06/24(土) 00:31:47
逆ギレの使い方間違ってますよw
602デフォルトの名無しさん:2006/06/24(土) 00:35:48
俺の予想:JUnitスレで暴れてた奴
603デフォルトの名無しさん:2006/06/24(土) 00:37:50
俺の予想:宿題スレで暴れてる奴
604デフォルトの名無しさん:2006/06/24(土) 02:14:57
何かインクリメントするとき、例えば
data[number] = a;
number++;
と書くのと、
data[number++] = a;
と書くのでは、では客観的にどっちのほうが良いでしょうか?
605デフォルトの名無しさん:2006/06/24(土) 02:24:01
後者
606デフォルトの名無しさん:2006/06/24(土) 02:33:09
>>605
客観的に理由を述べられるか?
607デフォルトの名無しさん:2006/06/24(土) 02:37:00
後者の方がスッキリしててわかりやすさも失われていないから
608デフォルトの名無しさん:2006/06/24(土) 02:37:17
インクリメントするためだから前者に決まっとる。

後者はnumberのインクリメントのためにdata[]のインデックスとして使いaを代入する冗長なコード。
609デフォルトの名無しさん:2006/06/24(土) 02:40:45
(何でここはすぐ論争が始じまるのだろう…)
(プログラミング手法の好みって宗教と似てる所があるな)
610デフォルトの名無しさん:2006/06/24(土) 02:42:38
インクリメントするとき≠インクリメントするため
馬鹿ですか?
611デフォルトの名無しさん:2006/06/24(土) 02:47:28
まあ、そう荒れるなよ。ネタをネタと(ry
612デフォルトの名無しさん:2006/06/24(土) 03:01:32
見間違えることくらいよくあることだろ
613デフォルトの名無しさん:2006/06/24(土) 03:03:09
ネタリスト
1.インクリメントだけする時、++i; と i++; のどっちがいい?
2.無限ループは、while(true) while(1) for(;;) ?
3.エラー処理へのgoto はOK?
4.関数の入口でチェックしてreturn はOK?
5.ステータスを返す時は、必ず戻り値で返した方が良い ?
6.正常値は 0 にすべき?

…まだまだありそうw
614デフォルトの名無しさん:2006/06/24(土) 03:13:00
1.現代では関係ない。大昔のコンパイラではベンチが変わった。
2.現代では関係ない。
3.gotoでなくthrowが正しい
4.ぜんぜんOK、それを排除するとthrowも書けない
6.Cのライブラリにそういう関数が多いから合わせたほうが良いでしょう。
615デフォルトの名無しさん:2006/06/24(土) 03:18:48
無駄なメモリの消費やら、計算時間がやたらと掛かる効率の悪いアルゴリズムでなく
どっちを書いても処理の流れが同じなら、パッと見て把握しやすい
見やすい方を選べば良い。そしてその見やすいの基準は自分で良いんじゃね?
誰かにいちいちケチつけられても始まらないし
そもそも市販の本をいくつか見たことある人なら
そんな細かいことを気にしないんでは?
人それぞれだし、思想の自由まである国で生きていることを実感した方が良いよ?
616デフォルトの名無しさん:2006/06/24(土) 03:25:04
>614
例外のないCの場合は?
617デフォルトの名無しさん:2006/06/24(土) 03:27:38
>そしてその見やすいの基準は自分で良いんじゃね?
まあ、ソースを自分しか見ないのであれば。
618デフォルトの名無しさん:2006/06/24(土) 03:30:32
>>615
誰が見ても下手なコードは存在する
619デフォルトの名無しさん:2006/06/24(土) 03:40:11
何かと人の意見にいちいちけちつけるよな、ここ。
自分の視野が狭く観点が甘いことに気づいた方が良いよ。
無理に相手を理解しない、自分を理解させない。
意見を押し付けない、気に入らない意見ならスルーすりゃ良い。
ただ、誰かが自分の気に入らないことを言っていると思う前に
言っていることが「事実」かどうかは自分で判別する能力を身に着けた方が良いよ。
所詮、他人の意見なんざそいつの価値観による判断でもあるんだろうし。
何も相手が自分が嫌いな食べ物を好き好んでいたって良いじゃん。
嫌うなら食べ物だけにして、食べる人まで嫌うこたぁ〜ないだろ?
620デフォルトの名無しさん:2006/06/24(土) 04:14:39
こいつ2.0野郎に確定した。
621デフォルトの名無しさん:2006/06/24(土) 04:33:33
++i; と i++; の問題は、少々根が深いですよ。
Cの黎明期に、実はCが環境依存というか
プロセッサ依存していた名残ですね。
622613:2006/06/24(土) 04:35:00
>>620
全然ちがうと思うよ。
怒ってると言うよりあきれてる雰囲気だものw

俺もちょっとあきれてるww
623デフォルトの名無しさん:2006/06/24(土) 04:36:21
>>622
いったい何にあきれてるんだ?
このスレでは2.0問題以降、平和なもんだが。
624デフォルトの名無しさん:2006/06/24(土) 05:12:06
7.仮引数として配列を渡す場合、void func(int num[]); と void func(int *num); どっちがいい?
625デフォルトの名無しさん:2006/06/24(土) 05:58:15
何だかわからんが、必死な奴がいるな
626デフォルトの名無しさん:2006/06/24(土) 09:52:30
1. C++のイテレータでは基本的に前置使うから、どちらでもよいときにはiでもなんでも前置にする。
6. WindowsのGetLastError()/HRESULTなどのように複数の意味を持たせる場合には、
  逆に0を成功値にするというのもありだとは思う。
7. void func(int* num, size_t size);
  或いは
template<typename RandomAccesIter>
void func(RandomAccesIterIter first, RandomAccesIterIter last);
あとRange版もあればなおよしか。
627デフォルトの名無しさん:2006/06/24(土) 09:59:19
  ┏┳┳┓              ┏┳┳┓
┏┫┃┃┃ スレ違い雑談は┃┃┃┣┓
┃┃┃┃┣┓   ここまで.┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃スレ違い ┣┫ ・∀・ ┣┫  END ┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
                ┗━━━┛
628デフォルトの名無しさん:2006/06/24(土) 12:43:33
何だかわからんが、スレ違いではないんじゃないか?
629デフォルトの名無しさん:2006/06/24(土) 13:43:04
初心者向きではないわなw
630デフォルトの名無しさん:2006/06/24(土) 13:55:08
>>615=>>619
君、2ちゃんに向いてないと思うよ。
来なけりゃ腹も立たないし。
Yahooや@ITの掲示板がいいんじゃないかな。マナーいいらしいよ。
631デフォルトの名無しさん:2006/06/24(土) 14:29:14
char *a;
a="test";

このソースコードに悪い点はありますか?
632デフォルトの名無しさん:2006/06/24(土) 14:30:20
ない。
633デフォルトの名無しさん:2006/06/24(土) 14:30:37
あるよ
634631:2006/06/24(土) 14:32:23
>>632-633
・・!?
詳しくお願いします。
635デフォルトの名無しさん:2006/06/24(土) 14:33:49
ほれ
char *a = "test";
636デフォルトの名無しさん:2006/06/24(土) 14:34:17
8.ローカル変数の定義はブロックの先頭に限る?
637デフォルトの名無しさん:2006/06/24(土) 14:34:23
>>634
ないよ。
まぁ固定文字列を代入するのなら
char *a = "test";
って書けという奴はいるかもしれんがな。(俺もこう書く)
638デフォルトの名無しさん:2006/06/24(土) 14:37:19
>>636
君なんでそんなに必死なの?
君が振る話題って、手垢が付きまくったもので面白みに欠けるんだけど。
相手してほしけりゃ、もっとましなネタ振って下さいね。
639631:2006/06/24(土) 14:38:12
char *a;
a="test1";
(aを表示)
a="test2";
(bを表示)

ではこんな使い方も、あながち間違いではないということでしょうか?
640631:2006/06/24(土) 14:38:45
ミス

char *a;
a="test1";
(aを表示)
a="test2";
(aを表示)
641デフォルトの名無しさん:2006/06/24(土) 14:47:49
>>639
全く問題ない。
(コードの最適化はできるだろうが)
642デフォルトの名無しさん:2006/06/24(土) 14:48:40
特に問題は無いが。
643631:2006/06/24(土) 14:52:08
有難うございます。
644613,636:2006/06/24(土) 14:52:40
>>638
手垢が付きまくって面白みに欠けるリストを作ってるんだがw
余計だったかな? 失礼しやしたw
645デフォルトの名無しさん:2006/06/24(土) 14:56:23
>>644
別にいいんじゃないの?気にせず続けなよ。
646デフォルトの名無しさん:2006/06/24(土) 15:49:30
>>641
括弧の中を詳しく。

>>640
間違いではないが、括弧の中が関数呼び出しなら
a = "test1";
disp(a);
ではなく
disp("test2");
の方が見通しはよさそうだね。
647笹井奈琴:2006/06/24(土) 16:10:12
文字列定数をポイントするなら、
const char* a;
a = "test1";
のほうが好ましいと思う。
648デフォルトの名無しさん:2006/06/24(土) 16:12:02
面白くないよ。
649デフォルトの名無しさん:2006/06/24(土) 16:12:24
constってなんですか?
650デフォルトの名無しさん:2006/06/24(土) 16:17:14
調べるより先に質問する奴は進歩しない
651デフォルトの名無しさん:2006/06/24(土) 16:19:14
釣られまくりですな
652デフォルトの名無しさん:2006/06/24(土) 16:25:56
質問しに来たら、丁度文字列の質問があってどうしようかと悩む俺。
653デフォルトの名無しさん:2006/06/24(土) 16:54:27
謎1 Hoge() {
 char ch[10] = "hoge";
 return 謎2
}

int main() {
 char str[10] = "test";

 str = Hoge();
 printf("%s",str);
 return 0;
}

関数Hoge()で処理した ch の文字配列を
呼び出し元の str へ入れようとした時に
謎1・2はどんな風に書けばいいのでしょうか。
654笹井奈琴:2006/06/24(土) 16:57:32
>>653
void Hoge( char* forRet ) {
char ch[10] = "hoge";
strcpy( forRet, ch );
}

int main() {
char str[10] = "test";
Hoge( str );
printf("%s",str );
return 0;
}
655笹井奈琴:2006/06/24(土) 17:00:52
どうしても返り値でやりたいんなら
struct buf_wrap {
char buf[10];
}
struct buf_wrap Hoge() {
struct buf_wrap r;
strcpy( r.buf, "hoge" );
}

int main() {
struct buf_wrap l;
l = Hoge();
printf( "%s", l.buf );
}

スタックをたくさん消費するし、
そんなに簡潔な感じもしないのであんまりお薦めしない。
656653:2006/06/24(土) 17:02:23
>>654
出来ました
ありがとです。
657デフォルトの名無しさん:2006/06/24(土) 17:10:57
>>647
についてわからないのですが、
宣言時に初期化せずにconstした場合、そのとき
aのメモリ位置に元から入っている未知のビットが
aの定数として固定されるのではなく、
後から代入が可能なのですか?

658デフォルトの名無しさん:2006/06/24(土) 17:22:08
>657
const char *a;

char * const b;
の違い。
659@゚ν゚)ニホンゴムズカスィネー ◆FIgVQJjZb6 :2006/06/24(土) 17:23:53
コンパイラで初心者でも使いやすいのを教えてください
660デフォルトの名無しさん:2006/06/24(土) 17:31:08
質問があります。ウィンドウプログラムでツールバーを作成しました。
しかし画面を最大化するとツールバーが消えてしまいます。
ウィンドウのサイズが変更になったときの処理
 WM_SIZE: SendMessage(hTool、TB_AUTOSIZE、0、0)
もして、ツールバーにメッセージをおくっているのですが直りません。
どうしたらいいですか?
661デフォルトの名無しさん:2006/06/24(土) 18:01:01
>>659
初心者にもいろいろあるし好みもあるから、一概にこれというのは決められない。
自分で試して使いやすいのを選べ。
662デフォルトの名無しさん:2006/06/24(土) 18:10:44
初心者の質問ですいません。

純粋仮想関数の存在意味がわかりません。
仮想関数でも十分な気がするんですが。

663デフォルトの名無しさん:2006/06/24(土) 18:12:23
>>662
・派生クラスにオーバーライドを強制できる
・純粋仮想関数があるクラスはインスタンス化できなくなる
664デフォルトの名無しさん:2006/06/24(土) 18:27:16
初心者質問です。
gccでコンパイルしたライブラリーはiccからリンクすることは
可能なのでしょうか?
よろしくお願いします。
665デフォルトの名無しさん:2006/06/24(土) 19:04:20
>>664
Windows版iccはリンカにMSのLink.exeを使うんじゃなかったかな。gccはどうだっけ?
Linux版はgccでコンパイルしたと思われるライブラリを使っているから大丈夫っぽい。
#但し、C++は無理。
666デフォルトの名無しさん:2006/06/24(土) 19:21:07
LSI使ってるんですが、「Division by 0」というエラーが出ます
これはどういう意味なんでしょうか
667デフォルトの名無しさん:2006/06/24(土) 19:21:20
>>662
インターフェースのみのクラスを定義できる。
派生クラスにインターフェースを確実に継承させられる
(インターフェースの保証ができる)



668デフォルトの名無しさん:2006/06/24(土) 19:28:06
確実に実装させられる。だな。
669デフォルトの名無しさん:2006/06/24(土) 19:33:15
>>668
スマン 訂正サンクス。
670デフォルトの名無しさん:2006/06/24(土) 19:34:45
>>666
ゼロで除算が行われた。
671デフォルトの名無しさん:2006/06/24(土) 19:35:33
>>670
ありがとうございます
672デフォルトの名無しさん:2006/06/24(土) 19:38:15
>671
というかそのまま書いてあるんだから読めよ
673デフォルトの名無しさん:2006/06/24(土) 20:19:56
だから今時LSI-Cなんか使うなよ。
674デフォルトの名無しさん:2006/06/24(土) 21:46:27
#include<iostream.h>

int count=0;

int main(void){
while(1){
cout<<count;
    }
}

これをコンパイルしようとすると
「E2015'count'とSTL::count(略)の区別が曖昧」ってエラーでて、
countを別の変数に変えると通るのはどうして?
675デフォルトの名無しさん:2006/06/24(土) 21:56:25
>>674
obsoleteなC++コンパイラは窓から投げ捨てろ。
676デフォルトの名無しさん:2006/06/24(土) 22:01:57
>>675
よくわかんないけどBCC6ってポンコツなのか
677デフォルトの名無しさん:2006/06/24(土) 22:09:53
>>676=>>674
だとしたらBCCって超絶ウンコだな
678デフォルトの名無しさん:2006/06/24(土) 22:12:22
まて、bcc5.5.1ならエラーにならないぞ!
679デフォルトの名無しさん:2006/06/24(土) 22:14:05
iostream,h はもうやめとけよ
680デフォルトの名無しさん:2006/06/24(土) 22:18:13
>>676
BCCはもう5.8.2になってるから。5.6.4とかだろ?あれは失敗作と言われている。
STLportなんぞを無理に取り込もうとするからnamespace周りでバグだらけ。

5.8.2も良いとは言えないが、Dinkumwareなので上のようなエラーにはならない。
681デフォルトの名無しさん:2006/06/24(土) 22:23:32
BCCってSTL変わりまくってんだな。昔はRougeWaveだったと思ったが
682674=676:2006/06/24(土) 22:26:23
Borland c++ Builder6 ≠ BCC6?
ちょっと勘違いしてるかもしれない。
683デフォルトの名無しさん:2006/06/24(土) 22:39:27
MSNメッセのメンバーのIPアドレスを知る方法ってありますか?

ネットなプログラムを書こうとしてるんだけど、お互いが固定ではないIP
の場合、相手のIPを知る必要がありますよね。手動で相手のIPを入力する
のは手間だし、メッセのデータを使えると便利かなぁとか。
684デフォルトの名無しさん:2006/06/24(土) 22:45:23
あ、すみません、ネットワークのスレあったんでそっちに行きます^^;
685デフォルトの名無しさん:2006/06/24(土) 23:00:39
// gcc3.4.3arm
// extern unsigned int *data; // srcにdata[0]が代入される
// extern unsigned int data[]; // 意図通りに動く

void hoge()
{
void *src, *dst;
src = data;
dst = malloc(1024);
memcpy(dst, src, 1024);
}

ポインタと配列で混乱中なんだけど誰か講釈してくれ
686デフォルトの名無しさん:2006/06/24(土) 23:05:21
ポインタと配列ではなく、ポインタを理解していないと思われます
687デフォルトの名無しさん:2006/06/24(土) 23:09:16
>>685

ネタ?

688デフォルトの名無しさん:2006/06/24(土) 23:27:12
やりたい事は strdup() なわけ?
689デフォルトの名無しさん:2006/06/24(土) 23:31:01
>>685
unsigned int dataについてもっとくやしく語ってください。
690デフォルトの名無しさん:2006/06/24(土) 23:56:23
gccとvs2005で

for(i=0;i<100;i++){
fprintf(stderr, "%s\n", strerror(i));
}

こんなの実行してみて出力結果を眺めていたんですけど、
strerr(17);だと
vs2005 :Block device required
cygwin :Unknown error
でエラー内容が違っていたりします。
別にエラーとして出力される内容が違っているのは問題ないんですが、
c言語では、エラーが起きるかもしれない標準関数を実行し、エラーが
起きた場合のエラー定数ってマクロ定義されていないんでしょうか?
もしも、マクロ定義されている場合、どこを調べるといいんでしょうか?
691デフォルトの名無しさん:2006/06/25(日) 00:06:12
>>690
ほんとにcygwinでerrno=17がそのエラーか?
ってのは置いといて、<errno.h>を見ればわかる。もちろんerrno.hが何かを
インクルードしてたら、それも見るんだぞ。
cygwinの場合は、/usr/include/errno.hだ。
692685:2006/06/25(日) 00:13:27
>>689
別ファイルでグローバル変数として初期化してます。
unsigned int data[] = {1,2,3,4,以下省略};
693デフォルトの名無しさん:2006/06/25(日) 00:13:38
>>690
ANSI-CではEDOMとERANGEが決まってる

それ以外はPOSIXとかX/OPENとかなんかでも決まりがある
はっきり言って統一されていないが、過去の互換性とかあるので仕方が無い
694デフォルトの名無しさん:2006/06/25(日) 00:17:17
ポインタは配列じゃないもんよ。
695689:2006/06/25(日) 00:41:59
>>685
んなら挙動は同じ。
src[0]でけでなくsrc[1]も見てみな。デバガでメモリを参照するといい。
>>686の言うとおりポインタを理解していないと思われる。

「配列はポインタのシンタックスシュガーなんだよ!」
こう語れるぐらい勉強してください。
696デフォルトの名無しさん:2006/06/25(日) 00:56:47
error = 15でした。

マクロ定義だけでも統一してくれればいいのに・・・
コンパイラ屋はマクロ定義をマクロ定義すればいいだけだからそんなに手間はかからないだろうに。

エラー処理は移植性を考慮できないじゃん。
697デフォルトの名無しさん:2006/06/25(日) 01:10:53
>>695
> 「配列はポインタのシンタックスシュガーなんだよ!」

それだとポインタがあれば配列が必要ないような言い方だが、
配列なしにはメモリ上で連続したオブジェクトの集合を表現できないよ。
698デフォルトの名無しさん:2006/06/25(日) 01:19:38
シューガーベーィビらーぶ
699660:2006/06/25(日) 01:23:54
事故解決しました。
700デフォルトの名無しさん:2006/06/25(日) 01:29:30
配列があればポインタは必要ない
701デフォルトの名無しさん:2006/06/25(日) 01:33:49
どっちもイラネ
702685:2006/06/25(日) 02:08:50
-- abc.c --
int data_ary[] = {1,2,3,4};
int data_ptr[] = {5,6,7,8};

-- xyz.c ---
extern int *data_ptr;
extern int data_ary[];
int *src;
int ary[] = {9,10,11,12};
src = ary; // こういう書き方が出来るので
src = data_ptr; // これもOKだと思ってた
src = data_ary; // こっちはOK

解決できました。
みなさんありがとうございました。
703デフォルトの名無しさん:2006/06/25(日) 03:11:35
関数から配列とその要素数の二つの戻り値をとりたくて、
複数の戻り値を返すには仮引数を使うところは分かったんですが…。

void func(int **array, int *number);

int main(void)
{
int *array, number;
func(&array, &number);
(処理...)
return 0;
}

void func(int **array, int *number)
{
int data[50], data_number;
(処理...)
*array = data;
*number = data_number;
}

配列を返したい時に、これでいいのかちょっと自信がありません。
コンパイラは通るので間違ってはいないと思うのですが、なにか改良点などあるでしょうか?
704デフォルトの名無しさん:2006/06/25(日) 03:19:48
>>703
初心者がよくやる間違い。
関数から抜けた時点ですでに開放されている領域(スタック上に確保された配列)を
ポイントしているので、領域内のデータは保証されない。
705703:2006/06/25(日) 03:34:55
あー…。
ではint data[50]をstatic変数にするか、グローバル変数にすればよいってことですか?
static変数やグローバル変数を使わずに配列を戻り値としてとる方法は無いでしょうか。
706デフォルトの名無しさん:2006/06/25(日) 03:44:23
C++でstd::vectorを使う。
707デフォルトの名無しさん:2006/06/25(日) 03:49:58
>>705
> あー…。
> ではint data[50]をstatic変数にするか、グローバル変数にすればよいってことですか?
そうです。

> static変数やグローバル変数を使わずに配列を戻り値としてとる方法は無いでしょうか。
ある。
708デフォルトの名無しさん:2006/06/25(日) 10:55:02
解りやすさ考えたら配列のポインタにした方が良いんじゃない?
と斜め上の回答もしてみる
709デフォルトの名無しさん:2006/06/25(日) 13:23:12
スコープが違うポインタだけコピーしてもしゃあない。
引き渡したバッファにデータを設定したいなら中身をコピーせんと。
710デフォルトの名無しさん:2006/06/25(日) 15:38:00
C言語とC++の日本語リファレンス(JavaのAPIリファレンスやPHPのPHPマニュアルのような、関数やクラスの一覧など)はどこで読めますか?
検索しても個人のサイトゆか見つからず、そのようなサイトは一部の関数等の説明が省かれてしまっています。
MSDNには英語のものしか見つかりませんでした。
711デフォルトの名無しさん:2006/06/25(日) 15:40:42
>>710
読むだけなら、JISでいけるが。
ttp://www.jisc.go.jp/
712711:2006/06/25(日) 15:43:33
でも正直言って、英語読みたくねー日本語よこせとかいうレベルで、
規格書はお勧めしないが。
>>710が規格書を必要としているとは思えない。
713デフォルトの名無しさん:2006/06/25(日) 15:57:06
これもまた完璧ではないけれど。
http://pc8.2ch.net/test/read.cgi/tech/1149427282/289-290n
714デフォルトの名無しさん:2006/06/25(日) 16:12:42
>>710
API一覧ならMSDNにも日本語でついてるよ
構造体とメッセージは英語だけど
715703:2006/06/25(日) 19:46:28
>>709
中身をコピーするにはどうしたらいいのでしょうか?
716デフォルトの名無しさん:2006/06/25(日) 19:48:00
memcpy strcpy
717デフォルトの名無しさん:2006/06/25(日) 20:02:50
>>715
(*array)[0] = data[0];
(*array)[1] = data[1];
以下略
718京大生www:2006/06/26(月) 19:37:34
課題をやってる途中です。

int compare (char *s1, char *s2) {
int i;
char new_s1[20];
for (i=0; i<20; i++) {
new_s1[20] = toupper(s1[i]);
}
return strcmp(new_s1, s2);
}
strcmpの進化版みたいのを作ったつもりですがうまく作動しません。
どこが間違っているのでしょうか?

ちなみにここで使います。見てのようにどうせ小文字しかないのでstrcmpで代用したらうまく動きました。
上のはどこが間違っているのでしょうか。
void search_record(word *eng, int current_num, char *search_string){
int i;
int count=0;
for (i=0; i<current_num; i++){
if(strcmp(eng[i].spelling, search_string)==0) {
printf("%s\n", eng[i].spelling);
count += 1;
}
}
printf("以上%d件がヒットしました", count);
}
719スミたん ◆JnsvZNFyHU :2006/06/26(月) 19:54:41

環境はbcc32です。
720デフォルトの名無しさん:2006/06/26(月) 20:05:13
>>718
おそらくforの中のこれ。
> new_s1[20] = toupper(s1[i]);
new_s1[i]だろ、きっと。
けど、そのcompareではs1に19文字以上の文字列を渡せない。
ループまわして1文字ずつ比較するようにしようよ、strcmp使わないで。

もっとも、英字の大小を区別せずに比較したいだけなら、
だいたいstricmpとかstrcmpiとかそういう名前の関数が
処理系独自に用意されていることが多い。
721京大生www:2006/06/26(月) 20:10:11
本当だ、ありがとう。
ちとやってエラーでたら報告する
722京大生www:2006/06/26(月) 20:14:34
えっと比べる先がchar [20]だから問題がない。
しかし直したにも関わらず
compare("unko", "unko")で-32という意味不明な値を返してきた。
鬱になる、これさえ通せば終わりなのに・・・何が間違ってるんだぁ
723京大生www:2006/06/26(月) 20:16:00
あと、課題なので小文字で比較する関数を作りやがれと申しております。
そういう便利な関数があるとは知らなかったが、使っちゃダメなんだろうな〜あくまでも課題だから
724デフォルトの名無しさん:2006/06/26(月) 20:16:33
man strcmp
725デフォルトの名無しさん:2006/06/26(月) 20:20:37
小文字でなのにtoupperか!
大文字小文字区別しないなら、引数の両方を統一してやらないと意味無いのでは?
726京大生www:2006/06/26(月) 20:44:07
検索にかけるワードは小文字で打てといってあります。
かけられるワード(配列)は全部小文字なのですが、課題では例えそれが大文字であってもよいようにしろという意図が含まれています。

ああああああああああああああああ
toupperじゃなくてtolowerじゃねーか。やってみよ
727京大生www:2006/06/26(月) 20:46:57
ビンゴー!!!!!
全部解決、ありがとございますた!!!!
728デフォルトの名無しさん:2006/06/26(月) 20:59:29
>>551
魔美ちゃんありがとう!
729デフォルトの名無しさん:2006/06/26(月) 21:38:59
>>716-717
あーなるほど。亀レスですが、ありがとうございました。
730デフォルトの名無しさん:2006/06/26(月) 22:33:59
京大生の評判を落とそうとしているやつがいる…
731デフォルトの名無しさん:2006/06/26(月) 23:32:53
ギャングスター大学というイメージしかないんですが
732デフォルトの名無しさん:2006/06/26(月) 23:40:59
それはそれは貧困なイマジネーションだこと
733デフォルトの名無しさん:2006/06/27(火) 00:56:13
純粋仮想関数をつける/つけない
をみなさんはどのように考えていますか?

経験不足なのか、私にはいまいちわかりません。
734デフォルトの名無しさん:2006/06/27(火) 01:00:27
どのように考えるも何も、必要なら付ける・必要ないなら付けない
それだけだ。
735デフォルトの名無しさん:2006/06/27(火) 01:00:27
>>733
質問の意味がわかりません。
736703:2006/06/27(火) 01:28:10
>>716-717の方法でやってみたのですが、どうもうまくいきません。
>>703のコードのvoid funcを
void func(int **array, int *number)
{
int data[50], data_number, i;
(処理...)
for(i = 0, i < data_number; i++) {
(*array)[i] = data[i];
}
*number = data_number;
}
に変えたり、forの部分をmemcpy(*array, data, sizeof(data));とかにしてみましたが
うまくいきませんでした(コンパイラは通る)

どう修正すればいいのでしょうか…。
737デフォルトの名無しさん:2006/06/27(火) 01:45:35
>>736
それだけじゃエスパーしかわからんから、ソース丸ごとどっかに上げてみ。
738デフォルトの名無しさん:2006/06/27(火) 01:50:07
>>736
-void func(int **array, int *number)
+void func(int *array, int *number)

-(*array)[i] = data[i];
+array[i] = data[i];
739738:2006/06/27(火) 01:54:04
int **array だと、int へのポインタへのポインタになる。
int配列へのポインタなら配列の先頭アドレスを渡せば
配列全体の変更ができる。
740738:2006/06/27(火) 02:12:35
>>736 のままでも以下の様に呼び出せば、OKだが、無駄。

int a[50];
int *b=a;
int cnt;
func(&b, &cnt);


>>738 なら
func(a, &cnt);
で呼び出せる。
741703=736:2006/06/27(火) 02:39:47
void func(int *array, int *number);

int main(void)
{
int *array_data, number;
func(array_data, &number);
(array_dataを表示する処理など...)
return 0;
}

void func(int *array, int *number)
{
int data[50], data_number, i;
(50個以下で入力したデータをdataに格納する処理など...)
//data_numberはdataに格納されてるデータの個数です
for(i = 0, i < data_number; i++) array[i] = data[i];
*number = data_number;
}

こうすると、値が割り当てられていないローカルな変数array_dataに対して参照が行われたとエラーがでます。
func(array_data, &number);の前にmallocするとか、あらかじめarray_data[50];とかって
領域を確保しておけばエラーはでないのですが、void func()内で得たデータ分だけの領域を
確保したいのです。
742デフォルトの名無しさん:2006/06/27(火) 02:52:07
>>741
それは無理だ。
必要領域の大きさを返す関数を先に呼ぶか、
充分な領域を用意するか、
可変長の構造を持つクラスのオブジェクトを渡すか
のどれかでないと。
743742:2006/06/27(火) 03:07:12
WinAPIなんかだと、NULLを渡すとsizeだけ返すのがあるから、
その方式でいけば、

#define NULL 0
int main(void)
{
int *array_data, number;

func(NULL,&number);
array = (int*)malloc(number*sizeof(int));
func(array_data, &number);
(array_dataを表示する処理など...)
free(array);
return 0;
}

void func(int *array, int *number)
{
int data[50], data_number, i;
(50個以下で入力したデータをdataに格納する処理など...)
//data_numberはdataに格納されてるデータの個数です
if(array !=NULL)
for(i = 0, i < data_number; i++) array[i] = data[i];
*number = data_number;
}
744デフォルトの名無しさん:2006/06/27(火) 10:38:54
>>743
func()を二度呼んでもコストが掛からない状況にしか使えないね。
>>741
エラー処理省略でこんな感じじゃね?
int main()
{
int ** array, number;
func(& array, & number);
...;
free(array);
return 0;
}
void func(int ** array, int * number)
{
int tNumber = 件数;
int * tArrray = malloc(sizeof(int) * tNumber);
for (int i = 0; i < 件数; ++i) {
tArray[i] = データ[i];
}
* array = tArray;
* number = tNumber;
}
まぁ、件数は戻り値でもいい気がするけどね。
745デフォルトの名無しさん:2006/06/27(火) 18:40:16
グローバル領域で構造体を宣言してグローバル領域やウィンドウプロシージャ関数の先頭で構造体内のデータをセットすると正常に動作するんだが、
ウィンドウプロシージャ関数の先頭で構造体を宣言してウィンドウプロシージャ内で構造体内のデータをセットしたら動作がおかしくなります。なにが原因なのですか?


746デフォルトの名無しさん:2006/06/27(火) 19:01:38
スタックヤバスな予感
747デフォルトの名無しさん:2006/06/27(火) 19:05:39
その構造体の参照位置によるんじゃないかな
748デフォルトの名無しさん:2006/06/27(火) 19:10:14
質問です
inline int f(int i)
{
static const int a[] = {...};
return a[i];
}
という風に書いた場合,どういう風に展開されるのでしょう?
a[]は1つだけ確保されるのでしょうか?
749デフォルトの名無しさん:2006/06/27(火) 19:34:38
どこかに静的に確保されるだろ。たぶん
賢いコンパイラなら定数に展開するかも。たぶん
750デフォルトの名無しさん:2006/06/27(火) 19:35:08
定数はさすがに無理か
751デフォルトの名無しさん:2006/06/27(火) 19:43:53
iの範囲チェックを厳密に行なっていれば定数になる可能性はあるよ。
それはさておき、inline関数はstatic inlineにする方が無難だと思うのだが。
752745:2006/06/27(火) 20:06:15
>>747


すいません説明不足でした

Aという構造体とCという構造体ををウィンドウプロシージャ内の先頭で宣言して、宣言直後にAとCの構造体

に、データをセットすると、Aはのデータは正常ですがCのデータだけがおかしくなるので

参照位置はあんまり関係なあいとおもいます

753デフォルトの名無しさん:2006/06/27(火) 20:10:42
>>752
その構造体の定義とウィンドウプロシージャを晒して味噌。
#十中八九、バッファオーバランだろうけど。
754デフォルトの名無しさん:2006/06/27(火) 20:32:11
>>751
fをstaticにすべきかはfがどこでどう使われているかに拠るだろ。
そんな一概に言えることか?
755デフォルトの名無しさん:2006/06/27(火) 20:38:41
exportが実装されていたり、iccのようなオブジェクト間最適化を具えたコンパイラでもない限り、
コンパイル単位内にないとインライン展開できないから事実上、staticでもいいかもね。
756デフォルトの名無しさん:2006/06/27(火) 20:49:37
forループの利点がいまいち分からないです。
int main(void)
{
int i;
for(i=0; i < 100; i++) printf("%d\n", i);
return 0;
}
よりも、

int main(void)
{
int i = 0;
while(i < 100) printf("%d\n", i++);
return 0;
}
の方がやってることが少なくて良いように素人目では思えてしまうのですが…。
757デフォルトの名無しさん:2006/06/27(火) 20:53:00
forは初期化、終了判定、カウンタインクリメント
がセットで記述できるので、書き忘れがない

といいな
758デフォルトの名無しさん:2006/06/27(火) 20:59:10
748ですレスありがとうございます

>751 >754 >755 さん
fはヘッダで定義してグローバルな関数として使っています。
参照回数が多いのでどのような扱いになっているのか気になり質問した次第です。
staticにすると何が起こるのでしょうか?
各ソース毎に関数が定義されてa[]が複数確保されそうな印象を受けるのですが
配列は1つだけになるのでしょうか?
( 実際のところ速度重視でサイズはあまり気にしていないのですけれども。)

元々は下の様な形になっていたのですがもし良い方法があればご教示ください。
if( i < a0) return 0;
if( i < a1) return 1;
:
if( i < a8) return 8;
else assert(0);
759デフォルトの名無しさん:2006/06/27(火) 21:05:34
>756 さん
for(i=0; i < 100; i++) ...
と書いてあればたいていの人が100回繰り返すことを一目で分かってくれるのでよいかもしれません。
c++では
for(int i=0; i<100; i++) ...
と書けるようになってループ変数のスコープがfor文の中だけでおさまるのが嬉しいこともあります。
760デフォルトの名無しさん:2006/06/27(火) 21:06:26
初心者の俺が答えてみる。

forなら宣言と初期化とインクリメントと判定が1セットだし、
iのスコープが限定されるのでわかりやすいです。

for(int i=0;i<100;++i)と書くのがセオリーです。

これであってる?
761デフォルトの名無しさん:2006/06/27(火) 21:08:21
C言語の言語仕様ってどこかで手に入りませんか?
762デフォルトの名無しさん:2006/06/27(火) 21:11:38
ISOとかJISとか

適当にK&R読むとか
763デフォルトの名無しさん:2006/06/27(火) 21:14:51
>printf("%d\n", i++);
この書き方って大丈夫なんだっけ?
764デフォルトの名無しさん:2006/06/27(火) 21:22:54
>>763 大丈夫でしょ
765デフォルトの名無しさん:2006/06/27(火) 21:33:20
ひとつならだいじょうぶ
766デフォルトの名無しさん:2006/06/27(火) 22:17:50
>>762
JIS仕様ってどこで手に入るか?
767デフォルトの名無しさん:2006/06/27(火) 22:27:23
ttp://www.jisc.go.jp/
ここで規格番号「X3010」で検索すれば見れる
スキャンしただけの画像だから見難いし検索も出来ないけど
768756:2006/06/27(火) 22:41:01
>>759
へえ、C++ではそういう機能があるんですか。まだCしか勉強していないので知りませんでした。

効率的な部分は良く分からないんですが、
>>756のような場合だとwhileよりforの方が見た目に分かりやすくて良いということですか。
769デフォルトの名無しさん:2006/06/27(火) 22:49:25
C99でも可能
770デフォルトの名無しさん:2006/06/27(火) 22:56:39
>>768
インデックス増やすだけとか単純な処理ならforのほうが良く使う
whileだとうっかりi++を書き忘れて「あれ、ばぐった」ということがよくある、すぐ気づくけど
771デフォルトの名無しさん:2006/06/27(火) 23:09:53
C++を「インラインと参照仮引数とテンプレートが使えるC」として使っている今日この頃
772デフォルトの名無しさん:2006/06/27(火) 23:26:51
Cってinline使えなかったのか。今まで普通に使ってた。
773デフォルトの名無しさん:2006/06/27(火) 23:28:01
>>771
STLは怖くないよ。
774デフォルトの名無しさん:2006/06/27(火) 23:31:57
boostはちょっと怖いよ
775デフォルトの名無しさん:2006/06/27(火) 23:42:05
ソース見るのは怖いな。
使うのはそれほど怖くないけど。
776デフォルトの名無しさん:2006/06/27(火) 23:58:33
boost::MPLは目が潰れる。
逆にenable_ifは拍子抜けした。
777デフォルトの名無しさん:2006/06/28(水) 01:02:57
みんな、ライブラリのソースって読む?
778デフォルトの名無しさん:2006/06/28(水) 01:04:21
自分ならどう実装するか脳内でちょろんと考えてみて
思いつかなかったら読んで勉強する
もちろん暇な時に限るけど
779745:2006/06/28(水) 02:58:25
>>753 お願いします
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )  //ウィンドウプロシージャ
{
TBBUTTONtbb[5];//ツールバーを表示させたい しかしこれが悪の元凶でプロシージャに持ってきただけで動かなくなる
//グローバル領域で宣言するとまともに表示されるが、プロシージャで宣言すると表示が無茶苦茶になる
INITCOMMONCONTROLSEXcc;
   tbb[0].iBitmap = 0;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = BTNS_BUTTON;
tbb[1].iBitmap = 1;
tbb[1].fsState = TBSTATE_ENABLED;
tbb[1].fsStyle = BTNS_BUTTON;
tbb[2].iBitmap = 2;
tbb[2].fsState = TBSTATE_ENABLED;
tbb[2].fsStyle = BTNS_BUTTON;
tbb[3].iBitmap = STD_FILENEW;
tbb[3].fsState = TBSTATE_ENABLED;
tbb[3].fsStyle = BTNS_BUTTON;
tbb[4].iBitmap = STD_CUT;
tbb[4].fsState = TBSTATE_ENABLED;
tbb[4].fsStyle = BTNS_BUTTON;
staticHWNDhTool;
780745:2006/06/28(水) 02:59:21
(続き)

switch ( msg ){
case WM_CREATE:
cc.dwSize = sizeof(INITCOMMONCONTROLSEX);
  cc.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx(&cc);
hTool = CreateToolbarEx(hwnd, WS_CHILD | WS_VISIBLE , ID_TOOLBAR, 3 ,
hInst,
IDR_TOOLBAR1, tbb, 3, 0, 0, 0, 0,sizeof(TBBUTTON));
tb.hInst = HINST_COMMCTRL;
tb.nID = IDB_STD_SMALL_COLOR;
tb= SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tb);
            break;0
781デフォルトの名無しさん:2006/06/28(水) 02:59:30
>>779
= {0} で初期化してみ。
782745:2006/06/28(水) 03:48:57
>>781
TBBUTTONtbb[] = {
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
};
で初期化してデータをセットしなおすと表示できました!!ありがとうございます!!

でも、どうして全部0で初期化したら表示できるという発想がおもいついたのですか?
普通そんなこと思いつかないと思うんだけど・・・

783デフォルトの名無しさん:2006/06/28(水) 03:50:33
>>782
グローバルに置いた変数は = {0} と同じように初期化される。
関数ローカルに置いたときは初期化しないとゴミが入ってる。
784745:2006/06/28(水) 04:34:58
>>783
   tbb[0].iBitmap = 0;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = BTNS_BUTTON;
のように書いたら、すでに初期化されていると思うのですがどうしていけないの?
785デフォルトの名無しさん:2006/06/28(水) 04:53:29
>>784
TBBUTTON には他にもメンバがあるだろ。
786デフォルトの名無しさん:2006/06/28(水) 05:30:02
質問です。以下のソースをコンパイルすると、A::xが見つからないというリンク時
のエラーになってしまいます。どうしてなのでしょうか。
static intで宣言した変数は、インスタンスを作成しなくても使えると思ったのですが。

gcc.exe (GCC) 3.4.2 (mingw-special)です。

#include <iostream>
class A{
static int x;
public:
static int get_x();
static void set_x(int m_x);
};
int A::get_x(){
return x;
}
void A::set_x(int m_x){
x=m_x;
}
int main(){
A::set_x(5);
std::cout << A::get_x() << std::endl;
}
787745:2006/06/28(水) 05:49:30
>>785
ええ?最初の4つの引数だけじゃなかったんですか?
今回は表示させるだけで2番目は必要ないし・・・
788デフォルトの名無しさん:2006/06/28(水) 07:29:50
>>786
クラスの静的変数は、クラスの宣言内で宣言するだけでなく、
どこかでint A::x;のように定義しないといけない。
ちょうど、グローバル変数をヘッダに宣言して、どこかで定義するのと同じ。
789デフォルトの名無しさん:2006/06/28(水) 08:35:50
>>787
API に渡して使ってるんだから、 API の中では使われるんだろ。
さっと Google で調べると bReserved は 0 固定にする必要があるらしい。
790745:2006/06/28(水) 17:08:44
>>789 ありがとー
791デフォルトの名無しさん:2006/06/28(水) 19:11:32
質問です。
C++のvectorは、JavaのVectorと違って、インスタンスをコピーして
登録するのでしょうか?

vector<string> vec;
vec.clear();
string foo = "ふー!";
vec.push_back(foo);
cout << (&vec[0] == &foo) << endl;

=> 0

こうして見ると、どうもアドレスは違うようで、コピーされているようです。

コピーされるという推測がが正しいとしたら、どうしたらコピーなしで
登録が出来るのでしょうか?
792デフォルトの名無しさん:2006/06/28(水) 19:15:53
>>791
ポインタを登録する
793デフォルトの名無しさん:2006/06/28(水) 19:18:24
vector<string*>
794791:2006/06/28(水) 19:22:03
ありがとうございます。

vector<string*> vec2;
vec2.clear();
vec2.push_back(&foo);

cout << (*vec2[0] == foo) << endl;
=> 1
cout << (vec2[0] == &foo) << endl;
=> 1
cout << *vec2[0] << endl;
=> ふー!

確かに意図どおりに動きました。

しかし、vector#push_back()はconst <T>& を引数に取るので、
私はてっきり、渡したインスタンスがそのまま登録されると思っていました。
そのままか、コピーなのか、見分ける方法はないのでしょうか?
795791:2006/06/28(水) 19:24:24
ちょっと日本語が変なので、書き直します。
各種コンテナにインスタンスを登録する場合、それがそのままなのか、コピーなのか、
コンテナやそのメソッドによって違うのでしょうか?
もし違うとしたら、どうやって見分ければ良いでしょうか?
796デフォルトの名無しさん:2006/06/28(水) 19:24:47
>>794
コンテナは基本的に全て値ベースのコピー。
引数が参照型なのは効率化のため。
797791:2006/06/28(水) 19:27:26
>>796
ありがとうございます。
すべてデフォルトでコピーとは驚きました。Javaとはまったく逆です。
巨大なオブジェクトを登録するときなど、気をつけなければいけませんね。
798デフォルトの名無しさん:2006/06/28(水) 19:30:32
Javaと逆というか、Javaでは参照での登録“しかできない”というだけかと
799791:2006/06/28(水) 19:31:50
>>798
そのとおりですね。失礼しました。
800デフォルトの名無しさん:2006/06/28(水) 20:58:25
>>788
な。なるほど・・・・。
たしかにそうじゃないとクラス宣言をincludeしたときにつじつまが
合わなくなってしまいますね・・・。ありがとうございました。
801デフォルトの名無しさん:2006/06/28(水) 21:09:45
読み込みファイルのendianをlittleからbigに簡単に変換するには
(コンパイルオプション等で)どうしたら良いのでしょうか?

コンパイラーはiccです。
ほとんどCに馴染みがなく、非常に単純な質問で申し訳ないのですが、
どなたかよろしくお願いします。
802デフォルトの名無しさん:2006/06/28(水) 21:31:16
>>801
Windows, Linux, Unix, MacOS など殆どの OS でファイルは
単なるバイトストリームであって、エンディアンを持ちません。
803デフォルトの名無しさん:2006/06/28(水) 21:48:52
大学のC言語の授業で「ソートについてテーマを決めて研究しレポートせよ」という課題が出ています。
例として与えられているのは「クイックソートを再帰を使った場合と、ループで実装してしまう場合との速度差」
だとか「○○ソート(マイナーなヤツ)について調べる」とか、せいぜいそんなレベルです。
大体C言語はわかっている俺は他と差を付けたいのですが、研究テーマが思いつきません。
それが公に結果が明らかであるか否かなど問いません、なにかいいテーマないでしょうか?
804デフォルトの名無しさん:2006/06/28(水) 21:50:02
>>803
新しいソートアルゴリズムを開発する
805デフォルトの名無しさん:2006/06/28(水) 21:53:15
>>803
良いPCもってるなら、
SMTやマルチコア向けのparallel sortなんかどう?
並列度を増やした場合の性能向上度合いとか。
806デフォルトの名無しさん:2006/06/28(水) 21:59:17
他と差を付けたいと言いながら人に頼る姿勢はどうかと思うが
807質問者:2006/06/28(水) 22:15:42
>>806 のおっしゃるとおりだと思ったので、自分で考えたいと思います。
808デフォルトの名無しさん:2006/06/28(水) 22:19:30
>>807
出典は全部書けよ

【初心者歓迎】C/C++室 Ver.28【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1149815331/
809デフォルトの名無しさん:2006/06/28(水) 22:36:04
>>801
コンパイルオプションではないが
swab
使うとか
810デフォルトの名無しさん:2006/06/28(水) 23:02:28
>>797
ちなみにポインタ・参照ベースのコンテナが欲しければ、boost::ptr_vectorなんかがある。
811笹井奈琴:2006/06/29(木) 03:14:31
データを一回スキャンして、最適なソートアルゴリズムを決定するアルゴリズムを考えてみるといいかもしれない。
そのアルゴリズムがO(n)だったら、割と役に立つような気もする。
812デフォルトの名無しさん:2006/06/29(木) 10:30:26
1から10までの積(10の階乗 10!)を求めるプログラムを作成しなさい。
 なお、階乗計算において、いくつを超えるとオーバーフロー(桁あふれ)が発生するか、調べなさい。
この問題がわからないんだがだれかおしえてくれ
813デフォルトの名無しさん:2006/06/29(木) 10:43:19
スレ違い
814デフォルトの名無しさん:2006/06/29(木) 10:46:48
>>812
さんすうを べんきょう しましょう
815デフォルトの名無しさん:2006/06/29(木) 14:20:44
1万字程度の英文を入力データにしたいんですが、ネットにある文章をtxtに貼り付けて、改行コードをCRのみにしないとならないんです。
そのやりかたを教えて下さい
816デフォルトの名無しさん:2006/06/29(木) 14:41:17
気の利いたエディタを使う
817デフォルトの名無しさん:2006/06/29(木) 15:17:58
>>815
どこがC/C++の質問なのか?
818デフォルトの名無しさん:2006/06/29(木) 16:48:59
F2C - A FORTRAN to C translator
これの使い方がわからないのですが、どなたか教えてください。
819デフォルトの名無しさん:2006/06/29(木) 17:06:36
char a[100];
double d=10.5;

TextOut(HDC ,0 ,0 ,a
,wsprintf(a ,"d:%2.5f\n" ,d) );

このプログラムをC++.Netに入力しても表示されないのですが
どこが間違っているのでしょうか?
よろしくお願いします。
820ネタ:2006/06/29(木) 17:09:46
>>819
キーボードが壊れているようなので取り替えろ。
今すぐ必要なら、マウスを右クリックしてコピペ。
821デフォルトの名無しさん:2006/06/29(木) 17:13:23
本気?
822デフォルトの名無しさん:2006/06/29(木) 17:17:04
>>819
C++.Netうごく環境ないから適当なこと書くけど、
分解してうまくいくならコンパイラが変なのでは?
823デフォルトの名無しさん:2006/06/29(木) 17:19:05
824819:2006/06/29(木) 17:39:22
申し訳ないです。
読みましたがわからないです。
どこが悪いのでしょうか?
825デフォルトの名無しさん:2006/06/29(木) 18:06:28
>>819
HDCとはcharやdoubleのような型であって変数そのものではない。
TextOutの最初の引数にはHDC型の変数か何かを渡す必要がある。
適切なHDCを得る関数も、MSDNには書いてある。
82680:2006/06/29(木) 18:23:16
827デフォルトの名無しさん:2006/06/29(木) 18:26:24
>>826
本当です。
828819:2006/06/29(木) 18:27:04
書き方が悪かったみたいで申し訳ないです。
HDCのところは HDC hdc というように宣言してから、
GetDCを用いて行っていますので間違ってないと思います。
829デフォルトの名無しさん:2006/06/29(木) 18:32:08
#include<stdio.h>
#include<stdlib.h>
int charcmp(const void* a,const void* b){return *(const char*)a-*(const char*)b;}
int main(void){char tmp[100];int len;fgets(tmp,sizeof(tmp),stdin);len=strlen(tmp);
tmp[--len]='\0';qsort(tmp,len,sizeof(char),charcmp);
printf("%s\n",tmp);return 0;}

文字列をASCIIコード順に並び替えるプログラムなんですが、qsortっていうのがどこから出てくるのかわかりません。
教えて下さい
830デフォルトの名無しさん:2006/06/29(木) 18:35:48
>>829
質問の意味がよくわからないけど、stdlib.hで宣言されている、Cの標準ライブラリ関数、
と答えてみる。
831デフォルトの名無しさん:2006/06/29(木) 18:36:08
stdio.h
832デフォルトの名無しさん:2006/06/29(木) 18:36:18
stdlib.hじゃないの?
833デフォルトの名無しさん:2006/06/29(木) 18:38:09
>>830
そういうことなんですね。ありがとうございます

このプログラムをポインタを使わないで書くことってできますか?
834デフォルトの名無しさん:2006/06/29(木) 18:39:23
はあ?
835デフォルトの名無しさん:2006/06/29(木) 18:43:19
あとtmp[--len]='\0'の操作って意味あるんでしょうか?
836デフォルトの名無しさん:2006/06/29(木) 18:46:19 BE:11646623-#
意味がないと思ったら削除して実行結果を比べてみりゃいいだろ。
837デフォルトの名無しさん:2006/06/29(木) 18:48:38
http://pc8.2ch.net/test/read.cgi/tech/1151158759/456
断った奴がしゃしゃり出てきてレスすんなよ、黙ってろ
838デフォルトの名無しさん:2006/06/29(木) 18:50:34
>>836
変わらないですね。でもどっかでおかしくなるのかなとおもいました
839デフォルトの名無しさん:2006/06/29(木) 18:54:26 BE:69877049-#
>>838
変わらないように見えるなら今すぐ病院へGO!
840デフォルトの名無しさん:2006/06/29(木) 19:14:48
AのようなプログラムをBのように書きかえたいのですが、何か方法はありますか?

//A
while(1){
scanf("%d",&a);
printf("%d",a);
}

//B
WHILE
scanf("%d",&a);
printf("%d",a);
841デフォルトの名無しさん:2006/06/29(木) 19:18:16 BE:62112948-#
無い。
842デフォルトの名無しさん:2006/06/29(木) 19:18:56
WHILE
a;
b;
c;
以下略

どこまでループするかどうやって判断するんだ
843デフォルトの名無しさん:2006/06/29(木) 19:23:58
>>826
ええー…。衝撃…。
844デフォルトの名無しさん:2006/06/29(木) 19:27:09
>>826
これまた随分と懐かしいネタだなぁ。
845デフォルトの名無しさん:2006/06/29(木) 19:30:16
>>826
当時ならわりと釣れたかもしれないなあ
846デフォルトの名無しさん:2006/06/29(木) 19:36:31
>>841-842
確かにそうですね、どうもありがとうございました
847デフォルトの名無しさん:2006/06/29(木) 19:38:54 BE:34939229-#
fjでしばらく釣れてた記憶がある。
真相はこちら。
http://www.research.att.com/~bs/bs_faq.html#IEEE
848デフォルトの名無しさん:2006/06/29(木) 20:29:22
コールバック関数から、クラスメンバのvectorにもらった値って追加できないですか?
エラーの意味がわからんので教えてください。

class Hoge {
  vector<HWND> hWnds;
 ・
 ・
 ・
VOID Hoge::EnumStart() {
  EnumWindows(Hoge::EnumWindowProc, (LPARAM)this);
}
BOOL CALLBACK Hoge::EnumWindowProc(HWND hWnd, LPARAM lPram) {
  Hoge* hoge = (Hoge*)((LPCREATESTRUCT)lParam)->lpCreateParams;
  hoge->hWnds.push_back(hWnd);
}

push_backで落ちます
849デフォルトの名無しさん:2006/06/29(木) 20:34:54
lParamってthisでしょ。
850デフォルトの名無しさん:2006/06/29(木) 20:42:02
ありがと。たすかった。まじで、うれしい。
Hoge* hoge = (Hoge*)lParam;
でなおった。
いみわからずやってた私があふぉでした。
851デフォルトの名無しさん:2006/06/29(木) 21:25:41
>>850
そこreinterpret_cast
852デフォルトの名無しさん:2006/06/29(木) 21:39:08
MSDN見てないんかな
853デフォルトの名無しさん:2006/06/29(木) 23:07:59
>>824
そもそもwsprintfではdoubleは扱えない。書式指定子の型指定子にfなんてないだろ。
854デフォルトの名無しさん:2006/06/30(金) 00:16:33
Javaを長いことやってたらC++が良くわからなくなったよ。
855デフォルトの名無しさん:2006/06/30(金) 00:36:31
C言語でWindowsAPIを使ってます。VC6.0でWindows Apilicationでワークスペースを作成しました。
WinMain()でDialogBoxParam()でダイアログを表示し、OKボタンを押したら終了するプログラムを作りました。
ダイアログプロシージャでOKボタン押したらEndDialog()を呼ぶようにしたわけです。
WinMainはループ処理をしています。(SleepとかPeekMessageを使ってます)

さて質問なのですが、ダイアログを表示する前と表示後で、タスクマネージャで見ていると、
ハンドルが10個くらい増えます。
EndDialog()でダイアログを終了しても、このハンドルが減りません。
これってハンドルリークというやつだと思うのですが、このDialogBoxParam()で起動したダイアログの
ハンドルを解放するにはどうやるのでしょうか?
856デフォルトの名無しさん:2006/06/30(金) 09:30:11
そんなものは無い。システム側が裏で何かしてるだけだから気にするな。
あと、モーダルダイアログなのに、なんでループ処理してるの?
857855:2006/06/30(金) 09:58:51
ほんとはもっとでっかいプログラムで、ダイアログもサブスレッドで表示してたんです。
ある日タスクマネージャでハンドル数をチェックしてたら、あるタイミングで10個くらい増えたのを発見。
そのタイミングがダイアログ表示とわかり、原因特定のため855のようなプログラムを組んだわけです。
ループにしてるのはループにしないとプログラムがすぐ終了して、もしのちのちハンドルが解放されてもわからないからです。

でも気にしなくてよかったんですね。
858デフォルトの名無しさん:2006/07/01(土) 14:44:06
C++のWinSockラッパークラスでおすすめってなんですか?
MFCのCSocket以外でおいしいの教えて工口ぃ人
UDP/TCPの非同期処理がサポートされているやつを探しているんですが
Google先生でみつかるのは同期処理のやつヴぁっか。
859デフォルトの名無しさん:2006/07/01(土) 14:49:44
エロく無い俺は教える資格なしか
860デフォルトの名無しさん:2006/07/01(土) 14:53:16
正直、工口が重要?
861デフォルトの名無しさん:2006/07/01(土) 14:58:29
くだらないレス
862デフォルトの名無しさん:2006/07/01(土) 18:17:11
C++で、カプセル化のためのsetter,getterを自動生成する方法ってありますか?
stlとboostは使う予定です。
863デフォルトの名無しさん:2006/07/01(土) 18:19:26
つエディタマクロ/スクリプト系言語
864デフォルトの名無しさん:2006/07/01(土) 18:35:51
>>862
カプセル化を考えるなら、必要性をよく考えて自分で作ったほうがいいよ。
不要な setter, getter はカプセル化を破壊する。
865デフォルトの名無しさん:2006/07/01(土) 18:39:57
一律にsetter、getter作るなら、publicでええやん
866デフォルトの名無しさん:2006/07/01(土) 19:31:52
配列について質問です
a[10][10]ってのがあるとしてa[10],[1]〜[10]までに同じ値を入れたい時はどう書けば良いでしょうか。。。?
867デフォルトの名無しさん:2006/07/01(土) 19:35:32
for(ry
868デフォルトの名無しさん:2006/07/01(土) 19:38:44
>>867
やっぱりforしかないですよね。ありがとうございます
869デフォルトの名無しさん:2006/07/01(土) 19:44:06
>>866
memset
870デフォルトの名無しさん:2006/07/01(土) 19:46:07
つーかa[10]だとバッファオーバーランするよ
871デフォルトの名無しさん:2006/07/01(土) 19:47:35
>>866
C++を使ってるなら
std::fill(&a[10][0], &a[10][10], 0x1234);
872デフォルトの名無しさん:2006/07/01(土) 19:47:52
intでないと使えんがな
873デフォルトの名無しさん:2006/07/01(土) 19:49:12
んなこたぁない
874デフォルトの名無しさん:2006/07/01(土) 20:14:35
#include <iostream>
#include <fstream>

using namespace std;

int main() {
fstream ifs("a.bmp", ios::binary | ios::in);
fstream ofs("a.bin", ios::binary | ios::out);

char c;
while ( ? ) {
ifs.get(c);
ofs.put(c);
}

return 0;
}

バイナリ型式でファイルをコピーしたいのですが、
この場合、ファイルの終端はどうやって検出するのでしょうか?

ifs.eof()は当然ダメでした
875デフォルトの名無しさん:2006/07/01(土) 20:32:16
>>874
get()してみないと、eof()かどうかは判らない。
876デフォルトの名無しさん:2006/07/01(土) 20:40:23
do {
ifs.get(c);
ofs.put(c);
} while (!ifs.eof());

取り敢えず修正

eof()を使って終端判定すると
変なところでeof検出されたりしませんか?
877デフォルトの名無しさん:2006/07/01(土) 20:47:56
>>876
単にファイルをコピーしたいだけならOS依存にはなるが、
system("/bin/cp -p fromFile toFile");
でいいのではないかと。
#或いは"copy fromFile toFile"か。
878デフォルトの名無しさん:2006/07/01(土) 21:04:48
#include <iostream> 
#include <fstream> 
#include <iterator>
#include <algorithm>
using namespace std; 

int main() { 
    fstream ifs("a.bmp", ios::binary | ios::in); 
    fstream ofs("a.bin", ios::binary | ios::out); 
    typedef istreambuf_iterator<char> i;
    typedef ostreambuf_iterator<char> o;
    copy(i(ifs),i(),o(ofs));
}

//while(ifs.get(c))とかいてもいいけどな
879デフォルトの名無しさん:2006/07/01(土) 21:13:06
#include <fstream>

int main()
{
    std::ifstream ifs("a.bmp", std::ios::binary); 
    std::ofstream ofs("a.bin", std::ios::binary);
    ofs << ifs.rdbuf();
}
880デフォルトの名無しさん:2006/07/01(土) 21:40:09
sort.obj : error LNK2019: unresolved external symbol __imp__GetPixel@12 referenced
in function _WinMain@16
as.exe : fatal error LNK1120: 1 unresolved externals


コンパイルは通るんですが、上記のリンクエラーがでます。
どのライブラリをリンクしたらいいのか教えていただけませんか?
もしくは、それを調べる事ができるAPI関数のリファレンスのような物があれば教えて下さい。

コンパイラはVCTK2003とPsdkのx86用
OSはXPを使っています。 
881デフォルトの名無しさん:2006/07/01(土) 21:44:21
sort.exe : fatal error LNK1120: 1 unresolved externals

エラーの最終行が変わってました。正しくは上記です。
882880:2006/07/01(土) 21:48:00
ついにGoogle先生で自己解決できました。
数時間彷徨って、書き込んだとたんにこれだあえちjせちぽうgsれlkじぇryぽ

お騒がせしましたー。
883デフォルトの名無しさん:2006/07/01(土) 23:08:06
MY_DATA stMyData[4] =

  {  1,  2  },
  {  5,  7  },
  {  3,  3  },
  {  2,  4  },
};

こんな感じで構造体の配列を作ったとします。

stMyDataというアドレスだけを受け取って
構造体が何個含まれているか(上の例では4個)を
知る方法はありますか?
884デフォルトの名無しさん:2006/07/01(土) 23:12:21
>>883
ない
885デフォルトの名無しさん:2006/07/01(土) 23:13:45
じゃあ
sizeof(stMyData) / sizeof(MY_DATA) とかで
あらかじめ個数を調べておくしかないってことですね
886デフォルトの名無しさん:2006/07/01(土) 23:15:27
stMyDataが同じファイルスコープにいるなら可能
sizeof(stMyData)/sizeof(stMyData[0])

そうじゃないなら終端を表す特殊なデータをケツに置いておく
887デフォルトの名無しさん:2006/07/01(土) 23:23:05
あと、MY_DATA* pstMyData = stMyData とおいて
x = pstMyData[3].nData1
y = pstMyData[3].nData2
と値を取ろうとしますが、うまくいきません (x=2、y=4になるはずなのに)
全然違う値が返ってきてしまいます。
理由を教えてもらえませんでしょうか?
888デフォルトの名無しさん:2006/07/01(土) 23:27:56
f
889デフォルトの名無しさん:2006/07/01(土) 23:32:46
>>887
ソースをみないとわからんぽ
890デフォルトの名無しさん:2006/07/02(日) 00:55:55
何が目的で全角英数を使うのか理解できない。
891デフォルトの名無しさん:2006/07/02(日) 13:27:19
>>890
俺にはお前が理解できないw
892デフォルトの名無しさん:2006/07/02(日) 16:36:37
何が目的で大文字英数を使うのか理解できる。
893Microsoft Visual C++ Runtime Library:2006/07/02(日) 17:18:02
Runtime Error!

Program: ...udio 2005\Projects\directxtest05\debug\directx05.exe


This application has requested the Runtime to terminate it in an unusal way.
Please contact the application's support team for more information.

VC2005 Express Editionでコンパイルしたらこんなのが出て終了します。なんで?
894デフォルトの名無しさん:2006/07/02(日) 17:28:50
×コンパイルしたら
○デバッグなしで開始 したら
デバッグ開始 すると意味分からないエラーが
directxtest05.exe の 0x7c81eb33 で初回の例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0012fcb4)。
directxtest05.exe の 0x7c81eb33 でハンドルされていない例外が発生しました: Microsoft C++ の例外: long (メモリの場所 0x0012fcb4)。

ttp://uploader.system-witch.com/UpLoader/Itiran

file_id:621,pass:cpp
895デフォルトの名無しさん:2006/07/02(日) 17:45:13
C言語の

fp = fopen(path, "r");
if (fp ==NULL) die("unko");
if (ferror(fp)) die("unko");

をC++でfstreamを使う場合で同じ動作をさせるにはどう書けばよいですか?
896デフォルトの名無しさん:2006/07/02(日) 18:17:46
>>894
デバッグしろってか。
せめて落ちる所を特定しろよ。
897デフォルトの名無しさん:2006/07/02(日) 18:25:22
>>895
std::ifstream fin(path);
if (!fin) throw std::runtime_error("die");
898デフォルトの名無しさん:2006/07/02(日) 18:26:28
デバッグ版をリンクしてなかったってオチじゃねぇの
899デフォルトの名無しさん:2006/07/02(日) 18:44:05
>>894
catch(int errtype){

catch(HRESULT errtype){

というかこんなキモイ例外の使い方するな、普通に返り値で分岐すればいいだろ
900デフォルトの名無しさん:2006/07/02(日) 18:53:39
Cで2ちゃんねるに書き込むソフトを作ろうと思ったのですが、
作り方がわからないのでまず試しにhtml文書で試しにしてみました。

<html>
<head>
<title>■ 書き込み確認 ■</title>
<META http-equiv="Content-Type" content="text/html; charset=x-sjis">
</head>
<body>
<form method=POST action="http://pc8.2ch.net/test/bbs.cgi">
<input type=hidden name=subject value="">
<input TYPE=hidden NAME=FROM value="">
<input TYPE=hidden NAME=mail value="sage">
<input type=hidden name=MESSAGE value="試しです">
<input type=hidden name=bbs value=tech>
<input type=hidden name=time value=1151831869>
<input type=hidden name=key value=1149815331>
<input type=hidden name="hana" value="mogera">
<br>
<input type=submit value="上記全てを承諾して書き込む" name="submit">
<br>
</form>
</body>
</html>
ですが「ERROR:referer情報が変です。(ref1) 」となりました。
ですので調べたらIPアドレスとかの情報がいるとか・・・。
どなたか作り方教えてもらえないでしょうか?
901800:2006/07/02(日) 18:57:53
もしかして案外普通にCでのプログラムとかで作ったなら
勝手にそういった情報が送られるのかな?
902デフォルトの名無しさん:2006/07/02(日) 19:22:08
とりあえずHTTPの仕組みを勉強しよう
903デフォルトの名無しさん:2006/07/02(日) 20:09:53
>>900
あと自鯖でやれ、迷惑かけるな
904デフォルトの名無しさん:2006/07/02(日) 21:25:39
C言語でメモリー上の特定のアドレスの値を取得したいのですが(例えば0x00000001の値1バイト分)どうやってやればいいんでしょう?
905デフォルトの名無しさん:2006/07/02(日) 21:26:51
*(char*)0x00000001
906904:2006/07/02(日) 21:51:50
レスありがとうございます
VC2005で実際やってみたのですがどうもうまくいかないorz
「MSにエラー送信しますか」のダイアログがでます。
で、いろいろ試行錯誤してみたのですが
printf( "%d", (char*)0x00001234 );
で通すと"1234"と出力されました。
printf( "%d", *(char*)0x00001234 );
でやるとエラー送信のダイアログがでます。
フォーマットの指定が変なんでしょうか?
907デフォルトの名無しさん:2006/07/02(日) 21:54:40
そもそも0x00001234には何があるのか考えろ
908デフォルトの名無しさん:2006/07/02(日) 22:06:30
>>906
アンタはアタイの触れちゃいけないもんに触れちまったのさ
909デフォルトの名無しさん:2006/07/02(日) 22:18:54
>>906
そのアドレスを読むことが認められていないのでしょう。
910デフォルトの名無しさん:2006/07/02(日) 23:26:43
MS-DOSの時代なら自由に読めたのにね
911デフォルトの名無しさん:2006/07/02(日) 23:28:48
>>906
WindowsはまともなOSだから、そう直接的に好き勝手な場所のメモリを読み書きその他することはできない。
912904:2006/07/02(日) 23:36:55
ではどうやって任意のメモリの読み書きを行うのでしょうか?
913デフォルトの名無しさん:2006/07/02(日) 23:41:51
>>912
そもそも任意のメモリが読めたとして、一体それをどうしたいんだ?
914904:2006/07/02(日) 23:54:45
あるアプリのメモリーの変動をウォッチングして変動に応じた処理をするプログラムが作りたい
915デフォルトの名無しさん:2006/07/02(日) 23:55:45
Windowsで任意のメモリにアクセスするには、特権モードでないと無理。
ところで物理アドレスなのかね?それとも論理アドレス?
916デフォルトの名無しさん:2006/07/02(日) 23:56:31
>>914
それは他プロセスのアドレス空間の話だろ。
ReadProcessMemory()を使え。
917デフォルトの名無しさん:2006/07/03(月) 00:00:04
>>904
致命的に知識不足。
お前には無理だ、あきらめろ。
918デフォルトの名無しさん:2006/07/03(月) 00:07:56
知識不足なら埋めればいいだけだろうに。
短絡的に無理と判断するのはこれまたゆとり教育の弊害か。
919デフォルトの名無しさん:2006/07/03(月) 00:11:40
>>918
「埋める」の主語はなんだ?俺たちが埋めてやるとでも?
920デフォルトの名無しさん:2006/07/03(月) 00:14:35
知識はあっても応用する力が無いとダメだな。
921デフォルトの名無しさん:2006/07/03(月) 00:21:31
ポケコンとはちがうのだよ、ポケコンとは!!
922デフォルトの名無しさん:2006/07/03(月) 02:22:43
つまり、ポケコンでやれってことだな。
923デフォルトの名無しさん:2006/07/03(月) 04:00:16
fopenなどは大概
if ((fp = fopen("my.dat", "r")) == NULL) {
/* エラー処理 */
}
等のようにしてエラー処理をすると思うんですが、fgetsもエラー処理はした方が良いでしょうか?
924デフォルトの名無しさん:2006/07/03(月) 05:14:55
>>923
どっちか不安なら、しといたほうがいい。
925デフォルトの名無しさん:2006/07/03(月) 10:24:58
すいません、質問なんですが
ANSI C++で
#include <stdlib.h>
#include <iostream.h>
#include <list.h>
class Guardian
{
class Child
{
public:
int a;
double b;
list<Gurdian*> gurdian;
};
Child *child;
};

の様にクラスの中でそのクラスのメンバを持った
クラスを宣言することはできないのでしょうか?
926デフォルトの名無しさん:2006/07/03(月) 10:29:58
#include <iostream.h> → #include <iostream>
#include <list.h> → #include <list>
list<Gurdian*> gurdian; → std::list<Guardian*> gurdian;
                      ~~~~~~~~~
927デフォルトの名無しさん:2006/07/03(月) 10:32:27
class Moge;
class Hoge{
Moge moge;
};
class Moge{
};

int main(){
return 0;
}

↑のようなコードを書いてコンパイルしたところ、
「'Hoge::moge' が 未定義の class 'Moge' で使用しています」(VC8)
「未定義の構造体 'Moge'」(BCC5.5)
「field `moge' has incomplete type」(GCC)
のようなエラーを吐かれます。
また、
- Moge moge;
+ Moge* pMoge;
のように変更を加えたところ、何事もないようにコンパイルされます。

この違いはいったい何なのでしょうか。
928デフォルトの名無しさん:2006/07/03(月) 10:40:55
ポインタか実体か。
929デフォルトの名無しさん:2006/07/03(月) 10:59:41
>>927
コンパイラはソースを上から順に読んでいく。これがヒント。
930927:2006/07/03(月) 11:11:59
実体の宣言をする前にそのクラスの定義を見る必要がある
(ポインタの宣言ならそのクラスの宣言だけでよい)
という解釈でよろしいでしょうか。

とりあえず、おとなしく分割コンパイルをすることにします。
931デフォルトの名無しさん:2006/07/03(月) 18:24:04
使おうとしているライブラリが
gif_lib.h と
png.h
をインクルードしてるんですが
これらのヘッダのあるライブラリの名称ってなんですか?
932デフォルトの名無しさん:2006/07/03(月) 19:12:32
>>931
giflib
libpng
933デフォルトの名無しさん:2006/07/03(月) 20:53:16
fstreamをメンバ関数にもつクラスのコピーコンストラクタを作成したときと、fstreamを関数で受け渡しする際に次のようなエラーがでてしまいます。

コピーコンストラクタの場合 :
class Test
{
public :
fstream fs;
Test() { }
Test( const Test &test )
{
fs = test.fs;
}
};

関数で受け渡しする場合 :

void test( fstream fs )
{
}

int main()
{
fstream fs;
test( fs );
return 0;
}

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ (クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスできません。

環境はWindowsのVC8です。
どちらかの場合の解決法がわかれば、問題は解決できるんですが、どなたかわかりますか?
934デフォルトの名無しさん:2006/07/03(月) 21:06:02
>>933
ポインタを保持する
935デフォルトの名無しさん:2006/07/03(月) 21:10:16
fstreamはコピーできない。
参照で渡す or ポインタで渡す のどちらかで
936デフォルトの名無しさん:2006/07/03(月) 21:26:38
>>934
-935回答ありがとうございます。

ポインタで渡すしかないということは、クラスのコピーコンストラクタを使う方法は使えないということでいいですか?

test( fstream &fs )
{
}

int main()
{
fstream fs;
test(fs);

return 0;
}

では、動作することを確認しました。
ありがとうございます。
937デフォルトの名無しさん:2006/07/04(火) 11:54:16

演算子の優先順位に関して、Cのスレで質問したのですが、
C++とちょっと様子が違うようなので、こちらで聞かせてください。

3項演算子と、代入、カンマ演算子を括弧無しで書いたときの
動作についてです。

a , b ? c , d : e , f;

a , (b ? (c , d) : e) , f;
と同じでしょうか?

あと、

a = b ? c = d : e = f;

a = (b ? (c = d) : (e = f));

ですか?

優先順位を素直に解釈すれば
a = (b ? (c = d) : e) = f;
こうなるようなアドバイスはあったのですが、現実には上に書いたような
解釈をされるようです。

続きます…
938デフォルトの名無しさん:2006/07/04(火) 12:31:31
そういうのをなまじ知ってると、
括弧を省略したくなる病になる可能性があるから、
そういう分かりにくいものは必ず括弧をつけるように。

あと、C だと a = (b ? (c = d) : e) = f; と解釈されるけど、
C++ だと確かに a = (b ? (c = d) : (e = f)); と解釈されるようだ。
つまり、e = f の付近は括弧をつけないと
移植性が低いよということなんだろうが、
何でこういう違いが出るのかは分からんな。
939デフォルトの名無しさん:2006/07/04(火) 13:38:49
>>938
すみません、続きを書くのを忘れてしまったようです。

仰るようにプログラムするときは括弧を書くべきですが、
コンパイラの動きの内部をちょっと勉強していて、
どうもC++の3項演算子のコロン以降が特殊処理されている
ような感触を受けたので質問させていただきました。

なら、カンマ演算子の場合も

a , b ? c , d : e , f;

a , (b ? (c , d) : (e , f));

こうなるのでしょうか?
940デフォルトの名無しさん:2006/07/04(火) 15:21:05
連続した3項演算子の結合については、
if else if 同様に以下のような書き方ができると
覚えておけば忘れないと思います。

weight = (sex == male) ? 65 :
      (sex == female) ? 55 :
      105;
941デフォルトの名無しさん:2006/07/04(火) 16:08:10
>>940
3項演算子の連続ではなくて、カンマ演算子や代入演算子との兼ね合いで
首をひねっているのです。
942デフォルトの名無しさん:2006/07/04(火) 16:43:55
>>936
iostreamはコピー禁止
943デフォルトの名無しさん:2006/07/04(火) 16:49:15
>>937
> 現実には上に書いたような解釈をされるようです。

バグやろ。コンパイラ晒せ。
944デフォルトの名無しさん:2006/07/04(火) 16:58:43
>>943
VC++ 6らしい。
http://pc8.2ch.net/test/read.cgi/tech/1146700389/664n

俺はVC++ 7.1, 8で試したが直っているみたい。
#include <iostream>
int main()
{
  using namespace std;
  int a, b, c = 2, d = 3, e = 4, f = 6;
  cin >> b;
  a = b ? c = d : e = f;
  cout << a << ' ' << b << ' ' << c
    << ' ' << d << ' ' << e << ' ' << f << endl;
}
1を入力すると「3 1 3 3 4 6」と出力され、0を入力すると「6 0 2 3 6 6」が出力される。
g++でも当然そうなった。
945デフォルトの名無しさん:2006/07/04(火) 17:02:54
結論:ifを使え
946デフォルトの名無しさん:2006/07/04(火) 17:05:40
そうそう、無理して理解しなくても、自分の能力の範囲内で
使えるものを適切に使うところから始めた方が良いよ。
原理を理解していないから結果が分からんのだし。
947デフォルトの名無しさん:2006/07/04(火) 17:36:20
演算の優先順位に自信がないときは、しつこいぐらいに
括弧をつけるのがおすすめ、
948デフォルトの名無しさん:2006/07/04(火) 18:09:27
「配列のアドレスを書き換える事はできるか?」と聞かれ、
「それができたら領域破壊をする可能性があるためできないんじゃないだろうか」と答えたのですが、
憶測のため間違った知識を与えてしまったかもしれません。
実際のところ、配列のアドレスを書き換える事はできるのでしょうか?
949デフォルトの名無しさん:2006/07/04(火) 18:12:56
int a[20]; としたときに、
a のあるアドレスをあとから変更できるかってことか?
無理だろ。
int b; の b のアドレスを後から変更できないのと同じ。

それとも、違う意味か?
950デフォルトの名無しさん:2006/07/04(火) 19:08:10
>>944
VC6でもそうなります。なので、C++流は

a = b ? c = d : e = f;

a = (b ? (c = d) : (e = f));
なのでしょう。

この辺がC言語から変わった経緯とか知ってる人いませんか?
D&Eにはそれに触れてるところはなかったかなあ…。

あと、括弧をつけるのは別の話で。実務ではそうしてますから。

>>944さんへ。カンマ演算子に関してはご存知ないですか?
a , b ? c , d : e , f;

a , (b ? (c , d) : e) , f; こう?

VC6ではこれっぽかった。代入演算子の場合と括弧の結びつきが違うのは、
代入は右から評価されるってのが影響してるのかな。
951デフォルトの名無しさん:2006/07/04(火) 19:14:28
C++がどうこうというか、VC6がアレという話ではなかろうか
952デフォルトの名無しさん:2006/07/04(火) 19:23:00
>>950
実行した限りでは、a , (b ? (c , d) : e) , f だな。
これはごく普通の挙動だ。
= だとなぜ C と C++ で変わるんだろうか?

ああ、俺のコンパイラは gcc/g++ 3.4.4 ね。
953944:2006/07/04(火) 19:25:41
>>950
ああ、ごめん。
自分が試したコンパイラ=正しい、VC6=間違いと思い込んでしまっていた。

ところで規格をあたってみたら、たしかにCとC++ではその定義が異なっている。
X3010ではこう。(PDF P69-70)
6.5.15 条件演算子
    条件式:
        論理OR式
        論理OR式 ? 式 : 条件式
ところがX3014ではこうなっている。(PDF P73-74)
5.16 二択条件演算子
    二択条件式:
        論理和式
        論理和式 ? 式 : 代入式
X3014の付随書C(Cとの非互換の機能の説明がある)にも何も書かれていない。
954デフォルトの名無しさん:2006/07/04(火) 20:02:25
コーディング規約で「三項演算子の使用禁止」と書く奴の気持ちが
初めてわかった気がした。
955デフォルトの名無しさん:2006/07/04(火) 21:03:54
つ結合規則
956デフォルトの名無しさん:2006/07/05(水) 02:45:45
>>954
三項演算子の右項で普通代入式なんか書かねーよw
957デフォルトの名無しさん:2006/07/05(水) 02:48:22
>>953
なるほど。
C++ だと ? : の仕様として、
最右項に代入式があったら括弧なくても通るようになってんのか。
こんな仕様変更、始めて知ったな。
958デフォルトの名無しさん:2006/07/05(水) 10:41:32
C/C++の違いじゃなくて、三項演算、代入は右からの
結合なので、括弧なしで結合するのが正しい構文解析だと思うのだが、
# ちなみにカンマは左からの結合
959デフォルトの名無しさん:2006/07/05(水) 11:15:27
Cって、左辺値に三項演算式書けるんだっけ?
960デフォルトの名無しさん:2006/07/05(水) 12:06:31 BE:104814869-#
>>959
VC7でやってみた。
コンパイルは通るが、実質的にno effect。

int main(void)
int x=10, y=20, z;
char tmp[100];fgets(tmp,sizeof(tmp),stdin);z=atoi(tmp);
z&1?x:y = 0; //←no effect?
printf("x=%d,y=%d,z=%d\n",x,y,z);
return 0;
}

当然の事ながら、こうしたら期待した結果を得られた。
*(&(z&1?x:y)) = 0;
961デフォルトの名無しさん:2006/07/05(水) 14:09:48
>>960
それだと第3項が代入になるんじゃない?
962デフォルトの名無しさん:2006/07/05(水) 14:12:43
>>960
括弧足りないし
(z&1?x:y) = 0 がやりたいことじゃないの

>>959
出来ない。
>>953はC++で可能になったことが追加されているわけでしょ。
だから非互換ではない。あくまで追加。
963デフォルトの名無しさん:2006/07/05(水) 14:27:05 BE:46584364-#
cppでコンパイルしてたorz
964デフォルトの名無しさん:2006/07/05(水) 15:38:38
>>826
機能からこれが気になってしょうがない。
ネタじゃなかったらC++を窓から放り投げるぞ。
コンパイラだけは使うけど…
965デフォルトの名無しさん:2006/07/05(水) 15:53:55
>964
>847
966デフォルトの名無しさん:2006/07/05(水) 16:01:19
開発の動機というか経緯が全然事実に即して書かれてない。
ガセであることがすぐわかってつまらない。
967デフォルトの名無しさん:2006/07/05(水) 16:08:07
んで、ガセかどうかはともかく、質疑応答の内容そのものは間違ったこといってないのか?
例えば開発期間が長くなるとかetc
968デフォルトの名無しさん:2006/07/05(水) 16:10:32
なる
969デフォルトの名無しさん:2006/07/05(水) 16:13:04
というか、お前らものすごく遅れてますよと。
970デフォルトの名無しさん:2006/07/05(水) 16:39:45 BE:77640858-#
前世紀のネタで今更盛り上がられてもなぁ。
971デフォルトの名無しさん:2006/07/05(水) 17:12:42
>>958
結合規則は優先順位が同じもの同士じゃないと意味がないのでは・・・。
972デフォルトの名無しさん:2006/07/05(水) 19:51:21
UNIX系のg++で、pthreadを使って何かのイベントが発生したら処理をするような
機構を実現したいのですがどうしたらいいのでしょうか?
やはりwhileで変数を見張り続けるしかないのでしょうか?

わかりづらい質問ですが、どなたかわかる方がいらっしゃったら教えていただけ
ないでしょうか?
973デフォルトの名無しさん:2006/07/05(水) 20:11:54
>>967
> 開発期間が長くなる
教科書的な回答をするとしたら、
「それはC++に熟練していない人間が関わるからだ。」
974デフォルトの名無しさん:2006/07/05(水) 20:38:19
もう pthread なんて忘れたけど、
pthread_wait とかあった気がする。
975デフォルトの名無しさん:2006/07/05(水) 20:42:14
>>972
シグナルでも送れば?
976デフォルトの名無しさん:2006/07/05(水) 21:12:19
>>971
なこたない。
977デフォルトの名無しさん:2006/07/05(水) 21:51:15
phread_cond_wait(pthread_self(), &mutex)
として、自スレッドを一時停止させようとしているのですが、うまくいかないのです。
何か根本的に間違っている気がするのですが、、pthreadの資料少なすぎ orz
978955, 958, 976:2006/07/05(水) 21:57:10
勘違いしていた、申し訳ない。

手元のK&Rのapendixに乗ってるBNRをまじめに追いかけてみたら、
確かにCでは第3項は代入式としては解釈されない、、、
# 手元に最新の規格ないので古い資料ですが、、、(ANSI1989版相当)
>>953の言っているように、生成規則自体が変わっているのだね…

そもそも、結合則に関して勘違いした状態で
知ったような口をたたいて申し訳なかった。
979デフォルトの名無しさん:2006/07/05(水) 22:07:16
>>978
×BNR
○BNF

、、、、、旅に出ます、、、、
980デフォルトの名無しさん:2006/07/05(水) 22:56:42
>977
cond_waitするんだから、第一引数は当然condition objectを渡さないとイケナイ。
http://www.mtl.t.u-tokyo.ac.jp/~nminoru/pc/event.txt
ここらをみるといいかもしれんし、manする方が早いかもしれない。
981デフォルトの名無しさん:2006/07/06(木) 10:05:00
>>980
ありがとうございます。
う〜ん、しかしやっぱりスレッド一時停止してくれません orz

pthreadのmanでも見るしかないのか。。。
982デフォルトの名無しさん:2006/07/06(木) 10:09:44
何故マニュアルを読まん?
983デフォルトの名無しさん:2006/07/06(木) 11:48:45
ARM5.16
(953のX3010と同じ)
第二のオペランドと第三のオペランドが、同じ型であり、
どちらも左辺値である場合、式の結果も左辺値である。
例をあげる。
int a,b;
x?a:b = 1; // ok

ARM19.1
conditional-expressionとassignment-expressionの構文は、
(throw-expressionを許すために)、以下のように変更された。
(略 953のX3014と同じ)
例をあげる。
i ? x=y : x=z; // i ? (x=y) : (x=z) を意味する
984937:2006/07/06(木) 17:00:35
>>983
ARMですか…。もう読んだの10年以近く前でした。

D&Eの横に置いてあったんだけど目に入ってなかったです。
皆さんの書き込みで大体納得できました。

直感に従うように変更された、という感じですね。
985デフォルトの名無しさん:2006/07/07(金) 01:14:43
はぁ
986デフォルトの名無しさん:2006/07/07(金) 23:13:26
x = i ? y : z; でいいやん
987デフォルトの名無しさん:2006/07/07(金) 23:36:37
俺のチンコデッドロックで固まっちゃった
どうしよう
988デフォルトの名無しさん:2006/07/08(土) 00:11:11
>>987
おいしいもの食ってうんこすればなおるよ!
989デフォルトの名無しさん:2006/07/08(土) 19:00:57
                     
                 ハ_ハ  
               ('(゚∀゚∩ なおらなかったよ!
                ヽ  〈 
                 ヽヽ_)
990デフォルトの名無しさん:2006/07/08(土) 19:50:26
getch()について質問があります

#include <stdio.h>
#include <curses.h>

int main(void)
{
printf("Enter a letter: ");
printf("That letter is %c.\n",getch());

return(0);
}

というプログラムなんですがコンパイルして実行してもgetch()の部分がすっ飛ばされて終了してしまいます
Linux環境でgetch()をどうしても使わなくてはいけないのですが何か解決法はないでしょうか?
991デフォルトの名無しさん:2006/07/08(土) 20:03:13
>990
curses使いたいならちゃんと手順を踏んで使おう

適当にぐぐった使用例:
ttp://www.h7.dion.ne.jp/~matsu/feature/c-language/index.html#feature.c-language.curses
992デフォルトの名無しさん:2006/07/08(土) 22:48:25
次スレムリだったor2
993デフォルトの名無しさん:2006/07/08(土) 22:53:56
>>990
Cursesきつそうなら↓を参考に。
http://search.luky.org/fol.2002/msg00636.html
http://www.slayers.nu/~kumasaka/Gyoumu/kbdhit.html

UNIXプログラミングスレの方が適当だろうね。
ANSI Cにはない機能だから。
994デフォルトの名無しさん:2006/07/08(土) 22:59:31
つか、これUnix Programming FAQに載るほどの超既出問題なんですが。
995デフォルトの名無しさん:2006/07/08(土) 23:05:45
次スレ
【初心者歓迎】C/C++室 Ver.29【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1152367512/
996デフォルトの名無しさん:2006/07/08(土) 23:12:47
996
997デフォルトの名無しさん:2006/07/08(土) 23:46:39
長門
998デフォルトの名無しさん:2006/07/09(日) 00:00:43
998
999デフォルトの名無しさん:2006/07/09(日) 00:01:28
999


↓m9(^Д^)プギャーッ
1000デフォルトの名無しさん:2006/07/09(日) 00:01:57
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。