トップページ⇒tech
1001コメント310KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/02/05(火) 01:18:41
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0166デフォルトの名無しさん2008/02/08(金) 14:07:41
>>165
その計測器メーカに合わせるのが一番。
あるメーカは旧型機種の機能を改変しつつ新機能を作るかもしれないし、
あるメーカは旧型機種の機能を残しつつ新機能を作るかもしれない。

なんてことは兎も角、使い易いように作れば?
01671382008/02/08(金) 15:05:04
返信遅くなってすいません!

>>140
STLは使ってなくてもこのエラーなんですよ…
Hello Worldみたいな文字を出力するだけのプログラムでも
実行できないです。

>>142
Visual C++ 2008 Express Editionで実行したらできました!
ありがとうございます。

>>154
マクロも使ってないので違うと思うのですが…

Visual C++ 6.0を使い慣れているので
どうにかして実行させたいのですが・・・
0168デフォルトの名無しさん2008/02/08(金) 15:22:22
class Fruit;
class Apple : Fruit;

std::vector<Fruit> fruits;を作ると

抽象クラスをインスタンス化できません。
と言われるです。どうするですか?
0169デフォルトの名無しさん2008/02/08(金) 15:23:31
Fruit がそういうつくりになってるんじゃないの?
0170デフォルトの名無しさん2008/02/08(金) 15:24:38
>>168
class Fruitを具体化してください。
0171デフォルトの名無しさん2008/02/08(金) 15:36:19
std::vector<Fruit*> fruits;
0172デフォルトの名無しさん2008/02/08(金) 16:14:45
コンパイラにBCCを使って数値計算をしているのですが、
しばらくプログラム実行していると、EXP: OVERFLOW ERRORと出ます。
これは、exp関数に入れた値がexp関数の扱える値(doubleの範囲)よりも大きいと言うことでしょうか?
0173デフォルトの名無しさん2008/02/08(金) 16:23:52
>>167
俺、解決方法知ってるんだが…
0174デフォルトの名無しさん2008/02/08(金) 16:25:09
vevtorにvcの_com_ptrは入りますか?
0175デフォルトの名無しさん2008/02/08(金) 16:59:55
コピー初期化もコピー代入もできるから問題ないはず。
0176デフォルトの名無しさん2008/02/08(金) 22:22:37
すいませんちょっとお聞きしたいんですが、

#include <iostream>
using namespace std;

int main(){
char ss[80] = "これは文字列です";

cout << ss[0] << ss[1];

return 0;

}

ってやって、coutで「こ」って表示されないのは、どういう理屈でしょうか??
0177デフォルトの名無しさん2008/02/08(金) 22:24:09
UTF-8 なら3バイト必要だが、そういうわけではなくて?
0178デフォルトの名無しさん2008/02/08(金) 22:34:20
>>176
ひょっとしてなんか変な文字がでたりしてるか?
01791762008/02/08(金) 22:34:23
ぐは、そうだったんですね・・2バイトでいいんだと思ってました汗
cout << ss[0] << ss[1] << ss[2];
とやったらちゃんと表示されました。
ありがとうございましたm(_ _)m
0180デフォルトの名無しさん2008/02/08(金) 22:40:31
ちなみにWindows上だと>>176のコードで「こ」はちゃんと出た。(bcc32 / gcc@cygwin)
0181デフォルトの名無しさん2008/02/08(金) 22:44:58
それはお前がソースをSJISで書いてるだけ
0182デフォルトの名無しさん2008/02/08(金) 22:55:36
>>175

ども。
0183デフォルトの名無しさん2008/02/08(金) 23:42:34
UTF-8 だと全て3バイトって訳じゃないのが面倒なところだよな。
0184デフォルトの名無しさん2008/02/08(金) 23:43:11
>>181
UTF-16 でも出るがな。
0185デフォルトの名無しさん2008/02/09(土) 00:17:28
他で聞いてきます
0186デフォルトの名無しさん2008/02/09(土) 00:20:35
fatal error LNK1104:コンパイラは、ファイルd3d9.libを開けません
とでてしまいビルドできません
手動でリンカにd3d9.libを設定しましたが無理でした
どうすればよいのか
0187デフォルトの名無しさん2008/02/09(土) 00:33:08
ファイルはあるの?
0188デフォルトの名無しさん2008/02/09(土) 00:40:25
pathの設定はしたか?
0189デフォルトの名無しさん2008/02/09(土) 01:58:17
More Exceptional C++が届いたんだが
いきなり最初のコードがコンパイルできねえ
一気にやる気失くした。やっぱ古い本はこんな
もんかねえ。
0190デフォルトの名無しさん2008/02/09(土) 02:00:08
ちなみにコレ
VC++2008 g++ 4.0 でも不可

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])
{

(argc > 2
   ? ofstream(argv[2], ios::out | ios::binary)
   : cout)
<<
 (argc > 1
    ? ifstream(argv[1], ios::in | ios::binary)
    : cin )
.rdbuf();

 return 0;

}

0191デフォルトの名無しさん2008/02/09(土) 02:06:46
全く問題ないけど。まさかとは思うが、>190って2バイト空白入れたままで悪態ついているお馬鹿さん?
0192デフォルトの名無しさん2008/02/09(土) 02:15:25
コンパイルできないときはエラーメッセージを書こう

なんてのは宿題スレでも徹底されてるような気がする。
0193デフォルトの名無しさん2008/02/09(土) 02:17:41
gcc 4 で通らないな。
まあ当たり前だな。
右辺値の ofstream と左辺値の ostream(cout) だと
片方が右辺値なので右辺値にキャストして型を揃えようとするが、
この2つじゃどうやっても型を揃えられない。
0194デフォルトの名無しさん2008/02/09(土) 02:20:34
VC だと右辺値の ofstream を
テンポラリオブジェクトを作成して ofstream& にキャストしてしまえるから(拡張機能)
コンパイル通るかもしれん。
0195デフォルトの名無しさん2008/02/09(土) 04:37:38
たぶん、ここでしか聞けないのかなと思い書き込みさせてください!
File1.cppで定義・使用している複数配列 double a[10][5] を他の
ファイル(File2.cpp)でも共有して使用したいときって

(File2.cpp)
void CGridDlg::OnGdraw() //中で使用したい関数です
{
  extern double a[10][5];
 ・・・・・・・・
}

と定義すれば使用できるものなのでしょうか。単配列(a[10]等)の時は同様の
方法で使用できたのですが。複数配列になると上記ではリンクエラー
(LNK2001)がでてしまいます。環境はVC6++(MFCダイヤログベース)です。
超初心者です。Cの本を見てポインタなり、externなりが関係しそうかなと思った
のですが、なかなかいい兆しが見えなくて助けを借りたい次第です。
0196デフォルトの名無しさん2008/02/09(土) 07:49:02
>>191
ここに見やすく貼るために全角にしてるんよ

>>192
VC++2008でのエラーメッセージだがprivateメンバーにアクセスしようとしてる
らしい。
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ
(クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスで
きません。

>>193
ostream(cout)の意味が分からないんですが。3項演算子 A ? B : C
のBがrvalueでCがlvalueだからC(ここではcout)を右辺値にしようと
するということかな?

>>194
昔の規格なりコンパイラではOKだったのかもしれんです。
0197デフォルトの名無しさん2008/02/09(土) 08:25:12
>>191
0198デフォルトの名無しさん2008/02/09(土) 08:27:28
空白orタブ <-> /**/
の置換スクリプトを希望
0199デフォルトの名無しさん2008/02/09(土) 08:28:26
>>197
>昔の規格なりコンパイラではOKだったのかもしれんです。
0200デフォルトの名無しさん2008/02/09(土) 08:55:15
>>196
左辺値の ostream の値である cout って意味ね。
エラーの理由はそれで問題ない。
0201デフォルトの名無しさん2008/02/09(土) 09:50:51
>>195
externで共有させるのはお勧めしない。
他の関数で配列を参照させるためには、ポインタを渡せばよい。
関数内のローカル変数へのポインタは、その関数実行中にしか有効にならないから、一時的にしか参照・共有できない。
0202デフォルトの名無しさん2008/02/09(土) 09:59:52
>>195
CGridDlg の private メンバ変数にして、
a の取得関数を用意すれ。

class CGridDlg {
public:
typedef double Hoge[5];
Hoge* GetA() { return m_a; }
const Hoge* GetA() const { return m_a; }
private:
Hoge m_a[10];
};

Hoge* a = grid_dlg.GetA();
a[0][0] = 1;
0203デフォルトの名無しさん2008/02/09(土) 10:37:35
猫でもわかるを買ったんですが、
超初心者の俺にはさっぱりわかりません。
何かわかりやすい本などあったら教えてください。お願いします。
0204デフォルトの名無しさん2008/02/09(土) 10:39:09
>>203
ちなみにC言語です。よろしくお願いします。
0205デフォルトの名無しさん2008/02/09(土) 10:41:09
>>203
その本で分かりにくいとかじゃなくて
さっぱり分からないというのであれば無理です、あきらめてください

それより多少分かりやすいと評判のものもありますが、大差はありません


それとも環境が用意できないとかそういうことですか?
0206デフォルトの名無しさん2008/02/09(土) 11:54:33
>>203
その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。

手で入力して試すのが肝心。

付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。
0207デフォルトの名無しさん2008/02/09(土) 13:26:37
>>200
なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという
ことですね。
試したところでは、static_cast<ostream>(cout)やostream obj(cout);
はできないみたいでが、そもそもostreamオブジェクトは生成できないも
のなんですか?だとしたらostreamオブジェクトであるcoutはどのように
作成されたのですかね?
0208デフォルトの名無しさん2008/02/09(土) 13:37:27
コピーしようとすると見るエラーだな
0209デフォルトの名無しさん2008/02/09(土) 13:55:53
>>207
ostreamやistreamには、引数を取るコンストラクタがある。
coutやcinはそれを使って作られるんだろう。
0210デフォルトの名無しさん2008/02/09(土) 14:04:36
>>207
static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる
0211デフォルトの名無しさん2008/02/09(土) 15:06:27
>>209
>>210
ストリームとストリームバッファには弱い結合(ストリームバッファの同期)
と強い結合(ストリームバッファの共有)ってのがあるみたいですね。
おそらく、コンソールデバイスに関連付けられたストリームバッファ
(例えばcdevという名前だったとして)というのがシステムには存在し
ていてcoutは、ostream cout(&cdev); というふうに定義されてる
んでしょうね。ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
0212デフォルトの名無しさん2008/02/09(土) 15:07:47
ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。

は>>208さんへのレスでした。
0213デフォルトの名無しさん2008/02/09(土) 15:24:28
coutをコピーするというのは意味がわからん、ってのもあるかもね
コンソール自体が2個に増えるわけじゃあるまいし
0214デフォルトの名無しさん2008/02/09(土) 15:33:48
>>198
つかってやってください
ttp://pc11.2ch.net/test/read.cgi/unix/997605845/55
0215デフォルトの名無しさん2008/02/09(土) 16:41:15
>>205
環境が用意できないです。
それでもあきらめた方がいいですか?
0216デフォルトの名無しさん2008/02/09(土) 16:49:08
>>203
そのままの意味が分からないけど、HDVも圧縮された素材ですよ。
H.264とは異なる方式で。

ttp://ja.wikipedia.org/wiki/HDV
0217デフォルトの名無しさん2008/02/09(土) 16:52:43
あ、なんかすげー誤爆ってた。失礼orz
0218デフォルトの名無しさん2008/02/09(土) 16:58:08
環境が用意できないっつー意味がわからん。
Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?
02192032008/02/09(土) 17:03:06
すいません。アフォで…
自分は今、第二章で止まってます。
と言うのも、いきなり「では、ソースを見てみましょう」となり、
「開発環境によってコンパイルの手順が異なります」
↑この時点でわかりません。

自分には向いてないのかな…orz
0220デフォルトの名無しさん2008/02/09(土) 17:05:32
void hoge(const char* name){ char* piyo = name + (sizeof(char) * 5); }

こんなようなことはなんで出来ないんでしょうか?
文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです

error C2440: '=' : 'const char *' から 'char *' に変換できません。
このようなエラーが出るのですが正直ここでなんでこのエラーがでるんだ?といった感じです
0221デフォルトの名無しさん2008/02/09(土) 17:12:11
const char *piyo 
0222デフォルトの名無しさん2008/02/09(土) 17:13:49
>>220
書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。
void hoge(const char * name)
{
char const * piyo = & name[4];
}
こう書けば問題ありません。
0223デフォルトの名無しさん2008/02/09(土) 17:14:36
char *のconst性を除去してるから。入れたいならpiyoもconst char *にする。
hoge内で文字列を弄りたいなら引数をchar *にするべき。
引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)
02242202008/02/09(土) 17:17:20
>>221-223
ありがとうございます。
よく考えたらいじる必要はないのでpiyo側をconstにしました
0225デフォルトの名無しさん2008/02/09(土) 17:18:01
>>219
とりあえず、なにか揮発環境は持っているのか?
0226デフォルトの名無しさん2008/02/09(土) 17:18:34
> name + (sizeof(char) * 5)
彼は大丈夫だろうか。
0227デフォルトの名無しさん2008/02/09(土) 17:19:23
>>225
はい。
ジクロルボスは揮発するので大丈夫です。
0228デフォルトの名無しさん2008/02/09(土) 17:22:30
俺のチームのメンバも先週揮発したぜ。
0229デフォルトの名無しさん2008/02/09(土) 17:23:57
ちょっと待て、それは「蒸発」じゃないのか?
0230デフォルトの名無しさん2008/02/09(土) 17:24:28
>>226
それって問題あるのか?パッと見わからん
0231デフォルトの名無しさん2008/02/09(土) 17:26:23
>>230
char であるときには問題にはならないが int とかになると…
0232デフォルトの名無しさん2008/02/09(土) 17:26:24
>>230
>220にはこう書いてある。
>文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです
0233デフォルトの名無しさん2008/02/09(土) 17:26:31
>>229
そうだな。揮発は性質で、蒸発は現象だからな。
0234デフォルトの名無しさん2008/02/09(土) 17:27:47
>>231
いや、だいじょうぶだろw
ちゃんとintの大きさに対応してくれるよw
0235デフォルトの名無しさん2008/02/09(土) 17:27:55
>>230
ポインタは自動的にそのサイズ分進むから、sizeofを掛ける必要はない、とかかな?
0236デフォルトの名無しさん2008/02/09(土) 17:28:25
>>234
ごめん間違えた
0237デフォルトの名無しさん2008/02/09(土) 17:28:46
ConceptGCCで、190のコードのofstreamとifstreamを
ostream&&とifstream&&にstatic_castしたものを食わせたらどうなるかと試してみたが、
エラーだったorz。右辺値参照はライブラリまで及んでいなかった。
0238デフォルトの名無しさん2008/02/09(土) 17:29:06
sizeof(*name)にするべきとか。
0239デフォルトの名無しさん2008/02/09(土) 17:29:46
>>238
阿呆ですか?
0240デフォルトの名無しさん2008/02/09(土) 17:30:00
>>219
適当に c 入門 初心者とかでぐぐれば環境の入れ方から説明してるとこがきっと見つかるよ
02412032008/02/09(土) 17:46:21
>>225
>>240
すいません。もう一度調べなおしてみます。
0242デフォルトの名無しさん2008/02/09(土) 17:47:29
>>238-239
&5[name] でいいだろ。
0243デフォルトの名無しさん2008/02/09(土) 17:49:48
>>242
>232
0244デフォルトの名無しさん2008/02/09(土) 17:58:03
char ch='a';
cout <<(int) ch << '\n'; // 97
int dt=97;
cout << (char)dt<< '\n'; // 'a'
とできるのに、

wchar_t ch1='あ';
cout <<(int) ch1 << '\n'; // 33340
int dt1=33440;
cout << (wchar_t)dt1<< '\n'; // 0x82a0

と'あ'がでないで、82a0が出るのはなぜですか?
(82a0は33440の16進です)
0245デフォルトの名無しさん2008/02/09(土) 18:03:03
class test{
 char* str;
 int len;
public:
 test(const char* str);
};
test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
}

とすると
(msvcr80d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccccccc0 を読み込み中にアクセス違反が発生しました。
こんなようなエラーがでます、いろいろとコメントアウトして試してみていたのですが
str = new char[len+1];部分でエラーが出ているようです、これを
str = new char[256];のようにするとエラーはでないのですが、定数でなければならないとかないですよね?
一体なんででしょうか?
0246デフォルトの名無しさん2008/02/09(土) 18:10:38
書いてないところのバグを見つけろって言う話?
0247デフォルトの名無しさん2008/02/09(土) 18:10:39
>>245
そういう時は先ず、str0の長さが実際にいくつだったのかを確認しましょう。
0248デフォルトの名無しさん2008/02/09(土) 18:10:53
>>245
その部分は問題ないように見える。
256にするとエラーが出ないところからみて、
どこかでバッファオーバーフローしてるんじゃない?
02492452008/02/09(土) 18:12:34
>>246-247
えっとすみません、str0には固定の文字を入れるようにして試しています
16文字の文字列でして、コンストラクタ内でlenの長さを表示させるときちんと16文字になっています。
また、同じくコンストラクタ内でstr0を表示させるときちんと渡した16文字の文字列が表示されます
02502452008/02/09(土) 18:15:42
main内に
char* buff = "abcdefghijklmnop";
test hoge(buff);
これだけです
余計な部分を全てコメントアウトしてるのでこれでコードは全てです
0251デフォルトの名無しさん2008/02/09(土) 18:16:08
実行部分をみせろ。
test test1("abcdabcdabcdabcd");
ならまったく問題ないはず。
02522512008/02/09(土) 18:22:16
ごめん、違うな
0253デフォルトの名無しさん2008/02/09(土) 18:23:47
>>245
そこを変えたら動くからといって、バグの出元がそこだとは限らない
ぜんぜん関係なさそうな別の場所も疑う必要がある
0254デフォルトの名無しさん2008/02/09(土) 18:24:42
strにはアクセスしないの?
test内でstrcpyしなくていいのか?
なにがやりたいんだ?
02552452008/02/09(土) 18:36:41
>>253
提示した部分以外をコメントアウトしているのですがエラーが出る状態です

>>254
その部分が原因かとも疑ってコメントアウトさせているのですがエラーが出る状態です

test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
 strcpy_s(str, len+1, str0);
 printf("%s\n", str0);
 printf("%d\n", len);
 printf("%s\n", str);
}
こんな具合にしますと
abcdefghijklmnop
16
abcdefghijklmnop
と表示されますがしっかりエラーがでます
0256デフォルトの名無しさん2008/02/09(土) 18:44:34
mainってことは、MFCとかは使ってないわけか……
リビルドしたら直るとか言う落ちはないよな?
0257デフォルトの名無しさん2008/02/09(土) 18:44:45
>>255
余計なincludeもコメントアウト。
さらにエラーが無くなるまでコメントアウト。
新規プロジェクトと作成して、必要なコードだけ貼り付けて動かしてみる。
0258デフォルトの名無しさん2008/02/09(土) 18:44:52
おかしいなあ、ちゃんと動くぞよ。
0259デフォルトの名無しさん2008/02/09(土) 18:46:07
class test{
 char* str;
 int len;
public:
 test(const char* str);
};
test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
}

int main(int, char**)
{
char* buff = "abcdefghijklmnop";
test hoge(buff);
return 0;
}

これで、エラーになるって事?
0260デフォルトの名無しさん2008/02/09(土) 18:53:05
少なくともうちでは落ちない。

VC++ 2005 Express Edition SP1 + Win2KSP4
0261デフォルトの名無しさん2008/02/09(土) 18:59:59
>>255
どの行で例外発生してるか突き止めたのか?
02622442008/02/09(土) 19:00:55
こちらもヨロ
0263デフォルトの名無しさん2008/02/09(土) 19:02:03
>>262
wchar_tがただのtypedefの環境ではそうなる。
VC++6とか。
02642442008/02/09(土) 19:05:57
>>263
はい、VC++2005EEですので、
そういうものなのですね。
どうもでした。
0265デフォルトの名無しさん2008/02/09(土) 19:06:46
2005はさすがにtypedefじゃないんじゃないか?
■ このスレッドは過去ログ倉庫に格納されています