【初心者歓迎】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
0446デフォルトの名無しさん
2008/02/23(土) 22:49:59…
一般的に知られている C言語の定義とは違うものを扱ってらっしゃるのですね
0447デフォルトの名無しさん
2008/02/23(土) 22:50:530448デフォルトの名無しさん
2008/02/23(土) 22:52:02なんでchとかtestとか別の変数が出てくるの?
構造体のまま扱い続ければいいでしょ。
0450デフォルトの名無しさん
2008/02/23(土) 22:55:140451デフォルトの名無しさん
2008/02/23(土) 22:55:32本格的に他人に頼りたいなら金でも払え
0452デフォルトの名無しさん
2008/02/23(土) 22:59:15ただのポインタだろ
str.st と等価だ
0453デフォルトの名無しさん
2008/02/23(土) 23:01:55char *ch=new char [100]; strcpy(ch, "---------");
という文字列に対して、その先頭と後方のアドレスを関数に渡して、関数側で書き換えられるようにしたいんです
0454デフォルトの名無しさん
2008/02/23(土) 23:04:50とりあえずそんなことを考える前に
入門書なりきちんと読め。
たのむから
0455デフォルトの名無しさん
2008/02/23(土) 23:09:26このとき初めの文字列を解放するか、上書きすれば最高でも400Mしかメモリを使いません
しかし、それができずに返却すると最大 200M + 200M + 200M必要になります
0456デフォルトの名無しさん
2008/02/23(土) 23:11:03ソケット使ってカリカリやるしか思いつかん
0457デフォルトの名無しさん
2008/02/23(土) 23:11:12手軽さならWinInet
真剣にやるならWinsock
0458デフォルトの名無しさん
2008/02/23(土) 23:13:38435みたいに、構造体で渡した後、元の変数に代入し直せばいい。
0459デフォルトの名無しさん
2008/02/23(土) 23:15:300460デフォルトの名無しさん
2008/02/23(土) 23:19:19だったら、
typedef struct {
char *baka;
size_t length;
} aho;
とでもして、構造体をやり取りすればいいだろ。
C++だったら、vector<char>、deque<char>でも使えや。
0461443
2008/02/23(土) 23:20:13サンクス
0462デフォルトの名無しさん
2008/02/23(土) 23:20:26URLDownloadToFile
0463デフォルトの名無しさん
2008/02/23(土) 23:26:44なぜ直接書き換えられないのかわかりません
0464デフォルトの名無しさん
2008/02/23(土) 23:29:10こっちからしてみたら、なんで構造体を使いたくないのかわからない。
0465デフォルトの名無しさん
2008/02/23(土) 23:29:25もっと勉強してから出直せ
0466デフォルトの名無しさん
2008/02/23(土) 23:40:17開始のアドレスと長さを渡しても上と同じだと思います
0467デフォルトの名無しさん
2008/02/23(土) 23:41:340468デフォルトの名無しさん
2008/02/23(土) 23:44:18「名前欄にレス番つけること」すら今日知ったっぽい
0469デフォルトの名無しさん
2008/02/23(土) 23:44:390470デフォルトの名無しさん
2008/02/23(土) 23:46:32表示するとき右から3文字ごとにコンマをつける方法ってどうすれば?
(例:入力>>344fru38fh4tgiur
出力>>3,44f,ru3,8fh,4tg,iur)
この続きお願いします・・
#include <iostream.h>
main()
{
char a[50] ;
cout <<"aに文字を入力してください>>" ;
cin.getline(a, 50) ;
int a_count = 0 ;
while( a[a_count] != '\0'){
a_count++ ;
}
cout <<"aを表示します→" ;
for(int i=0 ; i<a_count ; i++){
cout << a[i] ;
}
}
0471デフォルトの名無しさん
2008/02/23(土) 23:48:55#include <stdio.h>
#include <string.h>
typedef struct { char *start ; char *end; } bin;
void f(bin *x) {
delete x->start;
x->start = new char [3];
strcpy(x->start,"aa"); }
main() {
char *ch = new char [2];
strcpy(ch,"a");
bin x;
x.start=ch; x.end=ch+strlen(ch);
f(&x);
printf("%s",ch);
}
0472デフォルトの名無しさん
2008/02/23(土) 23:50:11http://www.google.co.jp/search?q=C%2B%2B+3%E6%A1%81+%E3%82%B3%E3%83%B3%E3%83%9E&btnG=%E6%A4%9C%E7%B4%A2&lr=
0473デフォルトの名無しさん
2008/02/23(土) 23:53:13だから x.start=&ch;と参照渡しをするために
構造体を { char **start ; char **end; }に変更します
そうすると上記のような現象が出ます
0474デフォルトの名無しさん
2008/02/23(土) 23:53:48f(&x);
ch=x.start;
printf("%s",ch);
でいいだろ
って・・・釣られちまったよ〜〜〜〜ん
0475デフォルトの名無しさん
2008/02/23(土) 23:56:53fを呼んだあとのchが指す先はfの中でdeleteされていることに気づいているか?
0477デフォルトの名無しさん
2008/02/24(日) 00:03:07>>471ではdeleteやnewが効かない場合があるんです これはちゃんと表示されますか?
#include <stdio.h>
#include <string.h>
typedef struct { char *start ; char *end; } bin;
void f(bin *x) {
delete x->start;
x->start = new char [3];
strcpy(x->start,"aa"); }
main() {
char *ch = NULL;
bin x;
x.start=ch;
f(&x);
printf("%s",ch);}
0478デフォルトの名無しさん
2008/02/24(日) 00:06:58しかも、
baka = new aho[shine];
としたら
delete []baka;
とすることしら知らないバカ。
マニュアルでも読め
0479デフォルトの名無しさん
2008/02/24(日) 00:07:28じゃあもういいから、こうしとけ
#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;
void f(bin *x) {
delete[] *x->start;
*x->start = new char [3];
strcpy(*x->start,"aa"); }
void g(bin *x) {
delete[] *x->start;
*x->start = new char [3];
strcpy(*x->start,"bb"); }
main() {
char *ch = NULL;
bin x;
x.start=&ch;
f(&x);
printf("%s",ch);
g(&x);
printf("%s",ch);
}
これで終了、もう来るな
0480デフォルトの名無しさん
2008/02/24(日) 00:08:23deleteもnewも効いているはずだよ?
・chが指す先をdeleteしようが、x->start=new・・・をしようが、chの中身は変わらない。
・deleteしても絶対に書き込めなくなるとは限らない。
これらは理解している?
0481not 477
2008/02/24(日) 00:10:08あ・・・そういえばdelete []baka;としないといけなかったんだ・・・・
C厨ですまん。
0482デフォルトの名無しさん
2008/02/24(日) 00:15:240483デフォルトの名無しさん
2008/02/24(日) 00:17:32main関数内、chだけに注目すれば、
chはNULLで初期化された後、一切変更を受けないだろ。
printfにNULLを渡しているので、未定義。
0484デフォルトの名無しさん
2008/02/24(日) 00:18:48それだと、 bin x;を初期化する関数と、適当な配列を入れるとバグるんです なんでうごかないんですか
#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;
void f(bin *x) {
delete[] *x->start;
*x->start = new char [3];
strcpy(*x->start,"aa"); }
void h(bin *x){
char *ch=new char [3];
ch[0]='X';ch[1]=0;
x->start=&ch; }
main() {
bin x;
h(&x);
f(&x);
char *test=new char [1];
printf("%s",*(x.start));
}
0485デフォルトの名無しさん
2008/02/24(日) 00:23:270486デフォルトの名無しさん
2008/02/24(日) 00:24:02h内のローカル変数chのアドレスをx->startに格納しているが、
chはhを抜けると無くなるので、x->startは存在しない場所を指している。
0487デフォルトの名無しさん
2008/02/24(日) 00:24:26じゃあこれでいいだろう
#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;
void f(bin *x) {
delete[] *x->start;
*x->start = new char [3];
strcpy(*x->start,"aa"); }
char *ch;
void h(bin *x){
ch=new char [3];
ch[0]='X';ch[1]=0;
x->start=&ch; }
main() {
bin x;
h(&x);
f(&x);
char *test=new char [1];
printf("%s",*(x.start));
}
0488デフォルトの名無しさん
2008/02/24(日) 00:25:03ほかのコンパイラでは、入れなくても実行時に落ちます 原因は何ですか?
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分で体のパーツ数回してデータを読み取ってるんですが、
今は無理してそれを崩してまで使う機能ではないってことですね。
よく機能を理解して使えば楽になる物、ということですね。
答えてくれた方ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています