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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.59【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1220708712/

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
2デフォルトの名無しさん:2008/10/15(水) 17:07:20
前スレが1000行ってたんで立てました。
3デフォルトの名無しさん:2008/10/15(水) 17:09:03
いちょつ
4デフォルトの名無しさん:2008/10/15(水) 17:12:51
環境:VisualStudio2008

class x
{
public:
methodA();
methodB();
private:
int x;
int y;
}

みたいなクラスがあって

methodA()
{
// 初期化
x = ...
y = ...
}

methodB()
{
// x、yを使って作業をする
}

といった感じで処理をしているのですが、変数xとyが
methodBに入った瞬間に壊れてしまいます。
一瞬、メモリの越境破壊かな? と思ってデバッガの変数ウォッチで追いかけてみたのですが
デバッガで見る分には確実にmethodBに入る瞬間に壊れています。
値が16進の 0x303030 固定なので人為的なものを感じるのですが、
何か原因の可能性として思いつくようなものはありますでしょうか?
5デフォルトの名無しさん:2008/10/15(水) 17:14:41
あ、例示のクラス名と変数名が一緒なのは単なるミスです。
6デフォルトの名無しさん:2008/10/15(水) 17:18:59
C言語をゲーム感覚で学べるソフトとかありませんか?
例えばlispで言うnsclisperみたいな物があればいいです。
7デフォルトの名無しさん:2008/10/15(水) 17:27:41
独自のアロケータを使ったstring型を作れたのですが、出力方法がわかりません。
キャスト無しでもキャストしてもエラー出ます。 coutの拡張は難しいです。
なんとかなりますか?


typedef basic_string<char, char_traits<char>, userallocator <char> > u_string;

int main() {
u_string a="abcdef";
// cout<<(char*)a;
}
8デフォルトの名無しさん:2008/10/15(水) 17:33:12
自己解決しました

u_string a="abcdef";
cout<<&a[0];

でもデータが連続していて最後が0になってないと駄目なんですが。
不連続でも可能な方法ありますか
9デフォルトの名無しさん:2008/10/15(水) 17:36:23
a.c_str(); が使用可能でした。STLは便利ですね。
これならデータが不連続でも良さそうなんですけど
もしデータが100Mとか貯まっていたらメモリにコピーを用意するのに
それだけ悔いますよね。直接ファイルに書き出したい場合に方法無いですか?
10デフォルトの名無しさん:2008/10/15(水) 17:38:00
substrで少しずつ書き出すことにします
114:2008/10/15(水) 17:50:07
すいません、自己解決しました。
自分で文字バッファを'0'でクリアしてたのが越境してました
12デフォルトの名無しさん:2008/10/15(水) 17:55:59
>>11
> 確実にmethodBに入る瞬間に壊れています
これが違ってたこと?
思いこみって怖いねXD
13デフォルトの名無しさん:2008/10/15(水) 19:54:51
質問です

クラスのプライベートで
typedef struct {
char Question[256]; // 問題
char Select[256]; // 選択肢
int Answer; // 答え
} Question, *Quiz;
};
を定義して

デフォルトコンストラクタで
Quiz = new Question[MAX_QUIZ];
とやったのですが : error C2513: 'QuizClass::Question *' : 指定された型は、識別子の名前を指定せずに宣言されています
と出てしまいます

どうすればメモリを確保できますか?
ヒントだけでもいいのでよろしくお願いします。
14デフォルトの名無しさん:2008/10/15(水) 20:02:19
typedefしてるからQuestionがその構造体の名前、Quizがその構造体のポインタ型
15デフォルトの名無しさん:2008/10/15(水) 20:29:03
Quiz p = new Question[MAX_QUIZ]; かな?
16デフォルトの名無しさん:2008/10/15(水) 21:00:54
今更だけど>>1
17デフォルトの名無しさん:2008/10/15(水) 21:30:02
#include <stdio.h>

void kansu(unsigned a){
 int ans[a];
 (中略)
}

main(){
 kansu(10);
 (中略)
}

上記のように、関数の引数を配列の個数として受け取るプログラムを作っているのですが、
配列を宣言する行で「定数でないものがある」「配列のサイズを整数定数に評価できません」といわれます。
はじめは自分のプログラムが間違っていると思っていたのですが、同じ課題(なので上記構成を含みます)を
やっていた友人の完成ファイルをもらって自分のPCでコンパイルしてみると、これも通りません。
でも友人は確かに学校のPCでコンパイルに成功していました。
自分のコンパイラに問題があるのかと、LightCとLSI C-86で試してみましたが変化ありません。

何がいけないのでしょうか? 初歩的な問題だったら申し訳ありません。
ご教授よろしくお願いします。
18デフォルトの名無しさん:2008/10/15(水) 21:45:57
aは定数ではなく、実行時に決まる値。
実行時に決まる値を使ってでのスタック上での配列宣言はできない。
それだけの話。
19デフォルトの名無しさん:2008/10/15(水) 21:52:16
助けてください。上底、下底、高さの3つの数字を入力してもらい台形の面積を求める関数を作ってみたのですが、コンパイルが通りません。
何処がおかしいのでしょうか?



#include<stdio.h>

int daikei(int,int,int);//daikei関数のプロトタイプ宣言

int main(void)
{
printf("台形の面積を求めます。\"上底\" \"下底\" \"高さ\"の順に数値を3つ入力してください。"
"なお、数値はカンマ\",\"で区切ってください。:\n");

int ue,shita,takasa;

scanf("%d,%d,%d",&ue,&shita,&takasa);
printf("上底%dcm、下底%dcm、高さ%dcmの台形の面積は%dcm2です。\n",ue,shita,takasa,daikei(ue,shita,takasa));
return 0;
}

//ここからdaikei関数の部分
int daikei(int ue,int shita,int takasa)
{
int kotae;

kotae = (ue + shita) * takasa / 2;

return kotae;
}
20デフォルトの名無しさん:2008/10/15(水) 22:07:45
>>19
int ue,shita,takasa;
を { の下に移動
Cでは変数の宣言はブロック({ })の最初にしないといけない
21デフォルトの名無しさん:2008/10/15(水) 22:12:00
>>17
そういうときは

void kansu(unsigned a) {
int *ans = malloc(sizeof(int) * a);
(中略)
free(ans);
}

として、実行時にメモリを確保する
22デフォルトの名無しさん:2008/10/15(水) 22:12:39
>>20
動きました。本当に有難うございます。
もっと基本的なことから勉強しなおします。
23デフォルトの名無しさん:2008/10/15(水) 22:23:15
>>17
99年仕様が通るまともなコンパイラを使えばOK。
24デフォルトの名無しさん:2008/10/15(水) 22:46:13
C言語で個人開発単位でDBに接続したいんだけど、オヌヌメのDBおしえてください。
あとは、ググルから。
25デフォルトの名無しさん:2008/10/15(水) 23:19:01
26デフォルトの名無しさん:2008/10/15(水) 23:21:38
マイクロソフトのでいいだろう 勝手に入ってくる
27デフォルトの名無しさん:2008/10/15(水) 23:32:29
たぶん言われなくても誰も知らないだろうけどHiRDBは絶対にお勧めできない
2817:2008/10/15(水) 23:38:57
>>18>>21>>23
ありがとうございました!
<stdlib.h>,malloc,freeを足してうまく動きました。
全く考えつかなかったところに原因があったので助かりました。
配列について一つ賢くなれた気がします。他のコンパイラを
手に入れる余裕はないので、もっと勉強して使いこなそうと思います。
回答ありがとうございました。
29デフォルトの名無しさん:2008/10/16(木) 14:05:45
すみません。WindowsAPIを使って色々ネット上のサンプルを試しているんですが、
新規プロジェクトを作るたびにいちいちWindowクラスを作成して登録する作業がとても面倒なんですが、
JavaやC#みたいにクラスファイルを作成して、それを他のプロジェクトから使う方法はないんですか?
または、ソースのインポートから新規プロジェクトへそのWindowクラスの書いたファイルをプロジェクトに
取り込む方法とかないですか?

なにぶん、WinAPIは初めてでしてよくわかりません。。ちなみにVC6を使っています。
初心者歓迎で環境依存OKとのことなので、ここで聞きました・・

個人的には、Windowクラス作成の部分を別ファイルに定義しておいて
WinMain関数の有るファイルで、そのWindowクラスを登録すればいいと
思うんですが、ウィンドウプロシージャのCALLBACK関数はどちらのファイルに書いたらいいのか
わかりません。

すみませんが、教えてください。よろしくお願いします。
3029:2008/10/16(木) 14:14:20
>>29です。ちょっと補足します。
>いちいちWindowクラスを作成して登録する作業がとても面倒なんですが
これは、長々しいコードを書くのも面倒だしこぴぺするのもスマートじゃないと
おもったんです。ですから、この作業をスマートにやるWindowsプログラム本来の方法を知りたいのです。

よろしくお願いします。
31デフォルトの名無しさん:2008/10/16(木) 14:31:44
むしろ何で今VC6を買ってしまったのかと聞きたいぐらいだわ
無料化されてないよね。しかも取り立てて安くもない。
VC2005EEではダメだったんだろうか。。。
32デフォルトの名無しさん:2008/10/16(木) 14:35:29
なぜVC2005を進めるんだ 2008の方が性能上で軽い
33デフォルトの名無しさん:2008/10/16(木) 15:00:10
>>29
CALLBACK関数も別ファイルに書けばいいと思うよ
WM_PAINTのBeginPaint〜EndPaintの間だけとか
実際に変えたいところだけ主ファイル側の関数を呼べばいいんじゃない
34デフォルトの名無しさん:2008/10/16(木) 15:08:49
C++で2分法のf(x)=X*X-2
プログラムよろしくお願いします。
35デフォルトの名無しさん:2008/10/16(木) 15:28:20
>>32
あ、ごめん。
2008まだ入れてないからついうっかりorz
36デフォルトの名無しさん:2008/10/16(木) 15:37:54
お聞きしたい事があります。
C言語の勉強をしてて、他人が作ったソースを眺めていたりするのですが、
その中に

char *skipSpace(char *s)

と言った箇所がったのですが、関数名の前の「*」ってどうゆう意味があるのでしょうか?
これもポインタの一種なのでしょうか?
37デフォルトの名無しさん:2008/10/16(木) 15:42:14
std::mapのキーにwchar_t*を使うと検索がおかしいのはどうして?
38デフォルトの名無しさん:2008/10/16(木) 15:45:41
>>36
charのポインタを返す関数だよ

char* skipSpace(char *s)
こうすると分かりやすいかな?
39デフォルトの名無しさん:2008/10/16(木) 15:51:46
>>38
なるほど、「char* 関数名」でも「char *関数名」でもどっちでもいいのですね。
ありがとうざいます。
40デフォルトの名無しさん:2008/10/16(木) 15:57:39
char* pc1, pc2;
41デフォルトの名無しさん:2008/10/16(木) 15:59:11
char *pc1, pc2;
42デフォルトの名無しさん:2008/10/16(木) 15:59:38
>>37
ポインタのアドレスを比較してるだけだからでは?
43デフォルトの名無しさん:2008/10/16(木) 16:01:07
基本は変数、関数のほうへ付けるべきだな
char* p, q; が、 char *p, *q; かchar *p, q; かわかりずらいからな

44デフォルトの名無しさん:2008/10/16(木) 16:05:14
*の修飾対象はcharではなくp。これを分かってない人がコードを書くと可読性が著しく損なわれる。
45デフォルトの名無しさん:2008/10/16(木) 16:07:38
char *関数名() が正解ってこと?
46デフォルトの名無しさん:2008/10/16(木) 16:10:35
>>37 std:less
47デフォルトの名無しさん:2008/10/16(木) 16:14:12
           ☆      ☆ 
          
          ☆       ☆            ☆     
                       ☆   ☆ 
                            *


       ∧_,,∧ 
       <,,    >
       (    )
       し○-J
     ~"''"""゛"゛""''・、
 ""゛""''""""゛゛""''' "j'
 :::::ヘ :::::....ヽ :::;;;ノ  ::( 
 ::  ゝ  :::::......ノ:;;../  ~~^^ ~~~~~^^^~ ~~^^ ~~^^ ~~~~~^^^~  ~~^^~~~^
48デフォルトの名無しさん:2008/10/16(木) 17:07:10
ttp://www.sgi.com/tech/stl/Map.html

どうして小さいか
49デフォルトの名無しさん:2008/10/16(木) 17:08:35
かどうかしか調べてないのにキーがー致するの?
大きいかった場合は?
50デフォルトの名無しさん:2008/10/16(木) 17:16:26
SGIのSTLかよ!
51デフォルトの名無しさん:2008/10/16(木) 17:19:17
>>49
ひんと ニ分木
52デフォルトの名無しさん:2008/10/16(木) 17:24:29
_
_分木
53デフォルトの名無しさん:2008/10/16(木) 17:25:36
>>48
a<bでもb<aでも無い場合とかじゃね
54デフォルトの名無しさん:2008/10/16(木) 18:14:46
>大きいかった場合は?

ない
55デフォルトの名無しさん:2008/10/16(木) 18:53:10
_
三分木
56デフォルトの名無しさん:2008/10/16(木) 18:54:39
_
三分木
57デフォルトの名無しさん:2008/10/16(木) 19:17:08
>>54 どうして
58デフォルトの名無しさん:2008/10/16(木) 19:28:27

三分木
59デフォルトの名無しさん:2008/10/16(木) 20:25:29
話の起点が見えないんだが何この流れ
60デフォルトの名無しさん:2008/10/16(木) 20:38:25
>>57
もちろん話の上では>>53の言うとおり、a<bでもb<aでも無い場合に2つの値は等価と扱われる。
それと、mapをbegin()からend()まで辿るとソートされていることが分かる。
実質ほとんど<ばかり調べ続ければ十分。
61デフォルトの名無しさん:2008/10/16(木) 23:37:57
環境はVC++2008EPEです
windowsアプリケーションの勉強をしていて本に載ってる環境設定が古いバージョンの物なのでわかりません。サンプルプログラムを実行してもエラーがでます
プロジェクト作成はwin32コンソールアプリケーション→windows アプリケーション→空のプロジェクトチェック→OKの手順で作っています
ソース
#include<windows.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MessageBox(NULL,"Kitty on your lap","メッセージです",MB_OK);
return 0;
}

エラー名
error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [18]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

改善方法を教えてください
62デフォルトの名無しさん:2008/10/16(木) 23:43:21
MessageBox(NULL,TEXT("Kitty on your lap"),TEXT("メッセージです"),MB_OK);
63デフォルトの名無しさん:2008/10/16(木) 23:43:23
MessageBox(NULL, TEXT("Kitty on your lap"), TEXT("メッセージです"), MB_OK);
http://wisdom.sakura.ne.jp/system/winapi/win32/win4.html
http://wisdom.sakura.ne.jp/system/winapi/win32/win5.html
64デフォルトの名無しさん:2008/10/16(木) 23:43:44
MessageBoxA
65デフォルトの名無しさん:2008/10/16(木) 23:44:50
なんでサンプル通りに作らなかったんだろう
66デフォルトの名無しさん:2008/10/16(木) 23:45:16
ナニッ?!
世間では_TじゃなくてTEXTを使う方が一般的なのか?
67デフォルトの名無しさん:2008/10/16(木) 23:47:24
Unicodeの関係でしたか・・・
すばやい回答ありがとうございました!
68デフォルトの名無しさん:2008/10/16(木) 23:48:28
>>65
単にサンプルが古くて>>61のように書かれてただけだろ。
例えば猫でも分かるのSDK編とか。
69デフォルトの名無しさん:2008/10/16(木) 23:48:38
ねえ。Cの引数って仮引数ジャン。 戻り値も仮戻り値なの?
70デフォルトの名無しさん:2008/10/16(木) 23:50:03
>>68
でも明らかに>>63と文字列が同じだよ?
71デフォルトの名無しさん:2008/10/16(木) 23:50:07
>>66
TEXTは<windows.h>をインクルードするだけで使える。
_Tは<tchar.h>をインクルードする必要がある。
そのせいで、あまりにも短すぎるサンプルだとTEXTが好まれる傾向にあると感じる。

TEXTと_Tで異なる状態になるってのは有り得ないから混同しても問題なく、どっち使うかは好みの問題。
TCHARと_TCHARだとそうもいかない場合があったかもしれないが。
72デフォルトの名無しさん:2008/10/17(金) 00:04:01
MessageBoxW()みたいにAPIには全部Wをつける。
文字列には L"・・・" みたいにLをつける。

これで、すっきり。
73デフォルトの名無しさん:2008/10/17(金) 00:07:45
アンダースコアが付いていないバージョンはWindowsヘッダーファイルがデフォルトで扱う文字セットを制御する
アンダースコアが付いているバージョンはCランタイムヘッダーファイルがデフォルトで扱う文字セットを制御する

ちゃんと違いはあるよ
74デフォルトの名無しさん:2008/10/17(金) 00:44:17
T"もじれつ"

T("もじれつ") または "もじれつ" か L"もじれつ"

にするマクロはかけないの
75デフォルトの名無しさん:2008/10/17(金) 00:46:23
T("もじれつ")じゃなくて_T("もじれつ")ではないかと言ってみるてst

普通に置き換えでいいでしょ
76デフォルトの名無しさん:2008/10/17(金) 00:51:49
環境:WinXp+Cygwin

TEST* stTEST = new TEST [i];
・・・ここまで構造体配列stTESTの内容を設定・・・

do{
 if( stTEST == NULL ) cout << "null1" << endl; //バグチェック1

 ・・・stTESTを使う100行くらいの処理・・・

 //上記の処理でstTESTの新しいメンバが設定される、
 //要素の追加の処理を知らないのでいったん削除して1つ大きく宣言しなおす
 i++;
 delete [] stTEST;
 stTEST= NULL;
 TEST* stTEST = new TEST [i];
 ・・・stTESTを再設定・・・
 if( stTEST == NULL ) cout << "null2" << endl; //バグチェック2
}while( currentNum < limitNum );

こんな感じで構造体配列stTESTを処理に使っていて、
do whileループで条件を満たさない限り構造体のメンバが1つずつ増える内容なのですが
上記のようにかなり強引にメンバを追加しようとしています。
実際これをコンパイルし実行すると1度最後のwhileまで実行された後バグチェック1に引っかかりエラーとなります。
このような無理やりなやり方ですがバグチェック2のあたりでは正常なのに
ループ始端のバグチェック1ではNULLとなってしまうのがわかりません。
バグチェック2とバグチェック1の間は実質何もないのになぜこうなるんでしょうか。
わけのわからない質問かつclassも知らないC言語上がりの恥ずかしい内容だとは思いますがよろしくお願いします。
77デフォルトの名無しさん:2008/10/17(金) 00:56:20
do-whileの中と外で2回stTESTが定義されているから
78デフォルトの名無しさん:2008/10/17(金) 01:00:19
無理にnew/delete使うくらいなら、realloc使ったほうがましだろって思った。
79デフォルトの名無しさん:2008/10/17(金) 01:04:19
>>77に一票
80デフォルトの名無しさん:2008/10/17(金) 01:12:20
>>77,79
いったんdeleteなりをしてなくなったことにして、
もう一度いちから宣言するというこのやりかた自体NGなのでしょうか。
にしてもループの終端と始端でNULLだったりしなかったりするのがよくわかりません。

>>78
reallocの存在を知りませんでした。今から試してみます。

ありがとうございます。
81デフォルトの名無しさん:2008/10/17(金) 01:13:55
データが入ったポインタから任意の位置のデータ抜き出すにはどうすればいいんですか?
2バイトでデータを区切って10バイト目を抜き出す場合、
___int16 afData[100];
afData = pbefData;
a = afData[4];
とかを想像しましたがエラー出まくりです。配列も大きいデータだとどこまで作れるのかわからないし。いい方法があったら教えてください。
82デフォルトの名無しさん:2008/10/17(金) 01:15:06
> TEST* stTEST = new TEST [i];
これを2回書いちゃってるから、再定義してるよこのスカポンタンて言われてると思う
stTEST = new TEST[i]; でいいんじゃないのかな
83デフォルトの名無しさん:2008/10/17(金) 01:20:09
>>74

むり
84デフォルトの名無しさん:2008/10/17(金) 01:27:41
>>82
エラー出なくなりました!
たしかに再定義ですね。int i = 0;を2回言うのと同じですね
人のプログラムを引き継いでやってるので意味もわからずコピペしてました。

でも別の問題なのか所望の動作しないwwでも頑張ります!
>>78のreallocもやるつもりです。ありがとうございました。
85デフォルトの名無しさん:2008/10/17(金) 03:54:29
>>72
えー。。。
86デフォルトの名無しさん:2008/10/17(金) 06:46:10
盆用ライブラリを作れるといいと言われたのですが
どのようなものを指すのですか?
拡張子がlibのもの?

教えてください><
87デフォルトの名無しさん:2008/10/17(金) 07:00:29
万能だろ。適用範囲が広いって事。
たとえばスタンダード テンプレート ライブラリは万能ライブラリ
88デフォルトの名無しさん:2008/10/17(金) 07:05:53
質問です。メモリマップドファイルは速いんですか?
1Gのファイルを、読み込んで1バイトずつの総和を求めようとした場合、
メモリマップドファイルと、一気に1Mずつ読み込むのでは速度差は出ますか?
89デフォルトの名無しさん:2008/10/17(金) 07:57:03
>>86
stdio のようなもののことでは?
90デフォルトの名無しさん:2008/10/17(金) 07:57:49
>>88
仕組みを考えると、処理速度を追求したものではないと思うのですが。
91デフォルトの名無しさん:2008/10/17(金) 09:14:26
>>90
実験してみます。 自前キャッシュを使うか、OSとメモリマップドファイルに
任せるかの違いなんですが。
シーケンシャルリードだったらそんなに変わらないと良いんですが。
92デフォルトの名無しさん:2008/10/17(金) 09:23:50
>>86
デスマーチに倒れていった先人のプログラマ達の霊を供養するライブラリじゃないかな
来年使う時期までまだ時間があるから自分自身が合掌される側に回らない程度にがんばれ
93デフォルトの名無しさん:2008/10/17(金) 11:02:48
盆用→凡用→汎用(はんよう)
こういうことか?
それとも、凡庸か?
94デフォルトの名無しさん:2008/10/17(金) 11:26:09
かつみ専用の図書館だな
95デフォルトの名無しさん:2008/10/17(金) 11:40:24
使おうと思っているライブラリのマニュアルに「ANSI C用にデザインしてある」ってかいてあるんですけど、
C++は使ってはいけないということになるんでしょうか。
提供されているヘッダには、
#ifdef __cplusplus
extern "C"
{
#endif
って書いてあります。
また、「Cランタイム関数のみを利用し、OS提供の関数を利用するな」ってあるんだけど、
どういう場合にこういう制限を設けるんでしょうか。
96デフォルトの名無しさん:2008/10/17(金) 11:55:05
#ifdef __cplusplus が付いてるなら、C++での使用も一応考慮されてるのだろうけど、
マニュアルに記述がないなら、何か問題があっても保証の限りではないってところでは
動くかもしれないけど保証はしない、自己責任でどうぞって感じ

移植性が必要なコードを書くときにはそういう制限を設ける
例えばWindows専用の関数を使ってしまったらMacに移植できない
97デフォルトの名無しさん:2008/10/17(金) 15:44:11
>>74
関数はTCHAR用、文字列はL""にしておいて
もしMBCSが必要になったらそこだけ置換すりゃいいんでねーの
98デフォルトの名無しさん:2008/10/17(金) 16:35:56
置換するためのマクロを探してたりしてな
99デフォルトの名無しさん:2008/10/17(金) 16:40:48
C#のインデクサーみたいに名前の付いた[]関数は出来ないの?
100デフォルトの名無しさん:2008/10/17(金) 18:16:34
多次元配列をコピーする方法を教えてください

int a [][2] = { 0, 60, 120, 180, 240, 360, 420, 540, 600, 660, 720, 780 };
int b[6][2];

aの内容をそっくりbにコピーしたい
101デフォルトの名無しさん:2008/10/17(金) 18:32:53
>>100 移植性があるかどうかわからんけど

#include <stdio.h>

int main(void)
{
int i, j;
int a [][2] = {{0, 60}, {120, 180}, {240, 360}, {420, 540}, {600, 660}, {720, 780}};
int b[6][2];

for (i = 0; i < sizeof(a) / sizeof(int); i++)
((int *)b)[i] = ((int *)a)[i];

for (i = 0; i < 6; i++) {
for (j = 0; j < 2; j++)
printf("%d ", b[i][j]);
putchar('\n');
}

return 0;
}
102デフォルトの名無しさん:2008/10/17(金) 18:41:22
>>100
memcpy(b, a, sizeof(a));
103デフォルトの名無しさん:2008/10/17(金) 18:42:38
memcpy
104デフォルトの名無しさん:2008/10/17(金) 18:47:03
105デフォルトの名無しさん:2008/10/17(金) 19:32:15
>>101,102,103,102
ご協力ありがとうございました。memcpyでいけました
106デフォルトの名無しさん:2008/10/17(金) 19:33:29
>>101,102,103,104
ご協力ありがとうございました。memcpyでいけました
107デフォルトの名無しさん:2008/10/17(金) 19:47:04
>>101,102,103,104
ご協力ありがとうございました。memcpyでいけました
108デフォルトの名無しさん:2008/10/17(金) 19:50:40
>>101,102,103,104
ご協力ありがとうございました。memcpyでいけました
109デフォルトの名無しさん:2008/10/17(金) 19:51:12
>>101,102,103,104
ご協力ありがとうございました。memcpyでいけました
110デフォルトの名無しさん:2008/10/17(金) 19:54:35
>>101,102,103,104
ご協力ありがとうございました。memcpyでいけました
111デフォルトの名無しさん:2008/10/17(金) 19:54:49
>>105-109
おちつけw
112デフォルトの名無しさん:2008/10/17(金) 19:55:20
>>105-109
おちつけw
113デフォルトの名無しさん:2008/10/17(金) 19:56:05
>>105-109
おちつけw
114デフォルトの名無しさん:2008/10/17(金) 20:30:15
>>105-109
おちつけw
115デフォルトの名無しさん:2008/10/17(金) 20:37:05
配列にはアドレスを代入できないらしいですけど

クラスのprivateで
typedef struct abc = {
int a;
char b;
} A, *B;

B b;

void AAA
{
A a[3] = {
116115:2008/10/17(金) 20:37:53
間違えました
117デフォルトの名無しさん:2008/10/17(金) 20:38:23
>>115
おちつけw
118デフォルトの名無しさん:2008/10/17(金) 20:42:39
int *n;

n = new int[3];

これってint n[3]ってことですか?

となると、これに他のアドレスは代入できないのでしょうか?
119デフォルトの名無しさん:2008/10/17(金) 20:45:26
いやできる。
int *n;
n = new int[3];
delete[] n;
n = new int[5];
int *m = n;
n = new int[7];
delete[] n;
delete[] m;
120デフォルトの名無しさん:2008/10/17(金) 20:53:25
#define num 3

int a[num] = { 3, 5, 1 };

int b[num];

b = a;

これは可能ってことですか?

今実行環境がないので試せないので誰が教えてください><
121デフォルトの名無しさん:2008/10/17(金) 20:56:03
期待している結果にはならない
122デフォルトの名無しさん:2008/10/17(金) 20:56:59
>>120
コンパイルエラー
123デフォルトの名無しさん:2008/10/17(金) 20:59:44
>>120
aとbは定数だから代入はできない
124120:2008/10/17(金) 21:02:41
どうすればaを代入できるのでしょうか・・・。

初歩的な質問すぎて申し訳ないです。

125デフォルトの名無しさん:2008/10/17(金) 21:05:57
>>120
ネットに繋がるパソコンがあるなら環境を作ったほうがいい
Visual Studio Express Edition あたりを検索ワードにすれば無料で使えるコンパイラが見つかる
126デフォルトの名無しさん:2008/10/17(金) 21:06:14
ご協力ありがとうございました。memcpyでいけました
127デフォルトの名無しさん:2008/10/17(金) 21:06:58
>>124
>>100,102
12829:2008/10/17(金) 21:36:08
>>33どうもありがとうございます。ウィンドウプロシージャも別ファイルにかく方法でいきたいとおもいます。
というか、自分ではどうすればいいのかわからないので、その方法で行きます。主要なメッセージだけ主ファイルの
関数から呼ぶというのは、自分のレベルでは理解できないので、まずは、別ファイルにかく方法でいきたいとおもいます。

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

>>他に回答くださった皆さん。
VC6は兄の押入れにあったやつです。もう眠っているやつみたいなので、やってみました。

みなさん、ありがとうございました。お礼が遅れて済みませんでした。
129デフォルトの名無しさん:2008/10/17(金) 21:49:39
memcpyって便利ですね。

他にメモリをコピーできるのはないんですか?
130デフォルトの名無しさん:2008/10/17(金) 21:51:00
memmoveとかC++ならstd::copyとか
131デフォルトの名無しさん:2008/10/17(金) 21:53:39
>>129
何で他のが欲しいのかよく分からんけど、メモリ上にどういったレイアウトで
配置されてるかを知っておかないとそのうち困るよ
132デフォルトの名無しさん:2008/10/18(土) 00:48:25
C++です

@cinで数値を入力させたaをマイナスにしてやりたい時はそのまま-aみたいに書いちゃってもいいんでしょうか?

Awhile文にて、bが-aより大きく、かつbはaより小さいとき、と書きたい時は
while(-a<b && b<a)
という書き方をしても大丈夫でしょうか?

あまり丸投げにすると悪いんでこんな形の質問ですがよろしくお願いします
133デフォルトの名無しさん:2008/10/18(土) 01:07:43
>>132
@OK
AOK。ただし、<は半角で。
134デフォルトの名無しさん:2008/10/18(土) 01:16:46
>>133
返答ありです


基本的にプログラムしたことはうまくいってくれるんだけど
while()内の条件通りに繰り返してくれないのはやっぱり()内の条件付けの考え方を間違えてるんでしょうか?
135デフォルトの名無しさん:2008/10/18(土) 01:33:36
int c;
int* a;
int b[5] = {2,3,4,5,0};
a = b;
c = sizeof(a);

ポインタaの中のバイトサイズを知るにはどうすればいいんですか?sizeofでとりだせません。
136デフォルトの名無しさん:2008/10/18(土) 02:12:39
>>135
c に sizeof(int) * 5 を期待しているのであれば、無理だと思います。
137デフォルトの名無しさん:2008/10/18(土) 02:30:09
c = sizeof(a);
だと、cに4が入ってしまします。
c = sizeof(*a);
こうすると*aにはbのアドレスが入ってるからいいとおもったんですが、cに2が入るんです。
どうしてもbのサイズ20が取り出せません。どうすればいいか教えてください
138デフォルトの名無しさん:2008/10/18(土) 02:38:31
>>137
残念ながら無理だと思います。
b のアドレスだけをみて、「b が配列のあたまのアドレスでありかつ配列のサイズはsizeof(int)*5 ということが、普通わかるのでしょうか?
べつに自分で管理でもしておかないかぎり、不可能だと思います。

ところで環境はなんですか?sizeof(int *) =2、sizeof(int) = 4、というのは、ちょっとよくわからないのですが?スモールモデル?タイニーモデル(いずれも死語)?
139デフォルトの名無しさん:2008/10/18(土) 02:41:45
aに入ってるのはb[0]のアドレスです
間接演算子「*」をポインタに付けると、そのポインタが指している変数の中身にアクセスできます
つまり*aはb[0]に入っている「2」を指します

bのサイズを得るにはsizeof(b)とするしかありません
sizeof(a)で得られるのはアドレスのサイズ、sizeof(*a)で得られるのはint型のサイズです
140デフォルトの名無しさん:2008/10/18(土) 02:57:54
ポインタの話題は微笑ましいな

>>132
while(abs(a) > b)も可
でも>>133でダメなら問題文の解釈ミスだろうな
141デフォルトの名無しさん:2008/10/18(土) 03:00:00
>>139
そこで不用意に「2」とかかくと sizeof(*a)がb[0]の内容を返すように見えるから困る
142デフォルトの名無しさん:2008/10/18(土) 03:02:43
無理ですか。なにか方法がありそうでないのですね。はまってしまいました。参照もやってみましたが、エラー出まくりで対応しきれず挫折しました。
環境というかすいません、取り出した値は間違えでした。int部分はすべて__int16で実行した数値を書いてしまいました。ごめんなさい。
143デフォルトの名無しさん:2008/10/18(土) 03:14:18
変数に100kバイトのデータ入れるにはデータ型は何を使えばいいんでしょうか?
144デフォルトの名無しさん:2008/10/18(土) 03:16:14
char data[100000];
とか
145デフォルトの名無しさん:2008/10/18(土) 03:24:54
そんなにできるんですか、ポインタを使ってべたデータの先頭アドレスだけ指定する型とかはないんですか?
配列数が固定されてると、data[100001];にしたくなった場合また配列を作らなければいけないんですか?
146デフォルトの名無しさん:2008/10/18(土) 03:39:28
なにがしたいかというと
100kバイトのデータを編集してサイズを変えて80kバイトにした時に
メモリに無駄なくデータ型でキャストして配列にして個々に取り出せるようにしたいんです。
型 data;
__int16[sizeof(data)/2] = data;
これで解決出来そうなんですが、型の部分が不明です。なにがいいか教えてください。
147デフォルトの名無しさん:2008/10/18(土) 03:45:34
>>146
もう何が言いたいのかすごく分からないんだけど、メモリの動的確保を知ればいいのだろうか
148デフォルトの名無しさん:2008/10/18(土) 03:56:14
Cならcalloc、malloc
C++ならnewを使いなされ
149デフォルトの名無しさん:2008/10/18(土) 04:05:40
あとC++でコンテナもあるが、それじゃ不満出そうだなw

とりあえずポインタという単語は覚えたようだけど
発言からしてその機能(というか用途や存在意義?)は
まだ完全には理解できてないのはわかる
150デフォルトの名無しさん:2008/10/18(土) 04:05:46
それ以前に学ぶことがたくさんあるだろって感じだなあ
151デフォルトの名無しさん:2008/10/18(土) 04:13:59
たしかに何を言ってるかわかりませんねw
よく考えたらサイズのわからないデータを型で変数確保するなんて無理ですよね。
動的確保で作成、解放の繰り返しで対応しようと思います。ありがとうございました。
あ、でもsizeof(data)でサイズを調べた後ならそのサイズが収まるデータ型を指定して確保するような型はありそうでないんでしょうか?
struct newType{
__int16 type[sizeof(data)/2];
};
あ、でもsizeofで調べるdataの型はなんだろう・・・頭がやばい感じになってきました
152デフォルトの名無しさん:2008/10/18(土) 04:16:20
realloc()使えばいいんじゃね?
153デフォルトの名無しさん:2008/10/18(土) 04:32:06
使えばいいとかそういう段階じゃないとゆうとろうが

>>151
まず背伸びをやめることから始めようか
154デフォルトの名無しさん:2008/10/18(土) 04:48:21
背伸びすると自分を把握できない&相手に伝わらない
基礎からやるのを恥ずかしがるなよ
155デフォルトの名無しさん:2008/10/18(土) 04:54:20
borland C++ Compiler 5.5使ってC言語を学んでます。
下記のようにコンパイルした後に動作確認を行っているのですが、
これを一回のコマンドで実行できないでしょうか?
bcc32 test.c
test
156デフォルトの名無しさん:2008/10/18(土) 04:57:00
バッチファイル
157デフォルトの名無しさん:2008/10/18(土) 05:05:20
できました。
どうもありがとう。
158デフォルトの名無しさん:2008/10/18(土) 08:03:23
CreateWindowで作ったcheckboxの文字のサイズの変更はどうやってするのですか?
159デフォルトの名無しさん:2008/10/18(土) 09:21:38
if(buff[0] == '#') {
// リマーク行
continue;
}

-------------------------------------------

if(buff[0] == '#')
// リマーク行
continue;


この2つって全く違いますか? {} があるかないかで
160デフォルトの名無しさん:2008/10/18(土) 09:28:21
見易さが違う
161デフォルトの名無しさん:2008/10/18(土) 09:32:16
この場合は下の方が見やすいですか?
162デフォルトの名無しさん:2008/10/18(土) 10:44:38
上のほうだろ
163デフォルトの名無しさん:2008/10/18(土) 10:51:21
>>158
WM_SETFONT
164デフォルトの名無しさん:2008/10/18(土) 10:57:59
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7806.txt
いくつか打ち込んでみて、正常に動いたのですが
間違っているところがあるのではないかと不安です。
どなたか、チェックをお願いします。
165デフォルトの名無しさん:2008/10/18(土) 11:12:16
動いたのならいいじゃないか
15とか入れてみた?
166164:2008/10/18(土) 11:19:16
>>165
ぎゃー。15を入れてみたら、
素数ではありません
素数ではありません
素数です
と、表示されました・・・。
167デフォルトの名無しさん:2008/10/18(土) 11:29:49
>>163
ありがとうございます!
168デフォルトの名無しさん:2008/10/18(土) 12:42:51
>>164
URLにフイタ
169デフォルトの名無しさん:2008/10/18(土) 14:44:05
URLのどこがおもしろいんだろ?
170デフォルトの名無しさん:2008/10/18(土) 15:31:59
>>168
>>1 見て笑っとけ
171デフォルトの名無しさん:2008/10/19(日) 02:03:34
しつもんです。
char buff[20]
while(!=EOF){
buff[a++]=fgetc(f);
buff[a] = '\n';
}
printf("%s\n",buff);
でOSによってゴミが表示されたり、表示されなかったりするんですけれど、
基本的に、ゴミが表示される方が正しいんですか?表示されない方が
正しいんですか?
172デフォルトの名無しさん:2008/10/19(日) 02:07:01
>>171
最後は '\n' じゃなくて '\0' にしないとまずいだろ
173デフォルトの名無しさん:2008/10/19(日) 02:36:54
おぞましいソースだな
174デフォルトの名無しさん:2008/10/19(日) 02:49:31
あら、書き間違えた。
\0です。
ところで、ゴミが入るのは普通ですか?
175デフォルトの名無しさん:2008/10/19(日) 02:54:37
>>174
>>173
せめてちゃんと直してから質問しなおせ
\0に変えてもまだおかしいぞ
176デフォルトの名無しさん:2008/10/19(日) 03:24:29
while((c = fgetc((f))) != EOF){
if(c != ':'){
buff[at++] =c;
}
if(c == ':'){
ungetc(c,f);
buff[at] = '\0';
printf("%s",buff);
では、これで。
どうしてもゴミが入るんですが...
177デフォルトの名無しさん:2008/10/19(日) 03:58:15
>>176
whileや2回目のifの終端が分からんような断片的なソースを張るな。

とりあえずatを初期化しろ
178デフォルトの名無しさん:2008/10/19(日) 03:59:34
>>176
馬鹿なんだから、自分でここが原因だろうなとか考えるな
全部貼れカス
179デフォルトの名無しさん:2008/10/19(日) 04:09:37
古いサーバにTCPコネクションを張ってリクエストを出すのですが、高負荷にならないように、どの時点を
取ってもそこから過去T時間内にはN個以下のリクエストしか送ってないようにしたいです。そのために
以下のようなアルゴリズムでやろうとおもうのですが、いいでしょうか?
(これって有名な問題でしょうか?)
まず、リクエストを送信した時間を記録しておくキューを準備します。
そしてリクエストを出す際には、その時点から過去T時間まで遡って何個のリクエストが出ていたかを確認し、
(1)N個より少なかった場合
リクエストを出して、その時間をキューに追加します。そのときT時間よりも過去に送信したリクエストは
キューから削除します。
(2)N個だった場合
これ以上送れないので、リクエストを保留リストに繋ぎ、一番古いリクエストからT時間後に送信するように
OSのタイマーを使って設定します。
なんかこんがらがって来た。これでいいでしょうか?
180デフォルトの名無しさん:2008/10/19(日) 04:27:57
今日は基本情報/ソフ開の試験日

ここで答えるマはちょうどこれらを受けるレベルと重なるから
以後、日を改めた方がいいかもね
181デフォルトの名無しさん:2008/10/19(日) 04:53:20
>>179 やってみたぜ
#include<deque>
#include<cstdio>
#include<cstdlib>
#define N 5
#define T 100
#define TIME_MAX 1000
class connection_t{
public:
time_t send, post;
connection_t():send(0),post(0){}
};
int request_proc(connection_t &connection, time_t send){
connection.send=send;
}
int main(void){
std::deque<connection_t> request;
connection_t temp;
for(time_t t=1;t<TIME_MAX || request.size()>0;t++){
while(request.size() && t-request[0].send>=T){ // 時間T経過したリクエストをキューから削除する
printf("post=%d send=%d\n", request[0].post, request[0].send);
request.pop_front();
if(request.size()>=N) request_proc(request[N-1], t); // 待ち状態のリクエストがあれば処理する
}
if(rand()%10==0 && t<TIME_MAX){ // リクエスト発生!!!
temp.post=t;
request.push_back(temp);
if(request.size()<=N) request_proc(request.back(), t); // N個目までは無条件にリクエストを処理する
}
}
return 0;
}
182デフォルトの名無しさん:2008/10/19(日) 06:12:00
どんなコンテナでも[]でのアクセスをサポートしてるものだったら受け取れて
その中身を表示する関数って書けますか?
std::vector<T>だけでいいなら

template <class T>
void show(std::vector<T> &v){
for (unsigned int i = 0; i < v.size(); ++i) {
cout << v[i] << " ";
}
cout << endl;
}

こんな感じでよく使ってるんですが。
183デフォルトの名無しさん:2008/10/19(日) 06:13:31
template <class T>
void show(T &v){
for (unsigned int i = 0; i < v.size(); ++i) {
cout << v[i] << " ";
}
cout << endl;
}
184デフォルトの名無しさん:2008/10/19(日) 06:29:26
template <typename T>
void show(T &v){
for( typename T::iterator it = v.begin(); it != v.end(); ++it )
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
これで標準コンテナは大体いけるんじゃないか?
185デフォルトの名無しさん:2008/10/19(日) 06:40:28
引数はconstのほうがよくね?とか、boost::range使ってみよう、とか
#include <boost/range.hpp>
template<class T>
void show(const T &v)
{
typedef boost::range_iterator<const T> iter_t;
for(iter_t iter=boost::begin(v); iter!=boost::end(v); ++iter)
{
std::cout << *iter << " ";
}
std::cout << std::endl;
}

でもこんな関数書くくらいなら
std::copy(v.begin(), v,end(), std::ostream_iterator<T>(std::cout, " "));

でいいじゃんと思ったり
186デフォルトの名無しさん:2008/10/19(日) 11:25:53
std::ifstream使ってファイルの入力してて、一行ずつ処理するのにwhileとgetline使ってたんだが、
空白で区切られて思ったようにいかないんだけど、\nか\0のみで区切れる関数、ルーチンってないですか?
ちなみに処理系はVC9です
187デフォルトの名無しさん:2008/10/19(日) 11:30:20
つ マニピュレータ
188デフォルトの名無しさん:2008/10/19(日) 11:50:38
以下の本の中に

たとえstatic宣言した変数であっても
extern宣言することによって外部から参照できてしまう

とありました。これは本当ですか?
手元で試してみるとそんなことはないようなのですが…

「C/C++による組み込みソフトウェア開発技法]


下記は_gが見つからないとコンパイルエラーになりました。

a.c---

static int g = 10;

b.c---
#include <stdio.h>

extern int g;
int main(void)
{
printf("%d\n",n g);
return 0;
}
189デフォルトの名無しさん:2008/10/19(日) 11:55:31
>>188
その本の前提がおかしいんじゃないか?
普通、C/C++ではstaticはファイルスコープを持つから外部には公開されないぞ。
190デフォルトの名無しさん:2008/10/19(日) 12:05:50
>>181
誰か解説してくれ〜
181の動きがよくわからん。動作させてみて、ちゃんと動いてそうなんだけど、どうもよくわからん。
(1)1度もsendされないままプログラムが終了してしまうリクエスト(connection_tで表されるやつ)が
ないことは保証できるか?
tがTIME_MAXを過ぎた時に、request_proc()してないリクエストが1個とかのこってる状況ってどうすんのかな?
(2)2回sendされるリクエストは絶対にないか?
request_proc()は2個所から呼ばれてるけど、それぞれのIF文の条件が微妙にかぶってるのが理解しにくい。
すごいよ、こんなソースを短い時間でパッパッと書いちゃうなんて。
191186:2008/10/19(日) 12:29:56
>>187ども
STLとかあんま分からんから助かる
192186:2008/10/19(日) 12:44:03
マニピュレータで少しググってみたが、先頭の空白のことじゃなくて行中に現れる空白のことなんだが
つまりgetlineつかうとscanfみたいになるからfgetsみたくifstreamで動作させたいってこと
193デフォルトの名無しさん:2008/10/19(日) 12:45:03
>>192
こんなん?
getline(ifs, str)
194192:2008/10/19(日) 12:56:28
あれ・・・getlineで普通に動いてるorzなんでだr
荒らしてスマソ・・・
195デフォルトの名無しさん:2008/10/19(日) 14:11:15
>>190
別人だけど。

(1) 送信されないまま終わると思う
擬似的に>>179のアルゴリズムだけ組んだものっぽいから、
プログラム終了した後のことまで面倒見てないのではない?

その辺のところは実際には、リクエストに対するレスポンスを
同期的に受けるのか非同期で受けるのかでも対応変わって来そう出し。

(2) 無い・・・と思う
条件文が微妙に被っているのは、
while内の条件では、条件判定の直前にpop_frontしてるんで、
requestキューの要素数が1つ減ってるからじゃない?

条件文が被らないようにするなら、
pop_frontする前にrequest.size()>Nをチェックをして
request[N]のポインタを保存しとくことになるのかな。
まぁ、でも条件が被らなくなるだけで、キューの中身は
2つ目の条件式を判定した時の状態と全然違うから、
あまり意味は無いか。
196デフォルトの名無しさん:2008/10/19(日) 20:01:45
VS2008を使っています

デバックでビルドすると普通にコンパイル→リンクできるのですが、

リリースでビルトすると
1>_Lib_DXCamera.obj : error LNK2001: 外部シンボル "_D3DXMatrixLookAtLH@16" は未解決です

こんな感じなのが数個でてビルドできません。

解決方法教えてください!
197デフォルトの名無しさん:2008/10/19(日) 20:18:45
>>196
プロジェクトの設定を見直す。
198デフォルトの名無しさん:2008/10/19(日) 20:24:44
リリースのほうのリンカを追加したらできました

ありがとうございます
199デフォルトの名無しさん:2008/10/19(日) 20:29:34
私の友人のジョンは敬虔なクリスチャンだ。 ミサへの参加はもちろんのこと、教会が主催するボラン
ティア活動にも積極的に関わるし、日々の祈りもかかさない。 日本へ移住したのも布教活動のためだ
と言うし、日本語は実になめらかである。 このバイタリティが信仰心から生まれるものなら宗教も悪
いものではないとさえ思えてくる。

私自身は典型的な日本人がそうであるように無宗教に近い仏教徒だ。ジョンと友人になった経緯は長
くなるのでその話はまたの機会とさせてもらうが、思いおこせば奇跡的な出会いと思わざるを得ない。

さて、最近のジョンは日本のサブカルチャー、とりわけアニメに感心をもったようで、日本では誰も
が知っているアニメというと何だろうと私に質問してきた。

「ポケモン」や「サザエさん」といった定番のものを紹介し、最後に「ドラえもん」を紹介した。す
るとジョンは「ドラえもん」に対して異常に怯えはじめた。 ドラエもんの中には悪魔がいるというのだ。

言われてみるとDORAEMONの中にはDEMONがある。 そして、ねこ大好きな純朴な人々に自分は猫型だと
偽るなど実に悪魔的な諸行ではないか。そんなことにも気付かずに我々はドラえもんをほほえましい
人間の味方と騙されきっていたとは自分の馬鹿さ加減に呆れる。

未だ自分が悪魔に騙されていると気付いていない愚かな悪魔崇拝者どもの目を醒させるために我々は
活動を開始することにした。 手始めに猫スレを巡回してこの事実を広めていこうと思う。 皆にはこ
の文章をなるべく多くの目に触れるようにコピペしてもらいたい。

Kill DORAEMON, Kill DEMON !!!
200デフォルトの名無しさん:2008/10/19(日) 20:46:14
>>198

阿呆
201デフォルトの名無しさん:2008/10/19(日) 20:54:10
>>199

阿呆
202デフォルトの名無しさん:2008/10/19(日) 20:56:36
>>147

ド阿呆
203デフォルトの名無しさん:2008/10/19(日) 21:06:28
混じれすすると、そこに入っているのはDAEMON(守護神)だと
考えることもできるんじゃないかな。
どれだけキリスト教と関係あるか知らないけど。
204デフォルトの名無しさん:2008/10/20(月) 00:43:41
C言語掲示板で質問したところ、環境依存スレに書き込むよう言われました。
ですので、こちらに書かせてもらいます。

ファイルパスについての質問です。
「実行ファイルを元にした相対パスを、
絶対パスにするにはどうしたらいいのでしょうか?」
相対パスを絶対パスに変換する関数は見付かったのですが、
カレントディレクトリを元にしているため、
カレントが変わると結果も変わってしまって困っています。

環境
OS:Windows XP
コンパイラ:BCC(一応VCも入れてある)
205デフォルトの名無しさん:2008/10/20(月) 01:32:20
>>204
その実行ファイルの絶対パスとくっつければいいんでね?
としか思えんのだが、それがダメなら理由を説明しろ。
状況がわからん。
206デフォルトの名無しさん:2008/10/20(月) 02:10:09
>>205
最初はそれでもいいかと思ったのですが、
途中で、「実行フォルダの1つ上のフォルダ」に変更があった場合(あくまで例)、
編集しやすいようにと思った次第です。

出来ないのであれば、絶対パスを返す関数を探しますけど。
207デフォルトの名無しさん:2008/10/20(月) 06:54:22
普通にあるだろ。名前忘れたけど
208デフォルトの名無しさん:2008/10/20(月) 07:06:58
あるよ





俺も忘れたけど
209デフォルトの名無しさん:2008/10/20(月) 08:34:24
APIスレで聞くといいよ
210デフォルトの名無しさん:2008/10/20(月) 09:33:58
仕方ないからリファレンス本引っ張ってきた

カレントディレクトリの変更
#include<stdlib.h>
int _chdir(const char *dirname); //vc
int chdir(const char *dirname); //gcc

カレントディレクトリを取得
char *_getcwd(char *buffer, int maxlen); //vc
char *getcwd(char *buffer, int maxlen); //gcc


bccでの有無は知らんが、bccなんて載ってるわけがねぇ
なんでいまだに初めての環境がbccってのが多いんだろ
211デフォルトの名無しさん:2008/10/20(月) 09:39:52
>>204
Windows限定でいいのならPathAppend
212デフォルトの名無しさん:2008/10/20(月) 09:40:02
>>195
ありがとうス。でも手元のマシンでログとか色々いれて>>181のソース動かしてるんだけど、
送信されないままのリクエストってないんですよ。沢山動かしてみたから
たまたまとかじゃなくて、ロジックとしてそうなってるんだと思うけど、
どうしてもその辺が納得できない。
if(request.size()>=N) request_proc(request[N-1], t); // 待ち状態のリクエストがあれば処理する
}
この行だけなかなか理解できないス。2個目の質問はおかげで理解できました。
ありがとうス。
213デフォルトの名無しさん:2008/10/20(月) 10:50:00
>>181
>>195
ようやく分かりました。リクエストが呼ばれないままプログラムが終わることは
ないと思います。キューの中で先頭からN個のリクエストだけが常にSENDになっていて、
一番古い先頭のリクエストがT時間たった時点でのみN番目のリクエストがN-1番目に下りてくる。
しかしこんなソースよく書けますね
ありがとうございました。
214デフォルトの名無しさん:2008/10/20(月) 11:46:29
デフォルトコンストラクタと初期化子に関する質問です。

class C {
int c, v;
C() : c(0) {}
C(int val) v(val) {}
};

とおいた場合、
C hoge(0);
として
hoge.c
は初期化されているのでしょうか。
215デフォルトの名無しさん:2008/10/20(月) 11:50:28
いいえ
216デフォルトの名無しさん:2008/10/20(月) 11:55:16
ありがとうございました
217デフォルトの名無しさん:2008/10/20(月) 14:47:26
コンテナを基底クラスにしたsetやmapに、派生クラスのインスタンスをつっこむと
コピーされて基底クラスの集合になっちゃうんですが、どうすればよいんでしょうか。
shared_ptrでポインタをつっこむのが定番でしょうか。
218デフォルトの名無しさん:2008/10/20(月) 16:03:12
どうしてVCは

short 16
int 32
long おう

じゃないの?
そのせーでlong long とか見苦しいことしないといけないし
219デフォルトの名無しさん:2008/10/20(月) 16:10:33
__int64使え
220デフォルトの名無しさん:2008/10/20(月) 16:25:13
>>218
ひんと ごかんせー
221デフォルトの名無しさん:2008/10/20(月) 17:39:25
テキストファイルを読み込んでstd::wstringに格納するにはどうすればいいですか?
222デフォルトの名無しさん:2008/10/20(月) 17:45:47
コードを書けばいいと思います
223デフォルトの名無しさん:2008/10/20(月) 17:46:39
wcin
224デフォルトの名無しさん:2008/10/20(月) 17:47:29
と cat だな!
225204:2008/10/20(月) 17:54:12
>>207-212
ありがとうございます。
ちょっと調べてきます。
実は実行ファイルの絶対パスをくっ付けるのでとりあえずしていたので、
出来そうなら修正します。
226デフォルトの名無しさん:2008/10/20(月) 19:05:51
>>225
PathAppendではなくPathCombineだった。失礼。
227デフォルトの名無しさん:2008/10/20(月) 19:20:36
typedef struct{
int data;
char mozi[10];
}Hoge;

という構造体の配列 Hoge huga[10]を宣言します。

i番目のHogeのメンバーのmoziの1文字目にアクセスしたいんですが、どう書けばいいんですか?

huga[i].mozi[1]かな?と思ったんですが・・・
228デフォルトの名無しさん:2008/10/20(月) 19:24:11
1文字目は [0]
229デフォルトの名無しさん:2008/10/20(月) 19:25:08
ああそうですね・・・
でもコンパイルできないんです
230デフォルトの名無しさん:2008/10/20(月) 19:30:29
エラーメッセージとソースがないと分からないよ
231デフォルトの名無しさん:2008/10/20(月) 19:32:21
char' から 'const char *' に変換できません
といわれます
232デフォルトの名無しさん:2008/10/20(月) 19:35:35
レッツエスパー
233デフォルトの名無しさん:2008/10/20(月) 19:40:53
%cではなく%sになってるとエスパニョール
234デフォルトの名無しさん:2008/10/20(月) 19:42:46
huga[i]のmoziの0文字目と別の文字をstrcmpで比較してるんですが・・・
235デフォルトの名無しさん:2008/10/20(月) 19:45:17
strcmpに何を渡すか調べろ
236デフォルトの名無しさん:2008/10/20(月) 19:50:25
んなこったろーと思った
237デフォルトの名無しさん:2008/10/20(月) 20:09:35
後出しジャンケン最強ですね、わかります
238デフォルトの名無しさん:2008/10/20(月) 20:12:44
後出しも何も、そのまんまじゃないか。
239234:2008/10/20(月) 20:22:31
もっと真摯的に回答しろよ。
240デフォルトの名無しさん:2008/10/20(月) 20:24:47
>>239
一文字だけ比較なら、

if (huga[0] == str[0]) ・・・

でいいよ。
241デフォルトの名無しさん:2008/10/20(月) 20:31:47
std::exceptionにウニコード入れてキャストしてもいいの?
242234:2008/10/20(月) 21:25:29
>>236
そう思ったなら分かった時点で言ってくれればいいのに。
後出しジャンケン最悪><
243デフォルトの名無しさん:2008/10/20(月) 21:56:14
ジャンケンのアナロジーを使うってことは、この問答に勝負の匂いを感じてるってことかな。

でももしそうなら、もう最初の質問文の時点でコールド負けしてるぞ、お前w
244デフォルトの名無しさん:2008/10/20(月) 23:09:04
VSで

if(fopen_s(&fpout, "data.txt", "w")){

exit(1);
}
で出力用のファイルを作成するとソースファイルとかがある階層にファイルが作られますが、
フォルダを作って、その階層にファイルを作ることはできますか?
245デフォルトの名無しさん:2008/10/20(月) 23:11:12
>>244
もちろん出来るよ
246デフォルトの名無しさん:2008/10/20(月) 23:11:47
>>245
if(fopen_s(&fpout, "data\data.txt", "w")){

exit(1);
}

ってやったんですがエラーになります・・・
247デフォルトの名無しさん:2008/10/20(月) 23:12:36
>>246
\→\\
248デフォルトの名無しさん:2008/10/20(月) 23:19:16
>>247
それでもだめでした。ファイルポインタエラーになります
249デフォルトの名無しさん:2008/10/20(月) 23:20:25
>>248
フォルダがなければ作成
250デフォルトの名無しさん:2008/10/20(月) 23:21:50
>>249
フォルダは作ってくれないんですね・・
WinApiじゃないとフォルダ作成はむりですか?
251デフォルトの名無しさん:2008/10/20(月) 23:26:38
_mkdirかな。使ってないからわかんないけど。
MSDN見てみてね。
252デフォルトの名無しさん:2008/10/20(月) 23:27:13
_tmkdir
こっちがいいか。
253デフォルトの名無しさん:2008/10/20(月) 23:51:47
template<CLS &p>
class ABC {
public:
};

としたとき、テンプレート値を省略できて、それを検知して適切な処理をさせられますか?
254デフォルトの名無しさん:2008/10/20(月) 23:53:08
自己解決しました
255デフォルトの名無しさん:2008/10/21(火) 00:26:22
すみません。Windows用のC++ライブラリはボーランドのC++BuilderかVisualStudio付属のしか
ありませんか?
256デフォルトの名無しさん:2008/10/21(火) 00:26:45
自己解決してません。 テンプレート値を省略した場合、デフォルトを設定する方法わかりますか?

特化パラメータを指定しないとテンプレート を使えない

とでます。ネットで調べた方法 template <class T = int>のようにした場合です。
257デフォルトの名無しさん:2008/10/21(火) 00:29:30
>>256
それを使うときにはABC<>のように空の括弧が要るぞ、って問題じゃない?
258デフォルトの名無しさん:2008/10/21(火) 01:46:00
ごく普通に、throw std::exception();と書いたら、
場所によって(特定のクラスのコンストラクタとか)
vswprint.cでBuffer too smallとエラーがでるのね。
どこが悪いの?
259デフォルトの名無しさん:2008/10/21(火) 02:10:03
VC6でブラウザつくったんだけど(本の通りやって)
VC6がでてから何年もたってるからFlushとかうまく表示できないんだろうと
思ってたけど、普通に表示できるけど、VC6のインターネット関連のコンポーネントって
今のPC上のIEエンジンがつかわれるのかな?VC6時代のやつじゃなくて。
260デフォルトの名無しさん:2008/10/21(火) 03:22:52
C++が一番難しいの?
261デフォルトの名無しさん:2008/10/21(火) 10:13:29
C++が一番気持ちいいの。
262デフォルトの名無しさん:2008/10/21(火) 12:51:15
>>258 バッファが小さすぎるんだろ。
263デフォルトの名無しさん:2008/10/21(火) 17:37:55
>>259
VC6にそんな機能は全くない。間違いなくIEコンポーネント使っているだけ。
HTTPでファイルをダウンロードしたり、HTML/CSSに従ってレイアウトしたり、
JavaScriptのインタプリタ作ったり、Flashを呼び出したりするコードを書いた覚えなんて一切ないだろ。
264デフォルトの名無しさん:2008/10/21(火) 18:04:04
VC6にIEコンポーネントが付属していて、それをスタティックリンクすると思ってたんじゃないの
VC6当時はなかったIE7で動作するのが不思議に思ったって事でしょ
265259:2008/10/21(火) 19:34:14
あれれ。。回答ついてるや。。

そうなんです、>>264さん。VC6にIEコンポーネントが付いてるとおもったんです。
初心者用の本の通りに作ったんです。ですから、あっという間にブラウザができて
コードなんてほとんど書いてなかったから、なにがどうなってどういうブラウザができたとか
さっぱりわからんのです。でもわかりました。>>263さんのいうとおりIEコンポーネントを使ってるということですね。

お二方どうもありがとうございました。おかげさまで心よく理解する事ができました。
266デフォルトの名無しさん:2008/10/21(火) 23:28:54
_sctprintf で出鱈目な長さが返って来るんだけどバグなの?
267デフォルトの名無しさん:2008/10/22(水) 00:10:51
何を指定して何が返ってきてデタラメだと思ったの。
268デフォルトの名無しさん:2008/10/22(水) 00:15:18
_vstprintfにしたらいけました
269デフォルトの名無しさん:2008/10/22(水) 09:44:55
while ( !feof(fp) ){

for (int i = 0; i < N; i++){
fscanf(fp,"%lf",&data[i]);
if( data[0] < 0 ) break;
}


}


読み込むテキストはN列あります。
5.2 12.2 124.7
15.2 52.2 24.7
25.2 92.2 324.7
-1.0
3.2 12.2 124.7

-1.0は区切りのためにいれてるんですが、-1.0が読み込まれたら飛ばして次の行にいくってプログラムを書いたつもりなんですが、
-1が読み込まれると無限ループになってしまいます。解決策をおねがいします・・・
270デフォルトの名無しさん:2008/10/22(水) 09:55:16
それ以前の問題に見えるが、、、そのソース。
271デフォルトの名無しさん:2008/10/22(水) 09:59:22
いろいろ直していただいてかまわないので、教えてください
272デフォルトの名無しさん:2008/10/22(水) 10:21:48
>>269
feofの使い方間違ってる
273デフォルトの名無しさん:2008/10/22(水) 10:23:06
いや間違ってるとはいったが、無限ループとは関係ないけどね

data[0]じゃなくてdata[i]じゃないの?
274デフォルトの名無しさん:2008/10/22(水) 10:28:27
>>273

-1.0が書いてあるのは1列目なんで0でいいかなと
275デフォルトの名無しさん:2008/10/22(水) 10:29:45
>>272
while ( !feof(fp) ){

for (int i = 0; i < N; i++){
fscanf(fp,"%lf",&data[i]);
if( data[0] < 0 ) break;
function(data);

}


}

1行ごとに読み、それを関数に渡して処理。そして次の行を読むっていうのをEOFまでやってるんです。
使い方どう違いますか?
276デフォルトの名無しさん:2008/10/22(水) 10:31:13
while ( !feof(fp) ){
flag =0;
for (int i = 0; i < N; i++){
 fscanf(fp,"%lf",&data[i]);
 if( data[0] < 0 ) }
flag = 1;
break;
}


}

if(flag !=1 )function(data);

}

こうでした。すいません
277デフォルトの名無しさん:2008/10/22(水) 10:31:18
fscanf(fp,"%lf",&data[i]);
これで3つの数値が data[0]、data[1]、data[2]に入ると思ってる?
scanfaの仕様をみなおしてみたほうがいいよ
278デフォルトの名無しさん:2008/10/22(水) 10:32:03
あれwwまたおかしい

while ( !feof(fp) ){
flag =0;
for (int i = 0; i < N; i++){
 fscanf(fp,"%lf",&data[i]);
 if( data[0] < 0 ) {
flag = 1;
break;
}


}

if(flag !=1 )function(data);

}
です
279デフォルトの名無しさん:2008/10/22(水) 10:33:39
>>277
-1.0の意図的な区切りが出てくるまでは読めてます。for文でまわしてるので大丈夫だと思ってましたが・・・

-1.0を付加してるのはtxtファイルのメンテナンスをしやすくするためです
280デフォルトの名無しさん:2008/10/22(水) 10:35:06
>>279
改行だけでよかろ?
281デフォルトの名無しさん:2008/10/22(水) 10:36:35
>>280
-1.0のあとにその上のデータを作成した方法を記載しているのです。

-1.0 pattern a
とかなってます。言ってなくて申し訳ありません。
282デフォルトの名無しさん:2008/10/22(水) 10:42:59
だからよ、使い方間違ってるって。
順を追って動作一つ一つ追ってみ?
283デフォルトの名無しさん:2008/10/22(水) 10:46:22
>>282
eofじゃなかったら
for文でその行のN個のデータをN次元配列に格納。関数に渡す。
eofじゃなかったら ・・・・
eofだったらwhileから抜ける

だと認識してるんですが・・・
284デフォルトの名無しさん:2008/10/22(水) 10:55:22
feofの使い方見直せ
feofはfprintfが最期の行読み込んだ後使うと真を返すんじゃなく
fprintfが最期の行読み込んだ後もう一回fprintfを使った後feof使うと真を返すんだよ
285デフォルトの名無しさん:2008/10/22(水) 10:56:02
ちょっと語弊がありましたすいません
286デフォルトの名無しさん:2008/10/22(水) 10:56:48
fprintfですか?ますますよくわからなくなってきました
287デフォルトの名無しさん:2008/10/22(水) 11:15:53
fscanfでしたごめんなさい
288デフォルトの名無しさん:2008/10/22(水) 11:19:50
-1.0が頭に出てきた列を読み飛ばすにはどうしたらいいですか?
289デフォルトの名無しさん:2008/10/22(水) 11:30:01
for (int i = 0; i < N; i++){
 fscanf(fp,"%lf",&data[i]);
 printf("%lf",data);
 if( data[0] < 0 ) {
みたいに実際に読んだデータを表示してみたら。
1ラインづつ読んで切り分けてatofでも使って変換、頭に-1.0があったら飛ばすでいいのでは。
290デフォルトの名無しさん:2008/10/22(水) 11:32:19
その飛ばすっていう方法がわかりません
291デフォルトの名無しさん:2008/10/22(水) 11:35:07
'\n'まで読むかfgets
292デフォルトの名無しさん:2008/10/22(水) 11:39:49
うまくできないので・・・書いてください
293デフォルトの名無しさん:2008/10/22(水) 11:42:41
宿題すれ
294デフォルトの名無しさん:2008/10/22(水) 11:49:22
図々しいと思わんのかな・・
295デフォルトの名無しさん:2008/10/22(水) 11:50:52
宿題スレに書きました。
296デフォルトの名無しさん:2008/10/22(水) 17:20:10
templateな関数はvirtualに出来ないの?
297デフォルトの名無しさん:2008/10/22(水) 19:31:44
数値微分ではなく関数を微分して関数を返すフリー(金の支払いが無い)のライブラリないですか?
298デフォルトの名無しさん:2008/10/22(水) 20:24:05
自動微分ってやつ?
299デフォルトの名無しさん :2008/10/22(水) 20:24:47
それって
y = ax + bって入力したら
y'= aって返ってくること?

そんなもんねーよ
300デフォルトの名無しさん:2008/10/22(水) 20:34:47
あるだろwww
301デフォルトの名無しさん:2008/10/22(水) 20:36:34
mathematicaなら出来きます。あとUBASIC86に多項式型が装備されていて微分可能です。
だから不可能ではないんです。
C言語でフリーのやつはないものかと。
302デフォルトの名無しさん:2008/10/22(水) 20:39:03
GNOME の Genius でできた気がする
303デフォルトの名無しさん :2008/10/22(水) 20:39:39
>>300
うそ、あんの?
教えてちょーだい
304デフォルトの名無しさん:2008/10/22(水) 20:45:56
多項式型と微積分するくらいなら楽勝に作れるんだが。
任意の関数の微分も出来るやつはないものか
305デフォルトの名無しさん:2008/10/22(水) 20:49:03
>>303
ごめん。無料ではしらない。
>>299が有料だろうと無料だろうとそんなもんはないし、作れないよ
みたいな風に見えたからさ
306デフォルトの名無しさん:2008/10/22(水) 20:57:03
vectorで作る配列って勝手に動的確保されるんですか?
でかかったら仮想メモリとかにおかれたり
307デフォルトの名無しさん:2008/10/22(水) 21:02:24
勝手に動的確保されるんです
308デフォルトの名無しさん:2008/10/22(水) 21:57:58
動的でなくても、すべてのメモリは仮想ですよ、いまどき
309デフォルトの名無しさん:2008/10/22(水) 21:59:39
SetRenderState使うときは前野を退避しないといけないの?
310デフォルトの名無しさん:2008/10/22(水) 21:59:41
ですよねぇ
311デフォルトの名無しさん:2008/10/22(水) 22:03:40
前野さん早く逃げて!
312デフォルトの名無しさん:2008/10/22(水) 23:23:12
構造体のvectorに代入するときってどうするんですか?

double型とかならば、

ary.push_back( 5.0 ); とかで末尾に入れれると思うんですが
313デフォルトの名無しさん:2008/10/22(水) 23:26:35
>>312
intとかdoubleとかの変数と同じだよ。
314デフォルトの名無しさん:2008/10/22(水) 23:26:41
>>312
構造体にコンストラクタを付ける
315デフォルトの名無しさん:2008/10/22(水) 23:28:21
同じようにすればいいですよ
316デフォルトの名無しさん:2008/10/22(水) 23:29:19
>>314
初期化するためのものではないのですか?
317デフォルトの名無しさん:2008/10/22(水) 23:29:58
ちなみに構造体はstring とdoubleの2メンバです
318デフォルトの名無しさん:2008/10/22(水) 23:36:46
Hoge hoge;

vec.push_back(hoge);

でいいだろ。
319デフォルトの名無しさん:2008/10/22(水) 23:39:33
>>318
どういうことですか?動的配列を使いたいのですが・・・
320デフォルトの名無しさん:2008/10/22(水) 23:53:11
>>319
「構造体をvectorに」のタイポかと勘違いしたよ。

「構造体のvectorに」って、

struct Hohe {
vector<T> vec;
};

ってこと?
321デフォルトの名無しさん:2008/10/22(水) 23:53:34
>>316
この場合は初期化のためというより一時オブジェクトを
利用したいから付ける
322デフォルトの名無しさん:2008/10/23(木) 00:01:32
typedef struct{
double data;

cahr name[256];

}DATA;

int main(){
std::vector<DATA> hoge<100>;


}

このhogeにデータを入れたいってことです
323デフォルトの名無しさん:2008/10/23(木) 00:02:06
おかしいっすね

typedef struct{
double data;

char name[256];

}DATA;

int main(){
std::vector<DATA> hoge(100);


}
こうでした・・・
324デフォルトの名無しさん:2008/10/23(木) 00:03:41
>>322
だから、

DATA d;

hoge.push_back(d);

でいいだろ。
325デフォルトの名無しさん:2008/10/23(木) 00:06:52
>>324
すいません。理解できないです。

hogeの末尾に double→1.0 char→"hoge"を入れる場合にはどうするんですか
326デフォルトの名無しさん:2008/10/23(木) 00:17:17
>>325
お前あちこちのスレにマルチしてるだろ

struct DATA {
double data;
char name[256];
DATA(double d = 0.0, char* str = "") : data(d) {
std::strcpy(name, str);
}
};

int main()
{
std::vector<DATA> hoge(100);

hoge.push_back(DATA(1.0, "hoge"));
}
327デフォルトの名無しさん:2008/10/23(木) 02:10:13
hoge.resize(hoge.size()+1);
hoge.back().data = 1.0;
std::strcpy( hoge.back().name, "hoge" );
とか
328デフォルトの名無しさん:2008/10/23(木) 04:36:52
>>296 試せよ。
329デフォルトの名無しさん:2008/10/23(木) 05:57:39
質問です。
以下のようなプログラムを書きましたが、終了しません。
>cat meso
123456
---------------------------------------------
FILE *f;
buff[256];
char *s;

f = fopen("meso","r");

while((s = hogehoge(f,buff)) != NULL){
         printf("%s¥n",s);
       }
      fclose(f);
    exit(0);
}
char *hogehoge(FILE *f, char *buff){
  int c = 0;
  int at = 0;

  while((c = fgetc(f)) != EOF){
   buff[at++] =c;
  }
  buff[at]='¥0';
  return buff;
}

どのようにすれば、このプログラムを終了させる事が出来るのでしょうか?


330デフォルトの名無しさん:2008/10/23(木) 06:04:58
>while((s = hogehoge(f,buff)) != NULL){
hogehogeのコードじゃnullが帰ることは決してないぞ。
331デフォルトの名無しさん:2008/10/23(木) 07:15:51
普通に代入して大丈夫だよ。自分でやってみて駄目だったら質問しろよ。
どのようにダメだったかを書いて

ただし、ポインタを持ってる構造体の場合は
コピーコンストラクタとoperator=をオーバーロードした方が良い。
これ以降は自分で勉強しな
332デフォルトの名無しさん:2008/10/23(木) 07:26:18
>>329
#include<stdio.h>

void hogehoge(FILE* f, char* buf);

#define BUF_LEN 256

int main() {
 FILE *f;
 char buf[BUF_LEN];

 f = fopen("a.out.c","r");
 hogehoge(f, buf);
 printf("%s\n", buf);
 fclose(f);

 return 0;
}
void hogehoge(FILE *f, char *buf){
 int c = 0;
 int at = 0;

 while((c = fgetc(f)) != EOF && at < BUF_LEN-1){
  buf[at++] = c;
 }
 buf[at] = '\0';
 return;
}
333デフォルトの名無しさん:2008/10/23(木) 12:38:13
stringに別のchar型の文字列を代入したいんですが、どうやるんですか?
334デフォルトの名無しさん:2008/10/23(木) 12:44:42
string s;
char c[4] = "abc";
s = c;
でおk
335デフォルトの名無しさん:2008/10/23(木) 13:20:14
ありがとうございます。stringをprintfで表示するときの%sてきな奴はなんですか?%sだとnullになります
336デフォルトの名無しさん:2008/10/23(木) 13:27:02
printf("%s", s.c_str());
337デフォルトの名無しさん:2008/10/23(木) 13:28:19
なるほど。coutつかったほうが楽そうですね。
fprintfのC++版ってあるんですか?
338デフォルトの名無しさん:2008/10/23(木) 13:33:17
>>337 printf 系は <cstdio> で全部そのまま使えるだろ。
339デフォルトの名無しさん:2008/10/23(木) 13:33:36
ofstream
340デフォルトの名無しさん:2008/10/23(木) 13:36:27
>>338
<iosteam>でも使えるぞ
341デフォルトの名無しさん:2008/10/23(木) 14:45:59
>>340 それは実装依存。ちゃんと対応したヘッダ使ってくれ。
342デフォルトの名無しさん:2008/10/23(木) 15:00:21
cmathのsqrtで何万回も計算するんだけど、遅いです

平方根はもとめないといけないんだけど(ユークリッド距離)なんかいい方法ないですか?
343デフォルトの名無しさん:2008/10/23(木) 15:08:21
sqrt の引数にとりうる数字が有限通りしかないならあらかじめ計算して覚えておく
くらいしか思いつかないなあ
344デフォルトの名無しさん:2008/10/23(木) 15:09:25
それはあまり現実的ではないですね・・・・あきらめます
345デフォルトの名無しさん:2008/10/23(木) 15:40:50
速くしなければならないかどうかを考える
sqrtをなるべく使わないようにする
ループの回数を減らせる方法がないか考える
sqrtの結果をキャッシュする
346デフォルトの名無しさん:2008/10/23(木) 16:08:41
FPUが遅いと文句を言ってるんならもっと速いCPUに買い換えるか
インラインアセンブラでSSE2のsqrtsdでも使うとか。

それ位しか思いつかない
347デフォルトの名無しさん:2008/10/23(木) 16:09:19
ああクアッドCPUなら計算範囲を1/4にして
スレッドを4つ起動すれば速いな
348デフォルトの名無しさん:2008/10/23(木) 16:30:11
_TIME_は、そのソースの書き込み時間ですが、
ビルドした時間を取得する マクロ? ってありますか?
349デフォルトの名無しさん:2008/10/23(木) 18:24:30
>>348
ビルド時にDオプションでどうにかすればいいんでない?
350デフォルトの名無しさん:2008/10/23(木) 18:40:58
ifstream はファイル読み込みだけですよね?ファイル書き込み(追記)できる関数ってなんでしたっけ?
351デフォルトの名無しさん:2008/10/23(木) 18:43:48
ofstream使え
352デフォルトの名無しさん:2008/10/23(木) 18:52:11
同じファイルから読んで、書き込みもできますか?
353デフォルトの名無しさん:2008/10/23(木) 18:54:36
できます
354デフォルトの名無しさん:2008/10/23(木) 19:00:27
C言語のa+みたいなモードがあるのかとおもったんですが・・・ないんですね
355デフォルトの名無しさん:2008/10/23(木) 19:12:25
なんでそんな変なモードを使いたいのかわからないが
fstream fs("filename.txt", fstream::in | fstream::out | fstream::app);
とかは?
356デフォルトの名無しさん:2008/10/23(木) 19:14:39
tbl.cpp
const char tbl[ 4 ][ 16 ]=
{
"spring",
"summer",
"auturmn",
"winter",
};

tbl.h
const char tbl[ 4 ][ 16 ];

test.cpp
#include "tbl.h"
void func()
{
printf("%s\n", tbl[ 0 ]);
}

C++でこれって出来ないの?
実体が無いって言われるんだけど。
357デフォルトの名無しさん:2008/10/23(木) 19:14:54
ofstream ofs("file.txt",ios::app);

if(!ofs.is_open()){
cout << "ファイル開けない " <<endl;
exit(1);
}

ifstream ifs("file.txt");
if(!ifs.is_open()) {
exit(1);
}

こうしたんですが、問題ありますかね
358デフォルトの名無しさん:2008/10/23(木) 19:19:38
>>356
externを付ける
359デフォルトの名無しさん:2008/10/23(木) 19:25:07
>>358
おおーありがとー。
externつけたけど、今度はconstが初期化されていないって言われる。
constを外すと複数定義されているって言われる。
360デフォルトの名無しさん:2008/10/23(木) 19:28:57
ヘッダファイルいらない
361デフォルトの名無しさん:2008/10/23(木) 19:31:51
>>360
ヘッダファイルが無いとtbl[]が無いって言われる。
cppをincludeしたら行けたけど、C++はcppをincludeするのが普通なの?
362デフォルトの名無しさん:2008/10/23(木) 19:32:52
普通にmain実行するようにちょい変えた

>> Makefile
test: test.o tbl.o
g++ test.o tbl.o -o test

clean:
rm *.o

>> tbl.cpp
#include "tbl.h"

const char tbl[ 4 ][ 16 ]=
{
"spring",
"summer",
"auturmn",
"winter",
};

>> tbl.h
extern const char tbl[ 4 ][ 16 ];

>> test.cpp
#include <cstdio>
#include "tbl.h"

int main(void)
{
printf("%s\n", tbl[ 0 ]);
}
363デフォルトの名無しさん:2008/10/23(木) 19:38:16
>>362
うーん。それだとconstが初期化されてないって言われるんだよねぇ。
error: uninitialized const 'Tbl'
って出る。
364デフォルトの名無しさん:2008/10/23(木) 19:44:17
あー分かった!
debug用に切っていたマクロをincludeしていなくて、定義されていないマクロの中に実体を定義してた。
しょうもない質問に、ありがとうございました。
365デフォルトの名無しさん:2008/10/23(木) 19:49:39
>>355
それにしてみたら、書き込まれないんですが・・・
366デフォルトの名無しさん:2008/10/23(木) 20:03:56
ifstream やofstreamではなく、fstreamをインクルードして使うときもfstream
367デフォルトの名無しさん:2008/10/23(木) 20:07:54
>>366
fstreamインクルードしてます
368デフォルトの名無しさん:2008/10/23(木) 20:09:53
使うときもfstream
369デフォルトの名無しさん:2008/10/23(木) 20:11:27
fstream fs("file.txt", fstream::in | fstream::out | fstream::app);

fs >> data;


こうやってるんですが書き込まれてないんですよね・・・
370デフォルトの名無しさん:2008/10/23(木) 20:12:37
fstream::appは知らないけど、入出力とバイナリ属性付けたらいけるのでは
371デフォルトの名無しさん:2008/10/23(木) 20:29:10
フラグ間違えてるだろ

std::ofstream ofs( "test.txt", std::ios::out | std::ios::app );

http://www.geocities.jp/ky_webid/cpp/library/033.html
372デフォルトの名無しさん:2008/10/23(木) 20:41:31
std::string ってZeroMemoryしていいんでしょうか?
373デフォルトの名無しさん:2008/10/23(木) 20:42:35
>>372
Copy On Writeありそうだからまずいんじゃね?
374デフォルトの名無しさん:2008/10/23(木) 20:43:06
いい
std::string s;の場合、&s[0]はchar*の先頭アドレスと同じように扱える
375デフォルトの名無しさん:2008/10/23(木) 20:45:11
>>371
読み込みはどうするんですか?
376デフォルトの名無しさん:2008/10/23(木) 20:46:04
std::ofstream ofs( "test.txt", std::ios::in |std::ios::out | std::ios::app );
377デフォルトの名無しさん:2008/10/23(木) 20:46:59
訂正

std::fstream fp( "test.txt", std::ios::in |std::ios::out | std::ios::app );
378デフォルトの名無しさん:2008/10/23(木) 20:49:09
>>377
うーん。かきこまれないです
379デフォルトの名無しさん:2008/10/23(木) 20:52:21
そしたらwinAPIつかえよ
380デフォルトの名無しさん:2008/10/23(木) 21:07:16
>>372
ZeroMemoryしなくてもresizeとかコピーされない手段を使えば、初めから0で埋まっているぞ。
381デフォルトの名無しさん:2008/10/23(木) 21:12:53
このプログラムで12345が2行書き込まれる。
#include <fstream>
#include <string>
int main()
{
std::fstream fp( "test.txt", std::ios::in |std::ios::out | std::ios::app);
fp << "12345\n";
fp.seekg(0, std::ios::beg);
std::string s;
fp >> s;
fp << s;
}
382デフォルトの名無しさん:2008/10/23(木) 21:41:14
#include <iostream>
using namespace std;

class Kitty{
int X;
public:
int & getX();
} obj ;

int & Kitty::getX() {
return X;
}

int main() {
obj.getX() = 10;
cout << obj.getX();
return 0;
}
のobj.getX() = 10が何をしてるのかわかりません。
10を代入してるのですか?
関数に数値を代入することってあるのでしょうか?
383デフォルトの名無しさん:2008/10/23(木) 21:47:23
参照型は左辺値になるから、
関数が参照型を返せばそういうこともできるというわけ。
実際使っているとこはあまり見ないけどな。
384デフォルトの名無しさん:2008/10/23(木) 21:48:27
10を代入しているのです
関数に代入するのではなく、戻り値であるintへの参照に代入しているのです
385デフォルトの名無しさん:2008/10/23(木) 22:09:37
質問です、include等は省略させていただきます。

struct data{
char word[81];
int zok;
int ret;
};

data DATA [255];

void main(){

FILE *fp ;
fp = fopen( "Library.dat" , "wb") ;

/* Library.dat の中身を DATA[255]にコピーする */

DATA[12].zok = 8;
DATA[12].ret = 90;
strcpy(DATA[0].word,"hogehoge");

/* Library.dat に DATA[255]の中身すべてを書き込む */

fclose(fp);
}

以上のような事を行いたいのですがコメント文の中身をどのように
すればよいのかをご教授ください。

386デフォルトの名無しさん:2008/10/23(木) 22:14:23
メモリマップドファイルが簡単
387デフォルトの名無しさん:2008/10/23(木) 22:18:59
>>386
ぐぐって見ましたが、確かにこれだとうまくできそうです。
ありがとん
388デフォルトの名無しさん:2008/10/23(木) 22:31:39
string filename;で定義したのをchar型が引数の関数に渡そうと

filename.c_str()で渡したんですが、const char *' から 'char *' に変換できませんとコンパイルとおらないんですが、どうやるんでしょう?
389デフォルトの名無しさん:2008/10/23(木) 22:36:57
>>388
char tmp[256];
strcpy(tmp, filename.c_str());

みたいにテンポラリにコピーしてから渡すとか。
390デフォルトの名無しさん:2008/10/23(木) 22:38:36
&filename[0]
にしとけよ
391デフォルトの名無しさん:2008/10/23(木) 22:47:08
>>388
引数の型を const char * に変える
392デフォルトの名無しさん:2008/10/23(木) 23:02:32
>>385の者です。調べながらコーディングしてみたのですが
『error C2440: '=' : 'LPVOID' から 'data *' に変換できません。』
と言うエラーが出てしまうのですが、何が間違っているのでしょうか?

struct data{
DATA lib[255];
};

data* mydata ;

int main(){
int i =0;
int *p = NULL;
HANDLE h;
HANDLE h2;
int tmp = 0;

h = CreateFile(
"memorymapping.dat" ,
GENERIC_READ | GENERIC_WRITE ,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
NULL ,
OPEN_ALWAYS ,
FILE_ATTRIBUTE_NORMAL ,
NULL
);
printf("HANDLE = %ld, INVALID_HANDLE_VALUE = %ld\n", h, INVALID_HANDLE_VALUE );
h2 = CreateFileMapping(h, NULL, PAGE_READWRITE, 0, sizeof(data), "mmap");
mydata = MapViewOfFile(h2, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(data));/*★*/
/*以下略*/
393デフォルトの名無しさん:2008/10/23(木) 23:03:33
すいません、書き忘れてましたがエラーが出ているのは/*★*/でコメントしている行です。
394デフォルトの名無しさん:2008/10/23(木) 23:03:46
キャストしろ
395デフォルトの名無しさん:2008/10/23(木) 23:05:26
data* mydata = (data*) MapViewOfFile
396デフォルトの名無しさん:2008/10/23(木) 23:06:48
できました、ありがとうございます。
こんな初歩で失敗していたとはお恥ずかしい限りです・・
397デフォルトの名無しさん:2008/10/23(木) 23:07:13
>>389
>>390
>>391

できました!
398デフォルトの名無しさん:2008/10/23(木) 23:07:14
普通にfread(), fwrite() でやったほうが簡単じゃね?

fread(data, sizeof data[0], sizeof data / sizeof data[0], fp);
fwrite(data, sizeof data[0], sizeof data / sizeof data[0], fp);
399デフォルトの名無しさん:2008/10/23(木) 23:15:59
いずれにしても、メモリマップドファイルは勉強しておくと良い項目
オープンがちょっとめんどいが、読み書きのタイミングを自分で決める必要なしで
使うときは便利
400デフォルトの名無しさん:2008/10/24(金) 00:14:49
ifstream ifs("aa.txt");
とすればコンパイルとおるんですが

string filename;

filename = "aa.txt";


ifstream ifs(filename);のコンパイルが通りません。なぜでしょうか
401デフォルトの名無しさん:2008/10/24(金) 00:15:42
&filename[0]
402デフォルトの名無しさん:2008/10/24(金) 00:25:13
c_str()
403デフォルトの名無しさん:2008/10/24(金) 00:42:13
ありがとうございます。ふと思ったんですが、stringを予約語みたいに青くできますか?VSなんですが
404デフォルトの名無しさん:2008/10/24(金) 01:17:38
>>403
USERTYPE.DATでググれ。
405デフォルトの名無しさん:2008/10/24(金) 09:20:17
>>401
std::stringの連続性は保証されていないからまずいんじゃないの。
406デフォルトの名無しさん:2008/10/24(金) 11:11:26
俺もそうおもう
407デフォルトの名無しさん:2008/10/24(金) 11:14:23
実際では、連続していないやつは無いはずでは
408デフォルトの名無しさん:2008/10/24(金) 11:18:16
連続していても、ナルターミネートされている保証がなかったと思う。
409デフォルトの名無しさん:2008/10/24(金) 11:24:27
&hoge[0]つかわないんだったら、
stringをchar型の引数へわたすにはどうすりゃいいんだ? c.strじゃだめだし
410デフォルトの名無しさん:2008/10/24(金) 11:34:49
渡さなければいい。
411デフォルトの名無しさん:2008/10/24(金) 11:35:45
stringからconstじゃないcharにキャストできませんか?
412デフォルトの名無しさん:2008/10/24(金) 11:39:53
だから、互換性を無視して実装に依存したコードでいいなら好きにすればいいっしょ。
そうでないなら、直接渡すことは諦めてvector<char>でもchar[]でも使って中継すればいいだけだし。
413デフォルトの名無しさん:2008/10/24(金) 12:07:17
ここも知ったかが増えたな
414デフォルトの名無しさん:2008/10/24(金) 12:40:45
A. C++0xを使う。
415デフォルトの名無しさん:2008/10/24(金) 13:11:41
ファイル名を解析したいんですが
char file[256]とかに入っているファイル名の.の前(拡張子の前までの文字列を別のchar型の配列に入れたいんですが、どうしたら
いいやりかたありますか?
416デフォルトの名無しさん:2008/10/24(金) 13:27:03
strrchr()で最後のドットを探して、sscanf()か何かで引っぺがす。
417デフォルトの名無しさん:2008/10/24(金) 13:47:11
逆に.から後ろを入れたい場合はどうしますか?
418デフォルトの名無しさん:2008/10/24(金) 13:57:26
あと
data\\hoge.txt

みたいなファイル名の\の前を消そうとおもって
p = strrchr(filename,'\');
とするんですが、\がつかえないみたいでこまってます
419デフォルトの名無しさん:2008/10/24(金) 14:02:48
'\\'
420デフォルトの名無しさん:2008/10/24(金) 14:09:25
>>416
引っぺがす・・?
421デフォルトの名無しさん:2008/10/24(金) 15:30:41
>>420
何がご不満でも?

>>417
そっちも同じ要領でできるだろ。寧ろ簡単だ。
例えばこんな感じ。
--
char foo[] = "/foo/bar/fooz.foo.bar";
char ext[10];
char * dot = strrchr(foo, '.');
if (dot == NULL) ...; // dotが見つからない
if (dot == foo) ...; // 先頭がdot
if (foo + strlen(foo) >= dot + sizeof(ext)) ...; // 拡張子が想定より長い
strcpy(ext, dot);
422デフォルトの名無しさん:2008/10/24(金) 15:33:53
>>415
>416と>421を元に書いてみた。
char foo[] = "/foo/bar/fooz.foo.bar";
char * dot = strrchr(foo, '.');
if (dot == NULL) ...; // dotが見つからない
if (dot == foo) ...; // 先頭がdot

char baseName[100];
if (dot - foo >= sizeof(baseName) ...; // ベースネームが(ry
sprintf(baseName, "%.*s", dot - foo, foo);
423デフォルトの名無しさん:2008/10/24(金) 15:54:35
ifstreamでファイル読み込みすると最後の行が2回よまれるんですが。。。仕様ですか?
424デフォルトの名無しさん:2008/10/24(金) 15:57:46
そういうコードになってんじゃないの?
425デフォルトの名無しさん:2008/10/24(金) 15:59:13
while(!ifs.eof()){

ifs >> 変数;


 }

こんな感じですが、最後の行が2回読まれます
426デフォルトの名無しさん:2008/10/24(金) 16:02:32
eof()の使い方がおかしい。
eof()は自らはstreamを云々する関数ではないので、読み込んだ結果終端かどうかしか返さない。
427デフォルトの名無しさん:2008/10/24(金) 16:07:13
えっと・・・じゃあどうすればいいですか
428デフォルトの名無しさん:2008/10/24(金) 16:15:37
>>425
BASICのEOFと間違えてるだろ

do {
ifs >> 変数;
} while (ifs);

C/C++はあくまで読んだ後でないとEOFかどうか検出できない
429デフォルトの名無しさん:2008/10/24(金) 16:18:06
while (ifs >> 変数)
とか。
430デフォルトの名無しさん:2008/10/24(金) 17:13:32
C++のstringは何文字まではいるんですか?
431デフォルトの名無しさん:2008/10/24(金) 17:17:25
string::max_size() まで
432デフォルトの名無しさん:2008/10/24(金) 17:25:20
>>428
それでも2回よまれました・・・
433デフォルトの名無しさん:2008/10/24(金) 17:26:32
面倒だからgetlineにしてしまうとか
434デフォルトの名無しさん:2008/10/24(金) 17:36:37
>>432
for(;;){
ifs >> 変数;
if (ifs.eof()) break;
変数を使って何かする;
}
435デフォルトの名無しさん:2008/10/24(金) 17:46:49
>>73
輸出依存企業ってのは
国内で労働者を奴隷のように扱って海外に製品輸出してる企業だろ
倒産していいよそんなのは、むしろするべき。
436デフォルトの名無しさん:2008/10/24(金) 18:04:21
誤爆かい

その考え方はおかしいよ
海外で製品が売れることで日本に金が流れてくるんじゃん
輸入ばっかの企業のほうがダメ
437デフォルトの名無しさん:2008/10/24(金) 18:52:05
>>432
だから2回読むのは正常なんだって
問題は読んだ後にEOFになっているかどうかを調べろと言ってるの
438デフォルトの名無しさん:2008/10/24(金) 18:53:02
たしかコピペだから誤爆を装った工作だと思うが。
なりすましての嫌がらせも横行してるから
どちら側の仕業なのかわからんがね。
いずれにしてもスレ違いの話に反応するなよ。
439デフォルトの名無しさん:2008/10/24(金) 18:54:29
>>432
ああ言い忘れた
読んでその直後EOFになっていたら読んだ値は捨てる事。
読んだ直後EOFでなければ読んだ値は有効。
440デフォルトの名無しさん:2008/10/24(金) 19:00:18
ちなみにこいつはゲハ板でもマルチしてるゴミクズ
441デフォルトの名無しさん:2008/10/24(金) 19:16:48
2回読んだりしないだろ。読んでないから変数が書き換えられてないだけ。
442デフォルトの名無しさん:2008/10/24(金) 19:18:55
>>441
いやもちろんそうだが、C++はstd::ios::failbitやstd::ios..eofbitが
立ってしまうと読み込み書き出しの動作を止めてしまうので、
変数の値が変わらず、読んだように見える、と言いたかった。

C言語ならばfseek()でEOFマーカーをクリアできるが、C++の場合は
明示的にストリームに対しclear()などを行ってこれらのビットを
降ろしてやらなければ次の読み書きが一切出来ない。
443デフォルトの名無しさん:2008/10/24(金) 19:24:04
http://d.hatena.ne.jp/ntnek/20050824/p1

ここら辺。eof()を拾うのは正しい処理ではない。
ストリームに対して void* operator() を見るのが正解。
444デフォルトの名無しさん:2008/10/24(金) 19:26:33
じゃなかった、operator void*()か。
C++はややこしい決まり事が無数にあるのでやっぱり本か規格書を
読みながらでないと間違えがちだな。
445デフォルトの名無しさん:2008/10/24(金) 21:05:17
サンプルプログラム

int main()
{
std::ifstream ifs("read.txt");

for (int i = 0; i < 2; i++) {
int i;
while (ifs >> i) {
std::cout << i << ' ';
}
std::cout << std::endl;
ifs.clear();
ifs.seekg(0, std::ios::beg);
}

for (int i = 0; i < 2; i++) {
int i;
while (true) {
ifs >> i;
if (ifs.eof())
break;
std::cout << i << ' ';
}
std::cout << std::endl;
ifs.clear();
ifs.seekg(0, std::ios::beg);
}
}
446デフォルトの名無しさん:2008/10/24(金) 22:00:56
char型で"A5"という文字列から、BYTE型の0xA5というデータを格納させたいのですが、
文字毎に格納するデータを各々書いていくしかないでしょうか?
447デフォルトの名無しさん:2008/10/24(金) 22:02:56
strtol
sscanf
448デフォルトの名無しさん:2008/10/24(金) 23:07:42
Kitty(const Kitty &);

の&は参照を表してるんですか?
449デフォルトの名無しさん:2008/10/24(金) 23:32:57
はい
450デフォルトの名無しさん:2008/10/24(金) 23:35:19
しかもconstと&をペアにして使う事でコピーコンストラクタを
起動させなくても内容が変更される恐れがないので
サイズの大きなクラスなど渡す時に便利
451デフォルトの名無しさん:2008/10/25(土) 00:02:19
constと*ではだめなの?
452デフォルトの名無しさん:2008/10/25(土) 00:07:33
>>451
参照だと見た目、値渡しでコールしてるように見える。
ポインタに比べて、無効な値が入ってきにくくなる。
453デフォルトの名無しさん:2008/10/25(土) 00:08:19
お前はintの初期化にint*を渡すのか。
454デフォルトの名無しさん:2008/10/25(土) 00:08:41
コンストラクタがあれば定数でもわたせるとかってのもあるか。
455デフォルトの名無しさん:2008/10/25(土) 00:09:18
explicit
456デフォルトの名無しさん:2008/10/25(土) 07:37:11
>>447
ありがとうございます!
457デフォルトの名無しさん:2008/10/25(土) 11:12:01
cout << _T("暗号前 :") << data.i << endl;

このプログラムなんですが
unicodeを使用していると_T("")の部分が正常に表示されません。
マルチバイトなら出来るのですが、_T("")は両方に使えると思っていたのですが例外はあるのでしょうか?

あとunicodeとマルチバイトの差はコンパイル時に出るだけだと思って良いでしょうか?
コンパイル時にunidodeかマルチバイトを設定しておけば、どのような環境下でexeファイルを実行しても
内部ではコンパイル時に設定された文字コードが扱われる〜ような。
458デフォルトの名無しさん:2008/10/25(土) 11:16:32
ちがう。
Unicodeコンパイルすれば内部コードがUnicodeになって、Unicode対応OSでないと動かない。
459デフォルトの名無しさん:2008/10/25(土) 11:36:48
>>457
前半だが、
ostream& operator<<(ostream&, LPCTSTR)
みたいなのを自分で定義するか、
単にwcoutに書き込むんだな。

UNICODEや_UNICODEの定義は、TCHARがcharになるかwchar_tになるかの違いなので、
当たり前だが生成されるバイナリが全然違う。
勿論TCHARに一切タッチしないなら関係無い話だが、
あんたがAnsi版、Unicode版を直接指定しないでAPIを使っているなら、
もしくはMFC/ATL/WTLのようなものを使っているなら、無関係では
いられないだろう。
460デフォルトの名無しさん:2008/10/25(土) 11:52:28
#ifdef _UNICODE
typedef wstring _tstring;
#else
typedef string _tstring;
#endif

461デフォルトの名無しさん:2008/10/25(土) 11:54:19
C++なのにオーバーロードでなくマクロで誤魔化している
MFC/ATL/WTLは糞
462デフォルトの名無しさん:2008/10/25(土) 11:56:54
ジェネリックテキストなんて使わないで、ワイド文字にだけ対応すればいいよ。
463デフォルトの名無しさん:2008/10/25(土) 21:26:59
>>460
typedef std::basic_string<TCHAR> _tstring;でいいじゃない。
っていうか下線で始まるのはダメだろ。

>>461
VC++ 7あたりからMFC/ATLのCStringはテンプレート化された。
464デフォルトの名無しさん:2008/10/25(土) 21:42:00
>>463
ん?CStringはCString<TCHAR, StrTraitATL<TCHAR> >
とかだから、結局TCHARマクロ依存だし
Window系のクラスとかが扱うのはLPCTSTRだのCStringだのだから
これまたマクロだろ?

APIと違ってTCHARマクロを避ける方法が無いどころか
全面的に依存してるわけじゃん
465デフォルトの名無しさん:2008/10/25(土) 21:45:24
CStringAとかCStringW使えばいいんじゃないの?
466デフォルトの名無しさん:2008/10/25(土) 21:46:36
おねがいTCHAR
467デフォルトの名無しさん:2008/10/25(土) 21:46:56
>>465
MFCだのATLだののクラスのインタフェースがCStringを要求しているのにか?

APIはA版とW版の両方のインタフェースが提供されている
MFCやWTLは、T版のインタフェースしか提供していない

んだよ
468デフォルトの名無しさん:2008/10/25(土) 22:06:47
そもそもTCHARを避ける理由が無い
469デフォルトの名無しさん:2008/10/25(土) 22:07:29
CStringAとCStringWの間は互いのコンストラクタで変換できる。
いや、そういう話ではないのは分かるけど、書かずにはいられなかった。

>>467
そういう問題ならそうといってよ、勘違いするじゃない。
470デフォルトの名無しさん:2008/10/25(土) 22:10:36
とりあえずマクロで解決するのはやめろよと

CreateWindowってメンバ関数作ろうとしてハマった俺ガイル
471デフォルトの名無しさん:2008/10/25(土) 22:12:06
コンストラクタで変換できるっていうか、AやWを明示的に指定しておいて違ったほうでコンパイルしたらエラーになるから、なんら問題ないじゃん。
472デフォルトの名無しさん:2008/10/25(土) 22:14:49
>>468
パラメーター見ようと、
マウス乗せても、hogeW/HogeAのdefineですぅ、としか表示されない。
473デフォルトの名無しさん:2008/10/25(土) 22:20:47
T系のマクロやら、_t系の関数使っていても、しっかりマルチとワイドの両方に対応してるところなんてほとんどないだろうし、
AやらWに決めうちしたほうが、かえってトラブルなくて安全になりそう。
474デフォルトの名無しさん:2008/10/25(土) 22:22:18
マルチとワイドの両方に対応しようとしたら#ifdefの嵐にならざるを得んだろ
ロジック自体が共有できんことが多いのだからな
それなのにマクロ一発で切り替えるという発想自体が馬鹿
475デフォルトの名無しさん:2008/10/25(土) 22:24:58
そもそもAを想定したOS自体が既に非サポートなわけで
476デフォルトの名無しさん:2008/10/25(土) 22:30:30
>>472
Janeみたいに多段ポップアップなら良いのにな
477デフォルトの名無しさん:2008/10/25(土) 22:31:35
>>470
.NET Frameworkに同名のメンバがあるやつでそういう問題が起こるからって、
最近のSDKではMC++やC++/CLIでコンパイルすると
マクロをやめてインライン関数で定義するようになっている。
478デフォルトの名無しさん:2008/10/25(土) 22:52:55
質問です。
配列の要素数は
奇数がいいのですか?
偶数がいいのですか?
2の倍数がよいのですか?
素数がよいのですか?
479デフォルトの名無しさん:2008/10/25(土) 22:56:41
要素数だけに、要・素数、なんて。
480デフォルトの名無しさん:2008/10/25(土) 22:58:48
.NETのリストは素数で確保してるっぽい
481デフォルトの名無しさん:2008/10/25(土) 23:02:28
>>478
使う分だけ確保すればいいんじゃね?
482デフォルトの名無しさん:2008/10/25(土) 23:06:41
配置new用の演算子オーバーロード、
void* operator new(size_t size, void* buff){ return buff; }
を追加したクラスに対して、通常のnewを使用するにはどうすればよいのでしょうか?
483デフォルトの名無しさん:2008/10/25(土) 23:09:01
::new
484デフォルトの名無しさん:2008/10/25(土) 23:10:05
_cstr
485デフォルトの名無しさん:2008/10/25(土) 23:17:21
>483
ありがとうございます。単純なことだったんですね

>484
すみません、具体的にどうするのか、想像がつきません
486478:2008/10/25(土) 23:41:55
>>481
まぁ、簡単に言うとそうなんですけれど
要素数はどれにすれば一番パフォーマンスが出るかなと思って
487デフォルトの名無しさん:2008/10/25(土) 23:47:53
>>486
要素数はパフォーマンスと関係ないんじゃね?
488デフォルトの名無しさん:2008/10/25(土) 23:50:12
見積もりが甘いと頻繁に伸びる
489デフォルトの名無しさん:2008/10/26(日) 01:08:16
>>486
大概のC/C++処理系はパフォーマンスが出るように設計されて
いるので気にするな
490デフォルトの名無しさん:2008/10/26(日) 01:45:57
C言語で長門がやってたみたいにゲームの改造とかできますか?
491デフォルトの名無しさん:2008/10/26(日) 01:54:42
何箇所で質問しても、まともに返事が返ってくるとは思えないけど。
492デフォルトの名無しさん:2008/10/26(日) 02:28:10
cを始めようと思ってて家に2000年発行の本があるんだけど
これで充分?
493デフォルトの名無しさん:2008/10/26(日) 02:33:48
>>492
だいたい使えると思う。
統合環境の操作方法とか、言語の説明以外のところはつかえない可能性が高い。
494[email protected] rudaichi:2008/10/26(日) 06:40:27
test
495デフォルトの名無しさん:2008/10/26(日) 06:55:56
つい最近、VC++を使いはじめた
んで、hello worldを作ってみた
文字の表示と数字の表示、xやyの変数に代入する事を覚えた

次、何したらいい?
496デフォルトの名無しさん:2008/10/26(日) 07:15:56
入門書読破
497デフォルトの名無しさん:2008/10/26(日) 08:21:22
>>495
外出
498デフォルトの名無しさん:2008/10/26(日) 08:28:20
>>496-497
そういう事は自分で調べろっていう戒めの意味を込めて言ってるんだよな
お前らのその素直でない親心・・・嫌いじゃないぜ

とりあえず、自分で頑張ってみるわ
499デフォルトの名無しさん:2008/10/26(日) 08:42:32
友達からC++のプログラムもらって家でコンパイルしたら
strcpy_s()関数が使えません、という警告が出て、コンパイルが成功しませんでした。
調べてみたらstrcpy_sはstrcpyの拡張版らしくて、うちのコンパイラが若干古いので、strcpy_sは使えないみたいなんです。
それでプログラムのstrcpy_sをすべてstrcpyに置き換えたら、またエラーが出ました。
strcpy_sは引数の数が三個で、strcpyは二個なんで、その警告が出ました。
strcpy_sを、strcpyと同様の動作をさせる関数として定義すればうまくいくと思ったのですが、どのような関数を定義すればよいでしょうか。
500デフォルトの名無しさん:2008/10/26(日) 10:26:15
>>499
参考 URL
http://msdn.microsoft.com/ja-jp/library/td1esda9(VS.80).aspx
パラメータ検証 ( ポインタの妥当性、サイズなど ) の実装が必要。面倒そうだね。
ソースの規模にもよるが、単純に strcpy_s の第二引数を捨てて、strcpy に置換
した方が楽かもしれない。
501デフォルトの名無しさん:2008/10/26(日) 12:53:44
赤い靴履いてた女の子異人さんに入れられてイッちゃった
502デフォルトの名無しさん:2008/10/26(日) 12:54:51
>>490
長門がCで書いてたように見えたか?
503デフォルトの名無しさん:2008/10/26(日) 12:57:04
BCCだったね。
504デフォルトの名無しさん:2008/10/26(日) 15:20:05
>>495
こらこら、曲解するでない
入門書読破はプログラム覚えるにあたって健全な意見

外出はさらに健全な意見


人間的な意味で
505デフォルトの名無しさん:2008/10/26(日) 15:22:39
俺もコンパイラ拡張のはよく分からないというか使えないんだが、
>>500をやるなら
#define strcpy_s(a,b,c) strcpy(a,c)
でどうかな。戻り値使ってないならいけると思う。
506デフォルトの名無しさん:2008/10/26(日) 16:33:06
Visual C++ 2008 Express Edition をインストールしたんですが、
コンソールからコンパイルする方法がわかりません。

(IDEを使うよりも最初はコンソールからやった方がいいと聞いたので、、、、)

どなたかお願いします。
507デフォルトの名無しさん:2008/10/26(日) 16:46:08
>>504
マジレスすると、入門書を買う金すら捻出できないんだ。
これ以上生活費削ると、来月の家賃を払えない可能性があって云々。
とりあえず派遣に登録して、仕事の紹介受けてるから
そこで働ければ、安定はしそうだけど今はヤバイ。

外出は買い物とか家賃振込みとかで
嫌でもしなきゃいけないから、そこはモーマンタイ。

図書館に行って、それっぽい本を探してみたが
用語辞典ばかりで、今の自分には合わなさそうなのばっかだった。

まぁそれなりに頑張ってみるわ。
508デフォルトの名無しさん:2008/10/26(日) 16:53:22
>>507
金なくてニートなのに、なんでVCなんて勉強してんの?
509デフォルトの名無しさん:2008/10/26(日) 16:54:28
>>507

本を買わなくてもサイトで勉強すればいいのでは?
過去スレ読んでないので外出ならスマソ

取りあえず、ググって最初に出たやつを乗せてみた

ttp://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html
ttp://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html
ttp://wisdom.sakura.ne.jp/programming/cpp/index.html

まぁ、がんばれ
510デフォルトの名無しさん:2008/10/26(日) 17:55:57
ニートがC言語なんてやるなよ・・・。高収入の奴がやる言語だぜ
511デフォルトの名無しさん:2008/10/26(日) 18:15:13
441 名前: 9条教徒(愛知県)[sage] 投稿日:2008/10/26(日) 18:05:01.92 ID:QI/VG6PS
___________
|アキバは     /ヽ‐-/|  |
|いつまでも   |_.・ω・_ .i |
|てめーの味方 ((((((< ミ -゙ |
|ぢゃねーぞ!!  |i、゚ l>゚ ノ从 |
|     ゴルァ   ⊂兇⊃. |
(⌒ヨ_______|_l_ヽ〉F⌒)
| |   ∧_∧      / /
\\ <´Д`>    / /
  \二    二二二/
    |  サヨ |

442 名前: 下痢気味(神奈川県)[] 投稿日:2008/10/26(日) 18:07:33.73 ID:ajuDYaOC
>>441
仕事はやいな

プラカードもってるのがモナーってのもまたwww
512デフォルトの名無しさん:2008/10/26(日) 18:24:31
>>508
むしろ、金掛かるの?
プログラミングには昔から興味あったし、パソコンに関しては
あまり抵抗が無いから、唯一自分が向いてると思えるものなんだ。
てかCよりjavaとかVBとかの方がいいのかな?

>>509
おぉ、リンクサンクス
頑張ってIT企業に就職するわ

>>510
javaとかのweb関係の方が、需要があると聞いたからなぁ。
そういう経験の無い人間は、そっちを目指した方がいいんだろうか。
513あぼーん:あぼーん
あぼーん
514あぼーん:あぼーん
あぼーん
515あぼーん:あぼーん
あぼーん
516あぼーん:あぼーん
あぼーん
517あぼーん:あぼーん
あぼーん
518あぼーん:あぼーん
あぼーん
519512:2008/10/26(日) 18:48:53
お、何だこれ
誰かが意図的に煽ってるのか?
それとも俺のせい?
520あぼーん:あぼーん
あぼーん
521デフォルトの名無しさん:2008/10/26(日) 19:26:07
まぁ、C/C++スレで他の言語を持ち出す時点で嵐みたいなもんだし。
522あぼーん:あぼーん
あぼーん
523あぼーん:あぼーん
あぼーん
524あぼーん:あぼーん
あぼーん
525あぼーん:あぼーん
あぼーん
526あぼーん:あぼーん
あぼーん
527あぼーん:あぼーん
あぼーん
528あぼーん:あぼーん
あぼーん
529あぼーん:あぼーん
あぼーん
530あぼーん:あぼーん
あぼーん
531あぼーん:あぼーん
あぼーん
532デフォルトの名無しさん:2008/10/26(日) 19:58:34
いい加減やめない?
うざいよ〜☆
533デフォルトの名無しさん:2008/10/26(日) 20:06:24
あまりやるとアク禁になるぜよ。
534デフォルトの名無しさん:2008/10/26(日) 20:07:42
Borland C++ Compiler 無償版って雑誌の付録につかなくなったの?
535あぼーん:あぼーん
あぼーん
536あぼーん:あぼーん
あぼーん
537あぼーん:あぼーん
あぼーん
538デフォルトの名無しさん:2008/10/26(日) 20:24:12
>>534
いまさらいらんだろ?
539デフォルトの名無しさん:2008/10/26(日) 20:46:18
>>538
一応9MB、インストール後でも53MB程度だからお手軽でしょ
540デフォルトの名無しさん:2008/10/26(日) 20:58:31
1000まで続けるのか?
541デフォルトの名無しさん:2008/10/26(日) 21:02:51
>>506
付属のVSコマンドプロンプトを起動
ソースファイルのディレクトリに移動
cl.exe hoge.c
hoge.exe
542デフォルトの名無しさん:2008/10/26(日) 21:03:33
つまんね
543デフォルトの名無しさん:2008/10/26(日) 21:39:28
VIPPERでもまざってんのかこれ。
NGめんどいなあバカー
544デフォルトの名無しさん:2008/10/26(日) 21:43:56
>>512
最初に学ぶものとしてCを選ぶのはやっぱりいい選択だと思うよ。
OOPに行きにくくなるかも、という懸念もなくはないけど、まあ。
545デフォルトの名無しさん:2008/10/26(日) 21:58:20
>>512
いまいくつよ?
546デフォルトの名無しさん:2008/10/26(日) 22:09:44
なぁ、このこぴぺって同じやつなのかな?
547デフォルトの名無しさん:2008/10/26(日) 23:24:51
お前ら規制くらうぞおおおおおおおおおおおおおお
548デフォルトの名無しさん:2008/10/26(日) 23:25:22
そのうち正義に持っていくから
549デフォルトの名無しさん:2008/10/26(日) 23:30:37
お前「ら」って
荒らしてんの一人だろ?

最近ム板もキチガイが多いよな
550デフォルトの名無しさん:2008/10/26(日) 23:38:56
>>466
息が詰まるほど笑った。
551デフォルトの名無しさん:2008/10/26(日) 23:44:53
コンストラクタを明示的に呼び出すにはどうしたらいい?
特にコンストラクタ内で別のコンストラクタを呼びたい。

class obj;

obj::obj()
{
obj( v ); // 別のインスタンスが作られるようでNG
}

obj::obj()
{
obj::obj( v ); // 別のインスタンスが作られるようでNG
}

obj::obj
{
operator=( obj( v ) ); // これならOKだが。。
}
552デフォルトの名無しさん:2008/10/26(日) 23:54:34
>>508
金掛かるの?
プログラミングには昔から興味あったし、パソコンに関しては
あまり抵抗が無いから、唯一自分が向いてると思えるものなんだ。
てかCよりjavaとかVBとかの方がいいのかな?

>>509
おぉ、リンクサンクス
頑張ってIT企業に就職するわ

>>510
javaとかPerlとかのweb関係の方が、需要があると聞いたからなぁ。
プログラムの経験の無い人間は、そっちを目指した方がいいんだろうか。
553デフォルトの名無しさん:2008/10/26(日) 23:55:58
>>508
金掛かるの?
プログラミングには昔から興味あったし、パソコンに関しては
あまり抵抗が無いから、唯一自分が向いてると思えるものなんだ。
てかCよりjavaとかVBとかの方がいいのかな?

>>509
おぉ、リンクサンクス
頑張ってIT企業に就職するわ

>>510
javaとかPerlとかのweb関係の方が、需要があると聞いたからなぁ。
プログラムの経験の無い人間は、そっちを目指した方がいいんだろうか。
554デフォルトの名無しさん:2008/10/27(月) 00:08:35
>>551
今は無理。
諦めて初期化用のprivateメンバ関数をそれぞれのコンストラクタから呼び出すくらいしかない。
555デフォルトの名無しさん:2008/10/27(月) 02:15:58
windowsが使いやすすぎてLinuxとかまったく覚えられないのですが、どうすれば改善されますか?
556デフォルトの名無しさん:2008/10/27(月) 06:53:05
>>551
無理。別のメンバ関数にでもしておくしかない。
557デフォルトの名無しさん:2008/10/27(月) 11:24:01
C/C++とちょっと違うかもしれないけど・・・
これ
http://rubyist.g.hatena.ne.jp/muscovyduck/20071009/p1
を試すとSEGVするんですが
(もちろん実際の数値は自分の環境でDumpしたものに置き換えてやった)

なんか環境の設定とか、そのほかの要因とかあるんでしょうか
i686 CentOS5 2.6.18-92.1.13.el5 なんですが
558デフォルトの名無しさん:2008/10/27(月) 11:48:59
いわゆるデータ実行防止というやつでは
mmap とか mprotect とかそのへんをいじらないとだめかも
559デフォルトの名無しさん:2008/10/27(月) 11:56:26
>>557
ただのデータ領域をコードとして実行しようとしたからだな。
実行可能領域に変更できれば解決するけどCentOSでなんてAPI使えばいいかは知らない。
560デフォルトの名無しさん:2008/10/27(月) 12:14:43
C++の環境がないので検証できず、質問します。
map<>.erase()でイテレータ末尾を指定した場合、
どういう処理が行われるのでしょうか?
イテレータ末尾は要素を指さないのですよね?

map<int> dic =〜;
dic.erase(dic.end());
561デフォルトの名無しさん:2008/10/27(月) 12:28:42
560ですが、mapではなくvectorでした。すみません。
562デフォルトの名無しさん:2008/10/27(月) 12:33:47
規格上は定義されていない
処理系独自に何らかのケアをしているかもしれないが、
そうでなければ単純に落ちるか、後々原因不明のバグを引き起こす原因になる
563デフォルトの名無しさん:2008/10/27(月) 12:52:42
>>562
ありがとうございます。
ただ、作者はgoogleにいらっしゃる優秀な方で間違いとは考えづらいのです。
工藤拓さんのprefixspan実装からの引用です。
private:
vector < pair <T, unsigned int> > pattern;
(以下略)
for (map <T, vector <pair <unsigned int, int> > >::iterator l = counter.begin ();
l != counter.end(); ++l) {
if (pattern.size () < maxpat) {
pattern.push_back (make_pair <T, unsigned int> (l->first, l->second.size()));
project (l->second);
★pattern.erase (pattern.end());
}
}
★の部分の理解に苦しんでいます。
564デフォルトの名無しさん:2008/10/27(月) 15:07:16
Cの授業の宿題ってC++のソフトでできる?
めっちゃ初心者なので何もわかりません。
ポインタの講義とかでも「ん?先頭アドレス?それってウマイの?」ってな感じです
565デフォルトの名無しさん:2008/10/27(月) 15:16:26
たいていC++コンパイラはCのコンパイルもできる
コンパイルオプションで言語を指定するか、指定しなければファイルの拡張子で判断
566デフォルトの名無しさん:2008/10/27(月) 16:09:35
>>563
本人に聞けば? 「end()をerase()って何をしたいの?」って。
567デフォルトの名無しさん:2008/10/27(月) 16:28:59
C++の演算子のオーバーロードむずい
568デフォルトの名無しさん:2008/10/27(月) 17:25:29
>>558 >>559
ども。その方向でいろいろ調べてみます
569デフォルトの名無しさん:2008/10/27(月) 19:25:05
>>563
優秀な人だからってバグをまったく出さないわけじゃないだろー。
570デフォルトの名無しさん:2008/10/27(月) 20:56:19
ヒヤリハッとだな
571デフォルトの名無しさん:2008/10/27(月) 21:37:14
are?
572デフォルトの名無しさん:2008/10/27(月) 22:51:29
独習C++の練習問題1.5の循環キューでいきなり躓いたorz
誰か説明してくれー
573デフォルトの名無しさん:2008/10/27(月) 22:54:41
>>572
いや書名だけ言われても
574デフォルトの名無しさん:2008/10/27(月) 22:55:33
575デフォルトの名無しさん:2008/10/27(月) 23:23:43
先日パソコンを購入したばかりの初心者です。
光回線を引きたいと思うのですが、1家屋につき何回線まで引く事が出来ますか?
自宅サーバーのようなものをやってみたいのですがどのような知識が必要ですか?
576デフォルトの名無しさん:2008/10/27(月) 23:25:34
>>575
まずすれ違いだから消えることが必要
577デフォルトの名無しさん:2008/10/27(月) 23:31:56
>>576
え?ここはC/C++スレですよね。
パソコンのOSはC言語で作られていると聞いたのですが
578デフォルトの名無しさん:2008/10/27(月) 23:43:05
なるほど自動車保険のことは車工場の人に聞けばいいのか
579デフォルトの名無しさん:2008/10/27(月) 23:45:24
>>575
何回線でも引けると思うが。 ただし、必要以上に引く場合は特別料金かも
580デフォルトの名無しさん:2008/10/27(月) 23:47:35
もういいです。初心者いじめてニヤニヤするとは、C言語も堕ちたものですねw
今度はJAVAスレで質問してみます。さよなら二度とこねーよ( `,_・・´)フンッ
581デフォルトの名無しさん:2008/10/27(月) 23:49:17
なんだJAVA工作員か
582デフォルトの名無しさん:2008/10/28(火) 00:04:32
あー、キモイわ
583デフォルトの名無しさん:2008/10/28(火) 00:31:40
ほんとつかえねーやつらだな
584デフォルトの名無しさん:2008/10/28(火) 00:46:53
糞つまんねーからマジで二度と来んな
585デフォルトの名無しさん:2008/10/28(火) 00:48:49
vipからきますた
586デフォルトの名無しさん:2008/10/28(火) 01:54:44
>>580
C言語というものは存在しないということを覚えて帰りな
587デフォルトの名無しさん:2008/10/28(火) 02:24:24
すいません質問です。
katamuki自体はdoubleで宣言しているのだからそのまま
katamuki = y/x; でもいいと思ったんですがそれだと小数点以下が表示されないんです。
もしかして y/xそのものはint型で計算されてその値がdouble型のkatamukiに
入ってしまうということなんでしょうか?

#include <stdio.h>
main () {
int x,y;
double katamuki;
printf("xとyを , で区切って入力\n");
scanf("%d,%d",&x,&y);
katamuki = (double)y/(double)x;
printf("傾きは%lf",katamuki);
return 0;
}
588デフォルトの名無しさん:2008/10/28(火) 02:37:50
>>587
そうです
589デフォルトの名無しさん:2008/10/28(火) 03:09:10
string str="噂詐欺";
cout<< str.find("\\")<<endl;
cout<<str.rfind("\\")<<endl;


これ実行すると1と5が出ます。-1と-1にするには、wchar_tに変換するしか無いですか
590589:2008/10/28(火) 03:14:28
日本語を含むパスで\の位置を特定したいのですが
UNIXでもMACでWindowsでもちゃんと動くようにするにはどうしたら良いんですか?
なるべく汎用のやり方を教えてください。日本語以外のコンパイラや文字種でも使える方が良いです。
591デフォルトの名無しさん:2008/10/28(火) 03:35:58
UNIXやMACはパス区切りに\を使わないのだけど、\でいいの?
592589:2008/10/28(火) 03:41:23
>>591
半角の「\」は入力できません。パスの区切りを特定して
ファイル名とパスが分離できればいいです。
593デフォルトの名無しさん:2008/10/28(火) 04:35:00
他の環境(Winもだが)知らないのに
マルチを考えるのは時期尚早
594587:2008/10/28(火) 05:09:30
>>588
ありがとうございました。
595デフォルトの名無しさん:2008/10/28(火) 06:01:38
>>207
やっぱり需要は無いことはないんだな。205とか208とか。

無謀にも作ろうかと思ってVS2008Expressなんぞを入れて
http://pc11.2ch.net/test/read.cgi/tech/1222593978/
http://pc11.2ch.net/test/read.cgi/tech/1224057986/
ttp://www.geocities.jp/pmd_no_naka/ips/
この辺をのぞいてみたが、俺には何が何だかさっぱり分からないので_だ。
大昔にBASICで円や直線を引いたり
100までしか使えない素数を求めるプログラムを書いたぐらいのレベルだからなw

他に方法がないとしたらUtl使いは皆PageDown連打でやってるのだろうか。
596595:2008/10/28(火) 06:03:32
誤爆したorz

スマソ
597デフォルトの名無しさん:2008/10/28(火) 06:53:39
どこの誤爆か気になる
598デフォルトの名無しさん:2008/10/28(火) 09:37:48
>>592
もっかい>>591を読んでも半角のバックスラッシュが入力できないという斜め上の反応しかできないなら
Windowsだけで動作するようなものを作れるようにしよう。
んで、暇なときに各環境のパス区切りに何が使われているのか、\が何なのかを勉強しよう。
599デフォルトの名無しさん:2008/10/28(火) 12:04:45
VC++ 2008 Express Edition を落としてきたんでこれから始めようと思います。
プログラム経験はVBとJavaScriptです。

さっそく入門書を買ったのですが、どうやらVC++/CLIを中心に書かれているらしい。
CLIって文法が全然違うんじゃないのですか?

今から始めるのにコンソールアプリの作り方からちまちま覚えていくのと
比べて、いきなりCLIからはじめてツブシがきくでしょうか?
それともコンソールアプリ→Win32 API って感じで勉強していく方がいいでしょうか?
600デフォルトの名無しさん:2008/10/28(火) 12:32:21
C++/CLIは.NETに対応する為C/C++を拡張した別言語。
C/C++を勉強するなら、VCや.NETとか書かれてない純粋なC/C++言語の本買いな。
Win32APIやるつもりなら、まずコンソールアプリでC/C++言語をしっかり習得してから。
もし.NETメインで行くつもりならC#の方がいいぞ。
C++/CLIよりネットで情報見つけやすいし、開発環境もC#の方が作りやすい。
601デフォルトの名無しさん:2008/10/28(火) 12:40:56
C++/CLIはあまりやる意味ないのかな?
後、C#にもVC++みたいなフォームデザイナはあるのですか?
602デフォルトの名無しさん:2008/10/28(火) 12:59:30
既存のC/C++コードと.NETの橋渡しくらいしか使い道が見出せない。俺の場合。
C#にもフォームデザイナは当然ある。
603デフォルトの名無しさん:2008/10/28(火) 13:15:41
>>600
ありがとうございます。

とりあえず猫のページでCとC++を勉強してみます。

むずかしそうならC++/CLIよりC#の方に行く方がいいんですね?
604デフォルトの名無しさん:2008/10/28(火) 13:35:24
世間一般では、C++が難しいというのは、機能が少ない(.NETが使えない)せい。
しかし、C++/CLIは、.NETの機能を全て使え、既存のC、C++を動かせるので
難易度はC#と同等かそれより易しい。
605デフォルトの名無しさん:2008/10/28(火) 14:30:45
C#は今でも、フリーツールの逆コンパイルでソースが丸見えなんですか?
606デフォルトの名無しさん:2008/10/28(火) 16:06:01
>>604
機能が少ないせいだけではないよー。
エラーメッセージが鬼わかりづらい、インテリセンスが糞弱い、
これらが初心者には致命的ですた。

昨日、vec.erase(vec.end())について聞いた者なんですけど、
VC++環境いれて試したらエラーでした。文脈から考えるに
最後の要素消すつもりなんじゃないかと思うんですが、
unixとかcygwin環境では、vec.erase(vec.end())がvec.erase(vec.end()-1)
に補正されるってことはありうるでしょうか?
607デフォルトの名無しさん:2008/10/28(火) 16:07:32
×unixとかcygwin
○gccとか?
608デフォルトの名無しさん:2008/10/28(火) 17:23:24
vectorはランダムアクセスに適しているが、要素の追加、削除を頻繁に行うような場合には適さない

らしいのですが、予め vector<double> vec(1000)のようにサイズを決めて、宣言し、

それに要素を0番目から999番目に代入するのも遅いんですか?
609デフォルトの名無しさん:2008/10/28(火) 17:27:30
>>608 いいえ
610デフォルトの名無しさん:2008/10/28(火) 17:32:27
定数時間でできますよね。ありがとうございます
611デフォルトの名無しさん:2008/10/28(火) 17:43:19
それって、要素の「追加」も「削除」もしてないじゃん。
612デフォルトの名無しさん:2008/10/28(火) 18:05:39
あと、末尾要素の追加と削除は速いよ
613デフォルトの名無しさん:2008/10/28(火) 18:51:20
string *p[3];

これで文字列へのポインタの配列の宣言

これを関数に渡して、p[0]は文字列"abc"を指すポインタというようにしたいです


void func(string *p[])に func(p)とすればいいでしょうか?
614デフォルトの名無しさん:2008/10/28(火) 19:06:58
func(vector<string> &str)でいいじゃん 実体を参照渡し
あとfunc(vector<string*> p)とか ポインタを嶺渡し

もしかしたらvector使うと自動的に参照渡しかも試練 よくしらない
615デフォルトの名無しさん:2008/10/28(火) 19:09:42
613の書き方だとわかりにくいかもしれないですね。


func内で生成した文字列をmainで確保した場所にいれる操作をしたいんです
616デフォルトの名無しさん:2008/10/28(火) 19:16:14
これでいいじゃん

void f(string &s){ s="abc"; }
main(){ string s; f(s); cout<<s; }


void f(vector<string> &s){ s.push_back("abc"); s.push_back("def"); }
main(){ vector<string> s; f(s); cout<<s[0]<<" "<<s[1]; }


617デフォルトの名無しさん:2008/10/28(火) 19:17:09
文字列が100個ぐらいあるので配列で渡そうと思ったんですが・・・
618デフォルトの名無しさん:2008/10/28(火) 19:18:25
vector<string>の参照渡しで良いだろ 何が嫌なんだよ?
619デフォルトの名無しさん:2008/10/28(火) 19:24:23
mainで渡した文字列100個を書き換えるプログラム

void f(vector<string> &s){ for(int n=0; n<100; n++) s[n]="** "+s[n]+ " **" ; }
main(){ vector<string> s(100);
for(int n=0; n<100; n++) s[n]=97+n;
f(s);
for(int n=0; n<100; n++) cout<<s[n]<<endl; }
620デフォルトの名無しさん:2008/10/28(火) 19:37:15
for(int n=0; n<100; n++) s[n]=97+n;

これはなんのためですか?
621デフォルトの名無しさん:2008/10/28(火) 19:37:59
呼び出し側にvectorなんてものが在るかすら分からんだろ
622デフォルトの名無しさん:2008/10/28(火) 19:39:02
"a"
"b"
"c"
・・・

というサンプル文字列を生成している。 100個を

s[0]="abc";
s[1]="def";
s[2]="ghi";
などと自分で書いても良い
623デフォルトの名無しさん:2008/10/28(火) 19:43:42
>>621000000

文字列がすでに定義されている(char[]やnewなど)なら
stringに先頭アドレスとサイズをセットすれば上のままでよい。
624デフォルトの名無しさん:2008/10/28(火) 19:45:45
呼び出し側にすでにあるデータを書き換えたいのか
新しく文字列リストを作りたいのかよくわからんな

主に気にしてるのは性能なのか?
625デフォルトの名無しさん:2008/10/28(火) 19:45:46
>>621
vector使えるので貼っていたいただいたので大丈夫かとおもいます
626デフォルトの名無しさん:2008/10/28(火) 19:46:24
>>624


新しく文字列リストを作りたいんです。速度とかは別に気にしてないです
627デフォルトの名無しさん:2008/10/28(火) 19:46:38
訂正

>>621 だ。

あと>>623で書いたやり方

void f(vector<string> &s){ for(int n=0; n<100; n++) s[n]="** "+s[n]+ " **" ; }
main(){ vector<string> s(100);
for(int n=0; n<100; n++) s[n]=97+n;
char ch[]="abcdefg";
s[0]=ch; s[0].resize(strlen(ch));
f(s);
for(int n=0; n<100; n++) cout<<s[n]<<endl; }

628デフォルトの名無しさん:2008/10/28(火) 20:13:33
クラスをエクスポートするとかあほすぎ
629デフォルトの名無しさん:2008/10/29(水) 10:09:05
>>608
vectorの末尾への要素の追加は、もともと定数時間じゃなかった?

バッファが足りなくなって拡張する場も、拡張の幅をうまく
計算してやると(というか2倍ずつ)、全体で償却できて
最終的に定数時間になるっていう話だったような
630デフォルトの名無しさん:2008/10/29(水) 18:24:37
償却定数時間と定数時間は違うよ
631デフォルトの名無しさん:2008/10/29(水) 19:23:50
coutでcharやstringの書式設定はできますか?

文字列の最大の長さを5文字としたら、それ未満の長さの文字列には、空白をいれてそろえたいんです。


abc abcd
abcde abc
みたいにずれずに
abc abcd
abcde abc
の様に表示するか、
  abc abcd
abcde   abc

の様にするかのどちらかです
632デフォルトの名無しさん:2008/10/29(水) 19:25:10
書き込んだらずれました・・・


abc____abcd
abcde_abc
の様に表示するか、
__abc__abcd
abcde___abc

こうです
633デフォルトの名無しさん:2008/10/29(水) 19:31:07
マニピュレータでぐぐるがよい
634デフォルトの名無しさん:2008/10/29(水) 19:32:29
右にそろえるとかじゃなくて、うまいこと均等に空白入れるほうか、
それはマニピュレータじゃなかったなごめん
635デフォルトの名無しさん:2008/10/29(水) 19:35:33
widthを使ったらできました・・・
右詰になりました
本当は左詰めにしたかったんですが・・・
636デフォルトの名無しさん:2008/10/29(水) 19:38:06
質問です。

WindowsVista、VisualStudio2008で
C言語のコンソールアプリの勉強をしているのですが、
ファイル操作に関する質問です。

ttp://www.geocities.jp/ky_webid/c/037.html
こちらのサイトにあるバイナリファイルの読み込みのプログラムを参考にファイルを開いて読み込もうとしたんですが、
読み込むことが出来ません。

開いたファイルをfreadするとサイズが0なので、ウォッチ式でファイル構造体を追っ掛けてみると
ファイル構造体の中身のポインタが「0x00000000」になっていて、開けていない?のかなと思ったんですが・・・。

ファイルパスを変えて試した場合はちゃんとNULLになってエラーを出すので、ファイルのパスには問題無いはずなんですが・・・。

何か考えられる原因があれば教えていただけると助かります。
637デフォルトの名無しさん:2008/10/29(水) 20:44:17
なにがおこった
638デフォルトの名無しさん:2008/10/29(水) 20:45:45
>>636
ソースを晒せ。
639デフォルトの名無しさん:2008/10/29(水) 20:59:57
>>635
leftとrightがあるだろ
640デフォルトの名無しさん:2008/10/29(水) 22:21:19
>>636
そんな間違いだらけのサイトで勉強してるから分からなくなるんだよ、きっと。
641デフォルトの名無しさん:2008/10/29(水) 22:24:33
Win32APIを使ったアプリを比較的楽に開発できる環境はありますか?
c/c++でお願いします。
642デフォルトの名無しさん:2008/10/29(水) 22:29:28
VC++2008
643デフォルトの名無しさん:2008/10/29(水) 22:30:29
VS以外になにがある
644デフォルトの名無しさん:2008/10/29(水) 22:33:59
>>642
流石にフォームデザイナみたいな物はありませんよね
645デフォルトの名無しさん:2008/10/29(水) 22:38:24
VC++2008にある
646デフォルトの名無しさん:2008/10/29(水) 22:39:24
斜め上の回答としてQtとかどうか
647デフォルトの名無しさん:2008/10/29(水) 22:40:53
C++/CLIはC++じゃないぞ
648デフォルトの名無しさん:2008/10/29(水) 22:46:22
>>645
VC++2008 Express Editionを使ってみたのですが、C++/CLIのようなフォームデザイナ
は付いていませんでした。
Express Edition以上の製品には付いているのでしょうか?
649デフォルトの名無しさん:2008/10/29(水) 22:49:59
はじめての方のための Visual Studio 2008 Express Edition の 10 の特徴


ドラッグ & ドロップでのインターフェイス作成
時間を取られがちな ユーザー インターフェイスの作成を、ドラッグ & ドロップのみで行うことも可能です。

http://www.microsoft.com/japan/msdn/vstudio/express/feature/2008/
650デフォルトの名無しさん:2008/10/29(水) 23:08:04
SetWindowPos(g_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);

最後の引数が
”SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE”
のように複数の情報が合わさった物が渡されています

受け取り側はどのように、分解分析しているのですか?
651デフォルトの名無しさん:2008/10/29(水) 23:26:19
たぶん、
if (flags & SWP_SHOWWINDOW) {
}
if (flags & SWP_NOSIZE) {
}
...
652デフォルトの名無しさん:2008/10/29(水) 23:27:17
例えばその引き数がparamだとして、(param & SWP_SHOWWINDOW) != 0で取り出せる。
逆に、それができるようにそれらのマクロ定数は2の冪乗の値になっているはず。
653デフォルトの名無しさん:2008/10/29(水) 23:47:58
>>651、652
thx、できました
654デフォルトの名無しさん:2008/10/30(木) 01:41:32
Mingw環境でWindowsプログラミングを独習中です。
書籍のコードを見ていたらファイル先頭の一連の定数定義の並びの中に
次の記述がありました。
<CHANGE>
#define ・・・
</CHANGE>

このCHANGEで囲んでいるのは何を意味してるのでしょうか。
見ているコードはVisualC++向けということなので、
そっち方面のルールなのかなとも思ったんですが、どうもわからず・・・
コードには"(この定数は)アプリケーション定義メッセージ"というコメントがついています。
655デフォルトの名無しさん:2008/10/30(木) 02:08:49
なんかhtmlのタグみたいですね
656デフォルトの名無しさん:2008/10/30(木) 02:23:38
>>655
あ、なるほど。ヘルプですか!
必要に応じてここを変えてね、みたいな・・・
657デフォルトの名無しさん:2008/10/30(木) 08:17:02
<CHAGE>に見えたのは俺だけじゃないはず
658デフォルトの名無しさん:2008/10/30(木) 08:29:50
君だけ
659デフォルトの名無しさん:2008/10/30(木) 10:51:05
cin cout と printf scantfを混ぜて使ってはいけない
というのは標準入出力の問題だから、
cin cout sscanfを併用しても変なことにはならないと言う理解であってますか?
660デフォルトの名無しさん:2008/10/30(木) 11:04:10
混ぜても問題ないです


<iostream>
<stdio.h>
を併用するのがまずいんです
661デフォルトの名無しさん:2008/10/30(木) 12:38:03
shard_ptrモドキを短絡的に実装しようと思って
template <class Ttype> class vecter_ptr : public std::vector<Ttype *> {
public:
~vect_ptr(){
int i;
for(i = 0; i < size(); i++;){
delete at(i);
}
}
};
と書いたら、
この書き方がshared_ptrの動作になるかどうかは置いといて、
error C2523: 'vecter_ptr<Ttype>::~vect_ptr' : クラスのデストラクタが、別の名前で宣言されています。 with[Ttype=std::vector<double>]
と表示されるのですが、これは何が行けないのでしょうか?
662デフォルトの名無しさん:2008/10/30(木) 12:42:11
日本語くらい読めよ
別の名前って書いてあるだろ
663デフォルトの名無しさん:2008/10/30(木) 12:42:25
>>661
× class vecter_ptr
○ class vect_ptr

664661:2008/10/30(木) 13:10:42
ごめんなさい
ちょっと首つってきますorz
665デフォルトの名無しさん:2008/10/30(木) 13:28:14
>>660
併用してもいいよ
sync_with_stdio()をtrueにしておけばな
666デフォルトの名無しさん:2008/10/30(木) 14:43:44
>>665
それって
<iostream>
<cstudio>併用のときも?
667デフォルトの名無しさん:2008/10/30(木) 15:09:08
>>666
そうだよ。sync_with_stdio()でぐぐってみ。
668デフォルトの名無しさん:2008/10/30(木) 15:12:05
STLのmapで、値自体はfindで検索できるのですが、キーが存在しているかどうかを調べる方法はありますか?
669デフォルトの名無しさん:2008/10/30(木) 15:17:27
>>668
map.find(key)がmap.end()を返せば、キーは存在していない。
670デフォルトの名無しさん:2008/10/30(木) 15:19:36
>>668
multimup じゃなければ count() が使いやすいかもしれない。
671デフォルトの名無しさん:2008/10/30(木) 15:22:38
ありがとうございます。mapのメンバを見落としてましたねorz
672デフォルトの名無しさん:2008/10/30(木) 17:47:06
VC++2008EEだと<cstring>を入れなくてもstrcpyとか使えるんだけど普通はどうなの?
673デフォルトの名無しさん:2008/10/30(木) 17:50:12
>>672
それは他のヘッダがcstringをインクルードしているからだろうが
移植性がないのでやめるべき
674デフォルトの名無しさん:2008/10/30(木) 17:51:57
<cstring>も書いといたほうがいいってことか
thx
675デフォルトの名無しさん:2008/10/30(木) 19:19:35
strcpyは、string.hやstringで出来るが
676デフォルトの名無しさん:2008/10/30(木) 19:21:29
なんか変な指摘だなw
677デフォルトの名無しさん:2008/10/30(木) 19:24:33
c〜の方をいんく☆る〜どしたら、std::strcpyって書かないとイケないよね?
678デフォルトの名無しさん:2008/10/30(木) 19:25:50
いけなくない
679デフォルトの名無しさん:2008/10/30(木) 19:26:15
          , -‐ '´  ̄ ̄ ` ヽ、
         /:::::/" `ヽ ヽ::::::::: \
        /:::::::::/     ヽ ヽ:::::::::: ヽ
        l:::::::{:::l ,    ー-j从:ヽ::::::::.ヽ
        | ::i::ル{レ'     ●` li!: ト、::::..',
        /⌒)i"●    ⊂⊃: |ノ::::. l
      /   yi ヘ⊃   ,__,   l|:: |:::::::::.l
      (  /ス、,ゝ、_ `´   ィ<|:: |_:::::::.l
       '</ |l:::: i "Tーイ'^ァレ'l_::::::.l
        \,,t|l:::: l'ヾ::|三/:://l/ ヽ、'i
         |::|l:::: l ヾ∨:::/ ヒ::::彡, | :ji
680デフォルトの名無しさん:2008/10/30(木) 19:41:42
http://qb5.2ch.net/test/read.cgi/operate/1206636885/657
強制ID実装を駄目元で頼み込んでみた。
もし賛同してくれる人がいたら同意のレスつけてください。
681デフォルトの名無しさん:2008/10/30(木) 20:02:50
コピペ君って馬鹿だな、まで読んだ。
682デフォルトの名無しさん:2008/10/30(木) 22:47:19
明日学割でVisual Studio 2008 Professional Edition買ってくるわ
683デフォルトの名無しさん:2008/10/30(木) 22:50:18
>>682
学生ならDreamSparkのほうが安いぞ。
国際学生証を作るのに少し時間かかるみたいだけど。
684デフォルトの名無しさん:2008/10/30(木) 22:53:14
シェアウェアつくるのかもよ!
685デフォルトの名無しさん:2008/10/30(木) 22:56:34
>>683
ホントだ、無料なんですね。
しかし自分はすぐにでも手に入れたいから今回はアカデミック版いっときます。
後一つ質問なのですが、Visual Studioは英語での使用は可能でしょうか?
開発環境ぐらいは英語で使えるようになりたいので
686デフォルトの名無しさん:2008/10/30(木) 23:01:43
>>685
今すぐがいいというなら、期間限定の体験版でしばらく過ごすという手がある。
http://www.microsoft.com/downloads/details.aspx?familyid=83C3A1EC-ED72-4A79-8961-25635DB0192B&displaylang=ja
今時のWindowsとVisual Studioなら、共にUnicode対応で、互いの言語が違っていていも問題ないはず。
687デフォルトの名無しさん:2008/10/30(木) 23:08:04
>>686
ありがとうございます。
体験版といっても90日は試用期間があるみたいなので早速落として見ます。
688デフォルトの名無しさん:2008/10/30(木) 23:18:17
VC2008で、とある関数をinlineにすると、
「LNK2019: 未解決の外部シンボル」とエラー出るです。

どうすればいいの?
689デフォルトの名無しさん:2008/10/31(金) 01:11:23
外部からも参照される関数なら、インクルードファイルに実装も書いてしまう。
690デフォルトの名無しさん:2008/10/31(金) 07:43:05
>>688 コンパイラが阿保なんだろ
691デフォルトの名無しさん:2008/10/31(金) 09:40:35
リンケージの定義が紛れ込んでるとか
692デフォルトの名無しさん:2008/10/31(金) 10:28:47

http://qb5.2ch.net/test/read.cgi/operate/1206636885/657
駄目元で書き込んだ。
賛同してくれる人はこのレスに同意のアンカーをつけてくれ。
693デフォルトの名無しさん:2008/10/31(金) 13:26:27
VS2008使用です。
Bクラスで定義されている構造体をCクラスで使用したいのですが、どのようにしたら良いでしょうか。
ポインタをコピーしたいだけなのですが・・。

////////////////classA.h////////////////////////
class A{
public:
 typedef struct hoge{
  //略
 } HOGE;
////////////////classB.h////////////////////////
pragma once;
#include "A.h"
#include "C.h"
class B : A{
public :
 typedef struct hoge{
  //略  
 } HOGE;
 C m_c;
 HOGE m_hoge;
}
////////////////classC.h////////////////////////
class C{
  HOGE *m_hoge;
  registerHoge( HOGE *hoge ){ m_hoge = hoge;};
}

class Bで m_c.registerHoge( &m_hoge )を呼び出すようにしてコンパイルすると「型指定子がありません」と怒られてしまします。
試しにHOGEの定義をC.hにコピペしたのですが、B:HOGE* から C:HOGE*に変換できませんと怒られてしまいました(T_T)
また、class A, class Bは前任者が設計した物で、あまりいじりたくはありません。どうかご教授お願いします。
694デフォルトの名無しさん:2008/10/31(金) 13:41:00
B::HOGE
695デフォルトの名無しさん:2008/10/31(金) 15:04:02

 typedef struct hoge{
  //略  
 } HOGE;

これをclass Bの宣言(スコープ)内から出して、単独のヘッダーファイル
(HOGE.h)として分離して、

classA.h,classB.h,classC.hの先頭で、HOGE.hを#includeで読み込む。

クラス内でtypedef定義すれば、そのクラス内でのみしか有効ではない
し、定義名が同じでも、実体としての中身が同じかどうかに関わらず、
コンパイラは(A:HOGEとB:HOGEは)別物として扱う。
696デフォルトの名無しさん:2008/10/31(金) 15:05:38
sfmtという乱数の発生法があると知ったので、
それを使ってみたいと思いました。

しかし、使い方が全くわからず困っています。

やったことは、
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html
ここの、
SFMT-src-1.3.3.zip
をダウンロード・解凍しました。

そして、srand()にあたる関数としてinit_gen_rand()という関数が、
rand()にあたる関数としてgenrand_res53()というような関数があると
いうことは何とか調べられたので、

続く
697デフォルトの名無しさん:2008/10/31(金) 15:07:01
#include <stdio.h>
#include <stdlib.h>
#include "SFMT.h"
int main()
{
int i;
init_gen_rand(0);
for(i=0 ; i<100 ; i++)
{
printf("%d",genrand_res53());
}
return 0;
}

というプログラムを作ってテストしましたがコンパイルできません。
外部シンボル'_init_gen_rand'が未解決
外部シンボル'_gen_rand64'が未解決
と表示されます。

環境は、borland c++ builder5がインストールされていますが、
コマンドプロンプトでbcc32 xxx.cという形でコンパイルしています。

初心者で申し訳ありませんが、よろしくお願いします。
698デフォルトの名無しさん:2008/10/31(金) 15:08:24
すいません。補足です。

ソースの場所はSFMT-src-1.3.3.zipを解凍したフォルダ内です。
よろしくお願いします。
699デフォルトの名無しさん:2008/10/31(金) 15:16:55
そのSFMTのソースも一緒にコンパイルしないといけないのでは
700デフォルトの名無しさん:2008/10/31(金) 15:17:04
dSFMT.hじゃないの?
bcc xxx.c dSFMT.c
でどうなる?
たぶんdefineとc99で文句言われそうだが。
701デフォルトの名無しさん:2008/10/31(金) 15:32:04
ありがとうございます。
複数同時にコンパイルということもできるんですね。

dSFMTではなくてSFMTで大丈夫だと思います。
イマイチわからなかったんですけど、多分、
dSFMTは少数の乱数を発生させる奴でSFMTは
整数だと思います。

私が欲しいのは整数なので大丈夫だと思います。

また、>>700さんのように

bcc32 xxx.c SFMT.c

としてみたところ、無事コンパイルできました。

forを含む関数はインライン展開できないと警告されましたが、
SFMT内のことなので無視して実行した結果、
無事乱数が表示されました。

本当に助かりました。ありがとうございます。
702デフォルトの名無しさん:2008/10/31(金) 16:38:30
>>695
BがAを継承してて、B,とAで定義が微妙に違うんです・・。

結局キャストしたら通ったのでそれで良いことにしました。
703デフォルトの名無しさん:2008/10/31(金) 21:16:01
class Dog{
public:
  char* cry(){ return "ワンワン"; }
};

class Cat{
public:
  char* cry(){ return "ニャーニャー"; }
};

typedef char* (*TEST)(void);

void Test(TEST test)
{
  printf("%s\n", test());
}

int main()
{
  Dog dog;
  Cat cat;

  Test(dog.cry);
  Test(cat.cry);

  return 0;
}

こういう事はできないのでしょうか?
引数をDog::cryや&Dog::cryに変えてもエラーが出るのですが・・
704デフォルトの名無しさん:2008/10/31(金) 21:34:20
メンバ関数ポインタでぐぐれ
705デフォルトの名無しさん:2008/10/31(金) 21:51:05
#include <boost/bind.hpp>
#include <boost/ref.hpp>

template<typename Func>
void Test(Func test)
{
  printf("%s\n", test());
}

Test(boost::bind(&Dog::cry, boost::ref(dog));
Test(boost::bind(&Cat::cry, boost::ref(cat));

TR1でも可
706デフォルトの名無しさん:2008/10/31(金) 21:57:41
>>703
とりあえず、メンバ関数をstaticで宣言すれば可。

class Dog{
public:
static char* cry(){ return "ワンワン"; }
};

class Cat{
public:
static char* cry(){ return "ニャーニャー"; }
};
707デフォルトの名無しさん:2008/10/31(金) 21:57:45
>>704-705
ありがとうございます
結構面倒な問題ですね;
708デフォルトの名無しさん:2008/11/01(土) 00:08:15
if (i & c[j]) cout << "1";
の&は論理演算子の&&と同じ意味ですか?
709デフォルトの名無しさん:2008/11/01(土) 00:19:36
いいえ
710デフォルトの名無しさん:2008/11/01(土) 00:24:20
&はビット積であって決してショートサーキットなどというものでは無い
711デフォルトの名無しさん:2008/11/01(土) 00:29:09
演算子の意味なんて、検索すれば一発で、しかも詳細にわかることなわけで、
普通のアタマしてる人間なら、こんなことをBBSで質問するという発想自体ありえないな。
712デフォルトの名無しさん:2008/11/01(土) 00:32:55
なんか最近変な人が多いNE
713デフォルトの名無しさん:2008/11/01(土) 00:33:46
演算子は検索しにくい
714デフォルトの名無しさん:2008/11/01(土) 00:37:27
だったら手元の本を見ればいいじゃない。
巻末とかに演算子一覧ってあるでしょ。名前ももちろん書いてあるはず。
715デフォルトの名無しさん:2008/11/01(土) 00:40:52
>>713
「C言語 演算子」とかで検索すれば、まとめて説明してるページがたくさん見つかるっしょ。
演算子そのものを検索ワードにする必要は無いよ。
716デフォルトの名無しさん:2008/11/01(土) 00:42:30
Cで
<は文字列リテラル内以外だと << しか使わないってことでおk?
717デフォルトの名無しさん:2008/11/01(土) 00:43:41
そんなことはない。
x < 1のような比較演算に使う。
718デフォルトの名無しさん:2008/11/01(土) 00:45:28
なんでそんな質問を・・・
719デフォルトの名無しさん:2008/11/01(土) 00:55:24
応用はまったく利かないが、的外れな連想だけは雪崩のよう、って奴は割といる。
720デフォルトの名無しさん:2008/11/01(土) 05:54:18
なんでお前らはもてないのかわかったわ
質問に素直に回答すればいいものをすぐに馬鹿にしたりどうでもいいこというからだな
そりゃ人ともうまくつきあえんしもちろん女にも嫌われるわけ
721デフォルトの名無しさん:2008/11/01(土) 06:27:57
つ鏡
722デフォルトの名無しさん:2008/11/01(土) 08:12:10
かがみ?俺の嫁のことですか?
723デフォルトの名無しさん:2008/11/01(土) 09:27:08
かがみんは俺の嫁
724デフォルトの名無しさん:2008/11/01(土) 11:10:27
>>720
馬鹿なプログラミング学習者はもっともてないよw
725デフォルトの名無しさん:2008/11/01(土) 12:04:40
STLコンテナのイテレータってbegin()で初期化されるとか、end()だとかって決まっているのですか?
もし決まっているとしても、明示的に代入すべきですか?
726デフォルトの名無しさん:2008/11/01(土) 12:36:45
>>725
他にどうしろっての?
727デフォルトの名無しさん:2008/11/01(土) 12:45:44
char型配列で文字列を表現する場合末尾に0を置くと書いてあるんですが、
文字列の途中に0があったら末尾と間違えないんですか?
728デフォルトの名無しさん:2008/11/01(土) 12:46:52
間違えるよ
729デフォルトの名無しさん:2008/11/01(土) 12:46:59
>>727
間違えるというより、そこを末尾と判定するのが正しい動作
730デフォルトの名無しさん:2008/11/01(土) 12:48:12
'\0' == 0
'0' != 0

>>726
begin()で初期化されるとして、itr = begin();みたいなのは冗長かなあと思ってですね
731デフォルトの名無しさん:2008/11/01(土) 12:49:58
>>727
末尾に0を置くというよりは、「0が文字列の末尾」。
もしchar hoge[10]なんて配列があって、hoge[5]が0だったら、
「hogeはサイズ10のchar型の配列」であり、同時に「hogeから始まる文字列は5文字」ということ。
732デフォルトの名無しさん:2008/11/01(土) 13:29:15
>>730
具体的にどうなっているべきだと思うの?
733デフォルトの名無しさん:2008/11/01(土) 13:30:23
>>730
std::vector<Hoge> vec_1;
std::vector<Hoge> vec_2;

std::vector<Hoge>::iterator iter;

begin()で初期化されるとしたら、iterはvec_1, vec_2どっちのbegin()で初期化されるんでしょうね?
734デフォルトの名無しさん:2008/11/01(土) 14:06:15
'\0' == 0
'0' != 0

がよくわからないんですけど、0も\0も同じじゃないんですか?コードがわかりやすいように\を付けるといいと、書いてあるんですが、
char hoge[10] = "7890123456";
は、サイズ10で"789"の3文字の文字列になるんですか?
CString hogeS = hoge;
735デフォルトの名無しさん:2008/11/01(土) 14:10:44
>>734
ざっくばらんに言ってみると
'0' つまりは0という文字は中身としては(大抵は)48という数値だ
putchar(48)とputchar('0')は同じ意味になる
0 という文字に振られた認識番号みたいな感じ

'\0' は中身が0
736デフォルトの名無しさん:2008/11/01(土) 14:14:32
>>735
やっとわかりました。ありがとうございました。
737デフォルトの名無しさん:2008/11/01(土) 14:16:13
文字の「0」と文字コードの「0」は違う値。
"7890123456"の「0」は文字の「0」だから、C言語のコードでは'0'と表す。'0'の文字コードは0ではない。
終端文字の「0」は、'\0'で表す。この文字コードは0である。
738デフォルトの名無しさん:2008/11/01(土) 14:23:22
DLLかlibを作っていった方がいいのか、cppとhのセットかを保管しとけばいいのかよくわからないんですが、
DLLを作る理由ってなんですか?もしかしてオープンソースかどうかの違いしかないですか?自分で使うだけならDLLいらないですよね。であってますか?
739デフォルトの名無しさん:2008/11/01(土) 14:39:08
メモリやディスクの節約。
まぁ自分で作って自分で使うようなちっちゃい関数群だったら、いちいち作る必要は無いかな
740デフォルトの名無しさん:2008/11/01(土) 14:44:40
>>738
毎回リンクする破目になって構わないのなら、DLLにしなくていいよ。
741デフォルトの名無しさん:2008/11/01(土) 14:46:22
Unzip.dllみたいに他のアプリでも使えるルーチンを提供できたり
Susieプラグインみたいに別の人が後から機能拡張できる仕組みを作れたりする。
742デフォルトの名無しさん:2008/11/01(土) 15:12:48
まだDLLは必要なさそうなので、cppで保管して使いまわしていきます。
メモリやディスクの節約というのは、DLLを使うアプリケーションごとにオブジェクトをインスタンスする時、どう節約になるんですか?
あ、staticのときか。わかってきました。ありがとうございました。
743デフォルトの名無しさん:2008/11/01(土) 15:20:22
アプリの実行速度を早くするのにクラスの中で使ってない関数を削除しても意味ない?
なんか馬鹿でかい汎用クラスで使う関数1つだけとか無駄なんじゃないかと気になってきたんだけど
744デフォルトの名無しさん:2008/11/01(土) 15:31:07
>>743
「使わない関数をバイナリから取り除く」程度なら、
処理系の最適化に任せておけば良いと思うよ。

ただ、どのみち実行速度には殆ど関係しないはず。
745デフォルトの名無しさん:2008/11/01(土) 16:36:09
>>744
ありがとう、すっきりした
746デフォルトの名無しさん:2008/11/01(土) 17:50:53
オブジェクトを自動で作るにはどうすればいいんですか?
オブジェクト名が何個必要になるかわからないのでobj1 obj2 ・・・と増やしていきたいんですが

CString クラス名;
for(i=0;i=count;i++){
クラス クラス名+(char)i
}

みたいなことをするにはどうすればいいですか?
747デフォルトの名無しさん:2008/11/01(土) 17:59:12

vector<CString>クラス名;

for(i=0;i=count;i++){
クラス名.push_back+(クラス名());
}

でクラス名[i]で使用じゃなんかまずいのか?
748デフォルトの名無しさん:2008/11/01(土) 18:02:14
vector<クラス>クラス名;

749デフォルトの名無しさん:2008/11/01(土) 18:13:52
C言語をかじっただけの状態ですが、C++に移るのは可能ですか?
750デフォルトの名無しさん:2008/11/01(土) 18:25:29
その人次第
751デフォルトの名無しさん:2008/11/01(土) 18:46:56
別に段階をふんで習う必要ないしな。
遠回りになるか、近道になるかは、たぶんだれも分からないはず。
752デフォルトの名無しさん:2008/11/01(土) 19:03:35
>>747
すごいです。今までSTLは避けてきましたが、動的変数以外でこんなことができるとは知りませんでした。勉強になりました。ありがとうございます。
753749:2008/11/01(土) 19:35:33
>>750 >>751
ありがとうございました。
754デフォルトの名無しさん:2008/11/01(土) 19:41:10
単に可変数のオブジェクトを作成したいだけならわざわざSTL使わなく
てもできると思うが?

CMyClass::CMyClass() {
  m_lpStrBuf=NULL;
  m_numObjCount=0;
}

CMyClass::~CMyClass() {
  delete [] m_lpStrBuf;
}

void CMyClass::CreateMultipleCstring(int nCount) {
  if(m_lpStrBuf)
  {
    delete[] m_lpStrBuf;
    m_lpStrBuf=NULL;
    m_numObjCount=0;
  }
  m_lpStrBuf=new CString[nCount];
m_numObjCount=nCount;
}

CString *CMyClass::GetObject(int nPos) {
  if(m_lpStrBuf && 0<=nPos && nPos<m_numObjCount)
    return &m_lpStrBuf[nPos]; // 有効なインデックス
  else
    return NULL; // 無効なインデックス
}
755デフォルトの名無しさん:2008/11/01(土) 19:48:11
そりゃあ物事は何でも状況にもよるけど、この場の印象度では
圧倒的にそっちのほうが「わざわざ」だと思う。
756デフォルトの名無しさん:2008/11/01(土) 21:23:46
>>754
わざわざ自前でコーディングしてコピーコンストラクタを忘れたり例外安全性を壊したりしたくないよ。
757デフォルトの名無しさん:2008/11/01(土) 21:37:17
>>747
初めて使ったのでめちゃくちゃエラー出て苦労しました。STLと間違えてATLのサポート適用とかいうのを実行したりしましたが、やっとエラー残り1個になりました。

vector<HTREEITEM> vObj;
int i = 0;

void test(void){
vObj.resize(i+1);
vObj.push_back+(vObj()); //この行で 0 引数を取り込む関数には評価されません。 のエラーが出てしまいます。 vObj()の()の意味がわかりません
i++
}

vObj.push_back(vObj);だと意味が違ってくるんでしょうか?
これだと、'std::vector<_Ty>::push_back' : 1 番目の引数を 'std::vector<_Ty>' から 'const HTREEITEM &' に変換できません。
とエラーが出てしまいます。教えてください。
758デフォルトの名無しさん:2008/11/01(土) 21:41:21
なにをしたいのかわからない。
759デフォルトの名無しさん:2008/11/01(土) 21:46:13
vector<HTREEITEM> vObj;
void test(void){
vObj.push_back(HTREEITEM());
}

こうだろ vector は push_backで
必要な領域を自動確保するからresizeなんかいらない。
760デフォルトの名無しさん:2008/11/01(土) 22:04:10
型とインスタンスの違いがわかってない悪寒
761デフォルトの名無しさん:2008/11/01(土) 22:28:30
C++でHelloWorldからやり直すべき
762デフォルトの名無しさん:2008/11/01(土) 22:30:15
push_back+
は誤字です。すいませんでした
改変して作ったもんだったから・・・

そもそもデフォルトコンストラクタでいいなら
vector<HTREEITEM> vObj(10);
ですむんじゃない?
763デフォルトの名無しさん:2008/11/01(土) 22:50:19
うわーーーーーコンパイルできちゃいました。
vObj.push_back(HTREEITEM());
でいけました。みんなありがとう!

なぜクラスに()が必要なんですか?これは戻り値のない関数に使うものじゃないんですか?
764デフォルトの名無しさん:2008/11/01(土) 23:01:53
は?
765デフォルトの名無しさん:2008/11/01(土) 23:09:54
間違えた、引数のない関数だった
766デフォルトの名無しさん:2008/11/01(土) 23:11:49
一時オブジェクトでググれ
767デフォルトの名無しさん:2008/11/01(土) 23:17:02
void で汎用性の高い関数を作れるが
void で値を受け取ると何の型が不明である
型を調べるいい方法ないですか?

今はサイズ受け取ってしのいでる
768デフォルトの名無しさん:2008/11/01(土) 23:17:35
いみふめいです
769デフォルトの名無しさん:2008/11/01(土) 23:20:12
「voidポインタで」でしょ。
可能であればtemplate化でもすれば。
770デフォルトの名無しさん:2008/11/01(土) 23:20:41
>>766
thx!
771デフォルトの名無しさん:2008/11/01(土) 23:50:30
voidポインタは怖いじぇ〜
772デフォルトの名無しさん:2008/11/02(日) 01:26:54
error: converting to execution character set:
バイト・シーケンスが正しくありません。
と言うエラーが出て
以下のようなプログラムがコンパイルできません。
#include <stdio.h>
#include <stddef.h>
#include <sys/types.h>
#include <locale.h>
#include <wchar.h>

int main()
{
   wchar_t *whoge = L"あいう";
   setlocale(LC_ALL ,"");

   wprintf(L"%s\n", whoge);
   return 0;
}

何がいけないのでしょうか?
773デフォルトの名無しさん:2008/11/02(日) 03:08:30
>>772
VC2008ではコンパイルできて、正常に実行できた。
774デフォルトの名無しさん:2008/11/02(日) 07:57:55
>>756
コピーコンストラクタは、vectorで扱うオブジェクトクラスが持って
いるかどうかで、vectorクラスを使えば解決する問題じゃないでしょ。

例外うんぬんも同様。
775772:2008/11/02(日) 08:08:41
>>773
本当ですか?
OSはMac OS Xなんですが、全く動かない。
デバッガで見たら、
wchar_t *whoge = L"あいう";
の時点で、失敗してます。
どうすれば、うまくいきますかね?
776デフォルトの名無しさん:2008/11/02(日) 08:57:45
>>775
Mac OS X 10.5.5
gcc 4.0.1
では、%s を %ls にすることで正しく動いたよ
777デフォルトの名無しさん:2008/11/02(日) 09:25:39
>774
保持されるクラス側で対処しなきゃいけない部分があるのは当然だが、コンテナ相当部分でも面倒を
抱え込みたくはないってことだろ。
実際 >754 のコードは「コピーコンストラクタを忘れたり例外安全性を壊し」てるわけだし。
778デフォルトの名無しさん:2008/11/02(日) 10:14:47
>>775
ワイド文字リテラルの扱いは処理系依存なところがある。
コンパイラのマニュアルをよく読め。
779デフォルトの名無しさん:2008/11/02(日) 10:52:02
>>777
可能です。
以上。
はい、次。
780デフォルトの名無しさん:2008/11/02(日) 11:05:32
>>777
>>754のコード自体は必要部分のみ抜粋してあるけど、CString自体は
コピーコンストラクタを持っているし、GetObject()は保持するオブジェ
クトのコピーではなく生ポインタを返す仕様なので、ここでのコピー
コンストラクタ呼び出しは行われない。

CMyClassの複製を作る際のことを言っているのだとしたら、それは勝手な
解釈だろう。 CMyClassで単にメンバ変数のコピーをするのか、実体も
別に複製してコピーするのか、複製を許可したくない場合も、CMyClassの
定義によって実装も変わる。

結局、テンプレートクラス使っても、マルチスレッド操作の場合、テンプ
レートが保持するオブジェクトの参照に対して、排他制御とか自分でやら
なきゃならないし、テンプレート内で例外が発生しても、例外を投げる
だけで、結局は何も変わっていない思うのだが?

個々のクラス内で例外処理をキャッチしなくても、上位のオブジェクト
生成を呼び出している部分で例外をキャッチできるし、どこに例外処理を
書くかは、設計者次第だろう。

>>775
wchar_t whoge[]= L"あいう";

では?

781デフォルトの名無しさん:2008/11/02(日) 12:08:54
std::map<string,myclass>をmyclassの中のある値に基づいてソートしようとしているのですが、
そんなに要素数は多くないのでバブルソートを自分で書こうとしているのですが、こういう場合は
どうするのがよいですか?
782デフォルトの名無しさん:2008/11/02(日) 12:11:20
mapをソート?
783デフォルトの名無しさん:2008/11/02(日) 12:12:36
>>781
mapをなんだとおもってるんだ
784デフォルトの名無しさん:2008/11/02(日) 12:14:08
std::set<myclass>
785デフォルトの名無しさん:2008/11/02(日) 12:18:41
だめですか?
実際は、map<会社名の文字列、会社のデータ>としておいて、会社のデータの中の株価でソートを
しようと思っているのですが、、、
786デフォルトの名無しさん:2008/11/02(日) 12:25:30
787デフォルトの名無しさん:2008/11/02(日) 12:27:38
>>781
std::map<double,myclass&> 追加
788デフォルトの名無しさん:2008/11/02(日) 14:56:23
教えてください。


private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
 progressBar1->Maximum = shikou_kaisu; /* 最大値 */
 progressBar1->Visible = true;
 label8->Text = "処理中";
 label8->ForeColor = System::Drawing::Color::Red;

 for(i=0; i<shikou_kaisu; i++){
  rnd(kibou_kosu);  //自作関数呼び出し
  Sleep(1);
 }

};
このようにshikou_kaisuには10000を入れていまして、1万回のループに入る前に
プログレスバーを出し、label8の文字色を赤にし、処理中と書き換えているのですが
どちらとも(プログレスバーもlabel書き換えも)for文が終了したあとに処理されてしまいます。
なぜでしょうか?

もう一つ教えてください。

出力ウィンドウに、テスト的に変数の値などを表示させたいのですが、

Console::WriteLine("aaa");
などとしてもまったく表示されません。何か方法はありますでしょうか?
よろしくお願いします。
789デフォルトの名無しさん:2008/11/02(日) 15:03:43
C#はCでもC++でもねえYO
790デフォルトの名無しさん:2008/11/02(日) 15:08:33
C++/CLIも知らないのかよ
791デフォルトの名無しさん:2008/11/02(日) 15:17:41
C++/CLIもC/C++とは言えないかもしれんw
>>789
ソースをよく見ろ。とてもC#には見えない。
それにC#ならConsole::WriteLineでなくSystem.Console.WriteLineじゃないか?
792デフォルトの名無しさん:2008/11/02(日) 15:33:13
>>788
メッセージループ廻してないからでしょ。
793デフォルトの名無しさん:2008/11/02(日) 15:33:32
>>788
何の言語か知らないが、メッセージループでぐぐるのだ。

794デフォルトの名無しさん:2008/11/02(日) 15:46:22
すみません。C++/CLIです。
メッセージループぐぐってみましたが、よくわかりませんでした。
どのように改変すればfor文に入る前に処理できるでしょうか;
795デフォルトの名無しさん:2008/11/02(日) 16:03:28
Labelを書き換えても直ぐには描画されない。その関数を抜けてメッセージプールを回さないと画面更新はされない。
C++BuilderだったらApplication.ProcessMessagesを使うとメッセージループが回って画面更新されるんだけど、C++/CLIはしらね。
他には、タイマーイベントや、アイドルイベント、マルチスレッドとか方法がある。
796デフォルトの名無しさん:2008/11/02(日) 16:16:51
>>795
タイマーもWM_TIMERだったり、アイドルイベントもWM_KICKIDLEだったり
すると、メッセージ通知の1つだから、メッセージループを廻さないと
更新されない。
797デフォルトの名無しさん:2008/11/02(日) 16:26:49
説明不足だったかな、それらのメッセージでforを分割して実行して適度にメッセージが回るようにすればいい。
798デフォルトの名無しさん:2008/11/02(日) 18:03:48
まぁ、まずはイベントドリブンでぐぐれってこった。
799デフォルトの名無しさん:2008/11/02(日) 19:05:51
>780
このデストラクタの定義だとコピーコンストラクタ定義するか複製できないようにしとかないとまずくね?
が、まぁコピーの方針自体に色々あるというのはその通り。

例外についてはどこで catch するか、ではなくて例外が送出された段階で状態が変わってしまう可能性があるのが
あんまりよろしくないという意味。
CreateMultipleCString() 中の new で例外が送出された場合、CMyClass の中身がクリアされてしまう場合がある。
ということで良くある手法としては一時オブジェクトを作成し必要な処理を行った後、nothrow 保証のある swap() で
内容を交換する、というのがある。
まぁこれも強い例外保証なんかいらない、という選択肢はあるかもしれない。
800デフォルトの名無しさん:2008/11/02(日) 19:21:03
>>780
何も変わらないと思っているのにわざわざ自分でコード書く意味がわからんな。
しかも作者次第の部分で大量に解説が必要なやつを。
801デフォルトの名無しさん:2008/11/02(日) 21:21:04
std::vector<自作のクラス>をソートできるようにするには、operator<()を定義しておけばよいですか?
802デフォルトの名無しさん:2008/11/02(日) 21:23:58
それでもboost・・・boostなら・・・・・
803デフォルトの名無しさん:2008/11/02(日) 21:32:39
>>788
ようするに、メッセージループを回すにはその関数button1_Clickから抜ければいい。
すると、button1_Clickを呼んだ誰か(それこそがメッセージループ)が
今度はラベルやプログレスバーを書き換える関数を呼び出す。

チョー手抜きで手っ取り早くやるには、Application::DoEventsを呼ぶこと。
>>795の言っているApplication.ProcessMessagesに相当する。
804デフォルトの名無しさん:2008/11/02(日) 21:46:11
>>801
そう。
定義しなくても sort に比較関数オブジェクトを渡せばよろしい
805デフォルトの名無しさん:2008/11/02(日) 22:28:46
>>804
ありがとうございます。
ソートしたあとの検索でlower_bound()を使ったところ、一致する要素がない場合に
一致していない(微妙に似ている)要素が検索されてしまうのですが、find()で検索するべきでしょうか?

806デフォルトの名無しさん:2008/11/02(日) 22:30:57
それはどういうデータ構造でどんな要素を探したいかに依るだろ
807デフォルトの名無しさん:2008/11/02(日) 22:33:44
>>805
lower_boundは名前通りの仕事をしているだけだ。
808デフォルトの名無しさん:2008/11/03(月) 00:49:32
>>807
もしかして、というのは完全に一致する要素がない場合、大小関係が一番近い要素を
返すんですか?
STL標準講座 では一致する要素があるかどうかをイテレータがvector.end()と一致するかどうかで
判断いたのですが。
809デフォルトの名無しさん:2008/11/03(月) 00:50:37
lower_bound()は、指定した値"以上"の要素が最初に現れる位置を返します。
810デフォルトの名無しさん:2008/11/03(月) 00:53:04
標準の関数の機能なんて、検索すればすぐわかるだろ・・・
そういうことを訊ねるのにスレ使わないで欲しいが。
811デフォルトの名無しさん:2008/11/03(月) 03:02:15
>>810
すいません。
でもソート済みのベクタからある要素を検索するときにはlower_bound()を使うものだと思ってたので、
見つからなかった時にはvector.end()が返るものだと完全に誤解してました。
本もそう書いてあったし。折角ベクタはソート済みなのですが、
find()でやることにしました。
ありがとうございました。
812デフォルトの名無しさん:2008/11/03(月) 03:24:53
>>811
lower_bound() してからもう一回比較かけるだけでいいのに。
813デフォルトの名無しさん:2008/11/03(月) 08:22:33
関数、変数の名前の規則ありますか?

たとえば
*pValu ポインタはpを付ける
vector<????> v○○○ vを付ける
bool is○○○ isを付ける
814デフォルトの名無しさん:2008/11/03(月) 08:34:20
>>813
あるところにはある。ない場合は、好きにすればいい。
必要なら、規約スレ、命名スレへどうぞ。
815デフォルトの名無しさん:2008/11/03(月) 11:37:45
基本情報技術者試験の過去問を読み始めたのですが
断片的なプログラムしか書いてないせいか
よくわからないところがあります。

#include <stdio.h>

void go(void)

int main(void){
int x;
if( x%2 == 0 ) go();
}

おおざっぱに書くとこのような記述が見られます。
なんとなくxの初期値を0と考えて読むとつじつまが合いません。
だからプログラム全体の調和が取れるような適切な値を予想して
自分で1とか2とか想像しなければならないのかなと思うのですが合ってますか?
やはり初期値は0と考えるべきでしょうか?
816デフォルトの名無しさん:2008/11/03(月) 11:40:21
そのプログラムはコンパイルできない。それはおいておいても、
x の値は不定。
プログラムとしては何が起こるか予想できない。
絶対にどこか勘違いか見落としをしている。
817815:2008/11/03(月) 11:40:30
すいません。間違えました。

#include <stdio.h>

void go(void)

int x;

int main(void){
if( x%2 == 0 ) go();
}

こういう形です。
グローバル引数とでも言うんでしょうかね。
818デフォルトの名無しさん:2008/11/03(月) 11:40:59
大域変数は0で初期化される。
局所変数は初期化されない。
819デフォルトの名無しさん:2008/11/03(月) 11:41:13
>>817
x == 0
で初期化されてる
820815:2008/11/03(月) 11:43:26
また間違えました。問題文にmain関数がありません。

#include <stdio.h>

void go(void)

int x;

int check(void){
if( x%2 == 0 ) go();
}

こういう形です。
main関数が明示されていません。
821815:2008/11/03(月) 11:46:21
>>818-819
ということは、この文で言うとxの初期値は0ということでいいんですか?
main関数が何してるかわからないから、結局わからないんじゃないかと
今になって気づいたのですが。
822815:2008/11/03(月) 11:53:35
間違え続けてすみません。こんどはたぶん合ってます。

#include <stdio.h>

void check(void)
void go(void)

int x;

void check(void){
if( x%2 == 0 ) go();
}

やっぱりmain関数が明示されてないから、
どうなってるのかわからないから想像しなきゃならないということのようですね。
自分で勝手にスッキリしました。失礼しました。
823デフォルトの名無しさん:2008/11/03(月) 12:08:38
問題文も一緒に書けばいいのに
824デフォルトの名無しさん:2008/11/03(月) 13:31:42
なんでそこまで間違えるのかよく考えたほうがいい。
普通に考えておかしい。
825デフォルトの名無しさん:2008/11/03(月) 13:35:31
mainがあるない以前に、なぜテキストのコードを丸写しすらできないのかが不思議だ。
みたところまだ丸写しすらできていない様子。そんなコードがまともなテキストに書かれているはずがない。
826デフォルトの名無しさん:2008/11/03(月) 13:46:01
てか理解できるレベルでもないのに勝手な解釈でコードを省略してるから
まともに話ができない。
827デフォルトの名無しさん:2008/11/03(月) 13:47:36
よくわかってないままスッキリしてるみたいだけど
まぁいいか
828デフォルトの名無しさん:2008/11/03(月) 16:11:36
理解できないのにすっきりしたってのは、単なるオナニーだよね。
相手があるのにその状況だったら、失礼無礼を通り越してしまうじゃないか。
829デフォルトの名無しさん:2008/11/03(月) 17:23:03
お願いします。入門書で読んだとおりに
CodeGearのホームページで登録フォームに記入して、メールでパスワードをもらって、
C++ Compiler 5.5/Turbo Debuggerのダウンロードボタンをクリックしたが、
「Internet Explorer ではこのページは表示できません」と表示されます。

「上記のダウンロードサイトにアクセスできないときは、CodeCentral のダウンロードページをお試しください。
CodeCentralのダウンロードページを利用するには、CDNへのログインが必要です。」とあるから「CDNへのログイン」
をクリックしたら

Your LoginとPasswordの二つの記入項目があります。Your Loginとは何でしょうか。
passwordはメールで貰ったものでしょうか。
(OSはウィンドウズ・ビスタです。)
830デフォルトの名無しさん:2008/11/03(月) 17:27:51
もうBolandに電話して聞いたほうが早くないか?
831デフォルトの名無しさん:2008/11/03(月) 17:33:41
>>829
C/C++ の相談ですらないな。
ちゃんと貰ったメールの内容は読んだのか?
832デフォルトの名無しさん:2008/11/03(月) 18:09:12
構造体のメンバと配列を宣言時以外でまとめて更新って出来ませんか?

構造体(もしくは配列) = {値1,値2,,,};

とやると宣言時以外だとエラーが出てしまうんですが、、、
833デフォルトの名無しさん:2008/11/03(月) 18:11:10
floatの配列をintの配列をとる関数に渡すにわどうすればいいの?
834デフォルトの名無しさん:2008/11/03(月) 18:21:37
>>832
自作関数でやる

>>833
テンプレートなりオーバーロードなり
835デフォルトの名無しさん:2008/11/03(月) 18:25:23
>>834(笑)
836デフォルトの名無しさん:2008/11/03(月) 18:35:06
>>833 できません。
837デフォルトの名無しさん:2008/11/03(月) 18:42:05
>>833
1個ずつ型キャストしてコピーして渡す
838デフォルトの名無しさん:2008/11/03(月) 18:44:28
operator int()
839デフォルトの名無しさん:2008/11/03(月) 18:44:40
オブジェクトとは何ですか?
840デフォルトの名無しさん:2008/11/03(月) 18:48:24
色即是空
841デフォルトの名無しさん:2008/11/03(月) 20:01:45
>>833
(int*)
842デフォルトの名無しさん:2008/11/03(月) 22:03:26
enum の値を | して渡そうとするとintに変換できないの言われるです。
843デフォルトの名無しさん:2008/11/03(月) 22:04:35
>>842
日本語でおk
844デフォルトの名無しさん:2008/11/03(月) 22:05:30
>>842
列挙値をビット OR してどういう意味になるのかコンパイラには想像も付かんから、当然だろ。
845デフォルトの名無しさん:2008/11/03(月) 22:05:32
>>842
C++かな
キャストしないと無理
846デフォルトの名無しさん:2008/11/03(月) 22:12:22
847デフォルトの名無しさん:2008/11/03(月) 22:44:01
糞かなぁ。
そもそもenumの値を論理演算とか。
列挙の意味を分かってないんじゃ(笑)
848デフォルトの名無しさん:2008/11/03(月) 22:49:16
まあでも気持ちは分かるし、Flagsを導入できたC#はその点少しうらやましい。
849デフォルトの名無しさん:2008/11/03(月) 22:50:10
仕様の限界を探るより、安定してシンプルな記法を心がけるべきなんだけど、
今の言語教育ってそういう方向を向いてないんだよね。挙げ句つまらないbugブラマが量産されると…
850デフォルトの名無しさん:2008/11/03(月) 23:13:18
>>842
int three = ONE | TWO;であれば問題なくコンパイル通ると思うが。
851デフォルトの名無しさん:2008/11/03(月) 23:54:05
実装依存
852デフォルトの名無しさん:2008/11/03(月) 23:55:11
int型への暗黙キャストだから大丈夫だろ?
853デフォルトの名無しさん:2008/11/03(月) 23:55:57
enumの意味無いけどね
854デフォルトの名無しさん:2008/11/04(火) 00:21:35
CString str;
if(str == ("ヒマワリ" || "ピーナッツ"){
 TRACE(_T("当たり");
}

これで当たりがでません。どうすればいいんですか?
855デフォルトの名無しさん:2008/11/04(火) 00:23:26
>>854
どうしたいんですか
856デフォルトの名無しさん:2008/11/04(火) 00:30:07
>>854
if(str==_T("ヒマワリ")||str==_T("ピーナッツ")){
こういうことか?
857デフォルトの名無しさん:2008/11/04(火) 00:56:00
なんだ糞仕様か
858デフォルトの名無しさん:2008/11/04(火) 01:13:27
>>856
できたありがとう。||じゃなくて&&だった
859デフォルトの名無しさん:2008/11/04(火) 10:29:21
・・・
860デフォルトの名無しさん:2008/11/04(火) 10:49:13
いろいろと突っ込みどころがあるがスルーしておこう。
861661:2008/11/04(火) 14:22:43
無限大を代入したい時ってどうやるんですか?
double d1 = INF, d2 = -INF;
とやると、普通に1が代入されるんですが…
だからってd = -log(0)とかやるのもどうかと思って…
862デフォルトの名無しさん:2008/11/04(火) 14:30:09
#include <math.h>
d1 = HUGE_VAL;
d2 = -HUGE_VAL;
863デフォルトの名無しさん:2008/11/04(火) 14:40:20
C++なら
#include <limits>
d1 = numeric_limits<double>::inifinity();
d2 = -d1;
864861:2008/11/04(火) 16:48:12
ありがとうございます!!
865デフォルトの名無しさん:2008/11/04(火) 21:21:10
ユーザ関数とクラスって同じですか?
866デフォルトの名無しさん:2008/11/04(火) 21:55:02
違います。では次の方どうぞ。
867デフォルトの名無しさん:2008/11/04(火) 22:11:36
#include <stdio.h>

main()
{
int i, j;
 for (i = 1; i <= 50; i++){
for (j = 2; j <= i - 1; j++) {
if (i % j == 0){
break;
}
}
if (i == j){
printf("%d ", i);
}
}
printf("\n");
return(0);
}

これをforじゃなくてwhile文を使って作りたいんですが、どうすればいいのか教えてくらさい
868デフォルトの名無しさん:2008/11/04(火) 22:23:16
forは第二項にある条件式の真偽によってループするか否か決めてる。この場合だとi<=50とかj<=i-1とか。

iとかjの初期化
while(条件式){
iとかjのインクリメント
}

みたいな。
869デフォルトの名無しさん:2008/11/04(火) 22:41:52
      ___    ━┓
    / ―\   ┏┛
  /ノ  (●)\  ・
. | (●)   ⌒)\
. |   (__ノ ̄  |
  \        /
    \     _ノ
    /´     `\
     |       |
     |       |

           ___   ━┓
         / ―  \  ┏┛
        /  (●)  \ヽ ・
       /   (⌒  (●) /
       /      ̄ヽ__) /
.    /´     ___/
    |        \
    |        |
870867:2008/11/04(火) 22:55:26
>>868
できました
ありがとうございました
871デフォルトの名無しさん:2008/11/05(水) 05:28:28
処理速度を上げるには何を優先すればいいんですか?
関数の繰り返しは使わず、変数に結果を入れて変数で処理したほうがいいのか
出来る限り関数はinlineにする。=完成したら、全コードを一つの関数にまとめたほうがいいのか
レジスタは自動にまかせず、手動で使いこなさなければいけないのか
これはあってますか?この他に、なにかありますか?
872デフォルトの名無しさん:2008/11/05(水) 07:04:02
複雑なポインタ操作は使わない。メモリのアクセスを減らす。キャッシュメモリを有効活用する。
分岐をなくす。forは一部展開する。
プログラムはコンパクトにする。アルゴリズムを検討する。
無駄なコピーを無くす
デバッガの逆アセンブラでコンパイラの吐くコードを確認する
873デフォルトの名無しさん:2008/11/05(水) 08:51:16
>関数の繰り返しは使わず、変数に結果を入れて変数で処理したほうがいいのか
>出来る限り関数はinlineにする。=完成したら、全コードを一つの関数にまとめたほうがいいのか
>レジスタは自動にまかせず、手動で使いこなさなければいけないのか
>分岐をなくす。forは一部展開する。
コンパイラに任せる。

>デバッガの逆アセンブラでコンパイラの吐くコードを確認する
コンパイラの出力で充分。

要は、コンパイラを使いこなすだけでかなりのことはできる。
874デフォルトの名無しさん:2008/11/05(水) 11:04:46
>>871
- 良いアルゴリズムを使うこと(=実行時間オーダを減らすこと)
- 実行のボトルネックとなる部分をプロファイルなどの手段で見つけて、そこを高速化すること
 (それ以外の部分を変えても全体の高速化には寄与しない)

あと、あなたが言っているような小手先のコード改変ではまず速くならないよ
無闇にinline化したらキャッシュヒット率が落ちて逆に遅くなるし
875デフォルトの名無しさん:2008/11/05(水) 20:49:46
速度を気にするのは書き始める前(アルゴリズムの選定)と
完成した後(最適化)だけでいい。
876デフォルトの名無しさん:2008/11/06(木) 08:13:30
超初心者的な質問なんですが、
C++にもマイクロソフトのVCとか、何個かあるみたいですが
C++を学びたいと思ったらVCから始めてもいいのでしょうか?
VCと他のC++は何が違うのかがわかりません。。
877デフォルトの名無しさん:2008/11/06(木) 08:19:20
>>876
Visual C++ でいいよ
878デフォルトの名無しさん:2008/11/06(木) 08:20:29
>>876
でもC++/CLIには手を出さないようにな。
879デフォルトの名無しさん:2008/11/06(木) 08:57:38
>>878
楽しいのに
880デフォルトの名無しさん:2008/11/06(木) 09:38:10
>>876
C++は言語の名前、VCは開発ソフトの名前。
881デフォルトの名無しさん:2008/11/06(木) 11:45:42
自分でよければVCから始めることを禁止してもいいけど
禁止されていればいけないということになるだろ
楽チン
882デフォルトの名無しさん:2008/11/06(木) 16:36:27
C++を始めて、DQ1風の戦闘プログラムを書こうと思ったのですが、
途中で行き詰ってしまいました。
キャラクタのクラスを作成し、パラメータを設定したインスタンスを2つ作って
ダメージのやりとりをするというつもりなのですが、
インスタンス間のダメージのやりとりがどうしても上手く出来ません。
解法は無数にあるのだと思いますが、一例やヒントだけでも
教えて頂けるとありがたいです。
883デフォルトの名無しさん:2008/11/06(木) 16:47:10
>>882
メッセージキューでも作ればイイジャン。
884デフォルトの名無しさん:2008/11/06(木) 17:14:50
>>882
ダブルディスパッチでぐぐれ
885デフォルトの名無しさん:2008/11/06(木) 17:38:26
>>882
C++でFC版ドラクエっぽいRPGを作る Lv3
http://pc11.2ch.net/test/read.cgi/gamedev/1224775557/
886デフォルトの名無しさん:2008/11/06(木) 18:31:23
>>882じゃないが>>885見せられると一気に萎えるよな
887デフォルトの名無しさん:2008/11/06(木) 20:00:22
stdafx.hに関数を書いて使うと↓のエラーが出るです。
error LNK2005: hogefunc は既に project.obj で定義されています。

inlineにすると消えるです。でもインラインにしたくないです。
888デフォルトの名無しさん:2008/11/06(木) 20:03:02
staticにする
889デフォルトの名無しさん:2008/11/06(木) 20:06:27
できたです。
890デフォルトの名無しさん:2008/11/06(木) 20:18:21
class Object{
private:
  int value;
public:
  Object() : value(5){}; //この行
};

コメントが付いてる部分の書き方を知らなかったので調べたいのですが、どう検索すればいいかが分かりません。
名前があれば教えてください。
891デフォルトの名無しさん:2008/11/06(木) 20:21:46
コンストラクタ初期化子
892デフォルトの名無しさん:2008/11/06(木) 20:22:19
コンストラクタ初期化子
893デフォルトの名無しさん:2008/11/06(木) 20:24:08
>>891-892
ありがとうございます
894デフォルトの名無しさん:2008/11/06(木) 20:24:39
コロン
895デフォルトの名無しさん:2008/11/06(木) 20:25:21
カラン
896デフォルトの名無しさん:2008/11/06(木) 20:39:55
mapをbeginからendまで進めると
順番がおかしくなるのはどうして

deleted 31
deleted 30
deleted 3
deleted 29
deleted 28
deleted 27
deleted 26
deleted 25
deleted 24
deleted 23
deleted 22
deleted 21
deleted 20
deleted 2
deleted 19
deleted 18
deleted 17
deleted 16
deleted 15
deleted 14
deleted 13
deleted 12
deleted 11
deleted 10
deleted 1
deleted 0
897デフォルトの名無しさん:2008/11/06(木) 20:45:26

deleted 6
deleted 59
deleted 58
deleted 57
deleted 56
deleted 55
deleted 54
deleted 53
deleted 52
deleted 51
deleted 50
deleted 5
deleted 49
deleted 48
deleted 47
deleted 46
deleted 45
deleted 44
deleted 43
deleted 42
deleted 41
deleted 40
deleted 4
deleted 39
deleted 38
deleted 37
deleted 36
deleted 35
deleted 34
deleted 33
deleted 32
898デフォルトの名無しさん:2008/11/06(木) 20:45:58
deleted 9
deleted 8
deleted 7
deleted 63
deleted 62
deleted 61
deleted 60
899デフォルトの名無しさん:2008/11/06(木) 20:57:46
deleted 6
deleted 59
deleted 58
deleted 57
deleted 56
deleted 55
deleted 54
deleted 53
deleted 52
deleted 51
deleted 50
deleted 5
deleted 49
deleted 48
deleted 47
deleted 46
deleted 45
deleted 44
deleted 43
deleted 42
deleted 41
deleted 40
deleted 4
deleted 39
deleted 38
deleted 37
deleted 36
deleted 35
deleted 34
deleted 33
deleted 32
900デフォルトの名無しさん:2008/11/06(木) 21:07:02
deletedって一体何を行っているの?
一応mapのイテレータは順序もきちんとソートされてるはずだけど。
901デフォルトの名無しさん:2008/11/06(木) 21:19:22
あらしかと思った
それを貼って誰かが理解してくれると思ったのか?
902デフォルトの名無しさん:2008/11/06(木) 21:43:32
deleted 31
deleted 30
deleted 3
deleted 29
deleted 28
deleted 27
deleted 26
deleted 25
deleted 24
deleted 23
deleted 22
deleted 21
deleted 20
deleted 2
deleted 19
deleted 18
deleted 17
deleted 16
deleted 15
deleted 14
deleted 13
deleted 12
deleted 11
deleted 10
deleted 1
deleted 0
903デフォルトの名無しさん:2008/11/06(木) 21:44:44
deleted 9
deleted 8
deleted 7
deleted 63
deleted 62
deleted 61
deleted 60
904デフォルトの名無しさん:2008/11/06(木) 21:54:00
「キーが文字列」とエスパー。
905デフォルトの名無しさん:2008/11/06(木) 22:43:11
うむ。それだとレスの順序を適当に入れ替えれば綺麗に並んでるね。
906デフォルトの名無しさん:2008/11/07(金) 00:38:55
キーはその番号の文字列だな
907デフォルトの名無しさん:2008/11/07(金) 01:16:22
>>896
> 順番がおかしくなるのはどうして
「おかしくなる」とか「うまくいかない」ってのは、自分の中に「こうであるはず」という基準・狙いがあって、
それと現実が違ってる、という報告だよね。
そういう書き込みは、自分の基準・狙いと、具体的に何をしたのかを書かなきゃ、情報的に意味が無いよ。

>>904がエスパーしたように、文字列のソート結果として見ると「順番はおかしくない」わけだし。

ちょっとキツイけど、お子様とか低学歴の話し方なんだよね、これ。
いま持っている自分の基準というものが、たくさんある中から個人的な要因で「選んだもの」であり、
言わなきゃ他人には確信できないものだ、ってことに無自覚な話し方。
言い換えれば、「自分の為に世界が創られたわけではないことを、まだちゃんと理解できてない」
レベルの精神から出てくる物言い。こういうのは早く卒業すべき。プログラミングスキル以前の問題だから。
908デフォルトの名無しさん:2008/11/07(金) 01:23:10
初心者を装った新手の荒らしだろう
監視が厳しいから善意を装うわけ
最近増えてきたよね
909デフォルトの名無しさん:2008/11/07(金) 01:46:56
>>907,908
とりあえず精神化逝けよwww
910デフォルトの名無しさん:2008/11/07(金) 02:49:22
なに急に発狂してんの?
911デフォルトの名無しさん:2008/11/07(金) 02:55:59
取り敢えず、>907>908が読めてそれが耳に痛い程度には大人だったってことだろ。
912デフォルトの名無しさん:2008/11/07(金) 03:15:57
言語そのものの初心者は歓迎するんだけどな〜・・・
913デフォルトの名無しさん:2008/11/07(金) 03:31:28
>>912
プログラミング言語の初心者なら歓迎だが
自然言語の初心者はちと困る。
914デフォルトの名無しさん:2008/11/07(金) 03:59:23
sizeof(構造体 FAR)
のFARってなんですか?
915デフォルトの名無しさん:2008/11/07(金) 10:06:24
WindowsだったらFARポインタ 昔の遺物だからそのソースは捨てとけ
916デフォルトの名無しさん:2008/11/07(金) 11:09:44
MS Visual C++ 2008 Express Edition で初歩的なCプログラムを作り、
プロジェクトのプロパティでランタイムライブラリを「マルチスレッド (/MT)」としました。
文字セットも「マルチバイト文字」にしてUnicode不使用にしていますが
Win98SEで起動できません。Win9x で起動できる設定は無いのでしょうか?
VC6を中古で買うしかないのですか?

あと、もう一つはC++/CLIのサンプルコードを入力し、こちらはランタイムライブラリを
「マルチスレッド DLL (/MD)」にして、Frameworkは2.0にしました。

ReleaseビルドしたEXEファイルを.NET Framework 2.0インスコ済みのPCに
持って行きましたが、こちらも起動せずです。。。

他にプロジェクトプロパティでいらうとこがあるのでしょうか?
917デフォルトの名無しさん:2008/11/07(金) 11:15:50
>>916
2005EEをダウンロードしてやってみては
918デフォルトの名無しさん:2008/11/07(金) 17:02:44
>>915
thx!.検索できないし、20年前の入門書にも載ってなかった。どんだけ昔のだよw
919デフォルトの名無しさん:2008/11/07(金) 17:07:55
20年前なら普通にあっただろ、どこの入門書だよw
920デフォルトの名無しさん:2008/11/07(金) 17:12:00
921デフォルトの名無しさん:2008/11/07(金) 21:12:40
見つからないキーワードを探すのに疲れた。

たぶんgoogleを知らなかったんじゃないかな。
922デフォルトの名無しさん:2008/11/07(金) 21:32:33
>>916
エラーメッセージを晒せ
923デフォルトの名無しさん:2008/11/07(金) 21:36:14
>>896
正しく並んでいるじゃないか。どこもおかしくない。
924デフォルトの名無しさん:2008/11/07(金) 22:38:40
>>922
C++/CLI プログラムをWinXP SP2 .NET Framework2.0 SP1 環境に
移動して実行した場合は
「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。
このアプリケーションを再度インストールすることにより問題が解決する場合があります」

もちろんビルドはRelease、Frameworkも2.0を選んで行っています。


C言語でつくった小さいコンソールアプリをWin98SEへ移動して実行した場合、
「ファイルには新しいバージョンのWindowsが必要です。Windowsをアップグレードしてください」
「システムに装着されたデバイスは動作していません」

こちらはWinXPであれば別の環境でも動作します。
文字セットは「マルチ バイト文字セットを使用する」を選んでReleaseビルドしました。

スタンダード以上だとディストリビュートウィザードみたいなのが付いてくるんでしょうね・・・
925デフォルトの名無しさん:2008/11/07(金) 22:43:24
>>924
前者は、(VC++にSP1が当たっているなら特に)ランタイムがインストールされていないだけだと思う。
http://www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&displaylang=ja

Windows 98で動かないのは仕様。
http://msdn.microsoft.com/ja-jp/library/bb531344.aspx
926デフォルトの名無しさん:2008/11/07(金) 23:03:24
>>925
ありがとうございます。

前者は「Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)」をインスコすることで
動作するようになりました。

しかし、Frameworkだけではダメって。。。これってC++/CLIだけですよね?
VBもC#も.net Frameworkだけで動くのにこれでは互換性が低すぎやしませんか?
C++専用のライブラリがあるのでしょうけど、出来ることに大差はないですよね!?


後者については分かりました。
Win9x系で動かしたければ古いコンパイラでビルドするしかなさそうですね。
927デフォルトの名無しさん:2008/11/07(金) 23:13:39
>>926
もちろん、MSだって何もしていないわけではなく、
.NET Framework 2.0(SPなし)には、当時最新だった
VC++ 2005(これまたSPなし)のランタイムが付いていた。
.NET 2.0 SP1にVC++ランタイムが入っているかは知らないが、
当時VC++ 2008にSP1は出ていなかったのでやっぱり無理だな。

ちなみに、/clr:safeでビルドすれば、VC++ランタイムを使わない
C#やVB.NETと同等のプログラムにできる。
928デフォルトの名無しさん:2008/11/07(金) 23:45:10
>>927
なるほど。つまり.NET Frameworkの次バージョンではVC++2008CRTが
同梱される可能性が高いってことなのですかね。

> /clr:safeでビルドすれば、VC++ランタイムを使わない
確かに出来ました。でも当然使えないクラスや関数が出てくるんでしょうね?
929デフォルトの名無しさん:2008/11/07(金) 23:57:36
例えば、printfとかcoutとか使えない。
ヘッダだけで完結するものは使えるだろうが、
そもそも/clr:safeだとマネージコードしか使えないので、それすらもかなり駄目だろう。
マクロやtypedefくらいだろうな。
930デフォルトの名無しさん:2008/11/08(土) 00:16:50
C++/CLIで作ったアプリにドットネット以外の別途ランタイムが必要だなんて知らなかった
C++で作った物には不要だよね?
931デフォルトの名無しさん:2008/11/08(土) 00:27:59
C++は静的リンク出来るから不要ですね。

私もC++/CLIはマネージコードのみだと思っていたので
.NET Frameworkだけで動くとばかり思ってました。

C++らしさを残してコーディングしたければ、やはりCRTを
入れろということなんですね。
932デフォルトの名無しさん:2008/11/08(土) 00:36:44
(DLL版ランタイムを使うなら)もちろん必要。
それ自体は昔からだったが、
・32ビット版はVC6までファイルが共通で、しかも核となるファイルはWin98辺りからOS付属(msvcrt.dll/mfc42.dll)
・そうでなくてもEXEと同じフォルダに置いておくだけで問題ない(VC8からそれがやや面倒になった)
・みんながSystem32に放り込んでいた大らかな時代だった
というわけで意識する必要がなかった。
933デフォルトの名無しさん:2008/11/08(土) 00:50:20
>>931
/clr:safeにすればC#やVBと同等のCRTを使わないアセンブリができる。
pureとmixedの場合はCRTが必要。
ただし.NET Framework自信がCRTを使っているからそのCRTとバージョンがあえばそれが使える。
934デフォルトの名無しさん:2008/11/08(土) 01:23:16
>>932
> ・そうでなくてもEXEと同じフォルダに置いておくだけで問題ない(VC8からそれがやや面倒になった)

これってVC2005以降は出来なくなったの?
935デフォルトの名無しさん:2008/11/08(土) 02:15:39
>>926
VB6以前はバージョンごとにせっせとランタイムを入れさせられたんだけどね。
セットアップファイルつくって必須コンポーネントに指定しておくのが楽かもね。
936デフォルトの名無しさん:2008/11/08(土) 02:18:44
>>934
systemフォルダのDLLが優先されるようになったと思うよ。
たぶん怪しげなアプリとかがwinsockとかuser32とかのラッパーdll配置してるとセキュリティ的によくないからなんだろうけど。
937デフォルトの名無しさん:2008/11/08(土) 02:42:00
DLLのロード順序
0. .local ファイルによるサイドバイサイド (Win2KとXPのみ)
1. KnownDlls とそれから間接的に使用されるDLL
2. マニフェストによるサイドバイサイド (XP以降) 
3. アプリケーションの exe ファイルが存在するディレクトリ
4. システムディレクトリ
5. 16-bit システムディレクトリ
6. Windows ディレクトリ
7. カレントディレクトリ
8. 環境変数 PATH に設定されてたディレクトリ
(古いWindowsではカレントディレクトリの優先順位はexeのディレクトリの次だった)
938デフォルトの名無しさん:2008/11/08(土) 02:48:27
vc2005以降のCRT/MFC/.ATLのDLLに関しては
マニフェストが使用できるXP以降ではマニフェストによるものだけに制限している。
vc2005以降でも普通に作ったDLLやXPより前のOSの場合は>>937のとおり。

なお.NETのアセンブリの場合は全く違うルールとなる。
939デフォルトの名無しさん:2008/11/08(土) 10:38:33
ややこしいな。依存ファイルの世界は・・・。
全部静的リンク出来ればいいのに。

Wikipediaに「依存ファイル」って項目作ってみた。
http://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB

博覧強記の人多そうだから間違ってないか読んでみて
940デフォルトの名無しさん:2008/11/08(土) 10:43:56
Windows以外のことが全く書かれていないのがナンセンスだな。
941デフォルトの名無しさん:2008/11/08(土) 10:45:36
語弊があるようなとこが多い気はするかなぁ
942デフォルトの名無しさん:2008/11/08(土) 10:54:06
そもそも、む板にWikipediaスレがあってもいいような気がする。

>>934
できる。ようするにmanifestファイルも一緒にしないといけないだけなんだけど、なぜか難関と化している。
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-32360.htm
943939:2008/11/08(土) 10:57:04
>>940
Windows以外はDOSしか知らないからな・・・
UNIX系でも依存ファイルとかあるのかな?
944デフォルトの名無しさん:2008/11/08(土) 12:00:28
>>943
正確な用語としての「依存ファイル」て何を指すのか良く分かんないけど、
実行時に動的にリンクされるライブラリって意味なら
共有ライブラリ(shared library。拡張子「.so」)ってのが有って、
静的ライブラリ(static link library。拡張子「.a」)と区別されてる。

でもUnix系の世界では、依存ファイルって言葉は聞かないかなぁ。
945デフォルトの名無しさん:2008/11/08(土) 12:14:23
>>939
この短時間で編集したの?すごいな
946デフォルトの名無しさん:2008/11/08(土) 12:18:20
「ランタイムライブラリ」という項目が既にあるからそっちに書けばいいと思うよ。
「依存ファイル」じゃ意味が広すぎて何の事か分からない。
947デフォルトの名無しさん:2008/11/08(土) 12:28:11
libpngのmakeにはzlibが必要とかそういう依存関係はどうなの
948デフォルトの名無しさん:2008/11/08(土) 12:35:46
ランタイムライブラリも依存ファイル
ビルド時に必要なヘッダ類も依存ファイル
HTMLから参照される画像ファイルも依存ファイル
こっそり保管しているお宝動画も依存ファイル
949デフォルトの名無しさん:2008/11/08(土) 12:52:32
依存ファイルと言って先ず思い浮かぶのは
Makefile で : の右側に書くファイルのことだな。
950デフォルトの名無しさん:2008/11/08(土) 13:42:30
本体の実行ファイルが使ってるライブラリの意味での「依存ファイル」って
単に「依存関係にあるファイル」のことで術語でもなんでもないよ。
951デフォルトの名無しさん:2008/11/08(土) 17:37:14
「依存ファイル」の項は>948-949のような内容に留めて、
それぞれ関連項目を参照すればいいのではないかと。
952デフォルトの名無しさん:2008/11/08(土) 17:39:20
>プログラミング用語で
ではなくもっと狭義である旨を書いておけばいいですかね
953デフォルトの名無しさん:2008/11/08(土) 17:52:48
libc hell
954デフォルトの名無しさん:2008/11/08(土) 18:26:39
*.so hell
LD_PRELOAD hell
955デフォルトの名無しさん:2008/11/08(土) 20:57:29
glibc更新したらlinuxが起動しなくなったでござる。 の巻
956デフォルトの名無しさん:2008/11/08(土) 21:14:17
distro と glibc のバージョンをkwsk
957デフォルトの名無しさん:2008/11/08(土) 23:18:28
C++使ったらオブジェクト指向で分かりやすくなると思ったら間違いなんだよC++で分かりやすいソースが書けるやつはCでも分かりやすいプログラムが書ける表面的なことばかり追求する姿勢を改め機械語からやり直すことが近道だ
958デフォルトの名無しさん:2008/11/08(土) 23:20:07
機械語とか中途半端なんだよ、アセンブリか、回路そのものにしろ
959デフォルトの名無しさん:2008/11/08(土) 23:23:13
アセンブラやるのと分かりやすいソースは関係ないんじゃね?
960デフォルトの名無しさん:2008/11/09(日) 00:10:34
分かりやすいかどうかは、絵や音楽や異性の好みと同じで、
人によって基準が異なる。芸術の域。
961デフォルトの名無しさん:2008/11/09(日) 00:15:14
std::mapに登録した順番を調べる方法は無い?
962デフォルトの名無しさん:2008/11/09(日) 00:28:59
次世路
963デフォルトの名無しさん:2008/11/09(日) 00:38:13
>>961
iteratorで
964デフォルトの名無しさん:2008/11/09(日) 02:06:51
>>961 無いよ。
965デフォルトの名無しさん:2008/11/09(日) 02:18:10
insertに成功したら戻り値のiteratorをlistか何かに入れていく。
しかしそもそも登録順を知る意味が分からない。
966デフォルトの名無しさん:2008/11/09(日) 08:04:24
オーバーライドとは、完全に関数の中身を書き換えるんですか?それとも元のクラスに追加する形になるんですか?
クラス1の継承クラス2でVirtualでオーバーライドした関数をクラス2継承クラス3でオーバーライドするにはどう書けばいいんですか?
クラス3でVirtualを書けばクラス2とクラス1を無視してクラス1の関数をオーバーライドできるんですか?
967デフォルトの名無しさん:2008/11/09(日) 08:11:43
>>966
なんで自分で試さないの?書かないの?
968デフォルトの名無しさん:2008/11/09(日) 08:28:48
Q: 本も読まずソースも書かないままC++を理解するにはどうすればいいですか?
A: 才能ある人間として生まれ変わることを期待して首を吊りましょう。
969デフォルトの名無しさん:2008/11/09(日) 09:38:54
オーバーライドは基本クラスでVirtual宣言してあるものしか派生クラスでオーバーライドできないの?
派生クラスでVirtualでオーバーライドできると思ってるところでおかしくなってるのかもしれなんだけどおしえてくれーーーー
970デフォルトの名無しさん:2008/11/09(日) 10:47:04
コードも出さずにわかるわけないだろ
971デフォルトの名無しさん:2008/11/09(日) 11:01:23
static wchar_t* mtow(const char* buf)
{
int wlen; wchar_t* wbuf;
wlen = MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
wbuf = (wchar_t *)LocalAlloc(LPTR, (wlen+1)*sizeof(wchar_t) );
if( wbuf==NULL ) { return NULL; }

MultiByteToWideChar(CP_ACP, 0, buf, -1, wbuf, wlen+1);
*(wbuf + wlen) = L'\0';
return wbuf;
}

上はマルチ文字をワイド文字に変化する関数、ネットで見つけた

LocalAllocでメモリを確保しているが解放してない
staticを付ければメモリ解放しなくていいの?
あと、何度もこの関数を呼ぶとLocalAllocでメモリ確保され直すのでは?
972デフォルトの名無しさん:2008/11/09(日) 11:12:10
関数にstaticがついていても、解放する必要があります。
LocalFreeを呼ぶのは、呼び出し側の責任で行ってください。
973デフォルトの名無しさん:2008/11/09(日) 11:12:34
>>971
解放したら返り値が使えなくなっちゃうだろ。
mtow の返り値を自分で保持して、使わなくなったら自分で解放しなければならない。
974デフォルトの名無しさん:2008/11/09(日) 11:26:16
把握した
こういう関数は解放忘れそうだな
975デフォルトの名無しさん:2008/11/09(日) 11:34:21
>>974
生のポインタでやりとりせず、スマートポインタを使用すればいい。
976デフォルトの名無しさん:2008/11/09(日) 16:02:50
そろそろ次スレの季節
977デフォルトの名無しさん:2008/11/09(日) 23:21:08
>>975
すみ(い)ません、それどうやってやるんですか?
978デフォルトの名無しさん:2008/11/09(日) 23:24:19
スマポはポインタの解放をラップするテク。結構面白いし簡単だからググッて作ってみては?
979デフォルトの名無しさん:2008/11/09(日) 23:38:51
>>971
のLocalAllocはmallocじゃ駄目なんですか?
あと、何でstatic関数なんですか?
980デフォルトの名無しさん:2008/11/09(日) 23:57:37
>>979
・LocalAlloc()よりmalloc()の方が、汎用性において勝っている。
・どうしても外に公開したい関数以外は、staticにしておいた方がいい。
981デフォルトの名無しさん:2008/11/10(月) 00:06:15
>>977
え、すみませんとすいませんのどっちを使ったらいいか分からないって事?
982デフォルトの名無しさん:2008/11/10(月) 00:08:50
>>980
ありがとうございました。
この場合は、メモリ開放を考慮して外部ファイルよりアクセス禁止かな
983デフォルトの名無しさん:2008/11/10(月) 01:12:24
>>978
>>971を見ただけではC++かどうか分からないと思うんだが。
984デフォルトの名無しさん:2008/11/10(月) 01:42:10
pCtrl->data() ? &Btn : &bar
この?:ってなに?どこかで見たようなきがするんだけどなんだっけ
985デフォルトの名無しさん:2008/11/10(月) 01:43:03
>>984
三項演算子でぐぐれ
986デフォルトの名無しさん:2008/11/10(月) 01:47:44
いや条件演算子という言葉を忘れないでください。
987デフォルトの名無しさん:2008/11/10(月) 20:46:07
>>978
「スマポ」にワロタw
988デフォルトの名無しさん:2008/11/10(月) 20:54:14
いや普通に使うけど
989デフォルトの名無しさん:2008/11/10(月) 21:03:25
スマタかとオモタ
990デフォルトの名無しさん:2008/11/10(月) 21:21:29
水樹奈々のスマイルギャングって番組あるじゃん。
で、水樹奈々が大学で色々なことをするってコントコーナーがあるんだよ。
「つかめ青春 スマ大 キャンパスライフ」って名前で。

http://dm25.cside.jp/~s25853-1/streaming/img/h2_campuslife.gif

「スマ大」がスマタに見えた。
991デフォルトの名無しさん:2008/11/10(月) 22:20:49
環境: OpenBSD4.2 GCC3.3.5
プログラム: http://www.sbcr.jp/books/download/art.asp?newsid=2267
ディレクトリ: /SampleSource/Bison-Flex/CALC/discreate-parser/

書籍のサンプルプログラムをMakeしようとしたところ、
オブジェクトファイルをリンクして実行ファイルを作るステップで以下のようなエラーが出ます。

/usr/lib/libstdc++.so.44.0: undefined reference to 'log'
(以下、'log' の箇所が sqrt, cosh, finitef, cos, tanh, sin, atan2, pow, sinh, log10, exp, tan になっている行がずらずら)
collect2: ld returned 1 exit status
*** Error code 1

おそらく math.h の関数の実体が見つからないというエラーだと思うのですが
libstdc++にそれが入ってないということが有り得るのか、ちょっと分りません。
また、Makefileを書き換えて他のオブジェクトファイルとリンクすれば急場はしのげるかもしれませんが
Makefileを書き換えるにしても、使えそうなオブジェクトファイルに心当たりがないのでお手上げの状態です。

どなたか解決できる方がいたらお願いします。
992デフォルトの名無しさん:2008/11/10(月) 22:26:00
すまぽ
993デフォルトの名無しさん:2008/11/10(月) 22:36:46
>>992 スッ!!
994デフォルトの名無しさん:2008/11/10(月) 22:45:11
>>991
math.hの実体はlibstdc++じゃなくて普通libmにあるよ。
cc -lm my.c
とかが一般的な書き方。
995デフォルトの名無しさん:2008/11/10(月) 22:57:05
cc my.c -lm
じゃないとマズいか。
996デフォルトの名無しさん:2008/11/10(月) 23:19:27
>>994
Makefileの最後の処理の末尾に -lm を付け加えたら無事コンパイルできました。
ありがとうございました。
997デフォルトの名無しさん:2008/11/10(月) 23:50:17
星野
998デフォルトの名無しさん:2008/11/11(火) 03:46:19
& ~ ってどういう意味ですか?
999デフォルトの名無しさん:2008/11/11(火) 03:49:45
C言語 演算子
でぐぐると、お前ら自重しろ、ってくらいたくさん
説明してるページが見つかるよ。
1000デフォルトの名無しさん:2008/11/11(火) 04:56:30
         /     _ , 、-、_ _     \
       /    , ‐´ "   γ'´ `ヽ,    \
       /    /       Λ _,、    ゙~ヽ    ヽ.
        /   , '    ; ,i! i;;;;_v';_| l     `ヽ.   i
       /  / / ; / ! :i'| |    i |  !i     ゙j  |
     ヽ_,,ノ;  !: l/| |, Li !     i i! l,|  .:|   :|   |
      ´フ:: |: |: i'"|_i_,! |_!   |_i' /、!  ::!  .:;|   !
        /;: |::. l;__! __,,,,_      ` | .::/  ::|;レ'"
        !:: {:_j. ''"   `    ‐'''‐、,`"''! .:ノ.;ゝ
       レ'"l|  |         ,     ` ./__/´.::l
       /  l.|  |     ,,,, __       /  !ヾ;ノヽ,
       /  /i´ ̄|、    l   ;゙     /|_|  i   ;  また会おうね〜♪
      ,!.へi |:.   |'゙ヽ、  ゛- '   ._,イ/|  i   |.へi
      !.へ.! l::  │_l゙丶、 __ ,, ‐'l  " |  :|   i,へ.!
           !::   l´l'丿       lヾヽi  ::|
    _,, -‐ '´|::   | l´         ソ |  ::|'' ‐- 、_
   /ヽ.     |::: │ヽ         ./  ! .:::!   /\
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。