【初心者歓迎】C/C++室 Ver.49【環境依存OK】
at TECH
[前50を表示]
450:デフォルトの名無しさん
08/02/23 22:55:14
chは現物の文字列です この初めと終わりのアドレスを構造体で渡して変化させるようにしたいんです
451:デフォルトの名無しさん
08/02/23 22:55:32
本でも読んで出直してこいよ
本格的に他人に頼りたいなら金でも払え
452:デフォルトの名無しさん
08/02/23 22:59:15
現物の文字列ってなんだよ
ただのポインタだろ
str.st と等価だ
453:デフォルトの名無しさん
08/02/23 23:01:55
たとえば、
char *ch=new char [100]; strcpy(ch, "---------");
という文字列に対して、その先頭と後方のアドレスを関数に渡して、関数側で書き換えられるようにしたいんです
454:デフォルトの名無しさん
08/02/23 23:04:50
何にそんなもんをつかうんかわからんが
とりあえずそんなことを考える前に
入門書なりきちんと読め。
たのむから
455:デフォルトの名無しさん
08/02/23 23:09:26
初めの文字列が200M程度確保されていたとして作業領域も200M使うとします
このとき初めの文字列を解放するか、上書きすれば最高でも400Mしかメモリを使いません
しかし、それができずに返却すると最大 200M + 200M + 200M必要になります
456:デフォルトの名無しさん
08/02/23 23:11:03
>>449
ソケット使ってカリカリやるしか思いつかん
457:デフォルトの名無しさん
08/02/23 23:11:12
>>443
手軽さならWinInet
真剣にやるならWinsock
458:デフォルトの名無しさん
08/02/23 23:13:38
>>450
435みたいに、構造体で渡した後、元の変数に代入し直せばいい。
459:デフォルトの名無しさん
08/02/23 23:15:30
もはやポインタいらんがなw
460:デフォルトの名無しさん
08/02/23 23:19:19
文字列ではなく、1byte変数の配列を可変長で扱いたいと。
だったら、
typedef struct {
char *baka;
size_t length;
} aho;
とでもして、構造体をやり取りすればいいだろ。
C++だったら、vector<char>、deque<char>でも使えや。
461:443
08/02/23 23:20:13
WinInetででググったらいっぱい出てきたんで調べてみる。
サンクス
462:デフォルトの名無しさん
08/02/23 23:20:26
>>443
URLDownloadToFile
463:デフォルトの名無しさん
08/02/23 23:26:44
>>458
なぜ直接書き換えられないのかわかりません
464:デフォルトの名無しさん
08/02/23 23:29:10
>>463
こっちからしてみたら、なんで構造体を使いたくないのかわからない。
465:デフォルトの名無しさん
08/02/23 23:29:25
>>463
もっと勉強してから出直せ
466:デフォルトの名無しさん
08/02/23 23:40:17
もともと構造体は使っていますよ あとC言語のみで動かせるようにしたいんです
開始のアドレスと長さを渡しても上と同じだと思います
467:デフォルトの名無しさん
08/02/23 23:41:34
あぼーんしたいからトリップつけてくれ
468:デフォルトの名無しさん
08/02/23 23:44:18
たぶんトリのつけ方を知らない。
「名前欄にレス番つけること」すら今日知ったっぽい
469:デフォルトの名無しさん
08/02/23 23:44:39
釣りだろう
470:デフォルトの名無しさん
08/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] ;
}
}
471:デフォルトの名無しさん
08/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);
}
472:デフォルトの名無しさん
08/02/23 23:50:11
>>470
URLリンク(www.google.co.jp)
473:デフォルトの名無しさん
08/02/23 23:53:13
x.start=ch; とした時点で、数値がコピーされるだけになり、文字列を書き換えられなくなります
だから x.start=&ch;と参照渡しをするために
構造体を { char **start ; char **end; }に変更します
そうすると上記のような現象が出ます
474:デフォルトの名無しさん
08/02/23 23:53:48
>>471
f(&x);
ch=x.start;
printf("%s",ch);
でいいだろ
って・・・釣られちまったよ〜〜〜〜ん
475:デフォルトの名無しさん
08/02/23 23:56:53
>>473
fを呼んだあとのchが指す先はfの中でdeleteされていることに気づいているか?
476:475
08/02/23 23:57:42
×>>473
○>>471
477:デフォルトの名無しさん
08/02/24 00:03:07
>>475
>>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);}
478:デフォルトの名無しさん
08/02/24 00:06:58
Cで動くようにしたいとかホザいておきながら、new や deleteを使うバカ
しかも、
baka = new aho[shine];
としたら
delete []baka;
とすることしら知らないバカ。
マニュアルでも読め
479:デフォルトの名無しさん
08/02/24 00:07:28
>>477
じゃあもういいから、こうしとけ
#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);
}
これで終了、もう来るな
480:デフォルトの名無しさん
08/02/24 00:08:23
>>477
deleteもnewも効いているはずだよ?
・chが指す先をdeleteしようが、x->start=new・・・をしようが、chの中身は変わらない。
・deleteしても絶対に書き込めなくなるとは限らない。
これらは理解している?
481:not 477
08/02/24 00:10:08
>>478
あ・・・そういえばdelete []baka;としないといけなかったんだ・・・・
C厨ですまん。
482:デフォルトの名無しさん
08/02/24 00:15:24
構造体はCでないというつもりか?
483:デフォルトの名無しさん
08/02/24 00:17:32
>>477
main関数内、chだけに注目すれば、
chはNULLで初期化された後、一切変更を受けないだろ。
printfにNULLを渡しているので、未定義。
484:デフォルトの名無しさん
08/02/24 00:18:48
>>479
それだと、 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));
}
485:デフォルトの名無しさん
08/02/24 00:23:27
バグるじゃ分らんだろ。
486:デフォルトの名無しさん
08/02/24 00:24:02
>>484
h内のローカル変数chのアドレスをx->startに格納しているが、
chはhを抜けると無くなるので、x->startは存在しない場所を指している。
487:デフォルトの名無しさん
08/02/24 00:24:26
>>484
じゃあこれでいいだろう
#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));
}
488:デフォルトの名無しさん
08/02/24 00:25:03
char *test=new char [1];をのぞくと、bcc5.5では動作します
ほかのコンパイラでは、入れなくても実行時に落ちます 原因は何ですか?
489:デフォルトの名無しさん
08/02/24 00:25:46
いいように使われてるぞ、デバッグ隊w
490:デフォルトの名無しさん
08/02/24 00:27:01
>>488
原因はchがローカル変数だからだ
491:デフォルトの名無しさん
08/02/24 00:27:09
>>488
OSが落ちろ!!って指令を下すからじゃないかな?
492:デフォルトの名無しさん
08/02/24 00:27:09
おまいらまだ付き合ってやってんのか
こいつ分かってるけど、分からないフリしてるだけだろ
493:デフォルトの名無しさん
08/02/24 00:28:09
>>492
こっちも暇だからね
494:デフォルトの名無しさん
08/02/24 00:28:54
バカは放置汁。
最初の例から考えると、文字列定数や、文字配列をもdeleteしようとしてるんだから。
495:デフォルトの名無しさん
08/02/24 00:30:19
>>486>>487
しかし、これはどのコンパイラでも正常に動きませんか? 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); }
496:デフォルトの名無しさん
08/02/24 00:31:31
>>495
それが動くのはchar*&だからだ
497:デフォルトの名無しさん
08/02/24 00:32:23
>>495
うん。それはローカル変数アドレスを取る(ポインタを取る、参照を取る)
ということをやっていないから問題ない。
498:デフォルトの名無しさん
08/02/24 00:33:28
>>495
そのhは、chの「値」をコピーしているので、
chが無くなっても値はxに格納されているから動く。
>>484はchの「アドレス」を格納しているだけ。
499:デフォルトの名無しさん
08/02/24 00:33:34
>>488
プログラミングは諦めたほうがいい
1.簡単な事をややこしくして
2.バグを入れて
3.聞きまくることで他人の邪魔をする
別の仕事探せ
少なくともオレはそれを勉強熱心とはいえない
500:デフォルトの名無しさん
08/02/24 00:41:03
だから、バカは放置だって。
手段に固執して、何の目的でそのイミフな手段をとろうとしているのか自分でわかってない。
501:デフォルトの名無しさん
08/02/24 00:41:58
確認したいのですが、newは、deleteするかプログラムが終了するまで解放されないはずですよね?
タスクマネージャで確認するとf()を抜けてもメモリはそのままです
#include <stdio.h>
f(){
char *x=new char [200*1024*1024]; }
main() {
f();
getchar();
}
502:デフォルトの名無しさん
08/02/24 00:42:13
>>495
ちなみに、それをポインタを使って書き直すとこうなる。
#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;
}
503:デフォルトの名無しさん
08/02/24 00:43:28
だからローカルで定義された変数や配列でも、そのアドレスが判明していれば、main()などで操ったり解放できますよね
504:デフォルトの名無しさん
08/02/24 00:46:04
>>503
マニュアル嫁
ヒープの意味を理解してからnew や delete を使え。
変数の記憶クラスを理解しろ
505:デフォルトの名無しさん
08/02/24 00:47:43
ローカル定義は外に抜けたら、内容が残っている保証はない
allocしたなら残っているけど
506:デフォルトの名無しさん
08/02/24 00:48:18
>>503
だからの前後が繋がってないぞ
newした領域がdeleteされるまで解放されなかったら
なぜローカルで定義された変数や配列をmainから操れることになるんだ
507:デフォルトの名無しさん
08/02/24 00:49:11
なぜですか? 間違っていないと思いますよ これはmain()側で解放してます
#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();}
508:デフォルトの名無しさん
08/02/24 00:52:46
>>507
それはhのローカルで定義された変数chをmainから操ってるわけではないな
単にnewした領域へのポインタchをmainのxにコピーして渡してるだけだ
509:デフォルトの名無しさん
08/02/24 00:54:23
一度目のキー入力で、200M分メモリを解放しますよ タスクマネージャみてください
510:デフォルトの名無しさん
08/02/24 00:54:39
伸びがいいから何かと思ったら未だ相手にしてたのか。
511:デフォルトの名無しさん
08/02/24 00:55:37
>>507
newで確保したメモリへのポインタをmainに連れて行っているだけ。
newやmallocで確保したメモリはソース上のスコープに縛られずに使える。
一方、>>484では、x->start=&ch;というように、
ローカル変数へのポインタをmainへ持って行っている。
しかし、mainに戻ったときには既に変数chそのものが居なくなっているのでうまくいかない。
512:デフォルトの名無しさん
08/02/24 00:56:05
見事な無自覚の自己中心主義だな、早く治せよ
>>507
なにしてるかわかってるならいいけど、ポインタ一回お浚いしたら?
513:デフォルトの名無しさん
08/02/24 00:56:26
>>507
あんたはnewで確保した領域と、それを指すポインタ変数を、同一のものであると勘違いしてないか?
>>507のコードでも、ポインタ変数chはhを抜ける時に消滅するのは分かるか?
514:デフォルトの名無しさん
08/02/24 01:00:53
まずchar *x の xは、int xや float xと同じで、ただのローカル変数であることを覚えとけ
515:デフォルトの名無しさん
08/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));
}
516:デフォルトの名無しさん
08/02/24 01:04:59
>
517:デフォルトの名無しさん
08/02/24 01:05:04
free(p)ってやるとpがNULLになるとか思っちゃう人なのかな。
518:デフォルトの名無しさん
08/02/24 01:05:45
お前らバカの相手すんなって。つけあがるから。
519:デフォルトの名無しさん
08/02/24 01:06:51
>>515
x->startをまったく初期化しないまま、*(x->start)なんかに代入しているのが間違い。
>>513に答えろ
520:デフォルトの名無しさん
08/02/24 01:08:18
俺結構ポインタの理解があやふやで、だからなるべくポインタのややこしい部分には触れないプログラム今までしてきたんだけど、
このスレ読んだらなんとなく理解できてきた気がする。
C言語でnewとdeleteを使い続けてる人ありがとう!
あと、もちろん解説してくれてるみんなもありがとう!
明日からもstringばりばり使っていこうと思います。
521:デフォルトの名無しさん
08/02/24 01:09:24
>>515
そうだね、それは動かないね
だから?
何を聞きたいのか明確に
522:デフォルトの名無しさん
08/02/24 01:09:53
ポインタ変数が消滅するのはわかります
関数での、初期化と書き換えをする方法がわかりたいです
523:デフォルトの名無しさん
08/02/24 01:10:25
>>515
#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;
}
524:デフォルトの名無しさん
08/02/24 01:10:30
new/deleteを使うということは当然C++だよな?
じゃあ、なんでメモリ操作を隠蔽するクラスを作ろうとしないの?
IQ低いから?
525:デフォルトの名無しさん
08/02/24 01:10:53
>>522
みんなが何回も例を出しているのに・・・(T_T)
526:デフォルトの名無しさん
08/02/24 01:12:15
>>524
上のほうで最終的にCで書くと言っていたはず。
俺にはなんで今はnew[]使ってC++にするのか理解できないけど。
527:デフォルトの名無しさん
08/02/24 01:12:50
>>522
おまいがポインタについて知っている知識をすべて述べよ
528:デフォルトの名無しさん
08/02/24 01:12:53
>>522
何度か出てる正しく動く例が気に入らない理由はなぜかね
529:デフォルトの名無しさん
08/02/24 01:18:03
仮に、彼へC言語ポインタ完全制覇を与えたとしても、
それでわかってくれるかどうか不安になる。
530:デフォルトの名無しさん
08/02/24 01:19:41
>>522
皆が何言ってるかほとんど分からないC++素人だけど
一日ぐらい気分変えて犬の散歩にでも行ったら?
まあ、犬のウンコの処理しながら考えたりさ
その後で、また一から作ってみる
以外とできるかもよ
531:デフォルトの名無しさん
08/02/24 01:21:40
>>523
それだとうごきました サンクス
x.start = &p;
h(&x);
printf("%s", *x.start);
初めにメモリ上にchar*型が確保されないと受け取れないって事か
532:デフォルトの名無しさん
08/02/24 01:23:55
>>530
犬のウンコの処理を考えたり に見えて
delete unko;とか脳内で実行しそうになった
533:デフォルトの名無しさん
08/02/24 01:28:09
>>523
pを確保しなくても、これでもいいはずですよね
int main() {
bin x;
x.start = new char *;
h(&x);
printf("%s", *x.start);
}
534:デフォルトの名無しさん
08/02/24 01:28:52
newしたらdeleteしとけよ
535:デフォルトの名無しさん
08/02/24 01:35:57
>>533
newしたものはdeleteしないといけないのが面倒だから、
使わずに済むなら避けるべき。
536:デフォルトの名無しさん
08/02/24 01:48:50
だから、newを捨てるところからはじめろって。
537:デフォルトの名無しさん
08/02/24 01:53:19
C及びC++を使いゲームを作成された方へ質問です。
再帰関数って便利ですか?
もしよろしければ、メリットとデメリットを教えていただけないでしょうか?
自分の考えでは、 goto と同じ用に無理に使う必要はない機能だと思ってます。
538:デフォルトの名無しさん
08/02/24 01:54:37
再帰関数については色々思うところがあるのだが、ゲームを作っているわけではないからなぁ。
539:デフォルトの名無しさん
08/02/24 01:58:18
無理に使う必要は無いなぁ
メリットデメリットという問題でもない気がする
540:デフォルトの名無しさん
08/02/24 01:58:23
>>537
ポリゴン(ボーン)の操作で便利
でも、無理して使わなくてもおk
541:デフォルトの名無しさん
08/02/24 02:03:16
ボーン操作ってことは、データの読み込み時に便利ってことでしょうか?
542:デフォルトの名無しさん
08/02/24 02:09:18
【環境】 MS WinXP/gcc 3.4.4 on cygwin
【ソース】 URLリンク(kansai2channeler.hp.infoseek.co.jp)
【用途】 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ネットワークプログラミング自体の問題かと考え
こちらに質問させていただきました。よろしくお願いいたします。
543:デフォルトの名無しさん
08/02/24 02:13:01
>>541
typedef struct _D3DXFRAME {
LPSTR Name;
D3DXMATRIX TransformationMatrix;
LPD3DXMESHCONTAINER pMeshContainer;
struct _D3DXFRAME *pFrameSibling;
struct _D3DXFRAME *pFrameFirstChild;
} D3DXFRAME, *LPD3DXFRAME;
座標系の上に座標系があって、
さらにその座標系の上に座標系が…
と繰り返すので、スタックを自前で管理するより
再帰処理にしたほうが楽というだけ
(体-上腕-腕-手-指 のように繋がっていくので)
544:デフォルトの名無しさん
08/02/24 02:17:35
>>542
カンなので外してたら無視してくれ
>for(i=0;i<=strlen(p);i++){
\0も送信してるが、いいのか?
i<strlen(p) なんじゃない?
545:デフォルトの名無しさん
08/02/24 02:37:36
>>543
for分で体のパーツ数回してデータを読み取ってるんですが、
今は無理してそれを崩してまで使う機能ではないってことですね。
よく機能を理解して使えば楽になる物、ということですね。
答えてくれた方ありがとうございました。
546:デフォルトの名無しさん
08/02/24 03:26:15
>>542
メッセージの終わりを\n → \r\n に変えてみたらいけるかも
547:デフォルトの名無しさん
08/02/24 03:33:50
>>530
俺はオナニーして発射した後、ティッシュで拭いてる時にコードが閃くよ。
548:546
08/02/24 03:56:01
あと、>>544と同じく\0の送信は不味いんでは?
\nでメッセージの終わりを判断してるとすると、サーバは次のメッセージの受信で
先頭に\0が入ってしまうんではないかと思う
(2回目のメッセージが、"\0JOIN #ircclidev\n"になるんじゃないかな)
549:デフォルトの名無しさん
08/02/24 04:06:10
>>544,>>548
i<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を使っているところが主流のようです。
550:デフォルトの名無しさん
08/02/24 04:12:53
>>542の修正版ソースです。一応日本語以外はちゃんと動く・・・はず
URLリンク(kansai2channeler.hp.infoseek.co.jp)
551:デフォルトの名無しさん
08/02/24 05:11:02
>>549
iconvじゃだめかい?
552:デフォルトの名無しさん
08/02/24 05:52:14
すんません。
VC++6.0からVisualStudio2008に移ったんですが、外観が変わりすぎててチンプンカンプン・・・
どこかVisualStudio2008 Exp の解説やってるページとかありませんか?
dllすら読み込めぬ・・・。orz
553:デフォルトの名無しさん
08/02/24 06:11:51
Visual Studio2008スレにGO
554:デフォルトの名無しさん
08/02/24 10:24:08
自分でクラスを定義するときに、ポインタに対する演算は、定義しなくてもよいのでしょうか?
つまり、ポインタでも、int*とか、char*とかの型がありますが、例えば
myclass*==int*
とかやるとコンパイルエラーになります。でも、myclass1*==myclass2*は、==演算子も
定義してないのに、コンパイルできるし、ちゃんと動きます。
これは、どういう理由でできるんですか?というか、ポインタの比較をする演算子って
どこで定義してるんでしょうか?
変な質問ですいません。
555:デフォルトの名無しさん
08/02/24 10:27:06
継承関係があるんじゃない?
556:デフォルトの名無しさん
08/02/24 10:54:10
>554
規格上で「できる」と決められている処理ははコンパイラが勝手に処理してくれる、というだけ。
myclass1*==myclass2* は >555 の言うとおり myclass1 と myclass2 に継承関係があるんだろう。
この場合、暗黙の型変換が発生して同じ型になり比較できる、と決まっている。
で、規格で決められている以上のポインタに対する演算を、自前で定義する必要があるケースはまずない。
557:デフォルトの名無しさん
08/02/24 10:55:39
>>554
違う型のポインタの比較はダメ
int* a;
double* b;
a == b
をやってみれば意味がわかるんじゃないかな?
558:デフォルトの名無しさん
08/02/24 12:50:04
C++で配列を関数の引数にできますか?
559:デフォルトの名無しさん
08/02/24 12:52:24
配列の参照か、配列のポインタか、配列要素のポインタならできます
配列自体は無理
560:デフォルトの名無しさん
08/02/24 12:52:27
ポインタじゃダメなのか?
561:デフォルトの名無しさん
08/02/24 12:53:21
>>558
できる
template <size_t n>
void func((&a)[n]) のように
562:デフォルトの名無しさん
08/02/24 12:53:39
型がねえ
563:デフォルトの名無しさん
08/02/24 12:58:42
すまん忘れた
564:デフォルトの名無しさん
08/02/24 13:14:21
>>559-563
ありがとうございます。
たしかにできませんでした。でも、
template <class T, int N>
int func(T a[N])
{
...
}
こういう様に書いても(func()の引数に&を付けても付けなくても)、aは参照扱いになるようです。
aに対して変更を加えると、func()の呼び出し側の元配列にも変更が反映されました。
565:デフォルトの名無しさん
08/02/24 13:20:12
そりゃaはポインタなんだから。
566:デフォルトの名無しさん
08/02/24 13:32:04
>>564
aは参照でなくてdecayされるからポインタだろ
567:デフォルトの名無しさん
08/02/24 13:36:59
>>565-566
そうか。ポインタですよね。
ポインタをコピーして、その先まで複製してくれるのはありえないですよね。
ありがとうございました。
568:デフォルトの名無しさん
08/02/24 13:50:24
構造体かクラスでラップしとけばいい。
boost::array を使うとか。
569:デフォルトの名無しさん
08/02/24 16:28:53
C++で乱数を扱う為のクラスとか関数はありますか?
rand/srand使うしかないですか?
rand/srand使うとしたら、シードによく現在時刻使いますが
現在時刻を取得する方法はtimeしかないですか?
++らしい方法があれば教えてください。
570:デフォルトの名無しさん
08/02/24 16:30:06
MT法のインラインアセンブラ版がどっかにころがってたきがする
571:デフォルトの名無しさん
08/02/24 16:31:57
boost使うか
URLリンク(www.math.sci.hiroshima-u.ac.jp)
ここから持っていけばいいんじゃね
572:デフォルトの名無しさん
08/02/24 16:32:08
>>569
Boost.Random
573:デフォルトの名無しさん
08/02/24 17:06:58
javascriptではalert("文字列"+123)
という風に文字列と数字を一緒にメッセージ表示出来ましたが、
C++で文字列と数字を一緒にメッセージ表示させるにはどうしたらいいでしょうか?
MessageBox(NULL, "文字列"+123, "test", NULL)
というのは出来ませんでした。
574:デフォルトの名無しさん
08/02/24 17:09:11
>>573
JavaScript同様、文字列を連結してから表示すればいい。
575:デフォルトの名無しさん
08/02/24 17:19:27
>>574
char msg[20] = "文字列";
char tmp[10];
itoa(123, tmp, 10);
strcat(msg, tmp);
MessageBox(NULL, msg, "test", NULL);
こんな感じですか?
メッセージ毎にこのコードを書くのも面倒臭いのと、
いつも "文字列"+数字 の組み合わせと言うわけでもなく
数字+"文字列"+数字+"文字列" という事もあるため
自作関数でmsgbox(char*, int){}という決め撃ちではやく、
文字列や数字を混同で表示できる方法はないかと考えています。
576:デフォルトの名無しさん
08/02/24 17:20:07
お願いします。C言語初心者なんですが、
ソース内に日本語を入れるとエラーになるんですが、
どこをどうすればいいのでしょうか?
超初心者です。よろしくお願いします。
577:デフォルトの名無しさん
08/02/24 17:21:41
× ああああ
○ //ああああ
578:デフォルトの名無しさん
08/02/24 17:22:14
ソースから日本語を消す
579:576
08/02/24 17:27:51
説明へたですいません。
/* hello02.c */
#include <stdio.h>
int main()
{
printf("今日はよい天気です。\n");
printf("明日もよい天気でしょう。 \n");
return 0;
}
これなんですけど…
580:デフォルトの名無しさん
08/02/24 17:30:51
>>576
どんなエラー?
581:デフォルトの名無しさん
08/02/24 17:34:42
>>570-572
ありがとうございます、Boost 試してみます。
手元の mingw にはなさそうなので、まずはgooって
Boost 環境揃えてみますね。
>>576
・ソースの文字コードを変えてみる
・処理系を変えてみる
582:576
08/02/24 17:36:23
本当にすいません。
普通に表示されました。
なんか間違ったやりかたしてたみたいです…
申し訳ないです。
583:デフォルトの名無しさん
08/02/24 17:41:12
>575
そのためのsprintf、とだけいっておくけど。
584:デフォルトの名無しさん
08/02/24 17:48:41
>>583
sprintfだとメッセージウィンドウは生成されないですよね?
外見としてはMessageBoxの中身に数字や文字列を表示している様な方法がいいんです。
585:デフォルトの名無しさん
08/02/24 17:54:21
sprintfのsは何の意味か知っているか、とだけ言っておくけど。
586:デフォルトの名無しさん
08/02/24 17:55:05
>>584
ならsprintfしてMessageboxにいれる処理の関数つくればよくね?
587:デフォルトの名無しさん
08/02/24 17:56:41
要はフォーマット→MessageBox()と
二段構えになるのが嫌、というだけの話とエスパー
vsprintf()使って自作ラッパー関数でも書くんだな
588:デフォルトの名無しさん
08/02/24 17:58:37
>>584
boost::lexical_cast
を使うと幸せになれると思う
589:デフォルトの名無しさん
08/02/24 18:04:51
>>585-588
失礼しました。printfと勘違いしてました。
sprintfだと文字列に格納できるんですね。
boostは自分にはまだ早そうなので(正規表現使えるのは魅力的ですが)、sprintfでやってみます。
ありがとうございました。
590:デフォルトの名無しさん
08/02/24 18:05:19
>>588
効率が悪いのが難点
591:デフォルトの名無しさん
08/02/24 18:07:23
>>588
俺も最初それ思いついたけど、連結する数値がたくさんあると見苦しくなるから
std::stringstreamに流し込んで取り出す方がいいんじゃないかなあ。
592:デフォルトの名無しさん
08/02/24 18:45:34
DLLの読み込みで、コンパイラによって失敗します
序数で指定しても動きません どのような理由でしょうか?
VC++だと動かないですが、BCCとDMCで動きます
593:デフォルトの名無しさん
08/02/24 18:47:43
HINSTANCE hd=LoadLibrary("*****.dll");
FN = (fnc) GetProcAddress(hd, (LPCSTR)4); //序数での指定
このような記述はWindowsXPなら万能ではないんでしょうか?
594:デフォルトの名無しさん
08/02/24 18:50:46
訂正
読み込みはしますが、実行時にエラーになります 序数がずれるのかも・・と思い全ての番号で試したのですがだめです
595:デフォルトの名無しさん
08/02/24 18:52:47
継承について教えてください
CFooから派生したCFooEx0、CFooEx1、CFooEx2、CFooEx3があるとします。
そして、それぞれCJissou0、CJissou1、CJissou2、CJissou3に派生してるとします。
その上、CJissou0、CJissou1はIHoge0を、CJissou2、CJissou3はIHoge1を実装しているとします。
図にするとこんな感じ。
CFoo─CFooEx0┬CJissou0
IHoge0┘
CFoo─CFooEx1┬CJissou1
IHoge0┘
CFoo─CFooEx2┬CJissou2
IHoge1┘
CFoo─CFooEx3┬CJissou3
IHoge1┘
CFooとCFooEx〜は弄らないとして、IHoge〜のインターフェイス関数をCJissou〜に実装します。
で、マネージャー的な物例えば、std::vector<CFoo *> vecにそれぞれの実態を入れて、
CJissou〜の関数を呼びたいのですが呼ぶ際には、
dyanamic_cast<CJissou0 *>(vec[0])->Test();見たいな事をしないといけないと思います。
でもそういう呼び出しだとIHoge〜も意味が無くなってしまうし、数が多くなると厳しくなります。(IHoge〜は数個)
だから、dyanamic_cast<IHoge0 *>(vec[0])->Test();//エラー
見たいな呼び方をしたいのですがどうすればいいのでしょうか?
596:デフォルトの名無しさん
08/02/24 18:59:37
>>595
そもそもそのような継承にしてる理由は?
597:デフォルトの名無しさん
08/02/24 18:59:59
>>595
CFoo のメンバ関数ならキャストは要らないはず。
IHoge〜 に意味が無くなると言うが、こっちからしたら CFoo や vec の使い方も
ひっくるめて最初からその継承関係の意味がわからん。
598:595
08/02/24 19:06:57
えっと、まあ、CFooがMFCのCViewで、CFooEx〜がCTreeViewとかCListViewなのでどうした物かと質問しました・・・。
599:デフォルトの名無しさん
08/02/24 19:10:28
なんでvector<IFoo>とかにしないわけ?
あるいは、virtual Test()をもつ何かインターフェースに。
600:デフォルトの名無しさん
08/02/24 19:18:44
CFooEx の状態で持てないのなら
ダウンキャストすることになるだろうな。
601:デフォルトの名無しさん
08/02/24 20:05:03
>>590
もう自前でパースしてるよ
602:592
08/02/24 20:05:24
最適化オプション関係でした
603:デフォルトの名無しさん
08/02/24 20:10:05
>>601
車輪の再発明
604:デフォルトの名無しさん
08/02/24 20:25:22
boostが?
605:デフォルトの名無しさん
08/02/24 20:29:54
ごめん勘違い
606:デフォルトの名無しさん
08/02/24 20:58:50
文字コード?jisコード?って覚えるべきもの?
607:デフォルトの名無しさん
08/02/24 21:06:12
必要になったときに表を見れば十分
608:デフォルトの名無しさん
08/02/24 21:06:13
>>606
全てのJIS漢字のJISコードなんて、そうそう覚えられるもんじゃないと思うが。
609:デフォルトの名無しさん
08/02/24 21:14:12
class Piyo{
〜
};
class Hoge{
public:
void hoge(Piyo[][256]);
};
void Hoge::hoge(Piyo[][256] piyo){
〜
}
こんな実装をした時に、Hoge::hogeのpiyoを書いておくと'Piyoは未定義のシンボル'と怒られてしまいます。
仮引数をPiyo[][256]だけにすればコンパイルは通りますが、どう使えというのか・・・といった感じです。
コンパイラはBCC5.5を使っています。クラスの2次元配列をできれば「参照」で渡したいのですが、
どうすればいいんでしょうか?
610:デフォルトの名無しさん
08/02/24 21:15:36
単に書き方がおかしいだけだ。
void Hoge::hoge(Piyo piyo[][256]) {
しかもこれいわゆる参照渡しの挙動をするが、
正確にはポインタ渡しだし。
611:609
08/02/24 21:29:18
うわ・・・。確かにおかしな書き方してた・・・。
自分でもドン引きです・・・。ありがとうございました
612:デフォルトの名無しさん
08/02/24 23:16:37
URLリンク(streaming.linux-magazin.de)
cmakeについてのリアルタイム講演が聞けるそうな
613:デフォルトの名無しさん
08/02/24 23:20:24
ReadFile(fp , &(buf[N]) , 1500 , &sz , NULL);
でエラーで止まります bufは十分にとってあります なぜでしょうか
614:デフォルトの名無しさん
08/02/24 23:24:57
>>613
bufの宣言がどうなっているかにも拠るが、&(buf[N])をbufにしてみろ。
それで巧くいくなら、お前は馬鹿だ。
615:デフォルトの名無しさん
08/02/24 23:31:32
位置を変えてループして読もうとしてるんです bufにすると上手くいきますが前のデータが消えます
原因不明ですが、変数の位置変えたらエラーでなくなり一応うごくようになりました
616:デフォルトの名無しさん
08/02/24 23:34:06
たまたま動いてるだけくさいな。
単純にバッファオーバーフローしてるだけじゃないのか?
617:デフォルトの名無しさん
08/02/24 23:36:56
メモリ関係のエラーみたいです また止まりました
別のところから変更しないと直りそうにありません
設計やり直してきます
618:デフォルトの名無しさん
08/02/24 23:48:58
coutやnewの多重定義ってどうやるのかわかりません できますか
619:デフォルトの名無しさん
08/02/24 23:51:19
>>613
char buf[NMAX*1500]
なら、&(buf[N*1500])
char buf[NMAX][1500];
なら、&(buf[N][0])
char *buf[NMAX]
for(...) buf[N] = malloc(sizeof(char) * 1500);
なら、buf[N]
620:デフォルトの名無しさん
08/02/24 23:52:38
cout の多重定義??
621:デフォルトの名無しさん
08/02/24 23:55:54
<<のオーバーロードに違いない
622:デフォルトの名無しさん
08/02/24 23:56:41
ostream& operator<<(ostream& ostr, const Hoge& hoge) {
ostr << hoge.str();
}
みたいなやつか。
623:デフォルトの名無しさん
08/02/25 00:07:21
stringは連続していますか? memcpyとかはできますか?
624:デフォルトの名無しさん
08/02/25 00:08:24
なんでstringにmemcpyしたがる人が多いんだろう。
625:デフォルトの名無しさん
08/02/25 00:09:43
stringにmemcpyはまずいんじゃね
626:デフォルトの名無しさん
08/02/25 00:10:45
string s="9999999999";
strcpy( &s[5], "000");
は正しいですか
627:デフォルトの名無しさん
08/02/25 00:14:03
詳しいことわすれたけど、s[i]で文字を取得できるならできるんじゃね?
やった後、stringオブジェクトは壊れるとおもうけど
628:デフォルトの名無しさん
08/02/25 00:15:06
この日本語不自由そうなとこが同一人物くさい
629:デフォルトの名無しさん
08/02/25 00:15:58
>>623
規格ではそんな保障はされていません。
630:デフォルトの名無しさん
08/02/25 00:17:13
>>627
あっ嘘、s[i]で取得できてもできないと思う
置き換えたいなら、replaceを使いなさい
631:デフォルトの名無しさん
08/02/25 00:17:23
>626
std::stringのことなら、正しくない。
632:デフォルトの名無しさん
08/02/25 00:21:59
これが動くのですが、stringはchar*の拡張であることは保証されていませんか?だめな例はありますか
int main(){
string str="9999999999";
char *pointer=&str[5];
memcpy( pointer, "000", 3);
str+=(string)"add";
cout<<str;
return 0;}
633:デフォルトの名無しさん
08/02/25 00:25:35
stringの制御情報はどこへ格納されていますか?
ユーザーは合法的でない方法を使ってもアクセスできませんか?
634:デフォルトの名無しさん
08/02/25 00:28:12
>632
必要のないポインタ操作はやめましょう。
動くか動かないかがプログラムの正しさの判定基準ではありません。
635:デフォルトの名無しさん
08/02/25 00:28:47
>>632
あるコンパイラのあるバージョンで動くとしても、規格で保証されていなければ、
他のコンパイラや同じコンパイラの別バージョンでは動かないかもしれない。
それでもいいなら、どうぞ?
今後ずっと同じコンパイラを使い続けて、決して変えないのなら、たぶん問題ないだろう
636:デフォルトの名無しさん
08/02/25 00:30:23
>>633
なんのためのクラスだと思う?
637:デフォルトの名無しさん
08/02/25 01:00:06
例外の使い方について
エラーの通知にはエラーメッセージより例外を使う方がいいと聞いたのですが
オリジナルな例外クラスを投げたり、charを投げまくる仕様にしていいのですか?
例外というと、これ以上の実行に支障が出るときに使うようなイメージがあるのですが実際の現場ではどうなのでしょうか?
638:デフォルトの名無しさん
08/02/25 01:01:51
例外処理を主要処理に書くと遅くなったりしませんか?
639:デフォルトの名無しさん
08/02/25 01:14:59
コンパイラによって例外処理用のコードが追加されるから
パフォーマンスは落ちる。禁止オプションもあるくらいだからな。
特に組み込みでは。。。。。。
640:デフォルトの名無しさん
08/02/25 01:17:11
クラスメンバー変数は、自動で0やNULLで初期化されますか?
641:デフォルトの名無しさん
08/02/25 01:20:04
>>637
好きなように使え。
ただ、エラーメッセージと例外では通知する相手が違うぞ。
エラーメッセージはエンドユーザ、例外はプログラマに通知するもんだ。
ユーザがいきなり「0x00d2345でlogic_error例外が発生しました」とか見せられても訳わからんだろ。
charも投げられるが、標準との整合を考えて投げるのはオリジナルも含めてstd::exception派生のクラスにしとけ。
642:デフォルトの名無しさん
08/02/25 01:21:41
>>640
static領域に配置したオブジェクトのメンバなら、コンストラクタで何もしていなければ0になります。
それ以外は不定です。
643:デフォルトの名無しさん
08/02/25 01:29:37
static つけたらクラスが消滅しても値が残るんですか?
クラスが消滅したらアクセスできなくなると思いますが
つけなくても自動でstaticになりますか
644:デフォルトの名無しさん
08/02/25 01:50:30
>>641
なるほど・・・
戻り値でエラーを知らせたり、NULLを返したりという方法もあるのでどういう方法が主流なのかなと思ってまして
自分はたいていの場合
何が起こったのか確認して、何事もなかったかのように受け流してさいごにエラーログを確認する
位のデバッグライト的な使いか確かしてないのですが・・・
645:デフォルトの名無しさん
08/02/25 01:59:21
>>644
どれが主流というのは無い。場面によって適切な方法があるだけ。
ライブラリとか、設計思想によりエラーの返し方がある程度統一されてたりすることもあるけどね。
とにかく作ってみなさい。できたものを自分なりに分析して、ここはこうした方がよかったとか、省みることで成長するんだから。
646:デフォルトの名無しさん
08/02/25 02:09:23
>>643
残ります、というかクラスを複数生成しても全部同じstaticメンバ変数をさすんですよ?
三行目がいまいちなに言ってるのかわからんstaticつけないとstaticにはならないよ
647:デフォルトの名無しさん
08/02/25 02:12:48
まずインスタンスという言葉を覚えようや
648:デフォルトの名無しさん
08/02/25 02:13:09
>>643
>static つけたらクラスが消滅しても値が残るんですか?
(クラスではなくインスタンスのことを言いたいのだと思うが…)
staticで宣言した変数は、main関数の開始前から終了後まで存在する。
破棄されるのがmain関数終了後だから通常はそれへのアクセスが問題になることはないが、
staticの変数が異なるファイルで定義されて、一方のデストラクタからもう一方を参照するような
処理があるとまずい。
意味が分からないようなら気にしなくていい。
>つけなくても自動でstaticになりますか
ならない。
649:648
08/02/25 02:14:21
ちょっと訂正
×staticの変数が
○2つのstaticの変数が
650:デフォルトの名無しさん
08/02/25 02:24:32
質問があるのですが、
include " "
include < >
" ", < > の違いを教えて頂けませんか?
651:デフォルトの名無しさん
08/02/25 02:30:32
>>650
コンパイラのマニュアルか入門書を読みなさい。
652:デフォルトの名無しさん
08/02/25 02:47:52
>>650
URLリンク(www.google.co.jp)
上から順に読んでいけばそのうち解説してるサイトにたどり着く
653:デフォルトの名無しさん
08/02/25 07:25:36
>>632
std::string の内部バッファの連続性は次の規格で保証されるようになる。
おそらく現状全ての実装でそうなっていることが、その規格変更を実現したんだろう。
だから一応そう言うことをしても問題は無いはずだが、
メンバ関数でできることはメンバ関数でやった方がいい。
replace 使うといい。
654:デフォルトの名無しさん
08/02/25 09:45:12
例外ねぇ、何も考えずにint型のエラーコードを投げちゃうなぁ
返り値でエラーコード返しちゃうと返り値の型が拘束されちゃうしメンドクサ
結局こういう使い方だと例外のありがたみを半分も得ていない気がする
655:デフォルトの名無しさん
08/02/25 10:00:21
例外はstd::exceptionみたいな基本クラスを決めとかないと
ありがたみが半減する。
656:デフォルトの名無しさん
08/02/25 11:44:36
ガベージコレクションは、標準のC++でつくれますか?ライブラリでは動作するのか不安です
自作したいです
あと、整数変数は、初期化なしでアクセスしてもエラーは出ませんか?
657:デフォルトの名無しさん
08/02/25 11:46:47
素人が自作した方が不安だと思うんだが
658:デフォルトの名無しさん
08/02/25 12:00:29
これ動かすとクラス変数は値がほぼ一定ですが理由はなぜですか?
#include <iostream>
using namespace std;
class cl{public: int i; cl(){cout<<"class "<<i;} };
int main(){
int n, a[100];
for(n=0; n<100; n++){
cl *x=new cl;
cout<<" arrey "<<a[n]<<"\n";
}
getchar();
}
659:デフォルトの名無しさん
08/02/25 12:09:11
動的確保による違いでした たぶんヒープ領域は値があまり変化しないことが原因かも・・・
#include <iostream>
using namespace std;
class cl{public: int i; };
int main(){
int n, a[100] ;
cl x[100];
for(n=0; n<10; n++){
cout<<"class="<<x[n].i<<" arrey="<<a[n]<<endl;
}
getchar();
}
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4987日前に更新/243 KB
担当:undef