スレを勃てるまでもないC/C++の質問はここで 16

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2010/07/16(金) 22:34:12
>>前スレ987
ダイアログボックスならWM_CREATEじゃなくてWM_INITDIALOGではなかろうか
あ、ダイアログボックスのプロシージャで受ける場合の話ね。

主ウィンドウ側のプロシージャでWM_CREATEを受けているなら、
(そしてそのプロシージャで件のWM_TIMERも受けているなら)
WM_TIMERの処理中に、つまりGetMessageでWM_TIMERをとってきてから
次にGetMessageを呼ぶまでの間にCreateWindow系の関数を呼び出すと、
・CreateWindow中でWM_CREATEを投げる
→でもメッセージループはWM_TIMERを処理中で回っていない
→CreateWindowがWM_CREATEの処理を待ち続ける
→固まる
というコンボが発生するけど、他のダイアログ呼び出せてるならこれも違うかな。

ちょっとその記述だけだと、どのプロシージャでどのタイミングで投げられたどのメッセージを
受けているのかわかりにくいので、もうちょっと詳しく書いてくれるかソースを上げてくれれば見れるかも。
3デフォルトの名無しさん:2010/07/17(土) 02:06:54
smart_ptrの導入方法を1から10まで教えてください
4デフォルトの名無しさん:2010/07/17(土) 05:09:46
1.Visual C++ 2010をインストールする
2.#include <memory>をする
3.std::からスマートポインタを使う
4.
5.
6.
7.
8.
9.
10.C++から卒業する
5デフォルトの名無しさん:2010/07/17(土) 06:30:43
>>4
std::からどれを使えばいいのかわかりません
6デフォルトの名無しさん:2010/07/17(土) 07:59:07
std::tr1::unique_ptr
std::tr1::shared_ptr
std::tr1::weak_ptr
7デフォルトの名無しさん:2010/07/17(土) 08:13:02
ty
8デフォルトの名無しさん:2010/07/17(土) 08:49:32
そういやVC2010だとstd::unique_ptrって使えるんだよな
std::vector<unique_ptr<std::string>> str_vec;
っていうのが許されてて、便利になったもんだって感心したわ
9デフォルトの名無しさん:2010/07/17(土) 12:50:46
>>8
std::unique_ptrはstd::auto_ptrに似て破壊的セマンティックスなので
コンテナには入れられないよ
10デフォルトの名無しさん:2010/07/17(土) 12:52:48
std::shared_ptr
ならいいの?
boost::shared_ptrとどっち使ったらいいのかわからん
11デフォルトの名無しさん:2010/07/17(土) 13:09:59
std::tr1:shared_ptrならコンテナに入れられる

std::unique_ptrはstd::auto_ptrからコピーコンストラクタを取り除いて
コピー禁止にした物だと思えばよい
そのため関数の戻り値にも使えない

boost::scoptd_ptrがstd::unique_ptrとリネームされたようなので
boost::scoptd_ptrをぐぐるとよく動作がわかる
12デフォルトの名無しさん:2010/07/17(土) 13:10:39
unique_ptrはauto_ptrと違ってコンテナに入れられるんじゃないの?
13デフォルトの名無しさん:2010/07/17(土) 13:11:23
×scoptd_ptr
○scoped_ptr

まあわかるよな
14デフォルトの名無しさん:2010/07/17(土) 13:12:06
>>12
コピーが出来ないのでエラーになるよ
やってみ
15デフォルトの名無しさん:2010/07/17(土) 13:24:48
>>14
C++じゃ無理だ
すまんC++0xと勘違いしてた
16デフォルトの名無しさん:2010/07/17(土) 13:37:49
違いが分かんないようなレベルならとりあえずshared_ptr使っとけばいいよ
お前が思ってるほどオーバヘッドねーからさ
17デフォルトの名無しさん:2010/07/17(土) 15:00:33
引数で指定したファイルををsystem()使ってgrepする方法ってないでしょうか?

system("grep aaa argv[1]");みたいなイメージでargv[1]にちゃんとファイル名を入れたいんですが・・・
18デフォルトの名無しさん:2010/07/17(土) 15:12:10
>>17
キミは理解するまでsystem(3)利用禁止。

「何を理解するまでか?」それを含めて理解するまでだ。
19デフォルトの名無しさん:2010/07/18(日) 00:19:12
>>9
VC2010では可能だよ
まぁ0xの先取りなんだけどさ
20デフォルトの名無しさん:2010/07/18(日) 01:36:45
環境依存の話ここですんなよ
21デフォルトの名無しさん:2010/07/18(日) 22:50:20
constを付けると呼び出されるたびにその分処理が遅くなるのでしょうか
22デフォルトの名無しさん:2010/07/19(月) 00:03:26
constはコンパイル時に変数が変更されないかどうか調べるだけだから
気にしなくておk
23デフォルトの名無しさん:2010/07/19(月) 00:41:29
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;}
2524:2010/07/19(月) 10:20:26
result=fopen(RESULTFILENAME,"w;")
が落ちていました。すみません。
26デフォルトの名無しさん:2010/07/19(月) 11:24:06
>>24-25
ttp://codepad.org/OxSQOoRw
とりあえず動くように書き換えてみたけど
もっと簡単に考えてみたらいいんじゃない?
2行目以降置換できなかった理由は
start=hit+rep_len; これ
最初の1行目はこれでいいんだけど
2行目以降
strstr(start,find) のstartが無効なアドレスを示して置換できないようになってる
sscanf(line,"%s",src); の後に
start = src; と入れればちゃんと動くかも
2724:2010/07/19(月) 11:47:23
>>26
回答ありがとうございます。
そういうことだったんですね。納得しました。
どちらも試しましたが,ともに正しく動きました。
本当にありがとうございました。
28デフォルトの名無しさん:2010/07/19(月) 14:01:48
>>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へコピーしたい。
30デフォルトの名無しさん:2010/07/19(月) 16:37:11
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を回せば分かるんで、もうこれでいいかな。
32デフォルトの名無しさん:2010/07/19(月) 17:03:26
こんなアルゴリズムがあった
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
ありがと。
34デフォルトの名無しさん:2010/07/19(月) 20:28:29
メモリマネージャを作っているのですがよく分かりません
参考になるページやソースなどはありませんか?
35デフォルトの名無しさん:2010/07/19(月) 20:37:42
36デフォルトの名無しさん:2010/07/19(月) 20:43:40
そいつマルチなんだから答えるなよ
37デフォルトの名無しさん:2010/07/19(月) 20:48:17
なんだよ。マルチかよしね。
38デフォルトの名無しさん:2010/07/22(木) 17:26:55
配列が引数にある関数に、呼び出すときに配列作って渡すこと出来る?

int hoge(int []); みたいな関数に
hoge({594,444,200});
みたいな。
39デフォルトの名無しさん:2010/07/22(木) 17:34:48
無理
40デフォルトの名無しさん:2010/07/22(木) 20:45:57
なんで、#includeは少ない方がいいんですか
暗黙的に#includeされるヘッダファイルは#includeした方がいいんでしょうか
41デフォルトの名無しさん:2010/07/22(木) 21:18:26
他のプロジェクトで使いたかったりしたときに
includeがいっぱいあるとめんどくさかったり
42デフォルトの名無しさん:2010/07/22(木) 21:23:50
>>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) );

これでいいだろ
4340:2010/07/22(木) 21:26:49
>>41
ちなみに、これはどうなったのでしょうか
>暗黙的に#includeされるヘッダファイルは#includeした方がいいんでしょうか
44デフォルトの名無しさん:2010/07/22(木) 21:45:44
>>42
ためになるわ ありがとう
45デフォルトの名無しさん:2010/07/22(木) 21:46:32
いやいや使うなよ
46デフォルトの名無しさん:2010/07/22(木) 21:50:44
>>40
利用するライブラリ(API)のドキュメントに必要なヘッダーの一覧が書いてある。
必要なものだけインクルードすれば良い。不要なものはインクルードする必要は無い。
4740:2010/07/22(木) 22:16:25
>>46
まぁ、大体わかった気がする
サンクス
48デフォルトの名無しさん:2010/07/22(木) 23:16:02
すみません、
Media Foundationや、DirectX Video Accelarationの質問、話題は
どのスレでなされているでしょうか?
49デフォルトの名無しさん:2010/07/22(木) 23:25:01
DirectXのスレやWin32API等のスレの方が
少なくとも、C/C++のスレよりは適切なはず。
5048:2010/07/22(木) 23:26:41
>>49
ありがとうございました!
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];
};
52デフォルトの名無しさん:2010/07/23(金) 21:43:34
関数内で定義したクラスはテンプレートの引数に出来ないんだってさ。
VCは出来るように拡張してるっぽい。
5351:2010/07/23(金) 21:58:23
>>52
抜け道があるのかと期待したんですが・・・
ありがとうございます
54デフォルトの名無しさん:2010/07/24(土) 01:08:54
std::stringを戻す関数でchar *が戻せるのは何故ですか?
55デフォルトの名無しさん:2010/07/24(土) 01:12:42
例えばどんな関数よ
56デフォルトの名無しさん:2010/07/24(土) 01:54:32
>>54
std::string(const char *); というコンストラクタによって
暗黙の型変換が行われるから。

ただし、あくまで「stringに(暗黙的に)変換できる」だけであって
「char*を返す」わけではない。
57デフォルトの名無しさん:2010/07/24(土) 07:14:50
rand関数を初期化すると,次のコンパイルで初期化を行わない場合,先ほど初期化した際の値が出るのですか?
58デフォルトの名無しさん:2010/07/24(土) 08:25:35
runするたびに同じ順序が得られる。シミュレーションを再実行するとき便利だね。

59デフォルトの名無しさん:2010/07/24(土) 14:24:33
ありがとうございます
60デフォルトの名無しさん:2010/07/24(土) 16:10:15
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;
}
}
61デフォルトの名無しさん:2010/07/24(土) 16:32:14
arrayConv内のnumElemはポインタ。
だから、sizeofの結果はポインタのサイズだ。
6260:2010/07/24(土) 17:04:03
>>61
こんがらがってきました
numElemからは配列の大きさは得られないのでしょうか
63デフォルトの名無しさん:2010/07/24(土) 17:22:23
int numElem[3]={2,3,4};
sizeof numElem; // これは配列のサイズ取れる

const int *numElem;
sizeof numElem; // これはポインタのサイズ
64デフォルトの名無しさん:2010/07/24(土) 17:24:00
6560:2010/07/24(土) 17:34:12
>>63
たしかに関数の外では普通にサイズ12が出力されました。うーん?
>>64
6.21:
なぜサブルーチンの引数として渡された配列の大きさをsizeof()でき ちんと計算できないのか。
A:
コンパイラーは配列仮引数がポインターと宣言されたように振る舞い (質問6.4参照)、sizeof()はポインターの大きさを返す。


引数にした瞬間に配列はポインタになっちゃって、ただの先頭アドレスと型の情報で、
要素数情報がないために関数内で要素数を得ることはできないということでしょうか
66デフォルトの名無しさん:2010/07/24(土) 19:51:03
class Class
{
const int i;
const char *c;
public:
Class();
};

Class::Class()
{
i = 1234; // NG
c = "ok";
}


なぜintは駄目なんですか?
67デフォルトの名無しさん:2010/07/24(土) 19:57:02
Class::Class() : i(1234), c("ok")
{}

constはこうして初期化しないとだめ、代入は出来ない。
charの方は
const char* const c;
こういうふうに書き直せ。
68デフォルトの名無しさん:2010/07/24(土) 21:11:29
ほんと汚物言語ですね
69デフォルトの名無しさん:2010/07/24(土) 22:09:42
汚物ではなくてプログラミングのうっかりミスを極力予め防止してんだよ
Cだとやってしまうような
70デフォルトの名無しさん:2010/07/24(土) 23:53:45
>>53
g++ 4.5.0で試してみたら通った。
71デフォルトの名無しさん:2010/07/24(土) 23:55:02
>>68
ふーん
72デフォルトの名無しさん:2010/07/25(日) 02:14:36
long long intの変数xをint型の変数a,bに分けて保存した後、再びlong long int型の変数yに入れたい。
x -> a,bは
a = x&0xffffffff;
b = x>>32;
って分かるけど
a,b -> yはどうやればいいの?
73デフォルトの名無しさん:2010/07/25(日) 02:22:43
y = b, y <<= 32, y |= a;
74デフォルトの名無しさん:2010/07/25(日) 02:44:04
なるほど ありがとう!
75デフォルトの名無しさん:2010/07/25(日) 06:50:51
>>69
初期化記法を汚物と言ってる。
76デフォルトの名無しさん:2010/07/25(日) 09:20:03
あっそ
77デフォルトの名無しさん:2010/07/25(日) 18:35:13
>>75
それはたしかに思う。
78デフォルトの名無しさん:2010/07/25(日) 18:41:15
一貫性が無いよね
79デフォルトの名無しさん:2010/07/25(日) 18:52:01
ロマンがあるわけよロマンが
80デフォルトの名無しさん:2010/07/25(日) 19:03:19
男のロマンといったらドリル兵器と自爆装置だ
81デフォルトの名無しさん:2010/07/26(月) 21:28:17
乱数の取得にはsrandとrandを使った方がいんですか?(c++)
82デフォルトの名無しさん:2010/07/26(月) 21:30:12
普通はそれでいいけど、boostにも乱数あるからよろしくな!
83デフォルトの名無しさん:2010/07/26(月) 21:38:19
このソースに自爆装置を仕込んだのは誰だぁ!!!
84デフォルトの名無しさん:2010/07/26(月) 22:47:25
くだらなすぎてスマソ

>unsigned char *userKey = "key";
>AES_KEY aesKey;
>AES_set_encrypt_key(userKey, 128, &aesKey);

>error: invalid conversion from ‘const char*’ to ‘unsigned char*’

なんで、コンパイラに怒られるの?
コンパイラ怖い
85デフォルトの名無しさん:2010/07/26(月) 22:55:11
const charとunsignec charに互換性があってもconst char *とunsigned char *はそうでないとされているから
86デフォルトの名無しさん:2010/07/26(月) 22:55:12
unsignedつけなければコンパイル通るでしょ
87デフォルトの名無しさん:2010/07/26(月) 22:56:36
>>86
今度はきっとAES_set_encrypt_keyの第3引数がunsigned char *だな
const unsigned char []で乗り切れ
88デフォルトの名無しさん:2010/07/27(火) 02:21:40
>>81
めるせんぬついすたーつかえ
89デフォルトの名無しさん:2010/07/27(火) 08:26:29
メルセンヌツイスターはもう古い
90デフォルトの名無しさん:2010/07/27(火) 09:45:09
int a = 5;
int b = a * 1024 * 1024;
このとき1024 * 1024はコンパイル時に計算されますか?
91デフォルトの名無しさん:2010/07/27(火) 09:59:01
>>90
コンパイラによる
92デフォルトの名無しさん:2010/07/27(火) 10:02:36
>>91
やはりそのような感じですか・・・ありがとうございます
93デフォルトの名無しさん:2010/07/27(火) 10:14:08
>>92
アセンブラコードを見るのが普通と思うが
const int a;にした上で
C++でとにかくコンパイル時に計算されればいいってんならテンプレートでやりよう自体はあるが
94デフォルトの名無しさん:2010/07/27(火) 10:19:44
現実的にはその程度の定数畳みこみを行わないコンパイラを探すのは困難。
95デフォルトの名無しさん:2010/07/27(火) 10:23:06
>>94
だけど規格ではそれは定められていないよね?
96デフォルトの名無しさん:2010/07/27(火) 10:32:44
ふむふむ・・参考になります
とりあえず、
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
こうなりました
とりあえずコードによっても環境によってもかわるみたいですね。。
9796:2010/07/27(火) 10:35:49
あ、環境かかなければだめでした
visual C++ 2010 Express
です
98デフォルトの名無しさん:2010/07/27(火) 11:16:37
>>94
はぁ?
計算の順序を勝手に入れ替えることの意味わかってないんじゃない?
値によっては回り込みが起きて、全く違う答えになるんだよ。

まともなコンパイラならこういう最適化を行わないか、
オプションの切り替えで制御するのが普通。
99デフォルトの名無しさん:2010/07/27(火) 11:42:29
値が変わるような順序変更を行うコンパイラがまともに構文解析できるとは思えないが
100デフォルトの名無しさん:2010/07/27(火) 11:46:35
>>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
103デフォルトの名無しさん:2010/07/27(火) 13:11:10
変えたら結果がが変わるかは知らんが
その検証するのに-O0ってのはどうなのよ・・・・
104デフォルトの名無しさん:2010/07/27(火) 13:14:13
「デフォルトで最適化してるんだろ」という言いがかりを封じるためだよ。頭悪いぞ。
-O0 Do not optimize. This is the default.
105デフォルトの名無しさん:2010/07/27(火) 13:28:44
ところで
テンプレートでどうにかする方法ってどんなのなん?
106デフォルトの名無しさん:2010/07/27(火) 14:44:46
それより
>>98
> 計算の順序を勝手に入れ替えることの意味わかってないんじゃない?
> 値によっては回り込みが起きて、全く違う答えになるんだよ。
この実例まだ〜〜〜?
107デフォルトの名無しさん:2010/07/27(火) 16:13:05
>>106
a が double で 1024 がもっと大きな数だとまずいんじゃない?
そのときも同じように最適化が起きるんだったらコンパイラとしては問題あるよね。
108デフォルトの名無しさん:2010/07/27(火) 16:16:41
そんな三分で考えたような脆弱性に対応できてないコンパイラとか産廃だろ
109デフォルトの名無しさん:2010/07/27(火) 16:23:55
>>108
gcc ってまともなコンパイラじゃなかったんですねw
110デフォルトの名無しさん:2010/07/27(火) 16:24:31
gccなんか要らん
111デフォルトの名無しさん:2010/07/27(火) 17:06:14
c言語にはelseif(スペースなし)がありませんが、
#define elseif else if
とやってelseifを使うと何か問題ありますか?
112デフォルトの名無しさん:2010/07/27(火) 17:17:35
>>107
池沼なのにPGやってるお前の方がよっぽど問題あるわ。www
113デフォルトの名無しさん:2010/07/27(火) 18:10:04
>>111
問題ない。
まぁ厳密にはインデントが変わってくるが、動作には影響しない。
つか else if と書いても elseif のようにインデントしてる人が多いわな。

>>112
この人は何に対して切れてるんだろうw
114デフォルトの名無しさん:2010/07/27(火) 21:18:32
>>111
しいて言えば、エディタが色を変えてくれない
115デフォルトの名無しさん:2010/07/27(火) 21:22:30
else if でも elseif でも黒色だけど・・・
116デフォルトの名無しさん:2010/07/27(火) 21:23:52
#define elseif else if

こんなことは絶対にするな。絶対だぞ。
defineなんてifdef用以外に使うな。
117デフォルトの名無しさん:2010/07/27(火) 21:29:20
なかなか低機能なエディタを使っているようだな・・・
そういうのも嫌いじゃないが
苦労は買ってでもしろと言うしな
118デフォルトの名無しさん:2010/07/27(火) 22:34:19
>>116
#define for if(0) else for
119デフォルトの名無しさん:2010/07/27(火) 22:35:37
さすがにもうVC6は無いだろうと思いたい
120デフォルトの名無しさん:2010/07/27(火) 23:16:47
VC6使ってる奴って本当に馬鹿なんだろうな
121デフォルトの名無しさん:2010/07/28(水) 00:29:30
>>111
一人でやってるなら問題ないけど、バカっぽく見えるからやめたほうが
いい。

開発をしている時間のうちキーボードを打つ時間の割合なんてそんなに
多くないのだから、タイプ数を減らすだけの工夫は無駄。

122デフォルトの名無しさん:2010/07/28(水) 00:35:37
お前らまさかマクロとか使ってないよな?
123デフォルトの名無しさん:2010/07/28(水) 00:41:13
使うだろ普通
124デフォルトの名無しさん:2010/07/28(水) 00:43:25
どんなマクロよ
125デフォルトの名無しさん:2010/07/28(水) 00:56:28
MAKEWORDとかRGBとか
126デフォルトの名無しさん:2010/07/28(水) 00:58:37
inline関数じゃだめなんか
127デフォルトの名無しさん:2010/07/28(水) 03:48:47
C++の場合
複数環境対応とデバックマクロで使用する
Cの場合は定数等含めて結構マクロは使用する
128デフォルトの名無しさん:2010/07/28(水) 08:27:30
定数マクロ使ってる奴ってキチガイだろ
129デフォルトの名無しさん:2010/07/28(水) 08:59:14
>>121
タイプを減らすためでなく、インデントの問題だろ。
else if ごとに一段下げたりしたくないだろ。
けど、構文的には下げるのが正しいんだから。
これは俺も気持ち悪い。
130デフォルトの名無しさん:2010/07/28(水) 12:55:57
構文的にインデントの正解などない。だから流儀が複数ある。
elseとifの間に{なし、改行すらなし。これで一段下げなんて普通しない。
131デフォルトの名無しさん:2010/07/28(水) 14:25:54
>>130
それは else if を elseif とみなしてインデントをつけているに他ならない。
132デフォルトの名無しさん:2010/07/28(水) 14:33:35
else ifってelse { if〜〜 } の略系だったのか
オラ初めて気づいたぞ
133デフォルトの名無しさん:2010/07/28(水) 14:53:27
>>132
そんなわけない
134デフォルトの名無しさん:2010/07/28(水) 14:57:21
>>132
正解

>>133
池沼
135デフォルトの名無しさん:2010/07/28(水) 15:06:09
if ()
else if () ←これが出来なくなるじゃん
else
136デフォルトの名無しさん:2010/07/28(水) 15:07:37
>>131
それで問題ないのだからelseifいらね
137デフォルトの名無しさん:2010/07/28(水) 15:10:55
>>135
それは
if () {
} else { if ()
else
}
と書いたのと同じ。コンパイラはそう解釈してるんだよ。

if() や else の次にくるのは、一つの文かまたは { } で囲まれた一つのブロックなんだよ。
138デフォルトの名無しさん:2010/07/28(水) 15:15:28
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;

が正しいということか。。。
139デフォルトの名無しさん:2010/07/28(水) 15:20:58
>>138
正解
140デフォルトの名無しさん:2010/07/28(水) 15:35:51
そういうこと
141デフォルトの名無しさん:2010/07/28(水) 15:36:55
どういうこと
142デフォルトの名無しさん:2010/07/28(水) 15:44:37
つまりelse ifは現代的なコンパイラにおいては[else if]で解釈されているということ
143デフォルトの名無しさん:2010/07/28(水) 15:48:31
>>142
少なくとも else if を elseif と見なすようなことはしてないよ。
つまり if 文の入れ子として処理している。それは昔も今も同じ。
144デフォルトの名無しさん:2010/07/28(水) 15:56:22
switchは?
145デフォルトの名無しさん:2010/07/28(水) 17:08:37
>>144
もちろん switch は入れ子でなく対等な分岐
146デフォルトの名無しさん:2010/07/28(水) 17:27:36
順番があるので対等ではない。
147デフォルトの名無しさん:2010/07/28(水) 18:39:51
あれは単なるラベル。
14884:2010/07/28(水) 20:16:51
>>85-86
どれにしても、コンパイルが通らないんですけど...
14984: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;
}

よくわからない、スマソ
150デフォルトの名無しさん:2010/07/29(木) 09:42:35
>>149
const unsigned char* userKey = (const unsigned char*)"key";
151デフォルトの名無しさん:2010/07/29(木) 10:54:01
MicroSoft FlightSimulator Xのアドオン開発のスレって立ったことある?
やはり、あまり需要ないのだろうか?
或いは、ゲームのアドオン開発に関するスレがあれば誘導お願いします
152151:2010/07/29(木) 11:00:51
すみません、フライトシム板にて発見しました。
スレ汚しゴメン
153デフォルトの名無しさん:2010/07/29(木) 11:35:46
for文の中でリテラルな何かが登場したら無駄な負担になるんですか?
154デフォルトの名無しさん:2010/07/29(木) 11:45:24
>>153
それなりのところではそれなりにそうなる
155デフォルトの名無しさん:2010/07/29(木) 16:04:04
かなり初心者なんだけど質問いいかい?…
猫CのC++第八章のクラスの話がわからん。
http://www.kumei.ne.jp/c_lang/cpp/cpp_08.htm

多分大方理解したと思うんだけど、一番下の実行結果を見ると
Catクラスのデストラクタが最後に呼ばれてるのが見てわかるんだけど…

main関数にデストラクタなんて書かれてないけど?どうして?これって勝手に呼ばれるの?
156デフォルトの名無しさん:2010/07/29(木) 16:07:22
>>155
クラスが消えるときに勝手に呼ばれる関数だからだよ
157デフォルトの名無しさん:2010/07/29(木) 16:10:37
>>156
やっぱりそうなんだ!ありがとう!早い回答で助かった
158デフォルトの名無しさん:2010/07/29(木) 16:42:57
>>89
メルセンヌツイスターは確かに古いが、
越えるものは出てきたっけ?
159デフォルトの名無しさん:2010/07/29(木) 16:59:01
>>158
非拡散楕円シェルピンスキー法
160デフォルトの名無しさん:2010/07/29(木) 16:59:39
eclipse CDTのスレってなくなっちゃったの?
もう誰も使ってないのかしら。
161デフォルトの名無しさん:2010/07/29(木) 17:16:10
vectorのメモリ消費量についてですが、
vector<int>とやるとintは4bytesなので、
4bytes x サイズ分のメモリを使うと思っていたのですが、

実際は、8bytes x サイズ分、つまり倍
使っているように見えます。
サイズはそのままで、消費を4bytes分相当にする方法はないでしょうか。

環境はlinux g++ 4.4です。

162デフォルトの名無しさん:2010/07/29(木) 17:17:06
配列つかえ
163デフォルトの名無しさん:2010/07/29(木) 17:23:44
>>158
SFMT
164デフォルトの名無しさん:2010/07/29(木) 17:29:22
>>161
調べ方が悪い
165デフォルトの名無しさん:2010/07/29(木) 17:46:14
>>164
そうですか?
valgrind下で走らせてalloc,free値を見たのですが、見方が違うのか
166デフォルトの名無しさん:2010/07/29(木) 21:12:06
使う前にresize(1)とかやればいいんじゃないの?
16784:2010/07/29(木) 21:49:09
>>150
レスありがとうございます

>main.c::-1: error: undefined reference to `AES_set_encrypt_key'
やっぱり、怒られます
もしかして、gccの設定が悪いのかもしれませんorz
168デフォルトの名無しさん:2010/07/29(木) 22:22:01
配列とポインタは全然別なものってことでおk?

でも、配列Array[]をArrayと書くと、Array[0]のアドレスが返ってくるだけってことだよね
169デフォルトの名無しさん:2010/07/29(木) 22:23:22
ok
170168:2010/07/29(木) 22:35:00
>>169
thx
171デフォルトの名無しさん:2010/07/29(木) 22:35:19
ng
172デフォルトの名無しさん:2010/07/29(木) 22:52:35
>>168
ぜんぜん違うけど密接に関わるものってことかな
int Array[10];
int* p = Array;

p[3] = 100;//添え字アクセス
*p = 200;//ポインタを使ってアクセス
*(p + 3) = 300;//ポインタ演算でのアクセス
こんな風に使える
使えるというだけで別なもの
173168:2010/07/29(木) 23:00:18
>>172
つまりはアクセスできるってだけのことなのね
174デフォルトの名無しさん:2010/07/29(木) 23:54:10
詰んでいて質問です、緊急でお願いします。


boostのスマートポインタにインターフェイスのhogeObject(純粋仮想関数:void func01() )が入っていて

hogeObjectを継承してhogeクラスがあって、そこのメンバ関数(void func02() )を呼び出したいのだけれども
当然インターフェイスでfunc02を定義してないので呼び出せない。

無理矢理hogeにダウンキャストをすれば呼び出せると思ったのだけど、どうにもコンパイルが通らないです。


この場合、どうやってスマートポインタ内のhogeObjectからhogeクラスのfunc02を呼び出せますか?
因みにプログラムの都合上、hogeObjectの純粋仮想関数を増やすことは出来ないです。

誰か教えてください。
175デフォルトの名無しさん:2010/07/29(木) 23:56:13
同じもんだよ
ただ、利便性のために若干仕様が分けられてる
[]ってのは単純にp+1とかをオーバーロードしてるだけだし
176デフォルトの名無しさん:2010/07/29(木) 23:58:58
ダウンキャストしてる部分を晒せよ
177デフォルトの名無しさん:2010/07/30(金) 00:09:26
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のスマートポインタがが入ってます
178デフォルトの名無しさん:2010/07/30(金) 00:15:22
>>177です。

申し訳無いです、自己解決しました。

se = dynamic_cast<SwordEnemy*>( (*itr).get() );
として動作しました。

関数を見落としていました。
お騒がせしました
179デフォルトの名無しさん:2010/07/30(金) 00:15:58
itr->get()
180デフォルトの名無しさん:2010/07/30(金) 18:06:12
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;
}
なんか落ちる…
182デフォルトの名無しさん:2010/08/01(日) 14:08:36
listが100KiBしか確保されてないのにcount最大値100000要素×4バイト=400KBまで使おうとするからじゃないかと思います
183デフォルトの名無しさん:2010/08/01(日) 19:08:42
>>180
VSスレに書き込めよ
ちなみにそれはメモリリークが存在しないことを表してる 至って正常ということ
184デフォルトの名無しさん:2010/08/01(日) 22:36:44
やっぱり、いくら考えてもわからん(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 で終了しました
185デフォルトの名無しさん:2010/08/01(日) 22:48:13
ちゃんとリンクさせてるか?
186184:2010/08/01(日) 22:53:44
>>185
IDEに頼り切っていたので、やり方がわかりません
gcc v4.4.3、opensslは/usr/includeにあります
ごめんなさい
187デフォルトの名無しさん:2010/08/01(日) 22:56:53
math.hだったら
-lm ってオプションいるだろ?(最近は無くてもいけるけど)そういうことだ
それの名前がわからん
でも/usr/libにはあるはず
もしくはそのライブラリの説明どっかにないのか
188デフォルトの名無しさん:2010/08/01(日) 23:01:24
たぶん -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行目スペース入れたのに入りませんでした。
191デフォルトの名無しさん:2010/08/02(月) 08:39:05
189-190 自己解決しますた。
192デフォルトの名無しさん:2010/08/02(月) 10:24:54
>>189-190
恐らく>191は他人でしょうから、あなたのお使いの開発環境を明らかにした上で
該当スレに書き込むか、エスパースレにどうぞ。
193184:2010/08/02(月) 22:01:16
>>187-188
わかりました
調べてみます
194184:2010/08/02(月) 22:57:02
>>188
-lsslをつけたらコンパイルする事ができました
ありがとうございます

ところで、何故そのようなオプションをつけないと、コンパイルできないんですか?
-lsslってオプションはgccにデフォルトでは存在しないと思うのですが
195デフォルトの名無しさん:2010/08/03(火) 00:39:16
戯言はgccのマニュアル見てから言いなさい。
196デフォルトの名無しさん:2010/08/03(火) 01:41:56
>>183
コンパイラーによって表示されるものなのかどうかわからなかったもので・・・
問題ないんですね。ありがとうございました
197デフォルトの名無しさん:2010/08/03(火) 12:03:34
-l と ssl で -lssl
198デフォルトの名無しさん:2010/08/03(火) 21:22:31
>>197
thx
199デフォルトの名無しさん:2010/08/03(火) 21:48:16
構造体のメンバの配列の要素数をコンパイル時以降に決定したいのですが、どのようにしたら良いのでしょうか。
-----------------
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); で後始末
201デフォルトの名無しさん:2010/08/04(水) 01:31:16
まずいんじゃね?FORTRANのCOMMON変数が確保されるのは
スタック上だとしてヒープ領域と一緒にしていいのか
202デフォルトの名無しさん:2010/08/04(水) 07:48:13
DWORDの0Lって何のことですか?longをtypedfしたようなのは見たのですがわかりません
それと、ファイルから読み取って変数に入れていくようなプログラムで
NULLで初期化?できるような構造体にNULLを入れたいのですがどうすれば良いのでしょうか?もしかしてイント型の0でできる?ちなみにfscanfとかfget系の処理の仕方しかわかりません。よろしくお願いします
203デフォルトの名無しさん:2010/08/04(水) 08:02:29
={0};
204デフォルトの名無しさん:2010/08/04(水) 08:03:40
{}ってどういう意味ですか?
205デフォルトの名無しさん:2010/08/04(水) 08:19:10
つまり構造体の値について記述しています
206デフォルトの名無しさん:2010/08/04(水) 08:39:10
>>199
・COMMONの大きさは動的に代えられないからだめ。
・ポインターが使える処理系もある。
Fortranスレに行きなさい。
207デフォルトの名無しさん:2010/08/04(水) 09:06:31
さすがにそのレベルの質問は無いわ…
チュートリアルからやり直して下さい
208デフォルトの名無しさん:2010/08/04(水) 09:27:51
>>207
独り言ならついったーで。
209デフォルトの名無しさん:2010/08/04(水) 09:29:59
自演乙
210デフォルトの名無しさん:2010/08/04(水) 09:39:05
天下のついったーがこんな場末の掲示板で自演宣伝するわけないじゃない。バカ?
211デフォルトの名無しさん:2010/08/04(水) 09:40:59
某スレで煽られて
顔真っ赤の涙目になっちゃって悔し紛れにコピペした臭い
212デフォルトの名無しさん:2010/08/04(水) 09:44:20
         ____   
       / /  \\      
.     / (;;..゜);lll(;;..゜)\ このガキャあああああああ
    /   ⌒(__人__)⌒ \    ナメてんのかああああfさdkjh;flsだhf
    |  ノ(  |r┬- | u  | ________    
     \ ⌒  |r l |    / .| |          |
    ノ  u   `ー'    \ | |          |  真剣に聞いてんのに
  /´                .| |          |  煽ってんじじゃねええええ
 |    l      プルプル u  | |          |
 ヽ u  -一ー_~、⌒)^),-、   | |________|
  ヽ ____,ノγ⌒ヽ)ニニ-___| |  |____
213199:2010/08/04(水) 10:35:05
>>200
ありがとうございます。やってみます。
>>201
Cで構造体で代替しようという考え自体がまずいということでしょうか?

>>206
COMMONの方は大きさがコンパイル時に決定しています。
Cの方はコンパイルに少し特殊な環境が必要なので一度コンパイルしたら使い回したいという考えです。

もともとあるFortranのプログラムをいじってCの関数を呼び出して使うようにしたいのですが
C側で使う変数が多くて引数にするの大変です。 元々COMMON文が多用されていたので
Cに持ってきて使えたらなぁ、と思い調べました。
214デフォルトの名無しさん:2010/08/04(水) 10:54:11
>>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;
}
215デフォルトの名無しさん:2010/08/04(水) 10:54:17
>>213
FORTRANの呼び出され側の関数がCOMMON引数をどのように受け取るように
なっているかが問題

普通連続したメモリ領域が必要なんじゃないのか?
Cのポインタなんか使ったらあっちこっちにアドレスが飛んでだめだと思うが
216デフォルトの名無しさん:2010/08/04(水) 10:57:25
構造体の中に不確定な配列のメンバを持ちたいのですがどうすれば良いですか?
イメージとしてはこんな感じです
struct hoge{
int a;
char b[a];
};
217デフォルトの名無しさん:2010/08/04(水) 11:01:50
>>216
struct hoge {
int a;
char b[1];
}

struct data *dp;

dp = malloc(sizeof(hoge) + datalen); <-可変長のデータ長を足して確保

汚いテクニックでしかも規格では未定義の動作とされているが
よく使われる
218デフォルトの名無しさん:2010/08/04(水) 11:03:01
>>217
ありがとうございました
219デフォルトの名無しさん:2010/08/04(水) 11:12:14
C99ならflexible array memberを使えばいい。

struct hoge{
int a;
char b[];
};
220デフォルトの名無しさん:2010/08/04(水) 11:19:23
VC2008EEです
221デフォルトの名無しさん:2010/08/04(水) 11:23:41
VC2008ならgccと同じくchar b[0];が使える。
222デフォルトの名無しさん:2010/08/04(水) 11:27:56
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 *'に変換できません とエラーが出ます。どうすれば良いのでしょうか?
224デフォルトの名無しさん:2010/08/04(水) 11:39:59
>>223
hogeなんて構造体が無いからだろ。バカか。
struct hogeとhogeの区別もつかないのか。市ねよ。
225199: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); <-可変長のデータ長を足して確保
どこがおかしいのでしょう?
227デフォルトの名無しさん:2010/08/04(水) 11:48:15
>>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
>>227
ありがとうございます
やってみます
229デフォルトの名無しさん:2010/08/04(水) 11:54:16
>>226
×
dp = malloc(sizeof(hoge) + a*3);


dp = malloc(sizeof(struct hoge) + a*3);

ってことだろ
>>224の言い方はヒドいが、知っとけよとは思うな
230デフォルトの名無しさん:2010/08/04(水) 12:00:41
>>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 []' に変換できません。
と出ます
233デフォルトの名無しさん:2010/08/04(水) 12:21:35
>>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 *'
どこがおかしいでしょうか?
235デフォルトの名無しさん:2010/08/04(水) 13:05:07
C++でコンパイルしているだろ。拡張子を.cにしろ。
236デフォルトの名無しさん:2010/08/04(水) 13:16:31
vector<char>にしたら通ったのですがこれってできてますか?
237デフォルトの名無しさん:2010/08/04(水) 13:25:55
>>234
dp = (hoge *)malloce( );
キャスト変えてみろ
238デフォルトの名無しさん:2010/08/04(水) 13:26:37
無駄な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();}
でできてませんか?
241デフォルトの名無しさん:2010/08/04(水) 13:31:45
それがありならnew deleteとかでもできるだろwww
勝手にしろ
242デフォルトの名無しさん:2010/08/04(水) 13:32:52
イテレーター使えボケ
243デフォルトの名無しさん:2010/08/04(水) 13:33:28
できてますか?
vector使ってるからより重くなってるとか、メモリ食ってるとかありませんか?
244デフォルトの名無しさん:2010/08/04(水) 13:41:23
いったい何がしたいのかさっぱり分からん。
もうstring使えばいいじゃん。
245デフォルトの名無しさん:2010/08/04(水) 13:46:02
したいことは
struct hoge{
int a;
char b[a];←ここ
}
です
struct hoge do[d];みたいに何個も作って値を入れて行った時にそれぞれのaの値とbの配列の要素数がリンクしてるってことです
こうするとできないので一番無駄の無いやり方が知りたいのです
246デフォルトの名無しさん:2010/08/04(水) 16:24:08
したいことがあるからそれを書きたいだけで、それが最終的にしたいことじゃないだろう?
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を入れたいです
248デフォルトの名無しさん:2010/08/04(水) 19:05:05
>memcpy(&hoge,&temp,sizeof(struct KATA));

vectorにこういうキチガイじみた事はやめろ
やるならstd::copyでも使え
249デフォルトの名無しさん:2010/08/05(木) 07:22:16
vectorのことを知るときにコピーの仕方ぐらい一緒に覚えればいいのに
250デフォルトの名無しさん:2010/08/05(木) 12:50:34
coutからcharの値を16進数で表示するにはどうやりますか?
251デフォルトの名無しさん:2010/08/05(木) 13:24:23
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;
}
252デフォルトの名無しさん:2010/08/05(木) 14:09:28
なるほど、そのように技巧を凝らさないと出来ないわけですかwwwwww
253デフォルトの名無しさん:2010/08/05(木) 14:43:55
LinuxやMacでもマルチバイト文字セットでのプログラミングが主流なの?
254デフォルトの名無しさん:2010/08/05(木) 21:47:18
ガスライティング
255デフォルトの名無しさん:2010/08/06(金) 23:07:40
ある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が帰ってきてしまいます
かなり単純なところで躓いた分、何がいけないのか分かりかねます
何がいけないのでしょうか・・・?
257デフォルトの名無しさん:2010/08/06(金) 23:22:06
>>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
>>256
1箇所代入になってる
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)
でくくっとけ
260デフォルトの名無しさん:2010/08/07(土) 00:57:40
>>258
うわ・・・ほんとだ・・・・これはひどい・・・ちょっと凹んできます
>>259
ご指摘ありがとうございます
今回使い方が限定的だったので気にしていなかったのですが習慣づけたほうがよいですよね

ありがとうございました、こんなオチで申し訳ありません
261デフォルトの名無しさん:2010/08/07(土) 00:59:49
define使うな
262デフォルトの名無しさん:2010/08/07(土) 01:26:15
分かりにくいよね。なんで10^nにeが選ばれたのか分からない
263デフォルトの名無しさん:2010/08/07(土) 01:34:01
exponential
264デフォルトの名無しさん:2010/08/07(土) 01:40:33
>>259
#define FOO(n) ((n) * 2)
265デフォルトの名無しさん:2010/08/07(土) 01:56:45
exponential だから e = 2.718281828
266デフォルトの名無しさん:2010/08/07(土) 11:11:38
ネイピア数ってどういう意味なん?
ティッシュのネピアとも違うしな
267デフォルトの名無しさん:2010/08/07(土) 11:34:41
268デフォルトの名無しさん:2010/08/07(土) 19:19:34
素人です
ポインタを使う判断基準がわかりません
どういう時にポインタを使ったほうが良いとわかるのでしょうか?
269デフォルトの名無しさん:2010/08/07(土) 19:28:40
構造体、クラス、配列を関数の引数として渡すとき
270デフォルトの名無しさん:2010/08/07(土) 19:35:23
そのまま渡せばいいじゃんwww
馬鹿かおまえwww
271デフォルトの名無しさん:2010/08/07(土) 19:39:29
>>269
わかりました!
ありがとうございます
272デフォルトの名無しさん:2010/08/07(土) 20:07:17
ムーブセマンティクスが使われるようになると、ポインタを使う機会って減ってくんだろうなあ
273デフォルトの名無しさん:2010/08/07(土) 20:27:24
>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で使える領域を確保することはできますか?
275デフォルトの名無しさん:2010/08/07(土) 21:28:25
vector::reserve
276デフォルトの名無しさん:2010/08/07(土) 21:31:11
>>273
g++はgccにc++オプションをつけたアライアス
277デフォルトの名無しさん:2010/08/07(土) 21:37:45
>>275
reserveは確か値が入ってないので直で使えませんよね?
その後strcpyの第一引数にvのメンバを入れるとエラーがでるのです
278デフォルトの名無しさん:2010/08/07(土) 21:42:37
よくわからんが
v.push_back(new V);
こうしろよ。
そもそも
std::vector< XXX > v;
でいいだろ。
279デフォルトの名無しさん:2010/08/07(土) 21:43:23
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 &' に変換できません。
となります
282デフォルトの名無しさん:2010/08/07(土) 21:50:54
>>280
XXX*はポインタだろ。ポイント先を示してやらないとそりゃエラーになるわな。
後、vectorにnewしてつっこんだリソースは自動的に解放されないから。
ポリモーフィズム的に振る舞う予定が無ければXXXにしとけ。
283デフォルトの名無しさん:2010/08/07(土) 21:53:37
std::vector< XXX* > v;
の時ですね。できました
なぜstd::vector< XXX >ならnewでできないのにstd::vector< XXX* >ならnewで上手く行くか理解できません。説明よろしくお願いします
284デフォルトの名無しさん:2010/08/07(土) 21:56:06
>>283
てめぇ、ちょっとは自分で考えろw
XXXとXXX*じゃ型が違うだろう。

struct XXX hoge = new XXXなんてしないだろ?
struct XXX* hoge = new XXXだし。
285デフォルトの名無しさん:2010/08/07(土) 21:59:00
>>284
ありがとうございます
下をしたことが無かったので全く思いつきませんでした
全て繋がったような気がします。ありがとうございました
286デフォルトの名無しさん:2010/08/07(土) 22:02:54
>>276
g++ = gccなんだね
thx
287デフォルトの名無しさん:2010/08/07(土) 22:45:39
XXXって放送禁止用語の意味だぞ
外人がこのスレ見たら笑うだろうな
288デフォルトの名無しさん:2010/08/07(土) 22:47:06
見たらな
289デフォルトの名無しさん:2010/08/07(土) 22:47:33
>>287
日本人だって仮変数名にunkoとかchinkoとか書くだろ?
あいつらもXXXどころかfuck,dickとか平気で使うぞ。
290デフォルトの名無しさん:2010/08/07(土) 22:48:40
ねーよw
291デフォルトの名無しさん:2010/08/07(土) 22:50:55
ass,boob,cock,dickだっけ?e以降は覚えて無いけど
292デフォルトの名無しさん:2010/08/07(土) 23:20:37
「猫でもわかるプログラム」サイトでWindows SDKについて解説された頁があります。
ここで使われているの「C」言語だと思うのですが、「C++」で同様な事を解説しているサイトないでしょうか?


293デフォルトの名無しさん:2010/08/07(土) 23:38:16
同じだよ
294デフォルトの名無しさん:2010/08/08(日) 00:00:08
quicktime sdk for windows の勉強ができる良サイト教えてくれませんか?
295デフォルトの名無しさん:2010/08/08(日) 10:14:42
C言語ではmallocで構造体の領域の確保をしていました、
C++の場合はnewで構造体の領域を確保しても大丈夫なんですか
296デフォルトの名無しさん:2010/08/08(日) 10:29:52
大丈夫です。というかnew/deleteが推奨です。
297295:2010/08/08(日) 10:46:21
>>296
ありがとうございます
298デフォルトの名無しさん:2010/08/08(日) 11:25:45
そんなもの推奨してません。

make_sharedを使ってください。
299デフォルトの名無しさん:2010/08/08(日) 12:43:43
勉強を始めてまだ日がたってないとわかる。
それなのに、boostをすすめる上に、背景も言わない。
もう少し、丁寧に答えてあげなよ。
答えてあげることはいいと思うけどね。

それに、いつ削除するか決まっててわかっているならmake_shared使う必要ないよ。
C++0xの完成も2012年とまだまだ先の話だし。
いろんな方法がある。適材適所で機能を使うことが大切。
それは、日本語でも同じ。
300デフォルトの名無しさん:2010/08/08(日) 13:05:17
shared_ptrにすれば大丈夫とか幻想だから
301デフォルトの名無しさん:2010/08/08(日) 18:21:57
どういうミスやらかすとまずかったりしますかね?
循環参照はまずいものの見つける方法は用意されてるみたいですが
302デフォルトの名無しさん:2010/08/08(日) 18:35:08
scoped_ptrのみでがんばる
303デフォルトの名無しさん:2010/08/08(日) 19:30:23
c/c++って勉強しても、最近の言語とは違って
なかなか書けるようにならないね
304デフォルトの名無しさん:2010/08/08(日) 20:21:32
>>301
どんな些細なミスでも容赦なく派遣切りさせていただきますのでご了承ください。
305デフォルトの名無しさん:2010/08/08(日) 21:03:36
char array1[] = "array";
char "array2 = "array";
array1 = array2;

これができないのは、array1のアドレスがconstだからですか?
306デフォルトの名無しさん:2010/08/08(日) 21:08:53
307305:2010/08/08(日) 21:44:07
>>306
すごい、理解しにくい文章でした
つまり、array1の値は配列なので値が変えられないって
だけの話ですね

値を変えたかったらポインタを使えと
308デフォルトの名無しさん:2010/08/08(日) 21:51:17
「C FAQ」の名前くらい知ってろよ
309デフォルトの名無しさん:2010/08/08(日) 23:31:37
複数の参照に値を返す関数
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);

ポインタにするのが一番なんだろうけど...
310デフォルトの名無しさん:2010/08/08(日) 23:38:04
構造体を使えばいいんじゃないかな
311デフォルトの名無しさん:2010/08/08(日) 23:39:01
それメモリリーク起こしてるぞ
312デフォルトの名無しさん:2010/08/08(日) 23:47:02
>>311
あぁ,そっか気づかなかった
ありがとう
直します.

>>310
矩形の構造体にまとめると...
コードがかさばらなくて済みますね
ありがとうです
313デフォルトの名無しさん:2010/08/09(月) 01:49:28
そんな細かい処理速度気にするなら
そもそも縦横左右それぞれの取得関数用意しとけよと
314デフォルトの名無しさん:2010/08/09(月) 08:03:15
>>309
今からシグネチャ変更してもいいならだけど、こんなんどうよ?
http://codepad.org/hpZ7BpRJ
これで定数を渡した部分だけ無視できる
315デフォルトの名無しさん:2010/08/09(月) 09:39:29
クラスの中のポインタ変数に値を入れるvoid型の関数が多いような気がするのですが
ポインタ型を返す関数だと何か不味いですか?
自分の見たソースがそうなだけですか?
316デフォルトの名無しさん:2010/08/09(月) 10:17:55
ポインタを返す関数もたくさんあるよ。strcpyとかの文字列関係とか。
ポインタの性質上、引数で受け取った変数のどこかを指すポインタを返すのが多いけど。
317デフォルトの名無しさん:2010/08/09(月) 10:32:01
>>315
コーディング規約や慣習で、ポインタを返さないと言うポリシーはたまによくある。
318デフォルトの名無しさん:2010/08/09(月) 10:32:43
>>276
その読みは酷すぎる。せめて、エイリアスにしておいてくれ。
319309: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の同じ番目を消すことはできるでしょうか?
321デフォルトの名無しさん:2010/08/09(月) 12:56:51
>>320
distance使えばいいんじゃね?
322デフォルトの名無しさん:2010/08/09(月) 13:10:40
>>321
すいません
理解できません
どうすれば良いのでしょうか?
323デフォルトの名無しさん:2010/08/09(月) 13:21:27
>>322
そもそも>320のコードはなにがしたいのか意味わかんなかった
いろいろおかしい

ただ、イテレータを使いたいみたいだったから、vector<HOGE1>のイテレータで
vector<HOGE2>の削除をするにはdistanceとadvance使えばいいんじゃないかなと提案しただけ

普通に考えたらある番目つってんだからその数値で両方にv.erase(v.begin() + n)すればいいだけじゃないのか?
324デフォルトの名無しさん:2010/08/09(月) 13:22:40
vectorだからadvanceはいらないですねごめんなさい
325デフォルトの名無しさん:2010/08/09(月) 13:30:52
>>323
>>320はあるイテレーターの時、その要素を消してメモリもサイズを減らすってつもりなのですがおかしいですか?
hoge1はイテレータを使いたいのでそのやり方でも問題ありません。ありがとうございます
326デフォルトの名無しさん:2010/08/09(月) 14:03:20
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;}
}
こんな感じです
328デフォルトの名無しさん:2010/08/09(月) 15:42:36
listをシャッフルしたいんだけど一番効率の良いコード教えて!
329デフォルトの名無しさん:2010/08/09(月) 15:45:37
ランダムじゃなくても良いですか?
330デフォルトの名無しさん:2010/08/09(月) 15:46:16
listをやめるというのも手じゃないかな
331デフォルトの名無しさん:2010/08/09(月) 15:57:46
>>329
ランダムじゃないとだめです><
>>330
vectorでもいいよ!!
332デフォルトの名無しさん:2010/08/09(月) 16:16:26
>>328
教えるのめんどくさいからやだ。自分で考えて。
ちなみに万あっても微々たる差。
333デフォルトの名無しさん:2010/08/09(月) 16:34:09
そういうのはいらないです
334デフォルトの名無しさん:2010/08/09(月) 16:39:19
だが断る
335デフォルトの名無しさん:2010/08/09(月) 23:54:45
listからランダムに取り出して別のlistにつっこむ
336デフォルトの名無しさん:2010/08/10(火) 00:47:02
>>328
置換群の元の一つを置換行列に変換して、それをvectorに掛ける。
337デフォルトの名無しさん:2010/08/10(火) 01:13:29
オブジェクト指向を勉強してC++を理解したいと思っています
現状ではクラスを定義してもその変数をグローバルで宣言して
いろんなソースファイルから使えるようにしていますが
そろそろそういう状態から抜け出したいです
そこでどういうクラス設計や考え方をすればよいか理解できる
わかりやすい書籍などありましたら教えてください
338デフォルトの名無しさん:2010/08/10(火) 05:58:40
なぜ、配列はポインタと同じくアドレスでアクセス出きるんですか?
339デフォルトの名無しさん:2010/08/10(火) 07:43:02
いえ、氷山にぶっつかって船が沈みましてね、-略-船が氷山にぶっつかって一ぺんに傾きもう沈みかけました。月のあかりはどこかぼんやり
ありましたが、霧が非常に深かったのです。ところがボートは左舷の方半分はもうだめになっていましたから、とてもみんなは乗り切らない
のです。もうそのうちにも船は沈みますし、私は必死となって、どうか小さな人たちを乗せて下さいと叫びました。近くの人たちはすぐみち
を開いてそして子供たちのために祈って呉れました。けれどもそこからボートまでのところにはまだまだ小さな子どもたちや親たちやなんか
居て、とても押しのける勇気がなかったのです。それでもわたくしはどうしてもこの方たちをお助けするのが私の義務だと思いましたから前
にいる子供らを押しのけようとしました。けれどもまたそんなにして助けてあげるよりはこのまま神のお前にみんなで行く方がほんとうにこ
の方たちの幸福だとも思いました。それからまたその神にそむく罪はわたくしひとりでしょってぜひとも助けてあげようと思いました。けれ
どもどうして見ているとそれができないのでした。どもらばかりボートの中へはなしてやってお母さんが狂気のようにキスを送りお父さんが
かなしいのをじっとこらえてまっすぐに立っているなどとてももう腸もちぎれるようでした。そのうち船はもうずんずん沈みますから、私は
もうすっかり覚悟してこの人たち二人を抱いて、浮べるだけは浮ぼうとかたまって船の沈むのを待っていました。誰が投げたかライフブイが
一つ飛んで来ましたけれども滑ってずうっと向うへ行ってしまいました。私は一生けん命で甲板の格子になったとこをはなして、三人それに
しっかりとりつきました。どこからともなく〔約二文字分空白〕番の声があがりました。たちまちみんなはいろいろな国語で一ぺんにそれを
うたいました。そのとき俄かに大きな音がして私たちは水に落ちました。もう渦に入ったと思いながらしっかりこの人たちをだいてそれから
ぼうっとしたと思ったらもうここへ来ていたのです。この方たちのお母さんは一昨年没くなられました。ええボートはきっと助かったにちが
いありません、何せよほど熟練な水夫たちが漕いですばやく船からはなれていましたから。
340デフォルトの名無しさん:2010/08/10(火) 08:31:22
>>337
デザインパターンでも勉強しろ
そして過剰設計に陥ってる自分に気づいてからが本当の設計が始まる
341デフォルトの名無しさん:2010/08/10(火) 11:14:52
>>339
銀河鉄道の夜か。タイタニック号の事故を下敷きにしているんだね。
銀河鉄道の夜の映画音楽を担当した細野晴臣がタイタニック号の生き残りの孫だと言うのが因果だね。
342デフォルトの名無しさん:2010/08/10(火) 11:43:01
>>338
配列すなわち定数。

int a;
a = 2; OK
2 = a; NG

int *a, b[10];
a = b; OK
b = a; NG
343デフォルトの名無しさん:2010/08/10(火) 12:15:26
>>331
ttp://oshiete.goo.ne.jp/qa/2438745.html
C++なら
std::random_shuffle
を使えばいいって言う話。
344デフォルトの名無しさん:2010/08/10(火) 12:41:31
>>337
大規模C++ソフトウェアデザインは勉強になった
日本語がところどころ難解だけど
345デフォルトの名無しさん:2010/08/10(火) 15:34:51
オープンソースのライブラリ的な奴のソースに
#if 0
〜処理
#endif
とあって
自分で実装しないといけないとかいう話も聞く関数中なのですが
#if 0 #endifって無視される部分ですよね?なぜこんなことをしてるのですか?一応サンプルのやり方だけ残しとくよみたいな感じなのですか?
346デフォルトの名無しさん:2010/08/10(火) 16:02:23
>>345
そのとおり。そのソースを書いた人のやさしさ
347デフォルトの名無しさん:2010/08/10(火) 18:45:07
ちょっと質問です
プログラムのコンパイル時間が長いので、頻繁に調整する関数をDLLにしようか迷ってるんですが、
プログラムに直接処理用の関数を関数を書くのと、
関数をDLLに分けて処理させるのでは、オーバヘッドに違いは出ますか?
348デフォルトの名無しさん:2010/08/10(火) 19:18:47
両方作って計測すれば、勉強になる。
349デフォルトの名無しさん:2010/08/10(火) 19:29:01
>>347
コンパイルを早くしたいなら、dllに分けていいよ。
dllにすることによっての呼び出しオーバーヘッドは考えてなくいい。

あと、少し詳しく説明すると以下のようになるよ。
dllを使うプログラムの方は、実行ファイルにdllのコードを書き込まないよ。
関数の定義がどのファイルにあるかとかの情報を実行ファイルに書くだけ
(ファイル情報はなかったかも、でもこれのせいで”こんぱいる”が過剰に遅くなることはない)。

遅くなるのは、アプリケーションの起動。
実行時に、プロセスのアドレス空間にdllをロードするのに時間がかかるからだよ。
350デフォルトの名無しさん:2010/08/10(火) 19:43:02
オーバヘッドに違いは出ます。
351デフォルトの名無しさん:2010/08/10(火) 20:10:48
350を無視できるような347(プログラミング経験者)とは思えないから、もう少し、情報を与える。
wikiで、ライブラリを見てみ?
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA

それと350のような無能は何がしたいんだろうな。
352デフォルトの名無しさん:2010/08/10(火) 20:36:28
sizeofはどうやって領域の大きさを取得しているんですか?
353デフォルトの名無しさん:2010/08/10(火) 21:17:10
>>351みたいに他人を罵倒することで正当性を主張するような奴が無能なんだよな
コミュ力低そうだし
354デフォルトの名無しさん:2010/08/10(火) 21:21:34
>>352
静的型の言語なんで、コンパイル時にサイズが確定してる。
355デフォルトの名無しさん:2010/08/10(火) 21:23:08
>>354
thx
356デフォルトの名無しさん:2010/08/10(火) 21:24:24
>>350が言ってるのはvtableのようなオーバーヘッドなの?
にしてもたいしたことなさそうだけど
大きな関数だけをdllに移すんだったらだけど
357デフォルトの名無しさん:2010/08/10(火) 21:49:18
一般に
アドレス値を即値(相対)で指定した直接ジャンプとなるか
メモリ内にあるアドレスを元にした間接ジャンプとなるか
という程度の違いは出る。
(メモリアクセスが入るので、コンパイラによってはレジスタに飛び先を保存して再利用したりも)

でもって、間接ジャンプの場合、最初の一回の分岐予測は必ず外れ
直接ジャンプ(で絶対ジャンプ)なら最初から分岐予測が成功する。
ただ、(ループ内や関数内での)2回目以降は両方とも常に成功するはず。
358デフォルトの名無しさん:2010/08/10(火) 21:52:48
関数の調整をしているときだけDLLで開発して
完成したらstaticlinkにすりゃ医院で内科医
359デフォルトの名無しさん:2010/08/10(火) 21:53:36
dll呼び出しはベクター介した間接呼出しになるから、オーバーヘッドに差は有る。
しかし、>>349は「オーバーヘッドに差は無い」ではなく「オーバーヘッドは考え
なくて良い」といっているので、>>350は下らない言いがかり。

1泊以上の数値演算プログラムの一番厳しいループ中でもモジュール内呼び出しと
DLL呼び出しで、実行時間に有意差は出ねー。
360デフォルトの名無しさん:2010/08/10(火) 22:10:18
この足の引っ張り合いが日本のITの歴史だ
361デフォルトの名無しさん:2010/08/11(水) 12:49:10
>>354,355
C99の範囲ではそーでもないと一応
可変長配列にsizeofしたり
362デフォルトの名無しさん:2010/08/11(水) 12:58:22
不完全型へのポインタを利用した手法(略称わすれた)を使ってコンパイルが依存しないようにしてみるというのは?
これはこれで間違いなくオーバーヘッドは出るんだけどさ
363デフォルトの名無しさん:2010/08/11(水) 13:19:01
>>362
不透明ポインタ(opaque pointer)
364デフォルトの名無しさん:2010/08/11(水) 20:34:24
お前らは職業プログラマーですか?
365デフォルトの名無しさん:2010/08/11(水) 21:46:22
奨学金がだいたい月に4万くらいで4年間もらってたから 4×4×12=192万 か・・・
結構借金あったんだなー。
366デフォルトの名無しさん:2010/08/12(木) 12:52:08
>>363
忘れたのはポインタの名前じゃなくて手法の名前だww
367デフォルトの名無しさん:2010/08/12(木) 14:40:07
>>364
ゲーム専門学校で遊んで暮らしてるやつが大半。
368デフォルトの名無しさん:2010/08/12(木) 15:08:48
>>362
pimplのこと?
369デフォルトの名無しさん:2010/08/13(金) 11:23:44
charのサイズは規格で決まっているらしいですが、
全てのメージャーなコンパイラで同じサイズ何ですか?
370デフォルトの名無しさん:2010/08/13(金) 11:33:21
全てでcharは1バイトです
371369:2010/08/13(金) 11:38:23
>>370
thx
372デフォルトの名無しさん:2010/08/13(金) 11:43:32
但し1byteは8bitがほとんどだがそうでないものの存在も規格上許されている
373デフォルトの名無しさん:2010/08/13(金) 12:34:56
pimplかよ!
374デフォルトの名無しさん:2010/08/13(金) 12:37:43
1byte == 7bit の処理系も、
理論の話だけじゃなくて現実にあるんだろ確か。
なんでそんな迷惑なシステムになっちゃったの?
375デフォルトの名無しさん:2010/08/13(金) 12:46:57
7bitは見たことないが9bitならある。
376デフォルトの名無しさん:2010/08/13(金) 13:02:59
>>374
Cの処理系の一バイトは8ビット以上。
377デフォルトの名無しさん:2010/08/13(金) 14:01:50
配列を受け取る引数は
void hoge(int *array)
void hoge(int array[])
のどちらで宣言する事が多いんですか?
378デフォルトの名無しさん:2010/08/13(金) 14:43:08
>>377
どっちも手抜き

まともなプログラムはサイズを合わせて指定する
void hoge(int *array, size_t size)
void hoge(int array[N])
379デフォルトの名無しさん:2010/08/13(金) 15:03:44
>>378
一応念の為に聞いておくけどギャグだよね?
まさかとは思うけど、後者のNに意味があるなんて思っちゃいないよね?
380377:2010/08/13(金) 15:25:33
>>378
ありがとうございました
381デフォルトの名無しさん:2010/08/13(金) 19:58:04
意味はないけど場合によっては見やすくするためにかくんじゃないの?
382デフォルトの名無しさん:2010/08/13(金) 20:38:10
まぎわらしい
383デフォルトの名無しさん:2010/08/13(金) 20:39:45
一般的には「意味が無いなら最初から書かない方が良い」とされていますね
384デフォルトの名無しさん:2010/08/14(土) 00:44:17
こういう>>378みたいな知ったかが現場で上の方にいると下が地獄なんだよな
偉そうに間違った知識をまき散らして・・・アホかっての
385デフォルトの名無しさん:2010/08/14(土) 01:01:20
>>384
詳細プリーズ
386デフォルトの名無しさん:2010/08/14(土) 01:15:45
>>385
詳細も糞も。
C/C++ほとんど使わない俺の目にも>>378の後者は変だ。

>void hoge(int array[N])
この引数のプロトタイプは何を意味しているのだろう。
要素数Nの配列しか受け付けない?
呼び出し側で指定している配列の要素数がNかどうかなんて、
どうやってコンパイル時に検出するの?
387デフォルトの名無しさん:2010/08/14(土) 01:35:42
>>385
void hoge(int array[N]) なんて書いても配列の要素数の束縛なんてできない
void hoge(int array[], size_t size) なら言いたいこと分かるけど
388デフォルトの名無しさん:2010/08/14(土) 01:42:46
なんだ後者のほうか
前者もおかしいのかとおもた
389デフォルトの名無しさん:2010/08/14(土) 03:35:02
クラスに関する質問なんですが
以下のプログラムで
void setname(char* ss)のssとは何をさしているのでしょうか?
最初は年齢か名前の文字数が入るのかと思ったのですが
どうも違うような気がします
本当にレベルの低い質問なんですが
ご教授よろしくお願いします
390389: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();
}
391デフォルトの名無しさん:2010/08/14(土) 03:45:46
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とかいう手抜きな名前がついてる


まぁ本当に初歩の初歩だからここで質問するより参考書とか初心者向けサイトとかを見たほうが速いんじゃないかな
392デフォルトの名無しさん:2010/08/14(土) 04:08:26
a string to set の略とかだったり
393デフォルトの名無しさん:2010/08/14(土) 07:34:49
長さが不明な文字列をstrcpyするサンプルを乗せている文献やサイトはもれなくクソ。
それを参考してはいけない。
394デフォルトの名無しさん:2010/08/14(土) 10:07:43
>393

終端されていない配列をコピーしちゃダメ!っていう意味かい?

Cで「文字列」って言えば、終端されていることが前提です。
長さ不明って言っても、文字列長はわかりますけど。
395デフォルトの名無しさん:2010/08/14(土) 11:11:53
strcpy_sですべて解決
396デフォルトの名無しさん:2010/08/14(土) 11:50:14
>>394
文字列長が転送先に収まるか確認してからstrcpyしろ。
という事を、お前のような初心者に一々説明するのは面倒だから、strcpyは使用禁止。
397デフォルトの名無しさん:2010/08/14(土) 11:54:50
理由がわからないコーディングルールが蔓延してる現場ってすごいダメだな。
398デフォルトの名無しさん:2010/08/14(土) 13:25:18
>396
>文字列長が転送先に収まるか確認してからstrcpyしろ。

これなら納得。
「長さ不明の文字列」って言葉の使い方の問題だ。
「長さ不明の文字列」ならコピー先に収まるかどうか、判定すらできないじゃん?
って思っちゃったのよ。

>393から396をエスパーできなかったよ。

strcpy禁止にしてstrncpyやstrcpy_sを使うのは、コーディングルールとしてはアリと思う。
399デフォルトの名無しさん:2010/08/14(土) 15:19:15
なんだバカか
400デフォルトの名無しさん:2010/08/14(土) 15:24:20
iPadにある電光掲示板アプリを作りたいんですが、あれはどういうロジックなんでしょ?良いライブラリでもあるんですかね?
401デフォルトの名無しさん:2010/08/14(土) 15:42:27
文字のドット化が出来れば簡単そうだが・・・どうするんだろ
402デフォルトの名無しさん:2010/08/14(土) 22:42:34
OSXならfreetypeでフォントファイルと文字列からビットマップを出力できるよ
403デフォルトの名無しさん:2010/08/15(日) 10:14:34
unionについて質問

>各メンバは、同じメモリ領域を共有します。
これは、変数の管理コストを下げたりするメリットがあるけど

>共用体変数にある値を代入すると他のデータは失われる
データが壊れるってわかっているのに、何故unionを使う必要があるのですか?
404デフォルトの名無しさん:2010/08/15(日) 10:55:40
>>403
1.節約する
2.他の型で読み取ることが有用なことがある, intで突っ込んだデータをcharで1バイトずつ読み取ったり
405デフォルトの名無しさん:2010/08/15(日) 13:43:37
>403>404
もうひとつ。

どの型のデータを格納するかわからない場合がある。
シリアル通信とか、ネットワークプログラムでは定番。
406デフォルトの名無しさん:2010/08/15(日) 13:59:25
>共用体変数にある値を代入すると他のデータは失われる 

が要らんことを言ってるだけな気がする。
要は同じメモリ領域を共有してるってことだから、この一文は無くていい
407デフォルトの名無しさん:2010/08/15(日) 16:13:20
>>403
名前は違うけど同じものを指しているってこともある
408デフォルトの名無しさん:2010/08/15(日) 17:02:26
グローバル変数と何が違うの?
409デフォルトの名無しさん:2010/08/15(日) 17:05:12
グローバルな変数とは何の関係もないが
410デフォルトの名無しさん:2010/08/15(日) 19:52:00
プロトコルのヘッダ書くとき俺もunion使った
「union変数のある部分ではint型としてアクセスしたいけど、
別のある部分ではuintとしてアクセスしたい」みたいな

そういう場合でもない限り、使うことはないし、
特に、初心者は気にすることもない
411389:2010/08/15(日) 20:47:15
>>391
ありがとうございました

参考書を熟読します
412デフォルトの名無しさん:2010/08/15(日) 23:06:00
今、RTP プロトコルのライブラリをC++ で書いているのですが、AVIコーディックの payload typeの値っていくらなんでしょうか?
RFC読んでも見当たらないのですが、知ってる人がいたらオナガイします。
413403:2010/08/15(日) 23:25:06
>>404
>他の型で読み取ることが有用なことがある, intで突っ込んだデータをcharで1バイトずつ読み取ったり
すみません、ここら辺がいまいちわかりません

>>410
プロトコルを作るときに便利なんですか、unionの使い方を覚えたいですね
414デフォルトの名無しさん:2010/08/15(日) 23:31:16
>>413
常駐するタイプのソフトを作るとき、出来る限りリソースは最小限に抑えたい
その際にオブジェクト一つにテキストが内包されてるか数値が内包されてるかオブジェクトによって異なる場合、などに使う。
classでも同じようなことが出来るが。
415403:2010/08/15(日) 23:40:37
>>414
クラスっぽいって事はわかりました
レスをヒントにもう少し調べてみたいと思います

感謝
416400:2010/08/15(日) 23:45:18
>401
そう、ドット化って意外とわからないっすよね。それを巨大化したりすろのも。学生時代に画像認識系でやったことあった気がするけどさっぱり思いだせない。

>402
Macも使ってるんで試してみますわ。情報ありがとうございます(・∀・)
417デフォルトの名無しさん:2010/08/15(日) 23:47:40
>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デフォルトの名無しさん:2010/08/15(日) 23:58:51
>412
ちょっとググってみたら、こんなページを見つけたよ。

http://www.networksorcery.com/enp/protocol/rtp.htm

これを見るとcodecを指定するみたい。aviはコンテナなので、格納されているcodecを指定することになるんじゃないの?
419デフォルトの名無しさん:2010/08/16(月) 00:12:05
>>418 thx >>412 です
ここで聞く前に、そこ見てRFC読んだのですが、avi(Audio Video Interleave) の記述を見つけられませんでしたorz
どのcodec を指定してやればいいのだろうか?
420デフォルトの名無しさん:2010/08/16(月) 01:41:05
AVIのままではRTPに突っ込むことが出来ない
仕様を無視してもよけりゃ適当に衝突しないとこを指定すればいいんじゃないの
421デフォルトの名無しさん:2010/08/16(月) 09:04:10
ヘッダーファイルやソースファイルにpragma onceを使わないメリットを教えてください。
422デフォルトの名無しさん:2010/08/16(月) 09:05:56
そのまえに使うメリットを教えてください
423デフォルトの名無しさん:2010/08/16(月) 09:13:28
普通の#ifdef と #defineでのインクルードガードではうまくいかない場合がある
ただ、そんな風になること自体がおかしいって説もあるが
424デフォルトの名無しさん:2010/08/16(月) 09:33:13
#pragma onceは移植性無いんじゃなかったっけ?
425デフォルトの名無しさん:2010/08/16(月) 09:43:58
>>421
>424の通り、onceは一部の処理系では使えるけれど、他の処理系でも同じ意味である保証がない。
一部の処理系で言うonceは>423の言うインクルードガードと同じ目的に使うものなので、一般的にソースコードに使う意味はない。
426デフォルトの名無しさん:2010/08/16(月) 09:58:58
#pragma onceはマクロ名が衝突する心配が無い。
427デフォルトの名無しさん:2010/08/16(月) 13:44:44
pragma onceはパス見るだけだからシンボリックリンクとかで
エイリアスがあるとうまく働かないんだよね
428デフォルトの名無しさん:2010/08/16(月) 14:41:42
>>425
#pragma once が通らないような処理系なんて考える必要はない。
これを言い出したら昔の処理系では void のキーワードすら認識できないものがある。
そんな処理系を想定してコードを書くのはナンセンス。

>一般的にソースコードに使う意味はない。
ソースをインクルードできるのは普通のこと。void を認識しない処理系でもこれはできる。
ソースをインクルードするときには #pragma once は便利な機能。
429デフォルトの名無しさん:2010/08/16(月) 16:08:23
ヒント:規格合致
pragma onceを別の意味にしている処理系があってもISO準拠。
voidがない処理系については、その頃はANSI-C以前だろ。
430デフォルトの名無しさん:2010/08/16(月) 16:12:19
>>421のソースファイルってのはインクルードする側を指してるみたいだから
#pragma once 使っても意味がないだろ
431デフォルトの名無しさん:2010/08/16(月) 16:12:22
>>428
ソースをインクルードするような運用はそれ自体が大問題だと思うぞ。
せめて、拡張子を.incとか.iとかにしてくれ。
432デフォルトの名無しさん:2010/08/16(月) 16:59:24
>>429
#pragma once は ANSI だよ
433pragma単体ならansiにあるが……:2010/08/16(月) 17:06:03
>>432
ソースは?
434デフォルトの名無しさん:2010/08/16(月) 17:07:27
そーすはANSI
435デフォルトの名無しさん:2010/08/16(月) 17:13:48
>>434
馬鹿?
436デフォルトの名無しさん:2010/08/16(月) 17:22:02
ANSIには関わりのねぇことで
437デフォルトの名無しさん:2010/08/16(月) 18:50:11
すみません。
floatで-3.4549897 と -3.4549899 の引き算を行った所、
答えが-0.0000002(7桁をオーバー)ではなく 2.3841858e-007 になり、
割り算を当てるとゼロ割り算と同じエラーを吐きます。

時折見かける、この e-007 などは扱える数を超えたという意味なのでしょうか。
こういった場合ifで桁数を超えないか監視するのが定番なのでしょうか?
438デフォルトの名無しさん:2010/08/16(月) 18:55:50
>>437
所謂指数表記です。関数電卓アプリなどでもしばしば見られると思います。
尚、浮動小数点数は元々そういった小さい数も扱えるようになっているので、
指数表記を知っておく必要があります。
また、その計算結果は見ての通り演算精度が得られないために2e-7になっていませんが、
doubleで演算すればより2e-7に近い値が得られると思います。
従って、(その他の理由もありますが)特に必要がない限りC/C++ではfloatを使うべきではありません。
439デフォルトの名無しさん:2010/08/16(月) 19:09:59
実務レベルなら
今時 #pragma once 使わず #if でインクルードガードとかやるなんて馬鹿だとしか思えんね
ビルドに余計な時間かかるし、無用なバグを生むことにもなりかねない

まぁ趣味レベルのプログラムならどうでもいいんだろうけどね
void 使わないのも勝手、関数のプロトタイプ宣言使わないのも勝手w
440デフォルトの名無しさん:2010/08/16(月) 19:22:20
>>439
こんな子どもじみた考えで実務とか語ってるのかよ
441デフォルトの名無しさん:2010/08/16(月) 19:24:46
>>437
「割り算を当てる」ってどういう意味だよ。

単精度で扱える範囲は10の-15乗 〜 10の38乗だから2e-7は楽勝で扱える値域。
それで割ってもゼロ割にはならない。
442413:2010/08/16(月) 19:58:21
>>417
わざわざ、ありがとうございます
443デフォルトの名無しさん:2010/08/16(月) 20:00:27
>>439
マクロを展開して出来上がった、実行ファイルの速さと、コンパイル時間とのトレードオフの問題なのではなかろうか?
#if を見て、なんでも悪いと決め付ける理由が、わしにはようわからん、C++ 再考 のテンプレートの章を一度よみなはれ
444デフォルトの名無しさん:2010/08/16(月) 20:06:55
インクルードガードの話で実行ファイルの速さ・・・?
445デフォルトの名無しさん:2010/08/16(月) 20:25:23
誰かバカを呼ぶバカ笛でも吹いたのか?
446デフォルトの名無しさん:2010/08/16(月) 20:50:27
実務レベルなら他人がぱっと見て安心できるようにするんだよ
447デフォルトの名無しさん:2010/08/16(月) 20:51:12
↑つられて出てきた馬鹿
必死で馬鹿を否定する馬鹿↓
448デフォルトの名無しさん:2010/08/16(月) 20:53:52
                                ,.へ
  ___                             ム  i
 「 ヒ_i〉                            ゝ 〈
 ト ノ                           iニ(()
 i  {              ____           |  ヽ
 i  i           /__,  , ‐-\           i   }
 |   i         / (e)    (A) \       {、  λ
 ト−┤.      /    (__人__)    \    ,ノ  ̄ ,!
 i   ゝ、_     |     U `       | ,. '´ハ   ,!
. ヽ、    `` 、,__\              /" \  ヽ/
   \ノ ノ   ハ ̄r/:::r―--―/::7   ノ    /
       ヽ.      ヽ::〈; . '::. :' |::/   /   ,. "
        `ー 、    \ヽ::. ;:::|/     r'"
449437:2010/08/16(月) 21:03:53
>>438
指数表記と言うのですか・・一時的な演算ならばdoubleで行うと良いのですね。
なるべく避けられる部分は避けようと思います。ありがとうございました。
450デフォルトの名無しさん:2010/08/16(月) 21:06:10
すみません。
変数Aから変数Bを引いた値(差)を求めたいのですが、
変数A・Bとも正〜負までが不規則に現れる為、
負の場合の反転を起こして上手く差を求められません。

現状は変数A・B共に一定の数値を足して正の値に押し上げて
対応しているのですが、もっとシンプルで確実な方法は無いものでしょうか?
451デフォルトの名無しさん:2010/08/16(月) 21:13:30
差ってのはどっちが+だろうが−だろうが、
A-Bじゃないの?w
452デフォルトの名無しさん:2010/08/16(月) 21:29:12
だな

>>450はもはやなにいってのか分からないので
上手く動いてないコードを提出してくれるかもっと説明するかしろ
453デフォルトの名無しさん:2010/08/16(月) 21:47:47
メモリーリーク(ちょっと)するけどコードすっきりするのとメモリーリークしないけど分かりにくくなるのってどっちがいいのかな
454デフォルトの名無しさん:2010/08/16(月) 21:49:49
メモリリークしなくて分かりやすいコード以外書くな。
スマートポインタでも使え!
455デフォルトの名無しさん:2010/08/16(月) 21:55:06
ちゃんとしたコードなら
その2つは
相反しない要求だと思うぞ。
456デフォルトの名無しさん:2010/08/16(月) 22:01:56
リークする時点でダメだよな
457デフォルトの名無しさん:2010/08/16(月) 22:16:58
std::exitで終了を管理してるからリークは避けられない
458デフォルトの名無しさん:2010/08/16(月) 22:28:19
>>457
> std::exitで終了を管理してるから
それが原因だとわかっているんじゃないか。
459デフォルトの名無しさん:2010/08/16(月) 23:43:45
環境依存の話で申し訳ないけど、
#importってインポートするファイルがコンパイル後の実行ファイルを実行する環境に無くても別に平気なの?
460デフォルトの名無しさん:2010/08/16(月) 23:50:42
平気なわけないだろ
461デフォルトの名無しさん:2010/08/17(火) 00:49:11
#import
って何?
462デフォルトの名無しさん:2010/08/17(火) 01:15:28
>>459
C/C++ではないな。出てけ。
463デフォルトの名無しさん:2010/08/17(火) 01:17:20
無知乙
464デフォルトの名無しさん:2010/08/17(火) 03:49:08
>>457
そういう意味かよ
exitで終了するときまだ開放してないのがあるってのなら、一般的なOSでは気にする必要がないというか
メモリリークしない

並列処理で使うやつだとちゃんとしないと駄目なのもがあるが
465デフォルトの名無しさん:2010/08/17(火) 08:31:02
>>438
初心者にウソを教えるな
466デフォルトの名無しさん:2010/08/17(火) 15:49:47
そういうのは正しい答えを書いてからいうもんだ
467デフォルトの名無しさん:2010/08/17(火) 17:59:10
>>465
みんなが本当だと言えばそれが真実になる
468デフォルトの名無しさん:2010/08/17(火) 18:42:25
>>467
朝鮮人みたいな事言うなヴォケ
規格票で示せ
469デフォルトの名無しさん:2010/08/17(火) 19:26:30
そういうのは正しい答えを書いてからいうもんだ
470デフォルトの名無しさん:2010/08/17(火) 19:27:14
マクロってソースにはもりもり使っていいの?
471デフォルトの名無しさん:2010/08/17(火) 19:52:13
使わないといけない理由がないなら使ってはいかん。inline関数の方がマシ。
472デフォルトの名無しさん:2010/08/17(火) 19:58:33
プライベートなメソッドの代わりに使いたいんだ
インラインにしてヘッダに書いちゃうと解析コストがちょびっと増えそうで気になる
473デフォルトの名無しさん:2010/08/17(火) 19:59:27
そこらへん
Effective C++に詳しくあるはずだ
#defineよりconst
#defineよりinline
474デフォルトの名無しさん:2010/08/17(火) 20:07:18
ちょこっとづつ違う定型inlineメンバやconst値を大量に定義したいときに#defineつこてしまう。
少なくともeclipseのメソッドツリー機能は憑いてきてくれる
475デフォルトの名無しさん:2010/08/18(水) 13:41:19
商用使用無料の高性能なコンパイラってありますか?
476デフォルトの名無しさん:2010/08/18(水) 13:56:42
VS2010EE
477デフォルトの名無しさん:2010/08/18(水) 14:03:57
EEでも商用利用可能なんですか!
ありがとうございます。
478デフォルトの名無しさん:2010/08/18(水) 16:04:03
2008までは可だったけど2010からは評価目的のみになったんじゃなかったっけ?
479デフォルトの名無しさん:2010/08/18(水) 16:32:13
登録前はそうだが
480デフォルトの名無しさん:2010/08/18(水) 16:49:51
登録後に商用を許可しますなんて表示されたっけ
481デフォルトの名無しさん:2010/08/18(水) 16:53:33
2008EEの統合環境に
最新のWindowsSDK落としてきてbin,lib,includeをそっちと置き替えるってのはどうだろう?
どっちにしろEEはMFCとかの追加機能は使えないんだし
482デフォルトの名無しさん:2010/08/18(水) 17:10:17
なんでそこまでしてVC使いたいの?馬鹿なの?死ぬの?
483デフォルトの名無しさん:2010/08/18(水) 17:48:08
なんか手軽だし
484デフォルトの名無しさん:2010/08/18(水) 18:37:27
業界の標準だし
485デフォルトの名無しさん:2010/08/18(水) 23:00:39
使ってる人多いし
486デフォルトの名無しさん:2010/08/18(水) 23:02:22
Linuxで使える、商用OKなコンパイラは?
487デフォルトの名無しさん:2010/08/18(水) 23:03:03
訂正
Linuxで使える、商用OKな無償のコンパイラは?
488デフォルトの名無しさん:2010/08/18(水) 23:06:50
作れ
489デフォルトの名無しさん:2010/08/18(水) 23:24:47
gccの吐いた実行ファイルって商用に使えないの?
490デフォルトの名無しさん:2010/08/18(水) 23:25:18
終了時のメモリ解放忘れによるメモリリークと不用意なnewの繰り返しによるリークは
区別されてしかるべきと思うんだけどなあ
491デフォルトの名無しさん:2010/08/19(木) 00:40:19
突然なによん
492デフォルトの名無しさん:2010/08/19(木) 01:29:22
キチガイに触れんな
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);の時点で値が入らなくなりました
なぜでしょうか?
495デフォルトの名無しさん:2010/08/19(木) 07:12:17
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);
にしたらコンパイルが通ったのですが何故ですか?
498デフォルトの名無しさん:2010/08/19(木) 07:49:49
エラーメッセージすら書かないとかマジパネェっすよ
499デフォルトの名無しさん:2010/08/19(木) 08:02:26
マルチだろ。しかし手が込んだマルチだな。
http://hibari.2ch.net/test/read.cgi/tech/1274949734/912
500デフォルトの名無しさん:2010/08/19(木) 09:54:30
まるでストーカーだね
501デフォルトの名無しさん:2010/08/19(木) 10:00:54
両スレ見てて類似性に気付かなかったら、病的な鈍感。
502デフォルトの名無しさん:2010/08/19(木) 12:56:28
巧妙な罠を仕掛けていたのか
危なかったぜ
503デフォルトの名無しさん:2010/08/19(木) 22:18:21
基底派生ともにデストラクタがなにもしない場合はデストラクタを仮想にしないでも基底クラスのポインタに派生クラスのオブジェクトをnewしたりdeleteしてもいい?
コンパイラーは警告すらださないしメモリもリークしてないみたいなんだけどどうかな
504デフォルトの名無しさん:2010/08/19(木) 22:37:53
駄目
505デフォルトの名無しさん:2010/08/20(金) 00:00:23
良いけど、特例は作るべきじゃないから駄目
506デフォルトの名無しさん:2010/08/20(金) 08:07:24
いいよ。結局同じなんだし
507デフォルトの名無しさん:2010/08/20(金) 15:44:50
いいよ
できることは何でもしていい
50836:2010/08/20(金) 16:05:21
何もしないデストラクタ、もしくはデストラクタ書かない、
とかでも暗黙的にメンバのデストラクタ呼ぶわけだから、
それのために仮想デストラクタにしといた方がいいのかも?

それとも不要なのか?
よくわからん
509デフォルトの名無しさん:2010/08/20(金) 16:07:58
>>499
質問の内容が変わってるから、これはマルチじゃないよ。
510デフォルトの名無しさん:2010/08/20(金) 16:20:23
基底クラスのポインタに派生クラスを入れて
仮想じゃないメンバを呼び出すことは規格的には未定義じゃなかったか?
どれが呼ばれるか分からないとかじゃなくて
511デフォルトの名無しさん:2010/08/20(金) 17:46:37
デストラクタは仮想関数にしておくべきでしょうか?
512デフォルトの名無しさん:2010/08/20(金) 17:58:20
>>511
よく分からないならそうしておけ
派生するが仮想関数にしなくていいようなケースだってあるけど、理由とか知らなきゃやれないし
513デフォルトの名無しさん:2010/08/20(金) 23:27:33
>>511
継承しないクラスなら仮想関数にする必要はない
514デフォルトの名無しさん:2010/08/20(金) 23:28:46
デストラクタが明示的には何もしなくても派生クラスが非PODだと死ぬね
515デフォルトの名無しさん:2010/08/21(土) 00:16:38
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 のデストラクタが呼ばれる。

派生クラスで、デストラクタを持つ型をメンバとして持つ場合でも、仮想デストラクタにしといたほうが良いようだ。
516デフォルトの名無しさん:2010/08/21(土) 00:45:25
~HOGE()はHOGEHOGE::fooのことなんか知らないから当然だよね
517デフォルトの名無しさん:2010/08/21(土) 12:28:02
逆にデストラクタを仮想にしない理由て何?
書くのが面倒以外で。
518デフォルトの名無しさん:2010/08/21(土) 12:58:10
この場合
delete hoge;
というのは
hoge->~HOGEHOGE();
ではなく
hoge->~HOGE();
が実行されているのと等価ですか?
519デフォルトの名無しさん:2010/08/21(土) 13:08:52
>>517
vtableに使うメモリを節約したいとか?
520デフォルトの名無しさん:2010/08/21(土) 15:03:15
>>517
デストラクタを常にvirtualにするのは、馬鹿の一つ覚え。
521デフォルトの名無しさん:2010/08/21(土) 15:36:31
仮想関数はバイナリの互換性がなくなるから
522デフォルトの名無しさん:2010/08/21(土) 15:45:35
>>521
もしかして構造体をfwrite()とかfread()とかでそのまま読み書きしようって話?
Cでもそんなのやめてほしい。
523デフォルトの名無しさん:2010/08/21(土) 15:57:19
DLLとかで互換性なくなるでしょ
524デフォルトの名無しさん:2010/08/21(土) 21:00:26
え?遅いからじゃないの?
525デフォルトの名無しさん:2010/08/21(土) 21:12:39
テキストファイルのデータを動的に読み込んで、
const な変数にしたい場合、
const int A = 0;
*const_cast<int*>(&A) = 30;//テキストから動的に読み込んだデータ

とか、
クラスメンバーconst変数に初期化子として代入
とかがふと思いつきますが、
他に良い方法ありますか?
526デフォルトの名無しさん:2010/08/21(土) 21:24:04
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();

527デフォルトの名無しさん:2010/08/21(土) 21:42:55
>>526
明後日の回答じゃね?
>>525
const変数の初期化は一度しかできないから生成時にできなければ、constじゃない
変数へのポインタか参照を使うしかない。つまり超大雑把に言って他にはないんじゃね。
528デフォルトの名無しさん:2010/08/21(土) 21:44:25
const_castを使ったら負け
529デフォルトの名無しさん:2010/08/21(土) 21:44:53
類推できると思うけど、ポインタか参照は例えばこんな感じ。
int A = 0;
const int& refA = A;
A = 30;
// 以降Aは使用せずrefAだけ使用する
530デフォルトの名無しさん:2010/08/21(土) 22:07:42
うーむそうですか・・・
ありがとうございます
531デフォルトの名無しさん:2010/08/22(日) 11:26:26
>>525
他にとか言う以前にその方法は最悪だ
const_castしての書き込みが許されるのはそこが本当に書き込み可能だった場合のみ
const int Aに書き込みしちゃ駄目よ
532デフォルトの名無しさん:2010/08/22(日) 11:40:27
え?そんな常識知ってて書いてるんだろ?
533デフォルトの名無しさん:2010/08/22(日) 12:20:26
一回だけ書き込み可能な整数ラッパークラスを作ればいいよC++ってそういうものでしょ
534デフォルトの名無しさん:2010/08/23(月) 16:13:52
オブジェクトの名前の一部に変数を使いたいんですがどうやればいいですか?

たとえばこのプログラムの場合で、test0〜test4を作るためにはどうすればいいですか?
多分○○のところを何か埋めれば書けるんじゃないかと思うんですが、検討がつきません。

class testclass {};

int main()
{int A =0;
While(A<5){
testclass test○○();
A++;
}
}
535デフォルトの名無しさん:2010/08/23(月) 16:22:55
>>534
そんなときはマクロ
536デフォルトの名無しさん:2010/08/23(月) 16:36:26
といってみたものの
変数に入れた値を使ってというならやっぱ無理だけどね
5がコンパイル時に確定してるなら可能だ
test0 〜test4までの宣言を創りだすことが可能だ

でも、変数に入れた値を使って作りたいってどんな状況なのさ・・・・・・・
ありえないと思うんだが


537デフォルトの名無しさん:2010/08/23(月) 16:41:26
少なくとも、それを実現するために費やす労力では絶対に元を取れないだろうな
538534:2010/08/23(月) 16:59:20
クラスに各パラメータをブチ込んで、ゲームのキャラ(自由追加可能で定数の固定キャラが出るわけではない)を作ろうとしてたんですが、listとポインタで事足りそう…。
つまらない質問すいませんでした。
539デフォルトの名無しさん:2010/08/23(月) 17:02:35
そんなときは hash
540デフォルトの名無しさん:2010/08/23(月) 17:08:01
メンバ関数ポインタっていうのを使うとできそう
541デフォルトの名無しさん:2010/08/23(月) 17:16:56
>>538
答えてる時からそういう結論になるだろうなと思ってたから気にすんな
542525:2010/08/23(月) 17:56:26
531-533
やっぱりそうなりますよね・・・
>一回だけ書き込み可能な整数ラッパークラス
このあたりでいきます
ありがとうございました
543デフォルトの名無しさん:2010/08/23(月) 23:17:13
C++のファイル操作操作よりもFILE構造体を使った方が、
楽な気がするのは気のせいですか?
544デフォルトの名無しさん:2010/08/23(月) 23:40:35
>>543
C++に標準ではファイル操作なんてありませんが。
# あるのはストリーム操作。FILEを使ってもストリーム操作。
545デフォルトの名無しさん:2010/08/23(月) 23:54:08
キモすぎ
546デフォルトの名無しさん:2010/08/23(月) 23:55:46
>>543
クラスの入出力をしないなら確かにFILE使った方が速いし楽

でも自分で入出力をカスタマイズしようとするとすぐ<<と>>のオーバーロードが欲しくなる
547デフォルトの名無しさん:2010/08/24(火) 01:57:47
>>543
気のせいじゃね?
548デフォルトの名無しさん:2010/08/24(火) 07:05:07
sprintfは便利だったのに
なにがうれしくて<<なnnda
549デフォルトの名無しさん:2010/08/24(火) 07:47:58
>>548
stream系の便利なところは、オーバーロードできることだね。
Cでも構造体は作れるけど、それ専用の出力関数を作るのならoperator<<()を作る方が再利用しやすい。
550デフォルトの名無しさん:2010/08/24(火) 11:22:21
カーネルを作りたいと思っています。
linux0.01のブートの部分はなんとなく理解出来たのですが
ハードディスクなどのハードウェアの部分になると何をしているのかよくわかりません。
もしおすすめの書籍などあれば教えて下さい。よろしくお願いします。
551デフォルトの名無しさん:2010/08/24(火) 11:51:05
>>550
そういう情報はネットに溢れてるし、ほとんど書籍化されてないよ

英文を読めないのが問題なんだよ、書籍買うのなら英語の学習本だね
552デフォルトの名無しさん:2010/08/24(火) 12:24:17
>>550
minix はどうだろうか?
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を入れれば良いでしょうか?
556デフォルトの名無しさん:2010/08/24(火) 15:54:35
>>555
コマンドプロンプトを先に開いてから
557デフォルトの名無しさん:2010/08/24(火) 15:55:46
           \
            \
          ∧ニユ/ ̄ヽ
\        ( ´∀/)    i
\.\    _(」つ/とl) .  | \
;::;::\i\  匚レ| .〈/ )    |  \
 。::;;:'\.\   (_,)ー'    |_,, -'''"!
^人;:'::;゚:;.\l\     _,,, -''"|_,, -''"|
 ^^从::;;:。':\.\_,, -''"|_,, -''"|   . :|
 へ ^へ;;::';;:'\l_,, -''" .   | 从^    〜
 ^ ^ヘ^人从::;;;:|    ,ィ人^. |  ^ ^へ^^
  〜 ^.へ' ^':レ^从 へ'  | 〜   ^
 へ ^^ へ 〜人^ ^  へ〜  〜
558デフォルトの名無しさん:2010/08/24(火) 15:57:39
もし、よろしければ手順を教えていただきたいです。
(a.cppを実行すると仮定してお願いします。)
559デフォルトの名無しさん:2010/08/24(火) 16:00:02
そんな餌に俺が釣られクマー
560デフォルトの名無しさん:2010/08/24(火) 16:16:47
>>558
コマンドプロンプトを開いて、そのフォルダに移動し、a.cppを実行する。
それでウィンドウが開くから。まずはそこまでやってくれ。
561デフォルトの名無しさん:2010/08/24(火) 16:48:23
くまった
562デフォルトの名無しさん:2010/08/24(火) 17:02:03
>>551
英単語はえっちなのしか知りません><
英語勉強します・・

>>552
MINIXが一番いいみたいですね。
本もありますし、そうしようと思います。

ありがとうございました。
563デフォルトの名無しさん:2010/08/24(火) 17:07:36
for文使ってAまたはBまたはCが条件に達したらループ終了するにはどうしたらいいですか
3重カッコでやると全部が条件に達したときに終わってしまいますが一つだけ達してくれればよいのですが
564デフォルトの名無しさん:2010/08/24(火) 17:11:26
>>563
for (;A || B || C;) {

}
565デフォルトの名無しさん:2010/08/24(火) 17:15:59
ありがとうございます
566デフォルトの名無しさん:2010/08/24(火) 21:55:24
しかしそれは while の仕事ではないか?
567デフォルトの名無しさん:2010/08/24(火) 23:01:53
>>566
for文使って という顧客の要件定義がある以上仕方ない
568デフォルトの名無しさん:2010/08/25(水) 22:01:36
C/C++ってjava/vbなんかよりも、面白くていいね
実効速度も速いし
569デフォルトの名無しさん:2010/08/25(水) 23:24:38
まあね
570デフォルトの名無しさん:2010/08/25(水) 23:25:36
Cから引きずったヘッダがどうもいやでしょうがない。
これさえなければな・・・。
571デフォルトの名無しさん:2010/08/26(木) 01:33:16
質問でもなんでもない件について
572デフォルトの名無しさん:2010/08/26(木) 01:39:45
ヘッダって無理に書くものでもないじゃん
573デフォルトの名無しさん:2010/08/27(金) 02:20:33
ヘッダにロジック書く奴は死刑な
574デフォルトの名無しさん:2010/08/27(金) 08:45:53
C++でソースにロジック書いたらパフォーマンス落ちそうでイヤ
575デフォルトの名無しさん:2010/08/27(金) 09:09:54
落ちるわけねーだろ
お前バカだろ
576デフォルトの名無しさん:2010/08/27(金) 09:35:33
>>574
さすがにそれはねーよw
577デフォルトの名無しさん:2010/08/27(金) 11:24:38
俺はコンストラ・デストラ・コピコンはヘッダーに内容を書いてるよ
578デフォルトの名無しさん:2010/08/27(金) 11:30:02
俺オペイコも
579デフォルトの名無しさん:2010/08/27(金) 12:05:28
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
|  ここはお前の日記帳じゃねえんだ   |        / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
\_______  _______/        |   チラシの裏にでも書いてろ
            ∨                      \_________  ____
    /::::::::::<      \ィ,:::::::::::::;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  ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
580デフォルトの名無しさん:2010/08/27(金) 19:09:41
#!/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
581デフォルトの名無しさん:2010/08/27(金) 19:13:23
こういうケースだとうちではヘッダの方がちと速い
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
582デフォルトの名無しさん:2010/08/27(金) 23:32:16
gccの最適化オプションって、本当に吐き出されるバイナリが違うんだ
583デフォルトの名無しさん:2010/08/27(金) 23:53:42
むしろ違わない処理系を知りたい
584デフォルトの名無しさん:2010/08/28(土) 00:40:20
>>583
std::cout << "test" << std::endl;
くらいしか処理を書いていないのに、結構違うんだなーと思ったものでね
585デフォルトの名無しさん:2010/08/28(土) 00:48:39
最近のGCCはLTO可能になったんだっけ?
586デフォルトの名無しさん:2010/08/28(土) 05:43:47
>>581
関数呼び出しのオーバヘッドかな。
iccやgccの4みたいにオブジェクト間最適化ができたら差がなくなりそうだ。
587デフォルトの名無しさん:2010/08/28(土) 07:13:16
手元のVC10では同じになった
まあLTO可能なコンパイラなら当然か
588581:2010/08/28(土) 11:31:38
gccのバージョンは4.4.3。4.5になるまで-fltoは認識しないみたい。
でもリンク時最適化ってコンパイル時と同じ最適化ができるのか?
589デフォルトの名無しさん:2010/08/28(土) 19:48:22
「処理系によります」
590581:2010/08/28(土) 19:51:45
>>589
そう、では同じ最適化ができる処理系って何?知ってる限り教えて
591デフォルトの名無しさん:2010/08/28(土) 19:58:18
ヒマ人乙
592デフォルトの名無しさん:2010/08/28(土) 20:43:49
>>588
できないね。まあ仕方ないな。
593デフォルトの名無しさん:2010/08/29(日) 21:59:27
インクルードガードの勉強をしています
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
などという記述はちゃんとコメントアウトしてあります
594デフォルトの名無しさん:2010/08/29(日) 22:05:03
コンパイルエラーになる記述がなければコンパイルエラーにならない
595デフォルトの名無しさん:2010/08/29(日) 22:07:14
てか、別々のソースにインクルードしてるならエラーの出ようがないじゃん
ヘッダーでグローバル変数を定義してるとかアホなことをしてない限り
596デフォルトの名無しさん:2010/08/29(日) 22:13:57
インクルードガードは普通同じファイルを二度インクルードした際に宣言の重複を
させないためのもの。ヘッダからヘッダをインクルードしていると、これはよく
発生する。

[header1.h]
#include "header.1"
...

[header2.h]
...

[source.c]
#include "header1.h"
#include "header2.h"

↑こうするとheader2.hは二回インクルードされる
597デフォルトの名無しさん:2010/08/29(日) 22:15:44
訂正
[header1.h]
#include "header2.h"
...

[header2.h]
...

[source.c]
#include "header1.h"
#include "header2.h"
598593:2010/08/29(日) 22:24:32
>>596
わかりました、ありがとうございます
599デフォルトの名無しさん:2010/08/30(月) 22:52:47
FILE構造体を使ったIOはデフォルトでバッファリングされているのですか?
600デフォルトの名無しさん:2010/08/30(月) 23:49:35
未規定
601デフォルトの名無しさん:2010/08/31(火) 20:02:23
すみません。VC++2008 ExpressEditionを使っている者なのですが、
「pragmaはコンパイラ・OSやらによって動作が違うから使うな」
みたいな注意書きを見て恐くて、
不要な警告を消したり等色々便利そうなのですが、ずっと使わずにいます。

Windows以外(主にUNIX・Linuxなど)でプログラムを動かす場合、
pragmaを使っていても平気なものなのでしょうか。 やめておいた方が良いのでしょうか?
602デフォルトの名無しさん:2010/08/31(火) 20:07:24
他のOSとかに移植するつもりなら使わない方がいい
VCで警告を消すぐらいならプロジェクトのプロパティで設定できるでしょ
603デフォルトの名無しさん:2010/08/31(火) 20:12:54
「pragmaはコンパイラ・OSやらによって動作が違う」

を理解してれば使っていいよ
604601:2010/08/31(火) 20:22:20
>>602-603
移植するならヘッダの2度読み防止とかもifndefでやるべきなのですね。
警告の消し方も調べてみようと思います。ありがとうございました〜
605デフォルトの名無しさん:2010/09/01(水) 00:42:47
>>604
事実上*NIXのコンパイラなんてgccだけなんだから、
gccでも使える#pragma onceなんかはあまり気にせず書くという考え方もある。
606デフォルトの名無しさん:2010/09/01(水) 00:50:37
gccしか無いプラットホームは別にして、普通はちゃんとしたコンパイラ使うだろう
607デフォルトの名無しさん:2010/09/01(水) 01:06:10
gccはちゃんとしてるだろ
608デフォルトの名無しさん:2010/09/01(水) 01:12:22
俺はllvmがC++完全対応したらgcc捨てる
609デフォルトの名無しさん:2010/09/01(水) 15:03:33
久々にC++でプログラムを書いております。
ファイルが増えてきたためmakeを利用しようとおもっております。

ファイルが増加するたびにmakeファイルの定義をついかしても良いのですが、
定義を追加せずに指定フォルダ以下の更新したファイルのみコンパイルする記述がないでしょうか?

昔どこかで上記のような動作を行えるコマンドかなにかがあるとの事を、
どこかで見たのですが失念してしまいました。

昔は指定フォルダ以下のファイル群に対し、makeファイルを作成する
プログラムを作っていたのですがすでに遺失してしまいました。
610デフォルトの名無しさん:2010/09/01(水) 15:05:10
autoconf automake
611デフォルトの名無しさん:2010/09/01(水) 16:19:22
makedepend ?
612デフォルトの名無しさん:2010/09/01(水) 19:31:59
すみません。
[Main] [クラスA] [クラスB] の3つのヘッダとソースファイルが有ります。
今は[Main]でクラスAのインスタンスを作り、
 クラスAで利用する[クラスB]のインスタンスを、クラスAのソースのグローバルスコープで、static付で作っています。

今までクラスAは1つのインスタンスなので、これで問題無かったのですが
クラスAのインスタンスを複数(配列)にする事になりました。
このままだとクラスBはどのクラスAのインスタンスから呼んでも同じものになりますよね?

クラスBのインスタンスを常に別々に別けたい場合と、
クラスBのインスタンスを常に1つ(同じ)にしたい場合、どこでインスタンスを作るのが良い行い方なのでしょうか?
613デフォルトの名無しさん:2010/09/01(水) 19:37:27
>>612
staticでインスタンス持ったりするのやめれ。不自由っしょ?

>  クラスAで利用する[クラスB]のインスタンスを

フツーにAのメンバ変数で持てば十分では?
614デフォルトの名無しさん:2010/09/01(水) 19:49:21
singletonパターン
615デフォルトの名無しさん:2010/09/02(木) 00:32:49
下のプログラムなんだけど縦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); /* 描画位置移動 */
}
616デフォルトの名無しさん:2010/09/02(木) 06:34:53
FILE構造体を使って、100MBのファイルを1MBのファイル100個に分割したいのですが
バッファを1MBにしてfreadするのは効率が悪いでしょうか?
617デフォルトの名無しさん:2010/09/02(木) 06:42:39
1MBだと足りないね
618616:2010/09/02(木) 06:44:40
>>617
char buf[4096]とかってをよく見ますが、これじゃ小さいですか..
ちなみに、file構造体って1バイトずつのアクセスでいいんですよね(確認だけど)
619デフォルトの名無しさん:2010/09/02(木) 07:09:02
splitコマンドのソースを見たら、buf[MAXBSIZE]と宣言してあって、
MAXBSIZEは65536だった。
620デフォルトの名無しさん:2010/09/02(木) 07:25:56
つーか、敢えて車輪の再生産をすることもなかろうに。
621デフォルトの名無しさん:2010/09/02(木) 08:41:16
>>618
FILE構造体はバッファを4096とかにしてても
1バイトづつアクセスするとめちゃくちゃ遅くなる
>>616 ならバッファ1MBにしておいて1MB読んで書けばいいよ
622デフォルトの名無しさん:2010/09/02(木) 11:10:30
二言目には車輪の再発明っていうやつは文型のアホであることが多い
623デフォルトの名無しさん:2010/09/02(木) 11:16:59
誰も言ってねぇよ
624デフォルトの名無しさん:2010/09/02(木) 11:20:49
車輪の再発明って良く聞くけどどういう意味なんだろ
625デフォルトの名無しさん:2010/09/02(木) 11:22:14
車輪の再生産は鳩山一族にやらせて桶
626デフォルトの名無しさん:2010/09/02(木) 12:16:41
>>610-611
レス、ありがとう。
makedepenedでかいけつできました。

ありがとうございました。
627612:2010/09/02(木) 14:26:05
>>614 singletonとはこの事なんですね。
>>613 そうしてみますね。ありがとうございます。
628デフォルトの名無しさん:2010/09/02(木) 14:27:25
Singletonじゃねーよこのパターンはただのstatic変数にしろ
629デフォルトの名無しさん:2010/09/02(木) 14:31:42
>>621
100MB一度に読んで、1MBづつ書くほうが効率的だよ。
630デフォルトの名無しさん:2010/09/03(金) 00:32:09
質問です。
UIをC++でフルスクラッチで作ろうと思っています。
ゲームのUIのようなものを考えています。

参考になるようなサイト、スレ、書籍等を教えていただけたらと思います。
検索してもミドルウェアとかライブラリばかりがひっかかって
純粋にUIを作るというとこに辿りつけませんでした。

よろしくお願いします。
631デフォルトの名無しさん:2010/09/03(金) 00:40:40
フルスクラッチの意味にあってるかどうかわからんがWinなら
「デバイスコンテキスト」でググレば幸せになれるかも
632デフォルトの名無しさん:2010/09/03(金) 00:48:47
レスありがとうございます。

一応DCとってピクセルを描画等はひととおり経験済みです。
それで、それらを使ってUIを作るとしたとき
どういった手順が定石というか定番の手法なのかというか
その辺りを知りたいのです。

多分すごい初歩的?な質問かもしれませんが
よろしくお願いします。
633デフォルトの名無しさん:2010/09/03(金) 01:36:44
>>630そのなもフルスクラッチで作るUIだかなんだかっていう本があったぞ。
634デフォルトの名無しさん:2010/09/03(金) 01:42:05
ゲームのUIならDirectXやOpenGLで作らないと、
DC描画じゃゲームには向いていないんじゃないか?
635デフォルトの名無しさん:2010/09/03(金) 01:48:29
それはない
636デフォルトの名無しさん:2010/09/03(金) 02:03:44
>>633
もう少しヒントを!
ググル先生も絞り込めないみたいです。

>>634
メインはとりあえずOpenGLで作っています。
UI設計の基本的な考え方、ということで
環境依存の質問ではなさそうなので
環境を記述しませんでしたが
DirectXやOpenGLじゃないといけないor不利な
状況というものがあるのでしょうか?

637デフォルトの名無しさん:2010/09/03(金) 04:29:31
>>636
あったよ、名前ちがってたわ。

組み込みGUI(ウィンドウ・システム)環境の設計と実装 [単行本(ソフトカバー)]
638デフォルトの名無しさん:2010/09/03(金) 06:05:36
GDIは遅い
特にVista以降は遅い

もっとも、テーブルゲームくらいならGDIでもいいんだろうけど
639デフォルトの名無しさん:2010/09/03(金) 13:05:18
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のみを使ってユニコードでの初期値代入する方法は無いのでしょうか?
640デフォルトの名無しさん:2010/09/03(金) 13:16:02
STLのstackとかdequeとか_で始まってないやつは正式に標準テンプレートライブラリの一部なんですか?
641デフォルトの名無しさん:2010/09/03(金) 13:27:20
stackとdequeは標準だが
strcpy_sは標準ではないのでその判断基準はだめだな
642デフォルトの名無しさん:2010/09/03(金) 14:17:35
>>639
TCHARまわりの知識に不安を感じるからTCHARや_UNICODEでよく調べてみろ。
VC使ってると仮定するけど、とりあえずはVCのプロジェクトのプロパティ→全般のあたりに
UNICODE関連の設定がないか調べてみろ。
643デフォルトの名無しさん:2010/09/03(金) 14:33:10
>>642
設定はユニコードを使用するになっています。
また#define _UNICODEを書くと再定義しているという警告が出ます。
しかし具体的に書くと
c++のソースで定数として定義した「お」→0x304a
c#から持ってきたデータの「お」→0xa882
と別データになっています。

いろんなサイトを見てL"お"なども試しましたが、やっぱり0x304aになります。
http://pentan.info/php/reg/is_hira.html
このサイトを見て、C#側はユニコード、C++はS-JISと判断しました。
644デフォルトの名無しさん:2010/09/03(金) 14:45:17
ちなみに最短だと
tchar moji[100] = _T("お");
MultiByteToWideChar(CP_ACP,0,(char*)moji,-1,NULL,NULL);
という強引なキャストでいけるかなと試したのですが、なぜかこの場合変換されません。

最初の変数の型をcharにしないと、最初に入れられる値が変わってきて変換対象とされないのかなと思ったりしてます。
645デフォルトの名無しさん:2010/09/03(金) 14:49:40
ユニコードを使用しない設定にすると最初のTCHARがcharと判定されて、
定数の変換自体は上手くいくかもしれませんが、
行う予定の数々の文字列処理はユニコードなのでそのあたりで問題がでそうな気がします。
646デフォルトの名無しさん:2010/09/03(金) 14:51:11
配置newで使われてる領域か使われてない領域か判断する方法って
vectorみたいにこっからここまでっていう目印をつける
オブジェクト1つに対してフラグになるものも余分にひとつどこかに用意する
ほかになんかいい方法ありますか?
647デフォルトの名無しさん:2010/09/03(金) 15:06:09
>>646
マルチ乙
648デフォルトの名無しさん:2010/09/03(金) 15:06:56
>>643
落ち着いて自分の書き込みとそのサイトをもう一度よく見比べてみるんだ
649デフォルトの名無しさん:2010/09/03(金) 15:12:55
>>648
あれれー?
ちきしょう、サイト管理者めいつの間に内容を変えたw。
650デフォルトの名無しさん:2010/09/03(金) 15:14:59
www
651デフォルトの名無しさん:2010/09/03(金) 16:03:26
>>647
どうやら荒しのアホにコピペされたようです
マルチではありません
652デフォルトの名無しさん:2010/09/03(金) 23:45:11
>>637
ありがとうございます!
さっそくポチってきます。

こういうのは「組み込み系」になるんですね。
勉強になりました!
653デフォルトの名無しさん:2010/09/04(土) 03:01:37
配列のある要素のポインタから、インデックスを知りたいのですが
なにか方法はあるでしょうか?
654デフォルトの名無しさん:2010/09/04(土) 03:19:23
↑インデックス値でした。
目的のポインタから配列の先頭ポインタを引いたらできました
655デフォルトの名無しさん:2010/09/04(土) 07:14:06
要素のサイズで割る必要がある
charなら1だから引くだけでいいけど
656デフォルトの名無しさん:2010/09/04(土) 11:05:43
http://codepad.org/s9Umi2Nh
嘘教えるなよ
657デフォルトの名無しさん:2010/09/04(土) 14:44:28
イテレーター作るときってiterator_tagとかもつけたほうがいいの?
658デフォルトの名無しさん:2010/09/05(日) 01:13:45
>>656
あくまで同じ配列のポインタ同士の減算だから個数が得られているだけだから、
嘘は言いすぎだろ、メモリ配置的に考えて

その例ならunsignedで引き算するなら割る必要があるんだし
((unsigned)&bar[5] - (unsigned)&bar[0]) / sizeof(T)

冗長だから&bar[5] - &bar[0]の方が良いという意見は納得できるが
659658:2010/09/05(日) 01:33:51
ちょっと変な書き方か
同じ配列のポインタ同士の減算では割る必要がないが、
ポインタの数値の減算は割る必要がある
というので「嘘教えんな」だとほんの少し違和感があっただけだ
蛇足かもしれんが
660デフォルトの名無しさん:2010/09/05(日) 01:37:59
sizeof(char)が絶対1なのはC++もそうなんだっけ? 忘れちゃったよ
661デフォルトの名無しさん:2010/09/05(日) 02:02:17
もうこのネタじゃ盛り上がらんな
662デフォルトの名無しさん:2010/09/05(日) 05:08:30
>>658
ちょっと言い訳としては苦しいな
663デフォルトの名無しさん:2010/09/05(日) 05:15:29
>>658
ポインタとアドレスの区別ついてないだろw
664デフォルトの名無しさん:2010/09/05(日) 07:57:11
>>660
規格で保証されてたはず。
665デフォルトの名無しさん:2010/09/05(日) 09:59:44
>>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. ]
666デフォルトの名無しさん:2010/09/05(日) 13:48:30
>>663
どのあたりが理解不足かはっきり説明してくれ
667デフォルトの名無しさん:2010/09/05(日) 13:51:07
>>653
に対しての>>655だぞ?
もう>>658とか言い訳してないで間違いを認めろよwwwwww
668デフォルトの名無しさん:2010/09/05(日) 14:08:48
言い訳というかそもそも俺は655じゃないんだが^^;
669デフォルトの名無しさん:2010/09/05(日) 14:09:47
とうとう他人のふりかよ・・・・・・・
670デフォルトの名無しさん:2010/09/05(日) 14:11:27
もう信じないなら別にいいわ、勝手にそう思っててくれ
ここは質問スレだしな
671デフォルトの名無しさん:2010/09/05(日) 14:11:52
はいはい
672デフォルトの名無しさん:2010/09/05(日) 14:16:14
ポインタには型があるから、要素のサイズで割るなんて寝言は出てこない
673デフォルトの名無しさん:2010/09/05(日) 14:16:30
よかったね〜^^勝手に勘違いして優越感に浸れて
674デフォルトの名無しさん:2010/09/05(日) 14:18:14
勘違いしてるのはどうみても>>655だろw
675デフォルトの名無しさん:2010/09/05(日) 14:21:36
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になるなんてポインタの初期の初期に覚えることじゃ
なぜサイズで割らないといけないとか発想がでるのかわからない
676デフォルトの名無しさん:2010/09/05(日) 14:23:02
>>658
unsigend って unsigned charの略じゃないって知ってるか?w
677デフォルトの名無しさん:2010/09/05(日) 14:26:03
>>676
unsigned intの意味だが別にそこ問題じゃなくないか?
678デフォルトの名無しさん:2010/09/05(日) 14:26:28
>>675
printf ( "%d\n", *(a+1) ) ;
printf ( "%d\n", *(b+1) ) ;
printf ( "%d\n", *(c+1) ) ;
では?
679デフォルトの名無しさん:2010/09/05(日) 14:28:36
馬鹿ばっかだなほんとwwww
680デフォルトの名無しさん:2010/09/05(日) 14:29:55
>>678
やってみれば分かるが結果は一緒だ
681デフォルトの名無しさん:2010/09/05(日) 14:32:47
>>680
結果が一緒だろうが過程が・・・・・
そんな紛らわしい配列の中身にすんなよwwwwww
682デフォルトの名無しさん:2010/09/05(日) 14:39:43
>>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が出力される
683デフォルトの名無しさん:2010/09/05(日) 18:36:37
で、なに?
684デフォルトの名無しさん:2010/09/05(日) 18:40:15
>>683
>>675が間違ってるってことだろ。
それ以外になんかある?
685デフォルトの名無しさん:2010/09/05(日) 18:43:25
>>675
これは[0]の0に+1したのを出力する事を想定してるのか
それとも[1]の1を出力する事を想定してるのか
どっち?
686デフォルトの名無しさん:2010/09/05(日) 18:44:45
>>685
流れからして明らかだろ
いまさらなにいってんだよ
687デフォルトの名無しさん:2010/09/05(日) 18:46:17
単項式が優先されるんだから、当然前者だろ。
688デフォルトの名無しさん:2010/09/05(日) 18:49:25
>>675が実際どっちで動いてるかの話じゃないと思うんだが
689デフォルトの名無しさん:2010/09/05(日) 18:52:56
qmakeとcmakeでは何が違うのかわかりません
基本的にはmakeファイルを作るものだと、考えているのですが
690デフォルトの名無しさん:2010/09/05(日) 19:28:24
omakeです
691デフォルトの名無しさん:2010/09/05(日) 20:48:30
ore no makeです
692デフォルトの名無しさん:2010/09/05(日) 21:17:24
>>691
当を得ている
693デフォルトの名無しさん:2010/09/06(月) 18:03:56
すみません。
int型に入れた 00001 という数字(当然ただの1になりますが)を、
処理後にchar配列型に入れて 00001 に戻す場合、どうすれば手短に実現できるでしょうか?
今はstrlenで長さを取り、足りない回数forを回して継ぎ接ぎしているのですが。。
694デフォルトの名無しさん:2010/09/06(月) 18:09:27
>>693
四行目の説明からして文字列にしたやつを戻したいってことだよなぁ?
sscanfなりatoiなりstrtolなり好きなの使えばいいじゃん
695デフォルトの名無しさん:2010/09/06(月) 18:56:25
boost::lexical_cast
696デフォルトの名無しさん:2010/09/06(月) 21:48:53
>>693
printf("%05d",n):
じゃないのん?
697デフォルトの名無しさん:2010/09/06(月) 22:03:04
やりたい処理が見えてこないのでなんともいえない
最初に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
パディング...
700デフォルトの名無しさん:2010/09/06(月) 22:56:46
>>698
このソースの場合、俺は
char buf[100];
とする派。
701デフォルトの名無しさん:2010/09/06(月) 23:13:03
そうだなあ。理由があれば別だけど、適当に大きなサイズにするかな
無意味にチャレンジすることないし
702デフォルトの名無しさん:2010/09/06(月) 23:17:42
a = -1;
a %= 10;
ってやったらaの値は-1なんだけど、これってどのコンパイラでも保障されてる?
703デフォルトの名無しさん:2010/09/06(月) 23:26:39
>>702
CならC99より前ではされてない、しかも本当にコンパイラによって違う
C99で決められた

C++は知らね
704デフォルトの名無しさん:2010/09/06(月) 23:30:13
C++0xからだよ
705デフォルトの名無しさん:2010/09/06(月) 23:36:58
thx 素直に-1と0以上で場合わけするか…
706デフォルトの名無しさん:2010/09/06(月) 23:50:26
>>704
ごめんよ
707デフォルトの名無しさん:2010/09/07(火) 00:36:27
>>694-701
%05dというのが有るんですね。処理を減らす事ができました。ありがとうございました。
708デフォルトの名無しさん:2010/09/07(火) 00:37:05
なぁに、礼はいらねぇよ
709デフォルトの名無しさん:2010/09/07(火) 08:02:27
Cコード中の数値リテラルで頭に0付いてると8進扱いだっけ?
710デフォルトの名無しさん:2010/09/07(火) 09:25:41
>>709
そうです。だからCでは10進整定数の0は存在しません。
711デフォルトの名無しさん:2010/09/07(火) 09:46:12
>>710
残念
8進数定数の0が存在しないのでした
712デフォルトの名無しさん:2010/09/07(火) 09:53:08
0は0が先行するから8進定数ってことだろ。
713デフォルトの名無しさん:2010/09/07(火) 09:55:06
>>712
だからそれが間違ってるってこと
714デフォルトの名無しさん:2010/09/07(火) 09:58:11
というか決まってるの0をどっちにするか?w
715デフォルトの名無しさん:2010/09/07(火) 10:06:35
事実上どっちでも同じだろ。規格がどうなっているかは規格スレでやってくれ。
716デフォルトの名無しさん:2010/09/07(火) 10:12:06
馬鹿に限って仕切りたがるw
717デフォルトの名無しさん:2010/09/07(火) 22:12:09
gccのa.outはオブジェクトファイルですか?それとも実行ファイルですか?
718デフォルトの名無しさん:2010/09/07(火) 23:10:19
>>717
実行ファイル
719デフォルトの名無しさん:2010/09/08(水) 18:37:56
>>713
魔次男?
720717:2010/09/08(水) 21:03:02
>>718
thx
721デフォルトの名無しさん:2010/09/09(木) 09:54:26
質問!
vector<CLASS*> array;
と宣言した配列に、

CLASS obj=CLASS();
array.push_back(&obj);

という感じに要素を追加しようとするとエラーが出るんですが、
単純にポインタ型の動的配列って出来なかったりするんでしょうか?
722デフォルトの名無しさん:2010/09/09(木) 09:55:59
>>721
vectorに突っ込むのはできる
お前が別なとこで間違ってるだけ
723デフォルトの名無しさん:2010/09/09(木) 09:57:21
>>722
私の方のミスでしたか……
いろいろ試してみます!
ありがとうございました!
724デフォルトの名無しさん:2010/09/09(木) 12:03:11
1と01はコンピュータはどちらも1として扱うのでしょうか?
725デフォルトの名無しさん:2010/09/09(木) 13:08:03
状況次第
726デフォルトの名無しさん:2010/09/09(木) 16:54:13
C++のフリーコンパイラを教えてください?
というかみんな何使ってるんですか?
727デフォルトの名無しさん:2010/09/09(木) 16:55:32
Visual C++ 2010
728デフォルトの名無しさん:2010/09/09(木) 16:56:05
非公開の自作コンパイラ
729デフォルトの名無しさん:2010/09/09(木) 19:12:55
他に適切そうなスレがないので、場違いかもしれませんが質問します。

C/C++(Linux上)でプロセスをデーモン化したいのですが、
手順の意味がわかりません。fork()使えばいいのがわかりましたが、
fork()の挙動がわかりません。あと、fork()がとても危険な香りがします。

http://www7a.biglobe.ne.jp/~tsuneoka/daemon/index.html
を参考にしていますが、ソースの内容でfork()の辺りが理解できません・・・。


>>726 GCCというかG++ あとVisual C++ 2010
730デフォルトの名無しさん:2010/09/09(木) 19:24:13
>>729
forkは自プロセスを複製します
忍者みたいに自分が2人に分身するわけです
そうするとforkから戻ってきたときには自分が2人いるわけです
元々の親プロセスと、新しくできた子プロセス
親プロセスの方は、forkの戻り値が子のプロセスID (1以上) になります
子プロセスの方は、forkの戻り値が0になります
(エラーの場合は -1)
ここのサンプルだと、親の方は exit で終了して、子の方はそのまま close 以下略を実行するわけです
731デフォルトの名無しさん:2010/09/09(木) 19:25:01
>>729
質問の意図がよく分からない。
forkが知りたければ"マルチプロセス fork"あたりで検索を。
732デフォルトの名無しさん:2010/09/09(木) 19:37:32
Linuxだけで動けばいいならdaemon(3)があるよ
733729:2010/09/09(木) 20:00:21
>>730
あぁ、自分を複製しているから、こんな奇妙な流れなんですね・・・。
直後のケース文含め、なぜこの流れなのかようやくわかりました。
どうもありがとうです。

ってあれ?
これって自己複製をループさせたら、恐ろしいことになりません?

>>732
deamon(3)ですか、探してみます・・・。
734デフォルトの名無しさん:2010/09/09(木) 20:53:32
もちろんリソースが許す限り幾らでも子作り可能。
735729:2010/09/09(木) 21:37:56
>>732
daemon()使ったら、かなり簡単でした。
おかげで、スタート時に自前のサーバーを起動できます。
ありがとうございました〜〜〜。

>>734
恐ろしいですね・・・・。注意して使います・・・。
736デフォルトの名無しさん:2010/09/09(木) 23:11:36
>>726
g++(gcc) と bcc32 も併用しています。bcc32 はメッセージが日本語なのでわりと便利です。
737デフォルトの名無しさん:2010/09/09(木) 23:14:44
>>733
fork() をループに含ませてチャイルドプロセスを量産できます。パイプ機能のあるシェルをつくってみるのもいいでしょうね。
http://codepad.org/3H6b7xM6
738デフォルトの名無しさん:2010/09/11(土) 17:48:32
gccだったと思うのですが
スタック領域に動的確保できる関数があったと思うのですが何という名前だったでしょうか
使うわけではないのですが、思い出せなくて気になります
739デフォルトの名無しさん:2010/09/11(土) 17:57:58
calloc
740デフォルトの名無しさん:2010/09/11(土) 17:59:06
741デフォルトの名無しさん:2010/09/11(土) 18:03:38
非標準だから自分でスタック領域のアロケーターを作りなさい
742デフォルトの名無しさん:2010/09/11(土) 18:06:26
C99にその機能があるよ
743デフォルトの名無しさん:2010/09/11(土) 18:08:08
>>740
そうそれだありがとう
思い出せなっくてもやもやしてただけだったので、使う予定はないです
心配していただいてありがとうございます
大体gccなら可変長配列対応してるしね
744デフォルトの名無しさん:2010/09/11(土) 18:33:24
>>743
>742
745デフォルトの名無しさん:2010/09/11(土) 18:35:27
C99は非標準だろぶっちゃけると
746デフォルトの名無しさん:2010/09/11(土) 18:59:06
お前がそう思うんならそうなんだろ(ry
747デフォルトの名無しさん:2010/09/11(土) 23:54:07
非常に簡単なクラスの問題なんですが
どうしてもエラーが解消されないのでご教授御願いします
エラー部は一番下の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;
}
748デフォルトの名無しさん:2010/09/11(土) 23:56:07
set_a()とget_a()の入れ間違え。
749デフォルトの名無しさん:2010/09/11(土) 23:56:53
get
750デフォルトの名無しさん:2010/09/11(土) 23:57:06
笑わせるなー!
751デフォルトの名無しさん:2010/09/11(土) 23:57:48
バグは本人が気付かないからバグなんだよ!!!
752デフォルトの名無しさん:2010/09/12(日) 00:02:30
wwww
753デフォルトの名無しさん:2010/09/12(日) 00:41:03
雪駄と下駄の間違いか
754デフォルトの名無しさん:2010/09/12(日) 00:54:11
>>753
尊敬した
755デフォルトの名無しさん:2010/09/12(日) 01:02:05
>>753
誰うまw
756デフォルトの名無しさん:2010/09/12(日) 01:21:44
>>753
惚れた
757デフォルトの名無しさん:2010/09/12(日) 01:57:00
>>753
天才を見つけた
758デフォルトの名無しさん:2010/09/12(日) 01:59:15
自演乙
759デフォルトの名無しさん:2010/09/12(日) 02:18:25
>>758
いつもの2chで安心したw
760デフォルトの名無しさん:2010/09/12(日) 02:21:19
これは恥ずかしい自演
761デフォルトの名無しさん:2010/09/12(日) 03:02:16
でも自演じゃないんだぜっていう自演
762デフォルトの名無しさん:2010/09/12(日) 03:07:58
ということにしたいのですね(ヘミ略
763デフォルトの名無しさん:2010/09/12(日) 05:48:56
764753:2010/09/12(日) 10:08:47
前からネタにしているのにこんなに反響を呼んで、正直驚愕している。

のはいいけどさぁ、ほどほどにしようや。
765デフォルトの名無しさん:2010/09/12(日) 11:51:19
なんつーか相手にしたくないレベルの間違いだな
766デフォルトの名無しさん:2010/09/12(日) 16:48:37
char[]、char*な文字列をstd::stringのインスタンスに突っ込むのはよく紹介されてますが
charの1文字をstd::string化するにはどうすれば良いでしょうか
767デフォルトの名無しさん:2010/09/12(日) 17:26:09
1文字ならcharでやれば?
1文字だって分かりやすいよ
768デフォルトの名無しさん:2010/09/12(日) 17:37:00
char tmp[2]; // こうして
tmp[0] = c; // こうして
tmp[1] = '\0'; // こうして
string s(tmp) // こうとか
769デフォルトの名無しさん:2010/09/12(日) 17:39:13
string s(1, 'A');
みたいなコンストラクタってなかったっけ。
770デフォルトの名無しさん:2010/09/12(日) 17:46:00
>>767
自作クラス群の共通的なメンバ関数(親抽象クラスにて宣言)があり
このクラスでは1文字を返しますが、他クラスでは2文字以上返す可能性があるため
stringで返すよう揃えたいんです。

>>769
ありました…('A')
そうか、1つめの引数を1にすれば良いんですね
string s(1,c)で生きます
771デフォルトの名無しさん:2010/09/12(日) 19:49:19
>&"warning: GDB: Failed to set controlling terminal:
何ですか、これ?
772デフォルトの名無しさん:2010/09/12(日) 20:16:16
GDBを制御するために変数の名前でもいれろって話じゃね?
てかググればでてくるとおもうぞ。
773771:2010/09/12(日) 20:20:03
>>772
そうなのか、thx
774デフォルトの名無しさん:2010/09/12(日) 21:32:40
namespace hoge
{
void setXXX();
void getXXX();
}

class Hoge
{
public:
static void setXXX();
static void getXXX();
}

あなたならば、どちらを使いますか?
775デフォルトの名無しさん:2010/09/12(日) 21:34:38
場合によります
776デフォルトの名無しさん:2010/09/12(日) 21:36:50
どっちも縁がないなぁ
777デフォルトの名無しさん:2010/09/12(日) 22:18:13
C言語ではstaticの付いている関数/変数は、ヘッダファイルに書かなくてもいいんですか?
また、*.cにだけに書いた関数は、staticが無くてもstaticと同じになるんですか?
778デフォルトの名無しさん:2010/09/12(日) 22:48:41
>>777
staticの有無とヘッダファイルに書くかどうかは直接関係ありません。
また、staticがない関数はある関数と同じにはなりえません。
779デフォルトの名無しさん:2010/09/12(日) 22:51:52
>>777
> C言語ではstaticの付いている関数/変数は、ヘッダファイルに書かなくてもいいんですか?

書くことはできるけど複数ソースファイルでそれをincludeすると嫌なことが起きうる。

> また、*.cにだけに書いた関数は、staticが無くてもstaticと同じになるんですか?

ならない。
780777:2010/09/12(日) 22:52:34
>>778
>staticの有無とヘッダファイルに書くかどうかは直接関係ありません。
ここを、kwsk教えてください
2行目はOKです
781デフォルトの名無しさん:2010/09/12(日) 22:57:56
>>780
>779
782777:2010/09/12(日) 22:58:20
>>779
static関数・変数はヘッダファイルに書かないのが常識なのですか
ありがとうございます/
783デフォルトの名無しさん:2010/09/12(日) 23:10:08
>>782
staticには静的領域って意味もあるけど、
そのソースファイルでしか使えないって意味もあって多分にこっちの方が重要。
(だからソース間での共通項を書くincludeファイルに書くことはまずない)
784777: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に適切な数字ではありませんとでます。
どうすれば良いでしょうか?
786デフォルトの名無しさん:2010/09/13(月) 14:22:11
07 → 7
08 → 8
にすればよいです
787デフォルトの名無しさん:2010/09/13(月) 14:25:29
無事できました。

返信を早くしてくださりありがとうございます。
788デフォルトの名無しさん:2010/09/13(月) 15:47:52
どひゃー
789デフォルトの名無しさん:2010/09/13(月) 18:19:39
C++の優しい入門本教えてください
790デフォルトの名無しさん:2010/09/13(月) 18:21:18
猫でもわかるシリーズなどお勧めでございますよお客様
791デフォルトの名無しさん:2010/09/13(月) 18:41:12
本で入門すると、すぐその本が要らなくなっちゃったりするよ
入門はwebの資料で済ませて、手元に置いておく資料には中級者向け以上のものを買うのオススメ
792デフォルトの名無しさん:2010/09/13(月) 18:55:45
個人的には本をお勧めするけどな
C++のweb資料って多過ぎて、整理されたものを探すのは意外と手間
初心者こそ整理された本な気がする
793デフォルトの名無しさん:2010/09/13(月) 19:28:50
webの情報をお勧めする
専門書で他人との相互理解を深めたいときには書籍
794デフォルトの名無しさん:2010/09/13(月) 19:32:04
適当に売れ筋の本買えばいいんだよ。
これがFAに決まってる。
795デフォルトの名無しさん:2010/09/13(月) 19:59:12
Cやった人向けだろみたいな内容でも初心者向けとして得られてる奴とか
名前空間とかstringstreamとか導入前の本とかには気をつけろ
796デフォルトの名無しさん:2010/09/13(月) 20:02:27
797デフォルトの名無しさん:2010/09/13(月) 22:04:02
for (i = 0; i < 10; i++) {
printf("%d\n", rand());
}
これを何回実行しても同じ結果しか出ないんですが
ランダム係数って言うのは「ランダムに見える特定の順番の数字を出力する関数」なんでしょうか
それとも使い方を間違ってるんでしょうか
798デフォルトの名無しさん:2010/09/13(月) 22:05:03
srandでぐぐれ。
799デフォルトの名無しさん:2010/09/13(月) 22:05:22
>>797
srand()を先に呼んどく。
800デフォルトの名無しさん:2010/09/13(月) 22:07:01
srand()を使う
801デフォルトの名無しさん:2010/09/13(月) 22:07:41
srandで種を設定しないとだめ
802デフォルトの名無しさん:2010/09/13(月) 22:07:42
ありがとうございます
それでためしてみます
803デフォルトの名無しさん:2010/09/13(月) 22:20:22
for (i = 0; i < 10; i++) {
srand(0);
printf("%d\n", rand());
}
こうですか?
同じのばかり出ますが
804デフォルトの名無しさん:2010/09/13(月) 22:21:42
違う
srand(rand());
でやってみ
毎回違うのが出るから
805デフォルトの名無しさん:2010/09/13(月) 22:22:14
そりゃ同じ種からは同じ数しかでない
806デフォルトの名無しさん:2010/09/13(月) 22:22:44
for(i = 0; i < 10; ++i)
{
srand(rand());
printf("%d", rand();)
}

こんな感じで使う
807デフォルトの名無しさん:2010/09/13(月) 22:24:05
#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;
}
808デフォルトの名無しさん:2010/09/13(月) 22:26:29
おまえらふざけすぎ
809デフォルトの名無しさん:2010/09/13(月) 22:28:37
とりあえず>>797>>803は別人な
810デフォルトの名無しさん:2010/09/13(月) 22:42:30
rand() と srand() の Linux C Library 版は、 random(3) と srandom(3) の両関数と同じ乱数生成アルゴリズムを使用している。
そのため、下位のビットは上位のビットと同じくらいにランダムである。
しかし、旧版の rand() の実装や、他のシステムの現在の実装では、下位のビットが上位のビットほどランダムになっていない。
移植性を高める場合でも、精度の高い乱数が必要なアプリケーションではこの関数は使用してはいけない (代わりに random(3) を使うこと)。
811デフォルトの名無しさん:2010/09/13(月) 22:55:33
あっそ
812デフォルトの名無しさん:2010/09/13(月) 23:13:24
無駄に煽るから、せっかく間違いに気がつかせても頑固に間違ったまま使い続けるようになるんだよ。
同じような流れを何度も見た気がする。
813デフォルトの名無しさん:2010/09/13(月) 23:37:05
>>789
独習→accelarated c++ はいかがでしょうか?
814813:2010/09/13(月) 23:42:41
http://www.amazon.co.jp/dp/4798119768/ (第4版がでるんだ‥‥)
http://www.amazon.co.jp/dp/4894714221/
はいかがでしょうか。c++ の前に c の本を数冊読んでおく必要はありますが。
815デフォルトの名無しさん:2010/09/14(火) 00:04:28
>>806
それではばらつかない。
質問の意図からすれば srand(time(NULL)) あたりがいいかと。
816デフォルトの名無しさん:2010/09/14(火) 00:09:47
for (i = 0; i < 10; i++) {
srand(time(0));
printf("%d\n", rand());
}
こうですか?
うまくいっているみたいですが
817デフォルトの名無しさん:2010/09/14(火) 00:11:27
for (i = 0; i < 10; i++) {
srand(i);
printf("%d\n", rand());
}

こうした方がいい
818デフォルトの名無しさん:2010/09/14(火) 00:13:38
>>816
1秒間でループしたら同じ乱数系列しか出ないだろ
819デフォルトの名無しさん:2010/09/14(火) 00:24:39
srandは起動時に1回だけ呼び出せばいい
820デフォルトの名無しさん:2010/09/14(火) 00:25:37
>>817
srand() はプログラムの頭に一回実行するだけでよい。ループの中で srand() するものではない。精進せよ。
821デフォルトの名無しさん:2010/09/14(火) 00:29:18
まとめると

srand(time(0));
for (i = 0; i < 10; i++) {
srand(i);
printf("%d\n", rand());
}

こういうことか
822デフォルトの名無しさん:2010/09/14(火) 00:31:04
まとまってねえw
823デフォルトの名無しさん:2010/09/14(火) 00:33:00
でけた
#incllude <sys/time.h>

for (i = 0; i < 10; i++) {
struct timespec ts;
nanotime(&ts);
srand(ts.tv_nsec);
printf("%d\n", rand());
}
824デフォルトの名無しさん:2010/09/14(火) 00:50:23
>>821
だからループの中で srand() しなおす必要はない。精進せよ。
825デフォルトの名無しさん:2010/09/14(火) 00:52:44
>>824
勘違いしてた

srand(time(0));
for (i = 0; i < 10; i++) {
printf("%d\n", time(0));
}

こうか
826デフォルトの名無しさん:2010/09/14(火) 01:01:47
>>825
time() を表示してどうする?
827デフォルトの名無しさん:2010/09/14(火) 01:03:52
>>823
すげー偏ってるw
828デフォルトの名無しさん:2010/09/14(火) 01:04:51
srand(clock());
for (i = 0; i < 10; i++) {
printf("%d\n", rand());
}
829デフォルトの名無しさん:2010/09/14(火) 01:07:11
乱数がこんなに難しいとは。俺にはプログラムは無理なのか。
830デフォルトの名無しさん:2010/09/14(火) 01:09:47
>>828
プロセッサ時間をシードにするのは‥‥‥思ったほど偏らないかと。
831デフォルトの名無しさん:2010/09/14(火) 01:11:38
clock() は処理系依存だな
0 返しても良いらしいし
832デフォルトの名無しさん:2010/09/14(火) 02:06:33
これは電設的な良スレ
833デフォルトの名無しさん:2010/09/14(火) 02:21:48
#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());
}
834デフォルトの名無しさん:2010/09/14(火) 15:23:14
vector<foo> v;

この場合遅延評価されてメモリ確保されないことは保障される?
835デフォルトの名無しさん:2010/09/14(火) 15:26:28
格納するfooの領域なら確保しないけど
それは遅延評価とは呼ばないよ
836デフォルトの名無しさん:2010/09/14(火) 15:30:10
え、そうなんですか
今やらなくてもいいことを後回しにする(この場合プッシュされるまで確保しなくてもいい)のは全部遅延評価だと思ってました
837デフォルトの名無しさん:2010/09/14(火) 15:55:25
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文が許せますか?
839デフォルトの名無しさん:2010/09/14(火) 20:50:53
100こぐらい
840デフォルトの名無しさん:2010/09/14(火) 21:01:33
必要なだけの個数
841デフォルトの名無しさん:2010/09/14(火) 21:51:59
例外とassert使え
842デフォルトの名無しさん:2010/09/15(水) 00:04:25
>>838
なんこでも必要ならしかたがないでしょうね。
843デフォルトの名無しさん:2010/09/15(水) 00:48:58
個数よりも深さかな
844デフォルトの名無しさん:2010/09/15(水) 07:14:28
classの中の関数で自分自身を開放できたりしますか?
例えばこんなの

class A{
public:
 A *me;
 void Del(){
   delete me;
 }
};
int main(){
 A *a=new A;
 a->me=a;
 a->Del();
}
845デフォルトの名無しさん:2010/09/15(水) 07:17:33
>>844
できますよ。
846デフォルトの名無しさん:2010/09/15(水) 07:18:35
>>844
できるよ
ただしdelete文を実行後はメンバ変数にアクセスしちゃいけなくなる
てゆーか delete thisもできる
847デフォルトの名無しさん:2010/09/15(水) 07:39:41
ありがとうございます。出来るんですね。
エラーは出てなかったけど、意図の通りに動いてるか心配だったのでよかったです。
リスト構造のクラス作りたかったのでこれは便利ですね。

でも、次は試しに大量に確保、関数で開放しようとしたら、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();
  }
}
848デフォルトの名無しさん:2010/09/15(水) 07:44:33
配列の解放はdelete [] で行うだろ?
そういうことだ
849デフォルトの名無しさん:2010/09/15(水) 08:12:11
>>847
>new[]で確保したのは、一つずつ開放は無理で、delete[]で一気に開放しないといけないとか?

そうですよ。

delete this;を効果的に利用できるシーンってあんまりなくて、
行儀が悪いと言われる事もあるよ。Del()と言うメソッドを呼び出すなら、
delete this;でデストラクタ呼び出したって構わないでしょ。

それに常にヒープ領域に確保されていなければならないって事になる。
850デフォルトの名無しさん:2010/09/15(水) 08:32:50
ありがとう、そういうものなのね
双方向リストを作りたかったので、前後クラスの前後を指すポインタの修正をして、自分を削除。
というDel関数を作ろうとしてた。
けど、よく考えるとデストラクタにポインタ修正の処理入れるだけの方が効率よさそうですね。
851デフォルトの名無しさん:2010/09/15(水) 13:16:55
質問なんですが
ヌル文字を含む文字列へのポインタ又は配列はその文字列の長さを予めどこかに保存しておく以外に
サイズを取得することは無理でしょうか
つまり下のような文字列の正確なサイズ取得法です
LPCTSTR str = "hoge\0hoge";
どこで終端がわかるんだって話になってかなり無理そうですが…
852デフォルトの名無しさん:2010/09/15(水) 13:27:22
最後の文字列の後に更に0を付け加える(2個0が連続したら終了)。WindowsのAPIでそういうの有るだろ。
853デフォルトの名無しさん:2010/09/15(水) 13:57:51
>>852
ありがとうございます、でも申し訳ありませんがちょっと重要なものが抜けてました
ヌル文字を含んだ文字列と通常の文字列を一律に扱うことを考えまして
そのサイズを取得できればと考えたのです
つまり>>851のstrは"hoge\0hoge"にも"hoge"にもなりうるんです
解決策としてはすべての文字列の最後尾に\0を付けて手動的に二連ヌルにするしか無いでしょうか
854デフォルトの名無しさん:2010/09/15(水) 14:03:58
C/C++の世界じゃむりなんじゃねえの?
頑張っても無理があるという意味も含めて。
素直に書かない書き方はみんなの身を滅ぼす。
855デフォルトの名無しさん:2010/09/15(水) 14:31:41
> ヌル文字を含んだ文字列と通常の文字列を一律に扱うことを考えまして

文字列とは「0が2個続いたら終端」。このように定義すれば、
1 str = "hoge\0";
2 str = "hoge\0hage\0";
1も2も「通常の文字列」

当然、str*系の標準関数は使用できなくなる。文字列の定義が違うんだから当たり前だ。
856デフォルトの名無しさん:2010/09/15(水) 14:42:30
2連nullではhoge\0\0hoge\0\0が取れないのでだめです
正解は文字列先頭の連続した\0と同じ数だけ\0が連続したらそこを終端とすればよいわけです
ex. \0\0\0hoge\0fuga\0\0piyo\0\0\0
これならば先頭と末尾の\0の数を増やせばどんな文字列にも対応可能です
857デフォルトの名無しさん:2010/09/15(水) 14:45:37
>>853
>解決策としてはすべての文字列の最後尾に\0を付けて手動的に二連ヌルにするしか無いでしょうか

というか、この方法で何がまずいの?
858851:2010/09/15(水) 14:59:29
確かに僅かな効果のために様々な利便性を捨てるのはまずいですね
やはり特殊文字列は特殊文字列として扱うようにします、ありがとうございました

>>857
全ての文字列の書き直し、文字列関数を使っている部分の書き直しの手間と
ただヌル文字含文字列が扱えるというその結果を考えてちょっとどうだろうと思いました
859デフォルトの名無しさん:2010/09/15(水) 15:06:22
>>858
何がしたいのかが全然わからない
860デフォルトの名無しさん:2010/09/15(水) 15:12:18
釣りです
861デフォルトの名無しさん:2010/09/15(水) 15:19:56
>>856
その方法は先頭に"\0"を置く事が出来ないのでダメ。
862デフォルトの名無しさん:2010/09/15(水) 15:22:22
一方、ロシアは'\t'で区切った。
863デフォルトの名無しさん:2010/09/15(水) 15:24:39
>>861
判断基準の文字を\0から任意の文字に置き換えればおk
864デフォルトの名無しさん:2010/09/15(水) 15:27:16
>>863
その判断基準の文字で始まる文字列を先頭におけない。
これくらい、すぐ気付け。
865デフォルトの名無しさん:2010/09/15(水) 15:31:14
>>864
判断基準の文字を動的にかえればいい。
これくらい、すぐ気付け。
866851:2010/09/15(水) 15:31:34
通常の文字配列の代替を目指しているstd::stringよりも軽量で簡素な文字配列クラスを作ってます
とりあえずほとんどのところは置き換えられたのですが>>852も言っているような
GetPrivateProfileSection関数などで得られる特殊な文字配列に関して色々問題が考えられたんです
867デフォルトの名無しさん:2010/09/15(水) 15:36:19
がんばってもどうせstringの方が上に一票
868デフォルトの名無しさん:2010/09/15(水) 15:55:18
文字列終端は \0\0
文字列としてのNULは \0X (Xは\0がいくつ続くか)
と記憶しておいて,文字列が欲しい時は
\0X を展開した文字列を生成する参照関数でもつくっとけ
869デフォルトの名無しさん:2010/09/15(水) 15:57:40
>>868
終端の\0\0の後に偶然\0が入ってたら死人が出る
870デフォルトの名無しさん:2010/09/15(水) 16:14:58
長さを先頭に書いた方が圧倒的にましだな。
871デフォルトの名無しさん:2010/09/15(水) 16:16:41
>>869
why?
872デフォルトの名無しさん:2010/09/15(水) 16:20:21
>>871
ごめん勘違いした
873デフォルトの名無しさん:2010/09/15(水) 16:22:08
でもそんなに一杯終端文字列つけると
何のためにサイズ用の変数捨てたんだろうってならないんだろうか
874デフォルトの名無しさん:2010/09/15(水) 16:23:57
>>870
パスカル式?
875デフォルトの名無しさん:2010/09/15(水) 17:36:12
>>874
COMのBSTR
876デフォルトの名無しさん:2010/09/15(水) 18:20:38
あ−あれね
877デフォルトの名無しさん:2010/09/15(水) 19:56:47
BSTRのBはBASICのB
878デフォルトの名無しさん:2010/09/16(木) 00:39:57
自動生成されるコピーコンストラクタと代入って基底クラスのコピーコンストラクタと代入を勝手に呼んでくれるでおk?
879デフォルトの名無しさん:2010/09/16(木) 01:59:32
自動生成される限りはOK
880デフォルトの名無しさん:2010/09/16(木) 11:07:22
どうもです
881デフォルトの名無しさん:2010/09/16(木) 19:23:55
//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() も何故この順序なのかもわからないレベルです
説明か、手がかりになることだけでも教えていただけるとありがたいです
スレ違いでしたらすいませんが、よろしくお願いします
882デフォルトの名無しさん:2010/09/16(木) 19:30:23
そこだけ切り取られても
883デフォルトの名無しさん:2010/09/16(木) 20:06:41
void Log::setOutputFile(const QString & file,bool rotate,bool handle_qt_messages)
{
priv->setOutputFile(file,rotate,handle_qt_messages);
}
関数の中身を見てみると、1行しか書いていない事が多いのですが
これは、実装の変更をしやすくするためですか?
884デフォルトの名無しさん:2010/09/16(木) 20:08:20
>>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"
となっています
885デフォルトの名無しさん:2010/09/16(木) 20:23:27
>>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
886デフォルトの名無しさん:2010/09/16(木) 21:10:49
>>885
丁寧に説明してくれてありがとうございます
全部で600行くらいあるので、一部だけしか載せられなくて申し訳ありません
プログラムは最適化問題のもので、計算ソフトの関係でVCで書き直しているみたいです
GKFleetVehicles.hやGKClient.hというのが元々ソフトに組み込まれている(?)ので、
その計算ソフトの方で車両の数などの条件を決め、それを読み込む(?)部分です
参考書の「クラスメンバのアクセス」などを読んでもほぼ素人なので全くわからない状態でして
もし参考になるサイトや本、C++のどの部分の知識が必要か等のアドバイスがあれば
何でもいいので教えていただけると助かります
言い訳になりますが、素人で質問の仕方も悪くて本当にすいません
887デフォルトの名無しさん:2010/09/16(木) 21:27:50
つまり
data->getFleetVehicles().begin().value()->getCapacity();
の構文が理解出来ないとかそういうレベルの話だったのか?
888デフォルトの名無しさん:2010/09/16(木) 21:36:52
>>887
恥ずかしいですがそうです
本当に下らない質問で申し訳ないです
教えていただけないでしょうか?
889デフォルトの名無しさん:2010/09/16(木) 21:45:25
ポインタdataが指すオブジェクトのメンバ関数getFleetVehiclesを呼び出して
その返り値のオブジェクトのメンバ関数beginを呼び出して・・・・・ってことを繰り返してる

と考えるのが妥当だろう
890デフォルトの名無しさん:2010/09/16(木) 22:48:15
>>889
どうもありがとうございます
何回も答えていただいて感謝してます
教えてくれたことをもとに考えてみます
891デフォルトの名無しさん:2010/09/16(木) 23:56:31
>>890
つーかだね、とりあえずCは書けるの?
まずCを覚えないと、C++なんて無理だぞ?
892デフォルトの名無しさん:2010/09/17(金) 00:20:53
Aもまだなんです・・・。
893デフォルトの名無しさん:2010/09/17(金) 01:54:12
>>891
JavaとCとアルゴリズムを講義で基本だけ学んだだけです
C++の本を読みながらやっているのですが
どうも合わないようで正直困ってます
もう一度見直します
894デフォルトの名無しさん:2010/09/17(金) 02:32:06
>>891
そうとは言い切れない部分もあるけどな

確かにC++の資料はC知ってる前提のが結構多いが
そもそもは別の言語だし、Cと違って高級言語らしいやり方も可能なわけで
数としては少ないが、説明順が
iostream&文字列リテラル→string→制御構文→vector→関数定義→参照渡し→その他ライブラリ→配列→char[]→ポインタ
みたいな感じの書籍もある、知った時はちょっとしたカルチャーショックだった
895デフォルトの名無しさん:2010/09/17(金) 02:33:34
>>893
うーん、じゃあ、まず、「C++ 入門」とかで検索して、自分で読めそうな入門サイトを選びなよ。
(とりあえずgoogleの上位から選んでおけば、どれにあたってもまず問題ない)
で、とりあえず、
クラスを定義して、そこからインスタンスを生成して、メソッドを呼び出す
というところまでは、はしょらずに勉強しなさい。
そこまでいく間にわからないことがあれば、それをこのスレで質問してもいいし、
そこまで行ったら、また戻ってきて、改めてこのスレの自分の質問と回答ながめて、
理解できない所を質問すればいいと思う。
896デフォルトの名無しさん:2010/09/17(金) 02:38:20
>>894
確かに。
実際、俺はphpしか組めない奴に、
boostのライブラリとかインストールしておいてやって、それらの使い方だけを教えこんで
プログラムを書かせたことがあるw
まあ、多少手直しもしたけど、大筋は動いたわさw

でも、この場合に限っては、VCでのソースを読まなきゃならないってものだから、
Cがわからない、ポインタわからないだと話にはならないだろうな、と思って。
897デフォルトの名無しさん:2010/09/17(金) 09:12:33
名前から電話番号を調べるときはSTLの
map<char*, int>
を使えばいいと分かるのですが、逆に電話番号から名前を調べるときはどうするのがいいですか
やっぱり逆向きのマップも作って置いた方がいいですか?
898デフォルトの名無しさん:2010/09/17(金) 09:14:41
つ[find()]
899デフォルトの名無しさん:2010/09/17(金) 09:17:36
>>897
find_ifすればいいんじゃね?
900897:2010/09/17(金) 09:27:35
ここを見ると、
http://www.kab-studio.biz/Programing/Codian/STL/06.html
> 同じく std::map::find() を使った検索も、キーに対してのみ行われます。

ということなのでfind()はダメです。
キー、バリューとあったときにキーではなくバリューで検索したい
901デフォルトの名無しさん:2010/09/17(金) 10:21:49
std::find_if が使えるかな?
ためしてないけど。
チェックするための関数の引数は const std::pair<K,V>& になるかな?
902デフォルトの名無しさん:2010/09/17(金) 10:23:42
型が書いてあったね、
const std::pair<char*,int>&
903デフォルトの名無しさん:2010/09/17(金) 11:11:43
memcached
904デフォルトの名無しさん:2010/09/17(金) 12:36:21
void func(x, y, z) SugokuNagaiKataNoNamae x, y, z;
{
・・・
}

これってC限定なの?
けっこう便利だと思うんだけどなぜかC++では通らない・・・
905デフォルトの名無しさん:2010/09/17(金) 12:42:34
大昔のC言語の機能
906デフォルトの名無しさん:2010/09/17(金) 12:42:52
ANSI以前から使われていた古い書き方で、C++では無くなった
907デフォルトの名無しさん:2010/09/17(金) 12:49:23
拡張子「.c」で保存
908デフォルトの名無しさん:2010/09/17(金) 16:46:40
>>904
便利?
自分は引数を2回書くので面倒だと思った
909デフォルトの名無しさん:2010/09/17(金) 16:58:53
>>908
型の名前が長いのを一回で済むって話だろ
ばかじゃね
910デフォルトの名無しさん:2010/09/17(金) 17:33:01
>>909
頭大丈夫か?

だからその代わりに変数を2回づつ書かないといけないんだろ。
上の例なら変数6回も書いてるぞ。

そもそも長いタイプ名が嫌なら、短いタイプ名にすればいいんじゃないのか。
あとタイプ名が長いのが好みなら、変数名も長いのが普通だろ。
変数名が長ければ余計にタイプ量増えるぞ。

で、関数ごとにイチイチ書き方変えるなんて面倒で持ち悪いぞ。

昔はこの書き方しかできなかったら、そう書いてただけで、
今の書き方ができるのに、わざわざ昔の書き方で書く人なんていなよ。

で、どこが便利なんだ?
911デフォルトの名無しさん:2010/09/17(金) 18:01:00
質問です
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では成功しているので基本的な設定は正しいはずです
912デフォルトの名無しさん:2010/09/17(金) 18:13:34
>>904
変数宣言もコンマ演算子で列記できるんだから
統一的な観点から仮引数も同じ型の場合コンマでつなげられればいいのに
913デフォルトの名無しさん:2010/09/17(金) 18:27:21
すみません。初心者です。
boost::vectorやboost::arrayなどの配列(固定にせよ、可変にせよ)
で、はじめは0なのですが、こちらをフレキシブルに、例えば1から始まるようにできませんか?
もしくはそのような機能を備えたコンテナなどありましたら教えてくださいませ。
914デフォルトの名無しさん:2010/09/17(金) 20:31:43
>>913
ちょっとやりたいことが不明瞭だが、

1、どうしても1からはじめたければ0を無視する
2、配列に追加していきたいならば、
vector<int> Array;
Array.reserve(30);//30この領域確保
Array.push_back(2);//追加

3、2だとあくまでも配列だから、どこまで追加してもパフォーマンスが落ちない
list<>の双方向リンクリストを使う
やりたいことと合致していればうれしい
915デフォルトの名無しさん:2010/09/17(金) 20:43:49
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;
}
916デフォルトの名無しさん:2010/09/17(金) 20:49:25
確かvbとか1から始まるんだっけ
917デフォルトの名無しさん:2010/09/17(金) 20:51:47
>>916
そんなことはないんじゃないか?
918デフォルトの名無しさん:2010/09/17(金) 21:19:06
VB は配列の先頭が 0 か 1 か選べる変態言語 (VB.NET では出来なくなった)
919デフォルトの名無しさん:2010/09/17(金) 23:36:20
そりゃバグの温床だからな


どっちに統一されたの?
920デフォルトの名無しさん:2010/09/18(土) 00:09:12
int allocated[size + 1];
int * const array = allocated;

or

int allocated[size];
int * const array = allocated - 1;

後者だと、厳密には実装依存なのかな。大抵巧くいくはずだけど。
921デフォルトの名無しさん:2010/09/18(土) 00:11:36
>>920
どこもおかしくないと思うのだが
922デフォルトの名無しさん:2010/09/18(土) 01:17:52
new int[0];

で帰ってくるのは0(NULL)じゃないんでしょうか?
923デフォルトの名無しさん:2010/09/18(土) 01:19:02
>>922
いや、文法的には通るでしょ。

で、普通のコンパイラは1バイト確保されると思う。
924デフォルトの名無しさん:2010/09/18(土) 01:20:39
なるほど。確保はされるんですね。

スッキリしました。
ありがとうございました。
925923:2010/09/18(土) 01:23:34
>>924
あ、でも、そんな書き方するべきじゃないよ?
プログラム的にそうなっちゃうとしても、それはできる限り避けてねw
926デフォルトの名無しさん:2010/09/18(土) 01:42:24
あ、はい。了解です。
事前にサイズのチェックをします。(`・ω・´) シャキーン
927デフォルトの名無しさん:2010/09/18(土) 08:49:13
>>921
後者は配列の一つ前の場所を算出しているが、その際にアンダーフローが起きない保証はない。
実際、そんな環境はないと思うが規格上は拙い。
928デフォルトの名無しさん:2010/09/18(土) 10:42:34
ひょっとして質問者ってnew の失敗時NULLが帰ってくると思ってないか?
929デフォルトの名無しさん:2010/09/18(土) 10:46:31
new int[-1]したらstd::bad_alloc exceptionが投げられますた
930デフォルトの名無しさん:2010/09/18(土) 10:50:50
配列にマイナスってコンパイルエラーじゃないのか
動的だと出来るんだっけか?
931デフォルトの名無しさん:2010/09/18(土) 12:57:35
もしかしたら[]の中身はsize_tと解釈されるので-1はUINT_MAXと解釈されて
最大限のメモリ確保をしようとしたのかもしれんね
932929: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;

}
934デフォルトの名無しさん:2010/09/19(日) 00:38:37
そのプログラムは間違っている
long double は %Le を使え
935デフォルトの名無しさん:2010/09/19(日) 01:19:39
テンプレートクラスって通常のクラスとはほとんど別ものと考えていいですか?
ヘッダのクラス順序でこんがらがっていたのを(どこかに書いてあったとおりに)テンプレートクラスにしただけでほぼ解決しました
これってどういう仕組みなんでしょうか
(このテンプレートクラスは名ばかりのテンプレートクラスでテンプレート引数はまったく使っていませんし
最終的にはtypedefしてテンプレートであることさえも隠してます)
936デフォルトの名無しさん:2010/09/19(日) 01:23:29
「テンプレート」の意味を分かってないだろ
937デフォルトの名無しさん:2010/09/19(日) 01:36:23
どこが別物なのかわからん
クラスであることに変わりないのに
938デフォルトの名無しさん:2010/09/19(日) 02:12:22
すみません、ちょっと言葉足らずでした
コンパイルの側面から見るとまったく別の過程を通ってるような気がしたんです
例えばテンプレート関数は普通に推論された型の関数が量産されるだけらしいのですが(間違ってたらすみません)
テンプレートクラスでは上に書いたようにテンプレートであるただそれだけで
読み込み順序的に問題のあったコンパイルが通るようになる、
いわば関数のプロトタイプ宣言(ちょっと違うか)みたいな働きが確認されたんです
もちろんクラスの前方宣言やポインタでは解決できなかったクラス内部でも他関連クラスのメンバが入り組んだ問題でした
これはどこがどう変わったゆえなんだろうかと思ったんです
939デフォルトの名無しさん:2010/09/19(日) 02:31:54
テンプレートの宣言と実体化の時間差にたまたま助けられただけだろう
940デフォルトの名無しさん:2010/09/19(日) 02:44:23
文章の書き方から頭の悪さって滲み出て来るんだね
941デフォルトの名無しさん:2010/09/19(日) 02:54:21
>>939
確かに調べてみたらコンパイル時の時間差について書かれているのを見つけました
どうやらそこら辺が通常のクラスとは違うようですね、さらに調べてみます
942933: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]];
}
}
944デフォルトの名無しさん:2010/09/20(月) 12:31:42
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;
}
945デフォルトの名無しさん:2010/09/20(月) 12:34:15
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
948デフォルトの名無しさん:2010/09/20(月) 16:23:01
>>944
printf("\x1b[4;1H");
のようなエスケープシーケンスはコマンドプロンプトでは動かないから別の方法でカーソル動かしてください
949デフォルトの名無しさん:2010/09/20(月) 16:56:45
>>945
迷ったら実測。
まぁ、そのケースなら観測するまでもなく最適化されたコードは同じになりそうだ。
950デフォルトの名無しさん:2010/09/20(月) 16:58:29
>>947
どこで比較しているのか判らない。
gpgというプロセスと等価のa.exeを作ったから処理時間を比較したいと言うことなら、
同じ入力に対して同じ出力が得られるように条件をそろえれば宜しかろ。
951デフォルトの名無しさん:2010/09/20(月) 21:31:17
やりたいこと
クラスのコンストラクタに、(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次元配列を動的に確保したい
っていうことなんですが

952デフォルトの名無しさん:2010/09/20(月) 21:35:13
>>948
具体的にどうすればいいのか教えてください
953デフォルトの名無しさん:2010/09/20(月) 21:38:46
>>951
xの方は動かせるがyは固定

int (*num)[10] = new int [x][10]; みたいに

それかポインタのポインタとして擬似的に二次元配列を表現するしか無理
954デフォルトの名無しさん:2010/09/20(月) 21:41:36
class Cul{

public :
int *num;

Cul( int x,int y ){

num = new int[x * y];

}

}

としてアクセスは
num[i][j]に相当するのがnum[i * y + j]
でごまかすのが無難かなぁ


955デフォルトの名無しさん:2010/09/20(月) 21:41:49
>>953
なるほど……
できれば両方指定したかったのですが、とりあえず多めにサイズをとることで対処したいと思います
ありがとうございました

956デフォルトの名無しさん:2010/09/20(月) 21:42:00
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;
};
957デフォルトの名無しさん:2010/09/20(月) 21:44:05
>>954
おお!

num[get_num( i , j )]

get_num(int i, int j ){
return i * y + j;
}

みたいな感じにしようと思います。
ありがとうございました
958デフォルトの名無しさん:2010/09/20(月) 21:45:54
num.get(x, y)ってできるようにしろよ
959デフォルトの名無しさん:2010/09/20(月) 21:45:54
>>956
ああ、そうやればいいんですね

みなさんありがとうございました!
960デフォルトの名無しさん:2010/09/20(月) 21:49:49
もう一種類あるよな
961デフォルトの名無しさん:2010/09/20(月) 21:51:16
ソース書く前に送ちゃったごめんなさい
962デフォルトの名無しさん:2010/09/20(月) 22:07:10
なんでvectorを使わないの?

vector<vector<int> > num(x, vector<int>(y));
963デフォルトの名無しさん:2010/09/20(月) 22:13:19
ぱっと見にくいからだろう
自分でテンプレート化して作ってもいんじゃね?
Array2D<int> intArray(30,20);
みたいな
964デフォルトの名無しさん:2010/09/21(火) 02:53:11
いままでconstたくさん使ってたんだけど、
よくわからない状況になってconst全部削除して解決した

constは他人が触れる表面上の部分だけに使うものだと思う
965デフォルトの名無しさん:2010/09/21(火) 03:29:44
>>964
お前C++0xに行って苦労するよきっと
966デフォルトの名無しさん:2010/09/21(火) 03:37:10
は?
967デフォルトの名無しさん:2010/09/21(火) 03:40:47
もうC++0x行っちゃってますが?
968デフォルトの名無しさん:2010/09/21(火) 03:44:26
つまり・・・どういうことだってばよ
969デフォルトの名無しさん:2010/09/21(火) 03:54:41
よくわからないダイイングメッセージだな
970デフォルトの名無しさん:2010/09/21(火) 06:32:51
プログラミングについてお聞きしたいことがあります
宿題ではないのでこちらで聞きたいのですが、
宿題スレのアップローダーはこちらでも使っても良いのでしょうか?
よろしくお願いします
971970:2010/09/21(火) 07:00:42
申し訳ありません、訂正させてください
こちらのスレでコードパットを使って質問するのはダメなのでしょうか
よろしくお願いします
972デフォルトの名無しさん:2010/09/21(火) 07:08:13
いいとおもうよ
973デフォルトの名無しさん:2010/09/21(火) 07:11:29
>>971
別に構いませんが。つーか、Codepadをなんだと思っているんだか。
974デフォルトの名無しさん:2010/09/21(火) 07:55:49
ありがとうございます

http://codepad.org/SoL0o3uc
の27行目がわかりません
「error C2440: '=' : 'const GKTimeDuration' から 'int' に変換できません」と出ました
const_castを使うのかな?と思いましたがどうすればよいかわかりません

http://codepad.org/pYLWB08b
がGKClientProperty.hです

初心者なので質問の仕方もおかしいかもしれませんが
よろしくお願いします
975デフォルトの名無しさん:2010/09/21(火) 08:02:06
そりゃあ、どう見てもintにGKTimeDurationを代入しようとしているから駄目なんだと思うが……

GKTimeDurationがどんな型なのかこっちで分からんから、そのヘッダーもよろしく
976デフォルトの名無しさん:2010/09/21(火) 08:17:46
これ卒研かなんかだろ?
977デフォルトの名無しさん:2010/09/21(火) 08:45:13
>>975
遅くなってしまい大変申し訳ありません
http://codepad.org/gbnTFw8C
がGKTimeDurationです

>>976
卒論ではないですが、理解を深めるために
先輩がCで書いたものをC++で書き直せと言われました
ソフトの方がC++で書かれていて、GKClientProperty.hなどはソフトに入っているものです
プログラミング苦手なのですがそーゆー班に割り振られてしまって困ってます
978デフォルトの名無しさん:2010/09/21(火) 08:52:52
1から作り直したほうが早いと思う
979デフォルトの名無しさん:2010/09/21(火) 08:57:02
>>978
見てくださってありがとうございます
どーゆーことでしょうか?
980デフォルトの名無しさん:2010/09/21(火) 09:12:56
ひらがなを文字コードに変換する方法を教えてください。
981デフォルトの名無しさん:2010/09/21(火) 10:12:17
#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;
}
982デフォルトの名無しさん:2010/09/21(火) 10:21:04
また突っ込み所満載のネタを・・・
983デフォルトの名無しさん:2010/09/21(火) 10:31:58
怖いよぉ
984デフォルトの名無しさん:2010/09/21(火) 11:05:53
  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
986デフォルトの名無しさん:2010/09/21(火) 11:10:08
みんな、スルー力を試されてるんだ。
987デフォルトの名無しさん:2010/09/21(火) 11:25:37
>>979
遣りたいことを先ず整理すること。
CのコードをC++に1vs.1に修正するのか0から書き直すのか最初の方針を決めること。
1vs.1に修正するなら先ずは動くことを最優先に、一つずつ修正する。
どんな話の流れでGKTimeDuration型を使うことになったのかがよく判らんが、
それを使うのなら1vs.1に修正するのは諦めた方がいい。
988デフォルトの名無しさん:2010/09/21(火) 11:50:37
今からやるならCかC++どちらがいいですか?
知識はC#,Actionscript,javascriptです
やりたい用途はDLL作成です
989デフォルトの名無しさん:2010/09/21(火) 11:57:57
C
990デフォルトの名無しさん:2010/09/21(火) 12:20:32
C++
991デフォルトの名無しさん:2010/09/21(火) 12:25:15
じーっ えー?
992デフォルトの名無しさん:2010/09/21(火) 12:28:03
C99
993デフォルトの名無しさん:2010/09/21(火) 12:28:50
>>988
どんな仕様のdllを作りたいかによる。
それによって自ずとCかC++のどちらかが決定される
994デフォルトの名無しさん:2010/09/21(火) 12:32:08
>>993
ありがとうございます
用途は秀丸エディタのマクロから利用するdllと変換モジュールの作成です
995デフォルトの名無しさん:2010/09/21(火) 12:41:10
C#でもええが
996デフォルトの名無しさん:2010/09/21(火) 12:48:35

  !? &n ? ,オォウヲォ
 l~~~~~~~l
(C++) & (C++)
  /   \
MmMmMmMmMmMmMmM
997デフォルトの名無しさん:2010/09/21(火) 13:18:34
木毎
998デフォルトの名無しさん:2010/09/21(火) 13:58:23
>>995
C#でDLL作ったのですが呼び出せなかったんです
999デフォルトの名無しさん:2010/09/21(火) 13:59:53
>>998
おまえ前も秀丸のプラグインをC#でつくって呼び出せないとかさわいでたろw
1000デフォルトの名無しさん:2010/09/21(火) 14:28:59
次スレ無しやんな

胸がアツウなるな
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。