【初心者歓迎】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
0489デフォルトの名無しさん
2008/02/24(日) 00:25:460490デフォルトの名無しさん
2008/02/24(日) 00:27:01原因はchがローカル変数だからだ
0491デフォルトの名無しさん
2008/02/24(日) 00:27:09OSが落ちろ!!って指令を下すからじゃないかな?
0492デフォルトの名無しさん
2008/02/24(日) 00:27:09こいつ分かってるけど、分からないフリしてるだけだろ
0493デフォルトの名無しさん
2008/02/24(日) 00:28:09こっちも暇だからね
0494デフォルトの名無しさん
2008/02/24(日) 00:28:54最初の例から考えると、文字列定数や、文字配列をもdeleteしようとしてるんだから。
0495デフォルトの名無しさん
2008/02/24(日) 00:30:19しかし、これはどのコンパイラでも正常に動きませんか? C++ですが
#include <stdio.h>
#include <string.h>
void h(char *&x){
char *ch=new char [11];
strcpy(ch,"ABCDEFGHIJ");
x=ch; }
main() {
char *x;
h(x); printf("%s",x); }
0496デフォルトの名無しさん
2008/02/24(日) 00:31:31それが動くのはchar*&だからだ
0497デフォルトの名無しさん
2008/02/24(日) 00:32:23うん。それはローカル変数アドレスを取る(ポインタを取る、参照を取る)
ということをやっていないから問題ない。
0498デフォルトの名無しさん
2008/02/24(日) 00:33:28そのhは、chの「値」をコピーしているので、
chが無くなっても値はxに格納されているから動く。
>>484はchの「アドレス」を格納しているだけ。
0499デフォルトの名無しさん
2008/02/24(日) 00:33:34プログラミングは諦めたほうがいい
1.簡単な事をややこしくして
2.バグを入れて
3.聞きまくることで他人の邪魔をする
別の仕事探せ
少なくともオレはそれを勉強熱心とはいえない
0500デフォルトの名無しさん
2008/02/24(日) 00:41:03手段に固執して、何の目的でそのイミフな手段をとろうとしているのか自分でわかってない。
0501デフォルトの名無しさん
2008/02/24(日) 00:41:58タスクマネージャで確認するとf()を抜けてもメモリはそのままです
#include <stdio.h>
f(){
char *x=new char [200*1024*1024]; }
main() {
f();
getchar();
}
0502デフォルトの名無しさん
2008/02/24(日) 00:42:13ちなみに、それをポインタを使って書き直すとこうなる。
#include <stdio.h>
#include <string.h>
void h(char **x) {
char *ch = new char[11];
strcpy(ch, "ABCDEFGHIJ");
*x = ch;
}
int main() {
char *x;
h(&x);
printf("%s",x);
return 0;
}
0503デフォルトの名無しさん
2008/02/24(日) 00:43:280504デフォルトの名無しさん
2008/02/24(日) 00:46:04マニュアル嫁
ヒープの意味を理解してからnew や delete を使え。
変数の記憶クラスを理解しろ
0505デフォルトの名無しさん
2008/02/24(日) 00:47:43allocしたなら残っているけど
0506デフォルトの名無しさん
2008/02/24(日) 00:48:18だからの前後が繋がってないぞ
newした領域がdeleteされるまで解放されなかったら
なぜローカルで定義された変数や配列をmainから操れることになるんだ
0507デフォルトの名無しさん
2008/02/24(日) 00:49:11#include <stdio.h>
#include <string.h>
void h(char **x) {
char *ch = new char[200*1024*1024];
*x = ch; }
main() {
char *x;
h(&x);
getchar();
delete x;
getchar();}
0508デフォルトの名無しさん
2008/02/24(日) 00:52:46それはhのローカルで定義された変数chをmainから操ってるわけではないな
単にnewした領域へのポインタchをmainのxにコピーして渡してるだけだ
0509デフォルトの名無しさん
2008/02/24(日) 00:54:230510デフォルトの名無しさん
2008/02/24(日) 00:54:390511デフォルトの名無しさん
2008/02/24(日) 00:55:37newで確保したメモリへのポインタをmainに連れて行っているだけ。
newやmallocで確保したメモリはソース上のスコープに縛られずに使える。
一方、>>484では、x->start=&ch;というように、
ローカル変数へのポインタをmainへ持って行っている。
しかし、mainに戻ったときには既に変数chそのものが居なくなっているのでうまくいかない。
0512デフォルトの名無しさん
2008/02/24(日) 00:56:05>>507
なにしてるかわかってるならいいけど、ポインタ一回お浚いしたら?
0513デフォルトの名無しさん
2008/02/24(日) 00:56:26あんたはnewで確保した領域と、それを指すポインタ変数を、同一のものであると勘違いしてないか?
>>507のコードでも、ポインタ変数chはhを抜ける時に消滅するのは分かるか?
0514デフォルトの名無しさん
2008/02/24(日) 01:00:530515デフォルトの名無しさん
2008/02/24(日) 01:04:18#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;
void h(bin *x){
char *ch = new char[11];
strcpy(ch, "ABCDEFGHIJ");
*(x->start)=ch; }
main() {
bin x;
h(&x);
printf("%s",*(x.start));
}
0516デフォルトの名無しさん
2008/02/24(日) 01:04:590517デフォルトの名無しさん
2008/02/24(日) 01:05:040518デフォルトの名無しさん
2008/02/24(日) 01:05:450519デフォルトの名無しさん
2008/02/24(日) 01:06:51x->startをまったく初期化しないまま、*(x->start)なんかに代入しているのが間違い。
>>513に答えろ
0520デフォルトの名無しさん
2008/02/24(日) 01:08:18このスレ読んだらなんとなく理解できてきた気がする。
C言語でnewとdeleteを使い続けてる人ありがとう!
あと、もちろん解説してくれてるみんなもありがとう!
明日からもstringばりばり使っていこうと思います。
0521デフォルトの名無しさん
2008/02/24(日) 01:09:24そうだね、それは動かないね
だから?
何を聞きたいのか明確に
0522デフォルトの名無しさん
2008/02/24(日) 01:09:53関数での、初期化と書き換えをする方法がわかりたいです
0523デフォルトの名無しさん
2008/02/24(日) 01:10:25#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;
void h(bin *x) {
char *ch = new char[11];
strcpy(ch, "ABCDEFGHIJ");
*(x->start)=ch; }
int main() {
bin x;
char *p;
x.start = &p;
h(&x);
printf("%s", p);
delete[] p;
}
0524デフォルトの名無しさん
2008/02/24(日) 01:10:30じゃあ、なんでメモリ操作を隠蔽するクラスを作ろうとしないの?
IQ低いから?
0525デフォルトの名無しさん
2008/02/24(日) 01:10:53みんなが何回も例を出しているのに・・・(T_T)
0526デフォルトの名無しさん
2008/02/24(日) 01:12:15上のほうで最終的にCで書くと言っていたはず。
俺にはなんで今はnew[]使ってC++にするのか理解できないけど。
0527デフォルトの名無しさん
2008/02/24(日) 01:12:50おまいがポインタについて知っている知識をすべて述べよ
0528デフォルトの名無しさん
2008/02/24(日) 01:12:53何度か出てる正しく動く例が気に入らない理由はなぜかね
0529デフォルトの名無しさん
2008/02/24(日) 01:18:03それでわかってくれるかどうか不安になる。
0530デフォルトの名無しさん
2008/02/24(日) 01:19:41皆が何言ってるかほとんど分からないC++素人だけど
一日ぐらい気分変えて犬の散歩にでも行ったら?
まあ、犬のウンコの処理しながら考えたりさ
その後で、また一から作ってみる
以外とできるかもよ
0531デフォルトの名無しさん
2008/02/24(日) 01:21:40それだとうごきました サンクス
x.start = &p;
h(&x);
printf("%s", *x.start);
初めにメモリ上にchar*型が確保されないと受け取れないって事か
0532デフォルトの名無しさん
2008/02/24(日) 01:23:55犬のウンコの処理を考えたり に見えて
delete unko;とか脳内で実行しそうになった
0533デフォルトの名無しさん
2008/02/24(日) 01:28:09pを確保しなくても、これでもいいはずですよね
int main() {
bin x;
x.start = new char *;
h(&x);
printf("%s", *x.start);
}
0534デフォルトの名無しさん
2008/02/24(日) 01:28:520535デフォルトの名無しさん
2008/02/24(日) 01:35:57newしたものはdeleteしないといけないのが面倒だから、
使わずに済むなら避けるべき。
0536デフォルトの名無しさん
2008/02/24(日) 01:48:500537デフォルトの名無しさん
2008/02/24(日) 01:53:19再帰関数って便利ですか?
もしよろしければ、メリットとデメリットを教えていただけないでしょうか?
自分の考えでは、 goto と同じ用に無理に使う必要はない機能だと思ってます。
0538デフォルトの名無しさん
2008/02/24(日) 01:54:370539デフォルトの名無しさん
2008/02/24(日) 01:58:18メリットデメリットという問題でもない気がする
0540デフォルトの名無しさん
2008/02/24(日) 01:58:23ポリゴン(ボーン)の操作で便利
でも、無理して使わなくてもおk
0541デフォルトの名無しさん
2008/02/24(日) 02:03:160542デフォルトの名無しさん
2008/02/24(日) 02:09:18【ソース】 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6079.txt
【用途】 IRCクライアント(bot)
【起動方法】 $ ./a irc.tokyo.wide.ad.jp 6664
【動作の現状】
1.コマンドラインからサーバ名とポートを受け取り、ソケット作成、コネクション確立
2.サーバからのコネクションメッセージ受け取り
3.USER/NICKコマンドの送信
4.ウェルカムメッセージ、MOTDの受け取り
5.半角英数のチャンネル名へのJOIN ←ここで停止する
【質問】
・Telnetで同じように接続すると問題なく接続→終了することができる(ISO-2022-JPだから文字化けするが正常)
・送受信周りがかなりいい加減なのでJOIN出来ないのはそこに問題があるのではないか?
イレギュラーなことをやってますが、IRC板orスレというよりCネットワークプログラミング自体の問題かと考え
こちらに質問させていただきました。よろしくお願いいたします。
0543デフォルトの名無しさん
2008/02/24(日) 02:13:01typedef struct _D3DXFRAME {
LPSTR Name;
D3DXMATRIX TransformationMatrix;
LPD3DXMESHCONTAINER pMeshContainer;
struct _D3DXFRAME *pFrameSibling;
struct _D3DXFRAME *pFrameFirstChild;
} D3DXFRAME, *LPD3DXFRAME;
座標系の上に座標系があって、
さらにその座標系の上に座標系が…
と繰り返すので、スタックを自前で管理するより
再帰処理にしたほうが楽というだけ
(体-上腕-腕-手-指 のように繋がっていくので)
0544デフォルトの名無しさん
2008/02/24(日) 02:17:35カンなので外してたら無視してくれ
>for(i=0;i<=strlen(p);i++){
\0も送信してるが、いいのか?
i<strlen(p) なんじゃない?
0545デフォルトの名無しさん
2008/02/24(日) 02:37:36for分で体のパーツ数回してデータを読み取ってるんですが、
今は無理してそれを崩してまで使う機能ではないってことですね。
よく機能を理解して使えば楽になる物、ということですね。
答えてくれた方ありがとうございました。
0546デフォルトの名無しさん
2008/02/24(日) 03:26:15メッセージの終わりを\n → \r\n に変えてみたらいけるかも
0547デフォルトの名無しさん
2008/02/24(日) 03:33:50俺はオナニーして発射した後、ティッシュで拭いてる時にコードが閃くよ。
0548546
2008/02/24(日) 03:56:01\nでメッセージの終わりを判断してるとすると、サーバは次のメッセージの受信で
先頭に\0が入ってしまうんではないかと思う
(2回目のメッセージが、"\0JOIN #ircclidev\n"になるんじゃないかな)
0549デフォルトの名無しさん
2008/02/24(日) 04:06:10i<strlen(p)で解決しました。初歩的ミスもいいところだ・・・。
もう一つ質問があるのですが、(どちらかというとこちらが本題ですが)
ISO-2022-JP(いわゆるJISコード)とShiftJISを相互変換するライブラリorサンプルを探しています。
検索してもなかなかしっくり来るものがなく、nkf経由だと上手くISO-2022-JPの制御コード
(KI/KO=0x1B 0x24 0x42/0x1B 0x28 0x42)を取ることが出来ません。
RFCには、特にマルチバイト環境の規定は定められていませんが、日本語IRCサーバは
ISO-2022-JPを使っているところが主流のようです。
0550デフォルトの名無しさん
2008/02/24(日) 04:12:53http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6082.txt
0551デフォルトの名無しさん
2008/02/24(日) 05:11:02iconvじゃだめかい?
0552デフォルトの名無しさん
2008/02/24(日) 05:52:14VC++6.0からVisualStudio2008に移ったんですが、外観が変わりすぎててチンプンカンプン・・・
どこかVisualStudio2008 Exp の解説やってるページとかありませんか?
dllすら読み込めぬ・・・。orz
0553デフォルトの名無しさん
2008/02/24(日) 06:11:510554デフォルトの名無しさん
2008/02/24(日) 10:24:08つまり、ポインタでも、int*とか、char*とかの型がありますが、例えば
myclass*==int*
とかやるとコンパイルエラーになります。でも、myclass1*==myclass2*は、==演算子も
定義してないのに、コンパイルできるし、ちゃんと動きます。
これは、どういう理由でできるんですか?というか、ポインタの比較をする演算子って
どこで定義してるんでしょうか?
変な質問ですいません。
0555デフォルトの名無しさん
2008/02/24(日) 10:27:060556デフォルトの名無しさん
2008/02/24(日) 10:54:10規格上で「できる」と決められている処理ははコンパイラが勝手に処理してくれる、というだけ。
myclass1*==myclass2* は >555 の言うとおり myclass1 と myclass2 に継承関係があるんだろう。
この場合、暗黙の型変換が発生して同じ型になり比較できる、と決まっている。
で、規格で決められている以上のポインタに対する演算を、自前で定義する必要があるケースはまずない。
0557デフォルトの名無しさん
2008/02/24(日) 10:55:39違う型のポインタの比較はダメ
int* a;
double* b;
a == b
をやってみれば意味がわかるんじゃないかな?
0558デフォルトの名無しさん
2008/02/24(日) 12:50:040559デフォルトの名無しさん
2008/02/24(日) 12:52:24配列自体は無理
0560デフォルトの名無しさん
2008/02/24(日) 12:52:270561デフォルトの名無しさん
2008/02/24(日) 12:53:21できる
template <size_t n>
void func((&a)[n]) のように
0562デフォルトの名無しさん
2008/02/24(日) 12:53:390563デフォルトの名無しさん
2008/02/24(日) 12:58:420564デフォルトの名無しさん
2008/02/24(日) 13:14:21ありがとうございます。
たしかにできませんでした。でも、
template <class T, int N>
int func(T a[N])
{
...
}
こういう様に書いても(func()の引数に&を付けても付けなくても)、aは参照扱いになるようです。
aに対して変更を加えると、func()の呼び出し側の元配列にも変更が反映されました。
0565デフォルトの名無しさん
2008/02/24(日) 13:20:120566デフォルトの名無しさん
2008/02/24(日) 13:32:04aは参照でなくてdecayされるからポインタだろ
0567デフォルトの名無しさん
2008/02/24(日) 13:36:59そうか。ポインタですよね。
ポインタをコピーして、その先まで複製してくれるのはありえないですよね。
ありがとうございました。
0568デフォルトの名無しさん
2008/02/24(日) 13:50:24boost::array を使うとか。
0569デフォルトの名無しさん
2008/02/24(日) 16:28:53rand/srand使うしかないですか?
rand/srand使うとしたら、シードによく現在時刻使いますが
現在時刻を取得する方法はtimeしかないですか?
++らしい方法があれば教えてください。
0570デフォルトの名無しさん
2008/02/24(日) 16:30:060571デフォルトの名無しさん
2008/02/24(日) 16:31:57http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
ここから持っていけばいいんじゃね
0572デフォルトの名無しさん
2008/02/24(日) 16:32:08Boost.Random
0573デフォルトの名無しさん
2008/02/24(日) 17:06:58という風に文字列と数字を一緒にメッセージ表示出来ましたが、
C++で文字列と数字を一緒にメッセージ表示させるにはどうしたらいいでしょうか?
MessageBox(NULL, "文字列"+123, "test", NULL)
というのは出来ませんでした。
0574デフォルトの名無しさん
2008/02/24(日) 17:09:11JavaScript同様、文字列を連結してから表示すればいい。
0575デフォルトの名無しさん
2008/02/24(日) 17:19:27char msg[20] = "文字列";
char tmp[10];
itoa(123, tmp, 10);
strcat(msg, tmp);
MessageBox(NULL, msg, "test", NULL);
こんな感じですか?
メッセージ毎にこのコードを書くのも面倒臭いのと、
いつも "文字列"+数字 の組み合わせと言うわけでもなく
数字+"文字列"+数字+"文字列" という事もあるため
自作関数でmsgbox(char*, int){}という決め撃ちではやく、
文字列や数字を混同で表示できる方法はないかと考えています。
0576デフォルトの名無しさん
2008/02/24(日) 17:20:07ソース内に日本語を入れるとエラーになるんですが、
どこをどうすればいいのでしょうか?
超初心者です。よろしくお願いします。
0577デフォルトの名無しさん
2008/02/24(日) 17:21:41○ //ああああ
0578デフォルトの名無しさん
2008/02/24(日) 17:22:140579576
2008/02/24(日) 17:27:51/* hello02.c */
#include <stdio.h>
int main()
{
printf("今日はよい天気です。\n");
printf("明日もよい天気でしょう。 \n");
return 0;
}
これなんですけど…
0580デフォルトの名無しさん
2008/02/24(日) 17:30:51どんなエラー?
0581デフォルトの名無しさん
2008/02/24(日) 17:34:42ありがとうございます、Boost 試してみます。
手元の mingw にはなさそうなので、まずはgooって
Boost 環境揃えてみますね。
>>576
・ソースの文字コードを変えてみる
・処理系を変えてみる
0582576
2008/02/24(日) 17:36:23普通に表示されました。
なんか間違ったやりかたしてたみたいです…
申し訳ないです。
0583デフォルトの名無しさん
2008/02/24(日) 17:41:12そのためのsprintf、とだけいっておくけど。
0584デフォルトの名無しさん
2008/02/24(日) 17:48:41sprintfだとメッセージウィンドウは生成されないですよね?
外見としてはMessageBoxの中身に数字や文字列を表示している様な方法がいいんです。
0585デフォルトの名無しさん
2008/02/24(日) 17:54:210586デフォルトの名無しさん
2008/02/24(日) 17:55:05ならsprintfしてMessageboxにいれる処理の関数つくればよくね?
0587デフォルトの名無しさん
2008/02/24(日) 17:56:41二段構えになるのが嫌、というだけの話とエスパー
vsprintf()使って自作ラッパー関数でも書くんだな
0588デフォルトの名無しさん
2008/02/24(日) 17:58:37boost::lexical_cast
を使うと幸せになれると思う
■ このスレッドは過去ログ倉庫に格納されています