トップページ⇒tech
981コメント294KB

C++相談室 part14

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
System.out.println("前スレが埋まったので新しく作りました。");
System.out.println("みなさんC++をやりましょう。");
System.out.println("てか突っ込めよ!>>2-1000");

前スレpart13 http://pc3.2ch.net/test/read.cgi/tech/1038031395/
関連スレは前スレを見ましょう。
0153デフォルトの名無しさんNGNG
>>152
どう上手くいかないのかを良く観察汁。
そして、それが何故なのかを考える。
そして、型の違いに注目すると...。
0154デフォルトの名無しさんNGNG
もう一度本をよく読んでみると、
「整数の出力は8進、10進、16進の3種類で行えます」
ってあったけど、それが答えかな?
とすれば、浮動小数点は10進のみ?
0155デフォルトの名無しさんNGNG
型は型でも、注目すべきはむしろそのサイズ。
0156デフォルトの名無しさんNGNG
市販本についてるプログラムをコンパイルすると
次のようなエラーが出てしまって困っています。

LINK : fatal error LNK1104: ファイル "nafxcwd.lib" を開けません。

どうしたらよいのでしょうか?
0157デフォルトの名無しさんNGNG
>>156
nafxcwd.libをパスの通っているところに置く
0158デフォルトの名無しさんNGNG
>>157
初心者で書いてることが分からないのですが・・・、
nafxcwd.libは何なのでしょうか?
パスの通っているところに置くというのも分からないので
教えてください。

0159デフォルトの名無しさんNGNG
>>158
コマンドラインに何とタイプしてコンパイルしてる?
0160デフォルトの名無しさんNGNG
lib = ライブラリ。
パスの意味がわからなかったら、
とりあえず、コマンドプロンプトから *.exe を実行しようと試みよ。
怒られたら

set PATH

とタイプして、[Enter]を押せ。そして、そこに表示されるものの意味を調べろ。
0161デフォルトの名無しさんNGNG
>>158
見てみたらnafxwd.libってMFCのデバッグのスタティック用のライブラリみたい。
君のコンパイラがVCでかつProfessional以上ならコンパイルできるはず。
スタンダードならコンパイルできない。設定で共有MFCを使用するに変更しないと。
0162デフォルトの名無しさんNGNG
あ、>>160 は、>>158 へのレス。
0163デフォルトの名無しさんNGNG
>>158
Microsoft Visual C++でビルドしていて
コマンドを打って無いのですが、
そこを直すにはどうすればいいのでしょう?
0164156NGNG
すみません、
163は>>159です。

>>160
すみません。コマンドプロンプトがよく分からなくて・・・。

とりあえず161さんの言うように設定を変えてみたのですが、
次のようなエラーが出てしまいました。

MSVCRTD.lib(crtexe.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/CJpegDecoder.exe : fatal error LNK1120: 外部参照 1 が未解決です。

どうしたら良いのかまた分からず・・・。
すみませんが教えてください。

0165デフォルトの名無しさんNGNG
>>164
なんか別の設定をさわったろ?
0166156NGNG
>>165
161で書かれてあるところを直しただけなのですが、
設定が悪いのでしょうか?
どうすれば良いですか?
0167デフォルトの名無しさんNGNG
>>166
じゃあ、とりあえずプロジェクトの設定のリンクで
/SUBSYSTEM:WINDOWSを消せ
0168デフォルトの名無しさんNGNG
>>166
ちゃう、
/SUBSYSTEM:CONSOLEになってるかも、とりあえずどっちかあったら消せ
0169デフォルトの名無しさんNGNG
152ですが、int型でも負の値をいれると8進、16進でうまくいきません。
double型の場合、ios::oct等が対応していないためcout.setfの行を無視していると思ったのですが・・・
これも155さんが言うサイズと関係しているような気がするのですがよくわかりません。
(もしかしたらこの質問自体が意味不明な文になってるかも・・・)
0170156NGNG
>>168
/SUBSYSTEM:CONSOLEを消したら

LINK : fatal error LNK1561: エントリー ポイントを定義しなければなりません
とエラーが出てしまいました。
まだ何かあるのでしょうか?

0171デフォルトの名無しさんNGNG
>>169
doubleは普通の整数型とは値の表し方(フォーマット)がぜんぜん違うから16進で表示しても無意味だから対応していないんだろうね。
0172デフォルトの名無しさんNGNG
>>170
メイン関数がないんだろ。
その本についていたプログラムはそれだけで動くものじゃないんじゃないのか?
0173デフォルトの名無しさんNGNG
>>169
負の値でうまくいかないってのはなにがうまくいかないんだ?
16進数なら
-1 → ffffffff
だぞ
0174デフォルトの名無しさんNGNG
8進数なら37777777777?
なんかプログラム勉強する以前のような気がしてきた・・・
0175156NGNG
>>172
確かにmainが無いみたいです。
そういう説明が書いてなかったので気づきませんでした。
VC++の設定を初めていじって不安なのですが、
元に戻しておいた方が良いのでしょうか?
0176デフォルトの名無しさんNGNG
VC++ネタは専門スレがあったとおもふ
0177デフォルトの名無しさんNGNG
>>175
ぜんぜん問題ない。
0178デフォルトの名無しさんNGNG
class A{}
class B : public virtual A{}
というような継承でvirtualを書くとどうなるんですか?
0179デフォルトの名無しさんNGNG
virtual継承になる。
0180デフォルトの名無しさんNGNG
>>179
すいません、virtual継承って何ですか?
0181デフォルトの名無しさんNGNG
>>180
http://www.google.co.jp/search?q=virtual%E7%B6%99%E6%89%BF&ie=UTF-8&oe=UTF-8&hl=ja&lr=
0182デフォルトの名無しさんNGNG
仮想クラスってありましたよね?
それの継承版ですか?
0183デフォルトの名無しさんNGNG
>>182
多重継承について勉強しなされ。
0184デフォルトの名無しさんNGNG
>>182
仮想クラスなんて存在しません。あるのは抽象基底クラスでしょ。仮想継承は、
多重継承時に基底クラスのサブオブジェクトを一つだけにする。

…っつかプログラミング言語 C++ 読むと、図付きで解説してると思うぞ。
0185デフォルトの名無しさんNGNG
学校で、「男根の機能をC++のクラスで詳細に設計せよ」という課題が出ました。
手淫をすると、長さと太さの変数を上げ精子が飛び出させるというところまでは簡単なのですが、
一回射精をするとしばらく射精ができなくなるのが難しいです。
しかも、射精の直後でもがんばればできますし・・・

誰か作っていただけませんか?
0186デフォルトの名無しさんNGNG
>>185
Stateパターン
0187デフォルトの名無しさんNGNG
X* pca=new X;
X* pcb;
pcb=pca;
pcb->func();
delete pcb;
pcb=NULL;
pcb->func();これが落ちもせずに走るのは、どういうわけでしょう?
これはそういうものなんでしょうか?
0188デフォルトの名無しさんNGNG
未定義とか、不定とか?
0189デフォルトの名無しさんNGNG
さー!みんなで考えよう〜!
X::func() がメンバ変数を一切触っていないか、もしくは
delete 後のメモリが他の動作で破壊されていない事。
で NULL の定義が
#define NULL pca
もしくは
#define NULL pcb
だったりすると…

あら不思議!
0190デフォルトの名無しさんNGNG
ahoka
0191デフォルトの名無しさんNGNG
>>187
X::func() が非仮想メンバ関数で、かつ、直接または間接にそのインスタンスのメンバ変数の参照や
仮想メンバ関数の呼び出しを一切していないならば、そうなる場合もある。

>>189
pcb=NULL とした後では、たとえ delete 後もメモリがそのまま残っていたとしても、
インスタンスを参照しようとした瞬間に落ちると思われ。
0192デフォルトの名無しさんNGNG
>>187
thisポインタに一切アクセスしないならば動くような気もする。
0193デフォルトの名無しさん NGNG
Microsoft VC++で構造体のメンバーになっているポインタ
の指すデータを見るにはどうすれば良いでしょうか?
0194デフォルトの名無しさんNGNG
>>193
デバッガの使い方って事?
0195デフォルトの名無しさんNGNG
VCのSystem.out.println的関数情報キボンヌ
わかんねーよ
0196193NGNG
>>194
デバッガでシンボル名を指定するとポインタのアドレスのデータが分かるのですが
その次以降のアドレスに入っているデータが見れないで困っています。
>>195
System.out.println的関数って何を見たらいいのでしょう?
初心者なので良く分からなくて・・・。
0197デフォルトの名無しさんNGNG
>>196
ウオッチウィンドウを使え
0198デフォルトの名無しさんNGNG
funcがstaticメンバ関数なんでしょ。
0199デフォルトの名無しさんNGNG
>>198
非 static でも、呼び出す関数が静的に決定されるなら、関数呼び出しでは
落ちんよ。逆に言えば、関数呼び出しで保護違反を食らう可能性があるのは、
func が仮想関数の場合だけ。

もちろん非仮想関数であっても、中でメンバ変数を触ったらアウトだけど。
0200デフォルトの名無しさんNGNG
>>199
そこまでムキにならなくても・・・
0201デフォルトの名無しさんNGNG
クラス内で関数の定義を書いてしまうのと、
inlineをつけてクラス定義の外に書くのとでは
どういう違いがあるんでしょうか?
0202デフォルトの名無しさんNGNG
>>201
別に違いはない
0203デフォルトの名無しさんNGNG
>>202
処理系によるけど、外に書くと定義順によっては inline 展開されない場合が
ある。

inline void Foo::func1() { func2(); }
inline void Foo::func2() {}

これだと func1() をコンパイルする時点で func2() の定義が見えないので、
インライン展開されなかったりさ。
0204デフォルトの名無しさんNGNG
コード生成はかなり後のフェーズっしょ
そりゃあよほどアホなコンパイラじゃないのかね
0205デフォルトの名無しさん NGNG
配列が大きすぎてすぐ強制終了させられるんですけど、
メモリを確保するいい方法がありますでしょうか?
0206デフォルトの名無しさんNGNG
newもmallocも知らないんスか?
0207デフォルトの名無しさんNGNG
newやmalloc使ってもダメなんです。
他にいい方法ありますか?
0208デフォルトの名無しさんNGNG
>>207
コンパイラオプションのヘルプをよく見ると、
メモリ量の上限を指定する方法が書いてあると思うよ。
0209デフォルトの名無しさんNGNG
>>208
Microsofr VC++ ver6使ってるんですけど、
上限を増やす方法知ってたら教えてください。
0210デフォルトの名無しさんNGNG
いったい何バイト確保したいんだ?
0211デフォルトの名無しさんNGNG
>>210
後、2000×1000×3バイトなんですけど、
1000×1000で限界みたいなのです・・・。
0212デフォルトの名無しさんNGNG
>>211 これかな?
http://www.microsoft.com/japan/developer/library/vccore/_core_.2f.zm.htm
0213デフォルトの名無しさんNGNG
>>212
設定の変更したことないので、どうすればいいのかよく分からず・・・。
どうしたら良いのでしょう?
0214デフォルトの名無しさんNGNG
>>212 アナタヒドイヒトネ
0215デフォルトの名無しさんNGNG
>>211

new でも malloc でもその程度楽勝で確保できるぞ。
だいたい「強制終了」させられるんなら、プログラムのバグだと
思うし。
0216デフォルトの名無しさんNGNG
>>211
具体的にどんなエラーが発生しているんだ?
エラーメッセージ晒せ
0217デフォルトの名無しさんNGNG
>>215
new 使って2次元配列を定義しようとしてもできないのですが、
どうしたらいいのでしょうか?
0218デフォルトの名無しさんNGNG
すいません。こうしてました。
int *data1 = new[1000 * 1000];
int i = 0;
for(i = 0;i <= 1000 * 1000;i++)
  data1[i] = 0;
0219212NGNG
まあ、ネタはおいといて、、、
>>216
強制終了されるってことは、コンパイルエラーなしでコンパイル通って
実行時に落ちるってことでは?
0220デフォルトの名無しさんNGNG
friendクラス、関数の宣言はprivateでもpublicでも意味的には全く同じ?
0221205NGNG
そうです。コンパイルエラーなしです。
>>218のようにはしていないので
二次元配列のnewでの定義の仕方お願いします。
0222デフォルトの名無しさんNGNG
>>204
> そりゃあよほどアホなコンパイラじゃないのかね
俺が確認したのは gcc 2.95.x
gcc 3 系列は試してないので知らんけど。
0223デフォルトの名無しさんNGNG
>>221
int **data = new int[1000][1000];
0224205NGNG
>>223
コンパイル出来ないのですが・・・。
何かおかしいのでしょうか?
0225デフォルトの名無しさんNGNG
>>224
からかわれたんだ。
自分の書いたソースをあげてみそ
0226デフォルトの名無しさんNGNG
>>220
friend クラス、関数はメンバじゃないから、アクセス制御とは当然関係ない。
だからこういうこともできる。

#include <iostream>
class Foo;
class Bar {
public:
    void print(const Foo&);
};

class Foo {
    int m_;
    friend void Bar::print(const Foo& f) { std::cout << f.m_ << std::endl; }
public:
    Foo(int n = 0) : m_(n) {}
};

int main()
{
    Foo foo;
    Bar bar;
    bar.print(foo);
}
0227デフォルトの名無しさんNGNG
>>226
ありがとうございます。
教えてもらったところで申し訳ないのですが、
上のコードはg++だと2.95,3.2どちらでも
エラーになります。
0228デフォルトの名無しさんNGNG
typedef int* LPINT;
int **data = new LPINT[1000];
for(int i = 0;i < 1000;i++)
  data[i] = new int[1000];
0229デフォルトの名無しさんNGNG
struct
{
 int data[1000][1000];
}
0230デフォルトの名無しさんNGNG
data;
0231デフォルトの名無しさんNGNG
int (*data)[1000] = new int[1000][1000];
0232デフォルトの名無しさんNGNG
typedef int* LPINT;
int **data = new LPINT[1000];
int *temp = new int[1000 * 1000];
for(int i = 0;i < 1000;i++)
  data[i] = temp[i * 1000];
0233デフォルトの名無しさんNGNG
>>232
ちょっと修正
typedef int* LPINT;
int **data = new LPINT[1000];
int *temp = new int[1000 * 1000];
for(int i = 0;i < 1000;i++)
  data[i] = &temp[i * 1000];
0234デフォルトの名無しさんNGNG
さて、正解は?
0235デフォルトの名無しさんNGNG
あらかた出尽くした?
0236デフォルトの名無しさんNGNG
>>234
ちょっと受けた
0237デフォルトの名無しさんNGNG
typedef data[1000][1000];
0238デフォルトの名無しさんNGNG
>>227
あ、gcc の挙動の方が正しいみたいだね。
VC7しか手元に無いんで深く考えずに、書いてしまった。
まあ、friend 宣言を定義化したのはただの行数稼ぎで
本筋ではないので……スンマソン、欝氏。
0239デフォルトの名無しさんNGNG
ソースの書き方教えてください。

unsigned int aaa; ← 0xFFDDEECCの4byte Data
下記のように1byte Dataにしたいのですが
どのようにやればうまくいきますか?
unsigned char a1; ← 0xFF
unsigned char a2; ← 0xDD
unsigned char a3; ← 0xEE
unsigned char a4; ← 0xCC
また逆に詰め込みたい場合はどうするのが良いのでしょう。
0240デフォルトの名無しさんNGNG
& >>と | <<
0241239NGNG
>>240
具体的にどのようにすればよいのでしょう
素人ですまそん
0242デフォルトの名無しさんNGNG
>>241
C++じゃなくてCなのでそっちで探せ
0243デフォルトの名無しさんNGNG
unsigned char *a;
a = (unsigned char *) &aaa;
0244デフォルトの名無しさんNGNG
afo
0245デフォルトの名無しさんNGNG
>>244
あながちそうでもない
0246デフォルトの名無しさんNGNG
>>245
同意だが #ifdef BIG_ENDIAN とかで括っとけよ。
0247デフォルトの名無しさんNGNG
// int は 32 ビットを想定
void int2charArray(int src, char* dst)
{
 dst[0] = src     & 0xFF;
 dst[1] = (src >> 8) & 0xFF;
 dst[2] = (src >> 16) & 0xFF;
 dst[3] = (src >> 24) & 0xFF;
}

こんなんでどーだ?
0248デフォルトの名無しさんNGNG
>>247
別にunsigned long使えばいいと思うが。
あと、unsigned charの方が良いな。
0249デフォルトの名無しさんNGNG
union を使うのがいいような気も……
0250デフォルトの名無しさんNGNG
>>249
むりやりC++にしてみた(藁
配列じゃなく、std::vectorなのは勘弁しれ

#include <iostream>
#include <vector>
#include <algorithm>

template<typename T>
union Foo {
    T val;
    unsigned char byte[sizeof(T)];
};

template<typename T>
std::vector<unsigned char> toUchar(const T& val)
{
    std::vector<unsigned char> result(sizeof(T));
    Foo<T> foo;
    foo.val = val;
    std::copy(foo.byte, foo.byte+sizeof(T), result.begin());
    return result;
}

template<typename T>
T toVal(const std::vector<unsigned char>& vec)
{
    Foo<T> foo;
    std::copy(vec.begin(), vec.end(), foo.byte);
    return foo.val;
}
0251デフォルトの名無しさんNGNG
unsigned int aaa = 0xFFDDEECC;
unsigned char a1 = (aaa >> 24) & 0xff;
unsigned char a2 = (aaa >> 16) & 0xff;
unsigned char a3 = (aaa >> 8) & 0xff;
unsigned char a4 = (aaa >> 0) & 0xff;
unsigned int bbb = (a1 << 24) | (a2 << 16) | (a3 << 8) | (a4 << 0);
0252デフォルトの名無しさんNGNG
& 0xffはいらないだろ。

と思いつついつも書いてしまう小心者の俺...
■ このスレッドは過去ログ倉庫に格納されています