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


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

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



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


210 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:19:18 ]
>>208
定義が無いから賢いコンパイラなら定数データの領域は確保しないらしいね
(なので当然シンボルもない)
by メイヤーズ

定義してみなよ

const int A::CONSTDATA;

211 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:41:20 ]
>>203
187の場合で効果があるかどうかは別として、少なくともWindowsでは、
マルチスレッドでも複数の論理CPUを使ってくれる。

212 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:46:47 ]
Linuxにとっては、スレッドはプロセスと基本的には同じ。
従って、特定のスレッドがどのコアで実行されるかは
原則的にカーネルにゆだねられる。

213 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 17:07:17 ]
>>210
なんと・・・

6 class A
7 {
8 static const int CONSTDATA;
9 public:
10 void func()
11 { extfunc(CONSTDATA); }
12 };
13
14 const int A:CONSTDATA = 0x100;

でOKでした,#defineしちゃいそうだけどここは我慢・・・
サンクスです

214 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:00:56 ]
>>213
初期値の指定はクラス定義内でいいんだぜ。そうしないと配列要素数とかの
定数式につかえない。

>>210
クラスのメンバ変数は定義しない限り実体がなくて、参照やポインタを取ろうとすると
エラーになることは決まっている。整数型に限って初期値をクラス定義内に書けて、
書けば定数式に使えるという特別ルール。

215 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:03:41 ]
>>206
DLL 内で throw されて DLL 内で catch されてるんでしょ。何も問題ない。

216 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 00:33:03 ]
暗号アルゴリズムを勉強しはじめたところなのですが、
DES や AES など、一般的な暗号方式のライブラリはありませんか?
C でも C++ でもいいです。

ご存知のかた、もしくは自作モノを持っているかた、情報をお願いします。

;; できれば SHA-1 や base64 まで対応していると嬉しいですが、
;; 無くても構いません。



217 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 00:39:48 ]
勉強なら自分で作れ。ライブラリを使えるようになっても勉強にならないぞ
あとSHA-1やbase64は暗号じゃない

218 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 00:58:37 ]
>>216
opensslとかか?
まぁでも>>217に1票



219 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:07:12 ]
>>214
だからEffectiveC++に載っていると。。

220 名前:203 mailto:sage [2007/11/10(土) 01:21:43 ]
>>211-212
情報サンクス。
良く知らんことしゃべってすまんかった。

221 名前:187 スレッド出来ました [2007/11/10(土) 03:02:08 ]
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 100
#define K 320000
unsigned int su[N][256]; char fname[N][256],chk[N];

unsigned WINAPI open(void *p){
unsigned long size,n=(int)p; char *buf=new char [K+100];
HANDLE fp=CreateFile(fname[n],GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
while(1){ ReadFile(fp,buf,K,&size,NULL); if(size==0){chk[n]=0;return 0;}
for(int i=0;i<size;i++)su[n][ (unsigned char)buf[i] ]++;}}

main(){ WIN32_FIND_DATA fd;
char path[200]="d:\\aaa\\",serchpath[200];
strcpy(serchpath, path); strcat(serchpath, "*");
SetCurrentDirectory(path);
HANDLE hd = FindFirstFile(serchpath, &fd);
int n,i; HANDLE hf[N];
for(n=0;n<N;n++)for(i=0;i<256;i++)su[n][i]=0;for(n=0;n<N;n++)chk[n]=0;

for(;;){ if(chk[n]==0){
for(;;){if(!FindNextFile(hd, &fd))goto end;
if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;}
strcpy(fname[n],fd.cFileName); chk[n]=1;
hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)n, 0 ,NULL);}
n++;if(n>=N)n=0;}
end: WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=1;n<N;n++)for(i=0;i<256;i++)su[0][i]+=su[n][i];
for(i=0;i<256;i++)cout<<i<<" no kosu "<<su[0][i]<<endl;}

222 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 08:40:14 ]
>>221
>for(;;){ if(chk[n]==0){
最初にこの行に到達するとき n=N だぞ。

223 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 10:27:45 ]
>>219
本は持ってないので知らないけど、クラス定義内の static const な整数型について
>210 みたいに「賢いコンパイラなら〜」って書いてあるなら、ちょっと不正確だと思う。

224 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:24:44 ]
>クラスのメンバ変数は定義しない限り実体がなくて、

これは必ずしも正しくないということが書かれてるよ。
これを実現するコンパイラがいわゆる賢いコンパイラ。
標準で、絶対に領域確保がされないことが保障されている
わけではなく、実装依存となる。static constなデータは、
確保されるならば、大抵静的領域になる。アドレスを必要とする
処理がある場合に限って(この場合は必ず領域確保が必要)領域
を確保してもいいし、無条件に確保しておいてもいい。
それは実装依存ということ。
領域確保を絶対に避けたければenumを使えばいい。

225 名前:224 mailto:sage [2007/11/10(土) 11:27:22 ]
>クラスのメンバ変数は定義しない限り実体がなくて、

というのは、もちろん非staticなメンバーについては正しい。
上で書いたのはstaticなメンバーについて。

226 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:34:49 ]
>>210>>214>>223

BCCで>>208で引っかかって調べたときに
>>208は新しい規格で>>213は古い規格」
みたいな記述を見たんだが。

コレがホントなら、「賢い」とかあんまり関係ないんじゃね?

正確なところ知ってる人、フォローplz


227 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:50:28 ]
>>226
ポインタや参照とかのアドレスを必要としない場合でも常にメモリ確保
を強制されるというのを新しい規格で認るのは信じがたいけど。

正確なところ知ってる人、フォローplz

228 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 12:43:08 ]
>>224
さっきから実装依存だと言ってるのって、名前空間スコープに定義した const 変数の
話じゃないの?

クラスの static const なメンバ変数はクラス定義内では宣言しかされないので、
別途定義が必要。整数型に限って、宣言につけた初期値を持つ定数式として使える
という特別ルールがあるだけ。

C++ 2003 規格の 9.4.2 p2 より
> The declaration of a static data member in its class definition is not a definition and may be of an
> incomplete type other than cv-qualified void. The definition for a static data member shall appear in a
> namespace scope enclosing the member’s class definition.

同じく 9.4.2 p4
> If a static data member is of const integral or const enumeration type, its declaration in the class
> definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that
> case, the member can appear in integral constant expressions. The member shall still be defined in a namespace
> scope if it is used in the program and the namespace scope definition shall not contain an initializer.




229 名前:228 mailto:sage [2007/11/10(土) 12:53:51 ]
あ、整数型の static const メンバ変数については "if it is used" ってあるから、
定数式の一部として使うぶんには定義は必要無いね。参照やポインタを取られる
可能性があるなら関係ないけど。

>208 の例もあるし、ライブラリとして提供するような時には気をつけて定義しとかないと
まずいね。


230 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 14:09:21 ]
>>228
thx

231 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 14:23:44 ]
bind1stやbind2ndの戻り値は何でしょうか?
どういう性質のものなのか?あと型名とか。

232 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 15:20:54 ]
binder1stやbinder2nd

233 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:13:27 ]
>>232
それは引数を一つとるoperator( )が定義されている関数オブジェクトの
クラス型ということですよね?

234 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:36:10 ]
そう。
直接binder1stやbinder2ndを使っても問題は無いんだけど、
その場合はbinder1st<ここを書かなきゃいけないのがめんどいよね>。

235 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:42:20 ]
>>234
どうも。
ストラップ本で理解できました。

236 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 18:11:21 ]
紐本?

237 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 18:14:49 ]
禿本

238 名前:デフォルトの名無しさん [2007/11/11(日) 15:11:11 ]
VC6.0でかかれたプログラムをVisualStudio2005に移植しようとしてます。

あるプロセスでstrtok()で、トークン分解中に静的リンクしたDLLの関数を呼んでいます。
その関数内でもstrtok()してるらしく、関数終えて呼び出し元で続きのstrtok()をしようとすると、意図しない値(具体的にはNULL)が入ってしまいます。

MSDNにはCランタイムライブラリの頁に静的リンクなら問題ないようなことを書いてますが、
なぜstrtok()が静的リンクした関数にひきづられるのでしょうか。
あとVC6.0の頃は引きずられなかったのでしょうか。

環境:XP MFC




239 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:26:26 ]
>>238
strtok() はヌルを渡されたときのために前回の分割位置を静的な変数に覚えている
ことがある。だから、基本的にそういう使い方はできない。

msdn2.microsoft.com/ja-jp/library/abx4dbyh(VS.80).aspx
静的リンクで DLL との競合が起こらない理由もちゃんと書いてある。
VC8(VS2005) でも静的リンクは使えるから、明示的に指定すれば同じ動作に
なるんじゃないの?

240 名前:238 [2007/11/11(日) 17:30:02 ]
>>239
ありがとう。
自分もその頁見てたけど、静的リンクするのはCRTであって、
こちらが作ったDLLじゃないわけですね。
そこを勘違いしてました。

結局どのコンパイラオプションを選べばいいか調べきれなかったので
VC6.0の時は適切なコンパイラオプションだったんだろうけど、今回はstrtok_s()使うことにしました。

241 名前:デフォルトの名無しさん [2007/11/11(日) 17:38:52 ]
符号なし整数だとオーバフローが起きない
というような話をときどき伺うのですが、
どういうことなのか理解できません……
教えて頂けませんか?

242 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:56:28 ]
オーバフローが起きないなんてことはないので忘れてください

243 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:00:02 ]
>>241
符号なし整数の計算では、最大値の次が 0 で 0 の前が最大値というふうにラップしている
ものとして結果が必ずその型の範囲内に収まる、と規格で定められている。

ラップする場合を指してオーバーフローと言うかどうかは微妙なところ。

244 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:28:41 ]
>>243
なるほど、納得できました
ありがとうございます

245 名前:デフォルトの名無しさん [2007/11/11(日) 18:50:42 ]
はじめまして。
初心者です。
C++について質問があります。
ArrayとVecotorの全ての値をファンクションに渡して、Arrayの全ての値をReturnしたいのですが、
うまくいきません。
コールの仕方と、プロトタイプの書き方、それからReturnの書き方を教えてください。

もしくは、何か別の方法をしないといけないのでしょうか…?

よろしくお願いします。

246 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:58:21 ]
>>245

Array とか Vecotor とか聞いたことないけど
int なり何なりと変わらんと思うよ

Array func(Array a)
{
 /* a についていろいろ処理 */
 return a;
}

void func(Array *a)
{
 /* a についていろいろ処理 */
}

247 名前:245 [2007/11/11(日) 19:14:29 ]
>246

IntやDouble、Char等のScalar変数(ひとつの値しか含まない変数)なら
うまくいくのですが、ArrayやVectorのようなCollection変数(二つ以上の値を含む変数)は
なぜかうまくいかないのです。

Int型Arrayについて、
Int myFunction(myArray[])

Arrayについて処理

return myArray[];

や、
String型Vectorについて

String myFunction(myVector[])

myVector処理
 
 return myVector[];


のようにやろうとしているのですが、間違えているのでしょうか…?

248 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:36:53 ]
>>247
コンパイルもできないコードを貼って「間違えているのでしょうか…?」って、何考えてんだ?
エスパーでも募集してんのか?

とりあえず C/C++ では大文字小文字が区別されるから、区別しろ。いまのままじゃ
めちゃくちゃすぎる。

実際にコードを書いてコンパイルしろ。そしたらエラーメッセージが出るから、それを嫁。



249 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:36:59 ]
何がやりたいのか、まだよくわからないなぁ。

250 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:38:02 ]
これはC/C++なの?
myArray/myVectorがテンプレートなのかも怪しいけど
STL前提ならこう書くんじゃないか

// int型のベクタを定義
typedef std::vector<int> myIntArray;

myIntArray myIntFunction(myIntArray array)
{
  myArray::iterator i = array.begin();
  myArray::iterator e = array.end();
  while(i != e) {
    // arrayに対する処理(要素に1を足す)
    *i += 1;
    i++;
  }
  return array; // 処理結果を返す
}



251 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:42:54 ]
わりぃ
  myIntArray::iterator i = array.begin();
  myIntArray::iterator e = array.end();
だわ

252 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:08:26 ]
for_each使ったほうがよくね?

253 名前:エスパー mailto:sage [2007/11/11(日) 20:12:05 ]
>>247
そのArrayやVectorはコピーできない
だから関数にそのまま渡すことも返すこともできない

254 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:41:47 ]
とりあえず何だ。
Int って何だ。Array って何だ。String って何だ。C/C++ にそんなものはない。

しかも、せっかく
>Array func(Array a)
ってアドバイスもらってるのに、
>Int myFunction(myArray[])
って思いっきり無視してるし。

255 名前:デフォルトの名無しさん [2007/11/11(日) 21:58:30 ]
すみませんスレチかも知れませんが質問です。

Windows VistaとVisual C++ 2005 ExpでOpenGLを使い簡単なゲームアプリを製作しました。
友人AのVista機ではなんら問題なく動作したのですが、友人BのXPでは動作しませんでした。
友人A、BともにOpenGLのDLLは入っています。

どなたか解決のヒントでもいいのでご存じであればよろしくおねがいします。

256 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:02:47 ]
msvcr80.dllがなんたらっていうエラーメッセージだったら、
VC++ 2005のランタイムを入れろ。

257 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:02:51 ]
Visual C++のランタイムは入ってるかね?

258 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:08:27 ]
聞いてみたところ、ランタイムは入ってるとのことでした。エラーメッセージは
『このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。
アプリケーションを再度インストールすることにより問題が解決する場合があります。 』
らしいです。Vista環境では正常に動作するのですが……



259 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:22:56 ]
じゃあ.NET Frameworkかな

260 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:45:16 ]
これからVC++を学ぶ場合でもMFCは有効ですか?
それともMFCは今後使用されなくなっていくことが濃厚で
.NETとCLR?(この違いはわかりませんが)を勉強
したほうが良いでしょうか?

261 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:46:08 ]
>>258
エラーメッセージでググったら、こんなの出てきたがどうよ?
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060025.txt

262 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:57:08 ]
>>260
個人的な意見

.NETで良いと思う。
でもどっちみち、ちょっと突っ込んだことしようとすると
Win32APIをガシガシ叩くことになるんで、
まずはウィンドウに子ウィンドウ貼り付けて絵と文字を表示するぐらいは
Win32APIを触っとくのが良いと思う。
1週間も掛からんと思うし。

263 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:05:56 ]
>>262
何か一冊.NETの本読んでみます。

ちなみにCLRは.NETとは関係無いものですか?
.NETはVBやVC#でも共通に使えるものでCLRはVC++
固有のものですか?

264 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:07:11 ]
C++でのゲームの組み方について質問よいでしょうか

現在シューティングゲームを作ってるのですが、以下のようなタスクシステムで行なっています

class ITask
{
virtual void task()=0;
virtual void draw()=0;
};

class CEnemyZakoA : public ITask
class CEnemyZakoB : public ITask
class CEnemyFactory : public ITask
class CBg : public ITask
class CItem : public ITask

こんな感じで、全てのオブジェクトはITaskを継承し、一つのITaskリストに登録しています。
そこで疑問なのですが、Task同士が連携するにはどうすればよいでしょうか?

例えば「CBgの持つ『どのくらいスクロールしたか』の情報によって、CEnemyFactoryは生み出すZakoの種類を変える」
といった場合です。
一応素人考えながらこういう手を考えましたが、一般的にはどうするべきなのでしょうか?

1・FacotryのようなほかのTaskの情報に依存するものは、リストに登録せず特別扱いする(CEnemyFactryとして保持しておく)べき
2・他のTaskに依存するTaskは、その生成時にそのTaskへのポインタをもらっておくべき
3・他のTaskに影響を与える情報をまとめた構造体を持ち、それへのポインタをtask()の引数で渡してあげるべき

1はいまいちだと思います。特別が増えるたびに管理が増えますし、何のためのITaskリストなのかわかりません
2はなかなかいい手ですが、CBgが削除された時などに困ります(share_ptrを使うべき?)
3は構造体に新しい情報が加わるたびに、全てのCXXX.cppが再コンパイルになるのが不満です


265 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:15:15 ]
>>264
こちらへ↓どうぞ。

タスクシステム総合スレ
pc11.2ch.net/test/read.cgi/gamedev/1173708588/

266 名前:263 mailto:sage [2007/11/11(日) 23:17:22 ]
解決しました。
入門書にも書いてありました。

267 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:42:05 ]
>>261
ありがとうございます!上手く行きました!
他にも助言頂いた方々本当にありがとうございました。

268 名前:デフォルトの名無しさん [2007/11/12(月) 15:09:38 ]
すまそ。JavaやPHPやVBやってたんだけど、C++やることになりました。

MFCだかCLIだか知らんけど、それを上なぞりするだけの言語仕様がつかめる
C++の本ないですか?一から細かいことまで調べる必要ないので。

C++も一応はわかっています。MFCとかCLIがソース見て理解できる程度の
上辺の知識を理解できるまでの文法力がつく本ってないですか?細かい言語使用は
適宜分厚い本でしらべるので。。よろしくお願いします。



269 名前:デフォルトの名無しさん [2007/11/12(月) 16:15:11 ]
サイズ不明のファイルの内容を全部読み込む際に
動的なメモリの割当をしたいとき、どのようにしますか?

i=0;
while(fgets(...) != NULL ){
++i;
}

とやってからnewとかmallocとかで配列を確保するのかなあ
とか考えましたけど、どう考えても余計な事をしているようで…

270 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:29:18 ]
>>269
つ[std::vector]
つ[realloc()]

271 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 17:00:39 ]
>>269
filelengthとか何らかの手段を使って、ファイルサイズを先に調べて、一気に割り当てる。

標準入力やパイプのようにサイズがわからない場合は、ある程度の大きさのブロックごとに
読み込み、ブロックのlinked listを作成する。大きさがあまり大きくないことがわかっているなら
reallocもあり。

272 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 17:21:57 ]
>>269
バイナリモードでファイルオープンしてシーク操作でファイルサイズ取得
ifstream
seekg
tellg

273 名前:デフォルトの名無しさん [2007/11/12(月) 18:49:16 ]
C++ に thisってないの?
class sample {
int power;
public setPower(int power) {
this.power=power;
}
};
ってしたいんだけど、文法的に間違いだよね?

274 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 18:52:55 ]
>>273
Javaとは違って、
this->power


275 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:17:31 ]
>>273
C++のthisはポインタ

276 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 11:42:55 ]
VC++2005(Express) で以下の可変長自動配列を使うコードが通ってくれません(g++では大丈夫でした)
可変長自動配列はC99からサポートされたらしいですがVC++ 2005は未対応?
固定長/ヒープにすればそれで終わりなのですけど、折角の便利仕様なので使いたい・・・

static cosnt int ARRAY_MAX 256

bool variable_array_test(int variable_len)
{
if (variable_len <= 0 || variable_len > ARRAY_MAX)
return false; // bad length

 char temporary[variable_len]; // << C2054 でエラー

 return true; // ok
}

c:\ cl
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86

CXXFLAGS = -nologo -Zm200 -GS -Od -Zi -Gm -MDd -GR -EHsc -W


277 名前:273 [2007/11/13(火) 11:52:33 ]
>>274-275 ありがとう!どうせ、こんなとぼけた質問には返事がきてないだろう
とおもったら、来てた。おかげでよくわかりました。使い方と理屈が。
PHPのも参照だから矢印記号なんだ。なるほど、なるほど。お礼が遅くなり申し訳ないです。

278 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 11:53:21 ]
VCはC99対応していない。
以上



279 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 12:05:27 ]
>>278
('д`;)・・・把握,mingw入れて吊ってきます

280 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 12:06:32 ]
C++のコンパイラとして見ればVC8は結構優秀なんだがねぇ…

281 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 16:06:15 ]
そもそもC99とC++98って一緒に使えるの?

282 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:14:06 ]
C++ の std::vector 使えばいいじゃんって事なんだろう。

283 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:57:52 ]
C99はいらない子

284 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 01:48:09 ]
可変長引数マクロだけはヨコセ

285 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 01:50:52 ]
どうせなら__FUNC__もあるとうれしい。

286 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:44:38 ]
>>284-285
両方 C++0x に入るみたい。ただし __FUNC__ じゃなくて __func__ ね。

287 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 07:41:10 ]
で、C++0xまだー?

288 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 10:34:46 ]
Cにclassが追加されるのも時間の問題だな



289 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 11:41:06 ]
てかCいらねー

290 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 12:53:51 ]
デバッグログ出力関係で可変引数マクロ使ってるんだが、
これも止めた方がいい?

291 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 12:54:47 ]
あ、ヨセじゃなくてヨコセか

292 名前:デフォルトの名無しさん [2007/11/14(水) 13:49:55 ]
#include <string>
using namespace std;
class Palindrome{
private:
char *inputValue;
public:
Palindrome();
void setInputValue(char*);
bool isPalindrome();
~Palindrome();
};
Palindrome::Palindrome(){
this->inputValue = new char[100];
}
void Palindrome::setInputValue(char *str){
strcpy(this->inputValue,str);
}
Palindrome::~Palindrome(){
delete [] this->inputValue;
}

293 名前:デフォルトの名無しさん [2007/11/14(水) 13:50:32 ]
つづき
bool Palindrome::isPalindrome(){
char *aux = new char[100];
int k=0;
for(size_t i=0;i<strlen(this->inputValue);i++){
if((this->inputValue[i] >= 'A' && this->inputValue[i] <= 'Z') || (this->inputValue[i] >= 'a' && this->inputValue[i] <= 'z')){
aux[k] = tolower(this->inputValue[i]);
k++;
}}
aux[k] = '\0';
for(size_t i=0;i<strlen(aux)/2;i++){
if(aux[i] != aux[strlen(aux) - 1 - i]){
delete [] aux;
return false;
}}
delete [] aux;
return true;
}

294 名前:デフォルトの名無しさん [2007/11/14(水) 13:52:03 ]
つづき
#include "Palindrome.cpp"
#include <iostream>
using namespace std;
int main(){
Palindrome p;
char string[100];
while(true){
cout<<"文字を入力してください: ";
cin.getline(string,100);
if(strcmp(string,"") == 0){
break;
}
p.setInputValue(string);
cout<<"その文字は "<<(p.isPalindrome() == true ? "はパリンドロームです " : "違います ")<<endl;
}
return 0;
}

295 名前:デフォルトの名無しさん [2007/11/14(水) 13:54:09 ]
windoes上でこのふたつのプログラムは動くんですが、ubuntu上では
コンパイルできません。

だれか、直してもらえますか?

296 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 13:57:24 ]
エラーメッセージくらい載せろ

297 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 14:09:02 ]
コンパイルできたし、実行もできてるようだが…
(Ubuntu 7.10 / g++ 4.1)

まさかgccでコンパイルしようとはしてないだろうな

298 名前:デフォルトの名無しさん [2007/11/14(水) 14:16:52 ]
すみませんgccでコンパイルしました。
どうやってこんぱいるするんですか?
教えてください。



299 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:07:13 ]
上に書いてあるように g++ でもダメなの?

300 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:07:54 ]
>>298 そんなことより、さっさとエラーメッセージ貼れよ。

301 名前:デフォルトの名無しさん [2007/11/14(水) 15:18:14 ]
>>299
g++ でコンパイルできました。
どうもすみませんでした。
g++というのを知りませんでした。

302 名前:デフォルトの名無しさん [2007/11/14(水) 16:12:07 ]
>>297
質問です。
コンパイルは出来たんですが、実行が出来ません。
g++ aMain.cpp -o aMain
では何も起こらないんですがどうやって実行したんですか?

303 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:14:59 ]
gccはコンパイラコレクションだからC++特化のライブラリを探してくれない。
g++はC++コンパイラだからC++特化のライブラリも探してくれる。

304 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:16:51 ]
明示しなかった場合、実行モジュールはカレントディレクトリにa.outという名でできる。
実行するには、./a.outでいい。

つーか、その程度の基礎知識もなしにコンパイルなんてするなよw

305 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:18:11 ]
>>302
何したいの?それで aMain というファイルができてるの?
できていえれば、 ./aMain とすれば走るはずだけど。

306 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:26:34 ]
これはスルーしたほうがいいな

307 名前:デフォルトの名無しさん [2007/11/14(水) 16:40:07 ]
a.outができません。aMain.oだけできます。
./aMainだとpermission denied となってしまいます。

308 名前:デフォルトの名無しさん [2007/11/14(水) 16:45:08 ]
問題解決しました。./aMainでは実行できなくても
g++ aMain.cpp -o aMain && ./aMain
で実行できました。
お騒がせしてすみませんでした。



309 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 17:40:55 ]
なんじゃそりゃ。
ただのタイプミスな気がする

310 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 18:06:04 ]
>>308
そんなにあせらずに、Unix 系の CUI 使いかたの本薄いので
良いから一冊読むと大分時間の節約になると思うよぉ。

311 名前:デフォルトの名無しさん [2007/11/14(水) 20:33:43 ]
基本的なポインタの質問で申し訳ないんですが。
mallocなどで確保されてない領域を知る方法はありませんか?

char *str;
str=(char *)malloc(sizeof(char)*2);

for(int i=0; i<5; i++){
if( (str+i) == NULL)
//未確保
}
みたいな形でわかればいいんですが、必ずしもNULLが入ってるとは限らないので…。

よろしくお願いします。

312 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 20:40:37 ]
確保したサイズを覚えておく。

313 名前:311 mailto:sage [2007/11/14(水) 20:41:58 ]
>>312
なるほど・・・。
やっぱり、そういう方法しかないんですか・・・
せめてtry catchがあれば、強引に出来そうなんですけどね。

どうもありがとうございました。


314 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 20:46:31 ]
ていうかそのソース突っ込みどころ満載だから勉強頑張ろうな。

315 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 20:47:44 ]
自分が確保したメモリのアドレスとサイズを持つ構造体でも定義すれば?

316 名前:311 mailto:sage [2007/11/14(水) 21:14:02 ]
>>314
具体的にどのあたりでしょうか?
よろしくお願いします。

>>315
なるほど。
その方法も検討してみます。

317 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:18:32 ]
DLLで確保されたメモリはそのDLLで解放しないといけないと聞きました。

そこでお聞きしたいのですが、例えば以下のような場合
 ・アプリケーションAがDLL_BとDLL_Cを参照
 ・DLL_B自身もDLL_Cを参照
DLL_BがDLL_Cで確保したメモリを
アプリケーションAからリンクされたDLL_Cで解放するのは大丈夫なのでしょうか?
よろしくお願いします。

318 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:33:27 ]
>>317
OKだけど、LocalAllocにすればそんなこと気にしなくてもいいんじゃね?



319 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:42:20 ]
いや、Win32ならLocal系よりHeap系だろ

320 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:55:12 ]
>>316
>if ( ( str + i ) == NULL )
この行で、iに2以上の値が入った時点でアウト。
確保されていない領域を参照することになる。
NULLとの比較も無意味。
初期化されていない領域はゴミが入っているのでNULLかどうかなんてわからない。



321 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:06:29 ]
そもそも参照できてない、それ。

322 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:07:09 ]
>>318
LocalAlloc, HeapAlloc, GlobalAlloc
って名前が違うだけでは無いんですね。
知りませんでした。

>>319
Heap系はよけいなオブジェクトが必要になるのであまり使いたくないです・・・
そこが肝という気もしますが

323 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:09:06 ]
>>320
それが出来ないから質問きたんだろ
出来るなら、既に解決してるじゃんw

そもそも
>この行で、iに2以上の値が入った時点でアウト。
これを判定したいって言う質問なのに、そのレスはナンセンス過ぎる

324 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:06:43 ]
>>320
>この行で、iに2以上の値が入った時点でアウト。
単なるポインタに数字を足した値を見ただけで何でアウトなんだ?
*つけて参照してるならともかく・・・


325 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:14:37 ]
>>322
ヒープハンドルは常にGetProcessHeap()で得たものを使うことにすれば、
Local/Globalと比べ、新たな面倒さが生まれることはないと思うぞ。

326 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:39:43 ]
そもそもLocalとGlobalってかなり前にMSが使うのやめてっていってなかった?

327 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:27:02 ]
もうCoTaskMemAllocでいいよ

328 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:59:11 ]
>>324
配列要素数を超えたところを指すようにポインタに足し算すると未定義動作になる。

C99 6.5.6 p8 より( C++ では 5.7 p5 に同じ文面がある)
> If both the pointer operand and the result point to elements of the same array object, or one past the last element
> of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

この場合だと要素数 2 の char 配列とみなせるから、 2 までは大丈夫で 3 以上でアウトね。



329 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 02:05:54 ]
ポインタは*つけて参照しなければ、単なる数字だよ。
しかも、ポインタ変数に代入したわけでもなく、単に+3をやってifで比較しただけでしょ?

その文面は
*(str+i)のように参照した場合や、str+=iのように加算を行った場合であって
str+iでは、何の意味もないかと。

試してみれば分かると思うけど
char *str;

if( (str+5000)!=NULL)
ってやろうと
if( (str+50000000)!=NULL)
ってやろうと、エラーは出るはず無いよ。

330 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 02:23:13 ]
>>329
> *(str+i)のように参照した場合や、str+=iのように加算を行った場合であって

そんなことどこにも書いてない。 p + n という式自体について述べた部分だよ。
* で参照したり = で代入したりする前の話。

331 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 02:43:49 ]
なんで「一つ後ろ」みたいな表現するんだろう
一瞬、「じゃあふたつ後ろならいいのかよ」とか思ってしまったよ

332 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:42:18 ]
>>330
仕様の読み方わかってないだろ。
プログラムの勉強からはじめたほうがいいね。

333 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:57:22 ]
>>332
どこをどう読んだら >329 みたいな解釈になるのか教えてください。

334 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 11:24:57 ]
>>328

加減演算子

ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は
配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に
よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義
とする。

あくまで未定義といっているのだから、規格上は何でもあり得る、つまり
実装依存ということになるね。>>329の言っている、エラーが出ない
とか参照しなければ単なる数字になるということは、多くの実装がそう
なっているだけであって、str+5000の加算演算で仮にクラッシュする実装が
あっても、それは規格には従っていることになる。結局、この場合、
動作は未定義だから実装まかせ。

なので、厳密には>>328の意見が正しいと思われる。

335 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 13:04:40 ]
実際、タイトなメモリ空間モデルを持っている実装では、割と容易に起こり得る。
例えばint array[2]に対してarrayが0xfff0にアサインされているかもしれない。
ポインタもintも16bitなら、array + 4が0になってしまい、NULLと区別できなくなってしまう。
# 流石に即クラッシュはしないだろうけどね。

336 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 14:02:36 ]
境界の問題はポインタ特有の話じゃありませんね

337 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:44:01 ]
それがどうかしましたか?

338 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 17:57:27 ]
つまり見当違い



339 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:16:43 ]
どこが?
そもそも誰か、境界の話なんてしているんですか?

340 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 18:31:33 ]
>>336が場違いな件について

341 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/11/15(木) 22:09:24 ]
>>311
*** For your reference ***

Windows. _heapwalk (CRT)
msdn2.microsoft.com/en-us/library/h0c183dk(VS.80).aspx

Linux 2.4x
src\drivers\char\drm\sis_ds.c "void mmDumpMemInfo( memHeap_t *mmInit )"






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

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

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