10/05/09 10:34:37
おまいら
janeの隠し機能を発見したぞ!
1.まず半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
3:デフォルトの名無しさん
10/05/09 14:15:16
何は vector、map 、iterator
4:デフォルトの名無しさん
10/05/09 16:10:46
複数の情報ひとまとめに定義する方法ってありませんか?
現状、
enum TEX_ID{
TEX_A,
TEX_B,
TEX_C,
TEX_NUM
}
char* TexTbl[] = {
("tex/a.bmp"),
("tex/b.bmp"),
("tex/c.bmp"),
}
と、別々に定義して、
TexTbl[TEX_B]
のように呼び出していますが、これだと2つの順番を意識的にあわせる必要があります。
そうではなく、
enum TEX_ID{
(TEX_A, ("tex/a.bmp")),
(TEX_B, ("tex/b.bmp")),
(TEX_C, ("tex/c.bmp")),
TEX_NUM
}
のようにひとまとめにしたいのですが・・・(上のような記述はありえませんが)
5:4
10/05/09 16:11:54
ちなみにこのTEX_IDは別のファイルからも読み込める前提でおねがいします
6:デフォルトの名無しさん
10/05/09 16:17:13
mapじゃダメなの?
7:デフォルトの名無しさん
10/05/09 16:20:05
揃えるだけなら初期化を諦めて代入すればいい。
ただ、色々犠牲になるけど。
C99なら要素番号を指定して初期化とかできるするけど
これも同じく犠牲になるものはある。
両方に共通して言える犠牲は、全要素が初期化されてるか判断が面倒という点。
普通に配列を初期化すれば、要素数とTEX_NUMを比較するassertを書けば済む。
mapにするとこれは解決できるが、今度はコストが気になると思われる。
一旦mapで初期化して、配列に移す、とまでやれば大丈夫だろうが・・・。
8:4
10/05/09 16:27:35
限りなくシンプルに登録、利用ができることを目的としています。
mapだと、
enum TEX_ID{
TEX_A,
TEX_B,
TEX_NUM
}
map<int, string> names;
names.insert( map<int, string>::value_type( TEX_A, "a.bmp" ) );
names.insert( map<int, string>::value_type( TEX_B, "b.bmp" ) );
こんな感じになってしまい、利用する側は登録するときに
enumと、insert部分の2箇所を記述する必要がでてきてしまいます。
TEX_AやTEX_Bのかわりに0や1を使ってdefineを取り除くと、
今度は利用するときにわかりにくいです。
9:デフォルトの名無しさん
10/05/09 16:28:37
コードを生成するといいよ
10:デフォルトの名無しさん
10/05/09 16:31:50
そういうクラスを作ればいいんじゃないの?
11:デフォルトの名無しさん
10/05/09 16:36:23
コードの自動生成くらいしか解決法はないと思われ
12:デフォルトの名無しさん
10/05/09 16:37:56
usingとかtypedef使えばいいじゃない
13:4
10/05/09 16:59:49
>>9~>>12
それらをどう使って、どういう形になるのかが想像できません(;´д`
struct MEDIA_INFO{
int id;
char* filename;
};
enum TEX_ID{
MEDIA_INFO(TEX_A, "a.bmp")
MEDIA_INFO(TEX_B, "b.bmp")
MEDIA_INFO(TEX_NUM, "")
};
TEX_ID aaa;
aaa[TEX_A].filename
うーん
14:デフォルトの名無しさん
10/05/09 17:43:36
data.h:
MEDIA_INFO(TEX_A, "a.bmp")
MEDIA_INFO(TEX_B, "b.bmp")
MEDIA_INFO(TEX_NUM, "")
media.h:
enum TEX_ID{
#define MEDIA_INFO(a,b) a,
#include "data.h"
#undef MEDIA_INFO
};
media.c:
const char* TexTbl[] = {
#define MEDIA_INFO(a,b) b,
#include "data.h"
#undef MEDIA_INFO
};
15:デフォルトの名無しさん
10/05/09 17:47:19
なるほど
それいいな
16:4
10/05/09 18:26:07
>>14
目から鱗。
多謝
17:デフォルトの名無しさん
10/05/09 23:34:07
ソートに最適なアルゴリズムってどうやって選べばいいんでしょうか
Visual C++で開発していますが、JavaのLinkedListのような仕組みを使ったリストに
ソートをかけたいです。
一度コピーでもしない限り、インデックス指定でリストにアクセス出来ないので、
使用できるアルゴリズムが限られそうです。データ型はfloatです。
18:デフォルトの名無しさん
10/05/09 23:42:16
std::sortでええやん
19:デフォルトの名無しさん
10/05/10 06:59:52
>>18
std::listにstd::sort()は使えない。
まぁ、std::listのメンバにsort()があるけど。
>>17
つーことで、先ずはstd::list<type> fooしてfoo.sort()だね。
20:デフォルトの名無しさん
10/05/10 10:03:19
プログラムというより算数の疑問なんですが…いまフィボナッチ数列作れってプログラム作ってて参考書どおりに書いたんですけど
int fibonacci(int n)
{
if (n == 1 || n == 2)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
の結果が
1=1
2=1
3=2
4=3
5=5 ってなるのが分からんのですけど、n=3の時は3-1+3-2ですよね?
nが-1で減るとして3-1+2-2とも考えたんですけどそれだと4の答えは4になるんじゃないでしょうか?
21:デフォルトの名無しさん
10/05/10 10:14:09
n = 3のときは
fibonacci(3 - 1) + fibonacci(3 - 2)
つまり
fibonacci(2) + fibonacci(1)
だから
n=2とn=1
のときの結果を足し合わせるの
それはどっちも1だろ?
22:デフォルトの名無しさん
10/05/10 10:16:29
まず関数の概念を理解すべきだな
23:デフォルトの名無しさん
10/05/10 10:36:50
>>21
速レス感謝です、if (n == 1 || n == 2) のリターン1が評価されてn(3)は1+1は2ということでしょうか?
そうすると4は3+1?だとやはり4になってしまうような?できれば4の場合も教えていただけないでしょうか
24:デフォルトの名無しさん
10/05/10 10:41:00
再帰って知ってるか?
25:デフォルトの名無しさん
10/05/10 10:54:57
>>21
n = 4のときは
fibonacci(4 - 1) + fibonacci(4 - 2)
で
fibonacci(3) + fibonacci(2)
だから
n=3のときの結果とn=2の時の結果を足すんだよ!
26:デフォルトの名無しさん
10/05/10 11:27:41
>>25
fibonacci(2)が1?で3+1?
そうすっと4=3てのは…
>>24
本の少し後ろの頁みたら解説してました
if (n == 0)
return 1;
else
return n* kaijo(n - 1); で4を入れると4*(3*(2*(1*1)))で24となるてやつでしょうか
これを>>20に当てはめろということでしょうか
27:デフォルトの名無しさん
10/05/10 11:38:27
このスレのアホな質問読んでると、自分が天才のように思えてくるわw
28:デフォルトの名無しさん
10/05/10 11:40:58
>>20 の出力を
fibonacci(1) == 1
fibonacci(2) == 1
fibonacci(3) == 2
fibonacci(4) == 3
fibonacci(5) == 5
と書けばわかるか?
fibonacci(4)
== fibonacci(3) + fibonacci(2)
== 2 + 1
== 3
29:( ● ´ ー ` ● )
10/05/10 11:51:20
30:デフォルトの名無しさん
10/05/10 11:58:30
>>28
4の一つ前のn(3)が=2だったからfibonacci(3)が2になるということでしょうか?
例えばfibonacci(6)だとfibonacci(5)+fibonacci(4)で5+3でfibonacci(6)=8
31:デフォルトの名無しさん
10/05/10 12:17:12
n( )て何の記号だ?
32:デフォルトの名無しさん
10/05/10 12:23:05
小学生向けのフィボナッチ数列の説明見つけたから読んでみたら?
URLリンク(www.suguru.jp)
33:デフォルトの名無しさん
10/05/10 12:50:50
>>32
よくわかりました、正直フィボナッチの意味がわかってませんでした
34:デフォルトの名無しさん
10/05/10 12:56:29
ペラン数ぱねぇw
35:デフォルトの名無しさん
10/05/10 13:14:10
CreateFileでtxtファイルを作成してUnicodeの文字を書き込みましたが、作成したtxtでは文字化けして保存されました。
そのtxtの文字コードを メモ帳から文字コードをUnicodeに変更して保存しなおすと、Unicodeの文字を書き込むと表示できました。
手動ではなくプログラム中でtxtファイルの保存形式を指定したいのですがどうすれば良いのでしょうか?
36:デフォルトの名無しさん
10/05/10 13:16:50
>>35
文字コード変換すれば?
37:デフォルトの名無しさん
10/05/10 13:22:47
BOMは書き込んでるか?
38:35
10/05/10 13:43:12
>>36
特殊文字を記録したいのでUnicodeで保存しようと思ってます。
>>37
BOMって文字の前に付けて、その文字のコードを宣言するもので合ってましたっけ。
出力する文字はUnicodeで出ました。
CreateFileで作られたtxtがAnsiで保存されてるらしく駄目でした。
Unicodeで保存したファイルに出力するとOkでした。
メモ帳からAnsiでUnicodeを保存する時に「Unicodeの文字です。保存形式をUniCodeにしないとデータは失われます~」
って表示がでたんで、Textファイル自体をUnicodeで保存させる設定がいるのかなと思いまして。
39:デフォルトの名無しさん
10/05/10 13:59:39
>>38
根本的に勘違いしてるみたいだな
テキストファイルに文字コードがなんであるかを記録する方法はない(エディタの方言としてはあるが)
読み取るソフトが内容から自分で判断してる
だから
>Textファイル自体をUnicodeで保存させる設定がいるのかなと思いまして。
そんな設定は無い、
>CreateFileで作られたtxtがAnsiで保存されてるらしく駄目でした。
これも勘違いだろうな、メモ帳で開いて保存する時のダイアログでAnsiだと思ったんだろ?
40:デフォルトの名無しさん
10/05/10 14:28:33
Unicode(UTF-16)だとBOM付けないと
エディタは高確率でエンコード誤認するぞ。
C文字列にBOMは含まれないから、保存時にどうするかはプログラマの責任。
41:35
10/05/10 15:05:43
>>39
メモ帳はBOMを見て文字を判断してる。メモ帳にUnicode貼り付け時
[メモ帳に元からあったデータ] 続いて [UnicodeのBOM(0xEF, 0xBB, 0xBF) 2byte×文字数]
でUnicodeを表現。
指定した文字コードで保存しようとすると、全ての文字のコードを一括変換してくる?
[File_Beginに保存形式のBOM 以下→?byte×メモ帳の文字数]
今までBOM無しのデータでもきちんと表示されていたのはCharだったから。
TcharならBOM付けないとエンコードに失敗するから駄目だって事でしょうか?
42:デフォルトの名無しさん
10/05/10 15:12:04
>>41
メモ帳で確認するのではなく、ファイルを1バイトずつダンプするツールで確認することも覚えましょう。
43:35
10/05/10 16:00:16
>>42
確認してみた所、UnicodeのBOM(0xFF,0xFE) ANSIのBOM(無し) UTF-8のBOM(0xEF, 0xBB, 0xBF)でした。
BOMの記入後はちゃんと表示できました、ありがとうございます。
44:デフォルトの名無しさん
10/05/10 19:43:54
>>34
ペラン数wwwどうしてこうなった
45:デフォルトの名無しさん
10/05/10 19:51:44
ペテン数
46:デフォルトの名無しさん
10/05/10 19:59:44
ペテン師
47:デフォルトの名無しさん
10/05/10 23:11:39
変数hogeの値を見て、10未満ならプラス1、それ以上なら10に設定する
普通に書くなら
hoge = (hoge<10?hoge+1:10);
だが、hogeを何度も書いてて冗長な気がする。
もっといい書き方ない?
48:デフォルトの名無しさん
10/05/10 23:39:56
普通に書くのがいいと思う。でも普通はこんなんじゃない?
if (hoge < 10)
hoge++;
else
hoge = 10;
1行にするとこうなる。でもこれじゃわかりづらい
if (hoge++ >= 10) hoge = 10;
49:デフォルトの名無しさん
10/05/11 00:01:43
>>47
hoge = hoge-hoge*(hoge>=10)+(hoge<10)-(hoge<10)*(hoge>=10)+10*(hoge>=10);
50:デフォルトの名無しさん
10/05/11 00:11:00
>変数hogeの値を見て、10未満ならプラス1、それ以上なら10に設定する
if (look(hoge) < 10) set(hoge, +1); else set(hoge, 10);
51:デフォルトの名無しさん
10/05/11 00:20:05
hoge = std::min(hoge + 1, 10);
52:デフォルトの名無しさん
10/05/11 00:20:08
(hoge++)<11||hoge=10;
53:デフォルトの名無しさん
10/05/11 07:39:09
>>52
ありがとうございました
54:デフォルトの名無しさん
10/05/11 08:32:03
>>53
そんな保守もへったくれもないようなコード、冗談だよな?
つーか、間違ってるじゃん。
55:デフォルトの名無しさん
10/05/11 09:16:40
自演だろ
56:デフォルトの名無しさん
10/05/11 12:02:50
++hoge > 10 || hoge = 10;
で十分。
これがわかりにいくとかいう初心者の意見は聞かない。
57:デフォルトの名無しさん
10/05/11 12:46:04
こんなコードを書く奴と仕事したくない。
58:デフォルトの名無しさん
10/05/11 13:00:59
俺も初心者とは仕事したくない
59:デフォルトの名無しさん
10/05/11 13:17:36
perlだとそんな感じのコード書くなあ
60:デフォルトの名無しさん
10/05/11 13:20:47
unix系のシェルスクリプトなら、これが書けないと話にならない
61:デフォルトの名無しさん
10/05/11 14:45:00
|| を「命令文の後の or」の意味で「さもなければ」と読めばわかり易いよ
62:デフォルトの名無しさん
10/05/11 15:30:17
普通は制御構文とはみないで論理演算子とみるわな。
短絡評価が規格に明記されてる言語は多いけど、
論理演算子とみてるからこそ「短絡評価」という表現が使われる。
63:デフォルトの名無しさん
10/05/11 16:06:00
>>62
>普通は制御構文とはみないで論理演算子とみるわな。
普通なら論理演算子の評価で制御機能が働くことは重々承知してるはず
初心者は知らんが
64:デフォルトの名無しさん
10/05/11 18:12:27
hogeクラスでメンバ関数で引数にクラスを使う場合,
hoge operator+(hoge&);
のように宣言しているのはhogeクラスそのものを引数にしているということであってますか?
65:デフォルトの名無しさん
10/05/11 18:30:40
>>64
hogeクラスへの参照を引数としている
これが君の言っていることと同じかはこっちにはわからん
66:デフォルトの名無しさん
10/05/11 18:55:26
>>65
hoge hoge::operator+(hoge &h){
67:デフォルトの名無しさん
10/05/11 18:56:52
>>65
途中送信してしまいました
hoge hoge::operator+(hoge &h){
なんとかかんとか
}
こうゆうhへの参照という意味なのでしょうか?
宣言では型だけ書いているという意味で
68:デフォルトの名無しさん
10/05/11 19:04:54
>>67
引数の(型の)話しかしてないよ
引数の型がhogeへの参照だということ
69:デフォルトの名無しさん
10/05/11 20:53:58
日本語でOK
70:デフォルトの名無しさん
10/05/11 23:44:40
コンパイラVisualC++、OS VISTAでウィンドウズプログラミングをしているのですが、
あるプッシュボタンを押すとWM_KEY系を処理してくれなくなるバグが発生してしまいました。
ボタンを押す前はきちんと処理をしてくれるのですが、
ボタンを押すとその後メッセージボックスが表示されるまで
キーを押しても反応しなってしまいます。(ほかのメニューなどはきちんと処理されているようです)
ちなみにほかのボタンではこのような不具合は起こりませんでした。
どなたか、ご教授お願いいたします。
71:デフォルトの名無しさん
10/05/12 01:25:16
すみません。
C++言語でデストラクタを再起させても良いのでしょうか?
木構造の全ノードをデストラクタで開放したいです。
72:デフォルトの名無しさん
10/05/12 01:26:32
いいですよ。
73:71
10/05/12 01:31:24
>>72
ありがとうございます。
74:デフォルトの名無しさん
10/05/12 14:37:41
あーあ
75:デフォルトの名無しさん
10/05/12 19:19:58
別オブジェクトのデストラクタを呼ぶ形になるだけなら問題ない
76:デフォルトの名無しさん
10/05/12 19:48:20
>>75
それなら再帰とはいわん
77:デフォルトの名無しさん
10/05/12 20:58:09
thisもパラメータとして考えるとれっきとした再帰
まあ普通は再帰と言わないだろうけど
木構造で考えるとそうなってんだろうなあ、とは思うが
78:デフォルトの名無しさん
10/05/12 22:52:24
「~だけなら」とか「~として考えると」とかは一切なく、
デストラクタが直接にでも間接にでも自身を呼び出す再帰関数であって全く問題ない。
79:デフォルトの名無しさん
10/05/13 02:14:33
~A() 内で this->~A() は規格で違法なんじゃね?
きちんと調べてないけど
80:デフォルトの名無しさん
10/05/14 15:37:18
ソケットプログラミングでおぬぬめの本はありますか。
81:デフォルトの名無しさん
10/05/15 13:47:37
>>79
うんだろうね。
規格は知らないけど、デストラクタの二重呼び出しという不正なコードになるね。
引数も無いから再帰の終了条件も無いし意味の無いコードだな。
82:デフォルトの名無しさん
10/05/15 13:49:47
規格を知らない奴がごちゃごちゃ言うなw
83:デフォルトの名無しさん
10/05/15 13:58:53
>>79 = >>81 = ド素人
84:デフォルトの名無しさん
10/05/15 14:20:36
教授とか就職先の人とかに「君Cできる?」って聞かれたときに
「できますよ」って答えるにはどのくらいの知識が必要?
85:デフォルトの名無しさん
10/05/15 14:24:17
>>84
知識は関係ないよ。やる気を試しているだけ。
仕事が欲しくないなら「できません」って言えばいい。
86:デフォルトの名無しさん
10/05/16 02:36:53
>>85
>>84はあれだよ。つまり『やらないか』って言われたんだと思うよ。
「はじめてだけど……がんばりますっ!」って言えば高ポイントだったに違いない。
87:デフォルトの名無しさん
10/05/16 14:52:12
ありすぎて困るw
88:デフォルトの名無しさん
10/05/16 22:45:27
一つ質問させてください。
あるオブジェクトを登録できる管理クラスを用意し、
オブジェクトを登録後、オブジェクトが削除されたら登録も
自動的に解除するという機能を入れようと考えています。
管理クラスからもオブジェクトメソッドにアクセスできるようにしたいのですが、
この場合単純に相互参照を使用するのが一番良い方法なのでしょうか?
現状ではこのような形を考えています。
class Child{
private:
Controller* m_pController; // Controller::register時に入る
public:
~Child(){ m_pController->unregister( this);}
void setControllerPointer( Controller* pController){ m_pController = pController;}
void update( void); // Controllerから呼びたい
};
class Controller{
private:
Child* m_pChild[6];
public:
void redister( Child* pChild, unsigned int slot);
void unredister( Child* pChild);
};
よろしくお願いします。
89:デフォルトの名無しさん
10/05/17 01:10:41
>>88
相互参照は後々トラブルの元だから避けるのが一番良い方法。
登録解除でオブジェクトを削除にするのが無難。所有者をはっきりさせるように設計しよう。
俺も昔そういう構造を作ることもあったけど今は作らないようにしている。
90:デフォルトの名無しさん
10/05/17 15:16:12
質問です。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string org = string("org");
string org2 = string("org2");
string org3 = string("org3");
string &str = org; // コピーコンストラクタで初期化
string &str2 = org2;// コピーコンストラクタで初期化
string &str3(org3);// コピーコンストラクタで初期化
str2 = org; // コピー代入
str3 = org; // コピー代入
return 0;
}
コメントの理解で良いのでしょうか。
string &str2 = org2;がよくわかりません。
91:デフォルトの名無しさん
10/05/17 15:32:17
>>90
>// コピーコンストラクタで初期化
というのは3つとも全部間違い
参照をセットしているだけで、コンストラクタが呼び出されたりはしない
92:90
10/05/17 20:55:29
>>91
とても勉強になりました。参照難しいです。
ありがとうございます。
93:デフォルトの名無しさん
10/05/17 21:31:04
>>89
ありがとうございます!
やはり方向ははっきりさせないとあかんのですね
94:デフォルトの名無しさん
10/05/20 23:52:46
9×9の2次元配列を3×3の小さなブロック9個で区切り左上から
0,1,2,
3,4,5,
6,7,8,と番号をつけるとします。
各番号のブロックにある数字を足し、1次元の配列にブロック内の数の合計を保存したいです。
以下のプログラムを書いた場合、1次元の配列の添え字を工夫すると簡単にプログラミングできる
と聞いたのですが、どうしても思いつきません。アドバイスお願いします。
(i=0;i<10;i++)
(j=0;j<10;j++)
total[ここの添え字を工夫]=data[i][j];
totalを2次元配列にする方法は思いつくのですが、1次元に保存する方法がどうしてもわかりません。
よろしくお願いします。
95:デフォルトの名無しさん
10/05/20 23:55:18
数独?
96:デフォルトの名無しさん
10/05/21 00:05:07
int data[81];
int total[3][3];
for(n=0;n<3;n++)
for(m=0;m<3;m++)
for(j=0;i<9;i++)
for(i=0;j<9;j++)
total[n][m] = data[m*3+i + (n*3+j)*9];
97:デフォルトの名無しさん
10/05/21 00:13:43
for(i = 0; i < 9; i++)
total[i] = 0;
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
total[(i / 3) * 3 + j / 3] += data[i][j];
98:デフォルトの名無しさん
10/05/21 03:23:12
8つのCPUが動作している環境において、
GDBでのデバッグ時に各CPUのプロセスで
set debug_flag2 = 0x00008040
set test_flag5 = 0x00802020
などとと入力したい。
これを8回も入力するのが大変なので
一つのCPUで入力すれば各CPUでも設定されるようにしたいのですが
そういう処理って可能ですかね?
(第一引数をデバッグフラグ名の文字列, 第二引数をフラグ値
のような関数を作成したい)
99:94
10/05/21 23:02:14
>>96+97
ありがとうございます。
もう少し大きいM×Nの配列で、p×qサイズごとの合計の値を調べるにはどうしたら良いでしょうか?
100:デフォルトの名無しさん
10/05/21 23:36:59
応用力皆無だな
101:デフォルトの名無しさん
10/05/21 23:43:35
>>99
int data[M*N];
int total[q][p];
int t,i,j,m,n;
for(n=0;n<N;n++)
for(m=0;m<M;m++) {
for(j=0;j<q;j++)
for(t=i=0;i<p;i++)
t = data[m*p+i + (n*q+j)*M];
total[n][m] = t;
}
102:デフォルトの名無しさん
10/05/21 23:50:13
Mはpの整数倍なのか?
Nはqの整数倍なのか?
103:デフォルトの名無しさん
10/05/21 23:50:30
なにやってるか理解できれば、それをアレンジするだけだと思うんだが
104:デフォルトの名無しさん
10/05/21 23:55:10
まあ基本すらできなかったんだから応用なんて無理だね
105:94
10/05/22 00:00:20
>>101
totalは1次元の配列で処理したいです。
>>102
Mはpの整数倍・Nはqの整数倍でおkです。
106:デフォルトの名無しさん
10/05/22 00:06:05
int data[M*N];
int total[q*p];
int t,i,j,m,n;
for(n=0;n<N;n++)
for(m=0;m<M;m++) {
for(j=0;j<q;j++)
for(t=i=0;i<p;i++)
t = data[m*p+i + (n*q+j)*M];
total[n*M+m] = t;
}
107:デフォルトの名無しさん
10/05/22 00:12:18
それ、授業中に3~4行で書けるって言われたんじゃねぇの?
108:デフォルトの名無しさん
10/05/22 00:30:51
int data[M*N], total[q*p], n, t, i;
for(n=0;n<M*N;total[n++] = t)
for(t=i=0;i<p*q;i++, t=data[n%M*p+i%p + (n/M*q+i/p)*M]);
109:デフォルトの名無しさん
10/05/22 00:55:57
int i, j, data[M][N], total[(M/p)*(N/q)];
for(i=0; i<M; i++) for(j=0; j<M; j++) total[i/p*(N/q)+j/q] += data[i][j];
110:デフォルトの名無しさん
10/05/22 01:26:27
int data[M*N], total[q*p], n, t, i;
for(i=0; i < M*N; i++)
total[i/(M/p)%(M/p) + (i/M)/(N/q)*(M/p)] += data[i];
111:デフォルトの名無しさん
10/05/22 01:33:47
なんだろう、このアホは
112:デフォルトの名無しさん
10/05/22 01:36:34
そんなに悔しかったのか?
113:デフォルトの名無しさん
10/05/22 01:49:25
え?w
114:デフォルトの名無しさん
10/05/22 01:59:55
wwwww
115:デフォルトの名無しさん
10/05/22 02:08:28
>>109
>for(j=0; j<M; j++)
じゃなくてfor(j=0; j<N; j++) じゃね?
>>110
pとqを勘違いしてね?
116:デフォルトの名無しさん
10/05/22 02:41:15
あんなの質問してるやつに分かるわけないだろwwwwww
117:デフォルトの名無しさん
10/05/22 02:55:31
>>115
> pとqを勘違いしてね?
そう?
118:デフォルトの名無しさん
10/05/22 03:03:26
int data[M*N], total[q*p], n, t, i;
for(i=0; i < M*N; i++)
total[i/p%(M/p) + (i/M)/(N/q)*(M/p)] += data[i];
119:デフォルトの名無しさん
10/05/22 03:07:05
元は二次元配列なのに執拗にdata[M*N]に拘るのは病的だなw
120:デフォルトの名無しさん
10/05/22 03:35:46
>>117
pとqは小さなブロックのサイズなのに、total[q*p]じゃそうならないだろ
121:デフォルトの名無しさん
10/05/22 03:37:03
ああ、そうだな。
122:デフォルトの名無しさん
10/05/22 08:23:57
>>109
totalを0で埋めるか初期化しないとまともな結果にならんだろw
123:デフォルトの名無しさん
10/05/22 08:58:18
staticならすべて解決
124:デフォルトの名無しさん
10/05/22 10:40:25
標準の組み込み型って
char 1byte 固定
short 2byte以上
long 4byte以上
short <= int <= long
float 32bit 固定
double 64bit 固定
long double 80bit 固定
であってる?
125:デフォルトの名無しさん
10/05/22 10:49:21
規格の話なら
char 1byte 固定
short <= int <= long
しか合ってない
1byte >= 8bit
short 最低でも-32767~32767を表現可能
long 最低でも-2147483647~2147483647を表現可能
float <= double <= long double
値の範囲は面倒くさいので略(最低でも表現でいないといけない指数とか桁数とかはある)
126:デフォルトの名無しさん
10/05/22 10:55:42
つまり、
char = short = int = long
1byte = 32bit
でも規格合致
127:デフォルトの名無しさん
10/05/22 12:33:30
VC++限定にしても long double 64bit だしなあ。
128:デフォルトの名無しさん
10/05/22 13:33:43
g++は128bitだな
80bit分しか使ってないけどアラインメントの関係で
DOS時代に使ってたTurbo C++は80bitだったと思う
129:デフォルトの名無しさん
10/05/22 13:57:25
>>128
>g++は128bitだな
-m96bit-long-double がデフォルトのこともある。環境によって異なる。
130:デフォルトの名無しさん
10/05/22 14:10:51
DLLとかLIBファイルってバイト長整数長少数モデルとかいちいち考えてやらないといけないの?めんどくさくね?
131:デフォルトの名無しさん
10/05/22 14:34:55
>>122
文句言うなら、回答書いてみろよ
132:デフォルトの名無しさん
10/05/22 17:08:07
>>131
悔しいなら正解書いてみろよ
133:デフォルトの名無しさん
10/05/22 19:10:57
>>131
「totalを0で埋めるか初期化」するって書いてるだろw
134:デフォルトの名無しさん
10/05/22 19:15:44
コードかけよw
135:デフォルトの名無しさん
10/05/22 19:18:12
え? そんなコードも書いてもらわないと分からないの?!
136:デフォルトの名無しさん
10/05/22 19:25:22
自然言語で答えるだけならアホでも出来る。無駄レス。
137:デフォルトの名無しさん
10/05/22 19:26:57
まあ、アホには出来ないだろうが、ど素人でも出来る罠
138:デフォルトの名無しさん
10/05/22 21:08:31
宿題は自分で解こう
139:デフォルトの名無しさん
10/05/22 21:30:13
すみません、txtファイルに書いた2進数(10011101)をchar配列に保存しているのですが、
これをint型10進数(10011101 → 157)に直すシンプルな方法は無いでしょうか?
現状atoiで整数にしてから
10ずつ割りながら、整数で1の論理積を確認し、
別途1..2..4..8..と数値を足し合わせ作る手しか思い付かず。。
(※書き込み失敗したのか2度目の書き込みになります; もし別スレに誤爆しててマルチになってたらすみません;)
140:デフォルトの名無しさん
10/05/22 21:39:10
文字列を後ろから走査してn桁目が1なら1<<nを足す
141:デフォルトの名無しさん
10/05/22 21:43:14
特別便利な方法はないけど、普通にやれば十分では?
main()
{
char buf[]="10011101";
char *p;
int x = 0;
for(p=buf; *p ; p++) {
x *= 2;
if(*p == '1') x+=1;
}
printf("x=%d\n", x); /* x=157 */
}
142:139
10/05/22 22:25:44
>>140
ありがとうございます。ビットシフトでも良いのでしたね、記憶しておきます。
>>141
サンプルありがとうございます。
ポインタを使えばこうもシンプルに書けるのですね。 勉強になります。
2倍にする事でビットシフト同等の効果・・学んだ記憶が何とか蘇る程度でした。
とても勉強になりました。お2方、ありがとうございました。
143:デフォルトの名無しさん
10/05/23 20:38:46
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
144:デフォルトの名無しさん
10/05/23 21:36:56
int num[100][100],i,j;
int X1[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
int X2[4][4]={{15,14,13,12},{11,10,9,8},{7,6,5,4},{3,2,1,0}};
int X3[4][4]=・・・・;
int X4[4][4]=・・・・;
for(i=0;i<100;i++)
for(j=0;j<100;j++)
num[i][j]+=X1[i%4][j%4];
この様なプログラムにおいて、X1~X4を簡単に切り替える方法はありませんか?
Xの配列は必要に応じて1~4を選択したいのですが、プログラムで何カ所も使っているため、書き換えるのが非常に面倒です。
#define X "x1"
として、X[i%4][j%4]としてみたのですが、予想通り無理でした。
1カ所書き換えるとすべてに適用されるような方法はありませんか?
145:デフォルトの名無しさん
10/05/23 21:40:06
int *x[4][4] = {X1, X2, X3, X4};
146:デフォルトの名無しさん
10/05/23 21:41:10
int x[][4][4] = {X1, X2, X3, X4};
147:デフォルトの名無しさん
10/05/23 22:05:46
#include <iostream>
int main(void)
{
int x1[4][4];
int x2[4][4];
int x3[4][4];
int x4[4][4];
typedef int (*px_t)[4];
px_t x[] = {x1, x2, x3, x4};
x[0][1][2] = 100;
std::cout << x1[1][2] << std::endl;
return 0;
}
typedefなしで書く方法がわからんorz
148:デフォルトの名無しさん
10/05/23 22:13:24
int (*x)[4][4] = {x1, x2, x3, x4};
xはint型の[4][4]の配列へのポインタ
149:デフォルトの名無しさん
10/05/23 22:18:02
>>145,146, 148
コンパイルできない
150:デフォルトの名無しさん
10/05/23 22:35:50
int (*x[])[4] = {x1, x2, x3, x4};
151:デフォルトの名無しさん
10/05/23 22:39:23
>>147
<typeinfo>を使って生の型を
152:デフォルトの名無しさん
10/05/23 22:42:44
>>150
それでいいっぽいな
ただし配列名での初期化が出来るのはC++のみで、Cだとコンパイルエラーが出た
#include <iostream>
#include <iomanip>
int main(void)
{
int x1[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
int x2[][4] = {{17, 18, 19, 20}, {21, 22, 23, 24}, {25, 26, 27, 28}, {29, 30, 31, 32}};
int x3[][4] = {{33, 34, 35, 36}, {37, 38, 39, 40}, {41, 42, 43, 44}, {45, 46, 47, 48}};
int x4[][4] = {{49, 50, 51, 52}, {53, 54, 55, 56}, {57, 58, 59, 60}, {61, 62, 63, 64}};
int (*x[])[4] = {x1, x2, x3, x4};
int i, j, k;
for (k = 0; k < 4; k++) {
std::cout << "x = " << (k + 1) << '\n';
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
std::cout << std::setw(4) << x[k][i][j];
std::cout << std::endl;
}
}
}
153:デフォルトの名無しさん
10/05/23 22:51:33
Cだとわざわざこういう風に書かないとならん
面倒だな
#include <stdio.h>
int main(void)
{
int x1[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
int x2[][4] = {{17, 18, 19, 20}, {21, 22, 23, 24}, {25, 26, 27, 28}, {29, 30, 31, 32}};
int x3[][4] = {{33, 34, 35, 36}, {37, 38, 39, 40}, {41, 42, 43, 44}, {45, 46, 47, 48}};
int x4[][4] = {{49, 50, 51, 52}, {53, 54, 55, 56}, {57, 58, 59, 60}, {61, 62, 63, 64}};
int (*x[4])[4];
int i, j, k;
x[0] = x1;
x[1] = x2;
x[2] = x3;
x[3] = x4;
for (k = 0; k < 4; k++) {
printf("x%d = \n", k + 1);
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
printf(" %3d", x[k][i][j]);
putchar('\n');
}
}
return 0;
}
154:デフォルトの名無しさん
10/05/23 22:51:35
>Cだとコンパイルエラーが出た
当たり前だ。
Cだと配列の要素には定数以外使えない。
実行時に決まるスタック上のアドレスや関数呼び出しの戻り値などは
配列を初期化する値に出来ない。
155:デフォルトの名無しさん
10/05/23 22:51:45
>>151
かしこいな!
こんな使い方があったのか
156:デフォルトの名無しさん
10/05/23 23:30:19
URLリンク(ideone.com)
URLリンク(ideone.com)
URLリンク(codepad.org)
なんだこりゃ
だめだこれ
157:デフォルトの名無しさん
10/05/24 00:03:15
クラスの配列で
要素0内の複数のメンバ変数を要素1に複製したいときって
普通にmemcpyでOK?
158:デフォルトの名無しさん
10/05/24 00:21:49
>>157
条件によっては大丈夫な場合もあるけどまったく保証はされない。
159:デフォルトの名無しさん
10/05/24 00:46:11
>>157
Cならおk
C++なら、コピーするメンバ変数が組み込み型かPODならおk
160:デフォルトの名無しさん
10/05/24 02:29:54
ていうか
a[1] = a[0];
でえーやん。
ディープコピーの問題だとかメモリ確保してた場合にどうだとかは
代入演算子をどうする(作る)かの問題だけど。
161:デフォルトの名無しさん
10/05/24 20:56:06
stl風にコンテナの中から絶対値が最大のモノを指すイテレータを探すにはどう書く?
findだと最初のが見つかったら終わっちゃうよね
あ、ちなみにソート済みコンテナではないです
162:デフォルトの名無しさん
10/05/24 22:14:18
質問です。Hoge という class が合ったとして、その配列の pointer を
あるプログラムのheaderで以下のように定義して
Hoge* h[2];
それをメインルーチンで以下のようにobject を指すようにしたとします。
h[0] = new Hoge("foo");
h[1] = new Hoge("bar");
そのときにデストラクタでは
delete h[0];
delete h[1];
のように二回呼ばないといけませんか?
それとも
delete [] h;
でいけるのでしょうか?何となく前者じゃないといけない気がするのですが。
よろしくお願いします。
163:デフォルトの名無しさん
10/05/24 22:17:08
2回呼ばないといけません。
164:デフォルトの名無しさん
10/05/24 22:27:20
VisualStudio2010でWIN32アプリケーションの勉強をしているのですが、
作った関数で戻り値に文字列を指定する事は出来るのでしょうか?
普通に
LPWSTR CLASS(・・){
WCHAR str[100]
略
return str }
とかやっても文字列は帰ってきませんし、他のサイトでは文字列を戻す関数作成のサンプルを見かけません。
165:デフォルトの名無しさん
10/05/24 22:27:40
>>162
delete[] h; は完全な間違いです。
未定義の動作ですから鼻から悪魔です。
166:デフォルトの名無しさん
10/05/24 22:31:22
>>164
ローカル変数を戻り値にしちゃだめだよ。
167:デフォルトの名無しさん
10/05/24 22:33:44
>>163>>165
ありがとうございます
168:デフォルトの名無しさん
10/05/24 22:37:49
>>164
std::stringとかstd::wstring
169:デフォルトの名無しさん
10/05/24 22:40:38
>>164
文字列受け取りたい場合は
void GetStr( WCHAR* str, int size )
{
strに値をコピー
}
ってやったら?
170:デフォルトの名無しさん
10/05/24 23:32:38
#include <stdio.h>
int main(void){
int n=1;
float w,kei=0,heikin,max,min;
while(1){
printf("%d件目のデータを入力してください-->",n);
scanf("%f",&w);
if(w==0) break;
kei+=w;
if(n==1){max=w;min=w;}
if(w>max) max=w;
if(w<min) min=w;
n++;
}
heikin=kei/(n-1);
printf("合計 :%.1f[kg]\n"
"件数 :%d[件]\n"
"平均値:%.1f[kg]\n"
"最大値:%.1f[kg]最小値:%.1f[kg]\n",kei,n-1,max,min);
return 0;
}
最小値にループを抜けるための条件のW=0が代入されてしまいます
breakでループを抜けたらその後の
kei+=w;
if(n==1){max=w;min=w;}
if(w>max) max=w;
if(w<min) min=w;
の文は処理されないはずではないのですか?
171:デフォルトの名無しさん
10/05/24 23:33:52
浮動小数点と==は相性悪いよ
172:デフォルトの名無しさん
10/05/24 23:41:08
c言語の質問です。
main(void){
register int a[10], i;
for(i = 0; i < 10; i++)
scanf("%d", a[i]);
}
というようにレジスタ上の配列aに数値を読みこみたいのですが、
windowsのgccでコンパイルするとwarningが出てしまい、
配列aはレジスタ上に配置されずにメモリに配置されている予感がします
これをレジスタ上に確保したままfor文で数値を読み込む方法はあるのでしょうか?
173:デフォルトの名無しさん
10/05/24 23:41:44
nをint型にしていてもダメなんですか?
174:デフォルトの名無しさん
10/05/24 23:42:30
>>173は>>171へ
175:デフォルトの名無しさん
10/05/24 23:48:46
breakするかどうかは、nでは決まらないよね?
176:デフォルトの名無しさん
10/05/24 23:50:19
>>166
JAVAのようには出来ないんですね どうもです。
177:デフォルトの名無しさん
10/05/24 23:50:41
>>175
あっ!そういうことですか。ありがとうございました_ _
178:デフォルトの名無しさん
10/05/24 23:51:19
>>172
_asm
179:デフォルトの名無しさん
10/05/25 02:34:49
>>172
お前がやりたい事は無理
そもそもレジスタを理解してないように見えるが
180:172
10/05/25 04:56:04
>>178-179
ありがとうございます
最近学び始めたばかりでして知らないことが多すぎたようです
181:デフォルトの名無しさん
10/05/25 05:41:35
registerなんてキーワードは忘れてしまってよろしい
182:デフォルトの名無しさん
10/05/25 10:51:56
なんでboostは動的デリータ付きのスコポを用意しなかったんですか?
183:デフォルトの名無しさん
10/05/25 14:54:32
アメリカ人にとってのアルゴリズム辞典の定番の書籍って何がありますか?
184:デフォルトの名無しさん
10/05/25 17:01:59
AmericanCode第三版
185:デフォルトの名無しさん
10/05/25 17:21:26
現実に存在する本でお願いします。
186:デフォルトの名無しさん
10/05/25 18:16:33
URLリンク(www.amazon.co.jp)
187:デフォルトの名無しさん
10/05/25 23:39:09
C言語であるメモリアドレスを引数経由で返すような関数を定義する場合
int hoge( void ** );
といった定義をしたのですが、
char *fuga;
hoge( &fuga );
だと、ポインタの方が違うとワーニング
hoge( (void**)&fuga );
だと、strict aliasingのワーニングになってしまいます。
void **という引数指定をするのはおかしな事なのでしょうか?
int hoge( void * );
という定義にするとなんだか意図が異なる関数のような
int hoge( char * );
とポインタの型を決めてしまうのも意図が異なるような
・・・というあたりで行き詰まっています。
188:デフォルトの名無しさん
10/05/26 00:12:47
4.9:
参照呼び出しに使うため汎用のポインターを関数に渡すのに、 void **を使うことができるか。
A:
移植性まで考れば不可能である。C言語には汎用のポインターへのポ インター型は存在しない。void *が汎用のポインターとして振る舞う のは、他の型のポインターをvoid *に設定したり参照するときに、
自動的に変換が行われるからである。void *以外の何かを指している void **を使って間接参照しようとすると、この変換は実行できない (隠れた正しいポインターの型がわからない)。
189:デフォルトの名無しさん
10/05/26 00:13:25
.libファイルって作ったコンパイラ以外のコンパイラでも使えますか?
190:デフォルトの名無しさん
10/05/26 00:25:20
互換性があれば使えます。
191:デフォルトの名無しさん
10/05/26 00:27:14
>>188
と、いうことは汎用性をあきらめて特定の型のポインタのポインタとするか
ポインタは戻り値で返すように作るかしかないということでしょうか?
それともほかに常套手段のようなものがありますか?
192:デフォルトの名無しさん
10/05/26 00:28:45
void* hoge();
193:デフォルトの名無しさん
10/05/26 00:44:05
正直そこまで汎用性にこだわる理由が分からん
194:デフォルトの名無しさん
10/05/26 00:44:42
気にせず使え
195:デフォルトの名無しさん
10/05/26 02:31:02
void *p;
f((void**)&p);
char *fuga = (char*)p;
てのはどうよ?
196:デフォルトの名無しさん
10/05/26 22:10:39
>>193
こだわるわけでもないですが
いい方法があるなら知りたい使いたいというわけで
ないのなら特に気にしないで適当に
>>195
確かにその方法ならキャスト不要ですが
わざわざそのためだけに別の変数を定義するのも・・・
って事で、気にしないことにします
197:デフォルトの名無しさん
10/05/27 00:02:35
template<class T, class U>
T **pp_cast(U **pp) {
return reinterpret_cast<T**>(pp);
}
char *p;
f(pp_cast<void>(&p));
198:デフォルトの名無しさん
10/05/27 14:00:25
>>131
実は>>109=>>122なんだ
自分のミスを自分で突っ込んだだけなんだよ
199:デフォルトの名無しさん
10/05/27 15:31:44
typedef struct _CELL{
char as_status;
int x;
int y;
int cost;
int heuristic;
int score;
}CELL;
void SetScoreBubbleSort(const CELL*& node, CELL*& list){
int cnt(0);
// ソート開始
while( ( node->cost > list[cnt].cost ) && ( list[cnt].cost != 0 ) ){
cnt++;
}
list[cnt] = *node;
}//続く
200:デフォルトの名無しさん
10/05/27 15:35:54
// 続き
int main(void){
// ---上・省略---
// 床セルのデータ生成(newの二次元配列)
CELL** cell_floor;
int cnt(0);
int cnt2(0);
cell_floor = new CELL* [CellWidth];
for(cnt=0; cnt<CellWidth; cnt++){
cell_floor[cnt] = new CELL[CellLength];
// Astarソート用セルリスト生成(ポインタ型)
CELL** open_list;
open_list = new CELL*[(CellWidth * CellLength)];
// ---途中・省略---
SetScoreBubbleSort(cell_floor[x][y], open_list);//★ここでコンパイルエラー
// ---途中・省略---
// 床セルのデータの削除(deleteの二次元配列)
for(cnt2=0; cnt2<CellLength; cnt2++){
delete[] cell_floor[cnt2];
}
delete[] cell_floor;
// Astarソート用セルリスト削除
delete[] open_list;
}
ってやってるんだけど、コンパイルするとerror C2664: 'SetScoreBubbleSort' : 1 番目の引数を 'CELL' から 'const CELL *&' に変換できません。って出るんだけどどうしたらいい?
201:デフォルトの名無しさん
10/05/27 15:58:46
&はどっから出てきたんだよ
202:199、200
10/05/27 16:04:08
&はSetScoreBubbleSortの関数の引数にポインタを渡したいから使ったんだけどマズイかな?
203:デフォルトの名無しさん
10/05/27 16:48:54
ポインタ渡すなら&cell_floor[x][y]
204:199、200
10/05/27 16:55:58
>>203
配列の形式でそのまま渡せばポインタの先頭アドレスが入ると思って&はつけてなかったけどつけてコンパイルしてみた。
そしたら「error C2664: 'SetScoreBubbleSort' : 1 番目の引数を 'CELL *__w64 ' から 'const CELL *&' に変換できません。」になった。
205:デフォルトの名無しさん
10/05/27 17:21:21
ポインタ受け取る方は const CELL * で
206:199、200
10/05/27 17:33:00
>>205
ポインタ受け取る方の参照演算子&を除いて
void SetScoreBubbleSort(const CELL* node, CELL* list)とし、
int main{}の中の部分は
SetScoreBubbleSort(&cell_floor[x][y], *open_list);
としたら一応、コンパイルエラーは取れた。
関数使うときにポインタ渡したいのに*つけるのは気が引けたけど、エラーになる。
関数が抜けたときにまともに値が反映されてるか禿げしく不安・・・。
207:デフォルトの名無しさん
10/05/27 17:47:21
>>206
引数として渡したいものが、
・CELL
・CELLへのポインタ
・CELLへのポインタのポインタ
の何れなのかをはっきりさせよう
208:199、200
10/05/27 18:16:14
>>207
引数として渡したいのは「cell_floorの先頭アドレス」と「open_listの先頭アドレス」です。
CELLは型名なので。
209:デフォルトの名無しさん
10/05/27 18:21:10
先頭アドレスならcell_floorだけでいいんじゃね
210:デフォルトの名無しさん
10/05/27 18:22:59
Cのポインタから勉強しなおしだな
211:199、200
10/05/27 18:25:16
すみません。引数として渡したいのは「cell_floorポインタ型配列の中のポインタ」の間違いです。
212:デフォルトの名無しさん
10/05/27 18:46:47
>>208
(先頭)アドレスというのは値のことであり、その値の型として
・CELLへのポインタ
・CELLへのポインタのポインタ
があるということ。
同じ値であっても型が違うんだよ。その変がよくわかってないんじゃないか。
213:199、200
10/05/27 19:09:04
SetScoreBubbleSort関数では、
1番目の引数の配列の中のポインタの先の値(2次元配列)を
2番目の引数の配列の中のポインタの先の値(1次元配列)と比較した後に
1番目の引数の配列の中のポインタを2番目の中にコピーしようとする意図があります。
214:199、200
10/05/27 19:50:46
デバッグしてたらいくつもマズイ点を見つけたので出直してくるorz
215:デフォルトの名無しさん
10/05/28 03:42:27
Unix上のCで標準入力と標準出力をファイルとしてオープンする場合に
"/dev/stdin", "/dev/stdout"と記述することができたと思いますが
Windows上のC++(Visual C++ 2010 Express)ではどのように記述
すれば良いでしょうか?
216:デフォルトの名無しさん
10/05/28 06:40:03
// fprintf に標準出力したいなら、こうだ。
#include <stdio.h>
main(){
// FILE *stdout;
fprintf(stdout,"err");
}
217:デフォルトの名無しさん
10/05/28 07:14:52
>>216
一般のファイルの入出力用に書かれたプログラムをそのまま利用して
標準入出力の読み書きをするにはどうするの?という質問だと思う。
218:デフォルトの名無しさん
10/05/28 07:54:26
FILE *fp;
if(1==0){
fp = fopen("/dev/stdin");
}else{
fp = stdin;
}
か、コメントにすればいいのではないか。例をw
219:デフォルトの名無しさん
10/05/28 08:57:26
fopen() で con は使えたっけ?
220:デフォルトの名無しさん
10/05/28 09:21:13
>>219
使えるわけないだろ
221:デフォルトの名無しさん
10/05/28 09:59:12
>>220
使えないって確認した?
>>215
Linux MS-DOS
/dev/stdin con
/dev/stdout con
/dev/null nul
のように対応するからやってみて。
>>216
「fprintfに標準出力」じゃ日本語が破綻している。
222:デフォルトの名無しさん
10/05/28 11:34:33
>>221
con は入力には使えるが出力には使えない
お前こそ試したことあるのか?
223:デフォルトの名無しさん
10/05/28 11:52:27
コンパイル環境がVC++ならok
224:221
10/05/28 11:54:33
ないよ。だから、試してみてと書いている。
別に、「使えるに決まっているから>220は嘘だ」なんて書いていないから安心してね♥
225:デフォルトの名無しさん
10/05/28 11:55:29
221じゃないけど
bcc5.82ではできた
226:デフォルトの名無しさん
10/05/28 12:14:30
>>215
環境依存せず stdout と stdin を使うのがいい
バカどもの発言には惑わされない方がいいよ
227:デフォルトの名無しさん
10/05/28 12:30:00
>>226
話がわからないのなら、無理に書かなくていいよ。
今は、「標準入出力の環境依存したデバイス名は何?」って話題だからね。
それとも、環境依存しないデバイス名が存在しているなんて妄想に囚われているのかい?
228:デフォルトの名無しさん
10/05/28 15:05:42
>>227
アンカー見てないの?
>>215 に対するレスだよ
お前が振ったくだらん話題には興味ないよ
自意識過剰にも程があるよ
229:デフォルトの名無しさん
10/05/28 15:08:30
conで開けるのは標準入出力ではなくコンソールだけどね
Windows API の CreateFile で CONIN$ と CONOUT$ というのもある
230:デフォルトの名無しさん
10/05/28 15:08:32
誰と戦っているのだろう……
231:215
10/05/28 15:23:44
fgets(buf, 256, stdin);
で問題なく動きました。
ありがとうございました。
232:デフォルトの名無しさん
10/05/28 17:58:46
質問はオープンの仕方だったのにね
233:デフォルトの名無しさん
10/05/28 20:15:13
まあ、ファイルは開かないと読めないものという先入観があるのは
しょうがないだろう。
234:デフォルトの名無しさん
10/05/28 20:28:00
え?
235:233
10/05/29 01:02:34
いや、だからstdinというファイルハンドルが自動的に開いているという可能性を
知らなかったから
「標準入力をファイルとしてオープンする」という質問になっちゃったんでしょう。
>>231結果的に欲しかったのはファイルハンドルだったから。
236:デフォルトの名無しさん
10/05/29 09:40:18
boostが使えない環境でスマポを自作しないといけないとして
どの程度のレベルまで仕様とか実装を練りこむ?
237:デフォルトの名無しさん
10/05/29 09:45:09
>>236
理由が政治的かメモリサイズかによって違ってくるな。
238:デフォルトの名無しさん
10/05/29 09:47:14
ハードウェア的な問題ではない
ただ、boostに不慣れな人がいてとりあえず今回はなしで、という感じ
239:デフォルトの名無しさん
10/05/29 09:56:48
>>238
その判断は今回だけではすまないし後々後を引く。スマポは後から導入が面倒だから今後も見送りになりやすいぞ。
スマポ作るならboost::shared_ptrかstd::tr1::shared_ptrのインターフェース互換にして後にusingで切り替えられるようにすることを勧める。
240:デフォルトの名無しさん
10/05/29 09:58:05
プロジェクトに必要なもの調べてそれだけ実装
241:デフォルトの名無しさん
10/05/29 10:08:37
Googleみたいにboostの一部だけを厳選して使用すればいい
この場合の選定基準は理解が簡単でトレーニングの必要が少ないライブラリだけを許可することかな
shared_ptrやoptionalとか、その辺の解説サイトを流し読みすれば理解できるでしょ
242:デフォルトの名無しさん
10/05/29 10:12:23
選定の結果、見事>>236の社内標準に採択されたprogress_displayであった。
243:デフォルトの名無しさん
10/05/29 10:13:40
shared_ptrはヘッダだけだし、boost展開した箇所にincludeパス張るだけなんだからってPM説得したほうが良さげ
244:デフォルトの名無しさん
10/05/29 17:16:50
shared_ptr使ってて修正を重ねるうちに
気が付かないうちに循環関係になっててメモリリークを引き起こしちゃって原因の判明に苦労したのだが
もうこれは気をつける以外に対応がないものなのか?
245:デフォルトの名無しさん
10/05/29 17:55:19
>>244
デバッグ終了時にリークはレポートされるから、レポートされたときの版のコミットログ調べればすぐに特定できると思う。
循環参照が起きるパターンは限られてるんで、その場で対応すればいいと思うよ。
予想外の循環参照が起きるのは設計が悪いとしか言いようがない。たとえば参照の方向を一定にし、前方参照とshared_from_thisを使わない設計にすれば循環参照は自然に避けられる。
246:デフォルトの名無しさん
10/05/30 10:57:28
stdio.hをインクルードしなくても
printf関数が使えるんですけどどういうことですか?
単なる警告なだけでエラーにならないのが不思議です。
本にはインクルードせよみたいに書いてあるのに
じゃあ何のためにインクルードするの?って感じなんですが・・・。
247:デフォルトの名無しさん
10/05/30 11:04:15
Cの事なら、宣言されていない関数は
戻り値の型が int で、引数が (...) であるのと同じように解釈されて実行される。
だから、math.h をインクルードせずに sin(1) とかやると
変になる(int sin(int) であると解釈して実行されるので)など、
ちゃんとインクルードしないと意図しない動作を引き起こす恐れがあるので、
必ずインクルードすること。
(数学関数を特別視してちゃんとdoubleにしてくれるコンパイラもあるけど、
それはそのコンパイラ独自の仕様)
C++なら文法エラー。
248:デフォルトの名無しさん
10/05/30 11:34:35
googleのコーディング規約の整数型の項目についてなんだけど
これってコンテナのoperator[]の引数もintあるいはintN_tにしろってこと?
あとintは少なくとも32bitあると考えても良いって書いてあるけどそんな保証はないよね?
249:デフォルトの名無しさん
10/05/30 11:58:15
グーグルの開発環境では最低32bitなだけだろ
250:デフォルトの名無しさん
10/05/30 12:22:04
組み込みやらないなら最低32bitの過程が今時崩れることはないだろう
251:デフォルトの名無しさん
10/05/30 12:29:44
社内規約をなんだと思ってるんだろうw
252:デフォルトの名無しさん
10/05/30 16:10:26
float に100.123と入力して表示させると
100.123001となってしまうのは何故ですか?
253:デフォルトの名無しさん
10/05/30 16:11:28
100.123が2進数では循環小数になるから
254:デフォルトの名無しさん
10/05/31 03:48:08
VS2008のコンソールでスレッド使ったプログラムを作ってるんですが,
例外でデバッグが止まると時々,終了できなくなります.
デバッグ→すべて中止でも止まらない,タスクマネージャのプロセスにも表示されない...
プロセスIDを調べてPskillで指定しても終了できません.
コンソールwindowは残ったままなんですが….おかげでwindowsごとリセットしていますが,
何か止める方法orこうならないための対策ありますか.
255:デフォルトの名無しさん
10/05/31 08:07:33
あ、俺も知りたい。
Windows自体再起動も終了も出来なくなるし、放置すると全体がフリーズしてすごく困る。
256:デフォルトの名無しさん
10/05/31 12:29:22
>>254
>>255
CTFMONってプロセスがあったらキルしてからデバッグして味噌
257:デフォルトの名無しさん
10/05/31 14:14:42
翻訳お願いします。英語版できいたら分からないといわれました。
The problem here is that our template was instantiated for the type char,
which turns out to be too by introducing an additional template parameter AccT
の英文は
「この問題はテンプレートは文字型についてインスタンス化されたことのことです。」
コンマまではこの訳であってますよね。その後は,
「witchはまた追加パラメーターACCTの導入によるもでであることがはんめいした」
であってますよね?
witchが指すものが前文に無いようにおもえて翻訳できません。
詳しく教えてください。
258:デフォルトの名無しさん
10/05/31 14:28:02
whichはproblemにかかってるんじゃねーの?
259:デフォルトの名無しさん
10/05/31 14:34:52
>>258
翻訳してください。
260:デフォルトの名無しさん
10/05/31 15:17:53
>>258なら「この問題」
261:デフォルトの名無しさん
10/05/31 15:19:39
>>256
ありがと。今度なったら試してみる。
262:デフォルトの名無しさん
10/05/31 15:22:35
which turns out to be too がわからない。 この too は何だ?
263:デフォルトの名無しさん
10/05/31 15:23:18
tooは 最後につけるところを真ん中につけただけ。
264:デフォルトの名無しさん
10/05/31 15:24:18
>>263 じゃ、 be の補語は? exist の意味のbe?
265:デフォルトの名無しさん
10/05/31 15:25:10
which turns out to be (instantiated) too かなあ。
266:デフォルトの名無しさん
10/05/31 15:26:36
beの補語はby以下らしい。
267:デフォルトの名無しさん
10/05/31 15:30:55
関係代名詞はbeの補語ではなくて主語になるらしい。
268:デフォルトの名無しさん
10/05/31 15:34:23
この問題は追加テンプレートパラメーターAccTの導入からも、
存在することがが明らかになる
269:デフォルトの名無しさん
10/05/31 15:37:29
まとめて訳すとこんな感じか?
ここでの問題は、追加テンプレートAccTの導入からもわかるように、
我々のテンプレートが文字型についてインスタンス化されてることです。
270:デフォルトの名無しさん
10/05/31 15:40:13
ありがとうございました。
271:デフォルトの名無しさん
10/05/31 17:22:57
質問です。C++2008には
#pragma ○○
・・・
#pragma end○○
と書けば横の+、-でコードを格納できたと思いますが、
忘れてしまったので教えてもらえませんか?
272:デフォルトの名無しさん
10/05/31 17:58:12
region
273:デフォルトの名無しさん
10/06/01 10:42:15
staticってどういう時に使うの? なんでグローバル変数じゃなくて静的変数を使うの?
274:デフォルトの名無しさん
10/06/01 11:56:59
グローバル変数との比較だと
static変数はスコープがソースコード単位になるから
他のソースコードと名前が重複しても大丈夫
275:デフォルトの名無しさん
10/06/01 12:06:55
Cにはnamespaceがないから。
276:デフォルトの名無しさん
10/06/01 14:15:29
staticって意味が幾つも有ったような
277:デフォルトの名無しさん
10/06/01 19:21:16
C#言語で言う#regionみたいなことがしたいのですが
何かいい方法はありませんか?
現在は
#define COM 1
#ifdef COM
~折りたたみたい部分~
#endif
といった使い方をしていますがスマートではなく、何かいい方法がないか探しています
278:デフォルトの名無しさん
10/06/01 19:25:24
釣りかギャグかはたまたガチか
それが問題だ
279:デフォルトの名無しさん
10/06/01 19:28:52
初心者すれに行くべきでしたね
すいません移動します
280:デフォルトの名無しさん
10/06/01 20:00:34
数レス前に書いてあるだろw
281:デフォルトの名無しさん
10/06/01 20:55:03
あれだ
灯台下暗し
282:デフォルトの名無しさん
10/06/02 01:42:20
かなり初歩的な質問なのですが継承で
基本クラスのメンバ関数から派生クラスのデータメンバを変更するには
どういった操作がありますでしょうか?
基本クラスのメンバ関数に派生クラスのオブジェクトのアドレスを
渡してみたりしたのですがコンパイルエラーで上手くいきませんでした。
よろしくお願いします。
283:デフォルトの名無しさん
10/06/02 02:40:09
普通に仮想関数でいいと思うが。
284:デフォルトの名無しさん
10/06/02 07:44:39
そんな基本クラスが派生クラスの中身を知っているような設計は投げ捨てるかどうしてもというならCRTPを使いなさい
285:デフォルトの名無しさん
10/06/02 17:11:03
>>283 >>284
参考になりました。ありがとう!
286:デフォルトの名無しさん
10/06/02 17:13:54
1. 構造体のポインタ*tがある
2. 構造体の中にint型のポインタhogeがある
3. mallocを使って*tのメモリを確保
3. mallocを使ってhogeにint型x個分のメモリを確保
4. fwriteで構造体をファイルに書き込みたいが、二項目はどうやって指定すればいい?
287:デフォルトの名無しさん
10/06/02 17:18:28
fwrite(t, sizeof *t, 1, fp);
構造体のサイズが増えるわけでもないし。
288:デフォルトの名無しさん
10/06/02 17:27:25
>>287
上手くいかん
typedef struct test_t {
int a,b,c,d,e;
int *p;
} test_t;
test_t *t;
t = (test_t *)malloc(sizeof(test_t));
t->p = (int *)malloc(sizeof(int)*60);
printf("%d",sizeof(*t));
で、24って出る
289:デフォルトの名無しさん
10/06/02 17:31:01
>>286
fwrite(t, sizeof(int), x, fp);
だろ
ただし、
>1. 構造体のポインタ*tがある
でなく、
>1. 構造体のポインタtがある
であるならということ。3.も同様。
もし原文通りなら
fwrite(*t, sizeof(int), x, fp);
となる
290:デフォルトの名無しさん
10/06/02 17:32:28
>>288
pに確保した領域のサイズは構造体とは別。
291:デフォルトの名無しさん
10/06/02 17:32:45
trivially copyable classに展開してまとめて読み書きすればいいよ
292:デフォルトの名無しさん
10/06/02 17:34:55
>>288
構造体には他のメンバもあるのか。
それなら fwrite を2回する必要があるだろ。
fwrite(t, sizeof(test_t), 1, fp);
fwrite(t->p, sizeof(int), x, fp);
293:デフォルトの名無しさん
10/06/02 17:42:39
>>290
知ってる。だから質問した
>>292
それが一番スマートかな
構造体からpをそもそも切り離しとくってのも一つの手か
thx
294:デフォルトの名無しさん
10/06/02 17:47:00
知ってたら>>288で24が出ても上手くいかんなんて言わないだろw
295:デフォルトの名無しさん
10/06/02 17:55:29
fwriteしたものを、そのままfreadしようっていう魂胆なの?
296:デフォルトの名無しさん
10/06/02 17:59:17
定数じゃないならxもどっかに保存しとかないと読み込むとき困る。
297:デフォルトの名無しさん
10/06/02 18:13:15
読み込みは t = malloc(sizeof *t) → fread(t) → t-> = malloc(int*x) -> fread(t->p) で。
298:デフォルトの名無しさん
10/06/02 18:39:27
型変換を伴うコピーの時の参照カウンタのコピーをどうやってるのかと疑問に思って
shared_ptrの中身を覗いてみたらpublicメンバだった
こんなものなの
299:デフォルトの名無しさん
10/06/02 18:49:20
>>298
public でないと参照できないじゃん
300:デフォルトの名無しさん
10/06/02 18:54:47
>>299
まあそうなんですが
boostのことだからもっと複雑怪奇な方法で回避してる物かと思ったのでw
301:デフォルトの名無しさん
10/06/02 19:25:24
template friend classにしないのはなんで?
302:デフォルトの名無しさん
10/06/02 21:51:31
URLリンク(codepad.org)
上は、はじめてのCという本に乗っていたコードを
少し書き換えたもの(printfをcoutに、など)です
結果が3→2→1→0→1→2→3と表示される内、
行きの3→2→1→0は分かるのですが、
帰りの0→1→2→3の部分がどうしてそうなるのか、さっぱり分かりません
tline(int x)に渡す引数を増加させる処理はないように見えるのですが、
どなたか教えていただけないでしょうか
303:デフォルトの名無しさん
10/06/02 21:54:41
再帰関数で0以外は一つの関数で2回表示してるから。
304:デフォルトの名無しさん
10/06/02 22:00:50
recfunc(3)を呼び出す
3を表示する
recfunc(2)を呼び出す
2を表示する
recfunc(1)を呼び出す
1を表示する
recfunc(0)を呼び出す
0を表示する
recfunc(0)から抜ける
1を表示する
recfunc(1)を抜ける
2を表示する
recfunc(2)を抜ける
3を表示する
recfunc(3)を抜ける
305:デフォルトの名無しさん
10/06/02 22:05:54
>>303
冷静になってみると仰る通り2回表示してますね
ifの中身だけ見て、その下を見てませんでした
ありがとうございます
>>304
詳しい説明ありがとうございます
小一時間も考え込んでた自分が恥ずかしいです
低レベルな質問にも関わらずお答えいただき、お二方に感謝します
ありがとうございました
306:デフォルトの名無しさん
10/06/02 22:48:07
>>301
どうもコンパイラにより対応状況がまちまちらしい
boostのコードをみてみたら狡賢いコードになってたw
public:
/*
~省略~
*/
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
private:
template<class Y> friend class shared_ptr;
template<class Y> friend class weak_ptr;
#endif
T * px; // contained pointer
boost::detail::shared_count pn; // reference counter
307:デフォルトの名無しさん
10/06/02 22:51:08
ポインタp,qがあって参照剥がしして一致、あるいは、両方NULLならtrueにしたいときって↓でおけ?
((p && q) && (*p == *q)) || (p || q)
308:デフォルトの名無しさん
10/06/02 22:57:48
だめじゃね?
309:デフォルトの名無しさん
10/06/02 23:01:27
だめだな
310:デフォルトの名無しさん
10/06/02 23:06:08
どうして諦めるんだよ!
311:デフォルトの名無しさん
10/06/02 23:07:30
((p&&q) && (*p==*q)) || (!(p || q))か?
312:デフォルトの名無しさん
10/06/02 23:20:33
答え:(p && q && (*p == *q)) || !(p && q)
313:デフォルトの名無しさん
10/06/02 23:25:48
X
314:デフォルトの名無しさん
10/06/02 23:29:56
!p && !q || p && q && (*p == *q)
315:デフォルトの名無しさん
10/06/02 23:58:39
答え。
p-q
316:デフォルトの名無しさん
10/06/03 00:10:52
>>314が俺好み
317:デフォルトの名無しさん
10/06/03 00:15:55
!p && !q と !(p || q) のどっちにするかは趣味の問題だな。
318:デフォルトの名無しさん
10/06/03 06:52:18
p == q || p && q && *p == *q
319:デフォルトの名無しさん
10/06/03 09:21:58
p == q || と || p == q のどっちにするかは趣味の問題だな。
320:デフォルトの名無しさん
10/06/03 09:27:53
p == q を先にチェックするほうがいいにきまってるだろ。
321:デフォルトの名無しさん
10/06/03 09:42:16
なんで?
322:デフォルトの名無しさん
10/06/03 09:48:52
p と q が 0 でない事を先にチェックした方が良い
0だと以降が実行されない
p == q は p と q の両方が0でも真になってしまう
323:デフォルトの名無しさん
10/06/03 09:50:42
> p == q は p と q の両方が0でも真になってしまう
それが >307 が求めていたものでしょ。
324:デフォルトの名無しさん
10/06/03 09:55:05
>>32 参照はがしをしなくてすむなら、しないほうがはやいでしょ?
ポインタが同じところをさしているなら、ポインタの先を見るまでもない。
325:デフォルトの名無しさん
10/06/03 10:46:05
>>324
大人になれば分かる
326:デフォルトの名無しさん
10/06/03 11:09:17
>>324
ポインターの値が同じでも実体の値が違うことがある
327:デフォルトの名無しさん
10/06/03 11:16:50
順序は実際のデータでプロファイリングして決めるのが一番
328:デフォルトの名無しさん
10/06/03 11:19:07
>>326
PODとは限らんからね
>>324 はC++でプログラム組んだことがないんだと思う
329:デフォルトの名無しさん
10/06/03 11:29:17
>ポインターの値が同じでも実体の値が違うことがある
そんなスマポは使いたくない。
330:デフォルトの名無しさん
10/06/03 11:30:37
>>328
普通のポインタじゃなくて、スマートポインタの話をしていたの?
331:デフォルトの名無しさん
10/06/03 11:31:47
p,qが生ポインタでp == qで*p != *qって例えばどういうケースよ?現実的な事例を教えてくれ
332:デフォルトの名無しさん
10/06/03 11:32:55
メモリマップトI/Oなんて、もちださないでくれよ。
333:デフォルトの名無しさん
10/06/03 11:33:10
ポインターの値が同じでも実体の値が違う
ってどんな用途に使うスマートポインタなんでしょうか?
気になる
334:デフォルトの名無しさん
10/06/03 11:47:13
>>331
PODでなければ普通に起こるだろ。
335:デフォルトの名無しさん
10/06/03 11:49:35
>>331
それが保証されるのはCに限った話、C++は違うね
336:デフォルトの名無しさん
10/06/03 11:51:56
保証されるとかじゃなくて、現実的な話として、そういう設計の有益なクラスを例示してくれって言ってるの
337:デフォルトの名無しさん
10/06/03 12:03:17
>>336
例えばベースクラスが共通(またはどちらかがベースクラス)で、
片方への cast operator が定義されている場合とか
こういうコード普通に沢山存在してるだろ
有益かどうかはお前のさじ加減だし
338:デフォルトの名無しさん
10/06/03 12:19:45
p==qの時点でp,qの型は同じ
参照はがしても同じ型で比較されるだけだからキャストは関係ないだろ
339:デフォルトの名無しさん
10/06/03 12:21:59
>>337 あたまがわるいので、例が思いつかない。 具体例を教えてください。
class B { int x; };
class C { int y; };
class D : public B, C { int z; };
int main() {
D* p = new D();
B* q = p;
printf("p == q => %d\n", p == q);
printf("*p == *q => %d\n", *p == *q);
}
D に、どんな演算子を定義すればいいんですか?
340:デフォルトの名無しさん
10/06/03 12:28:41
みなさんが当たり前のように言ってるC++なら違うっていうのは
!=のおかしなオーバーロードのことでいいんでしょうか?
なんだか!=が真になるのが普通にあることみたいにいわれてるようなので
ひょっとしてこれではないのでしょうか?
あと>>334はPODって言ってますが組み込み型の間違いであっていますか?
PODの構造体は比較演算子が使えないですよね?
341:339
10/06/03 12:29:06
operator == を再定義するのは反則だよねえ?
#include <stdio.h>
class B { int x; };
class D : public B { int y; };
bool operator==(const D&, const B&) { return false; }
int main() {
D* p = new D();
B* q = p;
printf("p == q => %d\n", p == q);
printf("*p == *q => %d\n", *p == *q);
}
342:339
10/06/03 12:31:53
>ポインターの値が同じでも実体の値が違うことがある
operator == を再定義したら、「実体の値が違う」ことにはならないか。
343:デフォルトの名無しさん
10/06/03 12:35:37
>>319 == >>329
>>318 はどちらにしろ間違ってるんで、いち抜けする。
if p == q はダメだろう。
344:デフォルトの名無しさん
10/06/03 12:41:23
>>343
>>318 のどこが間違っているって?
345:デフォルトの名無しさん
10/06/03 12:42:26
if p == q はダメだろう。
346:デフォルトの名無しさん
10/06/03 12:43:41
(1) p と q が別のオブジェクトを指していて
(2) p == q で
(3) *p と *q の実体が違う
ということはありえないで、ファイナルアンサー?
347:デフォルトの名無しさん
10/06/03 12:45:24
p==qかつ*p!=*qなんて非常識なケースが普通に沢山あるようなコードを自信満々に書いちゃう>>337は別業種への転職をおすすめする
そうなるように書くことはできるが、副作用も含めてそうならないようにコードを書くのが当たり前の感覚
348:デフォルトの名無しさん
10/06/03 12:47:56
>>307 に答えだしたら
p=123456;
q=123456;
if p == q はダメだろう。
349:デフォルトの名無しさん
10/06/03 12:49:49
>>348 どこがダメ?
350:デフォルトの名無しさん
10/06/03 12:51:27
>>348 無効なポインタを渡したときに、アクセス違反が発生しないからダメとかつまんないこといってんじゃないよね?
351:デフォルトの名無しさん
10/06/03 12:51:41
>>349
自分で適当なアドレス突っ込んだ場合、
「参照剥がしして~」
の条件に合わなくなる(参照はがせない)
って言ってるんだろ?
アホかと思うがwwwww
352:デフォルトの名無しさん
10/06/03 12:53:34
普通にやってて自分でアドレス突っ込んじゃうような子がいたら消費者に訴えられるレベル
353:デフォルトの名無しさん
10/06/03 12:58:58
>>338
これが違う
p と q が同じ型だとはどこにも書いてないだろ
354:デフォルトの名無しさん
10/06/03 13:01:28
>>353
違う方じゃコンパイルエラーだろ
355:デフォルトの名無しさん
10/06/03 13:02:35
>>339
operator B();
というメソッド。
356:デフォルトの名無しさん
10/06/03 13:03:16
>>354
だからベースクラスが共通な場合って言ってるだろ
357:デフォルトの名無しさん
10/06/03 13:03:29
アップキャストはされるんじゃね
358:デフォルトの名無しさん
10/06/03 13:06:31
>>356
共通でなくどっちかがベースクラスの場合だね
359:デフォルトの名無しさん
10/06/03 13:07:11
>>356
URLリンク(codepad.org)
同じでもエラーだよ
360:デフォルトの名無しさん
10/06/03 13:12:31
p と q が別の実体を指しているのに、 p == q にするコードなんて書けないよ。
361:デフォルトの名無しさん
10/06/03 13:12:40
pとqは違うクラスです、とか、もう無茶苦茶
何考えてんだか…
だったらC++と言わず
char *p;
long *q;
でもいいわけでね…
362:デフォルトの名無しさん
10/06/03 13:15:18
>>361
>pとqは違うクラスです、とか、もう無茶苦茶
どっから同じクラスだって前提が出てきたんだ。
君の思い込みだろ?
363:デフォルトの名無しさん
10/06/03 13:15:30
>>318 がダメって言ってる奴って、ひとりだけ?
364:デフォルトの名無しさん
10/06/03 13:17:35
>>362 ばかばかしい。
次は、「釣りでした」とか「何あつくなってんの」とかかよ。
365:デフォルトの名無しさん
10/06/03 13:17:44
ひとりだけ
366:デフォルトの名無しさん
10/06/03 13:22:16
>>364
実務だと仕様書とか解釈が厳格になるからね
型が同じと書かれていないのに、勝手にそういう前提をおいたりしないんだよ
まぁ趣味の人にはわからない話かもしれないけどね
367:デフォルトの名無しさん
10/06/03 13:23:21
2chまできてお仕事ご苦労様です^^;
368:デフォルトの名無しさん
10/06/03 13:26:52
そうそう、ここは趣味の範囲だから実務の話されても困るわ。
369:デフォルトの名無しさん
10/06/03 13:45:09
C /C++という前提において仮定が無ければ、一般の場合を適合するのが普通じゃないか?
>>366は特殊な場合のみいってるよね。
370:デフォルトの名無しさん
10/06/03 13:54:55
>>307を見て、同じ型へのポインタじゃないと思えるほうが不思議
371:デフォルトの名無しさん
10/06/03 13:57:22
それはただの思い込み。
372:デフォルトの名無しさん
10/06/03 13:58:57
>>369 >>370
だから、趣味ならそれでいいんじゃない、大体動けばOK
でも仕事なら動かない場合とかあったら問題になる
だから最初から色んなケースを想定する
そういう習慣がついてんだよ
373:デフォルトの名無しさん
10/06/03 14:01:02
>>372
繰り返すが、ここは趣味のスレ、お前は場違い、出て行け。
374:デフォルトの名無しさん
10/06/03 14:01:02
仕事なら仕様を聞くだけで、余計な想像なんて入り込む余地はないだろw
375:デフォルトの名無しさん
10/06/03 14:04:46
>>374
ん?
最初の質問で p と q が同じ型だと書いてなかったら、
俺は同じ型でない場合も想定してただけだよ。
仕事でこういう場合に、勝手に同じ型だけしかありえんだろうって考えで
コードを書いたらとんでもないバクを生むことになるから。
376:デフォルトの名無しさん
10/06/03 14:07:11
屁理屈はお上手ですね。
377:デフォルトの名無しさん
10/06/03 14:09:52
どう見てもただの後付けw
378:デフォルトの名無しさん
10/06/03 14:10:11
いくら正論言おうと空気読めない奴が何をいっても無駄。
379:デフォルトの名無しさん
10/06/03 14:10:42
実務でもありえないような数値入力して、
プログラムが暴走して損害だしても、それは入力したユーザのせいになるよ。
プログラマがそんな細かいことまで考える義務はない。
プログラマの前提が優先されるからね。
380:デフォルトの名無しさん
10/06/03 14:12:47
>>375
お前以外の99人はpとqは同じ方という前提なんだよ
その時点でお前がまちがってるということ
381:デフォルトの名無しさん
10/06/03 14:14:25
民主主義の国は何もかも多数決で決められる、
それがいやなら北朝鮮でもジンバブエでも好きなところいけ。
382:デフォルトの名無しさん
10/06/03 14:16:17
p=qなら常に*p=*qは成り立つ、これが常識
そうならないケースを考える馬鹿が一人いるってこと
そして沢山の人から非難をあびている
383:デフォルトの名無しさん
10/06/03 14:20:45
p=q;
をみて
/*
p=q;
*/
まで仮定しないといけなくなるな。
384:デフォルトの名無しさん
10/06/03 14:23:50
仮定を排除してまずコンパイラが仕様通りでバグが無いか確かめます
385:デフォルトの名無しさん
10/06/03 14:26:57
パソコンにコンセントが刺さっているか調べます。
386:デフォルトの名無しさん
10/06/03 14:27:49
自分が仮想現実の住民でないか確かめます
387:デフォルトの名無しさん
10/06/03 14:32:58
例外的な可能性を考慮してダメだししたって言うには、
指摘の時点でそれを言ってないとダメ。
388:デフォルトの名無しさん
10/06/03 14:37:51
教えてください。
クラス foo と bar を用意したとします。
bar は foo 1つにつき1インスタンス必要なので、foo のコンストラクタで bar のインスタンスを作ってます。
ただ、bar は foo の情報を元に処理するので、bar のインスタンスを作る際の引数に、this (foo) を渡そうと思いました。
要するに、相互参照です。
foo.h と bar.h とした場合、include 順の指定がうまく行かずこまっています。
これは、この設計が誤っていますか?
ヘッダファイルや宣言の記述に細工が必要ですか?
正しい考え方や、記述の仕方を教えてください。
389:デフォルトの名無しさん
10/06/03 14:38:09
馬鹿なレスが多いんで見落としてた
>>347
俺も基本的にそういう考えだよ。別に俺がそう書きたいというわけでなく、
p==qかつ*p!=*q は存在しないということに対して、存在する場合もあると言っただけだよ。
そもそも cast operator を定義する時点で怪しいコードになってくる。
けどその有用性を利用しているコードも存在している。
だから、その性質を理解しておくのは必要なことだと思っている。
例えば行列を表すクラス A があって、
それを拡張してインバース属性を持つクラス B 作るとする。
このときに B には opertore A() を用意しておき、
インバース属性が立っていれば逆行列を返すようにするとか
そうすると A を使用していたコードがそのまま使える。
こういう手法を使うことはよくあるだろ。(少なくとも使ってる奴がいるだろう。)
390:デフォルトの名無しさん
10/06/03 14:41:49
ウザイ
391:デフォルトの名無しさん
10/06/03 14:43:12
ここまで来ると哀れだなw
392:デフォルトの名無しさん
10/06/03 14:43:51
>>388
'foo.h' で
class bar;
class foo {
.....
};
のように、空のクラス宣言をしてやれば回避できる場合もある。
これでいけるかどうかは相互参照の内容次第。
393:デフォルトの名無しさん
10/06/03 14:44:31
>>389
死ねばいいのに
394:デフォルトの名無しさん
10/06/03 14:51:43
>>388
インナークラスとして、一つのヘッダーにまとめてしまうとか
class foo {
class bar {
・・・・
};
・・・・
};
395:388
10/06/03 14:54:43
なるほど、空クラスですね。
やってみたのですが、やっぱり仰るとおり相互参照次第で、コンストラクタに this を渡したい場合はそれ相応の宣言が必要でした。
この考え方(構成)が間違っているという事ですかね。。
396:388
10/06/03 14:56:04
>>394
なるほど!!!
為してみます。
インナークラスかぁ。勉強になります。
397:デフォルトの名無しさん
10/06/03 19:50:52
質問です。
例文
int a;
printf("値をいれてください:");
scanf("%d",&a);
if(a<0&&a<9)
{
printf("値が違います!!");
}
とこういう文があったとして、aにたとえば10を入力するとエラーメッセージを出してもう一度
入力させる処理に戻りたいんですがなにを付け加えればいいですか?
398:デフォルトの名無しさん
10/06/03 19:55:37
do while
399:デフォルトの名無しさん
10/06/03 20:01:53
while(1) {
printf("値をいれてください:");
scanf("%d",&a);
if(0<=a && a<=9) break;
printf("値が違います!!");
}
400:デフォルトの名無しさん
10/06/03 20:03:24
int a;
INPUT:
printf("値をいれてください:");
scanf("%d",&a);
if(a<0&&a<9)
{
printf("値が違います!!");
goto INPUT;
}
401:デフォルトの名無しさん
10/06/03 20:22:20
int a;
do {
printf("値をいれてください:");
scanf("%d",&a);
if (a < 0 && a < 9) {
printf("値が違います!!");
} else {
402:デフォルトの名無しさん
10/06/03 20:23:25
途中送信しちゃった
ごめんね
break;
}
while (true);
403:デフォルトの名無しさん
10/06/03 20:56:54
>>398-402
たくさん回答ありがとうございます。gotoが一番簡単そうですね、勉強になりました。
404:デフォルトの名無しさん
10/06/03 21:56:15
>>403
こうする手もある
int a;
while (!Input(&a)) { }
int Input(int* p) {
printf("値をいれてください:");
scanf("%d", p);
if(*p<0&&9<*p) {
printf("値が違います!!");
return 0;
}
return 1;
}
405:デフォルトの名無しさん
10/06/03 22:07:46
gotoは推奨されていない
406:デフォルトの名無しさん
10/06/03 22:13:42
それは思考放棄
gotoを使ったほうがやりたい事を的確に表現している場合はgotoを使うほうが良い
407:デフォルトの名無しさん
10/06/03 22:39:28
まぁgoto使った方が便利な時もあるけど
あんまり>>397の質問のレベル的にgotoを
使う癖は付けない方が良いと思う。
408:デフォルトの名無しさん
10/06/04 00:47:02
Cで無限大を表記するにはどうすればいい?
409:デフォルトの名無しさん
10/06/04 00:56:58
+inf
-inf
410:デフォルトの名無しさん
10/06/04 00:57:59
って処理系依存だっけ?
411:408
10/06/04 01:10:36
ごめんなさい説明不足がありました
今xy軸上に三角形を作るプログラムをやっていて3点を直線で結び出来上がる三角形があるとして
ある線が傾き無限の直線になったとき三角形が描けなくなります。※2点のx座標が等しい場合
それで無限になったとき(yの変化量/0)になったら回避したいので質問させていただきました
412:デフォルトの名無しさん
10/06/04 02:00:07
傾きを計算する前に判断しようぜ
413:デフォルトの名無しさん
10/06/04 02:51:47
今xy平面に三角形を作るプログラム作成に取り組んでいて3点を線分で結び出来上がる三角形があるとして
ある線分の傾きが無限になったとき三角形が描けなくなります。※2点のx座標が等しい場合
それで無限になったとき(yの変化量/0)になったら回避したいので質問させていただきました
414:デフォルトの名無しさん
10/06/04 02:53:44
3点A(1, 0) B(1, 1) C(0, 1) で、AとBのx座標が等しいが、三角形ABCは書ける。
三角形がかけないのは、3点が同一直線上にある場合。
415:デフォルトの名無しさん
10/06/04 05:51:03
>※2点のx座標が等しい場合
なぜこれで判定しない?
416:デフォルトの名無しさん
10/06/04 11:20:49
参照を後からセットすることはできませんか?
Class B;
Class A {
B& m_b;
};
のような状態で m_b をコンストラクトより後のタイミングでセットしたいのです。
ポインタにすればできますが * を付ける必要があるので、参照でやりたいんです。
417:デフォルトの名無しさん
10/06/04 11:42:50
無理。
生ポインタ弄るのが嫌な場合はboost::reference_wrapper的なのを使えばいいが、
operator* 等を使うのが嫌という要求は言語仕様の埒外。
418:デフォルトの名無しさん
10/06/04 12:06:35
無理やりやったりして
URLリンク(codepad.org)
保証されてないよね
419:デフォルトの名無しさん
10/06/04 12:21:40
>>417
>operator* 等を使うのが嫌という要求は言語仕様の埒外。
参照ってそういう機能だろ、問題はセットできるのが初期化時に限られてるということ
420:デフォルトの名無しさん
10/06/04 13:13:31
問題というより安全性の確保だろ。
いつのまにかぬるぽになってたりしないように。
421:デフォルトの名無しさん
10/06/04 15:13:51
>>418
LLP64だと悲惨な事になりそうだな
422:デフォルトの名無しさん
10/06/05 09:42:28
ポインタも参照もほとんどの実装では中身は同じだろうから
LLP64とかは関係ないと思われる
もちろん規格は保証してくれないが
ダミー変数の必要のない方法
URLリンク(codepad.org)
もちろん実際に使っちゃだめだよ
423:デフォルトの名無しさん
10/06/05 10:47:02
get()メソッドで妥協していいならboost::optional<T &>だな
int x, y;
boost::optional<int &> opt(x);
opt.get() = 1; // x = 1
opt = y; // yに張替え
*opt = 2; // y = 2
424:デフォルトの名無しさん
10/06/05 10:48:23
*でも面倒くさいと言ってんのに.get()はないわ
425:デフォルトの名無しさん
10/06/05 10:58:50
じゃあどうしようも無いな
operator . がオーバーロードできない時点で参照剥がしの手間はかならず必要になる
代入と暗黙変換はその限りではないが
426:デフォルトの名無しさん
10/06/05 11:05:40
unionに参照は入れられないか・・・
427:デフォルトの名無しさん
10/06/05 11:26:35
LZ77で圧縮したデータを解凍するソースを書いて欲しいと言われたんだが
圧縮情報を表す箇所って、規定無いよね?
abcdeabcdezをLZ77に掛けると、abcde[5,5]zとなるけど
[5,5]を判断する場合どうすれば良いの?
圧縮側もこちらで書いていいなら\\[5,5]とか目印入れれば分かるけど
解凍ソースのみで困ってる
428:デフォルトの名無しさん
10/06/05 11:40:52
解凍ソースあるならいればいいじゃん
429:デフォルトの名無しさん
10/06/05 11:51:35
>>428
ソースは一切なし。圧縮したデータを見ることもまだ出来ない
それでいて、最初のLZ77を使ってるからと言われ
きちんと解凍出来るソースを書かなきゃいけないみたい
調べると、何処のサンプルも圧縮情報の前に適当なマーク入れたり
9bitにして、その後ろが圧縮情報か見たりしてるから、一発で動くのが書ける気がしない
430:デフォルトの名無しさん
10/06/05 12:00:37
LZ77の仕様書よめばどう扱ってるか解るんじゃね?
431:デフォルトの名無しさん
10/06/05 13:48:25
亜種が大量にあるとかいう話だけど
432:デフォルトの名無しさん
10/06/05 22:41:12
int[10]が書き込まれてるファイルをfread(hoge,sizeof(int),100,fp)とかやったら足りない部分はどうなるの?
ちゃんと0で埋まる?それとも保障されてない?
433:デフォルトの名無しさん
10/06/05 22:43:52
>>432
埋まらない。何もされない。
434:デフォルトの名無しさん
10/06/05 23:17:42
thx
435:デフォルトの名無しさん
10/06/06 02:36:53
C++の具体的に難しいところってどの辺なんでしょうか?Cだとポインタと配列辺りだと思うんですが。
ちなみに今継承あたりを勉強中です。
436:デフォルトの名無しさん
10/06/06 02:40:11
TMP
437:デフォルトの名無しさん
10/06/06 09:58:14
経験的には、ポインタとか配列は難しくなくて、初心者でもすぐに使い始める。
難しいのは適切に使うこと。初心者はなんでもポインタで解決しようとしがち
C++とかもだいたい同じで言語仕様が難しいというより、どう使うのかが難しい。
いっぱい用語があるのも難しいところかも。pimplとか
438:デフォルトの名無しさん
10/06/06 10:03:11
pimpl使ったら分からんと怒られた
439:デフォルトの名無しさん
10/06/06 10:08:35
ポインタは概念が難しいのではなく書式が難しいと言う人が多いけど
どう考えても書式が難しいのではなく概念が難しいから初心者はつまずくだろ
440:デフォルトの名無しさん
10/06/06 10:17:43
ポインタのポインタの配列とか
関数ポインタの配列とか
概念は簡単でも書き方に戸惑う
441:デフォルトの名無しさん
10/06/06 10:21:32
そんなふうに書かなくても済ませられるのがC++のいいところじゃないか
442:デフォルトの名無しさん
10/06/06 11:32:38
>>439
概念が簡単だとは言わないが、わけのわからん書式が、せっかく理解しかけた
初心者の脳を改めて引っ掻き回して台無しにするのも事実。
443:デフォルトの名無しさん
10/06/06 11:38:06
>>442
int *a;
*aはint変数のように扱える。論理的かもしれないけど直感的ではないな。
イテレータも、二つのイテレータを使えば0個も表現できるってのも論理的だけど直感的ではなくわかりにくいね。
444:デフォルトの名無しさん
10/06/06 11:41:00
ポインタは全く難しくないよ。
だってお前らですら全員理解してるじゃんwww
445:デフォルトの名無しさん
10/06/06 11:47:36
つうか概念は簡単だろ
446:デフォルトの名無しさん
10/06/06 11:50:16
Cでポインタより難しい概念あるの?
447:デフォルトの名無しさん
10/06/06 11:51:35
int *p じゃなくて *int p ならまだ分かりやすかったんじゃないかとか思ったり
448:デフォルトの名無しさん
10/06/06 11:59:43
int* a
449:デフォルトの名無しさん
10/06/06 12:13:04
>>447
int *a;
int pa;
int asteriska;
int XXX;
これらの表記では、*a も pa も asteriska も XXX もすべて int型として扱える。
int の後ろに書いたものが、int型になる。
つまり、aの参照剥がしは*aと直感的に分かる。
*int p;
この表記では、pがint型へのポインタということが分かるのかもしれないが、
pをどう参照剥がしすればint型になるのかこの書式からは分からない。
以上の点で、前者の表記のほうが分かりやすいと考えられる。
450:デフォルトの名無しさん
10/06/06 12:19:44
>>449
ならば、int *a;で変数の領域が確保されなきゃおかしいじゃん。
451:デフォルトの名無しさん
10/06/06 12:20:51
ああ、そうだね。
452:デフォルトの名無しさん
10/06/06 12:24:03
じゃあ int &a; は &a が int なんだね
453:デフォルトの名無しさん
10/06/06 12:38:21
int *a = XXX の右側に来るのがポインタ値って時点で全く直感的じゃない
454:デフォルトの名無しさん
10/06/06 13:07:06
>>280
遅れましたがありがとうございました
455:デフォルトの名無しさん
10/06/06 13:08:47
int *a; のメリットは int *a, *b; とするのを確実に忘れないという一点のみなのに
*a が int だとよく分かる(キリッ とか言うから面倒なことになる
456:デフォルトの名無しさん
10/06/06 13:10:25
なるほど
457:デフォルトの名無しさん
10/06/06 13:10:52
int* const a = XXX;
とやりたい時はどうするの?
458:デフォルトの名無しさん
10/06/06 13:14:58
それでいいんじゃないの
459:デフォルトの名無しさん
10/06/06 13:15:50
int *const a = XXX, *const b = YYY;
460:デフォルトの名無しさん
10/06/06 13:20:47
直感に頼るからいけない
俺は左から型に演算していくと理解してる
int const * const & a;
(((((int) const) *) const) &) a;
intをconstにして、そのポインタ型をとって、それをconstにして、その参照型をとって、それにaという名前をつける
add_ref<add_const<add_ptr<add_const<int>::type>::type>::type>::type a;
461:デフォルトの名無しさん
10/06/06 13:44:31
>>460
こんなに深い宣言なんだぞ。キリッ
462:デフォルトの名無しさん
10/06/06 13:49:35
そこへ配列宣言が颯爽と登場。
463:デフォルトの名無しさん
10/06/06 14:14:17
メンバ関数ポインタへの配列があらわれた!
464:デフォルトの名無しさん
10/06/06 14:19:24
>>452-463
つまり、C/C++の構文はダメダメってことだね。
465:デフォルトの名無しさん
10/06/06 14:22:54
別に
466:デフォルトの名無しさん
10/06/06 14:37:03
identityとtypedefがあればすべて解決
467:デフォルトの名無しさん
10/06/07 22:37:11
構文と言うか文法と言うか、とにかくそっち方面で残念な言語だとは思う
468:デフォルトの名無しさん
10/06/08 20:20:00
すみません。
現在1クラス1ヘッダ&1ソース という形で30対のヘッダーとクラスがずらっと並んでいます。
他の方のプロジェクトを見るとヘッダの数だけがやたら多かったり、
逆にヘッダは1個しかなかったりする様なのですが、
1クラス1ヘッダ&1ソース というのは無駄で変なのでしょうか?
新クラスを作るたびに宣言程度のヘッダーを増やすのはやめて、
クラスの宣言程度のヘッダーはギッシリ纏めてしまったりした方が良いのでしょうか。
469:デフォルトの名無しさん
10/06/08 20:28:41
boostなんてファイルのモンスターハウスだぜ
470:デフォルトの名無しさん
10/06/08 20:30:04
↑ ×30対のヘッダーとクラスがずらっと
○30対のヘッダーとソースがずらっと(訂正すみません)
471:デフォルトの名無しさん
10/06/08 20:37:11
>>468
原則分けたほうがいいよ
472:デフォルトの名無しさん
10/06/08 21:57:34
1クラス1ヘッダ&1ソースでいいだろ
473:デフォルトの名無しさん
10/06/09 00:48:47
Javaじゃないんだから、1クラス1ソースに拘ることはないだろ。
まぁ、関連のないクラスを纏めるのは論外だが。
インクルードファイルに関しては、ソースの数だけあっても全くおかしくはないと思う。
474:デフォルトの名無しさん
10/06/09 12:19:37
>>468
業務開発なら珍しくない
メンテ時には、ひとつのファイルに詰め込むより
こっちのが良いことが多い
475:デフォルトの名無しさん
10/06/09 13:25:51
C++のdelete[]の挙動について質問です。
int* p = new int[5];
int* q = new int[10];
int* z=p;p=q;q=z; //ポインタの交換
delete[] p; //どこまで開放されるのか?
delete[] q; //どこまで開放されるのか?
これ、メモリリークが起きたり、
逆に、開放しちゃいけない場所まで
開放されたりしないでしょうか?
476:468
10/06/09 13:31:07
>>469 >>472-474
間違ってはなかったのですね。ありがとうございます。疑問が解決しました。