【初心者歓迎】C/C++室 Ver.49【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/20(水) 12:33:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0153デフォルトの名無しさん
2008/02/22(金) 01:20:21>>124のように空のcaseラベルを並べたときはフォールスルーできる。
http://msdn2.microsoft.com/ja-jp/library/06tc147t.aspx
スレ違いすまん。
0154133
2008/02/22(金) 02:00:16intのようにコンストラクタではできませんでした
test y = f( x );
のようにです fはクラスを返します intではないです
0155デフォルトの名無しさん
2008/02/22(金) 02:11:42testというのがクラスなら、testにconst test&型の引数を1つ取るコピーコンストラクタを作るんだ。
0156デフォルトの名無しさん
2008/02/22(金) 02:14:250157デフォルトの名無しさん
2008/02/22(金) 07:02:49何度も言うが、それは代入じゃない。
初期化だ。
初期化の場合、= を使っていても
test y = f(x); は test y(f(x)); と同義。
0158デフォルトの名無しさん
2008/02/22(金) 07:24:55はじめににインストールする言語?をどれにするかがわかりません。
どういう意味かというと
ボーランド、とかマイクロソフトのvisual studioとかどれにすればいいのかです。
有料とか無料とかいろいろありますね。
できたら将来有料ソフトを販売可能なものがいいです。
今考えているのはマイクロソフトのVC++を考えているのですが、
C++とVC++は違うとか
どっかで聞いたりもしたので
初心者にはちんぷんかんぷんでわかりません。
よろしくお願いします
0159デフォルトの名無しさん
2008/02/22(金) 07:30:50VC++ は C++ を使って開発を行うためのツールの名前。
0160デフォルトの名無しさん
2008/02/22(金) 08:05:40ありがとうございます。
0161デフォルトの名無しさん
2008/02/22(金) 11:08:37VC++のコードはほかのものでは動かせないものが多い
0162デフォルトの名無しさん
2008/02/22(金) 11:42:07このソフトを使えばJavaでもネイティブアプリケーションが作れると書いてあるのですが、そんなうまい話があるんですか?
もし本当ならJavaのパフォーマンス面での不利がだいぶ改善されると思うのですが
0163デフォルトの名無しさん
2008/02/22(金) 11:45:450164デフォルトの名無しさん
2008/02/22(金) 11:57:29VCにしとけ。
0165デフォルトの名無しさん
2008/02/22(金) 11:59:00利点としてはランタイムとかの導入がいらないだけで
0166デフォルトの名無しさん
2008/02/22(金) 12:21:11gcjって使ってる人います?
ttp://pc11.2ch.net/test/read.cgi/tech/1046627795/l50
0167デフォルトの名無しさん
2008/02/22(金) 12:31:13IEBrowser->Document.charset="shift_jis";
error C2039: 'charset' : '_com_ptr_t<class _com_IIID<struct IDispatch,&struct __s_GUID _GUID_****> >' のメンバではありません。
0168167
2008/02/22(金) 12:35:30この様に定義してあります
SHDocVw::IWebBrowser2Ptr IEBrowser;
IEBrowser.CreateInstance( __uuidof( SHDocVw::InternetExplorer ) );
0169デフォルトの名無しさん
2008/02/22(金) 12:51:05こうでは?
IEBrowser->Document->charset= L"shift_jis";
0170167
2008/02/22(金) 12:55:40error C2039: 'charset' : 'IDispatch' のメンバではありません。
になりました・・・
0171167
2008/02/22(金) 13:05:44そこだけVBAスクリプトを呼び出す事にします
0172デフォルトの名無しさん
2008/02/22(金) 13:08:27じゃあこれはどう?
SHDocVw::IHTMLDocument2Ptr document = IEBrowser->Document;
docment->charset = L"shift_jis";
0173167
2008/02/22(金) 13:13:130174デフォルトの名無しさん
2008/02/22(金) 13:23:380175デフォルトの名無しさん
2008/02/22(金) 13:33:26#import <mshtml.tlb>した上で、MSHTML::IHTMLDocument2Ptrだ。
0176デフォルトの名無しさん
2008/02/22(金) 13:34:40ナントカPtr(の実態_com_ptr_t<>)のコンストラクタや代入演算子の中でQueryIntefaceが行われている。
0177デフォルトの名無しさん
2008/02/22(金) 14:08:38numeric_limits<int>::max()とか、そういう書き方はないですか?
0178デフォルトの名無しさん
2008/02/22(金) 14:13:43# define M_PI 3.1415926535
#endif
0179デフォルトの名無しさん
2008/02/22(金) 14:30:07計算して出したいなら4*atan(1.0);
0180デフォルトの名無しさん
2008/02/22(金) 14:32:270181デフォルトの名無しさん
2008/02/22(金) 15:02:49ありがとうございます。
#include <cmath>
としてたのですが、M_PIでコンパイル通りました。
0182デフォルトの名無しさん
2008/02/22(金) 15:58:04実数→整数変換ですが、
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() 使っても誤差が出てしまいます。
0183デフォルトの名無しさん
2008/02/22(金) 16:05:51それ四捨五入してるだけだぞ
そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい
元々 -19.99 という値自体が誤差を持ってるから、これを無くすことは出来ない
printf("%.20f\n", -19.99); とかやってみればわかる
本当に誤差が嫌なら、浮動小数点を使わない、という方法しかない
0184182
2008/02/22(金) 16:12:26早速のRESありがとう御座います。
>そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい
了解です。これで行きたいと思います。
どうもありがとう御座いました。
0185デフォルトの名無しさん
2008/02/22(金) 16:53:31f(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;
}
0186デフォルトの名無しさん
2008/02/22(金) 16:55:190187デフォルトの名無しさん
2008/02/22(金) 16:59:46ごめんfで何がしたいのか分からない。
まぁ俺の第六感で回答すると、ポインタのポインタ使えばいいんじゃね
0188デフォルトの名無しさん
2008/02/22(金) 17:05:10をコード内で書き換えてたとえば100個まで使えるようにしたいんです
はじめのaは破棄できなくてもいいので、a[50]とかにアクセスできるようになりませんか
0189デフォルトの名無しさん
2008/02/22(金) 17:07:460190デフォルトの名無しさん
2008/02/22(金) 17:08:43設計が間違ってるよ
>>185 みたいにすると激しく管理が難しい事になる
0191デフォルトの名無しさん
2008/02/22(金) 17:12:10どうしたらいいですか
0192デフォルトの名無しさん
2008/02/22(金) 17:14:170193デフォルトの名無しさん
2008/02/22(金) 17:17:53初めから1000個くらい確保しとけばいいじゃん
0194デフォルトの名無しさん
2008/02/22(金) 17:21:28main(){
char ch[]="test";
char *ce=new char[20];
strcpy(ce,"ssss");
ch=ce; //ここでエラー
cout<<ch<<endl;
}
0195デフォルトの名無しさん
2008/02/22(金) 17:22:100196デフォルトの名無しさん
2008/02/22(金) 17:29:05呼び出し側で呼び出す関数を変える
>>194
なにがしたいの?
0197デフォルトの名無しさん
2008/02/22(金) 18:10:41こうすれば?
main(){
char chx[]="test";
char *ch = chx;
char *ce=new char[20];
strcpy(ce,"ssss");
ch=ce; //エラーなし
cout<<ch<<endl;
}
0198デフォルトの名無しさん
2008/02/22(金) 18:36:59恐らく、引数でもらった文字列を元に新な文字列を返そうと考えてるんだろうけど、
そうしたいのなら、
char* func(const char* str)
{
char* s = new char[ほにゃらら];
ほげほげ
return s;
}
とした方が良い。
そもそも
char ch[] = "test";
の ch は配列の先頭のアドレスを返す「定数」なんだから、newで確保した領域を割り当てられるわけないよ。
0199デフォルトの名無しさん
2008/02/22(金) 19:05:33同じような質問なんですが、*chが確保されていてもいなくても、deleteするにはどうすればいいですか?
確保していないと実行時にエラーになります
0200デフォルトの名無しさん
2008/02/22(金) 19:08:14if( ch )delete ch;
0201デフォルトの名無しさん
2008/02/22(金) 19:15:06f(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;
}
0202デフォルトの名無しさん
2008/02/22(金) 19:16:310203デフォルトの名無しさん
2008/02/22(金) 19:16:400204デフォルトの名無しさん
2008/02/22(金) 19:17:290205デフォルトの名無しさん
2008/02/22(金) 19:18:15fの中でchに代入してもmainの方はaもbもcも変わらないよ?
f(int x){
x = 2;
}
main() {
int a = 1;
f(a);
cout << a << endl; // 2ではなく1と表示される
}
↑これ解ってる?
0207デフォルトの名無しさん
2008/02/22(金) 19:20:200208デフォルトの名無しさん
2008/02/22(金) 19:20:230209デフォルトの名無しさん
2008/02/22(金) 19:20:49ポインタは値渡し。
0211デフォルトの名無しさん
2008/02/22(金) 19:23:110212デフォルトの名無しさん
2008/02/22(金) 19:25:03何が起こってるのか考えた事無いだろう。
0213デフォルトの名無しさん
2008/02/22(金) 19:25:43初期化されてるポインタと、
初期化してないけど偶然たまたま同じ値が入ってるポインタを、
見分ける方法が物理的にあると思うか?
0214デフォルトの名無しさん
2008/02/22(金) 19:26:39f(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;
}
0215デフォルトの名無しさん
2008/02/22(金) 19:31:57いい方法を教えてあげよう
関数 f の前にこれを書くんだ
/* この関数に初期化してないポインタを渡してはいけません */
0216デフォルトの名無しさん
2008/02/22(金) 19:43:250217デフォルトの名無しさん
2008/02/22(金) 19:45:15だーかーらーnewで確保したメモリを指してるポインタと、未初期化のポインタを見分け
る方法なんて存在しないんだってば。
ポインタ使うときは初期化しろって何で言われてるのか考えたことあるか?
0218デフォルトの名無しさん
2008/02/22(金) 19:49:31void 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;
}
んで、これの挙動は分かるか?
0219デフォルトの名無しさん
2008/02/22(金) 20:17:15memcpy(str, ch,10000);
のようにできますか?
0220デフォルトの名無しさん
2008/02/22(金) 20:37:35頼みますから。
0221デフォルトの名無しさん
2008/02/22(金) 20:45:34strがchar*の予感
0222デフォルトの名無しさん
2008/02/22(金) 21:09:010223デフォルトの名無しさん
2008/02/22(金) 21:15:150224デフォルトの名無しさん
2008/02/22(金) 21:43:42それともネットで調べるべきですか?
0225デフォルトの名無しさん
2008/02/22(金) 21:45:590226デフォルトの名無しさん
2008/02/22(金) 22:16:13cが無い場合は、-1を表示
という問題で詰まってます
文字列の中のcを認識させるにはどうすればよいのでしょうか
0227デフォルトの名無しさん
2008/02/22(金) 22:22:420228デフォルトの名無しさん
2008/02/22(金) 22:24:16グローバルな共用体の変数に、関数からメンバーに代入したらセグメントエラーを吐いたのですが、これは許されないのでしょうか?
0229デフォルトの名無しさん
2008/02/22(金) 22:29:200230デフォルトの名無しさん
2008/02/22(金) 22:46:54グローバルな共用体の変数に、関数からメンバーに代入してもセグメントエラーを吐かないのですが、
嫁は許してくれるでしょうか?
0231デフォルトの名無しさん
2008/02/22(金) 22:48:12今こんなテンプレートクラスがあったとして
template<typename T>
class Array{
T *array;
size_t length;
public:
Array(size_t n = 0){...}
~Array(){...}
T& operator [](size_t n){...}
}
これを
typedef Array<myclass> MyArray; //myclassは適当なクラスということで
Array<MyArray> MyArray2(2);
と使う時、MyArray2は与えた引数で初期化できますが
MyArrayの方にコンストラクタの引数を与える場合はどうすればいいですか?
ちなみにこれは、配列クラスなんでできれば、MyArray2が持つそれぞれのArray<myclass>に
別々の初期化パラメータを与えたいんですが・・・。
0232デフォルトの名無しさん
2008/02/22(金) 22:49:58何ができるかを伝えてあげるべき。
ようこそプログラムの世界へ。
0233デフォルトの名無しさん
2008/02/22(金) 22:50:250234デフォルトの名無しさん
2008/02/22(金) 22:51:22それは関数そのものではないでしょうか
わざわざ教えたいただいたのですが、伝達不足でした、すみません
int strch_idx(const char* s, char c);
という関数の雛形が与えられて、この中身を作るのに、cを認識する必要があると判断したのですが、間違っているでしょうか
0235デフォルトの名無しさん
2008/02/22(金) 22:54:41今のC++では無理だね。だからSTLコンテナではreserveしてpush_backしたり、
組込の配列からコピー初期化したりする。
0236デフォルトの名無しさん
2008/02/22(金) 22:56:20cを認識の意味がわかりません
s内からcを検索したいってこと?
0237デフォルトの名無しさん
2008/02/22(金) 23:17:22この場合大人しくループまわして作ることになるんでしょうね。
ありがとうございました。
0238デフォルトの名無しさん
2008/02/22(金) 23:34:21例えば、sという文字列にcincoと入力すると、1を
sという文字列にiicicoと入力すると3を
sという文字列にnorioと入力すると-1をreturnで返却する
こういう関数を作ろうと思うと、sという文字列の中身について、
s[0]に格納されているのはcかどうか、s[1]に格納されてるのはcかどうか、s[2]に格納されているのは…
と、ひたすら繰り返して行く必要があると考えました
そのためには、s[n]について、cなのかどうか判定する必要があるのではないかと
この判定というのが、認識と同じ意味のつもりで使いました
0239デフォルトの名無しさん
2008/02/22(金) 23:40:52検索すればいくらでも出るだろ
0240デフォルトの名無しさん
2008/02/22(金) 23:45:33if (s[0] == 'c') return 1;
if (s[1] == 'c') return 2;
if (s[2] == 'c') return 3;
...and so on.
0241デフォルトの名無しさん
2008/02/22(金) 23:50:48学校の宿題は自分でやれよ。屑
0242デフォルトの名無しさん
2008/02/23(土) 00:02:06それ以外に方法はstrchrを使用するぐらいしか思いつかない
(strchrもおそらくは、中で同じようなことしてると思うけど)
なにが疑問なのかよくわからないので、とりえあず2通りソースを貼り付けときます
�@
int i;
for(i=0; s[i] != '\0' && s[i] != c; i++);
return s[i] != '\0' ? i : -1;
�A
char *p;
return (p=strchr(s, c)) != NULL ? (int)(p-s) : -1;
返ってくるのは配列の添え字ですのであしからず
0243デフォルトの名無しさん
2008/02/23(土) 00:06:01どうも、理解できました
>>242
ご丁寧にどうもありがとうございました
0244デフォルトの名無しさん
2008/02/23(土) 03:34:24C++ VS2005
略)
printf("Got: %02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);
※
buf[0]には01
buf[1]には06
buf[2]には17
buf[3]にはf3
buf[4]には34
が入る。
を文字列"0106171f34"に置き換えたい。
1.このbuf[]の中(16進数)を文字列に変換したい。
2.文字列に変換した後に、buf[0]〜buf[5]を繋げたい。
sprintとかを使えば良いみたいなのですが、どのようにやってよいか分からずに困っています。
どうかよろしくお願いします。
0245デフォルトの名無しさん
2008/02/23(土) 03:35:36課題を丸投げしたいなら宿題スレにいけ
0246デフォルトの名無しさん
2008/02/23(土) 03:37:49いや一応答えると
sprintじゃなくてsprintfだな
sprintfで連結もできます
0248デフォルトの名無しさん
2008/02/23(土) 03:54:120249244
2008/02/23(土) 08:58:16なんとか解決しました。時間かかった>< やってみれば、なんと簡単なコードって感じですけど。
ヘルプのみかたってイマイチわからないんですけど、ヘルプの見方の解説サイトとかってありませんでしょうか?
0250デフォルトの名無しさん
2008/02/23(土) 09:49:02manコマンドのことなら、man manでOK。
0251デフォルトの名無しさん
2008/02/23(土) 10:05:35VC++6.0でデバッグしてると、関数に入るだけでESPが100バイトくらい進みます
C++だとモジュール毎にスタックをこんなに食うものなのでしょうか?
デバッグ情報か何かで食ってるのですか?
0252デフォルトの名無しさん
2008/02/23(土) 10:06:37■ このスレッドは過去ログ倉庫に格納されています