スレを勃てるまでもないC/C++の質問はここで 13
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/12/15(火) 10:56:37過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
スレを勃てるまでもないC/C++の質問はここで 5
http://pc11.2ch.net/test/read.cgi/tech/1230516307/
スレを勃てるまでもないC/C++の質問はここで 6
http://pc11.2ch.net/test/read.cgi/tech/1231564903/
スレを勃てるまでもないC/C++の質問はここで 7
http://pc11.2ch.net/test/read.cgi/tech/1232983248/
スレを勃てるまでもないC/C++の質問はここで 8
http://pc12.2ch.net/test/read.cgi/tech/1235921779/
スレを勃てるまでもないC/C++の質問はここで 9
http://pc12.2ch.net/test/read.cgi/tech/1240022781/
スレを勃てるまでもないC/C++の質問はここで 10
http://pc12.2ch.net/test/read.cgi/tech/1242300936/
スレを勃てるまでもないC/C++の質問はここで 11
http://pc12.2ch.net/test/read.cgi/tech/1245059383/
スレを勃てるまでもないC/C++の質問はここで 12
http://pc12.2ch.net/test/read.cgi/tech/1248010352/
0002デフォルトの名無しさん
2009/12/15(火) 13:24:23台形の面積を求めるプログラム
http://oshiete1.goo.ne.jp/qa5522539.html
0003デフォルトの名無しさん
2009/12/15(火) 13:42:23点ABを結んだ直線をCとします
点Aから直線C上を点B方向に距離xだけ進んだ点(x3,y3)を
求める式をC++プログラムで教えてください
0004デフォルトの名無しさん
2009/12/15(火) 14:18:3800053
2009/12/15(火) 15:52:440006デフォルトの名無しさん
2009/12/15(火) 17:53:51#include <iomanip>
でも
#include <IOMANIP>
でも
#include <IoMaNiP>
でも問題無くインクルードできるようですが、
これは標準C++の仕様ですか?
0007デフォルトの名無しさん
2009/12/15(火) 18:00:17Windows の仕様です。
Linux に移植するときに泣けます。
0008デフォルトの名無しさん
2009/12/15(火) 18:26:14なるほど。
つまりファイルシステム自体が大文字小文字を区別しない
仕様になっているから、ということですね。
ありがとうございました。
0009デフォルトの名無しさん
2009/12/15(火) 20:50:38自宅ではエラーが出ます。
エラーは、
fatal error C1083: include ファイルを開けません。'Src/foo.h': No such file or directory
と出ます。
同じプロジェクトを使ってるのになぜエラーが出るんでしょうか?
ソース部は
#include "Src/foo.h"
となっています。
フォルダ構成は
Project
¥Src
です。
Srcフォルダ内にfoo.hが確かに入ってます。
プロジェクトはフォルダごとコピーなので
プロジェクト設定に差はありません。
0010デフォルトの名無しさん
2009/12/15(火) 21:27:48っていうクラスはなんですか?
0011デフォルトの名無しさん
2009/12/16(水) 08:42:57消しとけ
0012デフォルトの名無しさん
2009/12/16(水) 21:51:57インクルードパスがフルパスになってないか?
その為ドライブが違うかディレクトリー構成が違っていないか?
0013デフォルトの名無しさん
2009/12/16(水) 22:40:58意図的にメモリリークなんて起こせるんですか?
0014デフォルトの名無しさん
2009/12/16(水) 23:11:000015デフォルトの名無しさん
2009/12/16(水) 23:13:07素早い回答ありがとうございます!早速試してみますね(・∀・)
0016デフォルトの名無しさん
2009/12/17(木) 01:38:050017デフォルトの名無しさん
2009/12/17(木) 07:26:01メモリーリーク
の用語の認識がおかしくないか?
0018デフォルトの名無しさん
2009/12/17(木) 17:31:310019デフォルトの名無しさん
2009/12/17(木) 17:37:320020デフォルトの名無しさん
2009/12/17(木) 20:20:42http://e-words.jp/w/E383A1E383A2E383AAE383AAE383BCE382AF.html
Yahoo!辞書 - メモリー‐リーク【memory leak】
http://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%83%AA%E3%83%BC%E3%82%AF&dtype=0&dname=0na&stype=0&pagenum=1&index=21171420429500
0021デフォルトの名無しさん
2009/12/17(木) 20:23:21{
static unsigned long long sull=10;
sull*=sull;
new char[sull];
}
これでどうだ
0022デフォルトの名無しさん
2009/12/17(木) 20:24:220023デフォルトの名無しさん
2009/12/17(木) 21:55:16ハンガリアンはダサい
0024デフォルトの名無しさん
2009/12/17(木) 22:25:53名前を考えるのもめんどくさかったんだよ!
0025デフォルトの名無しさん
2009/12/17(木) 22:42:030026デフォルトの名無しさん
2009/12/17(木) 23:30:19だっせーーーーーーー!
0027デフォルトの名無しさん
2009/12/17(木) 23:37:57?
その調子だと生きるのもおつらいでしょう。
0028デフォルトの名無しさん
2009/12/18(金) 13:27:57borland developer studio 2006 だと実行時エラーになるんだけど
borland c++ builder 5 だと OK
#include <iostream>
class Sgtn {
Sgtn() {}
public:
static Sgtn& Inst();
~Sgtn() { std::cout << "Sgtn::~Sgtn" << std::endl; }
};
Sgtn& Sgtn::Inst() { static Sgtn inst; return inst; }
int main() { Sgtn::Inst(); return 0; }
0029デフォルトの名無しさん
2009/12/18(金) 13:31:31グローバル変数のデストラクト順ってどうなってたっけ・・・
0030デフォルトの名無しさん
2009/12/18(金) 13:32:480031デフォルトの名無しさん
2009/12/18(金) 13:36:170032デフォルトの名無しさん
2009/12/18(金) 13:41:510033デフォルトの名無しさん
2009/12/18(金) 14:53:460034デフォルトの名無しさん
2009/12/19(土) 03:35:03書籍によるとC++の参照渡しは、特に呼び出し側が値渡ししてるのか参照渡し
してるのか見分けにくいことから参照渡しを多用することは慎むよう助言されている。
となるとC++ではいったいどういう風に”ポインタの値渡し”と”参照渡し”を使い分けるべきなんだろう?
まあやろうと思えば”参照渡し”は片っ端から”ポインタの値渡し”に置き換えることはできるわけだけど
果たしてそれで正しいと思う?
0035デフォルトの名無しさん
2009/12/19(土) 04:14:430036デフォルトの名無しさん
2009/12/19(土) 04:45:11> const参照渡し
これはなぜ参照渡しする必要があるの?
0037デフォルトの名無しさん
2009/12/19(土) 10:14:330038デフォルトの名無しさん
2009/12/19(土) 12:49:00>まあやろうと思えば”参照渡し”は片っ端から”ポインタの値渡し”に置き換えることはできるわけだけど
>果たしてそれで正しいと思う?
その書籍にはどういうときに参照渡しを使うのか書いてないの?
ポインタ渡し、参照渡しそれぞれのメリット、デメリットを調べてみるといいよ。
0039デフォルトの名無しさん
2009/12/19(土) 13:14:40> その書籍にはどういうときに参照渡しを使うのか書いてないの?
> ポインタ渡し、参照渡しそれぞれのメリット、デメリットを調べてみるといいよ。
うん、参照渡しの多用は自重すべきとは書いてあるけど
どういうときに参照渡しを使うべきかは詳しくは書かれてはいない(・ω・)
0040デフォルトの名無しさん
2009/12/19(土) 13:20:430041デフォルトの名無しさん
2009/12/19(土) 13:21:04> うん、参照渡しの多用は自重すべきとは書いてあるけど
まさかconst参照渡しまで自重しろと書いてあるの?
それなら・・・
よし!
その本をまず窓から投げ捨てるんだ!
0042デフォルトの名無しさん
2009/12/19(土) 14:32:29言われてみればconst参照渡しはシレっと紹介されていた気がする。
なんか重要なの?>const参照渡し
0043デフォルトの名無しさん
2009/12/19(土) 14:36:52const参照渡しは革命的に便利。
便利というか効率という点でもその他の意味でも必須。
残念ながら語りきれる気がしない。
>const参照渡しはシレっと紹介されていた気がする。
その本は本当にC++の本なのか!?
本気で捨てろと言いたくなった本はそれが初めてだ。
0044デフォルトの名無しさん
2009/12/19(土) 14:56:250045デフォルトの名無しさん
2009/12/19(土) 14:58:19この程度のことはググればすぐに分かるから自分で調べろ。
0046デフォルトの名無しさん
2009/12/19(土) 15:19:48考え方が根本的に間違ってるよ。
ポインタ渡しは危険でバグの巣窟として有名。
この危険なコードを書かないように導入されたのが参照渡し。
ちなみにオブジェクトを最も安全に引数に渡せるのが「const付き参照渡し」なのでかなり重要です。
0047デフォルトの名無しさん
2009/12/21(月) 14:03:59{
class kuzu
{
public:
void muooon(void);
};
}
void kuzu::muooon(void)
{
}
↑これって定義の方にnamespaceつけなくてもそのファイル限定になる?
0048デフォルトの名無しさん
2009/12/23(水) 07:37:490049デフォルトの名無しさん
2009/12/23(水) 10:41:590050デフォルトの名無しさん
2009/12/23(水) 12:52:02オブジェクトを渡すときはほとんどconst参照渡し。速いし安全。
渡したオブジェクトを変更したいときだけ非const参照渡しだね。
const参照渡しを主にして、非const参照渡しを控えるのならまだわかるけど。const参照渡しの説明が少ないのは理解しがたいな。
>>44
参照はポインターに比べて安全に使用できる。
void func2(const int& d)
{
}
void func()
{
int a;
{
int& b=a; //OK
int& c; //エラー
func2(a); //ok
}
}
参照は以上の例のように、初期化が必須なので参照先があることが文法上保障され、実体と区別なく安全に使える。
さらにスコープによって寿命が実体a>参照b>参照dになることが文法上保障されるから安全に使用できる。これは参照渡しでも同様。
だけど、この文法上の保障もポインタと併用すると安全性をぶち壊す危険な抜け道コードがいくらでも書ける。
これが文法上で危険性を排除できる参照と、自由だけど自己責任なポインタの大きな違いだと思うよ。
0051デフォルトの名無しさん
2009/12/23(水) 13:31:510052デフォルトの名無しさん
2009/12/23(水) 15:29:05それでも俺はint型といったオブジェクトではない変数はC++であっても参照ではなく
ポインタで渡すべきだと思う。ポインタが危険とはいえプログラムの可読性はあきらかに
ポインタ>参照
だ。
一方クラスといったオブジェクトはconst参照渡しを強く推奨する。
オブジェクトを渡すときはconst参照で渡すものという暗黙の了解が広く普及しているだろうし。
0053デフォルトの名無しさん
2009/12/23(水) 18:28:490054デフォルトの名無しさん
2009/12/23(水) 19:17:47関数名とか文脈でだいたいわかるから俺は参照使うけど
0055デフォルトの名無しさん
2009/12/23(水) 20:33:05> 関数名とか文脈でだいたいわかるから
それが我流プログラミングの始まりですわな(´・ω・`)
005643
2009/12/23(水) 23:38:25> ポインタが危険とはいえプログラムの可読性はあきらかに
> ポインタ>参照
明らかと言っていいかどうか分からんが、
思う思わないはまあ宗教論争だしなぁ。
・・・あとテンプレートが大好きな俺としては参照じゃないと気持ち悪くて仕方ない。
0057デフォルトの名無しさん
2009/12/24(木) 01:26:52intは値渡しだね。
0058デフォルトの名無しさん
2009/12/24(木) 06:16:24コピー渡し(値渡し)の一択だろ
0059デフォルトの名無しさん
2009/12/24(木) 10:12:49無知が迷い込んで来たがな(´・ω・`)
0060デフォルトの名無しさん
2009/12/24(木) 14:51:09以下、strの宣言が悪いといってコンパイルエラーになります。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_PAINT:
HDC hdc;
PAINTSTRUCT paint;
char *str = "猫でもわかるプログラミング";
hdc = BeginPaint(hWnd, &paint);
TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str));
EndPaint(hWnd, &paint);
break;
以下のように、{を追加するとエラーが出なくなります。どうして{が必要なのでしょうか?
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_PAINT:
{ ←★追加
HDC hdc;
PAINTSTRUCT paint;
char *str = "猫でもわかるプログラミング";
hdc = BeginPaint(hWnd, &paint);
TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str));
EndPaint(hWnd, &paint);
break;
} ←★追加
0061デフォルトの名無しさん
2009/12/24(木) 14:55:480062デフォルトの名無しさん
2009/12/24(木) 15:38:43> cはスコープの頭じゃないと変数を作れないのさ!
あ〜、初心者がよくやる間違いだよなw
なんであんなへんてこな仕様にしたんだろう>変数の宣言場所は先頭部分のみ
0063デフォルトの名無しさん
2009/12/24(木) 15:40:54case A:
int z;
//...
case B:
// いつのまにかzがあるぞ
}
C++でも case B に突入すること考えて文句が出るはず
0064デフォルトの名無しさん
2009/12/24(木) 15:46:14コンパイラは何を使ってるの?
言語はC?C++?
エラー内容は?
VC++2008EEで試してみたけどコンパイルエラーは出なかったよ。
0065デフォルトの名無しさん
2009/12/24(木) 15:55:30>>60
C2360をググれ
0066デフォルトの名無しさん
2009/12/24(木) 16:50:070067デフォルトの名無しさん
2009/12/24(木) 16:54:320068デフォルトの名無しさん
2009/12/24(木) 17:31:480069デフォルトの名無しさん
2009/12/24(木) 17:51:07oracleと接続してデータ取りたいのですが、
以下のソースで実行したところ途中までしかデータがとれません。
※300000件中、16000件ちょいでデータがきれてしまう
何が原因かわかりますでしょうか?
切り貼りしたソースが足りなかったらすみません。
EXEC SQL OPEN CUR1;
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;) {
EXEC SQL FETCH CUR1 INTO :item_data;
rows = sqlca.sqlerrd[2];
}
rows = sqlca.sqlerrd[2];
for (i=0;i<rows;i++) {
printf("%d\n",
item_data[i].item_seqno,
);
}
EXEC SQL CLOSE CUR1;
007069
2009/12/24(木) 17:53:50SunOS 5.6
Oracle 8.1.6
CCコンパイラ
です。
0071デフォルトの名無しさん
2009/12/24(木) 18:21:37>EXEC SQL FETCH CUR1 INTO :item_data;
構造体の配列らしいが、なんで上書きしてんの?
0072デフォルトの名無しさん
2009/12/24(木) 20:20:47{ typedef T type; };
/* ○VC9/×GCC */
template<typename T> struct Derived : public Base<T>
{ typedef type type; };
/* ○VC9/○GCC */
template<typename T> struct Derived2 : public Base<T>
{ typedef typename Base<T>::type type; };
前者の記法は非標準なのでしょうか?
0073デフォルトの名無しさん
2009/12/24(木) 20:46:01> intは値渡しだね。
intを参照渡し、ポインタ渡しする人っている?
そういうときはreturnで返すのが常套じゃね?
複数のint型変数を返すときはint型配列のポインタ渡しか参照渡しするか、
そうでなければ構造体の参照渡しかポイント渡しにするのがセオリーじゃないの?
0074デフォルトの名無しさん
2009/12/24(木) 20:57:08豊富とは決して言えない
特に標準ライブラリは発狂物ww
でもboostを筆頭とする各種無償ライブラリとか
商用ライブラリとかまで含めれば豊富と言っていいとは思う。
0075デフォルトの名無しさん
2009/12/25(金) 00:23:380076デフォルトの名無しさん
2009/12/25(金) 01:48:11初めからなんでも用意してある環境が欲しいなら、C/C++はおすすめできない。
0077デフォルトの名無しさん
2009/12/25(金) 12:08:41make_tupleのように任意長のテンプレートはどうやって作ってるんでしょうか?
0078デフォルトの名無しさん
2009/12/25(金) 12:42:33つ[配列にするほどでも、構造体にするほどでもないとき]
0080デフォルトの名無しさん
2009/12/26(土) 18:57:200082デフォルトの名無しさん
2009/12/28(月) 11:39:50Linux への移植が大変だった、って意味では俺も泣いていいかな。
0083デフォルトの名無しさん
2009/12/28(月) 11:44:000084デフォルトの名無しさん
2009/12/28(月) 11:57:43まて、そんなMFCのCStringだなんてクソと一緒にするな。
std::stringで書いてあればその苦労は全く無かったはずだ。全く。
0085デフォルトの名無しさん
2009/12/29(火) 09:47:25template<class T>class Settings {
//
};
struct Arecord {
//
};
class Asettings : Settings<Arecord> {
//
};
こんなクラス構造があると思いねぇ。勿論、Aの他にもBやCもある。
んでもって、一々Arecordとするのも業腹だから
class Asettingsの中でstruct Record としてしまいたいってわけだ。
するってぇと、定義の順番の都合で巧くコンパイルできねぇ。
どうしたもんかね、こりゃ。
0086デフォルトの名無しさん
2009/12/29(火) 11:56:31class Asettings
が何か分からないから答えられぬ。
008786
2009/12/29(火) 11:58:00ごめんカンチガイした。
template<class T>class Settings {
//
};
struct Arecord;
class Asettings : Settings<Arecord> {
struct Arecord {
//
};
//
};
これじゃだめなの?
0088デフォルトの名無しさん
2009/12/29(火) 13:09:02ResTHX!
それだとダメだった。
Arecordが::Arecordで宣言されて
Asettings::Arecordで定義されるからだと思う。
008987
2009/12/29(火) 16:10:09> Arecordが::Arecordで宣言されて
> Asettings::Arecordで定義されるからだと思う。
なるほど。たしかに。
Asettingsのクラス定義を分割できないって仕様がくせ者邪魔だなぁ。。
0092デフォルトの名無しさん
2009/12/29(火) 17:13:14残念ながら、これでアウト。外のArecordと内のArecordは別物なのよね。
ttp://codepad.org/eEpbQXgN
0093デフォルトの名無しさん
2009/12/29(火) 17:32:18codepadでは確かに通らないが、
それはg++が古いからでは?
俺の
g++ (TDM-2 mingw32) 4.4.1
および
Comeauの
http://www.comeaucomputing.com/tryitout/
このサイトでは通ったよ。
0094>87 >93 ◆Nsutagdmm.
2009/12/29(火) 17:47:01VC++ 2008でもbcc5.5.1でも通ったよ。
0095デフォルトの名無しさん
2009/12/29(火) 18:03:57009687 ◆Nsutagdmm.
2009/12/29(火) 19:03:18ちなみにこのソースはそちらの手元では通る?
0097デフォルトの名無しさん
2009/12/30(水) 10:46:28structが引数になるときは参照渡し、
classの時はポインタ渡し、
としているのですが、変ですか?
struct Point;
class Object;
Point Add(const Point &p1, const Point &p2);
shared_ptr<Object> Get(Object* base);
って感じなんですが・・・(^^;)
0098デフォルトの名無しさん
2009/12/30(水) 10:49:310099デフォルトの名無しさん
2009/12/30(水) 10:51:43ほとんどの場合参照で渡せば問題ないはず。
ポインタで渡すのは、nullの状態を作りたい場合くらいかな。
0100デフォルトの名無しさん
2009/12/30(水) 11:00:29区別する方がおかしい
structで書いたらダメ出しする老害は死ぬがいいよ
0101デフォルトの名無しさん
2009/12/30(水) 11:06:320102デフォルトの名無しさん
2009/12/30(水) 11:12:52個人的には、structはデーター構造作るときにアライン合わせるときとか、ただのメンバ変数の集合体を作るときだけとしている。
boostのソース読むときはclassとstructがごっちゃになってるので読みづらいな。明確な使い分けの無いほぼ同じ機能の構文が複数あるのは勘弁してほしいよ。
0103デフォルトの名無しさん
2009/12/30(水) 11:31:46俺もstructはメンバ変数やメンバ関数含めほぼ全部publicにしているよ。
(つまりPODとまでは行かないが相当小さい簡易的なもの。)
全部publicでも大きなものはclassとしている。
逆に一つでもprivateにしたい場合はかなりの割合でclassとしている。
要は、読み手の受ける印象の違いだろうけどさ。
010497
2009/12/30(水) 11:53:59なんかそっちのほうが個人的には読みやすいので (^^;
あと、クラスに参照だと基底クラスにキャストすることはできるのかな、とか思って。
趣味グラマなんでそこらへんがよくわかんないですm(_ _)m
0105デフォルトの名無しさん
2009/12/30(水) 12:15:07あー、まだその辺な訳ね。
ずいぶんと因果な言語を選んだね君(笑)
> クラスに参照だと基底クラスにキャストすることはできるのか
正確にはキャストじゃなくて暗黙の型変換の話だよね?
できます。
生ポインタで渡すのはあまり綺麗なスタイルではないことが多い。
(わざとポインタにすることもあるけど)
C++例外処理プログラミング
ttp://www.02.246.ne.jp/~torutk/cxx/exception/programming.html
この辺も読んだ方が良いかも。
0106デフォルトの名無しさん
2009/12/30(水) 12:15:280107デフォルトの名無しさん
2009/12/30(水) 14:48:51char **c = new char*[5];
と
char *c[5];
って、どういう違いがあるんでしょうか?
deleteはどっちの場合も必要?
010897
2009/12/30(水) 14:52:20そういえば参照を使う時でもshared_ptrは値渡しでいいんですよね??
0109デフォルトの名無しさん
2009/12/30(水) 15:04:54newとdeleteは1対1で対応するべきものです
newが無いのにdeleteしていたり、newしているのにdeleteが無いのは、どこか間違っている可能性が高いです
0111デフォルトの名無しさん
2009/12/30(水) 15:05:53まず
> char *c = new char[5];
> と
> char c[5];
で考えてはいかがですか?
0112107
2009/12/30(水) 15:31:31char *c = new char[5];
と
char c[5];
の場合は、後者には他の文字列ポインタを代入できないというくらいで
基本的には同じような扱い方でOKなんですよね?
で、関数を抜けるときは前者のみdeleteが必要ということですよね?
char **c = new char*[5];
と
char *c[5];
の場合のnewとdeleteの対応ですが、
後者はポインタの配列になると思うのですが
各要素に個別にnewを使っていた場合は、
また個別にdeleteしていくしかないということになるんですか?
関数を抜けるときに配列自体が開放される(?)ので
ついでに要素についても自動的に開放されるということはないのでしょうか?
0113デフォルトの名無しさん
2009/12/30(水) 15:32:200114デフォルトの名無しさん
2009/12/30(水) 15:40:030115デフォルトの名無しさん
2009/12/30(水) 16:05:48前者に文字列ポインタを代入していいなんてどこに書いてあった?
ここにそれを晒した上で窓から投げ捨てろ
0116デフォルトの名無しさん
2009/12/30(水) 16:39:41配列のdeleteはdelete[]だから。
たとえば
char* c=new char[5];
に対するデリートはdelete[] c;だよ。
個別というのが
char* c[5];
c[0]=new char;
という意味だったら、
delete c[0]は必要だから。
スコープから抜けるときに配列は消えるけど中身は消えないからね。
スマートポインタをぐぐると便利だよ。
0117デフォルトの名無しさん
2009/12/30(水) 16:56:590118デフォルトの名無しさん
2009/12/30(水) 17:06:25そんな親切な言語じゃないところがC++のいいところであり悪い所でもある。
0119107
2009/12/30(水) 17:21:56おかげさまで何となく理解できた気がします。
ポインタ関係はややこしいですね。
>>115
char *a = "abcd";
char b[5];
char *c = new char[5];
b = a; // エラー
c = a; // 一応OK
上記のような意味で書いたのですが、用語の使い方を誤っていたかもしれません。
0120デフォルトの名無しさん
2009/12/30(水) 17:23:38OKじゃねーよ。
newしたバッファはどっかいっちゃうぞ
0121デフォルトの名無しさん
2009/12/30(水) 17:26:180122デフォルトの名無しさん
2009/12/30(水) 17:33:35そんな呼び方は窓から(ry
0123111
2009/12/30(水) 17:39:59確かに一応OKなんだよ。
リソースを開放する気がないんなら。
そういう嫌がらせプログラムを組みたくなったときに必要な知識だ。
0124107
2009/12/30(水) 17:51:20もう1点いいですか?
char *b[5];
と
char (*c)[5];
は別物になるんですか?
どちらもポインタの配列なのではないかと思ったのですが、
入れ替えるとコンパイルが通らなくなるので・・・。
>>122
「文字列ポインタ」がまずかったですか?
0125デフォルトの名無しさん
2009/12/30(水) 17:58:15前者はcharの*(ポインタ)が5個の配列
後者は、char が5個の配列の*(ポインタ)
0126デフォルトの名無しさん
2009/12/30(水) 18:52:27一度もはまらなかったらそれはそれで怖いし。
0127107
2009/12/30(水) 19:04:09なるほど、配列のポインタになってしまうんですね。
実験してみたところ、
char *(c[5]); だとポインタの配列で
char (*c)[5]; だと配列のポインタという感じでした。
なんか直感と逆な感じがしますが・・・。
0128111
2009/12/30(水) 19:26:55よし。
type
ttp://wwws.kobe-c.ac.jp/deguchi/c/type.html
俺はこのページを紹介できる時を待っていたんだ(笑)
とても分かりやすかったんで必見!!
0129107
2009/12/30(水) 20:44:54つまり、char (*c)[5]; と宣言された変数cがあったとしたら、
そのcに対して (*c)[5] という操作をすれば char 型になるという意味なんですね。
ようやく飲み込めた気がします。
ですが、さらに疑問点が出て来ました(何度もすみません)。
1 : char (*a)[5]; // 配列のポインタ
2 : char *(b[5]); // ポインタの配列
3 : char c[5]; // 配列(のポインタ)
4 : char *d = "abcd"; // 配列のポインタ
5 : char **ea = a; // NG
6 : char **eb = b; // OK
7 : char **ec = &c; // NG
8 : char **ed = &d; // OK
また気になって上記のような実験をしてみたのですが、
予想に反して結果がぜんぜん一致しません・・・。
5、6行目に関して: char **x; という形だけを見れば
配列のポインタでもポインタの配列でもいけそうな気がしますが、
この場合は特別にポインタの配列と決められているということなのでしょうか?
7、8行目に関して:どっちも同じだと思うのですが、何か違うのでしょうか?
何度も申し訳ありませんが、ご教示よろしくおねがいします。
結局、教えていただいたページをちゃんと理解できていないかもしれませんが・・・
0130デフォルトの名無しさん
2009/12/30(水) 20:47:210131デフォルトの名無しさん
2009/12/30(水) 22:47:535行目
配列へのポインタなんだから、
ポインタのポインタとは違うでしょ?
a --> [ char型 ] ea --> [ char*型 ] --> [ char型 ]
[ char型 ]
[ char型 ]
[ char型 ]
[ char型 ]
7行目
&c は c 、あるいは &c[0] と同じ意味を持つから
0132デフォルトの名無しさん
2009/12/31(木) 08:31:19int main(void){
int row = 0;
char **url;
url = (char **)calloc(1,sizeof(char *))) == NULL);
url[0] = (char *)calloc(1000,sizeof(char))) == NULL);
for(row = 2;row < 10;row++){
kakuhoMemory(url,row);
printf("%p---%p\n",url,url[row - 1]);
}}
void kakuhoMemory(char **url,int row){
char **tmp;
if((tmp = (char **)realloc(url,sizeof(char *) * row)) == NULL){
exit(1);}
url = tmp;
if((url[row - 1] = (char *)calloc(1000,sizeof(char))) == NULL){
exit(1);}
}
0133デフォルトの名無しさん
2009/12/31(木) 08:39:071つずつポインタの配列を増やしていき、
新しく追加された変数にcharの配列のアドレスを代入したいのですが
コンパイルして実行するとなぜか3回目でアドレスが短くなってしまい、
更にそれ以降はnilと表示されてしまいます。
以下に示します。
0x9da3008---0x9da3408
0x9da3008---0x9da37f8
0x9da3008---0x3f0
0x9da3008---(nil)
0x9da3008---(nil)
0x9da3008---(nil)
0x9da3008---(nil)
0x9da3008---(nil)
どこか間違っているのでしょうか。よろしくお願いします。
0134デフォルトの名無しさん
2009/12/31(木) 09:17:57ぱっと見変なとこ。
if((tmp = (char **)realloc(url,sizeof(char *) * row)) == NULL){ //呼び出し元ですでに確保してるはずだね。
url = tmp; // 引数のurlを上書きしてる。
if((url[row - 1] = (char *)calloc(1000,sizeof(char))) == NULL){ //上書きしたurlに保存しても呼び出し元には返せないね。
0135デフォルトの名無しさん
2009/12/31(木) 11:10:27誘導型?とかそんな感じの
0136デフォルトの名無しさん
2009/12/31(木) 11:30:55関数を
void kakuhoMemory(char ***url, int row)
{
char **temp;
if((temp = (char**)realloc(*url, sizeof(char*) * row))==NULL) exit(1);
*url = temp;
if((url[row-1] = (char*)calloc(1000, sizeof(char)))==NULL) exit(1);
}
にして、呼び出しを
kakuhoMemory(&url, row);
にする。
0137107
2009/12/31(木) 14:03:57お返事が遅れてしまいましたが、回答ありがとうございました。
なるほど a も &c も配列のポインタのポインタをとっても
結局は配列の一次(?)のポインタとして扱われるということなんですね。
1 : char (*a)[5];
2 : char c[5] = "abcd";
3 : a = c; // NG(以下、この行は無視してコンパイル成功したものとする)
4 : a = &c; // OK
5 : printf("a : %d , *a : %d , c : %d , &c : %d\n", a, *a, c, &c); // 全部一致する
6 : printf("a[1] : %c , (*a)[1] : %c , c[1] : %c\n", a[1], (*a)[1], c[1]); // a[1] はうまくいかない
くどいですが、実験してみたら上記のようになりました。
"[]"を単にアドレスから値を取得する演算子だと理解していたのですが、
かなり甘かったようです・・・。
0138デフォルトの名無しさん
2009/12/31(木) 15:19:226:a[1]はアクセス違反。他と同じ場所を指すのはa[0][1]
0139131
2009/12/31(木) 15:22:30ちょっと >>131 の最後の一文について訂正。
char c[5]; において、c と &c[0] は等価なんだけど
ANSI-C以降の場合、&c は配列へのポインタなので、c と &c は同じじゃない。
K&Rだと同じなんだけどね
多分、配列とポインタを混同してると思うので、C-FAQを読むといいよ
http://www.kouno.jp/home/c_faq/c6.html#0
0140デフォルトの名無しさん
2009/12/31(木) 17:16:48使い分けがわからん
ぐぐると
>シングルトンパターンは汎用性、可搬性が必要なクラスに使用すべきでしょう。
>モノステイトパターンは元々「状態が不変」であることを表すパターンだと思うので、 「実体が一つであることを保証する」といった使い方には適さないでしょう。
具体的にどういう場面で使い分ければいいんだ?
0141107
2009/12/31(木) 19:15:54なるほど・・・今度こそ理解できたような気がします(自信なし)。
char (*a)[5];
char c[5] = "abcd";
a = &c;
とした場合、printfとかで内容だけ見ると a == *a == c == &c となるけど、
実際は a と &c は配列へのポインタであり
そして *a と c は配列の最初の要素へのポインタということで、型が違うことですかね。
& や * という演算子は値→アドレス、アドレス→値の変換をする演算子だと
思っていましたが、この場合は例外的に型の変換が行われるわけですね。
C/C++ 難しすぎです!
0142デフォルトの名無しさん
2009/12/31(木) 19:19:27>>136さん
お二方のおかげでわかりました。
url=tmpじゃ確かに呼び出し元のurlの値は変わらないですよね。
それと>>136さんの
if((url[row-1] = (char*)calloc(1000, sizeof(char)))==NULL) exit(1);
の行のurl[row-1]の部分は(*url)[row-1]ですよね?
0143デフォルトの名無しさん
2009/12/31(木) 19:43:560144デフォルトの名無しさん
2010/01/01(金) 23:18:27> C/C++ 難しすぎです!
うん、これら2つ、特にC++は難しいことで有名。
どのくらいの趣味グラマになりたい?
正直 将来の職業にする気が全く無く、
楽しみたいだけならPythonとかRubyとかのような
もっと高級言語が良いんじゃないかと思うんだけど。
0145デフォルトの名無しさん
2010/01/02(土) 00:19:470147デフォルトの名無しさん
2010/01/02(土) 11:22:090148デフォルトの名無しさん
2010/01/02(土) 16:57:220149デフォルトの名無しさん
2010/01/02(土) 17:01:13意味不明な煽りは止めてくれない?
asm と c しか無かった時代とはもう違うのだよ。
0150デフォルトの名無しさん
2010/01/02(土) 17:32:560151デフォルトの名無しさん
2010/01/02(土) 17:56:59「しか」は言い過ぎたけど、
まあ察してくれよ
0152デフォルトの名無しさん
2010/01/02(土) 19:39:50PythonやRubyを高級言語と分類することには特に異論はないが、
プログラミングを職業とするということへの誤解を生む表現だな。
0153デフォルトの名無しさん
2010/01/02(土) 20:03:54#include <stdio.h>
#define VIEW() printf("a = %d\n", a)
int a = 0;
void func(void);
int main(int argc, char *argv[]){
int a = 10;
VIEW();
{
int a = 20;
VIEW();
}
VIEW();
func();
::a = 30; /* (1) */
func();
return 0;
}
void func(void){
VIEW();
return;
}
まあ、見ていただければわかると思うが、変数名についての実験を行った。
グローバル変数と同じ名前のローカル変数を使うと、そのグローバル変数を参照するには :: を使えばよい。
ところで、この :: (グローバル名前空間) って純粋 C でも使える?
0154デフォルトの名無しさん
2010/01/02(土) 20:22:30C言語にはnamespaceすらない
んだったきがするが。
0155デフォルトの名無しさん
2010/01/02(土) 20:33:430156デフォルトの名無しさん
2010/01/02(土) 20:46:56そうか...
Thanks!
>>155
ぐろ〜ばる☆
0157107
2010/01/03(日) 00:50:30まあ職業はともかく、実際C/C++で書かれているプログラムは多いですし
是非しっかり使えるようになりたいですね。
回答していただいた皆さん、ありがとうございました。
0158デフォルトの名無しさん
2010/01/03(日) 02:43:09ネット上のサンプルのほとんどがグローバル。
スレッド生成のときに渡すのは駄目なの?
0159デフォルトの名無しさん
2010/01/03(日) 09:31:46Win32APIのCRITICAL_SECTION構造体かな?
グローバルにおく必要は無いよ。普通はメンバー変数に置く。
スレッド間の同期に使うものだからスレッド作成前に作ってかまわない。
CRITICAL_SECTION構造体はコピーできないからポインタ渡しで渡すこと。
ただ、質問のようにスレッド生成時に渡すものではなく、スレッド間で競合するリソースをアクセスするときに、そのリソースが持ってるCRITICAL_SECTIONの構造体を参照してクリティカルセクションに入るようにする。
0160デフォルトの名無しさん
2010/01/03(日) 20:41:46bool
false
の読み方が良くわからないので正しい読み方を教えて欲しいです
0161デフォルトの名無しさん
2010/01/03(日) 21:04:33http://public.research.att.com/~ttsweb/tts/demo.php
このサイトで聞きなさい。
0162デフォルトの名無しさん
2010/01/03(日) 22:16:14まったくわかりませんでした
0163デフォルトの名無しさん
2010/01/03(日) 22:17:320164デフォルトの名無しさん
2010/01/03(日) 22:20:09false フォールス
0165デフォルトの名無しさん
2010/01/03(日) 22:36:43ありがとうございます
フォルスって読んでました
0166デフォルトの名無しさん
2010/01/03(日) 22:37:57長年のchar論争に決着が…!
0167デフォルトの名無しさん
2010/01/03(日) 23:03:37まさかcharを こう発音されるとは思ってなかったわw
0168デフォルトの名無しさん
2010/01/03(日) 23:07:57フォルス=陰茎
0169デフォルトの名無しさん
2010/01/03(日) 23:19:00当然チャーだ
0170デフォルトの名無しさん
2010/01/03(日) 23:27:20それは間違い
0171デフォルトの名無しさん
2010/01/03(日) 23:28:25> ギリシャ語で「ふくらんだもの」のこと。
> 男性の性器、男根を意味する言葉。特に勃起した状態を指す
> なお発生学においては、男性の陰茎だけでなく女性の陰核も指す。
0172デフォルトの名無しさん
2010/01/03(日) 23:33:290173デフォルトの名無しさん
2010/01/03(日) 23:43:07は?シャアに決まってるだろJK
0174デフォルトの名無しさん
2010/01/03(日) 23:45:390175デフォルトの名無しさん
2010/01/04(月) 00:23:590176デフォルトの名無しさん
2010/01/04(月) 02:31:57std;;string str;の中に例えば
test,abcd,efg
と格納されていた場合、「 , 」の後だけを個別に取得出来ないでしょうか?
0177デフォルトの名無しさん
2010/01/04(月) 03:23:17>std;;string str;
↑なんぞ
0178デフォルトの名無しさん
2010/01/04(月) 13:03:52ただのミスですw
ありがとうございます、ちょっとやってみます。
0179デフォルトの名無しさん
2010/01/04(月) 13:31:30うおおお!ありがとうございました!
簡易スクリプトのコマンドで悩んでいましたが、無事にコマンドと引数を取得出来ました。
凄い勉強になりました!ありがとう!
0180デフォルトの名無しさん
2010/01/04(月) 15:33:04JAVAのNullPointerExceptionみたいなのないですか。
どこをどう探してもC++にNULLっぽい例外がないのですが
0181デフォルトの名無しさん
2010/01/04(月) 15:35:010182デフォルトの名無しさん
2010/01/04(月) 16:22:56/**
* JavaのNullPointExceptionに相当する例外クラス.
*/
class null_point_error : public std::logic_error
{
public:
null_point_error (const std::string& what) : logic_error(what) {};
};
0183デフォルトの名無しさん
2010/01/04(月) 17:15:58( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡
0184デフォルトの名無しさん
2010/01/04(月) 19:07:32C++にはOSが検出するNULLポインタ例外またはアクセス違反例外は無い。しかし、VC等のベンダ拡張で構造化例外を使うとそれらの例外はキャッチできる。
C++の参照やイテレータはNULLを排除してるし、C++では特にNULLは使わなくっても設計できなくはない。
0185デフォルトの名無しさん
2010/01/04(月) 19:24:19今回、クライアント側の要望で、ダイアログ、ウィンドの背景や、ボタンなどいろいろなアイテムを
スキンを使用したGUIにする要望がありました。 要は見た目の話ですが・・・・
そこで、市販のスキンライブラリー(スキン作成ソフト)を使用しようといろいろ探してみたのですが、
海外のものしか見つかりませんでした。
過去の業務で同じようなスキンライブラリを使用、または検討した人がいましたら、そのソフト(ライブラリー名)を
ご教授お願いできないでしょうか?一長一短もありましたら教えていただければうれしいです。
自分で探したところ、SkinCrafter(デモ版)が少し使いやすかったです。
ボタンなどのイメージを1枚ずつ1ファイルとして登録するのが少し面倒でしたが・・・
0186デフォルトの名無しさん
2010/01/04(月) 19:27:210187デフォルトの名無しさん
2010/01/04(月) 22:14:14間違えてNULLを渡したら例外飛ばせコラーって上から言われたのですよ
0188デフォルトの名無しさん
2010/01/04(月) 22:32:190189デフォルトの名無しさん
2010/01/04(月) 22:37:57SetWindowLongでクラスのメンバ関数を渡そうとすると型が違うらしくコンパイルエラー
メンバ関数をstaticつけて静的にするとコンパイル通る、普通の関数でもおk
動的なクラスのメンバ関数のアドレスを(LONG)(LONG_PTR)に変換する方法ない?
0190デフォルトの名無しさん
2010/01/05(火) 13:03:14プラグインdllが、外部のファイル操作(DB参照)、レジストリのパラメータ取得することは可能でしょうか?
0191デフォルトの名無しさん
2010/01/05(火) 16:26:25以下のコードを実行するとx,yがそれぞれ
00000000, 00000001になるのですが
これはどういうことなんでしょうか?
コンパイラはGCCとVS2008Expressで同じ結果でした。
unsigned int i = 32, x, y;
x = 1u << 32;
y = 1u << i;
printf("%08x %08x\n", x, y);
0192デフォルトの名無しさん
2010/01/05(火) 16:31:15ECC6.2.1では00000001, 00000001
32bitモードでの32回以上のシフトは80286以上で未定義
0193デフォルトの名無しさん
2010/01/05(火) 16:39:39未定義なんですか。
ということは言語や処理系の問題ではないという事でしょうか?
左シフトは0埋めされるので必ず0になると思っていたんですが。
勉強になりました。
0194デフォルトの名無しさん
2010/01/05(火) 16:51:37IntelとかAMDからPDFをDLして嫁
0195デフォルトの名無しさん
2010/01/05(火) 17:12:33それともデフォルトでエッジトリガだったりしますか
0196デフォルトの名無しさん
2010/01/05(火) 20:36:48どうにも良い名前が考えつかない。
0197デフォルトの名無しさん
2010/01/05(火) 20:46:23constants.hpp
これじゃだめ?
0198デフォルトの名無しさん
2010/01/05(火) 20:47:47macros.h
0199デフォルトの名無しさん
2010/01/05(火) 20:49:56マクロかよw
0200196
2010/01/05(火) 20:50:47macros.h
イマイチ
0201デフォルトの名無しさん
2010/01/05(火) 20:52:48global.h
0202デフォルトの名無しさん
2010/01/05(火) 21:03:200203デフォルトの名無しさん
2010/01/05(火) 22:12:21このあたりはいつも foundation.hpp としてまとめてる。
0204196
2010/01/05(火) 23:06:38macros.h
common.h
global.h
CONSTS.H
foundation.hpp
イマイチ
0205デフォルトの名無しさん
2010/01/05(火) 23:08:520206デフォルトの名無しさん
2010/01/06(水) 00:56:59$(プロジェクト名)_constants.h
何に使う定数なのか自覚してるなら迷うわけがない
ただファイル数を減らしたいために関係ない定数を同じヘッダに書くのはどうかと
0207デフォルトの名無しさん
2010/01/06(水) 01:03:53何の例外投げればいいか上に聞け
何も指定されなければ他のコード見て真似しろ
分からなければstd::runtime_errorかstd::invalid_argumentでも投げとけ
0208デフォルトの名無しさん
2010/01/06(水) 01:14:54ない。だから、少し間接的な方法をとる。
ウィンドウハンドルに好きな値を関連付ける機能があるので、オブジェクトへのポインタを登録しておくというもの。
こんな関数をグローバルまたはクラスの静的メンバ関数として定義し、
SetWindowLongPtr(hButton, GWLP_WNDPROC, (LONG_PTR)ButtonSubWndProcEntry)のように渡す。
(この問題とは直接関係ないが、SetWindowLongPtr使え)
あと、SetWindowLongPtr呼ぶ前に、SetProp(hButton, TEXT("MyClass object"), オブジェクトへのポインタ);する。
LRESULT CALLBACK ButtonSubWndProcEntry(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
MyClass* p = static_cast<MyClass*>(GetProp(hwnd, TEXT("MyClass object")));
return p->ButtonSubWndProc(hwnd, msg, wp, lp);
}
0210デフォルトの名無しさん
2010/01/06(水) 13:15:21ore_project_consts.h
0211デフォルトの名無しさん
2010/01/06(水) 14:45:500212デフォルトの名無しさん
2010/01/06(水) 19:55:19C++にはスレッドとかそういう概念自体が存在しないんじゃない?
もしそうだとすると
> std::tr1::shared_ptrのほうもスレッド対応してるんでしょうか?
実装次第ということになりそうだが。。。
0213デフォルトの名無しさん
2010/01/06(水) 20:49:340214デフォルトの名無しさん
2010/01/06(水) 20:57:020215デフォルトの名無しさん
2010/01/06(水) 21:06:55Fortranだと、Macross.Fだな。
0216デフォルトの名無しさん
2010/01/06(水) 21:18:28C++0xはスレッドに対応するからスレッドセーフだと期待してるんだけどね。
boost::shared_ptrとstd::shared_ptrの違いとかどっかに書いてないかなあ?
0217デフォルトの名無しさん
2010/01/06(水) 21:44:46こいつ、死ねばいいのにね。
0218デフォルトの名無しさん
2010/01/06(水) 21:51:060219デフォルトの名無しさん
2010/01/06(水) 21:59:390220217
2010/01/06(水) 23:04:11おい
他人のふりしないではっきり言えよ。
じゃあお前は
std::numeric_limits<int>::max()はいくらを返すのですか?
って言われたらなんて答えるんだよ?
0221デフォルトの名無しさん
2010/01/09(土) 21:21:430223デフォルトの名無しさん
2010/01/11(月) 12:30:45glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,
(float[]){0.3f, 0.3f, 0.3f, 1.0f});
{}で数値を囲んで関数に配列わたしてます。
gccだと、似たようなことしてコンパイル通りました。
これって、純粋なCの文法なんですか?
0224デフォルトの名無しさん
2010/01/11(月) 14:40:43void func(int*a){}
int main(void){func((int[]){1,2,3});}
を、gccで-pedanticオプションつけたら
foo.c:2: 警告: ISO C90 forbids compound literals
って出たから、C90じゃダメみたいだよ。
C99ではどうやら認められてるみたいだが。
0225デフォルトの名無しさん
2010/01/11(月) 15:53:29うん、C99の機能。
0226デフォルトの名無しさん
2010/01/11(月) 18:16:260227デフォルトの名無しさん
2010/01/12(火) 00:19:38voidってデフォルトコンストラクタのことを言いたいの?
なら君の言う通り。・
0228デフォルトの名無しさん
2010/01/13(水) 20:30:140229デフォルトの名無しさん
2010/01/13(水) 23:31:280230デフォルトの名無しさん
2010/01/13(水) 23:36:19なるよ。
0231デフォルトの名無しさん
2010/01/13(水) 23:39:41なるだろ
0232デフォルトの名無しさん
2010/01/13(水) 23:58:41void T(); //エラー
T(void); //エラーじゃない
};
>>226-228の流れ、特に>>226は明らかに引数の話
0233デフォルトの名無しさん
2010/01/14(木) 00:01:23そうか。
よく読んでなかった。
0234デフォルトの名無しさん
2010/01/14(木) 00:10:26適当な返事になってもいたしかたあるまい。
0235デフォルトの名無しさん
2010/01/15(金) 12:26:33template <class ret_t, class arg_t> struct Hoge<ret_t (*) (arg_t)> { ... }; �@
template <class ret_t, class arg_t> struct Hoge<ret_t (arg_t)> { ... }; �A
�@と�Aって明確な違いってありますか?
0236デフォルトの名無しさん
2010/01/15(金) 23:27:43なんじゃこりゃ? 難解だなぁ〜。っていうかこういうの出来るのかな?
Hogeの中のfunc_tの型が、「�@」はret_t型を返し、arg_t型の引数を取る関数へのポインタで、
「�A」はret_t型を返し、arg_t型の引数を取る関数に特定されるということ?
一応違うバリエーションが作られるのではないだろうか?
0237デフォルトの名無しさん
2010/01/16(土) 21:09:250238デフォルトの名無しさん
2010/01/16(土) 21:32:150239デフォルトの名無しさん
2010/01/17(日) 02:18:13エスケープシーケンスを使った方法(printf("\x1b[2J");)では出来なかったので他の方法があれば教えてください
0240デフォルトの名無しさん
2010/01/17(日) 13:29:26どの環境でも出来ることは、画面の行数分改行しろ、流れて消えるからw
0241デフォルトの名無しさん
2010/01/17(日) 13:32:070242デフォルトの名無しさん
2010/01/17(日) 13:40:15ありがとうございました。
0243デフォルトの名無しさん
2010/01/17(日) 13:40:420244デフォルトの名無しさん
2010/01/17(日) 13:47:240245デフォルトの名無しさん
2010/01/17(日) 15:08:42for (i = 0; i < 1000; i++) printf("\n");
コンソールの行数が1000行以上だと使えないんで、環境依存になるけど。
0246デフォルトの名無しさん
2010/01/17(日) 15:42:04初心者用プログラミングスレに長く居るとエスパーになるらしいよ。
もしかして君も?
0247デフォルトの名無しさん
2010/01/18(月) 17:50:38広告と画像が表示されるので
画像のみの直リンのURLを生成してアクセスすると403となるのですが、
これを回避する方法はないでしょうか?
0248デフォルトの名無しさん
2010/01/18(月) 18:32:36プログラムの質問かそれ?
0249デフォルトの名無しさん
2010/01/19(火) 14:47:14コンパイラは Borland C Compiler 5.5.1
OSはWindows XP SP2
ここに全部コード貼れないのでzipでうpします。
ソース(DLL用と、呼び出す本体):http://www.dotup.org/uploda/www.dotup.org575327.zip_4DPKVJyH4VjgO7MaoGhC/www.dotup.org575327.zip
キーボードをフックして、printf関数で何が押されたか、を見たいんですが
フォーカスがそのプログラムのウィンドウに来てるときじゃないと何故か反応しないんです。
何故でしょう。
日本語不自由ですみません。
0250デフォルトの名無しさん
2010/01/19(火) 18:27:230251デフォルトの名無しさん
2010/01/19(火) 18:37:300252デフォルトの名無しさん
2010/01/19(火) 21:18:38・フック関数は、フックされた側のスレッドで実行される。
・GUI アプリでは stdout が開かれていないため printf は 使用できない。
・どうしてもコンソールに表示したいなら、
フックされた側(フック関数)から、プロセス間通信でフックした側ににデータを送信する。
0254デフォルトの名無しさん
2010/01/24(日) 17:15:24i++がエラーになった。調べてみると++iはありだがi++はないようだ。
もし、cで++iとi++のどちらかが使えなくなるとしたら
あなたはどちらを残したいですか?
0255デフォルトの名無しさん
2010/01/24(日) 17:25:38無論++iだろjk
i++しか残ってなかったら変なオーバーヘッドができちゃうかも
しれんだろ
0256デフォルトの名無しさん
2010/01/24(日) 17:30:200257デフォルトの名無しさん
2010/01/24(日) 19:50:49C++なら++i 言語名に矛盾が出るがw
0258デフォルトの名無しさん
2010/01/24(日) 21:09:02無論i++だろjk
++iしか残ってなかったら最初のゼロの時の処理がされてないかも
しれんだろ
0259デフォルトの名無しさん
2010/01/24(日) 21:16:32そりゃ無理あるだろw
0260デフォルトの名無しさん
2010/01/26(火) 19:25:34OSはXP Pro SP3です
あるウィンドウにフォーカスがあり、キーを押した後、そのメッセージをフックし、
そのデータを変更してそのウィンドウにメッセージを戻す方法はありませぬか?
例えば
ウィンドウA上で「キー」押す→
フックプロシージャで、もし押されたキーが、AならBに変換、
BならC、CならD・・・、というような処理→
メッセージを元のウィンドウに返す
こんな処理をするには、どんなAPIを使えばよろしいでしょうか
0261デフォルトの名無しさん
2010/01/26(火) 19:27:20ごめんなさい訂正です。
メッセージを元のウィンドウに返すには
どのAPIを使えば良いでしょうか。
0262デフォルトの名無しさん
2010/01/26(火) 20:23:58自分でヒントだしておきながらググらないとか
0263デフォルトの名無しさん
2010/01/26(火) 22:16:09一応ググりましたよ
LRESULT CALLBACK KeyboradHook(int code,WPARAM wParam,LPARAM lParam){
unsigned long c;
if(code==HC_ACTION){
if(wParam<){
/*入ってきたキーコードに+1する*/
c=wParam+1;
}
return CallNextHookEx(hook_key,code,wParam,lParam);
}
0264デフォルトの名無しさん
2010/01/26(火) 22:19:17こんな感じのプロシージャです
LRESULT CALLBACK KeyboradHook(int Code,WPARAM wParam,LPARAM lParam){
unsigned long c;
if(code==HC_ACTION){
if(wParam>='A'&&wParam<='Z'){
/*入ってきたキーコードに+1する*/
c=wParam+1;
/*元のウィンドウにこのメッセージを戻すには?*/
}
}
return CallNextHookEx(hook_key,code,wParam,lParam);
}
色々ググって見たんですが、どうすればいいのか見当付かずにここで質問した次第です
0265デフォルトの名無しさん
2010/01/27(水) 07:35:000266デフォルトの名無しさん
2010/01/27(水) 07:36:25この場合またフックされるが
0267デフォルトの名無しさん
2010/01/28(木) 14:33:34お返事遅れましたが>>265-266さん
ありがとうございます。
0268デフォルトの名無しさん
2010/01/29(金) 06:27:27カーネル: Linux 2.6.26-2-686 コンパイラ: gcc version 4.3.2 (Debian 4.3.2-1.1)
int main(int argc, char** argv)
{
char *cmd="./test.sh"; /* 実行するシェルスクリプト */
char *option="";
pid_t pid;
pid_t v_wait;
int status;
FILE* stout = fopen("out.txt", "w"); /* 実行結果をout.txtに記録 */
if (( pid = fork () ) == -1 ) {
fclose(stout);
return 1;
} else if (pid > 0) { /* parent process */
fclose(stout);
v_wait = waitpid(pid, &status, 0);
if (WEXITSTATUS(status) != 0) {
/* エラー処理をここで行いたい */
}
} else { /* child process */
if ( stout == NULL ) goto error;
if ( dup2(fileno(stout), 1) == -1 ) goto error;
fclose(stout);
dup2(1, 2); /* 標準エラーを標準出力へ */
fflush(stdout); fflush(stderr);
execlp(cmd, cmd, option, NULL);
}
return 1;
error:
perror("err"); return 1;
}
0269デフォルトの名無しさん
2010/01/29(金) 10:49:42エラーメッセージを受け取りたいならパイプを使え
0270デフォルトの名無しさん
2010/01/29(金) 12:17:06それはともかく、test.sh 単体の実行結果はちゃんとエラーを戻してる?
0271デフォルトの名無しさん
2010/01/29(金) 12:20:010272デフォルトの名無しさん
2010/01/29(金) 16:55:14シェルスクリプト実行が終わった時点でフラグが立ってたら(1つでもエラーがあれば)メールで実行ログを自分当てに送信という、処理をしてます。
が、処理を追加するたびに、これらも一緒に追加するのが面倒なので、シェルスクリプトには本来の処理だけやってもらって、ここの部分だけCで書けないかと思った次第です。
そのため、test.sh単体ではあえて戻り値を返さずに処理してます。
標準出力を吐き出すファイルと標準エラーを吐き出すファイルを別々にして、
標準エラーを吐き出したファイルが空でなければエラー処理…という方法も
考えましたが、実行ログには両方書き込まれた状態で作成したいので
どうしたら良いか悩んでます。
0273デフォルトの名無しさん
2010/01/29(金) 20:23:26int num;
for(iをtestのサイズ分まで増やす){
if(VAL == test[i]){ num=i }
}
return num;
}
main {
vector<double> test;
testの中にデータを入れる。
int num = hoge(test);
vector<double>::iterator it;
it = test[num] ←testのnum番目のイテレータを取得したい
}
省略したコードで申し訳ないのですが、上記の中にあるような
処理がしたいです。何かよい方法はあるのでしょうか?
よろしくお願いします。
0274デフォルトの名無しさん
2010/01/29(金) 20:28:060275デフォルトの名無しさん
2010/01/29(金) 21:46:040276デフォルトの名無しさん
2010/01/29(金) 21:46:090277デフォルトの名無しさん
2010/01/31(日) 09:20:28char mes[80];
sprintf( mes, "%d", dwSize );
printf( mes );
で DWORD の値がmesに反映されないんだけど
DWORD の書式は %dでよかったっけ?
0278デフォルトの名無しさん
2010/01/31(日) 09:27:030279デフォルトの名無しさん
2010/01/31(日) 10:14:190280デフォルトの名無しさん
2010/01/31(日) 10:15:27のページにある画像データだけ直リンでダウンロードしようとしてるのですが
wget で
wget http://www......jpg
と入力しても403が返ってきてダウンロードできないのですが
どうすれば画像だけダウンロードできるのでしょうか?
0281デフォルトの名無しさん
2010/01/31(日) 10:37:160282デフォルトの名無しさん
2010/01/31(日) 23:36:06str.erase(find(str.begin(), str.end(), '*'), str.end());
文字列から最後の'*'を探して、そこから前を削除するっていうのは1行で書けますか?
str.erase(str.begin(), find(str.rbegin(), str.rend(), '*'));
としてもコンパイル出来ませんでした
0283デフォルトの名無しさん
2010/02/01(月) 03:32:17よろしくお願いいたします。
とあるWebブラウザゲームを定期巡回しながら
1.データ値取得
2.データ値から状況解析
3.解析結果をWebに入力
というプログラムを作りたいと思っています。
こういったことはC言語で可能でしょうか??
0284デフォルトの名無しさん
2010/02/01(月) 06:23:56str.erase(str.begin(), str.begin() + str.rfind('*') + 1);
0285デフォルトの名無しさん
2010/02/01(月) 08:13:16ありがとうございます
イテレーターって数字足してもいいものだったんですね
0286デフォルトの名無しさん
2010/02/01(月) 10:28:59可能だがこれからC言語を勉強しようというのだったらそのことだけに集中しても1ヶ月はかかると思われる
他に本業があってその合間に片手間で勉強とかいうなら1年はかかると思われる
0287デフォルトの名無しさん
2010/02/01(月) 10:35:33足してもいいイテレータと足せないイテレータがある
vectorとかstringは足してもいいランダムアクセスイテレータ
listとかsetのイテレータはランダムアクセスじゃないので足せない
0288デフォルトの名無しさん
2010/02/01(月) 13:18:36std::stringのメンバ関数とアルゴリズムはreverse_iteratorを受け付けないので
不便だと思う事がよくあるよな
この場合は逆変換メンバ関数base()を使って
str.erase(str.begin(), find(str.rbegin(), str.rend(), '*').base());
と書くとすっきりして読みやすいと思うがどうだろうか
0289デフォルトの名無しさん
2010/02/01(月) 17:02:54可能
0290デフォルトの名無しさん
2010/02/02(火) 07:48:15ご回答ありがとうございます。
C言語を扱うモチベーションが欲しかっただけなので
片手間ながらもやっていこうと思います。
ブラウザだけスクリプトブラウザというものを使えば
javascript , C , VBA 辺りを使えばできそうなので
なんとかやってみようと思います。
0291デフォルトの名無しさん
2010/02/02(火) 15:19:16テキストファイルを一括でメモリに読み込む方法はありますか?
0292デフォルトの名無しさん
2010/02/02(火) 15:21:580293デフォルトの名無しさん
2010/02/02(火) 17:39:060294デフォルトの名無しさん
2010/02/02(火) 17:41:57バックアップごと全部消したぜ
もう製品も体験版もソースも残ってねぇぜ
いええええええええええええええええあああああああああああああああああああああああああああああああああああああああああ
0295デフォルトの名無しさん
2010/02/02(火) 17:46:210296デフォルトの名無しさん
2010/02/02(火) 17:47:21あるわけねぇじゃん
いえええええええええええええええええええええええええあああああああああああああああああああああああああああああ
0297デフォルトの名無しさん
2010/02/02(火) 17:49:190298デフォルトの名無しさん
2010/02/02(火) 17:50:550299デフォルトの名無しさん
2010/02/02(火) 18:10:240300デフォルトの名無しさん
2010/02/02(火) 18:58:11個人経営なんじゃない?
0301デフォルトの名無しさん
2010/02/02(火) 19:43:56ちょ!
どうやってバグフィックスすんだ!!
0302デフォルトの名無しさん
2010/02/02(火) 19:46:17夜逃げでもすんのか?
0303デフォルトの名無しさん
2010/02/02(火) 20:50:460304デフォルトの名無しさん
2010/02/03(水) 17:19:59void init(int array[10][10], int width, int height);
void make_grider(int array[10][10]);
int check_life(int array[10][10], int width, int height,int x, int y);
void check_all_life(int array[10][10],int width, int height);
void print_lifes(int array[10][10],int width,int height);
int main(int argc, char* argv[])
{
int lifes[10][10];
int i;
init(lifes,10,10);
make_grider(lifes);
for(i = 0; i <= 2; i++) {
print_lifes(lifes,10,10);
printf("--------------------------------------------------------------\n");
check_all_life(lifes, 10, 10);
}
return 0;
}
void init(int array[10][10], int width, int height)
{
int x, y;
for(x = 0; x < height; x++) {
for(y = 0; y < width; y++) {
array[x][y] = 0;
}
}
}
0305デフォルトの名無しさん
2010/02/03(水) 17:23:04{
int ans = 0;
ans += array[(i + height + 1) % height][(j + width - 1) % width];
ans += array[(i + height + 1) % height][(j + width) % width];
ans += array[(i + height + 1) % height][(j + width + 1) % width];
ans += array[(i + height) % height][(j + width - 1) % width];
ans += array[(i + height) % height][(j + width + 1) % width];
ans += array[(i + height - 1) % height][(j + width - 1) % width];
ans += array[(i + height - 1) % height][(j + width) % width];
ans += array[(i + height - 1) % height][(j + width + 1) % width];
return ans;
}
0306デフォルトの名無しさん
2010/02/03(水) 17:24:15{
int x,y,live_neighbors;
live_neighbors = 0;
for (x = 0; x < height; x++) {
for (y = 0; y < width; y++) {
live_neighbors = check_life(array,width,height,x,y);
if(array[x][y] == 1) {
if(live_neighbors == 3 || live_neighbors == 2) {
array[x][y] = 1;
}
else {
array[x][y] = 0;
}
}
else if(array[x][y] == 0) {
if(live_neighbors == 3) {
array[x][y] = 1;
}
else {
array[x][y] = 0;
}
}
else {
array[x][y] = 0;
}
}
}
}
0307デフォルトの名無しさん
2010/02/03(水) 17:26:32{
int x, y;
for(x = 0; x < height; x++) {
for (y = 0; y < width; y++) {
if(array[x][y] == 1) {
printf("[X]");
}
else if(array[x][y] == 0) {
printf("[ ]");
}
}
printf("\n");
}
}
C言語の習作としてLifeGameを書いてみたのですが実行すると
なぜだかきちんと更新されません。ここ数日考えてみたり
Web上のソースを読んだりしてみたのですがどうも原因が分かりませんでした
見落としている点がどこにあるのかお教え願います
よろしくお願いします。
0308デフォルトの名無しさん
2010/02/03(水) 17:44:15check_lifeで新しい状態を計算するときに現在の状態と新しい状態をごちゃまぜに見てしまうため正しく動かない
新しい状態は別の配列に書き込み、全部のマスの計算を終えた後それをarrayに書き戻せば上手くいく
ところで何レスも消費しそうな長いコードはどこかにうpしてURLだけ貼り付けてくれ
0309デフォルトの名無しさん
2010/02/03(水) 18:10:09説明をきいてよくよく考えたら確かにその通りでした。
初めての書き込みだったのでどうすればいいか分かりませんでした
今後お世話になることがあればきちんとそのようにしたいと思います。
0310デフォルトの名無しさん
2010/02/03(水) 20:38:41ttp://codepad.org/
長いソースを貼るときはここへ!
ってテンプレートに入れようぜ。
0311デフォルトの名無しさん
2010/02/04(木) 18:41:23なんでtest1がダメでtest2がおkなのはどうして?
0312デフォルトの名無しさん
2010/02/04(木) 19:04:12test1はそのダメさがあまりにあからさまなのでそれに気付いたコンパイラが親切にも警告してくれた
test2はコンパイラがそのダメさに気付かず見過ごしてしまっただけでダメなことには変わりない
0313デフォルトの名無しさん
2010/02/04(木) 19:10:21const char *もダメで、stringじゃあ二重に例外発生の危険がある
配列を持たせて、そこにコピーすれば良さそうだけど長さが足りなくなるかもしれない
0314デフォルトの名無しさん
2010/02/04(木) 19:13:40分かりやすい!
0315デフォルトの名無しさん
2010/02/04(木) 19:20:09足りない分は切り捨てれば
なんなら末尾に "省略されました・・・全てを読むにはワッフルワッフル(ry" とでも付けておけば問題ない
0316デフォルトの名無しさん
2010/02/04(木) 19:46:050317デフォルトの名無しさん
2010/02/04(木) 19:51:26std::runtime_errorなりなんなりにメッセージを入れといて
投げればいいじゃない。
0318デフォルトの名無しさん
2010/02/05(金) 13:57:27おもしろいね
0319デフォルトの名無しさん
2010/02/05(金) 18:38:45こういう場合は投げた"abc"は一時オブジェクトなのでしょうか?
0320デフォルトの名無しさん
2010/02/05(金) 18:42:440321デフォルトの名無しさん
2010/02/05(金) 18:57:150322デフォルトの名無しさん
2010/02/05(金) 21:37:35こんなものを作ってみました。
ttp://codepad.org/1Uf0BQ68
1.
この
{
boost::shared_ptr<MyClass> p1(new MyClass);
boost::shared_ptr<MyClass> p2(new MyClass);
boost::shared_ptr<MyClass> p3(new MyClass);
boost::shared_ptr<MyClass> p4(new MyClass);
}
の部分で、(例えば)3つ目を生成する時に例外が発生した場合、
p1やp2のデストラクタは呼ばれていないのでしょうか?
私の環境で実行すると
ttp://uploader.rgr.jp/src/up1887.jpg
こんなことになりました。
それとも「実はデストラクタは呼ばれているが画面に反映されていない」だけでしょうか?
2.
また
boost::shared_array<MyClass> p(new MyClass[4]);
で失敗(例外を投げた)した場合は、p1〜p4は既に前のスコープを脱出する段階で
正常に破棄されているのでリソース漏れは無いと思うのですが、
pの途中まで生成された分は破棄されますか?
よろしくお願いします。
0323デフォルトの名無しさん
2010/02/05(金) 22:49:16try-catchでくくってごらん
int main()
{
try
{
std::srand((unsigned int)std::time(NULL));
{
boost::shared_ptr<MyClass> p1(new MyClass);
boost::shared_ptr<MyClass> p2(new MyClass);
boost::shared_ptr<MyClass> p3(new MyClass);
boost::shared_ptr<MyClass> p4(new MyClass);
}
{
boost::shared_array<MyClass> p(new MyClass[4]);
}
}
catch(...)
{
std::cout<<"例外が投げられた\n";
}
return 0;
}
0324322
2010/02/05(金) 23:10:24ありがとうございます。
ttp://codepad.org/dm1DTm2d
try-catchでくくってみました。
1.
ttp://uploader.rgr.jp/src/up1892.jpg
2.
ttp://uploader.rgr.jp/src/up1893.jpg
確かに両方とも問題無く破棄されているようです。
・・・しかし、だとすると>>322でデストラクタが実行されていない様に見えたのは、
「実はデストラクタは呼ばれているが画面に反映されていない」ということなのでしょうか?
0325デフォルトの名無しさん
2010/02/05(金) 23:12:13throwってオブジェクトはスコープ飛び越えるんじゃなかったっけ?
0326322
2010/02/05(金) 23:14:12int main_impl()
の様にわけてみても
try-catchなしの
ttp://codepad.org/gCiHDqlw
では
ttp://uploader.rgr.jp/src/up1894.jpg
ttp://uploader.rgr.jp/src/up1895.jpg
のように、デストラクタが動いている様子が確認できません。
0327デフォルトの名無しさん
2010/02/05(金) 23:17:52配列もデストラクトされる
0328デフォルトの名無しさん
2010/02/05(金) 23:38:52だとすると>>322でデストラクタが実行されていない様に見えたのは、
「実はデストラクタは呼ばれているが画面に反映されていない」ということなのでしょうか?
0329デフォルトの名無しさん
2010/02/05(金) 23:58:27http://codepad.org/ButwZVJU
そして例外をどこかで補足しないまま放置すると勝手にabortされてしまう
0330デフォルトの名無しさん
2010/02/06(土) 09:42:01デストラクタを呼ばないのは妥当と思う。
0332デフォルトの名無しさん
2010/02/07(日) 16:47:12メンバへのアクセスに使う演算子( . と ->)が違います
なぜ、使い分けるのが面倒なのに、わざわざメンバへのアクセス方法を別にしたのですか?
0333デフォルトの名無しさん
2010/02/07(日) 16:51:480334デフォルトの名無しさん
2010/02/07(日) 17:16:32Cでもポインタの場合はアロー演算子を使うじゃん。
0335デフォルトの名無しさん
2010/02/07(日) 17:17:430336デフォルトの名無しさん
2010/02/07(日) 17:24:56newしたからという区別ではない。変数と参照はドット演算子、ポインタはアロー演算子だよ。
0338デフォルトの名無しさん
2010/02/07(日) 18:15:440339デフォルトの名無しさん
2010/02/07(日) 19:15:04申し訳ない
C言語を飛ばして、C++を勉強しているので
C言語はポインタばっかりだし、クラスが無いから勉強する気になれないんで
mallocとかの使いかたも知らないしorz
0340デフォルトの名無しさん
2010/02/07(日) 19:25:550341デフォルトの名無しさん
2010/02/07(日) 19:26:46どーせJavaから入ってるんだろうけど
まずポインタってものを理解しろ
0342デフォルトの名無しさん
2010/02/07(日) 19:27:53C/C++では、(Javaのプリミティブ型と同じように)スタックにオブジェクトを確保できること、からかな。
0343デフォルトの名無しさん
2010/02/07(日) 19:30:030344デフォルトの名無しさん
2010/02/07(日) 19:37:51参照(ポインタ)ではなく実体を持てる、って点も同様だね。
0345332
2010/02/07(日) 19:45:17そうです、java出身
>>342
javaだとメモリが抽象化されすぎてる所が、嫌になったわけです
でも、C++だと明示的にdeleteするのが面倒くさいですね
>>343
ヒープは適当な所でdeleteすればいいだけですからね
でも、スタックは自動でdeleteしちゃうじゃないですか
0346デフォルトの名無しさん
2010/02/07(日) 19:52:34参照型で引数を受け取ればドットでアクセスすることになるし、ポインタ型で受け取れば矢印でアクセスすることになる。
0347デフォルトの名無しさん
2010/02/07(日) 20:03:46スマートポインタやRAIIのような機構を使えば
明示的にdeleteするコードなんてほとんど書かなくなるよ
0348デフォルトの名無しさん
2010/02/07(日) 20:05:38実体も渡せる
0349332
2010/02/07(日) 20:12:35スマートポインタ→auto_ptrとかが代表
C++0xではauto_ptrが推奨されていなくて、shared_ptrがって話がありますよね
メモリ管理を楽にするプログラミングを覚えて、
生産性をあげたいのですがC++の入門サイトだとダメですね
てか、Javaスレと比べるとC++スレは親切な人が多いな〜
0350デフォルトの名無しさん
2010/02/07(日) 20:16:220xにはshared_ptrだけでなく、auto_ptrライクなunique_ptrもあるよ。
unique_ptrはauto_ptrと違って、std::vectorなどのコンテナにも入れられる。
0351デフォルトの名無しさん
2010/02/07(日) 20:43:11おめー、なんか大きな勘違いをしてるみたいだから
一つだけ教えてやる。
>C++スレは親切な人が多い
これだけは絶対間違ってる。
0352デフォルトの名無しさん
2010/02/07(日) 20:58:05生産性云々言う前に、Cの勉強から出直すべし。
Javaで培ったオブジェクト指向脳が役に立つとすればその後だ。
0353デフォルトの名無しさん
2010/02/07(日) 21:01:090354デフォルトの名無しさん
2010/02/07(日) 21:35:010355デフォルトの名無しさん
2010/02/07(日) 21:51:22CにあってC++では実現出来ないものってあるの?
既にCのスーパーセットではないとは言われてるけど。
0356デフォルトの名無しさん
2010/02/07(日) 21:59:18実現できない物議論をするのか?
じゃあバイナリエディタで直接書けばいいじゃない。
何でもできるよ。
0357デフォルトの名無しさん
2010/02/07(日) 22:14:45struct {
int a,b,c
} aaa = {.a = 10, .c = 0};
こんなん出来る?
0358デフォルトの名無しさん
2010/02/07(日) 22:32:32aとcだけ初期値を与えたいということであれば、コンストラクタを書けばいい。
.aや.cなどメンバを指定したいということであれば、ちょっと面倒。
マクロでやるかメンバ関数をチェインさせるか。
0359デフォルトの名無しさん
2010/02/07(日) 22:53:420360デフォルトの名無しさん
2010/02/08(月) 00:49:28Cとの連携のために
#ifdef __cplusplus
extern "C" {
#endif
みたいなのを書かなくていいこと(当たり前だ)
0361デフォルトの名無しさん
2010/02/08(月) 01:34:08Cでできることは大抵C++でできるので、ほとんどない。
あったとしても、newって変数名が使えなくなったとか、キャストせずにやったところをキャストする必要が出てきたとか、
C++に書き直しても綺麗でなくなるとは言えないものが多い。
けど、Cの機能使って書いたら綺麗だろうに、
C++の機能を変に使ったが故に汚くなることはいくらでもある。
0362デフォルトの名無しさん
2010/02/08(月) 07:03:100363デフォルトの名無しさん
2010/02/08(月) 13:44:11型名、変数名はC++のほうが長くなりがちでうざい
スコープ解決もあるし
0364デフォルトの名無しさん
2010/02/08(月) 15:04:040365デフォルトの名無しさん
2010/02/08(月) 15:13:410366デフォルトの名無しさん
2010/02/08(月) 15:59:470367デフォルトの名無しさん
2010/02/08(月) 19:03:250368デフォルトの名無しさん
2010/02/08(月) 21:17:47フレームワークとかライブラリの作者しか、使わないような気がするけど
0369デフォルトの名無しさん
2010/02/08(月) 21:49:01後はコンパイラのデフォルトで困る場合operator=をオーバーロードするぐらい
0370デフォルトの名無しさん
2010/02/08(月) 21:50:41やっぱり、そんくらいだよな
0371デフォルトの名無しさん
2010/02/08(月) 21:53:54( )
=
割とつかう
比較各種
->
*
|
0372デフォルトの名無しさん
2010/02/08(月) 22:04:240373デフォルトの名無しさん
2010/02/08(月) 22:05:04でも=と同程度以上には使うイメージ
0374デフォルトの名無しさん
2010/02/08(月) 22:09:180375368
2010/02/08(月) 22:14:49std::cout << "str";は、C++の標準出力で有名ですが
std::coutはどうやって << の値を、受け取っているんですか?
0376デフォルトの名無しさん
2010/02/08(月) 22:45:10ついでかよ・・・。
0377デフォルトの名無しさん
2010/02/08(月) 22:55:140378デフォルトの名無しさん
2010/02/08(月) 22:55:49さっぱりわかりません
こんな感じになってほしいんですが
どういう方針で作ればよいのでしょうか
n=2の場合
(1 2)
n=3の場合
((1 2) 3)
(1 (2 3))
n=4の場合
(((1 2) 3) 4)
((1 (2 3)) 4)
(1 ((2 3) 4))
(1 (2 (3 4)))
((1 2) (3 4))
0379デフォルトの名無しさん
2010/02/08(月) 23:00:120380デフォルトの名無しさん
2010/02/08(月) 23:06:17確かできるはず。
http://codepad.org/W286gdPj
数の処理がきたないのはごめんなさい。
0381デフォルトの名無しさん
2010/02/08(月) 23:15:57gcc先生がこんなメッセージを出すわけですが、
何これ?
0382デフォルトの名無しさん
2010/02/08(月) 23:24:470383デフォルトの名無しさん
2010/02/08(月) 23:27:450384デフォルトの名無しさん
2010/02/08(月) 23:41:02作ったコードを単純に動かしてみただけ
ちゃんと動くけど、gccがメッセージを吐いているから気になっただけ
>>383
それ何してるの?
linuxを使っているんだけど、コマンド(emerge)を使って自動でインストールしたから
何がなんだかサッパリなんだけど
0385デフォルトの名無しさん
2010/02/08(月) 23:41:16LANG=Cする必要も無い
0386デフォルトの名無しさん
2010/02/09(火) 08:59:57http://codepad.org/tSDffcxm
0387デフォルトの名無しさん
2010/02/09(火) 15:23:050388デフォルトの名無しさん
2010/02/09(火) 19:08:31参考にさせていただきます
0389デフォルトの名無しさん
2010/02/09(火) 19:44:37一か所だけどうしてもうまくいきません
show_dfs_raw4の箇所が分かる人いたら教えてもらえませんか
http://codepad.org/TbR5kRu1
木構造をpreorderで表示する関数。これを非再帰に書き換える
void show_dfs_raw(ptree& p){
cout << p->d;
if(p->l)show_dfs_raw(p->l); //LからR
if(p->r)show_dfs_raw(p->r);
}
0390デフォルトの名無しさん
2010/02/10(水) 15:05:10return するときに一時変数にコピーするのと
returnしたデーターを保存するために変数にコピーするから2回コピーされるんですか?
保存しないで一時変数のまま使えば1回ですか?
0391デフォルトの名無しさん
2010/02/10(水) 15:23:420392デフォルトの名無しさん
2010/02/10(水) 15:26:20誤 シタデーター
正 したデータ
0393デフォルトの名無しさん
2010/02/10(水) 15:33:30Object& bbbb(){};
Object cccc{
}
0394デフォルトの名無しさん
2010/02/10(水) 15:35:08Object bbbb(){};
Object cccc{
return aaaa()*aaaaa();
}
Object dddd{
return bbbb()*bbbb();
}
これについて教えてください。
aaaaaというのは>>390の奴です。
効率は違うんですか?
0395デフォルトの名無しさん
2010/02/10(水) 15:38:400396デフォルトの名無しさん
2010/02/10(水) 16:10:42return b;
ってやるじゃないですか
するとbは書き換えられないように一時変数にbのコピーコンストラクターで
コピーされますよね。
そのあとObject c=bbbb();ってやると2回コピーされますよね
0397デフォルトの名無しさん
2010/02/10(水) 18:03:400398デフォルトの名無しさん
2010/02/10(水) 18:08:190399デフォルトの名無しさん
2010/02/10(水) 18:11:24本当に困っています。
0400デフォルトの名無しさん
2010/02/10(水) 18:39:47されない
それはコピーコンストラクタの特別な書き方
もしそういう書き方を避けたいならexplicitをコンストラクタに付けておく
そうすると Object c(bbbb()) って書き方しか出来なくなる
0401デフォルトの名無しさん
2010/02/10(水) 18:54:24そのあと、一時変数を参照をcにコピーしたら一時変数は消えるから
cは何も指さなくなるからまた値渡しになって2回コピーされるじゃないですか?
aaaa()の場合は2回渡しても参照だからアドレス渡すだけで早いんじゃないですか?
この文で間違っているところありますか?
0402デフォルトの名無しさん
2010/02/10(水) 19:34:170403デフォルトの名無しさん
2010/02/10(水) 20:09:00newするならポインタを取っておいてdeleteしなきゃダメ。
0404デフォルトの名無しさん
2010/02/10(水) 20:35:070405デフォルトの名無しさん
2010/02/10(水) 20:38:460406デフォルトの名無しさん
2010/02/10(水) 20:40:55確かにそうだな
ちょっと考えるとbbbb()の戻り値を入れる場所とcの場所はまず違う
そうなると一時オブジェクトの生成とcの初期化に2回コピーされそうだな
C++0xの右辺値参照こういう場合アドレス渡し出来る所はガンガン
アドレス渡しだけしてコピーを省略する仕組みになる予定
0407デフォルトの名無しさん
2010/02/10(水) 20:46:09そういう書き方をしたからどうだと言うのだね
http://codepad.org/ylXYtNpH
0408デフォルトの名無しさん
2010/02/10(水) 22:06:29true成功
false失敗
が一般的ですよね?
0409デフォルトの名無しさん
2010/02/10(水) 22:36:03というか関数の名前しだいじゃないかな?
bool xxx_is_failed(〜)
だったら
true失敗
false成功
になると思うんだけど?
0410デフォルトの名無しさん
2010/02/10(水) 23:19:52この本は相当キチガイじみているがそれでも必携の本だと思う
0411デフォルトの名無しさん
2010/02/11(木) 01:23:32using namespace std;
class Obj{
char a;
public:
Obj(){ cerr << "Obj()" << endl; }
Obj(const Obj&){ cerr << "Obj(const Obj&)" << endl; }
};
Obj val_val(Obj obj){ return obj; }
// Return local variable
// Obj &val_ref(Obj obj){ return obj; }
Obj ref_val(Obj &obj){ return obj; }
Obj &ref_ref(Obj &obj){ return obj; }
int main(){
Obj obj, t;
cerr << "val->val" << endl;
val_val(obj);
cerr << "ref->val" << endl;
ref_val(obj);
cerr << "ref->ref" << endl;
ref_ref(obj);
cerr << "assign val->val" << endl;
t = val_val(obj);
cerr << "assign ref->val" << endl;
t = ref_val(obj);
cerr << "assign ref->ref" << endl;
t = ref_ref(obj);
}
0412デフォルトの名無しさん
2010/02/11(木) 01:26:11Obj()
Obj()
val->val
Obj(const Obj&)
Obj(const Obj&)
ref->val
Obj(const Obj&)
ref->ref
assign val->val
Obj(const Obj&)
Obj(const Obj&)
assign ref->val
Obj(const Obj&)
assign ref->ref
ここまで書いて気づいたけど、代入じゃコピーコンストラクタ呼ばれないじゃん。
0413デフォルトの名無しさん
2010/02/11(木) 01:39:35Obj &operator =(const Obj &obj){ cerr << "operator =" << endl;return *this; }
を追加して同様に実行してみたら、代入なしの方は結果同じで、
代入ありの方の結果:
assign val->val
Obj(const Obj&)
Obj(const Obj&)
operator =
assign ref->val
Obj(const Obj&)
operator =
assign ref->ref
operator =
結論
呼び出し時に、値渡しなら1回コピーされる。参照渡しならされない
変数返したときに、値返しなら1回コピーされる。参照返しならされない
代入演算子の呼び出しも、恐らく同様。
参照渡しの参照返しなら(コピーコンストラクタでの)コピーは発生しないが、通常は代入演算子でコピーのような処理をすると思われる
(デフォルトでは、変数の中身全部コピーじゃねーの?多分
0414デフォルトの名無しさん
2010/02/11(木) 07:51:53何をもって成功/失敗とするのか曖昧なこともあるからね。
0415デフォルトの名無しさん
2010/02/11(木) 08:27:20char **v = (char**) alloca(size);
↑のように書きましたが、これだと char *v[100]; とするのは別でしょうか?
0416デフォルトの名無しさん
2010/02/11(木) 08:39:310417デフォルトの名無しさん
2010/02/11(木) 14:44:01while(1) int n;
とかやったら無限にメモリ領域を確保することになるの?
0418デフォルトの名無しさん
2010/02/11(木) 14:45:320419デフォルトの名無しさん
2010/02/11(木) 14:47:38単に{]ブロックの最初で宣言したのと同じような意味合いになるだけ。
0420デフォルトの名無しさん
2010/02/11(木) 15:02:270422デフォルトの名無しさん
2010/02/12(金) 01:07:53質問の仕方が下手だなぁ。それじゃ>416も「別」としか答えられないじゃないの。
エスパーするとこういう事?
num=100;
char **v = (char**)alloca(num*sizeof(char **));
0423デフォルトの名無しさん
2010/02/12(金) 01:17:09ちなみに、確保したのはあくまでchar*へのポインタの配列だから、それだけじゃ
v[i][j]="hogehoge";
みたいなのはできないよ。
分かってるかもしれないけど、念のため。
0424422
2010/02/12(金) 01:32:24sizeof(char *)だ
0425デフォルトの名無しさん
2010/02/12(金) 09:17:17jmpを使ったものに比べて何倍にもなるんでしょうか?
0426デフォルトの名無しさん
2010/02/12(金) 09:31:20Class Aを持つクラス Bがあって インスタンス名はcです。
Aにはconst a& aaaa();という関数があります。
aはAの中で保持しているデータです。
Bにはconst a& (){
return c.aaaa();
}
ってやると一時変数をリターンしたみたいな警告がでるようなきがします。
実験して無いのでわかりませんが、似たような状態で警告が出ました。
どうしたらいいですか?
0427デフォルトの名無しさん
2010/02/12(金) 09:36:200428デフォルトの名無しさん
2010/02/12(金) 09:41:15警告が出ないので再現出来ません
0429デフォルトの名無しさん
2010/02/12(金) 09:45:180430デフォルトの名無しさん
2010/02/12(金) 09:45:460431デフォルトの名無しさん
2010/02/12(金) 09:53:26コンパイルしてないので分かりません。
データーの型もテンプレートです。
0432デフォルトの名無しさん
2010/02/12(金) 09:56:45コンパイル出来て、警告が出るソースを出せって言われてるの。
0433デフォルトの名無しさん
2010/02/12(金) 09:56:54検証してみますから
0434デフォルトの名無しさん
2010/02/12(金) 10:12:380435デフォルトの名無しさん
2010/02/12(金) 10:13:230436デフォルトの名無しさん
2010/02/12(金) 10:19:06C++ Templates: The Complete Guide の
Expression Templatesの章の
ArrayクラスのT operator[] constの戻り値を
&Tに変えたクラスと同じ状態だと思います。
有名な本だと思うので分かると思います。
0437デフォルトの名無しさん
2010/02/12(金) 10:20:47&TじゃなくてT&
0438デフォルトの名無しさん
2010/02/12(金) 10:25:15持ってないので知りません
「あなたが」晒してください
0439デフォルトの名無しさん
2010/02/12(金) 10:26:280440デフォルトの名無しさん
2010/02/12(金) 10:29:06多分誰も答えません
0441デフォルトの名無しさん
2010/02/12(金) 10:30:080442デフォルトの名無しさん
2010/02/12(金) 10:30:46残念ながらコンパイル可能なプログラムを提示することができません。
次回もってくるのでそのときから”持ってない人”は答えてください。
0443デフォルトの名無しさん
2010/02/12(金) 10:31:28だったら今質問すんなカス
エスパースレでも逝けや
0444デフォルトの名無しさん
2010/02/12(金) 10:32:27「教えて頂く」側の態度とは到底思えない
0445デフォルトの名無しさん
2010/02/12(金) 10:35:140446デフォルトの名無しさん
2010/02/12(金) 10:35:32codepadにコピペしたらコンパイルできる
0447デフォルトの名無しさん
2010/02/12(金) 10:37:20ガタガタ屁理屈抜かすな
答えが欲しかったら下手に出ろや
社会の常識も知らんのか
0448デフォルトの名無しさん
2010/02/12(金) 10:41:23どういう態度で質問すべきか分らないバカはのたれ死んでしまえ。
0449デフォルトの名無しさん
2010/02/12(金) 10:42:530450デフォルトの名無しさん
2010/02/12(金) 10:44:36本持ってても答えない方が、スレの今後のために良いと思う。
0451デフォルトの名無しさん
2010/02/12(金) 10:45:11本持ってるけど答えてやんない
0452デフォルトの名無しさん
2010/02/12(金) 10:45:40クズが困る事は、むしろメシウマ。
0453デフォルトの名無しさん
2010/02/12(金) 10:46:482chを質問を入力するとポンと答えが出てくる便利な機械と勘違いしていないか?
画面の向こうにいるのは生身の人間である事をお忘れ無く
0454デフォルトの名無しさん
2010/02/12(金) 10:54:25http://codepad.org/nOL0Yx3H
gcc, msvcともにwarning なんて出ませんが…
0455デフォルトの名無しさん
2010/02/12(金) 11:54:11自己解決しました。
>>454
ありがとうございました。
aaaaの戻り値がTのやつがあったらしいです。
0456デフォルトの名無しさん
2010/02/12(金) 12:09:380457デフォルトの名無しさん
2010/02/12(金) 12:17:02free(): invalid next size (fast): 0x083c69b8 ***
が出るんだけどこれはメモリ領域を開放する部分を疑うべきなのだろうか?
同じプログラムをMac OS XのGCC 4.2でコンパイルして実行するとエラーが出ずに実行できるんだけど
FedoraのGCC 4.4でコンパイルして実行すると上のようなものがでてCore dumpしてしまうようなのですが
0458デフォルトの名無しさん
2010/02/12(金) 12:20:370459デフォルトの名無しさん
2010/02/12(金) 12:22:08会社の仕事のコードならわかるが、趣味のコードで見せたがらないってのがわからん
トランプを裏返しにして何のカードか当てろと言ってるのと同じだぞ
0460デフォルトの名無しさん
2010/02/12(金) 12:24:38作れない場合の方がおおい。
0461デフォルトの名無しさん
2010/02/12(金) 12:29:58じゃあ元のコードがバグだらけって事じゃん
質問が全く的を射ていないわけだ
0462デフォルトの名無しさん
2010/02/12(金) 12:40:140463デフォルトの名無しさん
2010/02/12(金) 13:34:36aのインスタンスを作る関数の戻り値は値渡しにしたほうがいいですか?
そうしないと使うとき(*a)[x]という変な形になってしまうので、
0464デフォルトの名無しさん
2010/02/12(金) 15:12:150465デフォルトの名無しさん
2010/02/12(金) 15:17:510466デフォルトの名無しさん
2010/02/12(金) 15:18:470467デフォルトの名無しさん
2010/02/12(金) 15:20:27参照で返すのはオススメできませんか?
0468デフォルトの名無しさん
2010/02/12(金) 15:23:35書き換えられたらだめとおもいました。
0469デフォルトの名無しさん
2010/02/12(金) 15:35:42書き換えられるんだから参照にすればいい
そうじゃなければやめればいい
0470デフォルトの名無しさん
2010/02/12(金) 15:37:21ありがとうございました。
0471デフォルトの名無しさん
2010/02/12(金) 17:33:33SSE 4.2って文字列処理に役立つ命令ってあったっけ?
ついでだからSSE2版の比較。
http://labs.cybozu.co.jp/blog/mitsunari/2008/06/fast_strlen_and_memchr_by_sse2_1.html
0472デフォルトの名無しさん
2010/02/12(金) 18:51:21アルゴリズムC++の187,190ページにのっている
リストを実装に用いたマージソートなんですがmergeできません
main関数と表示などのスタブ的な箇所以外は
基本的にそのまま写してるんですが・・
そもそもこのコードだとmergeできないように思ったので
打ちこんでみたんですが
これって私の勘違いでしょうか?
0473デフォルトの名無しさん
2010/02/13(土) 01:18:00malloc/callocで確保してないメモリを解放してるか、既に解放したメモリを再び解放してるか、
どっかで配列のオーバーフロー/アンダーフローが起こってて、メモリの管理領域を壊してるかじゃないかなぁ。
確保したメモリかを確認し直して、多重解放してないか確認して(解放したらNULL入れておくといいよ)
ヒープ領域(大雑把に言うとmalloc/callocで確保したメモリのこと)の配列を中心に、変なことしてないか確認。
特に間違いがみつからなかったら、この手のバグは面倒なのが多いから、デバッガの利用を検討した方がいいかも。
0474デフォルトの名無しさん
2010/02/13(土) 12:26:28z->key = 99999999; を入れれば動く
mergeでa->next、b->nextを順に辿っていくといずれzに到達してz->keyも参照することになるが、
z->keyが不定値だとうまく動かないな
0475デフォルトの名無しさん
2010/02/13(土) 13:20:33http://codepad.org/jgeFBNmJ
ありがとうございます。動かせました!
z->keyと同じ値を持つデータがあると正常にソートされないこともわかりました
これってz->nextがzであることを利用しているけど
schemeなんかだと(cdr ('))はエラーだし
引数は破壊的変更しまくりなので
関数型言語でコード化するのは難しそうですね
0476デフォルトの名無しさん
2010/02/13(土) 14:33:130477デフォルトの名無しさん
2010/02/13(土) 14:35:440478デフォルトの名無しさん
2010/02/13(土) 15:08:030479デフォルトの名無しさん
2010/02/13(土) 15:13:160480デフォルトの名無しさん
2010/02/13(土) 16:13:53昇順とか決まってるのかな?
0481デフォルトの名無しさん
2010/02/13(土) 16:30:270482デフォルトの名無しさん
2010/02/13(土) 17:36:53ttp://handasse.blogspot.com/2009/02/cc.html
これを見てソース直して実行しなおしたらlinuxで動くようになりました
どうやら不連続な領域確保をやっていたのが(↑のページの上の方法)原因らしくて
メモリの確保を連続領域でできるように(↑のページの下の方法)変更したら実行できるようになりました
でもなぜMac OS Xのほうではプログラムを実行できたのだろう
メモリの扱い方がどう違うんでしょうかね
0483デフォルトの名無しさん
2010/02/13(土) 18:14:43直す前のコードにバグがあって、OSXの方ではたまたま動いてただけ。
0484デフォルトの名無しさん
2010/02/13(土) 19:14:23連続だろうが不連続だろうが、配列の範囲を越えたところに書き込まなければ起こり得ないバグ。
0485デフォルトの名無しさん
2010/02/14(日) 14:37:35つまり、hogehoge.hに↓のように宣言したら
void Hoge(Test* t);
自動でhogehoge.cppに関数をコピーしてくれる機能はないのか?ということ
void Hoge(Test* t)←自動で挿入
{
}
0486デフォルトの名無しさん
2010/02/14(日) 14:45:58というよりも、修正したと思っている方も実はまぐれで動いている。
9割がた間違いない。
0488デフォルトの名無しさん
2010/02/14(日) 16:42:300489デフォルトの名無しさん
2010/02/14(日) 16:43:210490デフォルトの名無しさん
2010/02/14(日) 17:02:32所詮お前はその程度のスキル。ww
0491デフォルトの名無しさん
2010/02/14(日) 17:06:290492デフォルトの名無しさん
2010/02/14(日) 17:10:22オーバーランによるスタック破壊は本当に怖い
0493デフォルトの名無しさん
2010/02/14(日) 17:43:55スタック話とかおよびじゃねぇよ
0494デフォルトの名無しさん
2010/02/14(日) 18:05:04この場合は全てを疑うのが原則。
0495デフォルトの名無しさん
2010/02/14(日) 18:10:53それでどうしようてんだい?
0496デフォルトの名無しさん
2010/02/14(日) 18:17:07だから、解放時に落ちるのは管理情報壊してるからなんだって。
で、管理情報を壊してるってことはアンダーランとかオーバーランで他のも壊してる可能性が非常に高いし、
落ちなくなったときも、偶然管理情報が無事なだけって可能性が大いにありうる。
0497デフォルトの名無しさん
2010/02/14(日) 19:09:12メモリバグを起こす奴が何言っても説得力ないな
0498デフォルトの名無しさん
2010/02/14(日) 19:43:53バグは誰でも作ってしまうものだから、バグを作ったことで貶められる
ということはないよ。でもバグをろくに調べもせずに他人のせいにする
のは非難されるべき。
0499デフォルトの名無しさん
2010/02/14(日) 20:55:48どのように書けば良いでしょうか?
処理は分割できないので、間間に時間計測処理を挟むこともできません
try catchでできるのかなと思ったんですが、調べても出てこない
助けてください・・・
0500デフォルトの名無しさん
2010/02/14(日) 21:09:160501デフォルトの名無しさん
2010/02/14(日) 21:21:03処理を別スレッドで動かしておいて
指定時間が経過したらスレッドを殺す
0502デフォルトの名無しさん
2010/02/15(月) 12:52:50と後ろにカッコをつけてもintが0に初期化されませんなりません。
MINGWです。
おねがいします。
0503デフォルトの名無しさん
2010/02/15(月) 13:45:53それコンパイル通った?
普通はエラーになると思うんだけど
配列に対してのnewは初期化子が使えません
後からmemset()かstd::fill()でもするしかないです
0504デフォルトの名無しさん
2010/02/15(月) 13:48:59呼び出すには普通placement newを使う
デストラクタは自動的に呼び出されないので自分で I[n]->~a();
みたいにfor文で回す必要がある
0505デフォルトの名無しさん
2010/02/15(月) 13:55:23コンパイルとおりましたよ。
0506デフォルトの名無しさん
2010/02/15(月) 14:03:260507デフォルトの名無しさん
2010/02/15(月) 14:11:05多分g++とVCの拡張文法だと思う
標準では>>502の書き方は許されていない
0508デフォルトの名無しさん
2010/02/15(月) 14:16:410509デフォルトの名無しさん
2010/02/15(月) 14:32:22分かってます
自分もMinGWは入れてあります
0510デフォルトの名無しさん
2010/02/15(月) 14:45:540511デフォルトの名無しさん
2010/02/15(月) 14:51:28そんな事をここで論じても仕方が無い
0512デフォルトの名無しさん
2010/02/15(月) 14:52:38正式なC++の本に書いてありましたから。
0513デフォルトの名無しさん
2010/02/15(月) 15:07:540514デフォルトの名無しさん
2010/02/15(月) 15:09:370515デフォルトの名無しさん
2010/02/15(月) 15:10:34Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
a.cpp:
エラー E2243 a.cpp 5: new で確保した配列には初期化子が使えない(関数 main() )
0516デフォルトの名無しさん
2010/02/15(月) 15:14:40ありがとうございました。
バグっぽいですね。
独自仕様じゃないことが分かってよかったです。
0517デフォルトの名無しさん
2010/02/15(月) 15:48:21初期化子が配列では使えないという事には変わりないけどな
0518デフォルトの名無しさん
2010/02/15(月) 16:18:590519デフォルトの名無しさん
2010/02/15(月) 16:21:40そういうのを使うのか
0520デフォルトの名無しさん
2010/02/15(月) 16:28:250521デフォルトの名無しさん
2010/02/15(月) 16:34:330522デフォルトの名無しさん
2010/02/15(月) 16:46:10使いたくても使えない。
0523デフォルトの名無しさん
2010/02/15(月) 23:27:550524デフォルトの名無しさん
2010/02/15(月) 23:54:28つhttp://pc12.2ch.net/test/read.cgi/tech/1263718091/
参考までに、私の入門書は
http://www.amazon.co.jp/dp/4875931735/
K&R1 と古いのでお勧めはしません。
0525デフォルトの名無しさん
2010/02/15(月) 23:55:41#include <stdio.h>
char *_String( void );
char *_String2( void );
void main(){
char *pChar = _String();
char *pChar2 = _String2();
printf("Output Char:%s\n", pChar);
printf("Output Char2:%s\n", pChar2);
}
char *_String( void ){
char test[10] = "AAAAAABB";
return test; /* 値が確保されているのはここまで */
}
char *_String2( void ){
return "AAAAAABB"; /* 何でこれだけ維持されているのか? */
}
上の場合にchar *_String2( void )の戻り値が確保されている理由を教えてください。
0526デフォルトの名無しさん
2010/02/15(月) 23:57:160527デフォルトの名無しさん
2010/02/15(月) 23:57:18"AAAAAABB"はスタック上に確保されているわけではなく、BSS領域という
一般的にはグローバル変数と同じ領域に置かれている文字列リテラル
だから関数から抜けてもスタックが破壊されて無くなってしまうという事はない
0528デフォルトの名無しさん
2010/02/16(火) 00:02:320529デフォルトの名無しさん
2010/02/16(火) 00:10:27誤解されることこの上ないタイトルが凄く好き
0530デフォルトの名無しさん
2010/02/16(火) 02:12:56C#では関数の引数に配列を渡す際は何も考えずに配列を渡せば良かったです。
関数内では受け取った配列のインデクサを調べれば配列の個数が分かったからです。
C++では配列を渡してもインデクサ等が無いので配列の個数を関数内で調べる方法が無いわけですが
こういうときはみなさんどうされているんでしょうか?配列の他に配列の個数をint型で渡したりして対処
されているんですか?
0531デフォルトの名無しさん
2010/02/16(火) 02:18:12文字列リテラルってグローバル変数と同じ時間存在してるのか。
0532デフォルトの名無しさん
2010/02/16(火) 02:22:23Cではそうするしかなかったし、C++でも普通の配列使うならそうするしかないが、
C++のSTLコンテナ使ってもいいなら、メンバ関数size()で個数が分かる。
0533デフォルトの名無しさん
2010/02/16(火) 02:27:30コンパイル時にサイズが分かる普通の配列ならテンプレートで調べる小技があるよ
動的確保だとどこかにサイズを保存しないとダメだね
そしてそれを親切にやってくれるのが標準ライブラリ
0534デフォルトの名無しさん
2010/02/16(火) 02:29:57ターミネータを使うとか
0535デフォルトの名無しさん
2010/02/16(火) 02:30:50C++では動的サイズの配列の受け渡しにはSTLを使えということですね。
ところでSTLを使った動的配列にはintといった型だけでなく
構造体やクラスの配列を格納することも可能ですか?
0536デフォルトの名無しさん
2010/02/16(火) 02:30:540537デフォルトの名無しさん
2010/02/16(火) 02:43:23構造体やクラスなら、できた。
必要に応じてコピーコンストラクタを実装すること。
タイプミスじゃなく意図して「構造体やクラスの配列」って言ってるなら、
普通の配列はコピーコンストラクタがないのでコンテナに入れられない。コンテナをコンテナに入れることは可能。
0538デフォルトの名無しさん
2010/02/16(火) 02:57:27失礼しました
「構造体やクラスの配列」ではなく「構造体やクラス」でした
0539デフォルトの名無しさん
2010/02/16(火) 06:46:02ありがとうございます。
文字列リテラルと言う扱いになる為
グローバルな領域で確保されるから問題ないと言う事ですね。
この辺を重点的に調べればちゃんと人に説明出来そうですね。
>>528さん
そのどこの領域に格納されるのかが良く分からないので
人に説明する時にどう説明すればいいのか悩んでたんです。
0540デフォルトの名無しさん
2010/02/16(火) 12:49:240541デフォルトの名無しさん
2010/02/16(火) 14:59:20質問と関係無いツッコミ失礼。
スコープってのは名前の有効範囲。ソースコード上での静的なもの。
動作時の変数の有無は寿命とか言う。
0542デフォルトの名無しさん
2010/02/16(火) 23:20:52やっぱり、メンバ変数にはm_、staticにはs_と付けないとダメなのかな
でも、ちょっとm_とs_はうざい
0543デフォルトの名無しさん
2010/02/16(火) 23:25:37そもそもメンバ変数を見なければいけない実装がおかしい
と言いたい。
0544デフォルトの名無しさん
2010/02/16(火) 23:54:40>>525の_String2を呼び出すと、
全部"AAAAAABB"を確保するのか。
0545デフォルトの名無しさん
2010/02/17(水) 00:01:38文字列リテラルは
staticな無名の配列、くらいに考えて良いよ。
constかどうかはコンパイラ(オプション)依存。
0546デフォルトの名無しさん
2010/02/17(水) 00:27:19一箇所に確保してあるのもを100万回呼び出すだけ。
0547デフォルトの名無しさん
2010/02/17(水) 01:40:210548デフォルトの名無しさん
2010/02/17(水) 11:11:000549デフォルトの名無しさん
2010/02/17(水) 14:20:52Oh, good!
0550デフォルトの名無しさん
2010/02/18(木) 10:44:55あれの元ネタってThe art of computer programming?
0551デフォルトの名無しさん
2010/02/18(木) 21:21:10ソフトの一部にだけしか、使われていない気がするんだけど
0552デフォルトの名無しさん
2010/02/18(木) 21:22:160553デフォルトの名無しさん
2010/02/18(木) 21:27:13読みにくいし、使いづらくなるだけの気がするんだけど
0554デフォルトの名無しさん
2010/02/18(木) 21:37:45プロジェクト共通の名前空間で包むだけで
あとは衝突してから名前変えるか名前空間ネストするか考える
0555デフォルトの名無しさん
2010/02/18(木) 22:11:10俺は使っているよ。
0556デフォルトの名無しさん
2010/02/18(木) 22:13:40あれは主にライブラリのため
0557デフォルトの名無しさん
2010/02/19(金) 11:30:55何にしたらいいですか?
0558デフォルトの名無しさん
2010/02/19(金) 12:30:510559デフォルトの名無しさん
2010/02/19(金) 12:42:48countって動詞ですか?
predってなんですか?
普通の関数にしたいんですけど
countX(SET A)でもいいですか?
0560デフォルトの名無しさん
2010/02/19(金) 13:01:44predicate【名】述語
好きにすれば? 自分で決めれ
0561デフォルトの名無しさん
2010/02/19(金) 13:03:530562デフォルトの名無しさん
2010/02/19(金) 13:05:430563デフォルトの名無しさん
2010/02/19(金) 13:06:43struct S{
vector<int> v;
S(){for(int i=0;i<10;++i){v.push_back(i);}}
int count_if(bool (*pred)(int)){
int n=0;
for(int i=0;i<v.size();++i){if(pred(v[i])){++n;}}
return n;
}
};
//これがpred
bool after7(int n){return n>=7;}
bool iseven(int n){return (n%2==0);}
bool times3(int n){return (n%3==0);}
S s;//0-9を入れる
cout << s.count_if(after7) << endl; //7以降の数
cout << s.count_if(iseven) << endl; //偶数の数
cout << s.count_if(times3) << endl; //3の倍数の数
0564デフォルトの名無しさん
2010/02/19(金) 15:43:200565デフォルトの名無しさん
2010/02/19(金) 16:00:490566デフォルトの名無しさん
2010/02/19(金) 22:04:53ddd, eee, fff,・・・・・・・・
って書かれたcsvから
aaa,bbb
ddd,eee
ってcsvを作りたいんだけど
検索かけても長いソースコードのばっかり。
20行ぐらいでシンプルに作れないのかな
0567デフォルトの名無しさん
2010/02/19(金) 22:11:46> aaa, bbb, ccc,・・・・・・・・
> ddd, eee, fff,・・・・・・・・
> って書かれたcsvから
> aaa,bbb
> ddd,eee
> ってcsvを作りたいんだけど
それで法則性が分かると思うてか?
Excelに貼り付けて3列目以降を削除しろ。
0568デフォルトの名無しさん
2010/02/19(金) 22:16:370569デフォルトの名無しさん
2010/02/19(金) 22:42:17ツンデレw
0570デフォルトの名無しさん
2010/02/19(金) 23:48:30実装を継承するためにやっている事が多い気がします
これって気のせい?
0571デフォルトの名無しさん
2010/02/19(金) 23:52:460572デフォルトの名無しさん
2010/02/20(土) 00:27:43C++では、継承以外にもポリモーフィズムを実現する手段が発達しているから、
相対的に、継承の中では実装の継承が多いように見えるのかもしれない。
あるいは、お前が出会ったコードor人間に
ポリモーフィズムが意識されるようになる前の古臭いやつの割合が多かったか。
0573デフォルトの名無しさん
2010/02/20(土) 12:53:560574デフォルトの名無しさん
2010/02/20(土) 12:59:230575デフォルトの名無しさん
2010/02/20(土) 13:04:180576デフォルトの名無しさん
2010/02/20(土) 15:37:140577デフォルトの名無しさん
2010/02/20(土) 17:38:13参照の寿命がその関数内のみだったら別に問題は起こらないですよね?
0578デフォルトの名無しさん
2010/02/20(土) 17:40:18無名一時オブジェクトはconst参照で渡せられるよ。
0579デフォルトの名無しさん
2010/02/20(土) 21:51:090580デフォルトの名無しさん
2010/02/20(土) 22:09:530581デフォルトの名無しさん
2010/02/20(土) 23:24:19"3" + 1 // '31'
"3" - 1 // 2
"222" - -"111" // "333" (???)
0582デフォルトの名無しさん
2010/02/20(土) 23:25:210583デフォルトの名無しさん
2010/02/21(日) 02:28:58ストリーム出力で数値も文字列も<<で出力できる(多重定義)とか
vectorがコピー可の型ならなんでも要素に取れる(テンプレート)とか、
複数の型のオブジェクトに同じ操作が適用できることはなんでも多態、ポリモーフィズムと言う。
>>577
それ認めると、
void f(double& x) {x = 42;}
で、
int i = 0;
f(i); // double型の一時オブジェクトを作ってそれを渡す
ここで、fから戻っても元のiは変わらず0のままという混乱必須の事態になるから
エラーにする決まりになった。
const参照ならその心配は要らないので>>578の言うとおりOK。
0584デフォルトの名無しさん
2010/02/21(日) 09:11:560585デフォルトの名無しさん
2010/02/21(日) 14:57:30なるほど。それでエラーになるのか。
0586デフォルトの名無しさん
2010/02/21(日) 16:07:59なるほど
そのケースだと確かに不都合ですね
でも↓のようにテンポラリを参照渡ししつつ非const操作をしたいということもあると思うんですが・・・
ttp://codepad.org/eLp60FpV
こういうケースにはなにか回避手段があるんでしょうか?
0587デフォルトの名無しさん
2010/02/21(日) 18:54:16int main(void)
{
std::ifstream a("Test.cpp");
cat(a);
return 0;
}
0588デフォルトの名無しさん
2010/02/22(月) 00:46:54この例では、cat(std::ifstream("Test.cpp").ignore(0))としたら一応できる。
ようするに*thisを参照型で返し、余計な作用がなさそうなメンバ関数を呼べばいい。
ostreamならflush()など。
根本的な解決としては、次の規格改定で今までの参照に加えて、こういう破壊操作前提のときに使える
一時オブジェクト含むrvalueを受け取れるrvalue参照というものが導入される。
現状では>>587の言うとおり変数を作ってしまうのが一番楽。
0589デフォルトの名無しさん
2010/02/22(月) 19:46:020590デフォルトの名無しさん
2010/02/23(火) 12:46:15SevenZip()によるコマンドでの解凍ではなく、
SevenZipOpenArchive()でアーカイブのハンドルを開いて、
解凍進捗をコールバックで取得しながら解凍する方法を探しているのですが、
サンプルソースが見つからず苦戦しています。
今のところ以下のように書いています。
unrar.dllでの解凍を以前したことがあるので、同じようにコールバックで自分でデータを書き込むか、
書き込みはAPI内で行っても、進捗情報はコールバックできるかと思っているのですが、
根本的に間違っているのでしょうか?
CString strPath = _T("C:\\XXXX");
//オープン
char* pPath = W2A(strPath);
HARC hFile = SevenZipOpenArchive(NULL,pPath,0);
if( !hFile ) {
_tprintf(_T("Error !! : Open \n"));
}
INDIVIDUALINFO stInfo;
if( SevenZipFindFirst(hFile,"*",&stInfo) == 0 ) {
do {
//何を記述するの?
}while( SevenZipFindNext(hFile,&stInfo) == 0 );
}
//クローズ
SevenZipCloseArchive( hFile );
0591デフォルトの名無しさん
2010/02/24(水) 11:57:08コンストラクタ以外のイニシャライズメソッドを呼んで初期化させている例を見たことがあります
すべてをコンストラクタ内で書かないメリットには何があるのでしょうか?
0592デフォルトの名無しさん
2010/02/24(水) 12:06:38コンポジションしてるような状況ではよくある
他にはシングルトンみたいにインスタンスの数に制限をしたい場合とか
0593デフォルトの名無しさん
2010/02/24(水) 17:54:520594デフォルトの名無しさん
2010/02/24(水) 23:02:00例外の話じゃね?
init()というメンバ関数を用意してだな…(ry
0595デフォルトの名無しさん
2010/02/25(木) 04:25:50そのクラスにresetメソッドがあるなら、コンストラクタとresetで処理内容がかぶる箇所を、privateな初期化メソッド作るかも。
0596デフォルトの名無しさん
2010/02/25(木) 07:44:27・初期化処理に失敗する可能性がある場合、戻り値で判断したいから
0597デフォルトの名無しさん
2010/02/25(木) 07:51:420598デフォルトの名無しさん
2010/02/25(木) 10:15:13割り当てられたまま残る可能性がある) ことが判ってれば
別にいいですが。
0599デフォルトの名無しさん
2010/02/25(木) 11:38:02世の中には「C++で例外を使わない」というコーディング規約もある。
0600デフォルトの名無しさん
2010/02/25(木) 12:56:200601デフォルトの名無しさん
2010/02/25(木) 19:53:17メンバのデストラクタは適切に呼ばれるよ。
呼ばれないのはデストラクタの{}内。
>>599
なおさらinitはいらないね。
0602デフォルトの名無しさん
2010/02/25(木) 19:59:44> >>599
> なおさらinitはいらないね。
頭おかしいお前はレスする資格がない。
0603デフォルトの名無しさん
2010/02/25(木) 20:15:03ifの代わりにtry-catchでも別によくねーか?
0604デフォルトの名無しさん
2010/02/25(木) 20:23:07世の中には「C++で例外を使わない」
って>>599が言ってるけど、
コンストラクタで例外を無げない
というコーディング規約なら知って居るぞ。
その話をみんなしたいんじゃないのかい?
0605デフォルトの名無しさん
2010/02/25(木) 21:36:310606デフォルトの名無しさん
2010/02/25(木) 21:50:03ビット演算でおk?
0607デフォルトの名無しさん
2010/02/25(木) 22:14:110608デフォルトの名無しさん
2010/02/25(木) 22:21:170609デフォルトの名無しさん
2010/02/25(木) 22:45:14!!!
今日一番感動しました
今まで全く気付かなかった、ありがとうございます!
何か差し上げたいぐらい
んーむ最近感動したのはx mod yをx-y*(x/y)で定義できること(x/yの箇所はfloor(x/y)です)
これだと負の剰余もちゃんと定義できます
C/C++だと負のmodは実装依存なのがたまにきずですが
0610デフォルトの名無しさん
2010/02/25(木) 22:51:35水を差すようで申し訳ないのだが、
それは高校数学で習ったろ。
多項式の商と剰余を定義する場面で、
数�Vで出て来たはず。
0611デフォルトの名無しさん
2010/02/25(木) 23:34:05>>609じゃないけど、高校のときはこんなのなんの役に立つんだばかばかばーかふんだっ!って思ってましたごめんなさい
0612デフォルトの名無しさん
2010/02/25(木) 23:51:440613デフォルトの名無しさん
2010/02/26(金) 08:10:080614デフォルトの名無しさん
2010/02/26(金) 11:13:23>メンバのデストラクタ
の話などしていません。勝手に補完しないように。
0615デフォルトの名無しさん
2010/02/27(土) 00:01:49mod の定義は数学の教科書でもまちまち、というかどっちでも決めたいほうに決めろという態度のような。
0616デフォルトの名無しさん
2010/02/27(土) 01:45:54m ÷ n = q … r
と表記して、
m = qn + r かつ 0 ≦ r < n
とするのが普通の定義だろ
ていうか、これ以外の定義している数学の本なんて見たことない
0617デフォルトの名無しさん
2010/02/27(土) 02:06:000618デフォルトの名無しさん
2010/02/27(土) 02:10:400619デフォルトの名無しさん
2010/02/27(土) 02:52:18>>617はここでも読んで勉強すればいいと思う
ttp://ja.wikipedia.org/wiki/%E5%90%88%E5%90%8C%E5%BC%8F
C言語の場合、マイナスの剰余を許したほうが処理に一貫性があるから、そっちで実装している場合が多いみたいだけど
0620デフォルトの名無しさん
2010/02/27(土) 03:01:57除法は乗法逆元を掛けることで定義されるから。
おそらく、>>617はp 進数体とかの上での除法のこと言ってるんだろうけど。
整数の除法と言えば、>>616の定義しかない。
ただ、>>609で問題なのは負数に対するmoduloの定義。例えば、
-12 mod 5
が-2なのか3なのかは少し問題になるかもしれない。
普通は3なんだけど、順序の入ってない体での除法を考えた場合、
>>616の 0 ≦ r < nの部分の定義が使えないから、
a mod b ⇔ a - b * xのうち最も0と"近い"もの
という定義も考えられる。距離または絶対値が入ってることが前提になるが。
この定義だと、-12 mod 5 = -2となる。
0621デフォルトの名無しさん
2010/02/27(土) 03:05:48>>620で言ったのとは別に、処理の都合で負数の剰余を許すこともあるみたいだね。
0622デフォルトの名無しさん
2010/02/27(土) 03:06:490623デフォルトの名無しさん
2010/02/27(土) 03:11:130624デフォルトの名無しさん
2010/02/27(土) 03:16:29>>609で問題になってるcongruence function(あえて和訳すれば「合同"関数"」)とは別物だよ。
Mod -- from Wolfram MathWorld
http://mathworld.wolfram.com/Mod.html
0625デフォルトの名無しさん
2010/02/27(土) 08:31:27当方、コマンドプロンプト上で動かすものしか作れないのですが、それだけでは子供は楽しめないと思います
自作マリオを作りたいそうです
0626デフォルトの名無しさん
2010/02/27(土) 08:42:07言語はどうあれ結果が視覚的に確認しやすいほうが飽き無いだろうな。
0627デフォルトの名無しさん
2010/02/27(土) 09:08:530628デフォルトの名無しさん
2010/02/27(土) 09:10:410629デフォルトの名無しさん
2010/02/27(土) 09:41:310630デフォルトの名無しさん
2010/02/27(土) 11:48:390631デフォルトの名無しさん
2010/02/27(土) 17:29:29別物じゃないですよ。>>619にあるページの性質はすべて成り立ちます
しかもこの式はx,yは実数でも成り立つので
感動したというわけです
詳しくはtaocpを見てね
0632デフォルトの名無しさん
2010/02/27(土) 19:04:51勘違いするな。合同式と合同関数は別物だ。
a mod bと、a ≡ b (mod n)。書き方からして違う。
あと、その定義式はごく一般的なものだろ。
これ以外の定義があるのか?
0633デフォルトの名無しさん
2010/02/28(日) 04:48:51PS3や箱○といったゲーム開発用の場で使われている言語も
オブジェクト指向言語だったりするの?
それとも古き良きC言語のままだったりする?
0634デフォルトの名無しさん
2010/02/28(日) 06:24:35C以外の最初のコンパイラはアセンブラで記述されたけど、
CコンパイラだけはCで書かれた。
0635デフォルトの名無しさん
2010/02/28(日) 11:09:23Cが古いは良いとして良かったかはともかく、PS3の説明会でC++も使えますよといってたぞ。
360はXNA(C#)とかも使えるみたいだぞ。
0636デフォルトの名無しさん
2010/02/28(日) 12:48:10最初にCでかかれたソースは何で書かれたCコンパイラでコンパイルしたの?
0637デフォルトの名無しさん
2010/02/28(日) 13:50:48> PS3の説明会でC++も使えますよといってたぞ。
> 360はXNA(C#)とかも使えるみたいだぞ。
C#でスピードなんて出せるの?
0638デフォルトの名無しさん
2010/02/28(日) 13:57:040639デフォルトの名無しさん
2010/02/28(日) 15:18:200640デフォルトの名無しさん
2010/02/28(日) 17:13:49------------------------------------
template <class T>
class MyTemplateArray {
public:
T array[10];
T &GetValue(int item);
};
template <class T>
T &MyTemplateArray<T>::GetValue(int item) {
if (item > 9 || item < 0) {
return array[0];
}
return array[item];
}
--------------------------------
このGetValueの前の&はどういう意味なんでしょう?アドレスを返すって意味?
&をとっても問題なくコンパイルできて動作もするのですが。何のための&なんでしょうか?
よろしくお願い致します。
0641デフォルトの名無しさん
2010/02/28(日) 17:15:130642デフォルトの名無しさん
2010/02/28(日) 17:40:51これで&がなかったら、テンポラリのオブジェクトが生成されるのかな?
0643デフォルトの名無しさん
2010/02/28(日) 17:43:24インデックスが範囲外だったら0として扱うって、なんかひどい仕様。
0644デフォルトの名無しさん
2010/02/28(日) 18:11:45そんな今すぐ本は投げ捨てろ。
しかし、範囲外だったらvectorみたいに例外を投げるとかassertするとかすれば良いのに。
0646デフォルトの名無しさん
2010/02/28(日) 19:51:560647デフォルトの名無しさん
2010/02/28(日) 20:00:50protected継承はスコットメイヤーズ様すら
使い道がないらしいから必要ない。
0648デフォルトの名無しさん
2010/02/28(日) 20:51:50参照で返す場合は
myArray.GetValue(0) = 100;
など参照先の書き換えが可能。
あるいはTが極端に大きなクラスの場合、
参照で返せばテンポラリ生成のコストがかからない。
0649デフォルトの名無しさん
2010/02/28(日) 22:04:15ただし返す変数の寿命に注意。auto な変数の参照を返してはいけない。
0651デフォルトの名無しさん
2010/02/28(日) 22:20:170652デフォルトの名無しさん
2010/02/28(日) 22:30:16この例の場合はそもそもpublicなデータメンバだから参照で返しても問題ないのかもしれないけど、
そもそもpublicなところが、いかがなものかという気はする。
0653デフォルトの名無しさん
2010/02/28(日) 22:42:35コンテナの要素アクセスとかは仕方ないとして
普段からProxyつかうように心がけた方がいいのかな
0654デフォルトの名無しさん
2010/02/28(日) 22:44:510655デフォルトの名無しさん
2010/02/28(日) 22:49:160656デフォルトの名無しさん
2010/02/28(日) 22:50:33折角アクセス制限を設けてカプセル化しているのに、
敢えてそれを崩すという意味で悪手なのかもしれないけど、
それを踏まえた上でどうしてもそうしなければならないなら、
仕方が無いのかもしれないですね。
0657デフォルトの名無しさん
2010/02/28(日) 22:51:070658デフォルトの名無しさん
2010/02/28(日) 22:52:34配列っぽくしたいときはしょうがないのか。
0659デフォルトの名無しさん
2010/02/28(日) 22:59:37> 配列っぽくしたいときはしょうがないのか。
うん、そういうときはしょうがないからいいよって書いてあった。
>>653
元のオブジェクトが無効になってたとき、参照返しだとやばいことになる。
例えば
コピーコストを下げるために
const MyClass& temp = obj.m_func();
としていて、いざtempを使おうとした時に
実はobjが無効でしたとかなりうる。
0660デフォルトの名無しさん
2010/03/01(月) 01:13:58内容が特殊なので、スレ違いの場合は適切なスレを教えて頂けるとたすかります。
※以下の数式の「^」はべき乗を表します。
IEEE-754によると浮動小数点の正の最小値は
符号部(s)=0、指数部(e)=00000000[8桁]、仮数部(m)=00000000000000000000001[23桁]
になります。
※ビット列:00000000 00000000 00000000 00000001
指数部が0の時は、仮数は[1.m]ではなく[0.m]なので
仮数は2^(-23)になります。
また、指数は[-127]ではなく仮数を1.mから0.mで表すことに
したため[-126]になります。
なので、この時の値は
(-1)^(0) * (2^(-23)) * 2^(-126)
=2^(-149) ---【A】
になると思います。
しかし、IEEE-754の仕様を見ると、これとは違い
( ( 1 + (2^(-52)) ) * (2^(-150)) ) * (2^(-149)) ---【B】
と書かれています。
どうして【A】ではなく【B】になるのでしょうか?
「( 1 + (2^(-52)) ) * (2^(-150))」がどこから出てきたのか
サッパリわかりません。
(参考)IEEE-754仕様
tp://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html
[32-bit Single Precision]の[Positive Denormalized]です。
0661デフォルトの名無しさん
2010/03/01(月) 11:22:30精度を下げて仮数部も指数として使える
適当に検索した
ttp://journal.mycom.co.jp/column/architecture/094/index.html
0662デフォルトの名無しさん
2010/03/01(月) 11:58:49VC2008 でプロジェクト、Win32コンソールアプリ→DLL+空の状態にチェック
でビルドしてDLLを作ろうとしています。RealeseでビルドしてもフォルダにDLLは作成されましたが、
libファイルが作成されません。設定か記述が間違っているのでしょうか。
a.cpp
extern "C"
int add(int a){
int b;
b=a+10;
return b;
}
a.def
EXPORTS
_add
0663デフォルトの名無しさん
2010/03/02(火) 21:26:440664デフォルトの名無しさん
2010/03/02(火) 21:37:030665デフォルトの名無しさん
2010/03/03(水) 00:44:29情報ありがとう。
一応、指数部が0と255の時はデノーマル数。
1〜254の時はノーマル数というのは、何とか理解できます。
tp://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html
の最下部「 They are represented by 〜」から最後までの文章で
それらしいことを書いているような気がするんだけど、訳せない・・・
符号 | 指数部 | 仮数部
0 00000000 00000000000000000000001
ビット列が↑のときの
(-1)^(0) * 2 ^ (-126) * 2 ^ (-23) = 2 ^ (-149)
より半分の値を表せるようなことが書いてあるみたいなんだけど・・・
0666デフォルトの名無しさん
2010/03/03(水) 08:58:04これを使うとcppだけでdllとlibファイルが作れるんですね、ありがとうございます。
>>664
プロジェクトのプロバディ リンカ→入力→モジュール定義ファイルにab.defを指定してビルドしました
1>ab.def : error LNK2001: 外部シンボル "_add" は未解決です。
1>D:\マイドキュメント\Visual Studio 2008\Projects\ab\Release\ab.lib : fatal error LNK1120: 外部参照 1 が未解決です。
addが未解決らしく、ab.libを作ってくれません。>>662の記述以外にもプロバディをいじる必要があるのでしょうか?
0667デフォルトの名無しさん
2010/03/03(水) 09:12:05a.def
EXPORTS
add
アンダーバーが必要なら
a.def
EXPORTS
_add=add
0668デフォルトの名無しさん
2010/03/03(水) 09:27:08ヘッダでextern宣言するグローバル変数に付けるべきものですか?
それとも、ソース内で関数の外に書くstatic変数に付けるべきものですか?
0669デフォルトの名無しさん
2010/03/03(水) 09:41:33できました!ありがとうございます。
しかし、この調子だと先が思いやられる…
0670デフォルトの名無しさん
2010/03/03(水) 10:15:23属性値をテンプレート引数として渡して戻り値型の値を返すテンプレート
関数(又はクラス)を記述したい。
例
enum { a1, a2, a3}のそれぞれに対して
a1 => int
a2 => double
a3 => int *
と定義されているとします。
これを関数テンプレートで定義し、
int v1 = get<a1>(arg);
double v2 = get<a2>(arg);
int *a3 = get<a3>(arg);
のように、テンプレート引数に属性値だけ渡す形式で呼び出したいのですが、
どのように書けば良いでしょうか?
0671デフォルトの名無しさん
2010/03/03(水) 10:20:400672670
2010/03/03(水) 13:17:06typedef int ValueType;
};
template<> struct<a2> typemap{
typedef double ValueType;
};
template<> struct<a3> typemap{
typedef int * ValueType;
};
と特殊化定義して
typemap<a1>::ValueType
で参照する事にしました。
0673デフォルトの名無しさん
2010/03/03(水) 13:27:17#include"a.h"
extern "C"
int add(int a);
a.h
extern "C"
__declspec(dllexport) int add(int a){
int b;
b=a+10;
return b;
}
Vc++ 2008 のRealeaseでビルド、DllとLibファイル作成
-----------------------------------------
Tyty.cpp
#include<stdio.h>
int __stdcall add(int a);
int main(){
int c;
c=add(7);
printf("%d\n",c);
}
上のDllとLibファイルをtyty.cppと同フォルダにコピー
プロジェクトのプロバディ リンカ→全般→追加のリンクライブラリ ディレクトリ→Libファイルを指定
Realeaseでビルド
1>tyty.obj : error LNK2001: 外部シンボル ""int __cdecl add(int)" (?add@@YAHH@Z)" は未解決です。
1>D:\マイドキュメント\Visual Studio 2008\Projects\tyty\Release\tyty.exe : fatal error LNK1120: 外部参照 1 が未解決です。
---------------------------------------------------
exturn "C" してもリンクエラーが出ます。関数の宣言が間違えてるんでしょうか
0674デフォルトの名無しさん
2010/03/03(水) 13:49:420675デフォルトの名無しさん
2010/03/03(水) 13:51:350676デフォルトの名無しさん
2010/03/03(水) 14:01:34#include<stdio.h>
extern "C"
int add(int a);
int main(){
int c;
c=add(7);
printf("%d\n",c);
}
ビルドすると
1>tyty.obj : error LNK2001: 外部シンボル "_add" は未解決です。
1>D:\マイドキュメント\Visual Studio 2008\Projects\tyty\Release\tyty.exe : fatal error LNK1120: 外部参照 1 が未解決です。
3行目を int _addに変更するとエラーが 「〜”_ _ add”は未解決です」になりました。
0677デフォルトの名無しさん
2010/03/03(水) 14:08:050678デフォルトの名無しさん
2010/03/03(水) 14:15:40間違えましたtyty.cppの3行目を _addにすると「〜”add”は未解決です」になりました
0679デフォルトの名無しさん
2010/03/03(水) 14:16:05追加のライブラリディレクトリには、libファイルの場所を入れる
で、入力の追加の依存ファイルのとこにlibのファイル名を入れる
0680デフォルトの名無しさん
2010/03/03(水) 14:25:01ビット処理で簡単にこれを実現する方法ってありますか
N=7ならn=3
N=25ならn=5
N=60000ならn=16です
0681デフォルトの名無しさん
2010/03/03(水) 14:28:01ありがとうございます、できました。
ディレクトリってフォルダまででしたっけ…設定を終えたつもりでしたが間違ってました orz
0682デフォルトの名無しさん
2010/03/03(水) 15:21:02dllを利用する方は__declspec(dllimport)にしないとあかんよ
---dll.hpp---
// __stdcallは__cdeclなどに変えてもいいけど、同じ関数ではきちんと統一しないといけない
// なにも書かないとVC++なら__cdeclになる
extern "C" __declspec(dllexport) int __stdcall func(int x);
---dll.cpp---
#include "dll.hpp"
// 実装
int __stdcall func(int x) { /* ... */ }
***以上をDLLとしてビルド***
---use_dll.hpp---
// さっきビルドした時に作られたlibファイルをインポート
// これを書かない場合はプロパティでリンカの設定が必要
#pragma comment(lib, "dll.lib")
extern "C" __declspec(dllimport) int __stdcall func(int x);
---main.cpp---
#include "use_dll.hpp"
int main(void) { func(100); return 0; }
0683デフォルトの名無しさん
2010/03/03(水) 15:34:23for(n=0; N; n++, N>>=1);
0684デフォルトの名無しさん
2010/03/03(水) 15:38:37_BitScanReverse
0685デフォルトの名無しさん
2010/03/03(水) 15:49:03そんなことはない
0686デフォルトの名無しさん
2010/03/03(水) 16:13:19この場合の A::B を前方定義する方法はありますか?
0687デフォルトの名無しさん
2010/03/03(水) 17:27:34ありがとうございます
x86にはbsr命令ってそのまんまなのがあるんですね
キーワード検索したらHackersDelightのページにたどり着き
2章が公開されてて感動しました
0688デフォルトの名無しさん
2010/03/03(水) 18:23:50変数名のことだと思うのですが、命名法にきまりはとくにありません。
が、global という意味でなら関数外static変数よりは、複数のモジュール間でスコープが有効な変数に g なりなんなりをつけるような
考えかたはあると思います。
わたしはモジュール総体でスコープが有効な変数はほとんどつかいませんが、モジュール内でスコープが有効な変数
(関数外static な変数)のサフィックスにSをつけています。
0689デフォルトの名無しさん
2010/03/03(水) 20:16:36アプリケーションハンガリアン表記という。
0690デフォルトの名無しさん
2010/03/04(木) 10:23:13のintの一時変数は ; まで存在しますか?
0691デフォルトの名無しさん
2010/03/04(木) 11:13:220692デフォルトの名無しさん
2010/03/04(木) 12:44:06例えば
struct hoge
{
hoge &operator = (hoge other) { swap(other); return *this; } // 最適化をしやすくするために引数からあえて参照を外す
void swap(hoge &other) throw() { /*略*/ }
//以下略
};
この場合operator = はthrow()を指定してもいいでしょうか?
0693デフォルトの名無しさん
2010/03/04(木) 12:45:30書けるそうですが、どういう事なのでしょうか?
typedef vector<string> s;
typedef list<string> s;
という書き方では後者のsが再定義されるのでエラーになりますし
0694デフォルトの名無しさん
2010/03/04(木) 13:42:04yは自然数でxは整数です。
戻り値は -1<x<yです。
int mod(int x,int y){
if(x<0){
return ((x%y)+x)%y
}else{
return x%y;
}
}
0695デフォルトの名無しさん
2010/03/04(木) 20:22:17たとえばx%2^nだったらx&2^n-1
0696デフォルトの名無しさん
2010/03/04(木) 20:46:36片方好きなほうをコメントアウトする。
どっちを使ったとしてもうまくいくよと言いたいのだと思う。
0697デフォルトの名無しさん
2010/03/04(木) 21:19:470698デフォルトの名無しさん
2010/03/04(木) 22:34:41各年ごとの預金額を表示するCプログラムです。
以下の2つのプログラムの実行結果が異なるのですが、理由がわかりません。
教えてください。
0699デフォルトの名無しさん
2010/03/04(木) 22:35:59#include <stdio.h>
int main()
{
int year = 0;
int balance = 1000000;
while(year <= 10) {
printf("%2dyear: %d\n", year, balance);
balance = balance * (1 + 0.0015);
year++;
}
}
■プログラム2
#include <stdio.h>
int main()
{
int year = 0;
double balance = 1000000;
int balance_int;
while(year <= 10) {
balance_int = (int)balance;
printf("%2dyear: %d\n", year, balance_int);
balance = balance * (1 + 0.0015);
year++;
}
}
0700デフォルトの名無しさん
2010/03/04(木) 22:39:020701デフォルトの名無しさん
2010/03/04(木) 22:41:110702デフォルトの名無しさん
2010/03/05(金) 00:05:28printf("%2dyear: %f\n", year, (double)balance);
printf("%2dyear: %f\n", year, balance);
にしてみれば一目瞭然では
0703デフォルトの名無しさん
2010/03/05(金) 00:14:10レスありがとうございます。
でも、この2つのプログラム、同じことやってるように思えるのですが…。
[プログラム1]
◆balance = balance * (1 + 0.0015);
balance <- balance * 1.0015
int <- int * double
int <- double * double <暗黙の型変換>
int <-(小数点以下切り捨て)- double <キャスト>
[プログラム2]
◆balance = balance * (1 + 0.0015);
balance <- balance * 1.0015
double <- double * double
◆balance_int = (int)balance;
int <-(小数点以下切り捨て)- double <キャスト>
0704デフォルトの名無しさん
2010/03/05(金) 00:29:040705デフォルトの名無しさん
2010/03/05(金) 00:35:02理解しました。
プログラム1のほうは預金高をint型で保持してる。
一方、プログラム2のほうはdouble型で保持していて、出力の際に
int型の一時変数に小数点以下を切り捨てたものを格納して、それを表示してるだけ
だから、小数点以下の数字が徐々に大きくなってきて、繰り上がった時に両プログラムの
値が一致しなくなるわけですね。
すんごい間抜けな質問してごめんなさい…。
答えてくれてありがとうございました。
0706デフォルトの名無しさん
2010/03/05(金) 09:58:46遅れましたが、ありがとうございます
vectorとlistの扱い方を学ぶ章だったので
何か上手いやり方があるのかと思い込んでました
また不明な点があれば、ご教授願います
>>697
先のvector<string>のような短いものであれば
typedefによる汎用化はかえって混乱を招く、ということでしょうか?
0707デフォルトの名無しさん
2010/03/05(金) 22:40:37単純にtypedefを書き換えればすむわけじゃないケースが多い
0708デフォルトの名無しさん
2010/03/06(土) 00:30:10ofs.open(FILENAME);
for(i=0;i<N;i++) ofs << 何か変数 << endl;
ofs.close();
としてファイル書き込みしたいのですが、空のcsvファイルができるだけで
データが出力されません
何か変数のところに文字列リテラルを入れると出力されるのですが、
整数を直接打ち込んだ場合は駄目です
何故でしょうか?
0709デフォルトの名無しさん
2010/03/06(土) 02:22:10"何か変数" が 空
それ以外に思い浮かばないので
無意味な省略せずに、ソース全張り&環境を明記するといいかもな
0710デフォルトの名無しさん
2010/03/06(土) 07:38:11sprintf(FILENAME,"/users/maroyuki/C.csv");
std::ofstream ofs;
ofs.open( FILENAME );
ofs<<var<<std::endl;
std::cout<<var<<std::endl;
ofs.close();
ではディスプレイ出力に成功しているので変数が空というのは無いはずです。
ソース全張りは申し訳ないですができません。
環境はMacOSX10.6+Xcode3.2.1+GCC4.2です。
コーディングミスでないようなので少しMac周辺で調べてみると、
http://forums.macrumors.com/showthread.php?t=796818
こんなのが見つかりましたので調べてみます。
ありがとうございました。
0711デフォルトの名無しさん
2010/03/06(土) 10:49:03ありがとうございます
今はコンテナ共通の操作(eraseとか)しか分かりませんが
これから先そういったケースに遭遇すると思いますので留意します
0712デフォルトの名無しさん
2010/03/06(土) 11:24:05ある処理に対して最適なコンテナはどれかなんて大抵の場合は最初からわかってるから
コンテナを汎用化しても使うのは結局ひとつに絞られるから意味ない
0713デフォルトの名無しさん
2010/03/06(土) 11:39:390714デフォルトの名無しさん
2010/03/06(土) 13:13:57ありがとうございます
仰る通りです
学生の成績を管理するプログラムで
不合格の学生のデータをfailコンテナに振り分け、
もとのコンテナから削除していく場合、
データの数が多ければ多いほどvectorよりlistの方が処理が速いようですし
0715デフォルトの名無しさん
2010/03/06(土) 13:16:51これもイテレータのカテゴリによって可能な操作が異なるけど
0716sage
2010/03/06(土) 13:52:32「$変数」を解釈するようなC++のライブラリってない?
0717デフォルトの名無しさん
2010/03/06(土) 13:54:560718デフォルトの名無しさん
2010/03/06(土) 13:59:36学生にはユニークな学生番号があるだろうからmapのほうが良くないか?
0719デフォルトの名無しさん
2010/03/06(土) 14:03:440720デフォルトの名無しさん
2010/03/06(土) 14:59:20Boost.MultiIndexとか。
0721デフォルトの名無しさん
2010/03/06(土) 15:06:040722デフォルトの名無しさん
2010/03/06(土) 17:26:56そこはあえて処理速度を求めて vector<int>.at(学籍番号)でw
0723デフォルトの名無しさん
2010/03/06(土) 17:29:55ユーザー定義の型でabsを定義すると、
stdのabsが使えなくなくなります。
int等はstdのやつでそれ以外は自分で定義したのをつかいたいときは
どうしますか?
0724デフォルトの名無しさん
2010/03/06(土) 17:40:080725デフォルトの名無しさん
2010/03/06(土) 17:51:34ない。
多くの場合、実行時には変数名などといった情報は残っていないので、現状では実現できない。
0726デフォルトの名無しさん
2010/03/06(土) 18:25:17自己解決したのか?
0727デフォルトの名無しさん
2010/03/06(土) 18:57:45struct T{int time;bool f(){--time;return time<=0;}};
vector<T> v;
vのデータについてf()を1回呼び出して真のものはvから削除、としたいんですが
イテレータが無効化?されてしまうのでうまくいきません
こういう場合どう書けばよいんでしょうか
0728デフォルトの名無しさん
2010/03/06(土) 19:03:050729デフォルトの名無しさん
2010/03/06(土) 19:26:500730デフォルトの名無しさん
2010/03/06(土) 20:05:39名前空間を使う
namespace oresama_sugee_lib
{
ore_vector abs(const ore_vector& a);
}
0731デフォルトの名無しさん
2010/03/06(土) 20:31:27>>715
iteratorはインデックスの代わりになる、という程度の知識しかありません
>イテレータのカテゴリによって可能な操作が異なる
今はどういう事なのか分かりませんが、頭に入れておきます
>>718,720
すみません
まだそれらの知識はありません
mapはもう少しで出てくるみたいです
Boost.MultiIndexというのは、
この本では出て来ないようですので調べます
>>719
そうです
>>721
すみません、どういう事なのかよく分かりません
長文、失礼しました
0732デフォルトの名無しさん
2010/03/07(日) 12:38:20名前空間をつかっても
intのときとore_vectorを引数によって自動で選んでくれません。
教えてください。
0733デフォルトの名無しさん
2010/03/07(日) 12:49:400734デフォルトの名無しさん
2010/03/07(日) 13:18:46アラインメントについて実験する以下のようなコードを見つけたですが、
文字列に使われている \x で始まる文字の意味が分かりません。これはどんな文字なのでしょうか?
main ( void )
{
char *str = "\x01\x23\x45\x67\x89\xab\xcd\xef";
unsigned *u = (unsigned *)(str + 1);
printf ( "%08x\n", *u );
}
0735デフォルトの名無しさん
2010/03/07(日) 13:21:100736デフォルトの名無しさん
2010/03/07(日) 13:29:000737デフォルトの名無しさん
2010/03/07(日) 13:30:48意味が分かりません。
0738デフォルトの名無しさん
2010/03/07(日) 13:39:53パラメタの型による多相ならテンプレートとその特殊化使えばいいだけじゃね?
#include <cstdio>
namespace ore {
template<typename T>
T abs(T x) { std::puts("!=<int>"); return x; }
template<>
int abs<int>(int x) { std::puts("<int>"); return x; }
}
int main() {
ore::abs("moge");
ore::abs(1);
ore::abs<int>('a');
}
0739デフォルトの名無しさん
2010/03/07(日) 13:45:33すみませんが、何がやりたいのか分かりませんでした。
関数を呼ぶのに<int>をつけなくちゃいけないのなら
別の名前にしてもおなじですよね。
0740デフォルトの名無しさん
2010/03/07(日) 13:51:431こ目はintじゃない型を渡すから !=<int>って表示される方が呼ばれる
2こ目は整数(int)を渡すから<int>って表示される方が呼ばれる
3つ目はおまけでcharを渡してるけど明示的に<int>って指定することで<int>って表示される方も呼べるよってこと
そゆことじゃないの?
0741デフォルトの名無しさん
2010/03/07(日) 13:53:460742デフォルトの名無しさん
2010/03/07(日) 13:55:580743デフォルトの名無しさん
2010/03/07(日) 14:00:21そうゆうことじゃないんですよ。
0744デフォルトの名無しさん
2010/03/07(日) 14:05:000745デフォルトの名無しさん
2010/03/07(日) 14:05:420746デフォルトの名無しさん
2010/03/07(日) 14:08:14std::swapにオーバーロード解決して欲しいとかいう類のアレか
0747726 ◆RpGtirBRdE
2010/03/07(日) 14:11:26>>723
> ユーザー定義の型でabsを定義すると、
> stdのabsが使えなくなくなります。
使えなくなるってなんだ?どういうこと?
エスパーすると、
ユーザー定義の型をMyClassとしよう。
//�@ typedef MyClass T;
//�A typedef int T;
のどっちかがコメントアウト解除されている時、
T x(適当な初期化値);
std::cout << abs(x);
みたいなコードで、�@が有効なときにはユーザー定義のabsが、
�Aが有効なときにはstd::absが呼ばれるようにしたいと、そういうことなの?
0748デフォルトの名無しさん
2010/03/07(日) 14:14:51return abs(a);
}
Tがint等のときはstd::absが呼ばれて
Tがint以外のときはユーザー定義のabsが呼ばれるように
やりたいだけです。
0749726 ◆RpGtirBRdE
2010/03/07(日) 14:17:52そのコードを最初から書いてくれればこんなにみんな悩まなかったのに。
template<T> T function(T a){
using std::abs;
return abs(a);
}
が正解。
0750デフォルトの名無しさん
2010/03/07(日) 14:19:390751デフォルトの名無しさん
2010/03/07(日) 14:20:29あと<typename T>でした。
0752デフォルトの名無しさん
2010/03/07(日) 14:22:31?
0753726 ◆RpGtirBRdE
2010/03/07(日) 14:23:03> using stdはちゃんとやってますよ?
どこでやってるの?
俺の画面に表示されている限りではやっているように見えないんだけど?
いい加減、死ねばいいじゃないかな?
0754デフォルトの名無しさん
2010/03/07(日) 14:23:06やってみます。有難うございました。
0755デフォルトの名無しさん
2010/03/07(日) 14:23:400756デフォルトの名無しさん
2010/03/07(日) 14:24:010757デフォルトの名無しさん
2010/03/07(日) 14:27:49その関数以外の場所のabsは
using std::abs;無しで
std::absの方が呼ばれないと困るんですけど。
駄目ですよね?
0758デフォルトの名無しさん
2010/03/07(日) 14:29:35C++使うな。勝手に困れ。
0759デフォルトの名無しさん
2010/03/07(日) 14:30:13お引き取りください
0760デフォルトの名無しさん
2010/03/07(日) 14:30:48> ちゃんとやってますよ?
> 仮に749が正しいとして
だんだん横柄になってきたな。
0761デフォルトの名無しさん
2010/03/07(日) 14:30:580762デフォルトの名無しさん
2010/03/07(日) 14:37:220763デフォルトの名無しさん
2010/03/07(日) 14:46:39悪い燃料だったろ!
0764デフォルトの名無しさん
2010/03/07(日) 15:28:400765デフォルトの名無しさん
2010/03/07(日) 15:41:26absを使うときusing std::absがいる
規定を知っていけないといけなくなるから。
0766デフォルトの名無しさん
2010/03/07(日) 15:46:28template<typename T> T swap(T const& v) {
using std::abs;
return abs(v);
}
}
template<typename T> T function(T const& v){
return mylib::abs(v);
}
あとは全部mylib::absを使えばいい。
嫌なら知らん。
0767766
2010/03/07(日) 15:47:34失礼。
0768デフォルトの名無しさん
2010/03/07(日) 15:48:100769デフォルトの名無しさん
2010/03/07(日) 16:10:01説明不足だったかな。
これでいいかな。
namespace ore
{
class Hoge
{
int a;
public:
explicit Hoge(int a0):a(a0){}
int get()const{return a;}
};
inline Hoge abs(const Hoge& a)
{
return Hoge(std::abs(a.get()));
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int c=3;
int d=abs(c);//ADLで std::absが選択される
ore::Hoge e(3);
ore::Hoge f=abs(e); //ADLで ore::absが選択される。
return 0;
}
0770デフォルトの名無しさん
2010/03/07(日) 16:13:24ヘッダが抜けてた
#include <cmath>
を追加してね
0771デフォルトの名無しさん
2010/03/07(日) 16:14:20ありがとうございます。
0772デフォルトの名無しさん
2010/03/07(日) 20:18:02C++の入門サイトなのにprintfが出てきたりCに書き直せだとか出てきて発狂しそうです
0773デフォルトの名無しさん
2010/03/07(日) 20:22:080774デフォルトの名無しさん
2010/03/07(日) 22:13:570775デフォルトの名無しさん
2010/03/07(日) 22:45:23> Cを知らずにC++をマスターすることは可能でしょうか?
可能です。
でもC++しかしらなくてC言語を全く知らないとなると
今後 ちょっと不便だと思うよ。
職業としてもし使いたいなら結局は両方必要になる。
0776デフォルトの名無しさん
2010/03/08(月) 00:03:59C言語を知らないってのはありえないし、順番的にもC言語は知っておくべき
0777デフォルトの名無しさん
2010/03/08(月) 00:09:59> C++をマスターした人が
> C言語を知らないってのはありえない
同意。
C言語を知らないで通ろうという方が面倒だと思うぜ。
0778デフォルトの名無しさん
2010/03/08(月) 00:43:46template <???> void std::swap< mycls<?> >(mycls<?> &lhs, mycls<?> &rhs)
{
・・・
};
テンプレートクラスのstd::swap特殊化って不可能?
0779デフォルトの名無しさん
2010/03/08(月) 01:46:44理想的には知らない方がいい
0780デフォルトの名無しさん
2010/03/08(月) 01:52:470781デフォルトの名無しさん
2010/03/08(月) 02:18:26脆弱性云々の発生原因はどこにあるとか理解できるの?
0782デフォルトの名無しさん
2010/03/08(月) 02:22:430783デフォルトの名無しさん
2010/03/08(月) 02:37:23(C++をやるのにmallocが必要か?)
ただそんな前提の入門書やサイトの存在を知らないのだが…
0784デフォルトの名無しさん
2010/03/08(月) 02:39:020785デフォルトの名無しさん
2010/03/08(月) 02:48:000786デフォルトの名無しさん
2010/03/08(月) 02:53:580787デフォルトの名無しさん
2010/03/08(月) 02:57:310788デフォルトの名無しさん
2010/03/08(月) 03:02:01とはいえ、もうCもさすがに減ってきたけどね
0789デフォルトの名無しさん
2010/03/08(月) 16:05:04Cなんて使わないんじゃないの?
0790デフォルトの名無しさん
2010/03/08(月) 16:12:240791デフォルトの名無しさん
2010/03/08(月) 16:26:07std::exception継承した自作例外しか使ってないんだがダメかな?
0792デフォルトの名無しさん
2010/03/08(月) 19:18:05数値が切り捨てられることってないですよね?
0793デフォルトの名無しさん
2010/03/08(月) 19:46:290794デフォルトの名無しさん
2010/03/08(月) 20:12:54ゲームでは大きいかもな>5%
0795デフォルトの名無しさん
2010/03/08(月) 20:23:17なにそれソースplz
0796デフォルトの名無しさん
2010/03/08(月) 20:52:04Cに幻想を抱いていませんか?
ソースを出そうぜ
0797デフォルトの名無しさん
2010/03/08(月) 21:12:290798デフォルトの名無しさん
2010/03/08(月) 21:48:13794じゃないし、本も手元にないからこれ以上言えんけど。
0799デフォルトの名無しさん
2010/03/08(月) 22:17:17あ、そうそう、effective C++に書いてあったわ
0800デフォルトの名無しさん
2010/03/09(火) 23:06:550801デフォルトの名無しさん
2010/03/09(火) 23:17:52> C++よりCの方が5%ほど速いらしい
最近、久々に
Effective C++ 第3版を通読したんだけど
どこにも記述が見つからないですよ。
0802デフォルトの名無しさん
2010/03/09(火) 23:40:26俺が見たのは第2版の前書きにて
0803デフォルトの名無しさん
2010/03/10(水) 00:29:470804デフォルトの名無しさん
2010/03/10(水) 02:19:33だとすると、C++の独自機能のうち、オーバーヘッドが大きいのはどの機能で、Cと互角orC++の方が早いくらいな機能はどの機能か?
って話が知りたいわけだ。
そして、オーバーヘッドが大きい機能を極力使わないようにしたところ、どれくらいC++らしさを保てるか、奇妙な難解言語になっていないか、
ということが重要になってくるわけだ。
一般にオーバーヘッドが大きいって言われているのに、virtualメソッド、iostreamでの読み書きがある。
関数オブジェクトはコールバックとそう変わらないらしいね。
std::vectorは、固定長配列よりは遅いが、自力で(mallocやらreallocやらで)可変長配列書くよりは
(優秀なプログラマなら互角に勝負できるらしいが、大多数のプログラマにとっては)早いようだ。
sizeをあらかじめ決めておき、配列形式でアクセスすると変わらんが、それだとvector使う意味が薄れる。
0805デフォルトの名無しさん
2010/03/10(水) 03:11:28> 3つ目はおまけでcharを渡してる
遅レスでごめん
>ore::abs<int>('a');
'a'ってintじゃないの?
0806デフォルトの名無しさん
2010/03/10(水) 03:41:27つ sizeof('a')
0807デフォルトの名無しさん
2010/03/10(水) 14:19:14実行時コストはまったくのゼロでいいの?
0808デフォルトの名無しさん
2010/03/10(水) 14:21:200809デフォルトの名無しさん
2010/03/10(水) 14:23:58そんな質問の仕方で本当に答えがもらえると思ってるの?
0810デフォルトの名無しさん
2010/03/10(水) 15:51:02答えられないならだまってろよカス
0811デフォルトの名無しさん
2010/03/10(水) 15:52:330812デフォルトの名無しさん
2010/03/10(水) 16:23:00いずれも値のコピーをするので、最適化されなければコピーにかかる分のコストがある。
それ以外では多相ポインタに対するstatic_castはクラス階層の移動がある場合
アドレスを調整するため整数の加減算が発生する事がある。
いずれも無視できる程度だな。
0813デフォルトの名無しさん
2010/03/10(水) 16:29:440814デフォルトの名無しさん
2010/03/10(水) 18:26:54読まなけらばならない空気などあるのでしょうか?
0815デフォルトの名無しさん
2010/03/10(水) 20:53:16とかそういうくだらない会話が繰り広げられているわけですね。
0816デフォルトの名無しさん
2010/03/10(水) 21:36:46元の演算子の種類と同じものを受け継ぐ?
0817デフォルトの名無しさん
2010/03/10(水) 22:02:510818デフォルトの名無しさん
2010/03/10(水) 23:12:45つ[シリコン嫁]
0819デフォルトの名無しさん
2010/03/10(水) 23:25:35IDEでサポートするようなものじゃないの?
0820デフォルトの名無しさん
2010/03/10(水) 23:44:01> #define って言語の機能として必要なの?
> IDEでサポートするようなものじゃないの?
言語仕様にIDEを定義するつもりですか?
0821デフォルトの名無しさん
2010/03/10(水) 23:48:59#define はプリプロセッサ、言語の機能というよりは単なる置き換え。
IDE に取り込むのはむずかしいでしょう。なにせ無節操。
0822デフォルトの名無しさん
2010/03/11(木) 02:46:33instance.do_something();
と
Class *instance = new Class();
instance->do_something();
delete instance;
の使い分けを教えてください
0823デフォルトの名無しさん
2010/03/11(木) 05:08:550824デフォルトの名無しさん
2010/03/11(木) 07:37:330825デフォルトの名無しさん
2010/03/11(木) 12:22:31前者は関数内でのみ有効。後者はinstance を delete するまで有効。寿命。
0826デフォルトの名無しさん
2010/03/11(木) 12:29:11前者はスタック上にメモリがとられ、
後者はヒープのメモリを使う。
自信なし。
0827デフォルトの名無しさん
2010/03/12(金) 00:22:410828デフォルトの名無しさん
2010/03/12(金) 02:02:36コンパイル時は無理。実行時にsize_tの最大値でmalloc()&free()してみれ
ばいい。失敗したらサイズを減らす。
0829デフォルトの名無しさん
2010/03/12(金) 12:15:32以下を記述すれば登録できるDLLが作れますか?
DllMain :
DllGetClassObject : クラス ファクトリのインスタンスを作成する。前のトピックにて解説済み。
DllCanUnloadNow : DLL が安全にアンロード可能かどうかを問い合わせる。
DllRegisterServer : DLL のレジストリ エントリを作成する。
DllUnregisterServer : DLL のレジストリ エントリを削除する。
ネットで調べたんですがよく解りませんでした、DLLについて書いてある本とかHPはありませんか?
0830デフォルトの名無しさん
2010/03/12(金) 13:07:49スレ違い
0831829
2010/03/12(金) 13:59:090832デフォルトの名無しさん
2010/03/12(金) 22:42:07これのコンストラクタ内部で例外が発生したらnew intで確保したオブジェクトは回収不能ですか?
0833デフォルトの名無しさん
2010/03/13(土) 04:13:590834デフォルトの名無しさん
2010/03/13(土) 18:19:570835デフォルトの名無しさん
2010/03/13(土) 18:44:020836デフォルトの名無しさん
2010/03/13(土) 18:51:090837デフォルトの名無しさん
2010/03/13(土) 18:51:28心配イラネ
0838デフォルトの名無しさん
2010/03/13(土) 19:35:14リークしないよ
0839デフォルトの名無しさん
2010/03/13(土) 19:39:59>template<class Y> explicit shared_ptr(Y * p);
>...
>Exception safety: If an exception is thrown, delete p is called.
聞く前にドキュメントを読むべき
0840デフォルトの名無しさん
2010/03/13(土) 19:53:480841デフォルトの名無しさん
2010/03/13(土) 22:25:110842デフォルトの名無しさん
2010/03/13(土) 22:57:56そんなアホが居るのか?
0843デフォルトの名無しさん
2010/03/13(土) 23:42:490844デフォルトの名無しさん
2010/03/13(土) 23:56:160845デフォルトの名無しさん
2010/03/14(日) 01:02:480846デフォルトの名無しさん
2010/03/14(日) 01:05:440847デフォルトの名無しさん
2010/03/14(日) 01:55:070848デフォルトの名無しさん
2010/03/14(日) 01:55:560849デフォルトの名無しさん
2010/03/14(日) 02:01:33newの代わりにmake_sharedを使うとリークしないし速い。
0850デフォルトの名無しさん
2010/03/14(日) 02:08:140851デフォルトの名無しさん
2010/03/14(日) 02:17:280852デフォルトの名無しさん
2010/03/14(日) 02:18:26shared_ptr<hoge>(new hoge);だと内部で参照カウントの領域を別にメモリ確保するが、
make_sharedだと1度のメモリ確保で両方収まる領域を用意する。
そのため、速くなると言うのは嘘とは言えない。
0853デフォルトの名無しさん
2010/03/14(日) 02:22:53boostの中の人はほんとに優秀だな
0854デフォルトの名無しさん
2010/03/14(日) 02:33:01http://pc12.2ch.net/test/read.cgi/tech/1251446016/
0855デフォルトの名無しさん
2010/03/14(日) 13:19:54ttp://www.kumei.ne.jp/c_lang/index.html
でc言語編でcの基礎やってからc++編やろうと思います
c言語編のどこらへんでc++編に移行したらいいと思いますか?
また、c++のどこらへんまでやったらSDK編移行していいと思いますか?
日本語下手ですみません
0856デフォルトの名無しさん
2010/03/14(日) 13:24:580857デフォルトの名無しさん
2010/03/14(日) 13:27:38ファイル入出力とかはSDKのほうにOSが提供してるやつがあるので
急ぐならC/C++のファイル入出力は飛ばしてもよいかも
0858デフォルトの名無しさん
2010/03/14(日) 13:30:44ありがとうございます。急ぎはしないのでゆっくりやってきたいとおもいます。
0859デフォルトの名無しさん
2010/03/14(日) 14:07:330860デフォルトの名無しさん
2010/03/14(日) 14:14:01C++相談室スレか何かに載ってるので見てください
0861デフォルトの名無しさん
2010/03/14(日) 14:36:51ここ、C言語編とか良いながらWindowsも混ざってるぞ。
0862デフォルトの名無しさん
2010/03/14(日) 16:25:32どうやって、C言語で書かれているコードに継承関係を作ってるの?
0863デフォルトの名無しさん
2010/03/14(日) 16:36:560864デフォルトの名無しさん
2010/03/14(日) 16:57:580865デフォルトの名無しさん
2010/03/14(日) 17:16:13メモリの開放はfree1回でいいの?
0866デフォルトの名無しさん
2010/03/14(日) 17:21:47だめ。
0868デフォルトの名無しさん
2010/03/14(日) 17:30:14>>866
0869デフォルトの名無しさん
2010/03/14(日) 17:31:48p = new int;
p = new int;
delete p;
delete p;
delete p;
とかするなよ。
int* p0 = new int;
int* p1 = new int;
int* p2 = new int;
delete p2;
delete p1;
delete p0;
みたいにするんだぞ。
0870デフォルトの名無しさん
2010/03/14(日) 17:36:37ありがとう
c++じゃないけどcも似たような感じでやればいいのね
0871デフォルトの名無しさん
2010/03/14(日) 17:42:350872デフォルトの名無しさん
2010/03/14(日) 17:43:480873デフォルトの名無しさん
2010/03/14(日) 17:57:12> int* p = new int;
> p = new int;
> p = new int;
> delete p;
> delete p;
> delete p;
>
> とかするなよ。
int* p = new int;
いろいろな処理
delete p;
p = new int;
いろいろな処理
delete p;
p = new int;
いろいろな処理
delete p;
こうやれよ、という話かとおもた
0874デフォルトの名無しさん
2010/03/14(日) 19:53:32Windowsはウィンドウ(プロセス)ごとに仮想メモリ領域を割り当てて
そのメモリ領域内で内でプログラム(アプリケーション)を実行する。
×ボタンなどで閉じる時に、ウィンドウ生成時に割り当てた
仮想メモリ領域を解放するので、アプリがメモリリークしてても
OSとしてリークしない(しにくい)仕組みになっている。
だからと言ってdeleteしなくてもいいじゃん!というわけではないよ
0875デフォルトの名無しさん
2010/03/14(日) 22:24:43int x;
};
class B{
int x;
};
class C : public A, public B{
C(A a, B b) : A(a), B(b){}
void func()
{
cout<<A::x;
cout<<B::x;
}
};
この方法でクラスCのコンストラクタに
クラスAのオブジェクトデータを2つ以上使うにはどうすればいいですか?
0876デフォルトの名無しさん
2010/03/14(日) 23:41:45deleteはどのタイミングですればいいのですか?
0877デフォルトの名無しさん
2010/03/14(日) 23:46:44そのポインタが何を指しているのか分からんし、
まーーったく答えようがない。
一見するとクソ設計に読めるが、
わざとポインタを返す方法もあるし。。。
0878デフォルトの名無しさん
2010/03/14(日) 23:52:16メンバ変数のポインタを返すようにしてるなら削除されたら困るだろうし(この設計はどうかと思うが)、
一概には言えないが、一つ言えるのは不必要になったら削除すれば良い。
0880デフォルトの名無しさん
2010/03/15(月) 00:06:35いやむしろ積極的にポインタを返すワザもあってだな・・・
まあいっか。
0881デフォルトの名無しさん
2010/03/15(月) 00:07:25Effective C++ぐらい読もうぜ。
あれを読まずしてC++を使ってもクソ設計しか書けないぞ。
0882デフォルトの名無しさん
2010/03/15(月) 00:11:290883デフォルトの名無しさん
2010/03/15(月) 00:14:00クラス内と共有してるメモリやstatic変数へのポインタならスマポかアドレスをとられないようにラップしたポインタもどきを返す
0884デフォルトの名無しさん
2010/03/15(月) 00:14:460885デフォルトの名無しさん
2010/03/15(月) 00:21:10中級者へのステップアップが難しい
0886デフォルトの名無しさん
2010/03/15(月) 00:22:58済んじゃって悪くないだろ。
名著の誉れ高い本なんだし。
別に俺はこのスレで答え教えることを否定したい訳じゃ無いが。
0887デフォルトの名無しさん
2010/03/15(月) 00:28:46実装方法を質問したつもりなんだけど、boostでおk、の一言がかえってきた時の脱力感はまったく嫌なものだよ
0888デフォルトの名無しさん
2010/03/15(月) 00:47:08それは継承では無理
包含(コンポジション)を使え
private変数の出力にはメンバ関数を用意する
0889デフォルトの名無しさん
2010/03/15(月) 03:29:01return new string[] {"ahya", "hoge", "haya-n"};
みたいに配列をreturnすることができるわけだけど
C++は全く同じことってできたっけ?
0890デフォルトの名無しさん
2010/03/15(月) 04:55:38std::vector と boost::fusion::make_vector() あたりで代用してくれ。
0891デフォルトの名無しさん
2010/03/15(月) 10:02:43次のようにしてもとびとびの値しか表示できません
こういうときはどうすればよいのでしょうか?
最終的には直線を複素変換で円にして表示するところまで作るのが目標ですが
それ以前のところで躓いてしまいました
int f(int x){return 5*x;}
int g(int y){return y/5;} //逆関数も試してみた
//x,yは画面の幅と高さの分だけループ。描画はwinapiを使ってます
void draw(int x,int y,HDC& hdc){
SetPixel(hdc,x,f(x),RGB(0,0,0));
// SetPixel(hdc,f(y),y,RGB(0,0,0));
}
0892デフォルトの名無しさん
2010/03/15(月) 10:11:33逆関数のほうは単にg(y)とすべきところをf(y)としてしまっていただけでした
0893デフォルトの名無しさん
2010/03/15(月) 18:29:23DirectXInputを使わずにやろうと思い、次のようなソースを書いたのですが、カーソルの右と上への移動が過度にされ、
左と下への移動があまりうまく判定されません。どのように改善したらよいでしょうか。
POINT pos;//現在のマウス位置
POINT poso;//マウス左ボタンを押した位置
case WM_LBUTTONDOWN:
if(!isMouseDown){
poso.x=LOWORD(lParam);//マウス左ボタンを押した位置セット
poso.y=HIWORD(lParam);
}
isMouseDown=TRUE;
break;
case WM_LBUTTONUP:
isMouseDown=FALSE;
break;
case WM_MOUSEMOVE:
if(!isMouseDown)return 0;
pos.x-=poso.x;//差でマウスの移動方向を判定
pos.y-=poso.y;
if(pos.x<0)(回転角変更処理)
else if(pos.x>0)(回転角変更処理)
if(pos.y<0)(回転角変更処理)
else if(pos.y>0)(回転角変更処理)
poso.x=pos.x;//動かすたびに移動方向を判定できるようリセット
poso.y=pos.y;
break;
while( msg.message!=WM_QUIT )// メッセージループ
{
if(isMouseDown)GetCursorPos( &pos );
}
0894デフォルトの名無しさん
2010/03/15(月) 20:50:16おお!fusion渡しか。それいいね。ヒープも使わずスタックに積んで高速ときたか。最適化も効きそうだな。
それはいいテクニックだな。使わせてもらうよ。
0895デフォルトの名無しさん
2010/03/16(火) 13:23:01pos -= poso をしたらposは「現在の位置」ではなく「移動量」になる。
移動量のローカル変数を作るのがいいのでは。
posoをMOUSEMOVEで更新するとposoは「左ボタンを押した位置」ではなくなる。
現在の位置で更新すると「前回の位置」になるが、
a点からb点に移動する時に経路によって回転具合が変わるような回転がしたいならそれでいいが、
そうでないならposoはBUTTONDOWN時にセットするだけでおk。
0896デフォルトの名無しさん
2010/03/16(火) 20:57:37これの最初のデータを参照で受ける方法がわからないんですが
文法的にどう書けばよいんでしょうか?
思いつくのを適当に試したんですがコンパイルできません
int *&a=d[0];
int &a[10]=d[0];
int &[10]a=d[0];
int &a[]=d[0];
0897デフォルトの名無しさん
2010/03/16(火) 21:07:34impo d[20][10];
impo (&a)[10] = d[0];
typedef int impo_10[10];
impo_10 &b = d[0];
0898デフォルトの名無しさん
2010/03/16(火) 21:09:000899デフォルトの名無しさん
2010/03/16(火) 21:09:17int (*a)[10] = d;
0900デフォルトの名無しさん
2010/03/16(火) 21:20:060901デフォルトの名無しさん
2010/03/16(火) 23:23:42scanfかcinで整数値として読み込む方法はありますか
0902デフォルトの名無しさん
2010/03/16(火) 23:26:00cin >> setbase(16) >> a;
0903デフォルトの名無しさん
2010/03/16(火) 23:40:50a=*(p-hikaku);では駄目でした。初歩だと思いますがどう記述すれば良いのでしょう?
0904893
2010/03/16(火) 23:43:25ifのところを引き算して判定から単純に>と<による大きさの判定をしたところ、
意図したとおりの結果が得られました。
>a点からb点に移動する時に経路によって回転具合が変わるような回転がしたいならそれでいいが
その後おっしゃっている通り「移動する時に経路によって回転具合が変わる」ようにしたかったので、
このようにいたしました。
どうもお世話になりました。ありがとうございました。
0905デフォルトの名無しさん
2010/03/16(火) 23:43:410906デフォルトの名無しさん
2010/03/16(火) 23:53:35strchr(str, c);のp-strってなんだよpgr
0907デフォルトの名無しさん
2010/03/16(火) 23:59:570908デフォルトの名無しさん
2010/03/17(水) 02:57:25char str[] = "abcdef";
char c = 'e';
char* p = strrchr(str, c);
int a = -1;
if(p){ a = p - str; }
0909デフォルトの名無しさん
2010/03/17(水) 07:23:54a=*(p-hikaku);では無くa=*(p - str);でした。
ネットとコードからコピペしたせいで間違えてしまいました、すみません。
a = p - str; できました、ありがとうございます。
0910デフォルトの名無しさん
2010/03/17(水) 09:09:13お前 C のプログラム書いたことないのか????
0911デフォルトの名無しさん
2010/03/17(水) 10:02:16"Windows Update"の"更新履歴の表示"で表示される更新プログラム(KB******と表示される箇所)のリストを取得する
方法をご存知でしたら教えていただけないでしょうか?
社内で指定されたセキュリティ更新のパッチが当てられているかをチェックするツールを作成するのが目的です。
開発環境はVisualStudio2008 C++(MFC)
Windows XPとVistaで上記のリストを取得する必要があります。
0912デフォルトの名無しさん
2010/03/17(水) 10:13:08Windows フォルダの下に WindowsUpdate.log といるファイルがあるから、
これを解析すればわかるんじゃない。
ttp://support.microsoft.com/kb/902093/ja
0914デフォルトの名無しさん
2010/03/17(水) 20:58:42int geometryOutputVertexCount () const
みたいにお尻に"const"をつけてるケースをまま見るんですがこれなんなんですか(´・ω・`)?
0915デフォルトの名無しさん
2010/03/17(水) 21:00:17(オジェクトの内部状態を変えないぜ)
0916デフォルトの名無しさん
2010/03/17(水) 21:37:36mapを要素にもつ配列を利用して二次元配列的にするか
mapのkeyを行数*最大列数+列番号として直線的に二次元配列を表現するのではどちらが効率的でしょうか?
0917デフォルトの名無しさん
2010/03/17(水) 21:58:530918デフォルトの名無しさん
2010/03/17(水) 22:05:35空白のfieldと0を明確に区別したいのでmapを利用しようと考えました
0919デフォルトの名無しさん
2010/03/17(水) 22:07:09それは変数をstaticで宣言するのと何が違うんですか?
0920デフォルトの名無しさん
2010/03/17(水) 22:07:50× それは変数をstaticで宣言するのと何が違うんですか?
○ それは変数をconstで宣言するのと何が違うんですか?
0921デフォルトの名無しさん
2010/03/17(水) 22:27:25constオブジェクトはconstなメソッドしか呼べない。
constでないオブジェクトはconstでないメソッドを呼べる。
constなメンバ変数を持つconstオブジェクトはconstなメソッドしか呼べない。
constなメンバ変数を持つconstでないオブジェクトはconstでないメソッドも呼べる。
0922デフォルトの名無しさん
2010/03/17(水) 22:27:36変数がconstだとその変数の値は変えられません。
メンバ関数がconstだとそのメンバ関数ではインスタンスの状態を変えられません。
0923デフォルトの名無しさん
2010/03/17(水) 22:39:140924デフォルトの名無しさん
2010/03/17(水) 22:47:28map< pair<int, int> >でいいよ
0925デフォルトの名無しさん
2010/03/17(水) 23:14:05こうすると値と空白を区別できる配列が作れる。
#include <boost/optional.hpp>
#include <iostream>
void func(const boost::optional<int>& Val)
{
if(Val)
std::cout<<"Value="<<*Val<<std::endl;
else
std::cout<<"space"<<std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
boost::optional<int> a[100][100];
a[10][10]=333;
func(a[10][10]); // 333が出力される。
func(a[11][12]); // 値が設定されていないのでspaceが出力される。
return 0;
}
0926デフォルトの名無しさん
2010/03/17(水) 23:15:59もちろん0でも
a[10][10]=0;
とすればもちろんvalue=0と表示されて空白と区別できるよ。
0927デフォルトの名無しさん
2010/03/18(木) 05:09:26わからないことがあったので教えてください。
一つのクラスの中で、ifstreamでファイルを読み込み、処理してから
コンソールに結果を表示するまでを行っているのですが、
クラスの宣言の時に、ifstreamの宣言をpublicにすると
クラスが終わらなくなりました。
ifstreamはpublicにしてたのは単なるミスで、全然privateでいいのですが
なぜ終わらなくなったのかが理解できません。教えてください。
クラスが終わらなくなったっていうのは
int myclass(){
//ここでクラスを呼ぶ
return 0;
}
int main(){
myclass();
cout << "main end";
return 0;
}
とすると、処理は終わって結果が表示された後、
main endが表示されずにプログラムが終わらない状態です。
処理中のメンバ関数はすべて動いていました。
ifstreamはちゃんとデストラクタでcloseしてます。
0928デフォルトの名無しさん
2010/03/18(木) 06:50:35publicは関係なくて、メンバ変数の宣言順が変わったせいじゃないのか?
ていうか「ifstreamの宣言をpublicにする」てどういう意味だ?
0929デフォルトの名無しさん
2010/03/18(木) 09:56:540930デフォルトの名無しさん
2010/03/18(木) 09:57:220931デフォルトの名無しさん
2010/03/18(木) 09:58:15おい、ここはC/C++のスレだぞ?
どこの言語の話をなさっているのですか?
0932デフォルトの名無しさん
2010/03/18(木) 10:14:120933デフォルトの名無しさん
2010/03/18(木) 10:24:49の人気にshit・・・もとい嫉妬
0934デフォルトの名無しさん
2010/03/18(木) 12:19:11ifstreamがありませんっ!!
0935デフォルトの名無しさん
2010/03/18(木) 12:57:55fack u
0936デフォルトの名無しさん
2010/03/18(木) 14:54:440937デフォルトの名無しさん
2010/03/18(木) 17:58:30クラスの定義もクラスを呼ぶ(?)処理も省略されているが、
>>927が絶対の自信を以って省略しているのだから問題ないはずだ。
0938デフォルトの名無しさん
2010/03/18(木) 18:08:520939デフォルトの名無しさん
2010/03/18(木) 19:11:350940デフォルトの名無しさん
2010/03/18(木) 19:26:150941デフォルトの名無しさん
2010/03/18(木) 19:31:030942デフォルトの名無しさん
2010/03/18(木) 19:31:520943デフォルトの名無しさん
2010/03/18(木) 19:36:49fuck u
0944デフォルトの名無しさん
2010/03/18(木) 19:37:450945デフォルトの名無しさん
2010/03/19(金) 01:09:060946デフォルトの名無しさん
2010/03/19(金) 01:13:510947デフォルトの名無しさん
2010/03/19(金) 01:22:300948デフォルトの名無しさん
2010/03/19(金) 19:58:36char *p;
char *r1;
p=tion(URL);
r1=p;
MessageBox(hWnd,r1,p,MB_OK);
.h -----------
char *tion(char U[]){
char a[20]="D:\\Temp";
return a;
}
表示がp1、r1共に 0・になります。charの戻り値をMessageboxに表示させる方法を教えてください。
代用でグローバルアドレスにCharを入れて、戻り値はint等にする方法もあるらしいのですが、
戻り値Charの方が一般的ですよね?
0949デフォルトの名無しさん
2010/03/19(金) 20:05:28char a[20]="aaaa";はポインタのコピーではなく、スタック上の配列の初期化になる。この配列は関数から返るときに無くなる。
const char* a="aaa";とすると、グローバル上のリテラルのポインタが得られる。
0950948
2010/03/19(金) 20:57:38関数を終了したときに変数はスタックから消えてしまうのですね
static char a[20]="aaaa";
char* a="aaa";
できました、ありがとうございます。
0951デフォルトの名無しさん
2010/03/19(金) 20:57:48char* a = "abc" はコードのどっかに存在する "abc" リテラルへのアドレスを示すから戻り値は有効
ただし、戻り値に書き込みを行なうと例外を生じるから
const char* tion( char* U )
{
char* a = "abc";
return a;
}
とすべき、tion() 内に静的領域を配置して変更可能なトリッキーなコードを書きたいなら
char* tion( char* U )
{
static char a[20] = "abc";
return a;
}
この場合、a はヒープ上の領域だから 20Byte までなら書き込んでも良い、まぁこんな用途は普通無いけど
0954デフォルトの名無しさん
2010/03/20(土) 00:05:37最近のエスパーをなめるなよ
0955デフォルトの名無しさん
2010/03/20(土) 00:20:55お前はエスパーなのか?羨ましいぞ
競馬で稼げるんだろうな...
0957デフォルトの名無しさん
2010/03/20(土) 00:34:47って感じで同じ型の引数がもりもり続くんだけど、型を省略する文法とかないの?
0958デフォルトの名無しさん
2010/03/20(土) 00:37:320959デフォルトの名無しさん
2010/03/20(土) 00:39:010960デフォルトの名無しさん
2010/03/20(土) 00:39:13関数のプロトタイプ宣言なら、Cならint func();でOK。
0961デフォルトの名無しさん
2010/03/20(土) 00:40:580962デフォルトの名無しさん
2010/03/20(土) 00:42:23func(int x[500]);
0963デフォルトの名無しさん
2010/03/20(土) 00:44:12関数を先書いてそれをコピペして ; 付けろよ
俺はいつもそうしてる
0964デフォルトの名無しさん
2010/03/20(土) 00:50:10foo(x, y, z, s, t, u, p, q, r, たくさん)
int x, y, z, s, t, u, p, q, r, たくさん;
{
/* something */
return expression;
}
みたいに
0965デフォルトの名無しさん
2010/03/20(土) 01:25:08その例なら、
foo(x, y, z, s, t, u, p, q, r, たくさん)
{
/* something */
return expression;
}
でOKだ。
0966デフォルトの名無しさん
2010/03/20(土) 13:57:31今までずっと
map<int,int> v;
if(v.count(3)==0){v.insert(make_pair(3,3));}
みたいにやってたんですが
if(!v[3]){v[3]=3;}
cout << v[3] << endl;
こんなのでも動きます
これって問題ないんですかね?
なんかすごい冗長な書き方をしてきたのかもしれない
0967デフォルトの名無しさん
2010/03/20(土) 14:05:37countなんてmultimapしか使わないと思ってた
0968デフォルトの名無しさん
2010/03/20(土) 14:05:41if (!v[3]) が実行されると
v[3] = int();
と同様の処理が起こり、vの要素数が増えるわけだが
それで良いなら。
0969デフォルトの名無しさん
2010/03/20(土) 14:15:32なるほど
自分はsetでもcountを多用しますが
findのほうが王道なんですかね
>>968
わかりやすい解説ありがとうございます
すぐに代入するつもりなのでそこは問題ないです。
ただ、若干速度は落ちるかもしれないってことですね
0970デフォルトの名無しさん
2010/03/20(土) 14:19:410971デフォルトの名無しさん
2010/03/20(土) 14:33:20cout << v.size() << endl;
if(!v[3]){cout << "none" << endl;}else{cout << "some" << endl;}
cout << v.size() << endl;
if(!v[3]){cout << "none" << endl;}else{cout << "some" << endl;}
cout << v.size() << endl;
試してみたけど、やっぱりだめかもしれない
これはなんたる副作用
気をつけます
0972デフォルトの名無しさん
2010/03/20(土) 15:21:250973デフォルトの名無しさん
2010/03/20(土) 16:55:53この順番の頻度で操作が行われる場合に最も適したSTLのコンテナはvectorでしょうか?
mapで要素の追加順にアクセス出来ればそっちの方がいいような気もしますが、出来ますか?
0974デフォルトの名無しさん
2010/03/20(土) 17:01:05探索と順序が両方欲しい欲張りなあなたには、boost::multi_indexを紹介しよう。
0975デフォルトの名無しさん
2010/03/20(土) 17:02:470976デフォルトの名無しさん
2010/03/20(土) 17:37:02とりあえずvectorで作れ。
setなりmapなりに切り替えるのは、実際にボトルネックが発生してからでいい。
あとmapは追加順を覚えないから、必要ならmapとvectorを併用するとかで対応。
それかboost入れて>>974
0977デフォルトの名無しさん
2010/03/21(日) 17:45:280978デフォルトの名無しさん
2010/03/21(日) 17:56:130979デフォルトの名無しさん
2010/03/21(日) 18:14:590980デフォルトの名無しさん
2010/03/21(日) 18:31:09>>977が聞いてるのは「C++の」IDEだ
0981デフォルトの名無しさん
2010/03/21(日) 18:32:470982デフォルトの名無しさん
2010/03/21(日) 18:45:45いや、案外C++のIDEとしてもそんなに悪くは
ないんですぜ。Qt Creator
俺はEclipse派だけどな!
ttp://blog.hiroaki.jp/2004/12/000199.html
ここでも同じ様な事考えている人がいる。
0983デフォルトの名無しさん
2010/03/21(日) 20:15:31eclipseってintelC++とかデバッガとか使える?あ、windowsで。
0984デフォルトの名無しさん
2010/03/21(日) 21:54:120985デフォルトの名無しさん
2010/03/21(日) 21:55:00Visual C++ Express Edition 2008
0986デフォルトの名無しさん
2010/03/22(月) 04:39:010987デフォルトの名無しさん
2010/03/22(月) 04:53:280988デフォルトの名無しさん
2010/03/22(月) 12:41:400989デフォルトの名無しさん
2010/03/22(月) 12:55:240990973
2010/03/22(月) 15:18:31もっと早くに買っておけば良かったと後悔しきり、、、
0991デフォルトの名無しさん
2010/03/22(月) 18:42:51そのソフト配布する場合気をつけなければいけないことはありますか?
このdllは〇〇に著作権があります
と書くだけで配布できるんでしょうか?
一応フリーウェアとは書いてあるんですけど
0992デフォルトの名無しさん
2010/03/22(月) 18:49:200993デフォルトの名無しさん
2010/03/22(月) 18:50:480994デフォルトの名無しさん
2010/03/22(月) 21:05:52一般論でどうこう言える問題じゃないんで、自分で読んで
判断できなかったら使わない方が無難。
0995デフォルトの名無しさん
2010/03/22(月) 21:10:01なんてライセンス?
0996デフォルトの名無しさん
2010/03/22(月) 21:42:52class TestClass{
private:
boost::shared_ptr<int> hoge;
};
これで
void main(){
TestClass a;
TestClass b = a;
とした場合、デフォルトのコピーコンストラクタが呼ばれると思われますが、shared_ptrはどのようにコピーされるのでしょうか?
初心者の質問ですみません。
0997991
2010/03/22(月) 21:48:51ライセンスとかよくわかりませんが
unrar.dllです。利用するためのサンプルソースもついてて
わかりやすいからこれにしようと思ったんだけど
0998デフォルトの名無しさん
2010/03/22(月) 22:13:07hogeが掴んでいるインスタンスがa.hogeとb.hogeで共有される。hogeの指す実体コピーはされない。
0999デフォルトの名無しさん
2010/03/22(月) 22:17:25> ライセンスとかよくわかりませんが
おいおい・・・。
おどかすようだが、(まあおどかしておくと)
下手打つと訴訟物だぞ。
1000デフォルトの名無しさん
2010/03/22(月) 22:25:43裁判頑張ってください。応援します。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。