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


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

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



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

730 名前:デフォルトの名無しさん [2007/08/26(日) 23:55:03 ]
助けて!以下のプログラムでメモリがおかしくなるお!
分母150 試行回数100000で繰り返すとなるお!
助けて!

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

int main()
{
int i,j,dom,cnt,max,ret,k;
int ch;
int array[128];
int over, less;
long int times;

i = j = k = dom = cnt = times = max = 0;

printf("input dominator >");
scanf("%d", &dom);
printf("input times >");
scanf("%ld", ×);


731 名前:730続き [2007/08/26(日) 23:55:39 ]
LOOP:
k = 0;
over = less = 0;
while(getchar() != '\n');
printf("dominator = %d times = %d\n", dom, times);

sleep(1);
srand(time(NULL));
for(i=0; i<times; i++){
cnt++;
ret = rand() % dom;
if(ret == 7){
array[k] = cnt / 100;
array[k]++;
k++;
array[k] = -1;
printf("%d\n", cnt);
if(cnt > max){
max = cnt;
}
if(cnt > dom){
over++;
}
else{
less++;
}
cnt = 0;
}
}

732 名前:730続き [2007/08/26(日) 23:56:15 ]
for(i=0; array[i] != -1; i++){
for(j=0; j<array[i]; j++){
printf("*");
}
printf("\n");
}

printf("MAX = %d\n", max);
printf("OVER = %d ELSE =%d\n", over, less);
printf("%d/%d\n", over+less, times);
printf("%f\n", times / (double)(over + less));
printf("Retry ? (y/n) >");
ch = getchar();
if(ch == 'y' || ch == 'Y'){
goto LOOP;
}

return 0;
}


733 名前:730 [2007/08/26(日) 23:56:54 ]
このままじゃパチンコで勝てないお!
助けてお!

734 名前:デフォルトの名無しさん [2007/08/27(月) 00:00:33 ]
こんなプログラム書いて何になるの?


735 名前:デフォルトの名無しさん [2007/08/27(月) 00:01:41 ]
>>734
>>733

736 名前:724 mailto:sage [2007/08/27(月) 00:01:41 ]
>>729
ありがd。見てみたら、BOMついてませんね。
付けてオンパイルしてみます。ノシ

737 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 00:04:27 ]
>>730
ざっとみだけど

>int array[128];

が足りてないだけじゃないの?

738 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 00:06:54 ]
>>730
メモリをケチるな!
array[128] → array[2048]
期待値は (1/150)*100000=666.67



739 名前:730 [2007/08/27(月) 00:10:46 ]
できたおおおおおおおおおお!
これで勝てるお!

740 名前:730 [2007/08/27(月) 00:11:55 ]
期待値の詳細希望

741 名前:730 [2007/08/27(月) 00:14:06 ]
なるほどお!ボヌスが666.67回くるってことかお!
ありがとお!

742 名前:730 mailto:sage [2007/08/27(月) 00:17:43 ]
やっぱりすごいお
さっぱりわからなかったのに
すぐ回答がきたお
どうしたらそうなれるかお?

743 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 00:20:17 ]
>>742
毎日2時間、電灯のヒモでボクシング。これを1年続けること。

744 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 00:21:02 ]
みんな半年から1年ぐらい
アーバンチャンピオンと
スパルタンXで鍛えてるはず

745 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 00:26:58 ]
>>740
100000回×(1/150)=666.67回 kがインクリメントされるわけだから
array[k]はarray[668]って式で参照される可能性があるわけで
array[128]と宣言したのではあきらかに足りないってことなんではないかと>期待値云々
こういう実行時に入力される値に依存するような大きさの配列はメモリの動的確保で扱うべきだとは思うけどね

746 名前:724 mailto:sage [2007/08/27(月) 01:39:46 ]
>>736
ファイルの先頭にBOM(というか、ZERO WIDTH NON-BREAKING SPACE。ef bb bfの3バイト)を付加したら
無事、オンパイルできました。

747 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:42:28 ]
>>746
いや、ファイル先頭にある場合、つまりBOMである限り、
それはBOMであってZERO WIDTH NON-BREAKING SPACEとは言わないんだ。

748 名前:724 mailto:sage [2007/08/27(月) 02:02:45 ]
>>747
添削ありがd。

WikipediaのUTF-8(ja.wikipedia.org/wiki/UTF-8)のところに記述がありました。
> プロトコルが常にUTF-8である事を強制しているものである場合はBOMを禁止するべきで、
> この場合ファイル先頭のBOMは "ZERO WIDTH NO-BREAK SPACE" と見なされる。
> 逆にプロトコルがそれを保証しない場合BOMは禁止されずファイル先頭のそれはBOMと見なされる。(tools.ietf.org/html/rfc3629#section-6

2文目ですね。



749 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 10:40:28 ]
www.vista-osx.com/kensaku.htm

750 名前:デフォルトの名無しさん [2007/08/27(月) 15:06:25 ]
ヘッダファイルの書き方について質問です。

自分で複数ファイルのプログラムを作ったとき、
たとえば、mian.c , sub.c , sub.h という3つのソースファイル
からなるプログラムの場合、
$ gcc main.c sub.c
としますよね。

でも#include<stdio.h>などでは、
stdio.hにはプロトタイプ宣言しか無くて、printf( );とかの定義が無いはずなのに
$ gcc main.c stdio.c
などとしなくてもいいのはなぜですか?

751 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 15:09:05 ]
パス通ってるからじゃないん?よーわからんけど

752 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 15:11:52 ]
引数で指定しなくてもリンクされるようになってるから。

753 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 15:17:52 ]
C++のvector配列って結構処理重いんでしょうか。
10MB前後のテキストデータをmallocしたポインタ読み込んで、区切り文字単位に編集・分解していった場合と、
stringに読み込んでからvector<string>に編集・分解していった場合で、
処理時間が前者が約25秒、後者が約60秒掛かったのですが、こんなもんなんですかね。

754 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 15:28:49 ]
コードplz

755 名前:デフォルトの名無しさん [2007/08/27(月) 15:34:02 ]
vector に malloc なんか使ってるから・・・

756 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 15:36:15 ]
>>753
vector<string>版も意外に速いなw
STLコンテナは基本的に値を保持するんで、その場合はstringのインスタンスを
コピーしまくることになる
ポインタだけで操作すれば格段に速いのは当たり前だ

vector<>が遅いというよりはメンバのコピーに時間がかかっているだけなので、
そこが性能のボトルネックになっているのなら、
vector<char*>でポインタを保持するなり
vector<int>でインデクスを保持するなりするとよいだろう

757 名前:753 mailto:sage [2007/08/27(月) 15:45:43 ]
>>756
なるほど、言われてみればインスタンスのコピー云々で納得です。
御指導ありがとうございましたm(_ _)m

758 名前:デフォルトの名無しさん [2007/08/27(月) 16:01:38 ]
質問です。
i = (char*)malloc(sizeof(char) * 256);
でメモリ領域を確保したのですが、256バイト以上使用することができます。
なぜでしょうか?教えてください



759 名前:デフォルトの名無しさん [2007/08/27(月) 16:03:02 ]
>>758
たまたま

760 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:07:29 ]
>>758
本来アクセスしちゃいけないところにアクセスしてるだけ
CはC#などとは違ってそんな事しても例外は発生しないし
たまたま何のエラーも出ない事がある
だからってそんな事やってたらきっとそのうちクラッシュするよ

761 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:10:57 ]
>>758
一般的にmallocは、予めOSから確保しておいたでっかいメモリの塊から
必要な分だけを切り分けて自身の戻り値にしている(残りは次回以降のmallocなどで使う)。
理由は、OSのメモリ確保処理が大抵大容量の確保に向いていて小回りが利かないから。

そういうわけでその256バイトの後ろにも、OSから見れば
アプリケーションが確保した(実態はmallocが抱えていたり
他のmallocなどの呼出で使われている)メモリ空間が広がっている。

だから一見256バイトの後ろも読み書きできるように見えるというわけ。


762 名前:デフォルトの名無しさん [2007/08/27(月) 16:16:24 ]
758です。
勉強になりました。
ありがとうございます。

763 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:19:05 ]
運が悪いと範囲外に書き込んだときに他の変数の値書き換えたりすることがあるから範囲外アクセスはNGよ

764 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:10:51 ]
質問させて頂きます。
現在UNIX環境でコンソールベースのプログラムを組んでいるのですが
CUIからメニューの操作、カーソル操作の為のエスケープシーケンスに悩んでおります
コンソールベースのプログラム自体あまり組んだ事ないのですが
CUIからメニュー操作というのは可能なのでしょうか?

765 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:16:05 ]
環境によるかもだけど、ncursesとか調べてみると幸せになれるかもしれない。

766 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:27:24 ]
>>764
こんなのでいいなら簡単にできるけど
エスケープシーケンスの設定が済んでいることが前提
#include <stdio.h>

int main(void){
int i, x, y;
printf("\x1b[2J"); // clear screen
for(i=1;i<=9;i++){
x=i;
y=(i%2)+1;
printf("\x1b[%d;%dH", y, x); // cursor move
printf("%d", i);
}
return 0;
}


767 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:31:35 ]
malloc使う奴はクソだとか言われる事が増えてきてる中、このスレは落ち着きますね…

768 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:34:39 ]
まじで?そんなこと言う奴がいるのか・・・



769 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:52:36 ]
vector型の配列をランダムに並び替えるには自前で作るしかないですかね?

770 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:56:12 ]
std::random_shuffle だっけ

771 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:25:47 ]
>>770
ありがとうございます

772 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:44:37 ]
>>765-766
有難うございます。
ncursesについて詳しく調べて見たいと思います。

エスケープシーケンスからの操作なのですが、設定とはどう行うかご教授願えないでしょうか?
検索しても見つからなくてorz

773 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:51:24 ]
>>772
UNIX環境なら使うターミナルを選ぶだけかな…
MS-Windows環境なら ansi.sys を読み込ませる



774 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:53:34 ]
>>772
TERM環境変数
普通はシェルの初期化スクリプトなどで設定するが、
普通にシェルを操作できてるんなら、まあ大丈夫だろう

775 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 23:01:57 ]
>773
えー。それって、Windows環境で、DOS-Exeを動かす場合だけでそ。

776 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 23:12:20 ]
>>773-775
有難うございます。
凄く勉強になります。
ご教授して頂いた所を詳しく調べてみたいと思います。

777 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 23:48:42 ]
>>775
bashとかでもあるよ。

778 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 23:54:03 ]
だれか俺にbashとansi.sysの関係を教えてくれ。



779 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 23:58:10 ]
すまん。レス番見間違えた。

780 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 03:00:09 ]
プログラム初心者なのですが,助けてください.
VC++2005Express,WinXP Pro環境で,
コンソールアプリケーション上でWM_TIMERを使いたいのですが,
調べてみると不可視ウィンドウを作れば良いと書かれていました.
そこで,以下のようなウィンドウを生成しているのですが,うまく動きません.
ご教授いただけないでしょうか?

HWND Create(){
WNDCLASS wcHide;
HWND hwndHide;
// ウィンドウクラス
wcHide.style = 0;
wcHide.lpfnWndProc = (WNDPROC)MWndProc;
wcHide.cbClsExtra = 0;
wcHide.cbWndExtra = 0;
wcHide.hInstance = (HINSTANCE)GetModuleHandle(NULL);
wcHide.hIcon = NULL;
wcHide.hCursor = NULL;
wcHide.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcHide.lpszMenuName = NULL;
wcHide.lpszClassName = "";

hwndHide = CreateWindow ( wcHide.lpszClassName, "", WS_DISABLE, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, wcHide.hInstance, 0);
}

781 名前:780 mailto:sage [2007/08/28(火) 03:01:24 ]
LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wp, LPARAM lp)
{
switch ( iMessage ) {
case WM_CREATE:
SetTimer(hWnd , 5000 , 1 , NULL);
return 0;

case WM_TIMER:
printf("test\n");
return 0;
}
return 0;
}

とりあえず,5秒毎に"test"を出力できるようにしたいのですが,
よろしくお願いします.

782 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 03:04:49 ]
www.google.co.jp/search?q=%E3%81%94%E6%95%99%E6%8E%88&btnG=%E6%A4%9C%E7%B4%A2
うまく動かないってのはどんな状況?

783 名前:780 mailto:sage [2007/08/28(火) 03:20:40 ]
正しくはご教示でしたか
間違えて使っていました.ありがとうございます.

>うまく動かないってのはどんな状況?
何も表示されずに終了してしまいます.
以下を試してみましたが何も表示されませんでした.
・main文でCreate()を呼び出した後にwhile(1)やsleepをはさんでみる
・WndProc()関数の最初にprintfでチェッカーをはさむ

よろしくお願いいたします.

784 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 03:23:52 ]
>>780
メッセージループはあるか?
なければググれ

785 名前:デフォルトの名無しさん [2007/08/28(火) 03:32:35 ]
ウィンドウクラスの名前が無い。
RegisterClassしてない。
SetTimerの第2引数と第3引数が逆とか、
ウィンドウプロシージャで自分で処理しないメッセージをDefWindowProc()に渡してない。

786 名前:780 mailto:sage [2007/08/28(火) 03:40:59 ]
>>784
ありがとうございます.
ありません.早速ググってみました.

>>785
ありがとうございます.
調べてみます.

787 名前:780 mailto:sage [2007/08/28(火) 04:42:09 ]
>>784
>>785

ありがとうございました.
ご指摘の通り,メッセージループ,RegisterClass,DefWindowProc()
全てを書いたところ,意図した動きをしました.
お世話になりました.

788 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 05:41:34 ]
ちょっと質問。
・外部ハードからデータを所得(配列に格納)し、そのデータ長に数値計算を施し結果を画面上に表示させたい

この動作で、随時変化しているデータ長の所得・数値計算・グラフ描画、
この3つを同時?(なるべくリアルタイムにあるデータ長の数値計算結果をグラフ描画)したいんだけど、
こういう場合ってどんな風に処理・流れにさせればいいの?

例えば、マルチスレッド(出来るかどうかよくわかりませんが)を使って

データ所得→計算→描画
       |
        →データ所得→計算→描画
                 |
                 →データ所得→計算→描画
こんな感じで計算させつつデータを所得。描画させつつ計算。みたいに出来ますか?



789 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 05:56:44 ]
所得

790 名前:デフォルトの名無しさん [2007/08/28(火) 06:00:16 ]
データ所得税

791 名前:788 mailto:sage [2007/08/28(火) 06:06:24 ]
すんません。取得の間違いでした

792 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 08:23:36 ]
その程度なら今のPCは十分に早いから
データ所得→計算→描画→データ所得→計算→描画
で十分じゃね?
データ取得に時間掛かるならデータ取得部分だけ別スレッドで回した方がいいけど。

793 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 18:09:00 ]
典型的なProducer-Consumerパターンでないの?

794 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:40:45 ]
>>788
出来る出来ないで言えば、出来ると思う。

どっちかいうと、例えばデータをファイルに書き込んでるなら、
データ書き込みとデータ読み出しの排他処理してるだろうから、
あんまり頻繁に読み出しに行くとデータ更新を阻害しそうで
そっちの方が怖い。

795 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:47:05 ]
>>788読む限りでは出力先は画面でないの
ファイルに書き戻したりしてないように見えるけど

796 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 23:53:55 ]
Windows SDKの_msize()で、callocした領域のサイズを見ようと呼び出したのですが、
呼び出した行でプロセスが停止してしまいます。
エラーも何も帰ってこず、前の行のprintfは呼ばれて、次の行のprintfは呼ばれていないという
状況です。_msize()の説明を見ると、動的確保されていない領域でも
エラーが帰ってくるみたいですが…
こういった症状聞いたことある方いませんか?
VC6でデバッグビルドです。よろしくお願いします。

797 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:09:09 ]
ぬるぽではないのか

798 名前:796 mailto:sage [2007/08/29(水) 00:11:55 ]
ガッ



799 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:13:31 ]
引数に入れてやったポインタがNULLを指してるってことでしょうか
今環境がないので試せないですが、if ( p == NULL ) とかで見てみます

800 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:14:12 ]
だめだこりゃ

801 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:16:09 ]

違うんですか?

802 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:17:38 ]
違う

803 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:19:45 ]
よくわからないので教えて貰えませんか?
_msizeの戻り値を参照してるところで止まってる訳でもなく、
_msize自体で止まるので、引数として渡してやったポインタがNULLなのかと思ったのですが

804 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:25:12 ]
>>803
NULLに対する対処くらいしていてもよさそうだけど

805 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:31:07 ]
>>804
よく読んでみれば、

この関数は、パラメータを検証します。memblock が null ポインタの場合、
「パラメータの検証」に説明されているように、_msize は無効なパラメータ ハンドラを
呼び出します。エラーが処理されると、この関数は errno を EINVAL に設定し、-1 を返します。

とのことなので、-1が返ってくるようですね。
ぬるぽってヌルポインタ(Javaとかだとヌル参照例外)のことですよね?
引数のポインタがNULLでも動くなら、>>797は何について仰ってるのでしょうか?

806 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:31:26 ]
>>803
試しに_msizeの引数にNULL入れたら、Assert出て落ちた。
VS2005 Standard Edition

「止まる」というのは、関数から戻って来ないのか、不正終了するのか、どっち?

807 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:35:00 ]
ねるぽ

808 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:37:28 ]
確認しないとわからないかも…
というのは、Windowsのサービスとして動かしてるのです。
サービスでも普通のプログラムと同じようになんかダイアログでて
落ちるのなら前者の関数から戻ってきてないのだと思いますが、
出なくて静かに落ちるなら、タスクマネージャからプロセスが生きてるか確認しないとわからないかも

>>796のそこで止まるというのは、_msizeを挟んで呼び出し前と呼び出し後を
ログに吐かせたときに、呼び出し前までしか吐かれてなかったのです。

Assert出て落ちるのなら、プロセスが静かに死んでそうな気がしてきました。



809 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:39:32 ]
確認してなかったのか

810 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:40:17 ]
ウザ〜イ!ウザイよ小沢さん。想像で答えられてもウザ過ぎるよ。

811 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:49:13 ]
まぁ「初心者歓迎」ってついとるし、初心者はバグの見所もわかんねだろ。

免罪符にゃならんが。
そこら辺分からんと答えよう無いしな。

812 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 00:49:15 ]
そこだけ切り出してコンソールアプリにでもしてみれば。

NULLじゃないけど
IsBadReadPtrに引っかかるポインタとか

813 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 06:40:31 ]
サービスであっても、デバッガアタッチするといいb

814 名前:デフォルトの名無しさん [2007/08/29(水) 13:31:03 ]
>>805
本当によく読んでるのか?

> _msize は無効なパラメータ ハンドラを呼び出します。
無効なパラメータ ハンドラが何やるかしってるか?

> 無効なパラメータが見つかると、C ランタイムは、
> 現在割り当てられている無効なパラメータ ハンドラを呼び出します。
> 既定により無効とされているパラメータが見つかった場合、
> ワトソン博士のクラッシュ レポートが起動します。
> 実行中のアプリケーションはクラッシュし、分析用のクラッシュ ダンプを
> Microsoft に提供するかどうかをユーザーに求めるメッセージが表示されます。
> デバッグ モードでは、無効なパラメータが見つかるとアサーション エラーになります。



815 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 20:48:30 ]
かなり初歩的な質問で申し訳ないんだけど
現在VC++ 2005 Express Editionで開発中で、所謂多重定義の問題にハマっています
Formアプリで、複数のFormをどんどん遷移していくような感じなのですが
イメージとしては、ATMのような、各画面1クリックでどんどん進むようなので、それぞれの画面が
個別のFormとして作られています。
(Form1がForm2を作って、Form2が3を・・のような)

で、聞きたい事は、VC++2005ExpEditでは、Formを作ると、そのclassの定義がすべてForm1.h
のように、ヘッダファイルに書かれてしまいます。
このとき、Form1とForm2で相互にincludeしたい場合、多重includeガードをしても、定義のせいで
リンクがエラーになり、コンパイルが通りません。

いちいちForm1.hの中身を.cppにコピペし、宣言のみを.hに書き直すようなことをしなければいけないのでしょうか

うまい回避方法があれば教えてください。
(長文すみません)

816 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 21:58:45 ]
C++/CLI?

817 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:02:03 ]
API直で叩けばいいんじゃね?

818 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:25:54 ]
stlのstring使っています。
このstringを1行ごとに読み込んで処理したいのですが、どのようにすればいいでしょうか?
tokenが使えないので、ちょっと苦労しています。一旦とってきたstringをcharに変えるのも、どうかなぁ……って気がしますし、
できれば、stringのままで一行ごとの読み込みがやりたいんですが、やり方を教えてください。

VC++2005 WinXPHomeです。



819 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:32:43 ]
findとかiteratorで改行しらべる

820 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:01:37 ]
>>815
#ifndef Form1_H
#define Form1_H
#include "Form2.h"
class Form1 : public Form
{
};
#endif
----------------------
#ifndef Form2_H
#define Form2_H
#include "Form1.h" //Form1.hからincludeされた場合はForm1_Hが定義済みなのでインクルードガードで無視される
class Form2 : public Form
{
};
#endif

こんな感じで書かれてればエラー出ないと思うんだが‥‥

821 名前:デフォルトの名無しさん [2007/08/29(水) 23:48:13 ]
つか、C++を使ってなぜ.NETなのかさっぱり分からん

822 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:51:54 ]
つか、C++を使ってるのか.NETなのかさっぱり分かってないんだろう

823 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:52:29 ]
>>818
std::istringstreamとstd::getline(std::stringを引数にとるほう)はだめ?

824 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:56:08 ]
>>818
意味がイマイチわからんかったが、

istringstream と >>

じゃだめか?

825 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:58:58 ]
>>823

そっちじゃなきゃだめだわ
(大域のgetline か basic_istream<> の istream)

826 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:59:07 ]
>>818
boost, boost-sandbox or pstade使ってもいいなら良い方法があるんだけどいいかな? by boost厨

827 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:59:32 ]
basic_istream<> の istream ×
basic_istream<> の getline ○

828 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:04:46 ]
聞いてくれよ、おら
C++のunionにメソッドを置おけること、昨日知ったよ、orz
これって常識?



829 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:12:39 ]
>>828
structはよく見るけどね

830 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:12:40 ]
unionを使うことが非常識






[ 続きを読む ] / [ 携帯版 ]

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

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