[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 14:47 / Filesize : 148 KB / Number-of Response : 582
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.36【環境依存OK】



1 名前:デフォルトの名無しさん [2007/04/01(日) 23:01:13 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1171888583/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


175 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:07:42 ]
ソースファイルでメンバ関数を書くときに
親クラス名::メンバと書かなければいけないわけですが、
この親クラス名が長けりゃを何回も書くのが面倒なので#defineマクロつかって短くしちゃう
ってのはありなんでしょうか?
元に戻すとしても、検索置換一発なんであまり悪く無いとは思うんですがどうなんですか?


176 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:09:28 ]
やったこと無いからできるんか知らんけどできるならありだろ
ていうか毎度クラス名タイプしてんの?
普通コピペだと思ってた・・・

177 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:09:45 ]
>>175
IDEの支援機能 or コピペでいいじゃん

178 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:16:40 ]
できるできないは別として、そんなソースコード読みたくない。
あくまで自分用ならやってみてもいいとは思うけど。

179 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:19:51 ]
やっぱり読みにくくなるんですか?
慣れの問題以外で何か理由とかあるんでしょうか?

180 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 19:36:30 ]
あるていど長くても分かりやすい名前なら問題ない。
長い上に意味が不明瞭で、しかも似たような関数や変数が点在したりすると目も当てられない。


181 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 20:31:16 ]
>>175
せめてマクロよりはtypedefを使え

182 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 20:33:07 ]
>>181
ちょw

183 名前:デフォルトの名無しさん mailto:sage [2007/04/10(火) 21:09:51 ]
>>181
マジすか!



184 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 03:52:55 ]
定義の部分なんだから変に略そうとするなよ。

185 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 05:08:58 ]
Cだけど、関数の仮引数を#defineしちゃうことはあったな。
そのときは関数ポインタを使う必要があって、同じ引数を持つ関数が10個くらいあったから。(しかも長い)


186 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 05:14:36 ]
構造体にして渡すという方法は思いつかなかったのか

187 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 08:54:00 ]
ヘッダにinlineとして定義できないような長い関数は作るべきではない
ゆえに.cppは不要

188 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 09:25:21 ]
それ、このスレのネタじゃないから。

189 名前:185 mailto:sage [2007/04/11(水) 15:11:58 ]
外部から呼び出す関係で、引数が指定されてた。
今にして思えばラッパ関数でも作ればよかったんだが。

でも、引数が多くなった時に構造体使うのってなんか好きになれない。
あ、複合リテラル使えばいいのか……C99対応してないけど……。


190 名前:デフォルトの名無しさん [2007/04/11(水) 23:52:46 ]
char **namelist;
これを関数に渡して中身を更新するようにしたいのですが、
引数の指定や渡し方がいまいち分かりません。
誰かアドバイスおねがいします

191 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:56:13 ]
どう更新するのか分からんので何とも言えない

192 名前:デフォルトの名無しさん [2007/04/12(木) 00:02:12 ]
関数の中でダブルポインタに配列を作成して、
その配列のアドレスを**namelistに返したいと思っています。

193 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:13:14 ]
ダブルポインタってなんですか?



194 名前:デフォルトの名無しさん [2007/04/12(木) 00:18:31 ]
えと、私の持ってる本では「ポインタのポインタ」=「ダブルポインタ」みたいなことが書いてあったので、
その言葉を使用しました

195 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 00:40:17 ]
>119
>関数の中でダブルポインタに配列を作成して、
>その配列のアドレスを**namelistに返したいと思っています。

そのまま渡せばいいんじゃないの?
いいから書いた関数をあっぷしてみ。
じゃなければ呼び出し側をあっぷしてみ。
話はそれからだ。


196 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 03:27:00 ]
>>192の質問に近いのですが、私もおそらく同じ問題に直面しています。

main()
{
STAT stat[5];
func(stat);
}

func(STAT *stat[])
{
for(int i=0;i<5;i++)stat[i]->menber1=1;
}


上のように、構造体STATを要素数5の配列で宣言して、
その中身を関数funcで操作したいのですが、エラーがでてしまいます。
(上のままだと「STAT * 型は STAT ** 型に変換できない」という具合でエラーがでます)
これはどこが間違っているのでしょうか・・・よろしければご助言お願いします。

197 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 03:55:41 ]
>>196
STAT型のポインタを保持する配列statの中身はSTAT*だから
STAT stat[i]って宣言だとstat[i]の中身はSTAT型そのものになってしまう

試しにうちの環境で適当にSTAT定義して、STAT* stat[5];って宣言したら通ったから
多分あってると思う!!

198 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 04:14:35 ]
>>196
呼び出し元で STAT stat[5]; と宣言するなら func(STAT *stat)でstat[5]の中身を操作できる。
func(STAT *stat) { for(int i=0;i<5;i++)stat[i].menber1=1; }
ポインタを2重に使わなければいけないのは次のようなケース。
func(STAT **stat) { 
  int i;
  *stat = malloc(sizeof(STAT)*5);
  for (i=0; i<5; i++) (*stat)[i].menber1 = 1; 


main() {
  int i;
  STAT *stat;
  func(&stat); 
  for (i=0; i<5; i++) printf("%d\n", stat[i].menber1);
}


199 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 04:32:05 ]
>>197 >>198
それぞれの方法で試したところ、上手くいきました。
質問の回答だけでなく、細かな補足説明までしていただいて
ありがとうございます。勉強になりました&&キュゥンときました。

200 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 04:34:39 ]
もっと簡単に書く方法はないんですか?
たとえば stat[5]でSTATのインスタンスごと作ってくれて
stat[5].member[1]でアクセスできるようなの
多重間接参照ってなんかダサいですし

201 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 04:58:56 ]
>>200
配列へのポインタとポインタの配列は別物だからな。
あとSTATの定義を晒さないとコメントできんよ。

202 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 05:38:26 ]
>>198のコードを動かそうと以下のようなテストコードを組んでみたんですが
コンパイラを通りません、どうしてでしょうか?

#include <stdio.h>
#include <stdlib.h>

struct STAT {
int member1;
} ;


func(STAT **stat) { 
  int i;
  *stat = malloc(sizeof(STAT)*5);
  for (i=0; i<5; i++) (*stat)[i].menber1 = 1; 
  return;


main() {
  int i;
  STAT *stat;
  func(&stat); 
  for (i=0; i<5; i++) printf("%d\n", stat[i].menber1);
  return;
}

203 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 05:58:48 ]
ただ通らないといわれても困るが、なんかメッセージがでてるだろ。
もしCでコンパイルしてるならtypedefがいるんじゃね?
typedef struct stat_ { int menber1; } STAT;




204 名前:202 mailto:sage [2007/04/12(木) 06:05:58 ]
func()内のmallocの部分で明示的型キャストをつかったりしていくらか通してみた結果
どうやら
> (*stat)[i].menber1
がSTATのメンバであるmember1にならないのが原因のようです
これを他の部分を変えず、かつ直感的な表現に直す方法ってありますかね?

205 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 06:17:22 ]
>>204
単なる誤字だろそれ
member1
menber1

206 名前:202 mailto:sage [2007/04/12(木) 06:21:01 ]
解決しました!!
これで学校行けますありがとうございました!!!

やっぱコピペで済ませるのって慣れてないやばいんですね^^

207 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 06:39:48 ]
>えと、私の持ってる本では「ポインタのポインタ」=「ダブルポインタ」みたいなことが書いてあったので、

そうか、面接で「ダブルポインタは自信がありますがトリプルポインタはちょっと……」なんて
すっとこどっこいなことを言ってた香具師もその本を読んでたのかも知らんな。

208 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 06:44:15 ]
ぬるぽいんた

209 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 06:47:35 ]
>>202
C++でこれをコンパイルしてるのなら警告でまくりだろ

210 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 07:16:54 ]
トリプルって使う機会無いなあ

211 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 07:20:07 ]
三次元のボリュームデータ扱う時にトリプルは使うよ

212 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 07:28:27 ]
間接参照演算子って内部実装晒してるのと同じじゃん
*一個ならまだ許せるけど、多重はちょっと厳しいじゃん
組み込みとかC++が使えないところってそんなのばかりなの?

213 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 07:28:46 ]
だから、ポインタに階層を意味する単語をつけるのが愚なんだって。
リンクドリストなんかどうするんだよ。



214 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 07:38:21 ]
教科書どおりに自己参照ポインタを持った構造体を使う
これぐらいなら階層じゃなく、「次」とか「前」とか「先頭」みたいに「ポインタ」の意味で使えるから脳足りんの俺でも理解できる
で、階層構造どうやって表現したらいいの?

215 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 07:40:49 ]
リンクトリストではポインタへのポインタは出てこないだろ

216 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 07:53:11 ]
"ダブル"ポインタ
"トリプル"ポインタ

ダブルって言う人はアスタリスクの数を数えているのかもしれないが、
ダブルってのは階層を示すものではないと考えるのでオレは受け入れられない

217 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 08:10:19 ]
最終的には type*************** value
のような型になるような構造も普通に出てくるのかなぁ…

218 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 08:19:25 ]
終わってるだろ、その*の数

219 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 08:36:58 ]
int a[1][1][1][1][1][1][1][1][1][1];
**********a = 1;

220 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 08:49:17 ]
複雑なデータだと、構造体が3重になってるくらいはあるけどな。

221 名前:デフォルトの名無しさん [2007/04/12(木) 13:09:08 ]
Perlのchop()みたいな末尾を削る関数ってありますか?
std::string s = "abcdefg";
でgを削りたい場合は
s = s.substr(0,s.size()-1);とやるしかないのでしょうか?

222 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:15:05 ]
>>221
You、末尾に'\0'を書いちゃえYO!

223 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:19:59 ]
>>222
std::stringは直接編集してはいけない。



224 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:41:39 ]
>>221
resize すれば

225 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 13:51:06 ]
eraseでいいじゃん

226 名前:デフォルトの名無しさん [2007/04/12(木) 14:00:49 ]
>>224,225
ありがとうございます。resizeもeraseも自分が見てるサイトには載ってなかったもので・・・
どちらか使ってやってみます。

227 名前:デフォルトの名無しさん [2007/04/12(木) 17:23:55 ]
Cを独学ではじめました。「ポインタ」というのが出て来たので
ポインタを使ってメモリの0から100を読み込んでみようと下のプログラム
書いてみたのですが、実行すると、0x00000000をread出来ないと出て来ます。
どうすれば0x00000000からのデータを読む事が出来ますでしょうか?

--------------ソース--------------

#include <stdio.h>

void main(void){

    int *p=0;
    int n;

    for(n=0;n<=100;n++){
    printf("%x", *p);
    }

}

228 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 17:28:06 ]
>>227
今のOSでは一般のプログラムが見られる場所はそのプログラムに割り当てられた空間だけです。
大人しくargvの辺りでも覗いてなさい。

229 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 17:28:49 ]
p=0はp=NULLの意味
ヌルポインタはどこも指していないポインタだから読めるわけがない

230 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 17:39:33 ]
略してぬるぽ
この問題で一番大事なことは上の事実

231 名前:227 [2007/04/12(木) 17:45:46 ]
>>228
でも、diskprobeとかだとMBRが読めたりしますよね?
これって全然違う話なんですかね?mbrをc言語で読み込んでみたいんです…。
というか、OS書くの忘れてました。すみません。
>>229
なるほど。

232 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 17:49:23 ]
0番地が読めるかどうかはOSによる

233 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 17:50:57 ]
>>231
ディスクの特定の場所を読みたいならディスクのドライバに命令を送って読み出せばいい



234 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 17:52:09 ]
>>231
mbrってハードディスクにある奴じゃないのか?
お前が読もうとしてるのはメモリなんだが

235 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 17:59:05 ]
>>231
ディスクの先頭セクタを読みたいなら、ディスクデバイスを適当に開けば普通に読めます。
#大抵のOSで。
尤も、それ自体もやはり、管理者権限が必要だったりもします。

処で、>231にもOSが書いてありませんねぇ。

236 名前:227 [2007/04/12(木) 18:02:26 ]
>>222
XPは読み込めるんですか?SP2なんですが。
>>233
検索してみます!
>>234
Σ( ̄Д ̄)ガーン
そうですよね…MBRってHDDの先頭セクタなのか!
ってか、メモリの最初には何が読み込まれてるんだろう…。
HDDのデータなんですけど、ポインタでメモリの番地を指定して操作出来るように
HDDもアドレス(セクタ?)で指定して読み込む事は可能なんですか?
それともファイルポインタでファイル名とかを指定する事でしか
読み込めない/書き込めないんですかね?

237 名前:227 mailto:sage [2007/04/12(木) 18:07:18 ]
というか、>>236の答えって>>233なのか!!俺ってなんてばかなんだ!
お騒がせしております(T-T)

>>235
>処で、>231にもOSが書いてありませんねぇ。

申し訳ありません!!!!!!m(T◇T )m
Windows XP(SP2)です。

238 名前:235 mailto:sage [2007/04/12(木) 18:12:37 ]
>>237
>235に書いたことがそのままXPにも当て嵌まる。
詳しくは、MSDNのCreateFileの(なが〜〜い)説明参照。

239 名前:227 mailto:sage [2007/04/12(木) 18:21:00 ]
>>238
今みてみました。それから検索してたら
ttp://ext2read.sourceforge.net/documentation/inside-hard-disk/
こういうのが出て来たんですけど、msdnの解説同様( ゚д゚)ポカーンな状態なので、
まずは買って来た本を一通り読み終えてから(まだポインタの章なので)
いただいた情報をもとに検索してみたいとおもいます!
>>235さん、質問に答えていただいたみなさん、ありがとうございました!

240 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 18:46:38 ]
>>225
erase は古い環境で名前が違ってたり引数違ってたりすることもあるから、その点は注意な。

241 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 20:14:47 ]
全てのデバイスが mmap ってるのはそれなりに綺麗かもしれないな(w

242 名前:でぬるぽ mailto:sage [2007/04/12(木) 22:59:28 ]
C/C++用のぬるぽチェッカーを作ってみた
叩くなりスルーなりお好きに
ttp://denullpo.exblog.jp/5410369/


243 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 23:50:22 ]

\\
\\\
\  ∧_∧
   ( ´・ω・)
   G   と) ガッ >>242
    ヽ⌒)、 \人∧__∧
      ̄ (_) >`д´)')
         ∨つ   /



244 名前:デフォルトの名無しさん [2007/04/13(金) 06:51:35 ]
VSでテンプレートの勉強始めました。
普通のクラスを書くときにはヘッダファイルとソースファイルを
別々に作りますが、テンプレートクラスに関しては
同一のファイルに記述しないと外部参照エラーが出てしまいます。
Javaみたいでどうも気持ち悪いんですが、何か解決策はありますか?

template <typename X> X CTest<X>::func(){ ... }
↑これをクラスの宣言の後ろに書けばちゃんと動きますが、
別のソースファイルに書くとダメです。

245 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 07:24:15 ]
#define HOGE_ template <typename X> X CTest<X>

246 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 08:21:36 ]
明示的実体化という方法がなくはない。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-3.html

247 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 08:54:57 ]
>>246さんの示してくれた方法でできました。
テンプレートはあくまでコンパイル時に解釈・生成されるものだというのは
要するにこういうことだったんですね。
ありがとうございました。

248 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:05:22 ]
newで0で初期化した状態で確保する方法を教えてください。

249 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:09:51 ]
new演算子はそこまで面倒見てくれないから自分で0代入汁
Windowsなら
Zeromemory(pDest, sizeof(type)*size);
みたいな感じか、もちろん基本型に限るが

250 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:12:01 ]
unixなら?

251 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:17:14 ]
どうよこの超原始的手段
char *hoge=(char *)Dest;
for(int i=0; i<sizeof(type)*size; i++)
hoge[i]=0;

てか、そもそも何をnewで確保するの?

252 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:31:52 ]
intです。
memsetでもOKですか?

253 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 09:41:12 ]
普通にstd::fillでも使っとけ。



254 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 12:09:41 ]
>>249
PODなら初期化してくれるだろ
T* t = new T();
e.g.
int* p = new int(); // *p->0

255 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 12:50:45 ]
newで初期化の問題云々いうときは大抵配列の方だと思うがね

256 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 14:24:39 ]
exportがあればなあ…。

257 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 17:49:26 ]
>>248
普通にstd::vector<int>確保すればデフォルトコンストラクタで初期化されるよ

258 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 17:54:44 ]
>>255
配列でも初期値で初期化なら問題ないでしょ
int* p = new int[10]();

259 名前:デフォルトの名無しさん [2007/04/13(金) 19:25:50 ]
明解C言語の入門と実践編を終えたばかりの青二才未満のものなんですが、
Cを使ったソケットプログラミング(ネットワークプログラミング)を学ぶのに
オススメの書籍、又はWEBサイトが御座いましたら、教えていただけますでしょうか。

260 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 19:30:18 ]
猫C

261 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 19:41:11 ]
まずは標準入出力をソケットに見立てて書いてみる
→ inetd で ウマー
プロトコル周りは RFC (原文&日本語訳) を参照
# 「インターネットRFC辞典」持ってるけど結局 RFC本体を追うしなぁ…

Windows だと ASync 周りが嫌らしいので、
MSDN +
pc11.2ch.net/test/read.cgi/tech/1171029896/ のテンプレサイト +
ぐぐる +
MFCのソース眺める +
などなど

262 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 20:09:18 ]
そんなの出来るんすか?
じゃあ入出力インターフェイスとしてistream/ostream持ってるクラスなら
それをそのままhttpストリームにして出力できるんすか?

263 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 20:18:19 ]
タイムアウトとか面倒見なけりゃそこそこいけるんじゃね?
ソケット ⇔ ファイルハンドル が inetd の仕事だからな。
# クライアント記述だと inetd ダメポかも…

ソケットに流すべきパケットのルール = プロトコル は、
千差万別なので 仕様書 (=RFC) を見るしかない。

で、HTTP ぐらいになると、そのルールが複雑怪奇だから難しいさね。



264 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 20:37:44 ]
あとC++のiostreamは「その気になれば」、
どんな相手でも入出力できるようにできる。
inetdとか使わないで自前でやるときにはね。

265 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 23:57:03 ]
throw()って宣言したほうがいい?

266 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 23:59:07 ]
>>265
百害あって一利なし

267 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:27:06 ]
デストラクタのthrow()宣言くらいはいいと思うよ.
絶対に投げちゃダメだから.
全然強制力もないし,あんま意味ないけどね

268 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:28:23 ]
一利ぐらいはあるんじゃないか。
とりあえずデストラクタとswapにはつける。

269 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:47:33 ]
さんくす
やっぱその程度にしか使えないのね

270 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:48:42 ]
C++の例外って使いどころが分からない

271 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 02:14:51 ]
たまに継承もとのデストラクタがthrow()で宣言されてる場合が・・・

272 名前:259 [2007/04/14(土) 04:13:08 ]
>>260
今度立ち読みしてみます。ありがとうございます。

>>261
沢山の回答ありがとうございます。かなり勉強になりそうなので
特にテンプレによく目を通したいと思います。ありがとうございました!

273 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 04:54:14 ]
>>270
C++以外の例外について分かっているなら、いっしょだと思うよ。



274 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 07:27:44 ]
危険性が違うだろ

275 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 10:27:12 ]
finallyなんていらんのですよ

276 名前:デフォルトの名無しさん [2007/04/14(土) 12:56:37 ]
HDCに書き込んだ文字や線を画像ファイルとして保存したいのですが、
BMPファイルに保存するだけでも、なんかすげー色々やることあって敷居高いのですが、
HDC渡すだけで勝手に画像ファイル作って保存してくれるみたいな
都合のいいライブラリってないもんですか?

277 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 13:22:31 ]
GDI+

278 名前:デフォルトの名無しさん [2007/04/14(土) 13:39:09 ]
>>277
レスありがとうございます。GDI+ってプラスって言うくらいだから
さらに高機能でめんどくさくなると思ったのですが、
調べてみたら簡単になってるのですね。
なんか良い書籍ないか探して、GDI+について勉強してみます。

279 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 15:34:28 ]
>>274
危険性って何のこと?

280 名前:オナニストガロア ◆HEfxsk5e3k mailto:sage [2007/04/14(土) 16:17:47 ]
vineLinuxでC++やります。
今さっきまでnamespaceの存在を知らなくてコンパイルが出来なくて困ってました。
よろしくおねがいしまふ

281 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 20:31:30 ]
Visual Studio C++ 2005 EXPRESS EDITIONで、
Windows APIを使ったプログラミングを始めようとしたんですが、
ビルドするといきなり、
\source\main.c(1) : fatal error C1083: include ファイルを開けません。'windows': No such file or directory
というエラーが出てしまいます。
プロジェクトは、Win32コンソールアプリケーションでつくったので
問題はないと思うのですが、
何がいけないのでしょうか?

#include <windows.h>

int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPreInst, LPSTR pCmdLine,int nCmdShow)
{
MessageBox(NULL,"Hello, World","タイトル",MB_OK);
return 0;
}


282 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 20:33:43 ]
Express Editinonでは、別途Windows SDKかPlatform SDKをインストールする必要がある。

283 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 20:40:58 ]
>>282
Platform SDKは、インストールをしています。
PSDK〜.exeってやつですよね?




284 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 20:43:20 ]
>>283
VisualStudio(C++)専用スレへどうぞ。

285 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 20:47:09 ]
>>283
VCにPSDKの場所を設定する必要もある。

286 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 22:50:54 ]
すみません、C言語に関するご質問です

'a'は一文字、"abcde"は文字列と教わりましたが、では
'abcde'と定義した場合どういう意味になるのでしょうか?

287 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 22:58:45 ]
>>286
コンパイラによって"str"と同じだったり、エラーが出たり

288 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 22:58:48 ]
>>286
出来たか?
4文字までならできる処理系もないではないが…

289 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 23:05:20 ]
>>287
妄想乙。

>>286
シングルコーテーションで囲んだ文字は整数値として扱われるので、
sizeof(int)と同じ文字数までしか書けない筈。
おまけにその値が同解釈されるかは環境依存。
例えば、'abcd'と書いて'a'<<24|'b'<<16|'c'<8|'d'になるか'a'|'b'<<8|'c'<<16|'d'<<24になるかは
同じコンパイラでもバージョンによって違っていたりする。

290 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 23:09:42 ]
ちなみにC++だと文字リテラルはcharだ。
互換性を断ち切ったそう多くない箇所なので要チェック。

291 名前:デフォルトの名無しさん [2007/04/14(土) 23:36:01 ]
Cで、 !0 が1にならない処理系・コンパイラで有名どころは何があります?

292 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 23:46:30 ]
ISOやANSIに準拠してなくてK&Rとの互換性もない処理系

293 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 23:50:11 ]
>>292
具体的にはどんなの?今でも触れたり使われたりしてる?
>>292が今使ってるとか?



294 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 23:51:55 ]
そんなけったいなもの現存してないだろ

295 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:02:44 ]
>>294
本当!?大丈夫なの!?そんな処理系もうない!?

296 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:04:11 ]
あぁー僕は今処理系依存コードを書いているよー!気をつけようねぇー!

297 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:07:27 ]
何を書いてるのか知らんが、お前のレベルなら規格に準拠してない処理系まで考慮することはないだろ。

298 名前:デフォルトの名無しさん [2007/04/15(日) 00:09:38 ]
programming初心者です
visual c++をインストールしたのですが、c言語を使ってprogrammingの学習をしたいのですが
windowsのコマンドプロンプト上でc言語のprogramをするにはどうしたらよろしいのですか?
環境設定等が解らず困ってます。
どうか、ご指導のほどよろしくお願いします。

299 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:14:22 ]
>>297
どのくらいのレベル以上からだと 規格に準拠していない処理系まで
考慮しなければならない?

せいぜいintが16ビット系にしかあたったことないなー
NULLが0じゃないのにもあたったことないし運がいいだけかなー

300 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:19:11 ]
> intが16ビット
> NULLが0じゃない
それはどっちもANSI準拠だろ

301 名前:オナニストガロア ◆HEfxsk5e3k mailto:sage [2007/04/15(日) 00:19:56 ]
rubyが出来るのですが、C++もすぐに出来るようになりそうですか?

302 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:23:04 ]
いいえ

303 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:24:15 ]
>>300
NULL==0なものにしかあたったことがない。
というか、NULL==0という前提なコード書きまくりんぐ。

お前はどうだい?



304 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:26:22 ]
NULLは0の#defineだろ。==が成り立たないほうがおかしい

305 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:28:17 ]
あーもう C FAQ 嫁。
www.kouno.jp/home/c_faq/c5.html
はい、おしまい。

306 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 00:42:05 ]
ぬるぽ

307 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 01:11:48 ]
>>305
4月だな

308 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 02:01:40 ]
>>305
0はNULLとしてよいがNULLは0とは限らない と書いてあるンだけど・・・
NULLが0でない処理系が今でも生き残ッているのか聞きたいンだが。

309 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 02:04:02 ]
ポインタ型のNULLと整数型の0を比較するのはナンセンス。
ヌルポインタの内部表現が0でない処理系ならごまんとある。

310 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 02:12:54 ]
>>308
#define NULL ((void*)0)
とされてるCの処理系なら今でもあるよ。

311 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 02:15:17 ]
>>308
NULL が 0 でないコンパイラを自分で作ればいいじゃないか

312 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 02:25:57 ]
>>309
具体例機盆ぬ

313 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 03:06:51 ]
>>309
ポインタが現われるべきところに書かれた0は
整数型として解釈されることはないんだけど。
「16進数の0x1Aはおかしい!整数の中に文字定数'A'が入っている!」
って言っているようなもの。



314 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 03:07:38 ]
>>313
流れ読めよ。

315 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 03:11:24 ]
>>309
具体例きぼんぬ

>>314
こうですか?わかりません><

316 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 03:35:07 ]
>>309が知ったかのアホでFA

317 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 03:51:35 ]
>>313
ポインタ様と0を比較するというのは
ポインタ様がぬるぽかどうか比較することと等しいということガッ
言語規定で規定されているので、これはおかしくない

318 名前:デフォルトの名無しさん [2007/04/15(日) 03:53:39 ]
ぬるぽ

319 名前:デフォルトの名無しさん mailto:エイトワンのファン [2007/04/15(日) 04:18:49 ]
島根県のみなさん、パチンコをするなら、

  優良パチンコ店 エイトワン    

に行こう! 遠隔(※1)を絶対やってないのは「エイトワン」だけ!
違法ロム(※2)を絶対使ってないのも「エイトワン」だけ!
エイトワンでは、遠隔等が可能な設備は入れていません。 ロムも、警察がチェックしやすいようにしています。

詳しい方はご存知の通り、どんなにパチンコの遊戯人口が変動しても、その市場規模は変わりません(※3)。
要するに、客が減っても、残った客から絞り盗る量を増やして調整しているのです。
しかし、何故それが可能なのか?…ご理解頂けると思いますが、9割以上の店が確実に遠隔等を行ってます。
1万店以上の中でも、遠隔も違法ロムも確実にやってないのは「エイトワン」1店だけです!

※1…遠隔とは
 「お、あの客は新顔だな。勝たせて味を占めさせるか。遠隔操作で設定変更しよ」
 「客が減ってきたな。ま、設定を絞めて(違法)、1人あたりから搾る量を増やせばいいか」
 「あのオヤジ負け続けてるからそろそろ辞めるかもな。今日は勝たせてやるか」

※2…違法ロムとは
 「うちのアタリ確率は、もちろん他と同じ『○○○分の1』ですよ!(ロムいじってるからウソだけど)」

※3       市場規模   遊戯人口
 平成06年 30兆4,780億円 2,930万人
 平成08年 30兆0,630億円 2,760万人
 平成10年 28兆0,570億円 1,980万人
 平成12年 28兆6,970億円 2,020万人
 平成14年 29兆2,250億円 2,170万人
 平成16年 29兆4,860億円 1,790万人

320 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 04:19:59 ]
ぽるの

321 名前:オナニストガロア ◆HEfxsk5e3k mailto:sage [2007/04/15(日) 08:34:26 ]
c++ではNULLは整数型の0で定義されてますよっと。
今林先生の本読んでる

322 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 15:23:03 ]
SIMDって何て読むんですか?

323 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 15:38:40 ]
C++ではNULLではなく0を使うことが推奨されているわけだが。



324 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 16:29:54 ]
>>322
like "Ess, I'm Dee".

325 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 17:28:37 ]
>>324
どっちかというとEss, I aim Dee.

326 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 19:25:13 ]
>>321
誰も定義の話をしてないだろ
ちゃんと読めよ低脳

327 名前:286 mailto:sage [2007/04/15(日) 19:43:02 ]
>>287-290
ありがとうございました。
ちなみに試したわけではなく
純粋にどうなるのかと思った
だけでした。

328 名前:デフォルトの名無しさん [2007/04/15(日) 21:13:07 ]
vipからきました q(^-^)p

329 名前:デフォルトの名無しさん [2007/04/15(日) 21:29:29 ]
52.xmbs.jp/m3nshea2/

このサイトぶっ潰しませんか??
写メとか貼って気持ち悪いです。自分は初心者なんで潰し方がよく
分からないのでみなさんお願いします。

330 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 22:14:26 ]
void *m = 0;のとき、*(size_t*)&m!=0ということじゃね?

331 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 22:17:12 ]
>>329
お前を通報しました

332 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 22:56:52 ]
C++の言語仕様ではヌルポインタは0なをだがな。

333 名前:デフォルトの名無しさん [2007/04/16(月) 00:56:11 ]
構造体の配列の配列を動的確保するにはどうしたらいいのでしょうか?
typedef struct {
char a;
char b;
} St;

void poo(int x, int y){
St **hoge;
hoge = (St **)malloc(sizeof(St*)*x);
for(int i=0;i<x;i++){
 hoge[i] = (St *)malloc(sizeof(St)*y);
}
}
これだと駄目でした。コンパイル通っても中身にアクセスしようとするとふっとびます。
hoge[3][5].a = 'T';
のように使いたいのですが。



334 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 01:04:23 ]
>>333
poo(3, 5); って呼び出してるって落ちでは?
こちらではpoo(4, 6)でちゃんと動く。

335 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 01:14:56 ]
>>334
poo(100,100)等と入れてるのでそういうわけではないみたいです。
他の部分との影響かもしれないのでもう少しいじくってみます。

336 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 01:25:55 ]
>>335
念のためCodeGuardを掛けてみたけど「解放されていません」の
警告以外はエラー出ないねやっぱり。

337 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:02:54 ]
コピーコンストラクタを使った初期化でauto_ptrで
メンバ関数を呼び出すとアクセス違反が発生しましたって
怒られるんですが、何が悪いんでしょうか。

class Circle : public Shape{
public:
Circle(int radius=0)throw();
Circle(const Circle& circle) throw();
virtual void draw() const throw();
virtual ShapePtr clone() const throw(bad_alloc);
virtual ShapePtr createSimilar() const throw(bad_alloc);
protected:
int radius_;
};
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return new Circle(); }

ShapePtr Circle::clone() const throw(bad_alloc)
{ return new Circle(*this); }

void userCode(ShapePtr s ) throw(){
cout << "userCode() number1:";
s->draw();
ShapePtr copy = s->clone();
cout << "userCode() number2:";
copy->draw();
ShapePtr similar = s->createSimilar();
cout<< "userCode() number3:";
similar->draw();
}

338 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:10:10 ]
>>337
コードが足りない。症状が再現する最小のソースを貼って。

339 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:22:49 ]
#include <iostream>
#include <new>
#include <memory>
using namespace std;
class Shape;
typedef auto_ptr<Shape> ShapePtr;

class Shape{
public:
Shape() throw();
virtual ~Shape() throw();
virtual void draw() const throw() =0;
virtual ShapePtr clone() const throw(bad_alloc)=0;
virtual ShapePtr createSimilar() const throw(bad_alloc) =0;
protected:
int radius_;
};
Shape::Shape() throw(){}
Shape::~Shape() throw(){}

class Circle : public Shape{
public:
Circle(int radius=0)throw();
Circle(const Circle& circle) throw();
virtual void draw() const throw();
virtual ShapePtr clone() const throw(bad_alloc);
virtual ShapePtr createSimilar() const throw(bad_alloc);
protected:
int radius_;
};


340 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:23:28 ]
Circle::Circle(int radius)throw()
:Shape(), radius_(radius){}
Circle::Circle(const Circle& circle)throw()
{ this->radius_ = circle.radius_; }
void Circle::draw() const throw()
{ cout << "Circle: radius=" << radius_ << "\n"; }
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return new Circle(); }
ShapePtr Circle::clone() const throw(bad_alloc)
{ return new Circle(*this); }
void userCode(ShapePtr s ) throw(){
cout << "userCode() number1:";
s->draw();
ShapePtr copy = s->clone();
cout << "userCode() number2:";
copy->draw();
ShapePtr similar = s->createSimilar();
cout<< "userCode() number3:";
similar->draw();
}
int _tmain(int argc, _TCHAR* argv[])
{
ShapePtr c(new Circle(42) );
cout << "main() number1:";
c->draw();
userCode(c);
return 0;
}
こんな感じです。
お願いします。

341 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:28:52 ]
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return auto_ptr<Circle>(new Circle()); }
ShapePtr Circle::clone() const throw(bad_alloc)
{ return auto_ptr<Circle>(new Circle(*this)); }

これでどう?

342 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:31:57 ]
ShapePtr Circle::createSimilar() const throw(bad_alloc) {
return ShapePtr(new Circle());
}
ShapePtr Circle::clone() const throw(bad_alloc) {
return ShapePtr(new Circle(*this));
}

悪いこっちの方が見やすいね。

343 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:51:24 ]
うおお。
いけました。ありがとうございます。

なるほど、ちゃんとauto_ptrにして返さないと駄目だったんですね。





344 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:54:43 ]
>>343
簡単に言うとそういう事なんだけど、その前にコンパイルエラーに
ならなかった?

_tmain()とあるからVisual C++だと思うんだけど。

345 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:57:48 ]
ちなみにgcc(MinGW 3.4.2)だと

error_cc1.cpp:46: error: conversion from `Circle*' to non-scalar type `ShapePtr' requested

のようなエラーを返す。

346 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 12:19:02 ]
long long って、まだ現在の C++ の規格には入ってないの?

347 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 13:01:37 ]
どーでもいいけどlong longって
ちょっと、ちょっとちょっとレベルだよな

348 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 13:33:13 ]
DLLの関数を呼ぶときに

Func(p1,p2,p3,p4)
として呼び出した関数が、呼び出された側では
1: Func(謎の値, p1, p2, p3)
ってなっちゃうケースと、正しく
2: Func(p1,p2,p3,p4)
てなるのにその関数内でp4が破壊される(あたらしく宣言したローカル変数が上書きしてしまう)ケースがある。

デバッガでアセンブラを追ったところ、call Func の直前にpush p1 しているのは確認済み。
(呼び出し側はcdeclなのでp4から順に全てpush。)
callで呼ばれた関数に入った直後に、デバッガのスタックトレースウィンドウ内で上記現象を確認している。
(これってスタックを見てるのかな)

callと、call内部最初のステップとの間に、デバッガでは見えない何らかのバイナリがあるのかな。
もしくはDLLプロセス空間へ切り替わる(この辺じつはよく理解していない)際に、スタックポインタがおかしくなる(上記現象を説明できる仮説が立てられていない)とかそういうことかな。

DLL経由関数呼び出しの、バイナリレベルの挙動についてなにか知ってたら教えてくれ〜


349 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 13:48:24 ]
関数の宣言で何か(主に呼び出し規約を)ミスってんじゃないの?

350 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:00:01 ]
__stdcall とか __cdecl とか __pascal って書いてないの?

351 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:01:38 ]
謎の値というのはひょっとするとthisポインタの可能性もあるかも。
extern "C" で呼び出すようにし、C++の形式の関数は使わない
ようにするのが原則だけどそんな事は知ってるよね。

352 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:06:35 ]
呼び出し規約かthisポインタかどっちかの問題だと思う

353 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:07:44 ]
this 積むのは __thiscall かメンバ関数だと思うが…
C++ って標準は __stdcall だっけか?



354 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:22:23 ]
__stdcallを使うとCでも他の言語でも整合性がとれたスタックを
提供できる。

ただし、extern "C" を使った場合でもCならばC、C++ならC++で
受けないとthisポインタの絡みでずれてくる。

extern "C"は名前マングリングだけに関係する。

355 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:30:19 ]
呼び出し側も呼び出され側も _cdecl を明示的に指定している。
extern "C"はDLL側では指定してるが、呼び出し側はどこでどうやって指定すればいいのかわからんw
(GetProcAddress で関数ポインタで呼んでいる)

>>351
>>352
その場合、callの前に push this 的なものが入るんじゃないの?

さらに調べていたら、1のケースでも最後のパラメタは破壊されるようだ。

あと、Debugでビルドするとすべて正常に動く。


356 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:33:35 ]
メインプログラムもDLLもC++なの?
一度__stdcallにしてビルドしなおしてみてよ。
DEFファイルの書き方はわかるよね?これを書けば
extern "C"は不要になるので。

357 名前:348 mailto:sage [2007/04/16(月) 14:34:53 ]
あ、355は僕です スマソ

>Debugでビルドするとすべて正常に動く。

訂正。DLL側をDebugでビルドするとすべて正常に動く。


358 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:34:56 ]
>>355
typedef ret_type (__cdecl *pfunc) (arg_types...) PFUNC;

PFUNC pfn;
(FARPROC&)pfn = GetProcAddress();

アドレスを受ける変数に呼び出し規約を埋めるんだ

359 名前:348 mailto:sage [2007/04/16(月) 14:36:28 ]
>>358

んにゃ、 _cdecl はちゃんと指定しているよ。
extern "C"は呼び出し側は関係ないってことでいいんだよね?

360 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:39:35 ]
ああ
GetProcAddress() だけで完結した呼び出しなら
明示してるんだから extern "C" はイラネ-な。

361 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:40:12 ]
>>359
extern "C"はC++の名前マングリングを止めるもの。
メインもDLLも同じ処理系の同じC++で開発するなら必要ない。
(修飾名も同じになるから)

__declspec(ddexport)とか__declspec(dllimport)を使えば
DEFファイルは不要。

362 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:41:25 ]
GetProcAddressにはextern"C"付けておく必要がある。
なぜならWin32APIには名前マングリングが存在しないから。

それと
×ddexport
○dllexport

363 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:42:42 ]
まあwindows.hをインクルードしておけばextern "C"は自動的に
やってくれるので気にする必要はない。



364 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:51:18 ]
呼び出し規約以外にも、引数のサイズの不一致とかありそうだな
構造体を値渡ししてたり とか 可変引数だけど個数間違えたり とかしてない?

365 名前:348 mailto:sage [2007/04/16(月) 15:01:02 ]
引数の数が違うとやっぱり問題なのかな。

実は呼び出しは結構怪しいことになってて、
union DllVar { //4-byte generic container variable
HWND handle;
DWORD dword; //NULL
LPCSTR string; //String
bool boolean; //Boolean
float number; //Number
};
というのがまずあって、呼び出し側は
typedef LPCSTR (_stdcall *METHOD)(DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar);
ってなってるが、受け取り側は必要な数しか受け取らない。

オーストラリア人の技術者が「これでOK」って言ってたので
(_cdeclでは呼び出し側がスタック破棄もするからその点で言っても問題なさそう)
信用してるんだが。

__stdcall 試してみるyo。



366 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 15:05:51 ]
それはまずいぞ。
stdcallは呼び出された側がスタックを破棄するので、
スタックにつまれた引数の数を正確に知らなくてはならない。
可変個引数を取る関数ではstdcallを使えない(指定してもcdeclと同じになる)のもこのため。

だからそういう関数ならcdeclにしておけ。

367 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 15:33:28 ]
sizeof(wchar_t) の大きさによって定義を変えたいのですが、
#if sizeof(wchar_t) == 4 も
#if sizeof(L'A') == 4 も
定数式では無いと、コンパイラが受け付けてくれません。
何かいい方法ありませんか?

368 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 16:36:22 ]
C++ならテンプレートを使ってごにょごにょ、
CならWCHAR_MAXの値を見るくらいしかないと思う。

369 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 16:43:58 ]
bccでは通った。

370 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 16:52:01 ]
でも規格上はプリプロセッサ内でsizeofは使えない仕様のはず

371 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 17:05:41 ]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3828.txt

マルチスレッドで、ソケットプログラミングをしたいのですが、
winsock2.hをインクルードするだけでエラーが出てしまいます。
どうすればよいのでしょうか?

372 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 17:08:32 ]
どんなエラーが出てるのかくらい書けよ

373 名前:371 mailto:sage [2007/04/16(月) 17:11:58 ]
>>372
すみませんでした。
↓みたいなエラーが57個でます

c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(112) : error C2011: 'fd_set' : 'struct' 型の再定義
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(54) : 'fd_set' の宣言を確認してください。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(147) : warning C4005: 'FD_SET' : マクロが再定義されました。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(88) : 'FD_SET' の前の定義を確認してください
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(156) : error C2011: 'timeval' : 'struct' 型の再定義
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(97) : 'timeval' の宣言を確認してください。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(212) : error C2011: 'hostent' : 'struct' 型の再定義



374 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 17:19:58 ]
<winsock2.h>は<windows.h>よりも先に#includeする。

375 名前:371 mailto:sage [2007/04/16(月) 17:39:38 ]
>>374
ありがとうございましたm(_ _)m
無事解決しました!

376 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 18:30:52 ]
#define WIN32_LEAN_AND_MEAN
でもよかったとおもた。
Windows.hがwinsock.hもincludeするのが理由とか何とか

377 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 18:33:15 ]
WIN32_LEAN_AND_MEAN教えると、必要なヘッダがincludeされなくなってて、また泣き付かれることになるやもしれん。

378 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 18:38:20 ]
WIN32_LEAN_AND_MEAN はとりあえず無効化するね。

379 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 19:32:45 ]
どっちにしろホントに必要なヘッダはMSDN見ないとダメだからねー

380 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 20:32:14 ]
質問があります。
string str[] = {"aaa", "bbb", "ccc", ""};
を宣言して、

string *tmp = str;
while (*tmp->c_str()) {
printf("%s", tmp->c_str());
tmp++;
}
とやると、一応cccと表示されループを抜けるのですがこれは正しい処理なのでしょうか?
もし間違っているなら正しいやり方を教えてください。御願いします。

381 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 20:55:45 ]
>>368
>>369
>>370
sizeofが使えないのは不便ですよね^^
結局、WCHAR_MAXの値を使うことにしました。
ありがとうございました。

382 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:04:40 ]
>>380
for (string *tmp = str; !tmp->empty(): ++tmp) {
printf("%s", tmp->c_str());
}

自分ならこう書く

383 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:20:14 ]
!tmp.size()でもいいな



384 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:26:29 ]
気持ち悪い

385 名前:380 mailto:sage [2007/04/16(月) 21:29:02 ]
>>382-383
有り難うございます。
参考にさせて頂きます。

386 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:46:06 ]
C++なら余りポインタは使いたくないな・・・

std::vector<std::string> str;

str.push_back("aaa");
str.push_back("bbb");
str.push_back("ccc");

for (std::vector<std::string>::const_iterator pos = str.begin(); pos != str.end(); ++pos)
std::cout << pos->c_str() << std::endl;

と書いちゃうな・・・・

387 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:48:10 ]
std::copy(str.begin(), str.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

388 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 22:08:05 ]
>>383
tmp->size()では?
つまり論理が逆ではと思います。

389 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:13:19 ]
あるクラスのメンバ変数としてこんな定義があった場合、
class Neko {
 classA hoge1;
 classB hoge2;
}
コンストラクタは hoge1→hoge2、デストラクタはその逆の順番で
呼び出されているように見えますが、
これはC++の規格として保証されていますか?

390 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:14:58 ]
いいえ

391 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:24:31 ]
呼び出される順番は不定ということですね。
ありがとうございました。


392 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:30:01 ]
自分の処理系では保証されてるんだから
それでいいじゃんと思う俺ホビープログラマー

393 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:52:09 ]
ラベルをまたがなければ上から順、と決まってなかったっけ?



394 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:55:35 ]
つ[規格票]

これ以外の書き込みは嘘だと思え

395 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:02:18 ]
宣言順だったはずだけど

396 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:04:41 ]
あった

www.kuzbass.ru:8086/docs/isocpp/special.html#class.base.init
の-5-から

>Then, nonstatic data members shall be initialized
>in the order they were declared in the class definition
>(again regardless of the order of the mem-initializers).

非staticデータメンバはクラス定義での宣言順に初期化される。(メンバ初期化リストの順序は関係ない)

397 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:10:03 ]
ラベル云々って人は、メンバのメモリ配置と混同してるかな。

398 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:16:28 ]
>>389
保障されている。
staticでないメンバ変数は宣言どおりの順番でコンストラクタが呼び出され――12.6.2
デストラクタはその逆順で呼び出される――12.4.6

399 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:25:30 ]
規格で保障されているとはいえ、初期化順序をあてにしたコードは書きたくない。
エディタで宣言の順番を変えてしまうだけで動かなくなる不思議なコードになる。
とはいえ、そういう初期化順序を考慮したい場合もままあるわけで、そんなコードを書くなと主張するわけにも行かず。
せめて、書かないほうが良いと主張するのが精一杯。

>>390みたいに、C++プログラマ全員に、規格書をきっちり読んで置けというのも酷な話。

400 名前:デフォルトの名無しさん [2007/04/17(火) 01:25:42 ]
a=a++;

そろそろ、この類の事象を 不定だの未定義だの屁理屈並べずに
エラーにするか動作を定義するか どちらかにすべきだと思うんだ。

401 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:28:16 ]
>>400
参照が問題を複雑にしてくれるから、とりあえずエラーにするという選択肢じゃ解決にはならんだろうな。

402 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:29:03 ]
>>399
だったらC++なんか使うなよ

403 名前:391 mailto:sage [2007/04/17(火) 04:36:55 ]
ちゃんと規定があったんですね……改めてありがとうございました。
いくつかの値(hoge1とかhoge2とか)のポインタを保持しておいて、
デストラクタでファイルに書き出す、というクラスを
C++をやり始めた頃に作ってずっと使っていたのですが、
このクラスのデストラクタが呼び出されるよりも先に
hoge1やhoge2が破壊されてしまったらまずいじゃん、
ということに最近気付いたんです。



404 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 08:26:50 ]
>>403
親子関係だからセーフだね

親戚同士の順序依存するってーと >>389 での classB のコンストラクタに
classA のポインタとるようなやつとかかな

405 名前:391 mailto:sage [2007/04/17(火) 08:42:26 ]
書き方が悪かったんですが、実際そんな感じです
(コンストラクタではなくて、初期化ルーチンの中で
ClassB.AddItem()みたいな関数を使うのですが)。
C++はずっと独学でやってきていたので
すごく変な構造だったのではないかと不安だったんですが、
幸いにして(?)私にそこまでのオリジナリティーは
なかったようですね。ちょっと安心です。

406 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 08:50:19 ]
ifstream で デスクトップのファイルが読めません
ネットで検索すると同じ質問があるのですが解決してません
多分ファイル名の日本語がヤバそうなのです

環境はVC8のExpressで、Win32コンソールでCLR未使用
コマンドラインから使うタイプです
あとマルチバイトにしています
海外のソフトとかデスクトップ上のファイルが不可なので、日本語対応とかあるのでしょうか?

407 名前:オナニストガロア ◆HEfxsk5e3k mailto:sage [2007/04/17(火) 09:15:42 ]
rubyでは数値などもすべてobjectでしたがC++は違いますか?
C++が書けるとどういった利点がありますか?
ちなみに環境はVineLinux gccです

408 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 09:24:19 ]
基本型(int, double, char等のただの数値)はクラス(オブジェクト)じゃない。
正確に言うとコンストラクタは持っているけどC++の中で言うクラスではない。
当たり前の話だけど、利点はどう使うか、何に使うか、何と比べるかによる。

409 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 09:33:07 ]
・動作速度が速い
・静的型によるいくつかの利点(当然、静的型には欠点もある)
 ・オーバーロードが可能
 ・コンパイル時に型に関する大部分のバグを排除できる

とりあえず思いついたのはこのくらい。

410 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 09:41:34 ]
>>406
local.h

411 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 12:13:17 ]
>>406
WIn32は関数名の後ろにAが付いているものはANSI用で
感じはシフトJISとして扱われる。Wがついている物がUNICODE。

412 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:02:09 ]
ちなみにNT系でANSIなAPI呼ぶとUnicode変換されてWなAPIが呼ばれる

413 名前:348 mailto:sage [2007/04/17(火) 15:36:46 ]
デバッガ上でそう見えてただけで実際は正常だったyo
orz

エラーは別の原因。MFCのデバッグ版をリンクすると正常動作するのに、リリース版だと例外が発生。
うおーデバッグできねえ



414 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:47:23 ]
std::vector<int> v;
vに1, 3, 2, 3, 4がこの順番で入っているとします。
STLのremove()は処理後の有効な最後の要素を指すイテレータを返すので、
remove(v.begin(), v.end(), 3)とすると、返るイテレータは4を指していると思います。
だから、
v.erase(remove(v.begin(), v.end(), 3), v.end());
とすると、4から末尾まで消えてしまい、1, 2だけになる気がするのですが
どうしてならないのでしょうか?

415 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:51:16 ]
>>414
std::remove()は処理後の削除された無かった最後の要素の
"次の"位置を返す。つまりこの場合はv.end()を指している。

416 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:53:23 ]
チゴタ。3が削除され、それが4で上書きされる。

つまり、1, 2, 4, 4 となり、二つの4の最後の方を返す。

417 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:57:34 ]
これを見てもらえばremove()の動作がよくわかるはず。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
 int a[] = {1, 2, 3, 4};
 std::vector<int> v(a, a + 4);

 std::vector<int>::iterator pos = std::remove(v.begin(), v.end(), 3);
 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;

 v.erase(pos, v.end());

 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;
}


418 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 16:08:43 ]
>>414
>v.erase(remove(v.begin(), v.end(), 3), v.end());
>とすると、4から末尾まで消えてしまい、1, 2だけになる気がするのですが

なになに、3が2つとも消えるって言いたいの?
1 3 2 3 4
0 1 2 3 4
^ ここしか消えないよ


419 名前:418 mailto:sage [2007/04/17(火) 16:09:46 ]
行頭のスペースがトリムされたorz
最後の行の^は3を指している。

420 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 16:13:46 ]
1, 3, 2, 3, 4ならこちらで

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
 int a[] = {1, 3, 2, 3, 4};
 std::vector<int> v(a, a + sizeof(a) / sizeof(a[0]));

 std::vector<int>::iterator pos = std::remove(v.begin(), v.end(), 3);
 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;

 v.erase(pos, v.end());

 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;
}

421 名前:414 mailto:sage [2007/04/17(火) 16:34:17 ]
つまり、
removeの返却値は、vの先頭部分に形成された「指定値が取り除かれた配列」の最後の要素を指す
のでは無くて、
「取り除かれた配列」の後に続く部分の最初の要素を指す
1,3,2,3,4の例でいうと、v[2]を指すイテレータではなく、v[3]を指すイテレータが返る
ということでしょうか?

422 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 16:41:12 ]
>>421
そういう事だね。
std::remove()のアルゴリズム自体は要素を削除するというのではなく
削除対象以外の要素を前に詰める働きをする。
そして削除対象の要素の先頭を返すのでそれをerase()にかけてやれば
うまく削除対象が無くなるわけだ。

423 名前:MSDN mailto:sage [2007/04/17(火) 16:43:52 ]
このテンプレート関数は、first を X に代入し、次のステートメントを実行します。

if (!(*(first + N) == val))
*X++ = *(first + N);
このステートメントは、範囲 [0, last - first) 内の各 N に対して実行されます。
この関数は、結果として X を返します。
つまり、述語 *(first + N) == val を真とする要素だけをシーケンスから除去し、残りの要素の相対的な順序を変更しません。
さらに、変更されたシーケンスの終端を指す反復子の値を返します。

いくつ条件にマッチしたかに関わらず、end() が返る でおk?



424 名前:414 mailto:sage [2007/04/17(火) 16:44:36 ]
良く分かりました。皆様ありがとうございました。

425 名前:406 mailto:sage [2007/04/17(火) 20:12:18 ]
>>411
まじで!あの”A”が謎だった
ほっぺたが落ちたよ!

426 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 20:28:48 ]
>>406
std::locale::global(std::locale(""));をmainの頭に書いてもだめか?

427 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 20:41:05 ]
Aが謎だったて、msdn見りゃ書いてあるし・・・
そうでなくてもSDKのヘッダ見りゃ#define UNICODEで分けてあるし・・・

428 名前:406 mailto:sage [2007/04/17(火) 21:01:38 ]
>>426
それで出来ました ( ・`ω・´)ノ

429 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:09:17 ]
winsockを使った簡単なメッセージ送信プログラムで、
クライアント側で接続ボタンを押すと、サーバに接続して
メッセージを取得してそれを表示するというものを作っています。

[クライアント側]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3832.txt
[サーバー側]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3833.txt

↑がソースです。コンパイルはできるのですが、
取得したメッセージが5文字目から文字化けしてしまいます。
どうすればよいのでしょうか?

430 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:13:16 ]
>>429
お前の環境じゃsizeof(char*) == 4だからだろ

431 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:17:32 ]
>>430
レスありがとうございます。
buf = (char *)malloc(11);
とかにしても、やはり5文字目から文字化けしてしまいます・・・

432 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:20:37 ]
recv(sock, buf, sizeof(buf), 0);
おいおい
bufがcharの固定配列ならありだけど・・・

433 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:35:49 ]
>>432
char *buf じゃなくて char buf[1024] にして文字化けが
解消されました。ありがとうございました!



434 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:08:25 ]
って、思ったんですが、1024も文字が送られてくることはめったにないのに、
それだけの領域を用意するってのはもったいなくないですか?
どうにかできないでしょうか?

435 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:15:05 ]
別に大したサイズじゃないしそれくらいどうってことない

436 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:39:51 ]
buf = (char *)malloc(sizeof(char *));
まずここがおかしい事に気づくべし。

#define BUFFERMAX 1024
buf = (char *)malloc(sizeof(char) * BUFFERMAX);

固定長文字列がイヤなら、最初に固定長数値型で文字数を取得しとくべし。

437 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:43:01 ]
sizeof()の結果はコンパイル時にきまるから
動的には求まらないから

438 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:57:28 ]
釣れますか?

439 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 23:08:24 ]
えさが悪いよ。取り替えなさい。

440 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:12:15 ]
釣りではないんです・・・頭が悪いだけなんです・・・
とりあえず>>435で納得することにしました。新たに問題が・・・

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3835.txt

サーバー側からメッセージを何回か受信し、受信するたびに改行して表示していきたいのですが、
lstrcatが上手く動作しません。lstrcatというよりもstrcpyの動作をしてるような感じです。
何が原因なのでしょうか?

441 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:22:01 ]
いろいろ言いたいことはあるソースだが、
受信データがヌルターミネートされてないオチとみた。

442 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:49:41 ]
つまり、受信に問題があるという事でしょうか?

443 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 01:00:10 ]
いや、あなたにはまだネットワーク以前に覚えなければいけないことが多々あるということ



444 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 01:01:17 ]
GetWindowText(h2 , (PSTR)intxt , 32768);
GetWindowText(h1 , (PSTR)logtxt , 32768);
lstrcat((PSTR)logtxt, "\r\n");
lstrcat((PSTR)logtxt, (PSTR)intxt);
SetWindowText(h1 , (PSTR)logtxt);

とりあえず、エディットのウィンドウを2つ作って、↑のような形でlstrcatをやってみたら、
目的の表示を得ることができました。受信データがヌルターミネートされてない事が原因なら
どうすれば解決するのでしょうか?

445 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 01:57:09 ]
例えば、素数を解くプログラムみたいなもので、
頭悪いプログラムと、効率化をほどこしたプログラムでは、
計算処理の実行時間が、どれほど違ってくるものか調べてみたいのですが、

その実行時間を調べるには、どうしたら良いのかがわかりません。
環境はLinuxでgccコンパイラを使ってます。 教えてください。

446 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 02:00:52 ]
>>445
プロファイラを使うのが一番。
gcc関連でプロファイラツールがなんかあったと思うからそれ探してみ。

447 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 02:03:55 ]
>>444
ヌルターミネートすればいい

448 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 04:17:19 ]
>>445
int t1 = タイム
・・・
int t2 = タイム
時間 = t2 - t1

ってやってる
1行ソース変えて性能うpしたかどうか程度ならベンピ

449 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 06:54:40 ]
>>445
つ[rdtsc]

>>448
time()使うなら、difftime()を使うべきかと。
#ま、どうでもいいといえばどうでもいいけど。

450 名前:ほんとの初心者 [2007/04/18(水) 11:44:16 ]
くだらない事で本当にすいません。VC++6.0、SP6です。

4バイト長の64k個のデータの配列を示すvoidポインタがあって、
そのデータを64k個のfloat型のデータとして読み込みたいだけ
なんですが、どうしてもうまくいきません。


#include "stdio.h"

void *buffer;//(ここに4バイト長のデータが64k個ある)
float val[0x10000];//64k個のfloat型の配列を用意した。

//val配列で、bufferの指し示すアドレスから始まる64k個のデータを受け取りたい。
for (i = 0 ; i < n ; i++)
{
val[i]= * (float*)(buffer + i);
}

どう直せばいいのでしょうか。すんませんが教えてください。
よろしくお願いします。

451 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 11:53:41 ]
「うまくいきません」を説明してください。

452 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 12:01:10 ]
>>451
あんたなんかむしむし

453 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 13:09:17 ]
((float*)buffer)[i]



454 名前:ほんとの初心者 [2007/04/18(水) 13:47:22 ]
>>453
ああ、そうやって書けばいいんですか。ありがとうございました。

本見てもググッても、voidポインタが配列を指し示している例がなかなか
見つからずに困っていました有難う。

455 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 14:59:47 ]
というか、ふつうは先に
float *buffer = (float*)void_buffer;
とかやると思うけどけどね

456 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 14:59:54 ]
ポインタがどういうものかが分かっていれば、
別に void ポインタが配列を指していない例からでも
このくらいは分かることだろう。

ここで、なぜそれでうまくいくのか、を深く考えておかないと、
後々また困ることになると思われる。

457 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 17:39:33 ]
C++でコメントをドキュメント化する際のデファクトスタンダードってなんでしょうか?
C#やJAVAみたいに言語レベルで存在しないので、何がよいか捜してます。

458 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 17:41:46 ]
有名どころはDoxygenかな

459 名前:ほんとの初心者 [2007/04/18(水) 18:22:59 ]
>>455-456
追加のアドバイス感謝します。本には配列が初めのアドレスを指すポインタ
だからポインタに配列名を代入してやれば良いとか、いろいろ書いてあって
書いてある事は読めばわかるのですが、まだなかなか応用は利きません。
今回のアドバイスでまた一つ勉強になりました。

460 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:34:28 ]
int a = 10, b = 20;

この2つの変数 a, b の値を一時変数を使わずに相互に
入れ替えるテクニックがあったとおもったけど
どんなんだったっけ?

461 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:35:45 ]
C99の規格書はどこかでダウンロードできませんか?


462 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:42:43 ]
>>460
#define SWAP(a, b) (a += b, b = a - b, a -= b)
でど?

463 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:45:13 ]
>>461
JIS X 3010 : 2003 が ISO/IEC 9899 : 1999 に相当する。
JISC のウェブサイトから入手できるはず。



464 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:47:21 ]
>>460
a ^= b, b ^= a, a ^= b;

465 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:47:37 ]
>>460
ttp://www.dd.iij4u.or.jp/~okuyamak/Information/xor_fixed_swapping.html

466 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:48:25 ]
>>461
www.jisc.go.jp/
JIS検索→規格番号 X3010

467 名前:457 mailto:sage [2007/04/18(水) 20:42:33 ]
>>458
DOxygenってJavaDocスタイルなんですね。
ちょっと使いやすいか確認してみます。

468 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 20:45:40 ]
Doxygen作ったやつは凄いと思う

469 名前:460 mailto:sage [2007/04/18(水) 21:00:16 ]
>>462
>>464
>>465
アリガd
無理に使う必要はないのね

470 名前:デフォルトの名無しさん [2007/04/18(水) 21:48:31 ]
XOpenDisplay()やってなかなか返って来ない時、タイムアウトさせるには
どしたらいいですか?

471 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 21:53:27 ]
>>465の例は極端すぎだな。
確かにC/C++でswapすることはあまり意味が無い。
だが、8bit程度の超小型マイコンではまだ現役だね。

472 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:35:06 ]
C++の文法についてなんですが
派生クラスで新たに作ったメソッドが基底クラスのプライベート属性にアクセス
できないのがどうも納得いかないというか。

派生クラスに何も書かなければ基底クラスと同じコードを書いたと見なされ、
違う機能だけ書き足せば良い、というのが継承だと解釈していたんですけど、
その解釈でいくとアクセスできる筈な気がして仕方がないです。
引数付きコンストラクタがそのままでは継承されないのもイマイチ意図が
わかりません。
何か根本的な継承の精神を誤解しているんでしょうか?

473 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:41:20 ]
>>472
じゃ、おまいが新しい完璧な言語を作ればいい



474 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:44:24 ]
>>472
そのためのpretectedだ。

protectedなメンバ変数はどの派生クラスでも書き換えられるのだが、
逆に言えばどこから書き換えられているのか把握しづらくなるということで、
実際のところグローバル変数と同様に推奨されていない。
(やるならせめてprotectedなアクセサ書けということだ)

475 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:45:48 ]
>>472
何言ってんだお前?

476 名前:475 mailto:sage [2007/04/18(水) 22:46:29 ]
ごめん
ちゃうねん
>>473 あてのつもりやってん
>>472 まじごめん

477 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:12:14 ]
そこで
#define private public
ですよ

478 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:14:30 ]
>>474
有難うございます
う〜ん、わかったようなわからないような…継承の設計意図

派生クラスで新たに作ったメソッドが基底クラスの属性の値を
書き換えはしなくても取得したくなることは良く出てきそうな気がして…
(実際にC++でまともに組んだことはまだ無いですが)

479 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:22:56 ]
protectedはテンプレートメソッドやファクトリメソッドといった
デザパタを意識した設計になると自然と出てくる。
abstractや空実装であることも多く、実装クラスに特性を与えるためによく使われる。

でも既存アプリのカスタマ屋さんあたりだと
バグがあったときに直しやすいからprivate禁止だ
という方針を立てる人もいる。
ケースバイケースってことでこれもアリかなと思う。

480 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:50:54 ]
>>472
よくクラスの継承を動物とか哺乳類とか犬に例えたりするけど、
どんな哺乳類だって動物の基本的な性質は変更できないわけで。

481 名前:デフォルトの名無しさん [2007/04/19(木) 00:13:02 ]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3839.cpp
このプログラムをコンパイルするとこんなエラーがでてくるのですが↓

program.cpp: In function ‘int convert_vector_space(Vector, int, int, unsigned char*)’:
program.cpp:90: error: invalid types ‘unsigned char[int]’ for array subscript
program.cpp: In function ‘int convert_image_space(Vector, unsigned char*)’:
program.cpp:101: error: invalid types ‘unsigned char[int]’ for array subscript

どう修正すればいいでしょうか
コンパイラはGCC 4.1、OSはLinuxです

482 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 00:23:14 ]
>>481
pimage[y][x]と書こうとしても、pimageが只のunsigned charへのポインタなのでできない。
幅も関数に渡して、pimage[y * width + x]とすればいい。

483 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 00:24:19 ]
もし毎回書くのが嫌なら、static int offset(int x, int y, int width) {return y * width + x;}でも用意しておけばいい。



484 名前:デフォルトの名無しさん [2007/04/19(木) 00:36:19 ]
>>482-483
そういうことなんですか
ありがとうございます

485 名前:デフォルトの名無しさん [2007/04/19(木) 01:12:35 ]
VC++6.0(WTL7)にて。
COMオブジェクトを作成して使いたいんだが、方法が全くわからん。
DLLはregsvr32済みだとして、文字列かGUIDでインスタンスを生成したい。
参考サイトでもいいので教えてエロい人><

486 名前:481 [2007/04/19(木) 08:08:39 ]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3840.cpp
直して途中にベクトルの成分を出力するルーチンを追加しました。
コンパイルの通るものができたのですが、

Width:256 Height:256
0 0 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
0 0 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
(以下省略)

と言う風に結果が反映されないようです。

Width:256 Height:256
0 0 252 47 19 86 35 109 33 48 100 67 65 62 81 56 51 10
4 0 250 43 11 80 31 101 31 41 105 65 68 59 88 67 41 8
(以下省略)

こんな感じの結果を出したいのですが、どう修正すればよいのでしょうか?

487 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 08:13:02 ]
> fprintf(fp,"%c ",vect[i].data[j]);
< fprintf(fp,"%d ",vect[i].data[j]);

違ったら済まん。

488 名前:481 [2007/04/19(木) 08:21:24 ]
>>481
サンクスです。

Width:256 Height:256
0 0 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
0 0 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
(以下省略)

の中身は

Width:256 Height:256
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(以下同様につき省略)

でした。
何がいけないんだろう・・・う〜ん

489 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 08:52:52 ]
たぶん、convert_vector_spaceの第一引数がダメぽ。
今のまんまだとvector[0...4095]をコピーして渡しちゃう。ポインタを渡さないと値を変更できない。
# で、あってる?

int convert_vector_space(Vector *vect,int offx,int offy,unsigned char *pimage);

/* 画像データをベクトル化する */
for(j=0; j<block_y; j++){
for(i=0; i<block_x; i++){
chk = convert_vector_space(&(vector[j*block_y+i]),4*i,4*j, image);
}
}


/* 4*4の画素ごとにブロック分割し、データを列ベクトル化する */
int convert_vector_space(Vector *vect,int offx,int offy,unsigned char *pimage){
int i,j;
vect->x_start = offx;
vect->y_start = offy;
for(j=0; j<4; j++){
for(i=0; i<4; i++){
vect->data[4*j+i] = pimage[(offy+j)*XLENG+(offx+i)];
}
}
return 0;
}

490 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 10:48:28 ]
>>485
C/C++と関係ないのでスレ違い

491 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 12:51:15 ]
>>490
スレ違いじゃねぇだろ
単純にCOMサーバ使うコーディングが分からないんだろ

>>485
#import でググれ


492 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 21:25:54 ]
>>491
#importだとGoogleは#を無視してくれるので悲惨なことになる。

493 名前:デフォルトの名無しさん [2007/04/20(金) 14:44:09 ]
環境はVC6です。
ウィンドウのメッセージループ中でクラスを使用したい。
ボタンクリックでクラスのメンバー変数の値を変化させ、画面を閉じる際にそのメンバー変数の値により
処理を振り分ける。

こんな感じの処理を行いたいのですが、普通にクラスを定義すると頻繁にコンストラクタ処理が呼ばれ
負荷が大変なことになりそう・・・。

どういうふうに書けばいいのでしょうか?
アドバイスお願いします。




494 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 14:48:02 ]
は?
頻繁に呼ばれるって
ループ中で宣言しなけりゃいいだけだろ・・・

495 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 14:57:38 ]
フォームのメンバオブジェクトとしてそのクラス(A)を宣言し
メッセージ処理部分でAのメソッドを呼ばせるようにして
そいつから処理させればいいんじゃないの?

496 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 20:14:08 ]
>>493
まずはWindowsアプリがどんな構造を持っているか、そもそもクラスとは何なのか理解するべき。
MFCを使わずに開発しているとしても話は全く変わらないから、
とりあえずメインウィンドウをクラスとして書き出してみ。

497 名前:デフォルトの名無しさん [2007/04/21(土) 00:57:44 ]
>>492
com import イベント でぐぐったら悲惨な目に会った経験があるぞw

498 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 11:48:44 ]
標準入力に関しての質問です。例えば名字と名前を別に入力させて表示したい場合、以
下のコードを考えました。

char s[NUM];

fgets(s, sizeof(s), stdin);
s[strlen(s) - 1] = '\0';
printf("strint1 =%s\n", s);

fgets(s, sizeof(s), stdin);
s[strlen(s) - 1] = '\0';
printf("strint2 =%s\n", s);

入力文字数がNUMを下回っていれば想定どおりの結果になるのですが、オーバーフローす
ると残りの分がストリームに残り、それが2回目のfgets()に渡ってしまいます。このよ
うな場合、一端ストリームをクリアするのが定石でしょうか?あるいは他に良く使われ
る方法があるのでしょうか?

499 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 12:12:51 ]
>>498
NUMが1024なら、1500文字打ったとき?

while( fgets(s, sizeof(s), stdin) )
{
  ・・・・
}

こんなかな?
超えたら2回動く
テキストファイル読むときは、↑みたいな感じで書いた

500 名前:デフォルトの名無しさん [2007/04/21(土) 14:21:02 ]
沖縄県の方へ(命に関わる注意事項です)

沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄 三千万」で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…

※一国二制度
 簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
 (つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
 さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
 3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
 そして反日教育を受けた中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。

今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。

501 名前:やっぱ名無しにすべきですか? mailto:sage [2007/04/21(土) 14:23:34 ]
えっと、asmキーワードの意味を教えていただきたいです。

502 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 14:27:33 ]
>>498
fgets()の代わりにこんなラッパーでも使えば?
>>498のように、行にN文字以上入力された場合
残りを切り捨てたいというケースにしか使えないが。

char *xfgets(char *s, size_t n, FILE *f)
{
    char *p;
    int c;
    if (!fgets(s, n, f))
        return 0;
    if ((p = strchr(s, '\n')))
        *p = 0;
    else
        while ((c = getchar()) != EOF && c != '\n')
            ;
    return s;
}

503 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 14:36:34 ]
構造体にクラスを入れられるのは規制して欲しいな。
うっかりゼロクリアしてることに気づかないとか悲しいことが未だにある。
構造体はデフォルトがパブリックなクラスであるって考えはヤバイ。



504 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 14:44:51 ]
>>501
環境が分からんのでなんとも

505 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 14:50:56 ]
asmキーワードは、以後のブロックの中身が、
インラインアセンブリ言語での記述であることを示す。

506 名前:498 mailto:sage [2007/04/21(土) 16:28:22 ]
>>499 >>502
回答ありがとうございます

>>502
なるほど!理解できました。こんなのを短時間に考え付くのは流石ですね。
たったこれだけの要求にこの泥臭さはいかにもCだなぁ。これは課題の中
から疑問点を抽出して質問したのですが、実際の現場でのこのような要求
はほとんどないということでしょうか?

あと、関数の型がポインタなら、"return 0"ではなく"return NULL"の方が
自然だと思ったのですが、この書き方でもいいのでしょうか?

507 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 16:54:03 ]
>503
>構造体にクラスを入れられるのは規制して欲しいな。

structのメンバとしてclass変数を指定することを言っている?
そんなのstructを使わなきゃいいじゃん。
structが残っているのはC/C++のコード流用性のためだけにあるものだと思うけど。
classの中にstructメンバが入るのはあり得るとして新規にstructを定義して
classメンバを入らなきゃならない状況ってあるか?
CのコードをC++として流用する場合ならpublicになってなきゃつじつまが合わなくなると思ぞ。


508 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 16:55:50 ]
>>507
他の人が作った struct を使う場合の話じゃね

509 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 16:56:03 ]
>>506
ポインタが必要な場面に現れた0は、ヌルポインタとして扱われる。


510 名前:502 mailto:sage [2007/04/21(土) 17:07:17 ]
あーすまん、>>502だがちと修正。
- while ((c = getchar()) != EOF && c != '\n')
+ while ((c = getc(f)) != EOF && c != '\n')

511 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 17:12:28 ]
CからC++ではなく、OO系言語からC++なら
std::stringとかメンバにする人もちらほらいるかと。

512 名前:498 mailto:sage [2007/04/21(土) 17:38:07 ]
>>509
それは理解していますが、可読性という意味ではNULLの方が上かな、
と思いまして。というのも、私が一瞬理解できなかったからです。
未熟と言われればそれまでですが。

>>502
そうか… fがstdinとは限らないからですね。


513 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:44:18 ]
>>511
レガシーC使いでもちゃんと勉強している人は構造体をmemset()する愚は理解しているものだが。
実際漏れの勤める会社でも構造体をmemset()する癖のある香具師がど填まりしていたよ。
#std::stringじゃなくてCStringってところがあれだけど。

で、当人曰く、「memset()できないなら危なくて使えないな」という間抜けっぷり。



514 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:01:39 ]
= { 0 }; で初期化すればゼロクリアになるけど、
コンパイラによっては警告が出て鬱陶しいんだよな。

515 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:10:20 ]
そこでboost::value_initializedですよ

516 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:13:05 ]
>>513
なんでダメなんだっけ?

517 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:23:14 ]
>>516
多分、内部でSysAllocStringを呼んでるのでわ?
CStringを0でセットすると取得した領域がゾンビになるのでわ?

518 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:28:06 ]
>>517
すまん。構造体の方。
いっつもゼロ埋めしてるんだけど、これがまずいなら
オレは今から全裸でコンビニに行かねばならん。

519 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:31:52 ]
>>518
する理由は?
百害あって一利なしなのだが。
#これから食事なので、百害の詳細については後程。

520 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:43:22 ]
そら言い過ぎ

521 名前:518 mailto:sage [2007/04/21(土) 19:44:43 ]
>>519
自分で構造体を使うとき、誕生時に全ての要素がゼロであるような
使い方というか設計をしてるから。
他人のライブラリのときは、どうでもいいけど保険でゼロ梅してる。

とりあえず、もう服は全部畳んだ。

522 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:51:47 ]
WinAPI に渡す専用の構造体とかは、memset で 0 クリアすることが多いな
ZeroMemory だけど

523 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:03:31 ]
初期化構文使って
struct Foo foo = { 0 };
で済ますほうが簡潔な上に、ポインタや浮動小数点数等もよろしくやってくれるな。
まーPODを単にビット的にゼロフィルすれば良いと分かっているケースでは
memset()/bzero()/ZeroMemory()の類でもいいんでないの。



524 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:03:45 ]
>>516
非PODでは、仮想関数テーブルなどソースコード上にないメンバが存在する可能性がある。
また、浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていないので、
PODでもmemsetでの0クリアはするな(初期化子でならOK)といわれる所以。

525 名前:518 mailto:sage [2007/04/21(土) 20:06:10 ]
>>524
>浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていない
あ、そうだった! なるほど・・・うかつであった。
以後気をつけます。

ではこのままコンビニに行ってきます。

526 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:35:57 ]
>>522
つーかWinにおけるMS定義の構造体はMS自身がサンプルコードやらでZeroMemoryしてるしなぁ
まぁ、他環境への移植性を考慮するなら安易なmemsetはヤメテオケってことかと

527 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:04:08 ]
他の部分でバリバリ環境依存なコードを書いてる状態なら、
構造体の部分だけ移植性気にしてもしゃーないわな。

528 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:04:42 ]
MSつーかVisualStudioでも、Debugビルドで折角ローカルなオブジェクトは異常値を埋めてくれているのに
それをわざわざ無にしてバグの発見を遅らせることになりかねないね。

529 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:09:14 ]
>>528
VisualStudioの動作する環境で0クリが問題になるのか?
vtbl壊してたらどっちみち動かないだろ?ん?

530 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:38:13 ]
コンビニから帰ってきました。 今日はなんかスースーしてて寒いね。

いまさら環境依存とかいっても、実際ヌルポインタが0じゃない環境って
冷静に考えたらまず無いよね。浮動小数点も。
ま、そーゆーアーキテクチャが現存してるなら、それに携わるときだけ
気をつければいっか。

531 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:42:59 ]
スースーしてて寒いのか
こっちゃ蒸し暑いぜ

532 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:45:07 ]
俺は金○を広げながら書いてます。
>>528
意味分からない。

533 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:47:00 ]
別に 0 クリアは、異常値を無にしてるんじゃなくて
必要な値として 0 を入れてるんだろ?



534 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:59:21 ]
>>533
それが本来あるべき姿なのだが、
現実には>>513のようにとりあえず常に0クリアするという奴が後を絶たない。

535 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:21:47 ]
宣言時に入る異常値なんて必要無いし

536 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:36:04 ]
わざわざクリアされて作られた0値だって必要ない

537 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:50:55 ]
0クリアに頼らずに自前でオブジェクトイニシャライザ用意しとけと言う事か

538 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:51:41 ]
つまり構造体にはコンストラクタを設けろと。

539 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:54:36 ]
そして資源の漏れを防ぐためにデストラクタも設けろと
でRAII来たこれ

540 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 00:08:35 ]
そうしてクラスが出来上がっていく…

541 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 00:09:22 ]
ぶっちゃけC++にもBeanって言葉を導入してもいいかもなw

542 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 01:28:44 ]
データ構造とアルゴリズムの基本的なことを学ぶのに適した本を教えて下さい

543 名前:542 mailto:sage [2007/04/22(日) 01:30:25 ]
すみません、書き忘れました。C言語です



544 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 01:50:42 ]
>>539
そこまでするならクラスにしろよ、ってな話だな。

545 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 03:59:03 ]
VC++でウィンドウを表示して、その中でFLASHを再生したいのですが
どうすれば実現できるでしょうか

546 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:00:27 ]
>>545
IShockwaveFlash

547 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:07:22 ]
COM勉強してきます…orz

548 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:31:42 ]
>>538
つか、構造体は関数のない方がいいでしょ
使うときは通信とかの場合だし
32バイト単位とかで切ったりするんでしょ

>>542
C++じゃなく、C言語かね、理系?
30年前の凄い有名な本あるけど、・・・古い
Cアルゴリズム大百科、みたいなのがオススメ
中に、クイックソート、挿入ソート・・・、ニュートン法、ガウス・・・
とか載ってるヤツ

549 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 09:33:28 ]
WIN32の構造体だけはゼロクリアでいいと思うけどな。
MSがそういう使い方を推奨している以上そう使うのがどおり。
基本的にライブラリの実装者のやり方に合わせる。
それ以外ではいろいろ問題ありだから使わないけどね。

550 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 09:43:09 ]
「道理」(どうり)
「通り」(どおり)

551 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:14:29 ]
Win32の構造体は、いつもHOGE hoge = {sizeof hoge};で初期化している

552 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:33:55 ]
漏れは毎回毎回、menset か setmen で悩む

553 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:46:24 ]
構造体の初期化は
HOGE hoge = {0};がデフォ



554 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:54:00 ]
>>552
メーン、memはmenじゃないぜ〜

555 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:11:11 ]
要するに、アレだよな。

C言語コーダが
Hoge h = { 0 };
可能かどうかは自分で判断できるし、
作った時点では問題ないよな。

人様が作った構造体や、自作の構造体でもバカの一つ覚えで
memsetしちゃうのは問題アリじゃね。WinAPIで指定してる場合はともかく。

>>513 が言うように、個別の初期化は多少の手間は増えるけど
安全だし、それでいいと思うけどなあ。

#C++だって、わざわざ初期化リストを設けてるし(C++ならstructでも使えるよ)

556 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:13:03 ]
>>552 setmenって、男にナニをセットするんだ?
気になって気になって今日は良く寝れそうだ。

557 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:57:38 ]
setmenは男に何かをセットするんじゃなくて「セットする男達」だろ
常識的に考えて・・・

558 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:02:20 ]
YO! MEN!
いや、setmen は男を何かにセットする関数だろ
常識的に考えて・・・

559 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:10:18 ]
男の部分を何かにセットするわけか

エロいな

560 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:10:38 ]
>>551
そうしてたけど、最近の VC++ は警告出すから困る。
#pragma で抑制できるけど。

>>552
strcpy, strcat, strchr とか文字列に関するものは str が接頭辞になってる。
同じく、memset, memcpy, memmove とかメモリに関するものは mem が接頭辞になってる。
悩む必要性は無い。

561 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:35:11 ]
頻繁に使う構造体なら継承してコンストラクタ定義してしまえってじっちゃんが

562 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:44:51 ]
レガシーAPIに渡せないだろ

563 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:49:12 ]
こっちで変数定義したものを向こうへ渡すのなら、
アップキャスト(ポインタ・参照渡し)・スライシング(値渡し)が起こるだけで、
言語規格上問題ないだろ。

向こうでオブジェクトが作成され、自分はそれへのポインタを受け取るという場合に
派生クラスへのポインタで受けたら、言語規格上未定義にはなるだろうけどさ。



564 名前:552 mailto:sage [2007/04/22(日) 15:30:50 ]
>>560
そうなのか、memが初めなのか

脳内では、セット麺、麺セット、麺コピーって変換してた

565 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:13:33 ]
>>562
VC++ の CRect は RECT を継承したクラスなんだぜ。
でも、レガシーAPIに渡せるだろ?
仮想関数がないからな。

566 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:25:18 ]
>>565
仮装関数は関係ないだろ

567 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:25:32 ]
>>565
ちゃうちゃう。
CRectはRECTを継承してない。内部の最初に保持してるだけ。
is-aじゃなくてhas-aの関係
同様の方法でWinAPI32に引き渡せるMFCクラスあるでよ。

568 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:27:37 ]
>>567
CRectはRECTを継承しているよ

569 名前:567 mailto:sage [2007/04/22(日) 16:29:52 ]
>>565
ああ、ゴメン俺のまちがいだった。RECTの継承でよかったわ。

570 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 17:34:42 ]
レガシーAPIに渡せるってわざわざ自分で&付けてるのかよwwww
変換演算子あるんだから使えよカスwwwwww

571 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:06:24 ]
( ´д)ヒソ(´д`)ヒソ(д` )

572 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:06:58 ]
>>566
ああ、そうだ。関係なかった。すまん。

573 名前:デフォルトの名無しさん [2007/04/22(日) 18:24:12 ]
構造体をmallocしたときは初期化はどうしたらいい?
1.気にせずmemset
2.最近のmallocはゼロクリア保障なのでそれを信じる
3.地味に全部真面目に設定



574 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:22 ]
>>573
Cなんだよな。
1.自作の構造体で間違いないのならおk
2.保証されてるかどうかちゃんとCユーザーズマニュアルを見れ
3.一番安全

575 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:32 ]
一方ロシアはcallocを使った

576 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:57 ]
> 最近のmallocはゼロクリア保障
大嘘を付くな

577 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:41:35 ]
>>576
え、いや、ウソじゃないです。ごめんなさい。うそじゃないです。

578 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:55:40 ]
>>573
>最近のmallocはゼロクリア保障なのでそれを信じる
ってホントなの?どういう環境での話?

main() {
    for(;;) {
        struct { int i; } *s = malloc(sizeof *s);
        assert(s->i == 0);
    }
}

すぐに死ぬけど

579 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 19:05:37 ]
0 クリア保証してるのは calloc だろ。

580 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 20:38:22 ]
VC++2005で見た限りはvirtual関数があるとサイズが増えてるね。
#include <stdio.h>
struct TEST1 { int x; int y; };
struct TEST2 { int x; int y; void setXY(int x, int y) { this->x = x; this->y = y; }};
struct TEST3 { int x; int y; virtual void setXY(int x, int y) { this->x = x; this->y = y; }};
int main() { printf("%d %d %d\n", sizeof(TEST1), sizeof(TEST2), sizeof(TEST3));  return 0; }
結果
8 8 12


581 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 21:05:10 ]
>580
だから?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<148KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef