【初心者歓迎】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
0268デフォルトの名無しさん
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);
0336デフォルトの名無しさん
2008/05/27(火) 21:48:560337デフォルトの名無しさん
2008/05/27(火) 22:02:080338デフォルトの名無しさん
2008/05/27(火) 22:04:34正常じゃないってどんな状態?数字が出るとか?
コンパイラは何?
0339デフォルトの名無しさん
2008/05/27(火) 22:33:16CとC++のワイド入出力は、
外ではマルチバイト文字を使い、入出力時に変換するというモデルになっている。
Windowsで日本語なら外部の文字コードとはCP932 (Shift_JIS)になる。
当然、そこに含まれない文字の表示・入力はできないというわけ。
0340325
2008/05/27(火) 23:01:21>>326
なるほど。
しかし、引数を取る時はやはりめんどくさいそうですね。
>>327
初めて知りました。
googleで検索したところ、まとまった解説サイトみたいなのがあまり充実してないのがつらいところです。
0341デフォルトの名無しさん
2008/05/27(火) 23:14:50http://pc11.2ch.net/test/read.cgi/tech/1205059063/l20
立てようと思ったらIPグループスレ立て規制(新このホスト〜)に
引っ掛かってるので。
0342デフォルトの名無しさん
2008/05/27(火) 23:48:470343デフォルトの名無しさん
2008/05/27(火) 23:51:34WaitForSingleObject( >>342 , 3600000 );
0344デフォルトの名無しさん
2008/05/27(火) 23:58:36C++相談室 part62
http://pc11.2ch.net/test/read.cgi/tech/1211900039/l50
0345デフォルトの名無しさん
2008/05/28(水) 00:00:290346デフォルトの名無しさん
2008/05/28(水) 10:31:060347デフォルトの名無しさん
2008/05/28(水) 10:34:59とすると実体なしで。コンパイルが通ります。間違えですか?
0348デフォルトの名無しさん
2008/05/28(水) 10:38:030349デフォルトの名無しさん
2008/05/28(水) 10:39:02基本的にはそう。
>>347
それだけで定数式としては使える。
でも const int& r = C::x とかするとリンクエラーになるから、
広く使うクラスなら定義も作っといたほうがいい。(その場合は初期化部分は無し)
0350デフォルトの名無しさん
2008/05/28(水) 10:41:160351デフォルトの名無しさん
2008/05/28(水) 11:54:06こんなエラーが出ます。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: void __thiscall ANNkd_tree::annkPriSearch(double *,int,int *,double *,double)"
(__imp_?annkPriSearch@ANNkd_tree@@QAEXPANHPAH0N@Z) が関数 "int __cdecl findmatch(int)" (?findmatch@@YAHH@Z) で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: __thiscall ANNkd_tree::ANNkd_tree(double * *,int,int,int,enum ANNsplitRule)"
(__imp_??0ANNkd_tree@@QAE@PAPANHHHW4ANNsplitRule@@@Z) が関数 "int __cdecl findmatch(int)" (?findmatch@@YAHH@Z) で参照されました。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual void __thiscall ANNkd_tree::annkSearch(double *,int,int *,double *,double)"
(?annkSearch@ANNkd_tree@@UAEXPANHPAH0N@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual int __thiscall ANNkd_tree::annkFRSearch(double *,double,int,int *,double *,double)"
(?annkFRSearch@ANNkd_tree@@UAEHPANNHPAH0N@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual int __thiscall ANNkd_tree::theDim(void)" (?theDim@ANNkd_tree@@UAEHXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual double * * __thiscall ANNkd_tree::thePoints(void)" (?thePoints@ANNkd_tree@@UAEPAPANXZ)"
は未解決です。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: virtual __thiscall ANNkd_tree::~ANNkd_tree(void)"
(__imp_??1ANNkd_tree@@UAE@XZ) が関数 "public: virtual void * __thiscall ANNkd_tree::`scalar deleting destructor'(unsigned int)"
(??_GANNkd_tree@@UAEPAXI@Z) で参照されました。
c++ と c を合わせて使おうとしているのですが、いたるところでエラーがでています。
このエラーはなぜ起こるのでしょうか
0352デフォルトの名無しさん
2008/05/28(水) 11:55:14必要なライブラリをリンクしていないからだと思うよ
0353デフォルトの名無しさん
2008/05/28(水) 11:56:22名前マングリング でぐぐってみるとよかれ
0354デフォルトの名無しさん
2008/05/28(水) 12:02:32http://www.google.co.jp/search?q=LNK2019
http://www.google.co.jp/search?q=LNK2001
0355デフォルトの名無しさん
2008/05/28(水) 15:53:12それらを消したいのですが、ファイルは成功しますが、フォルダが無理です。
プログラムを終了して次回に消すと平気です。
なぜでしょうか? ファイルにロックがかかっていれば当然無理ですが、ファイルの削除だけは成功してます。
0356デフォルトの名無しさん
2008/05/28(水) 15:55:030357デフォルトの名無しさん
2008/05/28(水) 16:01:1132: ファイルが別の処理で使われているため、アクセスできません。
でした。 ソース見直してみます。サンクス
0358デフォルトの名無しさん
2008/05/28(水) 16:05:510359デフォルトの名無しさん
2008/05/28(水) 16:13:260360デフォルトの名無しさん
2008/05/28(水) 16:21:24カレントディレクトリはどうなってる?
0361デフォルトの名無しさん
2008/05/28(水) 19:20:22どうすれば良くなりますでしょうか?
template < class C > int write(string x, C y) {省略}
: error C2059: 構文エラー : '<'
: error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます。
0362デフォルトの名無しさん
2008/05/28(水) 19:27:180363デフォルトの名無しさん
2008/05/28(水) 20:53:00#include <iostream>
class test {};
int main() {
const test aa;
return 0;
}
エラー
$ g++ -Wall samp80.cpp
test.cpp: In function 'int main()':
test.cpp:4: error: uninitialized const 'aa'
test.cpp:4: warning: unused variable 'aa'
0364デフォルトの名無しさん
2008/05/28(水) 20:56:430365デフォルトの名無しさん
2008/05/28(水) 20:58:19英語を勉強しようぜ
0366デフォルトの名無しさん
2008/05/28(水) 21:02:51ありがとうです。でも初期化のやりようがないと思うんですが、、、
class test {}; ってconstタイプのオブジェクトは作成できないんですか?
0367デフォルトの名無しさん
2008/05/28(水) 21:03:590368デフォルトの名無しさん
2008/05/28(水) 21:07:39■ このスレッドは過去ログ倉庫に格納されています