【初心者歓迎】C/C++室 Ver.54【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/14(水) 01:00:02ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0237デフォルトの名無しさん
2008/05/24(土) 00:00:41何か日本語的におかしいかな?
0238デフォルトの名無しさん
2008/05/24(土) 00:02:41そこじゃなくて、戻り値がstd::stringだろうと。
値返しでしょ?
0239デフォルトの名無しさん
2008/05/24(土) 00:08:171GBのstr()があったら丸々コピーするのか
0240デフォルトの名無しさん
2008/05/24(土) 00:11:300241デフォルトの名無しさん
2008/05/24(土) 00:12:480242デフォルトの名無しさん
2008/05/24(土) 00:17:21初心者スレなので、初心者のために説明書いておくてst
>>215は問題ない実装。
ただし、ss.str()でインスタンスが作られて、
string strでもう一つインスタンスが作られるので、
ほんの僅かの無駄がある。でも通常気にすることは無いレベル。
>>216は、その僅かな無駄も無くそうとしていて、
const参照による一時オブジェクトの束縛を利用しようとした。
しかし、replaceの戻り値が一時オブジェクトでないので、
束縛出来ず消えてしまい、&strは不正な領域を指してしまう。
>>233は関数から戻るまで、その引数が生存することを利用してる。
str()で作られたインスタンスが、replaceで変更され、
「<<」で出力された後に消える。一番無駄の無い実装。
>>239
そういう場合、普通はstr()などせずにストリームアルゴリズムで扱う。
0243デフォルトの名無しさん
2008/05/24(土) 00:17:39データはstringstreamが握ってるんだから、
std::stringのdata()やc_str()のように、データへの参照を返す手段も
あったほうが良かったよねってことじゃないの
0244デフォルトの名無しさん
2008/05/24(土) 00:34:40>>216はreplaceの戻り値が一時オブジェクトでも不正になる。
0245デフォルトの名無しさん
2008/05/24(土) 00:44:25string::c_str()の存在だって本当は褒められたもんじゃない。
0246デフォルトの名無しさん
2008/05/24(土) 00:44:40const参照は一時オブジェクトを束縛できるよ。
オブジェクトの寿命が参照のスコープまで延命される。
0247デフォルトの名無しさん
2008/05/24(土) 00:45:03>不正になる。
ならないよ。
分かりやすそうなサンプルコードがあった。これ見て。
http://cppemb.blog17.fc2.com/blog-entry-49.html
0249デフォルトの名無しさん
2008/05/24(土) 01:03:09別にプログラマとして「凄腕だった」わけじゃないけど、
一応テニスゲームが入選したことでエニックス(現スクウェア・エニックス)と縁できた人なわけで、
投稿者管理のプログラムが関の山っていうのは、えらく誤解を招く表現だと思うけど。
いずれにせよ、「プログラミングという行為のリアリティ」を経験した上でゲームデザインやってる、
というのは大きいね。
そのフィーリングをまるで知らず、何か肝心のところでピント外れのSEや文系上司、多いものな。
0250デフォルトの名無しさん
2008/05/24(土) 01:40:54軽井沢誘拐案内までは
シナリオ・音楽・グラフィックに加えて
プログラムも組んでたとおもたけど。
0251217
2008/05/24(土) 01:48:53みなさんありがとうございます
軽い処理、ゲームを作るのはプログラマの永遠の課題ですねw
自分のゲーム重いので・・
>>221
HALってこんなこともやっていたのですね・・初耳でした
参考にさせていただきます
>>228
おお このようなものまで
多少調べたのですが出てきませんでした
ありがとうございます、参考にさせていただきます
0252デフォルトの名無しさん
2008/05/24(土) 01:51:23#include <iostream>
#include <string>
int main(){
std::wcout << L"あ" << std::endl;
return 0;
}
何も表示されません。どうすれば良いんですか。
0253デフォルトの名無しさん
2008/05/24(土) 01:53:55std::wcout.imbue(std::locale("japanese"));
したら使えるようになりました。ありがとうございました。
0254デフォルトの名無しさん
2008/05/24(土) 02:25:54優勝すれば大金ゲットのチャンスのある大会。
コンピュータ将棋の大会で優勝したら年収1000万以上らしいよ。
シストレFXグランプリで優勝したら300万で、特別賞が1000万。
YSSと彩のページ http://www32.ocn.ne.jp/~yss/index_j.html
シストレFXグランプリ http://www.fx-gp.com/
0255デフォルトの名無しさん
2008/05/24(土) 14:26:59http://www.gsic.titech.ac.jp/supercon/
高校生で有名なのっていうとコレじゃないかな?グループ参加だけど
0256デフォルトの名無しさん
2008/05/24(土) 18:12:55内部でwchar_tを使用しているので、バイナリファイルの読み込み
にwfstreamを使用しようと思ったのですが、read()のバッファの引数
がwchar_tになってしまうので、このままではwchar_tからcharに変換
するためにコストがかかってしまいます。
C++の標準ライブラリの範囲内で、ファイル名にwchar_tを使いつつ、
char形式のプレーンなバイト列を読み込む方法はありませんでしょうか?
よろしくお願いします。
0257デフォルトの名無しさん
2008/05/24(土) 18:15:08wfstreamでもファイル名はwchar_tではなくてcharですね…
標準ライブラリの範囲内ではファイル名にwchar_tは使えないのでしょうか…
0258デフォルトの名無しさん
2008/05/24(土) 18:19:26fstreamのコンストラクタの引数で、wchar_tも取るんですね。
どうもwfstreamでないとwchar_tを取らないと思い込んでいました。
失礼しました。
0259デフォルトの名無しさん
2008/05/24(土) 18:31:40移植性は無いように思う
0260214
2008/05/24(土) 18:33:32なんだか色々複雑なんですね・・。とても参考になりましたm(_ _)m
0261デフォルトの名無しさん
2008/05/24(土) 18:34:52それはVisual C++など一部処理系の独自拡張。
一般には(現行規格では)、ファイル名の引数の型は
const char*であるものしか存在しない。
もし仮にBoostを使って良ければ、Filesystemのfstreamが使える。
こいつは、ワイド文字列でもファイル名を指定できるようになっていて、
ワイド文字列でファイル名を指定できない環境では、
マルチバイト文字列に変換して開くようになっている。
0262デフォルトの名無しさん
2008/05/25(日) 08:52:53#include <fstream>
std::fstream f(L"test.txt", std::ios::out);
f << L"テスト";
としても何も書かれていないtest.txtが出力されるだけでうまく行きません。
0263デフォルトの名無しさん
2008/05/25(日) 10:39:05#include <locale>
int main()
{
std::wfstream f(L"test.txt", std::ios::out);
f.imbue(std::locale(""));
f << L"テスト";
}
一応、元と合わせておいたけど、
出力だけならofstream/wofstreamで十分。
0264デフォルトの名無しさん
2008/05/25(日) 10:44:29入出力は、8ビットのやつにしとけ
0265デフォルトの名無しさん
2008/05/25(日) 12:01:13自作クラス用にstd::swapを特殊化しようとして上手くいかないんだけど……。
0266デフォルトの名無しさん
2008/05/25(日) 12:11:130267265
2008/05/25(日) 12:23:230268デフォルトの名無しさん
2008/05/25(日) 12:38:12ここに書かれてあるようにcとc++を同時に使うには、はじめに何を宣言したらいいですか?
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "math.h"
#include "time.h"
#include "sift.h"
#include "imgfeatures.h"
#include "kdtree.h"
#include "utils.h"
#include "xform.h"
#include "cv.h"
#include "highgui.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
こんな宣言したらエラーがでたんですが…
0269デフォルトの名無しさん
2008/05/25(日) 12:54:25何がしたくて、そういう宣言(というかinclude)したんだ?
それとエラーメッセージくらい書かないと、
ここにエスパーは居ないよ。
0270デフォルトの名無しさん
2008/05/25(日) 13:04:46最初から全部宣言してしまえ。と考えるからそうなる
必要になったら追加するように
0271デフォルトの名無しさん
2008/05/25(日) 13:04:47#include <stdio>
これだけ
0272268
2008/05/25(日) 13:07:571>c:\program files\microsoft visual studio 8\vc\include\cstdio(25) : error C2059: 構文エラー : ':'
>c:\program files\microsoft visual studio 8\vc\include\cstdlib(18) : error C2143: 構文エラー : '{' が ':' の前にありません。
1>c:\program files\microsoft visual studio 8\vc\include\cstdlib(18) : error C2059: 構文エラー : ':'
というエラーがだーーーーっとでます。
0273デフォルトの名無しさん
2008/05/25(日) 13:09:200274デフォルトの名無しさん
2008/05/25(日) 13:10:52で、それはCなのかC++なのかはっきりしてもらわないと困る。
0275デフォルトの名無しさん
2008/05/25(日) 13:11:27#include <stdio>
これだけだとエラーでまっせ
0276デフォルトの名無しさん
2008/05/25(日) 13:11:540277デフォルトの名無しさん
2008/05/25(日) 13:17:09cでもともとあったプログラムにC++のソースをドッキングさせることになったので
http://www.geocities.jp/ky_webid/cpp/language/038.html
を試そうとしているところです。
0278デフォルトの名無しさん
2008/05/25(日) 13:18:05環境はvisualstudio2005です
0279デフォルトの名無しさん
2008/05/25(日) 13:20:13extern "C"
{
#include "C_function.h"
}
って囲めばいいよ
0280デフォルトの名無しさん
2008/05/25(日) 13:22:20#include <iostream>
はC++のヘッダーだから、
.cのソースファイルには使えないぞ。
0281デフォルトの名無しさん
2008/05/25(日) 13:34:31class Hoge { float f; };
float f[10];
Hoge hoge[10];
memcpy(f, hoge, sizeof(f));
とするとfにはHogeのfが順番に格納される、という理解は合っているでしょうか。
0282デフォルトの名無しさん
2008/05/25(日) 13:38:33>>class のインスタンスにsizeofを使うとデータメンバだけのサイズが返されますが
そうとは限らないから。
0283デフォルトの名無しさん
2008/05/25(日) 13:42:37floatは4バイトだから32bit環境では期待どおり動くかもしれないが
仮にそれがcharだったら動かないし、64bit環境でコンパイルしたらずれる可能性もある。
0284デフォルトの名無しさん
2008/05/25(日) 13:42:48using namespace std;
int main()
{
cout << "test" << endl;
return 0;
}
268はこれでエラーがでるん?
0285281
2008/05/25(日) 13:44:220286デフォルトの名無しさん
2008/05/25(日) 15:26:41281のHogeはPODになっているから
どんな環境でも問題ないぜ。
0287デフォルトの名無しさん
2008/05/25(日) 15:59:04そうかもしれんがPODでなくなる可能性を考えると
やめたほうがいい。
Win32APIの構造体など、PODであることが将来的にある程度保証された場合しか使わない方がいいと思うんだよね。
0288デフォルトの名無しさん
2008/05/25(日) 17:12:45これを改行ではなく任意の文字で行うにはどうすれば良いんでしょうか?
0289デフォルトの名無しさん
2008/05/25(日) 17:33:020290デフォルトの名無しさん
2008/05/25(日) 18:04:040291デフォルトの名無しさん
2008/05/25(日) 23:16:19単純に{ }でくくるのではなくて以下のように
do{ }while(0)
でくくっているのがありますが
どういう意図ですか?
do {
} while (0);
0292デフォルトの名無しさん
2008/05/25(日) 23:19:16http://www.st.rim.or.jp/~phinloda/cqa/cqa8.html
真ん中付近のマルチステートメントの項
0293デフォルトの名無しさん
2008/05/25(日) 23:19:54if (...)
HOGE();
else
//...
ifとelseの間に{}と;の2文現れるのでコンパイルエラーになる。
0294デフォルトの名無しさん
2008/05/26(月) 00:51:540295デフォルトの名無しさん
2008/05/26(月) 00:56:120296デフォルトの名無しさん
2008/05/26(月) 01:19:561つの式に連続して書ける
0298デフォルトの名無しさん
2008/05/26(月) 12:53:25調べてみたのですが出てきませんでした。
0299デフォルトの名無しさん
2008/05/26(月) 13:00:12一つ一つカウントするか、配列にcharを整数とみなしてカウントしていく。
0300デフォルトの名無しさん
2008/05/26(月) 15:07:110301298
2008/05/26(月) 15:40:330302デフォルトの名無しさん
2008/05/26(月) 19:03:21gccのバージョンは3.4.5、ICUは4.8です。
icu::UnicodeString us(s.c_str(), "utf8");
というだけのコードに
g++ -LC:\Lib\icu\lib -otext.exe text.o -licuuc -licudt
で
undefined reference to `_imp___ZN7icu_3_813UnicodeStringC1EPKcS2_'
undefined reference to `icu_3_8::UnicodeString::~UnicodeString()'
undefined reference to `icu_3_8::UnicodeString::~UnicodeString()'
というエラーがでます。
他にも
icu/lib/*.lib を icu/lib/lib_a/lib*.a にリネームして
g++ -LC:\Lib\icu\lib\lib_a -otext.exe text.o -licuuc -licudt
としたり、
g++ -LC:\Lib\icu\bin -otext.exe text.o -licuuc38 -licudt38
としたりしたのですが、同じエラーがでます。
どうしたらよいのでしょうか?
よろしくお願いします。
0303302
2008/05/26(月) 19:12:14他にも
g++ -LC:\Lib\icu\lib -otext.exe text.o -licuuc -licudt・・・・・
g++ -LC:\Lib\icu\lib\lib_a -otext.exe text.o -licuuc -licudt・・・・・
g++ -LC:\Lib\icu\bin -otext.exe text.o -licuuc38 -licudt38・・・・・
と全てのライブラリをリンクするのも試しましたが、同じエラーがでました。
0304デフォルトの名無しさん
2008/05/26(月) 19:45:25C++はコンパイラが違うと名前マングリングみたいなABIが違うんで
ライブラリのバイナリ互換性は無い
0305302
2008/05/26(月) 19:51:10レスありがとうございます。
その点は考えていませんでした。HPを見ても確かにVC++中心のようです。
でも、検索するとCygwinで使っている人もいるようです。
それならgccから使えるように思うのですが、出来ないのでしょうか?
0306デフォルトの名無しさん
2008/05/26(月) 19:53:130307302
2008/05/26(月) 19:56:45レスありがとうございます。
バイナリがVC++用かもしれないから、自分のコンパイラでgcc用にコンパイルしてみろって事ですよね?
やってみます。
0308マイク ◆yrBrqfF1Ew
2008/05/26(月) 20:42:36ss.str()で値返しされたオブジェクトの参照のconst参照で寿命延長じゃなかったっけ・・・。
あれ・・・そういえばストラウストラップのC++第三版でこんな感じの注意を読んだような読まないような・・・。
スレ汚し失礼した。
0309302
2008/05/26(月) 21:05:19一応結果を書いておきます。
まずreadmeを見たところ、
Cygwinを使った場合には出来上がったライブラリがCygwinに依存するようです。
これは避けたかったので、適当にmingw環境でほぼ丸ごとコンパイルしてみたのですが、
大量の未define・未定義エラーが出ました。
とりあえず適当にdefineはしたのですが、やはりうまく行かないようです。
かなり難しいようなので、他のライブラリを使うなりしようと思います。
結局出来ませんでしたが、ともかくありがとうございました。
0310デフォルトの名無しさん
2008/05/26(月) 21:12:03replaceが無かったら寿命延長される。
0311デフォルトの名無しさん
2008/05/27(火) 01:33:00あ?ほんとに分かってんのか?
「はい」ってのはな「はい、わかりました」を略して「はい」なんだよ
頭だけでわかったって言わねんだぞ?学校の勉強じゃねえんだから
社会では?お?実際に出来て初めて「わかった」言うんだ
出来もしねえ奴が軽々しくはいなんて言うんじゃねえよ
すいませんじゃねえよこら。お?申し訳ありませんじゃねえんだよ。
申し訳ありませんってのは本当に反省した奴だけが言える事だろうが。
反省してるって事は今度は必ず出来るって事だ。
お前今できんのかよ。今日のお前は出来てたのかよ?お?
出来もしねえ癖に口だけ一丁前な事言うんじゃねえよ。
お?聴こえてんのかよコラ?あ?
やる気がねえんだったら来なくていいぞ?
お前ナメてんだろコラ?
仕事中だと思って優しく口で言ってりゃ調子に乗ってんじゃねえぞコラ?お?
外で遭ってたら今頃カタワだぞお前?とっくに?あ?
0312デフォルトの名無しさん
2008/05/27(火) 10:14:35それマジで言ったん?ソースあんならすぐ出せ
マジなら2ちゃんねら総力を上げて潰すが
0313デフォルトの名無しさん
2008/05/27(火) 10:18:460314デフォルトの名無しさん
2008/05/27(火) 12:33:060315デフォルトの名無しさん
2008/05/27(火) 12:34:20を
m_combbox.AddString(Description[64]);
で使えるように
LPCTSTR型に変更するにはどうすればいいですか?
0316デフォルトの名無しさん
2008/05/27(火) 12:47:38返事しないとしないで怒られるし・・・
もう怒られるのがデフォってぐらいに思ってればいいのかな
0317デフォルトの名無しさん
2008/05/27(火) 12:52:06ふつーに
m_combbox.AddString(Description);
でいいんじゃないかい。Unicodeビルドだと一手間必要になるが。
0318デフォルトの名無しさん
2008/05/27(火) 12:53:02上司が基地外の場合、上司の上司と手をつなぐしかないだろう。
これはたいていうまくいく。
うまくいかない場合、自分が基地外の可能性を疑え。
0319デフォルトの名無しさん
2008/05/27(火) 13:01:360320デフォルトの名無しさん
2008/05/27(火) 13:01:49なんだそれ、MFCか?
最近のVC++ならatlconv.hあたりをインクルードしてCA2T
昔のならUSES_CONVERSIONとかいう呪文を唱えてマクロかな
0321デフォルトの名無しさん
2008/05/27(火) 13:03:30ただのコピペだから、「それ懐かしいな」とか「ひさびさに見た」
とか「総力www」とかそんなレスしとけばいいよ
0322デフォルトの名無しさん
2008/05/27(火) 16:34:32面白くないネタは潰すに限る
0323デフォルトの名無しさん
2008/05/27(火) 17:08:31***.DLLの記述がヘッダーファイルにもないしどのDLLを使うかはどこで指定してるんですか?
それらしき文は
#ifndef XXX_H
#define XXX_H
・
・
・
#ifdef XXX_EXPORTS
#define XXX_API __declspec(dllexport)
#else
#define XXX_API __declspec(dllimport)
#endif
ぐらいです
0324デフォルトの名無しさん
2008/05/27(火) 17:15:14インポートライブラリ(.lib)は無いのか?
0325デフォルトの名無しさん
2008/05/27(火) 17:16:26よくある小さなサンプルプログラムでは、エラー処理の箇所に直接文字列リテラルを書きこんでありますが、
大きなプログラムになると、リテラルの保守性の悪さが出てきそうな気がします。
かといって、変数にするとなるとエラーメッセージ1つ1つに変数名をつけるのが大変だし、
"○○がありません。"のように、エラーメッセージに変数を含む場合も困る気がします。
一般的にはどのように実装しているのですか?
0326デフォルトの名無しさん
2008/05/27(火) 17:47:01enum ErrorNos {ErrorMisc, ErrorFileOpenError, ...};
例えばこんな処理があったとして。
FILE * fp = fopen(fileName, "r");
エラー処理関数をそのエラー番号でこんな感じに呼ぶ。
if (fp == NULL) errorProc(ErrorFileOpenError, fileName);
変数がある場合に備えて、幾つかオプション引数を取れるようにしておくこともよくある。
或いは、エラー文字列配列をこんな形で作ってもいい。
const char * const errorStrings[] = {"Undocumented error.", "File(%s) is not found.", ...};
この場合はこんな感じにそれぞれで出力ロジックを用意しなければならないのでお勧めはしない。
if (fp == NULL) fprintf(stderr, errorStrings[ErrorFileOpenError], fileName);
0327デフォルトの名無しさん
2008/05/27(火) 17:49:47UNIX方面ではgettextというライブラリが一般的。
「メッセージカタログ」という用語でいろいろ調べてみるといいかと思う。
0328デフォルトの名無しさん
2008/05/27(火) 18:59:39Win32 API入門のサンプルはどうしてVC++だとエラーになるんだろうか?Cだとコンパイルできる
CとC++は互換性があるはずなのに
#include<windows.h>
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow ) {
HWND hwnd = CreateWindow(
TEXT("STATIC") , TEXT("Kitty on your lap") ,
WS_CAPTION ,
100 , 100 , 200 , 200 , NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return 0;
ShowWindow(hwnd , SW_SHOW);
MessageBox(NULL , TEXT("Kitty on your lap") ,
TEXT("Kitty") , MB_ICONINFORMATION);
return 0;
}
0329デフォルトの名無しさん
2008/05/27(火) 19:06:03>CとC++は互換性があるはずなのに
いいえ。
>どうしてVC++だとエラーになるんだろうか?
エラーメッセージくらい転記しましょう。
>http://wisdom.sakura.ne.jp/system/winapi/index.html
そういう間違いのあるサイトを参考にするのは如何なものかと。
0330デフォルトの名無しさん
2008/05/27(火) 19:08:190331デフォルトの名無しさん
2008/05/27(火) 20:57:41std::wcout << L"森鷗外" << std::endl;
wchar_t 文字列1[] = L"森鷗外";
std::wcout << 文字列1 << std::endl;
LPWSTR 文字列2 = L"森鷗外";
std::wcout << 文字列2 << std::endl;
何れのwcoutも正常に表示されません。
MessageBoxなら
MessageBoxW(0, 文字列1, L"", MB_OK);
MessageBoxW(0, 文字列2, L"", MB_OK);
できちんと表示されますが、何が原因なのでしょうか。
0332デフォルトの名無しさん
2008/05/27(火) 21:02:35wchar_tのUTF-16って鷗(!= 鴎)もちゃんと表示してくれるの?
0333デフォルトの名無しさん
2008/05/27(火) 21:15:35wchar_t 文字列1[] = L"森鷗外";
MessageBoxW(0, 文字列1, L"", MB_OK);
でダイアログにきちんと「森鷗外」と表示されます。
0334デフォルトの名無しさん
2008/05/27(火) 21:25:21それは文字列を表示してるコンソールの問題じゃないのか。
0335デフォルトの名無しさん
2008/05/27(火) 21:39:28そうなんですか?
コマンドプロンプトの扱いに不慣れで正直良く分りません。
wcoutを使うのは諦めてWin32APIを使う事にしました。
本当にありがとうございました。
wchar_t 文字列1[] = L"森鷗外";
int lpNumberOfCharsWritten = 0;
HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsoleW(hConsoleOutput, 文字列1, lstrlen(文字列1), (LPDWORD)lpNumberOfCharsWritten, NULL);
■ このスレッドは過去ログ倉庫に格納されています