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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1171888583/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2007/04/01(日) 23:37:03
先生方、どうぞ宜しくお願いします。
3デフォルトの名無しさん:2007/04/02(月) 00:08:17
WinXPでC言語勉強し始めた者です。
ソートの問題で、「ただし同じ値なら同じ順位を返しなさい」という
ただし書きがあって、今までなかった注意書きでどうすればいいのか分かりません。
ググったのですが・・・選択ソートを使っています。IF文の
elseでどのような指示をつければよろしいでしょうか?
4デフォルトの名無しさん:2007/04/02(月) 01:05:35
>>3
順位って1位2位ビリってか。
5デフォルトの名無しさん:2007/04/02(月) 02:19:29
保守しないと落ちそう
6デフォルトの名無しさん:2007/04/02(月) 02:23:27
>>3
まずはソースをさらすんだ
7デフォルトの名無しさん:2007/04/02(月) 02:38:47
「安定なソート」という意味だろ
8デフォルトの名無しさん:2007/04/02(月) 03:05:45
C言語学ぶのにいい本を次からおしえて

K&W
独習C
結城浩のC言語プログラミングレッスン
9デフォルトの名無しさん:2007/04/02(月) 03:26:31
K&W
10デフォルトの名無しさん:2007/04/02(月) 04:24:10
作って分か……ごめん、エイプリルフールはとっくに過ぎてたね。
11デフォルトの名無しさん:2007/04/02(月) 06:25:03
【ネガティブ派遣根性チェック】

3つ以上、チェックがつけばアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにして反論する
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい
□奢ってくれる派遣先正社員を尊敬する
□自分の月額金額を知らないのは当然だ、単金を聞いてはいけない
□派遣先正社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、かわいがってもらうことが大切だ
12デフォルトの名無しさん:2007/04/02(月) 13:39:48
>>10 お前は頑張ったよ
13デフォルトの名無しさん:2007/04/02(月) 16:44:09
結城ってひとの本図書館にあったから立ち読みしたけど
あれで勉強してるひといるのか?
ちょっと見て、ん〜?ってとこが多かった。
あれで基礎固めたら大変だろうね。
14デフォルトの名無しさん:2007/04/02(月) 19:27:14
>>13
柴田望洋乙
15デフォルトの名無しさん:2007/04/02(月) 19:31:52
質問です。

C++で日本語のファイル名を作成する場合はどうすればいいの
でしょうか?

ofstream out("ほげ.txt");

と書いたソースをsjisで保存してもutf-8で保存しても出来る
ファイル名は文字化けしてしまいます。

OSはWindowsXP、開発環境はVS2005です。
どなたかご教授お願い致します。
16デフォルトの名無しさん:2007/04/02(月) 19:34:36
>>15
UNICODEの定義を外すorロケール設定をする
17デフォルトの名無しさん:2007/04/02(月) 20:20:24
ポインタがよくわかりません
18デフォルトの名無しさん:2007/04/02(月) 20:22:22
19C++初心者:2007/04/02(月) 20:46:41
質問があります。
現在、VisualStudio2005上でWindowsFormアプリケーション上に配置した
ボタンクリックイベントにて別クラス
 @TestClass2.cpp
 ATestClass2.h
にて定義したメソッドを呼出そうとしているのですがうまく呼出せません。
どこに問題があるのでしょうか?
@
#include "StdAfx.h"
#include "TestClass2.h"

TestClass2::TestClass2(void)
{
int Method2()
{

return 10;
}
}
A
#pragma once

ref class TestClass2
{
public:
TestClass2(void);
int TestClass2::Method2();
};



20C++初心者:2007/04/02(月) 20:48:26
【ボタンクリックイベント部分】
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
int i_return = TestMethod();
Debug::WriteLine("処理が終了しました!!");
     //この部分でTestClass2の中にあるMethod2()関数を呼出したいです。      
int i_return2 = TestClass2::Method2();
}
21デフォルトの名無しさん:2007/04/02(月) 21:38:08
クラスメソッドとインスタンスメソッドというのがあってだな
C++的には静的メンバ関数だっけ?
22デフォルトの名無しさん:2007/04/02(月) 22:17:53
どっち方向に勘違いしているかわからないね。3つポイントがあって2つ間違ってる感じかな。
2320:2007/04/02(月) 22:29:55
自己解決しました。
24デフォルトの名無しさん:2007/04/02(月) 22:40:16
実数の比較で == をつかっちゃいかんというのは良く聞くけど

double a=0;
printf("ヌルポ\n");
if( a==0 ) printf("ガッ\n");

これも例外なくNG?
ゼロだけは許されるとか、そういうのアリ?
25デフォルトの名無しさん:2007/04/02(月) 22:48:03
使っちゃならんって言われる意味わかってるか?
26デフォルトの名無しさん:2007/04/02(月) 22:49:54
実数は丸めたりするから、比較けっかが
理想通りにいかなかったりするからだろ
27デフォルトの名無しさん:2007/04/02(月) 22:50:01
+0 -0
28デフォルトの名無しさん:2007/04/02(月) 22:52:06
>>24
εを0とみなさないなら問題ない。
+0.と-0.は等しい。
29デフォルトの名無しさん:2007/04/02(月) 23:04:29
>>26
ゼロは特別に許された方が便利だろとか
思ったりしたんだよ

話変わるけど
大体ポインタがゼロのときエラーとかいう仕様が
まかり通ってる時点でなんかもうおかしいんだよ
ゼロ番地なのかエラーなのかわかんねーじゃん
30デフォルトの名無しさん:2007/04/02(月) 23:06:57
>>29
お前がポインタのゼロだと思ってるものはヌルポインタ。
http://www.kouno.jp/home/c_faq/c5.html
31デフォルトの名無しさん:2007/04/02(月) 23:07:55
浮動小数点の話なのかポインタの話なのかはっきりしろ
32デフォルトの名無しさん:2007/04/02(月) 23:09:20
ポインタが0でもエラーじゃないこともあれば
0以外でエラーになることもあるだろ
33デフォルトの名無しさん:2007/04/02(月) 23:40:17
日本語でおk
34デフォルトの名無しさん:2007/04/02(月) 23:42:16
0をポインタに入れるとヌルポインタになる。
ヌルポインタはどこも指してない無効なポインタであることが保証されてる。
ヌルポインタが全bit0であるかは環境依存。
35デフォルトの名無しさん:2007/04/02(月) 23:45:45
>>34
わかってるんだろうが、その書き方は誤解を招く虞が…。

ポインタが必要な文脈で現れた整数リテラルの0がヌルポインタを意味するのであって、
整数0をポインタとして扱ってもヌルポインタに化けるわけじゃない。
36デフォルトの名無しさん:2007/04/02(月) 23:46:58
>>34-35
どう書いても誤解の可能性は避けられないんだから、
ごちゃごちゃ言わずに C FAQ で済ませとけよ。
37デフォルトの名無しさん:2007/04/02(月) 23:50:34
ヌルポインタて、いくつの数字を入れるとなるの?
38デフォルトの名無しさん:2007/04/02(月) 23:55:00
テキストエディタ使ってC書いてるんだけど、コンパイルするにはどしたらいいの?
コマンドプロンプトで
bcc32もgccも試したけど
内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と出る。
何かインストールが必要なん?
39デフォルトの名無しさん:2007/04/02(月) 23:55:40
bcc32はBorand C++
gccはCygwinもしくはMinGWのインストールが必要。
40デフォルトの名無しさん:2007/04/02(月) 23:58:43
0をぬるぽとして扱うと正式に決まってるのはC++だけだったような
41デフォルトの名無しさん:2007/04/02(月) 23:59:00
初心者の俺に教えてほしい。
昔(10年前くらい)、コンパイラってのは高いやつとフリーのやつではうんと差があると聞いたのですが、
今でも、borandや、gccとかじゃやっぱり駄目駄目なんですか?
42デフォルトの名無しさん:2007/04/03(火) 00:00:51
>>40
C FAQ読んでこい
43デフォルトの名無しさん:2007/04/03(火) 00:01:03
別に困らんよ。
何をしたいかによっては差があるだろうけど
だいぶ前からしょぼしょぼなサブセットなんてないでしょ。
44デフォルトの名無しさん:2007/04/03(火) 00:03:47
>>41
コンパイラを買う時代は終わったよ。
最適化性能にはそれぞれ癖があるが、入門レベルじゃ違いなんかわかりゃせん
45デフォルトの名無しさん:2007/04/03(火) 00:05:21
>>41
そもそもコンピュータの性能が10年間で物凄く向上したし、コンパイラの技術も向上した。
Borland C++やGCCも全然問題ない。

そして社会も変わった。
今はMicrosoftすらコンパイラはおろかIDEもフリーで公開している。
もうコンパイラを売るような時代ではなくなった。

まあでもIntel C++はすごいという噂は良く聞くけどな。
46デフォルトの名無しさん:2007/04/03(火) 00:22:12
そうなんですか。
何でも無料になるのも開発者にとって損じゃないですかね?
47デフォルトの名無しさん:2007/04/03(火) 00:40:56
>>46
プログラムを作る動機は金だけじゃない。
金が最終目的だとしても、企業であれば宣伝効果というものもある。
48ひろゆき@どうやら管‎理人:2007/04/03(火) 00:46:30
>>46
一般の企業やプログラマにとってはむしろ得じゃまいか?
MSとか某は別として。MSとか某の場合は>>47の言うとおり
49デフォルトの名無しさん:2007/04/03(火) 00:48:36
ひろゆきのお尻ゲット
50デフォルトの名無しさん:2007/04/03(火) 00:56:23
何処で聞いたらいいのか分からないのでこちらで
質問させて下さい。

現在就職活動をしていて先日中小メーカーの面接に行ったのですが、
プログラミング経験はあるか、と聞かれました。
社内SEというものを募集しているとのことでした。

その場では無いと答えたのですが、中学校でパソコン部に所属して
いたとき、暇だったので部室にあったシューティングゲームの
プログラムらしきものが書いてあるマニュアルを見ながらtowns(?)
とかいうOSで凄くショボイゲームを作ったことがあるのですが、この
ような経験でもプログラミング経験アリといえるのでしょうか?

…自分でも意味不明なことを聞いていると思うのですが、どなたか
よろしくお願いします。。
51デフォルトの名無しさん:2007/04/03(火) 00:58:47
>>50
それはマ版ネタだとからプログラマー板へ
52デフォルトの名無しさん:2007/04/03(火) 01:07:18
>>50
昔なんてどうだっていい、今、プログラミングをCなりC++なりJAVAなり
なんなりと、現在出来るかどうかだろ。
まぁ、経験ありますと言ったら仕事増えるだけだから
やめとけばいいじゃん
53デフォルトの名無しさん:2007/04/03(火) 01:08:33
だいたい、コンパイラの売上げなんて、Office等の売上げに比べたらたいした額にはならないしね。

だからって、コンパイラ製品自体を売るのをやめて
他の企業がOffice競合製品を開発できないようにすべき、という話には
決してならない。
5450:2007/04/03(火) 01:25:49
スミマセン、プログラマー板で伺ってきます。
でもなんか関係ないみたいですね。。
55デフォルトの名無しさん:2007/04/03(火) 03:32:20
0からはじめるゲームプログラムのページで
スケルトン使ってゲーム作れるまでになったのですが
細かいことが分からないので質問させてください
・スプライトを使って加算合成する方法
・テキストを表示するとフルスクリーンにできなくなるのはなぜか
下は自分のソースのせいかもしれないですが
何か分かることがあればお願いします
56デフォルトの名無しさん:2007/04/03(火) 08:14:12
>>55
情報が少なすぎて何言ってる不明だが
文脈からするに DirectX の話か?
もしそうなら DirectX 関連のスレへ。
57デフォルトの名無しさん:2007/04/03(火) 12:21:23
class A{
public:
    static double a;
};
double A::a=10;

int main(void)
{
     A x;
     x.a=15;
     A y;
}
とすると、A yで再びaが10にリセットされてしまいますが、
a=15を維持したままにすることはできないでしょうか?

クラスで共通の変数aを使いたいのですが、
クラスがどこかで作成されるたびに、aの値がリセットされてしまい、困っています。
58デフォルトの名無しさん:2007/04/03(火) 12:36:00
リセットされないよ。どうやって確認したんだ?
59デフォルトの名無しさん:2007/04/03(火) 18:43:19
シラネ
60デフォルトの名無しさん:2007/04/03(火) 19:00:45
ARMコンパイラ(ADS)でnewのオーバーライドをしたいんですが、
「Error: C3009E: 'operator new' must have a return type of 'void*' and have a first argument of type 'size_t'」
こんなエラーが出てしまいます。

実装はこんな感じです。
class base{
static void * operator new( size_t size) {
return malloc_local(size);
}
}

間違いの指摘や、ご存知な事がありましたら教えてください。
6160:2007/04/03(火) 19:02:45
class base{
public:
 static void * operator new( size_t size ) {
  return malloc_local(size);
 }
};
すみません。修正。
6220:2007/04/03(火) 20:30:43
すみません自己解決したと申しましたが未解決ですので
再度ご質問させて下さい。

現在、プロジェクトに(通常)C++クラスファイルを追加して
クラスの中にメソッドを組み込み他メソッドより(ボタンクリックイベント)

 @ C_plus2.cpp
 A C_plus2.h

@にプログラム本体(メソッド)を記述し、Aにプロトタイプ宣言を
行った上でWindowsForm上のボタンクリックイベントより@に本体のある
メソッドを呼出そうとしているのですが呼出す事が出来ません。
(インテリセンスは通りますがエラーになります。)

どうすれば2ファイル(*.cpp & *.h)に分けたクラスに記載のメソッドを
呼出す事が出来るのでしょうか?

※ヘッダーファイルにメソッド本体を記述すると、ボタンクリックイベント
の内部に通常の呼出しコードを気記述することによりメソッドを呼出せます。





(ヘッダーファイルにメソッドを全て記述すれば他クラスと2ファイル
6320:2007/04/03(火) 20:32:42
『訂正』です。

(ヘッダーファイルにメソッドを全て記述すれば
問題無くボタンクリックイベント内部から@に本体のあるメソッドを呼出す
事が出来ます。)

64デフォルトの名無しさん:2007/04/03(火) 20:58:20
>>60
class base{
public:
 void * operator new( size_t size ) {
  return malloc_local(size);
 }
};
65デフォルトの名無しさん:2007/04/03(火) 21:08:42
>>63
↓こんなんで動いてるけどそうじゃなくて?

○test.h
class CTest{
public:
 CTest(){};
 ~CTest(){};
 void debug( char *str);
};
○test.cpp
#include "stdafx.h"
#include "test.h"
void CTest::debug(char *str){
 OutputDebugString(str);
}
○XXXDlg.cpp
#include "test.h"
void CXXXDlg::OnBnClickedOk()
{
 CTest hoge;
 hoge.debug("OK\n");
//OnOK();
}
6660:2007/04/03(火) 21:18:22
>>64
static削っても、同様のエラーが出ます。
class base{
public:
 void * operator new( size_t size ) {
  return 0;
 }
};

malloc_local()に起因してるのではないかと思い、
してみましたが、これも変わらず。
67C++初心者?:2007/04/03(火) 21:23:47
スレを探してみたのですがなさそうなのでここに書かせていただきます。
只今、VC6を使用してPro*Cのプログラミングをしているのですがビルドすると不要なBreak文がありますとエラーが出てしまいます。

プログラムの流れとしては
@DBからデータを取得する
A取得したデータをもう片方のテーブルと差分を取り対象のデータを取得する。
BAで取得した差分のデータをワークテーブルにインサートする

今の問題の現象はBでおきています。
うまく説明できていないと思うのですが、何かヒントとなるようなことを教えていただけるとありがたいです。
DBはオラクル9を使用しています。
68デフォルトの名無しさん:2007/04/03(火) 21:37:36
ストアドならDB板で聞けばいいんじゃね
6920:2007/04/03(火) 21:39:00
>>65さん
解決しました。どうもありがとうございます。
どうやら #include <hoge2.h> の記述位置を using 直下(同一スコープ)
に記述していたことが原因でした。

本当にありがとうございます^^;
70デフォルトの名無しさん:2007/04/03(火) 22:13:07
質問させてください。
いま、プログラムの勉強もかねて作ってみたいPGがあるのですが、C#で作ったほうがよいのか、
C++で作ったほうが良いのか迷っております。

作ってみたいPGとは、オンラインゲームの麻雀ゲームの支援ソフトです。
既存の画面だとどうにもやりづらくて、それならば勉強もかねて、
専用のGUIを作成し、このボタンを押したらこの牌をすてるだとか、
自分のやりやすいようにGUIを作成してみたいなと、思ったわけです。

色々調べてみたのですが、C#というのはC++とVBの良いところを持ち合わせたものだとか
というのはわかったのですが、ではこのようなPGを作ったときの相性はどちらが
よいのだろうと疑問がでました。
また、WinnyはC++で作成されており、なぜC#ではつくられていないのだろうという
疑問もあります。

もし、お分かりになる方がいらっしゃれば、ご教授願えないでしょうか?
71デフォルトの名無しさん:2007/04/03(火) 23:10:23
> オンラインゲームの麻雀ゲーム
ってのがそもそもどういうのかによるかな。
場合によってはUWSCみたいなマクロのがよい。(非GUIだけど)

作りたいものってのは置いといて、言語の勉強ならC#でいい。
C++は悪い意味で多くを受け入れすぎ。先にモダン言語に矯正されとくといい。

> また、WinnyはC++で作成されており、なぜC#ではつくられていないのだろう
C++は一番融通が利くからね。RADからアセンブリまできめ細かく。

ということで、C#ならスレ違いになるので他で勉強してください。
72デフォルトの名無しさん:2007/04/04(水) 00:40:52
>>67
Pro*CはCじゃないからここで回答は得られにくいかと。
つーか、折角Oracleに大枚叩いているんだろうから聞けばいいじゃん。
73デフォルトの名無しさん:2007/04/04(水) 01:01:07
>>70
C#でもC++でも、使いこなせるほうで作れば良いじゃん。
っていうか、勉強がてらか。
気楽にやれると思いきや結局DllImportで
api使う事になっちゃうC#?
mfcを使ってみてはむかついて、クラス設計で悩んで
頭がクラクラしちゃうC++?
メッセージ毎の処理と、api群や自作関数とたわむれて
しまいに何の処理書いてるのかわからなくなるC?

ま、C#で良いか。

>WinnyはC++で作成されており
>なぜC#ではつくられていないのだろう
C#登場2001年Winny2002年5月に公開
74デフォルトの名無しさん:2007/04/04(水) 13:18:34
ofstreamでは書き込みバッファの容量はどこで指定すればよいのでしょうか?
75デフォルトの名無しさん:2007/04/04(水) 16:01:07
setvbuf()と同じような物を考えているんならそういうのは無いよ
76デフォルトの名無しさん:2007/04/04(水) 16:07:00
>>74
streambuf::pubsetbuf()
77デフォルトの名無しさん:2007/04/04(水) 16:19:51
>>75
C++ストリームはCのFILE*でできたことなら
何でもできるようになっていると思って間違いない
78デフォルトの名無しさん:2007/04/04(水) 18:00:11
*関数ってどういう意味?

あとUNIX(XWINDOW)とVCのchar型って何バイト違うんですか?
2個目の質問の解説等が日本語で載ってるサイト知ってたら教えてください。
79デフォルトの名無しさん:2007/04/04(水) 18:33:35
>>78
1. 式の中ならあってもなくても同じこと。
http://www.kouno.jp/home/c_faq/c4.html#12

2. sizeof (char)は常に1と定められている。
1バイトが8ビットとは限らないが、それは基本的にCPU次第。
http://www.kouno.jp/home/c_faq/c7.html#8
80デフォルトの名無しさん:2007/04/04(水) 19:52:47
>>78
関数ポインタのことか?
81デフォルトの名無しさん:2007/04/04(水) 19:59:31
char *Func();
みたいのを*Funcで一塊だと思ってるとか?
8278:2007/04/04(水) 20:03:16
>>79
レスどうもです。
1なんですが、宣言で*関数とあります。戻り値は関数の中でchar *r
と宣言されたものがreturn rで返ってます。
使われる場合は
i=*関数;
ってなってます。
ようするに関数に*がついてるからiにはrの中身が代入されるんですか?
ポインタと同じで
紹介してもらったHP見たんですが、質問の仕方が悪かったため
違う様な気がします…

情報小出しにして申し訳ないですがもう一度教えてください。
83デフォルトの名無しさん:2007/04/04(水) 20:34:30
int hoge() //返り値はint型
{
 int ret=うんたら;
 return ret;
}

char * hoge2() //返り値は(char *)型
{
 char *ret=うんたら;
 retern ret;
}

何の違いもない。
8478:2007/04/04(水) 21:30:02
>>83
ありがとう!!
85デフォルトの名無しさん:2007/04/04(水) 21:34:46
先生、>>83の下の例はちょっとまずいと思いまーす
86デフォルトの名無しさん:2007/04/04(水) 21:37:36
場合によってはまずいが、全ての場合でいけないわけじゃなかろう
87デフォルトの名無しさん:2007/04/04(水) 22:26:13
どこがまちがえているのでしょうか?ループします

#include <stdio.h>
#include <dir.h>

main(){
char b[1024];
struct ffblk Fd;

do{
if( findfirst("*",&Fd,FA_RDONLY|FA_HIDDEN|FA_ARCH)==EOF)break;
printf("%s\n",Fd.ff_name);
}
while(!findnext(&Fd));
}
88デフォルトの名無しさん:2007/04/04(水) 22:27:04
そりゃぁ、毎回findfirst()したらいつまで経っても終わらん罠。
89デフォルトの名無しさん:2007/04/04(水) 22:29:46
>>88
ありがとうございます
わかりました
90824:2007/04/04(水) 22:50:26
C++.netでは文字列を連結したい場合

Debug::WriteLine("A","の値は","ホゲです。");

という風にしか連結することは出来ないのでしょうか?

C#の場合だと

Debug.WriteLine("A" + "の値は" + "ホゲです。");
といった感じで連結出来るのですがC++.netでもお手軽な連結
方法は何かありますか?(VS2003利用です。)
91デフォルトの名無しさん:2007/04/04(水) 22:57:27
それくらいしかないと思う。
WriteLine以外ではString::ConcatとかStringBuilderを使っておけ。
ネイティブなstd::wstringに変換する関数を作ってやるなんて方法も考え付くけど、
それはそれで色々制限があって面倒だろう。

ちなみにVC++ 2005 (C++/CLI)だとマネージドでも演算子多重定義が使えるようになった。
92デフォルトの名無しさん:2007/04/04(水) 23:39:49

>>91
そうですか。残念ですが諦めます。
やっぱりC#が一番便利です。
93デフォルトの名無しさん:2007/04/04(水) 23:45:48
配列の配列を参照渡しするとき
どうやってわたせばいいんでしょうか
94デフォルトの名無しさん:2007/04/04(水) 23:51:27
typedef int ARR[5][5]

void f(ARR&);

ARR a;
f(a);
95デフォルトの名無しさん:2007/04/05(木) 09:15:38
>>94
配列の配列といっても二次元配列じゃなくて
96デフォルトの名無しさん:2007/04/05(木) 10:31:05
Turbo C++のC言語の使い方がまったくわからなくて困ってます
BccDevやVisualC++なら


#include <stdio.h>

//---------------------------------------------------------------------------

int main(void)
{
printf("hello");
return 0;
}
//---------------------------------------------------------------------------

を保存してデバッグなしで開始するとウィンドウが現れてちゃんとhelloと表示されます。
ところがTurboでコンソールアプリケーションでC言語を選び
上記の操作をすると一瞬ウィンドウが開いたかなと思ったら即閉じてしまうんです

hello だけ表示できればあとは何とかなると思いますがそこまで教えていただけませんか?
97デフォルトの名無しさん:2007/04/05(木) 10:46:52
>>96
キー入力、時間待ちをいれろ
98デフォルトの名無しさん:2007/04/05(木) 11:36:42
>>97
#include <stdio.h>


int ch;
int main(ivoid)
{
printf("pl");
ch=getchar() ;
return 0;
}


getchar を使ってwindowを表示しEnterを押すと消えるようになりました
とりあえずしばらくこれでやってみます。
ありがとうございました
99デフォルトの名無しさん:2007/04/05(木) 11:49:43
C++を使ってのWeb開発を行うことになったんですが可能なのでしょうか?
100デフォルトの名無しさん:2007/04/05(木) 11:51:54
可能
101デフォルトの名無しさん:2007/04/05(木) 15:11:46
インライン関数とstaticの違いって何ですか?
インラインは関数のみに使うもの?
それともCとC++の違いですか?
102デフォルトの名無しさん:2007/04/05(木) 15:17:05
staticは外部変数と内部変数と関数のそれぞれにおいて少しずつ意味が違う。
inlineは関数にのみc99やc++で使用できる。
103102:2007/04/05(木) 16:12:31
>>102
staticで外部変数ならそのファイルでのみ有効
内部変数ならその関数の内部のみで有効
関数はそのファイルでのみ有効
ということですか。ありがとうございます。
104102:2007/04/05(木) 16:13:20
自分は101です…
間違った
105デフォルトの名無しさん:2007/04/05(木) 21:13:20
WinXP Pro VS2005の開発環境を持っている者からの質問です。
信頼できる知人からVC++6.0で動いているソースコードを頂きました。
実際、コンパイルできるところと、実行できるところは確認済みです。

そのコードをVS2005に移植してみようと思い、コンパイルをかけてみたのですが、
CString CxxxDoc::Func()
{
//中略
return -1;
}
のようなコードがありました。VC++6.0Proでコンパイルが通っている事を確認したので、
ソースに間違いはないと思っていたのですが……、これは一体どういうことでしょうか。
VC++6.0では、こんなコードが許されるのでしょうか?

知人の環境はXP Pro VC6.0 Proです。
よろしくご解答お願いします。
106デフォルトの名無しさん:2007/04/05(木) 21:17:13
#define ishigh(c) ((c) >= 0x80)
というマクロが定義してあるのですが、コレどういう意味なのでしょうか?
こんなマクロ初めてみた上にishigh(c)なんてソースの中のどこにもなくて
困っています。
107デフォルトの名無しさん:2007/04/05(木) 21:21:39
>>105
VC++ 6のやつの代わりにVC++ 2005 (ATL/MFC 8)のCStringTのコンストラクタを見てみたけど、
http://msdn2.microsoft.com/ja-jp/library/cws1zdt8(VS.80).aspx
有り得そうな可能性としては、次のどちらか。
•_variant_t1つを引数に取るもの
•char/wchar_t1つとその長さ(デフォルト引数=1)を取るもの

標準C++では複数回の暗黙の変換はやらないことになっており、
VC++ 2005がそれに準拠するようになったからだと思う。

>>106
charが8ビットだとして、最上位ビットが立っているかどうかということだろう。
108デフォルトの名無しさん:2007/04/05(木) 23:19:08
struct Test{
bool a;
bool b;
};

これが定義されてて
cppファイルに
Test func(Test t){
return t;
}
こういう関数を作りました
そして.hファイルに
Test func(Test t);
と定義しても宣言構文エラーになっちゃいます
どうしたらいいでしょうか
わかりづらくてすいません
109デフォルトの名無しさん:2007/04/05(木) 23:21:41
Test func(Test t);

struct Test func(struct Test t);
110デフォルトの名無しさん:2007/04/05(木) 23:22:03
>>108
そのTest構造体が定義されているのはどこだ?
111デフォルトの名無しさん:2007/04/05(木) 23:23:22
>>109
ヒント:cppファイル
112デフォルトの名無しさん:2007/04/05(木) 23:27:56
Common.hに.hファイルは全部includeしてあって
cppファイルは全部Common.hをincludeしてあるんですが
Test構造体が定義してあるのは他の.cppファイル.hファイルとは違う.hファイル
です

そこに問題があるんでしょうかね
113デフォルトの名無しさん:2007/04/05(木) 23:30:20
>>112
エラーメッセージをコピペして下さい
114デフォルトの名無しさん:2007/04/05(木) 23:35:30
エラー E2141 C:\My Documents\Project3\Npc.h 112: 宣言の構文エラー

ふたつ定義すると
エラー E2141 C:\My Documents\Project3\Npc.h 112: 宣言の構文エラー
エラー E2238 C:\My Documents\Project3\Npc.h 114: 'MAP_SCENE' の宣言が複数見つかった
エラー E2344 C:\My Documents\Project3\Npc.h 112: 一つ前の 'MAP_SCENE' の定義位置
エラー E2141 C:\My Documents\Project3\Npc.h 114: 宣言の構文エラー
115デフォルトの名無しさん:2007/04/06(金) 00:24:59
インクルードガードがないのかな
116デフォルトの名無しさん:2007/04/06(金) 01:01:32
とりあえずCommon.h内に
struct Test;
の行を入れてみてから、もう一度
117デフォルトの名無しさん:2007/04/06(金) 07:43:18
Common.hにstruct Test;入れたら大丈夫でした!

でも参考にしている人のソースにはそんな文ないんですが
どうしてなんでしょうか
118デフォルトの名無しさん:2007/04/06(金) 07:51:43
ヒント:
インクルード順序
119デフォルトの名無しさん:2007/04/06(金) 09:52:10
でも順序がある時点でヘッダの不具合だよな
120デフォルトの名無しさん:2007/04/06(金) 10:47:30
初歩的な疑問があるんですが、お教え願えないでしょうか。

環境はVS.NET 2003です。

MSDNチュートリアルを見ながら、ATL のActiveX コントロールを作ってみたんですが、dll の容量が324Kbでした。
同様の物を MFC で作った ocx の容量は144Kbでした。

てっきり ATL の方が小さくなると思ってたんですが...
ひょっとして、MFC の方は別途必要な物があるんでしょうか?VBRUNJPなんとかみたいに。

どうかよろしくお願いします。
121デフォルトの名無しさん:2007/04/06(金) 11:30:05
>>120
静的にリンクする(ルーチンを自分で持つからでかくなる)か
dllを使う(dllを呼ぶから自分は小さいが実行時に呼ぶdllが必要)かは
ATL, MFCともにプロジェクトのプロパティで設定できる。
デフォだとATLは静的リンクでMFCは共有dllだったかも。

MFCで共有dllにしたときに必要なdllは、vectorとかでパッケージになってます。
122デフォルトの名無しさん:2007/04/06(金) 21:09:15
CでCGI作ろうとしてるんですが、普通にコンパイルすると生成される実行ファイルは
.exeになってしまいます。exeでもcgi-binのディレクトリに置けばCGIとして実行されますが
URLの最後がexeだと怪しいファイルをDLさせようとしているのだと勘違いされるかもしれないので
拡張子をCGIにしたいんですけど、どうすればいいんですか?
Visual Studio.net使ってます
123デフォルトの名無しさん:2007/04/06(金) 21:17:34
ren *.exe *.cgi
124デフォルトの名無しさん:2007/04/06(金) 21:22:46
>>123
すみません、それはどこに記述すればいいんですか?
125デフォルトの名無しさん:2007/04/06(金) 22:22:05
コマンドプロンプト
126デフォルトの名無しさん:2007/04/07(土) 00:32:34
グローバル変数について、気になったことがあるので質問させてください。

「グローバル変数の作成順番というものは、存在するのでしょうか?」
(例えば、ポインター変数の方が優先的に作られるとか。)

(下記のプログラムを例とする):
なぜ、このような質問をしたかというと、
もし、グローバル変数の順番が決まってないと、
先にhoge g_obj;が生成された場合、
g_objのコンストラクタ内でまだ作成されていないg_pが使用されることに
なってしまい、危ないと思ったからです。

//グローバルな場所
int *g_p=0;
hoge g_obj;//オブジェクトを作ることで、このクラスのコンストラクタ発動

//hogeクラス
class hoge{
 hoge(){//コンストラクタ内
  g_p = new int;//g_pを使う
 }
};



どうかよろしくお願いします。

127デフォルトの名無しさん:2007/04/07(土) 00:44:22
ググればすぐに出る。
128デフォルトの名無しさん:2007/04/07(土) 00:54:36
>>127
初心者にそれはないだろ、取り合えず、おまい、氏ね
129126:2007/04/07(土) 01:32:14
>>127
グローバル変数 順番 などで一通り検索して、見つからなかったので
ここで質問させてもらいました。

意地悪言わないで、どうかご教授お願いできないでしょうか?
130デフォルトの名無しさん:2007/04/07(土) 01:36:31
×ご教授
○ご教示
知らない言葉を無理して使わないほうがいい
131デフォルトの名無しさん:2007/04/07(土) 01:40:49
ぐぐればすぐ出てくる
グローバル変数の初期化順序は不定
132デフォルトの名無しさん:2007/04/07(土) 01:40:51
非ローカルなstatic変数の初期化順には何の規定もないので、
初期化順に依存するコードからは、鼻から悪魔が出る可能性がある。

現実には、「初期化コードを必要としない(POD)データ」は
最初から実行ファイルに含められて(必要なら開始時にコピー)いるし
「初期値が与えられてない変数」は、スタートアップルーチンで0に埋められる。
133126:2007/04/07(土) 02:16:22
>>130
勉強になりました^^;

>>131
>>132
グローバル変数 順序 で検索したら、出てきてくれました。
順序が不定ということがはっきりわかりました。
これで安心して眠れます。
ご回答ありがとうございました!
134デフォルトの名無しさん:2007/04/07(土) 03:38:38
zero initialization
static initialization
dynamic initialization
の順に初期化される(らしい)ので依存できたりできなかったりする
135デフォルトの名無しさん:2007/04/07(土) 08:10:16
String s;
//char s[50]; いつもはこっちでした。
char* str="hello";
sprintf(s.c_str(),"%s",str);
OutputDebugString(s.c_str());

buiderの環境になりまして、動的な感じで文字列の
長さを扱いたいと思ってます。
上記のようにすると、"hello"が出力されましたが、
こういう使い方しても大丈夫でしょうか?
136デフォルトの名無しさん:2007/04/07(土) 08:54:19
>>135
String s が別のものならばなんともいえんけど、
stlのstringだったら、const cahr *c_str() だと思うからコンパイル時にエラーとか警告が出てない?
s = str で十分だろう。
137デフォルトの名無しさん:2007/04/07(土) 23:03:52
>>135
Stringって何。typedef std::string String とかやってんの?
だとすると、
sprintf(s.c_str(),"%s",str);
こんなことやっちゃ駄目。
sprintf()には十分なサイズの書き込み可能な領域を指す非constなcharポインタを
渡さなければならない。

sprintf()はもともとC++ではその型安全性の無さによって好ましくないと
言われている(snprintf()ではなくsprintf()を使うなら、バッファ
オーバーフローの問題もある)。
代表的な代案は
1) std::sstreamを使うか、
2) printf-likeにやりたいなら、非標準だがboost::formatなり類似のものを使う
ってとこだ。
138デフォルトの名無しさん:2007/04/08(日) 00:13:18
BCBのStringは、AnsiStringのtypedef。
まあ、c_str()がconstなchar*を返す点は全く同じだが。
139デフォルトの名無しさん:2007/04/08(日) 00:39:56
SirectShow 始めたばかりです。ビデオプレーヤーとか作って楽勝じゃーて思ってですね。
いっちょフィルターでも作ってみるかとググってみたら、理学博士の方がソース公開してるの見つけました。
やったーと思って目を通してみたんですが...むずい!
即効寝ちゃって今だに鬱の自分。。。氏んだほうがいいですか?

ソース http://open.nime.ac.jp/downloader.php?downloadkey=focusshare_src
140デフォルトの名無しさん:2007/04/08(日) 04:33:31
>>139
SirectShowだろうがDirectShowだろうが、やってみて
壁に当たってあきらめようと思ったり、頭ん中真っ白になって
もうわけわからんってなったりしても、やり続ければ実は実る。
Cを勉強しだした頃を思い出せ、ポインタや構造体や再帰やetc
いろいろ壁にぶち当たってきただろ、それでも続けてきたから
今があるんだろうが。
時計の針だぞ、前に進まなきゃ捨てられるんだよ。
でも寝とけ。
俺はC#で苦戦中じゃ。
141デフォルトの名無しさん:2007/04/08(日) 09:31:16
>>140
寝たらちょっと復活。気長にやります。アリ。いっぺんに全部理解しようとしてた。神か>>141

C#か。FrameWork 覚えるので苦戦してるのかな。ガンガレ、でも寝とけ。
142デフォルトの名無しさん:2007/04/08(日) 14:04:10
Visual Studio.NET使ってます

Debugモードだとビルドできるのですが
Releaseモードにするとエラーがでてビルドできません
しかも、そのエラーは自分のソースじゃない部分で起きているんです
未解決の外部シンボル _GUID_PerfMasterTempo が関数 "int __cdecl AdoInit(void)" (?AdoInit@@YAHXZ) で参照されました。
こういう感じのエラーがたくさん出てます
どうすればいいんですか?
143デフォルトの名無しさん:2007/04/08(日) 15:08:40
privateメンバーに構造体のポインタを宣言
コンストラクタでnewによりメモリを割り当てて、以降メンバー関数で使いたいのですが
何故か割り当てたはずのメモリが解放?されている模様。
(Access Violationエラーになり、ポインタのアドレスも0xcdcdcdcdに)

こういう使い方って出来ないのでしょうか?
144デフォルトの名無しさん:2007/04/08(日) 15:13:27
何の問題もありませんが。

再現する最小のソースを晒して味噌。
145デフォルトの名無しさん:2007/04/08(日) 15:24:39
typedef struct {
int a;
int b;
} _ST_KIHON;

class Myclass
{
private:
_ST_KIHON *m_stKihon;
public:
Myclass();
~Myclass();
void Set(int, int, int);
};
Myclass::Myclass()
{
_ST_KIHON *m_stKihon = new _ST_KIHON[20000];
memset(m_stKihon, 0, sizeof(_ST_KIHON) * 20000);
}
Myclass::~Myclass()
{
delete []m_stKihon;
}
void Myclass::Set(int a, int b, int n)
{
m_stKihon[n].a = a;
m_stKihon[n].b = b;
}
146デフォルトの名無しさん:2007/04/08(日) 15:25:18
(改行が多すぎると怒られるので分割しました。)

void main()
{
Myclass *cmy = new Myclass;
cmy->Set(1,2,0);
}
再現するソースを載せます。環境はVC6です。cmy->Setでアクセスする際、落ちてしまいます。
147デフォルトの名無しさん:2007/04/08(日) 15:35:00
> _ST_KIHON *m_stKihon = new _ST_KIHON[20000];
ローカル変数に突っ込んでどうする。
148デフォルトの名無しさん:2007/04/08(日) 15:36:00
ワロッシュw
149デフォルトの名無しさん:2007/04/08(日) 15:40:49
え?
privateに宣言しているポインタではなくローカルで宣言していることになってるのか?w
150デフォルトの名無しさん:2007/04/08(日) 15:52:01
×_ST_KIHON *m_stKihon = new _ST_KIHON[20000];
○m_stKihon = new _ST_KIHON[20000];
151デフォルトの名無しさん:2007/04/08(日) 16:32:10
>>150
ありがとう
152デフォルトの名無しさん:2007/04/08(日) 17:11:28
>>150
初期化子使えよ
153デフォルトの名無しさん:2007/04/08(日) 17:28:06
>>152
どっちでも一緒だよ
154152:2007/04/08(日) 17:44:05
>>153
そうだよ、単に気分の問題。
155150:2007/04/08(日) 18:12:10
>>152
最低限の修正にしてみた。
156デフォルトの名無しさん:2007/04/09(月) 02:34:06
vc++を勉強しています
関数呼び出しのときアドレス呼び出しをすると呼び出し元の
変数の値を呼び出し先の関数内部で書き換えることができるのは理解しています

同じようにポインタ変数を書き換えたいのですが、どうやってアドレス呼び出ししたらいいのでしょうか?
よろしくお願いします。
157デフォルトの名無しさん:2007/04/09(月) 02:46:10
>>156
char * foo;
someFunction(& foo);
ということをしたいのなら、
void someFunction(char ** bar);
158デフォルトの名無しさん:2007/04/09(月) 02:55:17
>>157 なるほど!ありがとうございました。
159デフォルトの名無しさん:2007/04/10(火) 03:36:50
メンバーイニシャライザで0を指定するとどうなるんですか?
160デフォルトの名無しさん:2007/04/10(火) 03:54:30
日本語でおk
161デフォルトの名無しさん:2007/04/10(火) 08:24:08
include <stdio.h>
int main (void)
{
unsigned int ch;
ch = 'あ';
printf("%c\n",ch);
return 0;
}

で「あ」が表示されないのですけれど、
どうすれば表示されるのでしょうか?
162デフォルトの名無しさん:2007/04/10(火) 08:36:56
#include <stdio.h>
int main (void)
{
char ch[] = "あ";
printf("%s\n",ch);
return 0;
}
163デフォルトの名無しさん:2007/04/10(火) 08:38:09
#include <stdio.h>
int main (void)
{
char* ch = "あ";
printf("%c%c\n",ch[0],ch[1]);
return 0;
}
164デフォルトの名無しさん:2007/04/10(火) 08:39:27
#include <stdio.h>
int main (void)
{
char* ch = "あ";
printf("%c%c\n",*ch,*(ch+1));
return 0;
}
165デフォルトの名無しさん:2007/04/10(火) 08:42:29
#include <stdio.h>
int main (void)
{
int ch = 'あ';
printf("%c%c\n",ch&255,ch>>8);
return 0;
}
166デフォルトの名無しさん:2007/04/10(火) 08:49:09
これは酷い荒らし
167デフォルトの名無しさん:2007/04/10(火) 10:35:11
if ( lh == LOW){
if ( c == ESC){ code = JIS}
else if ( isspace(c) || isprint(c)) { }
else if ( c >= 0x80{
if ( code == JIS) return BIN;
lh = HIGH;
}
else { return BIN;}
}
というコードで
else if ( isspace(c) || isprint(c)) { } は
条件式が真の場合何も実行されなくて、
このif ( lh == LOW)のブロックから何も返さず抜けるのでしょうか?
それと
if ( code == JIS) return BIN;
lh = HIGH;
の部分はcodeにJISが代入されていた場合return BINが実行されて、関数が終了するから
lh = HIGH;は実行されないんでしょうか?
168デフォルトの名無しさん:2007/04/10(火) 12:53:55
1) はい
2) はい
169デフォルトの名無しさん:2007/04/10(火) 12:55:45
>>168
ホントですか?
まったくあてずっぽうに解釈したのに俺ってセンスいいのかな?
170デフォルトの名無しさん:2007/04/10(火) 12:57:33
センスとか以前の問題だろ。
171デフォルトの名無しさん:2007/04/10(火) 15:18:43
色々突っ込みたいが敢えて何も言うまい。
172デフォルトの名無しさん:2007/04/10(火) 15:38:13
↑こういう思わせぶりなこと言う人いるよねぇ。
こんな事言って何も言わないなら最初から何も言わなきゃいいのに。
173デフォルトの名無しさん:2007/04/10(火) 17:11:08
そういうお前の書き込みに、意味はあるのか?
174デフォルトの名無しさん:2007/04/10(火) 17:12:15
>>173の書き込みよりはあると思うな。
175デフォルトの名無しさん:2007/04/10(火) 19:07:42
ソースファイルでメンバ関数を書くときに
親クラス名::メンバと書かなければいけないわけですが、
この親クラス名が長けりゃを何回も書くのが面倒なので#defineマクロつかって短くしちゃう
ってのはありなんでしょうか?
元に戻すとしても、検索置換一発なんであまり悪く無いとは思うんですがどうなんですか?
176デフォルトの名無しさん:2007/04/10(火) 19:09:28
やったこと無いからできるんか知らんけどできるならありだろ
ていうか毎度クラス名タイプしてんの?
普通コピペだと思ってた・・・
177デフォルトの名無しさん:2007/04/10(火) 19:09:45
>>175
IDEの支援機能 or コピペでいいじゃん
178デフォルトの名無しさん:2007/04/10(火) 19:16:40
できるできないは別として、そんなソースコード読みたくない。
あくまで自分用ならやってみてもいいとは思うけど。
179デフォルトの名無しさん:2007/04/10(火) 19:19:51
やっぱり読みにくくなるんですか?
慣れの問題以外で何か理由とかあるんでしょうか?
180デフォルトの名無しさん:2007/04/10(火) 19:36:30
あるていど長くても分かりやすい名前なら問題ない。
長い上に意味が不明瞭で、しかも似たような関数や変数が点在したりすると目も当てられない。
181デフォルトの名無しさん:2007/04/10(火) 20:31:16
>>175
せめてマクロよりはtypedefを使え
182デフォルトの名無しさん:2007/04/10(火) 20:33:07
>>181
ちょw
183デフォルトの名無しさん:2007/04/10(火) 21:09:51
>>181
マジすか!
184デフォルトの名無しさん:2007/04/11(水) 03:52:55
定義の部分なんだから変に略そうとするなよ。
185デフォルトの名無しさん:2007/04/11(水) 05:08:58
Cだけど、関数の仮引数を#defineしちゃうことはあったな。
そのときは関数ポインタを使う必要があって、同じ引数を持つ関数が10個くらいあったから。(しかも長い)
186デフォルトの名無しさん:2007/04/11(水) 05:14:36
構造体にして渡すという方法は思いつかなかったのか
187デフォルトの名無しさん:2007/04/11(水) 08:54:00
ヘッダにinlineとして定義できないような長い関数は作るべきではない
ゆえに.cppは不要
188デフォルトの名無しさん:2007/04/11(水) 09:25:21
それ、このスレのネタじゃないから。
189185:2007/04/11(水) 15:11:58
外部から呼び出す関係で、引数が指定されてた。
今にして思えばラッパ関数でも作ればよかったんだが。

でも、引数が多くなった時に構造体使うのってなんか好きになれない。
あ、複合リテラル使えばいいのか……C99対応してないけど……。
190デフォルトの名無しさん:2007/04/11(水) 23:52:46
char **namelist;
これを関数に渡して中身を更新するようにしたいのですが、
引数の指定や渡し方がいまいち分かりません。
誰かアドバイスおねがいします
191デフォルトの名無しさん:2007/04/11(水) 23:56:13
どう更新するのか分からんので何とも言えない
192デフォルトの名無しさん:2007/04/12(木) 00:02:12
関数の中でダブルポインタに配列を作成して、
その配列のアドレスを**namelistに返したいと思っています。
193デフォルトの名無しさん:2007/04/12(木) 00:13:14
ダブルポインタってなんですか?
194デフォルトの名無しさん:2007/04/12(木) 00:18:31
えと、私の持ってる本では「ポインタのポインタ」=「ダブルポインタ」みたいなことが書いてあったので、
その言葉を使用しました
195デフォルトの名無しさん:2007/04/12(木) 00:40:17
>119
>関数の中でダブルポインタに配列を作成して、
>その配列のアドレスを**namelistに返したいと思っています。

そのまま渡せばいいんじゃないの?
いいから書いた関数をあっぷしてみ。
じゃなければ呼び出し側をあっぷしてみ。
話はそれからだ。
196デフォルトの名無しさん:2007/04/12(木) 03:27:00
>>192の質問に近いのですが、私もおそらく同じ問題に直面しています。

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

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


上のように、構造体STATを要素数5の配列で宣言して、
その中身を関数funcで操作したいのですが、エラーがでてしまいます。
(上のままだと「STAT * 型は STAT ** 型に変換できない」という具合でエラーがでます)
これはどこが間違っているのでしょうか・・・よろしければご助言お願いします。
197デフォルトの名無しさん:2007/04/12(木) 03:55:41
>>196
STAT型のポインタを保持する配列statの中身はSTAT*だから
STAT stat[i]って宣言だとstat[i]の中身はSTAT型そのものになってしまう

試しにうちの環境で適当にSTAT定義して、STAT* stat[5];って宣言したら通ったから
多分あってると思う!!
198デフォルトの名無しさん:2007/04/12(木) 04:14:35
>>196
呼び出し元で STAT stat[5]; と宣言するなら func(STAT *stat)でstat[5]の中身を操作できる。
func(STAT *stat) { for(int i=0;i<5;i++)stat[i].menber1=1; }
ポインタを2重に使わなければいけないのは次のようなケース。
func(STAT **stat) { 
  int i;
  *stat = malloc(sizeof(STAT)*5);
  for (i=0; i<5; i++) (*stat)[i].menber1 = 1; 


main() {
  int i;
  STAT *stat;
  func(&stat); 
  for (i=0; i<5; i++) printf("%d\n", stat[i].menber1);
}
199デフォルトの名無しさん:2007/04/12(木) 04:32:05
>>197 >>198
それぞれの方法で試したところ、上手くいきました。
質問の回答だけでなく、細かな補足説明までしていただいて
ありがとうございます。勉強になりました&&キュゥンときました。
200デフォルトの名無しさん:2007/04/12(木) 04:34:39
もっと簡単に書く方法はないんですか?
たとえば stat[5]でSTATのインスタンスごと作ってくれて
stat[5].member[1]でアクセスできるようなの
多重間接参照ってなんかダサいですし
201デフォルトの名無しさん:2007/04/12(木) 04:58:56
>>200
配列へのポインタとポインタの配列は別物だからな。
あとSTATの定義を晒さないとコメントできんよ。
202デフォルトの名無しさん:2007/04/12(木) 05:38:26
>>198のコードを動かそうと以下のようなテストコードを組んでみたんですが
コンパイラを通りません、どうしてでしょうか?

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

struct STAT {
int member1;
} ;


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


main() {
  int i;
  STAT *stat;
  func(&stat); 
  for (i=0; i<5; i++) printf("%d\n", stat[i].menber1);
  return;
}
203デフォルトの名無しさん:2007/04/12(木) 05:58:48
ただ通らないといわれても困るが、なんかメッセージがでてるだろ。
もしCでコンパイルしてるならtypedefがいるんじゃね?
typedef struct stat_ { int menber1; } STAT;
204202:2007/04/12(木) 06:05:58
func()内のmallocの部分で明示的型キャストをつかったりしていくらか通してみた結果
どうやら
> (*stat)[i].menber1
がSTATのメンバであるmember1にならないのが原因のようです
これを他の部分を変えず、かつ直感的な表現に直す方法ってありますかね?
205デフォルトの名無しさん:2007/04/12(木) 06:17:22
>>204
単なる誤字だろそれ
member1
menber1
206202:2007/04/12(木) 06:21:01
解決しました!!
これで学校行けますありがとうございました!!!

やっぱコピペで済ませるのって慣れてないやばいんですね^^
207デフォルトの名無しさん:2007/04/12(木) 06:39:48
>えと、私の持ってる本では「ポインタのポインタ」=「ダブルポインタ」みたいなことが書いてあったので、

そうか、面接で「ダブルポインタは自信がありますがトリプルポインタはちょっと……」なんて
すっとこどっこいなことを言ってた香具師もその本を読んでたのかも知らんな。
208デフォルトの名無しさん:2007/04/12(木) 06:44:15
ぬるぽいんた
209デフォルトの名無しさん:2007/04/12(木) 06:47:35
>>202
C++でこれをコンパイルしてるのなら警告でまくりだろ
210デフォルトの名無しさん:2007/04/12(木) 07:16:54
トリプルって使う機会無いなあ
211デフォルトの名無しさん:2007/04/12(木) 07:20:07
三次元のボリュームデータ扱う時にトリプルは使うよ
212デフォルトの名無しさん:2007/04/12(木) 07:28:27
間接参照演算子って内部実装晒してるのと同じじゃん
*一個ならまだ許せるけど、多重はちょっと厳しいじゃん
組み込みとかC++が使えないところってそんなのばかりなの?
213デフォルトの名無しさん:2007/04/12(木) 07:28:46
だから、ポインタに階層を意味する単語をつけるのが愚なんだって。
リンクドリストなんかどうするんだよ。
214デフォルトの名無しさん:2007/04/12(木) 07:38:21
教科書どおりに自己参照ポインタを持った構造体を使う
これぐらいなら階層じゃなく、「次」とか「前」とか「先頭」みたいに「ポインタ」の意味で使えるから脳足りんの俺でも理解できる
で、階層構造どうやって表現したらいいの?
215デフォルトの名無しさん:2007/04/12(木) 07:40:49
リンクトリストではポインタへのポインタは出てこないだろ
216デフォルトの名無しさん:2007/04/12(木) 07:53:11
"ダブル"ポインタ
"トリプル"ポインタ

ダブルって言う人はアスタリスクの数を数えているのかもしれないが、
ダブルってのは階層を示すものではないと考えるのでオレは受け入れられない
217デフォルトの名無しさん:2007/04/12(木) 08:10:19
最終的には type*************** value
のような型になるような構造も普通に出てくるのかなぁ…
218デフォルトの名無しさん:2007/04/12(木) 08:19:25
終わってるだろ、その*の数
219デフォルトの名無しさん:2007/04/12(木) 08:36:58
int a[1][1][1][1][1][1][1][1][1][1];
**********a = 1;
220デフォルトの名無しさん:2007/04/12(木) 08:49:17
複雑なデータだと、構造体が3重になってるくらいはあるけどな。
221デフォルトの名無しさん:2007/04/12(木) 13:09:08
Perlのchop()みたいな末尾を削る関数ってありますか?
std::string s = "abcdefg";
でgを削りたい場合は
s = s.substr(0,s.size()-1);とやるしかないのでしょうか?
222デフォルトの名無しさん:2007/04/12(木) 13:15:05
>>221
You、末尾に'\0'を書いちゃえYO!
223デフォルトの名無しさん:2007/04/12(木) 13:19:59
>>222
std::stringは直接編集してはいけない。
224デフォルトの名無しさん:2007/04/12(木) 13:41:39
>>221
resize すれば
225デフォルトの名無しさん:2007/04/12(木) 13:51:06
eraseでいいじゃん
226デフォルトの名無しさん:2007/04/12(木) 14:00:49
>>224,225
ありがとうございます。resizeもeraseも自分が見てるサイトには載ってなかったもので・・・
どちらか使ってやってみます。
227デフォルトの名無しさん:2007/04/12(木) 17:23:55
Cを独学ではじめました。「ポインタ」というのが出て来たので
ポインタを使ってメモリの0から100を読み込んでみようと下のプログラム
書いてみたのですが、実行すると、0x00000000をread出来ないと出て来ます。
どうすれば0x00000000からのデータを読む事が出来ますでしょうか?

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

#include <stdio.h>

void main(void){

    int *p=0;
    int n;

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

}
228デフォルトの名無しさん:2007/04/12(木) 17:28:06
>>227
今のOSでは一般のプログラムが見られる場所はそのプログラムに割り当てられた空間だけです。
大人しくargvの辺りでも覗いてなさい。
229デフォルトの名無しさん:2007/04/12(木) 17:28:49
p=0はp=NULLの意味
ヌルポインタはどこも指していないポインタだから読めるわけがない
230デフォルトの名無しさん:2007/04/12(木) 17:39:33
略してぬるぽ
この問題で一番大事なことは上の事実
231227:2007/04/12(木) 17:45:46
>>228
でも、diskprobeとかだとMBRが読めたりしますよね?
これって全然違う話なんですかね?mbrをc言語で読み込んでみたいんです…。
というか、OS書くの忘れてました。すみません。
>>229
なるほど。
232デフォルトの名無しさん:2007/04/12(木) 17:49:23
0番地が読めるかどうかはOSによる
233デフォルトの名無しさん:2007/04/12(木) 17:50:57
>>231
ディスクの特定の場所を読みたいならディスクのドライバに命令を送って読み出せばいい
234デフォルトの名無しさん:2007/04/12(木) 17:52:09
>>231
mbrってハードディスクにある奴じゃないのか?
お前が読もうとしてるのはメモリなんだが
235デフォルトの名無しさん:2007/04/12(木) 17:59:05
>>231
ディスクの先頭セクタを読みたいなら、ディスクデバイスを適当に開けば普通に読めます。
#大抵のOSで。
尤も、それ自体もやはり、管理者権限が必要だったりもします。

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

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

申し訳ありません!!!!!!m(T◇T )m
Windows XP(SP2)です。
238235:2007/04/12(木) 18:12:37
>>237
>235に書いたことがそのままXPにも当て嵌まる。
詳しくは、MSDNのCreateFileの(なが〜〜い)説明参照。
239227:2007/04/12(木) 18:21:00
>>238
今みてみました。それから検索してたら
ttp://ext2read.sourceforge.net/documentation/inside-hard-disk/
こういうのが出て来たんですけど、msdnの解説同様( ゚д゚)ポカーンな状態なので、
まずは買って来た本を一通り読み終えてから(まだポインタの章なので)
いただいた情報をもとに検索してみたいとおもいます!
>>235さん、質問に答えていただいたみなさん、ありがとうございました!
240デフォルトの名無しさん:2007/04/12(木) 18:46:38
>>225
erase は古い環境で名前が違ってたり引数違ってたりすることもあるから、その点は注意な。
241デフォルトの名無しさん:2007/04/12(木) 20:14:47
全てのデバイスが mmap ってるのはそれなりに綺麗かもしれないな(w
242でぬるぽ:2007/04/12(木) 22:59:28
C/C++用のぬるぽチェッカーを作ってみた
叩くなりスルーなりお好きに
ttp://denullpo.exblog.jp/5410369/
243デフォルトの名無しさん:2007/04/12(木) 23:50:22

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

template <typename X> X CTest<X>::func(){ ... }
↑これをクラスの宣言の後ろに書けばちゃんと動きますが、
別のソースファイルに書くとダメです。
245デフォルトの名無しさん:2007/04/13(金) 07:24:15
#define HOGE_ template <typename X> X CTest<X>
246デフォルトの名無しさん:2007/04/13(金) 08:21:36
明示的実体化という方法がなくはない。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-3.html
247デフォルトの名無しさん:2007/04/13(金) 08:54:57
>>246さんの示してくれた方法でできました。
テンプレートはあくまでコンパイル時に解釈・生成されるものだというのは
要するにこういうことだったんですね。
ありがとうございました。
248デフォルトの名無しさん:2007/04/13(金) 09:05:22
newで0で初期化した状態で確保する方法を教えてください。
249デフォルトの名無しさん:2007/04/13(金) 09:09:51
new演算子はそこまで面倒見てくれないから自分で0代入汁
Windowsなら
Zeromemory(pDest, sizeof(type)*size);
みたいな感じか、もちろん基本型に限るが
250デフォルトの名無しさん:2007/04/13(金) 09:12:01
unixなら?
251デフォルトの名無しさん:2007/04/13(金) 09:17:14
どうよこの超原始的手段
char *hoge=(char *)Dest;
for(int i=0; i<sizeof(type)*size; i++)
hoge[i]=0;

てか、そもそも何をnewで確保するの?
252デフォルトの名無しさん:2007/04/13(金) 09:31:52
intです。
memsetでもOKですか?
253デフォルトの名無しさん:2007/04/13(金) 09:41:12
普通にstd::fillでも使っとけ。
254デフォルトの名無しさん:2007/04/13(金) 12:09:41
>>249
PODなら初期化してくれるだろ
T* t = new T();
e.g.
int* p = new int(); // *p->0
255デフォルトの名無しさん:2007/04/13(金) 12:50:45
newで初期化の問題云々いうときは大抵配列の方だと思うがね
256デフォルトの名無しさん:2007/04/13(金) 14:24:39
exportがあればなあ…。
257デフォルトの名無しさん:2007/04/13(金) 17:49:26
>>248
普通にstd::vector<int>確保すればデフォルトコンストラクタで初期化されるよ
258デフォルトの名無しさん:2007/04/13(金) 17:54:44
>>255
配列でも初期値で初期化なら問題ないでしょ
int* p = new int[10]();
259デフォルトの名無しさん:2007/04/13(金) 19:25:50
明解C言語の入門と実践編を終えたばかりの青二才未満のものなんですが、
Cを使ったソケットプログラミング(ネットワークプログラミング)を学ぶのに
オススメの書籍、又はWEBサイトが御座いましたら、教えていただけますでしょうか。
260デフォルトの名無しさん:2007/04/13(金) 19:30:18
猫C
261デフォルトの名無しさん:2007/04/13(金) 19:41:11
まずは標準入出力をソケットに見立てて書いてみる
→ inetd で ウマー
プロトコル周りは RFC (原文&日本語訳) を参照
# 「インターネットRFC辞典」持ってるけど結局 RFC本体を追うしなぁ…

Windows だと ASync 周りが嫌らしいので、
MSDN +
http://pc11.2ch.net/test/read.cgi/tech/1171029896/ のテンプレサイト +
ぐぐる +
MFCのソース眺める +
などなど
262デフォルトの名無しさん:2007/04/13(金) 20:09:18
そんなの出来るんすか?
じゃあ入出力インターフェイスとしてistream/ostream持ってるクラスなら
それをそのままhttpストリームにして出力できるんすか?
263デフォルトの名無しさん:2007/04/13(金) 20:18:19
タイムアウトとか面倒見なけりゃそこそこいけるんじゃね?
ソケット ⇔ ファイルハンドル が inetd の仕事だからな。
# クライアント記述だと inetd ダメポかも…

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

で、HTTP ぐらいになると、そのルールが複雑怪奇だから難しいさね。
264デフォルトの名無しさん:2007/04/13(金) 20:37:44
あとC++のiostreamは「その気になれば」、
どんな相手でも入出力できるようにできる。
inetdとか使わないで自前でやるときにはね。
265デフォルトの名無しさん:2007/04/13(金) 23:57:03
throw()って宣言したほうがいい?
266デフォルトの名無しさん:2007/04/13(金) 23:59:07
>>265
百害あって一利なし
267デフォルトの名無しさん:2007/04/14(土) 00:27:06
デストラクタのthrow()宣言くらいはいいと思うよ.
絶対に投げちゃダメだから.
全然強制力もないし,あんま意味ないけどね
268デフォルトの名無しさん:2007/04/14(土) 00:28:23
一利ぐらいはあるんじゃないか。
とりあえずデストラクタとswapにはつける。
269デフォルトの名無しさん:2007/04/14(土) 00:47:33
さんくす
やっぱその程度にしか使えないのね
270デフォルトの名無しさん:2007/04/14(土) 00:48:42
C++の例外って使いどころが分からない
271デフォルトの名無しさん:2007/04/14(土) 02:14:51
たまに継承もとのデストラクタがthrow()で宣言されてる場合が・・・
272259:2007/04/14(土) 04:13:08
>>260
今度立ち読みしてみます。ありがとうございます。

>>261
沢山の回答ありがとうございます。かなり勉強になりそうなので
特にテンプレによく目を通したいと思います。ありがとうございました!
273デフォルトの名無しさん:2007/04/14(土) 04:54:14
>>270
C++以外の例外について分かっているなら、いっしょだと思うよ。
274デフォルトの名無しさん:2007/04/14(土) 07:27:44
危険性が違うだろ
275デフォルトの名無しさん:2007/04/14(土) 10:27:12
finallyなんていらんのですよ
276デフォルトの名無しさん:2007/04/14(土) 12:56:37
HDCに書き込んだ文字や線を画像ファイルとして保存したいのですが、
BMPファイルに保存するだけでも、なんかすげー色々やることあって敷居高いのですが、
HDC渡すだけで勝手に画像ファイル作って保存してくれるみたいな
都合のいいライブラリってないもんですか?
277デフォルトの名無しさん:2007/04/14(土) 13:22:31
GDI+
278デフォルトの名無しさん:2007/04/14(土) 13:39:09
>>277
レスありがとうございます。GDI+ってプラスって言うくらいだから
さらに高機能でめんどくさくなると思ったのですが、
調べてみたら簡単になってるのですね。
なんか良い書籍ないか探して、GDI+について勉強してみます。
279デフォルトの名無しさん:2007/04/14(土) 15:34:28
>>274
危険性って何のこと?
280オナニストガロア ◆HEfxsk5e3k :2007/04/14(土) 16:17:47
vineLinuxでC++やります。
今さっきまでnamespaceの存在を知らなくてコンパイルが出来なくて困ってました。
よろしくおねがいしまふ
281デフォルトの名無しさん:2007/04/14(土) 20:31:30
Visual Studio C++ 2005 EXPRESS EDITIONで、
Windows APIを使ったプログラミングを始めようとしたんですが、
ビルドするといきなり、
\source\main.c(1) : fatal error C1083: include ファイルを開けません。'windows': No such file or directory
というエラーが出てしまいます。
プロジェクトは、Win32コンソールアプリケーションでつくったので
問題はないと思うのですが、
何がいけないのでしょうか?

#include <windows.h>

int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPreInst, LPSTR pCmdLine,int nCmdShow)
{
MessageBox(NULL,"Hello, World","タイトル",MB_OK);
return 0;
}
282デフォルトの名無しさん:2007/04/14(土) 20:33:43
Express Editinonでは、別途Windows SDKかPlatform SDKをインストールする必要がある。
283デフォルトの名無しさん:2007/04/14(土) 20:40:58
>>282
Platform SDKは、インストールをしています。
PSDK〜.exeってやつですよね?
284デフォルトの名無しさん:2007/04/14(土) 20:43:20
>>283
VisualStudio(C++)専用スレへどうぞ。
285デフォルトの名無しさん:2007/04/14(土) 20:47:09
>>283
VCにPSDKの場所を設定する必要もある。
286デフォルトの名無しさん:2007/04/14(土) 22:50:54
すみません、C言語に関するご質問です

'a'は一文字、"abcde"は文字列と教わりましたが、では
'abcde'と定義した場合どういう意味になるのでしょうか?
287デフォルトの名無しさん:2007/04/14(土) 22:58:45
>>286
コンパイラによって"str"と同じだったり、エラーが出たり
288デフォルトの名無しさん:2007/04/14(土) 22:58:48
>>286
出来たか?
4文字までならできる処理系もないではないが…
289デフォルトの名無しさん:2007/04/14(土) 23:05:20
>>287
妄想乙。

>>286
シングルコーテーションで囲んだ文字は整数値として扱われるので、
sizeof(int)と同じ文字数までしか書けない筈。
おまけにその値が同解釈されるかは環境依存。
例えば、'abcd'と書いて'a'<<24|'b'<<16|'c'<8|'d'になるか'a'|'b'<<8|'c'<<16|'d'<<24になるかは
同じコンパイラでもバージョンによって違っていたりする。
290デフォルトの名無しさん:2007/04/14(土) 23:09:42
ちなみにC++だと文字リテラルはcharだ。
互換性を断ち切ったそう多くない箇所なので要チェック。
291デフォルトの名無しさん:2007/04/14(土) 23:36:01
Cで、 !0 が1にならない処理系・コンパイラで有名どころは何があります?
292デフォルトの名無しさん:2007/04/14(土) 23:46:30
ISOやANSIに準拠してなくてK&Rとの互換性もない処理系
293デフォルトの名無しさん:2007/04/14(土) 23:50:11
>>292
具体的にはどんなの?今でも触れたり使われたりしてる?
>>292が今使ってるとか?
294デフォルトの名無しさん:2007/04/14(土) 23:51:55
そんなけったいなもの現存してないだろ
295デフォルトの名無しさん:2007/04/15(日) 00:02:44
>>294
本当!?大丈夫なの!?そんな処理系もうない!?
296デフォルトの名無しさん:2007/04/15(日) 00:04:11
あぁー僕は今処理系依存コードを書いているよー!気をつけようねぇー!
297デフォルトの名無しさん:2007/04/15(日) 00:07:27
何を書いてるのか知らんが、お前のレベルなら規格に準拠してない処理系まで考慮することはないだろ。
298デフォルトの名無しさん :2007/04/15(日) 00:09:38
programming初心者です
visual c++をインストールしたのですが、c言語を使ってprogrammingの学習をしたいのですが
windowsのコマンドプロンプト上でc言語のprogramをするにはどうしたらよろしいのですか?
環境設定等が解らず困ってます。
どうか、ご指導のほどよろしくお願いします。
299デフォルトの名無しさん:2007/04/15(日) 00:14:22
>>297
どのくらいのレベル以上からだと 規格に準拠していない処理系まで
考慮しなければならない?

せいぜいintが16ビット系にしかあたったことないなー
NULLが0じゃないのにもあたったことないし運がいいだけかなー
300デフォルトの名無しさん:2007/04/15(日) 00:19:11
> intが16ビット
> NULLが0じゃない
それはどっちもANSI準拠だろ
301オナニストガロア ◆HEfxsk5e3k :2007/04/15(日) 00:19:56
rubyが出来るのですが、C++もすぐに出来るようになりそうですか?
302デフォルトの名無しさん:2007/04/15(日) 00:23:04
いいえ
303デフォルトの名無しさん:2007/04/15(日) 00:24:15
>>300
NULL==0なものにしかあたったことがない。
というか、NULL==0という前提なコード書きまくりんぐ。

お前はどうだい?
304デフォルトの名無しさん:2007/04/15(日) 00:26:22
NULLは0の#defineだろ。==が成り立たないほうがおかしい
305デフォルトの名無しさん:2007/04/15(日) 00:28:17
あーもう C FAQ 嫁。
http://www.kouno.jp/home/c_faq/c5.html
はい、おしまい。
306デフォルトの名無しさん:2007/04/15(日) 00:42:05
ぬるぽ
307デフォルトの名無しさん:2007/04/15(日) 01:11:48
>>305
4月だな
308デフォルトの名無しさん:2007/04/15(日) 02:01:40
>>305
0はNULLとしてよいがNULLは0とは限らない と書いてあるンだけど・・・
NULLが0でない処理系が今でも生き残ッているのか聞きたいンだが。
309デフォルトの名無しさん:2007/04/15(日) 02:04:02
ポインタ型のNULLと整数型の0を比較するのはナンセンス。
ヌルポインタの内部表現が0でない処理系ならごまんとある。
310デフォルトの名無しさん:2007/04/15(日) 02:12:54
>>308
#define NULL ((void*)0)
とされてるCの処理系なら今でもあるよ。
311デフォルトの名無しさん:2007/04/15(日) 02:15:17
>>308
NULL が 0 でないコンパイラを自分で作ればいいじゃないか
312デフォルトの名無しさん:2007/04/15(日) 02:25:57
>>309
具体例機盆ぬ
313デフォルトの名無しさん:2007/04/15(日) 03:06:51
>>309
ポインタが現われるべきところに書かれた0は
整数型として解釈されることはないんだけど。
「16進数の0x1Aはおかしい!整数の中に文字定数'A'が入っている!」
って言っているようなもの。
314デフォルトの名無しさん:2007/04/15(日) 03:07:38
>>313
流れ読めよ。
315デフォルトの名無しさん:2007/04/15(日) 03:11:24
>>309
具体例きぼんぬ

>>314
こうですか?わかりません><
316デフォルトの名無しさん:2007/04/15(日) 03:35:07
>>309が知ったかのアホでFA
317デフォルトの名無しさん:2007/04/15(日) 03:51:35
>>313
ポインタ様と0を比較するというのは
ポインタ様がぬるぽかどうか比較することと等しいということガッ
言語規定で規定されているので、これはおかしくない
318デフォルトの名無しさん:2007/04/15(日) 03:53:39
ぬるぽ
319デフォルトの名無しさん:2007/04/15(日) 04:18:49
島根県のみなさん、パチンコをするなら、

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

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

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

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

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

※3       市場規模   遊戯人口
 平成06年 30兆4,780億円 2,930万人
 平成08年 30兆0,630億円 2,760万人
 平成10年 28兆0,570億円 1,980万人
 平成12年 28兆6,970億円 2,020万人
 平成14年 29兆2,250億円 2,170万人
 平成16年 29兆4,860億円 1,790万人
320デフォルトの名無しさん:2007/04/15(日) 04:19:59
ぽるの
321オナニストガロア ◆HEfxsk5e3k :2007/04/15(日) 08:34:26
c++ではNULLは整数型の0で定義されてますよっと。
今林先生の本読んでる
322デフォルトの名無しさん:2007/04/15(日) 15:23:03
SIMDって何て読むんですか?
323デフォルトの名無しさん:2007/04/15(日) 15:38:40
C++ではNULLではなく0を使うことが推奨されているわけだが。
324デフォルトの名無しさん:2007/04/15(日) 16:29:54
>>322
like "Ess, I'm Dee".
325デフォルトの名無しさん:2007/04/15(日) 17:28:37
>>324
どっちかというとEss, I aim Dee.
326デフォルトの名無しさん:2007/04/15(日) 19:25:13
>>321
誰も定義の話をしてないだろ
ちゃんと読めよ低脳
327286:2007/04/15(日) 19:43:02
>>287-290
ありがとうございました。
ちなみに試したわけではなく
純粋にどうなるのかと思った
だけでした。
328デフォルトの名無しさん:2007/04/15(日) 21:13:07
vipからきました q(^-^)p
329デフォルトの名無しさん:2007/04/15(日) 21:29:29
http://52.xmbs.jp/m3nshea2/

このサイトぶっ潰しませんか??
写メとか貼って気持ち悪いです。自分は初心者なんで潰し方がよく
分からないのでみなさんお願いします。
330デフォルトの名無しさん:2007/04/15(日) 22:14:26
void *m = 0;のとき、*(size_t*)&m!=0ということじゃね?
331デフォルトの名無しさん:2007/04/15(日) 22:17:12
>>329
お前を通報しました
332デフォルトの名無しさん:2007/04/15(日) 22:56:52
C++の言語仕様ではヌルポインタは0なをだがな。
333デフォルトの名無しさん:2007/04/16(月) 00:56:11
構造体の配列の配列を動的確保するにはどうしたらいいのでしょうか?
typedef struct {
char a;
char b;
} St;

void poo(int x, int y){
St **hoge;
hoge = (St **)malloc(sizeof(St*)*x);
for(int i=0;i<x;i++){
 hoge[i] = (St *)malloc(sizeof(St)*y);
}
}
これだと駄目でした。コンパイル通っても中身にアクセスしようとするとふっとびます。
hoge[3][5].a = 'T';
のように使いたいのですが。
334デフォルトの名無しさん:2007/04/16(月) 01:04:23
>>333
poo(3, 5); って呼び出してるって落ちでは?
こちらではpoo(4, 6)でちゃんと動く。
335デフォルトの名無しさん:2007/04/16(月) 01:14:56
>>334
poo(100,100)等と入れてるのでそういうわけではないみたいです。
他の部分との影響かもしれないのでもう少しいじくってみます。
336デフォルトの名無しさん:2007/04/16(月) 01:25:55
>>335
念のためCodeGuardを掛けてみたけど「解放されていません」の
警告以外はエラー出ないねやっぱり。
337デフォルトの名無しさん:2007/04/16(月) 02:02:54
コピーコンストラクタを使った初期化でauto_ptrで
メンバ関数を呼び出すとアクセス違反が発生しましたって
怒られるんですが、何が悪いんでしょうか。

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

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

void userCode(ShapePtr s ) throw(){
cout << "userCode() number1:";
s->draw();
ShapePtr copy = s->clone();
cout << "userCode() number2:";
copy->draw();
ShapePtr similar = s->createSimilar();
cout<< "userCode() number3:";
similar->draw();
}
338デフォルトの名無しさん:2007/04/16(月) 02:10:10
>>337
コードが足りない。症状が再現する最小のソースを貼って。
339デフォルトの名無しさん:2007/04/16(月) 02:22:49
#include <iostream>
#include <new>
#include <memory>
using namespace std;
class Shape;
typedef auto_ptr<Shape> ShapePtr;

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

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

これでどう?
342デフォルトの名無しさん:2007/04/16(月) 02:31:57
ShapePtr Circle::createSimilar() const throw(bad_alloc) {
return ShapePtr(new Circle());
}
ShapePtr Circle::clone() const throw(bad_alloc) {
return ShapePtr(new Circle(*this));
}

悪いこっちの方が見やすいね。
343デフォルトの名無しさん:2007/04/16(月) 02:51:24
うおお。
いけました。ありがとうございます。

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

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

_tmain()とあるからVisual C++だと思うんだけど。
345デフォルトの名無しさん:2007/04/16(月) 02:57:48
ちなみにgcc(MinGW 3.4.2)だと

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

のようなエラーを返す。
346デフォルトの名無しさん:2007/04/16(月) 12:19:02
long long って、まだ現在の C++ の規格には入ってないの?
347デフォルトの名無しさん:2007/04/16(月) 13:01:37
どーでもいいけどlong longって
ちょっと、ちょっとちょっとレベルだよな
348デフォルトの名無しさん:2007/04/16(月) 13:33:13
DLLの関数を呼ぶときに

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

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

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

DLL経由関数呼び出しの、バイナリレベルの挙動についてなにか知ってたら教えてくれ〜
349デフォルトの名無しさん:2007/04/16(月) 13:48:24
関数の宣言で何か(主に呼び出し規約を)ミスってんじゃないの?
350デフォルトの名無しさん:2007/04/16(月) 14:00:01
__stdcall とか __cdecl とか __pascal って書いてないの?
351デフォルトの名無しさん:2007/04/16(月) 14:01:38
謎の値というのはひょっとするとthisポインタの可能性もあるかも。
extern "C" で呼び出すようにし、C++の形式の関数は使わない
ようにするのが原則だけどそんな事は知ってるよね。
352デフォルトの名無しさん:2007/04/16(月) 14:06:35
呼び出し規約かthisポインタかどっちかの問題だと思う
353デフォルトの名無しさん:2007/04/16(月) 14:07:44
this 積むのは __thiscall かメンバ関数だと思うが…
C++ って標準は __stdcall だっけか?
354デフォルトの名無しさん:2007/04/16(月) 14:22:23
__stdcallを使うとCでも他の言語でも整合性がとれたスタックを
提供できる。

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

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

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

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

あと、Debugでビルドするとすべて正常に動く。
356デフォルトの名無しさん:2007/04/16(月) 14:33:35
メインプログラムもDLLもC++なの?
一度__stdcallにしてビルドしなおしてみてよ。
DEFファイルの書き方はわかるよね?これを書けば
extern "C"は不要になるので。
357348:2007/04/16(月) 14:34:53
あ、355は僕です スマソ

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

訂正。DLL側をDebugでビルドするとすべて正常に動く。
358デフォルトの名無しさん:2007/04/16(月) 14:34:56
>>355
typedef ret_type (__cdecl *pfunc) (arg_types...) PFUNC;

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

アドレスを受ける変数に呼び出し規約を埋めるんだ
359348:2007/04/16(月) 14:36:28
>>358

んにゃ、 _cdecl はちゃんと指定しているよ。
extern "C"は呼び出し側は関係ないってことでいいんだよね?
360デフォルトの名無しさん:2007/04/16(月) 14:39:35
ああ
GetProcAddress() だけで完結した呼び出しなら
明示してるんだから extern "C" はイラネ-な。
361デフォルトの名無しさん:2007/04/16(月) 14:40:12
>>359
extern "C"はC++の名前マングリングを止めるもの。
メインもDLLも同じ処理系の同じC++で開発するなら必要ない。
(修飾名も同じになるから)

__declspec(ddexport)とか__declspec(dllimport)を使えば
DEFファイルは不要。
362デフォルトの名無しさん:2007/04/16(月) 14:41:25
GetProcAddressにはextern"C"付けておく必要がある。
なぜならWin32APIには名前マングリングが存在しないから。

それと
×ddexport
○dllexport
363デフォルトの名無しさん:2007/04/16(月) 14:42:42
まあwindows.hをインクルードしておけばextern "C"は自動的に
やってくれるので気にする必要はない。
364デフォルトの名無しさん:2007/04/16(月) 14:51:18
呼び出し規約以外にも、引数のサイズの不一致とかありそうだな
構造体を値渡ししてたり とか 可変引数だけど個数間違えたり とかしてない?
365348:2007/04/16(月) 15:01:02
引数の数が違うとやっぱり問題なのかな。

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

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

__stdcall 試してみるyo。

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

だからそういう関数ならcdeclにしておけ。
367デフォルトの名無しさん:2007/04/16(月) 15:33:28
sizeof(wchar_t) の大きさによって定義を変えたいのですが、
#if sizeof(wchar_t) == 4 も
#if sizeof(L'A') == 4 も
定数式では無いと、コンパイラが受け付けてくれません。
何かいい方法ありませんか?
368デフォルトの名無しさん:2007/04/16(月) 16:36:22
C++ならテンプレートを使ってごにょごにょ、
CならWCHAR_MAXの値を見るくらいしかないと思う。
369デフォルトの名無しさん:2007/04/16(月) 16:43:58
bccでは通った。
370デフォルトの名無しさん:2007/04/16(月) 16:52:01
でも規格上はプリプロセッサ内でsizeofは使えない仕様のはず
371デフォルトの名無しさん:2007/04/16(月) 17:05:41
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3828.txt

マルチスレッドで、ソケットプログラミングをしたいのですが、
winsock2.hをインクルードするだけでエラーが出てしまいます。
どうすればよいのでしょうか?
372デフォルトの名無しさん:2007/04/16(月) 17:08:32
どんなエラーが出てるのかくらい書けよ
373371:2007/04/16(月) 17:11:58
>>372
すみませんでした。
↓みたいなエラーが57個でます

c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(112) : error C2011: 'fd_set' : 'struct' 型の再定義
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(54) : 'fd_set' の宣言を確認してください。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(147) : warning C4005: 'FD_SET' : マクロが再定義されました。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(88) : 'FD_SET' の前の定義を確認してください
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(156) : error C2011: 'timeval' : 'struct' 型の再定義
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(97) : 'timeval' の宣言を確認してください。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(212) : error C2011: 'hostent' : 'struct' 型の再定義
374デフォルトの名無しさん:2007/04/16(月) 17:19:58
<winsock2.h>は<windows.h>よりも先に#includeする。
375371:2007/04/16(月) 17:39:38
>>374
ありがとうございましたm(_ _)m
無事解決しました!
376デフォルトの名無しさん:2007/04/16(月) 18:30:52
#define WIN32_LEAN_AND_MEAN
でもよかったとおもた。
Windows.hがwinsock.hもincludeするのが理由とか何とか
377デフォルトの名無しさん:2007/04/16(月) 18:33:15
WIN32_LEAN_AND_MEAN教えると、必要なヘッダがincludeされなくなってて、また泣き付かれることになるやもしれん。
378デフォルトの名無しさん:2007/04/16(月) 18:38:20
WIN32_LEAN_AND_MEAN はとりあえず無効化するね。
379デフォルトの名無しさん:2007/04/16(月) 19:32:45
どっちにしろホントに必要なヘッダはMSDN見ないとダメだからねー
380デフォルトの名無しさん:2007/04/16(月) 20:32:14
質問があります。
string str[] = {"aaa", "bbb", "ccc", ""};
を宣言して、

string *tmp = str;
while (*tmp->c_str()) {
printf("%s", tmp->c_str());
tmp++;
}
とやると、一応cccと表示されループを抜けるのですがこれは正しい処理なのでしょうか?
もし間違っているなら正しいやり方を教えてください。御願いします。
381デフォルトの名無しさん:2007/04/16(月) 20:55:45
>>368
>>369
>>370
sizeofが使えないのは不便ですよね^^
結局、WCHAR_MAXの値を使うことにしました。
ありがとうございました。
382デフォルトの名無しさん:2007/04/16(月) 21:04:40
>>380
for (string *tmp = str; !tmp->empty(): ++tmp) {
printf("%s", tmp->c_str());
}

自分ならこう書く
383デフォルトの名無しさん:2007/04/16(月) 21:20:14
!tmp.size()でもいいな
384デフォルトの名無しさん:2007/04/16(月) 21:26:29
気持ち悪い
385380:2007/04/16(月) 21:29:02
>>382-383
有り難うございます。
参考にさせて頂きます。
386デフォルトの名無しさん:2007/04/16(月) 21:46:06
C++なら余りポインタは使いたくないな・・・

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

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

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

と書いちゃうな・・・・
387デフォルトの名無しさん:2007/04/16(月) 21:48:10
std::copy(str.begin(), str.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
388デフォルトの名無しさん:2007/04/16(月) 22:08:05
>>383
tmp->size()では?
つまり論理が逆ではと思います。
389デフォルトの名無しさん:2007/04/17(火) 00:13:19
あるクラスのメンバ変数としてこんな定義があった場合、
class Neko {
 classA hoge1;
 classB hoge2;
}
コンストラクタは hoge1→hoge2、デストラクタはその逆の順番で
呼び出されているように見えますが、
これはC++の規格として保証されていますか?
390デフォルトの名無しさん:2007/04/17(火) 00:14:58
いいえ
391デフォルトの名無しさん:2007/04/17(火) 00:24:31
呼び出される順番は不定ということですね。
ありがとうございました。
392デフォルトの名無しさん:2007/04/17(火) 00:30:01
自分の処理系では保証されてるんだから
それでいいじゃんと思う俺ホビープログラマー
393デフォルトの名無しさん:2007/04/17(火) 00:52:09
ラベルをまたがなければ上から順、と決まってなかったっけ?
394デフォルトの名無しさん:2007/04/17(火) 00:55:35
つ[規格票]

これ以外の書き込みは嘘だと思え
395デフォルトの名無しさん:2007/04/17(火) 01:02:18
宣言順だったはずだけど
396デフォルトの名無しさん:2007/04/17(火) 01:04:41
あった

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

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

非staticデータメンバはクラス定義での宣言順に初期化される。(メンバ初期化リストの順序は関係ない)
397デフォルトの名無しさん:2007/04/17(火) 01:10:03
ラベル云々って人は、メンバのメモリ配置と混同してるかな。
398デフォルトの名無しさん:2007/04/17(火) 01:16:28
>>389
保障されている。
staticでないメンバ変数は宣言どおりの順番でコンストラクタが呼び出され――12.6.2
デストラクタはその逆順で呼び出される――12.4.6
399デフォルトの名無しさん:2007/04/17(火) 01:25:30
規格で保障されているとはいえ、初期化順序をあてにしたコードは書きたくない。
エディタで宣言の順番を変えてしまうだけで動かなくなる不思議なコードになる。
とはいえ、そういう初期化順序を考慮したい場合もままあるわけで、そんなコードを書くなと主張するわけにも行かず。
せめて、書かないほうが良いと主張するのが精一杯。

>>390みたいに、C++プログラマ全員に、規格書をきっちり読んで置けというのも酷な話。
400デフォルトの名無しさん:2007/04/17(火) 01:25:42
a=a++;

そろそろ、この類の事象を 不定だの未定義だの屁理屈並べずに
エラーにするか動作を定義するか どちらかにすべきだと思うんだ。
401デフォルトの名無しさん:2007/04/17(火) 01:28:16
>>400
参照が問題を複雑にしてくれるから、とりあえずエラーにするという選択肢じゃ解決にはならんだろうな。
402デフォルトの名無しさん:2007/04/17(火) 01:29:03
>>399
だったらC++なんか使うなよ
403391:2007/04/17(火) 04:36:55
ちゃんと規定があったんですね……改めてありがとうございました。
いくつかの値(hoge1とかhoge2とか)のポインタを保持しておいて、
デストラクタでファイルに書き出す、というクラスを
C++をやり始めた頃に作ってずっと使っていたのですが、
このクラスのデストラクタが呼び出されるよりも先に
hoge1やhoge2が破壊されてしまったらまずいじゃん、
ということに最近気付いたんです。
404デフォルトの名無しさん:2007/04/17(火) 08:26:50
>>403
親子関係だからセーフだね

親戚同士の順序依存するってーと >>389 での classB のコンストラクタに
classA のポインタとるようなやつとかかな
405391:2007/04/17(火) 08:42:26
書き方が悪かったんですが、実際そんな感じです
(コンストラクタではなくて、初期化ルーチンの中で
ClassB.AddItem()みたいな関数を使うのですが)。
C++はずっと独学でやってきていたので
すごく変な構造だったのではないかと不安だったんですが、
幸いにして(?)私にそこまでのオリジナリティーは
なかったようですね。ちょっと安心です。
406デフォルトの名無しさん:2007/04/17(火) 08:50:19
ifstream で デスクトップのファイルが読めません
ネットで検索すると同じ質問があるのですが解決してません
多分ファイル名の日本語がヤバそうなのです

環境はVC8のExpressで、Win32コンソールでCLR未使用
コマンドラインから使うタイプです
あとマルチバイトにしています
海外のソフトとかデスクトップ上のファイルが不可なので、日本語対応とかあるのでしょうか?
407オナニストガロア ◆HEfxsk5e3k :2007/04/17(火) 09:15:42
rubyでは数値などもすべてobjectでしたがC++は違いますか?
C++が書けるとどういった利点がありますか?
ちなみに環境はVineLinux gccです
408デフォルトの名無しさん:2007/04/17(火) 09:24:19
基本型(int, double, char等のただの数値)はクラス(オブジェクト)じゃない。
正確に言うとコンストラクタは持っているけどC++の中で言うクラスではない。
当たり前の話だけど、利点はどう使うか、何に使うか、何と比べるかによる。
409デフォルトの名無しさん:2007/04/17(火) 09:33:07
・動作速度が速い
・静的型によるいくつかの利点(当然、静的型には欠点もある)
 ・オーバーロードが可能
 ・コンパイル時に型に関する大部分のバグを排除できる

とりあえず思いついたのはこのくらい。
410デフォルトの名無しさん:2007/04/17(火) 09:41:34
>>406
local.h
411デフォルトの名無しさん:2007/04/17(火) 12:13:17
>>406
WIn32は関数名の後ろにAが付いているものはANSI用で
感じはシフトJISとして扱われる。Wがついている物がUNICODE。
412デフォルトの名無しさん:2007/04/17(火) 15:02:09
ちなみにNT系でANSIなAPI呼ぶとUnicode変換されてWなAPIが呼ばれる
413348:2007/04/17(火) 15:36:46
デバッガ上でそう見えてただけで実際は正常だったyo
orz

エラーは別の原因。MFCのデバッグ版をリンクすると正常動作するのに、リリース版だと例外が発生。
うおーデバッグできねえ
414デフォルトの名無しさん:2007/04/17(火) 15:47:23
std::vector<int> v;
vに1, 3, 2, 3, 4がこの順番で入っているとします。
STLのremove()は処理後の有効な最後の要素を指すイテレータを返すので、
remove(v.begin(), v.end(), 3)とすると、返るイテレータは4を指していると思います。
だから、
v.erase(remove(v.begin(), v.end(), 3), v.end());
とすると、4から末尾まで消えてしまい、1, 2だけになる気がするのですが
どうしてならないのでしょうか?
415デフォルトの名無しさん:2007/04/17(火) 15:51:16
>>414
std::remove()は処理後の削除された無かった最後の要素の
"次の"位置を返す。つまりこの場合はv.end()を指している。
416デフォルトの名無しさん:2007/04/17(火) 15:53:23
チゴタ。3が削除され、それが4で上書きされる。

つまり、1, 2, 4, 4 となり、二つの4の最後の方を返す。
417デフォルトの名無しさん:2007/04/17(火) 15:57:34
これを見てもらえばremove()の動作がよくわかるはず。

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

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

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

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

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

なになに、3が2つとも消えるって言いたいの?
1 3 2 3 4
0 1 2 3 4
^ ここしか消えないよ
419418:2007/04/17(火) 16:09:46
行頭のスペースがトリムされたorz
最後の行の^は3を指している。
420デフォルトの名無しさん:2007/04/17(火) 16:13:46
1, 3, 2, 3, 4ならこちらで

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

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

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

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

 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;
}
421414:2007/04/17(火) 16:34:17
つまり、
removeの返却値は、vの先頭部分に形成された「指定値が取り除かれた配列」の最後の要素を指す
のでは無くて、
「取り除かれた配列」の後に続く部分の最初の要素を指す
1,3,2,3,4の例でいうと、v[2]を指すイテレータではなく、v[3]を指すイテレータが返る
ということでしょうか?
422デフォルトの名無しさん:2007/04/17(火) 16:41:12
>>421
そういう事だね。
std::remove()のアルゴリズム自体は要素を削除するというのではなく
削除対象以外の要素を前に詰める働きをする。
そして削除対象の要素の先頭を返すのでそれをerase()にかけてやれば
うまく削除対象が無くなるわけだ。
423MSDN:2007/04/17(火) 16:43:52
このテンプレート関数は、first を X に代入し、次のステートメントを実行します。

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

いくつ条件にマッチしたかに関わらず、end() が返る でおk?
424414:2007/04/17(火) 16:44:36
良く分かりました。皆様ありがとうございました。
425406:2007/04/17(火) 20:12:18
>>411
まじで!あの”A”が謎だった
ほっぺたが落ちたよ!
426デフォルトの名無しさん:2007/04/17(火) 20:28:48
>>406
std::locale::global(std::locale(""));をmainの頭に書いてもだめか?
427デフォルトの名無しさん:2007/04/17(火) 20:41:05
Aが謎だったて、msdn見りゃ書いてあるし・・・
そうでなくてもSDKのヘッダ見りゃ#define UNICODEで分けてあるし・・・
428406:2007/04/17(火) 21:01:38
>>426
それで出来ました ( ・`ω・´)ノ
429デフォルトの名無しさん:2007/04/17(火) 21:09:17
winsockを使った簡単なメッセージ送信プログラムで、
クライアント側で接続ボタンを押すと、サーバに接続して
メッセージを取得してそれを表示するというものを作っています。

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

↑がソースです。コンパイルはできるのですが、
取得したメッセージが5文字目から文字化けしてしまいます。
どうすればよいのでしょうか?
430デフォルトの名無しさん:2007/04/17(火) 21:13:16
>>429
お前の環境じゃsizeof(char*) == 4だからだろ
431デフォルトの名無しさん:2007/04/17(火) 21:17:32
>>430
レスありがとうございます。
buf = (char *)malloc(11);
とかにしても、やはり5文字目から文字化けしてしまいます・・・
432デフォルトの名無しさん:2007/04/17(火) 21:20:37
recv(sock, buf, sizeof(buf), 0);
おいおい
bufがcharの固定配列ならありだけど・・・
433デフォルトの名無しさん:2007/04/17(火) 21:35:49
>>432
char *buf じゃなくて char buf[1024] にして文字化けが
解消されました。ありがとうございました!
434デフォルトの名無しさん:2007/04/17(火) 22:08:25
って、思ったんですが、1024も文字が送られてくることはめったにないのに、
それだけの領域を用意するってのはもったいなくないですか?
どうにかできないでしょうか?
435デフォルトの名無しさん:2007/04/17(火) 22:15:05
別に大したサイズじゃないしそれくらいどうってことない
436デフォルトの名無しさん:2007/04/17(火) 22:39:51
buf = (char *)malloc(sizeof(char *));
まずここがおかしい事に気づくべし。

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

固定長文字列がイヤなら、最初に固定長数値型で文字数を取得しとくべし。
437デフォルトの名無しさん:2007/04/17(火) 22:43:01
sizeof()の結果はコンパイル時にきまるから
動的には求まらないから
438デフォルトの名無しさん:2007/04/17(火) 22:57:28
釣れますか?
439デフォルトの名無しさん:2007/04/17(火) 23:08:24
えさが悪いよ。取り替えなさい。
440デフォルトの名無しさん:2007/04/18(水) 00:12:15
釣りではないんです・・・頭が悪いだけなんです・・・
とりあえず>>435で納得することにしました。新たに問題が・・・

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

サーバー側からメッセージを何回か受信し、受信するたびに改行して表示していきたいのですが、
lstrcatが上手く動作しません。lstrcatというよりもstrcpyの動作をしてるような感じです。
何が原因なのでしょうか?
441デフォルトの名無しさん:2007/04/18(水) 00:22:01
いろいろ言いたいことはあるソースだが、
受信データがヌルターミネートされてないオチとみた。
442デフォルトの名無しさん:2007/04/18(水) 00:49:41
つまり、受信に問題があるという事でしょうか?
443デフォルトの名無しさん:2007/04/18(水) 01:00:10
いや、あなたにはまだネットワーク以前に覚えなければいけないことが多々あるということ
444デフォルトの名無しさん:2007/04/18(水) 01:01:17
GetWindowText(h2 , (PSTR)intxt , 32768);
GetWindowText(h1 , (PSTR)logtxt , 32768);
lstrcat((PSTR)logtxt, "\r\n");
lstrcat((PSTR)logtxt, (PSTR)intxt);
SetWindowText(h1 , (PSTR)logtxt);

とりあえず、エディットのウィンドウを2つ作って、↑のような形でlstrcatをやってみたら、
目的の表示を得ることができました。受信データがヌルターミネートされてない事が原因なら
どうすれば解決するのでしょうか?
445デフォルトの名無しさん:2007/04/18(水) 01:57:09
例えば、素数を解くプログラムみたいなもので、
頭悪いプログラムと、効率化をほどこしたプログラムでは、
計算処理の実行時間が、どれほど違ってくるものか調べてみたいのですが、

その実行時間を調べるには、どうしたら良いのかがわかりません。
環境はLinuxでgccコンパイラを使ってます。 教えてください。
446デフォルトの名無しさん:2007/04/18(水) 02:00:52
>>445
プロファイラを使うのが一番。
gcc関連でプロファイラツールがなんかあったと思うからそれ探してみ。
447デフォルトの名無しさん:2007/04/18(水) 02:03:55
>>444
ヌルターミネートすればいい
448デフォルトの名無しさん:2007/04/18(水) 04:17:19
>>445
int t1 = タイム
・・・
int t2 = タイム
時間 = t2 - t1

ってやってる
1行ソース変えて性能うpしたかどうか程度ならベンピ
449デフォルトの名無しさん:2007/04/18(水) 06:54:40
>>445
つ[rdtsc]

>>448
time()使うなら、difftime()を使うべきかと。
#ま、どうでもいいといえばどうでもいいけど。
450ほんとの初心者:2007/04/18(水) 11:44:16
くだらない事で本当にすいません。VC++6.0、SP6です。

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


#include "stdio.h"

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

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

どう直せばいいのでしょうか。すんませんが教えてください。
よろしくお願いします。
451デフォルトの名無しさん:2007/04/18(水) 11:53:41
「うまくいきません」を説明してください。
452デフォルトの名無しさん:2007/04/18(水) 12:01:10
>>451
あんたなんかむしむし
453デフォルトの名無しさん:2007/04/18(水) 13:09:17
((float*)buffer)[i]
454ほんとの初心者:2007/04/18(水) 13:47:22
>>453
ああ、そうやって書けばいいんですか。ありがとうございました。

本見てもググッても、voidポインタが配列を指し示している例がなかなか
見つからずに困っていました有難う。
455デフォルトの名無しさん:2007/04/18(水) 14:59:47
というか、ふつうは先に
float *buffer = (float*)void_buffer;
とかやると思うけどけどね
456デフォルトの名無しさん:2007/04/18(水) 14:59:54
ポインタがどういうものかが分かっていれば、
別に void ポインタが配列を指していない例からでも
このくらいは分かることだろう。

ここで、なぜそれでうまくいくのか、を深く考えておかないと、
後々また困ることになると思われる。
457デフォルトの名無しさん:2007/04/18(水) 17:39:33
C++でコメントをドキュメント化する際のデファクトスタンダードってなんでしょうか?
C#やJAVAみたいに言語レベルで存在しないので、何がよいか捜してます。
458デフォルトの名無しさん:2007/04/18(水) 17:41:46
有名どころはDoxygenかな
459ほんとの初心者:2007/04/18(水) 18:22:59
>>455-456
追加のアドバイス感謝します。本には配列が初めのアドレスを指すポインタ
だからポインタに配列名を代入してやれば良いとか、いろいろ書いてあって
書いてある事は読めばわかるのですが、まだなかなか応用は利きません。
今回のアドバイスでまた一つ勉強になりました。
460デフォルトの名無しさん:2007/04/18(水) 18:34:28
int a = 10, b = 20;

この2つの変数 a, b の値を一時変数を使わずに相互に
入れ替えるテクニックがあったとおもったけど
どんなんだったっけ?
461デフォルトの名無しさん:2007/04/18(水) 18:35:45
C99の規格書はどこかでダウンロードできませんか?
462デフォルトの名無しさん:2007/04/18(水) 18:42:43
>>460
#define SWAP(a, b) (a += b, b = a - b, a -= b)
でど?
463デフォルトの名無しさん:2007/04/18(水) 18:45:13
>>461
JIS X 3010 : 2003 が ISO/IEC 9899 : 1999 に相当する。
JISC のウェブサイトから入手できるはず。
464デフォルトの名無しさん:2007/04/18(水) 18:47:21
>>460
a ^= b, b ^= a, a ^= b;
465デフォルトの名無しさん:2007/04/18(水) 18:47:37
466デフォルトの名無しさん:2007/04/18(水) 18:48:25
>>461
http://www.jisc.go.jp/
JIS検索→規格番号 X3010
467457:2007/04/18(水) 20:42:33
>>458
DOxygenってJavaDocスタイルなんですね。
ちょっと使いやすいか確認してみます。
468デフォルトの名無しさん:2007/04/18(水) 20:45:40
Doxygen作ったやつは凄いと思う
469460:2007/04/18(水) 21:00:16
>>462
>>464
>>465
アリガd
無理に使う必要はないのね
470デフォルトの名無しさん:2007/04/18(水) 21:48:31
XOpenDisplay()やってなかなか返って来ない時、タイムアウトさせるには
どしたらいいですか?
471デフォルトの名無しさん:2007/04/18(水) 21:53:27
>>465の例は極端すぎだな。
確かにC/C++でswapすることはあまり意味が無い。
だが、8bit程度の超小型マイコンではまだ現役だね。
472デフォルトの名無しさん:2007/04/18(水) 22:35:06
C++の文法についてなんですが
派生クラスで新たに作ったメソッドが基底クラスのプライベート属性にアクセス
できないのがどうも納得いかないというか。

派生クラスに何も書かなければ基底クラスと同じコードを書いたと見なされ、
違う機能だけ書き足せば良い、というのが継承だと解釈していたんですけど、
その解釈でいくとアクセスできる筈な気がして仕方がないです。
引数付きコンストラクタがそのままでは継承されないのもイマイチ意図が
わかりません。
何か根本的な継承の精神を誤解しているんでしょうか?
473デフォルトの名無しさん:2007/04/18(水) 22:41:20
>>472
じゃ、おまいが新しい完璧な言語を作ればいい
474デフォルトの名無しさん:2007/04/18(水) 22:44:24
>>472
そのためのpretectedだ。

protectedなメンバ変数はどの派生クラスでも書き換えられるのだが、
逆に言えばどこから書き換えられているのか把握しづらくなるということで、
実際のところグローバル変数と同様に推奨されていない。
(やるならせめてprotectedなアクセサ書けということだ)
475デフォルトの名無しさん:2007/04/18(水) 22:45:48
>>472
何言ってんだお前?
476475:2007/04/18(水) 22:46:29
ごめん
ちゃうねん
>>473 あてのつもりやってん
>>472 まじごめん
477デフォルトの名無しさん:2007/04/18(水) 23:12:14
そこで
#define private public
ですよ
478デフォルトの名無しさん:2007/04/18(水) 23:14:30
>>474
有難うございます
う〜ん、わかったようなわからないような…継承の設計意図

派生クラスで新たに作ったメソッドが基底クラスの属性の値を
書き換えはしなくても取得したくなることは良く出てきそうな気がして…
(実際にC++でまともに組んだことはまだ無いですが)
479デフォルトの名無しさん:2007/04/18(水) 23:22:56
protectedはテンプレートメソッドやファクトリメソッドといった
デザパタを意識した設計になると自然と出てくる。
abstractや空実装であることも多く、実装クラスに特性を与えるためによく使われる。

でも既存アプリのカスタマ屋さんあたりだと
バグがあったときに直しやすいからprivate禁止だ
という方針を立てる人もいる。
ケースバイケースってことでこれもアリかなと思う。
480デフォルトの名無しさん:2007/04/18(水) 23:50:54
>>472
よくクラスの継承を動物とか哺乳類とか犬に例えたりするけど、
どんな哺乳類だって動物の基本的な性質は変更できないわけで。
481デフォルトの名無しさん:2007/04/19(木) 00:13:02
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3839.cpp
このプログラムをコンパイルするとこんなエラーがでてくるのですが↓

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

どう修正すればいいでしょうか
コンパイラはGCC 4.1、OSはLinuxです
482デフォルトの名無しさん:2007/04/19(木) 00:23:14
>>481
pimage[y][x]と書こうとしても、pimageが只のunsigned charへのポインタなのでできない。
幅も関数に渡して、pimage[y * width + x]とすればいい。
483デフォルトの名無しさん:2007/04/19(木) 00:24:19
もし毎回書くのが嫌なら、static int offset(int x, int y, int width) {return y * width + x;}でも用意しておけばいい。
484デフォルトの名無しさん:2007/04/19(木) 00:36:19
>>482-483
そういうことなんですか
ありがとうございます
485デフォルトの名無しさん:2007/04/19(木) 01:12:35
VC++6.0(WTL7)にて。
COMオブジェクトを作成して使いたいんだが、方法が全くわからん。
DLLはregsvr32済みだとして、文字列かGUIDでインスタンスを生成したい。
参考サイトでもいいので教えてエロい人><
486481:2007/04/19(木) 08:08:39
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3840.cpp
直して途中にベクトルの成分を出力するルーチンを追加しました。
コンパイルの通るものができたのですが、

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

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

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

こんな感じの結果を出したいのですが、どう修正すればよいのでしょうか?
487デフォルトの名無しさん:2007/04/19(木) 08:13:02
> fprintf(fp,"%c ",vect[i].data[j]);
< fprintf(fp,"%d ",vect[i].data[j]);

違ったら済まん。
488481:2007/04/19(木) 08:21:24
>>481
サンクスです。

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

の中身は

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

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

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

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


/* 4*4の画素ごとにブロック分割し、データを列ベクトル化する */
int convert_vector_space(Vector *vect,int offx,int offy,unsigned char *pimage){
int i,j;
vect->x_start = offx;
vect->y_start = offy;
for(j=0; j<4; j++){
for(i=0; i<4; i++){
vect->data[4*j+i] = pimage[(offy+j)*XLENG+(offx+i)];
}
}
return 0;
}
490デフォルトの名無しさん:2007/04/19(木) 10:48:28
>>485
C/C++と関係ないのでスレ違い
491デフォルトの名無しさん:2007/04/19(木) 12:51:15
>>490
スレ違いじゃねぇだろ
単純にCOMサーバ使うコーディングが分からないんだろ

>>485
#import でググれ
492デフォルトの名無しさん:2007/04/19(木) 21:25:54
>>491
#importだとGoogleは#を無視してくれるので悲惨なことになる。
493デフォルトの名無しさん:2007/04/20(金) 14:44:09
環境はVC6です。
ウィンドウのメッセージループ中でクラスを使用したい。
ボタンクリックでクラスのメンバー変数の値を変化させ、画面を閉じる際にそのメンバー変数の値により
処理を振り分ける。

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

どういうふうに書けばいいのでしょうか?
アドバイスお願いします。
494デフォルトの名無しさん:2007/04/20(金) 14:48:02
は?
頻繁に呼ばれるって
ループ中で宣言しなけりゃいいだけだろ・・・
495デフォルトの名無しさん:2007/04/20(金) 14:57:38
フォームのメンバオブジェクトとしてそのクラス(A)を宣言し
メッセージ処理部分でAのメソッドを呼ばせるようにして
そいつから処理させればいいんじゃないの?
496デフォルトの名無しさん:2007/04/20(金) 20:14:08
>>493
まずはWindowsアプリがどんな構造を持っているか、そもそもクラスとは何なのか理解するべき。
MFCを使わずに開発しているとしても話は全く変わらないから、
とりあえずメインウィンドウをクラスとして書き出してみ。
497デフォルトの名無しさん:2007/04/21(土) 00:57:44
>>492
com import イベント でぐぐったら悲惨な目に会った経験があるぞw
498デフォルトの名無しさん:2007/04/21(土) 11:48:44
標準入力に関しての質問です。例えば名字と名前を別に入力させて表示したい場合、以
下のコードを考えました。

char s[NUM];

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

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

入力文字数がNUMを下回っていれば想定どおりの結果になるのですが、オーバーフローす
ると残りの分がストリームに残り、それが2回目のfgets()に渡ってしまいます。このよ
うな場合、一端ストリームをクリアするのが定石でしょうか?あるいは他に良く使われ
る方法があるのでしょうか?
499デフォルトの名無しさん:2007/04/21(土) 12:12:51
>>498
NUMが1024なら、1500文字打ったとき?

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

こんなかな?
超えたら2回動く
テキストファイル読むときは、↑みたいな感じで書いた
500デフォルトの名無しさん:2007/04/21(土) 14:21:02
沖縄県の方へ(命に関わる注意事項です)

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

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

今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。
501やっぱ名無しにすべきですか?:2007/04/21(土) 14:23:34
えっと、asmキーワードの意味を教えていただきたいです。
502デフォルトの名無しさん:2007/04/21(土) 14:27:33
>>498
fgets()の代わりにこんなラッパーでも使えば?
>>498のように、行にN文字以上入力された場合
残りを切り捨てたいというケースにしか使えないが。

char *xfgets(char *s, size_t n, FILE *f)
{
    char *p;
    int c;
    if (!fgets(s, n, f))
        return 0;
    if ((p = strchr(s, '\n')))
        *p = 0;
    else
        while ((c = getchar()) != EOF && c != '\n')
            ;
    return s;
}
503デフォルトの名無しさん:2007/04/21(土) 14:36:34
構造体にクラスを入れられるのは規制して欲しいな。
うっかりゼロクリアしてることに気づかないとか悲しいことが未だにある。
構造体はデフォルトがパブリックなクラスであるって考えはヤバイ。
504デフォルトの名無しさん:2007/04/21(土) 14:44:51
>>501
環境が分からんのでなんとも
505デフォルトの名無しさん:2007/04/21(土) 14:50:56
asmキーワードは、以後のブロックの中身が、
インラインアセンブリ言語での記述であることを示す。
506498:2007/04/21(土) 16:28:22
>>499 >>502
回答ありがとうございます

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

あと、関数の型がポインタなら、"return 0"ではなく"return NULL"の方が
自然だと思ったのですが、この書き方でもいいのでしょうか?
507デフォルトの名無しさん:2007/04/21(土) 16:54:03
>503
>構造体にクラスを入れられるのは規制して欲しいな。

structのメンバとしてclass変数を指定することを言っている?
そんなのstructを使わなきゃいいじゃん。
structが残っているのはC/C++のコード流用性のためだけにあるものだと思うけど。
classの中にstructメンバが入るのはあり得るとして新規にstructを定義して
classメンバを入らなきゃならない状況ってあるか?
CのコードをC++として流用する場合ならpublicになってなきゃつじつまが合わなくなると思ぞ。
508デフォルトの名無しさん:2007/04/21(土) 16:55:50
>>507
他の人が作った struct を使う場合の話じゃね
509デフォルトの名無しさん:2007/04/21(土) 16:56:03
>>506
ポインタが必要な場面に現れた0は、ヌルポインタとして扱われる。
510502:2007/04/21(土) 17:07:17
あーすまん、>>502だがちと修正。
- while ((c = getchar()) != EOF && c != '\n')
+ while ((c = getc(f)) != EOF && c != '\n')
511デフォルトの名無しさん:2007/04/21(土) 17:12:28
CからC++ではなく、OO系言語からC++なら
std::stringとかメンバにする人もちらほらいるかと。
512498:2007/04/21(土) 17:38:07
>>509
それは理解していますが、可読性という意味ではNULLの方が上かな、
と思いまして。というのも、私が一瞬理解できなかったからです。
未熟と言われればそれまでですが。

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

で、当人曰く、「memset()できないなら危なくて使えないな」という間抜けっぷり。
514デフォルトの名無しさん:2007/04/21(土) 19:01:39
= { 0 }; で初期化すればゼロクリアになるけど、
コンパイラによっては警告が出て鬱陶しいんだよな。
515デフォルトの名無しさん:2007/04/21(土) 19:10:20
そこでboost::value_initializedですよ
516デフォルトの名無しさん:2007/04/21(土) 19:13:05
>>513
なんでダメなんだっけ?
517デフォルトの名無しさん:2007/04/21(土) 19:23:14
>>516
多分、内部でSysAllocStringを呼んでるのでわ?
CStringを0でセットすると取得した領域がゾンビになるのでわ?
518デフォルトの名無しさん:2007/04/21(土) 19:28:06
>>517
すまん。構造体の方。
いっつもゼロ埋めしてるんだけど、これがまずいなら
オレは今から全裸でコンビニに行かねばならん。
519デフォルトの名無しさん:2007/04/21(土) 19:31:52
>>518
する理由は?
百害あって一利なしなのだが。
#これから食事なので、百害の詳細については後程。
520デフォルトの名無しさん:2007/04/21(土) 19:43:22
そら言い過ぎ
521518:2007/04/21(土) 19:44:43
>>519
自分で構造体を使うとき、誕生時に全ての要素がゼロであるような
使い方というか設計をしてるから。
他人のライブラリのときは、どうでもいいけど保険でゼロ梅してる。

とりあえず、もう服は全部畳んだ。
522デフォルトの名無しさん:2007/04/21(土) 19:51:47
WinAPI に渡す専用の構造体とかは、memset で 0 クリアすることが多いな
ZeroMemory だけど
523デフォルトの名無しさん:2007/04/21(土) 20:03:31
初期化構文使って
struct Foo foo = { 0 };
で済ますほうが簡潔な上に、ポインタや浮動小数点数等もよろしくやってくれるな。
まーPODを単にビット的にゼロフィルすれば良いと分かっているケースでは
memset()/bzero()/ZeroMemory()の類でもいいんでないの。
524デフォルトの名無しさん:2007/04/21(土) 20:03:45
>>516
非PODでは、仮想関数テーブルなどソースコード上にないメンバが存在する可能性がある。
また、浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていないので、
PODでもmemsetでの0クリアはするな(初期化子でならOK)といわれる所以。
525518:2007/04/21(土) 20:06:10
>>524
>浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていない
あ、そうだった! なるほど・・・うかつであった。
以後気をつけます。

ではこのままコンビニに行ってきます。
526デフォルトの名無しさん:2007/04/21(土) 20:35:57
>>522
つーかWinにおけるMS定義の構造体はMS自身がサンプルコードやらでZeroMemoryしてるしなぁ
まぁ、他環境への移植性を考慮するなら安易なmemsetはヤメテオケってことかと
527デフォルトの名無しさん:2007/04/21(土) 21:04:08
他の部分でバリバリ環境依存なコードを書いてる状態なら、
構造体の部分だけ移植性気にしてもしゃーないわな。
528デフォルトの名無しさん:2007/04/21(土) 21:04:42
MSつーかVisualStudioでも、Debugビルドで折角ローカルなオブジェクトは異常値を埋めてくれているのに
それをわざわざ無にしてバグの発見を遅らせることになりかねないね。
529デフォルトの名無しさん:2007/04/21(土) 21:09:14
>>528
VisualStudioの動作する環境で0クリが問題になるのか?
vtbl壊してたらどっちみち動かないだろ?ん?
530デフォルトの名無しさん:2007/04/21(土) 21:38:13
コンビニから帰ってきました。 今日はなんかスースーしてて寒いね。

いまさら環境依存とかいっても、実際ヌルポインタが0じゃない環境って
冷静に考えたらまず無いよね。浮動小数点も。
ま、そーゆーアーキテクチャが現存してるなら、それに携わるときだけ
気をつければいっか。
531デフォルトの名無しさん:2007/04/21(土) 21:42:59
スースーしてて寒いのか
こっちゃ蒸し暑いぜ
532デフォルトの名無しさん:2007/04/21(土) 22:45:07
俺は金○を広げながら書いてます。
>>528
意味分からない。
533デフォルトの名無しさん:2007/04/21(土) 22:47:00
別に 0 クリアは、異常値を無にしてるんじゃなくて
必要な値として 0 を入れてるんだろ?
534デフォルトの名無しさん:2007/04/21(土) 22:59:21
>>533
それが本来あるべき姿なのだが、
現実には>>513のようにとりあえず常に0クリアするという奴が後を絶たない。
535デフォルトの名無しさん:2007/04/21(土) 23:21:47
宣言時に入る異常値なんて必要無いし
536デフォルトの名無しさん:2007/04/21(土) 23:36:04
わざわざクリアされて作られた0値だって必要ない
537デフォルトの名無しさん:2007/04/21(土) 23:50:55
0クリアに頼らずに自前でオブジェクトイニシャライザ用意しとけと言う事か
538デフォルトの名無しさん:2007/04/21(土) 23:51:41
つまり構造体にはコンストラクタを設けろと。
539デフォルトの名無しさん:2007/04/21(土) 23:54:36
そして資源の漏れを防ぐためにデストラクタも設けろと
でRAII来たこれ
540デフォルトの名無しさん:2007/04/22(日) 00:08:35
そうしてクラスが出来上がっていく…
541デフォルトの名無しさん:2007/04/22(日) 00:09:22
ぶっちゃけC++にもBeanって言葉を導入してもいいかもなw
542デフォルトの名無しさん:2007/04/22(日) 01:28:44
データ構造とアルゴリズムの基本的なことを学ぶのに適した本を教えて下さい
543542:2007/04/22(日) 01:30:25
すみません、書き忘れました。C言語です
544デフォルトの名無しさん:2007/04/22(日) 01:50:42
>>539
そこまでするならクラスにしろよ、ってな話だな。
545デフォルトの名無しさん:2007/04/22(日) 03:59:03
VC++でウィンドウを表示して、その中でFLASHを再生したいのですが
どうすれば実現できるでしょうか
546デフォルトの名無しさん:2007/04/22(日) 04:00:27
>>545
IShockwaveFlash
547デフォルトの名無しさん:2007/04/22(日) 04:07:22
COM勉強してきます…orz
548デフォルトの名無しさん:2007/04/22(日) 04:31:42
>>538
つか、構造体は関数のない方がいいでしょ
使うときは通信とかの場合だし
32バイト単位とかで切ったりするんでしょ

>>542
C++じゃなく、C言語かね、理系?
30年前の凄い有名な本あるけど、・・・古い
Cアルゴリズム大百科、みたいなのがオススメ
中に、クイックソート、挿入ソート・・・、ニュートン法、ガウス・・・
とか載ってるヤツ
549デフォルトの名無しさん:2007/04/22(日) 09:33:28
WIN32の構造体だけはゼロクリアでいいと思うけどな。
MSがそういう使い方を推奨している以上そう使うのがどおり。
基本的にライブラリの実装者のやり方に合わせる。
それ以外ではいろいろ問題ありだから使わないけどね。
550デフォルトの名無しさん:2007/04/22(日) 09:43:09
「道理」(どうり)
「通り」(どおり)
551デフォルトの名無しさん:2007/04/22(日) 11:14:29
Win32の構造体は、いつもHOGE hoge = {sizeof hoge};で初期化している
552デフォルトの名無しさん:2007/04/22(日) 11:33:55
漏れは毎回毎回、menset か setmen で悩む
553デフォルトの名無しさん:2007/04/22(日) 11:46:24
構造体の初期化は
HOGE hoge = {0};がデフォ
554デフォルトの名無しさん:2007/04/22(日) 11:54:00
>>552
メーン、memはmenじゃないぜ〜
555デフォルトの名無しさん:2007/04/22(日) 12:11:11
要するに、アレだよな。

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

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

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

#C++だって、わざわざ初期化リストを設けてるし(C++ならstructでも使えるよ)
556デフォルトの名無しさん:2007/04/22(日) 12:13:03
>>552 setmenって、男にナニをセットするんだ?
気になって気になって今日は良く寝れそうだ。
557デフォルトの名無しさん:2007/04/22(日) 12:57:38
setmenは男に何かをセットするんじゃなくて「セットする男達」だろ
常識的に考えて・・・
558デフォルトの名無しさん:2007/04/22(日) 13:02:20
YO! MEN!
いや、setmen は男を何かにセットする関数だろ
常識的に考えて・・・
559デフォルトの名無しさん:2007/04/22(日) 13:10:18
男の部分を何かにセットするわけか

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

>>552
strcpy, strcat, strchr とか文字列に関するものは str が接頭辞になってる。
同じく、memset, memcpy, memmove とかメモリに関するものは mem が接頭辞になってる。
悩む必要性は無い。
561デフォルトの名無しさん:2007/04/22(日) 13:35:11
頻繁に使う構造体なら継承してコンストラクタ定義してしまえってじっちゃんが
562デフォルトの名無しさん:2007/04/22(日) 13:44:51
レガシーAPIに渡せないだろ
563デフォルトの名無しさん:2007/04/22(日) 13:49:12
こっちで変数定義したものを向こうへ渡すのなら、
アップキャスト(ポインタ・参照渡し)・スライシング(値渡し)が起こるだけで、
言語規格上問題ないだろ。

向こうでオブジェクトが作成され、自分はそれへのポインタを受け取るという場合に
派生クラスへのポインタで受けたら、言語規格上未定義にはなるだろうけどさ。
564552:2007/04/22(日) 15:30:50
>>560
そうなのか、memが初めなのか

脳内では、セット麺、麺セット、麺コピーって変換してた
565デフォルトの名無しさん:2007/04/22(日) 16:13:33
>>562
VC++ の CRect は RECT を継承したクラスなんだぜ。
でも、レガシーAPIに渡せるだろ?
仮想関数がないからな。
566デフォルトの名無しさん:2007/04/22(日) 16:25:18
>>565
仮装関数は関係ないだろ
567デフォルトの名無しさん:2007/04/22(日) 16:25:32
>>565
ちゃうちゃう。
CRectはRECTを継承してない。内部の最初に保持してるだけ。
is-aじゃなくてhas-aの関係
同様の方法でWinAPI32に引き渡せるMFCクラスあるでよ。
568デフォルトの名無しさん:2007/04/22(日) 16:27:37
>>567
CRectはRECTを継承しているよ
569567:2007/04/22(日) 16:29:52
>>565
ああ、ゴメン俺のまちがいだった。RECTの継承でよかったわ。
570デフォルトの名無しさん:2007/04/22(日) 17:34:42
レガシーAPIに渡せるってわざわざ自分で&付けてるのかよwwww
変換演算子あるんだから使えよカスwwwwww
571デフォルトの名無しさん:2007/04/22(日) 18:06:24
( ´д)ヒソ(´д`)ヒソ(д` )
572デフォルトの名無しさん:2007/04/22(日) 18:06:58
>>566
ああ、そうだ。関係なかった。すまん。
573デフォルトの名無しさん:2007/04/22(日) 18:24:12
構造体をmallocしたときは初期化はどうしたらいい?
1.気にせずmemset
2.最近のmallocはゼロクリア保障なのでそれを信じる
3.地味に全部真面目に設定
574デフォルトの名無しさん:2007/04/22(日) 18:32:22
>>573
Cなんだよな。
1.自作の構造体で間違いないのならおk
2.保証されてるかどうかちゃんとCユーザーズマニュアルを見れ
3.一番安全
575デフォルトの名無しさん:2007/04/22(日) 18:32:32
一方ロシアはcallocを使った
576デフォルトの名無しさん:2007/04/22(日) 18:32:57
> 最近のmallocはゼロクリア保障
大嘘を付くな
577デフォルトの名無しさん:2007/04/22(日) 18:41:35
>>576
え、いや、ウソじゃないです。ごめんなさい。うそじゃないです。
578デフォルトの名無しさん:2007/04/22(日) 18:55:40
>>573
>最近のmallocはゼロクリア保障なのでそれを信じる
ってホントなの?どういう環境での話?

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

すぐに死ぬけど
579デフォルトの名無しさん:2007/04/22(日) 19:05:37
0 クリア保証してるのは calloc だろ。
580デフォルトの名無しさん:2007/04/22(日) 20:38:22
VC++2005で見た限りはvirtual関数があるとサイズが増えてるね。
#include <stdio.h>
struct TEST1 { int x; int y; };
struct TEST2 { int x; int y; void setXY(int x, int y) { this->x = x; this->y = y; }};
struct TEST3 { int x; int y; virtual void setXY(int x, int y) { this->x = x; this->y = y; }};
int main() { printf("%d %d %d\n", sizeof(TEST1), sizeof(TEST2), sizeof(TEST3));  return 0; }
結果
8 8 12
581デフォルトの名無しさん:2007/04/22(日) 21:05:10
>580
だから?
582デフォルトの名無しさん:2007/04/22(日) 21:30:50
>>580
でも、こういうことは問題ないはず。

void proc(TEST1*);

void f()
{
  TEST3 t;
  proc(&t);
}
583デフォルトの名無しさん:2007/04/22(日) 21:33:39
#include <stdio.h>
#include <math.h>
int main(void)
{
double hoge = 9.0;
printf("%f\n", sqrt(hoge));
return 0;
}

WinのVisualStudioだと何事もなく、普通にコンパイルできるのですが
Linuxのgccコンパイラだと警告がでて、コンパイル出来ません。 
エラーメッセージは↓
 $gcc -Wall -o test test.c
 /tmp/ccppfSqM.o : ln function 'main':
 test.c:(.text+0x35): undefined reference to 'sqrt'
 collect2: ldはステータス 1 で終了しました

誰か理由がわかる方、いらっしゃいますでしょうか?
584デフォルトの名無しさん:2007/04/22(日) 21:34:36
問題あるって。TEST1とTEST3には親子関係無い上に、
大体のところ、vtblはメモリ領域の先頭に付くんだから。
585デフォルトの名無しさん:2007/04/22(日) 21:35:32
>583
FAQすぎるFAQだな。
-lm
586デフォルトの名無しさん:2007/04/22(日) 21:35:41
-lm
libmをリンクしろ
587デフォルトの名無しさん:2007/04/22(日) 21:40:36
>>584
すまん、TEST1-TEST3は継承関係があると勝手に思い込んでいたorz
588デフォルトの名無しさん:2007/04/22(日) 21:44:18
>>585-586
ありがとうございました。 一瞬でできました orz
GCCは最近使いだしたので、イマイチわかってなかったんです。

精進します orz
589デフォルトの名無しさん:2007/04/22(日) 22:04:18
545です。
とりあえず表示は調べてできるようになりました。

ATL+COM、だと思います。
で、実行中のFLASHを右クリックしてもポップアップがでないようにしたいのですが、
どうすれば可能でしょうか?
590デフォルトの名無しさん:2007/04/22(日) 22:35:24
>>589
flashの方で禁止すればいいだろ。
591デフォルトの名無しさん:2007/04/22(日) 22:38:48
あ。

そこは作り手任せでいいのか。
592デフォルトの名無しさん:2007/04/23(月) 00:29:18
Modern C++ Design に挑戦しようと思っているのですが、
11ページ目にあるコードの

template <template <class> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget>
{
...
void DoSomething()
{
Gadget* pW = CreationPolicy<Gadget>().Create();
}
};

CreationPolicy<Gadget>().Create();
のようにクラス名の後に括弧が置かれているのは何を表しているのでしょうか?
593デフォルトの名無しさん:2007/04/23(月) 00:36:17
インスタンスを生成しているだけ
594デフォルトの名無しさん:2007/04/23(月) 00:43:14
>>593
クラス名の後ろに括弧を置くと、無名インスタンスが
作成されるということなんでしょうか?
595デフォルトの名無しさん:2007/04/23(月) 00:47:51
>>594
コンストラクタを呼んでいる。
クラス名が書かれているという見慣れない構文だと考えるのではなく、
ただの関数呼び出しがされているだけ。
596デフォルトの名無しさん:2007/04/23(月) 00:57:26
>>595
コンストラクタのあとに.Create()が付いているのはどういうことなんでしょうか?
コンストラクタは返り値を持たないので、返り値に対してメソッドを呼ぶことはできない
と思うんですが・・・
597デフォルトの名無しさん:2007/04/23(月) 01:09:43
作成された一時オブジェクトに対するメンバアクセス
598デフォルトの名無しさん:2007/04/23(月) 01:18:12
>>597
コンストラクタを直接呼び出せるとか、そういったマニアックな構文の情報が
載っているWebサイトか本はないでしょうか?
これから先も見慣れない構文がどんどん出てきそうなので・・・
599デフォルトの名無しさん:2007/04/23(月) 01:25:35
いやこれマニアックってレベルじゃねーぞ
600デフォルトの名無しさん:2007/04/23(月) 01:26:11
コンストラクタを直接呼び出すのは標準には無かったような。
まあ規格書でも買っとけ。
601デフォルトの名無しさん:2007/04/23(月) 01:31:57
>>600
手元にあるプログラミング言語C++第三版にもコンストラクタを直接呼び出す
云々の説明がないので気になってました。(そもそもテンプレートの型指定に
テンプレートを使ってる時点で既にマニアックですね)
602デフォルトの名無しさん:2007/04/23(月) 01:39:31
var=var++;
の実装依存にならざるを得ない問題について詳しく知りたいのですが、
なんて検索すればいいんでしょうか。
603デフォルトの名無しさん:2007/04/23(月) 01:41:10
>>600
いやコンストラクタを直接呼び出すなんて大げさな表現だが、
実態はただの一時オブジェクト作成だろ。
604デフォルトの名無しさん:2007/04/23(月) 01:42:47
"demons fly out of your nose"
605デフォルトの名無しさん:2007/04/23(月) 01:49:11
>>602 シーケンスポイント 未定義動作
606デフォルトの名無しさん:2007/04/23(月) 01:49:41
607デフォルトの名無しさん:2007/04/23(月) 01:51:37
>>606
君は何を言っているんだね?
少々落ち着きたまえ
608デフォルトの名無しさん:2007/04/23(月) 01:56:12
>>605
ありがとろう
609デフォルトの名無しさん:2007/04/23(月) 01:59:55
副作用完了点で調べてもいいな
610デフォルトの名無しさん:2007/04/23(月) 08:34:57
i=i++;って、いつになったら不定じゃなくなるの?
611デフォルトの名無しさん:2007/04/23(月) 08:37:09
i=i++;の動作が定まったところで誰が喜ぶのか
612デフォルトの名無しさん:2007/04/23(月) 08:45:45
不定だ未定義だって言ってるのが全て定まったらみんな喜ぶ。
613デフォルトの名無しさん:2007/04/23(月) 09:14:31
何%が喜ぶかは未定義なので、みんなが喜ぶという前提で書かれた文章は
異なるプラットフォーム(同じ信仰を持たない人相手)では意図した通りに動作しない可能性があります。
614デフォルトの名無しさん:2007/04/23(月) 09:31:46
決まって困る香具師はそれほどいないだろ。
コンパイラベンダも最適化オプション間で同じ動きをするようにわざわざ調整するくらいなんだから。
615デフォルトの名無しさん:2007/04/23(月) 09:54:04
i=i++;ってどういうときに使うの?
++演算子を変なオーバーロードしててその副作用が欲しい時?
まだ始めたばっかだからであった事無いけど、
そのうちそんなややこしいことし無けりゃならないような設計をせざるを得ないような状況って出てくるの?
616デフォルトの名無しさん:2007/04/23(月) 10:26:25
これを「しなきゃならない」状況はたぶん無いと思う・・・
617デフォルトの名無しさん:2007/04/23(月) 10:27:04
出てこないのでどーでもいい
618デフォルトの名無しさん:2007/04/23(月) 11:02:10
とりあえずコンパイルエラーになって欲しいな。
619デフォルトの名無しさん:2007/04/23(月) 17:14:50
i=i++;
は単なる例え。
a[i]=i++;
でもいい。
620デフォルトの名無しさん:2007/04/23(月) 18:00:22
621デフォルトの名無しさん:2007/04/23(月) 18:25:52
そんな1文にしなくても。
どうせ最適化してくれるよ。
622デフォルトの名無しさん:2007/04/23(月) 19:37:49
>>601
つ 10.4.10 一時オブジェクト

一時オブジェクトは、コンストラクタを明示的に起動することによっても作成される。
623デフォルトの名無しさん:2007/04/24(火) 01:27:27
クラス定義を全てヘッダファイルに書いてはいけないのでしょうか?
本来メンバ関数は実装ファイルに書くことになってますが、
ソースが二カ所に分かれるのは明らかに扱いにくいし、保守性が悪そうなのです。
関数の入出力は宣言として書く必要がありますし。

もっともそうすると、main以外はクラスのメンバとしているため、
実装ファイルに書くことが無くなってしまうわけですが。
624デフォルトの名無しさん:2007/04/24(火) 01:49:05
>>623
普通CやC++のオブジェクトファイルははソーステキストの
変更の有無で再コンパイルするかどうか決まるので、
>>623をやってしまうとそのクラスの実装を少しいじるだけで
関係するすべてのソースを再コンパイルする必要が出てくる。
小規模プロジェクトならまったく問題ない
625デフォルトの名無しさん:2007/04/24(火) 08:07:48
話はそれるけどクラステンプレートは事実上ヘッダに全て書かざるを得ない
626デフォルトの名無しさん:2007/04/24(火) 08:15:10
ある程度でっかいの作る時は
1クラス1ソース&ヘッダぐらいに分割するべきなんでしょうかね?
なんかプロジェクトフォルダのファイル数が1000超えてるんですが
627デフォルトの名無しさん:2007/04/24(火) 08:15:29
>>625
WTLとか全部ヘッダだよね
628デフォルトの名無しさん:2007/04/24(火) 08:18:49
>>626
1ソースに限定される規定は無い
1クラスが2ソース使ってようが3ソース使ってようが関係無い
そしてファイルを分けるとともにフォルダも分けることを考えなさい
629デフォルトの名無しさん:2007/04/24(火) 08:20:44
むしろ別プロジェクトにしてダイナミックリンクするようにする!
630デフォルトの名無しさん:2007/04/24(火) 08:36:59
>>626
・・・て、1クラス=2、3ファイル!?
基本、クラス名=ファイル名で、1クラス=1ファイルにしてる
あとフォルダと、分割も
ソース入り乱れてヤバくならない?
631デフォルトの名無しさん:2007/04/24(火) 08:42:34
>>629
別にダイナミックリンクしなくても、
スタティックライブラリ作って
スタティックリンクでいいじゃん。
632デフォルトの名無しさん:2007/04/24(火) 08:46:19
DLLもどうにかならんかな
確かに便利だが、ぐちゃぐちゃになるよね
633デフォルトの名無しさん:2007/04/24(火) 15:05:51
>>345
ならなかったんですよね。
って返事遅れました。スマソ。

C++FAQなんですが、意味不明な訳とこういう
コンパイルエラーなコード以外は結構いい本っぽいんですけどね。
634デフォルトの名無しさん:2007/04/24(火) 19:50:42
>>630
数値計算パートは分けたりしてるな
635デフォルトの名無しさん:2007/04/24(火) 20:08:04
プレゼンテーション層と機能層とデータ層みたいな分離は
それぞれ別ライブラリにして分離すればいいのかな?
636デフォルトの名無しさん:2007/04/24(火) 20:38:05
ASCIIコードで規定されていない文字(日本語とか)を
書式指定で表示したい場合ってどうするんですか?
637デフォルトの名無しさん:2007/04/24(火) 20:40:33
ワイド文字を使う場合は %lc や %ls を使えばいい。
そうでない場合は、使ってる処理系のマニュアルを読んでくれ。
638デフォルトの名無しさん:2007/04/24(火) 20:40:53
別にどうってことはない。何も変わらない。
マルチバイト文字を%cで出力しようとかそういう無理なことをしようとしない限り。
639デフォルトの名無しさん:2007/04/24(火) 20:52:51
>>637-638
トンです。
初心者ですまないのですが、
C言語で文字形態を全部2バイトのワイド文字にするのってどうするんですか?
そのまま書いたら'a'は1バイトで'あ'は2バイトですよね。
640デフォルトの名無しさん:2007/04/24(火) 21:02:59
Cなら文字リテラルはint型だから 'a' も 'あ' も sizeof(int) バイト(尤も後者は期待通りのものではないが)
ワイド文字が欲しければ L'a' や L'あ' と書く(ワイド文字リテラルは wint_t 型)
641デフォルトの名無しさん:2007/04/24(火) 21:04:26
'あ'は2バイトかもしれないが、ワイド文字ではない。
C/C++でのワイド文字リテラルはL'あ'のようにLを前置したもの。
同様にワイド文字列リテラルがL"いろは"という風に存在する。

このワイド文字はwchar_t型になるが、sizeof (wchar_t) == 2とは限らない。
UCS-4を採用して4になっている環境もある。

ワイド文字(列)・マルチバイト文字(列)の相互変換する
Cの関数はwctomb, wcstombs, mbtowc, mbstowcs。
C++もロケールと関連して同様のものがある。
642デフォルトの名無しさん:2007/04/24(火) 21:08:16
L"Σ(;´Д`)<オ、オマエモナー!"

のエンコーディングって成功したりしなかったりしない?
ソースがSJISでVCだとうまくいったけど、
cygwin環境でコンパイルしたら失敗したorz
643デフォルトの名無しさん:2007/04/24(火) 21:09:49
cygwinだからね
644デフォルトの名無しさん:2007/04/24(火) 21:10:01
>>642
--input-charset=CP932 --exec-charset=CP932
645デフォルトの名無しさん:2007/04/24(火) 21:23:37
>>642
cygwinはlocaleまわりが糞でmbstowcs()等が使い物にならんから諦めろ。
ワイド文字リテラル自体はiconvを扱えるバージョンのgccなら
charset指定すれば大丈夫だが、libcが腐っているのでは仕方が無い。
646デフォルトの名無しさん:2007/04/24(火) 21:41:30
とりあえずwin32のDir::openをUTF8対応にしてみて成功したが、
その後、ruby1.8は肝心のファイル作成がfopen経由なのを忘れてた。
wfopenはライブラリが頼りなさげなので、これでは片手オチなのでボツ。
1.9追いかけてみるか・・・
647623:2007/04/24(火) 21:42:28
>>624
ありがとうございます。
そういうことであれば、ヘッダにクラスを実装する方向で考えます。
648デフォルトの名無しさん:2007/04/24(火) 21:44:07
>>640-641
ありがとうございます!
基本的なことっぽいのに初心者用の本にその辺のことが書いてなかったので
非常に助かりました!
649デフォルトの名無しさん:2007/04/24(火) 23:11:21
>>644
ありがとうございます。
--input-charsetとか知らなかったです。

>>643
>>645
cygwin環境が根本的におかしいのですね^^
解説ありがとうございました。
650デフォルトの名無しさん:2007/04/24(火) 23:44:23
ソケットとWin32APIでチャットのプログラムを作っているのですが、
一人がウィンドウを閉じたら、全員の接続が切れてしまいます。

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

上がクライアント側のソースで、下がサーバ側のソースです。
原因が全然分からなくてもうどうしたらいいノアふえjjrじえgとわあえrたおえjら
651デフォルトの名無しさん:2007/04/24(火) 23:52:43
recv_serverでWSACleanupしてるから。
recvがSOCKET_ERRORを戻すと、Winsockが
やる気なくして全部のソケットが死ぬ。
652デフォルトの名無しさん:2007/04/24(火) 23:59:13
>>651
ありがとおおございます!
WSACleanup()をWM_DESTOROYの所に移したら正常に動作しました!
3時間の悩みが8分で解決するとは・・・
653デフォルトの名無しさん:2007/04/24(火) 23:59:42
さすがにスレ違いすぎやしないか?
654デフォルトの名無しさん:2007/04/25(水) 00:12:41
>>653
winsock関係の質問スレッドがなくてここで質問させてもらいました・・・
Cっぽい香りもほのかにするので、許してもらえると思いました・・・
655デフォルトの名無しさん:2007/04/25(水) 00:16:37
まーただしくはここなんだろうけど、大目にみようや。

ネットワークプログラミング相談室 Port19
http://pc11.2ch.net/test/read.cgi/tech/1171029896/l50
656デフォルトの名無しさん:2007/04/25(水) 00:29:57
ソケットとかWinsockで検索してたので・・・orz
誘導ありがとうございます!
657デフォルトの名無しさん:2007/04/25(水) 01:11:16
下記のようなソースをbccでコンパイルすると、
「警告 W8004 X:\data\src\Test.cpp 11: 'test' に代入した値は使われていない(関数 main() )」
という警告がでます。delete文を生かせば警告は出ません。
警告の内容が合っていないような気がするのですが、
これでいいのでしょうか?

#include<iostream>
class Test {
 public:
 Test() {}
 ~Test() {}
 void func() { std::cout << 12345 << std::endl; }
};
void main() {
 Test *test = new Test();
 test->func();
//delete test;
}
658デフォルトの名無しさん:2007/04/25(水) 01:13:58
>>657
BCC5.8.2では警告出ないよ。
多分古いBCCのバグだね。
659デフォルトの名無しさん:2007/04/25(水) 01:14:18
inlineが先に働いてるとか?なんて適当なこと言ってみる。
660デフォルトの名無しさん:2007/04/25(水) 01:34:06
最新版では直ってるかもしれんけど、bcc はインライン展開や最適化の結果で
使われなくなった変数・オブジェクトに対して使われてないっていう警告を出すよ。
661657:2007/04/25(水) 01:47:41
>>658-550
回答有難うございます。
bccはBorlandからフリーダウンロードできる5.5.1です。
かなり古い物ですね。

原因はインライン展開の結果、
使われないと判断されたということのようですね。
今のところ実害は無いので、気にしないことにします。
警告は全部潰したいのだけど・・・。
662657:2007/04/25(水) 01:50:14
すいません、アンカーミス。
>>658-660でした・・・。
663デフォルトの名無しさん:2007/04/26(木) 20:00:14
ちょっと質問なんですが、メンバイニシャライザを使った場合は文字通り「初期化」であって
「代入」ではないってことで良いんですか?
664デフォルトの名無しさん:2007/04/26(木) 20:10:11
そう
665デフォルトの名無しさん:2007/04/26(木) 20:25:40
>>664
分かりました。有難うございます。
666デフォルトの名無しさん:2007/04/26(木) 20:40:59
ファイルポインタaからnバイト読み込んで、ファイルポインタbにそのまま書き込む標準的な関数はありますか?
667デフォルトの名無しさん:2007/04/26(木) 20:45:58
fgets/fputsで何の不満がある
668デフォルトの名無しさん:2007/04/26(木) 20:49:39
バッファを確保するのが苦痛なんです。
669デフォルトの名無しさん:2007/04/26(木) 20:53:59
#define fthru(fin, fout, n) do while(n--) putc(getc(fin), fout); while(0)
670デフォルトの名無しさん:2007/04/26(木) 20:56:11
それはダメだろw
普通に関数にしろよ

#define fthru(fin, fout, n) do { size_t m = (n); while(m--) putc(getc(fin), fout); } while(0)
671デフォルトの名無しさん:2007/04/26(木) 21:16:38
>>669-670
ありがとうございます。ですが、読み書きが超遅すぎです。
672デフォルトの名無しさん:2007/04/26(木) 21:18:45
setvbuf()でバッファ取れよ。
いくらなんでも一文字ずつじゃ遅いだろ。
673デフォルトの名無しさん:2007/04/26(木) 21:25:17
普通に適当にmallocでがさっと確保して読んで書く関数を用意しときゃいいだろ。
674デフォルトの名無しさん:2007/04/26(木) 21:36:18
>>671
マルチスレッドを意識したlibcの場合、getc()/putc()は古典的な
マクロ実装でない上に、呼び出し毎に(つまり一文字単位で)
排他制御を行うようになっている実装が多い。
例えばVC++の場合、シングルスレッド版のスタティックリンクライブラリ
以外ではそうなる。マクロ+排他無しと関数呼び出し+排他ありでは、
当然速度面で劇的な違いがある。
古典的にはgetc()/putc()はそれほど遅いものではなかったのだが、今時は
速度が気になるケースでは使わないほうが良いかもしれない。

>>672
getc()/putc()であっても、特に何もしなければデフォルトのサイズ
(BUFSIZ)のバッファが使われ、その単位でのI/Oが行われる。
setvbuf()はBUFSIZでは不十分だというのなら初めて使えば良い。
getc()/putc()が遅いというのは、また別の次元の話だ。
675デフォルトの名無しさん:2007/04/26(木) 21:50:04
>>668
どんなものぐさだよ
676デフォルトの名無しさん:2007/04/26(木) 21:56:54
>>674
参考になります。
677デフォルトの名無しさん:2007/04/26(木) 22:25:05
>>674
それは初めて聞いた。getc()/putc()の中身をトレースしてmutexの
呼び出しがあるかどうか確認してみる。
678677:2007/04/26(木) 22:32:31
わー本当だ。VC8 + STLportなんだけどcritical section 使ってた。
679デフォルトの名無しさん:2007/04/26(木) 22:36:28
ここまで俺の自演
680デフォルトの名無しさん:2007/04/26(木) 22:46:53
MSDNを見るとロックなし版は別にあるね。
_getc_nolock、_getwc_nolock 
_putc_nolock、_putwc_nolock
681VC++.net:2007/04/26(木) 23:01:26
// contest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include <iostream.h>
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
cout << "coutのテストです";
return 0;
}

コンパイルしています...
contest.cpp
contest.cpp(9) : error C2065: 'cout' : 定義されていない識別子です。

な、なんで?
682デフォルトの名無しさん:2007/04/26(木) 23:05:48
>>681
× iostream.h
○ iostream
× cout
○ std::cout

自分で書いたんならいいが、コピペ元の本やサイトがあれば晒しとけ。
683デフォルトの名無しさん:2007/04/26(木) 23:06:40
>>681
<iostream.h>は古い(ISOに入っていない)ということで、
最近のVisual C++からは削除された。

今は<iostream>というヘッダ名になっている。
coutなどは名前空間stdの中で宣言されている。名前空間を知らなければ勉強しろ。
これとは関係ないが、"stdafx.h"のインクルードより前の記述は無視されるはず。

#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
  std::cout << "coutのテストです";
  return 0;
}
684デフォルトの名無しさん:2007/04/26(木) 23:06:45
つ[std::cout]
685デフォルトの名無しさん:2007/04/26(木) 23:14:04
using namespace std;
ってうんこな方法って聞いたんですが本当ですか?
686デフォルトの名無しさん:2007/04/26(木) 23:16:31
>>685
関数内とか、閉じたブロックの中でやる分にはほとんど害は無い。
グローバルや名前空間内でやるのはうんこ。ヘッダでやったら死刑。
687デフォルトの名無しさん:2007/04/26(木) 23:23:26
stdの範囲がもう少し狭ければ使ってもいいと思うのだけどね。
旧形式のヘッダまで、こんな感じで<cstdio> 詰め込むとか狂気の沙汰だ。
688デフォルトの名無しさん:2007/04/26(木) 23:27:44
void fthru(FILE* fin, FILE *fout, size_t n) {
  char buffer[256];
  size_t i = 0;

  while (i < n) {
    size_t read_size = n - i < sizeof(buffer) ? n - i : sizeof(buffer);

    fread(buffer, 1, read_size, fin);
    fwrite(buffer, 1, read_size, fout);
    i += read_size;
  }
}

こんなのはどう?
689デフォルトの名無しさん:2007/04/26(木) 23:30:06
namespace A
{
  void f(int);
}
using namespace A;

namespace B
{
  void f(int);
}
using namespace B;

int main()
{
  f(7); //B::fを呼ぶつもり。でも実際にはA::fとB::fで曖昧エラー
}
例えばAは巨大なライブラリの名前空間であり、
そこにある別の何かを使おうと思ってusing namespace A;を書いたが、A::fの存在を知らなかった。
なんてことは起こらないだろうと思っていると、痛い目に遭う。
690デフォルトの名無しさん:2007/04/27(金) 00:30:26
>>680
それはVC++8.0からだな。
VC++8.0でシングルスレッド版スタティックリンクライブラリ(LIBC.LIB)
が廃止された関係で作られたんじゃないかな。
691デフォルトの名無しさん:2007/04/27(金) 00:30:32
>>682-684
ありがとうございます。
コピペ元は猫でもわかるです。
692デフォルトの名無しさん:2007/04/27(金) 00:41:42
>>686
>>687
>>689
なるほどなるほど
実験用に書くごく小規模のものを除けば
ソースファイル内でのusing宣言程度にとどめておいたほうが無難ですね
693デフォルトの名無しさん:2007/04/27(金) 01:42:45
「C言語 FAQ 日本語訳」13.17で、「rand()を呼ぶ前に毎回srand()を呼ぶよう
な真似はぜったいにしてはいけない」とありますが、これは何故でしょう?具
体的にはどんな問題がありますか?
694デフォルトの名無しさん:2007/04/27(金) 01:51:30
>>693
srand() に何を渡すつもりだ?
695デフォルトの名無しさん:2007/04/27(金) 01:55:31
>693
乱数の質がとても悪くなる。
696デフォルトの名無しさん:2007/04/27(金) 02:19:44
>>694
順当に考えれば時間かな

>>695
そうなんや。
697デフォルトの名無しさん:2007/04/27(金) 02:50:34
適当な例。bcc5.5.1でコンパイル&実行

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

void func(){
srand(time(NULL));
printf("%d ", rand());
}

int main(){
int i;
srand(time(NULL));
for(i=0; i<20; i++)
printf("%d ", rand());
printf("\n");
for(i=0; i<20; i++)
func();
printf("\n");
for(i=0; i<20; i++){
func();
Sleep(1000);
}
return 0;

出力:
22201 17506 10327 21515 11769 30486 19614 1582 31820 209 26900 5342 13956 31930 23843 18046 1218 19168 4043 27868
22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201 22201
22201 21985 21770 21554 21338 21123 20907 20692 20476 20260 20045 19829 19613 19398 19182 18966 18535 18319 18104 17888
698デフォルトの名無しさん:2007/04/27(金) 09:43:03
srandに同じ値を渡したら同じパターンで出続けるから
毎回srandで時刻を渡してたら1秒間はまったく同じ数字が出る
699デフォルトの名無しさん:2007/04/27(金) 14:40:15
>>693
毎回srandを呼べば済む場合というのは、
そもそも最初からsrandに渡す値を乱数として扱っても問題ないってことだ。
700693:2007/04/27(金) 17:00:32
色々返事を有り難う。

>>697
最初のループ出力と最後のループ出力(2番目は論外)
の標準偏差を比較すると、最初のループの方が7.8倍
も大きいから、この場合は毎回srand()をしない方が
圧倒的に勝れていると言うことは実感としてわかりま
した。

そこで試しにより細かく、gettimeofday()を使って時
間をマイクロ秒単位で出し、同様に標準偏差を比較す
ると、今度はsleep()を使用せずとも結果は1.08倍と
なり、誤差程度になりました。

このことから、時間を充分に小さくすればランダムに
なると思います。ただし、そんなことをしても関数
callの分オーバーヘッドが増えるだけで、何らメリッ
トはない。つまり、毎回srand()を呼ぶことが「絶対
」駄目な理由とは、アルゴリズム上いけないと言うこ
とではなく、単に「無駄」だから、と自分なりに結論
づけましたが、どうでしょうか。

>>699
いえ、例えば上記でいえば、gettimeofday()のマイク
ロ秒はランダムな数値とは言えないので、そうとも言
い切れないと思います。揚げ足取りなら申し訳ない。
701デフォルトの名無しさん:2007/04/27(金) 17:14:50
なんで無駄だから、という考えになるのかわからん。
そもそも、なんでsrandが必要なのか考えたことある?
702デフォルトの名無しさん:2007/04/27(金) 17:53:24
>「絶対」駄目
結局文脈次第。法律で禁じられてはいないし、プログラムが落ちるわけでもない。
そんなにやりたいならやっていい。

「こういう使い方をする」と想定されて作られた物の、その使い方に従いたくない理由がさっぱりわからないが。
703デフォルトの名無しさん:2007/04/27(金) 17:58:34
「ZeroFillされた構造体が欲しいのでcalloc()を使いました」というくらいナンセンスなんだけどね。
704デフォルトの名無しさん:2007/04/27(金) 18:07:57
質問

gccでコンパイルする時
parse error before "ナンチャラ"

ナンチャラは引数の型名

って出るんですけど
原因がよく分かりません
どなたかこのエラーについて教えて下さい
705デフォルトの名無しさん:2007/04/27(金) 18:12:48
知るかよ。行数でてるんだからその周辺のコード晒してみろ。
706デフォルトの名無しさん:2007/04/27(金) 18:13:31
エラーがどうしてもわからなかったら、そっくりそのままGoogleにかける手もある。
この場合は単純すぎるが。
前の行でセミコロンとか中括弧が抜けてるとか、そんなもんじゃないのか?
707デフォルトの名無しさん:2007/04/27(金) 18:16:28
わざわざわかりにくくしてから質問するのは、クイズを出題してるつもりなのかね。
708デフォルトの名無しさん:2007/04/27(金) 18:21:34
エスパーがなぜエスパーと呼ばれるかわかっていないようだな
709デフォルトの名無しさん:2007/04/27(金) 20:43:31
ポインタが指す変数がconstになるようなポインタってどうやって宣言すればいいんですか?
710デフォルトの名無しさん:2007/04/27(金) 20:49:36
const char *とかじゃ駄目なのか?普通にこれで、指す先の内容を変える事は出来なくなるが
711デフォルトの名無しさん:2007/04/27(金) 20:50:32
ポインタ → int *
ポインタの参照先がconst → int const *
ポインタ自体がconst → int * const
上記二つの複合 → int const * const
712デフォルトの名無しさん:2007/04/27(金) 20:54:25
で、int const * と const int * は等価。
713デフォルトの名無しさん:2007/04/27(金) 21:03:24
ややこしいですnえ
なんか簡単な読み方というか覚え方というか無いんでしょうか?
714デフォルトの名無しさん:2007/04/27(金) 21:05:57
全くややこしくないぞ。

int const *p → *p が const
int * const p → p が const

const の右にあるやつが const ってだけの話だ。
715デフォルトの名無しさん:2007/04/27(金) 21:16:12
適当だな
716デフォルトの名無しさん:2007/04/27(金) 21:26:59
これしかパターン無いんだから覚えちゃえよ。
わかりにくくなったらtypedefで単純化するんだ。
717デフォルトの名無しさん:2007/04/27(金) 21:49:20
const int が話をややこしくしてんだよな。
例外的なスタイル( const が左側にある )なのに一番一般的な使い方だという。
718デフォルトの名無しさん:2007/04/27(金) 21:51:44
例外?
別に例外でも何でもないと思うが。
719デフォルトの名無しさん:2007/04/27(金) 21:56:07
>>718
const int == int const みたいにconstを
右においても左においても同じ意味になるのなんてこれだけ。
他の場合は const を書く位置が厳密に決まっている。
720デフォルトの名無しさん:2007/04/27(金) 21:58:17
型と型修飾子は順序不問ってのは
どの型修飾子においても同じで例外ではない。
721デフォルトの名無しさん:2007/04/27(金) 22:02:35
>>720
ちょww、基本型の話してんじゃねぇよ。
const int (== int const) と違って
int * const, int * const *, int ** const 等々に代替表現は存在しないってこと。
722デフォルトの名無しさん:2007/04/27(金) 22:05:39
>>721
ああ、そうか。なるほど。 ごめん。
723デフォルトの名無しさん:2007/04/27(金) 22:07:21
>>721
そりゃ置く場所他にないだけであって。
724デフォルトの名無しさん:2007/04/27(金) 22:11:25
>>723
それでも const int っていう表現は規格としては許すべきじゃなかったと思うぞ。
この表現があるせいで、 int * const のつもりで int const * って書くヤツが後を絶たん。
725デフォルトの名無しさん:2007/04/27(金) 22:12:08
constキーワードは右結合なんですか?
726デフォルトの名無しさん:2007/04/27(金) 22:14:03
>>725
ごめん、意味がわからん。
727デフォルトの名無しさん:2007/04/27(金) 22:17:56
staticの場合も同じなんですか?
728デフォルトの名無しさん:2007/04/27(金) 22:18:57
>>727
ごめん、(質問の)意味がわからん。
729デフォルトの名無しさん:2007/04/27(金) 22:19:33
>>727
staticは記憶クラス
constは型修飾子
730デフォルトの名無しさん:2007/04/27(金) 22:21:50
>>724
そうなのか。
しかし、int const * はちょいキモいな。
731デフォルトの名無しさん:2007/04/27(金) 22:23:13
>>729
でも結局、順不同なのは同じ
732デフォルトの名無しさん:2007/04/27(金) 22:31:15
>>731
ごめん、意味がわからん。
733デフォルトの名無しさん:2007/04/27(金) 22:33:18
static const int a;
static int const b;
const static int c;
const int static d;
int static const e;
int const static f;

全部同じ。
734デフォルトの名無しさん:2007/04/27(金) 22:35:49
>>733
いや、それでなにが訊きたいの?
735733:2007/04/27(金) 22:37:08
>>734
俺は>>732の質問に答えただけだ。
別に何も訊きたくはないぞ。
736デフォルトの名無しさん:2007/04/27(金) 22:41:35
>>733==>>727 じゃないのか?
737デフォルトの名無しさん:2007/04/27(金) 22:47:06
どう見てもちがうだろ
738デフォルトの名無しさん:2007/04/28(土) 03:28:40
このやりとりの方が難しすぎw
739デフォルトの名無しさん:2007/04/28(土) 14:19:03
ごめん。難しくしすぎた。
740デフォルトの名無しさん:2007/04/28(土) 15:54:04
latexみたいにキーワードの適用範囲を\const{hoge}みたいに指定するとしたら
constやstaticってどんな表現になるんですか?
int const *
int * const
int const * const
についてお願いします
741デフォルトの名無しさん:2007/04/28(土) 15:57:19
latex は知らんが
\const{int} *
\const{int *}
\const{\const{int} *}
こんな感じ?
742デフォルトの名無しさん:2007/04/28(土) 16:05:40
つーことはconstは左結合なのか
743デフォルトの名無しさん:2007/04/28(土) 16:32:18
>>742
const int みたいに右でも使えるよ。そもそも修飾子だから結合ってのもおかしい。
744デフォルトの名無しさん:2007/04/28(土) 16:33:05
×右でも使える
○右にもかかる
745デフォルトの名無しさん:2007/04/28(土) 16:42:59
VS2003で下記のようなoperator newの呼び出しが差し変わりません
class Base {
//--
public:
 static void* operator new(size_t size);
 static void operator delete(void *pblock);
//--
};

Baseを直接newしても継承したクラスをnewしても差し替えたいnewが呼ばれず
deleteの方だけが呼び出されています。(Baseを元にした割と小さめなオブジェクトが大量に作られるのでslabアロケータのようなサイズ別の割り当て処理を使いたいのです)
debug等の条件下では行番号やらファイル名を渡すnewオペレータが呼ばれるからだとは思ったのですが
releaseモードでのビルドでも指し変わらずに困っています。
何を設定することでBaseクラスのnewオペレータを差し替える事ができるのでしょうか?

746デフォルトの名無しさん:2007/04/28(土) 17:06:20
>>745
差し変わらないということを示す最小限のプログラムを作ってみてくれ。
自分で定義した operator new の中で cout に何か出してみて、
それが実際には表示されない、というようなやつでいいよ。
747gost :2007/04/28(土) 17:22:31
一切の条件分岐文を使ってはならない,4の倍数を求めるの方法教えて欲しい
748デフォルトの名無しさん:2007/04/28(土) 17:31:59
>>747 puts("4");
749デフォルトの名無しさん:2007/04/28(土) 17:32:08
4の倍数を求めるって何

4の倍数を列挙すんの?
ある数が4の倍数かどうかを判定するの?
750デフォルトの名無しさん:2007/04/28(土) 17:33:18
#include <stdio.h>
#include <limits.h>

int main() {
for (int i=0, j = INT_MAX>>2; i < j; ++i)
printf("%d ", i<<2);
return 0;
}
751gost :2007/04/28(土) 17:36:34
一切の条件分岐文を使ってはならない,4の倍数を求めるの方法教えて欲しい
752デフォルトの名無しさん:2007/04/28(土) 17:37:43
for の第3式は、条件分岐文って言わないのかな
言わないか
753デフォルトの名無しさん:2007/04/28(土) 17:41:43
日本語でおk
754デフォルトの名無しさん:2007/04/28(土) 17:44:53
748 で終了でいいだろ。はい次の人どうぞ。
755デフォルトの名無しさん:2007/04/28(土) 17:51:43
>>751
素因数分解をしたいんですが、その前に

1とその数字自身でしか割り切れない自然数が素数
とのことですが、このとき 1はなぜ素数ではないのでしょうか
1も、1とその数字自身(1)で割り切れるので素数だと思うのですが・・・
あと、なぜマイナスは対象外なのでしょうか自然数だけでなく整数まで対象を広げたら
面白いと思うのですが、なぜやらないのでしょうか
756gost :2007/04/28(土) 17:52:46
ありがとう!!
757デフォルトの名無しさん:2007/04/28(土) 19:43:32
>>755
素因数分解の結果が一意に定まるようにするため。
1を素数と認める、マイナスにまで広げる、はいずれも素因数分解の一意性を破壊する。
758デフォルトの名無しさん:2007/04/28(土) 19:43:55
>>755
素数とは1とその数自身以外に正の約数をもたない1より大きい自然数のことだ
数学を勉強しなおせ
759デフォルトの名無しさん:2007/04/28(土) 19:55:49
>>755
世の法則なので
面 白 け れ ば い い と 言 う も の で は な い

つーか文句はその昔素数を考えた数学者に言え
760745:2007/04/28(土) 19:56:15
ごめんなさい、newをマクロでさわっているところがありました。 orz

761デフォルトの名無しさん:2007/04/28(土) 20:30:36
>>760
ま、そんなもんだろ。 >>746 は他にも変なことが起こったときには有効な
アプローチだから、今度からは質問する前に自分でそこまでやってからな。
762デフォルトの名無しさん:2007/04/28(土) 20:33:57
std::ostringstream os;
unsigned char num = 20;
os << a;
std::string str = os.str();

これだとstrはスペース1文字になってしまうのですが、
"20"という文字列が入るようにするにはnumをキャストするしかないでしょうか?
763デフォルトの名無しさん:2007/04/28(土) 20:36:23
>>762
あるいは num の型を変える。それがダメならキャストが最善手だと思う。
764デフォルトの名無しさん:2007/04/28(土) 20:42:20
>763
もちつけ >762 で num はまったく関係ないぞw
765762:2007/04/28(土) 20:48:32
○| ̄|_

std::ostringstream os;
unsigned char num = 20;
os << num;
std::string str = os.str();


やっぱキャストですかね。
実際は
os << data[1]
<< "//"
<< data[2]
<< '-'
ってのが延々と続く感じなんでキャストするととても見づらいんで、sprintf使おうかなあ…
766デフォルトの名無しさん:2007/04/28(土) 20:49:33
numをintにしとけばいいんじゃね
767766:2007/04/28(土) 20:50:05
違った勘違いしてた
768766:2007/04/28(土) 20:56:31
あれ?いいのか
ちょっとうんこして来る
769デフォルトの名無しさん:2007/04/28(土) 21:04:39
>>755は数学好きだけど経験の少ない厨房or工房
>>757は大学レベルの数学を知ってる大人
>>758-759は数学を暗記科目だと思ってる大人

だな。
770デフォルトの名無しさん:2007/04/28(土) 21:25:14
とりあえず整数とか自然数は世の法則じゃないと思うんだ
771755:2007/04/28(土) 21:28:19
>>769
>>758>>759も悪気があったわけじゃあないんです。
許してあげてください。
772デフォルトの名無しさん:2007/04/28(土) 21:44:18
なんで755がそんなこと言うのかw
773デフォルトの名無しさん:2007/04/28(土) 21:44:50
769 は別にせめてないと思うけど。多くの人間にとって数学は一番楽な暗記科目なのは事実だし。
774770:2007/04/28(土) 22:37:35
俺はまだ19だ
定義されてしまえばそれまでの経緯なんて何の意味もねえ
数学は暗記科目なんかじゃなくて芸術なんだよ
センスのないやつは触れるな
775770:2007/04/28(土) 22:39:57
俺を騙る意味がわからない
776デフォルトの名無しさん:2007/04/28(土) 22:41:02
っつーかお前誰よ
777デフォルトの名無しさん:2007/04/28(土) 23:02:07
騙 って字がなんか変なような気がする。
多分winアップデートでフォント最新にしたからか
778デフォルトの名無しさん:2007/04/28(土) 23:24:45
プログラム板って何でID出ないんだろね
歴史的な経緯?
779デフォルトの名無しさん:2007/04/28(土) 23:54:28
運営板に問い合わせてみたら
780デフォルトの名無しさん:2007/04/29(日) 02:27:42
>>778
IDはひどい板にしかないんだよ
ここもひどいだろって? いやいや
ここはとても平和な板だよ
781デフォルトの名無しさん:2007/04/29(日) 02:56:46
まるで日本みたいな板だよ。
酷くないかと問われてみれば酷い面もあるし、
酷いかと問われてみれば酷くない面もあるし。
782デフォルトの名無しさん:2007/04/29(日) 14:25:38
まじで酷いのは掲示板の向こう側だからな
783デフォルトの名無しさん:2007/04/29(日) 15:52:48
C、C++、Javaを用いて、ネットに存在する情報を取得したいのですが、可能でしょうか?
使用目的は、 「株式の時系列データを取得し、株式の解析に用いる」 です。

例えば、プログラムを実行すると、
http://table.yahoo.co.jp/t?s=5010.t&g=d
上記ページの、
2/16〜4/27までの始値、高値、安値、終値を取得する。
そして、それらを数値として変換し、解析に用いたいのです。

研究室の条件により、C、C++、Javaのみでプログラムを作成しなければなりません。
可能でしたら、参考になるWEBサイトを教えていただければ幸いです。
よろしくお願いいたします。
784デフォルトの名無しさん:2007/04/29(日) 16:03:29
ネットワークプログラミングのスレの方がいいと思う。

ネットワークプログラミング相談室 Port19
http://pc11.2ch.net/test/read.cgi/tech/1171029896/
785デフォルトの名無しさん:2007/04/29(日) 16:28:25
>>784
誘導ありがとうございました。
そちらのスレで聞いてみます。
786デフォルトの名無しさん:2007/04/29(日) 17:50:40
>>688
明示的にバッファ使用してますね。苦痛です。
fopen したら勝手にバッファ取られるんだから、finのバッファからfoutのバッファに直接コピーすべきだと思います。
787デフォルトの名無しさん:2007/04/29(日) 19:02:53
>>786
> fopen したら勝手にバッファ取られる
そんな保証はどこにもない。
788デフォルトの名無しさん:2007/04/29(日) 19:11:56
>>786
良く判りませんがシステムコールのread, writeつかえばよいのでは?
789デフォルトの名無しさん:2007/04/29(日) 19:34:48
>>787
保証とか関係ないと思われ。

互換性無くて良い上に、ファイル記述子使って良いんなら、sendfile とかがあるけど。
790デフォルトの名無しさん:2007/04/29(日) 19:41:04
いや、でも今回のウォーズマンの相方ってマンモスマンなのは
ほぼ確定でしょ?
791デフォルトの名無しさん:2007/04/30(月) 01:51:28
sendfileはだいたいの場合、書き込み先のfdが
ソケットである必要があったはず。
792デフォルトの名無しさん:2007/04/30(月) 10:53:21
16ビットのPC98で計測した16ビットの浮動小数点データを、32ビットOSのWindowsXPで読み込むにはどうしたらよいのでしょうか?
793デフォルトの名無しさん:2007/04/30(月) 11:00:44
案1) バイナリでやりとりせずにテキストでやりとりする。
 PC98側 sprintf()
 WinXP側 sscanf()

案2) それぞれの浮動小数点フォーマットを調べ、互換するようにビットセットしていく
794デフォルトの名無しさん:2007/04/30(月) 12:13:27
PC98といえど、浮動小数点はx87とかが
扱ってたと思うから、16bitってわけないとおもうけどなー
795デフォルトの名無しさん:2007/04/30(月) 14:57:30
>>794
DOS版じゃないROM/DISK-BASICの浮動小数点はIEEE754ではなかった記憶があるなぁ。
16bitのMS-Cに変換用の関数があった気がするが、古すぎて資料が出てこない。
796デフォルトの名無しさん:2007/04/30(月) 15:26:30
>>795
あった、これだ。MS C/C++ v1.5まではサポートしているらしい。
_fmsbintoieee
_dmsbintoieee
797デフォルトの名無しさん:2007/04/30(月) 19:48:55
最適化というか実行速度で悩んでいます。
ウィンドウプログラムの練習でC++でファイル内容を16進数表示させて表示するソフトを
作っています。一応完成したのですが300Kbyteみたいな大きいファイルを
処理させようとすると、処理が終わるまで1分以上かかります。
フリーソフトで同様のソフトをみても巨大なファイルでも一瞬で表示しています。

30行くらいのコードなので貼ったら教えてくれますか?
798デフォルトの名無しさん:2007/04/30(月) 19:49:42
まあ、まずは見せてみれ
799デフォルトの名無しさん:2007/04/30(月) 20:00:05
>>797
ウィンドウに表示してない部分までファイルから読み込んだりしてないよね?
バイナリエディタの基本は表示してない部分はメモリに読み込まないこと。
たぶん、そうするだけで実用的には問題ない程度の速度になると思うよ。
800797:2007/04/30(月) 20:14:09
---------------------------------ここから
wsprintfA(lpszTemp, "%.8X\0", nOffset);
strcpy(lpszLine, lpszTemp); //オフセット
strcat(lpszLine, " \0"); //二文字のスペース

for ( UINT i = 1 ; i <= 16 ; i++ ) { //十六進数表示
wsprintfA(lpszTemp, "%.2X", *lpFileData2);
strcat(lpszTemp, " \0");
strcat(lpszLine, lpszTemp);
lpFileData2++;
}
strcat(lpszLine, " |\0"); //3文字のスペースと|
lpFileData2 -= 16;

for ( UINT i = 1 ; i <= 16 ; i++ ) { //アスキーコードならデータを表示
if ( ( 0x1c <= *lpFileData2 && 0x7e >= *lpFileData2 )
|| ( 0xa1 <= *lpFileData2 && 0xdf >= *lpFileData2 ))
strncat(lpszLine, (CHAR *)lpFileData2, 1);
else strncat(lpszLine, ".", 1);
lpFileData2++;
}
strcat(lpszLine, "\r\n\0"); //改行
strcat(lpszDumpData, lpszLine);
nOffset += 0x00000010;
---------------------------------ここまで をループ

結果は以下のような感じで表示されます。
00000000 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | ABCDEFGHIJKLMNOP

よろしくお願いします

801797:2007/04/30(月) 20:17:05
>>799
PeekMessageのPM_REMOVEを使って何もメッセージが発行されていないときに
すこしずつ表示しています。だから大丈夫です。
802デフォルトの名無しさん:2007/04/30(月) 20:21:02
strcat自体がO(N)の操作なので、それをループで回すとO(N²)となる。
sprintfとその返値を使うなどして、O(N)に引き戻してやれ。
803デフォルトの名無しさん:2007/04/30(月) 20:24:41
>>800
速度とは関係ないけど、文字列リテラルの最後の \0 は不要だろう。何のつもりだ?
804797:2007/04/30(月) 20:42:47
>>802 考えてみます
>>803 文字列の終端記号です
また考えてみます ありがとうございました
805デフォルトの名無しさん:2007/04/30(月) 20:47:24
やっぱり、文字列リテラル終端の\0は、基本的に
コンパイラが補ってくれることを知らないのかね?
806797:2007/04/30(月) 21:14:06
今知りましたどうもです(^^)
807デフォルトの名無しさん:2007/04/30(月) 23:37:00
>>797
俺ならファイルマッピングを使う。
だが、お前には無理だ。
808デフォルトの名無しさん:2007/05/01(火) 02:20:03
俺、strcatを使ってるコード見ると「センスねーな」と本気で思う。
sprintfの方がずっと簡単で見やすいし
どうしても速度を求めるならばstrlenやmemcpyを使うべきだし。
809デフォルトの名無しさん:2007/05/01(火) 03:31:19
もしstrcat内部でstrlenやmemcpyが使われていたら?
810デフォルトの名無しさん:2007/05/01(火) 03:34:26
>>809
お前はまず、なぜ strcat を使ってるコードがダメなのか理解してから出直してこい。
811デフォルトの名無しさん:2007/05/01(火) 03:36:35
前レス読んでなかった
812デフォルトの名無しさん:2007/05/01(火) 04:14:54
std::stringの+=使ったらもっと効率悪くなるかな?
813デフォルトの名無しさん:2007/05/01(火) 04:19:30
>>812
string は自分の長さ覚えてるから、 reserve() しとけばだいぶマシ。
814デフォルトの名無しさん:2007/05/01(火) 04:27:48
>>812
dくすこ

むぅ、size()を呼び出すオーバーヘッドを含めてもそこそこの性能なのか・・・
手軽に作るならこれで十分なのかもしれんね
815デフォルトの名無しさん:2007/05/01(火) 04:40:21
std::stringに対してchar文字列を+=する時には、
追加する分の長さをstrlen相当する必要があるけど
元文字列の長さは保持してるからね。
strcatは両方の長さを毎回strlenしてるのに相当する。
(本当に速度を求めるなら、長さは別途保持してmemcpy)

ただ、std::stringは参照カウンタで保持している場合が多いんで
書き換え(追加含む)時にはそのへんの処理が余分にかかるかな(reserveしてても)。
もちろん、バッファが小さかったとき
(sprintfの場合だと、"%.200s"等で最大長を指定して入りきらなかったとき)
の心配をしなくていいから、書く側にとってはすごく気楽だね。
816デフォルトの名無しさん:2007/05/01(火) 05:44:08
>>797
>wsprintfA(lpszTemp, "%.2X", *lpFileData2);
>strcat(lpszTemp, " \0");
これがすげえキモい
817デフォルトの名無しさん:2007/05/01(火) 09:22:44
>>815
参照カウンタの実装なんて当の昔に廃れただろ。
818デフォルトの名無しさん:2007/05/01(火) 11:13:21
16進数を文字に変換することに特化するならsprintf使うのは愚かだな。
普通は"0123456789ABCDEF"というコンストな文字列を使って4ビットずつ処理するだろ。
819デフォルトの名無しさん:2007/05/01(火) 11:29:03
>>818
それは極端に速度が要求されてるとき。もしくは sprintf() が動かない環境での回避策。
sprintf() のほうが圧倒的にコード量が少ないんだから、それで済むのにわざわざ
自分でループまわすコード書くのは愚かだ、とも言える。

いろんな方法があるだろうが、それらから適切なものを選ぶ理由を見つけるべき。
技術者なら軽々しく「普通」とか言わないように気をつけたほうがいい。
820gost :2007/05/01(火) 11:33:15
符号なし整数型の変数 n が、4の倍数であれば、"n is ROUND(4)"、
>> 4の倍数で無ければ、"n is not ROUND(4)"のプログラム教えて
821デフォルトの名無しさん:2007/05/01(火) 11:34:46
>>820
printf("n is %sROUND(4)", n % 4 ? "not " : "");
822818:2007/05/01(火) 12:10:22
>>819を無視して言わせてもらうと、"0123456789ABCDEF"は8バイトや16バイトパラグラフの環境だとメモリの無駄使いになるから配列を使うべきだったな。
823デフォルトの名無しさん:2007/05/01(火) 12:13:14
質問させて下さい。
fopenで開くファイルの指定に変数を使う方法は無いのでしょうか?

#include<stdio.h>
void main(){
int n,t[5]={0};
FILE *fp;
for(n=0;n<5;n++){
fp=fopen("t[n].txt","a+");


fclose(fp);
}
return;
}

上記のようなプログラムでt[0].txtからt[4].txtまで
fopenとfcloseの間の処理を行いたいのですが、t[n].txtを開いてしまいます。

変数の追加や変更があっても構いませんので、良い方法があれば教えて貰えないでしょうか。
824デフォルトの名無しさん:2007/05/01(火) 12:14:02
sprintf
825デフォルトの名無しさん:2007/05/01(火) 12:20:21
>>822
パラグラフ境界に置くコンパイラばかりじゃないので一概には言えません。
底が浅いのがバレバレですよ。
826デフォルトの名無しさん:2007/05/01(火) 12:27:02
>>822
もういい。しゃべるな。自分が新しく知ったことは何でも役に立つとは限らないと覚えておけ。
827デフォルトの名無しさん:2007/05/01(火) 16:28:19
>824
もう少し詳しく教えてあげなよw

sprintf(変数,"t[%d].txt",n);
fp=fopen(変数,"a+");

って感じで
828デフォルトの名無しさん:2007/05/01(火) 16:30:45
boost::io::str(boost::format("t[%1%].txt") % n)
829797:2007/05/01(火) 19:10:58
>>807 どうして無理なのですか?
830デフォルトの名無しさん:2007/05/01(火) 19:32:36
>>829
そのレスが全てを物語ってる
831797:2007/05/01(火) 19:48:20
>>830
皆さんの意見が理解できるようなレベルになれるようがんばります!!。
意見くださった皆様本当にありがとうございました。
832デフォルトの名無しさん:2007/05/01(火) 19:59:15
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3912.c

線形リストのプログラムを作成しているのですが、うまくp2の->nextのポインタがNULLになってくれません。
自分ではまったく原因がわからないため、どなたかどこが間違っているかを指摘してもらえるとありがたいです。
プログラム自体に無駄が多いことはわかっているのですが、このような指定なので・・・。
どなたかお願いします。
833デフォルトの名無しさん:2007/05/01(火) 20:04:57
とりあえず、malloc の結果を放置してるのは
834デフォルトの名無しさん:2007/05/01(火) 20:11:49
_ で始まるグローバルシンボルは予約語だから
_node じゃなくて node_ にすべきだが
コーディング規約がそうなってるなら仕方がない。
835832:2007/05/01(火) 20:19:51
>833
それでした・・・。
mallocしただけで、やった気になっていました(汗

>834
この課題ではそのようになっているので、しょうがないのですが、今後自分でやる際は注意させてもらいます。
836デフォルトの名無しさん:2007/05/03(木) 01:29:58
高速で比較的少ない量の動的メモリ領域確保のために、ヒープではなくスタックを使いたいのですが
C/C++でそういうことができる、mallocなどの標準ライブラリのような位置づけの関数はないんでしょうか。
837デフォルトの名無しさん:2007/05/03(木) 01:31:03
allocaってのがあるけど、標準ではないね
838デフォルトの名無しさん:2007/05/03(木) 01:39:04
>>837
まぁ、でも alloca は準標準と言っても過言じゃない。
839デフォルトの名無しさん:2007/05/03(木) 01:42:48
あるがとうございました
840デフォルトの名無しさん:2007/05/03(木) 02:19:14
えりがとうございました
841デフォルトの名無しさん:2007/05/03(木) 07:46:56
>>836
C99なら可変長配列を使える。
void func(int foo) {char buf[foo];}
なんてことができる。
842デフォルトの名無しさん:2007/05/03(木) 09:03:02
ファイルアクセスの監視って技術的に可能?

Aというフォルダがあって、そのフォルダにアクセスしてきたプログラム名を摂取、
とかやりたいのだが・・・。
C++の内容とかけ離れててスマン。
843デフォルトの名無しさん:2007/05/03(木) 09:09:50
844デフォルトの名無しさん:2007/05/03(木) 09:12:07
Windowsとは限らんかもしれんがOS依存になるから、
そのOSのスレに言ったほうが早い。
通常のファイルIOでは他からのアクセスまではわからない。
845デフォルトの名無しさん:2007/05/03(木) 09:20:10
>>842
Windows の場合、ファイルシステムフィルタードライバを書けばおk
sysinternals のヤツもファイルシステムフィルタードライバで拾ってる。
846デフォルトの名無しさん:2007/05/03(木) 15:38:16
C++でファクトリークラスCFactoryとそのインターフェースIFactoryがあり
それから作られるクラスCProductとそのインターフェースIProductがある

ここでCProductをCFactoryの中からでしか作れないようにしたい
(CFactory外部でnewしようとするとコンパイラエラーが発生する)
んですがどうすればいいんでしょう?
847デフォルトの名無しさん:2007/05/03(木) 15:44:32
ポインタを非ポインタ型にキャストするというのは例えばどういう事なのでしょうか?
848デフォルトの名無しさん:2007/05/03(木) 15:52:51
// sizeof(unsigned long) == sizeof(int *)だぞ、絶対だぞ!
// あと規格厳守の世界の住人から突っ込まれるかもしれないけど、耳をふさぐんだぞ!
int x ;
int * p = &x ;
unsigned long val = reinterpret_cast<unsigned long>(p) ;

// 戻すとき
int *p = reinterpret_cast<int *>(val) ;


必要なときは頻繁にあるから困る。
849デフォルトの名無しさん:2007/05/03(木) 16:00:59
>>846
CProductのコンストラクタをprivateにして、CFactoryをfriendにする。
850デフォルトの名無しさん:2007/05/03(木) 16:04:17
>>848
そんな注釈せんでも、uintptr_t 使おうぜ。
851デフォルトの名無しさん:2007/05/03(木) 16:33:52
>>849
おお、なるほど…
friendってこういうときに使うんですね
でもこれやるにはFactoryが完全に生成に特化したクラスじゃないと厳しそうですね
やっぱりfriend指定って怖いです
852デフォルトの名無しさん:2007/05/03(木) 16:54:12
>>851
友達作るぐらいで怖がってちゃいかんよ。
853デフォルトの名無しさん:2007/05/03(木) 17:00:59
しかし友達に合鍵を渡すのには慎重を要する。
854デフォルトの名無しさん:2007/05/03(木) 17:08:55
この場合は、子作り専用の友達だもんな
855デフォルトの名無しさん:2007/05/03(木) 17:34:23
C++で、GoFのデザインパターンのうち使用できないか使用すべきでないものってありますか?
STLがあるからイテレータパターンで設計する必要はなさそうですが……
856デフォルトの名無しさん:2007/05/03(木) 17:39:34
イテレータパターンはテンプレートがあればそっちの方がいいやね。
ポインタもそのまま使えるし。

個人的にはインタプリタパターンは要らないと思う。
文法1つにつき1クラスとか無駄すぎる。
パーサクラス1つ作っただけでいいよ。
857デフォルトの名無しさん:2007/05/03(木) 18:04:45
while文で&&で結ばれた条件が二つあった場合、1つ目の条件が一致しなかった場合、2つ目の条件は評価されるのでしょうか?
858デフォルトの名無しさん:2007/05/03(木) 18:06:44
されない

短絡評価とかショートサーキットとか呼ばれる
859デフォルトの名無しさん:2007/05/03(木) 18:08:16
while文かどうかに関わらず、評価されません。
860855:2007/05/03(木) 19:50:23
>>856
なるほど。
インタプリタパターンですか。
今のところ使ったことはないんですが、
独自のプロパティファイル等を使う時は
意識しないといけませんね。
参考にさせていただきます。
861デフォルトの名無しさん:2007/05/03(木) 19:51:20
恥をしのんで...
Visual Studio 2005では
関数の宣言にtraditionalの書き方はダメで
ANSIの書き方でなくてはダメになったのですか?

○void func(int arg){}
×void func(arg)int arg;{}

Visual C++ .net 2003では大丈夫だったのですが。
862デフォルトの名無しさん:2007/05/03(木) 19:59:59
拡張子確認汁
863デフォルトの名無しさん:2007/05/03(木) 20:00:02
ちょっと起動するのがダルいから確かめずに言うけど
拡張子 .c でもダメ?
864デフォルトの名無しさん:2007/05/03(木) 20:00:14
>>861
*.c の拡張子のソースをコンパイルすると大丈夫のようだけど
865デフォルトの名無しさん:2007/05/03(木) 20:04:09
IDEからだと
C++ コードとしてコンパイル (/TP)
がデフォになってるからその影響かも。
866861:2007/05/03(木) 22:28:10
>>862-865
サンクス。
書き方の問題では無かったみたいです。
"errcode"という仮引数がまずかった模様。
これをANSIの書き方にしたら通ったもので。
ありがとうございました。
867デフォルトの名無しさん:2007/05/04(金) 23:19:27
class A{
public:
int *x;
A(){x = new int;}
~A(){delete x;x = NULL;}
};
class B{
public:
int *x;
B(){x = new int;}
~B(){delete x;x = NULL;}
};
class Hoge : public A, B{
int *x;
public:
Hoge(){x = new int;}
~Hoge(){delete x;x = NULL;}
};
int main(){
vector<A *> o;
Hoge *a0 = new Hoge;
o.push_back(a0);
Hoge *a1 = new Hoge;
o.push_back(a1);
vector<A *>::iterator p;
for (p = o.begin(); p < o.end(); p++) {if ((*p) != NULL) {delete (*p);(*p) = NULL;}}
return 0;
}
詰めて書いたら読みにくくなってしまった・・・。
このソースなんですが、deleteでの解放時、Aのデストラクタは呼ばれるのですが、
BとHogeのデストラクタが呼ばれません。
この場合どのようにすればいいのでしょうか?御願いします。
868デフォルトの名無しさん:2007/05/04(金) 23:34:17
>>867
デストラクタを virtual に。
869デフォルトの名無しさん:2007/05/05(土) 00:19:51
>>867
oの型をstd::vector<boost::shared_ptr<A> >にする。
それは半分冗談だが、delete 0は問題ないから、if ((*p) != NULL)の条件判断は不要。
870867:2007/05/05(土) 02:35:31
>>868-869
返事遅くなりすいません。
デストラクタをvirtualにしたら解決しました。
レス有り難うございました。
871デフォルトの名無しさん:2007/05/05(土) 10:38:48
C言語で入力された文字を整数型変数に変換するにはどうすればいいですか?
入力文字t → アスキーコード って感じです。
872デフォルトの名無しさん:2007/05/05(土) 10:45:07
何もする必要はない。char/wchar_tは整数型の一種で、中の値は文字コードそのもの。
ただ単に数値として扱えばよい。
873デフォルトの名無しさん:2007/05/05(土) 10:48:40
>>872
回答ありがとうございます。

charで型宣言して計算なども普通に行ってよいのでしょうか?
あとscanfで%cを使っても良いのですか?
874871:2007/05/05(土) 10:57:14
すみません、自己解決しました^^;
お騒がせしました><
875デフォルトの名無しさん:2007/05/05(土) 11:19:55
>>873
聞く前にとりあえずやってみろ。
876デフォルトの名無しさん:2007/05/05(土) 11:27:33
>>873
scanf()で%cを使うと、バッファ入力になっていると改行文字\nがバッファに
残ってしまい、繰り返し%cで入力する時動作がおかしくなる。

どうおかしくなるかは自分で体験してみる事をお勧めする。

解決策はgets()もしくはfgets()を使う。
877デフォルトの名無しさん:2007/05/05(土) 11:37:09
gets なんか使うな!!!!!!!!!!!!!!!!!!!!!!!!!
878デフォルトの名無しさん:2007/05/05(土) 11:40:00
>>877
うっせーなお前にそんな事を言う権限はどこにもない。
879デフォルトの名無しさん:2007/05/05(土) 11:45:41
std::cinのgetline()使おうぜ!!
880デフォルトの名無しさん:2007/05/05(土) 11:47:16
OSによらず使えるC++のライブラリで、
ネットワーク、スレッド、正規表現などを備えているものはありますでしょうか?
881デフォルトの名無しさん:2007/05/05(土) 11:50:37
boost
ネットワークはないけど
882デフォルトの名無しさん:2007/05/05(土) 12:08:10
Qt
883デフォルトの名無しさん:2007/05/05(土) 12:10:37
CVSから取ってくればASIOがあるだろ>Boost
884デフォルトの名無しさん:2007/05/05(土) 12:28:04
wxWidgets
885デフォルトの名無しさん:2007/05/05(土) 12:28:27
>>878
gets 使ってるプログラムがあったら、
そこから簡単にシェルコード実行してやんよ
886デフォルトの名無しさん:2007/05/05(土) 13:02:38
>>885
そういう話とgets()を使うなという話は無関係。
悪さをする方が悪い。
887デフォルトの名無しさん:2007/05/05(土) 13:07:21
gets は自分がその場で実行する使い捨ての時は使うかもな
でも今はそういう時はスクリプトか
888デフォルトの名無しさん:2007/05/05(土) 13:08:04
>>886
どっちが悪いという話じゃないだろw
どっちも悪い。
889デフォルトの名無しさん:2007/05/05(土) 13:09:16
>>888
gets()を使うのが悪いのは使うのが禁じられている時に限る。
今はどこにも禁じてないだろ?よく考えてみろ。
890デフォルトの名無しさん:2007/05/05(土) 13:20:13
>>889
コンパイラに使うなと言われるぞw
891デフォルトの名無しさん:2007/05/05(土) 13:31:31
>>890
処理系依存の話だな。使うなと言わないコンパイラもある。
まあこのスレは環境依存OKなのでいいんだが、君の言っている事が
全てのコンパイラで当てはまらないのは確かだ。
892デフォルトの名無しさん:2007/05/05(土) 13:34:17
日用プログラマは気楽でいいな。
893デフォルトの名無しさん:2007/05/05(土) 13:36:19
>>892
話を逸らしましたね。それとコンパイラに使うなと言われるか言われないか
という事とどういう関係があるんでしょうね?
894デフォルトの名無しさん:2007/05/05(土) 13:37:01
scanfにfflushでいいじゃん
895デフォルトの名無しさん:2007/05/05(土) 13:37:28
void main並みの荒れネタだな
896デフォルトの名無しさん:2007/05/05(土) 13:37:58
議論の手法を理解しないバカのせいだろ。
897デフォルトの名無しさん:2007/05/05(土) 13:38:44
内容についてはともかく892は馬鹿だなw
898デフォルトの名無しさん:2007/05/05(土) 13:39:10
man gets で絶対使うなと言われてるものを使ってどうするよ。
よほどひどくていいプログラムは別だがな。
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/fgetc.3.html
899デフォルトの名無しさん:2007/05/05(土) 13:44:13
>>898
あれ?俺のコンパイラのヘルプではgets()を使うなとは書いてないよ?
どうしましょう?w
900デフォルトの名無しさん:2007/05/05(土) 13:45:40
それはそれは糞なヘルプを使ってるんだな。
901デフォルトの名無しさん:2007/05/05(土) 13:46:53
そもそも規格書にgets()を使うなと書いてあったっけ?
文法違反じゃないよね。
902デフォルトの名無しさん:2007/05/05(土) 13:47:29
別に使い捨てプログラムなら使っていいと思うが。
903デフォルトの名無しさん:2007/05/05(土) 13:48:36
俺も使い捨てなら使っていいと思う。
誰かに「使うな!」とか言われる筋合いはないと思う。時と場合による。
904デフォルトの名無しさん:2007/05/05(土) 13:49:56
初心者に危険性を教えずに gets 薦めるのは
最早犯罪としか言いようがないけどな。
905デフォルトの名無しさん:2007/05/05(土) 13:51:50
初心者はscanf使ってればいいだろ
906デフォルトの名無しさん:2007/05/05(土) 13:52:33
うちの規格書には
Reading a line that overflows the array pointed to by s results in undefined behavior. The use of fgets() is recommended.
ってかいてあったぞ
907デフォルトの名無しさん:2007/05/05(土) 13:53:49
recommendedという単語には禁止という意味がありましたっけ。
908デフォルトの名無しさん:2007/05/05(土) 13:54:24
>>904
じゃあ危険性を教えて勧めるのはいいわけですね。
909デフォルトの名無しさん:2007/05/05(土) 13:54:48
>>908
いいよ。
910デフォルトの名無しさん:2007/05/05(土) 13:56:57
これにて不毛な議論を終了します。結論が出たようですから。
911デフォルトの名無しさん:2007/05/05(土) 13:58:53
>>907
ないよ。
912デフォルトの名無しさん:2007/05/05(土) 14:00:14
自演してまで終わった話題続けなくてもいいよ
913デフォルトの名無しさん:2007/05/05(土) 14:00:38
>>906
この文のどこを訳したら「fgets()の使用は禁止」と訳せるんですか?
せいぜい「未定義の動作の原因になります」程度にしかならないんですけど。
914デフォルトの名無しさん:2007/05/05(土) 14:01:10
続きに、
Since the user cannot specify the length of the buffer passed to gets(),
use of this function is discouraged.
ってあるのよね
915デフォルトの名無しさん:2007/05/05(土) 14:01:53
そもそもgets()にしろfgets()も使うことなんて少ないだろうに…
916デフォルトの名無しさん:2007/05/05(土) 14:06:38
discouredgeか。さすがにそれではまずいな
917デフォルトの名無しさん:2007/05/05(土) 14:07:34
>>913
そういうときはfgets使え って書いてある。
918デフォルトの名無しさん:2007/05/05(土) 14:09:57
だから自分だけのプログラムには使ってもいいんだろ。
宿題みたいなある程度公の場に出るようなプログラムだとgets()は
まずいって事でいいんじゃないか?
919デフォルトの名無しさん:2007/05/05(土) 14:11:26
自分だけのプログラムなら何も問題ない。

宿題なら処理の流れが分かってるかどうか分かりやすくするため
敢えて gets を使う事は悪くないとは思う。

仕事で使う奴はヌッ殺す。
920デフォルトの名無しさん:2007/05/05(土) 14:14:37
char buf[10];

gets(buf); /* 10文字以上(改行文字も含めて)入力する奴は氏ね!!!! */

でいいじゃん
921デフォルトの名無しさん:2007/05/05(土) 14:15:10
gets()は改行文字読み取らないか・・・・・・
922デフォルトの名無しさん:2007/05/05(土) 14:15:12
ウィンドウズ上でC言語を勉強したいのですが無料で手に入るソフトウェアなんか知ってる方がいましたら教えてください
923デフォルトの名無しさん:2007/05/05(土) 14:15:41
gets は改行格納しないぞ
924デフォルトの名無しさん:2007/05/05(土) 14:15:02
>>918
まずgetsでサンプルをしめし、次に
getsの危険性を示して、締めに他API(fgetsなど)への置き換えを
練習問題として提示する
925デフォルトの名無しさん:2007/05/05(土) 14:16:29
926デフォルトの名無しさん:2007/05/05(土) 14:21:15
以下の条件を満たすならgetsを使ってもかまわないと思う
 fopen/mallocの返値をチェックしない
 argcを調べずargvを使う
 段数を制限することなく再帰する
927デフォルトの名無しさん:2007/05/05(土) 14:22:45
>>926
それは関係ない。似たような事だとはわかるが
928デフォルトの名無しさん:2007/05/05(土) 14:23:03
fopen の戻り値は書き捨てプログラムでもチェックしといた方がいいぞ。
929デフォルトの名無しさん:2007/05/05(土) 14:25:09
>>925
そういや、Visual Studio 2005 Express Editionって製品版とどこか違いってあるの?
今のところ、Visual Studio 2005 Express Editionで事足りてるから使ってるんだが。
930デフォルトの名無しさん:2007/05/05(土) 14:25:52
ATL、MFCが無いと書いてあるような
931デフォルトの名無しさん:2007/05/05(土) 14:28:25
それは製品版の Express Edn. でも同じでは。
932929:2007/05/05(土) 14:30:22
ごめ、俺使ってるの、「professional edition」って書いてあるわ。
これも、MSが配ってた奴なんだが、色んなエディションがあって良く分からんな。
933デフォルトの名無しさん:2007/05/05(土) 14:31:00
何だろ。DVDからインストールできるかWeb経由でないとダメかの違いとか
934デフォルトの名無しさん:2007/05/05(土) 14:31:13
配ってたってことは、β版か? >prof
935デフォルトの名無しさん:2007/05/05(土) 14:31:32
俺は友達からもらったのを(ry
936デフォルトの名無しさん:2007/05/05(土) 14:32:15
>>929
ないと思うが、ちゃんと調べるには全ファイルが一致するかチェックするしかないな。
937デフォルトの名無しさん:2007/05/05(土) 14:34:07
>>929
何らかの冊子が付いてくる程度じゃないかな。
938デフォルトの名無しさん:2007/05/05(土) 14:34:47
コピーしてもらいました(*^_^*)
939デフォルトの名無しさん:2007/05/05(土) 14:35:12
>>934
βとかって表記してないから分からんけど、発売前だったからβだと思う。
940デフォルトの名無しさん:2007/05/05(土) 16:14:23
質問させてください。
今日からC言語の勉強始めたのですが、
なぜか下のプログラムを実行しても0.0000とした表示されません。
0.1と表示させるためにはどのようにすればよいのでしょうか?

#include<stdio.h>

void main()
{
double a = 1/10;
printf("%f",a);
}
941デフォルトの名無しさん:2007/05/05(土) 16:17:35
double a = 1.0/10;
942デフォルトの名無しさん:2007/05/05(土) 16:21:52
>>941
ありがとうございました!!
943デフォルトの名無しさん:2007/05/05(土) 19:04:31
既に用意されている型でオペレータのオーバーロードって可能ですか?
int hoge;があるとして、hoge = HOGE();
でhogeにFALSEが帰ってきた時のメッセージを出力する処理をしたいのですが・・・
944デフォルトの名無しさん:2007/05/05(土) 19:08:15
>>943
無理です。諦めましょう。
945デフォルトの名無しさん:2007/05/05(土) 19:34:15
もし BOOL から int への代入をオーバーロードできたら無茶苦茶な事になるぞ
946デフォルトの名無しさん:2007/05/05(土) 19:37:48
組み込み型はboolな
947デフォルトの名無しさん:2007/05/05(土) 19:40:58
BOOLとintは同じだから
948デフォルトの名無しさん:2007/05/05(土) 19:44:40
やるとしたら受け取り側の int を自前の int モドキなクラスで実装することやね。
949デフォルトの名無しさん:2007/05/05(土) 19:45:38
C++ならCBoolみたいなクラス作って解決
950デフォルトの名無しさん:2007/05/05(土) 19:48:43
それ以前に、BOOL を受け取る変数は一応 BOOL にすべきだと思うんだがな。
いくら typedef int BOOL; だからって。

あと、その後に if(!hoge) { ... } と書いたらいけない理由があるのかな?
多すぎて・・・ということか?
951デフォルトの名無しさん:2007/05/05(土) 20:24:37
空白か否かを判定する関数がint返すおかげで
そいつを間接的使う関数作ったときに
return var ? true : false;
みたいなことやってるんだけど、これってマズイ?
952デフォルトの名無しさん:2007/05/05(土) 20:30:45
別にまずくはないけど、inline 関数化しといた方が楽かと。
!! とか書く人もいるけど、最適化されるのかね? これ。
953デフォルトの名無しさん:2007/05/05(土) 21:19:52
>>951
return var != 0;
でいいじゃん
954デフォルトの名無しさん:2007/05/05(土) 21:24:03
型は int だが真偽を返すことを意図してあるから
0 と比較するよりは ? : 使った方が読みやすいと思う。
955デフォルトの名無しさん:2007/05/05(土) 21:25:46
>>953,954
return (var != FALSE);
で解決ですね
956デフォルトの名無しさん:2007/05/05(土) 21:27:52
それ分かりにくい。二重否定だし。
957デフォルトの名無しさん:2007/05/05(土) 22:01:42
FALSEはマクロなのでどうも信用できん…。
958デフォルトの名無しさん:2007/05/05(土) 22:08:29
>>954
0 と比較すると真偽を返すように読めないとでも言うのかね?
959デフォルトの名無しさん:2007/05/05(土) 22:10:35
if 文は真偽を判別することを意図しているから

if (n != 0) // 0 と比較するよりは

if (n ? true : false) // ? : 使った方が読みやすい

と思う。
960デフォルトの名無しさん:2007/05/05(土) 22:25:51
それはさすがに読み手を馬鹿にしすぎじゃないか?
961デフォルトの名無しさん:2007/05/05(土) 22:26:39
>>943
その状況で使えるかどうか判らないけど、
列挙型は、演算子多重定義できるよ。
962デフォルトの名無しさん:2007/05/05(土) 22:30:07
>>960
馬鹿にしてるとかそういう問題じゃないと思うが。
963デフォルトの名無しさん:2007/05/05(土) 22:45:44
>>959
読みやすい?
3項演算子より n != 0 の方がよっぽど読みやすいんだが
964デフォルトの名無しさん:2007/05/05(土) 22:50:37
>>959
if 文に入れる分には if(n) が最良だろう。
965デフォルトの名無しさん:2007/05/05(土) 22:51:52
馬鹿にしてるとかの問題はともかく、単純にわかりにくいな。
他人の書いたソース中にそんなのが出てきたら一瞬戸惑うかもしれん。
「え、なんか特別な意図でもあるの?」って。
俺は素直に普通の比較式書いてコメント残すよ。
966デフォルトの名無しさん:2007/05/05(土) 22:52:35
n として数値を期待してるのか真偽値を期待してるのか、
n != 0 だとそれが式から見て取れない。
967デフォルトの名無しさん:2007/05/05(土) 22:53:57
>>966
は?
nとして数値か真偽値かって
n != 0 の結果が真偽値だろうがよ・・・
968デフォルトの名無しさん:2007/05/05(土) 22:55:56
bool 型の値という意味じゃなくて、
真か偽かを表しているということだぜ?
というか、流れ分かってるのか?
>>951 から始まってるんだが。
969デフォルトの名無しさん:2007/05/05(土) 22:58:15
「nが0か否か」
それ以外に何が要るのん?
そもそも元の話は n がintなのになんで n が数値か真偽値かなんて話になってんだ?
970デフォルトの名無しさん:2007/05/05(土) 22:59:31
is 系関数とか知らない訳じゃないよな?
971デフォルトの名無しさん:2007/05/05(土) 23:08:18
うん、で?
結局それなら「○か否か」で終了じゃん
972823:2007/05/05(土) 23:11:19
>>824,>>827
返事遅くなってしまい申し訳ありません。
おかげで上手く動いてくれました。
どうもありがとうございました。
973デフォルトの名無しさん:2007/05/05(土) 23:15:26
>>971
数値的に見れば 0 か否かだが、
意味的には真か偽を返す関数だろ?
n != 0 だとその意図がここだけからでは見てとれない。
974デフォルトの名無しさん:2007/05/06(日) 00:54:04
static_cast<bool>(n); でFA
975デフォルトの名無しさん:2007/05/06(日) 01:08:43
VC++ で警告出た記憶があるぞ
976デフォルトの名無しさん:2007/05/06(日) 01:13:14
return n == true; とかってやっていいんだっけ?
977デフォルトの名無しさん:2007/05/06(日) 01:29:55
ダメ。true が (int)1 になって、n が 0 でも 1 でもない時におかしくなる。
978デフォルトの名無しさん:2007/05/06(日) 01:40:36
bool型の比較でも1以外は駄目なんだ
return !!n;とかやればいいのかな?
979デフォルトの名無しさん:2007/05/06(日) 01:40:42
>>977
別にダメってことはないだろ。n が 1 じゃない時に false になるってだけで。
980デフォルトの名無しさん:2007/05/06(日) 01:52:07
比較の結果を 0 or 1 として利用するのはまあアリだと思うが、
true キーワードを数値の 1 の代わりとして使うのはナシだろ。
981デフォルトの名無しさん:2007/05/06(日) 02:02:59
boolからintはCとの互換のためか問題なしに暗黙でキャストされるはず。
intからboolは情報が落ちるからか手元のコンパイラは警告レベル上げると警告してくれてる。

C++でも if ( ...  ) の成立条件はあくまでも0以外のときなんだっけ?
0以外かtrueとはなってないよな?
982デフォルトの名無しさん:2007/05/06(日) 02:12:54
C++ でも 0 以外。
じゃないと互換性が。
983デフォルトの名無しさん:2007/05/06(日) 06:17:45
ごめん今みたらスペースか否かを判別する関数で
bool isspace(char c) {
// _ismbcspaceはcが空白文字のときに0を返す
return _ismbcspace(c) == 0;
}
になってた
これならおk?
984デフォルトの名無しさん:2007/05/06(日) 06:19:09
テンプレートで作成できる型をdoubleとfloatに限定することはできませんか?
985デフォルトの名無しさん:2007/05/06(日) 08:03:05
doubleとfloatのメソッド実装した方が早くない?
986デフォルトの名無しさん:2007/05/06(日) 08:08:00
>>984
boost::enable_if<> を使えばできるけど、以下 >>985
987デフォルトの名無しさん:2007/05/06(日) 08:16:42
>>983
何を心配しているのかわからん。
988デフォルトの名無しさん:2007/05/06(日) 08:44:53
>>973
んなもん関数作ったヤツに言えよ
ifは条件式全体で真偽を表すもんだが
おまえほんとに解ってるか?w
989デフォルトの名無しさん:2007/05/06(日) 09:00:41
>>984
宣言と定義で別々のファイルに書くようにして
定義側のでで明示的でインスタンス化するときに、doubleとfloatの分だけ書けば
例えばint型等で使おうとしたときにリンカがゴルァしてくれるから
そういうのでよければ
990デフォルトの名無しさん:2007/05/06(日) 10:50:09
>>989
全部そんな事してたら template の旨味が少ない。
コンストラクタだけそうしたらいいと思うよ。
991デフォルトの名無しさん:2007/05/06(日) 11:01:35
つまり早くexportキーワードサポートしろやって事ですか?
992デフォルトの名無しさん:2007/05/06(日) 11:25:24
export は関係ないだろー。
993デフォルトの名無しさん:2007/05/06(日) 11:50:39
数値から真偽値への変換は true && n っつーのはどうか。
994デフォルトの名無しさん:2007/05/06(日) 12:02:30
なんでそんな妙なことを…
995デフォルトの名無しさん:2007/05/06(日) 14:22:31
誰か、以下のソースの何処が悪いのか教えてください
因みにポインタとかサッパリです

#include <stdio.h>

int main (void) {
    char tall[10],weight[10];
    float bmi = *tall / *weight;
    
    printf ("身長を入力して下さい。\n");
    gets (tall);
    
    printf ("体重を入力して下さい。\n");
    gets (weight);
    
    printf ("%.2f\n",bmi);
    
    return 0;
    }
996デフォルトの名無しさん:2007/05/06(日) 14:26:49
まず整数と英数字の列の違いについて勉強のこと

BMIの求め方も変だし
997デフォルトの名無しさん:2007/05/06(日) 14:31:34
>因みにポインタとかサッパリです
この時点で論外

もっと根本の勉強をちゃんとしてからで直して来い
998デフォルトの名無しさん:2007/05/06(日) 14:32:34
>>995
#include <stdio.h>
int main (void) {
    float height, weight, bmi;
    printf("身長を入力して下さい。\n");
    scanf("%f", &height);
    printf("体重を入力して下さい。\n");
    scanf("%f", &weight);
    bmi = weight / height / height;
    printf ("%.2f\n", bmi);
    return 0;
}
999デフォルトの名無しさん:2007/05/06(日) 14:32:46
>>995
ポインタ以前に計算は入力がすんでからな
エラー処理はおいといて、getsで文字列取り込んだらatof()で数字にして計算だ。
bmi = atof(tall) / atof(weight);
とかやればいい。
あと、atof()はstdlib.h なのでこれもインクルード
1000デフォルトの名無しさん:2007/05/06(日) 14:42:01
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。