- 1 名前:デフォルトの名無しさん [2008/02/20(水) 12:33:41 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.48【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1202141921/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 129 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:08:18 ]
- >>125
ifの方も意図しているであろう動作はしない。 ただしコンパイルは通る。警告くらい出してくれるかも知れんが・・・
- 130 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:11:14 ]
- ありがとうございます。自分でもためしてみたけど無理だった
コンパイル通ってたから上手く動いてると思ってそのままつかってたよ…
- 131 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:19:40 ]
- >>127
C#も124みたいにcaseラベルを並べるのはありだと聞いた。
- 132 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:22:16 ]
- 並べさせるくらいなら、コンマ区切りで書かせてくれてもいいのにね。
- 133 名前:デフォルトの名無しさん [2008/02/22(金) 00:27:11 ]
- クラスの定義と代入を同時にやるにはどうやればいいですか?
int a=10; のようにです
- 134 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:28:19 ]
- 「代入」 は既に宣言されている変数に対して行う操作なので
同時に出来る訳が無い。 初期化なら別だが。
- 135 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:30:45 ]
- operator を使おう
- 136 名前:デフォルトの名無しさん [2008/02/22(金) 00:30:52 ]
- 事故解決しました
- 137 名前:デフォルトの名無しさん [2008/02/22(金) 00:32:34 ]
- これでできました
int main() { class Test{ int x; public: Test (int y) {x=y;} print(){ cout<<x<<endl; } }; Test a=10; a.print(); return 0; }
- 138 名前:デフォルトの名無しさん [2008/02/22(金) 00:35:31 ]
- Test a=10;
a.print(); a=20; a.print(); もできるんですね C++はすごいですね
- 139 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:37:27 ]
- 往々にして望まない機能だけどな。
基本的に引数1つのコンストラクタには explicit つけとけ。
- 140 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:42:12 ]
- それよりも、構造体って感じの型でないクラスなのに
コピーコンストラクタとoperator =をコンパイラ任せにしているのが嫌だね。
- 141 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:43:15 ]
- コンパイラ任せに出来る時は
コンパイラ任せでいいよ。
- 142 名前:デフォルトの名無しさん [2008/02/22(金) 00:48:46 ]
- 138じゃないですが、
>>139 なんでですか? (本当に理由を知りたいです。)
- 143 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:59:34 ]
- #include <iostream>
#include <vector> class Vector { public: Vector(size_t size) : m_array(size) { } void output() const { for(std::vector<int>::const_iterator it = m_array.begin(); it != m_array.end(); ++it) { std::cout << *it << ' '; } std::cout << std::endl; } private: std::vector<int> m_array; }; void Foo(const Vector& v) { v.output(); } int main() { Foo(5); ←←←←←←← } これが直感的な挙動ではないことは分かってもらえると思う。 でも、コンパイル通るし、正常に動く。 explicit つけるとこういう時にコンパイルエラーにできる。 それでも Foo(Vector(5)); なら可だが、これは問題ないと感じてくれると思う。
- 144 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:59:53 ]
- >>91
どんなバグがでるのですか? 呼び出し側なにか影響でうるのですか?
- 145 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:01:23 ]
- input を変更した後に、
input が変更されていない事を前提とした処理を書いてしまうかもしれない。 あるいは、そういう処理があるにも関わらず、 それより前の地点で input を変更してしまうかもしれない。 そうなっていないか注意して探すよりは、 引数をいじらない方が良い。
- 146 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:08:46 ]
- みんな仮引数にconstって使わないんだよね。
- 147 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:09:55 ]
- 一時期付けてみたけど、
あんま意味ないと思ってやめた。
- 148 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:12:29 ]
- >>145
なるほど 別にいじること自体がやばいわけじゃなくて いじると間違い起こす原因となる可能性があるわけですね ありがとうございました
- 149 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:14:13 ]
- だって関数の定義では付けてもいいけど、宣言では付けたくないので、
コピペじゃ済まなくなる。
- 150 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:14:45 ]
- >>131
fall throughは禁止じゃなかったっけ 何かキーワードがあったと思う 情報が古いかもしれんが
- 151 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:19:06 ]
- >>150
caseが連続する場合のみOK。その他は禁止。スレ違い。
- 152 名前:デフォルトの名無しさん [2008/02/22(金) 01:19:25 ]
- >>143
ありがとうございます。 explicitは、暗黙の変換を抑制する機能なのですね。 しかしなんか上の例のコードは、すごくC++書き慣れた人な感じがしました。
- 153 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:20:21 ]
- >>150
>>124のように空のcaseラベルを並べたときはフォールスルーできる。 msdn2.microsoft.com/ja-jp/library/06tc147t.aspx スレ違いすまん。
- 154 名前:133 [2008/02/22(金) 02:00:16 ]
- 関数の引数にクラスを使いたいのですが、クラスの宣言と代入を同時にするにはどうやればいいですか
intのようにコンストラクタではできませんでした test y = f( x ); のようにです fはクラスを返します intではないです
- 155 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 02:11:42 ]
- >>154
testというのがクラスなら、testにconst test&型の引数を1つ取るコピーコンストラクタを作るんだ。
- 156 名前:デフォルトの名無しさん [2008/02/22(金) 02:14:25 ]
- サンクス
- 157 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 07:02:49 ]
- >>154
何度も言うが、それは代入じゃない。 初期化だ。 初期化の場合、= を使っていても test y = f(x); は test y(f(x)); と同義。
- 158 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 07:24:55 ]
- まったくのプログラム初心者です。
はじめににインストールする言語?をどれにするかがわかりません。 どういう意味かというと ボーランド、とかマイクロソフトのvisual studioとかどれにすればいいのかです。 有料とか無料とかいろいろありますね。 できたら将来有料ソフトを販売可能なものがいいです。 今考えているのはマイクロソフトのVC++を考えているのですが、 C++とVC++は違うとか どっかで聞いたりもしたので 初心者にはちんぷんかんぷんでわかりません。 よろしくお願いします
- 159 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 07:30:50 ]
- C++ は言語名。
VC++ は C++ を使って開発を行うためのツールの名前。
- 160 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 08:05:40 ]
- >>159
ありがとうございます。
- 161 名前:デフォルトの名無しさん [2008/02/22(金) 11:08:37 ]
- VC++ はMSがWindows用ソフトを開発するために拡張した言語ともいえる
VC++のコードはほかのものでは動かせないものが多い
- 162 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 11:42:07 ]
- www.xlsoft.com/jp/products/jet/index.html
このソフトを使えばJavaでもネイティブアプリケーションが作れると書いてあるのですが、そんなうまい話があるんですか? もし本当ならJavaのパフォーマンス面での不利がだいぶ改善されると思うのですが
- 163 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 11:45:45 ]
- ここはC/C++スレですが
- 164 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 11:57:29 ]
- システム構築売るならまだしもソフト売るのにJavaはないだろ。
VCにしとけ。
- 165 名前:デフォルトの名無しさん [2008/02/22(金) 11:59:00 ]
- perl2exeみたいなやつでは? 実行環境を圧縮してexeに詰め込む
利点としてはランタイムとかの導入がいらないだけで
- 166 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 12:21:11 ]
- スレ違い。ここでやれ
gcjって使ってる人います? ttp://pc11.2ch.net/test/read.cgi/tech/1046627795/l50
- 167 名前:デフォルトの名無しさん [2008/02/22(金) 12:31:13 ]
- この直し方教えてください!
IEBrowser->Document.charset="shift_jis"; error C2039: 'charset' : '_com_ptr_t<class _com_IIID<struct IDispatch,&struct __s_GUID _GUID_****> >' のメンバではありません。
- 168 名前:167 [2008/02/22(金) 12:35:30 ]
- 文字コードの変換をしたいのですが・・・
この様に定義してあります SHDocVw::IWebBrowser2Ptr IEBrowser; IEBrowser.CreateInstance( __uuidof( SHDocVw::InternetExplorer ) );
- 169 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 12:51:05 ]
- >>167
こうでは? IEBrowser->Document->charset= L"shift_jis";
- 170 名前:167 [2008/02/22(金) 12:55:40 ]
- >>169
error C2039: 'charset' : 'IDispatch' のメンバではありません。 になりました・・・
- 171 名前:167 [2008/02/22(金) 13:05:44 ]
- 文字コードの変更方法わかったら教えてもらいたいですけど
そこだけVBAスクリプトを呼び出す事にします
- 172 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:08:27 ]
- >>170
じゃあこれはどう? SHDocVw::IHTMLDocument2Ptr document = IEBrowser->Document; docment->charset = L"shift_jis";
- 173 名前:167 [2008/02/22(金) 13:13:13 ]
- だめでした
- 174 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:23:38 ]
- QueryInterface
- 175 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:33:26 ]
- 適当に書いたらやっぱダメだったか、すまん。
#import <mshtml.tlb>した上で、MSHTML::IHTMLDocument2Ptrだ。
- 176 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:34:40 ]
- >>174
ナントカPtr(の実態_com_ptr_t<>)のコンストラクタや代入演算子の中でQueryIntefaceが行われている。
- 177 名前:デフォルトの名無しさん [2008/02/22(金) 14:08:38 ]
- πの値は、自分で3.1415926535...とかって書くしかないでしょうか。
numeric_limits<int>::max()とか、そういう書き方はないですか?
- 178 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:13:43 ]
- #ifndef M_PI
# define M_PI 3.1415926535 #endif
- 179 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:30:07 ]
- math.hをインクルードしたらM_PIとしてdefineされてる。
計算して出したいなら4*atan(1.0);
- 180 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:32:27 ]
- 標準ではないのが玉に瑕。
- 181 名前:デフォルトの名無しさん [2008/02/22(金) 15:02:49 ]
- >>178-180
ありがとうございます。 #include <cmath> としてたのですが、M_PIでコンパイル通りました。
- 182 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:58:04 ]
- C初心者です。
実数→整数変換ですが、 double dval; char buf[80]; int ival; dval = -19.99; /* -19.99〜19.99 */ dval = dval * 100.0; sprintf(buf,"%.0f",dval); ival = atoi(buf); printf( "%f %d %d\n",dval,ival,(int)dval); /* printf( "%f %d %d\n",dval,ival,(int)ceil(dval)); */ ivalを求める場合、上記の方法が一番精度が良いのですが これ以外に方法はありますでしょうか? ceil() や floor() 使っても誤差が出てしまいます。
- 183 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:05:51 ]
- >sprintf(buf,"%.0f",dval);
それ四捨五入してるだけだぞ そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい 元々 -19.99 という値自体が誤差を持ってるから、これを無くすことは出来ない printf("%.20f\n", -19.99); とかやってみればわかる 本当に誤差が嫌なら、浮動小数点を使わない、という方法しかない
- 184 名前:182 mailto:sage [2008/02/22(金) 16:12:26 ]
- >>183
早速のRESありがとう御座います。 >そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい 了解です。これで行きたいと思います。 どうもありがとう御座いました。
- 185 名前:デフォルトの名無しさん [2008/02/22(金) 16:53:31 ]
- char []型の要素を破棄して動的確保できませんか? 消せなくてもいいので別のアドレスに確保できませんか?
f(char *ch){ delete ch; ch=new char[10]; strcpy(ch,"ssssssss"); } main(){ char *ce=new char[2]; f(ce); cout<<ce<<endl; char ch[]="test"; f(ch); cout<<ch<<endl; }
- 186 名前:デフォルトの名無しさん [2008/02/22(金) 16:55:19 ]
- もしくは、char *型とchar []型を判別して、書き換えられないなら始めにエラーにするのでもいいです
- 187 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:59:46 ]
- >>185
ごめんfで何がしたいのか分からない。 まぁ俺の第六感で回答すると、ポインタのポインタ使えばいいんじゃね
- 188 名前:デフォルトの名無しさん [2008/02/22(金) 17:05:10 ]
- char a[10];
をコード内で書き換えてたとえば100個まで使えるようにしたいんです はじめのaは破棄できなくてもいいので、a[50]とかにアクセスできるようになりませんか
- 189 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 17:07:46 ]
- Stringクラスの使い方でも覚えるとか
- 190 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 17:08:43 ]
- >>188
設計が間違ってるよ >>185 みたいにすると激しく管理が難しい事になる
- 191 名前:デフォルトの名無しさん [2008/02/22(金) 17:12:10 ]
- ポインタで文字列のアドレスが渡されたら、それが[]なのか*なのか渡された側にはわかりません
どうしたらいいですか
- 192 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 17:14:17 ]
- 配列サイズも渡す
- 193 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 17:17:53 ]
- 閃いたw
初めから1000個くらい確保しとけばいいじゃん
- 194 名前:デフォルトの名無しさん [2008/02/22(金) 17:21:28 ]
- 無理か
main(){ char ch[]="test"; char *ce=new char[20]; strcpy(ce,"ssss"); ch=ce; //ここでエラー cout<<ch<<endl; }
- 195 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 17:22:10 ]
- あほすぎ
- 196 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 17:29:05 ]
- >>191
呼び出し側で呼び出す関数を変える >>194 なにがしたいの?
- 197 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 18:10:41 ]
- >>194
こうすれば? main(){ char chx[]="test"; char *ch = chx; char *ce=new char[20]; strcpy(ce,"ssss"); ch=ce; //エラーなし cout<<ch<<endl; }
- 198 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 18:36:59 ]
- >>185
恐らく、引数でもらった文字列を元に新な文字列を返そうと考えてるんだろうけど、 そうしたいのなら、 char* func(const char* str) { char* s = new char[ほにゃらら]; ほげほげ return s; } とした方が良い。 そもそも char ch[] = "test"; の ch は配列の先頭のアドレスを返す「定数」なんだから、newで確保した領域を割り当てられるわけないよ。
- 199 名前:デフォルトの名無しさん [2008/02/22(金) 19:05:33 ]
- レスありがとうございます
同じような質問なんですが、*chが確保されていてもいなくても、deleteするにはどうすればいいですか? 確保していないと実行時にエラーになります
- 200 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:08:14 ]
- 言ってる事がよく分からんが、こういうこと?
if( ch )delete ch;
- 201 名前:デフォルトの名無しさん [2008/02/22(金) 19:15:06 ]
- まともに動くのはaだけなんです どれでも動くようになりますか?
f(char *ch){ delete ch; ch=new char[10]; strcpy(ch,"ssssssss"); } main(){ char *a=new char[1]; f(a); cout<<a<<endl; char *b=NULL; f(b); cout<<b<<endl; // char *c; f(c); cout<<c<<endl; }
- 202 名前:デフォルトの名無しさん [2008/02/22(金) 19:16:31 ]
- >>200 ifを組み込んでも動作しませんでした
- 203 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:16:40 ]
- void f(char*& ch)
- 204 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:17:29 ]
- つーか、大人しく std::string 使え
- 205 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:18:15 ]
- >>201
fの中でchに代入してもmainの方はaもbもcも変わらないよ? f(int x){ x = 2; } main() { int a = 1; f(a); cout << a << endl; // 2ではなく1と表示される } ↑これ解ってる?
- 206 名前:デフォルトの名無しさん [2008/02/22(金) 19:19:04 ]
- >>203 それを組み込んだらbも動作しました! でもcが実行時にエラー出ます >>200も同時にやってもだめです
- 207 名前:デフォルトの名無しさん [2008/02/22(金) 19:20:20 ]
- >>205 char* や配列は参照渡しだとききました
- 208 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:20:23 ]
- 初期化してねえのに delete できるわけねえだろ
- 209 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:20:49 ]
- >>207
ポインタは値渡し。
- 210 名前:デフォルトの名無しさん [2008/02/22(金) 19:21:59 ]
- >>209 わかりました >>208 初期化していないことを調べる方法ないですか
- 211 名前:デフォルトの名無しさん [2008/02/22(金) 19:23:11 ]
- aは配列と見なされて参照渡しになってるんですね
- 212 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:25:03 ]
- 用語の部分で思考停止してるな。
何が起こってるのか考えた事無いだろう。
- 213 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:25:43 ]
- >>210
初期化されてるポインタと、 初期化してないけど偶然たまたま同じ値が入ってるポインタを、 見分ける方法が物理的にあると思うか?
- 214 名前:デフォルトの名無しさん [2008/02/22(金) 19:26:39 ]
- deleteした瞬間に落ちます tryも無理です
f(char*& ch){ try{ delete ch; } catch(...){cerr << "例外を受け取りました。" << endl;} ch=new char[10]; strcpy(ch,"ssssssss"); } main(){ char *a=new char[1]; f(a); cout<<a<<endl; char *b=NULL; f(b); cout<<b<<endl; char *c; f(c); cout<<c<<endl; }
- 215 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:31:57 ]
- >>214
いい方法を教えてあげよう 関数 f の前にこれを書くんだ /* この関数に初期化してないポインタを渡してはいけません */
- 216 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:43:25 ]
- 基礎からやり直せよ
- 217 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:45:15 ]
- >>214
だーかーらーnewで確保したメモリを指してるポインタと、未初期化のポインタを見分け る方法なんて存在しないんだってば。 ポインタ使うときは初期化しろって何で言われてるのか考えたことあるか?
- 218 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:49:31 ]
- #define HOGE int
void f(HOGE x) { cout << '(' << x << ')' << endl; x = 42; } int main() { HOGE a = 10; f(a); cout << '(' << a << ')' << endl; HOGE b = 0; f(b); cout << '(' << b << ')' << endl; HOGE c; f(c); cout << '(' << c << ')' << endl; } これの挙動は分かるか? #define HOGE char* void f(HOGE x) { cout << '(' << x << ')' << endl; x = "f"; } int main() { HOGE a = "a"; f(a); cout << '(' << a << ')' << endl; HOGE b = NULL; f(b); cout << '(' << b << ')' << endl; HOGE c; f(c); cout << '(' << c << ')' << endl; } んで、これの挙動は分かるか?
- 219 名前:デフォルトの名無しさん [2008/02/22(金) 20:17:15 ]
- 質問ですが、stringの参照で値を受け取るとき
memcpy(str, ch,10000); のようにできますか?
- 220 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 20:37:35 ]
- お願いだから str.assign(10000, ch); としてください。
頼みますから。
- 221 名前:デフォルトの名無しさん [2008/02/22(金) 20:45:34 ]
- >>220
strがchar*の予感
- 222 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:09:01 ]
- 凄く無駄なレス消費してんなw
- 223 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:15:15 ]
- 昔ならともかく惜しむもんではないが無駄感は否めないなwww
- 224 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:43:42 ]
- プログラムを1から始めようと思うのですが、まずは本でも買って読むべきですか?
それともネットで調べるべきですか?
- 225 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:45:59 ]
- 何をやりたいか目標を立てることから始めるべき。
- 226 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 22:16:13 ]
- 文字列sに含まれる先頭のcの添字を表示させる関数を作れ
cが無い場合は、-1を表示 という問題で詰まってます 文字列の中のcを認識させるにはどうすればよいのでしょうか
- 227 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 22:22:42 ]
- strchr
- 228 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 22:24:16 ]
- マルチで申し訳ないですが
グローバルな共用体の変数に、関数からメンバーに代入したらセグメントエラーを吐いたのですが、これは許されないのでしょうか?
- 229 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 22:29:20 ]
- マルチしないでください^^;
|

|