【初心者歓迎】C/C++室 Ver.36【環境依存OK】
1 :
デフォルトの名無しさん :
2007/04/01(日) 23:01:13
2 :
デフォルトの名無しさん :2007/04/01(日) 23:37:03
先生方、どうぞ宜しくお願いします。
3 :
デフォルトの名無しさん :2007/04/02(月) 00:08:17
WinXPでC言語勉強し始めた者です。 ソートの問題で、「ただし同じ値なら同じ順位を返しなさい」という ただし書きがあって、今までなかった注意書きでどうすればいいのか分かりません。 ググったのですが・・・選択ソートを使っています。IF文の elseでどのような指示をつければよろしいでしょうか?
保守しないと落ちそう
「安定なソート」という意味だろ
8 :
デフォルトの名無しさん :2007/04/02(月) 03:05:45
C言語学ぶのにいい本を次からおしえて K&W 独習C 結城浩のC言語プログラミングレッスン
K&W
作って分か……ごめん、エイプリルフールはとっくに過ぎてたね。
11 :
デフォルトの名無しさん :2007/04/02(月) 06:25:03
【ネガティブ派遣根性チェック】 3つ以上、チェックがつけばアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。 □派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする □派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい □自社で仕事なんてできるわけがない □派遣労働の問題点の話題が出ると感情剥き出しにして反論する □派遣労働の問題を指摘する人は嫌いだ □派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい □奢ってくれる派遣先正社員を尊敬する □自分の月額金額を知らないのは当然だ、単金を聞いてはいけない □派遣先正社員より自分の生涯収入が低いのは当然だ □派遣先に尻尾を振り、かわいがってもらうことが大切だ
結城ってひとの本図書館にあったから立ち読みしたけど あれで勉強してるひといるのか? ちょっと見て、ん〜?ってとこが多かった。 あれで基礎固めたら大変だろうね。
質問です。 C++で日本語のファイル名を作成する場合はどうすればいいの でしょうか? ofstream out("ほげ.txt"); と書いたソースをsjisで保存してもutf-8で保存しても出来る ファイル名は文字化けしてしまいます。 OSはWindowsXP、開発環境はVS2005です。 どなたかご教授お願い致します。
>>15 UNICODEの定義を外すorロケール設定をする
17 :
デフォルトの名無しさん :2007/04/02(月) 20:20:24
ポインタがよくわかりません
19 :
C++初心者 :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(); };
20 :
C++初心者 :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(); }
クラスメソッドとインスタンスメソッドというのがあってだな C++的には静的メンバ関数だっけ?
どっち方向に勘違いしているかわからないね。3つポイントがあって2つ間違ってる感じかな。
23 :
20 :2007/04/02(月) 22:29:55
自己解決しました。
実数の比較で == をつかっちゃいかんというのは良く聞くけど double a=0; printf("ヌルポ\n"); if( a==0 ) printf("ガッ\n"); これも例外なくNG? ゼロだけは許されるとか、そういうのアリ?
使っちゃならんって言われる意味わかってるか?
26 :
デフォルトの名無しさん :2007/04/02(月) 22:49:54
実数は丸めたりするから、比較けっかが 理想通りにいかなかったりするからだろ
+0 -0
>>24 εを0とみなさないなら問題ない。
+0.と-0.は等しい。
>>26 ゼロは特別に許された方が便利だろとか
思ったりしたんだよ
話変わるけど
大体ポインタがゼロのときエラーとかいう仕様が
まかり通ってる時点でなんかもうおかしいんだよ
ゼロ番地なのかエラーなのかわかんねーじゃん
浮動小数点の話なのかポインタの話なのかはっきりしろ
ポインタが0でもエラーじゃないこともあれば 0以外でエラーになることもあるだろ
日本語でおk
0をポインタに入れるとヌルポインタになる。 ヌルポインタはどこも指してない無効なポインタであることが保証されてる。 ヌルポインタが全bit0であるかは環境依存。
>>34 わかってるんだろうが、その書き方は誤解を招く虞が…。
ポインタが必要な文脈で現れた整数リテラルの0がヌルポインタを意味するのであって、
整数0をポインタとして扱ってもヌルポインタに化けるわけじゃない。
>>34-35 どう書いても誤解の可能性は避けられないんだから、
ごちゃごちゃ言わずに C FAQ で済ませとけよ。
37 :
デフォルトの名無しさん :2007/04/02(月) 23:50:34
ヌルポインタて、いくつの数字を入れるとなるの?
テキストエディタ使ってC書いてるんだけど、コンパイルするにはどしたらいいの? コマンドプロンプトで bcc32もgccも試したけど 内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出る。 何かインストールが必要なん?
bcc32はBorand C++ gccはCygwinもしくはMinGWのインストールが必要。
0をぬるぽとして扱うと正式に決まってるのはC++だけだったような
41 :
デフォルトの名無しさん :2007/04/02(月) 23:59:00
初心者の俺に教えてほしい。 昔(10年前くらい)、コンパイラってのは高いやつとフリーのやつではうんと差があると聞いたのですが、 今でも、borandや、gccとかじゃやっぱり駄目駄目なんですか?
別に困らんよ。 何をしたいかによっては差があるだろうけど だいぶ前からしょぼしょぼなサブセットなんてないでしょ。
>>41 コンパイラを買う時代は終わったよ。
最適化性能にはそれぞれ癖があるが、入門レベルじゃ違いなんかわかりゃせん
>>41 そもそもコンピュータの性能が10年間で物凄く向上したし、コンパイラの技術も向上した。
Borland C++やGCCも全然問題ない。
そして社会も変わった。
今はMicrosoftすらコンパイラはおろかIDEもフリーで公開している。
もうコンパイラを売るような時代ではなくなった。
まあでもIntel C++はすごいという噂は良く聞くけどな。
46 :
デフォルトの名無しさん :2007/04/03(火) 00:22:12
そうなんですか。 何でも無料になるのも開発者にとって損じゃないですかね?
>>46 プログラムを作る動機は金だけじゃない。
金が最終目的だとしても、企業であれば宣伝効果というものもある。
>>46 一般の企業やプログラマにとってはむしろ得じゃまいか?
MSとか某は別として。MSとか某の場合は
>>47 の言うとおり
ひろゆきのお尻ゲット
50 :
デフォルトの名無しさん :2007/04/03(火) 00:56:23
何処で聞いたらいいのか分からないのでこちらで 質問させて下さい。 現在就職活動をしていて先日中小メーカーの面接に行ったのですが、 プログラミング経験はあるか、と聞かれました。 社内SEというものを募集しているとのことでした。 その場では無いと答えたのですが、中学校でパソコン部に所属して いたとき、暇だったので部室にあったシューティングゲームの プログラムらしきものが書いてあるマニュアルを見ながらtowns(?) とかいうOSで凄くショボイゲームを作ったことがあるのですが、この ような経験でもプログラミング経験アリといえるのでしょうか? …自分でも意味不明なことを聞いていると思うのですが、どなたか よろしくお願いします。。
>>50 昔なんてどうだっていい、今、プログラミングをCなりC++なりJAVAなり
なんなりと、現在出来るかどうかだろ。
まぁ、経験ありますと言ったら仕事増えるだけだから
やめとけばいいじゃん
だいたい、コンパイラの売上げなんて、Office等の売上げに比べたらたいした額にはならないしね。 だからって、コンパイラ製品自体を売るのをやめて 他の企業がOffice競合製品を開発できないようにすべき、という話には 決してならない。
54 :
50 :2007/04/03(火) 01:25:49
スミマセン、プログラマー板で伺ってきます。 でもなんか関係ないみたいですね。。
0からはじめるゲームプログラムのページで スケルトン使ってゲーム作れるまでになったのですが 細かいことが分からないので質問させてください ・スプライトを使って加算合成する方法 ・テキストを表示するとフルスクリーンにできなくなるのはなぜか 下は自分のソースのせいかもしれないですが 何か分かることがあればお願いします
>>55 情報が少なすぎて何言ってる不明だが
文脈からするに DirectX の話か?
もしそうなら DirectX 関連のスレへ。
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の値がリセットされてしまい、困っています。
リセットされないよ。どうやって確認したんだ?
59 :
デフォルトの名無しさん :2007/04/03(火) 18:43:19
シラネ
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); } } 間違いの指摘や、ご存知な事がありましたら教えてください。
61 :
60 :2007/04/03(火) 19:02:45
class base{ public: static void * operator new( size_t size ) { return malloc_local(size); } }; すみません。修正。
62 :
20 :2007/04/03(火) 20:30:43
すみません自己解決したと申しましたが未解決ですので 再度ご質問させて下さい。 現在、プロジェクトに(通常)C++クラスファイルを追加して クラスの中にメソッドを組み込み他メソッドより(ボタンクリックイベント) @ C_plus2.cpp A C_plus2.h @にプログラム本体(メソッド)を記述し、Aにプロトタイプ宣言を 行った上でWindowsForm上のボタンクリックイベントより@に本体のある メソッドを呼出そうとしているのですが呼出す事が出来ません。 (インテリセンスは通りますがエラーになります。) どうすれば2ファイル(*.cpp & *.h)に分けたクラスに記載のメソッドを 呼出す事が出来るのでしょうか? ※ヘッダーファイルにメソッド本体を記述すると、ボタンクリックイベント の内部に通常の呼出しコードを気記述することによりメソッドを呼出せます。 (ヘッダーファイルにメソッドを全て記述すれば他クラスと2ファイル
63 :
20 :2007/04/03(火) 20:32:42
『訂正』です。 (ヘッダーファイルにメソッドを全て記述すれば 問題無くボタンクリックイベント内部から@に本体のあるメソッドを呼出す 事が出来ます。)
>>60 class base{
public:
void * operator new( size_t size ) {
return malloc_local(size);
}
};
>>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();
}
66 :
60 :2007/04/03(火) 21:18:22
>>64 static削っても、同様のエラーが出ます。
class base{
public:
void * operator new( size_t size ) {
return 0;
}
};
malloc_local()に起因してるのではないかと思い、
してみましたが、これも変わらず。
67 :
C++初心者? :2007/04/03(火) 21:23:47
スレを探してみたのですがなさそうなのでここに書かせていただきます。 只今、VC6を使用してPro*Cのプログラミングをしているのですがビルドすると不要なBreak文がありますとエラーが出てしまいます。 プログラムの流れとしては @DBからデータを取得する A取得したデータをもう片方のテーブルと差分を取り対象のデータを取得する。 BAで取得した差分のデータをワークテーブルにインサートする 今の問題の現象はBでおきています。 うまく説明できていないと思うのですが、何かヒントとなるようなことを教えていただけるとありがたいです。 DBはオラクル9を使用しています。
ストアドならDB板で聞けばいいんじゃね
69 :
20 :2007/04/03(火) 21:39:00
>>65 さん
解決しました。どうもありがとうございます。
どうやら #include <hoge2.h> の記述位置を using 直下(同一スコープ)
に記述していたことが原因でした。
本当にありがとうございます^^;
質問させてください。 いま、プログラムの勉強もかねて作ってみたいPGがあるのですが、C#で作ったほうがよいのか、 C++で作ったほうが良いのか迷っております。 作ってみたいPGとは、オンラインゲームの麻雀ゲームの支援ソフトです。 既存の画面だとどうにもやりづらくて、それならば勉強もかねて、 専用のGUIを作成し、このボタンを押したらこの牌をすてるだとか、 自分のやりやすいようにGUIを作成してみたいなと、思ったわけです。 色々調べてみたのですが、C#というのはC++とVBの良いところを持ち合わせたものだとか というのはわかったのですが、ではこのようなPGを作ったときの相性はどちらが よいのだろうと疑問がでました。 また、WinnyはC++で作成されており、なぜC#ではつくられていないのだろうという 疑問もあります。 もし、お分かりになる方がいらっしゃれば、ご教授願えないでしょうか?
> オンラインゲームの麻雀ゲーム ってのがそもそもどういうのかによるかな。 場合によってはUWSCみたいなマクロのがよい。(非GUIだけど) 作りたいものってのは置いといて、言語の勉強ならC#でいい。 C++は悪い意味で多くを受け入れすぎ。先にモダン言語に矯正されとくといい。 > また、WinnyはC++で作成されており、なぜC#ではつくられていないのだろう C++は一番融通が利くからね。RADからアセンブリまできめ細かく。 ということで、C#ならスレ違いになるので他で勉強してください。
>>67 Pro*CはCじゃないからここで回答は得られにくいかと。
つーか、折角Oracleに大枚叩いているんだろうから聞けばいいじゃん。
>>70 C#でもC++でも、使いこなせるほうで作れば良いじゃん。
っていうか、勉強がてらか。
気楽にやれると思いきや結局DllImportで
api使う事になっちゃうC#?
mfcを使ってみてはむかついて、クラス設計で悩んで
頭がクラクラしちゃうC++?
メッセージ毎の処理と、api群や自作関数とたわむれて
しまいに何の処理書いてるのかわからなくなるC?
ま、C#で良いか。
>WinnyはC++で作成されており
>なぜC#ではつくられていないのだろう
C#登場2001年Winny2002年5月に公開
ofstreamでは書き込みバッファの容量はどこで指定すればよいのでしょうか?
setvbuf()と同じような物を考えているんならそういうのは無いよ
>>74 streambuf::pubsetbuf()
>>75 C++ストリームはCのFILE*でできたことなら
何でもできるようになっていると思って間違いない
78 :
デフォルトの名無しさん :2007/04/04(水) 18:00:11
*関数ってどういう意味? あとUNIX(XWINDOW)とVCのchar型って何バイト違うんですか? 2個目の質問の解説等が日本語で載ってるサイト知ってたら教えてください。
80 :
デフォルトの名無しさん :2007/04/04(水) 19:52:47
char *Func(); みたいのを*Funcで一塊だと思ってるとか?
82 :
78 :2007/04/04(水) 20:03:16
>>79 レスどうもです。
1なんですが、宣言で*関数とあります。戻り値は関数の中でchar *r
と宣言されたものがreturn rで返ってます。
使われる場合は
i=*関数;
ってなってます。
ようするに関数に*がついてるからiにはrの中身が代入されるんですか?
ポインタと同じで
紹介してもらったHP見たんですが、質問の仕方が悪かったため
違う様な気がします…
情報小出しにして申し訳ないですがもう一度教えてください。
int hoge() //返り値はint型 { int ret=うんたら; return ret; } char * hoge2() //返り値は(char *)型 { char *ret=うんたら; retern ret; } 何の違いもない。
84 :
78 :2007/04/04(水) 21:30:02
先生、
>>83 の下の例はちょっとまずいと思いまーす
場合によってはまずいが、全ての場合でいけないわけじゃなかろう
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)); }
そりゃぁ、毎回findfirst()したらいつまで経っても終わらん罠。
89 :
デフォルトの名無しさん :2007/04/04(水) 22:29:46
90 :
824 :2007/04/04(水) 22:50:26
C++.netでは文字列を連結したい場合 Debug::WriteLine("A","の値は","ホゲです。"); という風にしか連結することは出来ないのでしょうか? C#の場合だと Debug.WriteLine("A" + "の値は" + "ホゲです。"); といった感じで連結出来るのですがC++.netでもお手軽な連結 方法は何かありますか?(VS2003利用です。)
それくらいしかないと思う。 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
配列の配列を参照渡しするとき どうやってわたせばいいんでしょうか
typedef int ARR[5][5] void f(ARR&); ARR a; f(a);
>>94 配列の配列といっても二次元配列じゃなくて
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
>>97 #include <stdio.h>
int ch;
int main(ivoid)
{
printf("pl");
ch=getchar() ;
return 0;
}
getchar を使ってwindowを表示しEnterを押すと消えるようになりました
とりあえずしばらくこれでやってみます。
ありがとうございました
C++を使ってのWeb開発を行うことになったんですが可能なのでしょうか?
可能
101 :
デフォルトの名無しさん :2007/04/05(木) 15:11:46
インライン関数とstaticの違いって何ですか? インラインは関数のみに使うもの? それともCとC++の違いですか?
staticは外部変数と内部変数と関数のそれぞれにおいて少しずつ意味が違う。 inlineは関数にのみc99やc++で使用できる。
103 :
102 :2007/04/05(木) 16:12:31
>>102 staticで外部変数ならそのファイルでのみ有効
内部変数ならその関数の内部のみで有効
関数はそのファイルでのみ有効
ということですか。ありがとうございます。
104 :
102 :2007/04/05(木) 16:13:20
自分は101です… 間違った
WinXP Pro VS2005の開発環境を持っている者からの質問です。 信頼できる知人からVC++6.0で動いているソースコードを頂きました。 実際、コンパイルできるところと、実行できるところは確認済みです。 そのコードをVS2005に移植してみようと思い、コンパイルをかけてみたのですが、 CString CxxxDoc::Func() { //中略 return -1; } のようなコードがありました。VC++6.0Proでコンパイルが通っている事を確認したので、 ソースに間違いはないと思っていたのですが……、これは一体どういうことでしょうか。 VC++6.0では、こんなコードが許されるのでしょうか? 知人の環境はXP Pro VC6.0 Proです。 よろしくご解答お願いします。
#define ishigh(c) ((c) >= 0x80) というマクロが定義してあるのですが、コレどういう意味なのでしょうか? こんなマクロ初めてみた上にishigh(c)なんてソースの中のどこにもなくて 困っています。
>>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ビットだとして、最上位ビットが立っているかどうかということだろう。
struct Test{ bool a; bool b; }; これが定義されてて cppファイルに Test func(Test t){ return t; } こういう関数を作りました そして.hファイルに Test func(Test t); と定義しても宣言構文エラーになっちゃいます どうしたらいいでしょうか わかりづらくてすいません
Test func(Test t); ↓ struct Test func(struct Test t);
>>108 そのTest構造体が定義されているのはどこだ?
Common.hに.hファイルは全部includeしてあって cppファイルは全部Common.hをincludeしてあるんですが Test構造体が定義してあるのは他の.cppファイル.hファイルとは違う.hファイル です そこに問題があるんでしょうかね
エラー 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: 宣言の構文エラー
インクルードガードがないのかな
とりあえずCommon.h内に struct Test; の行を入れてみてから、もう一度
Common.hにstruct Test;入れたら大丈夫でした! でも参考にしている人のソースにはそんな文ないんですが どうしてなんでしょうか
ヒント: インクルード順序
でも順序がある時点でヘッダの不具合だよな
初歩的な疑問があるんですが、お教え願えないでしょうか。 環境はVS.NET 2003です。 MSDNチュートリアルを見ながら、ATL のActiveX コントロールを作ってみたんですが、dll の容量が324Kbでした。 同様の物を MFC で作った ocx の容量は144Kbでした。 てっきり ATL の方が小さくなると思ってたんですが... ひょっとして、MFC の方は別途必要な物があるんでしょうか?VBRUNJPなんとかみたいに。 どうかよろしくお願いします。
>>120 静的にリンクする(ルーチンを自分で持つからでかくなる)か
dllを使う(dllを呼ぶから自分は小さいが実行時に呼ぶdllが必要)かは
ATL, MFCともにプロジェクトのプロパティで設定できる。
デフォだとATLは静的リンクでMFCは共有dllだったかも。
MFCで共有dllにしたときに必要なdllは、vectorとかでパッケージになってます。
CでCGI作ろうとしてるんですが、普通にコンパイルすると生成される実行ファイルは .exeになってしまいます。exeでもcgi-binのディレクトリに置けばCGIとして実行されますが URLの最後がexeだと怪しいファイルをDLさせようとしているのだと勘違いされるかもしれないので 拡張子をCGIにしたいんですけど、どうすればいいんですか? Visual Studio.net使ってます
ren *.exe *.cgi
>>123 すみません、それはどこに記述すればいいんですか?
コマンドプロンプト
グローバル変数について、気になったことがあるので質問させてください。 「グローバル変数の作成順番というものは、存在するのでしょうか?」 (例えば、ポインター変数の方が優先的に作られるとか。) (下記のプログラムを例とする): なぜ、このような質問をしたかというと、 もし、グローバル変数の順番が決まってないと、 先にhoge g_obj;が生成された場合、 g_objのコンストラクタ内でまだ作成されていないg_pが使用されることに なってしまい、危ないと思ったからです。 //グローバルな場所 int *g_p=0; hoge g_obj;//オブジェクトを作ることで、このクラスのコンストラクタ発動 //hogeクラス class hoge{ hoge(){//コンストラクタ内 g_p = new int;//g_pを使う } }; どうかよろしくお願いします。
ググればすぐに出る。
128 :
デフォルトの名無しさん :2007/04/07(土) 00:54:36
>>127 初心者にそれはないだろ、取り合えず、おまい、氏ね
129 :
126 :2007/04/07(土) 01:32:14
>>127 グローバル変数 順番 などで一通り検索して、見つからなかったので
ここで質問させてもらいました。
意地悪言わないで、どうかご教授お願いできないでしょうか?
×ご教授 ○ご教示 知らない言葉を無理して使わないほうがいい
ぐぐればすぐ出てくる グローバル変数の初期化順序は不定
非ローカルなstatic変数の初期化順には何の規定もないので、 初期化順に依存するコードからは、鼻から悪魔が出る可能性がある。 現実には、「初期化コードを必要としない(POD)データ」は 最初から実行ファイルに含められて(必要なら開始時にコピー)いるし 「初期値が与えられてない変数」は、スタートアップルーチンで0に埋められる。
133 :
126 :2007/04/07(土) 02:16:22
>>130 勉強になりました^^;
>>131 >>132 グローバル変数 順序 で検索したら、出てきてくれました。
順序が不定ということがはっきりわかりました。
これで安心して眠れます。
ご回答ありがとうございました!
zero initialization static initialization dynamic initialization の順に初期化される(らしい)ので依存できたりできなかったりする
String s; //char s[50]; いつもはこっちでした。 char* str="hello"; sprintf(s.c_str(),"%s",str); OutputDebugString(s.c_str()); buiderの環境になりまして、動的な感じで文字列の 長さを扱いたいと思ってます。 上記のようにすると、"hello"が出力されましたが、 こういう使い方しても大丈夫でしょうか?
>>135 String s が別のものならばなんともいえんけど、
stlのstringだったら、const cahr *c_str() だと思うからコンパイル時にエラーとか警告が出てない?
s = str で十分だろう。
>>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なり類似のものを使う
ってとこだ。
BCBのStringは、AnsiStringのtypedef。 まあ、c_str()がconstなchar*を返す点は全く同じだが。
140 :
デフォルトの名無しさん :2007/04/08(日) 04:33:31
>>139 SirectShowだろうがDirectShowだろうが、やってみて
壁に当たってあきらめようと思ったり、頭ん中真っ白になって
もうわけわからんってなったりしても、やり続ければ実は実る。
Cを勉強しだした頃を思い出せ、ポインタや構造体や再帰やetc
いろいろ壁にぶち当たってきただろ、それでも続けてきたから
今があるんだろうが。
時計の針だぞ、前に進まなきゃ捨てられるんだよ。
でも寝とけ。
俺はC#で苦戦中じゃ。
>>140 寝たらちょっと復活。気長にやります。アリ。いっぺんに全部理解しようとしてた。神か
>>141 C#か。FrameWork 覚えるので苦戦してるのかな。ガンガレ、でも寝とけ。
142 :
デフォルトの名無しさん :2007/04/08(日) 14:04:10
Visual Studio.NET使ってます Debugモードだとビルドできるのですが Releaseモードにするとエラーがでてビルドできません しかも、そのエラーは自分のソースじゃない部分で起きているんです 未解決の外部シンボル _GUID_PerfMasterTempo が関数 "int __cdecl AdoInit(void)" (?AdoInit@@YAHXZ) で参照されました。 こういう感じのエラーがたくさん出てます どうすればいいんですか?
privateメンバーに構造体のポインタを宣言 コンストラクタでnewによりメモリを割り当てて、以降メンバー関数で使いたいのですが 何故か割り当てたはずのメモリが解放?されている模様。 (Access Violationエラーになり、ポインタのアドレスも0xcdcdcdcdに) こういう使い方って出来ないのでしょうか?
何の問題もありませんが。 再現する最小のソースを晒して味噌。
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; }
(改行が多すぎると怒られるので分割しました。) void main() { Myclass *cmy = new Myclass; cmy->Set(1,2,0); } 再現するソースを載せます。環境はVC6です。cmy->Setでアクセスする際、落ちてしまいます。
> _ST_KIHON *m_stKihon = new _ST_KIHON[20000]; ローカル変数に突っ込んでどうする。
ワロッシュw
え? privateに宣言しているポインタではなくローカルで宣言していることになってるのか?w
×_ST_KIHON *m_stKihon = new _ST_KIHON[20000]; ○m_stKihon = new _ST_KIHON[20000];
154 :
152 :2007/04/08(日) 17:44:05
155 :
150 :2007/04/08(日) 18:12:10
156 :
デフォルトの名無しさん :2007/04/09(月) 02:34:06
vc++を勉強しています 関数呼び出しのときアドレス呼び出しをすると呼び出し元の 変数の値を呼び出し先の関数内部で書き換えることができるのは理解しています 同じようにポインタ変数を書き換えたいのですが、どうやってアドレス呼び出ししたらいいのでしょうか? よろしくお願いします。
>>156 char * foo;
someFunction(& foo);
ということをしたいのなら、
void someFunction(char ** bar);
158 :
デフォルトの名無しさん :2007/04/09(月) 02:55:17
メンバーイニシャライザで0を指定するとどうなるんですか?
日本語でおk
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;
}
これは酷い荒らし
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;は実行されないんでしょうか?
1) はい 2) はい
>>168 ホントですか?
まったくあてずっぽうに解釈したのに俺ってセンスいいのかな?
センスとか以前の問題だろ。
色々突っ込みたいが敢えて何も言うまい。
↑こういう思わせぶりなこと言う人いるよねぇ。 こんな事言って何も言わないなら最初から何も言わなきゃいいのに。
そういうお前の書き込みに、意味はあるのか?
ソースファイルでメンバ関数を書くときに 親クラス名::メンバと書かなければいけないわけですが、 この親クラス名が長けりゃを何回も書くのが面倒なので#defineマクロつかって短くしちゃう ってのはありなんでしょうか? 元に戻すとしても、検索置換一発なんであまり悪く無いとは思うんですがどうなんですか?
やったこと無いからできるんか知らんけどできるならありだろ ていうか毎度クラス名タイプしてんの? 普通コピペだと思ってた・・・
>>175 IDEの支援機能 or コピペでいいじゃん
できるできないは別として、そんなソースコード読みたくない。 あくまで自分用ならやってみてもいいとは思うけど。
やっぱり読みにくくなるんですか? 慣れの問題以外で何か理由とかあるんでしょうか?
あるていど長くても分かりやすい名前なら問題ない。 長い上に意味が不明瞭で、しかも似たような関数や変数が点在したりすると目も当てられない。
>>175 せめてマクロよりはtypedefを使え
定義の部分なんだから変に略そうとするなよ。
Cだけど、関数の仮引数を#defineしちゃうことはあったな。 そのときは関数ポインタを使う必要があって、同じ引数を持つ関数が10個くらいあったから。(しかも長い)
構造体にして渡すという方法は思いつかなかったのか
ヘッダにinlineとして定義できないような長い関数は作るべきではない ゆえに.cppは不要
それ、このスレのネタじゃないから。
189 :
185 :2007/04/11(水) 15:11:58
外部から呼び出す関係で、引数が指定されてた。 今にして思えばラッパ関数でも作ればよかったんだが。 でも、引数が多くなった時に構造体使うのってなんか好きになれない。 あ、複合リテラル使えばいいのか……C99対応してないけど……。
190 :
デフォルトの名無しさん :2007/04/11(水) 23:52:46
char **namelist; これを関数に渡して中身を更新するようにしたいのですが、 引数の指定や渡し方がいまいち分かりません。 誰かアドバイスおねがいします
どう更新するのか分からんので何とも言えない
192 :
デフォルトの名無しさん :2007/04/12(木) 00:02:12
関数の中でダブルポインタに配列を作成して、 その配列のアドレスを**namelistに返したいと思っています。
ダブルポインタってなんですか?
194 :
デフォルトの名無しさん :2007/04/12(木) 00:18:31
えと、私の持ってる本では「ポインタのポインタ」=「ダブルポインタ」みたいなことが書いてあったので、 その言葉を使用しました
>119 >関数の中でダブルポインタに配列を作成して、 >その配列のアドレスを**namelistに返したいと思っています。 そのまま渡せばいいんじゃないの? いいから書いた関数をあっぷしてみ。 じゃなければ呼び出し側をあっぷしてみ。 話はそれからだ。
>>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 ** 型に変換できない」という具合でエラーがでます)
これはどこが間違っているのでしょうか・・・よろしければご助言お願いします。
>>196 STAT型のポインタを保持する配列statの中身はSTAT*だから
STAT stat[i]って宣言だとstat[i]の中身はSTAT型そのものになってしまう
試しにうちの環境で適当にSTAT定義して、STAT* stat[5];って宣言したら通ったから
多分あってると思う!!
>>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);
}
>>197 >>198 それぞれの方法で試したところ、上手くいきました。
質問の回答だけでなく、細かな補足説明までしていただいて
ありがとうございます。勉強になりました&&キュゥンときました。
もっと簡単に書く方法はないんですか? たとえば stat[5]でSTATのインスタンスごと作ってくれて stat[5].member[1]でアクセスできるようなの 多重間接参照ってなんかダサいですし
>>200 配列へのポインタとポインタの配列は別物だからな。
あとSTATの定義を晒さないとコメントできんよ。
>>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;
}
ただ通らないといわれても困るが、なんかメッセージがでてるだろ。 もしCでコンパイルしてるならtypedefがいるんじゃね? typedef struct stat_ { int menber1; } STAT;
204 :
202 :2007/04/12(木) 06:05:58
func()内のmallocの部分で明示的型キャストをつかったりしていくらか通してみた結果 どうやら > (*stat)[i].menber1 がSTATのメンバであるmember1にならないのが原因のようです これを他の部分を変えず、かつ直感的な表現に直す方法ってありますかね?
>>204 単なる誤字だろそれ
member1
menber1
206 :
202 :2007/04/12(木) 06:21:01
解決しました!! これで学校行けますありがとうございました!!! やっぱコピペで済ませるのって慣れてないやばいんですね^^
>えと、私の持ってる本では「ポインタのポインタ」=「ダブルポインタ」みたいなことが書いてあったので、 そうか、面接で「ダブルポインタは自信がありますがトリプルポインタはちょっと……」なんて すっとこどっこいなことを言ってた香具師もその本を読んでたのかも知らんな。
ぬるぽいんた
>>202 C++でこれをコンパイルしてるのなら警告でまくりだろ
トリプルって使う機会無いなあ
三次元のボリュームデータ扱う時にトリプルは使うよ
間接参照演算子って内部実装晒してるのと同じじゃん *一個ならまだ許せるけど、多重はちょっと厳しいじゃん 組み込みとかC++が使えないところってそんなのばかりなの?
だから、ポインタに階層を意味する単語をつけるのが愚なんだって。 リンクドリストなんかどうするんだよ。
教科書どおりに自己参照ポインタを持った構造体を使う これぐらいなら階層じゃなく、「次」とか「前」とか「先頭」みたいに「ポインタ」の意味で使えるから脳足りんの俺でも理解できる で、階層構造どうやって表現したらいいの?
リンクトリストではポインタへのポインタは出てこないだろ
"ダブル"ポインタ "トリプル"ポインタ ダブルって言う人はアスタリスクの数を数えているのかもしれないが、 ダブルってのは階層を示すものではないと考えるのでオレは受け入れられない
最終的には type*************** value のような型になるような構造も普通に出てくるのかなぁ…
終わってるだろ、その*の数
int a[1][1][1][1][1][1][1][1][1][1]; **********a = 1;
複雑なデータだと、構造体が3重になってるくらいはあるけどな。
221 :
デフォルトの名無しさん :2007/04/12(木) 13:09:08
Perlのchop()みたいな末尾を削る関数ってありますか? std::string s = "abcdefg"; でgを削りたい場合は s = s.substr(0,s.size()-1);とやるしかないのでしょうか?
>>221 You、末尾に'\0'を書いちゃえYO!
>>222 std::stringは直接編集してはいけない。
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); } }
>>227 今のOSでは一般のプログラムが見られる場所はそのプログラムに割り当てられた空間だけです。
大人しくargvの辺りでも覗いてなさい。
p=0はp=NULLの意味 ヌルポインタはどこも指していないポインタだから読めるわけがない
略してぬるぽ この問題で一番大事なことは上の事実
231 :
227 :2007/04/12(木) 17:45:46
>>228 でも、diskprobeとかだとMBRが読めたりしますよね?
これって全然違う話なんですかね?mbrをc言語で読み込んでみたいんです…。
というか、OS書くの忘れてました。すみません。
>>229 なるほど。
0番地が読めるかどうかはOSによる
>>231 ディスクの特定の場所を読みたいならディスクのドライバに命令を送って読み出せばいい
>>231 mbrってハードディスクにある奴じゃないのか?
お前が読もうとしてるのはメモリなんだが
>>231 ディスクの先頭セクタを読みたいなら、ディスクデバイスを適当に開けば普通に読めます。
#大抵のOSで。
尤も、それ自体もやはり、管理者権限が必要だったりもします。
処で、>231にもOSが書いてありませんねぇ。
236 :
227 :2007/04/12(木) 18:02:26
>>222 XPは読み込めるんですか?SP2なんですが。
>>233 検索してみます!
>>234 Σ( ̄Д ̄)ガーン
そうですよね…MBRってHDDの先頭セクタなのか!
ってか、メモリの最初には何が読み込まれてるんだろう…。
HDDのデータなんですけど、ポインタでメモリの番地を指定して操作出来るように
HDDもアドレス(セクタ?)で指定して読み込む事は可能なんですか?
それともファイルポインタでファイル名とかを指定する事でしか
読み込めない/書き込めないんですかね?
237 :
227 :2007/04/12(木) 18:07:18
というか、
>>236 の答えって
>>233 なのか!!俺ってなんてばかなんだ!
お騒がせしております(T-T)
>>235 >処で、>231にもOSが書いてありませんねぇ。
申し訳ありません!!!!!!m(T◇T )m
Windows XP(SP2)です。
238 :
235 :2007/04/12(木) 18:12:37
>>237 >235に書いたことがそのままXPにも当て嵌まる。
詳しくは、MSDNのCreateFileの(なが〜〜い)説明参照。
239 :
227 :2007/04/12(木) 18:21:00
>>225 erase は古い環境で名前が違ってたり引数違ってたりすることもあるから、その点は注意な。
全てのデバイスが mmap ってるのはそれなりに綺麗かもしれないな(w
\\
\\\
\ ∧_∧
( ´・ω・)
G と) ガッ
>>242 ヽ⌒)、 \人∧__∧
 ̄ (_) >`д´)')
∨つ /
244 :
デフォルトの名無しさん :2007/04/13(金) 06:51:35
VSでテンプレートの勉強始めました。 普通のクラスを書くときにはヘッダファイルとソースファイルを 別々に作りますが、テンプレートクラスに関しては 同一のファイルに記述しないと外部参照エラーが出てしまいます。 Javaみたいでどうも気持ち悪いんですが、何か解決策はありますか? template <typename X> X CTest<X>::func(){ ... } ↑これをクラスの宣言の後ろに書けばちゃんと動きますが、 別のソースファイルに書くとダメです。
#define HOGE_ template <typename X> X CTest<X>
>>246 さんの示してくれた方法でできました。
テンプレートはあくまでコンパイル時に解釈・生成されるものだというのは
要するにこういうことだったんですね。
ありがとうございました。
newで0で初期化した状態で確保する方法を教えてください。
new演算子はそこまで面倒見てくれないから自分で0代入汁 Windowsなら Zeromemory(pDest, sizeof(type)*size); みたいな感じか、もちろん基本型に限るが
unixなら?
どうよこの超原始的手段 char *hoge=(char *)Dest; for(int i=0; i<sizeof(type)*size; i++) hoge[i]=0; てか、そもそも何をnewで確保するの?
intです。 memsetでもOKですか?
普通にstd::fillでも使っとけ。
>>249 PODなら初期化してくれるだろ
T* t = new T();
e.g.
int* p = new int(); // *p->0
newで初期化の問題云々いうときは大抵配列の方だと思うがね
exportがあればなあ…。
>>248 普通にstd::vector<int>確保すればデフォルトコンストラクタで初期化されるよ
>>255 配列でも初期値で初期化なら問題ないでしょ
int* p = new int[10]();
259 :
デフォルトの名無しさん :2007/04/13(金) 19:25:50
明解C言語の入門と実践編を終えたばかりの青二才未満のものなんですが、 Cを使ったソケットプログラミング(ネットワークプログラミング)を学ぶのに オススメの書籍、又はWEBサイトが御座いましたら、教えていただけますでしょうか。
猫C
そんなの出来るんすか? じゃあ入出力インターフェイスとしてistream/ostream持ってるクラスなら それをそのままhttpストリームにして出力できるんすか?
タイムアウトとか面倒見なけりゃそこそこいけるんじゃね? ソケット ⇔ ファイルハンドル が inetd の仕事だからな。 # クライアント記述だと inetd ダメポかも… ソケットに流すべきパケットのルール = プロトコル は、 千差万別なので 仕様書 (=RFC) を見るしかない。 で、HTTP ぐらいになると、そのルールが複雑怪奇だから難しいさね。
あとC++のiostreamは「その気になれば」、 どんな相手でも入出力できるようにできる。 inetdとか使わないで自前でやるときにはね。
throw()って宣言したほうがいい?
デストラクタのthrow()宣言くらいはいいと思うよ. 絶対に投げちゃダメだから. 全然強制力もないし,あんま意味ないけどね
一利ぐらいはあるんじゃないか。 とりあえずデストラクタとswapにはつける。
さんくす やっぱその程度にしか使えないのね
C++の例外って使いどころが分からない
たまに継承もとのデストラクタがthrow()で宣言されてる場合が・・・
272 :
259 :2007/04/14(土) 04:13:08
>>260 今度立ち読みしてみます。ありがとうございます。
>>261 沢山の回答ありがとうございます。かなり勉強になりそうなので
特にテンプレによく目を通したいと思います。ありがとうございました!
>>270 C++以外の例外について分かっているなら、いっしょだと思うよ。
危険性が違うだろ
finallyなんていらんのですよ
276 :
デフォルトの名無しさん :2007/04/14(土) 12:56:37
HDCに書き込んだ文字や線を画像ファイルとして保存したいのですが、 BMPファイルに保存するだけでも、なんかすげー色々やることあって敷居高いのですが、 HDC渡すだけで勝手に画像ファイル作って保存してくれるみたいな 都合のいいライブラリってないもんですか?
GDI+
278 :
デフォルトの名無しさん :2007/04/14(土) 13:39:09
>>277 レスありがとうございます。GDI+ってプラスって言うくらいだから
さらに高機能でめんどくさくなると思ったのですが、
調べてみたら簡単になってるのですね。
なんか良い書籍ないか探して、GDI+について勉強してみます。
vineLinuxでC++やります。 今さっきまでnamespaceの存在を知らなくてコンパイルが出来なくて困ってました。 よろしくおねがいしまふ
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; }
Express Editinonでは、別途Windows SDKかPlatform SDKをインストールする必要がある。
>>282 Platform SDKは、インストールをしています。
PSDK〜.exeってやつですよね?
>>283 VisualStudio(C++)専用スレへどうぞ。
>>283 VCにPSDKの場所を設定する必要もある。
すみません、C言語に関するご質問です 'a'は一文字、"abcde"は文字列と教わりましたが、では 'abcde'と定義した場合どういう意味になるのでしょうか?
>>286 コンパイラによって"str"と同じだったり、エラーが出たり
>>286 出来たか?
4文字までならできる処理系もないではないが…
>>287 妄想乙。
>>286 シングルコーテーションで囲んだ文字は整数値として扱われるので、
sizeof(int)と同じ文字数までしか書けない筈。
おまけにその値が同解釈されるかは環境依存。
例えば、'abcd'と書いて'a'<<24|'b'<<16|'c'<8|'d'になるか'a'|'b'<<8|'c'<<16|'d'<<24になるかは
同じコンパイラでもバージョンによって違っていたりする。
ちなみにC++だと文字リテラルはcharだ。 互換性を断ち切ったそう多くない箇所なので要チェック。
291 :
デフォルトの名無しさん :2007/04/14(土) 23:36:01
Cで、 !0 が1にならない処理系・コンパイラで有名どころは何があります?
ISOやANSIに準拠してなくてK&Rとの互換性もない処理系
そんなけったいなもの現存してないだろ
>>294 本当!?大丈夫なの!?そんな処理系もうない!?
あぁー僕は今処理系依存コードを書いているよー!気をつけようねぇー!
何を書いてるのか知らんが、お前のレベルなら規格に準拠してない処理系まで考慮することはないだろ。
298 :
デフォルトの名無しさん :2007/04/15(日) 00:09:38
programming初心者です visual c++をインストールしたのですが、c言語を使ってprogrammingの学習をしたいのですが windowsのコマンドプロンプト上でc言語のprogramをするにはどうしたらよろしいのですか? 環境設定等が解らず困ってます。 どうか、ご指導のほどよろしくお願いします。
>>297 どのくらいのレベル以上からだと 規格に準拠していない処理系まで
考慮しなければならない?
せいぜいintが16ビット系にしかあたったことないなー
NULLが0じゃないのにもあたったことないし運がいいだけかなー
> intが16ビット > NULLが0じゃない それはどっちもANSI準拠だろ
rubyが出来るのですが、C++もすぐに出来るようになりそうですか?
いいえ
>>300 NULL==0なものにしかあたったことがない。
というか、NULL==0という前提なコード書きまくりんぐ。
お前はどうだい?
NULLは0の#defineだろ。==が成り立たないほうがおかしい
ぬるぽ
>>305 0はNULLとしてよいがNULLは0とは限らない と書いてあるンだけど・・・
NULLが0でない処理系が今でも生き残ッているのか聞きたいンだが。
ポインタ型のNULLと整数型の0を比較するのはナンセンス。 ヌルポインタの内部表現が0でない処理系ならごまんとある。
>>308 #define NULL ((void*)0)
とされてるCの処理系なら今でもあるよ。
>>308 NULL が 0 でないコンパイラを自分で作ればいいじゃないか
>>309 ポインタが現われるべきところに書かれた0は
整数型として解釈されることはないんだけど。
「16進数の0x1Aはおかしい!整数の中に文字定数'A'が入っている!」
って言っているようなもの。
>>313 ポインタ様と0を比較するというのは
ポインタ様がぬるぽかどうか比較することと等しいということガッ
言語規定で規定されているので、これはおかしくない
318 :
デフォルトの名無しさん :2007/04/15(日) 03:53:39
ぬるぽ
島根県のみなさん、パチンコをするなら、 優良パチンコ店 エイトワン に行こう! 遠隔(※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万人
ぽるの
c++ではNULLは整数型の0で定義されてますよっと。 今林先生の本読んでる
SIMDって何て読むんですか?
C++ではNULLではなく0を使うことが推奨されているわけだが。
>>322 like "Ess, I'm Dee".
>>324 どっちかというとEss, I aim Dee.
>>321 誰も定義の話をしてないだろ
ちゃんと読めよ低脳
327 :
286 :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
void *m = 0;のとき、*(size_t*)&m!=0ということじゃね?
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'; のように使いたいのですが。
>>333 poo(3, 5); って呼び出してるって落ちでは?
こちらではpoo(4, 6)でちゃんと動く。
>>334 poo(100,100)等と入れてるのでそういうわけではないみたいです。
他の部分との影響かもしれないのでもう少しいじくってみます。
>>335 念のためCodeGuardを掛けてみたけど「解放されていません」の
警告以外はエラー出ないねやっぱり。
コピーコンストラクタを使った初期化で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(); }
>>337 コードが足りない。症状が再現する最小のソースを貼って。
#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_; };
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; } こんな感じです。 お願いします。
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)); } これでどう?
ShapePtr Circle::createSimilar() const throw(bad_alloc) { return ShapePtr(new Circle()); } ShapePtr Circle::clone() const throw(bad_alloc) { return ShapePtr(new Circle(*this)); } 悪いこっちの方が見やすいね。
うおお。 いけました。ありがとうございます。 なるほど、ちゃんとauto_ptrにして返さないと駄目だったんですね。
>>343 簡単に言うとそういう事なんだけど、その前にコンパイルエラーに
ならなかった?
_tmain()とあるからVisual C++だと思うんだけど。
ちなみにgcc(MinGW 3.4.2)だと error_cc1.cpp:46: error: conversion from `Circle*' to non-scalar type `ShapePtr' requested のようなエラーを返す。
long long って、まだ現在の C++ の規格には入ってないの?
どーでもいいけどlong longって ちょっと、ちょっとちょっとレベルだよな
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経由関数呼び出しの、バイナリレベルの挙動についてなにか知ってたら教えてくれ〜
関数の宣言で何か(主に呼び出し規約を)ミスってんじゃないの?
__stdcall とか __cdecl とか __pascal って書いてないの?
謎の値というのはひょっとするとthisポインタの可能性もあるかも。 extern "C" で呼び出すようにし、C++の形式の関数は使わない ようにするのが原則だけどそんな事は知ってるよね。
呼び出し規約かthisポインタかどっちかの問題だと思う
this 積むのは __thiscall かメンバ関数だと思うが… C++ って標準は __stdcall だっけか?
__stdcallを使うとCでも他の言語でも整合性がとれたスタックを 提供できる。 ただし、extern "C" を使った場合でもCならばC、C++ならC++で 受けないとthisポインタの絡みでずれてくる。 extern "C"は名前マングリングだけに関係する。
呼び出し側も呼び出され側も _cdecl を明示的に指定している。
extern "C"はDLL側では指定してるが、呼び出し側はどこでどうやって指定すればいいのかわからんw
(GetProcAddress で関数ポインタで呼んでいる)
>>351 >>352 その場合、callの前に push this 的なものが入るんじゃないの?
さらに調べていたら、1のケースでも最後のパラメタは破壊されるようだ。
あと、Debugでビルドするとすべて正常に動く。
メインプログラムもDLLもC++なの? 一度__stdcallにしてビルドしなおしてみてよ。 DEFファイルの書き方はわかるよね?これを書けば extern "C"は不要になるので。
357 :
348 :2007/04/16(月) 14:34:53
あ、355は僕です スマソ >Debugでビルドするとすべて正常に動く。 訂正。DLL側をDebugでビルドするとすべて正常に動く。
>>355 typedef ret_type (__cdecl *pfunc) (arg_types...) PFUNC;
PFUNC pfn;
(FARPROC&)pfn = GetProcAddress();
アドレスを受ける変数に呼び出し規約を埋めるんだ
359 :
348 :2007/04/16(月) 14:36:28
>>358 んにゃ、 _cdecl はちゃんと指定しているよ。
extern "C"は呼び出し側は関係ないってことでいいんだよね?
ああ GetProcAddress() だけで完結した呼び出しなら 明示してるんだから extern "C" はイラネ-な。
>>359 extern "C"はC++の名前マングリングを止めるもの。
メインもDLLも同じ処理系の同じC++で開発するなら必要ない。
(修飾名も同じになるから)
__declspec(ddexport)とか__declspec(dllimport)を使えば
DEFファイルは不要。
GetProcAddressにはextern"C"付けておく必要がある。 なぜならWin32APIには名前マングリングが存在しないから。 それと ×ddexport ○dllexport
まあwindows.hをインクルードしておけばextern "C"は自動的に やってくれるので気にする必要はない。
呼び出し規約以外にも、引数のサイズの不一致とかありそうだな 構造体を値渡ししてたり とか 可変引数だけど個数間違えたり とかしてない?
365 :
348 :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。
それはまずいぞ。 stdcallは呼び出された側がスタックを破棄するので、 スタックにつまれた引数の数を正確に知らなくてはならない。 可変個引数を取る関数ではstdcallを使えない(指定してもcdeclと同じになる)のもこのため。 だからそういう関数ならcdeclにしておけ。
sizeof(wchar_t) の大きさによって定義を変えたいのですが、 #if sizeof(wchar_t) == 4 も #if sizeof(L'A') == 4 も 定数式では無いと、コンパイラが受け付けてくれません。 何かいい方法ありませんか?
C++ならテンプレートを使ってごにょごにょ、 CならWCHAR_MAXの値を見るくらいしかないと思う。
bccでは通った。
でも規格上はプリプロセッサ内でsizeofは使えない仕様のはず
どんなエラーが出てるのかくらい書けよ
373 :
371 :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' 型の再定義
<winsock2.h>は<windows.h>よりも先に#includeする。
375 :
371 :2007/04/16(月) 17:39:38
>>374 ありがとうございましたm(_ _)m
無事解決しました!
#define WIN32_LEAN_AND_MEAN でもよかったとおもた。 Windows.hがwinsock.hもincludeするのが理由とか何とか
WIN32_LEAN_AND_MEAN教えると、必要なヘッダがincludeされなくなってて、また泣き付かれることになるやもしれん。
WIN32_LEAN_AND_MEAN はとりあえず無効化するね。
どっちにしろホントに必要なヘッダはMSDN見ないとダメだからねー
質問があります。 string str[] = {"aaa", "bbb", "ccc", ""}; を宣言して、 string *tmp = str; while (*tmp->c_str()) { printf("%s", tmp->c_str()); tmp++; } とやると、一応cccと表示されループを抜けるのですがこれは正しい処理なのでしょうか? もし間違っているなら正しいやり方を教えてください。御願いします。
>>368 >>369 >>370 sizeofが使えないのは不便ですよね^^
結局、WCHAR_MAXの値を使うことにしました。
ありがとうございました。
>>380 for (string *tmp = str; !tmp->empty(): ++tmp) {
printf("%s", tmp->c_str());
}
自分ならこう書く
!tmp.size()でもいいな
気持ち悪い
385 :
380 :2007/04/16(月) 21:29:02
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; と書いちゃうな・・・・
std::copy(str.begin(), str.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
>>383 tmp->size()では?
つまり論理が逆ではと思います。
あるクラスのメンバ変数としてこんな定義があった場合、 class Neko { classA hoge1; classB hoge2; } コンストラクタは hoge1→hoge2、デストラクタはその逆の順番で 呼び出されているように見えますが、 これはC++の規格として保証されていますか?
いいえ
呼び出される順番は不定ということですね。 ありがとうございました。
自分の処理系では保証されてるんだから それでいいじゃんと思う俺ホビープログラマー
ラベルをまたがなければ上から順、と決まってなかったっけ?
つ[規格票] これ以外の書き込みは嘘だと思え
宣言順だったはずだけど
ラベル云々って人は、メンバのメモリ配置と混同してるかな。
>>389 保障されている。
staticでないメンバ変数は宣言どおりの順番でコンストラクタが呼び出され――12.6.2
デストラクタはその逆順で呼び出される――12.4.6
規格で保障されているとはいえ、初期化順序をあてにしたコードは書きたくない。
エディタで宣言の順番を変えてしまうだけで動かなくなる不思議なコードになる。
とはいえ、そういう初期化順序を考慮したい場合もままあるわけで、そんなコードを書くなと主張するわけにも行かず。
せめて、書かないほうが良いと主張するのが精一杯。
>>390 みたいに、C++プログラマ全員に、規格書をきっちり読んで置けというのも酷な話。
400 :
デフォルトの名無しさん :2007/04/17(火) 01:25:42
a=a++; そろそろ、この類の事象を 不定だの未定義だの屁理屈並べずに エラーにするか動作を定義するか どちらかにすべきだと思うんだ。
>>400 参照が問題を複雑にしてくれるから、とりあえずエラーにするという選択肢じゃ解決にはならんだろうな。
403 :
391 :2007/04/17(火) 04:36:55
ちゃんと規定があったんですね……改めてありがとうございました。 いくつかの値(hoge1とかhoge2とか)のポインタを保持しておいて、 デストラクタでファイルに書き出す、というクラスを C++をやり始めた頃に作ってずっと使っていたのですが、 このクラスのデストラクタが呼び出されるよりも先に hoge1やhoge2が破壊されてしまったらまずいじゃん、 ということに最近気付いたんです。
>>403 親子関係だからセーフだね
親戚同士の順序依存するってーと
>>389 での classB のコンストラクタに
classA のポインタとるようなやつとかかな
405 :
391 :2007/04/17(火) 08:42:26
書き方が悪かったんですが、実際そんな感じです (コンストラクタではなくて、初期化ルーチンの中で ClassB.AddItem()みたいな関数を使うのですが)。 C++はずっと独学でやってきていたので すごく変な構造だったのではないかと不安だったんですが、 幸いにして(?)私にそこまでのオリジナリティーは なかったようですね。ちょっと安心です。
ifstream で デスクトップのファイルが読めません ネットで検索すると同じ質問があるのですが解決してません 多分ファイル名の日本語がヤバそうなのです 環境はVC8のExpressで、Win32コンソールでCLR未使用 コマンドラインから使うタイプです あとマルチバイトにしています 海外のソフトとかデスクトップ上のファイルが不可なので、日本語対応とかあるのでしょうか?
rubyでは数値などもすべてobjectでしたがC++は違いますか? C++が書けるとどういった利点がありますか? ちなみに環境はVineLinux gccです
基本型(int, double, char等のただの数値)はクラス(オブジェクト)じゃない。 正確に言うとコンストラクタは持っているけどC++の中で言うクラスではない。 当たり前の話だけど、利点はどう使うか、何に使うか、何と比べるかによる。
・動作速度が速い ・静的型によるいくつかの利点(当然、静的型には欠点もある) ・オーバーロードが可能 ・コンパイル時に型に関する大部分のバグを排除できる とりあえず思いついたのはこのくらい。
>>406 WIn32は関数名の後ろにAが付いているものはANSI用で
感じはシフトJISとして扱われる。Wがついている物がUNICODE。
ちなみにNT系でANSIなAPI呼ぶとUnicode変換されてWなAPIが呼ばれる
413 :
348 :2007/04/17(火) 15:36:46
デバッガ上でそう見えてただけで実際は正常だったyo orz エラーは別の原因。MFCのデバッグ版をリンクすると正常動作するのに、リリース版だと例外が発生。 うおーデバッグできねえ
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だけになる気がするのですが どうしてならないのでしょうか?
>>414 std::remove()は処理後の削除された無かった最後の要素の
"次の"位置を返す。つまりこの場合はv.end()を指している。
チゴタ。3が削除され、それが4で上書きされる。 つまり、1, 2, 4, 4 となり、二つの4の最後の方を返す。
これを見てもらえば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; }
>>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
^ ここしか消えないよ
419 :
418 :2007/04/17(火) 16:09:46
行頭のスペースがトリムされたorz 最後の行の^は3を指している。
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; }
421 :
414 :2007/04/17(火) 16:34:17
つまり、 removeの返却値は、vの先頭部分に形成された「指定値が取り除かれた配列」の最後の要素を指す のでは無くて、 「取り除かれた配列」の後に続く部分の最初の要素を指す 1,3,2,3,4の例でいうと、v[2]を指すイテレータではなく、v[3]を指すイテレータが返る ということでしょうか?
>>421 そういう事だね。
std::remove()のアルゴリズム自体は要素を削除するというのではなく
削除対象以外の要素を前に詰める働きをする。
そして削除対象の要素の先頭を返すのでそれをerase()にかけてやれば
うまく削除対象が無くなるわけだ。
このテンプレート関数は、first を X に代入し、次のステートメントを実行します。 if (!(*(first + N) == val)) *X++ = *(first + N); このステートメントは、範囲 [0, last - first) 内の各 N に対して実行されます。 この関数は、結果として X を返します。 つまり、述語 *(first + N) == val を真とする要素だけをシーケンスから除去し、残りの要素の相対的な順序を変更しません。 さらに、変更されたシーケンスの終端を指す反復子の値を返します。 いくつ条件にマッチしたかに関わらず、end() が返る でおk?
424 :
414 :2007/04/17(火) 16:44:36
良く分かりました。皆様ありがとうございました。
425 :
406 :2007/04/17(火) 20:12:18
>>411 まじで!あの”A”が謎だった
ほっぺたが落ちたよ!
>>406 std::locale::global(std::locale(""));をmainの頭に書いてもだめか?
Aが謎だったて、msdn見りゃ書いてあるし・・・ そうでなくてもSDKのヘッダ見りゃ#define UNICODEで分けてあるし・・・
428 :
406 :2007/04/17(火) 21:01:38
>>429 お前の環境じゃsizeof(char*) == 4だからだろ
>>430 レスありがとうございます。
buf = (char *)malloc(11);
とかにしても、やはり5文字目から文字化けしてしまいます・・・
recv(sock, buf, sizeof(buf), 0); おいおい bufがcharの固定配列ならありだけど・・・
>>432 char *buf じゃなくて char buf[1024] にして文字化けが
解消されました。ありがとうございました!
って、思ったんですが、1024も文字が送られてくることはめったにないのに、 それだけの領域を用意するってのはもったいなくないですか? どうにかできないでしょうか?
別に大したサイズじゃないしそれくらいどうってことない
buf = (char *)malloc(sizeof(char *)); まずここがおかしい事に気づくべし。 #define BUFFERMAX 1024 buf = (char *)malloc(sizeof(char) * BUFFERMAX); 固定長文字列がイヤなら、最初に固定長数値型で文字数を取得しとくべし。
sizeof()の結果はコンパイル時にきまるから 動的には求まらないから
釣れますか?
えさが悪いよ。取り替えなさい。
いろいろ言いたいことはあるソースだが、 受信データがヌルターミネートされてないオチとみた。
つまり、受信に問題があるという事でしょうか?
いや、あなたにはまだネットワーク以前に覚えなければいけないことが多々あるということ
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をやってみたら、 目的の表示を得ることができました。受信データがヌルターミネートされてない事が原因なら どうすれば解決するのでしょうか?
例えば、素数を解くプログラムみたいなもので、 頭悪いプログラムと、効率化をほどこしたプログラムでは、 計算処理の実行時間が、どれほど違ってくるものか調べてみたいのですが、 その実行時間を調べるには、どうしたら良いのかがわかりません。 環境はLinuxでgccコンパイラを使ってます。 教えてください。
>>445 プロファイラを使うのが一番。
gcc関連でプロファイラツールがなんかあったと思うからそれ探してみ。
>>445 int t1 = タイム
・・・
int t2 = タイム
時間 = t2 - t1
ってやってる
1行ソース変えて性能うpしたかどうか程度ならベンピ
>>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); } どう直せばいいのでしょうか。すんませんが教えてください。 よろしくお願いします。
「うまくいきません」を説明してください。
((float*)buffer)[i]
454 :
ほんとの初心者 :2007/04/18(水) 13:47:22
>>453 ああ、そうやって書けばいいんですか。ありがとうございました。
本見てもググッても、voidポインタが配列を指し示している例がなかなか
見つからずに困っていました有難う。
というか、ふつうは先に float *buffer = (float*)void_buffer; とかやると思うけどけどね
ポインタがどういうものかが分かっていれば、 別に void ポインタが配列を指していない例からでも このくらいは分かることだろう。 ここで、なぜそれでうまくいくのか、を深く考えておかないと、 後々また困ることになると思われる。
C++でコメントをドキュメント化する際のデファクトスタンダードってなんでしょうか? C#やJAVAみたいに言語レベルで存在しないので、何がよいか捜してます。
有名どころはDoxygenかな
459 :
ほんとの初心者 :2007/04/18(水) 18:22:59
>>455-456 追加のアドバイス感謝します。本には配列が初めのアドレスを指すポインタ
だからポインタに配列名を代入してやれば良いとか、いろいろ書いてあって
書いてある事は読めばわかるのですが、まだなかなか応用は利きません。
今回のアドバイスでまた一つ勉強になりました。
int a = 10, b = 20; この2つの変数 a, b の値を一時変数を使わずに相互に 入れ替えるテクニックがあったとおもったけど どんなんだったっけ?
C99の規格書はどこかでダウンロードできませんか?
>>460 #define SWAP(a, b) (a += b, b = a - b, a -= b)
でど?
>>461 JIS X 3010 : 2003 が ISO/IEC 9899 : 1999 に相当する。
JISC のウェブサイトから入手できるはず。
>>460 a ^= b, b ^= a, a ^= b;
467 :
457 :2007/04/18(水) 20:42:33
>>458 DOxygenってJavaDocスタイルなんですね。
ちょっと使いやすいか確認してみます。
Doxygen作ったやつは凄いと思う
469 :
460 :2007/04/18(水) 21:00:16
470 :
デフォルトの名無しさん :2007/04/18(水) 21:48:31
XOpenDisplay()やってなかなか返って来ない時、タイムアウトさせるには どしたらいいですか?
>>465 の例は極端すぎだな。
確かにC/C++でswapすることはあまり意味が無い。
だが、8bit程度の超小型マイコンではまだ現役だね。
C++の文法についてなんですが 派生クラスで新たに作ったメソッドが基底クラスのプライベート属性にアクセス できないのがどうも納得いかないというか。 派生クラスに何も書かなければ基底クラスと同じコードを書いたと見なされ、 違う機能だけ書き足せば良い、というのが継承だと解釈していたんですけど、 その解釈でいくとアクセスできる筈な気がして仕方がないです。 引数付きコンストラクタがそのままでは継承されないのもイマイチ意図が わかりません。 何か根本的な継承の精神を誤解しているんでしょうか?
>>472 じゃ、おまいが新しい完璧な言語を作ればいい
>>472 そのためのpretectedだ。
protectedなメンバ変数はどの派生クラスでも書き換えられるのだが、
逆に言えばどこから書き換えられているのか把握しづらくなるということで、
実際のところグローバル変数と同様に推奨されていない。
(やるならせめてprotectedなアクセサ書けということだ)
476 :
475 :2007/04/18(水) 22:46:29
そこで #define private public ですよ
>>474 有難うございます
う〜ん、わかったようなわからないような…継承の設計意図
派生クラスで新たに作ったメソッドが基底クラスの属性の値を
書き換えはしなくても取得したくなることは良く出てきそうな気がして…
(実際にC++でまともに組んだことはまだ無いですが)
protectedはテンプレートメソッドやファクトリメソッドといった デザパタを意識した設計になると自然と出てくる。 abstractや空実装であることも多く、実装クラスに特性を与えるためによく使われる。 でも既存アプリのカスタマ屋さんあたりだと バグがあったときに直しやすいからprivate禁止だ という方針を立てる人もいる。 ケースバイケースってことでこれもアリかなと思う。
>>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です
>>481 pimage[y][x]と書こうとしても、pimageが只のunsigned charへのポインタなのでできない。
幅も関数に渡して、pimage[y * width + x]とすればいい。
もし毎回書くのが嫌なら、static int offset(int x, int y, int width) {return y * width + x;}でも用意しておけばいい。
484 :
デフォルトの名無しさん :2007/04/19(木) 00:36:19
485 :
デフォルトの名無しさん :2007/04/19(木) 01:12:35
VC++6.0(WTL7)にて。 COMオブジェクトを作成して使いたいんだが、方法が全くわからん。 DLLはregsvr32済みだとして、文字列かGUIDでインスタンスを生成したい。 参考サイトでもいいので教えてエロい人><
486 :
481 :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
(以下省略)
こんな感じの結果を出したいのですが、どう修正すればよいのでしょうか?
> fprintf(fp,"%c ",vect[i].data[j]); < fprintf(fp,"%d ",vect[i].data[j]); 違ったら済まん。
488 :
481 :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
(以下同様につき省略)
でした。
何がいけないんだろう・・・う〜ん
たぶん、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 スレ違いじゃねぇだろ
単純にCOMサーバ使うコーディングが分からないんだろ
>>485 #import でググれ
>>491 #importだとGoogleは#を無視してくれるので悲惨なことになる。
493 :
デフォルトの名無しさん :2007/04/20(金) 14:44:09
環境はVC6です。 ウィンドウのメッセージループ中でクラスを使用したい。 ボタンクリックでクラスのメンバー変数の値を変化させ、画面を閉じる際にそのメンバー変数の値により 処理を振り分ける。 こんな感じの処理を行いたいのですが、普通にクラスを定義すると頻繁にコンストラクタ処理が呼ばれ 負荷が大変なことになりそう・・・。 どういうふうに書けばいいのでしょうか? アドバイスお願いします。
は? 頻繁に呼ばれるって ループ中で宣言しなけりゃいいだけだろ・・・
フォームのメンバオブジェクトとしてそのクラス(A)を宣言し メッセージ処理部分でAのメソッドを呼ばせるようにして そいつから処理させればいいんじゃないの?
>>493 まずはWindowsアプリがどんな構造を持っているか、そもそもクラスとは何なのか理解するべき。
MFCを使わずに開発しているとしても話は全く変わらないから、
とりあえずメインウィンドウをクラスとして書き出してみ。
497 :
デフォルトの名無しさん :2007/04/21(土) 00:57:44
>>492 com import イベント でぐぐったら悲惨な目に会った経験があるぞw
標準入力に関しての質問です。例えば名字と名前を別に入力させて表示したい場合、以 下のコードを考えました。 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()に渡ってしまいます。このよ うな場合、一端ストリームをクリアするのが定石でしょうか?あるいは他に良く使われ る方法があるのでしょうか?
>>498 NUMが1024なら、1500文字打ったとき?
while( fgets(s, sizeof(s), stdin) )
{
・・・・
}
こんなかな?
超えたら2回動く
テキストファイル読むときは、↑みたいな感じで書いた
500 :
デフォルトの名無しさん :2007/04/21(土) 14:21:02
沖縄県の方へ(命に関わる注意事項です) 沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。 民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄 三千万」で検索をお願いします。 この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから… ※一国二制度 簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。 (つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。) さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。 3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。 そして反日教育を受けた中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。 今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。 自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。 発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。
えっと、asmキーワードの意味を教えていただきたいです。
>>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;
}
構造体にクラスを入れられるのは規制して欲しいな。 うっかりゼロクリアしてることに気づかないとか悲しいことが未だにある。 構造体はデフォルトがパブリックなクラスであるって考えはヤバイ。
asmキーワードは、以後のブロックの中身が、 インラインアセンブリ言語での記述であることを示す。
506 :
498 :2007/04/21(土) 16:28:22
>>499 >>502 回答ありがとうございます
>>502 なるほど!理解できました。こんなのを短時間に考え付くのは流石ですね。
たったこれだけの要求にこの泥臭さはいかにもCだなぁ。これは課題の中
から疑問点を抽出して質問したのですが、実際の現場でのこのような要求
はほとんどないということでしょうか?
あと、関数の型がポインタなら、"return 0"ではなく"return NULL"の方が
自然だと思ったのですが、この書き方でもいいのでしょうか?
>503 >構造体にクラスを入れられるのは規制して欲しいな。 structのメンバとしてclass変数を指定することを言っている? そんなのstructを使わなきゃいいじゃん。 structが残っているのはC/C++のコード流用性のためだけにあるものだと思うけど。 classの中にstructメンバが入るのはあり得るとして新規にstructを定義して classメンバを入らなきゃならない状況ってあるか? CのコードをC++として流用する場合ならpublicになってなきゃつじつまが合わなくなると思ぞ。
>>507 他の人が作った struct を使う場合の話じゃね
>>506 ポインタが必要な場面に現れた0は、ヌルポインタとして扱われる。
510 :
502 :2007/04/21(土) 17:07:17
あーすまん、
>>502 だがちと修正。
- while ((c = getchar()) != EOF && c != '\n')
+ while ((c = getc(f)) != EOF && c != '\n')
CからC++ではなく、OO系言語からC++なら std::stringとかメンバにする人もちらほらいるかと。
512 :
498 :2007/04/21(土) 17:38:07
>>509 それは理解していますが、可読性という意味ではNULLの方が上かな、
と思いまして。というのも、私が一瞬理解できなかったからです。
未熟と言われればそれまでですが。
>>502 そうか… fがstdinとは限らないからですね。
>>511 レガシーC使いでもちゃんと勉強している人は構造体をmemset()する愚は理解しているものだが。
実際漏れの勤める会社でも構造体をmemset()する癖のある香具師がど填まりしていたよ。
#std::stringじゃなくてCStringってところがあれだけど。
で、当人曰く、「memset()できないなら危なくて使えないな」という間抜けっぷり。
= { 0 }; で初期化すればゼロクリアになるけど、 コンパイラによっては警告が出て鬱陶しいんだよな。
そこでboost::value_initializedですよ
>>516 多分、内部でSysAllocStringを呼んでるのでわ?
CStringを0でセットすると取得した領域がゾンビになるのでわ?
>>517 すまん。構造体の方。
いっつもゼロ埋めしてるんだけど、これがまずいなら
オレは今から全裸でコンビニに行かねばならん。
>>518 する理由は?
百害あって一利なしなのだが。
#これから食事なので、百害の詳細については後程。
そら言い過ぎ
521 :
518 :2007/04/21(土) 19:44:43
>>519 自分で構造体を使うとき、誕生時に全ての要素がゼロであるような
使い方というか設計をしてるから。
他人のライブラリのときは、どうでもいいけど保険でゼロ梅してる。
とりあえず、もう服は全部畳んだ。
WinAPI に渡す専用の構造体とかは、memset で 0 クリアすることが多いな ZeroMemory だけど
初期化構文使って struct Foo foo = { 0 }; で済ますほうが簡潔な上に、ポインタや浮動小数点数等もよろしくやってくれるな。 まーPODを単にビット的にゼロフィルすれば良いと分かっているケースでは memset()/bzero()/ZeroMemory()の類でもいいんでないの。
>>516 非PODでは、仮想関数テーブルなどソースコード上にないメンバが存在する可能性がある。
また、浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていないので、
PODでもmemsetでの0クリアはするな(初期化子でならOK)といわれる所以。
525 :
518 :2007/04/21(土) 20:06:10
>>524 >浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていない
あ、そうだった! なるほど・・・うかつであった。
以後気をつけます。
ではこのままコンビニに行ってきます。
>>522 つーかWinにおけるMS定義の構造体はMS自身がサンプルコードやらでZeroMemoryしてるしなぁ
まぁ、他環境への移植性を考慮するなら安易なmemsetはヤメテオケってことかと
他の部分でバリバリ環境依存なコードを書いてる状態なら、 構造体の部分だけ移植性気にしてもしゃーないわな。
MSつーかVisualStudioでも、Debugビルドで折角ローカルなオブジェクトは異常値を埋めてくれているのに それをわざわざ無にしてバグの発見を遅らせることになりかねないね。
>>528 VisualStudioの動作する環境で0クリが問題になるのか?
vtbl壊してたらどっちみち動かないだろ?ん?
コンビニから帰ってきました。 今日はなんかスースーしてて寒いね。 いまさら環境依存とかいっても、実際ヌルポインタが0じゃない環境って 冷静に考えたらまず無いよね。浮動小数点も。 ま、そーゆーアーキテクチャが現存してるなら、それに携わるときだけ 気をつければいっか。
スースーしてて寒いのか こっちゃ蒸し暑いぜ
俺は金○を広げながら書いてます。
>>528 意味分からない。
別に 0 クリアは、異常値を無にしてるんじゃなくて 必要な値として 0 を入れてるんだろ?
>>533 それが本来あるべき姿なのだが、
現実には
>>513 のようにとりあえず常に0クリアするという奴が後を絶たない。
宣言時に入る異常値なんて必要無いし
わざわざクリアされて作られた0値だって必要ない
0クリアに頼らずに自前でオブジェクトイニシャライザ用意しとけと言う事か
つまり構造体にはコンストラクタを設けろと。
そして資源の漏れを防ぐためにデストラクタも設けろと でRAII来たこれ
そうしてクラスが出来上がっていく…
ぶっちゃけC++にもBeanって言葉を導入してもいいかもなw
データ構造とアルゴリズムの基本的なことを学ぶのに適した本を教えて下さい
543 :
542 :2007/04/22(日) 01:30:25
すみません、書き忘れました。C言語です
>>539 そこまでするならクラスにしろよ、ってな話だな。
VC++でウィンドウを表示して、その中でFLASHを再生したいのですが どうすれば実現できるでしょうか
COM勉強してきます…orz
>>538 つか、構造体は関数のない方がいいでしょ
使うときは通信とかの場合だし
32バイト単位とかで切ったりするんでしょ
>>542 C++じゃなく、C言語かね、理系?
30年前の凄い有名な本あるけど、・・・古い
Cアルゴリズム大百科、みたいなのがオススメ
中に、クイックソート、挿入ソート・・・、ニュートン法、ガウス・・・
とか載ってるヤツ
WIN32の構造体だけはゼロクリアでいいと思うけどな。 MSがそういう使い方を推奨している以上そう使うのがどおり。 基本的にライブラリの実装者のやり方に合わせる。 それ以外ではいろいろ問題ありだから使わないけどね。
「道理」(どうり) 「通り」(どおり)
Win32の構造体は、いつもHOGE hoge = {sizeof hoge};で初期化している
漏れは毎回毎回、menset か setmen で悩む
構造体の初期化は HOGE hoge = {0};がデフォ
要するに、アレだよな。
C言語コーダが
Hoge h = { 0 };
可能かどうかは自分で判断できるし、
作った時点では問題ないよな。
人様が作った構造体や、自作の構造体でもバカの一つ覚えで
memsetしちゃうのは問題アリじゃね。WinAPIで指定してる場合はともかく。
>>513 が言うように、個別の初期化は多少の手間は増えるけど
安全だし、それでいいと思うけどなあ。
#C++だって、わざわざ初期化リストを設けてるし(C++ならstructでも使えるよ)
>>552 setmenって、男にナニをセットするんだ?
気になって気になって今日は良く寝れそうだ。
setmenは男に何かをセットするんじゃなくて「セットする男達」だろ 常識的に考えて・・・
YO! MEN! いや、setmen は男を何かにセットする関数だろ 常識的に考えて・・・
男の部分を何かにセットするわけか エロいな
>>551 そうしてたけど、最近の VC++ は警告出すから困る。
#pragma で抑制できるけど。
>>552 strcpy, strcat, strchr とか文字列に関するものは str が接頭辞になってる。
同じく、memset, memcpy, memmove とかメモリに関するものは mem が接頭辞になってる。
悩む必要性は無い。
頻繁に使う構造体なら継承してコンストラクタ定義してしまえってじっちゃんが
レガシーAPIに渡せないだろ
こっちで変数定義したものを向こうへ渡すのなら、 アップキャスト(ポインタ・参照渡し)・スライシング(値渡し)が起こるだけで、 言語規格上問題ないだろ。 向こうでオブジェクトが作成され、自分はそれへのポインタを受け取るという場合に 派生クラスへのポインタで受けたら、言語規格上未定義にはなるだろうけどさ。
564 :
552 :2007/04/22(日) 15:30:50
>>560 そうなのか、memが初めなのか
脳内では、セット麺、麺セット、麺コピーって変換してた
>>562 VC++ の CRect は RECT を継承したクラスなんだぜ。
でも、レガシーAPIに渡せるだろ?
仮想関数がないからな。
>>565 ちゃうちゃう。
CRectはRECTを継承してない。内部の最初に保持してるだけ。
is-aじゃなくてhas-aの関係
同様の方法でWinAPI32に引き渡せるMFCクラスあるでよ。
569 :
567 :2007/04/22(日) 16:29:52
>>565 ああ、ゴメン俺のまちがいだった。RECTの継承でよかったわ。
レガシーAPIに渡せるってわざわざ自分で&付けてるのかよwwww 変換演算子あるんだから使えよカスwwwwww
( ´д)ヒソ(´д`)ヒソ(д` )
573 :
デフォルトの名無しさん :2007/04/22(日) 18:24:12
構造体をmallocしたときは初期化はどうしたらいい? 1.気にせずmemset 2.最近のmallocはゼロクリア保障なのでそれを信じる 3.地味に全部真面目に設定
>>573 Cなんだよな。
1.自作の構造体で間違いないのならおk
2.保証されてるかどうかちゃんとCユーザーズマニュアルを見れ
3.一番安全
一方ロシアはcallocを使った
> 最近のmallocはゼロクリア保障 大嘘を付くな
>>576 え、いや、ウソじゃないです。ごめんなさい。うそじゃないです。
>>573 >最近のmallocはゼロクリア保障なのでそれを信じる
ってホントなの?どういう環境での話?
main() {
for(;;) {
struct { int i; } *s = malloc(sizeof *s);
assert(s->i == 0);
}
}
すぐに死ぬけど
0 クリア保証してるのは calloc だろ。
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
>580 だから?
>>580 でも、こういうことは問題ないはず。
void proc(TEST1*);
void f()
{
TEST3 t;
proc(&t);
}
#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 で終了しました 誰か理由がわかる方、いらっしゃいますでしょうか?
問題あるって。TEST1とTEST3には親子関係無い上に、 大体のところ、vtblはメモリ領域の先頭に付くんだから。
>583 FAQすぎるFAQだな。 -lm
-lm libmをリンクしろ
>>584 すまん、TEST1-TEST3は継承関係があると勝手に思い込んでいたorz
>>585-586 ありがとうございました。 一瞬でできました orz
GCCは最近使いだしたので、イマイチわかってなかったんです。
精進します orz
545です。 とりあえず表示は調べてできるようになりました。 ATL+COM、だと思います。 で、実行中のFLASHを右クリックしてもポップアップがでないようにしたいのですが、 どうすれば可能でしょうか?
あ。 そこは作り手任せでいいのか。
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 クラス名の後ろに括弧を置くと、無名インスタンスが
作成されるということなんでしょうか?
>>594 コンストラクタを呼んでいる。
クラス名が書かれているという見慣れない構文だと考えるのではなく、
ただの関数呼び出しがされているだけ。
>>595 コンストラクタのあとに.Create()が付いているのはどういうことなんでしょうか?
コンストラクタは返り値を持たないので、返り値に対してメソッドを呼ぶことはできない
と思うんですが・・・
作成された一時オブジェクトに対するメンバアクセス
>>597 コンストラクタを直接呼び出せるとか、そういったマニアックな構文の情報が
載っているWebサイトか本はないでしょうか?
これから先も見慣れない構文がどんどん出てきそうなので・・・
いやこれマニアックってレベルじゃねーぞ
コンストラクタを直接呼び出すのは標準には無かったような。 まあ規格書でも買っとけ。
>>600 手元にあるプログラミング言語C++第三版にもコンストラクタを直接呼び出す
云々の説明がないので気になってました。(そもそもテンプレートの型指定に
テンプレートを使ってる時点で既にマニアックですね)
var=var++; の実装依存にならざるを得ない問題について詳しく知りたいのですが、 なんて検索すればいいんでしょうか。
>>600 いやコンストラクタを直接呼び出すなんて大げさな表現だが、
実態はただの一時オブジェクト作成だろ。
"demons fly out of your nose"
>>606 君は何を言っているんだね?
少々落ち着きたまえ
副作用完了点で調べてもいいな
i=i++;って、いつになったら不定じゃなくなるの?
i=i++;の動作が定まったところで誰が喜ぶのか
不定だ未定義だって言ってるのが全て定まったらみんな喜ぶ。
何%が喜ぶかは未定義なので、みんなが喜ぶという前提で書かれた文章は 異なるプラットフォーム(同じ信仰を持たない人相手)では意図した通りに動作しない可能性があります。
決まって困る香具師はそれほどいないだろ。 コンパイラベンダも最適化オプション間で同じ動きをするようにわざわざ調整するくらいなんだから。
i=i++;ってどういうときに使うの? ++演算子を変なオーバーロードしててその副作用が欲しい時? まだ始めたばっかだからであった事無いけど、 そのうちそんなややこしいことし無けりゃならないような設計をせざるを得ないような状況って出てくるの?
これを「しなきゃならない」状況はたぶん無いと思う・・・
出てこないのでどーでもいい
とりあえずコンパイルエラーになって欲しいな。
i=i++; は単なる例え。 a[i]=i++; でもいい。
そんな1文にしなくても。 どうせ最適化してくれるよ。
>>601 つ 10.4.10 一時オブジェクト
一時オブジェクトは、コンストラクタを明示的に起動することによっても作成される。
623 :
デフォルトの名無しさん :2007/04/24(火) 01:27:27
クラス定義を全てヘッダファイルに書いてはいけないのでしょうか? 本来メンバ関数は実装ファイルに書くことになってますが、 ソースが二カ所に分かれるのは明らかに扱いにくいし、保守性が悪そうなのです。 関数の入出力は宣言として書く必要がありますし。 もっともそうすると、main以外はクラスのメンバとしているため、 実装ファイルに書くことが無くなってしまうわけですが。
>>623 普通CやC++のオブジェクトファイルははソーステキストの
変更の有無で再コンパイルするかどうか決まるので、
>>623 をやってしまうとそのクラスの実装を少しいじるだけで
関係するすべてのソースを再コンパイルする必要が出てくる。
小規模プロジェクトならまったく問題ない
話はそれるけどクラステンプレートは事実上ヘッダに全て書かざるを得ない
ある程度でっかいの作る時は 1クラス1ソース&ヘッダぐらいに分割するべきなんでしょうかね? なんかプロジェクトフォルダのファイル数が1000超えてるんですが
>>626 1ソースに限定される規定は無い
1クラスが2ソース使ってようが3ソース使ってようが関係無い
そしてファイルを分けるとともにフォルダも分けることを考えなさい
むしろ別プロジェクトにしてダイナミックリンクするようにする!
>>626 ・・・て、1クラス=2、3ファイル!?
基本、クラス名=ファイル名で、1クラス=1ファイルにしてる
あとフォルダと、分割も
ソース入り乱れてヤバくならない?
>>629 別にダイナミックリンクしなくても、
スタティックライブラリ作って
スタティックリンクでいいじゃん。
DLLもどうにかならんかな 確かに便利だが、ぐちゃぐちゃになるよね
>>345 ならなかったんですよね。
って返事遅れました。スマソ。
C++FAQなんですが、意味不明な訳とこういう
コンパイルエラーなコード以外は結構いい本っぽいんですけどね。
プレゼンテーション層と機能層とデータ層みたいな分離は それぞれ別ライブラリにして分離すればいいのかな?
ASCIIコードで規定されていない文字(日本語とか)を 書式指定で表示したい場合ってどうするんですか?
ワイド文字を使う場合は %lc や %ls を使えばいい。 そうでない場合は、使ってる処理系のマニュアルを読んでくれ。
別にどうってことはない。何も変わらない。 マルチバイト文字を%cで出力しようとかそういう無理なことをしようとしない限り。
>>637-638 トンです。
初心者ですまないのですが、
C言語で文字形態を全部2バイトのワイド文字にするのってどうするんですか?
そのまま書いたら'a'は1バイトで'あ'は2バイトですよね。
Cなら文字リテラルはint型だから 'a' も 'あ' も sizeof(int) バイト(尤も後者は期待通りのものではないが) ワイド文字が欲しければ L'a' や L'あ' と書く(ワイド文字リテラルは wint_t 型)
'あ'は2バイトかもしれないが、ワイド文字ではない。 C/C++でのワイド文字リテラルはL'あ'のようにLを前置したもの。 同様にワイド文字列リテラルがL"いろは"という風に存在する。 このワイド文字はwchar_t型になるが、sizeof (wchar_t) == 2とは限らない。 UCS-4を採用して4になっている環境もある。 ワイド文字(列)・マルチバイト文字(列)の相互変換する Cの関数はwctomb, wcstombs, mbtowc, mbstowcs。 C++もロケールと関連して同様のものがある。
L"Σ(;´Д`)<オ、オマエモナー!" のエンコーディングって成功したりしなかったりしない? ソースがSJISでVCだとうまくいったけど、 cygwin環境でコンパイルしたら失敗したorz
cygwinだからね
>>642 --input-charset=CP932 --exec-charset=CP932
>>642 cygwinはlocaleまわりが糞でmbstowcs()等が使い物にならんから諦めろ。
ワイド文字リテラル自体はiconvを扱えるバージョンのgccなら
charset指定すれば大丈夫だが、libcが腐っているのでは仕方が無い。
とりあえずwin32のDir::openをUTF8対応にしてみて成功したが、 その後、ruby1.8は肝心のファイル作成がfopen経由なのを忘れてた。 wfopenはライブラリが頼りなさげなので、これでは片手オチなのでボツ。 1.9追いかけてみるか・・・
647 :
623 :2007/04/24(火) 21:42:28
>>624 ありがとうございます。
そういうことであれば、ヘッダにクラスを実装する方向で考えます。
>>640-641 ありがとうございます!
基本的なことっぽいのに初心者用の本にその辺のことが書いてなかったので
非常に助かりました!
>>644 ありがとうございます。
--input-charsetとか知らなかったです。
>>643 >>645 cygwin環境が根本的におかしいのですね^^
解説ありがとうございました。
recv_serverでWSACleanupしてるから。 recvがSOCKET_ERRORを戻すと、Winsockが やる気なくして全部のソケットが死ぬ。
>>651 ありがとおおございます!
WSACleanup()をWM_DESTOROYの所に移したら正常に動作しました!
3時間の悩みが8分で解決するとは・・・
さすがにスレ違いすぎやしないか?
>>653 winsock関係の質問スレッドがなくてここで質問させてもらいました・・・
Cっぽい香りもほのかにするので、許してもらえると思いました・・・
ソケットとかWinsockで検索してたので・・・orz 誘導ありがとうございます!
下記のようなソースを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; }
>>657 BCC5.8.2では警告出ないよ。
多分古いBCCのバグだね。
inlineが先に働いてるとか?なんて適当なこと言ってみる。
最新版では直ってるかもしれんけど、bcc はインライン展開や最適化の結果で 使われなくなった変数・オブジェクトに対して使われてないっていう警告を出すよ。
661 :
657 :2007/04/25(水) 01:47:41
>>658-550 回答有難うございます。
bccはBorlandからフリーダウンロードできる5.5.1です。
かなり古い物ですね。
原因はインライン展開の結果、
使われないと判断されたということのようですね。
今のところ実害は無いので、気にしないことにします。
警告は全部潰したいのだけど・・・。
662 :
657 :2007/04/25(水) 01:50:14
ちょっと質問なんですが、メンバイニシャライザを使った場合は文字通り「初期化」であって 「代入」ではないってことで良いんですか?
そう
666 :
デフォルトの名無しさん :2007/04/26(木) 20:40:59
ファイルポインタaからnバイト読み込んで、ファイルポインタbにそのまま書き込む標準的な関数はありますか?
fgets/fputsで何の不満がある
バッファを確保するのが苦痛なんです。
#define fthru(fin, fout, n) do while(n--) putc(getc(fin), fout); while(0)
それはダメだろw 普通に関数にしろよ #define fthru(fin, fout, n) do { size_t m = (n); while(m--) putc(getc(fin), fout); } while(0)
setvbuf()でバッファ取れよ。 いくらなんでも一文字ずつじゃ遅いだろ。
普通に適当にmallocでがさっと確保して読んで書く関数を用意しときゃいいだろ。
>>671 マルチスレッドを意識したlibcの場合、getc()/putc()は古典的な
マクロ実装でない上に、呼び出し毎に(つまり一文字単位で)
排他制御を行うようになっている実装が多い。
例えばVC++の場合、シングルスレッド版のスタティックリンクライブラリ
以外ではそうなる。マクロ+排他無しと関数呼び出し+排他ありでは、
当然速度面で劇的な違いがある。
古典的にはgetc()/putc()はそれほど遅いものではなかったのだが、今時は
速度が気になるケースでは使わないほうが良いかもしれない。
>>672 getc()/putc()であっても、特に何もしなければデフォルトのサイズ
(BUFSIZ)のバッファが使われ、その単位でのI/Oが行われる。
setvbuf()はBUFSIZでは不十分だというのなら初めて使えば良い。
getc()/putc()が遅いというのは、また別の次元の話だ。
>>674 それは初めて聞いた。getc()/putc()の中身をトレースしてmutexの
呼び出しがあるかどうか確認してみる。
678 :
677 :2007/04/26(木) 22:32:31
わー本当だ。VC8 + STLportなんだけどcritical section 使ってた。
ここまで俺の自演
MSDNを見るとロックなし版は別にあるね。 _getc_nolock、_getwc_nolock _putc_nolock、_putwc_nolock
// 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' : 定義されていない識別子です。 な、なんで?
>>681 × iostream.h
○ iostream
× cout
○ std::cout
自分で書いたんならいいが、コピペ元の本やサイトがあれば晒しとけ。
>>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;
}
つ[std::cout]
using namespace std; ってうんこな方法って聞いたんですが本当ですか?
>>685 関数内とか、閉じたブロックの中でやる分にはほとんど害は無い。
グローバルや名前空間内でやるのはうんこ。ヘッダでやったら死刑。
stdの範囲がもう少し狭ければ使ってもいいと思うのだけどね。 旧形式のヘッダまで、こんな感じで<cstdio> 詰め込むとか狂気の沙汰だ。
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; } } こんなのはどう?
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の存在を知らなかった。 なんてことは起こらないだろうと思っていると、痛い目に遭う。
>>680 それはVC++8.0からだな。
VC++8.0でシングルスレッド版スタティックリンクライブラリ(LIBC.LIB)
が廃止された関係で作られたんじゃないかな。
>>686 >>687 >>689 なるほどなるほど
実験用に書くごく小規模のものを除けば
ソースファイル内でのusing宣言程度にとどめておいたほうが無難ですね
「C言語 FAQ 日本語訳」13.17で、「rand()を呼ぶ前に毎回srand()を呼ぶよう な真似はぜったいにしてはいけない」とありますが、これは何故でしょう?具 体的にはどんな問題がありますか?
>693 乱数の質がとても悪くなる。
適当な例。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
srandに同じ値を渡したら同じパターンで出続けるから 毎回srandで時刻を渡してたら1秒間はまったく同じ数字が出る
>>693 毎回srandを呼べば済む場合というのは、
そもそも最初からsrandに渡す値を乱数として扱っても問題ないってことだ。
700 :
693 :2007/04/27(金) 17:00:32
色々返事を有り難う。
>>697 最初のループ出力と最後のループ出力(2番目は論外)
の標準偏差を比較すると、最初のループの方が7.8倍
も大きいから、この場合は毎回srand()をしない方が
圧倒的に勝れていると言うことは実感としてわかりま
した。
そこで試しにより細かく、gettimeofday()を使って時
間をマイクロ秒単位で出し、同様に標準偏差を比較す
ると、今度はsleep()を使用せずとも結果は1.08倍と
なり、誤差程度になりました。
このことから、時間を充分に小さくすればランダムに
なると思います。ただし、そんなことをしても関数
callの分オーバーヘッドが増えるだけで、何らメリッ
トはない。つまり、毎回srand()を呼ぶことが「絶対
」駄目な理由とは、アルゴリズム上いけないと言うこ
とではなく、単に「無駄」だから、と自分なりに結論
づけましたが、どうでしょうか。
>>699 いえ、例えば上記でいえば、gettimeofday()のマイク
ロ秒はランダムな数値とは言えないので、そうとも言
い切れないと思います。揚げ足取りなら申し訳ない。
なんで無駄だから、という考えになるのかわからん。 そもそも、なんでsrandが必要なのか考えたことある?
>「絶対」駄目 結局文脈次第。法律で禁じられてはいないし、プログラムが落ちるわけでもない。 そんなにやりたいならやっていい。 「こういう使い方をする」と想定されて作られた物の、その使い方に従いたくない理由がさっぱりわからないが。
「ZeroFillされた構造体が欲しいのでcalloc()を使いました」というくらいナンセンスなんだけどね。
704 :
デフォルトの名無しさん :2007/04/27(金) 18:07:57
質問 gccでコンパイルする時 parse error before "ナンチャラ" ナンチャラは引数の型名 って出るんですけど 原因がよく分かりません どなたかこのエラーについて教えて下さい
知るかよ。行数でてるんだからその周辺のコード晒してみろ。
エラーがどうしてもわからなかったら、そっくりそのままGoogleにかける手もある。 この場合は単純すぎるが。 前の行でセミコロンとか中括弧が抜けてるとか、そんなもんじゃないのか?
わざわざわかりにくくしてから質問するのは、クイズを出題してるつもりなのかね。
エスパーがなぜエスパーと呼ばれるかわかっていないようだな
709 :
デフォルトの名無しさん :2007/04/27(金) 20:43:31
ポインタが指す変数がconstになるようなポインタってどうやって宣言すればいいんですか?
const char *とかじゃ駄目なのか?普通にこれで、指す先の内容を変える事は出来なくなるが
711 :
デフォルトの名無しさん :2007/04/27(金) 20:50:32
ポインタ → int * ポインタの参照先がconst → int const * ポインタ自体がconst → int * const 上記二つの複合 → int const * const
で、int const * と const int * は等価。
713 :
デフォルトの名無しさん :2007/04/27(金) 21:03:24
ややこしいですnえ なんか簡単な読み方というか覚え方というか無いんでしょうか?
全くややこしくないぞ。 int const *p → *p が const int * const p → p が const const の右にあるやつが const ってだけの話だ。
適当だな
これしかパターン無いんだから覚えちゃえよ。 わかりにくくなったらtypedefで単純化するんだ。
const int が話をややこしくしてんだよな。 例外的なスタイル( const が左側にある )なのに一番一般的な使い方だという。
例外? 別に例外でも何でもないと思うが。
>>718 const int == int const みたいにconstを
右においても左においても同じ意味になるのなんてこれだけ。
他の場合は const を書く位置が厳密に決まっている。
型と型修飾子は順序不問ってのは どの型修飾子においても同じで例外ではない。
>>720 ちょww、基本型の話してんじゃねぇよ。
const int (== int const) と違って
int * const, int * const *, int ** const 等々に代替表現は存在しないってこと。
>>723 それでも const int っていう表現は規格としては許すべきじゃなかったと思うぞ。
この表現があるせいで、 int * const のつもりで int const * って書くヤツが後を絶たん。
constキーワードは右結合なんですか?
staticの場合も同じなんですか?
>>727 staticは記憶クラス
constは型修飾子
>>724 そうなのか。
しかし、int const * はちょいキモいな。
static const int a; static int const b; const static int c; const int static d; int static const e; int const static f; 全部同じ。
735 :
733 :2007/04/27(金) 22:37:08
どう見てもちがうだろ
このやりとりの方が難しすぎw
ごめん。難しくしすぎた。
latexみたいにキーワードの適用範囲を\const{hoge}みたいに指定するとしたら constやstaticってどんな表現になるんですか? int const * int * const int const * const についてお願いします
latex は知らんが \const{int} * \const{int *} \const{\const{int} *} こんな感じ?
つーことはconstは左結合なのか
>>742 const int みたいに右でも使えるよ。そもそも修飾子だから結合ってのもおかしい。
×右でも使える ○右にもかかる
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オペレータを差し替える事ができるのでしょうか?
>>745 差し変わらないということを示す最小限のプログラムを作ってみてくれ。
自分で定義した operator new の中で cout に何か出してみて、
それが実際には表示されない、というようなやつでいいよ。
一切の条件分岐文を使ってはならない,4の倍数を求めるの方法教えて欲しい
4の倍数を求めるって何 4の倍数を列挙すんの? ある数が4の倍数かどうかを判定するの?
#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;
}
一切の条件分岐文を使ってはならない,4の倍数を求めるの方法教えて欲しい
for の第3式は、条件分岐文って言わないのかな 言わないか
日本語でおk
748 で終了でいいだろ。はい次の人どうぞ。
>>751 素因数分解をしたいんですが、その前に
1とその数字自身でしか割り切れない自然数が素数
とのことですが、このとき 1はなぜ素数ではないのでしょうか
1も、1とその数字自身(1)で割り切れるので素数だと思うのですが・・・
あと、なぜマイナスは対象外なのでしょうか自然数だけでなく整数まで対象を広げたら
面白いと思うのですが、なぜやらないのでしょうか
ありがとう!!
>>755 素因数分解の結果が一意に定まるようにするため。
1を素数と認める、マイナスにまで広げる、はいずれも素因数分解の一意性を破壊する。
>>755 素数とは1とその数自身以外に正の約数をもたない1より大きい自然数のことだ
数学を勉強しなおせ
>>755 世の法則なので
面 白 け れ ば い い と 言 う も の で は な い
つーか文句はその昔素数を考えた数学者に言え
760 :
745 :2007/04/28(土) 19:56:15
ごめんなさい、newをマクロでさわっているところがありました。 orz
>>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をキャストするしかないでしょうか?
>>762 あるいは num の型を変える。それがダメならキャストが最善手だと思う。
>763 もちつけ >762 で num はまったく関係ないぞw
765 :
762 :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使おうかなあ…
numをintにしとけばいいんじゃね
767 :
766 :2007/04/28(土) 20:50:05
違った勘違いしてた
768 :
766 :2007/04/28(土) 20:56:31
あれ?いいのか ちょっとうんこして来る
とりあえず整数とか自然数は世の法則じゃないと思うんだ
771 :
755 :2007/04/28(土) 21:28:19
なんで755がそんなこと言うのかw
769 は別にせめてないと思うけど。多くの人間にとって数学は一番楽な暗記科目なのは事実だし。
774 :
770 :2007/04/28(土) 22:37:35
俺はまだ19だ 定義されてしまえばそれまでの経緯なんて何の意味もねえ 数学は暗記科目なんかじゃなくて芸術なんだよ センスのないやつは触れるな
775 :
770 :2007/04/28(土) 22:39:57
俺を騙る意味がわからない
っつーかお前誰よ
騙 って字がなんか変なような気がする。 多分winアップデートでフォント最新にしたからか
プログラム板って何でID出ないんだろね 歴史的な経緯?
運営板に問い合わせてみたら
>>778 IDはひどい板にしかないんだよ
ここもひどいだろって? いやいや
ここはとても平和な板だよ
まるで日本みたいな板だよ。 酷くないかと問われてみれば酷い面もあるし、 酷いかと問われてみれば酷くない面もあるし。
まじで酷いのは掲示板の向こう側だからな
C、C++、Javaを用いて、ネットに存在する情報を取得したいのですが、可能でしょうか?
使用目的は、 「株式の時系列データを取得し、株式の解析に用いる」 です。
例えば、プログラムを実行すると、
http://table.yahoo.co.jp/t?s=5010.t&g=d 上記ページの、
2/16〜4/27までの始値、高値、安値、終値を取得する。
そして、それらを数値として変換し、解析に用いたいのです。
研究室の条件により、C、C++、Javaのみでプログラムを作成しなければなりません。
可能でしたら、参考になるWEBサイトを教えていただければ幸いです。
よろしくお願いいたします。
>>784 誘導ありがとうございました。
そちらのスレで聞いてみます。
>>688 明示的にバッファ使用してますね。苦痛です。
fopen したら勝手にバッファ取られるんだから、finのバッファからfoutのバッファに直接コピーすべきだと思います。
>>786 > fopen したら勝手にバッファ取られる
そんな保証はどこにもない。
>>786 良く判りませんがシステムコールのread, writeつかえばよいのでは?
>>787 保証とか関係ないと思われ。
互換性無くて良い上に、ファイル記述子使って良いんなら、sendfile とかがあるけど。
いや、でも今回のウォーズマンの相方ってマンモスマンなのは ほぼ確定でしょ?
sendfileはだいたいの場合、書き込み先のfdが ソケットである必要があったはず。
16ビットのPC98で計測した16ビットの浮動小数点データを、32ビットOSのWindowsXPで読み込むにはどうしたらよいのでしょうか?
案1) バイナリでやりとりせずにテキストでやりとりする。 PC98側 sprintf() WinXP側 sscanf() 案2) それぞれの浮動小数点フォーマットを調べ、互換するようにビットセットしていく
PC98といえど、浮動小数点はx87とかが 扱ってたと思うから、16bitってわけないとおもうけどなー
>>794 DOS版じゃないROM/DISK-BASICの浮動小数点はIEEE754ではなかった記憶があるなぁ。
16bitのMS-Cに変換用の関数があった気がするが、古すぎて資料が出てこない。
>>795 あった、これだ。MS C/C++ v1.5まではサポートしているらしい。
_fmsbintoieee
_dmsbintoieee
797 :
デフォルトの名無しさん :2007/04/30(月) 19:48:55
最適化というか実行速度で悩んでいます。 ウィンドウプログラムの練習でC++でファイル内容を16進数表示させて表示するソフトを 作っています。一応完成したのですが300Kbyteみたいな大きいファイルを 処理させようとすると、処理が終わるまで1分以上かかります。 フリーソフトで同様のソフトをみても巨大なファイルでも一瞬で表示しています。 30行くらいのコードなので貼ったら教えてくれますか?
まあ、まずは見せてみれ
>>797 ウィンドウに表示してない部分までファイルから読み込んだりしてないよね?
バイナリエディタの基本は表示してない部分はメモリに読み込まないこと。
たぶん、そうするだけで実用的には問題ない程度の速度になると思うよ。
800 :
797 :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 よろしくお願いします
801 :
797 :2007/04/30(月) 20:17:05
>>799 PeekMessageのPM_REMOVEを使って何もメッセージが発行されていないときに
すこしずつ表示しています。だから大丈夫です。
strcat自体がO(N)の操作なので、それをループで回すとO(N²)となる。 sprintfとその返値を使うなどして、O(N)に引き戻してやれ。
>>800 速度とは関係ないけど、文字列リテラルの最後の \0 は不要だろう。何のつもりだ?
804 :
797 :2007/04/30(月) 20:42:47
>>802 考えてみます
>>803 文字列の終端記号です
また考えてみます ありがとうございました
やっぱり、文字列リテラル終端の\0は、基本的に コンパイラが補ってくれることを知らないのかね?
806 :
797 :2007/04/30(月) 21:14:06
今知りましたどうもです(^^)
807 :
デフォルトの名無しさん :2007/04/30(月) 23:37:00
>>797 俺ならファイルマッピングを使う。
だが、お前には無理だ。
俺、strcatを使ってるコード見ると「センスねーな」と本気で思う。 sprintfの方がずっと簡単で見やすいし どうしても速度を求めるならばstrlenやmemcpyを使うべきだし。
もしstrcat内部でstrlenやmemcpyが使われていたら?
>>809 お前はまず、なぜ strcat を使ってるコードがダメなのか理解してから出直してこい。
前レス読んでなかった
std::stringの+=使ったらもっと効率悪くなるかな?
>>812 string は自分の長さ覚えてるから、 reserve() しとけばだいぶマシ。
>>812 dくすこ
むぅ、size()を呼び出すオーバーヘッドを含めてもそこそこの性能なのか・・・
手軽に作るならこれで十分なのかもしれんね
std::stringに対してchar文字列を+=する時には、 追加する分の長さをstrlen相当する必要があるけど 元文字列の長さは保持してるからね。 strcatは両方の長さを毎回strlenしてるのに相当する。 (本当に速度を求めるなら、長さは別途保持してmemcpy) ただ、std::stringは参照カウンタで保持している場合が多いんで 書き換え(追加含む)時にはそのへんの処理が余分にかかるかな(reserveしてても)。 もちろん、バッファが小さかったとき (sprintfの場合だと、"%.200s"等で最大長を指定して入りきらなかったとき) の心配をしなくていいから、書く側にとってはすごく気楽だね。
>>797 >wsprintfA(lpszTemp, "%.2X", *lpFileData2);
>strcat(lpszTemp, " \0");
これがすげえキモい
>>815 参照カウンタの実装なんて当の昔に廃れただろ。
16進数を文字に変換することに特化するならsprintf使うのは愚かだな。 普通は"0123456789ABCDEF"というコンストな文字列を使って4ビットずつ処理するだろ。
>>818 それは極端に速度が要求されてるとき。もしくは sprintf() が動かない環境での回避策。
sprintf() のほうが圧倒的にコード量が少ないんだから、それで済むのにわざわざ
自分でループまわすコード書くのは愚かだ、とも言える。
いろんな方法があるだろうが、それらから適切なものを選ぶ理由を見つけるべき。
技術者なら軽々しく「普通」とか言わないように気をつけたほうがいい。
符号なし整数型の変数 n が、4の倍数であれば、"n is ROUND(4)"、 >> 4の倍数で無ければ、"n is not ROUND(4)"のプログラム教えて
>>820 printf("n is %sROUND(4)", n % 4 ? "not " : "");
822 :
818 :2007/05/01(火) 12:10:22
>>819 を無視して言わせてもらうと、"0123456789ABCDEF"は8バイトや16バイトパラグラフの環境だとメモリの無駄使いになるから配列を使うべきだったな。
質問させて下さい。 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を開いてしまいます。 変数の追加や変更があっても構いませんので、良い方法があれば教えて貰えないでしょうか。
sprintf
>>822 パラグラフ境界に置くコンパイラばかりじゃないので一概には言えません。
底が浅いのがバレバレですよ。
>>822 もういい。しゃべるな。自分が新しく知ったことは何でも役に立つとは限らないと覚えておけ。
>824 もう少し詳しく教えてあげなよw sprintf(変数,"t[%d].txt",n); fp=fopen(変数,"a+"); って感じで
boost::io::str(boost::format("t[%1%].txt") % n)
829 :
797 :2007/05/01(火) 19:10:58
831 :
797 :2007/05/01(火) 19:48:20
>>830 皆さんの意見が理解できるようなレベルになれるようがんばります!!。
意見くださった皆様本当にありがとうございました。
とりあえず、malloc の結果を放置してるのは
_ で始まるグローバルシンボルは予約語だから _node じゃなくて node_ にすべきだが コーディング規約がそうなってるなら仕方がない。
835 :
832 :2007/05/01(火) 20:19:51
>833 それでした・・・。 mallocしただけで、やった気になっていました(汗 >834 この課題ではそのようになっているので、しょうがないのですが、今後自分でやる際は注意させてもらいます。
836 :
デフォルトの名無しさん :2007/05/03(木) 01:29:58
高速で比較的少ない量の動的メモリ領域確保のために、ヒープではなくスタックを使いたいのですが C/C++でそういうことができる、mallocなどの標準ライブラリのような位置づけの関数はないんでしょうか。
allocaってのがあるけど、標準ではないね
>>837 まぁ、でも alloca は準標準と言っても過言じゃない。
あるがとうございました
えりがとうございました
>>836 C99なら可変長配列を使える。
void func(int foo) {char buf[foo];}
なんてことができる。
842 :
デフォルトの名無しさん :2007/05/03(木) 09:03:02
ファイルアクセスの監視って技術的に可能? Aというフォルダがあって、そのフォルダにアクセスしてきたプログラム名を摂取、 とかやりたいのだが・・・。 C++の内容とかけ離れててスマン。
Windowsとは限らんかもしれんがOS依存になるから、 そのOSのスレに言ったほうが早い。 通常のファイルIOでは他からのアクセスまではわからない。
>>842 Windows の場合、ファイルシステムフィルタードライバを書けばおk
sysinternals のヤツもファイルシステムフィルタードライバで拾ってる。
C++でファクトリークラスCFactoryとそのインターフェースIFactoryがあり それから作られるクラスCProductとそのインターフェースIProductがある ここでCProductをCFactoryの中からでしか作れないようにしたい (CFactory外部でnewしようとするとコンパイラエラーが発生する) んですがどうすればいいんでしょう?
ポインタを非ポインタ型にキャストするというのは例えばどういう事なのでしょうか?
// sizeof(unsigned long) == sizeof(int *)だぞ、絶対だぞ! // あと規格厳守の世界の住人から突っ込まれるかもしれないけど、耳をふさぐんだぞ! int x ; int * p = &x ; unsigned long val = reinterpret_cast<unsigned long>(p) ; // 戻すとき int *p = reinterpret_cast<int *>(val) ; 必要なときは頻繁にあるから困る。
>>846 CProductのコンストラクタをprivateにして、CFactoryをfriendにする。
>>848 そんな注釈せんでも、uintptr_t 使おうぜ。
>>849 おお、なるほど…
friendってこういうときに使うんですね
でもこれやるにはFactoryが完全に生成に特化したクラスじゃないと厳しそうですね
やっぱりfriend指定って怖いです
>>851 友達作るぐらいで怖がってちゃいかんよ。
しかし友達に合鍵を渡すのには慎重を要する。
この場合は、子作り専用の友達だもんな
855 :
デフォルトの名無しさん :2007/05/03(木) 17:34:23
C++で、GoFのデザインパターンのうち使用できないか使用すべきでないものってありますか? STLがあるからイテレータパターンで設計する必要はなさそうですが……
イテレータパターンはテンプレートがあればそっちの方がいいやね。 ポインタもそのまま使えるし。 個人的にはインタプリタパターンは要らないと思う。 文法1つにつき1クラスとか無駄すぎる。 パーサクラス1つ作っただけでいいよ。
while文で&&で結ばれた条件が二つあった場合、1つ目の条件が一致しなかった場合、2つ目の条件は評価されるのでしょうか?
されない 短絡評価とかショートサーキットとか呼ばれる
while文かどうかに関わらず、評価されません。
860 :
855 :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では大丈夫だったのですが。
拡張子確認汁
ちょっと起動するのがダルいから確かめずに言うけど 拡張子 .c でもダメ?
>>861 *.c の拡張子のソースをコンパイルすると大丈夫のようだけど
IDEからだと C++ コードとしてコンパイル (/TP) がデフォになってるからその影響かも。
866 :
861 :2007/05/03(木) 22:28:10
>>862-865 サンクス。
書き方の問題では無かったみたいです。
"errcode"という仮引数がまずかった模様。
これをANSIの書き方にしたら通ったもので。
ありがとうございました。
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のデストラクタが呼ばれません。 この場合どのようにすればいいのでしょうか?御願いします。
>>867 oの型をstd::vector<boost::shared_ptr<A> >にする。
それは半分冗談だが、delete 0は問題ないから、if ((*p) != NULL)の条件判断は不要。
870 :
867 :2007/05/05(土) 02:35:31
>>868-869 返事遅くなりすいません。
デストラクタをvirtualにしたら解決しました。
レス有り難うございました。
871 :
デフォルトの名無しさん :2007/05/05(土) 10:38:48
C言語で入力された文字を整数型変数に変換するにはどうすればいいですか? 入力文字t → アスキーコード って感じです。
何もする必要はない。char/wchar_tは整数型の一種で、中の値は文字コードそのもの。 ただ単に数値として扱えばよい。
>>872 回答ありがとうございます。
charで型宣言して計算なども普通に行ってよいのでしょうか?
あとscanfで%cを使っても良いのですか?
874 :
871 :2007/05/05(土) 10:57:14
すみません、自己解決しました^^; お騒がせしました><
>>873 scanf()で%cを使うと、バッファ入力になっていると改行文字\nがバッファに
残ってしまい、繰り返し%cで入力する時動作がおかしくなる。
どうおかしくなるかは自分で体験してみる事をお勧めする。
解決策はgets()もしくはfgets()を使う。
gets なんか使うな!!!!!!!!!!!!!!!!!!!!!!!!!
>>877 うっせーなお前にそんな事を言う権限はどこにもない。
std::cinのgetline()使おうぜ!!
OSによらず使えるC++のライブラリで、 ネットワーク、スレッド、正規表現などを備えているものはありますでしょうか?
boost ネットワークはないけど
Qt
CVSから取ってくればASIOがあるだろ>Boost
wxWidgets
>>878 gets 使ってるプログラムがあったら、
そこから簡単にシェルコード実行してやんよ
>>885 そういう話とgets()を使うなという話は無関係。
悪さをする方が悪い。
gets は自分がその場で実行する使い捨ての時は使うかもな でも今はそういう時はスクリプトか
>>886 どっちが悪いという話じゃないだろw
どっちも悪い。
>>888 gets()を使うのが悪いのは使うのが禁じられている時に限る。
今はどこにも禁じてないだろ?よく考えてみろ。
>>890 処理系依存の話だな。使うなと言わないコンパイラもある。
まあこのスレは環境依存OKなのでいいんだが、君の言っている事が
全てのコンパイラで当てはまらないのは確かだ。
日用プログラマは気楽でいいな。
>>892 話を逸らしましたね。それとコンパイラに使うなと言われるか言われないか
という事とどういう関係があるんでしょうね?
scanfにfflushでいいじゃん
void main並みの荒れネタだな
議論の手法を理解しないバカのせいだろ。
内容についてはともかく892は馬鹿だなw
>>898 あれ?俺のコンパイラのヘルプではgets()を使うなとは書いてないよ?
どうしましょう?w
それはそれは糞なヘルプを使ってるんだな。
そもそも規格書にgets()を使うなと書いてあったっけ? 文法違反じゃないよね。
別に使い捨てプログラムなら使っていいと思うが。
俺も使い捨てなら使っていいと思う。 誰かに「使うな!」とか言われる筋合いはないと思う。時と場合による。
初心者に危険性を教えずに gets 薦めるのは 最早犯罪としか言いようがないけどな。
初心者はscanf使ってればいいだろ
うちの規格書には Reading a line that overflows the array pointed to by s results in undefined behavior. The use of fgets() is recommended. ってかいてあったぞ
recommendedという単語には禁止という意味がありましたっけ。
>>904 じゃあ危険性を教えて勧めるのはいいわけですね。
これにて不毛な議論を終了します。結論が出たようですから。
自演してまで終わった話題続けなくてもいいよ
>>906 この文のどこを訳したら「fgets()の使用は禁止」と訳せるんですか?
せいぜい「未定義の動作の原因になります」程度にしかならないんですけど。
続きに、 Since the user cannot specify the length of the buffer passed to gets(), use of this function is discouraged. ってあるのよね
そもそもgets()にしろfgets()も使うことなんて少ないだろうに…
discouredgeか。さすがにそれではまずいな
>>913 そういうときはfgets使え って書いてある。
だから自分だけのプログラムには使ってもいいんだろ。 宿題みたいなある程度公の場に出るようなプログラムだとgets()は まずいって事でいいんじゃないか?
自分だけのプログラムなら何も問題ない。 宿題なら処理の流れが分かってるかどうか分かりやすくするため 敢えて gets を使う事は悪くないとは思う。 仕事で使う奴はヌッ殺す。
char buf[10]; gets(buf); /* 10文字以上(改行文字も含めて)入力する奴は氏ね!!!! */ でいいじゃん
gets()は改行文字読み取らないか・・・・・・
922 :
デフォルトの名無しさん :2007/05/05(土) 14:15:12
ウィンドウズ上でC言語を勉強したいのですが無料で手に入るソフトウェアなんか知ってる方がいましたら教えてください
gets は改行格納しないぞ
>>918 まずgetsでサンプルをしめし、次に
getsの危険性を示して、締めに他API(fgetsなど)への置き換えを
練習問題として提示する
以下の条件を満たすならgetsを使ってもかまわないと思う fopen/mallocの返値をチェックしない argcを調べずargvを使う 段数を制限することなく再帰する
>>926 それは関係ない。似たような事だとはわかるが
fopen の戻り値は書き捨てプログラムでもチェックしといた方がいいぞ。
>>925 そういや、Visual Studio 2005 Express Editionって製品版とどこか違いってあるの?
今のところ、Visual Studio 2005 Express Editionで事足りてるから使ってるんだが。
ATL、MFCが無いと書いてあるような
それは製品版の Express Edn. でも同じでは。
932 :
929 :2007/05/05(土) 14:30:22
ごめ、俺使ってるの、「professional edition」って書いてあるわ。 これも、MSが配ってた奴なんだが、色んなエディションがあって良く分からんな。
何だろ。DVDからインストールできるかWeb経由でないとダメかの違いとか
配ってたってことは、β版か? >prof
俺は友達からもらったのを(ry
>>929 ないと思うが、ちゃんと調べるには全ファイルが一致するかチェックするしかないな。
>>929 何らかの冊子が付いてくる程度じゃないかな。
コピーしてもらいました(*^_^*)
>>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); }
double a = 1.0/10;
942 :
デフォルトの名無しさん :2007/05/05(土) 16:21:52
既に用意されている型でオペレータのオーバーロードって可能ですか? int hoge;があるとして、hoge = HOGE(); でhogeにFALSEが帰ってきた時のメッセージを出力する処理をしたいのですが・・・
もし BOOL から int への代入をオーバーロードできたら無茶苦茶な事になるぞ
組み込み型はboolな
BOOLとintは同じだから
やるとしたら受け取り側の int を自前の int モドキなクラスで実装することやね。
C++ならCBoolみたいなクラス作って解決
それ以前に、BOOL を受け取る変数は一応 BOOL にすべきだと思うんだがな。 いくら typedef int BOOL; だからって。 あと、その後に if(!hoge) { ... } と書いたらいけない理由があるのかな? 多すぎて・・・ということか?
空白か否かを判定する関数がint返すおかげで そいつを間接的使う関数作ったときに return var ? true : false; みたいなことやってるんだけど、これってマズイ?
別にまずくはないけど、inline 関数化しといた方が楽かと。 !! とか書く人もいるけど、最適化されるのかね? これ。
>>951 return var != 0;
でいいじゃん
型は int だが真偽を返すことを意図してあるから 0 と比較するよりは ? : 使った方が読みやすいと思う。
>>953 ,954
return (var != FALSE);
で解決ですね
それ分かりにくい。二重否定だし。
FALSEはマクロなのでどうも信用できん…。
>>954 0 と比較すると真偽を返すように読めないとでも言うのかね?
if 文は真偽を判別することを意図しているから if (n != 0) // 0 と比較するよりは if (n ? true : false) // ? : 使った方が読みやすい と思う。
それはさすがに読み手を馬鹿にしすぎじゃないか?
>>943 その状況で使えるかどうか判らないけど、
列挙型は、演算子多重定義できるよ。
>>960 馬鹿にしてるとかそういう問題じゃないと思うが。
>>959 読みやすい?
3項演算子より n != 0 の方がよっぽど読みやすいんだが
>>959 if 文に入れる分には if(n) が最良だろう。
馬鹿にしてるとかの問題はともかく、単純にわかりにくいな。 他人の書いたソース中にそんなのが出てきたら一瞬戸惑うかもしれん。 「え、なんか特別な意図でもあるの?」って。 俺は素直に普通の比較式書いてコメント残すよ。
n として数値を期待してるのか真偽値を期待してるのか、 n != 0 だとそれが式から見て取れない。
>>966 は?
nとして数値か真偽値かって
n != 0 の結果が真偽値だろうがよ・・・
bool 型の値という意味じゃなくて、
真か偽かを表しているということだぜ?
というか、流れ分かってるのか?
>>951 から始まってるんだが。
「nが0か否か」 それ以外に何が要るのん? そもそも元の話は n がintなのになんで n が数値か真偽値かなんて話になってんだ?
is 系関数とか知らない訳じゃないよな?
うん、で? 結局それなら「○か否か」で終了じゃん
972 :
823 :2007/05/05(土) 23:11:19
>>824 ,
>>827 返事遅くなってしまい申し訳ありません。
おかげで上手く動いてくれました。
どうもありがとうございました。
>>971 数値的に見れば 0 か否かだが、
意味的には真か偽を返す関数だろ?
n != 0 だとその意図がここだけからでは見てとれない。
static_cast<bool>(n); でFA
VC++ で警告出た記憶があるぞ
return n == true; とかってやっていいんだっけ?
ダメ。true が (int)1 になって、n が 0 でも 1 でもない時におかしくなる。
bool型の比較でも1以外は駄目なんだ return !!n;とかやればいいのかな?
>>977 別にダメってことはないだろ。n が 1 じゃない時に false になるってだけで。
比較の結果を 0 or 1 として利用するのはまあアリだと思うが、 true キーワードを数値の 1 の代わりとして使うのはナシだろ。
boolからintはCとの互換のためか問題なしに暗黙でキャストされるはず。 intからboolは情報が落ちるからか手元のコンパイラは警告レベル上げると警告してくれてる。 C++でも if ( ... ) の成立条件はあくまでも0以外のときなんだっけ? 0以外かtrueとはなってないよな?
C++ でも 0 以外。 じゃないと互換性が。
ごめん今みたらスペースか否かを判別する関数で bool isspace(char c) { // _ismbcspaceはcが空白文字のときに0を返す return _ismbcspace(c) == 0; } になってた これならおk?
テンプレートで作成できる型をdoubleとfloatに限定することはできませんか?
doubleとfloatのメソッド実装した方が早くない?
>>973 んなもん関数作ったヤツに言えよ
ifは条件式全体で真偽を表すもんだが
おまえほんとに解ってるか?w
>>984 宣言と定義で別々のファイルに書くようにして
定義側のでで明示的でインスタンス化するときに、doubleとfloatの分だけ書けば
例えばint型等で使おうとしたときにリンカがゴルァしてくれるから
そういうのでよければ
>>989 全部そんな事してたら template の旨味が少ない。
コンストラクタだけそうしたらいいと思うよ。
つまり早くexportキーワードサポートしろやって事ですか?
export は関係ないだろー。
数値から真偽値への変換は true && n っつーのはどうか。
なんでそんな妙なことを…
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; }
まず整数と英数字の列の違いについて勉強のこと BMIの求め方も変だし
>因みにポインタとかサッパリです この時点で論外 もっと根本の勉強をちゃんとしてからで直して来い
>>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;
}
>>995 ポインタ以前に計算は入力がすんでからな
エラー処理はおいといて、getsで文字列取り込んだらatof()で数字にして計算だ。
bmi = atof(tall) / atof(weight);
とかやればいい。
あと、atof()はstdlib.h なのでこれもインクルード
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。