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

このエントリーをはてなブックマークに追加
始めてWideCharToMultiByte関数を使用する事になったのですが、
ちょっと疑問が出来てしまいました。
WindowsXp、VC++6.0 SP6.0 の環境では
CP_ACP と CP_OEMCP の結果が同じに見えます。
これって日本語版Windows以外やWindows9x等では結果が違うのでしょうか?
(ページコード というのは地域の事?)
ご存じの方いらっしゃいましたら御願いします。
>>832
日本語版Windowsではどちらも同じです。
英語版では異なってます。

「OEMコードページ」なんかで検索してみれば基礎的な知識が得られると思います。
834832:04/07/21 13:47
>>833
なるほど大体分かりました。ありがとうございました。
835デフォルトの名無しさん:04/07/21 13:47
C + Win32API + BCCでプログラムを作っているのですが、
それのビットマップについての質問です。

始めに、外部ビットマップは、一つの要素に一つのビットマップを使うタイプです。
ツクール2000みたいに、ひとつにいろんなのを載せるタイプではありません。


ビットマップを表示するときは、表示するたびに外部ビットマップを開くか、
使う全ての外部ビットマップを、プログラムの始めに
メモリビットマップに書いておくのか、どちらがいいのでしょうか。


透過の為のマスクビットマップは、外部に用意しておくか、
プログラムの始めに元のビットマップから製作するか、どちらがいいのでしょうか。
>>835
自分が作りたいアプリケーションに合わせて仕様を決めましょう。
例えば、格闘ゲームなんかの場合は

1.登場キャラで足りない分のデータだけをメモリに読み込む。
2.マスク作成
3.ゲーム部分
4.次ステージに登場しないキャラの部分のメモリ解放
5. 1.に戻る

といった感じ。
必要無いデータは必要になる前の違和感を感じない所で読めば良い。
C++でフレンドクラスからテンプレート関数を呼びたいのですが、リンクエラーになってしまいます。

class A {
private:
...
template <typename T> int compare( T a1, T a2 ) { return ( a1 > a2 ? 1 : 0 ); }
friend class B;
};
class B {
...
};

の状態で、クラスBの内部で compare( 1, 2 ) とか compare( 3.0f, 4.0f ) を評価したいのです。

色々と検索したところ、テンプレート関数の実体がないため(?)らしいというあたりまではわかったのですが、
具体的にどうすれば解決できるのか教えていただけないでしょうか。
>>835

1.
頻繁に同じ画像を描画するのであればメモリ上に置いておく必要があるし、
不特定多数の画像の切り替えが必要な場合は、表示させるときにだけ読み込めばいい。

2.
特に問題なければ読み込み後でのマスク作成でいいと思う。
839835:04/07/21 14:21
>>836
ありがとうございます。

僕が作ろうとしているのは、FE等のターン制SRPGです。

基本的には、1は後者の方で、2も後者のようですが、
さらに、メモリっとくビットマップの種類を
できるだけ小さくしておく工夫が必要なんですね。
分かりました。
840835:04/07/21 14:29
>>838
ありがとうございます。

>1
SRPGなので頻繁ではないタイプだと思います。

透過をマスクを使わずSetPixelVでやっていたので、
キャラを選択して移動範囲を表示するとき、
薄く青描けるのがあると思いますが、あれが激遅でした。

>2
1で読み込んだ時、その分のマスクをその時に作ればいいのですね。
分かりました。
841835:04/07/21 14:32
>>838
>1
ここの部分は、同じSRPGでも、ゲーム進行の仕方によって
微妙に違ってくると思うので、いろんな方法を試して見ます。
>>837
普通に↓のように書けばいいのでは。

class A {
template <typename T> int compare( T a1, T a2 ) { return ( a1 > a2 ? 1 : 0 ); }
friend class B;
};

class B {
void test( A& a ) {
a.compare<int>( 1, 2 );
a.compare<float>( 3.0f, 4.0f );
}
};

ただ、VC++ 6.0では問題あったような・・・
843デフォルトの名無しさん:04/07/21 17:15
#include<stdio.h>

int main()
{
int c;
while((c = getchar()) != EOF)
putchar(c);
return 0;
}

を実行しても終了しないんですが、どうやったら終了できるようにできますか?
>>843
終わりたい時に電源切ればいい
845843:04/07/21 17:22
>>844
なるほど。
っていうか、whileの中身が偽になっても何で終了しないんですか?
846デフォルトの名無しさん:04/07/21 17:25
>>845
偽になれば終了します。
終了しないのは偽にならないからです。
847デフォルトの名無しさん:04/07/21 17:29
>>843
Ctrl+Cで終了したけど(LSI CとBCCどっちでも)
848843:04/07/21 17:29
>>846
どうしたら、偽になるんですか?
>>848
そのように振舞うgetcharを自分で作る。
850デフォルトの名無しさん:04/07/21 17:34
>>848
Ctrl+DとかCtrl+Zとか
851843:04/07/21 17:38
みなさん、ありがとうございます。
やってみます
852デフォルトの名無しさん:04/07/21 17:48
#include <stdio.h>
int min(int x,int y);

int main(void) {
  int x,y,ans;
  printf("1番目の整数を入力してください。\n");
  scanf("&d",&x);
  printf("2番目の整数を入力してください。\n");
  scanf("%d",&y);
  printf("\n\nx=%d,y=%d\n\n",x,y);
  ans = min(x,y);
  printf("最小値は%dです",ans);
  return 0;
}

int min(int x,int y) {
  if(x>y) {
    return y;
  } else {
    return x;
  }
}

が期待通りに動きません。最初のscanfが実行されてないみたいです。
なぜ?
>>852
目を凝らしてよ〜く見てみろ
854デフォルトの名無しさん:04/07/21 18:00
&d
>>852
Shift6→Shift5
ん? '&'はShift+7じゃないの?
>>856
俺のキーボードではShift+6だよ
>>855-857
(・∀・)ソレダ!
プログラムは思った通りには動かない。作った通りに動く。
860デフォルトの名無しさん:04/07/22 14:41
つまり、思った通りに作れば
思った通りに動くわけですね。
m9(  `Д´ )ソレダ!!
862デフォルトの名無しさん:04/07/22 15:37
#include <stdio.h>
double func(double tensuu){
int k;
double kekka;
printf("親なら1を子なら0を入力してください\n");
scanf("%d",&k);
if(k==1){kekka=tensuu*1.5;}
else if(k==0){kekka=tensuu;}
return(kekka);}
double kiriage(double kekka) {
int i,j,k;
i=kekka;
if(i%100==0){k=kekka;}
else{
j=100-i%100;
k=kekka+j;}
return(k);}
void main(){
int tokuten[7][4]={0,1300,2600,5200,1000,2000,3900,7700,1300,2600,5200,8000
,1600,3200,6400,8000,2000,3900,7700,8000,2300,4500,8000,8000,2600,5200,8000,8000};
int toitu[3]={1600,3200,6400};
int k,hansuu,fusuu,hansuu2,bai,n;
doubletensuu,kekka;
tensuu=0;
kekka=0;
hansuu=0;
n=0;
while(1){
printf("飜数を入力してください\n七対子で4飜以下の場合は0を入力してください\n");
printf("役満は一種類に付き13飜で換算して入力してください\n");
scanf("%d",&hansuu);
符も計算してくれ
864862続き:04/07/22 15:53
if(hansuu<=12){
if(hansuu<=10){
if(hansuu<=7){
if(hansuu<=5){
if(hansuu<=4){
if(hansuu==0){
if(hansuu<=-1)
{printf("不正な値です、正しい数値を入力してください\n");}
else {
printf("飜数を入力してください\n");
scanf("%d",&hansuu2);
tensuu=toitu[hansuu2-2];
kekka=func(tensuu);
kekka=kiriage(kekka);
printf("得点は%lfです\n",kekka);}}
else {
printf("符数を入力してください\n");
scanf("%d",&fusuu);
tensuu=tokuten[(fusuu/10)-2][hansuu-1];
printf("親なら1を子なら0を入力してください\n");
scanf("%d",&k);
if(k==1){
kekka=tensuu*1.5;
kekka=kiriage(kekka);
printf("得点は%lfです\n",kekka);}
else if(k==0){
kekka=tensuu;
printf("得点は%lfです\n",kekka);}}}
865862続き:04/07/22 15:53
else {
kekka=func(8000);
printf("得点は%lfです\n",kekka);}}
else {
kekka=func(12000);
printf("得点は%lfです\n",kekka);}}
else{
kekka=func(16000);
printf("得点は%lfです\n",kekka);}}
else {
kekka=func(24000);
printf("得点は%lfです\n",kekka);}}
else{
if(hansuu%13==0){
bai=hansuu/13;
tensuu=(double)bai*32000.0;}
else if(hansuu%13!=0){tensuu=32000;}
kekka=func(tensuu);
printf("得点は%lfです\n",kekka);}
printf("終了する場合は0、継続する場合は1を入力してください\n");
scanf("%d",&n);
if(n==0) break;
else printf("処理を継続します\n"); }}
866862:04/07/22 15:55
俺がC使い初めの頃に組んだ麻雀得点計算プログラム。
ソースが汚くて死ぬほど分かりづらい。
867デフォルトの名無しさん:04/07/22 16:03
#include <iostream>
#include <string>
using namespace std;

int main()
{
string str[2][2];

str[0][0] = "就職 ";
str[0][1] = "活動 ";

str[1][0] = "会社 ";
str[1][1] = "訪問 ";

cout << str[0] + str[1] << endl;

return 0;
}

上手くいかなかったんですがどうすればいいですか
>>867
せ め て 、 希 望 す る 結 果 ぐ ら い は 書け!
>>868
内定
>>867
こうすればコンパイルは通る。
cout << str[0] << str[1] << endl;
C++相談室にまで書くなよ
>>869
ワロタ
VB等で利用可能な COM DLL を VC++ 6.0 で作成しています。
DLLは問題無く完成したのですが、VBのプロジェクトにインポートして
オブジェクトブラウザを開いた時にメゾッドやプロパティの説明文が出るようにしたいのです。
*.odlファイルが怪しいような気はするのですが、調べても分かりませんでした。

※現状のVBオブジェクトブラウザの表示
Baudrate As Long
TotalCom.RS232C のメンバ


※理想的なVBオブジェクトブラウザの表示
Baudrate As Long
TotalCom.RS232C のメンバ

RS232C通信のボーレートを設定します。

環境
Winowd Xp
Microsoft Visual Studio 6.0 Enterprise SP6
 Visual C++
 Visual Basic

知っている方いらっしゃったらよろしく御願い致します。m(_ _ )m
メールチェックなどのプログラムを書くのに
参考になるページなどあれば教えて下さいませんか?
一応ググッたのですが見つからなかったので。
operator delete(void*, std::nothrow_t const &)
ってどうやって呼び出すんですか?
>>876
operator delete(p,std::nothrow);

一応聞いとくが、何がしたいんだ?
Win32の質問です。HeapAlloc()で割り当てられるメモリの最大容量はCOFFの拡張ヘッダに
あるSizeOfHeapCommitの値までなんでしょうか?デフォルトでは0x1000(64KB)となっている
ようなんですが・・・。
>>877
new(std::nothrow) obj;で確保した領域は
operator delete(void*, std::nothrow_t const &)で開放せにゃなんないと聞いたもので。
>>879
基本的な考え方は正しいけど、例外的に、nothrowを取るnew/deleteは
普通のnew/deleteと混用できる。
881デフォルトの名無しさん
ちょいと質問。
lcc-win32 Ver.3.8での話なんですが、
変数を特定のセクションに割り当てる方法ってあるんですかね?
VCだと
#pragma data_seg (".hoge")
とかでなんとかなりますが、
lcc-win32ではググっても資料があまりないみたいで…