5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん: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/

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

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

ちょっとその記述だけだと、どのプロシージャでどのタイミングで投げられたどのメッセージを
受けているのかわかりにくいので、もうちょっと詳しく書いてくれるかソースを上げてくれれば見れるかも。

3 :デフォルトの名無しさん:2010/07/17(土) 02:06:54
smart_ptrの導入方法を1から10まで教えてください

4 :デフォルトの名無しさん:2010/07/17(土) 05:09:46
1.Visual C++ 2010をインストールする
2.#include <memory>をする
3.std::からスマートポインタを使う
4.
5.
6.
7.
8.
9.
10.C++から卒業する

5 :デフォルトの名無しさん:2010/07/17(土) 06:30:43
>>4
std::からどれを使えばいいのかわかりません

6 :デフォルトの名無しさん:2010/07/17(土) 07:59:07
std::tr1::unique_ptr
std::tr1::shared_ptr
std::tr1::weak_ptr


7 :デフォルトの名無しさん:2010/07/17(土) 08:13:02
ty

8 :デフォルトの名無しさん:2010/07/17(土) 08:49:32
そういやVC2010だとstd::unique_ptrって使えるんだよな
std::vector<unique_ptr<std::string>> str_vec;
っていうのが許されてて、便利になったもんだって感心したわ

9 :デフォルトの名無しさん:2010/07/17(土) 12:50:46
>>8
std::unique_ptrはstd::auto_ptrに似て破壊的セマンティックスなので
コンテナには入れられないよ

10 :デフォルトの名無しさん:2010/07/17(土) 12:52:48
std::shared_ptr
ならいいの?
boost::shared_ptrとどっち使ったらいいのかわからん

11 :デフォルトの名無しさん:2010/07/17(土) 13:09:59
std::tr1:shared_ptrならコンテナに入れられる

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

boost::scoptd_ptrがstd::unique_ptrとリネームされたようなので
boost::scoptd_ptrをぐぐるとよく動作がわかる

12 :デフォルトの名無しさん:2010/07/17(土) 13:10:39
unique_ptrはauto_ptrと違ってコンテナに入れられるんじゃないの?

13 :デフォルトの名無しさん:2010/07/17(土) 13:11:23
×scoptd_ptr
○scoped_ptr

まあわかるよな

14 :デフォルトの名無しさん:2010/07/17(土) 13:12:06
>>12
コピーが出来ないのでエラーになるよ
やってみ

15 :デフォルトの名無しさん:2010/07/17(土) 13:24:48
>>14
C++じゃ無理だ
すまんC++0xと勘違いしてた

16 :デフォルトの名無しさん:2010/07/17(土) 13:37:49
違いが分かんないようなレベルならとりあえずshared_ptr使っとけばいいよ
お前が思ってるほどオーバヘッドねーからさ

17 :デフォルトの名無しさん:2010/07/17(土) 15:00:33
引数で指定したファイルををsystem()使ってgrepする方法ってないでしょうか?

system("grep aaa argv[1]");みたいなイメージでargv[1]にちゃんとファイル名を入れたいんですが・・・

18 :デフォルトの名無しさん:2010/07/17(土) 15:12:10
>>17
キミは理解するまでsystem(3)利用禁止。

「何を理解するまでか?」それを含めて理解するまでだ。

19 :デフォルトの名無しさん:2010/07/18(日) 00:19:12
>>9
VC2010では可能だよ
まぁ0xの先取りなんだけどさ

20 :デフォルトの名無しさん:2010/07/18(日) 01:36:45
環境依存の話ここですんなよ

21 :デフォルトの名無しさん:2010/07/18(日) 22:50:20
constを付けると呼び出されるたびにその分処理が遅くなるのでしょうか

22 :デフォルトの名無しさん:2010/07/19(月) 00:03:26
constはコンパイル時に変数が変更されないかどうか調べるだけだから
気にしなくておk

23 :デフォルトの名無しさん:2010/07/19(月) 00:41:29
constを付けると最適化がかかりやすくなり速度アップするかもしれない

24 :デフォルトの名無しさん:2010/07/19(月) 10:12:34
C言語でテキストファイルから,patという文字列を検索して全てpatternという文字列に置換するプログラムを作りたいのですが,
下のプログラムだと,最初にpatがある行のpatだけ全て置換されてそれ以降の行のpatが置換されません。ポインタというものがあまり理解出来てないからだと思うんですけど,どうしたらいいでしょうか?
#include <stdio.h>
#include <string.h>
int main(int argc,const char*argv[]){const char FILENAME[]="C:/data.txt";
const char RESULTFILENAME[]="C:/result.txt";
const int LEN=100;
char line[LEN];
char src[LEN];
char *find="pat";
char *rep="pattern";
size_t find_len=strlen(find);
size_t rep_len=strlen(rep);
int shift=(int)(rep_len-find_len);
char *start=src;
char *hit;
FILE *dat;
FILE *result;
dat=fopen(FILENAME,"r");
while(fgets(line,LEN,dat)!=NULL){sscanf(line,"%s",src);
while((hit=strstr(start,find))!=NULL){
if(shift>0){memmove(hit+shift,hit,strlen(hit)+1);
}else if(shift<0){ memmove(hit,hit-shift,strlen(hit)+shift+1);
}start=hit+rep_len;
memmove(hit,rep,rep_len);
}fprintf(result,"%s\n",src);
}fclose(dat);
fclose(result);
return 0;}

25 :24:2010/07/19(月) 10:20:26
result=fopen(RESULTFILENAME,"w;")
が落ちていました。すみません。

26 :デフォルトの名無しさん:2010/07/19(月) 11:24:06
>>24-25
ttp://codepad.org/OxSQOoRw
とりあえず動くように書き換えてみたけど
もっと簡単に考えてみたらいいんじゃない?
2行目以降置換できなかった理由は
start=hit+rep_len; これ
最初の1行目はこれでいいんだけど
2行目以降
strstr(start,find) のstartが無効なアドレスを示して置換できないようになってる
sscanf(line,"%s",src); の後に
start = src; と入れればちゃんと動くかも

27 :24:2010/07/19(月) 11:47:23
>>26
回答ありがとうございます。
そういうことだったんですね。納得しました。
どちらも試しましたが,ともに正しく動きました。
本当にありがとうございました。

28 :デフォルトの名無しさん:2010/07/19(月) 14:01:48
>>17
sprintfをとりあえず理解してみようか
それ以前の問題のような肝するが

29 :デフォルトの名無しさん:2010/07/19(月) 16:00:18
vectorでvec1とvec2というのがあった場合、この2つを比較してそれぞれにしかいない要素を
別のvectorにそれぞれコピーする時って、地道にforで回すのが無難ですか?

関数(vec1, vec2, only_vec1, only_vec2);
vec1だけにしかないものをonly_vec1へコピー、
vec2だけにしかないものをonly_vec2へコピーしたい。

30 :デフォルトの名無しさん:2010/07/19(月) 16:37:11
1:要素数は同じか?
2:複数同じ要素が入っていたら全部消えるのか?
 A=5,5,5 B=5,5,4 の時only_aは5か、要素なしか
3:ソートしても問題はないか?


まぁ何するにもforは必要だと思うけど・・・

31 :デフォルトの名無しさん:2010/07/19(月) 16:54:09
あぁ、前提を書いてなかった。
vectorの要素数は同じ、各vectorには重複した要素は入っていない。
オリジナルのvectorの順序が入れ替わるのはまずい。
数回forを回せば分かるんで、もうこれでいいかな。

32 :デフォルトの名無しさん:2010/07/19(月) 17:03:26
こんなアルゴリズムがあった
set_difference   OutIt set_difference(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x)
ソート済みのfirst1からlast1にあって、ソート済みのfirst2からlast2にないものを、
xからのシーケンスにコピーしていきます。コピー後の末尾を指すイタレーターを返します

これを2回使えばできるんじゃないか?

33 :デフォルトの名無しさん:2010/07/19(月) 17:13:56
set_difference:一つ目の集合から二つ目の要素と一致しないものだけコピーする。
あ、あるもんなんだね…集合演算か、初めて見た。
>>32
ありがと。

34 :デフォルトの名無しさん:2010/07/19(月) 20:28:29
メモリマネージャを作っているのですがよく分かりません
参考になるページやソースなどはありませんか?

35 :デフォルトの名無しさん:2010/07/19(月) 20:37:42
>>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

36 :デフォルトの名無しさん:2010/07/19(月) 20:43:40
そいつマルチなんだから答えるなよ

37 :デフォルトの名無しさん:2010/07/19(月) 20:48:17
なんだよ。マルチかよしね。

38 :デフォルトの名無しさん:2010/07/22(木) 17:26:55
配列が引数にある関数に、呼び出すときに配列作って渡すこと出来る?

int hoge(int []); みたいな関数に
hoge({594,444,200});
みたいな。

39 :デフォルトの名無しさん:2010/07/22(木) 17:34:48
無理

40 :デフォルトの名無しさん:2010/07/22(木) 20:45:57
なんで、#includeは少ない方がいいんですか
暗黙的に#includeされるヘッダファイルは#includeした方がいいんでしょうか

41 :デフォルトの名無しさん:2010/07/22(木) 21:18:26
他のプロジェクトで使いたかったりしたときに
includeがいっぱいあるとめんどくさかったり

42 :デフォルトの名無しさん:2010/07/22(木) 21:23:50
>>38
template< class T, int N > class Arg
{
public:
  Arg( T val, ... )
  {
    this->array_[ 0 ] = val;
    va_list list;
    va_start( list, val );
    for( int i = 1; i < N; ++ i )
    {
      this->array_[ i ] = va_arg( list, T );
    }
    va_end( list );
  }
  operator T*(){ return this->array_; }
private:
  T array_[ N ];
};
hoge( Arg<int,5>(0,1,2,3,4) );

これでいいだろ


43 :40:2010/07/22(木) 21:26:49
>>41
ちなみに、これはどうなったのでしょうか
>暗黙的に#includeされるヘッダファイルは#includeした方がいいんでしょうか

44 :デフォルトの名無しさん:2010/07/22(木) 21:45:44
>>42
ためになるわ ありがとう

45 :デフォルトの名無しさん:2010/07/22(木) 21:46:32
いやいや使うなよ

46 :デフォルトの名無しさん:2010/07/22(木) 21:50:44
>>40
利用するライブラリ(API)のドキュメントに必要なヘッダーの一覧が書いてある。
必要なものだけインクルードすれば良い。不要なものはインクルードする必要は無い。

47 :40:2010/07/22(木) 22:16:25
>>46
まぁ、大体わかった気がする
サンクス

48 :デフォルトの名無しさん:2010/07/22(木) 23:16:02
すみません、
Media Foundationや、DirectX Video Accelarationの質問、話題は
どのスレでなされているでしょうか?

49 :デフォルトの名無しさん:2010/07/22(木) 23:25:01
DirectXのスレやWin32API等のスレの方が
少なくとも、C/C++のスレよりは適切なはず。

50 :48:2010/07/22(木) 23:26:41
>>49
ありがとうございました!

51 :デフォルトの名無しさん:2010/07/23(金) 11:37:24
VC2008では何の問題もなく通るコードがg++3.4.5 (mingw-vista special r3)では通りません.
構造体を外に出せばコンパイル出来るのですが内部においたままなんとかできないものでしょうか?

innner_struct.cpp: In function `int main()':
innner_struct.cpp:9: error: no matching function for call to `sort(int[10], int*, main()::cmp)'

#include <algorithm>
#include <iostream>

int main()
{
struct cmp { bool operator()(int a, int b) { return a < b; } };

int a[10] = { 3,1,4,1,5,9,2,6,5,3 };
std::sort(a, a+10, cmp());

for ( int i=0; i<10; i++ ) std::cout << ' ' << a[i];
};


52 :デフォルトの名無しさん:2010/07/23(金) 21:43:34
関数内で定義したクラスはテンプレートの引数に出来ないんだってさ。
VCは出来るように拡張してるっぽい。

53 :51:2010/07/23(金) 21:58:23
>>52
抜け道があるのかと期待したんですが・・・
ありがとうございます

54 :デフォルトの名無しさん:2010/07/24(土) 01:08:54
std::stringを戻す関数でchar *が戻せるのは何故ですか?

55 :デフォルトの名無しさん:2010/07/24(土) 01:12:42
例えばどんな関数よ

56 :デフォルトの名無しさん:2010/07/24(土) 01:54:32
>>54
std::string(const char *); というコンストラクタによって
暗黙の型変換が行われるから。

ただし、あくまで「stringに(暗黙的に)変換できる」だけであって
「char*を返す」わけではない。

57 :デフォルトの名無しさん:2010/07/24(土) 07:14:50
rand関数を初期化すると,次のコンパイルで初期化を行わない場合,先ほど初期化した際の値が出るのですか?

58 :デフォルトの名無しさん:2010/07/24(土) 08:25:35
runするたびに同じ順序が得られる。シミュレーションを再実行するとき便利だね。



59 :デフォルトの名無しさん:2010/07/24(土) 14:24:33
ありがとうございます

60 :デフォルトの名無しさん:2010/07/24(土) 16:10:15
C言語で、n次元(nは2〜5)配列を操作する関数が作りたいのですが、
引数は新しい配列dst、もとの配列src、各次元の要素数が格納された一次元n要素の配列numElem
を考えています。例えばsrc[a][b][c]ならnumElem[3]={a,b,c}といった感じです。
関数内で渡されたsrc配列の要素数を知るために(sizeof numElem)/(sizeof numElem[0])
としたのですが、下記の設定でsizeof numElemが12を期待しているのに8になってしまいます。
なにが間違っているのでしょうか?

#include <stdio.h>

void arrayConv(double *dst, const double *src, const int *numElem);

int main(void){
double *src,*dst;
int numElem[3]={2,3,4};
arrayConv(dst,src,numElem);
}
void arrayConv(double *dst, const double *src, const int *numElem){
int num;
num=(sizeof numElem)/(sizeof numElem[0]);
printf("%d\t%d\t%d\n",num,sizeof numElem,numElem[0]);
switch(num){
case 2:
break;
case 3:
break;
}
}


61 :デフォルトの名無しさん:2010/07/24(土) 16:32:14
arrayConv内のnumElemはポインタ。
だから、sizeofの結果はポインタのサイズだ。

62 :60:2010/07/24(土) 17:04:03
>>61
こんがらがってきました
numElemからは配列の大きさは得られないのでしょうか

63 :デフォルトの名無しさん:2010/07/24(土) 17:22:23
int numElem[3]={2,3,4};
sizeof numElem; // これは配列のサイズ取れる

const int *numElem;
sizeof numElem; // これはポインタのサイズ


64 :デフォルトの名無しさん:2010/07/24(土) 17:24:00
>>62
http://www.kouno.jp/home/c_faq/c6.html

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


引数にした瞬間に配列はポインタになっちゃって、ただの先頭アドレスと型の情報で、
要素数情報がないために関数内で要素数を得ることはできないということでしょうか

66 :デフォルトの名無しさん:2010/07/24(土) 19:51:03
class Class
{
const int i;
const char *c;
public:
Class();
};

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


なぜintは駄目なんですか?

67 :デフォルトの名無しさん:2010/07/24(土) 19:57:02
Class::Class() : i(1234), c("ok")
{}

constはこうして初期化しないとだめ、代入は出来ない。
charの方は
const char* const c;
こういうふうに書き直せ。

68 :デフォルトの名無しさん:2010/07/24(土) 21:11:29
ほんと汚物言語ですね

69 :デフォルトの名無しさん:2010/07/24(土) 22:09:42
汚物ではなくてプログラミングのうっかりミスを極力予め防止してんだよ
Cだとやってしまうような

70 :デフォルトの名無しさん:2010/07/24(土) 23:53:45
>>53
g++ 4.5.0で試してみたら通った。

71 :デフォルトの名無しさん:2010/07/24(土) 23:55:02
>>68
ふーん

72 :デフォルトの名無しさん:2010/07/25(日) 02:14:36
long long intの変数xをint型の変数a,bに分けて保存した後、再びlong long int型の変数yに入れたい。
x -> a,bは
a = x&0xffffffff;
b = x>>32;
って分かるけど
a,b -> yはどうやればいいの?

73 :デフォルトの名無しさん:2010/07/25(日) 02:22:43
y = b, y <<= 32, y |= a;

74 :デフォルトの名無しさん:2010/07/25(日) 02:44:04
なるほど ありがとう!

75 :デフォルトの名無しさん:2010/07/25(日) 06:50:51
>>69
初期化記法を汚物と言ってる。

76 :デフォルトの名無しさん:2010/07/25(日) 09:20:03
あっそ

77 :デフォルトの名無しさん:2010/07/25(日) 18:35:13
>>75
それはたしかに思う。

78 :デフォルトの名無しさん:2010/07/25(日) 18:41:15
一貫性が無いよね

79 :デフォルトの名無しさん:2010/07/25(日) 18:52:01
ロマンがあるわけよロマンが

80 :デフォルトの名無しさん:2010/07/25(日) 19:03:19
男のロマンといったらドリル兵器と自爆装置だ

81 :デフォルトの名無しさん:2010/07/26(月) 21:28:17
乱数の取得にはsrandとrandを使った方がいんですか?(c++)

82 :デフォルトの名無しさん:2010/07/26(月) 21:30:12
普通はそれでいいけど、boostにも乱数あるからよろしくな!

83 :デフォルトの名無しさん:2010/07/26(月) 21:38:19
このソースに自爆装置を仕込んだのは誰だぁ!!!

84 :デフォルトの名無しさん:2010/07/26(月) 22:47:25
くだらなすぎてスマソ

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

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

なんで、コンパイラに怒られるの?
コンパイラ怖い

85 :デフォルトの名無しさん:2010/07/26(月) 22:55:11
const charとunsignec charに互換性があってもconst char *とunsigned char *はそうでないとされているから

86 :デフォルトの名無しさん:2010/07/26(月) 22:55:12
unsignedつけなければコンパイル通るでしょ

87 :デフォルトの名無しさん:2010/07/26(月) 22:56:36
>>86
今度はきっとAES_set_encrypt_keyの第3引数がunsigned char *だな
const unsigned char []で乗り切れ

88 :デフォルトの名無しさん:2010/07/27(火) 02:21:40
>>81
めるせんぬついすたーつかえ

89 :デフォルトの名無しさん:2010/07/27(火) 08:26:29
メルセンヌツイスターはもう古い

90 :デフォルトの名無しさん:2010/07/27(火) 09:45:09
int a = 5;
int b = a * 1024 * 1024;
このとき1024 * 1024はコンパイル時に計算されますか?

91 :デフォルトの名無しさん:2010/07/27(火) 09:59:01
>>90
コンパイラによる

92 :デフォルトの名無しさん:2010/07/27(火) 10:02:36
>>91
やはりそのような感じですか・・・ありがとうございます

93 :デフォルトの名無しさん:2010/07/27(火) 10:14:08
>>92
アセンブラコードを見るのが普通と思うが
const int a;にした上で
C++でとにかくコンパイル時に計算されればいいってんならテンプレートでやりよう自体はあるが


94 :デフォルトの名無しさん:2010/07/27(火) 10:19:44
現実的にはその程度の定数畳みこみを行わないコンパイラを探すのは困難。

95 :デフォルトの名無しさん:2010/07/27(火) 10:23:06
>>94
だけど規格ではそれは定められていないよね?

96 :デフォルトの名無しさん:2010/07/27(火) 10:32:44
ふむふむ・・参考になります
とりあえず、
int a = 1024 * 1024;
int b = a * 1024 * 1024;

; Line 10
mov DWORD PTR _a$[ebp], 1048576 ; 00100000H
; Line 11
mov eax, DWORD PTR _a$[ebp]
shl eax, 10 ; 0000000aH
shl eax, 10 ; 0000000aH
mov DWORD PTR _b$[ebp], eax
こうなりました
とりあえずコードによっても環境によってもかわるみたいですね。。

97 :96:2010/07/27(火) 10:35:49
あ、環境かかなければだめでした
visual C++ 2010 Express
です

98 :デフォルトの名無しさん:2010/07/27(火) 11:16:37
>>94
はぁ?
計算の順序を勝手に入れ替えることの意味わかってないんじゃない?
値によっては回り込みが起きて、全く違う答えになるんだよ。

まともなコンパイラならこういう最適化を行わないか、
オプションの切り替えで制御するのが普通。

99 :デフォルトの名無しさん:2010/07/27(火) 11:42:29
値が変わるような順序変更を行うコンパイラがまともに構文解析できるとは思えないが

100 :デフォルトの名無しさん:2010/07/27(火) 11:46:35
>>98
どこの星の普通かしらないけど
たとえばgccならなんてオプション?
自分の使ってるコンパイラでもいいぞ

101 :デフォルトの名無しさん:2010/07/27(火) 12:31:03
>>98
> 計算の順序を勝手に入れ替えることの意味わかってないんじゃない?
> 値によっては回り込みが起きて、全く違う答えになるんだよ。
int b = a * 1024 * 1024;
これで畳みこみを行った場合と行わなかった場合で結果が異なるaの値を具体的に示してから、
言いがかり付けるんだな。

102 :デフォルトの名無しさん:2010/07/27(火) 12:45:40
>>98
> まともなコンパイラならこういう最適化を行わないか、
> オプションの切り替えで制御するのが普通。
gccってまともなコンパイラじゃなかったのか。www

$ gcc -v
gcc version 4.2.1
$ cat 92.c
void f()
{
int a = 5;
int b = a * 1024 * 1024;
}
$ gcc -O0 -S 92.c
.globl f
.type f, @function
f:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $5, -8(%rbp)
movl -8(%rbp), %eax
sall $20, %eax
movl %eax, -4(%rbp)
leave
ret

103 :デフォルトの名無しさん:2010/07/27(火) 13:11:10
変えたら結果がが変わるかは知らんが
その検証するのに-O0ってのはどうなのよ・・・・


104 :デフォルトの名無しさん:2010/07/27(火) 13:14:13
「デフォルトで最適化してるんだろ」という言いがかりを封じるためだよ。頭悪いぞ。
-O0 Do not optimize. This is the default.

105 :デフォルトの名無しさん:2010/07/27(火) 13:28:44
ところで
テンプレートでどうにかする方法ってどんなのなん?


106 :デフォルトの名無しさん:2010/07/27(火) 14:44:46
それより
>>98
> 計算の順序を勝手に入れ替えることの意味わかってないんじゃない?
> 値によっては回り込みが起きて、全く違う答えになるんだよ。
この実例まだ〜〜〜?

107 :デフォルトの名無しさん:2010/07/27(火) 16:13:05
>>106
a が double で 1024 がもっと大きな数だとまずいんじゃない?
そのときも同じように最適化が起きるんだったらコンパイラとしては問題あるよね。

108 :デフォルトの名無しさん:2010/07/27(火) 16:16:41
そんな三分で考えたような脆弱性に対応できてないコンパイラとか産廃だろ

109 :デフォルトの名無しさん:2010/07/27(火) 16:23:55
>>108
gcc ってまともなコンパイラじゃなかったんですねw

110 :デフォルトの名無しさん:2010/07/27(火) 16:24:31
gccなんか要らん

111 :デフォルトの名無しさん:2010/07/27(火) 17:06:14
c言語にはelseif(スペースなし)がありませんが、
#define elseif else if
とやってelseifを使うと何か問題ありますか?

112 :デフォルトの名無しさん:2010/07/27(火) 17:17:35
>>107
池沼なのにPGやってるお前の方がよっぽど問題あるわ。www

113 :デフォルトの名無しさん:2010/07/27(火) 18:10:04
>>111
問題ない。
まぁ厳密にはインデントが変わってくるが、動作には影響しない。
つか else if と書いても elseif のようにインデントしてる人が多いわな。

>>112
この人は何に対して切れてるんだろうw

114 :デフォルトの名無しさん:2010/07/27(火) 21:18:32
>>111
しいて言えば、エディタが色を変えてくれない

115 :デフォルトの名無しさん:2010/07/27(火) 21:22:30
else if でも elseif でも黒色だけど・・・

116 :デフォルトの名無しさん:2010/07/27(火) 21:23:52
#define elseif else if

こんなことは絶対にするな。絶対だぞ。
defineなんてifdef用以外に使うな。

117 :デフォルトの名無しさん:2010/07/27(火) 21:29:20
なかなか低機能なエディタを使っているようだな・・・
そういうのも嫌いじゃないが
苦労は買ってでもしろと言うしな

118 :デフォルトの名無しさん:2010/07/27(火) 22:34:19
>>116
#define for if(0) else for

119 :デフォルトの名無しさん:2010/07/27(火) 22:35:37
さすがにもうVC6は無いだろうと思いたい

120 :デフォルトの名無しさん:2010/07/27(火) 23:16:47
VC6使ってる奴って本当に馬鹿なんだろうな

121 :デフォルトの名無しさん:2010/07/28(水) 00:29:30
>>111
一人でやってるなら問題ないけど、バカっぽく見えるからやめたほうが
いい。

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



122 :デフォルトの名無しさん:2010/07/28(水) 00:35:37
お前らまさかマクロとか使ってないよな?

123 :デフォルトの名無しさん:2010/07/28(水) 00:41:13
使うだろ普通

124 :デフォルトの名無しさん:2010/07/28(水) 00:43:25
どんなマクロよ

125 :デフォルトの名無しさん:2010/07/28(水) 00:56:28
MAKEWORDとかRGBとか

126 :デフォルトの名無しさん:2010/07/28(水) 00:58:37
inline関数じゃだめなんか

127 :デフォルトの名無しさん:2010/07/28(水) 03:48:47
C++の場合
複数環境対応とデバックマクロで使用する
Cの場合は定数等含めて結構マクロは使用する

128 :デフォルトの名無しさん:2010/07/28(水) 08:27:30
定数マクロ使ってる奴ってキチガイだろ

129 :デフォルトの名無しさん:2010/07/28(水) 08:59:14
>>121
タイプを減らすためでなく、インデントの問題だろ。
else if ごとに一段下げたりしたくないだろ。
けど、構文的には下げるのが正しいんだから。
これは俺も気持ち悪い。

130 :デフォルトの名無しさん:2010/07/28(水) 12:55:57
構文的にインデントの正解などない。だから流儀が複数ある。
elseとifの間に{なし、改行すらなし。これで一段下げなんて普通しない。

131 :デフォルトの名無しさん:2010/07/28(水) 14:25:54
>>130
それは else if を elseif とみなしてインデントをつけているに他ならない。

132 :デフォルトの名無しさん:2010/07/28(水) 14:33:35
else ifってelse { if〜〜 } の略系だったのか
オラ初めて気づいたぞ

133 :デフォルトの名無しさん:2010/07/28(水) 14:53:27
>>132
そんなわけない

134 :デフォルトの名無しさん:2010/07/28(水) 14:57:21
>>132
正解

>>133
池沼

135 :デフォルトの名無しさん:2010/07/28(水) 15:06:09
if ()
else if () ←これが出来なくなるじゃん
else

136 :デフォルトの名無しさん:2010/07/28(水) 15:07:37
>>131
それで問題ないのだからelseifいらね

137 :デフォルトの名無しさん:2010/07/28(水) 15:10:55
>>135
それは
if () {
} else { if ()
else
}
と書いたのと同じ。コンパイラはそう解釈してるんだよ。

if() や else の次にくるのは、一つの文かまたは { } で囲まれた一つのブロックなんだよ。

138 :デフォルトの名無しさん:2010/07/28(水) 15:15:28
if (a < 0)
  b = 0;
else if (a < 10)
  b = 1;
else if (a < 20)
  b = 2;
else
  b = -1;

と書くのは間違いで、(もちろん動作は問題ない)
構文に即した厳密なインデントなら

if (a < 0)
  b = 0;
else
  if (a < 10)
    b = 1;
  else
    if (a < 20)
      b = 2;
    else
      b = -1;

が正しいということか。。。

139 :デフォルトの名無しさん:2010/07/28(水) 15:20:58
>>138
正解

140 :デフォルトの名無しさん:2010/07/28(水) 15:35:51
そういうこと

141 :デフォルトの名無しさん:2010/07/28(水) 15:36:55
どういうこと

142 :デフォルトの名無しさん:2010/07/28(水) 15:44:37
つまりelse ifは現代的なコンパイラにおいては[else if]で解釈されているということ

143 :デフォルトの名無しさん:2010/07/28(水) 15:48:31
>>142
少なくとも else if を elseif と見なすようなことはしてないよ。
つまり if 文の入れ子として処理している。それは昔も今も同じ。

144 :デフォルトの名無しさん:2010/07/28(水) 15:56:22
switchは?

145 :デフォルトの名無しさん:2010/07/28(水) 17:08:37
>>144
もちろん switch は入れ子でなく対等な分岐

146 :デフォルトの名無しさん:2010/07/28(水) 17:27:36
順番があるので対等ではない。

147 :デフォルトの名無しさん:2010/07/28(水) 18:39:51
あれは単なるラベル。

148 :84:2010/07/28(水) 20:16:51
>>85-86
どれにしても、コンパイルが通らないんですけど...

149 :84:2010/07/28(水) 21:38:41
#include <openssl/aes.h>

int main()
{
const unsigned char userKey[] = "key";
AES_KEY key;

AES_set_encrypt_key(userKey, 256, &key);

return 0;
}

よくわからない、スマソ

150 :デフォルトの名無しさん:2010/07/29(木) 09:42:35
>>149
const unsigned char* userKey = (const unsigned char*)"key";

151 :デフォルトの名無しさん:2010/07/29(木) 10:54:01
MicroSoft FlightSimulator Xのアドオン開発のスレって立ったことある?
やはり、あまり需要ないのだろうか?
或いは、ゲームのアドオン開発に関するスレがあれば誘導お願いします

152 :151:2010/07/29(木) 11:00:51
すみません、フライトシム板にて発見しました。
スレ汚しゴメン

153 :デフォルトの名無しさん:2010/07/29(木) 11:35:46
for文の中でリテラルな何かが登場したら無駄な負担になるんですか?

154 :デフォルトの名無しさん:2010/07/29(木) 11:45:24
>>153
それなりのところではそれなりにそうなる

155 :デフォルトの名無しさん:2010/07/29(木) 16:04:04
かなり初心者なんだけど質問いいかい?…
猫CのC++第八章のクラスの話がわからん。
http://www.kumei.ne.jp/c_lang/cpp/cpp_08.htm

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

main関数にデストラクタなんて書かれてないけど?どうして?これって勝手に呼ばれるの?

156 :デフォルトの名無しさん:2010/07/29(木) 16:07:22
>>155
クラスが消えるときに勝手に呼ばれる関数だからだよ

157 :デフォルトの名無しさん:2010/07/29(木) 16:10:37
>>156
やっぱりそうなんだ!ありがとう!早い回答で助かった

158 :デフォルトの名無しさん:2010/07/29(木) 16:42:57
>>89
メルセンヌツイスターは確かに古いが、
越えるものは出てきたっけ?

159 :デフォルトの名無しさん:2010/07/29(木) 16:59:01
>>158
非拡散楕円シェルピンスキー法

160 :デフォルトの名無しさん:2010/07/29(木) 16:59:39
eclipse CDTのスレってなくなっちゃったの?
もう誰も使ってないのかしら。

161 :デフォルトの名無しさん:2010/07/29(木) 17:16:10
vectorのメモリ消費量についてですが、
vector<int>とやるとintは4bytesなので、
4bytes x サイズ分のメモリを使うと思っていたのですが、

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

環境はlinux g++ 4.4です。



162 :デフォルトの名無しさん:2010/07/29(木) 17:17:06
配列つかえ

163 :デフォルトの名無しさん:2010/07/29(木) 17:23:44
>>158
SFMT

164 :デフォルトの名無しさん:2010/07/29(木) 17:29:22
>>161
調べ方が悪い

165 :デフォルトの名無しさん:2010/07/29(木) 17:46:14
>>164
そうですか?
valgrind下で走らせてalloc,free値を見たのですが、見方が違うのか

166 :デフォルトの名無しさん:2010/07/29(木) 21:12:06
使う前にresize(1)とかやればいいんじゃないの?

167 :84:2010/07/29(木) 21:49:09
>>150
レスありがとうございます

>main.c::-1: error: undefined reference to `AES_set_encrypt_key'
やっぱり、怒られます
もしかして、gccの設定が悪いのかもしれませんorz

168 :デフォルトの名無しさん:2010/07/29(木) 22:22:01
配列とポインタは全然別なものってことでおk?

でも、配列Array[]をArrayと書くと、Array[0]のアドレスが返ってくるだけってことだよね

169 :デフォルトの名無しさん:2010/07/29(木) 22:23:22
ok

170 :168:2010/07/29(木) 22:35:00
>>169
thx

171 :デフォルトの名無しさん:2010/07/29(木) 22:35:19
ng

172 :デフォルトの名無しさん:2010/07/29(木) 22:52:35
>>168
ぜんぜん違うけど密接に関わるものってことかな
int Array[10];
int* p = Array;

p[3] = 100;//添え字アクセス
*p = 200;//ポインタを使ってアクセス
*(p + 3) = 300;//ポインタ演算でのアクセス
こんな風に使える
使えるというだけで別なもの

173 :168:2010/07/29(木) 23:00:18
>>172
つまりはアクセスできるってだけのことなのね

174 :デフォルトの名無しさん:2010/07/29(木) 23:54:10
詰んでいて質問です、緊急でお願いします。


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

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

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


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

誰か教えてください。

175 :デフォルトの名無しさん:2010/07/29(木) 23:56:13
同じもんだよ
ただ、利便性のために若干仕様が分けられてる
[]ってのは単純にp+1とかをオーバーロードしてるだけだし

176 :デフォルトの名無しさん:2010/07/29(木) 23:58:58
ダウンキャストしてる部分を晒せよ

177 :デフォルトの名無しさん:2010/07/30(金) 00:09:26
hoge* se = NULL;

// コアをチェック
ObjectContiner::iterator itr = mObjectContiner[OTHER].begin();
for( ; itr != mObjectContiner[OTHER].end() ; ++itr )
{
if( (*itr)->getData().Attribute == DP_IDEND )
{
// ここでC2682 shared_ptr からhoge*に変換出来ない。
se = dynamic_cast<hoge*>( (*itr) );
}
}

こんな感じです。
std::listの中にhogeObjectのスマートポインタがが入ってます

178 :デフォルトの名無しさん:2010/07/30(金) 00:15:22
>>177です。

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

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

関数を見落としていました。
お騒がせしました

179 :デフォルトの名無しさん:2010/07/30(金) 00:15:58
itr->get()


180 :デフォルトの名無しさん:2010/07/30(金) 18:06:12
VC++2010使ってるんですがデバッグして出たソフトを終了すると
Alloc memory dump
Total size:0(0.000kb) Alloc num:0
みたいなものが出ます。これは何を表しているのでしょうか?
Alloc memory dumpでggってみましたが出るのはエラー相談の掲示板ばかりで・・・

181 :デフォルトの名無しさん:2010/08/01(日) 14:01:32
#include <stdio.h>
#include <conip.h>
#include <stdlib.h>
#include <windows.h>
int main(int argc,char *argv[]){unsigned int count = 0;unsigned int i;char **list;
if((list = malloc(100*1024)) == NULL){return 1;}
while(1){
for(i = 1023;i > 0;i--){if((list[count] = malloc(1024)) != NULL){count++;}else{ break;}}
if(i != 0)break;if(count > 100000)break;Sleep(1);
}
putchar('\n');count--;printf("Count:%d\n",count);
for(i=0;i < count;i++){
int j;
for(j = 0;j < 1024;j++){list[i][j] = 'A' + i%26;}printf("%X ",list[i]);
}
printf("\nExit:");return 0;
}
なんか落ちる…

182 :デフォルトの名無しさん:2010/08/01(日) 14:08:36
listが100KiBしか確保されてないのにcount最大値100000要素×4バイト=400KBまで使おうとするからじゃないかと思います

183 :デフォルトの名無しさん:2010/08/01(日) 19:08:42
>>180
VSスレに書き込めよ
ちなみにそれはメモリリークが存在しないことを表してる 至って正常ということ

184 :デフォルトの名無しさん:2010/08/01(日) 22:36:44
やっぱり、いくら考えてもわからん(c++)

#include <openssl/aes.h>
int main()
{
unsigned char user_key[16] = "123456";
AES_KEY key;

AES_set_encrypt_key(user_key, 128, &key);
return 0;
}

>main.c::-1: error: undefined reference to `AES_set_encrypt_key'
>:-1: error: collect2: ld はステータス 1 で終了しました

185 :デフォルトの名無しさん:2010/08/01(日) 22:48:13
ちゃんとリンクさせてるか?

186 :184:2010/08/01(日) 22:53:44
>>185
IDEに頼り切っていたので、やり方がわかりません
gcc v4.4.3、opensslは/usr/includeにあります
ごめんなさい

187 :デフォルトの名無しさん:2010/08/01(日) 22:56:53
math.hだったら
-lm ってオプションいるだろ?(最近は無くてもいけるけど)そういうことだ
それの名前がわからん
でも/usr/libにはあるはず
もしくはそのライブラリの説明どっかにないのか

188 :デフォルトの名無しさん:2010/08/01(日) 23:01:24
たぶん -lssl か -lopenssl か `pkgconfig --libs ssl` か `pkgconfig --libs openssl` のどれかでいけるんじゃないかな

189 :デフォルトの名無しさん:2010/08/01(日) 23:03:35
エディットボックスの読み取り専用にして文字出力して、画面サイズ
可変可能でサイズを小さくした時、例ですが"○○ a"という文字を普通に
出力する時はいいのですが、段を分けて出力する時
○○このようにスペース空けてaを出力すると思ったのですが実際は
a
○○このようにスペース空けずにaを出力してしまいました。
a
charをメンバ変数CString型にコピーして出力しますが、ずれずに出力
するか、ずれたデータをchar形にコピーする方法は有りますか?

190 :デフォルトの名無しさん:2010/08/01(日) 23:08:03
189の上か5行目スペース入れたのに入りませんでした。

191 :デフォルトの名無しさん:2010/08/02(月) 08:39:05
189-190 自己解決しますた。

192 :デフォルトの名無しさん:2010/08/02(月) 10:24:54
>>189-190
恐らく>191は他人でしょうから、あなたのお使いの開発環境を明らかにした上で
該当スレに書き込むか、エスパースレにどうぞ。

193 :184:2010/08/02(月) 22:01:16
>>187-188
わかりました
調べてみます

194 :184:2010/08/02(月) 22:57:02
>>188
-lsslをつけたらコンパイルする事ができました
ありがとうございます

ところで、何故そのようなオプションをつけないと、コンパイルできないんですか?
-lsslってオプションはgccにデフォルトでは存在しないと思うのですが

195 :デフォルトの名無しさん:2010/08/03(火) 00:39:16
戯言はgccのマニュアル見てから言いなさい。

196 :デフォルトの名無しさん:2010/08/03(火) 01:41:56
>>183
コンパイラーによって表示されるものなのかどうかわからなかったもので・・・
問題ないんですね。ありがとうございました

197 :デフォルトの名無しさん:2010/08/03(火) 12:03:34
-l と ssl で -lssl

198 :デフォルトの名無しさん:2010/08/03(火) 21:22:31
>>197
thx

199 :デフォルトの名無しさん:2010/08/03(火) 21:48:16
構造体のメンバの配列の要素数をコンパイル時以降に決定したいのですが、どのようにしたら良いのでしょうか。
-----------------
FortranからCの関数を呼ぶときに、FortranのFortran の名前付き COMMON は、大域的構造体を使用して C の中で代替できるそうです。
Fortranのソースに
integer, parameter:: N=10
real(4):: x(N), y(N), z(N)
COMMON /VEC/ x,y,z

Cのソースの一番外側に
extern struct vec {
float x1[10];
float y1[10];
float z1[10];
} vec_;
と書くと、確かにCでvec_.x1[0]でFortranの
x(1)にアクセスできました。
この要素数10をC言語側では動的に(?)決めたいのですが、どのように記述すれば良いのでしょうか。
よろしくおねがいします。

200 :デフォルトの名無しさん:2010/08/04(水) 00:32:17
>>199
メモリの動的確保でやるなら

struct vec {
 float* x1;
 float* y1;
 float* z1;
};

struct vec* NewVec(int n){
 size_t sz = sizeof(struct vec) + sizeof(float) * 3 * n;
 struct vec* v = (struct vec*)malloc(sz); // キャストのツッコミはなしで
 v->x1 = v + 1;
 v->y1 = v->x1 + n;
 v->z1 = v->y1 + n;
 return v;
}



struct vec* v = NewVec(10); でベクトル作成
v->x1[0] = 1.0; または (*v).x1[0] = 1.0; でアクセス
free(v); で後始末


201 :デフォルトの名無しさん:2010/08/04(水) 01:31:16
まずいんじゃね?FORTRANのCOMMON変数が確保されるのは
スタック上だとしてヒープ領域と一緒にしていいのか

202 :デフォルトの名無しさん:2010/08/04(水) 07:48:13
DWORDの0Lって何のことですか?longをtypedfしたようなのは見たのですがわかりません
それと、ファイルから読み取って変数に入れていくようなプログラムで
NULLで初期化?できるような構造体にNULLを入れたいのですがどうすれば良いのでしょうか?もしかしてイント型の0でできる?ちなみにfscanfとかfget系の処理の仕方しかわかりません。よろしくお願いします

203 :デフォルトの名無しさん:2010/08/04(水) 08:02:29
={0};

204 :デフォルトの名無しさん:2010/08/04(水) 08:03:40
{}ってどういう意味ですか?

205 :デフォルトの名無しさん:2010/08/04(水) 08:19:10
つまり構造体の値について記述しています

206 :デフォルトの名無しさん:2010/08/04(水) 08:39:10
>>199
・COMMONの大きさは動的に代えられないからだめ。
・ポインターが使える処理系もある。
Fortranスレに行きなさい。

207 :デフォルトの名無しさん:2010/08/04(水) 09:06:31
さすがにそのレベルの質問は無いわ…
チュートリアルからやり直して下さい

208 :デフォルトの名無しさん:2010/08/04(水) 09:27:51
>>207
独り言ならついったーで。

209 :デフォルトの名無しさん:2010/08/04(水) 09:29:59
自演乙

210 :デフォルトの名無しさん:2010/08/04(水) 09:39:05
天下のついったーがこんな場末の掲示板で自演宣伝するわけないじゃない。バカ?

211 :デフォルトの名無しさん:2010/08/04(水) 09:40:59
某スレで煽られて
顔真っ赤の涙目になっちゃって悔し紛れにコピペした臭い

212 :デフォルトの名無しさん:2010/08/04(水) 09:44:20
         ____   
       / /  \\      
.     / (;;..゜);lll(;;..゜)\ このガキャあああああああ
    /   ⌒(__人__)⌒ \    ナメてんのかああああfさdkjh;flsだhf
    |  ノ(  |r┬- | u  | ________    
     \ ⌒  |r l |    / .| |          |
    ノ  u   `ー'    \ | |          |  真剣に聞いてんのに
  /´                .| |          |  煽ってんじじゃねええええ
 |    l      プルプル u  | |          |
 ヽ u  -一ー_~、⌒)^),-、   | |________|
  ヽ ____,ノγ⌒ヽ)ニニ-___| |  |____

213 :199:2010/08/04(水) 10:35:05
>>200
ありがとうございます。やってみます。
>>201
Cで構造体で代替しようという考え自体がまずいということでしょうか?

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

もともとあるFortranのプログラムをいじってCの関数を呼び出して使うようにしたいのですが
C側で使う変数が多くて引数にするの大変です。 元々COMMON文が多用されていたので
Cに持ってきて使えたらなぁ、と思い調べました。

214 :デフォルトの名無しさん:2010/08/04(水) 10:54:11
>>213
つまり、Fortran側で確保している領域にCからアクセスしたいという事だね。
>>206は忘れてくれ。

> Cの方はコンパイルに少し特殊な環境が必要なので一度コンパイルしたら使い回したいという考えです。
オブジェクトを使いまわすという事? リンクは必要だよ。


extern float vec_;
struct vec {
 float* x1;
 float* y1;
 float* z1;
} vec;

void initialize(int n)
{
vec.x1 = &vec_
vec.y1 = &vec_ + n;
vec.z1 = &vec_ + n*2;
}


215 :デフォルトの名無しさん:2010/08/04(水) 10:54:17
>>213
FORTRANの呼び出され側の関数がCOMMON引数をどのように受け取るように
なっているかが問題

普通連続したメモリ領域が必要なんじゃないのか?
Cのポインタなんか使ったらあっちこっちにアドレスが飛んでだめだと思うが

216 :デフォルトの名無しさん:2010/08/04(水) 10:57:25
構造体の中に不確定な配列のメンバを持ちたいのですがどうすれば良いですか?
イメージとしてはこんな感じです
struct hoge{
int a;
char b[a];
};


217 :デフォルトの名無しさん:2010/08/04(水) 11:01:50
>>216
struct hoge {
int a;
char b[1];
}

struct data *dp;

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

汚いテクニックでしかも規格では未定義の動作とされているが
よく使われる


218 :デフォルトの名無しさん:2010/08/04(水) 11:03:01
>>217
ありがとうございました

219 :デフォルトの名無しさん:2010/08/04(水) 11:12:14
C99ならflexible array memberを使えばいい。

struct hoge{
int a;
char b[];
};

220 :デフォルトの名無しさん:2010/08/04(水) 11:19:23
VC2008EEです

221 :デフォルトの名無しさん:2010/08/04(水) 11:23:41
VC2008ならgccと同じくchar b[0];が使える。

222 :デフォルトの名無しさん:2010/08/04(水) 11:27:56
VC2008はC99に対応してないと聞いていたが、flexible array memberは使えるようだ。

223 :デフォルトの名無しさん:2010/08/04(水) 11:34:14
>>221
どういうことでしょうか?普通にメンバにchar[]を入れるとstruct 'hoge" にサイズが 0 の配列があります。というエラーがでます
少しググってみたのですがcharは最後の要素ではなくてchar c[a];char d[a];も実はありまして…
char b[1]の方もやってみると
ho = malloc(sizeof(hoge) + sizeof(a)*3);
void *' から 'hoge *'に変換できません とエラーが出ます。どうすれば良いのでしょうか?


224 :デフォルトの名無しさん:2010/08/04(水) 11:39:59
>>223
hogeなんて構造体が無いからだろ。バカか。
struct hogeとhogeの区別もつかないのか。市ねよ。

225 :199:2010/08/04(水) 11:40:31
>>214
その方法でできました。ありがとうございます!

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

>>215
どうなんでしょう。とりあえずはできたので
実際の大きいプログラムで試してみます。

226 :デフォルトの名無しさん:2010/08/04(水) 11:46:52
>>224
ちょwひどすぎwww
struct hogeとhogeの違いって何のこと言ってるかわかりません…
struct hoge {
int a;
char b[1];
}
struct hoge *dp;
dp = malloc(sizeof(hoge) + a*3); <-可変長のデータ長を足して確保
どこがおかしいのでしょう?

227 :デフォルトの名無しさん:2010/08/04(水) 11:48:15
>>223
#include <stdlib.h>
struct a {
int a;
char b[];
};

struct a *aaa(int l)
{
return malloc(sizeof(struct a) + l);
}
これを
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
で、コンパイルするとエラー出ないけど。

> char c[a];char d[a];も実はありまして…
複数は無理。似たような事をやるなら

struct hoge {
int a;
char *b;
char *c;
char *d;
char data_[];
};
でb,c,dにdata_から切り出して与える。
b,c,dを使わず、マクロで直接data_にアクセスさせる方法もある。

228 :デフォルトの名無しさん:2010/08/04(水) 11:51:12
>>227
ありがとうございます
やってみます

229 :デフォルトの名無しさん:2010/08/04(水) 11:54:16
>>226
×
dp = malloc(sizeof(hoge) + a*3);


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

ってことだろ
>>224の言い方はヒドいが、知っとけよとは思うな

230 :デフォルトの名無しさん:2010/08/04(水) 12:00:41
>>225
Cではポインタと配列は字面上、概ね同等だから>>214で動くけど、

struct vec {
 float x1[10];
 float y1[10];
 float z1[10];
};

struct vec {
 float* x1;
 float* y1;
 float* z1;
} vec;
は、メモリ上の配置は全然違うという事は知っておくといい。

231 :デフォルトの名無しさん:2010/08/04(水) 12:07:58
>>229
すいません
そうしてもerror C2440: '=' : 'void *' から 'hoge *' に変換できません。と出ます
dp = malloc(sizeof(struct hoge) + dp->a*1);どこがおかしいのでしょうか?

232 :デフォルトの名無しさん:2010/08/04(水) 12:17:19
グローバル位置でdp = malloc(sizeof(struct hoge) + dp->a*1)をしてみましたが
C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
error C2040: 'dp': 'int []' は 'hoge *' と間接操作のレベルが異なります。
error C2440: '初期化中' : 'void *' から 'int []' に変換できません。
と出ます

233 :デフォルトの名無しさん:2010/08/04(水) 12:21:35
>>232
そのエラーメッセージはBCCじゃないのか?
BCCは可変長配列は使えないぞ

234 :デフォルトの名無しさん:2010/08/04(水) 12:28:35
>>233
VC++2008EEです
どうでしょうか?
struct hoge{
int a;
char b[a],c[a],d[a];
};やりたいことはこういうことです
struct hoge{
int a;
char b[1],c[1],d[1];
char e[1];
};
struct hoge *dp;
関数中でdp = malloc(sizeof(struct hoge) + dp->a*sizeof(char));
error C2440: '=' : 'void *' から 'hoge *'
どこがおかしいでしょうか?

235 :デフォルトの名無しさん:2010/08/04(水) 13:05:07
C++でコンパイルしているだろ。拡張子を.cにしろ。

236 :デフォルトの名無しさん:2010/08/04(水) 13:16:31
vector<char>にしたら通ったのですがこれってできてますか?

237 :デフォルトの名無しさん:2010/08/04(水) 13:25:55
>>234
dp = (hoge *)malloce( );
キャスト変えてみろ

238 :デフォルトの名無しさん:2010/08/04(水) 13:26:37
無駄なeが入ったw

239 :デフォルトの名無しさん:2010/08/04(水) 13:29:44
>>229 バカ
void *' から 'hoge *'に変換できませんっていってるのに・・・

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


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

.cが全てだと思うなよ

240 :デフォルトの名無しさん:2010/08/04(水) 13:30:31
>>237
もう消したから戻るのメンドくさい…
int a;
std::vector<char> b,c,d;

for(int i=0;i<a;i++){b.push_back();}
でできてませんか?

241 :デフォルトの名無しさん:2010/08/04(水) 13:31:45
それがありならnew deleteとかでもできるだろwww
勝手にしろ

242 :デフォルトの名無しさん:2010/08/04(水) 13:32:52
イテレーター使えボケ

243 :デフォルトの名無しさん:2010/08/04(水) 13:33:28
できてますか?
vector使ってるからより重くなってるとか、メモリ食ってるとかありませんか?

244 :デフォルトの名無しさん:2010/08/04(水) 13:41:23
いったい何がしたいのかさっぱり分からん。
もうstring使えばいいじゃん。

245 :デフォルトの名無しさん:2010/08/04(水) 13:46:02
したいことは
struct hoge{
int a;
char b[a];←ここ
}
です
struct hoge do[d];みたいに何個も作って値を入れて行った時にそれぞれのaの値とbの配列の要素数がリンクしてるってことです
こうするとできないので一番無駄の無いやり方が知りたいのです

246 :デフォルトの名無しさん:2010/08/04(水) 16:24:08
したいことがあるからそれを書きたいだけで、それが最終的にしたいことじゃないだろう?

247 :デフォルトの名無しさん:2010/08/04(水) 18:06:56
struct KATA{std:vector<float> A;};
struct KATA hoge;
struct KATA temp;

temp.A.push_back(0.0);
temp.A[0] = 1;
memcpy(&hoge,&temp,sizeof(struct KATA));
temp.A[0] = 0;
hoge.A.push_back(temp.A[0]);←多分ここで

hoge.A[0]とhoge.A[1]が0になってしまうのですがなぜでしょうか?
hoge.A[0]には1、hoge.A[1]には0を入れたいです

248 :デフォルトの名無しさん:2010/08/04(水) 19:05:05
>memcpy(&hoge,&temp,sizeof(struct KATA));

vectorにこういうキチガイじみた事はやめろ
やるならstd::copyでも使え

59 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)