スレを勃てるまでもないC/C++の質問はここで 16
1 :
デフォルトの名無しさん :
2010/07/16(金) 22:07:27
>>前スレ987 ダイアログボックスならWM_CREATEじゃなくてWM_INITDIALOGではなかろうか あ、ダイアログボックスのプロシージャで受ける場合の話ね。 主ウィンドウ側のプロシージャでWM_CREATEを受けているなら、 (そしてそのプロシージャで件のWM_TIMERも受けているなら) WM_TIMERの処理中に、つまりGetMessageでWM_TIMERをとってきてから 次にGetMessageを呼ぶまでの間にCreateWindow系の関数を呼び出すと、 ・CreateWindow中でWM_CREATEを投げる →でもメッセージループはWM_TIMERを処理中で回っていない →CreateWindowがWM_CREATEの処理を待ち続ける →固まる というコンボが発生するけど、他のダイアログ呼び出せてるならこれも違うかな。 ちょっとその記述だけだと、どのプロシージャでどのタイミングで投げられたどのメッセージを 受けているのかわかりにくいので、もうちょっと詳しく書いてくれるかソースを上げてくれれば見れるかも。
smart_ptrの導入方法を1から10まで教えてください
1.Visual C++ 2010をインストールする 2.#include <memory>をする 3.std::からスマートポインタを使う 4. 5. 6. 7. 8. 9. 10.C++から卒業する
>>4 std::からどれを使えばいいのかわかりません
std::tr1::unique_ptr std::tr1::shared_ptr std::tr1::weak_ptr
ty
そういやVC2010だとstd::unique_ptrって使えるんだよな std::vector<unique_ptr<std::string>> str_vec; っていうのが許されてて、便利になったもんだって感心したわ
>>8 std::unique_ptrはstd::auto_ptrに似て破壊的セマンティックスなので
コンテナには入れられないよ
std::shared_ptr ならいいの? boost::shared_ptrとどっち使ったらいいのかわからん
std::tr1:shared_ptrならコンテナに入れられる std::unique_ptrはstd::auto_ptrからコピーコンストラクタを取り除いて コピー禁止にした物だと思えばよい そのため関数の戻り値にも使えない boost::scoptd_ptrがstd::unique_ptrとリネームされたようなので boost::scoptd_ptrをぐぐるとよく動作がわかる
unique_ptrはauto_ptrと違ってコンテナに入れられるんじゃないの?
×scoptd_ptr ○scoped_ptr まあわかるよな
>>12 コピーが出来ないのでエラーになるよ
やってみ
>>14 C++じゃ無理だ
すまんC++0xと勘違いしてた
違いが分かんないようなレベルならとりあえずshared_ptr使っとけばいいよ お前が思ってるほどオーバヘッドねーからさ
17 :
デフォルトの名無しさん :2010/07/17(土) 15:00:33
引数で指定したファイルををsystem()使ってgrepする方法ってないでしょうか? system("grep aaa argv[1]");みたいなイメージでargv[1]にちゃんとファイル名を入れたいんですが・・・
>>17 キミは理解するまでsystem(3)利用禁止。
「何を理解するまでか?」それを含めて理解するまでだ。
>>9 VC2010では可能だよ
まぁ0xの先取りなんだけどさ
環境依存の話ここですんなよ
constを付けると呼び出されるたびにその分処理が遅くなるのでしょうか
constはコンパイル時に変数が変更されないかどうか調べるだけだから 気にしなくておk
constを付けると最適化がかかりやすくなり速度アップするかもしれない
24 :
デフォルトの名無しさん :2010/07/19(月) 10:12:34
C言語でテキストファイルから,patという文字列を検索して全てpatternという文字列に置換するプログラムを作りたいのですが, 下のプログラムだと,最初にpatがある行のpatだけ全て置換されてそれ以降の行のpatが置換されません。ポインタというものがあまり理解出来てないからだと思うんですけど,どうしたらいいでしょうか? #include <stdio.h> #include <string.h> int main(int argc,const char*argv[]){const char FILENAME[]="C:/data.txt"; const char RESULTFILENAME[]="C:/result.txt"; const int LEN=100; char line[LEN]; char src[LEN]; char *find="pat"; char *rep="pattern"; size_t find_len=strlen(find); size_t rep_len=strlen(rep); int shift=(int)(rep_len-find_len); char *start=src; char *hit; FILE *dat; FILE *result; dat=fopen(FILENAME,"r"); while(fgets(line,LEN,dat)!=NULL){sscanf(line,"%s",src); while((hit=strstr(start,find))!=NULL){ if(shift>0){memmove(hit+shift,hit,strlen(hit)+1); }else if(shift<0){ memmove(hit,hit-shift,strlen(hit)+shift+1); }start=hit+rep_len; memmove(hit,rep,rep_len); }fprintf(result,"%s\n",src); }fclose(dat); fclose(result); return 0;}
25 :
24 :2010/07/19(月) 10:20:26
result=fopen(RESULTFILENAME,"w;") が落ちていました。すみません。
>>24-25 ttp://codepad.org/OxSQOoRw とりあえず動くように書き換えてみたけど
もっと簡単に考えてみたらいいんじゃない?
2行目以降置換できなかった理由は
start=hit+rep_len; これ
最初の1行目はこれでいいんだけど
2行目以降
strstr(start,find) のstartが無効なアドレスを示して置換できないようになってる
sscanf(line,"%s",src); の後に
start = src; と入れればちゃんと動くかも
27 :
24 :2010/07/19(月) 11:47:23
>>26 回答ありがとうございます。
そういうことだったんですね。納得しました。
どちらも試しましたが,ともに正しく動きました。
本当にありがとうございました。
>>17 sprintfをとりあえず理解してみようか
それ以前の問題のような肝するが
29 :
デフォルトの名無しさん :2010/07/19(月) 16:00:18
vectorでvec1とvec2というのがあった場合、この2つを比較してそれぞれにしかいない要素を 別のvectorにそれぞれコピーする時って、地道にforで回すのが無難ですか? 関数(vec1, vec2, only_vec1, only_vec2); vec1だけにしかないものをonly_vec1へコピー、 vec2だけにしかないものをonly_vec2へコピーしたい。
1:要素数は同じか? 2:複数同じ要素が入っていたら全部消えるのか? A=5,5,5 B=5,5,4 の時only_aは5か、要素なしか 3:ソートしても問題はないか? まぁ何するにもforは必要だと思うけど・・・
31 :
デフォルトの名無しさん :2010/07/19(月) 16:54:09
あぁ、前提を書いてなかった。 vectorの要素数は同じ、各vectorには重複した要素は入っていない。 オリジナルのvectorの順序が入れ替わるのはまずい。 数回forを回せば分かるんで、もうこれでいいかな。
こんなアルゴリズムがあった set_difference OutIt set_difference(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x) ソート済みのfirst1からlast1にあって、ソート済みのfirst2からlast2にないものを、 xからのシーケンスにコピーしていきます。コピー後の末尾を指すイタレーターを返します これを2回使えばできるんじゃないか?
33 :
デフォルトの名無しさん :2010/07/19(月) 17:13:56
set_difference:一つ目の集合から二つ目の要素と一致しないものだけコピーする。
あ、あるもんなんだね…集合演算か、初めて見た。
>>32 ありがと。
メモリマネージャを作っているのですがよく分かりません 参考になるページやソースなどはありませんか?
そいつマルチなんだから答えるなよ
なんだよ。マルチかよしね。
38 :
デフォルトの名無しさん :2010/07/22(木) 17:26:55
配列が引数にある関数に、呼び出すときに配列作って渡すこと出来る? int hoge(int []); みたいな関数に hoge({594,444,200}); みたいな。
無理
なんで、#includeは少ない方がいいんですか 暗黙的に#includeされるヘッダファイルは#includeした方がいいんでしょうか
他のプロジェクトで使いたかったりしたときに includeがいっぱいあるとめんどくさかったり
>>38 template< class T, int N > class Arg
{
public:
Arg( T val, ... )
{
this->array_[ 0 ] = val;
va_list list;
va_start( list, val );
for( int i = 1; i < N; ++ i )
{
this->array_[ i ] = va_arg( list, T );
}
va_end( list );
}
operator T*(){ return this->array_; }
private:
T array_[ N ];
};
hoge( Arg<int,5>(0,1,2,3,4) );
これでいいだろ
43 :
40 :2010/07/22(木) 21:26:49
>>41 ちなみに、これはどうなったのでしょうか
>暗黙的に#includeされるヘッダファイルは#includeした方がいいんでしょうか
いやいや使うなよ
>>40 利用するライブラリ(API)のドキュメントに必要なヘッダーの一覧が書いてある。
必要なものだけインクルードすれば良い。不要なものはインクルードする必要は無い。
47 :
40 :2010/07/22(木) 22:16:25
すみません、 Media Foundationや、DirectX Video Accelarationの質問、話題は どのスレでなされているでしょうか?
DirectXのスレやWin32API等のスレの方が 少なくとも、C/C++のスレよりは適切なはず。
50 :
48 :2010/07/22(木) 23:26:41
51 :
デフォルトの名無しさん :2010/07/23(金) 11:37:24
VC2008では何の問題もなく通るコードがg++3.4.5 (mingw-vista special r3)では通りません. 構造体を外に出せばコンパイル出来るのですが内部においたままなんとかできないものでしょうか? innner_struct.cpp: In function `int main()': innner_struct.cpp:9: error: no matching function for call to `sort(int[10], int*, main()::cmp)' #include <algorithm> #include <iostream> int main() { struct cmp { bool operator()(int a, int b) { return a < b; } }; int a[10] = { 3,1,4,1,5,9,2,6,5,3 }; std::sort(a, a+10, cmp()); for ( int i=0; i<10; i++ ) std::cout << ' ' << a[i]; };
関数内で定義したクラスはテンプレートの引数に出来ないんだってさ。 VCは出来るように拡張してるっぽい。
53 :
51 :2010/07/23(金) 21:58:23
>>52 抜け道があるのかと期待したんですが・・・
ありがとうございます
std::stringを戻す関数でchar *が戻せるのは何故ですか?
例えばどんな関数よ
>>54 std::string(const char *); というコンストラクタによって
暗黙の型変換が行われるから。
ただし、あくまで「stringに(暗黙的に)変換できる」だけであって
「char*を返す」わけではない。
rand関数を初期化すると,次のコンパイルで初期化を行わない場合,先ほど初期化した際の値が出るのですか?
runするたびに同じ順序が得られる。シミュレーションを再実行するとき便利だね。
ありがとうございます
C言語で、n次元(nは2〜5)配列を操作する関数が作りたいのですが、 引数は新しい配列dst、もとの配列src、各次元の要素数が格納された一次元n要素の配列numElem を考えています。例えばsrc[a][b][c]ならnumElem[3]={a,b,c}といった感じです。 関数内で渡されたsrc配列の要素数を知るために(sizeof numElem)/(sizeof numElem[0]) としたのですが、下記の設定でsizeof numElemが12を期待しているのに8になってしまいます。 なにが間違っているのでしょうか? #include <stdio.h> void arrayConv(double *dst, const double *src, const int *numElem); int main(void){ double *src,*dst; int numElem[3]={2,3,4}; arrayConv(dst,src,numElem); } void arrayConv(double *dst, const double *src, const int *numElem){ int num; num=(sizeof numElem)/(sizeof numElem[0]); printf("%d\t%d\t%d\n",num,sizeof numElem,numElem[0]); switch(num){ case 2: break; case 3: break; } }
arrayConv内のnumElemはポインタ。 だから、sizeofの結果はポインタのサイズだ。
62 :
60 :2010/07/24(土) 17:04:03
>>61 こんがらがってきました
numElemからは配列の大きさは得られないのでしょうか
int numElem[3]={2,3,4}; sizeof numElem; // これは配列のサイズ取れる const int *numElem; sizeof numElem; // これはポインタのサイズ
65 :
60 :2010/07/24(土) 17:34:12
>>63 たしかに関数の外では普通にサイズ12が出力されました。うーん?
>>64 6.21:
なぜサブルーチンの引数として渡された配列の大きさをsizeof()でき ちんと計算できないのか。
A:
コンパイラーは配列仮引数がポインターと宣言されたように振る舞い (質問6.4参照)、sizeof()はポインターの大きさを返す。
引数にした瞬間に配列はポインタになっちゃって、ただの先頭アドレスと型の情報で、
要素数情報がないために関数内で要素数を得ることはできないということでしょうか
class Class { const int i; const char *c; public: Class(); }; Class::Class() { i = 1234; // NG c = "ok"; } なぜintは駄目なんですか?
Class::Class() : i(1234), c("ok") {} constはこうして初期化しないとだめ、代入は出来ない。 charの方は const char* const c; こういうふうに書き直せ。
ほんと汚物言語ですね
汚物ではなくてプログラミングのうっかりミスを極力予め防止してんだよ Cだとやってしまうような
>>53 g++ 4.5.0で試してみたら通った。
long long intの変数xをint型の変数a,bに分けて保存した後、再びlong long int型の変数yに入れたい。
x -> a,bは
a = x&0xffffffff;
b = x
>>32 ;
って分かるけど
a,b -> yはどうやればいいの?
y = b, y <<= 32, y |= a;
なるほど ありがとう!
あっそ
一貫性が無いよね
ロマンがあるわけよロマンが
男のロマンといったらドリル兵器と自爆装置だ
乱数の取得にはsrandとrandを使った方がいんですか?(c++)
普通はそれでいいけど、boostにも乱数あるからよろしくな!
このソースに自爆装置を仕込んだのは誰だぁ!!!
くだらなすぎてスマソ >unsigned char *userKey = "key"; >AES_KEY aesKey; >AES_set_encrypt_key(userKey, 128, &aesKey); >error: invalid conversion from ‘const char*’ to ‘unsigned char*’ なんで、コンパイラに怒られるの? コンパイラ怖い
const charとunsignec charに互換性があってもconst char *とunsigned char *はそうでないとされているから
unsignedつけなければコンパイル通るでしょ
>>86 今度はきっとAES_set_encrypt_keyの第3引数がunsigned char *だな
const unsigned char []で乗り切れ
メルセンヌツイスターはもう古い
int a = 5; int b = a * 1024 * 1024; このとき1024 * 1024はコンパイル時に計算されますか?
>>91 やはりそのような感じですか・・・ありがとうございます
>>92 アセンブラコードを見るのが普通と思うが
const int a;にした上で
C++でとにかくコンパイル時に計算されればいいってんならテンプレートでやりよう自体はあるが
現実的にはその程度の定数畳みこみを行わないコンパイラを探すのは困難。
>>94 だけど規格ではそれは定められていないよね?
ふむふむ・・参考になります とりあえず、 int a = 1024 * 1024; int b = a * 1024 * 1024; は ; Line 10 mov DWORD PTR _a$[ebp], 1048576 ; 00100000H ; Line 11 mov eax, DWORD PTR _a$[ebp] shl eax, 10 ; 0000000aH shl eax, 10 ; 0000000aH mov DWORD PTR _b$[ebp], eax こうなりました とりあえずコードによっても環境によってもかわるみたいですね。。
97 :
96 :2010/07/27(火) 10:35:49
あ、環境かかなければだめでした visual C++ 2010 Express です
>>94 はぁ?
計算の順序を勝手に入れ替えることの意味わかってないんじゃない?
値によっては回り込みが起きて、全く違う答えになるんだよ。
まともなコンパイラならこういう最適化を行わないか、
オプションの切り替えで制御するのが普通。
値が変わるような順序変更を行うコンパイラがまともに構文解析できるとは思えないが
>>98 どこの星の普通かしらないけど
たとえばgccならなんてオプション?
自分の使ってるコンパイラでもいいぞ
101 :
デフォルトの名無しさん :2010/07/27(火) 12:31:03
>>98 > 計算の順序を勝手に入れ替えることの意味わかってないんじゃない?
> 値によっては回り込みが起きて、全く違う答えになるんだよ。
int b = a * 1024 * 1024;
これで畳みこみを行った場合と行わなかった場合で結果が異なるaの値を具体的に示してから、
言いがかり付けるんだな。
102 :
デフォルトの名無しさん :2010/07/27(火) 12:45:40
>>98 > まともなコンパイラならこういう最適化を行わないか、
> オプションの切り替えで制御するのが普通。
gccってまともなコンパイラじゃなかったのか。www
$ gcc -v
gcc version 4.2.1
$ cat 92.c
void f()
{
int a = 5;
int b = a * 1024 * 1024;
}
$ gcc -O0 -S 92.c
.globl f
.type f, @function
f:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $5, -8(%rbp)
movl -8(%rbp), %eax
sall $20, %eax
movl %eax, -4(%rbp)
leave
ret
変えたら結果がが変わるかは知らんが その検証するのに-O0ってのはどうなのよ・・・・
「デフォルトで最適化してるんだろ」という言いがかりを封じるためだよ。頭悪いぞ。 -O0 Do not optimize. This is the default.
ところで テンプレートでどうにかする方法ってどんなのなん?
106 :
デフォルトの名無しさん :2010/07/27(火) 14:44:46
それより
>>98 > 計算の順序を勝手に入れ替えることの意味わかってないんじゃない?
> 値によっては回り込みが起きて、全く違う答えになるんだよ。
この実例まだ〜〜〜?
>>106 a が double で 1024 がもっと大きな数だとまずいんじゃない?
そのときも同じように最適化が起きるんだったらコンパイラとしては問題あるよね。
そんな三分で考えたような脆弱性に対応できてないコンパイラとか産廃だろ
>>108 gcc ってまともなコンパイラじゃなかったんですねw
gccなんか要らん
c言語にはelseif(スペースなし)がありませんが、 #define elseif else if とやってelseifを使うと何か問題ありますか?
112 :
デフォルトの名無しさん :2010/07/27(火) 17:17:35
>>107 池沼なのにPGやってるお前の方がよっぽど問題あるわ。www
>>111 問題ない。
まぁ厳密にはインデントが変わってくるが、動作には影響しない。
つか else if と書いても elseif のようにインデントしてる人が多いわな。
>>112 この人は何に対して切れてるんだろうw
>>111 しいて言えば、エディタが色を変えてくれない
else if でも elseif でも黒色だけど・・・
#define elseif else if こんなことは絶対にするな。絶対だぞ。 defineなんてifdef用以外に使うな。
なかなか低機能なエディタを使っているようだな・・・ そういうのも嫌いじゃないが 苦労は買ってでもしろと言うしな
>>116 #define for if(0) else for
さすがにもうVC6は無いだろうと思いたい
VC6使ってる奴って本当に馬鹿なんだろうな
>>111 一人でやってるなら問題ないけど、バカっぽく見えるからやめたほうが
いい。
開発をしている時間のうちキーボードを打つ時間の割合なんてそんなに
多くないのだから、タイプ数を減らすだけの工夫は無駄。
お前らまさかマクロとか使ってないよな?
123 :
デフォルトの名無しさん :2010/07/28(水) 00:41:13
使うだろ普通
どんなマクロよ
MAKEWORDとかRGBとか
inline関数じゃだめなんか
C++の場合 複数環境対応とデバックマクロで使用する Cの場合は定数等含めて結構マクロは使用する
定数マクロ使ってる奴ってキチガイだろ
>>121 タイプを減らすためでなく、インデントの問題だろ。
else if ごとに一段下げたりしたくないだろ。
けど、構文的には下げるのが正しいんだから。
これは俺も気持ち悪い。
構文的にインデントの正解などない。だから流儀が複数ある。 elseとifの間に{なし、改行すらなし。これで一段下げなんて普通しない。
>>130 それは else if を elseif とみなしてインデントをつけているに他ならない。
else ifってelse { if〜〜 } の略系だったのか オラ初めて気づいたぞ
if () else if () ←これが出来なくなるじゃん else
>>131 それで問題ないのだからelseifいらね
>>135 それは
if () {
} else { if ()
else
}
と書いたのと同じ。コンパイラはそう解釈してるんだよ。
if() や else の次にくるのは、一つの文かまたは { } で囲まれた一つのブロックなんだよ。
if (a < 0) b = 0; else if (a < 10) b = 1; else if (a < 20) b = 2; else b = -1; と書くのは間違いで、(もちろん動作は問題ない) 構文に即した厳密なインデントなら if (a < 0) b = 0; else if (a < 10) b = 1; else if (a < 20) b = 2; else b = -1; が正しいということか。。。
そういうこと
どういうこと
つまりelse ifは現代的なコンパイラにおいては[else if]で解釈されているということ
>>142 少なくとも else if を elseif と見なすようなことはしてないよ。
つまり if 文の入れ子として処理している。それは昔も今も同じ。
switchは?
>>144 もちろん switch は入れ子でなく対等な分岐
順番があるので対等ではない。
あれは単なるラベル。
148 :
84 :2010/07/28(水) 20:16:51
149 :
84 :2010/07/28(水) 21:38:41
#include <openssl/aes.h> int main() { const unsigned char userKey[] = "key"; AES_KEY key; AES_set_encrypt_key(userKey, 256, &key); return 0; } よくわからない、スマソ
>>149 const unsigned char* userKey = (const unsigned char*)"key";
MicroSoft FlightSimulator Xのアドオン開発のスレって立ったことある? やはり、あまり需要ないのだろうか? 或いは、ゲームのアドオン開発に関するスレがあれば誘導お願いします
152 :
151 :2010/07/29(木) 11:00:51
すみません、フライトシム板にて発見しました。 スレ汚しゴメン
for文の中でリテラルな何かが登場したら無駄な負担になるんですか?
>>153 それなりのところではそれなりにそうなる
>>155 クラスが消えるときに勝手に呼ばれる関数だからだよ
>>156 やっぱりそうなんだ!ありがとう!早い回答で助かった
>>89 メルセンヌツイスターは確かに古いが、
越えるものは出てきたっけ?
eclipse CDTのスレってなくなっちゃったの? もう誰も使ってないのかしら。
vectorのメモリ消費量についてですが、 vector<int>とやるとintは4bytesなので、 4bytes x サイズ分のメモリを使うと思っていたのですが、 実際は、8bytes x サイズ分、つまり倍 使っているように見えます。 サイズはそのままで、消費を4bytes分相当にする方法はないでしょうか。 環境はlinux g++ 4.4です。
配列つかえ
>>164 そうですか?
valgrind下で走らせてalloc,free値を見たのですが、見方が違うのか
使う前にresize(1)とかやればいいんじゃないの?
167 :
84 :2010/07/29(木) 21:49:09
>>150 レスありがとうございます
>main.c::-1: error: undefined reference to `AES_set_encrypt_key'
やっぱり、怒られます
もしかして、gccの設定が悪いのかもしれませんorz
配列とポインタは全然別なものってことでおk? でも、配列Array[]をArrayと書くと、Array[0]のアドレスが返ってくるだけってことだよね
169 :
デフォルトの名無しさん :2010/07/29(木) 22:23:22
ok
170 :
168 :2010/07/29(木) 22:35:00
ng
>>168 ぜんぜん違うけど密接に関わるものってことかな
int Array[10];
int* p = Array;
p[3] = 100;//添え字アクセス
*p = 200;//ポインタを使ってアクセス
*(p + 3) = 300;//ポインタ演算でのアクセス
こんな風に使える
使えるというだけで別なもの
173 :
168 :2010/07/29(木) 23:00:18
>>172 つまりはアクセスできるってだけのことなのね
詰んでいて質問です、緊急でお願いします。 boostのスマートポインタにインターフェイスのhogeObject(純粋仮想関数:void func01() )が入っていて hogeObjectを継承してhogeクラスがあって、そこのメンバ関数(void func02() )を呼び出したいのだけれども 当然インターフェイスでfunc02を定義してないので呼び出せない。 無理矢理hogeにダウンキャストをすれば呼び出せると思ったのだけど、どうにもコンパイルが通らないです。 この場合、どうやってスマートポインタ内のhogeObjectからhogeクラスのfunc02を呼び出せますか? 因みにプログラムの都合上、hogeObjectの純粋仮想関数を増やすことは出来ないです。 誰か教えてください。
同じもんだよ ただ、利便性のために若干仕様が分けられてる []ってのは単純にp+1とかをオーバーロードしてるだけだし
ダウンキャストしてる部分を晒せよ
hoge* se = NULL; // コアをチェック ObjectContiner::iterator itr = mObjectContiner[OTHER].begin(); for( ; itr != mObjectContiner[OTHER].end() ; ++itr ) { if( (*itr)->getData().Attribute == DP_IDEND ) { // ここでC2682 shared_ptr からhoge*に変換出来ない。 se = dynamic_cast<hoge*>( (*itr) ); } } こんな感じです。 std::listの中にhogeObjectのスマートポインタがが入ってます
>>177 です。
申し訳無いです、自己解決しました。
se = dynamic_cast<SwordEnemy*>( (*itr).get() );
として動作しました。
関数を見落としていました。
お騒がせしました
itr->get() で
VC++2010使ってるんですがデバッグして出たソフトを終了すると Alloc memory dump Total size:0(0.000kb) Alloc num:0 みたいなものが出ます。これは何を表しているのでしょうか? Alloc memory dumpでggってみましたが出るのはエラー相談の掲示板ばかりで・・・
181 :
デフォルトの名無しさん :2010/08/01(日) 14:01:32
#include <stdio.h> #include <conip.h> #include <stdlib.h> #include <windows.h> int main(int argc,char *argv[]){unsigned int count = 0;unsigned int i;char **list; if((list = malloc(100*1024)) == NULL){return 1;} while(1){ for(i = 1023;i > 0;i--){if((list[count] = malloc(1024)) != NULL){count++;}else{ break;}} if(i != 0)break;if(count > 100000)break;Sleep(1); } putchar('\n');count--;printf("Count:%d\n",count); for(i=0;i < count;i++){ int j; for(j = 0;j < 1024;j++){list[i][j] = 'A' + i%26;}printf("%X ",list[i]); } printf("\nExit:");return 0; } なんか落ちる…
listが100KiBしか確保されてないのにcount最大値100000要素×4バイト=400KBまで使おうとするからじゃないかと思います
>>180 VSスレに書き込めよ
ちなみにそれはメモリリークが存在しないことを表してる 至って正常ということ
やっぱり、いくら考えてもわからん(c++) #include <openssl/aes.h> int main() { unsigned char user_key[16] = "123456"; AES_KEY key; AES_set_encrypt_key(user_key, 128, &key); return 0; } >main.c::-1: error: undefined reference to `AES_set_encrypt_key' >:-1: error: collect2: ld はステータス 1 で終了しました
ちゃんとリンクさせてるか?
186 :
184 :2010/08/01(日) 22:53:44
>>185 IDEに頼り切っていたので、やり方がわかりません
gcc v4.4.3、opensslは/usr/includeにあります
ごめんなさい
math.hだったら -lm ってオプションいるだろ?(最近は無くてもいけるけど)そういうことだ それの名前がわからん でも/usr/libにはあるはず もしくはそのライブラリの説明どっかにないのか
たぶん -lssl か -lopenssl か `pkgconfig --libs ssl` か `pkgconfig --libs openssl` のどれかでいけるんじゃないかな
189 :
デフォルトの名無しさん :2010/08/01(日) 23:03:35
エディットボックスの読み取り専用にして文字出力して、画面サイズ 可変可能でサイズを小さくした時、例ですが"○○ a"という文字を普通に 出力する時はいいのですが、段を分けて出力する時 ○○このようにスペース空けてaを出力すると思ったのですが実際は a ○○このようにスペース空けずにaを出力してしまいました。 a charをメンバ変数CString型にコピーして出力しますが、ずれずに出力 するか、ずれたデータをchar形にコピーする方法は有りますか?
190 :
デフォルトの名無しさん :2010/08/01(日) 23:08:03
189の上か5行目スペース入れたのに入りませんでした。
189-190 自己解決しますた。
>>189-190 恐らく>191は他人でしょうから、あなたのお使いの開発環境を明らかにした上で
該当スレに書き込むか、エスパースレにどうぞ。
193 :
184 :2010/08/02(月) 22:01:16
194 :
184 :2010/08/02(月) 22:57:02
>>188 -lsslをつけたらコンパイルする事ができました
ありがとうございます
ところで、何故そのようなオプションをつけないと、コンパイルできないんですか?
-lsslってオプションはgccにデフォルトでは存在しないと思うのですが
戯言はgccのマニュアル見てから言いなさい。
>>183 コンパイラーによって表示されるものなのかどうかわからなかったもので・・・
問題ないんですね。ありがとうございました
-l と ssl で -lssl
構造体のメンバの配列の要素数をコンパイル時以降に決定したいのですが、どのようにしたら良いのでしょうか。 ----------------- FortranからCの関数を呼ぶときに、FortranのFortran の名前付き COMMON は、大域的構造体を使用して C の中で代替できるそうです。 Fortranのソースに integer, parameter:: N=10 real(4):: x(N), y(N), z(N) COMMON /VEC/ x,y,z Cのソースの一番外側に extern struct vec { float x1[10]; float y1[10]; float z1[10]; } vec_; と書くと、確かにCでvec_.x1[0]でFortranの x(1)にアクセスできました。 この要素数10をC言語側では動的に(?)決めたいのですが、どのように記述すれば良いのでしょうか。 よろしくおねがいします。
200 :
デフォルトの名無しさん :2010/08/04(水) 00:32:17
>>199 メモリの動的確保でやるなら
struct vec {
float* x1;
float* y1;
float* z1;
};
struct vec* NewVec(int n){
size_t sz = sizeof(struct vec) + sizeof(float) * 3 * n;
struct vec* v = (struct vec*)malloc(sz); // キャストのツッコミはなしで
v->x1 = v + 1;
v->y1 = v->x1 + n;
v->z1 = v->y1 + n;
return v;
}
〜
struct vec* v = NewVec(10); でベクトル作成
v->x1[0] = 1.0; または (*v).x1[0] = 1.0; でアクセス
free(v); で後始末
まずいんじゃね?FORTRANのCOMMON変数が確保されるのは スタック上だとしてヒープ領域と一緒にしていいのか
202 :
デフォルトの名無しさん :2010/08/04(水) 07:48:13
DWORDの0Lって何のことですか?longをtypedfしたようなのは見たのですがわかりません それと、ファイルから読み取って変数に入れていくようなプログラムで NULLで初期化?できるような構造体にNULLを入れたいのですがどうすれば良いのでしょうか?もしかしてイント型の0でできる?ちなみにfscanfとかfget系の処理の仕方しかわかりません。よろしくお願いします
={0};
204 :
デフォルトの名無しさん :2010/08/04(水) 08:03:40
{}ってどういう意味ですか?
つまり構造体の値について記述しています
>>199 ・COMMONの大きさは動的に代えられないからだめ。
・ポインターが使える処理系もある。
Fortranスレに行きなさい。
さすがにそのレベルの質問は無いわ… チュートリアルからやり直して下さい
自演乙
天下のついったーがこんな場末の掲示板で自演宣伝するわけないじゃない。バカ?
某スレで煽られて 顔真っ赤の涙目になっちゃって悔し紛れにコピペした臭い
____ / / \\ . / (;;..゜);lll(;;..゜)\ このガキャあああああああ / ⌒(__人__)⌒ \ ナメてんのかああああfさdkjh;flsだhf | ノ( |r┬- | u | ________ \ ⌒ |r l | / .| | | ノ u `ー' \ | | | 真剣に聞いてんのに /´ .| | | 煽ってんじじゃねええええ | l プルプル u | | | ヽ u -一ー_~、⌒)^),-、 | |________| ヽ ____,ノγ⌒ヽ)ニニ-___| | |____
213 :
199 :2010/08/04(水) 10:35:05
>>200 ありがとうございます。やってみます。
>>201 Cで構造体で代替しようという考え自体がまずいということでしょうか?
>>206 COMMONの方は大きさがコンパイル時に決定しています。
Cの方はコンパイルに少し特殊な環境が必要なので一度コンパイルしたら使い回したいという考えです。
もともとあるFortranのプログラムをいじってCの関数を呼び出して使うようにしたいのですが
C側で使う変数が多くて引数にするの大変です。 元々COMMON文が多用されていたので
Cに持ってきて使えたらなぁ、と思い調べました。
>>213 つまり、Fortran側で確保している領域にCからアクセスしたいという事だね。
>>206 は忘れてくれ。
> Cの方はコンパイルに少し特殊な環境が必要なので一度コンパイルしたら使い回したいという考えです。
オブジェクトを使いまわすという事? リンクは必要だよ。
extern float vec_;
struct vec {
float* x1;
float* y1;
float* z1;
} vec;
void initialize(int n)
{
vec.x1 = &vec_
vec.y1 = &vec_ + n;
vec.z1 = &vec_ + n*2;
}
>>213 FORTRANの呼び出され側の関数がCOMMON引数をどのように受け取るように
なっているかが問題
普通連続したメモリ領域が必要なんじゃないのか?
Cのポインタなんか使ったらあっちこっちにアドレスが飛んでだめだと思うが
216 :
デフォルトの名無しさん :2010/08/04(水) 10:57:25
構造体の中に不確定な配列のメンバを持ちたいのですがどうすれば良いですか? イメージとしてはこんな感じです struct hoge{ int a; char b[a]; };
>>216 struct hoge {
int a;
char b[1];
}
struct data *dp;
dp = malloc(sizeof(hoge) + datalen); <-可変長のデータ長を足して確保
汚いテクニックでしかも規格では未定義の動作とされているが
よく使われる
218 :
デフォルトの名無しさん :2010/08/04(水) 11:03:01
C99ならflexible array memberを使えばいい。 struct hoge{ int a; char b[]; };
220 :
デフォルトの名無しさん :2010/08/04(水) 11:19:23
VC2008EEです
VC2008ならgccと同じくchar b[0];が使える。
VC2008はC99に対応してないと聞いていたが、flexible array memberは使えるようだ。
223 :
デフォルトの名無しさん :2010/08/04(水) 11:34:14
>>221 どういうことでしょうか?普通にメンバにchar[]を入れるとstruct 'hoge" にサイズが 0 の配列があります。というエラーがでます
少しググってみたのですがcharは最後の要素ではなくてchar c[a];char d[a];も実はありまして…
char b[1]の方もやってみると
ho = malloc(sizeof(hoge) + sizeof(a)*3);
void *' から 'hoge *'に変換できません とエラーが出ます。どうすれば良いのでしょうか?
>>223 hogeなんて構造体が無いからだろ。バカか。
struct hogeとhogeの区別もつかないのか。市ねよ。
225 :
199 :2010/08/04(水) 11:40:31
>>214 その方法でできました。ありがとうございます!
>つまり、Fortran側で確保している領域にCからアクセスしたいという事だね。
そうです!ついでにC側でその領域の値の書き換えも行いたいと。
リンクは仕方ないんで毎回やります。。Fortran側はNの値を毎回書き換えてコンパイルする仕組みのようなので。
>>215 どうなんでしょう。とりあえずはできたので
実際の大きいプログラムで試してみます。
226 :
デフォルトの名無しさん :2010/08/04(水) 11:46:52
>>224 ちょwひどすぎwww
struct hogeとhogeの違いって何のこと言ってるかわかりません…
struct hoge {
int a;
char b[1];
}
struct hoge *dp;
dp = malloc(sizeof(hoge) + a*3); <-可変長のデータ長を足して確保
どこがおかしいのでしょう?
>>223 #include <stdlib.h>
struct a {
int a;
char b[];
};
struct a *aaa(int l)
{
return malloc(sizeof(struct a) + l);
}
これを
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
で、コンパイルするとエラー出ないけど。
> char c[a];char d[a];も実はありまして…
複数は無理。似たような事をやるなら
struct hoge {
int a;
char *b;
char *c;
char *d;
char data_[];
};
でb,c,dにdata_から切り出して与える。
b,c,dを使わず、マクロで直接data_にアクセスさせる方法もある。
228 :
デフォルトの名無しさん :2010/08/04(水) 11:51:12
>>226 ×
dp = malloc(sizeof(hoge) + a*3);
○
dp = malloc(sizeof(struct hoge) + a*3);
ってことだろ
>>224 の言い方はヒドいが、知っとけよとは思うな
>>225 Cではポインタと配列は字面上、概ね同等だから
>>214 で動くけど、
struct vec {
float x1[10];
float y1[10];
float z1[10];
};
と
struct vec {
float* x1;
float* y1;
float* z1;
} vec;
は、メモリ上の配置は全然違うという事は知っておくといい。
231 :
デフォルトの名無しさん :2010/08/04(水) 12:07:58
>>229 すいません
そうしてもerror C2440: '=' : 'void *' から 'hoge *' に変換できません。と出ます
dp = malloc(sizeof(struct hoge) + dp->a*1);どこがおかしいのでしょうか?
232 :
デフォルトの名無しさん :2010/08/04(水) 12:17:19
グローバル位置でdp = malloc(sizeof(struct hoge) + dp->a*1)をしてみましたが C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2040: 'dp': 'int []' は 'hoge *' と間接操作のレベルが異なります。 error C2440: '初期化中' : 'void *' から 'int []' に変換できません。 と出ます
>>232 そのエラーメッセージはBCCじゃないのか?
BCCは可変長配列は使えないぞ
234 :
デフォルトの名無しさん :2010/08/04(水) 12:28:35
>>233 VC++2008EEです
どうでしょうか?
struct hoge{
int a;
char b[a],c[a],d[a];
};やりたいことはこういうことです
struct hoge{
int a;
char b[1],c[1],d[1];
char e[1];
};
struct hoge *dp;
関数中でdp = malloc(sizeof(struct hoge) + dp->a*sizeof(char));
error C2440: '=' : 'void *' から 'hoge *'
どこがおかしいでしょうか?
C++でコンパイルしているだろ。拡張子を.cにしろ。
236 :
デフォルトの名無しさん :2010/08/04(水) 13:16:31
vector<char>にしたら通ったのですがこれってできてますか?
>>234 dp = (hoge *)malloce( );
キャスト変えてみろ
無駄なeが入ったw
239 :
デフォルトの名無しさん :2010/08/04(水) 13:29:44
>>229 バカ
void *' から 'hoge *'に変換できませんっていってるのに・・・
×
dp = malloc(sizeof(hoge) + a*3);
○
dp = (struct hoge*)malloc(sizeof(struct hoge) + a*3);
.cが全てだと思うなよ
240 :
デフォルトの名無しさん :2010/08/04(水) 13:30:31
>>237 もう消したから戻るのメンドくさい…
int a;
std::vector<char> b,c,d;
for(int i=0;i<a;i++){b.push_back();}
でできてませんか?
それがありならnew deleteとかでもできるだろwww 勝手にしろ
イテレーター使えボケ
243 :
デフォルトの名無しさん :2010/08/04(水) 13:33:28
できてますか? vector使ってるからより重くなってるとか、メモリ食ってるとかありませんか?
いったい何がしたいのかさっぱり分からん。 もうstring使えばいいじゃん。
245 :
デフォルトの名無しさん :2010/08/04(水) 13:46:02
したいことは struct hoge{ int a; char b[a];←ここ } です struct hoge do[d];みたいに何個も作って値を入れて行った時にそれぞれのaの値とbの配列の要素数がリンクしてるってことです こうするとできないので一番無駄の無いやり方が知りたいのです
したいことがあるからそれを書きたいだけで、それが最終的にしたいことじゃないだろう?
247 :
デフォルトの名無しさん :2010/08/04(水) 18:06:56
struct KATA{std:vector<float> A;}; struct KATA hoge; struct KATA temp; temp.A.push_back(0.0); temp.A[0] = 1; memcpy(&hoge,&temp,sizeof(struct KATA)); temp.A[0] = 0; hoge.A.push_back(temp.A[0]);←多分ここで hoge.A[0]とhoge.A[1]が0になってしまうのですがなぜでしょうか? hoge.A[0]には1、hoge.A[1]には0を入れたいです
>memcpy(&hoge,&temp,sizeof(struct KATA)); vectorにこういうキチガイじみた事はやめろ やるならstd::copyでも使え
vectorのことを知るときにコピーの仕方ぐらい一緒に覚えればいいのに
coutからcharの値を16進数で表示するにはどうやりますか?
using namespace std; int main() { unsigned long x = 64206; cout << x << " in base 8 is \"" << oct << x << "\"" << " and in base 16 is \"" << hex << x << "\"" << endl; return 0; }
なるほど、そのように技巧を凝らさないと出来ないわけですかwwwwww
LinuxやMacでもマルチバイト文字セットでのプログラミングが主流なの?
ガスライティング
あるdouble型の変数をcoutすると、 1.5*e+005 と出力されるのですが、これは 1.5*exp(5) と同じ意味でしょうか?
256 :
デフォルトの名無しさん :2010/08/06(金) 23:19:28
お世話になります 8bit/channel色構造体の配列color[i]が、純赤色かどうかを判別するif文を書きました if(color[i].alpha==0xFF&&color[i].red==0xFF&&color[i].blue==0x00&&color[i].green==0x00) これは正しく動きました しかしコードが長ったらしく、しかも何度も書かねばならないことになり、以下のマクロを使い簡略化を計ったのですが #define ISPRED8(COLOR) COLOR.alpha==0xFF&&COLOR.red==0xFF&&COLOR.blue==0x00&&COLOR.green=0x00 if(ISPRED8(color[i])) 左オペランドがうんぬんとコンパイラに怒られてしまいます 適当に()付けた後、通してみましたが、trueが欲しいところでfalseが帰ってきてしまいます かなり単純なところで躓いた分、何がいけないのか分かりかねます 何がいけないのでしょうか・・・?
>>255 1.5*e+005は1.5*10^5すなわち150000のことかと思います
1.5*exp(5)は1.5*e^5でありeが約2.72程度の無理数であるのでその二つは別物かと思います
258 :
デフォルトの名無しさん :2010/08/07(土) 00:48:40
259 :
デフォルトの名無しさん :2010/08/07(土) 00:51:43
ついでに #define FOO(n) n*2 FOO(1 + 2) --> 1 + 2*2 // 1 + 4 = 5 みたいなことがないように #define FOO(n) (n*2) でくくっとけ
>>258 うわ・・・ほんとだ・・・・これはひどい・・・ちょっと凹んできます
>>259 ご指摘ありがとうございます
今回使い方が限定的だったので気にしていなかったのですが習慣づけたほうがよいですよね
ありがとうございました、こんなオチで申し訳ありません
define使うな
分かりにくいよね。なんで10^nにeが選ばれたのか分からない
exponential
>>259 #define FOO(n) ((n) * 2)
exponential だから e = 2.718281828
ネイピア数ってどういう意味なん? ティッシュのネピアとも違うしな
268 :
デフォルトの名無しさん :2010/08/07(土) 19:19:34
素人です ポインタを使う判断基準がわかりません どういう時にポインタを使ったほうが良いとわかるのでしょうか?
構造体、クラス、配列を関数の引数として渡すとき
そのまま渡せばいいじゃんwww 馬鹿かおまえwww
271 :
デフォルトの名無しさん :2010/08/07(土) 19:39:29
ムーブセマンティクスが使われるようになると、ポインタを使う機会って減ってくんだろうなあ
>g++とgccの違いはデフォルトでC++のファイルとして扱うか >というところが違うだけだったはずです。 結局違いって何よ?
274 :
デフォルトの名無しさん :2010/08/07(土) 21:11:54
struct XXX { char name[10]; char address[30]; }; std::vector< XXX* > v; もう一つ完璧に初期化されたXXX型zを用意してpush_back(z) とする方法以外にpush_backで使える領域を確保することはできますか?
vector::reserve
276 :
デフォルトの名無しさん :2010/08/07(土) 21:31:11
>>273 g++はgccにc++オプションをつけたアライアス
277 :
デフォルトの名無しさん :2010/08/07(土) 21:37:45
>>275 reserveは確か値が入ってないので直で使えませんよね?
その後strcpyの第一引数にvのメンバを入れるとエラーがでるのです
よくわからんが v.push_back(new V); こうしろよ。 そもそも std::vector< XXX > v; でいいだろ。
v.push_back(new XXX);だ
280 :
デフォルトの名無しさん :2010/08/07(土) 21:44:01
>>278 ありがとうございます
なぜstd::vector< XXX* > v;
にするとstrcpyでエラーが出るのでしょうか?
281 :
デフォルトの名無しさん :2010/08/07(土) 21:49:53
しかもできませんでした 1 番目の引数を 'XXX *' から 'XXX &' に変換できません。 となります
>>280 XXX*はポインタだろ。ポイント先を示してやらないとそりゃエラーになるわな。
後、vectorにnewしてつっこんだリソースは自動的に解放されないから。
ポリモーフィズム的に振る舞う予定が無ければXXXにしとけ。
283 :
デフォルトの名無しさん :2010/08/07(土) 21:53:37
std::vector< XXX* > v; の時ですね。できました なぜstd::vector< XXX >ならnewでできないのにstd::vector< XXX* >ならnewで上手く行くか理解できません。説明よろしくお願いします
>>283 てめぇ、ちょっとは自分で考えろw
XXXとXXX*じゃ型が違うだろう。
struct XXX hoge = new XXXなんてしないだろ?
struct XXX* hoge = new XXXだし。
285 :
デフォルトの名無しさん :2010/08/07(土) 21:59:00
>>284 ありがとうございます
下をしたことが無かったので全く思いつきませんでした
全て繋がったような気がします。ありがとうございました
XXXって放送禁止用語の意味だぞ 外人がこのスレ見たら笑うだろうな
見たらな
>>287 日本人だって仮変数名にunkoとかchinkoとか書くだろ?
あいつらもXXXどころかfuck,dickとか平気で使うぞ。
ねーよw
ass,boob,cock,dickだっけ?e以降は覚えて無いけど
「猫でもわかるプログラム」サイトでWindows SDKについて解説された頁があります。 ここで使われているの「C」言語だと思うのですが、「C++」で同様な事を解説しているサイトないでしょうか?
同じだよ
294 :
デフォルトの名無しさん :2010/08/08(日) 00:00:08
quicktime sdk for windows の勉強ができる良サイト教えてくれませんか?
C言語ではmallocで構造体の領域の確保をしていました、 C++の場合はnewで構造体の領域を確保しても大丈夫なんですか
大丈夫です。というかnew/deleteが推奨です。
297 :
295 :2010/08/08(日) 10:46:21
そんなもの推奨してません。 make_sharedを使ってください。
299 :
デフォルトの名無しさん :2010/08/08(日) 12:43:43
勉強を始めてまだ日がたってないとわかる。 それなのに、boostをすすめる上に、背景も言わない。 もう少し、丁寧に答えてあげなよ。 答えてあげることはいいと思うけどね。 それに、いつ削除するか決まっててわかっているならmake_shared使う必要ないよ。 C++0xの完成も2012年とまだまだ先の話だし。 いろんな方法がある。適材適所で機能を使うことが大切。 それは、日本語でも同じ。
shared_ptrにすれば大丈夫とか幻想だから
どういうミスやらかすとまずかったりしますかね? 循環参照はまずいものの見つける方法は用意されてるみたいですが
scoped_ptrのみでがんばる
c/c++って勉強しても、最近の言語とは違って なかなか書けるようにならないね
>>301 どんな些細なミスでも容赦なく派遣切りさせていただきますのでご了承ください。
char array1[] = "array"; char "array2 = "array"; array1 = array2; これができないのは、array1のアドレスがconstだからですか?
307 :
305 :2010/08/08(日) 21:44:07
>>306 すごい、理解しにくい文章でした
つまり、array1の値は配列なので値が変えられないって
だけの話ですね
値を変えたかったらポインタを使えと
「C FAQ」の名前くらい知ってろよ
複数の参照に値を返す関数 void GetSize(int &, int &, int &, int &) を作ってしまって,たまに必要がない値があるから int nHeight; GetSize(*(new int), *(new int), *(new int), nHeight); としてます. 使用しなくても変数を宣言したほうが,処理上速いですか? int nX, nY, nWidth, nHeight; GetSize(nX, nY, nWidth, nHeight); ポインタにするのが一番なんだろうけど...
構造体を使えばいいんじゃないかな
それメモリリーク起こしてるぞ
>>311 あぁ,そっか気づかなかった
ありがとう
直します.
>>310 矩形の構造体にまとめると...
コードがかさばらなくて済みますね
ありがとうです
そんな細かい処理速度気にするなら そもそも縦横左右それぞれの取得関数用意しとけよと
315 :
デフォルトの名無しさん :2010/08/09(月) 09:39:29
クラスの中のポインタ変数に値を入れるvoid型の関数が多いような気がするのですが ポインタ型を返す関数だと何か不味いですか? 自分の見たソースがそうなだけですか?
ポインタを返す関数もたくさんあるよ。strcpyとかの文字列関係とか。 ポインタの性質上、引数で受け取った変数のどこかを指すポインタを返すのが多いけど。
>>315 コーディング規約や慣習で、ポインタを返さないと言うポリシーはたまによくある。
>>276 その読みは酷すぎる。せめて、エイリアスにしておいてくれ。
319 :
309 :2010/08/09(月) 12:38:28
>>314 dd
一見ポインタとの違いが分からなかった
関数を定義し直すだけでいいですね
ありがとう
320 :
デフォルトの名無しさん :2010/08/09(月) 12:45:52
vector<HOGE1> hoge1 vector<HOGE2> hoge2 で常に同時に増えるのですが、同時にある番目の要素を消したいのですが vector< HOGE1>::iterator itS, itE = hoge1.end(); for( itS = hoge2.begin(); itS != itE; ++ itS ) { hoge2.erase(itS);vector<HOGE1*>(hoge1).swap(hoge1); } hoge1のみの消し方だとこんな感じでやってるのですが この中に上手くhoge2の同じ番目を消すことはできるでしょうか?
322 :
デフォルトの名無しさん :2010/08/09(月) 13:10:40
>>321 すいません
理解できません
どうすれば良いのでしょうか?
>>322 そもそも>320のコードはなにがしたいのか意味わかんなかった
いろいろおかしい
ただ、イテレータを使いたいみたいだったから、vector<HOGE1>のイテレータで
vector<HOGE2>の削除をするにはdistanceとadvance使えばいいんじゃないかなと提案しただけ
普通に考えたらある番目つってんだからその数値で両方にv.erase(v.begin() + n)すればいいだけじゃないのか?
vectorだからadvanceはいらないですねごめんなさい
325 :
デフォルトの名無しさん :2010/08/09(月) 13:30:52
>>323 >>320 はあるイテレーターの時、その要素を消してメモリもサイズを減らすってつもりなのですがおかしいですか?
hoge1はイテレータを使いたいのでそのやり方でも問題ありません。ありがとうございます
hoge1をswapしたらiteratorは無効にならないか?
327 :
デフォルトの名無しさん :2010/08/09(月) 14:10:19
そこは省いてました vector< HOGE1>::iterator itS, itE = hoge1.end(); for( itS = hoge2.begin(); itS != itE; ++ itS ) { if(itSを使った条件){hoge2.erase(itS);vector<HOGE1*>(hoge1).swap(hoge1); break;} } こんな感じです
listをシャッフルしたいんだけど一番効率の良いコード教えて!
ランダムじゃなくても良いですか?
listをやめるというのも手じゃないかな
>>328 教えるのめんどくさいからやだ。自分で考えて。
ちなみに万あっても微々たる差。
そういうのはいらないです
だが断る
listからランダムに取り出して別のlistにつっこむ
>>328 置換群の元の一つを置換行列に変換して、それをvectorに掛ける。
オブジェクト指向を勉強してC++を理解したいと思っています 現状ではクラスを定義してもその変数をグローバルで宣言して いろんなソースファイルから使えるようにしていますが そろそろそういう状態から抜け出したいです そこでどういうクラス設計や考え方をすればよいか理解できる わかりやすい書籍などありましたら教えてください
なぜ、配列はポインタと同じくアドレスでアクセス出きるんですか?
いえ、氷山にぶっつかって船が沈みましてね、-略-船が氷山にぶっつかって一ぺんに傾きもう沈みかけました。月のあかりはどこかぼんやり ありましたが、霧が非常に深かったのです。ところがボートは左舷の方半分はもうだめになっていましたから、とてもみんなは乗り切らない のです。もうそのうちにも船は沈みますし、私は必死となって、どうか小さな人たちを乗せて下さいと叫びました。近くの人たちはすぐみち を開いてそして子供たちのために祈って呉れました。けれどもそこからボートまでのところにはまだまだ小さな子どもたちや親たちやなんか 居て、とても押しのける勇気がなかったのです。それでもわたくしはどうしてもこの方たちをお助けするのが私の義務だと思いましたから前 にいる子供らを押しのけようとしました。けれどもまたそんなにして助けてあげるよりはこのまま神のお前にみんなで行く方がほんとうにこ の方たちの幸福だとも思いました。それからまたその神にそむく罪はわたくしひとりでしょってぜひとも助けてあげようと思いました。けれ どもどうして見ているとそれができないのでした。どもらばかりボートの中へはなしてやってお母さんが狂気のようにキスを送りお父さんが かなしいのをじっとこらえてまっすぐに立っているなどとてももう腸もちぎれるようでした。そのうち船はもうずんずん沈みますから、私は もうすっかり覚悟してこの人たち二人を抱いて、浮べるだけは浮ぼうとかたまって船の沈むのを待っていました。誰が投げたかライフブイが 一つ飛んで来ましたけれども滑ってずうっと向うへ行ってしまいました。私は一生けん命で甲板の格子になったとこをはなして、三人それに しっかりとりつきました。どこからともなく〔約二文字分空白〕番の声があがりました。たちまちみんなはいろいろな国語で一ぺんにそれを うたいました。そのとき俄かに大きな音がして私たちは水に落ちました。もう渦に入ったと思いながらしっかりこの人たちをだいてそれから ぼうっとしたと思ったらもうここへ来ていたのです。この方たちのお母さんは一昨年没くなられました。ええボートはきっと助かったにちが いありません、何せよほど熟練な水夫たちが漕いですばやく船からはなれていましたから。
>>337 デザインパターンでも勉強しろ
そして過剰設計に陥ってる自分に気づいてからが本当の設計が始まる
>>339 銀河鉄道の夜か。タイタニック号の事故を下敷きにしているんだね。
銀河鉄道の夜の映画音楽を担当した細野晴臣がタイタニック号の生き残りの孫だと言うのが因果だね。
>>338 配列すなわち定数。
int a;
a = 2; OK
2 = a; NG
int *a, b[10];
a = b; OK
b = a; NG
>>337 大規模C++ソフトウェアデザインは勉強になった
日本語がところどころ難解だけど
345 :
デフォルトの名無しさん :2010/08/10(火) 15:34:51
オープンソースのライブラリ的な奴のソースに #if 0 〜処理 #endif とあって 自分で実装しないといけないとかいう話も聞く関数中なのですが #if 0 #endifって無視される部分ですよね?なぜこんなことをしてるのですか?一応サンプルのやり方だけ残しとくよみたいな感じなのですか?
>>345 そのとおり。そのソースを書いた人のやさしさ
ちょっと質問です プログラムのコンパイル時間が長いので、頻繁に調整する関数をDLLにしようか迷ってるんですが、 プログラムに直接処理用の関数を関数を書くのと、 関数をDLLに分けて処理させるのでは、オーバヘッドに違いは出ますか?
両方作って計測すれば、勉強になる。
349 :
デフォルトの名無しさん :2010/08/10(火) 19:29:01
>>347 コンパイルを早くしたいなら、dllに分けていいよ。
dllにすることによっての呼び出しオーバーヘッドは考えてなくいい。
あと、少し詳しく説明すると以下のようになるよ。
dllを使うプログラムの方は、実行ファイルにdllのコードを書き込まないよ。
関数の定義がどのファイルにあるかとかの情報を実行ファイルに書くだけ
(ファイル情報はなかったかも、でもこれのせいで”こんぱいる”が過剰に遅くなることはない)。
遅くなるのは、アプリケーションの起動。
実行時に、プロセスのアドレス空間にdllをロードするのに時間がかかるからだよ。
オーバヘッドに違いは出ます。
351 :
デフォルトの名無しさん :2010/08/10(火) 20:10:48
sizeofはどうやって領域の大きさを取得しているんですか?
>>351 みたいに他人を罵倒することで正当性を主張するような奴が無能なんだよな
コミュ力低そうだし
>>352 静的型の言語なんで、コンパイル時にサイズが確定してる。
>>350 が言ってるのはvtableのようなオーバーヘッドなの?
にしてもたいしたことなさそうだけど
大きな関数だけをdllに移すんだったらだけど
一般に アドレス値を即値(相対)で指定した直接ジャンプとなるか メモリ内にあるアドレスを元にした間接ジャンプとなるか という程度の違いは出る。 (メモリアクセスが入るので、コンパイラによってはレジスタに飛び先を保存して再利用したりも) でもって、間接ジャンプの場合、最初の一回の分岐予測は必ず外れ 直接ジャンプ(で絶対ジャンプ)なら最初から分岐予測が成功する。 ただ、(ループ内や関数内での)2回目以降は両方とも常に成功するはず。
関数の調整をしているときだけDLLで開発して 完成したらstaticlinkにすりゃ医院で内科医
dll呼び出しはベクター介した間接呼出しになるから、オーバーヘッドに差は有る。
しかし、
>>349 は「オーバーヘッドに差は無い」ではなく「オーバーヘッドは考え
なくて良い」といっているので、
>>350 は下らない言いがかり。
1泊以上の数値演算プログラムの一番厳しいループ中でもモジュール内呼び出しと
DLL呼び出しで、実行時間に有意差は出ねー。
この足の引っ張り合いが日本のITの歴史だ
>>354 ,355
C99の範囲ではそーでもないと一応
可変長配列にsizeofしたり
不完全型へのポインタを利用した手法(略称わすれた)を使ってコンパイルが依存しないようにしてみるというのは? これはこれで間違いなくオーバーヘッドは出るんだけどさ
>>362 不透明ポインタ(opaque pointer)
お前らは職業プログラマーですか?
奨学金がだいたい月に4万くらいで4年間もらってたから 4×4×12=192万 か・・・ 結構借金あったんだなー。
>>363 忘れたのはポインタの名前じゃなくて手法の名前だww
>>364 ゲーム専門学校で遊んで暮らしてるやつが大半。
charのサイズは規格で決まっているらしいですが、 全てのメージャーなコンパイラで同じサイズ何ですか?
全てでcharは1バイトです
371 :
369 :2010/08/13(金) 11:38:23
但し1byteは8bitがほとんどだがそうでないものの存在も規格上許されている
pimplかよ!
374 :
デフォルトの名無しさん :2010/08/13(金) 12:37:43
1byte == 7bit の処理系も、 理論の話だけじゃなくて現実にあるんだろ確か。 なんでそんな迷惑なシステムになっちゃったの?
7bitは見たことないが9bitならある。
配列を受け取る引数は void hoge(int *array) void hoge(int array[]) のどちらで宣言する事が多いんですか?
>>377 どっちも手抜き
まともなプログラムはサイズを合わせて指定する
void hoge(int *array, size_t size)
void hoge(int array[N])
>>378 一応念の為に聞いておくけどギャグだよね?
まさかとは思うけど、後者のNに意味があるなんて思っちゃいないよね?
380 :
377 :2010/08/13(金) 15:25:33
意味はないけど場合によっては見やすくするためにかくんじゃないの?
まぎわらしい
一般的には「意味が無いなら最初から書かない方が良い」とされていますね
こういう
>>378 みたいな知ったかが現場で上の方にいると下が地獄なんだよな
偉そうに間違った知識をまき散らして・・・アホかっての
>>385 詳細も糞も。
C/C++ほとんど使わない俺の目にも
>>378 の後者は変だ。
>void hoge(int array[N])
この引数のプロトタイプは何を意味しているのだろう。
要素数Nの配列しか受け付けない?
呼び出し側で指定している配列の要素数がNかどうかなんて、
どうやってコンパイル時に検出するの?
>>385 void hoge(int array[N]) なんて書いても配列の要素数の束縛なんてできない
void hoge(int array[], size_t size) なら言いたいこと分かるけど
なんだ後者のほうか 前者もおかしいのかとおもた
クラスに関する質問なんですが 以下のプログラムで void setname(char* ss)のssとは何をさしているのでしょうか? 最初は年齢か名前の文字数が入るのかと思ったのですが どうも違うような気がします 本当にレベルの低い質問なんですが ご教授よろしくお願いします
390 :
389 :2010/08/14(土) 03:38:07
こちらがプログラムになります #include <iostream> #include <string.h> using namespace std; class hito1 //クラス宣言 { private: char name[40]; int age; public: void setname(char* ss){ //名前を設定するメンバ関数の宣言 strcpy(name,ss); } void setage(int tosi){ //年齢を設定するメンバ関数の宣言 if(tosi<0) age=0; else age=tosi; } void disp(){ //内容を出力するメンバ関数の宣言 cout << "名前:" << name << endl; cout << "年齢:" << age << endl; } }; void main(){ hito1 yamamoto; yamamoto.setname("佐々木 太郎"); yamamoto.setage(20); yamamoto.disp(); }
void setname(char* ss){ //名前を設定するメンバ関数の宣言 strcpy(name,ss); } これのstrcpyっていうのはname(1つ目)にss()2個目を入れるっていうやつ んで上のsetname(char* ss){〜っていうのはsetnameが呼ばれたときに()の中に入っているのをssに入れるってこと yamamoto.setname("佐々木 太郎"); これで佐々木 太郎いうのがssに一旦入る。んでstrcpy(name,ss);でssがnameにコピーされる 使い方としては一時的な入れ物みたいなもので特定のものを指してるわけじゃないし使う範囲も狭い。だからssとかいう手抜きな名前がついてる まぁ本当に初歩の初歩だからここで質問するより参考書とか初心者向けサイトとかを見たほうが速いんじゃないかな
a string to set の略とかだったり
長さが不明な文字列をstrcpyするサンプルを乗せている文献やサイトはもれなくクソ。 それを参考してはいけない。
>393 終端されていない配列をコピーしちゃダメ!っていう意味かい? Cで「文字列」って言えば、終端されていることが前提です。 長さ不明って言っても、文字列長はわかりますけど。
strcpy_sですべて解決
>>394 文字列長が転送先に収まるか確認してからstrcpyしろ。
という事を、お前のような初心者に一々説明するのは面倒だから、strcpyは使用禁止。
理由がわからないコーディングルールが蔓延してる現場ってすごいダメだな。
>396 >文字列長が転送先に収まるか確認してからstrcpyしろ。 これなら納得。 「長さ不明の文字列」って言葉の使い方の問題だ。 「長さ不明の文字列」ならコピー先に収まるかどうか、判定すらできないじゃん? って思っちゃったのよ。 >393から396をエスパーできなかったよ。 strcpy禁止にしてstrncpyやstrcpy_sを使うのは、コーディングルールとしてはアリと思う。
なんだバカか
400 :
デフォルトの名無しさん :2010/08/14(土) 15:24:20
iPadにある電光掲示板アプリを作りたいんですが、あれはどういうロジックなんでしょ?良いライブラリでもあるんですかね?
文字のドット化が出来れば簡単そうだが・・・どうするんだろ
OSXならfreetypeでフォントファイルと文字列からビットマップを出力できるよ
unionについて質問 >各メンバは、同じメモリ領域を共有します。 これは、変数の管理コストを下げたりするメリットがあるけど >共用体変数にある値を代入すると他のデータは失われる データが壊れるってわかっているのに、何故unionを使う必要があるのですか?
>>403 1.節約する
2.他の型で読み取ることが有用なことがある, intで突っ込んだデータをcharで1バイトずつ読み取ったり
>403>404 もうひとつ。 どの型のデータを格納するかわからない場合がある。 シリアル通信とか、ネットワークプログラムでは定番。
>共用体変数にある値を代入すると他のデータは失われる が要らんことを言ってるだけな気がする。 要は同じメモリ領域を共有してるってことだから、この一文は無くていい
407 :
デフォルトの名無しさん :2010/08/15(日) 16:13:20
>>403 名前は違うけど同じものを指しているってこともある
グローバル変数と何が違うの?
グローバルな変数とは何の関係もないが
プロトコルのヘッダ書くとき俺もunion使った 「union変数のある部分ではint型としてアクセスしたいけど、 別のある部分ではuintとしてアクセスしたい」みたいな そういう場合でもない限り、使うことはないし、 特に、初心者は気にすることもない
411 :
389 :2010/08/15(日) 20:47:15
>>391 ありがとうございました
参考書を熟読します
今、RTP プロトコルのライブラリをC++ で書いているのですが、AVIコーディックの payload typeの値っていくらなんでしょうか? RFC読んでも見当たらないのですが、知ってる人がいたらオナガイします。
413 :
403 :2010/08/15(日) 23:25:06
>>404 >他の型で読み取ることが有用なことがある, intで突っ込んだデータをcharで1バイトずつ読み取ったり
すみません、ここら辺がいまいちわかりません
>>410 プロトコルを作るときに便利なんですか、unionの使い方を覚えたいですね
>>413 常駐するタイプのソフトを作るとき、出来る限りリソースは最小限に抑えたい
その際にオブジェクト一つにテキストが内包されてるか数値が内包されてるかオブジェクトによって異なる場合、などに使う。
classでも同じようなことが出来るが。
415 :
403 :2010/08/15(日) 23:40:37
>>414 クラスっぽいって事はわかりました
レスをヒントにもう少し調べてみたいと思います
感謝
416 :
400 :2010/08/15(日) 23:45:18
>401 そう、ドット化って意外とわからないっすよね。それを巨大化したりすろのも。学生時代に画像認識系でやったことあった気がするけどさっぱり思いだせない。 >402 Macも使ってるんで試してみますわ。情報ありがとうございます(・∀・)
>413 ざっとこんな感じ。intに格納されているデータがバイト単位で読めたりする。今、コード上で共用体のメンバu32に代入しているけど、これを動的に設定すると、らしくなる。 #include <stdio.h> /* 型を示すID */ typedef enum { E_U8 , E_U16, E_U32 } E_TYPE_DATA; /* データ本体を示す共用体 */ typedef union { unsigned char u8[4]; /* unsigned 8bit */ unsigned short u16[2]; /* unsigned 16bit */ unsigned u32; /* unsigned 32bit */ } T_DATA_BODY; /* データ構造体 */ typedef struct { E_TYPE_DATA type; /* データ型ID */ T_DATA_BODY data; /* データボディ */ } T_DATA; int main(int argc, char** argv) { T_DATA tData; tData.data.u32 = 0x12345678; printf("%x\n", tData.data.u32); printf("%hhx, %hhx, %hhx, %hhx\n" , tData.data.u8[0], tData.data.u8[1], tData.data.u8[2], tData.data.u8[3]); return 0; }
>>418 thx
>>412 です
ここで聞く前に、そこ見てRFC読んだのですが、avi(Audio Video Interleave) の記述を見つけられませんでしたorz
どのcodec を指定してやればいいのだろうか?
AVIのままではRTPに突っ込むことが出来ない 仕様を無視してもよけりゃ適当に衝突しないとこを指定すればいいんじゃないの
ヘッダーファイルやソースファイルにpragma onceを使わないメリットを教えてください。
そのまえに使うメリットを教えてください
普通の#ifdef と #defineでのインクルードガードではうまくいかない場合がある ただ、そんな風になること自体がおかしいって説もあるが
#pragma onceは移植性無いんじゃなかったっけ?
>>421 >424の通り、onceは一部の処理系では使えるけれど、他の処理系でも同じ意味である保証がない。
一部の処理系で言うonceは>423の言うインクルードガードと同じ目的に使うものなので、一般的にソースコードに使う意味はない。
#pragma onceはマクロ名が衝突する心配が無い。
pragma onceはパス見るだけだからシンボリックリンクとかで エイリアスがあるとうまく働かないんだよね
>>425 #pragma once が通らないような処理系なんて考える必要はない。
これを言い出したら昔の処理系では void のキーワードすら認識できないものがある。
そんな処理系を想定してコードを書くのはナンセンス。
>一般的にソースコードに使う意味はない。
ソースをインクルードできるのは普通のこと。void を認識しない処理系でもこれはできる。
ソースをインクルードするときには #pragma once は便利な機能。
ヒント:規格合致 pragma onceを別の意味にしている処理系があってもISO準拠。 voidがない処理系については、その頃はANSI-C以前だろ。
>>421 のソースファイルってのはインクルードする側を指してるみたいだから
#pragma once 使っても意味がないだろ
>>428 ソースをインクルードするような運用はそれ自体が大問題だと思うぞ。
せめて、拡張子を.incとか.iとかにしてくれ。
>>429 #pragma once は ANSI だよ
そーすはANSI
ANSIには関わりのねぇことで
すみません。 floatで-3.4549897 と -3.4549899 の引き算を行った所、 答えが-0.0000002(7桁をオーバー)ではなく 2.3841858e-007 になり、 割り算を当てるとゼロ割り算と同じエラーを吐きます。 時折見かける、この e-007 などは扱える数を超えたという意味なのでしょうか。 こういった場合ifで桁数を超えないか監視するのが定番なのでしょうか?
>>437 所謂指数表記です。関数電卓アプリなどでもしばしば見られると思います。
尚、浮動小数点数は元々そういった小さい数も扱えるようになっているので、
指数表記を知っておく必要があります。
また、その計算結果は見ての通り演算精度が得られないために2e-7になっていませんが、
doubleで演算すればより2e-7に近い値が得られると思います。
従って、(その他の理由もありますが)特に必要がない限りC/C++ではfloatを使うべきではありません。
実務レベルなら 今時 #pragma once 使わず #if でインクルードガードとかやるなんて馬鹿だとしか思えんね ビルドに余計な時間かかるし、無用なバグを生むことにもなりかねない まぁ趣味レベルのプログラムならどうでもいいんだろうけどね void 使わないのも勝手、関数のプロトタイプ宣言使わないのも勝手w
>>439 こんな子どもじみた考えで実務とか語ってるのかよ
>>437 「割り算を当てる」ってどういう意味だよ。
単精度で扱える範囲は10の-15乗 〜 10の38乗だから2e-7は楽勝で扱える値域。
それで割ってもゼロ割にはならない。
442 :
413 :2010/08/16(月) 19:58:21
>>439 マクロを展開して出来上がった、実行ファイルの速さと、コンパイル時間とのトレードオフの問題なのではなかろうか?
#if を見て、なんでも悪いと決め付ける理由が、わしにはようわからん、C++ 再考 のテンプレートの章を一度よみなはれ
インクルードガードの話で実行ファイルの速さ・・・?
誰かバカを呼ぶバカ笛でも吹いたのか?
実務レベルなら他人がぱっと見て安心できるようにするんだよ
↑つられて出てきた馬鹿 必死で馬鹿を否定する馬鹿↓
,.へ ___ ム i 「 ヒ_i〉 ゝ 〈 ト ノ iニ(() i { ____ | ヽ i i /__, , ‐-\ i } | i / (e) (A) \ {、 λ ト−┤. / (__人__) \ ,ノ  ̄ ,! i ゝ、_ | U ` | ,. '´ハ ,! . ヽ、 `` 、,__\ /" \ ヽ/ \ノ ノ ハ ̄r/:::r―--―/::7 ノ / ヽ. ヽ::〈; . '::. :' |::/ / ,. " `ー 、 \ヽ::. ;:::|/ r'"
449 :
437 :2010/08/16(月) 21:03:53
>>438 指数表記と言うのですか・・一時的な演算ならばdoubleで行うと良いのですね。
なるべく避けられる部分は避けようと思います。ありがとうございました。
すみません。 変数Aから変数Bを引いた値(差)を求めたいのですが、 変数A・Bとも正〜負までが不規則に現れる為、 負の場合の反転を起こして上手く差を求められません。 現状は変数A・B共に一定の数値を足して正の値に押し上げて 対応しているのですが、もっとシンプルで確実な方法は無いものでしょうか?
差ってのはどっちが+だろうが−だろうが、 A-Bじゃないの?w
だな
>>450 はもはやなにいってのか分からないので
上手く動いてないコードを提出してくれるかもっと説明するかしろ
メモリーリーク(ちょっと)するけどコードすっきりするのとメモリーリークしないけど分かりにくくなるのってどっちがいいのかな
メモリリークしなくて分かりやすいコード以外書くな。 スマートポインタでも使え!
ちゃんとしたコードなら その2つは 相反しない要求だと思うぞ。
リークする時点でダメだよな
std::exitで終了を管理してるからリークは避けられない
>>457 > std::exitで終了を管理してるから
それが原因だとわかっているんじゃないか。
環境依存の話で申し訳ないけど、 #importってインポートするファイルがコンパイル後の実行ファイルを実行する環境に無くても別に平気なの?
平気なわけないだろ
#import って何?
無知乙
>>457 そういう意味かよ
exitで終了するときまだ開放してないのがあるってのなら、一般的なOSでは気にする必要がないというか
メモリリークしない
並列処理で使うやつだとちゃんとしないと駄目なのもがあるが
そういうのは正しい答えを書いてからいうもんだ
>>465 みんなが本当だと言えばそれが真実になる
>>467 朝鮮人みたいな事言うなヴォケ
規格票で示せ
そういうのは正しい答えを書いてからいうもんだ
マクロってソースにはもりもり使っていいの?
使わないといけない理由がないなら使ってはいかん。inline関数の方がマシ。
プライベートなメソッドの代わりに使いたいんだ インラインにしてヘッダに書いちゃうと解析コストがちょびっと増えそうで気になる
そこらへん Effective C++に詳しくあるはずだ #defineよりconst #defineよりinline
ちょこっとづつ違う定型inlineメンバやconst値を大量に定義したいときに#defineつこてしまう。 少なくともeclipseのメソッドツリー機能は憑いてきてくれる
475 :
デフォルトの名無しさん :2010/08/18(水) 13:41:19
商用使用無料の高性能なコンパイラってありますか?
VS2010EE
477 :
デフォルトの名無しさん :2010/08/18(水) 14:03:57
EEでも商用利用可能なんですか! ありがとうございます。
2008までは可だったけど2010からは評価目的のみになったんじゃなかったっけ?
登録前はそうだが
登録後に商用を許可しますなんて表示されたっけ
2008EEの統合環境に 最新のWindowsSDK落としてきてbin,lib,includeをそっちと置き替えるってのはどうだろう? どっちにしろEEはMFCとかの追加機能は使えないんだし
なんでそこまでしてVC使いたいの?馬鹿なの?死ぬの?
なんか手軽だし
業界の標準だし
使ってる人多いし
Linuxで使える、商用OKなコンパイラは?
訂正 Linuxで使える、商用OKな無償のコンパイラは?
作れ
gccの吐いた実行ファイルって商用に使えないの?
終了時のメモリ解放忘れによるメモリリークと不用意なnewの繰り返しによるリークは 区別されてしかるべきと思うんだけどなあ
突然なによん
キチガイに触れんな
493 :
デフォルトの名無しさん :2010/08/19(木) 04:49:21
CreateWindow(TEXT("EDIT") , TEXT("") , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT , 0 , 270 , 100 , 30 , hwnd , (HMENU)10 , cs->hInstance , NULL); CreateWindow(TEXT("EDIT") , TEXT("") , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT , 110 , 270 , 100 , 30 , hwnd , (HMENU)11 , cs->hInstance , NULL); CreateWindow(TEXT("EDIT") , TEXT("") , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT , 220 , 270 , 100 , 30 , hwnd , (HMENU)12, cs->hInstance , NULL); CreateWindow(TEXT("EDIT") , TEXT("") , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT , 330 , 270 , 100 , 30 , hwnd , (HMENU)13, cs->hInstance , NULL); として GetDlgItemText(hwnd ,10,strx ,1000); GetDlgItemText(hwnd ,11,stry ,1000); GetDlgItemText(hwnd ,12,strz ,1000); sscanf(strx,"%f",&x); sscanf(stry,"%f",&y);← sscanf(strz,"%f",&z); とすると←でエラーが出て、どうやらGetDlgItemTextのstry以下がちゃんとアドレスが入ってないようなのですがなぜでしょうか?
494 :
デフォルトの名無しさん :2010/08/19(木) 06:10:20
LPSTR strx,stry,strzをグローバルで宣言したらGetDlgItemText(hwnd ,10,strx ,1000);の時点で値が入らなくなりました なぜでしょうか?
IDの指定の仕方が間違ってるから
496 :
デフォルトの名無しさん :2010/08/19(木) 07:22:12
>>495 どういうことですか?
CreateWindow(TEXT("EDIT") , TEXT("") ,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT ,
110 , 270 , 100 , 30 , hwnd , (HMENU)11 ,
クリエイトウインドウの ↑の部分と同じintを指定しているのですがそれでは駄目なのですか?
どうすれば良いのですか?
497 :
デフォルトの名無しさん :2010/08/19(木) 07:29:28
それと LPSTR strx,stry,strz; GetDlgItemText(hwnd ,10,strx ,1000); GetDlgItemText(hwnd ,11,stry ,1000); GetDlgItemText(hwnd ,12,strz ,1000); sscanf(strx,"%f",&x); sscanf(stry,"%f",&y); sscanf(strz,"%f",&z); を LPSTR str; GetDlgItemText(hwnd ,10,str ,100);sscanf(str,"%f",&x); GetDlgItemText(hwnd ,11,str ,100);sscanf(str,"%f",&y); GetDlgItemText(hwnd ,12,str ,100);sscanf(str,"%f",&z); にしたらコンパイルが通ったのですが何故ですか?
エラーメッセージすら書かないとかマジパネェっすよ
まるでストーカーだね
両スレ見てて類似性に気付かなかったら、病的な鈍感。
巧妙な罠を仕掛けていたのか 危なかったぜ
基底派生ともにデストラクタがなにもしない場合はデストラクタを仮想にしないでも基底クラスのポインタに派生クラスのオブジェクトをnewしたりdeleteしてもいい? コンパイラーは警告すらださないしメモリもリークしてないみたいなんだけどどうかな
駄目
良いけど、特例は作るべきじゃないから駄目
いいよ。結局同じなんだし
いいよ できることは何でもしていい
508 :
36 :2010/08/20(金) 16:05:21
何もしないデストラクタ、もしくはデストラクタ書かない、 とかでも暗黙的にメンバのデストラクタ呼ぶわけだから、 それのために仮想デストラクタにしといた方がいいのかも? それとも不要なのか? よくわからん
>>499 質問の内容が変わってるから、これはマルチじゃないよ。
基底クラスのポインタに派生クラスを入れて 仮想じゃないメンバを呼び出すことは規格的には未定義じゃなかったか? どれが呼ばれるか分からないとかじゃなくて
デストラクタは仮想関数にしておくべきでしょうか?
>>511 よく分からないならそうしておけ
派生するが仮想関数にしなくていいようなケースだってあるけど、理由とか知らなきゃやれないし
>>511 継承しないクラスなら仮想関数にする必要はない
デストラクタが明示的には何もしなくても派生クラスが非PODだと死ぬね
using namespace std; struct FOO { FOO(){ cout << "create FOO." << endl; } ~FOO(){ cout << "destruct FOO." << endl; } }; struct HOGE { }; struct HOGEHOGE: public HOGE { FOO foo; }; int main(int argc, char* argv[]) { HOGE* hoge = new HOGEHOGE; delete hoge; return 0; } 上記コードだと、(少なくともVC08では) HOGEHOGE::foo のデストラクタがコールされない。 HOGEを struct HOGE { virtual ~HOGE(){} }; にすると、ちゃんと HOGEHOGE::foo のデストラクタが呼ばれる。 派生クラスで、デストラクタを持つ型をメンバとして持つ場合でも、仮想デストラクタにしといたほうが良いようだ。
~HOGE()はHOGEHOGE::fooのことなんか知らないから当然だよね
逆にデストラクタを仮想にしない理由て何? 書くのが面倒以外で。
この場合 delete hoge; というのは hoge->~HOGEHOGE(); ではなく hoge->~HOGE(); が実行されているのと等価ですか?
>>517 vtableに使うメモリを節約したいとか?
>>517 デストラクタを常にvirtualにするのは、馬鹿の一つ覚え。
仮想関数はバイナリの互換性がなくなるから
>>521 もしかして構造体をfwrite()とかfread()とかでそのまま読み書きしようって話?
Cでもそんなのやめてほしい。
DLLとかで互換性なくなるでしょ
え?遅いからじゃないの?
テキストファイルのデータを動的に読み込んで、 const な変数にしたい場合、 const int A = 0; *const_cast<int*>(&A) = 30;//テキストから動的に読み込んだデータ とか、 クラスメンバーconst変数に初期化子として代入 とかがふと思いつきますが、 他に良い方法ありますか?
int x; my_read_func(x); const int y = x; ----- int my_read_func_ex() { int x: my_read_func(x); return x; } const int y = my_read_func_ex();
>>526 明後日の回答じゃね?
>>525 const変数の初期化は一度しかできないから生成時にできなければ、constじゃない
変数へのポインタか参照を使うしかない。つまり超大雑把に言って他にはないんじゃね。
const_castを使ったら負け
類推できると思うけど、ポインタか参照は例えばこんな感じ。 int A = 0; const int& refA = A; A = 30; // 以降Aは使用せずrefAだけ使用する
うーむそうですか・・・ ありがとうございます
531 :
デフォルトの名無しさん :2010/08/22(日) 11:26:26
>>525 他にとか言う以前にその方法は最悪だ
const_castしての書き込みが許されるのはそこが本当に書き込み可能だった場合のみ
const int Aに書き込みしちゃ駄目よ
え?そんな常識知ってて書いてるんだろ?
一回だけ書き込み可能な整数ラッパークラスを作ればいいよC++ってそういうものでしょ
オブジェクトの名前の一部に変数を使いたいんですがどうやればいいですか? たとえばこのプログラムの場合で、test0〜test4を作るためにはどうすればいいですか? 多分○○のところを何か埋めれば書けるんじゃないかと思うんですが、検討がつきません。 class testclass {}; int main() {int A =0; While(A<5){ testclass test○○(); A++; } }
535 :
デフォルトの名無しさん :2010/08/23(月) 16:22:55
といってみたものの 変数に入れた値を使ってというならやっぱ無理だけどね 5がコンパイル時に確定してるなら可能だ test0 〜test4までの宣言を創りだすことが可能だ でも、変数に入れた値を使って作りたいってどんな状況なのさ・・・・・・・ ありえないと思うんだが
少なくとも、それを実現するために費やす労力では絶対に元を取れないだろうな
538 :
534 :2010/08/23(月) 16:59:20
クラスに各パラメータをブチ込んで、ゲームのキャラ(自由追加可能で定数の固定キャラが出るわけではない)を作ろうとしてたんですが、listとポインタで事足りそう…。 つまらない質問すいませんでした。
そんなときは hash
メンバ関数ポインタっていうのを使うとできそう
>>538 答えてる時からそういう結論になるだろうなと思ってたから気にすんな
542 :
525 :2010/08/23(月) 17:56:26
531-533 やっぱりそうなりますよね・・・ >一回だけ書き込み可能な整数ラッパークラス このあたりでいきます ありがとうございました
C++のファイル操作操作よりもFILE構造体を使った方が、 楽な気がするのは気のせいですか?
>>543 C++に標準ではファイル操作なんてありませんが。
# あるのはストリーム操作。FILEを使ってもストリーム操作。
キモすぎ
>>543 クラスの入出力をしないなら確かにFILE使った方が速いし楽
でも自分で入出力をカスタマイズしようとするとすぐ<<と>>のオーバーロードが欲しくなる
sprintfは便利だったのに なにがうれしくて<<なnnda
>>548 stream系の便利なところは、オーバーロードできることだね。
Cでも構造体は作れるけど、それ専用の出力関数を作るのならoperator<<()を作る方が再利用しやすい。
550 :
デフォルトの名無しさん :2010/08/24(火) 11:22:21
カーネルを作りたいと思っています。 linux0.01のブートの部分はなんとなく理解出来たのですが ハードディスクなどのハードウェアの部分になると何をしているのかよくわかりません。 もしおすすめの書籍などあれば教えて下さい。よろしくお願いします。
>>550 そういう情報はネットに溢れてるし、ほとんど書籍化されてないよ
英文を読めないのが問題なんだよ、書籍買うのなら英語の学習本だね
553 :
デフォルトの名無しさん :2010/08/24(火) 14:12:06
お聞きしたいことがあります。 C++で実行するとコマンドプロンプトにすぐ移るのですが、結果の量が多く最後の方しか見ることができません。 結果をすべて見るにはどうすれば良いでしょうか?
554 :
デフォルトの名無しさん :2010/08/24(火) 14:20:18
> hoge.exe | more
555 :
デフォルトの名無しさん :2010/08/24(火) 15:41:53
そうしたいんですが、実行したとたんにコマンドプロンプトが始まります。 また、処理が終了すると何かキーを押すだけで終了してしまいます。 どのタイミングでhoge.exe | moreを入れれば良いでしょうか?
\ \ ∧ニユ/ ̄ヽ \ ( ´∀/) i \.\ _(」つ/とl) . | \ ;::;::\i\ 匚レ| .〈/ ) | \ 。::;;:'\.\ (_,)ー' |_,, -'''"! ^人;:'::;゚:;.\l\ _,,, -''"|_,, -''"| ^^从::;;:。':\.\_,, -''"|_,, -''"| . :| へ ^へ;;::';;:'\l_,, -''" . | 从^ 〜 ^ ^ヘ^人从::;;;:| ,ィ人^. | ^ ^へ^^ 〜 ^.へ' ^':レ^从 へ' | 〜 ^ へ ^^ へ 〜人^ ^ へ〜 〜
558 :
デフォルトの名無しさん :2010/08/24(火) 15:57:39
もし、よろしければ手順を教えていただきたいです。 (a.cppを実行すると仮定してお願いします。)
そんな餌に俺が釣られクマー
>>558 コマンドプロンプトを開いて、そのフォルダに移動し、a.cppを実行する。
それでウィンドウが開くから。まずはそこまでやってくれ。
くまった
562 :
デフォルトの名無しさん :2010/08/24(火) 17:02:03
>>551 英単語はえっちなのしか知りません><
英語勉強します・・
>>552 MINIXが一番いいみたいですね。
本もありますし、そうしようと思います。
ありがとうございました。
for文使ってAまたはBまたはCが条件に達したらループ終了するにはどうしたらいいですか 3重カッコでやると全部が条件に達したときに終わってしまいますが一つだけ達してくれればよいのですが
>>563 for (;A || B || C;) {
}
ありがとうございます
しかしそれは while の仕事ではないか?
>>566 for文使って という顧客の要件定義がある以上仕方ない
C/C++ってjava/vbなんかよりも、面白くていいね 実効速度も速いし
まあね
570 :
デフォルトの名無しさん :2010/08/25(水) 23:25:36
Cから引きずったヘッダがどうもいやでしょうがない。 これさえなければな・・・。
質問でもなんでもない件について
ヘッダって無理に書くものでもないじゃん
ヘッダにロジック書く奴は死刑な
C++でソースにロジック書いたらパフォーマンス落ちそうでイヤ
落ちるわけねーだろ お前バカだろ
俺はコンストラ・デストラ・コピコンはヘッダーに内容を書いてるよ
俺オペイコも
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \ | ここはお前の日記帳じゃねえんだ | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \_______ _______/ | チラシの裏にでも書いてろ ∨ \_________ ____ /::::::::::< \ィ,:::::::::::::;N ヘ r;ァ'N;:::::::::::::,ィ/ |/ >::::::::::ヽ i:::::::::::::::ン、 `ヽル/ ヽ / __ 〃 ヽル1'´ ∠:::::::::::::::::i . l:::::::::::::::l ̄ 一- = ., - ,___ i -/― ヽ | / i′ ___, - ,. = -一  ̄l:::::::::::::::l /ニヽ:::::::l r`,==- 、 ! / | |/ ! , -==、´r' l::::::/,ニ.ヽ ,| /'l l:::::l く二''‐- ,,_ l ' (フヽ ○ l _,, -‐''二ゝ l::::l f゙ヽ |、 -| { ( l:::! _、=;ニ,ァ-ニッヽ、 --ーJ レー-- 、ヽヾニ-ァ,ニ;=、_ !:::l ) } ト ヽ、)ノ::{ ´,,,ニ'=゙ー ´、yr゛7'¨ッ ヾ¨'7"ry、` ー゙='ニ,,,` }::ヽ(ノ ミ:::::::i, 、.,,,;;;;,l'  ̄゛ `! 、ヽゝー :ーゝヽ、 !´ " ̄ 'l,;;;;,,,.、 ,i:::::::ミ ミ::::::::リi,, 、ゝニ´(__ }_'r 、イ ー-.ヽ :::::::::::::::::::::::::::::ヽ.-‐ ト、 r'_{ __)`ニゝ、 ,,iリ::::::::ミ , ゙;::::::::::::::゛`:::::、,-ッ-ー`ニ`ッ;`'V:::l\iV ::::::::::::::::::::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、::::: `"::::::::::::::;゙ , \\ ヽ::::::::::::::::::i.,,ン、`ニ二´.,ッ::::、゙ .N::::::::::::::::::::::::::::::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::/// \ \::::::::::::::::::::::::::::::::::::::::::::/ l::::::::::::::::::::::::::::::::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
#!/bin/sh cat >crc.cpp <<EOF #include "crc.h" void CRC32_noinline::operator() (unsigned char c) {calc(c);} EOF cat >crc.h <<EOF class CRC32{ public: CRC32():crc(~0U){} operator unsigned int(){return ~crc;} void operator()(unsigned char c){calc(c);} protected: void calc(unsigned char c) { for (int j=0; j<8; j++){ if ((c >> 7)^(crc >> 31)) crc = (crc << 1)^0x04c11db7; else crc = (crc << 1); c <<= 1; }} private: unsigned int crc; }; class CRC32_noinline : public CRC32 { public: void operator()(unsigned char c);}; EOF cat >test.cpp <<EOF #include <iostream> #include <iomanip> #include "crc.h" using namespace std; template<class C> void test() { C crc; for (long i = 0; i < 0x10000000L; ++i) crc(static_cast<unsigned char>(i)); cout<<"CRC: "<<hex<<setw(8)<<setfill('0')<<(unsigned)crc<<endl; } int main(int argc, char* argv[]){ if (argc == 1) test<CRC32>(); else test<CRC32_noinline>(); return 0; } EOF g++ -o test -O2 test.cpp crc.cpp; time ./test; time ./test noinline
こういうケースだとうちではヘッダの方がちと速い CRC: 5451fcca 19.62user 0.01system 0:19.64elapsed 99%CPU (0avgtext+0avgdata 3552maxresident)k 0inputs+0outputs (0major+273minor)pagefaults 0swaps CRC: 5451fcca 22.44user 0.00system 0:22.44elapsed 99%CPU (0avgtext+0avgdata 3568maxresident)k 0inputs+0outputs (0major+274minor)pagefaults 0swaps
gccの最適化オプションって、本当に吐き出されるバイナリが違うんだ
むしろ違わない処理系を知りたい
>>583 std::cout << "test" << std::endl;
くらいしか処理を書いていないのに、結構違うんだなーと思ったものでね
最近のGCCはLTO可能になったんだっけ?
>>581 関数呼び出しのオーバヘッドかな。
iccやgccの4みたいにオブジェクト間最適化ができたら差がなくなりそうだ。
手元のVC10では同じになった まあLTO可能なコンパイラなら当然か
588 :
581 :2010/08/28(土) 11:31:38
gccのバージョンは4.4.3。4.5になるまで-fltoは認識しないみたい。 でもリンク時最適化ってコンパイル時と同じ最適化ができるのか?
「処理系によります」
590 :
581 :2010/08/28(土) 19:51:45
>>589 そう、では同じ最適化ができる処理系って何?知ってる限り教えて
ヒマ人乙
インクルードガードの勉強をしています test.cpp #include "hoge.h" main.cpp #include "hoge.h" #include "test.h" mainから「hoge.h」と「test.h」を呼び出しているのに、コンパイラエラーが発生しないんですか? #ifndef TEST_H #define TEST_H #endif TEST_H などという記述はちゃんとコメントアウトしてあります
コンパイルエラーになる記述がなければコンパイルエラーにならない
てか、別々のソースにインクルードしてるならエラーの出ようがないじゃん ヘッダーでグローバル変数を定義してるとかアホなことをしてない限り
インクルードガードは普通同じファイルを二度インクルードした際に宣言の重複を させないためのもの。ヘッダからヘッダをインクルードしていると、これはよく 発生する。 [header1.h] #include "header.1" ... [header2.h] ... [source.c] #include "header1.h" #include "header2.h" ↑こうするとheader2.hは二回インクルードされる
訂正 [header1.h] #include "header2.h" ... [header2.h] ... [source.c] #include "header1.h" #include "header2.h"
598 :
593 :2010/08/29(日) 22:24:32
FILE構造体を使ったIOはデフォルトでバッファリングされているのですか?
未規定
すみません。VC++2008 ExpressEditionを使っている者なのですが、 「pragmaはコンパイラ・OSやらによって動作が違うから使うな」 みたいな注意書きを見て恐くて、 不要な警告を消したり等色々便利そうなのですが、ずっと使わずにいます。 Windows以外(主にUNIX・Linuxなど)でプログラムを動かす場合、 pragmaを使っていても平気なものなのでしょうか。 やめておいた方が良いのでしょうか?
他のOSとかに移植するつもりなら使わない方がいい VCで警告を消すぐらいならプロジェクトのプロパティで設定できるでしょ
603 :
デフォルトの名無しさん :2010/08/31(火) 20:12:54
「pragmaはコンパイラ・OSやらによって動作が違う」 を理解してれば使っていいよ
604 :
601 :2010/08/31(火) 20:22:20
>>602-603 移植するならヘッダの2度読み防止とかもifndefでやるべきなのですね。
警告の消し方も調べてみようと思います。ありがとうございました〜
>>604 事実上*NIXのコンパイラなんてgccだけなんだから、
gccでも使える#pragma onceなんかはあまり気にせず書くという考え方もある。
gccしか無いプラットホームは別にして、普通はちゃんとしたコンパイラ使うだろう
gccはちゃんとしてるだろ
俺はllvmがC++完全対応したらgcc捨てる
609 :
デフォルトの名無しさん :2010/09/01(水) 15:03:33
久々にC++でプログラムを書いております。 ファイルが増えてきたためmakeを利用しようとおもっております。 ファイルが増加するたびにmakeファイルの定義をついかしても良いのですが、 定義を追加せずに指定フォルダ以下の更新したファイルのみコンパイルする記述がないでしょうか? 昔どこかで上記のような動作を行えるコマンドかなにかがあるとの事を、 どこかで見たのですが失念してしまいました。 昔は指定フォルダ以下のファイル群に対し、makeファイルを作成する プログラムを作っていたのですがすでに遺失してしまいました。
autoconf automake
makedepend ?
すみません。 [Main] [クラスA] [クラスB] の3つのヘッダとソースファイルが有ります。 今は[Main]でクラスAのインスタンスを作り、 クラスAで利用する[クラスB]のインスタンスを、クラスAのソースのグローバルスコープで、static付で作っています。 今までクラスAは1つのインスタンスなので、これで問題無かったのですが クラスAのインスタンスを複数(配列)にする事になりました。 このままだとクラスBはどのクラスAのインスタンスから呼んでも同じものになりますよね? クラスBのインスタンスを常に別々に別けたい場合と、 クラスBのインスタンスを常に1つ(同じ)にしたい場合、どこでインスタンスを作るのが良い行い方なのでしょうか?
>>612 staticでインスタンス持ったりするのやめれ。不自由っしょ?
> クラスAで利用する[クラスB]のインスタンスを
フツーにAのメンバ変数で持てば十分では?
singletonパターン
下のプログラムなんだけど縦88ドット横44ドットのフォントを出力するものなんだけど、 ループ回数が多くて実行周期が遅くなってしまいます。 少しでもステップ数を減らしたいんだけど、他にいい書き方ないかな? void writeNumOriginalFontBig(char p){ unsigned long adrs, i, j, k; char *dp; char dt; int bit = 0; int xdotCt=0; dp = originalFontBig + (p * (6 * FONT_BIG_Y)); dt = *dp++; for (i = 0; i < 88; i++) { /* 縦ドット分繰り返し */ adrs = (((cy + i) * LINE_CR ) + cx + VRAM_BASE_ADDRESS); for(j = 0; j < 6; j++){ /* 横ドット分繰り返す */ for(k = 0, bit = 0x80; k < 8; k++){ if(xdotCt >= 44){ xdotCt = 0; break;} if(TESTBIT(dt, bit) == 1){ /* データがある */ OUTPORTB(adrs, BLACK);} else{ OUTPORTB(adrs, WHITE);} dt = dt << 1; adrs++; xdotCt++;} dt = *dp++;}} glcdMove(cx + 44, cy); /* 描画位置移動 */ }
FILE構造体を使って、100MBのファイルを1MBのファイル100個に分割したいのですが バッファを1MBにしてfreadするのは効率が悪いでしょうか?
1MBだと足りないね
618 :
616 :2010/09/02(木) 06:44:40
>>617 char buf[4096]とかってをよく見ますが、これじゃ小さいですか..
ちなみに、file構造体って1バイトずつのアクセスでいいんですよね(確認だけど)
splitコマンドのソースを見たら、buf[MAXBSIZE]と宣言してあって、 MAXBSIZEは65536だった。
つーか、敢えて車輪の再生産をすることもなかろうに。
>>618 FILE構造体はバッファを4096とかにしてても
1バイトづつアクセスするとめちゃくちゃ遅くなる
>>616 ならバッファ1MBにしておいて1MB読んで書けばいいよ
二言目には車輪の再発明っていうやつは文型のアホであることが多い
誰も言ってねぇよ
車輪の再発明って良く聞くけどどういう意味なんだろ
車輪の再生産は鳩山一族にやらせて桶
626 :
デフォルトの名無しさん :2010/09/02(木) 12:16:41
>>610-611 レス、ありがとう。
makedepenedでかいけつできました。
ありがとうございました。
627 :
612 :2010/09/02(木) 14:26:05
>>614 singletonとはこの事なんですね。
>>613 そうしてみますね。ありがとうございます。
Singletonじゃねーよこのパターンはただのstatic変数にしろ
>>621 100MB一度に読んで、1MBづつ書くほうが効率的だよ。
質問です。 UIをC++でフルスクラッチで作ろうと思っています。 ゲームのUIのようなものを考えています。 参考になるようなサイト、スレ、書籍等を教えていただけたらと思います。 検索してもミドルウェアとかライブラリばかりがひっかかって 純粋にUIを作るというとこに辿りつけませんでした。 よろしくお願いします。
631 :
デフォルトの名無しさん :2010/09/03(金) 00:40:40
フルスクラッチの意味にあってるかどうかわからんがWinなら 「デバイスコンテキスト」でググレば幸せになれるかも
レスありがとうございます。 一応DCとってピクセルを描画等はひととおり経験済みです。 それで、それらを使ってUIを作るとしたとき どういった手順が定石というか定番の手法なのかというか その辺りを知りたいのです。 多分すごい初歩的?な質問かもしれませんが よろしくお願いします。
633 :
デフォルトの名無しさん :2010/09/03(金) 01:36:44
>>630 そのなもフルスクラッチで作るUIだかなんだかっていう本があったぞ。
ゲームのUIならDirectXやOpenGLで作らないと、 DC描画じゃゲームには向いていないんじゃないか?
それはない
>>633 もう少しヒントを!
ググル先生も絞り込めないみたいです。
>>634 メインはとりあえずOpenGLで作っています。
UI設計の基本的な考え方、ということで
環境依存の質問ではなさそうなので
環境を記述しませんでしたが
DirectXやOpenGLじゃないといけないor不利な
状況というものがあるのでしょうか?
637 :
デフォルトの名無しさん :2010/09/03(金) 04:29:31
>>636 あったよ、名前ちがってたわ。
組み込みGUI(ウィンドウ・システム)環境の設計と実装 [単行本(ソフトカバー)]
GDIは遅い 特にVista以降は遅い もっとも、テーブルゲームくらいならGDIでもいいんだろうけど
c++とc#の間で文字を通信するプログラムを作っており、文字コードの違いで苦労しています。 C#の日本語文字列はユニコードが使用され、c++で普通にTcharを使えばS-JISが使われて、 _tcscpyでの比較をすると同じ文字なのに同じと判定してくれません。 c++のほうでユニコードを使おうという結論にしたのですが、 TCHAR moji[100] = _T("比較対象文字") と定義すると、文字コードがS-JISになってしまいます。 MultiByteToWideChar(CP_ACP,0,moji,-1,NULL,NULL); とやろうにもtcharからLPCSTRへ変換出来ませんというエラーが出ます。 試行錯誤した結果 char moji[100] = {"比較対象文字列"} と定義してからなら上の変換関数に通り、ユニコードへ変換出来たんですが、 最初からtcharのみを使ってユニコードでの初期値代入する方法は無いのでしょうか?
STLのstackとかdequeとか_で始まってないやつは正式に標準テンプレートライブラリの一部なんですか?
stackとdequeは標準だが strcpy_sは標準ではないのでその判断基準はだめだな
>>639 TCHARまわりの知識に不安を感じるからTCHARや_UNICODEでよく調べてみろ。
VC使ってると仮定するけど、とりあえずはVCのプロジェクトのプロパティ→全般のあたりに
UNICODE関連の設定がないか調べてみろ。
>>642 設定はユニコードを使用するになっています。
また#define _UNICODEを書くと再定義しているという警告が出ます。
しかし具体的に書くと
c++のソースで定数として定義した「お」→0x304a
c#から持ってきたデータの「お」→0xa882
と別データになっています。
いろんなサイトを見てL"お"なども試しましたが、やっぱり0x304aになります。
http://pentan.info/php/reg/is_hira.html このサイトを見て、C#側はユニコード、C++はS-JISと判断しました。
ちなみに最短だと tchar moji[100] = _T("お"); MultiByteToWideChar(CP_ACP,0,(char*)moji,-1,NULL,NULL); という強引なキャストでいけるかなと試したのですが、なぜかこの場合変換されません。 最初の変数の型をcharにしないと、最初に入れられる値が変わってきて変換対象とされないのかなと思ったりしてます。
ユニコードを使用しない設定にすると最初のTCHARがcharと判定されて、 定数の変換自体は上手くいくかもしれませんが、 行う予定の数々の文字列処理はユニコードなのでそのあたりで問題がでそうな気がします。
配置newで使われてる領域か使われてない領域か判断する方法って vectorみたいにこっからここまでっていう目印をつける オブジェクト1つに対してフラグになるものも余分にひとつどこかに用意する ほかになんかいい方法ありますか?
>>643 落ち着いて自分の書き込みとそのサイトをもう一度よく見比べてみるんだ
>>648 あれれー?
ちきしょう、サイト管理者めいつの間に内容を変えたw。
www
>>647 どうやら荒しのアホにコピペされたようです
マルチではありません
>>637 ありがとうございます!
さっそくポチってきます。
こういうのは「組み込み系」になるんですね。
勉強になりました!
配列のある要素のポインタから、インデックスを知りたいのですが なにか方法はあるでしょうか?
↑インデックス値でした。 目的のポインタから配列の先頭ポインタを引いたらできました
要素のサイズで割る必要がある charなら1だから引くだけでいいけど
イテレーター作るときってiterator_tagとかもつけたほうがいいの?
>>656 あくまで同じ配列のポインタ同士の減算だから個数が得られているだけだから、
嘘は言いすぎだろ、メモリ配置的に考えて
その例ならunsignedで引き算するなら割る必要があるんだし
((unsigned)&bar[5] - (unsigned)&bar[0]) / sizeof(T)
冗長だから&bar[5] - &bar[0]の方が良いという意見は納得できるが
659 :
658 :2010/09/05(日) 01:33:51
ちょっと変な書き方か 同じ配列のポインタ同士の減算では割る必要がないが、 ポインタの数値の減算は割る必要がある というので「嘘教えんな」だとほんの少し違和感があっただけだ 蛇足かもしれんが
sizeof(char)が絶対1なのはC++もそうなんだっけ? 忘れちゃったよ
もうこのネタじゃ盛り上がらんな
>>658 ポインタとアドレスの区別ついてないだろw
>>660 [expr.sizeof] 5.3.3 Sizeof
The sizeof operator yields the number of bytes in the object representation of its operand. The operand
is either an expression, which is not evaluated, or a parenthesized type-id. The sizeof operator shall not
be applied to an expression that has function or incomplete type, or to an enumeration type before all its
enumerators have been declared, or to the parenthesized name of such types, or to an lvalue that designates
a bit-field. sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; the
result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined. [Note: in par-
ticular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.
69)
] [Note: See 1.7 for
the definition of byte and 3.9 for the definition of object representation. ]
>>663 どのあたりが理解不足かはっきり説明してくれ
言い訳というかそもそも俺は655じゃないんだが^^;
とうとう他人のふりかよ・・・・・・・
もう信じないなら別にいいわ、勝手にそう思っててくれ ここは質問スレだしな
はいはい
ポインタには型があるから、要素のサイズで割るなんて寝言は出てこない
よかったね〜^^勝手に勘違いして優越感に浸れて
char a[5] = { 0, 1, 2, 3, 4}; short b[5] = { 0, 1, 2, 3, 4}; long c[5] = { 0, 1, 2, 3, 4} ; printf ( "%d\n", *a+1 ) ; printf ( "%d\n", *b+1 ) ; printf ( "%d\n", *c+1 ) ; これの表示結果が全部1になるなんてポインタの初期の初期に覚えることじゃ なぜサイズで割らないといけないとか発想がでるのかわからない
>>658 unsigend って unsigned charの略じゃないって知ってるか?w
>>676 unsigned intの意味だが別にそこ問題じゃなくないか?
>>675 printf ( "%d\n", *(a+1) ) ;
printf ( "%d\n", *(b+1) ) ;
printf ( "%d\n", *(c+1) ) ;
では?
馬鹿ばっかだなほんとwwww
>>680 結果が一緒だろうが過程が・・・・・
そんな紛らわしい配列の中身にすんなよwwwwww
>>678 のいう通りだな
char a[5] = { 0, 2, 2, 3, 4};
short b[5] = { 0, 2, 2, 3, 4};
long c[5] = { 0, 2, 2, 3, 4} ;
printf ( "%d\n", *a+1 ) ;
printf ( "%d\n", *b+1 ) ;
printf ( "%d\n", *c+1 ) ;
は1が出力される
で、なに?
>>675 これは[0]の0に+1したのを出力する事を想定してるのか
それとも[1]の1を出力する事を想定してるのか
どっち?
>>685 流れからして明らかだろ
いまさらなにいってんだよ
単項式が優先されるんだから、当然前者だろ。
>>675 が実際どっちで動いてるかの話じゃないと思うんだが
qmakeとcmakeでは何が違うのかわかりません 基本的にはmakeファイルを作るものだと、考えているのですが
omakeです
ore no makeです
すみません。 int型に入れた 00001 という数字(当然ただの1になりますが)を、 処理後にchar配列型に入れて 00001 に戻す場合、どうすれば手短に実現できるでしょうか? 今はstrlenで長さを取り、足りない回数forを回して継ぎ接ぎしているのですが。。
>>693 四行目の説明からして文字列にしたやつを戻したいってことだよなぁ?
sscanfなりatoiなりstrtolなり好きなの使えばいいじゃん
boost::lexical_cast
>>693 printf("%05d",n):
じゃないのん?
やりたい処理が見えてこないのでなんともいえない 最初にintに入れるときに桁数を別に覚えとけばいいんじゃないのか
698 :
デフォルトの名無しさん :2010/09/06(月) 22:15:11
0パッディングの長さが固定なら int n = 1; char buf[6]; sprintf(buf, "%05d", n);
699 :
デフォルトの名無しさん :2010/09/06(月) 22:16:37
パディング...
>>698 このソースの場合、俺は
char buf[100];
とする派。
そうだなあ。理由があれば別だけど、適当に大きなサイズにするかな 無意味にチャレンジすることないし
a = -1; a %= 10; ってやったらaの値は-1なんだけど、これってどのコンパイラでも保障されてる?
>>702 CならC99より前ではされてない、しかも本当にコンパイラによって違う
C99で決められた
C++は知らね
C++0xからだよ
thx 素直に-1と0以上で場合わけするか…
>>694-701 %05dというのが有るんですね。処理を減らす事ができました。ありがとうございました。
なぁに、礼はいらねぇよ
Cコード中の数値リテラルで頭に0付いてると8進扱いだっけ?
>>709 そうです。だからCでは10進整定数の0は存在しません。
>>710 残念
8進数定数の0が存在しないのでした
0は0が先行するから8進定数ってことだろ。
というか決まってるの0をどっちにするか?w
事実上どっちでも同じだろ。規格がどうなっているかは規格スレでやってくれ。
馬鹿に限って仕切りたがるw
gccのa.outはオブジェクトファイルですか?それとも実行ファイルですか?
720 :
717 :2010/09/08(水) 21:03:02
質問! vector<CLASS*> array; と宣言した配列に、 CLASS obj=CLASS(); array.push_back(&obj); という感じに要素を追加しようとするとエラーが出るんですが、 単純にポインタ型の動的配列って出来なかったりするんでしょうか?
>>721 vectorに突っ込むのはできる
お前が別なとこで間違ってるだけ
>>722 私の方のミスでしたか……
いろいろ試してみます!
ありがとうございました!
724 :
デフォルトの名無しさん :2010/09/09(木) 12:03:11
1と01はコンピュータはどちらも1として扱うのでしょうか?
状況次第
726 :
デフォルトの名無しさん :2010/09/09(木) 16:54:13
C++のフリーコンパイラを教えてください? というかみんな何使ってるんですか?
Visual C++ 2010
非公開の自作コンパイラ
>>729 forkは自プロセスを複製します
忍者みたいに自分が2人に分身するわけです
そうするとforkから戻ってきたときには自分が2人いるわけです
元々の親プロセスと、新しくできた子プロセス
親プロセスの方は、forkの戻り値が子のプロセスID (1以上) になります
子プロセスの方は、forkの戻り値が0になります
(エラーの場合は -1)
ここのサンプルだと、親の方は exit で終了して、子の方はそのまま close 以下略を実行するわけです
>>729 質問の意図がよく分からない。
forkが知りたければ"マルチプロセス fork"あたりで検索を。
Linuxだけで動けばいいならdaemon(3)があるよ
733 :
729 :2010/09/09(木) 20:00:21
>>730 あぁ、自分を複製しているから、こんな奇妙な流れなんですね・・・。
直後のケース文含め、なぜこの流れなのかようやくわかりました。
どうもありがとうです。
ってあれ?
これって自己複製をループさせたら、恐ろしいことになりません?
>>732 deamon(3)ですか、探してみます・・・。
もちろんリソースが許す限り幾らでも子作り可能。
735 :
729 :2010/09/09(木) 21:37:56
>>732 daemon()使ったら、かなり簡単でした。
おかげで、スタート時に自前のサーバーを起動できます。
ありがとうございました〜〜〜。
>>734 恐ろしいですね・・・・。注意して使います・・・。
>>726 g++(gcc) と bcc32 も併用しています。bcc32 はメッセージが日本語なのでわりと便利です。
gccだったと思うのですが スタック領域に動的確保できる関数があったと思うのですが何という名前だったでしょうか 使うわけではないのですが、思い出せなくて気になります
calloc
非標準だから自分でスタック領域のアロケーターを作りなさい
C99にその機能があるよ
>>740 そうそれだありがとう
思い出せなっくてもやもやしてただけだったので、使う予定はないです
心配していただいてありがとうございます
大体gccなら可変長配列対応してるしね
C99は非標準だろぶっちゃけると
お前がそう思うんならそうなんだろ(ry
非常に簡単なクラスの問題なんですが どうしてもエラーが解消されないのでご教授御願いします エラー部は一番下のcoutの部分の様なのですが・・・ VS2010でコーディングしています #include<iostream> using namespace std; class myclass{ int a; public: void set_a(int num); int get_a(); }; void myclass::set_a(int num){ a=num; } int myclass::get_a(){ return a; } int main(){ myclass ob1,ob2; ob1.set_a(10); ob2.set_a(99); cout<< ob1.set_a() <<"\n"; cout<< ob1.set_a() <<"\n"; return 0; }
set_a()とget_a()の入れ間違え。
get
笑わせるなー!
バグは本人が気付かないからバグなんだよ!!!
wwww
雪駄と下駄の間違いか
756 :
デフォルトの名無しさん :2010/09/12(日) 01:21:44
自演乙
これは恥ずかしい自演
でも自演じゃないんだぜっていう自演
ということにしたいのですね(ヘミ略
763 :
デフォルトの名無しさん :2010/09/12(日) 05:48:56
764 :
753 :2010/09/12(日) 10:08:47
前からネタにしているのにこんなに反響を呼んで、正直驚愕している。 のはいいけどさぁ、ほどほどにしようや。
なんつーか相手にしたくないレベルの間違いだな
char[]、char*な文字列をstd::stringのインスタンスに突っ込むのはよく紹介されてますが charの1文字をstd::string化するにはどうすれば良いでしょうか
1文字ならcharでやれば? 1文字だって分かりやすいよ
char tmp[2]; // こうして tmp[0] = c; // こうして tmp[1] = '\0'; // こうして string s(tmp) // こうとか
string s(1, 'A'); みたいなコンストラクタってなかったっけ。
>>767 自作クラス群の共通的なメンバ関数(親抽象クラスにて宣言)があり
このクラスでは1文字を返しますが、他クラスでは2文字以上返す可能性があるため
stringで返すよう揃えたいんです。
>>769 ありました…('A')
そうか、1つめの引数を1にすれば良いんですね
string s(1,c)で生きます
>&"warning: GDB: Failed to set controlling terminal: 何ですか、これ?
772 :
デフォルトの名無しさん :2010/09/12(日) 20:16:16
GDBを制御するために変数の名前でもいれろって話じゃね? てかググればでてくるとおもうぞ。
773 :
771 :2010/09/12(日) 20:20:03
namespace hoge { void setXXX(); void getXXX(); } class Hoge { public: static void setXXX(); static void getXXX(); } あなたならば、どちらを使いますか?
場合によります
どっちも縁がないなぁ
C言語ではstaticの付いている関数/変数は、ヘッダファイルに書かなくてもいいんですか? また、*.cにだけに書いた関数は、staticが無くてもstaticと同じになるんですか?
>>777 staticの有無とヘッダファイルに書くかどうかは直接関係ありません。
また、staticがない関数はある関数と同じにはなりえません。
>>777 > C言語ではstaticの付いている関数/変数は、ヘッダファイルに書かなくてもいいんですか?
書くことはできるけど複数ソースファイルでそれをincludeすると嫌なことが起きうる。
> また、*.cにだけに書いた関数は、staticが無くてもstaticと同じになるんですか?
ならない。
780 :
777 :2010/09/12(日) 22:52:34
>>778 >staticの有無とヘッダファイルに書くかどうかは直接関係ありません。
ここを、kwsk教えてください
2行目はOKです
782 :
777 :2010/09/12(日) 22:58:20
>>779 static関数・変数はヘッダファイルに書かないのが常識なのですか
ありがとうございます/
>>782 staticには静的領域って意味もあるけど、
そのソースファイルでしか使えないって意味もあって多分にこっちの方が重要。
(だからソース間での共通項を書くincludeファイルに書くことはまずない)
784 :
777 :2010/09/12(日) 23:18:13
>>783 そういう意味だったのですか
わざわざ、すみません
785 :
デフォルトの名無しさん :2010/09/13(月) 14:21:17
if( smd.nennrei == 07 || smd.nennrei == 08 ){ 省略 } を行うとeroor C2041 指定された文字8は基数8に適切な数字ではありませんとでます。 どうすれば良いでしょうか?
07 → 7 08 → 8 にすればよいです
787 :
デフォルトの名無しさん :2010/09/13(月) 14:25:29
無事できました。 返信を早くしてくださりありがとうございます。
どひゃー
C++の優しい入門本教えてください
猫でもわかるシリーズなどお勧めでございますよお客様
本で入門すると、すぐその本が要らなくなっちゃったりするよ 入門はwebの資料で済ませて、手元に置いておく資料には中級者向け以上のものを買うのオススメ
個人的には本をお勧めするけどな C++のweb資料って多過ぎて、整理されたものを探すのは意外と手間 初心者こそ整理された本な気がする
webの情報をお勧めする 専門書で他人との相互理解を深めたいときには書籍
適当に売れ筋の本買えばいいんだよ。 これがFAに決まってる。
Cやった人向けだろみたいな内容でも初心者向けとして得られてる奴とか 名前空間とかstringstreamとか導入前の本とかには気をつけろ
for (i = 0; i < 10; i++) { printf("%d\n", rand()); } これを何回実行しても同じ結果しか出ないんですが ランダム係数って言うのは「ランダムに見える特定の順番の数字を出力する関数」なんでしょうか それとも使い方を間違ってるんでしょうか
srandでぐぐれ。
srand()を使う
srandで種を設定しないとだめ
ありがとうございます それでためしてみます
for (i = 0; i < 10; i++) { srand(0); printf("%d\n", rand()); } こうですか? 同じのばかり出ますが
違う srand(rand()); でやってみ 毎回違うのが出るから
そりゃ同じ種からは同じ数しかでない
for(i = 0; i < 10; ++i) { srand(rand()); printf("%d", rand();) } こんな感じで使う
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int ac, char **av) { int i; time_t t; time(&t); srand(t); for(i = 0; i < 10; i++){ printf("%d\n", rand()); } return 0; }
おまえらふざけすぎ
rand() と srand() の Linux C Library 版は、 random(3) と srandom(3) の両関数と同じ乱数生成アルゴリズムを使用している。 そのため、下位のビットは上位のビットと同じくらいにランダムである。 しかし、旧版の rand() の実装や、他のシステムの現在の実装では、下位のビットが上位のビットほどランダムになっていない。 移植性を高める場合でも、精度の高い乱数が必要なアプリケーションではこの関数は使用してはいけない (代わりに random(3) を使うこと)。
あっそ
無駄に煽るから、せっかく間違いに気がつかせても頑固に間違ったまま使い続けるようになるんだよ。 同じような流れを何度も見た気がする。
>>789 独習→accelarated c++ はいかがでしょうか?
814 :
813 :2010/09/13(月) 23:42:41
>>806 それではばらつかない。
質問の意図からすれば srand(time(NULL)) あたりがいいかと。
for (i = 0; i < 10; i++) { srand(time(0)); printf("%d\n", rand()); } こうですか? うまくいっているみたいですが
for (i = 0; i < 10; i++) { srand(i); printf("%d\n", rand()); } こうした方がいい
>>816 1秒間でループしたら同じ乱数系列しか出ないだろ
srandは起動時に1回だけ呼び出せばいい
>>817 srand() はプログラムの頭に一回実行するだけでよい。ループの中で srand() するものではない。精進せよ。
まとめると srand(time(0)); for (i = 0; i < 10; i++) { srand(i); printf("%d\n", rand()); } こういうことか
まとまってねえw
でけた #incllude <sys/time.h> for (i = 0; i < 10; i++) { struct timespec ts; nanotime(&ts); srand(ts.tv_nsec); printf("%d\n", rand()); }
>>821 だからループの中で srand() しなおす必要はない。精進せよ。
>>824 勘違いしてた
srand(time(0));
for (i = 0; i < 10; i++) {
printf("%d\n", time(0));
}
こうか
srand(clock()); for (i = 0; i < 10; i++) { printf("%d\n", rand()); }
乱数がこんなに難しいとは。俺にはプログラムは無理なのか。
>>828 プロセッサ時間をシードにするのは‥‥‥思ったほど偏らないかと。
clock() は処理系依存だな 0 返しても良いらしいし
832 :
デフォルトの名無しさん :2010/09/14(火) 02:06:33
これは電設的な良スレ
#incllude <sys/time.h> struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); srand(ts.tv_nsec); for (i = 0; i < 10; i++) { printf("%d\n", rand()); }
vector<foo> v; この場合遅延評価されてメモリ確保されないことは保障される?
格納するfooの領域なら確保しないけど それは遅延評価とは呼ばないよ
え、そうなんですか 今やらなくてもいいことを後回しにする(この場合プッシュされるまで確保しなくてもいい)のは全部遅延評価だと思ってました
bool F_a(bool b, bool c){ if (b) return true; // X if (c) return true; // Y } F_a( F_b(), F_c() ) という式があったときに, 1. X で b を参照している←この時点で初めて F_b() が評価される 2. もし b がtrue なら c は評価されない = F_c() は評価されない ってのが遅延評価
838 :
デフォルトの名無しさん :2010/09/14(火) 20:48:38
入力チェックなどで、return文を使う事があると思いますが あなたは1つの関数に何個までreturn文が許せますか?
100こぐらい
必要なだけの個数
例外とassert使え
>>838 なんこでも必要ならしかたがないでしょうね。
個数よりも深さかな
classの中の関数で自分自身を開放できたりしますか? 例えばこんなの class A{ public: A *me; void Del(){ delete me; } }; int main(){ A *a=new A; a->me=a; a->Del(); }
>>844 できるよ
ただしdelete文を実行後はメンバ変数にアクセスしちゃいけなくなる
てゆーか delete thisもできる
ありがとうございます。出来るんですね。 エラーは出てなかったけど、意図の通りに動いてるか心配だったのでよかったです。 リスト構造のクラス作りたかったのでこれは便利ですね。 でも、次は試しに大量に確保、関数で開放しようとしたら、a[1].Del();でエラーが 出てしまいます。 a[i].me=&a[i];消してme使わずdelete thisとしても同じでエラーが出てしまいます。 何故でしょうか? new[]で確保したのは、一つずつ開放は無理で、delete[]で一気に開放しないといけないとか? class A{ public: A *me; void Del(){ delete me; } }; int main(){ const unsigned int f=10000; A *a=new A[f]; for(int i=0;i<f;i++){ a[i].me=&a[i]; } for(int i=0;i<f;i++){ a[i].Del(); } }
配列の解放はdelete [] で行うだろ? そういうことだ
>>847 >new[]で確保したのは、一つずつ開放は無理で、delete[]で一気に開放しないといけないとか?
そうですよ。
delete this;を効果的に利用できるシーンってあんまりなくて、
行儀が悪いと言われる事もあるよ。Del()と言うメソッドを呼び出すなら、
delete this;でデストラクタ呼び出したって構わないでしょ。
それに常にヒープ領域に確保されていなければならないって事になる。
ありがとう、そういうものなのね 双方向リストを作りたかったので、前後クラスの前後を指すポインタの修正をして、自分を削除。 というDel関数を作ろうとしてた。 けど、よく考えるとデストラクタにポインタ修正の処理入れるだけの方が効率よさそうですね。
質問なんですが ヌル文字を含む文字列へのポインタ又は配列はその文字列の長さを予めどこかに保存しておく以外に サイズを取得することは無理でしょうか つまり下のような文字列の正確なサイズ取得法です LPCTSTR str = "hoge\0hoge"; どこで終端がわかるんだって話になってかなり無理そうですが…
最後の文字列の後に更に0を付け加える(2個0が連続したら終了)。WindowsのAPIでそういうの有るだろ。
>>852 ありがとうございます、でも申し訳ありませんがちょっと重要なものが抜けてました
ヌル文字を含んだ文字列と通常の文字列を一律に扱うことを考えまして
そのサイズを取得できればと考えたのです
つまり
>>851 のstrは"hoge\0hoge"にも"hoge"にもなりうるんです
解決策としてはすべての文字列の最後尾に\0を付けて手動的に二連ヌルにするしか無いでしょうか
C/C++の世界じゃむりなんじゃねえの? 頑張っても無理があるという意味も含めて。 素直に書かない書き方はみんなの身を滅ぼす。
> ヌル文字を含んだ文字列と通常の文字列を一律に扱うことを考えまして 文字列とは「0が2個続いたら終端」。このように定義すれば、 1 str = "hoge\0"; 2 str = "hoge\0hage\0"; 1も2も「通常の文字列」 当然、str*系の標準関数は使用できなくなる。文字列の定義が違うんだから当たり前だ。
2連nullではhoge\0\0hoge\0\0が取れないのでだめです 正解は文字列先頭の連続した\0と同じ数だけ\0が連続したらそこを終端とすればよいわけです ex. \0\0\0hoge\0fuga\0\0piyo\0\0\0 これならば先頭と末尾の\0の数を増やせばどんな文字列にも対応可能です
>>853 >解決策としてはすべての文字列の最後尾に\0を付けて手動的に二連ヌルにするしか無いでしょうか
というか、この方法で何がまずいの?
858 :
851 :2010/09/15(水) 14:59:29
確かに僅かな効果のために様々な利便性を捨てるのはまずいですね
やはり特殊文字列は特殊文字列として扱うようにします、ありがとうございました
>>857 全ての文字列の書き直し、文字列関数を使っている部分の書き直しの手間と
ただヌル文字含文字列が扱えるというその結果を考えてちょっとどうだろうと思いました
釣りです
>>856 その方法は先頭に"\0"を置く事が出来ないのでダメ。
一方、ロシアは'\t'で区切った。
>>861 判断基準の文字を\0から任意の文字に置き換えればおk
>>863 その判断基準の文字で始まる文字列を先頭におけない。
これくらい、すぐ気付け。
>>864 判断基準の文字を動的にかえればいい。
これくらい、すぐ気付け。
866 :
851 :2010/09/15(水) 15:31:34
通常の文字配列の代替を目指しているstd::stringよりも軽量で簡素な文字配列クラスを作ってます
とりあえずほとんどのところは置き換えられたのですが
>>852 も言っているような
GetPrivateProfileSection関数などで得られる特殊な文字配列に関して色々問題が考えられたんです
がんばってもどうせstringの方が上に一票
文字列終端は \0\0 文字列としてのNULは \0X (Xは\0がいくつ続くか) と記憶しておいて,文字列が欲しい時は \0X を展開した文字列を生成する参照関数でもつくっとけ
>>868 終端の\0\0の後に偶然\0が入ってたら死人が出る
長さを先頭に書いた方が圧倒的にましだな。
でもそんなに一杯終端文字列つけると 何のためにサイズ用の変数捨てたんだろうってならないんだろうか
あ−あれね
BSTRのBはBASICのB
自動生成されるコピーコンストラクタと代入って基底クラスのコピーコンストラクタと代入を勝手に呼んでくれるでおk?
自動生成される限りはOK
どうもです
//Number of vehicles within the problem VehicleNo = data->getFleetVehicles().size(); //Number of vertices within the problem DemandNo = data->getVertexs().size()-1; //Getting the capacity of the first vehicle in the fleet vehicles map VehicleCapa = data->getFleetVehicles().begin().value()->getCapacity(); というプログラムがあったのですが、これは何を行っているのですか? 正直、何故2番目が size()-1 か、や begin().value() も何故この順序なのかもわからないレベルです 説明か、手がかりになることだけでも教えていただけるとありがたいです スレ違いでしたらすいませんが、よろしくお願いします
そこだけ切り取られても
void Log::setOutputFile(const QString & file,bool rotate,bool handle_qt_messages) { priv->setOutputFile(file,rotate,handle_qt_messages); } 関数の中身を見てみると、1行しか書いていない事が多いのですが これは、実装の変更をしやすくするためですか?
>>882 申し訳ありません、区切りとしては
void VRPAlgorithm::setData( LogVRPData* data ){
//Number of vehicles within the problem
VehicleNo = data->getFleetVehicles().size();
//Number of vertices, not including the depot, within the problem
DemandNo = data->getVertexs().size()-1;
//Getting the capacity of the first vehicle in the fleet vehicles map. It is assumed that all fleet vehicles have the same capacity
VehicleCapa = data->getFleetVehicles().begin().value()->getCapacity();
//allocating demand memory
DemandQ = (int*)calloc( DemandNo+1, sizeof(int) );
//setting up DemandQ values
QMap< uint, GKLogVertex* >::const_iterator iter, iterEnd;
iterEnd = data->getVertexs().end();
for( iter = data->getVertexs().begin(); iter != iterEnd; ++iter ){
//trying to convert a GKLogVertex into a GKClient
GKClient * client = dynamic_cast<GKClient*>( iter.value() );
if( client != NULL ){//the vertex is a client
DemandQ[iter.key()] = data->getClientProperty( client ).getDemand();
}else{//the vertex is a depot
DemandQ[iter.key()] = 0;
}
}
となっていて、プログラムの一番始めは
#include "VRPAlgorithm.h"
#include "LogVRPData.h"
#include "GKFleetVehicle.h"
#include "GKClient.h"
となっています
>>881 何のプログラムかわからんので…
一般的なテクニックの話でいうと、
size()-1するのは、配列の最後の添字を取り出したいときによくやる。
aが配列だとして、
sizeof( a ) == 3
だとすると、
a[0], a[1], a[2]が存在する。
3-1で、最後の2が出る。
begin().value()とかはもうその先の実装がどうなっているかわからないので、
答えようがないんだけど、よくあるパターンとしては、
getFleetVehicles()が返してくるオブジェクトがイテレータで(配列みたいなもの)
その中に入っている複数のデータを順番に取り出したい時に、begin()という
メソッドを呼び出すと、オブジェクトの配列を返してくる。
で、そのオブジェクトがvalue()というメソッドを持っていて、
おそらくは、そのメソッドはそのオブジェクトが抱えている要素の数を返してくる、
ってなことでしょう。
雰囲気的にはVCか?
Document-Viewっぽいなw
>>885 丁寧に説明してくれてありがとうございます
全部で600行くらいあるので、一部だけしか載せられなくて申し訳ありません
プログラムは最適化問題のもので、計算ソフトの関係でVCで書き直しているみたいです
GKFleetVehicles.hやGKClient.hというのが元々ソフトに組み込まれている(?)ので、
その計算ソフトの方で車両の数などの条件を決め、それを読み込む(?)部分です
参考書の「クラスメンバのアクセス」などを読んでもほぼ素人なので全くわからない状態でして
もし参考になるサイトや本、C++のどの部分の知識が必要か等のアドバイスがあれば
何でもいいので教えていただけると助かります
言い訳になりますが、素人で質問の仕方も悪くて本当にすいません
つまり data->getFleetVehicles().begin().value()->getCapacity(); の構文が理解出来ないとかそういうレベルの話だったのか?
>>887 恥ずかしいですがそうです
本当に下らない質問で申し訳ないです
教えていただけないでしょうか?
ポインタdataが指すオブジェクトのメンバ関数getFleetVehiclesを呼び出して その返り値のオブジェクトのメンバ関数beginを呼び出して・・・・・ってことを繰り返してる と考えるのが妥当だろう
>>889 どうもありがとうございます
何回も答えていただいて感謝してます
教えてくれたことをもとに考えてみます
>>890 つーかだね、とりあえずCは書けるの?
まずCを覚えないと、C++なんて無理だぞ?
Aもまだなんです・・・。
>>891 JavaとCとアルゴリズムを講義で基本だけ学んだだけです
C++の本を読みながらやっているのですが
どうも合わないようで正直困ってます
もう一度見直します
>>891 そうとは言い切れない部分もあるけどな
確かにC++の資料はC知ってる前提のが結構多いが
そもそもは別の言語だし、Cと違って高級言語らしいやり方も可能なわけで
数としては少ないが、説明順が
iostream&文字列リテラル→string→制御構文→vector→関数定義→参照渡し→その他ライブラリ→配列→char[]→ポインタ
みたいな感じの書籍もある、知った時はちょっとしたカルチャーショックだった
>>893 うーん、じゃあ、まず、「C++ 入門」とかで検索して、自分で読めそうな入門サイトを選びなよ。
(とりあえずgoogleの上位から選んでおけば、どれにあたってもまず問題ない)
で、とりあえず、
クラスを定義して、そこからインスタンスを生成して、メソッドを呼び出す
というところまでは、はしょらずに勉強しなさい。
そこまでいく間にわからないことがあれば、それをこのスレで質問してもいいし、
そこまで行ったら、また戻ってきて、改めてこのスレの自分の質問と回答ながめて、
理解できない所を質問すればいいと思う。
>>894 確かに。
実際、俺はphpしか組めない奴に、
boostのライブラリとかインストールしておいてやって、それらの使い方だけを教えこんで
プログラムを書かせたことがあるw
まあ、多少手直しもしたけど、大筋は動いたわさw
でも、この場合に限っては、VCでのソースを読まなきゃならないってものだから、
Cがわからない、ポインタわからないだと話にはならないだろうな、と思って。
名前から電話番号を調べるときはSTLの map<char*, int> を使えばいいと分かるのですが、逆に電話番号から名前を調べるときはどうするのがいいですか やっぱり逆向きのマップも作って置いた方がいいですか?
つ[find()]
900 :
897 :2010/09/17(金) 09:27:35
std::find_if が使えるかな? ためしてないけど。 チェックするための関数の引数は const std::pair<K,V>& になるかな?
型が書いてあったね、 const std::pair<char*,int>&
memcached
void func(x, y, z) SugokuNagaiKataNoNamae x, y, z; { ・・・ } これってC限定なの? けっこう便利だと思うんだけどなぜかC++では通らない・・・
大昔のC言語の機能
ANSI以前から使われていた古い書き方で、C++では無くなった
拡張子「.c」で保存
>>904 便利?
自分は引数を2回書くので面倒だと思った
>>908 型の名前が長いのを一回で済むって話だろ
ばかじゃね
>>909 頭大丈夫か?
だからその代わりに変数を2回づつ書かないといけないんだろ。
上の例なら変数6回も書いてるぞ。
そもそも長いタイプ名が嫌なら、短いタイプ名にすればいいんじゃないのか。
あとタイプ名が長いのが好みなら、変数名も長いのが普通だろ。
変数名が長ければ余計にタイプ量増えるぞ。
で、関数ごとにイチイチ書き方変えるなんて面倒で持ち悪いぞ。
昔はこの書き方しかできなかったら、そう書いてただけで、
今の書き方ができるのに、わざわざ昔の書き方で書く人なんていなよ。
で、どこが便利なんだ?
質問です VC2010でコンパイルしたstatic libraryを VC2008でリンクしようとするとエラーが出るのですが、 1>LibTest_d.lib(WiiLibrary.obj) : warning LNK4229: 無効なディレクティブ '/FAILIFMISMATCH:_MSC_VER=1600' が見つかりました。無視します。 1>LibTest_d.lib(WiiLibrary.obj) : warning LNK4229: 無効なディレクティブ '/FAILIFMISMATCH:_ITERATOR_DEBUG_LEVEL=2' が見つかりました。無視します。 1>LibTest_d.lib(WiiLibrary.obj) : error LNK2019: 未解決の外部シンボル "class std::error_category const & __cdecl std::iostream_category(void)" 根本的にこれは無理なことなのでしょうか? 2010→2010では成功しているので基本的な設定は正しいはずです
>>904 変数宣言もコンマ演算子で列記できるんだから
統一的な観点から仮引数も同じ型の場合コンマでつなげられればいいのに
913 :
デフォルトの名無しさん :2010/09/17(金) 18:27:21
すみません。初心者です。 boost::vectorやboost::arrayなどの配列(固定にせよ、可変にせよ) で、はじめは0なのですが、こちらをフレキシブルに、例えば1から始まるようにできませんか? もしくはそのような機能を備えたコンテナなどありましたら教えてくださいませ。
>>913 ちょっとやりたいことが不明瞭だが、
1、どうしても1からはじめたければ0を無視する
2、配列に追加していきたいならば、
vector<int> Array;
Array.reserve(30);//30この領域確保
Array.push_back(2);//追加
3、2だとあくまでも配列だから、どこまで追加してもパフォーマンスが落ちない
list<>の双方向リンクリストを使う
やりたいことと合致していればうれしい
struct At { std::size_t value; At(std::size_t v) : value(v) {} }; template <class C> typename C::reference operator | (C & c, At at) { return C[at.value - 1]; } template <class C> typename C::const_reference operator | (C & c, At at) { return C[at.value -1]; } int main(void) { std::vector<int> v(10); v|At(1) = 100; // v[0] = 100; v|At(11) = 1100; // v[10] = 1100; return 0; }
確かvbとか1から始まるんだっけ
VB は配列の先頭が 0 か 1 か選べる変態言語 (VB.NET では出来なくなった)
そりゃバグの温床だからな で どっちに統一されたの?
int allocated[size + 1]; int * const array = allocated; or int allocated[size]; int * const array = allocated - 1; 後者だと、厳密には実装依存なのかな。大抵巧くいくはずだけど。
new int[0]; で帰ってくるのは0(NULL)じゃないんでしょうか?
>>922 いや、文法的には通るでしょ。
で、普通のコンパイラは1バイト確保されると思う。
なるほど。確保はされるんですね。 スッキリしました。 ありがとうございました。
925 :
923 :2010/09/18(土) 01:23:34
>>924 あ、でも、そんな書き方するべきじゃないよ?
プログラム的にそうなっちゃうとしても、それはできる限り避けてねw
あ、はい。了解です。 事前にサイズのチェックをします。(`・ω・´) シャキーン
>>921 後者は配列の一つ前の場所を算出しているが、その際にアンダーフローが起きない保証はない。
実際、そんな環境はないと思うが規格上は拙い。
ひょっとして質問者ってnew の失敗時NULLが帰ってくると思ってないか?
new int[-1]したらstd::bad_alloc exceptionが投げられますた
配列にマイナスってコンパイルエラーじゃないのか 動的だと出来るんだっけか?
もしかしたら[]の中身はsize_tと解釈されるので-1はUINT_MAXと解釈されて 最大限のメモリ確保をしようとしたのかもしれんね
932 :
929 :2010/09/18(土) 13:19:28
000000000040064c <main>: int main() { 40064c: 55 push %rbp 40064d: 48 89 e5 mov %rsp,%rbp 400650: 48 83 ec 10 sub $0x10,%rsp int* p = new int[-1]; 400654: 48 c7 c7 fc ff ff ff mov $0xfffffffffffffffc,%rdi 40065b: e8 c8 fe ff ff callq 400528 <operator new[](unsigned long)@plt> 400660: 48 89 45 f8 mov %rax,-0x8(%rbp) 400664: b8 00 00 00 00 mov $0x0,%eax } 400669: c9 leaveq 40066a: c3 retq 40066b: 90 nop 40066c: 90 nop 40066d: 90 nop 40066e: 90 nop 40066f: 90 nop こんなのでました(gcc-4.3.2 x86_64-linux)
933 :
デフォルトの名無しさん :2010/09/19(日) 00:30:56
long doubleの最大値と最小値を調べたら 最大値が-1.#QNAN0e+000 最小値が-0.000000e+000と表示されたのですがどういう意味なのでしょうか ソース #include <stdio.h> #include <float.h> int main(void) { printf("long doubleの最大値 %le\n", LDBL_MAX); printf("long doubleの最小値 %le\n", -LDBL_MIN); return 0; }
そのプログラムは間違っている long double は %Le を使え
テンプレートクラスって通常のクラスとはほとんど別ものと考えていいですか? ヘッダのクラス順序でこんがらがっていたのを(どこかに書いてあったとおりに)テンプレートクラスにしただけでほぼ解決しました これってどういう仕組みなんでしょうか (このテンプレートクラスは名ばかりのテンプレートクラスでテンプレート引数はまったく使っていませんし 最終的にはtypedefしてテンプレートであることさえも隠してます)
「テンプレート」の意味を分かってないだろ
どこが別物なのかわからん クラスであることに変わりないのに
すみません、ちょっと言葉足らずでした コンパイルの側面から見るとまったく別の過程を通ってるような気がしたんです 例えばテンプレート関数は普通に推論された型の関数が量産されるだけらしいのですが(間違ってたらすみません) テンプレートクラスでは上に書いたようにテンプレートであるただそれだけで 読み込み順序的に問題のあったコンパイルが通るようになる、 いわば関数のプロトタイプ宣言(ちょっと違うか)みたいな働きが確認されたんです もちろんクラスの前方宣言やポインタでは解決できなかったクラス内部でも他関連クラスのメンバが入り組んだ問題でした これはどこがどう変わったゆえなんだろうかと思ったんです
テンプレートの宣言と実体化の時間差にたまたま助けられただけだろう
文章の書き方から頭の悪さって滲み出て来るんだね
>>939 確かに調べてみたらコンパイル時の時間差について書かれているのを見つけました
どうやらそこら辺が通常のクラスとは違うようですね、さらに調べてみます
942 :
933 :2010/09/20(月) 12:23:59
>>934 %Leに変更してやってみましたが結果変わらず
どうすれば解決できますか?
ソース
#include <stdio.h>
#include <float.h>
int main(void)
{
printf("long doubleの最大値 %Le\n", LDBL_MAX);
printf("long doubleの最小値 %Le\n", -LDBL_MIN);
return 0;
}
943 :
デフォルトの名無しさん :2010/09/20(月) 12:28:13
配列の配列をSSE2を使ってベクトル化したいのですが、GCCで出来ますか? for(j=0;j<16;j++){ for(i=0;i<16;i++){ d1[j]^=GF[e1[j][i]]; d2[j]^=GF[e2[j][i]]; } }
VC++2010 デジタル時計作ってるんだがカーソル移動(?)がうまくいかない コレどこが間違ってるんだろうか #include <stdio.h> #include <time.h> #include <conio.h> int main(void) { time_t present_tm; struct tm *my_time; char *now_time; while (!kbhit()) { time(&present_tm); my_time = localtime(&present_tm); now_time = asctime(my_time); printf("\x1b[4;1H"); printf("now_time = %s\n", now_time); } return 0; }
reinterpret_castってどれ位処理時間がかかるんでしょう? 例えばキャスト以外は同じ内容の hoge(char* ptest)とhoge(void* ptest) という関数があり 後者は関数内でreinterpret_castでchar*に変換します そうすると実行速度は遅くなるんでしょうか? どこかでコンパイラ云々とあって変わらないようなことが書いてあったんですが どちらか分からなくて
946 :
デフォルトの名無しさん :2010/09/20(月) 12:41:14
実行時間の計測ですが以下の比較は正しいでしょうか? time ./a.exe>1 time gpg --chipher-algo AES -z 0 -passphraze aaaaa -ca 1
947 :
デフォルトの名無しさん :2010/09/20(月) 13:05:59
実行時間の計測ですが以下の比較は正しいでしょうか? time ./a.exe>1 time gpg --chipher-algo AES -z 0 -passphraze aaaaa -ca 1
>>944 printf("\x1b[4;1H");
のようなエスケープシーケンスはコマンドプロンプトでは動かないから別の方法でカーソル動かしてください
>>945 迷ったら実測。
まぁ、そのケースなら観測するまでもなく最適化されたコードは同じになりそうだ。
>>947 どこで比較しているのか判らない。
gpgというプロセスと等価のa.exeを作ったから処理時間を比較したいと言うことなら、
同じ入力に対して同じ出力が得られるように条件をそろえれば宜しかろ。
やりたいこと クラスのコンストラクタに、(x,y)を指定して、クラスのpublic変数に int num[x][y];を作りたい やったこと class Cul{ public : int *num; Cul( int x,int y ){ num = new int[x][y]; } } おこったエラー error C2440: '=' : 'int (*)[1]' から 'int *' に変換できません。 要はクラスが作成されるとき、指定されたx、yのサイズの2次元配列を動的に確保したい っていうことなんですが
>>948 具体的にどうすればいいのか教えてください
>>951 xの方は動かせるがyは固定
int (*num)[10] = new int [x][10]; みたいに
それかポインタのポインタとして擬似的に二次元配列を表現するしか無理
class Cul{ public : int *num; Cul( int x,int y ){ num = new int[x * y]; } } としてアクセスは num[i][j]に相当するのがnum[i * y + j] でごまかすのが無難かなぁ
>>953 なるほど……
できれば両方指定したかったのですが、とりあえず多めにサイズをとることで対処したいと思います
ありがとうございました
class Cul { public: Cul( int x, int y ) { num = new int*[ x ]; for( int i = 0; i < x; ++ i ) { num[ i ] = new int[ y ]; } } int** num; };
>>954 おお!
num[get_num( i , j )]
get_num(int i, int j ){
return i * y + j;
}
みたいな感じにしようと思います。
ありがとうございました
num.get(x, y)ってできるようにしろよ
>>956 ああ、そうやればいいんですね
みなさんありがとうございました!
もう一種類あるよな
ソース書く前に送ちゃったごめんなさい
なんでvectorを使わないの? vector<vector<int> > num(x, vector<int>(y));
ぱっと見にくいからだろう 自分でテンプレート化して作ってもいんじゃね? Array2D<int> intArray(30,20); みたいな
いままでconstたくさん使ってたんだけど、 よくわからない状況になってconst全部削除して解決した constは他人が触れる表面上の部分だけに使うものだと思う
>>964 お前C++0xに行って苦労するよきっと
は?
もうC++0x行っちゃってますが?
つまり・・・どういうことだってばよ
よくわからないダイイングメッセージだな
プログラミングについてお聞きしたいことがあります 宿題ではないのでこちらで聞きたいのですが、 宿題スレのアップローダーはこちらでも使っても良いのでしょうか? よろしくお願いします
971 :
970 :2010/09/21(火) 07:00:42
申し訳ありません、訂正させてください こちらのスレでコードパットを使って質問するのはダメなのでしょうか よろしくお願いします
いいとおもうよ
>>971 別に構いませんが。つーか、Codepadをなんだと思っているんだか。
そりゃあ、どう見てもintにGKTimeDurationを代入しようとしているから駄目なんだと思うが…… GKTimeDurationがどんな型なのかこっちで分からんから、そのヘッダーもよろしく
これ卒研かなんかだろ?
>>975 遅くなってしまい大変申し訳ありません
http://codepad.org/gbnTFw8C がGKTimeDurationです
>>976 卒論ではないですが、理解を深めるために
先輩がCで書いたものをC++で書き直せと言われました
ソフトの方がC++で書かれていて、GKClientProperty.hなどはソフトに入っているものです
プログラミング苦手なのですがそーゆー班に割り振られてしまって困ってます
1から作り直したほうが早いと思う
>>978 見てくださってありがとうございます
どーゆーことでしょうか?
980 :
デフォルトの名無しさん :2010/09/21(火) 09:12:56
ひらがなを文字コードに変換する方法を教えてください。
#include <stdio.h> #include <string.h> int main(int ac, char **av) { union { char hiragana[4]; int code; } ch; strcpy(ch.hiragana, "あ"); printf("%c\n", ch.hiragana); printf("%02x %02x\n", ch.code & 0x00FF, ch.code >> 8 & 0x00FF); return 0; }
また突っ込み所満載のネタを・・・
怖いよぉ
printf("%02x %02x\n", ch.code & 0x00FF, ch.code >> 8 & 0x00FF); こんなことするなら int と union する意味が無い エンディアン違う環境行ったらどうするつもりなんだ
985 :
デフォルトの名無しさん :2010/09/21(火) 11:08:07
? &n ? ,オォウヲォ l~~~~~~~l (C++) & (C++) , i[N] == ??? , / \√ ~~~~~~~~~~~~~~~~~~~~~~~~ MmMmMmMmMmMmMmM
みんな、スルー力を試されてるんだ。
>>979 遣りたいことを先ず整理すること。
CのコードをC++に1vs.1に修正するのか0から書き直すのか最初の方針を決めること。
1vs.1に修正するなら先ずは動くことを最優先に、一つずつ修正する。
どんな話の流れでGKTimeDuration型を使うことになったのかがよく判らんが、
それを使うのなら1vs.1に修正するのは諦めた方がいい。
988 :
デフォルトの名無しさん :2010/09/21(火) 11:50:37
今からやるならCかC++どちらがいいですか? 知識はC#,Actionscript,javascriptです やりたい用途はDLL作成です
C
C++
991 :
デフォルトの名無しさん :2010/09/21(火) 12:25:15
じーっ えー?
992 :
デフォルトの名無しさん :2010/09/21(火) 12:28:03
C99
>>988 どんな仕様のdllを作りたいかによる。
それによって自ずとCかC++のどちらかが決定される
>>993 ありがとうございます
用途は秀丸エディタのマクロから利用するdllと変換モジュールの作成です
C#でもええが
996 :
デフォルトの名無しさん :2010/09/21(火) 12:48:35
!? &n ? ,オォウヲォ l~~~~~~~l (C++) & (C++) / \ MmMmMmMmMmMmMmM
木毎
>>995 C#でDLL作ったのですが呼び出せなかったんです
999 :
デフォルトの名無しさん :2010/09/21(火) 13:59:53
>>998 おまえ前も秀丸のプラグインをC#でつくって呼び出せないとかさわいでたろw
次スレ無しやんな 胸がアツウなるな
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。