【初心者歓迎】C/C++室 Ver.49【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/20(水) 12:33:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0053デフォルトの名無しさん
2008/02/21(木) 00:49:02new/delete
new[]/delete[]
malloc/free
対応関係を間違えるな。
0054デフォルトの名無しさん
2008/02/21(木) 00:51:01T* p = static_cast<T*>(::operator new(sizeof (T))); // 領域のみ確保
new (p) T(); // コンストラクタを呼ぶ(placement new)
p->~T(); // デストラクタを呼ぶ
::operator delete(p, p); // placement delete(省略可)
::operator delete(p); // 領域を解放
0055デフォルトの名無しさん
2008/02/21(木) 00:51:39#include <cstdlib>
class c {};
void* p = std::malloc(sizeof (c));
c* obj = new(p) c;
//...
obj->~c();
//...
std::free(obj);
malloc/freeでなくても、operator new/delete関数とかでもいいだろうけどね。
0056デフォルトの名無しさん
2008/02/21(木) 00:52:20違う。配置構文newだ。
newは大抵mallocをラッピングしてて効率は悪い。
0057sage
2008/02/21(木) 03:23:25質問させて頂きたいのですが、静的リンクされたELFバイナリにおいて、
リンクされているライブラリのバージョンを
そのバイナリから知る方法はあるのでしょうか?
0058デフォルトの名無しさん
2008/02/21(木) 03:24:440059デフォルトの名無しさん
2008/02/21(木) 07:51:13教えて欲しいんだけどスレ違い?
0060デフォルトの名無しさん
2008/02/21(木) 08:01:08最近の小学校は閏年も教えんのか?
0061デフォルトの名無しさん
2008/02/21(木) 08:05:520062デフォルトの名無しさん
2008/02/21(木) 09:44:160063デフォルトの名無しさん
2008/02/21(木) 10:04:470064デフォルトの名無しさん
2008/02/21(木) 10:07:28unix系のOS使えるなら、 cal 9 1752 でカレンダー出るな。
0065デフォルトの名無しさん
2008/02/21(木) 13:05:210066デフォルトの名無しさん
2008/02/21(木) 13:11:47public:
int i;
int j;
double k;
};
int main()
{
ttt t = {1,2,3.001};
structやclassがこういう風に初期化できるのを最近知ったのですが、これって普通に
使う書き方でしょうか?結構C++長いこと使ってきたけど、知らなかったよ。
0067デフォルトの名無しさん
2008/02/21(木) 13:22:04PODな構造体なら hoge h = {0}; とか、
Win32APIで構造体のサイズを入れる必要がある物は WNDCLASSEX wc = {sizeof(WNDCLASSEX)}; とかやるけど・・・
俺も疑問なんだけど、 hoge h = {0}; って感じで初期化って普通にやるの?
俺より何年もCやってる先輩が言うには、「そんなんで0フィルされるのか?memset使えよ」って言われたんだが。
0068デフォルトの名無しさん
2008/02/21(木) 13:22:380069デフォルトの名無しさん
2008/02/21(木) 13:44:25「0フィル」が「全ビットを 0x00 で埋める」って意味なら memset() で正解。
ただし「全メンバを 0 で初期化する」なら memset() は間違いで {0} で初期化するのが正解。
この2つはメンバにポインタや浮動小数点数が混ざってると意味が違うので、動作が
異なる可能性がある。 C++ でメンバに POD 以外が混ざってる場合には、 memset() での
「0フィル」は未定義動作につながる。
0070デフォルトの名無しさん
2008/02/21(木) 13:47:26>>39
の使い方が一般の気がする。
コピコン便利だし
0071デフォルトの名無しさん
2008/02/21(木) 13:49:23ポインタや浮動小数点数などでは、
Cのソース上では0と表現される値でも、内部では0以外のビットパターンを持つことがある。
そんな場合にも対応できるので、変数初期化のほうが移植性が高いとされる。
0072デフォルトの名無しさん
2008/02/21(木) 13:52:19using namespace std;
template <typename T>
void printchar(T c){
cout << c << endl;
}
int main(void){
cout << "print int" << endl;
printchar(10);
cout << "print double" << endl;
printchar(32e-2);
cout << "print char" << endl;
printchar('A');
cout << "print char*" << endl;
printchar("test char");
cout << "print void" << endl;
// printchar();
return 0;
}
コメントアウトした行でコンパイルエラーなのですが、
引数がvoidだと何もしないっていう処理はどう書けばいいのでしょうか。
0073デフォルトの名無しさん
2008/02/21(木) 13:53:37}
0074デフォルトの名無しさん
2008/02/21(木) 13:54:36そういえば、Win32APIとかの解説ページを見ると、memsetで構造体を初期化してる人もいるよね(メンバにポインタがあるにもかかわらず
Windowsでしか動かない移植性がないプログラムだから問題ないんか。
0075デフォルトの名無しさん
2008/02/21(木) 13:55:35やっぱりそうするしかないですか。
ありがとうございます。
0076デフォルトの名無しさん
2008/02/21(木) 14:50:44#include <>
なんかの"#"ってどんな意味があるんですが?
cgiみたいに、特別な物でそうゆう仕様という認識で良いのでしょうか?
初めて触った時はコメントアウトじゃんと思ったりもしましたけど。
0077デフォルトの名無しさん
2008/02/21(木) 14:53:01template<typename T>void printchar(T c = 0) {if (c) cout << c << endl;}
ではどう? 使うときにはprintchar<char>()のように型を指定する必要があるけど。
0078デフォルトの名無しさん
2008/02/21(木) 14:54:35プリプロセッサに対する指令
0079デフォルトの名無しさん
2008/02/21(木) 15:01:13>cgiみたいに、特別な物でそうゆう仕様という
ややあたり、起源はいっしょ
C++のコンパイルの前に通すテキスト加工スクリプトの様なもの。
もはや意識している人いないれどね。
起源はそうでも、すでにC++の一部機能です。
0080デフォルトの名無しさん
2008/02/21(木) 15:07:15がマンドクセにみえた俺は病気
0081デフォルトの名無しさん
2008/02/21(木) 15:11:120082デフォルトの名無しさん
2008/02/21(木) 15:20:40すでに出てるし、そして当人は二つ書くことになにかご不満のご様子
0083デフォルトの名無しさん
2008/02/21(木) 15:29:36代表的なものにWinAPIとMFCがあると調べてわかったのですが、どちらも難解そうな上
ニュアンス的なものですが、主流ではないような印象を受けました
C/C++で作ったDLLをC#で使う?ような方法にも辿りついたのですが
それだと使う側に.NETが必要になるようなので、それなら最初からC#を使った方が…と思います
どういった方法がベターなのでしょうか?
0084デフォルトの名無しさん
2008/02/21(木) 15:38:12↓のページから好みに合ったものを選べ
http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%83%BB%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88
0085デフォルトの名無しさん
2008/02/21(木) 15:44:15C++はGUI作るツールに満足なものがないから、GUIに向いていない環境だと俺は思っている。
もっとましな状況になってほしい。
いろんなものが乱立していて決定打がないんだけど、
Windowsでは、Windows APIが最下層で、ほかがそのラッパーになっているので、
自然、Windows APIが共通語彙になっているという面はある。
だから、今何を使うにしても、いつかは素のWindows APIプログラミングに触れていてほしいなと思う。
0086デフォルトの名無しさん
2008/02/21(木) 15:46:41例)
12345→54321
12000→21
int reverseDigit(int input)
{
int a = input;
int tmp[12];
int i = 0;
while (a > 0) {
tmp[i] = a % 10;
a = a / 10;
i++;
}
int res = 0;
int n = 1;
for (int j = i - 1; j >= 0; j--) {
res = res + tmp[j] * n;
n = n * 10;
}
return res;
}
0087デフォルトの名無しさん
2008/02/21(木) 16:27:35なるほど、見た感じWinAPIに一番無難な印象を受けてしまいました
Windowsがこの先消えうせることはなさそうですしとりあえずWinAPI触ってみます、ありがとうございました
0088デフォルトの名無しさん
2008/02/21(木) 17:44:38試して問題ないならいいんじゃない?
負数で破綻するけど。
それと、一旦各桁に分割した結果を配列で保存するなら、
sprintf()で文字列にしてから逆順にして、atoi()で戻してもいいかも知れない。
0089デフォルトの名無しさん
2008/02/21(木) 17:48:39そのままinputを使えばいい
知っててわざとやってるなら別にいいが
0090デフォルトの名無しさん
2008/02/21(木) 17:57:34サーバからクライアントへsendを使ってメッセージを送信した際、
メッセージの送信完了を伝えるには、ソケットをclose(あるいはshutdown)
する以外に方法はないですか?
つまり、ソケットを閉じずに、コネクションを維持したまま、
送信完了を伝えたいのですが、できませんか?
0091デフォルトの名無しさん
2008/02/21(木) 17:57:59意味ある、というか引数いじらないのは鉄則だよ。
一時変数ケチってinputを加工するのは無駄なバグの元。
0092デフォルトの名無しさん
2008/02/21(木) 18:18:34HTTPであれば、レスポンスにContent-Lengthを入れれば、クライアント
がそのサイズの受信でデータ終了だと思ってくれる。
0094デフォルトの名無しさん
2008/02/21(木) 20:25:25C#使った方がいいと思うってもう遅いけど
0095デフォルトの名無しさん
2008/02/21(木) 21:40:29デルファイ言語の環境のまま、言語だけC++
0096デフォルトの名無しさん
2008/02/21(木) 21:41:130097デフォルトの名無しさん
2008/02/21(木) 21:41:440098デフォルトの名無しさん
2008/02/21(木) 21:45:500099デフォルトの名無しさん
2008/02/21(木) 21:48:34環境を書けよ。でないと答えようが無い
0100デフォルトの名無しさん
2008/02/21(木) 21:50:15パソコンから取り外せば全容量使えるよ。
0101デフォルトの名無しさん
2008/02/21(木) 21:50:590102デフォルトの名無しさん
2008/02/21(木) 21:53:400103デフォルトの名無しさん
2008/02/21(木) 21:54:02毒餃子を食わす国の人ですか?
0104デフォルトの名無しさん
2008/02/21(木) 21:54:36GlobalMemoryStatus で調べろ
0105デフォルトの名無しさん
2008/02/21(木) 21:57:570106デフォルトの名無しさん
2008/02/21(木) 22:27:360107デフォルトの名無しさん
2008/02/21(木) 22:31:160108デフォルトの名無しさん
2008/02/21(木) 22:32:24JpegのIJGライブラリみたいなものがあると嬉しいのですが
0109デフォルトの名無しさん
2008/02/21(木) 22:32:32長い思考の旅の後には、失敗しないからチェックは不要という結論になるよ。
0110デフォルトの名無しさん
2008/02/21(木) 22:43:28bad_alloc 例外をつかまえる。
0111デフォルトの名無しさん
2008/02/21(木) 22:45:29by Sutter
0112デフォルトの名無しさん
2008/02/21(木) 22:48:480113デフォルトの名無しさん
2008/02/21(木) 22:52:19たくさんのレスが付くと思う。
そして、>>109にたどり着くと思う。
0114デフォルトの名無しさん
2008/02/21(木) 22:56:42大抵はそのまま異常終了するしかない事が多い。
ダウンするとマズいシステムの場合は
そうも言ってられないが。
0115デフォルトの名無しさん
2008/02/21(木) 23:19:36timeGetTime関数を呼ぶだけの関数を作成したのですが、
ビルドで以下のエラーになりました。
LNK2019: 未解決の外部シンボル __imp__timeGetTime@0 が関数 "int __cdecl MainRoutine(void)" (?MainRoutine@@YAHXZ) で参照されました。
ソースは以下になります。
#include <windows.h>
#include <mmsystem.h>
int MainRoutine()
{
DWORD dwTime;
dwTime = timeGetTime();
return 0;
}
VC2008 Express Editionを使用しています。
他に何か設定が必要なのでしょうか?
0116デフォルトの名無しさん
2008/02/21(木) 23:20:200117デフォルトの名無しさん
2008/02/21(木) 23:29:07すいません。記述漏れです。
以下の設定はすでにしていました。
「ツール」-「オプション」-「プロジェクトおよび〜」-
「VC++ディレクトリ」-「ライブラリリンク」にて、
C:\Program Files\Microsoft Platform SDK\Lib
ほかのライブラリのリンクが必要なのですか?
必要な場合、どこのライブラリをリンクすればいいでしょうか?
0118デフォルトの名無しさん
2008/02/21(木) 23:30:16リンクするライブラリを選択するオプションではない。
何をリンクすればいいかはググれ。
0119デフォルトの名無しさん
2008/02/21(木) 23:38:58今は、ライブラリのリンクが出来てなかったと言うことなんで、
リンクの方法、リンクするライブラリについては、また調べてみます。
回答ありがとうございました。
0120デフォルトの名無しさん
2008/02/21(木) 23:46:57if(i==(1||2||3||4||5))
switch(i){
case (1||2||3||4||5):
break;
}
0121デフォルトの名無しさん
2008/02/21(木) 23:48:330122デフォルトの名無しさん
2008/02/21(木) 23:49:51C++ で operator をオーバーライドすれば可能かもしれませんね
0123デフォルトの名無しさん
2008/02/21(木) 23:54:50caseの中身は定数でよろしく
0124デフォルトの名無しさん
2008/02/22(金) 00:01:36switch(i){
case 1: case 2: case 3: case 4: case 5:
break;
}
0125デフォルトの名無しさん
2008/02/22(金) 00:02:21ifの方も駄目?
0126デフォルトの名無しさん
2008/02/22(金) 00:03:55ああ、caseでbreak書かなかったらそのまま下までいくからそういう風に書いたらいいのか
0127デフォルトの名無しさん
2008/02/22(金) 00:06:120128デフォルトの名無しさん
2008/02/22(金) 00:07:40文法的に間違いではないが、お前の期待する動作はしないと思う
(1||2||3||4||5)は常に真となり、それとiの値が等しいかどうか
だよ?これ
0129デフォルトの名無しさん
2008/02/22(金) 00:08:18ifの方も意図しているであろう動作はしない。
ただしコンパイルは通る。警告くらい出してくれるかも知れんが・・・
0130デフォルトの名無しさん
2008/02/22(金) 00:11:14コンパイル通ってたから上手く動いてると思ってそのままつかってたよ…
0131デフォルトの名無しさん
2008/02/22(金) 00:19:40C#も124みたいにcaseラベルを並べるのはありだと聞いた。
0132デフォルトの名無しさん
2008/02/22(金) 00:22:160133デフォルトの名無しさん
2008/02/22(金) 00:27:11int a=10; のようにです
0134デフォルトの名無しさん
2008/02/22(金) 00:28:19同時に出来る訳が無い。
初期化なら別だが。
0135デフォルトの名無しさん
2008/02/22(金) 00:30:450136デフォルトの名無しさん
2008/02/22(金) 00:30:520137デフォルトの名無しさん
2008/02/22(金) 00:32:34int main() {
class Test{
int x;
public:
Test (int y) {x=y;}
print(){ cout<<x<<endl; } };
Test a=10;
a.print();
return 0;
}
0138デフォルトの名無しさん
2008/02/22(金) 00:35:31a.print();
a=20;
a.print();
もできるんですね C++はすごいですね
0139デフォルトの名無しさん
2008/02/22(金) 00:37:27基本的に引数1つのコンストラクタには explicit つけとけ。
0140デフォルトの名無しさん
2008/02/22(金) 00:42:12コピーコンストラクタとoperator =をコンパイラ任せにしているのが嫌だね。
0141デフォルトの名無しさん
2008/02/22(金) 00:43:15コンパイラ任せでいいよ。
0142デフォルトの名無しさん
2008/02/22(金) 00:48:46>>139
なんでですか?
(本当に理由を知りたいです。)
0143デフォルトの名無しさん
2008/02/22(金) 00:59:34#include <vector>
class Vector {
public:
Vector(size_t size) : m_array(size) { }
void output() const {
for(std::vector<int>::const_iterator it = m_array.begin();
it != m_array.end(); ++it)
{
std::cout << *it << ' ';
}
std::cout << std::endl;
}
private:
std::vector<int> m_array;
};
void Foo(const Vector& v) {
v.output();
}
int main() {
Foo(5); ←←←←←←←
}
これが直感的な挙動ではないことは分かってもらえると思う。
でも、コンパイル通るし、正常に動く。
explicit つけるとこういう時にコンパイルエラーにできる。
それでも Foo(Vector(5)); なら可だが、これは問題ないと感じてくれると思う。
0144デフォルトの名無しさん
2008/02/22(金) 00:59:53どんなバグがでるのですか?
呼び出し側なにか影響でうるのですか?
0145デフォルトの名無しさん
2008/02/22(金) 01:01:23input が変更されていない事を前提とした処理を書いてしまうかもしれない。
あるいは、そういう処理があるにも関わらず、
それより前の地点で input を変更してしまうかもしれない。
そうなっていないか注意して探すよりは、
引数をいじらない方が良い。
0146デフォルトの名無しさん
2008/02/22(金) 01:08:460147デフォルトの名無しさん
2008/02/22(金) 01:09:55あんま意味ないと思ってやめた。
0148デフォルトの名無しさん
2008/02/22(金) 01:12:29なるほど
別にいじること自体がやばいわけじゃなくて
いじると間違い起こす原因となる可能性があるわけですね
ありがとうございました
0149デフォルトの名無しさん
2008/02/22(金) 01:14:13コピペじゃ済まなくなる。
0150デフォルトの名無しさん
2008/02/22(金) 01:14:45fall throughは禁止じゃなかったっけ
何かキーワードがあったと思う
情報が古いかもしれんが
0151デフォルトの名無しさん
2008/02/22(金) 01:19:06caseが連続する場合のみOK。その他は禁止。スレ違い。
0152デフォルトの名無しさん
2008/02/22(金) 01:19:25ありがとうございます。
explicitは、暗黙の変換を抑制する機能なのですね。
しかしなんか上の例のコードは、すごくC++書き慣れた人な感じがしました。
■ このスレッドは過去ログ倉庫に格納されています