トップページ⇒tech
1001コメント277KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2010/07/16(金) 22:07:27
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ

01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
0002デフォルトの名無しさん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の処理を待ち続ける
→固まる
というコンボが発生するけど、他のダイアログ呼び出せてるならこれも違うかな。

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

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

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

「何を理解するまでか?」それを含めて理解するまでだ。
0019デフォルトの名無しさん2010/07/18(日) 00:19:12
>>9
VC2010では可能だよ
まぁ0xの先取りなんだけどさ
0020デフォルトの名無しさん2010/07/18(日) 01:36:45
環境依存の話ここですんなよ
0021デフォルトの名無しさん2010/07/18(日) 22:50:20
constを付けると呼び出されるたびにその分処理が遅くなるのでしょうか
0022デフォルトの名無しさん2010/07/19(月) 00:03:26
constはコンパイル時に変数が変更されないかどうか調べるだけだから
気にしなくておk
0023デフォルトの名無しさん2010/07/19(月) 00:41:29
constを付けると最適化がかかりやすくなり速度アップするかもしれない
0024デフォルトの名無しさん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;}
0025242010/07/19(月) 10:20:26
result=fopen(RESULTFILENAME,"w;")
が落ちていました。すみません。
0026デフォルトの名無しさん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; と入れればちゃんと動くかも
0027242010/07/19(月) 11:47:23
>>26
回答ありがとうございます。
そういうことだったんですね。納得しました。
どちらも試しましたが,ともに正しく動きました。
本当にありがとうございました。
0028デフォルトの名無しさん2010/07/19(月) 14:01:48
>>17
sprintfをとりあえず理解してみようか
それ以前の問題のような肝するが
0029デフォルトの名無しさん2010/07/19(月) 16:00:18
vectorでvec1とvec2というのがあった場合、この2つを比較してそれぞれにしかいない要素を
別のvectorにそれぞれコピーする時って、地道にforで回すのが無難ですか?

関数(vec1, vec2, only_vec1, only_vec2);
vec1だけにしかないものをonly_vec1へコピー、
vec2だけにしかないものをonly_vec2へコピーしたい。
0030デフォルトの名無しさん2010/07/19(月) 16:37:11
1:要素数は同じか?
2:複数同じ要素が入っていたら全部消えるのか?
 A=5,5,5 B=5,5,4 の時only_aは5か、要素なしか
3:ソートしても問題はないか?


まぁ何するにもforは必要だと思うけど・・・
0031デフォルトの名無しさん2010/07/19(月) 16:54:09
あぁ、前提を書いてなかった。
vectorの要素数は同じ、各vectorには重複した要素は入っていない。
オリジナルのvectorの順序が入れ替わるのはまずい。
数回forを回せば分かるんで、もうこれでいいかな。
0032デフォルトの名無しさん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回使えばできるんじゃないか?
0033デフォルトの名無しさん2010/07/19(月) 17:13:56
set_difference:一つ目の集合から二つ目の要素と一致しないものだけコピーする。
あ、あるもんなんだね…集合演算か、初めて見た。
>>32
ありがと。
0034デフォルトの名無しさん2010/07/19(月) 20:28:29
メモリマネージャを作っているのですがよく分かりません
参考になるページやソースなどはありませんか?
0035デフォルトの名無しさん2010/07/19(月) 20:37:42
>>34
どの程度のもの?メモリ MMUでググッたら結構出てくるぞ。

http://www.valinux.co.jp/contents/tech/techlib/eos/malloc/malloc_001.html
http://www.jpcert.or.jp/research/2009/3_DynamicMemory.pdf
http://www5d.biglobe.ne.jp/~noocyte/Programming/BigAlignmentSet.html
0036デフォルトの名無しさん2010/07/19(月) 20:43:40
そいつマルチなんだから答えるなよ
0037デフォルトの名無しさん2010/07/19(月) 20:48:17
なんだよ。マルチかよしね。
0038デフォルトの名無しさん2010/07/22(木) 17:26:55
配列が引数にある関数に、呼び出すときに配列作って渡すこと出来る?

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

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

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

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

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


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

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


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

constはこうして初期化しないとだめ、代入は出来ない。
charの方は
const char* const c;
こういうふうに書き直せ。
0068デフォルトの名無しさん2010/07/24(土) 21:11:29
ほんと汚物言語ですね
0069デフォルトの名無しさん2010/07/24(土) 22:09:42
汚物ではなくてプログラミングのうっかりミスを極力予め防止してんだよ
Cだとやってしまうような
0070デフォルトの名無しさん2010/07/24(土) 23:53:45
>>53
g++ 4.5.0で試してみたら通った。
0071デフォルトの名無しさん2010/07/24(土) 23:55:02
>>68
ふーん
0072デフォルトの名無しさん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はどうやればいいの?
0073デフォルトの名無しさん2010/07/25(日) 02:22:43
y = b, y <<= 32, y |= a;
0074デフォルトの名無しさん2010/07/25(日) 02:44:04
なるほど ありがとう!
0075デフォルトの名無しさん2010/07/25(日) 06:50:51
>>69
初期化記法を汚物と言ってる。
0076デフォルトの名無しさん2010/07/25(日) 09:20:03
あっそ
0077デフォルトの名無しさん2010/07/25(日) 18:35:13
>>75
それはたしかに思う。
0078デフォルトの名無しさん2010/07/25(日) 18:41:15
一貫性が無いよね
0079デフォルトの名無しさん2010/07/25(日) 18:52:01
ロマンがあるわけよロマンが
0080デフォルトの名無しさん2010/07/25(日) 19:03:19
男のロマンといったらドリル兵器と自爆装置だ
0081デフォルトの名無しさん2010/07/26(月) 21:28:17
乱数の取得にはsrandとrandを使った方がいんですか?(c++)
0082デフォルトの名無しさん2010/07/26(月) 21:30:12
普通はそれでいいけど、boostにも乱数あるからよろしくな!
0083デフォルトの名無しさん2010/07/26(月) 21:38:19
このソースに自爆装置を仕込んだのは誰だぁ!!!
0084デフォルトの名無しさん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*’

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

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

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

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

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

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

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

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

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

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

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

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

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

環境はlinux g++ 4.4です。

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

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

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

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


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

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

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


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

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

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

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

関数を見落としていました。
お騒がせしました
0179デフォルトの名無しさん2010/07/30(金) 00:15:58
itr->get()
で
0180デフォルトの名無しさん2010/07/30(金) 18:06:12
VC++2010使ってるんですがデバッグして出たソフトを終了すると
Alloc memory dump
Total size:0(0.000kb) Alloc num:0
みたいなものが出ます。これは何を表しているのでしょうか?
Alloc memory dumpでggってみましたが出るのはエラー相談の掲示板ばかりで・・・
0181デフォルトの名無しさん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;
}
なんか落ちる…
0182デフォルトの名無しさん2010/08/01(日) 14:08:36
listが100KiBしか確保されてないのにcount最大値100000要素×4バイト=400KBまで使おうとするからじゃないかと思います
0183デフォルトの名無しさん2010/08/01(日) 19:08:42
>>180
VSスレに書き込めよ
ちなみにそれはメモリリークが存在しないことを表してる 至って正常ということ
0184デフォルトの名無しさん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 で終了しました
0185デフォルトの名無しさん2010/08/01(日) 22:48:13
ちゃんとリンクさせてるか?
01861842010/08/01(日) 22:53:44
>>185
IDEに頼り切っていたので、やり方がわかりません
gcc v4.4.3、opensslは/usr/includeにあります
ごめんなさい
0187デフォルトの名無しさん2010/08/01(日) 22:56:53
math.hだったら
-lm ってオプションいるだろ?(最近は無くてもいけるけど)そういうことだ
それの名前がわからん
でも/usr/libにはあるはず
もしくはそのライブラリの説明どっかにないのか
0188デフォルトの名無しさん2010/08/01(日) 23:01:24
たぶん -lssl か -lopenssl か `pkgconfig --libs ssl` か `pkgconfig --libs openssl` のどれかでいけるんじゃないかな
0189デフォルトの名無しさん2010/08/01(日) 23:03:35
エディットボックスの読み取り専用にして文字出力して、画面サイズ
可変可能でサイズを小さくした時、例ですが"○○ a"という文字を普通に
出力する時はいいのですが、段を分けて出力する時
○○このようにスペース空けてaを出力すると思ったのですが実際は
a
○○このようにスペース空けずにaを出力してしまいました。
a
charをメンバ変数CString型にコピーして出力しますが、ずれずに出力
するか、ずれたデータをchar形にコピーする方法は有りますか?
0190デフォルトの名無しさん2010/08/01(日) 23:08:03
189の上か5行目スペース入れたのに入りませんでした。
0191デフォルトの名無しさん2010/08/02(月) 08:39:05
189-190 自己解決しますた。
0192デフォルトの名無しさん2010/08/02(月) 10:24:54
>>189-190
恐らく>191は他人でしょうから、あなたのお使いの開発環境を明らかにした上で
該当スレに書き込むか、エスパースレにどうぞ。
01931842010/08/02(月) 22:01:16
>>187-188
わかりました
調べてみます
01941842010/08/02(月) 22:57:02
>>188
-lsslをつけたらコンパイルする事ができました
ありがとうございます

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

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

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

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

struct data *dp;

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

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

struct hoge{
int a;
char b[];
};
0220デフォルトの名無しさん2010/08/04(水) 11:19:23
VC2008EEです
0221デフォルトの名無しさん2010/08/04(水) 11:23:41
VC2008ならgccと同じくchar b[0];が使える。
0222デフォルトの名無しさん2010/08/04(水) 11:27:56
VC2008はC99に対応してないと聞いていたが、flexible array memberは使えるようだ。
0223デフォルトの名無しさん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 *'に変換できません とエラーが出ます。どうすれば良いのでしょうか?
0224デフォルトの名無しさん2010/08/04(水) 11:39:59
>>223
hogeなんて構造体が無いからだろ。バカか。
struct hogeとhogeの区別もつかないのか。市ねよ。
02251992010/08/04(水) 11:40:31
>>214
その方法でできました。ありがとうございます!

>つまり、Fortran側で確保している領域にCからアクセスしたいという事だね。
そうです!ついでにC側でその領域の値の書き換えも行いたいと。
リンクは仕方ないんで毎回やります。。Fortran側はNの値を毎回書き換えてコンパイルする仕組みのようなので。

>>215
どうなんでしょう。とりあえずはできたので
実際の大きいプログラムで試してみます。
0226デフォルトの名無しさん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); <-可変長のデータ長を足して確保
どこがおかしいのでしょう?
0227デフォルトの名無しさん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_にアクセスさせる方法もある。
0228デフォルトの名無しさん2010/08/04(水) 11:51:12
>>227
ありがとうございます
やってみます
0229デフォルトの名無しさん2010/08/04(水) 11:54:16
>>226
×
dp = malloc(sizeof(hoge) + a*3);

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

ってことだろ
>>224の言い方はヒドいが、知っとけよとは思うな
0230デフォルトの名無しさん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;
は、メモリ上の配置は全然違うという事は知っておくといい。
0231デフォルトの名無しさん2010/08/04(水) 12:07:58
>>229
すいません
そうしてもerror C2440: '=' : 'void *' から 'hoge *' に変換できません。と出ます
dp = malloc(sizeof(struct hoge) + dp->a*1);どこがおかしいのでしょうか?
0232デフォルトの名無しさん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 []' に変換できません。
と出ます
0233デフォルトの名無しさん2010/08/04(水) 12:21:35
>>232
そのエラーメッセージはBCCじゃないのか?
BCCは可変長配列は使えないぞ
0234デフォルトの名無しさん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 *'
どこがおかしいでしょうか?
0235デフォルトの名無しさん2010/08/04(水) 13:05:07
C++でコンパイルしているだろ。拡張子を.cにしろ。
0236デフォルトの名無しさん2010/08/04(水) 13:16:31
vector<char>にしたら通ったのですがこれってできてますか?
0237デフォルトの名無しさん2010/08/04(水) 13:25:55
>>234
dp = (hoge *)malloce( );
キャスト変えてみろ
0238デフォルトの名無しさん2010/08/04(水) 13:26:37
無駄なeが入ったw
0239デフォルトの名無しさん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が全てだと思うなよ
0240デフォルトの名無しさん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();}
でできてませんか?
0241デフォルトの名無しさん2010/08/04(水) 13:31:45
それがありならnew deleteとかでもできるだろwww
勝手にしろ
0242デフォルトの名無しさん2010/08/04(水) 13:32:52
イテレーター使えボケ
0243デフォルトの名無しさん2010/08/04(水) 13:33:28
できてますか?
vector使ってるからより重くなってるとか、メモリ食ってるとかありませんか?
0244デフォルトの名無しさん2010/08/04(水) 13:41:23
いったい何がしたいのかさっぱり分からん。
もうstring使えばいいじゃん。
0245デフォルトの名無しさん2010/08/04(水) 13:46:02
したいことは
struct hoge{
int a;
char b[a];←ここ
}
です
struct hoge do[d];みたいに何個も作って値を入れて行った時にそれぞれのaの値とbの配列の要素数がリンクしてるってことです
こうするとできないので一番無駄の無いやり方が知りたいのです
0246デフォルトの名無しさん2010/08/04(水) 16:24:08
したいことがあるからそれを書きたいだけで、それが最終的にしたいことじゃないだろう?
0247デフォルトの名無しさん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を入れたいです
0248デフォルトの名無しさん2010/08/04(水) 19:05:05
>memcpy(&hoge,&temp,sizeof(struct KATA));

vectorにこういうキチガイじみた事はやめろ
やるならstd::copyでも使え
0249デフォルトの名無しさん2010/08/05(木) 07:22:16
vectorのことを知るときにコピーの仕方ぐらい一緒に覚えればいいのに
0250デフォルトの名無しさん2010/08/05(木) 12:50:34
coutからcharの値を16進数で表示するにはどうやりますか?
0251デフォルトの名無しさん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;
}
0252デフォルトの名無しさん2010/08/05(木) 14:09:28
なるほど、そのように技巧を凝らさないと出来ないわけですかwwwwww
0253デフォルトの名無しさん2010/08/05(木) 14:43:55
LinuxやMacでもマルチバイト文字セットでのプログラミングが主流なの?
0254デフォルトの名無しさん2010/08/05(木) 21:47:18
ガスライティング
0255デフォルトの名無しさん2010/08/06(金) 23:07:40
あるdouble型の変数をcoutすると、
1.5*e+005 と出力されるのですが、これは 1.5*exp(5) と同じ意味でしょうか?
0256デフォルトの名無しさん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が帰ってきてしまいます
かなり単純なところで躓いた分、何がいけないのか分かりかねます
何がいけないのでしょうか・・・?
0257デフォルトの名無しさん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程度の無理数であるのでその二つは別物かと思います
0258デフォルトの名無しさん2010/08/07(土) 00:48:40
>>256
1箇所代入になってる
0259デフォルトの名無しさん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)
でくくっとけ
0260デフォルトの名無しさん2010/08/07(土) 00:57:40
>>258
うわ・・・ほんとだ・・・・これはひどい・・・ちょっと凹んできます
>>259
ご指摘ありがとうございます
今回使い方が限定的だったので気にしていなかったのですが習慣づけたほうがよいですよね

ありがとうございました、こんなオチで申し訳ありません
0261デフォルトの名無しさん2010/08/07(土) 00:59:49
define使うな
0262デフォルトの名無しさん2010/08/07(土) 01:26:15
分かりにくいよね。なんで10^nにeが選ばれたのか分からない
0263デフォルトの名無しさん2010/08/07(土) 01:34:01
exponential
0264デフォルトの名無しさん2010/08/07(土) 01:40:33
>>259
#define FOO(n) ((n) * 2)
0265デフォルトの名無しさん2010/08/07(土) 01:56:45
exponential だから e = 2.718281828
0266デフォルトの名無しさん2010/08/07(土) 11:11:38
ネイピア数ってどういう意味なん?
ティッシュのネピアとも違うしな
0267デフォルトの名無しさん2010/08/07(土) 11:34:41
http://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0
0268デフォルトの名無しさん2010/08/07(土) 19:19:34
素人です
ポインタを使う判断基準がわかりません
どういう時にポインタを使ったほうが良いとわかるのでしょうか?
0269デフォルトの名無しさん2010/08/07(土) 19:28:40
構造体、クラス、配列を関数の引数として渡すとき
0270デフォルトの名無しさん2010/08/07(土) 19:35:23
そのまま渡せばいいじゃんwww
馬鹿かおまえwww
0271デフォルトの名無しさん2010/08/07(土) 19:39:29
>>269
わかりました!
ありがとうございます
0272デフォルトの名無しさん2010/08/07(土) 20:07:17
ムーブセマンティクスが使われるようになると、ポインタを使う機会って減ってくんだろうなあ
0273デフォルトの名無しさん2010/08/07(土) 20:27:24
>g++とgccの違いはデフォルトでC++のファイルとして扱うか
>というところが違うだけだったはずです。
結局違いって何よ?
0274デフォルトの名無しさん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で使える領域を確保することはできますか?
0275デフォルトの名無しさん2010/08/07(土) 21:28:25
vector::reserve
0276デフォルトの名無しさん2010/08/07(土) 21:31:11
>>273
g++はgccにc++オプションをつけたアライアス
0277デフォルトの名無しさん2010/08/07(土) 21:37:45
>>275
reserveは確か値が入ってないので直で使えませんよね?
その後strcpyの第一引数にvのメンバを入れるとエラーがでるのです
0278デフォルトの名無しさん2010/08/07(土) 21:42:37
よくわからんが
v.push_back(new V);
こうしろよ。
そもそも
std::vector< XXX > v;
でいいだろ。
0279デフォルトの名無しさん2010/08/07(土) 21:43:23
v.push_back(new XXX);だ
0280デフォルトの名無しさん2010/08/07(土) 21:44:01
>>278
ありがとうございます
なぜstd::vector< XXX* > v;
にするとstrcpyでエラーが出るのでしょうか?
0281デフォルトの名無しさん2010/08/07(土) 21:49:53
しかもできませんでした
1 番目の引数を 'XXX *' から 'XXX &' に変換できません。
となります
0282デフォルトの名無しさん2010/08/07(土) 21:50:54
>>280
XXX*はポインタだろ。ポイント先を示してやらないとそりゃエラーになるわな。
後、vectorにnewしてつっこんだリソースは自動的に解放されないから。
ポリモーフィズム的に振る舞う予定が無ければXXXにしとけ。
0283デフォルトの名無しさん2010/08/07(土) 21:53:37
std::vector< XXX* > v;
の時ですね。できました
なぜstd::vector< XXX >ならnewでできないのにstd::vector< XXX* >ならnewで上手く行くか理解できません。説明よろしくお願いします
0284デフォルトの名無しさん2010/08/07(土) 21:56:06
>>283
てめぇ、ちょっとは自分で考えろw
XXXとXXX*じゃ型が違うだろう。

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


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

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

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

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

値を変えたかったらポインタを使えと
0308デフォルトの名無しさん2010/08/08(日) 21:51:17
「C FAQ」の名前くらい知ってろよ
0309デフォルトの名無しさん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);

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

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

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

普通に考えたらある番目つってんだからその数値で両方にv.erase(v.begin() + n)すればいいだけじゃないのか?
0324デフォルトの名無しさん2010/08/09(月) 13:22:40
vectorだからadvanceはいらないですねごめんなさい
0325デフォルトの名無しさん2010/08/09(月) 13:30:52
>>323
>>320はあるイテレーターの時、その要素を消してメモリもサイズを減らすってつもりなのですがおかしいですか?
hoge1はイテレータを使いたいのでそのやり方でも問題ありません。ありがとうございます
0326デフォルトの名無しさん2010/08/09(月) 14:03:20
hoge1をswapしたらiteratorは無効にならないか?
0327デフォルトの名無しさん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;}
}
こんな感じです
0328デフォルトの名無しさん2010/08/09(月) 15:42:36
listをシャッフルしたいんだけど一番効率の良いコード教えて!
0329デフォルトの名無しさん2010/08/09(月) 15:45:37
ランダムじゃなくても良いですか?
0330デフォルトの名無しさん2010/08/09(月) 15:46:16
listをやめるというのも手じゃないかな
0331デフォルトの名無しさん2010/08/09(月) 15:57:46
>>329
ランダムじゃないとだめです><
>>330
vectorでもいいよ!!
0332デフォルトの名無しさん2010/08/09(月) 16:16:26
>>328
教えるのめんどくさいからやだ。自分で考えて。
ちなみに万あっても微々たる差。
0333デフォルトの名無しさん2010/08/09(月) 16:34:09
そういうのはいらないです
0334デフォルトの名無しさん2010/08/09(月) 16:39:19
だが断る
0335デフォルトの名無しさん2010/08/09(月) 23:54:45
listからランダムに取り出して別のlistにつっこむ
0336デフォルトの名無しさん2010/08/10(火) 00:47:02
>>328
置換群の元の一つを置換行列に変換して、それをvectorに掛ける。
0337デフォルトの名無しさん2010/08/10(火) 01:13:29
オブジェクト指向を勉強してC++を理解したいと思っています
現状ではクラスを定義してもその変数をグローバルで宣言して
いろんなソースファイルから使えるようにしていますが
そろそろそういう状態から抜け出したいです
そこでどういうクラス設計や考え方をすればよいか理解できる
わかりやすい書籍などありましたら教えてください
0338デフォルトの名無しさん2010/08/10(火) 05:58:40
なぜ、配列はポインタと同じくアドレスでアクセス出きるんですか?
0339デフォルトの名無しさん2010/08/10(火) 07:43:02
いえ、氷山にぶっつかって船が沈みましてね、-略-船が氷山にぶっつかって一ぺんに傾きもう沈みかけました。月のあかりはどこかぼんやり
ありましたが、霧が非常に深かったのです。ところがボートは左舷の方半分はもうだめになっていましたから、とてもみんなは乗り切らない
のです。もうそのうちにも船は沈みますし、私は必死となって、どうか小さな人たちを乗せて下さいと叫びました。近くの人たちはすぐみち
を開いてそして子供たちのために祈って呉れました。けれどもそこからボートまでのところにはまだまだ小さな子どもたちや親たちやなんか
居て、とても押しのける勇気がなかったのです。それでもわたくしはどうしてもこの方たちをお助けするのが私の義務だと思いましたから前
にいる子供らを押しのけようとしました。けれどもまたそんなにして助けてあげるよりはこのまま神のお前にみんなで行く方がほんとうにこ
の方たちの幸福だとも思いました。それからまたその神にそむく罪はわたくしひとりでしょってぜひとも助けてあげようと思いました。けれ
どもどうして見ているとそれができないのでした。どもらばかりボートの中へはなしてやってお母さんが狂気のようにキスを送りお父さんが
かなしいのをじっとこらえてまっすぐに立っているなどとてももう腸もちぎれるようでした。そのうち船はもうずんずん沈みますから、私は
もうすっかり覚悟してこの人たち二人を抱いて、浮べるだけは浮ぼうとかたまって船の沈むのを待っていました。誰が投げたかライフブイが
一つ飛んで来ましたけれども滑ってずうっと向うへ行ってしまいました。私は一生けん命で甲板の格子になったとこをはなして、三人それに
しっかりとりつきました。どこからともなく〔約二文字分空白〕番の声があがりました。たちまちみんなはいろいろな国語で一ぺんにそれを
うたいました。そのとき俄かに大きな音がして私たちは水に落ちました。もう渦に入ったと思いながらしっかりこの人たちをだいてそれから
ぼうっとしたと思ったらもうここへ来ていたのです。この方たちのお母さんは一昨年没くなられました。ええボートはきっと助かったにちが
いありません、何せよほど熟練な水夫たちが漕いですばやく船からはなれていましたから。
0340デフォルトの名無しさん2010/08/10(火) 08:31:22
>>337
デザインパターンでも勉強しろ
そして過剰設計に陥ってる自分に気づいてからが本当の設計が始まる
0341デフォルトの名無しさん2010/08/10(火) 11:14:52
>>339
銀河鉄道の夜か。タイタニック号の事故を下敷きにしているんだね。
銀河鉄道の夜の映画音楽を担当した細野晴臣がタイタニック号の生き残りの孫だと言うのが因果だね。
0342デフォルトの名無しさん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
0343デフォルトの名無しさん2010/08/10(火) 12:15:26
>>331
ttp://oshiete.goo.ne.jp/qa/2438745.html
C++なら
std::random_shuffle
を使えばいいって言う話。
0344デフォルトの名無しさん2010/08/10(火) 12:41:31
>>337
大規模C++ソフトウェアデザインは勉強になった
日本語がところどころ難解だけど
0345デフォルトの名無しさん2010/08/10(火) 15:34:51
オープンソースのライブラリ的な奴のソースに
#if 0
〜処理
#endif
とあって
自分で実装しないといけないとかいう話も聞く関数中なのですが
#if 0 #endifって無視される部分ですよね?なぜこんなことをしてるのですか?一応サンプルのやり方だけ残しとくよみたいな感じなのですか?
0346デフォルトの名無しさん2010/08/10(火) 16:02:23
>>345
そのとおり。そのソースを書いた人のやさしさ
0347デフォルトの名無しさん2010/08/10(火) 18:45:07
ちょっと質問です
プログラムのコンパイル時間が長いので、頻繁に調整する関数をDLLにしようか迷ってるんですが、
プログラムに直接処理用の関数を関数を書くのと、
関数をDLLに分けて処理させるのでは、オーバヘッドに違いは出ますか?
0348デフォルトの名無しさん2010/08/10(火) 19:18:47
両方作って計測すれば、勉強になる。
0349デフォルトの名無しさん2010/08/10(火) 19:29:01
>>347
コンパイルを早くしたいなら、dllに分けていいよ。
dllにすることによっての呼び出しオーバーヘッドは考えてなくいい。

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

並列処理で使うやつだとちゃんとしないと駄目なのもがあるが
0465デフォルトの名無しさん2010/08/17(火) 08:31:02
>>438
初心者にウソを教えるな
0466デフォルトの名無しさん2010/08/17(火) 15:49:47
そういうのは正しい答えを書いてからいうもんだ
0467デフォルトの名無しさん2010/08/17(火) 17:59:10
>>465
みんなが本当だと言えばそれが真実になる
0468デフォルトの名無しさん2010/08/17(火) 18:42:25
>>467
朝鮮人みたいな事言うなヴォケ
規格票で示せ
0469デフォルトの名無しさん2010/08/17(火) 19:26:30
そういうのは正しい答えを書いてからいうもんだ
0470デフォルトの名無しさん2010/08/17(火) 19:27:14
マクロってソースにはもりもり使っていいの?
0471デフォルトの名無しさん2010/08/17(火) 19:52:13
使わないといけない理由がないなら使ってはいかん。inline関数の方がマシ。
0472デフォルトの名無しさん2010/08/17(火) 19:58:33
プライベートなメソッドの代わりに使いたいんだ
インラインにしてヘッダに書いちゃうと解析コストがちょびっと増えそうで気になる
0473デフォルトの名無しさん2010/08/17(火) 19:59:27
そこらへん
Effective C++に詳しくあるはずだ
#defineよりconst
#defineよりinline
0474デフォルトの名無しさん2010/08/17(火) 20:07:18
ちょこっとづつ違う定型inlineメンバやconst値を大量に定義したいときに#defineつこてしまう。
少なくともeclipseのメソッドツリー機能は憑いてきてくれる
0475デフォルトの名無しさん2010/08/18(水) 13:41:19
商用使用無料の高性能なコンパイラってありますか?
0476デフォルトの名無しさん2010/08/18(水) 13:56:42
VS2010EE
0477デフォルトの名無しさん2010/08/18(水) 14:03:57
EEでも商用利用可能なんですか!
ありがとうございます。
0478デフォルトの名無しさん2010/08/18(水) 16:04:03
2008までは可だったけど2010からは評価目的のみになったんじゃなかったっけ?
0479デフォルトの名無しさん2010/08/18(水) 16:32:13
登録前はそうだが
0480デフォルトの名無しさん2010/08/18(水) 16:49:51
登録後に商用を許可しますなんて表示されたっけ
0481デフォルトの名無しさん2010/08/18(水) 16:53:33
2008EEの統合環境に
最新のWindowsSDK落としてきてbin,lib,includeをそっちと置き替えるってのはどうだろう?
どっちにしろEEはMFCとかの追加機能は使えないんだし
0482デフォルトの名無しさん2010/08/18(水) 17:10:17
なんでそこまでしてVC使いたいの?馬鹿なの?死ぬの?
0483デフォルトの名無しさん2010/08/18(水) 17:48:08
なんか手軽だし
0484デフォルトの名無しさん2010/08/18(水) 18:37:27
業界の標準だし
0485デフォルトの名無しさん2010/08/18(水) 23:00:39
使ってる人多いし
0486デフォルトの名無しさん2010/08/18(水) 23:02:22
Linuxで使える、商用OKなコンパイラは?
0487デフォルトの名無しさん2010/08/18(水) 23:03:03
訂正
Linuxで使える、商用OKな無償のコンパイラは?
0488デフォルトの名無しさん2010/08/18(水) 23:06:50
作れ
0489デフォルトの名無しさん2010/08/18(水) 23:24:47
gccの吐いた実行ファイルって商用に使えないの?
0490デフォルトの名無しさん2010/08/18(水) 23:25:18
終了時のメモリ解放忘れによるメモリリークと不用意なnewの繰り返しによるリークは
区別されてしかるべきと思うんだけどなあ
0491デフォルトの名無しさん2010/08/19(木) 00:40:19
突然なによん
0492デフォルトの名無しさん2010/08/19(木) 01:29:22
キチガイに触れんな
0493デフォルトの名無しさん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以下がちゃんとアドレスが入ってないようなのですがなぜでしょうか?
0494デフォルトの名無しさん2010/08/19(木) 06:10:20
LPSTR strx,stry,strzをグローバルで宣言したらGetDlgItemText(hwnd ,10,strx ,1000);の時点で値が入らなくなりました
なぜでしょうか?
0495デフォルトの名無しさん2010/08/19(木) 07:12:17
IDの指定の仕方が間違ってるから
0496デフォルトの名無しさん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を指定しているのですがそれでは駄目なのですか?
どうすれば良いのですか?
0497デフォルトの名無しさん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);
にしたらコンパイルが通ったのですが何故ですか?
0498デフォルトの名無しさん2010/08/19(木) 07:49:49
エラーメッセージすら書かないとかマジパネェっすよ
0499デフォルトの名無しさん2010/08/19(木) 08:02:26
マルチだろ。しかし手が込んだマルチだな。
http://hibari.2ch.net/test/read.cgi/tech/1274949734/912
0500デフォルトの名無しさん2010/08/19(木) 09:54:30
まるでストーカーだね
0501デフォルトの名無しさん2010/08/19(木) 10:00:54
両スレ見てて類似性に気付かなかったら、病的な鈍感。
0502デフォルトの名無しさん2010/08/19(木) 12:56:28
巧妙な罠を仕掛けていたのか
危なかったぜ
0503デフォルトの名無しさん2010/08/19(木) 22:18:21
基底派生ともにデストラクタがなにもしない場合はデストラクタを仮想にしないでも基底クラスのポインタに派生クラスのオブジェクトをnewしたりdeleteしてもいい?
コンパイラーは警告すらださないしメモリもリークしてないみたいなんだけどどうかな
0504デフォルトの名無しさん2010/08/19(木) 22:37:53
駄目
0505デフォルトの名無しさん2010/08/20(金) 00:00:23
良いけど、特例は作るべきじゃないから駄目
0506デフォルトの名無しさん2010/08/20(金) 08:07:24
いいよ。結局同じなんだし
0507デフォルトの名無しさん2010/08/20(金) 15:44:50
いいよ
できることは何でもしていい
0508362010/08/20(金) 16:05:21
何もしないデストラクタ、もしくはデストラクタ書かない、
とかでも暗黙的にメンバのデストラクタ呼ぶわけだから、
それのために仮想デストラクタにしといた方がいいのかも?

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

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

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

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

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

class testclass {};

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

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


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

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

英文を読めないのが問題なんだよ、書籍買うのなら英語の学習本だね
0552デフォルトの名無しさん2010/08/24(火) 12:24:17
>>550
minix はどうだろうか?
0553デフォルトの名無しさん2010/08/24(火) 14:12:06
お聞きしたいことがあります。

C++で実行するとコマンドプロンプトにすぐ移るのですが、結果の量が多く最後の方しか見ることができません。
結果をすべて見るにはどうすれば良いでしょうか?
0554デフォルトの名無しさん2010/08/24(火) 14:20:18
> hoge.exe | more
0555デフォルトの名無しさん2010/08/24(火) 15:41:53
そうしたいんですが、実行したとたんにコマンドプロンプトが始まります。
また、処理が終了すると何かキーを押すだけで終了してしまいます。

どのタイミングでhoge.exe | moreを入れれば良いでしょうか?
0556デフォルトの名無しさん2010/08/24(火) 15:54:35
>>555
コマンドプロンプトを先に開いてから
0557デフォルトの名無しさん2010/08/24(火) 15:55:46
           \
            \
          ∧ニユ/ ̄ヽ
\        ( ´∀/)    i
\.\    _(」つ/とl) .  | \
;::;::\i\  匚レ| .〈/ )    |  \
 。::;;:'\.\   (_,)ー'    |_,, -'''"!
^人;:'::;゚:;.\l\     _,,, -''"|_,, -''"|
 ^^从::;;:。':\.\_,, -''"|_,, -''"|   . :|
 へ ^へ;;::';;:'\l_,, -''" .   | 从^    〜
 ^ ^ヘ^人从::;;;:|    ,ィ人^. |  ^ ^へ^^
  〜 ^.へ' ^':レ^从 へ'  | 〜   ^
 へ ^^ へ 〜人^ ^  へ〜  〜
0558デフォルトの名無しさん2010/08/24(火) 15:57:39
もし、よろしければ手順を教えていただきたいです。
(a.cppを実行すると仮定してお願いします。)
0559デフォルトの名無しさん2010/08/24(火) 16:00:02
そんな餌に俺が釣られクマー
0560デフォルトの名無しさん2010/08/24(火) 16:16:47
>>558
コマンドプロンプトを開いて、そのフォルダに移動し、a.cppを実行する。
それでウィンドウが開くから。まずはそこまでやってくれ。
0561デフォルトの名無しさん2010/08/24(火) 16:48:23
くまった
0562デフォルトの名無しさん2010/08/24(火) 17:02:03
>>551
英単語はえっちなのしか知りません><
英語勉強します・・

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

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

}
0565デフォルトの名無しさん2010/08/24(火) 17:15:59
ありがとうございます
0566デフォルトの名無しさん2010/08/24(火) 21:55:24
しかしそれは while の仕事ではないか?
0567デフォルトの名無しさん2010/08/24(火) 23:01:53
>>566
for文使って という顧客の要件定義がある以上仕方ない
0568デフォルトの名無しさん2010/08/25(水) 22:01:36
C/C++ってjava/vbなんかよりも、面白くていいね
実効速度も速いし
0569デフォルトの名無しさん2010/08/25(水) 23:24:38
まあね
0570デフォルトの名無しさん2010/08/25(水) 23:25:36
Cから引きずったヘッダがどうもいやでしょうがない。
これさえなければな・・・。
0571デフォルトの名無しさん2010/08/26(木) 01:33:16
質問でもなんでもない件について
0572デフォルトの名無しさん2010/08/26(木) 01:39:45
ヘッダって無理に書くものでもないじゃん
0573デフォルトの名無しさん2010/08/27(金) 02:20:33
ヘッダにロジック書く奴は死刑な
0574デフォルトの名無しさん2010/08/27(金) 08:45:53
C++でソースにロジック書いたらパフォーマンス落ちそうでイヤ
0575デフォルトの名無しさん2010/08/27(金) 09:09:54
落ちるわけねーだろ
お前バカだろ
0576デフォルトの名無しさん2010/08/27(金) 09:35:33
>>574
さすがにそれはねーよw
0577デフォルトの名無しさん2010/08/27(金) 11:24:38
俺はコンストラ・デストラ・コピコンはヘッダーに内容を書いてるよ
0578デフォルトの名無しさん2010/08/27(金) 11:30:02
俺オペイコも
0579デフォルトの名無しさん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  ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
0580デフォルトの名無しさん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
0581デフォルトの名無しさん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
0582デフォルトの名無しさん2010/08/27(金) 23:32:16
gccの最適化オプションって、本当に吐き出されるバイナリが違うんだ
0583デフォルトの名無しさん2010/08/27(金) 23:53:42
むしろ違わない処理系を知りたい
0584デフォルトの名無しさん2010/08/28(土) 00:40:20
>>583
std::cout << "test" << std::endl;
くらいしか処理を書いていないのに、結構違うんだなーと思ったものでね
0585デフォルトの名無しさん2010/08/28(土) 00:48:39
最近のGCCはLTO可能になったんだっけ?
0586デフォルトの名無しさん2010/08/28(土) 05:43:47
>>581
関数呼び出しのオーバヘッドかな。
iccやgccの4みたいにオブジェクト間最適化ができたら差がなくなりそうだ。
0587デフォルトの名無しさん2010/08/28(土) 07:13:16
手元のVC10では同じになった
まあLTO可能なコンパイラなら当然か
05885812010/08/28(土) 11:31:38
gccのバージョンは4.4.3。4.5になるまで-fltoは認識しないみたい。
でもリンク時最適化ってコンパイル時と同じ最適化ができるのか?
0589デフォルトの名無しさん2010/08/28(土) 19:48:22
「処理系によります」
05905812010/08/28(土) 19:51:45
>>589
そう、では同じ最適化ができる処理系って何?知ってる限り教えて
0591デフォルトの名無しさん2010/08/28(土) 19:58:18
ヒマ人乙
0592デフォルトの名無しさん2010/08/28(土) 20:43:49
>>588
できないね。まあ仕方ないな。
0593デフォルトの名無しさん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
などという記述はちゃんとコメントアウトしてあります
0594デフォルトの名無しさん2010/08/29(日) 22:05:03
コンパイルエラーになる記述がなければコンパイルエラーにならない
0595デフォルトの名無しさん2010/08/29(日) 22:07:14
てか、別々のソースにインクルードしてるならエラーの出ようがないじゃん
ヘッダーでグローバル変数を定義してるとかアホなことをしてない限り
0596デフォルトの名無しさん2010/08/29(日) 22:13:57
インクルードガードは普通同じファイルを二度インクルードした際に宣言の重複を
させないためのもの。ヘッダからヘッダをインクルードしていると、これはよく
発生する。

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

[header2.h]
...

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

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

[header2.h]
...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

もっとも、テーブルゲームくらいならGDIでもいいんだろうけど
0639デフォルトの名無しさん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のみを使ってユニコードでの初期値代入する方法は無いのでしょうか?
0640デフォルトの名無しさん2010/09/03(金) 13:16:02
STLのstackとかdequeとか_で始まってないやつは正式に標準テンプレートライブラリの一部なんですか?
0641デフォルトの名無しさん2010/09/03(金) 13:27:20
stackとdequeは標準だが
strcpy_sは標準ではないのでその判断基準はだめだな
0642デフォルトの名無しさん2010/09/03(金) 14:17:35
>>639
TCHARまわりの知識に不安を感じるからTCHARや_UNICODEでよく調べてみろ。
VC使ってると仮定するけど、とりあえずはVCのプロジェクトのプロパティ→全般のあたりに
UNICODE関連の設定がないか調べてみろ。
0643デフォルトの名無しさん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と判断しました。
0644デフォルトの名無しさん2010/09/03(金) 14:45:17
ちなみに最短だと
tchar moji[100] = _T("お");
MultiByteToWideChar(CP_ACP,0,(char*)moji,-1,NULL,NULL);
という強引なキャストでいけるかなと試したのですが、なぜかこの場合変換されません。

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

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

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

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

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

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

という感じに要素を追加しようとするとエラーが出るんですが、
単純にポインタ型の動的配列って出来なかったりするんでしょうか?
0722デフォルトの名無しさん2010/09/09(木) 09:55:59
>>721
vectorに突っ込むのはできる
お前が別なとこで間違ってるだけ
0723デフォルトの名無しさん2010/09/09(木) 09:57:21
>>722
私の方のミスでしたか……
いろいろ試してみます!
ありがとうございました!
0724デフォルトの名無しさん2010/09/09(木) 12:03:11
1と01はコンピュータはどちらも1として扱うのでしょうか?
0725デフォルトの名無しさん2010/09/09(木) 13:08:03
状況次第
0726デフォルトの名無しさん2010/09/09(木) 16:54:13
C++のフリーコンパイラを教えてください?
というかみんな何使ってるんですか?
0727デフォルトの名無しさん2010/09/09(木) 16:55:32
Visual C++ 2010
0728デフォルトの名無しさん2010/09/09(木) 16:56:05
非公開の自作コンパイラ
0729デフォルトの名無しさん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
0730デフォルトの名無しさん2010/09/09(木) 19:24:13
>>729
forkは自プロセスを複製します
忍者みたいに自分が2人に分身するわけです
そうするとforkから戻ってきたときには自分が2人いるわけです
元々の親プロセスと、新しくできた子プロセス
親プロセスの方は、forkの戻り値が子のプロセスID (1以上) になります
子プロセスの方は、forkの戻り値が0になります
(エラーの場合は -1)
ここのサンプルだと、親の方は exit で終了して、子の方はそのまま close 以下略を実行するわけです
0731デフォルトの名無しさん2010/09/09(木) 19:25:01
>>729
質問の意図がよく分からない。
forkが知りたければ"マルチプロセス fork"あたりで検索を。
0732デフォルトの名無しさん2010/09/09(木) 19:37:32
Linuxだけで動けばいいならdaemon(3)があるよ
07337292010/09/09(木) 20:00:21
>>730
あぁ、自分を複製しているから、こんな奇妙な流れなんですね・・・。
直後のケース文含め、なぜこの流れなのかようやくわかりました。
どうもありがとうです。

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

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

>>734
恐ろしいですね・・・・。注意して使います・・・。
0736デフォルトの名無しさん2010/09/09(木) 23:11:36
>>726
g++(gcc) と bcc32 も併用しています。bcc32 はメッセージが日本語なのでわりと便利です。
0737デフォルトの名無しさん2010/09/09(木) 23:14:44
>>733
fork() をループに含ませてチャイルドプロセスを量産できます。パイプ機能のあるシェルをつくってみるのもいいでしょうね。
http://codepad.org/3H6b7xM6
0738デフォルトの名無しさん2010/09/11(土) 17:48:32
gccだったと思うのですが
スタック領域に動的確保できる関数があったと思うのですが何という名前だったでしょうか
使うわけではないのですが、思い出せなくて気になります
0739デフォルトの名無しさん2010/09/11(土) 17:57:58
calloc
0740デフォルトの名無しさん2010/09/11(土) 17:59:06
alloca
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/alloca.3.html
0741デフォルトの名無しさん2010/09/11(土) 18:03:38
非標準だから自分でスタック領域のアロケーターを作りなさい
0742デフォルトの名無しさん2010/09/11(土) 18:06:26
C99にその機能があるよ
0743デフォルトの名無しさん2010/09/11(土) 18:08:08
>>740
そうそれだありがとう
思い出せなっくてもやもやしてただけだったので、使う予定はないです
心配していただいてありがとうございます
大体gccなら可変長配列対応してるしね
0744デフォルトの名無しさん2010/09/11(土) 18:33:24
>>743
>742
0745デフォルトの名無しさん2010/09/11(土) 18:35:27
C99は非標準だろぶっちゃけると
0746デフォルトの名無しさん2010/09/11(土) 18:59:06
お前がそう思うんならそうなんだろ(ry
0747デフォルトの名無しさん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;
}
0748デフォルトの名無しさん2010/09/11(土) 23:56:07
set_a()とget_a()の入れ間違え。
0749デフォルトの名無しさん2010/09/11(土) 23:56:53
get
0750デフォルトの名無しさん2010/09/11(土) 23:57:06
笑わせるなー!
0751デフォルトの名無しさん2010/09/11(土) 23:57:48
バグは本人が気付かないからバグなんだよ!!!
0752デフォルトの名無しさん2010/09/12(日) 00:02:30
wwww
0753デフォルトの名無しさん2010/09/12(日) 00:41:03
雪駄と下駄の間違いか
0754デフォルトの名無しさん2010/09/12(日) 00:54:11
>>753
尊敬した
0755デフォルトの名無しさん2010/09/12(日) 01:02:05
>>753
誰うまw
0756デフォルトの名無しさん2010/09/12(日) 01:21:44
>>753
惚れた
0757デフォルトの名無しさん2010/09/12(日) 01:57:00
>>753
天才を見つけた
0758デフォルトの名無しさん2010/09/12(日) 01:59:15
自演乙
0759デフォルトの名無しさん2010/09/12(日) 02:18:25
>>758
いつもの2chで安心したw
0760デフォルトの名無しさん2010/09/12(日) 02:21:19
これは恥ずかしい自演
0761デフォルトの名無しさん2010/09/12(日) 03:02:16
でも自演じゃないんだぜっていう自演
0762デフォルトの名無しさん2010/09/12(日) 03:07:58
ということにしたいのですね(ヘミ略
0763デフォルトの名無しさん2010/09/12(日) 05:48:56
http://hibari.2ch.net/test/read.cgi/prog/1280211777/454-456
これも(ry
07647532010/09/12(日) 10:08:47
前からネタにしているのにこんなに反響を呼んで、正直驚愕している。

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

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

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

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

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

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

ならない。
07807772010/09/12(日) 22:52:34
>>778
>staticの有無とヘッダファイルに書くかどうかは直接関係ありません。
ここを、kwsk教えてください
2行目はOKです
0781デフォルトの名無しさん2010/09/12(日) 22:57:56
>>780
>779
07827772010/09/12(日) 22:58:20
>>779
static関数・変数はヘッダファイルに書かないのが常識なのですか
ありがとうございます/
0783デフォルトの名無しさん2010/09/12(日) 23:10:08
>>782
staticには静的領域って意味もあるけど、
そのソースファイルでしか使えないって意味もあって多分にこっちの方が重要。
(だからソース間での共通項を書くincludeファイルに書くことはまずない)
07847772010/09/12(日) 23:18:13
>>783
そういう意味だったのですか
わざわざ、すみません
0785デフォルトの名無しさん2010/09/13(月) 14:21:17
if( smd.nennrei == 07 || smd.nennrei == 08 ){
省略
}
を行うとeroor C2041 指定された文字8は基数8に適切な数字ではありませんとでます。
どうすれば良いでしょうか?
0786デフォルトの名無しさん2010/09/13(月) 14:22:11
07 → 7
08 → 8
にすればよいです
0787デフォルトの名無しさん2010/09/13(月) 14:25:29
無事できました。

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

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

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

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

こういうことか
0822デフォルトの名無しさん2010/09/14(火) 00:31:04
まとまってねえw
0823デフォルトの名無しさん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());
}
0824デフォルトの名無しさん2010/09/14(火) 00:50:23
>>821
だからループの中で srand() しなおす必要はない。精進せよ。
0825デフォルトの名無しさん2010/09/14(火) 00:52:44
>>824
勘違いしてた

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

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

この場合遅延評価されてメモリ確保されないことは保障される?
0835デフォルトの名無しさん2010/09/14(火) 15:26:28
格納するfooの領域なら確保しないけど
それは遅延評価とは呼ばないよ
0836デフォルトの名無しさん2010/09/14(火) 15:30:10
え、そうなんですか
今やらなくてもいいことを後回しにする(この場合プッシュされるまで確保しなくてもいい)のは全部遅延評価だと思ってました
0837デフォルトの名無しさん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() は評価されない
ってのが遅延評価
0838デフォルトの名無しさん2010/09/14(火) 20:48:38
入力チェックなどで、return文を使う事があると思いますが
あなたは1つの関数に何個までreturn文が許せますか?
0839デフォルトの名無しさん2010/09/14(火) 20:50:53
100こぐらい
0840デフォルトの名無しさん2010/09/14(火) 21:01:33
必要なだけの個数
0841デフォルトの名無しさん2010/09/14(火) 21:51:59
例外とassert使え
0842デフォルトの名無しさん2010/09/15(水) 00:04:25
>>838
なんこでも必要ならしかたがないでしょうね。
0843デフォルトの名無しさん2010/09/15(水) 00:48:58
個数よりも深さかな
0844デフォルトの名無しさん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();
}
0845デフォルトの名無しさん2010/09/15(水) 07:17:33
>>844
できますよ。
0846デフォルトの名無しさん2010/09/15(水) 07:18:35
>>844
できるよ
ただしdelete文を実行後はメンバ変数にアクセスしちゃいけなくなる
てゆーか delete thisもできる
0847デフォルトの名無しさん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();
  }
}
0848デフォルトの名無しさん2010/09/15(水) 07:44:33
配列の解放はdelete [] で行うだろ?
そういうことだ
0849デフォルトの名無しさん2010/09/15(水) 08:12:11
>>847
>new[]で確保したのは、一つずつ開放は無理で、delete[]で一気に開放しないといけないとか?

そうですよ。

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

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

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

当然、str*系の標準関数は使用できなくなる。文字列の定義が違うんだから当たり前だ。
0856デフォルトの名無しさん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の数を増やせばどんな文字列にも対応可能です
0857デフォルトの名無しさん2010/09/15(水) 14:45:37
>>853
>解決策としてはすべての文字列の最後尾に\0を付けて手動的に二連ヌルにするしか無いでしょうか

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

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

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

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

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

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

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

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

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

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

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

で、どこが便利なんだ?
0911デフォルトの名無しさん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では成功しているので基本的な設定は正しいはずです
0912デフォルトの名無しさん2010/09/17(金) 18:13:34
>>904
変数宣言もコンマ演算子で列記できるんだから
統一的な観点から仮引数も同じ型の場合コンマでつなげられればいいのに
0913デフォルトの名無しさん2010/09/17(金) 18:27:21
すみません。初心者です。
boost::vectorやboost::arrayなどの配列(固定にせよ、可変にせよ)
で、はじめは0なのですが、こちらをフレキシブルに、例えば1から始まるようにできませんか?
もしくはそのような機能を備えたコンテナなどありましたら教えてくださいませ。
0914デフォルトの名無しさん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<>の双方向リンクリストを使う
やりたいことと合致していればうれしい
0915デフォルトの名無しさん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;
}
0916デフォルトの名無しさん2010/09/17(金) 20:49:25
確かvbとか1から始まるんだっけ
0917デフォルトの名無しさん2010/09/17(金) 20:51:47
>>916
そんなことはないんじゃないか?
0918デフォルトの名無しさん2010/09/17(金) 21:19:06
VB は配列の先頭が 0 か 1 か選べる変態言語 (VB.NET では出来なくなった)
0919デフォルトの名無しさん2010/09/17(金) 23:36:20
そりゃバグの温床だからな

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

or

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

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

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

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

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

}
0934デフォルトの名無しさん2010/09/19(日) 00:38:37
そのプログラムは間違っている
long double は %Le を使え
0935デフォルトの名無しさん2010/09/19(日) 01:19:39
テンプレートクラスって通常のクラスとはほとんど別ものと考えていいですか?
ヘッダのクラス順序でこんがらがっていたのを(どこかに書いてあったとおりに)テンプレートクラスにしただけでほぼ解決しました
これってどういう仕組みなんでしょうか
(このテンプレートクラスは名ばかりのテンプレートクラスでテンプレート引数はまったく使っていませんし
最終的にはtypedefしてテンプレートであることさえも隠してます)
0936デフォルトの名無しさん2010/09/19(日) 01:23:29
「テンプレート」の意味を分かってないだろ
0937デフォルトの名無しさん2010/09/19(日) 01:36:23
どこが別物なのかわからん
クラスであることに変わりないのに
0938デフォルトの名無しさん2010/09/19(日) 02:12:22
すみません、ちょっと言葉足らずでした
コンパイルの側面から見るとまったく別の過程を通ってるような気がしたんです
例えばテンプレート関数は普通に推論された型の関数が量産されるだけらしいのですが(間違ってたらすみません)
テンプレートクラスでは上に書いたようにテンプレートであるただそれだけで
読み込み順序的に問題のあったコンパイルが通るようになる、
いわば関数のプロトタイプ宣言(ちょっと違うか)みたいな働きが確認されたんです
もちろんクラスの前方宣言やポインタでは解決できなかったクラス内部でも他関連クラスのメンバが入り組んだ問題でした
これはどこがどう変わったゆえなんだろうかと思ったんです
0939デフォルトの名無しさん2010/09/19(日) 02:31:54
テンプレートの宣言と実体化の時間差にたまたま助けられただけだろう
0940デフォルトの名無しさん2010/09/19(日) 02:44:23
文章の書き方から頭の悪さって滲み出て来るんだね
0941デフォルトの名無しさん2010/09/19(日) 02:54:21
>>939
確かに調べてみたらコンパイル時の時間差について書かれているのを見つけました
どうやらそこら辺が通常のクラスとは違うようですね、さらに調べてみます
09429332010/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;

}
0943デフォルトの名無しさん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]];
}
}
0944デフォルトの名無しさん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;
}
0945デフォルトの名無しさん2010/09/20(月) 12:34:15
reinterpret_castってどれ位処理時間がかかるんでしょう?
例えばキャスト以外は同じ内容の hoge(char* ptest)とhoge(void* ptest) という関数があり
後者は関数内でreinterpret_castでchar*に変換します
そうすると実行速度は遅くなるんでしょうか?
どこかでコンパイラ云々とあって変わらないようなことが書いてあったんですが
どちらか分からなくて
0946デフォルトの名無しさん2010/09/20(月) 12:41:14
実行時間の計測ですが以下の比較は正しいでしょうか?
time ./a.exe>1
time gpg --chipher-algo AES -z 0 -passphraze aaaaa -ca 1
0947デフォルトの名無しさん2010/09/20(月) 13:05:59
実行時間の計測ですが以下の比較は正しいでしょうか?
time ./a.exe>1
time gpg --chipher-algo AES -z 0 -passphraze aaaaa -ca 1
0948デフォルトの名無しさん2010/09/20(月) 16:23:01
>>944
printf("\x1b[4;1H");
のようなエスケープシーケンスはコマンドプロンプトでは動かないから別の方法でカーソル動かしてください
0949デフォルトの名無しさん2010/09/20(月) 16:56:45
>>945
迷ったら実測。
まぁ、そのケースなら観測するまでもなく最適化されたコードは同じになりそうだ。
0950デフォルトの名無しさん2010/09/20(月) 16:58:29
>>947
どこで比較しているのか判らない。
gpgというプロセスと等価のa.exeを作ったから処理時間を比較したいと言うことなら、
同じ入力に対して同じ出力が得られるように条件をそろえれば宜しかろ。
0951デフォルトの名無しさん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次元配列を動的に確保したい
っていうことなんですが

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

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

それかポインタのポインタとして擬似的に二次元配列を表現するしか無理
0954デフォルトの名無しさん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]
でごまかすのが無難かなぁ


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

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

num[get_num( i , j )]

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

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

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

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

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

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

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

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

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

>>976
卒論ではないですが、理解を深めるために
先輩がCで書いたものをC++で書き直せと言われました
ソフトの方がC++で書かれていて、GKClientProperty.hなどはソフトに入っているものです
プログラミング苦手なのですがそーゆー班に割り振られてしまって困ってます
0978デフォルトの名無しさん2010/09/21(火) 08:52:52
1から作り直したほうが早いと思う
0979デフォルトの名無しさん2010/09/21(火) 08:57:02
>>978
見てくださってありがとうございます
どーゆーことでしょうか?
0980デフォルトの名無しさん2010/09/21(火) 09:12:56
ひらがなを文字コードに変換する方法を教えてください。
0981デフォルトの名無しさん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;
}
0982デフォルトの名無しさん2010/09/21(火) 10:21:04
また突っ込み所満載のネタを・・・
0983デフォルトの名無しさん2010/09/21(火) 10:31:58
怖いよぉ
0984デフォルトの名無しさん2010/09/21(火) 11:05:53
  printf("%02x %02x\n", ch.code & 0x00FF, ch.code >> 8 & 0x00FF);

こんなことするなら int と union する意味が無い
エンディアン違う環境行ったらどうするつもりなんだ
0985デフォルトの名無しさん2010/09/21(火) 11:08:07

  ? &n ? ,オォウヲォ
 l~~~~~~~l
(C++) & (C++)     , i[N] == ??? ,
  /   \√  ~~~~~~~~~~~~~~~~~~~~~~~~
MmMmMmMmMmMmMmM
0986デフォルトの名無しさん2010/09/21(火) 11:10:08
みんな、スルー力を試されてるんだ。
0987デフォルトの名無しさん2010/09/21(火) 11:25:37
>>979
遣りたいことを先ず整理すること。
CのコードをC++に1vs.1に修正するのか0から書き直すのか最初の方針を決めること。
1vs.1に修正するなら先ずは動くことを最優先に、一つずつ修正する。
どんな話の流れでGKTimeDuration型を使うことになったのかがよく判らんが、
それを使うのなら1vs.1に修正するのは諦めた方がいい。
0988デフォルトの名無しさん2010/09/21(火) 11:50:37
今からやるならCかC++どちらがいいですか?
知識はC#,Actionscript,javascriptです
やりたい用途はDLL作成です
0989デフォルトの名無しさん2010/09/21(火) 11:57:57
C
0990デフォルトの名無しさん2010/09/21(火) 12:20:32
C++
0991デフォルトの名無しさん2010/09/21(火) 12:25:15
じーっ えー?
0992デフォルトの名無しさん2010/09/21(火) 12:28:03
C99
0993デフォルトの名無しさん2010/09/21(火) 12:28:50
>>988
どんな仕様のdllを作りたいかによる。
それによって自ずとCかC++のどちらかが決定される
0994デフォルトの名無しさん2010/09/21(火) 12:32:08
>>993
ありがとうございます
用途は秀丸エディタのマクロから利用するdllと変換モジュールの作成です
0995デフォルトの名無しさん2010/09/21(火) 12:41:10
C#でもええが
0996デフォルトの名無しさん2010/09/21(火) 12:48:35

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

胸がアツウなるな
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。