【初心者歓迎】C/C++室 Ver.16【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1111231578/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2005/04/10(日) 22:35:37
>前スレ992

Windowsなら
SendMessage(処理させたいWindowのハンドル, WM_KEYDOWN, VK_RETURN, 0);
3デフォルトの名無しさん:2005/04/11(月) 01:07:26
>1乙
4デフォルトの名無しさん:2005/04/11(月) 01:20:58
新スレ乙です!質問があるのですが、
STLのmapの内部では、キーの値をもとにツリー構造を構成しているとのことですが
そうするとmapに要素を挿入するときに、0からインクリメントした値のキーを使った場合は、
検索のオーダーは最悪になってしまうのでしょうか・・?
5デフォルトの名無しさん:2005/04/11(月) 01:26:45
>>4
実装によるけど、まぁ大抵は心配無用じゃないかな。
6デフォルトの名無しさん:2005/04/11(月) 01:29:40
>>4
普通はツリーといってもバランスドツリーが使われてるから、そんなにひどくならない。
↓で遊んでみるといい。
ttp://www.ececs.uc.edu/~franco/C321/html/RedBlack/redblack.html
7デフォルトの名無しさん:2005/04/11(月) 01:46:09
>>5-6
お返事ありがとうございます。
それほど酷くないとのことで安心しました。
>>6氏のページは今からJavaをインスコして遊んでみますヽ(´∇`)ノ
8デフォルトの名無しさん:2005/04/11(月) 03:26:03
>>6
面白いな。0から順に昇べきでノードを追加していくと、左右の木の深さが
4段階以上になると、ずるっと回転操作が行われるのな。

回転操作のプログラムを組んでみた事はあるが、実際にこうして視覚的に
見れるとよく理解できるもんだ。
9デフォルトの名無しさん:2005/04/11(月) 03:33:19
c言語初心者です。
コマンドの結果を変数に入れたいのですが、わかりません。
例えば system("echo hello"); の結果を変数に入れる事を考えた場合
どのような方法がありますか。
10デフォルトの名無しさん:2005/04/11(月) 05:01:13
>>9
質問するときの「自分は初心者です。」って言うのは嫌われるぞ?
11デフォルトの名無しさん:2005/04/11(月) 08:23:51
>>9
system()を使うならファイル経由。
直接得たいならFILE * fp = popen("echo hello", "r");して後はファイルと同じ要領で入力。
12デフォルトの名無しさん:2005/04/11(月) 12:04:14
>>10
確かにそうですね。気をつけます。

>>11
回答ありがとうございました。
popen関数を使えばいいのですね大変参考になりました。
13デフォルトの名無しさん:2005/04/11(月) 12:07:33
初心者歓迎スレなのに・・・
14デフォルトの名無しさん:2005/04/11(月) 12:09:09
>>13
その初心者歓迎スレで「自分は初心者です」ってバカみたいじゃない。
15デフォルトの名無しさん:2005/04/11(月) 22:17:58
ぬるぽ
16デフォルトの名無しさん:2005/04/12(火) 13:22:33
ある型Tのポインタと値nを渡し、そのポインタからnバイト先を指したポインタをT型で返す。
という関数かマクロは標準にはあるのでしょうか?
boostにあるのならそれでもかまいません。
自分で作っちゃってもいいんですが、既にあるのならそれを使いたいなと。
17デフォルトの名無しさん:2005/04/12(火) 14:00:17
>>16
渡したポインタ(仮にp)からn要素先ではなく、nバイト先なのかな?
ってことは、p+nではなくて((char*)p)+nか。
型を戻さないといけないから、(T*)((char*)p+n)だね。
C++ならreinterpret_cast<T*>(reinterpret_cast<char*>(p)+n)か。
1816:2005/04/12(火) 14:14:09
>>17
そうです。でもreinterpret_castを長々と書くことになり見づらくなるので
それをやってくれるものがないかと。
19デフォルトの名無しさん:2005/04/12(火) 15:27:09
template<class T> T* foo(T* p, int n) {return reinterpret_cast<T*>(reinterpret_cast<char*>(p)+n);}
2016:2005/04/12(火) 15:34:40
やっぱり自分で作るしかないですか。
21デフォルトの名無しさん:2005/04/12(火) 16:05:08
>>17>>19は質問をまったく理解していないな。
22デフォルトの名無しさん:2005/04/12(火) 16:10:51
>>21
てめえは何が言いたいんだ?標準でそんなマクロがあるとでも?
23デフォルトの名無しさん:2005/04/12(火) 16:25:24
まぁ「あるかないか」って聞いてるんだから、YES or NO で答えるべきだよな。
24デフォルトの名無しさん:2005/04/12(火) 16:43:01
標準でないから>>17, >>19 のように親切で答えてるんだろうに…
そんなことすら理解できないのか?
25デフォルトの名無しさん:2005/04/12(火) 16:52:18
やり方わからないわけじゃなさそうだし、余計なお世話って気がしないでもない。
26デフォルトの名無しさん:2005/04/12(火) 16:58:23
少なくとも>17、>19は>21-26と違って参考になるだけまし。
27デフォルトの名無しさん:2005/04/12(火) 17:00:20
あるかどうか訊いてるのに、こうやるんだよと言われて参考になるか?
28デフォルトの名無しさん:2005/04/12(火) 17:04:56
だから少なくとも下らん議論よりはましだって。
29デフォルトの名無しさん:2005/04/12(火) 17:14:59
>>17=>>19が自分の恥ずかしい反応を持ち上げる姿に
世界の民が号泣。
30デフォルトの名無しさん:2005/04/12(火) 18:38:07
妙なところで突っかかる人いるのな
31デフォルトの名無しさん:2005/04/12(火) 23:24:58
妙なところで悪あがきする人がいる以上は仕方ないな
32デフォルトの名無しさん:2005/04/13(水) 12:49:21
デリゲートと関数ポインタって使い方は同じものですか?
デリゲートって便利ですか?
33デフォルトの名無しさん:2005/04/13(水) 13:12:45
>>32
似てはいる、C++でのメンバ関数ポインタとthisポインタのペアの型のコンテナだ
一長一短。
34デフォルトの名無しさん:2005/04/13(水) 13:34:08
>>16
なんでそんな謎の操作が必要なのか非常に気になる
35デフォルトの名無しさん:2005/04/13(水) 14:42:26
>>34
struct HOGE {
int size; // この構造体とその後に続くデータの合計サイズ
  :
};

こんなのが連なったデータ列を操作しなきゃならんのです。
36デフォルトの名無しさん:2005/04/13(水) 14:53:09
>>33
ありがとうございます。
なんとなく理解できました。
37デフォルトの名無しさん:2005/04/13(水) 16:30:40
大学の研究室でC++を使って計算物理みたいな事をすることになりました。
今いる研究室ではC++ですが、来年から違う研究室に移る予定です。
その研究室ではCを使ってるみたいです。

現在私はCもC++もその他のプログラムも未経験です。
Cから勉強すべきかC++から勉強すべきか迷ってます。
どっちから始めたほうがとっつきやすいでしょうか?
そしてお勧めの参考書などはあるでしょうか?
38デフォルトの名無しさん:2005/04/13(水) 16:38:56
Cで余計なクセつけるとC++をちゃんと使えるようになるのが遅くなる。
39デフォルトの名無しさん:2005/04/13(水) 16:51:13
C++からCへの移行の方が無難ってことですか?
40デフォルトの名無しさん:2005/04/13(水) 17:07:31
学校の授業でCをやらなきゃいけなくなり、とりあえずPCにコンパイラを用意しろと言われたのですが
一杯ありすぎてよく分かりません。どなたかこれを入れたらいいよっていうの無いでしょうか。
41デフォルトの名無しさん:2005/04/13(水) 17:13:34
>>40
Debian Linux + gcc + Emacsを入れとけ。
42デフォルトの名無しさん:2005/04/13(水) 17:20:35
Debian薦めるのはSargeがリリースされてからにしとくれ。
43デフォルトの名無しさん:2005/04/13(水) 17:21:04
gccだけじゃだめなのかw
44デフォルトの名無しさん:2005/04/13(水) 17:22:35
>>42
別になんだっていいよ、kernel2.4以上を採用しているLinuxなら。
Fedora coreでもいいし。
45デフォルトの名無しさん:2005/04/13(水) 17:26:14
Borlandのフリーコンパイラでいいんじゃない?タダだし。
46デフォルトの名無しさん:2005/04/13(水) 17:27:54
Windowsはプログラミングするには不向き。
4737:2005/04/13(水) 17:42:16
私はBorlandのフリーコンパイラにしました。
結局、先にC++学んでおいて、
研究室変わる頃にCの勉強始めればおkですか?
48デフォルトの名無しさん:2005/04/13(水) 17:43:52
>>47
研究室変わる頃に、その研究室でもC++に移行しているかも知らん。
49デフォルトの名無しさん:2005/04/13(水) 17:52:56
>>47
あのさ、君、プログラミングする研究室は辞めた方がいいわ。
どうもスキルも無さそうだし、興味も無さそうだし、どうかんがえてもうまくやっていけないな。
50デフォルトの名無しさん:2005/04/13(水) 17:56:20
プログラミングに興味があるならすでにC/C++ぐらい知っていてもおかしくない。
5137:2005/04/13(水) 18:16:12
まぁ確かに2年の頃にC++勉強して挫折してるんですけどね。
その後やりたい研究分野を扱っている研究室でCが必須である事を知り
そのため計算物理のためにCかC++を勉強しないといけなくなった。
そういうことで今度は挫折は許されないわけです。
まぁここで叩かれようと頑張りますとも。
アドバイスくれた方ありがとうございました。
52デフォルトの名無しさん:2005/04/13(水) 18:41:51
mathematicaとかは知ってるの?
53デフォルトの名無しさん:2005/04/13(水) 19:01:00
>>51
今学生なんだっけ?
http://www.amazon.co.jp/exec/obidos/ASIN/B0002ERS18/250-6079416-1867423
↑コレ買っておけば?3800円で統合開発環境手に入るわけだし。学生の特権だと思うけど。
54デフォルトの名無しさん:2005/04/13(水) 19:16:27
安すぎ
55デフォルトの名無しさん:2005/04/13(水) 19:18:49
一般の方が高すぎのような気もするが
56デフォルトの名無しさん:2005/04/13(水) 19:22:22
確かに一般用のは高い気がする。学生時代にこんなもんがあったら喜んで買ったのにな。
57デフォルトの名無しさん:2005/04/13(水) 19:39:53
息子/娘にでも買ってもらえ。
58デフォルトの名無しさん:2005/04/13(水) 20:34:10
#ifndef とかのプリプロセッサって字下げしないのが普通なんですか?
59デフォルトの名無しさん:2005/04/13(水) 20:39:05
普通の人はc-modeを使うから字下げはしない。
VCユーザもしない。(VCユーザは普通の人ではなく、厨房なので当てにはならないが。)
60デフォルトの名無しさん:2005/04/13(水) 20:43:12
勉強用にIDEはイラネ

とりあえずcygwinでもつっこんどけば?
61デフォルトの名無しさん:2005/04/13(水) 21:00:00
こういうところで聞いてくるようなアホにCUIベースのツールを薦めるとセットアップから質問しまくってウザいだけなので素直にVC++買わせとけ。
懐が痛むのは質問者であってこっちじゃねーし。
62デフォルトの名無しさん:2005/04/13(水) 21:12:28
まぁVC++買ったら買ったで
「コンソールで色出したいんですが・・」
とかアホな質問がくるけどな
63デフォルトの名無しさん:2005/04/13(水) 23:57:57
const char* hoge()
{
    const char* p = "Hoge";
    return p;
}
hoge()から帰ってくるポインタを使って
文字を表示したりするのは違法ですか?
64デフォルトの名無しさん:2005/04/14(木) 00:07:54
>>63
合法だけど
 return "Hoge";
でいいやん。
65デフォルトの名無しさん:2005/04/14(木) 00:08:41
>>63
合法
66デフォルトの名無しさん:2005/04/14(木) 00:11:47
>>63
どうせなら
inline const char * hoge() {return "Hoge";}
で。
67デフォルトの名無しさん:2005/04/14(木) 01:53:17
>>63
それが合法なのは、プログラム領域に確保された
文字列定数"Hoge"へのポインタを返してるからだ。

const char* hoge()
{
  const char p[5] = "Hoge";
  return p;
}

こんな感じの実装は文句なしに違法。
68デフォルトの名無しさん:2005/04/14(木) 01:56:34
偉そうに
69デフォルトの名無しさん:2005/04/14(木) 01:58:21
エロそうに
70デフォルトの名無しさん:2005/04/14(木) 02:06:57
>>67
そこでマジックナンバーを書いている辺りが情けない。
71デフォルトの名無しさん:2005/04/14(木) 02:38:20
>>67
頭悪いか、経験が無いってすぐわかる。
72デフォルトの名無しさん:2005/04/14(木) 08:04:25
初心者ならではの煽り方だなぁ ;-)
73デフォルトの名無しさん:2005/04/14(木) 09:53:01
じゃぁ、もっとあり得る、こんなシチュエーションで。

char buffer[ 1024 ];
...
strcpy( buffer, "Hoge" );
...
char* p = strstr( buffer, "Hoge" );
return p;
74デフォルトの名無しさん:2005/04/14(木) 10:26:06
> char* p = strstr( buffer, "Hoge" );
> return p;

あり得ねえ
あり得るって言う香具師はプログラムするな
75デフォルトの名無しさん:2005/04/14(木) 10:34:26
>>73が何を言いたいのか、誰か教えてくーださい
76デフォルトの名無しさん:2005/04/14(木) 10:40:04
>>75
オチは 67 と同じ。
77デフォルトの名無しさん:2005/04/14(木) 11:51:35
>>37
いまさらだがアドバイス。
言語なんかどうでもいいんだよ。どうせどれも文法がちょっとずつ違うだけだろ。
わかんなくなったらネットにいくらでも資料が転がっている。

必要なのは、プログラムを作るための考え方。それが身についてないと
どんな言語を使ってもろくに動かない糞ソースを生み出すだけ。
78デフォルトの名無しさん:2005/04/14(木) 17:15:59
すいません、realloc関数の第二引数はunsigned int型だと思うんですけど、
それだと最大64KBまでしかメモリを割り当てれない気がするんですが、
それ以上割り当てるにはどうしたら良いのでしょう?
79デフォルトの名無しさん:2005/04/14(木) 17:20:38
>>78
MS-DOS?
80デフォルトの名無しさん:2005/04/14(木) 17:26:16
>>79
はいそうです
諸事情でWinAPIは使えません
コンパイラはBCC5.5です
81デフォルトの名無しさん:2005/04/14(木) 17:28:14
>>80
BCC 5.5ってWin32アプリしか作れないだろ。
DOSアプリとコンソールアプリを勘違いしていないか?
82デフォルトの名無しさん:2005/04/14(木) 17:30:13
すみません勘違いしてるっていうか細かい事は分かりません
OSはWinXPです・・
83デフォルトの名無しさん:2005/04/14(木) 17:37:27
まずその細かいが重要なところを理解してこい
84デフォルトの名無しさん:2005/04/14(木) 17:39:59
そんな事言わずにお願いします・・なるべく早く知りたいのです
85デフォルトの名無しさん:2005/04/14(木) 17:40:17
コマンドプロンプトに出力するアプリケーション=DOSアプリケーションじゃない。
Win32アプリケーションの場合もある。BCC 5.5自体もそうだし。

main()から始まるプログラムでもCreateWindowはできるし、
逆にWinMainからでもRead/WriteConsoleでコマンドプロンプトを使う入出力ができる。

とりあえずprintf("%u", sizeof (size_t));をやってみろ。
reallocの2番目の引数はsize_t。大抵unsigned intのtypedefだが。
86デフォルトの名無しさん:2005/04/14(木) 17:44:13
>>85
ありがとうございます。
4って出ました。
unsigned longなんですね。
87デフォルトの名無しさん:2005/04/14(木) 17:45:31
>>82
unsigned intの最大値を調べてから質問し直してください。
88デフォルトの名無しさん:2005/04/14(木) 17:45:59
printf("%u", sizeof (int));
ってやってみろ。
89デフォルトの名無しさん:2005/04/14(木) 17:47:24
>>86
Win32ではint/unsigned intも32bit化されて4Byteになっている。
90デフォルトの名無しさん:2005/04/14(木) 17:50:09
>>89
そ、そうだったんですか・・・詳しい情報感謝します
91デフォルトの名無しさん:2005/04/14(木) 17:55:26
そしてポインタも32bit化されている。
ただしアプリケーション(1プロセス)が使用できるアドレス空間は2GB。
2GB以上(〜4GBの)メモリを確保するのは難しい。
92デフォルトの名無しさん:2005/04/14(木) 17:55:52
どうもです
93デフォルトの名無しさん:2005/04/14(木) 19:05:07
Windows2000 AdvancedServer / WindowsServer2003 Enterprise以上なら3GBまで使えるよ
94デフォルトの名無しさん:2005/04/14(木) 19:16:50
さらにWin64では32bitアプリも4GBまで使えるようになっているそうだ。
http://www.marbacka.net/asm64/arkiv/64bit_addressing.html
95デフォルトの名無しさん:2005/04/14(木) 19:31:15
#include <stdio.h>

struct stack_type{
    intdata;
    struct stack_type *p;
};

struct stack_type *talloc(void);

int    main(void)
{
    printf("******");
    struct stack_type *stack, *temp;
    stack = talloc();
    stack->p = 0;
    while(1){
        scanf("%d", stack->data);
        temp = stack;
        stack = talloc();
        stack->p = temp;
    }
    return 0;
}

struct stack_type *talloc(void)
{
    return (struct stack_type *)talloc(sizeof(struct stack_type));
}

以上のようなプログラムで、「構文エラー : ';' が 'type' の前に必要です。」
というエラーが出ます。場所はmain関数の中で一番最初に宣言している、
struct stack_type *stack, *temp;です。
9695:2005/04/14(木) 19:32:41
間違いはほかにたくさんあるのですが、
これの意味がわかりません。
ちなみに直前のprintfをはずすとなぜかコンパイルエラーも起こらずに、
実行されてしまいます。
どの部分が影響されてこのようなエラーが出るのでしょうか?
97デフォルトの名無しさん:2005/04/14(木) 19:41:25
とりあえず一番最初のprintf()消せ。
9896:2005/04/14(木) 19:43:47
>>97
最初は書いていなかったんです。
しかし、コンパイラがエラーをはかずに実行まで行ってしまい、
その後のwhileループも実行されずに無事に?終わってしまいました。
そのため、printfを追加したら、上記のようなエラーが帰ってきました。
99デフォルトの名無しさん:2005/04/14(木) 19:48:51
Cでは関数の最初でしか変数宣言できなかった希ガス。
途中に書けるようになったのはC++からだっけ?
100デフォルトの名無しさん:2005/04/14(木) 19:48:54
古いCでは変数宣言はブロックの先頭にある必要がある。
変数宣言より前に普通の文を書いてはいけない。

対策はC99対応コンパイラを使う、もしくはC++としてコンパイルするなど。
10196:2005/04/14(木) 19:50:02
>>99-100
そうだったんですか!
ありがとうございます。
102デフォルトの名無しさん:2005/04/14(木) 20:30:07
char *buf;
buf = (char *)malloc(1024);

こんな風にした場合、bufのサイズ(ポインタのではない)
を求めるスマートな方法を教えて下さい
103デフォルトの名無しさん:2005/04/14(木) 20:36:03
>>102
もっともスマートにして唯一採りうる手法として、malloc関数を呼んだ時点での領域確保のサイズを記録しておく。
つまり、
int a;
char* buf;
a = 1024;
buf = (char*) malloc (a * sizeof (char)); /* <- 必ずsizeof演算子でサイズを計算しておくこと。環境対策。*/
104デフォルトの名無しさん:2005/04/14(木) 20:39:57
>>103
出来ればそれはしたくなかったのですが、それしか無いですか・・・
105デフォルトの名無しさん:2005/04/14(木) 20:46:11
>>104
他にも方法があった。
自分でメモリ周りのライブラリを作る。そしてサイズを返す関数もつくればいい。
106デフォルトの名無しさん:2005/04/14(木) 20:47:07
>>103
sizeof (char) はどんな環境でも1を返すことは知ってるか?
107デフォルトの名無しさん:2005/04/14(木) 20:57:36
>>106
知らなかったらどうするの?
108デフォルトの名無しさん:2005/04/14(木) 20:57:47
>>105
勘弁して下さいorz
ありがとうございました
109デフォルトの名無しさん:2005/04/14(木) 21:21:16
>>107
どうかしたらどうするの?
110デフォルトの名無しさん:2005/04/14(木) 21:27:20
>>109
ガーベジコレクション
111デフォルトの名無しさん:2005/04/14(木) 22:02:17
>>100>>108
WindowsならHeapAlloc()を使えば、HeapSize()でサイズを取得できる。
112デフォルトの名無しさん:2005/04/14(木) 22:07:01
Windowsは非標準だしぃ。
113デフォルトの名無しさん:2005/04/14(木) 22:54:01
>>103
他の環境に移植したこと無いでしょ
114デフォルトの名無しさん:2005/04/14(木) 23:02:25
>>113
俺はもともと組み込み屋なんだけど
115デフォルトの名無しさん:2005/04/14(木) 23:07:22
116デフォルトの名無しさん:2005/04/14(木) 23:10:11
>>115
sizeof(char)が1を返すかどうかを決めているのはコンパイラだ。
それが正しいCコンパイラかどうかは決まっていない。
117デフォルトの名無しさん:2005/04/14(木) 23:14:37
ISOに従っていないC/C++コンパイラはC/C++コンパイラとは言えん。
C/C++コンパイラではないコンパイラのことまで心配する義理などどこにもない。

っていうと少々語弊があるけど。
118デフォルトの名無しさん:2005/04/14(木) 23:15:13
正しいCコンパイラでないものを想定したらどんなコードでも安全ではないと思うが。
アホ?
119デフォルトの名無しさん:2005/04/14(木) 23:20:16
>>118
極端な奴だな。
おおよそC言語っていうのがほとんどなんだよ。
120デフォルトの名無しさん:2005/04/14(木) 23:28:44
A型なんだね。
121デフォルトの名無しさん:2005/04/14(木) 23:30:34
sizeof演算子でサイズを計算しておかないとあんた死ぬわよ
122デフォルトの名無しさん:2005/04/14(木) 23:32:51
>>114
ここは初心者歓迎なんで、あなたみたいな人は大歓迎ですよ。
でも、もともと組み込み屋ってことは今は違う仕事してるんですよね?
もしかして無職ですか?
123デフォルトの名無しさん:2005/04/14(木) 23:36:31
>>122
たぶん、俺は君より社会的地位が上だと思うよ。
124デフォルトの名無しさん:2005/04/14(木) 23:40:28
>>123
後輩に「sizeof(char)ってした方が移植が楽だろ」とかえらそうに言ってるんですか?
125デフォルトの名無しさん:2005/04/14(木) 23:47:56
これ以上話題を伸ばす必要は無いと思うが、
sizeofしておいたほうが統一性があってよい。
126デフォルトの名無しさん:2005/04/14(木) 23:58:21
つーかいまどきmallocなんか使うな。いじょ。
127デフォルトの名無しさん:2005/04/15(金) 00:06:32
つまりCを使うなという事ですね!
128デフォルトの名無しさん:2005/04/15(金) 00:08:05
callocを使えと
129デフォルトの名無しさん:2005/04/15(金) 00:10:41
>>128
なんで?
130デフォルトの名無しさん:2005/04/15(金) 02:32:29
>>106
知らなかった。ソースきぼんぬ。
131デフォルトの名無しさん:2005/04/15(金) 02:38:50
#define char wchar_t

とかされる可能性も考えたら?w
132デフォルトの名無しさん:2005/04/15(金) 02:41:17
>>131
良く考えたらその通りだ。
133デフォルトの名無しさん:2005/04/15(金) 11:20:25
134デフォルトの名無しさん:2005/04/15(金) 11:22:51
135デフォルトの名無しさん:2005/04/15(金) 12:10:55
>>131
その無駄に豊かな想像力を生かして、あなたは
#define sizeof(t) 3
の可能性も考えた方がいいですね。
136デフォルトの名無しさん:2005/04/15(金) 13:20:07
>>133-134
へー。知らなかった。
137デフォルトの名無しさん:2005/04/15(金) 14:18:40
callocと、
malloc+memset
ではどっちが速い?
138デフォルトの名無しさん:2005/04/15(金) 14:36:09
>>137
実装によるべ。calloc()の方が遅いことは余りないと思うけど。
139デフォルトの名無しさん:2005/04/15(金) 16:09:32
>>137
何で自分で計らないのさ?
140デフォルトの名無しさん:2005/04/15(金) 17:00:05
>>135
想定すべきは、そうすればなんらかのメリットがある、という行為であって、
全ての場合を想定するなら、定理証明支援システムでも使えばいい。
メリットがない想定はあまり意味がない。
いい加減消えてくれないか。
C言語自体が矛盾を持っているんだから、君の発言は無意味な事が多いんだよ。
141デフォルトの名無しさん:2005/04/15(金) 18:46:02
#include <stdio.h>
#include <windows.h>

int main(void)
{
HANDLEhHeap;
LPTSTRlpFilename;
SIZE_TdwBytes = 1024;

hHeap = HeapCreate(0, dwBytes + 1, dwBytes + 1);
lpFilename = (LPTSTR)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwBytes + 1);

GetModuleFileName(NULL, lpFilename, dwBytes);

printf("%s", lpFilename);

HeapFree(hHeap, 0, (LPTSTR)lpFilename);

return 0;
}

Heap関数を勉強しようと思って、自分のフルパスを表示するコードを書いたんですが、
(例外処理を除き)このままではヤバイって所はありますか?
ググってもドキュメントが見つからないのでMSDNだけ見てやったんですが・・
142デフォルトの名無しさん:2005/04/15(金) 19:33:07
環境依存のスレいきなよ。
143デフォルトの名無しさん:2005/04/15(金) 19:45:13
>>141
HeapCreate()が返したハンドルはHeapDestroy()すべき。
そもそもGetProcessHeap()を使えばその手間は省ける。

ヒープから外れるけどprintfの%sが受け付けるのはマルチバイト文字列。(const char *とかPCSTR)
UNICODEビルドしたらアウト。tchar.hの_tprintf使え。
144デフォルトの名無しさん:2005/04/15(金) 20:14:35
>>143
ありがとうございます。
助かりました。
145デフォルトの名無しさん:2005/04/15(金) 20:23:28
>>142
おまいはスレタイが読めんのかと小一時間(ry
146デフォルトの名無しさん:2005/04/15(金) 20:27:54
>>145
ボクの目を覚まさせてくれてありがとう!
愛してるよ…
147デフォルトの名無しさん:2005/04/15(金) 20:28:46
続きはこちらでどうぞ

最高に頭悪そうな発言してください in ム板 (IV)
http://pc8.2ch.net/test/read.cgi/tech/1108989422/
148デフォルトの名無しさん:2005/04/15(金) 20:35:49
>>140
#define char wchar_t
に意味があると考える知的障害者なら
ナニをやるか解ったモンじゃないだろに。
つかネタだったんだが。
>君の発言は無意味な事が多いんだよ。
俺が誰だか解るとは、君はもしや…ノイローゼ?
149デフォルトの名無しさん:2005/04/15(金) 20:37:16
>#define char wchar_t

>>140 おまえが消えろよ
150デフォルトの名無しさん:2005/04/15(金) 22:41:23
あのさあ、そんな不毛な話をしてるくらいなら、

void*p = malloc(sizeof(size_t) + size);
*(size_t*)p = size;
return (void*)((size_t*)p +1);

とか質問者に教えた方がまだましだったと思うんだけど。
151デフォルトの名無しさん:2005/04/15(金) 22:42:36
GYAaaaaaaaahhhhhh━━━━━━(゚Д゚;;)━━━━━━!!!!!!
152デフォルトの名無しさん:2005/04/15(金) 22:43:35
すマアんごばっくっった
153デフォルトの名無しさん:2005/04/15(金) 22:59:15
Win32APIでファイルをコピーする奴ください
154デフォルトの名無しさん:2005/04/15(金) 23:47:24
教えることはできるが、あげることはできんな。
155デフォルトの名無しさん:2005/04/16(土) 21:47:30
Windows2000/XPのコンソールでエスケープシーケンスを使うのにはどうしたらいいでしょうか?
進捗状況を表示させたいと思っています("%d%", int)
この後、前に表示した画面を消去したいと思っています。
printf("\x01b[2J");
みたいな使い方ができるのでしたらお教えください。

また、指定した行数・文字数を消す方法があればお教えください。

// コンパイラ:VC++6
// WindowsXP SP2

/*以下のスレから流れてきました*/
http://pc8.2ch.net/test/read.cgi/tech/1112845322/281-294
http://pc8.2ch.net/test/read.cgi/tech/1066747198/75-76
156デフォルトの名無しさん:2005/04/16(土) 22:01:52
WriteConsoleとかその辺のAPI使えばたいていの事はできる
157デフォルトの名無しさん:2005/04/16(土) 22:12:17
>>155
某のコンパイラの場合はWindows98上でコンパイルするとWindows2000でもエスケープシーケンスが効いてたと思う。
Windows2000上でコンパイルすると何やってもダメだった。
158デフォルトの名無しさん:2005/04/16(土) 23:19:34
>>156-157
レス、ありがとうございますた。

>>156
APIって見たときは「初心者の私には難しそう_| ̄|○」
って感じましたが、ググってみたらいろいろと情報が出てきました。

もう少しいろいろと勉強して、がんばってみたいと思います。
ありがとうございました。
159デフォルトの名無しさん:2005/04/17(日) 03:07:02
>>155
RSXNTにVT100/ANSI端末シミュレーションライブラリが同梱されていて
それをリンクすればprintfなどのIO周りをエスケープシーケンス対応
のものに入れ替えることが出来る。VC6とリンクできるライブラリも
入ってたと思う。
160デフォルトの名無しさん:2005/04/17(日) 18:38:59
wifstreamにパスとしてwchar_t*型を渡したいのですが
char*型でないとコンパイラに怒られてしまいます

wchar_tとcharの変換もしくはwifsreamにwchar_t*型を渡す方法を
どなたか伝授してください

161デフォルトの名無しさん:2005/04/17(日) 18:51:34
>>160
cstdlibのstd::wcstombs()
あるいはWinAPIのWideCharToMultiByte()
162160:2005/04/17(日) 19:05:10
>>161
隊長!wcstombsを使ったらリンカのやつ
basic_stringが既に定義されていますとか言いやがります
どうしたらいいですか?
163デフォルトの名無しさん:2005/04/17(日) 19:27:35
>>162
ここで教えて欲しいなら、
エラーメッセージをそのままコピペしろ。
環境もなるべく詳しく書け。
164デフォルトの名無しさん:2005/04/17(日) 20:57:22
すみませんが教えてください。
クラスのconstメンバ関数が例外を投げるときは、
どのように宣言すればいいのでしょうか?

e.g.
int SetDetails(int d)const, throw(const char*) ;・・・??
165デフォルトの名無しさん:2005/04/17(日) 21:03:15
関数名間違いました(セットするのにconstか?・・って突っ込まないで)
int GetDetails(int d)const, throw(const char*) ;・・・です。
166デフォルトの名無しさん:2005/04/17(日) 21:40:32
>>164
例外 hoge を投げるなら
 int GetDetails( int d ) const throw( hoge );
例外を投げないなら
 int GetDetails( int d ) const throw();

別に指定しなくても例外は使える。
というか、指定したら、もしGetDatails内で呼び出した別の関数が
hoge以外の例外を送ってきたら、それを再送出しないですむように
実装しないとあかんぞ。
167デフォルトの名無しさん:2005/04/17(日) 22:01:32
ありがとうございました m(_"_)m

> hoge以外の例外を送ってきたら、それを再送出しないですむように
>実装しないとあかんぞ。

了解です。
168デフォルトの名無しさん:2005/04/17(日) 22:18:20
#include<iostream.h>

intx = 555 ;

int main( void )
{
cout << "x = " << x << '\n' ;

intx = 333 ;// @

cout << "x = " << x << '\n' ;

for( int i = 0 ; i < 3 ; i ++ ) {
int x = i * 100 ;
cout << "x = " << x << '\n' ;
//★cout << "::x = " << ::x << '\n' ; //ここで@を参照するには??
}

cout << "x = " << x << '\n' ;
cout << "::x = " << ::x << '\n' ;


return 0 ;
}

例えばこの時、コメント部分でも書いているのですが、for文の中で、
//@を参照するにはどのように記述すればいいのですか?
169デフォルトの名無しさん:2005/04/17(日) 22:19:55
>>168
ツッコミどころはたくさんあるが、とりあえず質問の答えは、無理。
170デフォルトの名無しさん:2005/04/17(日) 22:21:14
>>168
その変数を参照することを指定する記法はない。
だから、ポインタか参照で介さない限り無理。も
171170:2005/04/17(日) 22:23:24
「ポインタか参照でも介さない限り無理」ね。
172デフォルトの名無しさん:2005/04/17(日) 22:24:35
そうでしたか。
ご教授、ありがとうございます。
173デフォルトの名無しさん:2005/04/17(日) 23:10:13
cout.width(10) は printf の %10d とかに相当すると学びました。
しかし、こうやると、イチイチ cout を使うたびもう一度設定しなければ
なりません。
一回設定したら、ずっと有効になるようにしたいのですが、どのようにすれば
よろしいですか?
174デフォルトの名無しさん:2005/04/17(日) 23:31:19
>>173
幅は出力のたびに指定するしかない。
ただ、普通はwidth()を使わずマニピュレータを使う。

#include <iomanip>

 cout << setw(10) << 10 << endl
  << setw(20) << 20 << endl
  << setw(30) << 30 << endl;

みたいな感じにずらずら続けて出力できる。
175デフォルトの名無しさん:2005/04/17(日) 23:43:42
なるほど。これからはそちらを使うことにします。
どうもです。
176デフォルトの名無しさん:2005/04/18(月) 00:48:15
C++で、あるクラスxがあって

printf("%d", x);

とすると、クラスxのメンバのa(x.a)が表示されるようにするには
どのように記述すればよろしいですか?
177デフォルトの名無しさん:2005/04/18(月) 00:50:27
printf("%d", x.a);
178デフォルトの名無しさん:2005/04/18(月) 02:12:15
>>176
仮にクラスxにoperator int()があったとしても、printf()ではPOD型以外は渡せないので
printf("%d", x);
と言うわけには行かない。
179デフォルトの名無しさん:2005/04/18(月) 20:34:52
operator int() 作って
printf("%d", ( (int)x ) );
でもダメなんでつか?
180デフォルトの名無しさん:2005/04/18(月) 20:38:15
>>179
それなら大丈夫。
だが、printf("%d", static_cast<int>(x));推奨。
つーか、括弧多過ぎ。
181デフォルトの名無しさん:2005/04/18(月) 20:49:37
printfで指定した個数の空白などを表示する方法ってありませんか?
182デフォルトの名無しさん:2005/04/18(月) 21:01:12
ループ
183デフォルトの名無しさん:2005/04/18(月) 21:12:05
>>181
printf("%*s",空白の数," ");
184デフォルトの名無しさん:2005/04/18(月) 21:18:27
>>183って非標準?
185デフォルトの名無しさん:2005/04/18(月) 21:29:41
>>183
おーーありがとうございます!ずっと思い出せなかったのでかなりうれしいです!!
186デフォルトの名無しさん:2005/04/18(月) 21:31:10
>>184
非標準じゃないよ。
187デフォルトの名無しさん:2005/04/19(火) 02:42:03
>>180
thx!
188デフォルトの名無しさん:2005/04/19(火) 09:35:17
初心者すぎますが、C++ってなんて読むんですか
シープラスプラス??激しくアレな人教えてください

はじめからここで聞くべきでしたね ごめんなさい
189デフォルトの名無しさん:2005/04/19(火) 09:38:51
>>188
死ねよマルチ
190デフォルトの名無しさん:2005/04/19(火) 09:42:40
>>189
どこがマルチなんだ?wキチガイか 氏ね房うざすぎ おまえが氏ね
191デフォルトの名無しさん:2005/04/19(火) 09:57:38
もういいや
>>189は消防からやり直して氏ねよ
2chのルールだけ気にしすぎて通常の人間の会話が理解できない房決定
192デフォルトの名無しさん:2005/04/19(火) 12:51:42
>>188
好きな様に読めば?
193デフォルトの名無しさん:2005/04/19(火) 13:08:56
ストリームを途中から
バイナリ<-->アスキー
変換てどうやるんですか
初期化時にはできるんですが途中からしたいのでお願いします
194デフォルトの名無しさん:2005/04/19(火) 13:31:03
>>188
char answer = c++;
std::cout << answer << std::endl;
195デフォルトの名無しさん:2005/04/19(火) 13:32:17
>>183
最後の引数が違うなあ。" " じゃなくて "" だ。
196デフォルトの名無しさん:2005/04/19(火) 15:36:54
Cについて質問です。
ある関数の中で例えば int i; と変数定義した場合、
他の関数の中で i=0; などと代入はできませんよね?

でも、他の関数の中でも int i; i=0; とやるとコンパイルできるみたいですが、
この場合、最初に出てきた int i; と他の関数で出てきた int i; は別物と考えればいいんでしょうか?
197デフォルトの名無しさん:2005/04/19(火) 15:51:44
スコープでぐぐれ
198デフォルトの名無しさん:2005/04/19(火) 16:16:07
ブロックが異なれば同じ変数名でも使えるんですね。
ありがとうございました。
199デフォルトの名無しさん:2005/04/19(火) 16:25:18
ちなみにVC6のコンパイラはfor文のスコープがおかしかったりするから注意な。
200デフォルトの名無しさん:2005/04/19(火) 16:42:21
おかしいか?
201デフォルトの名無しさん:2005/04/19(火) 16:42:48
どう考えても明らかにおかしいだろ
202デフォルトの名無しさん:2005/04/19(火) 16:54:39
おかしいのは(現在の仕様から見た)当時の仕様だね。
寧ろVC7のディフォルトがVC6と同じなのが気にイラン。
203デフォルトの名無しさん:2005/04/19(火) 17:14:33
for( int i = 0 ; i < 10 ; i+++ ){
}
204デフォルトの名無しさん:2005/04/19(火) 17:58:36
>>203
>i+++

スコープ以前に(ry
205デフォルトの名無しさん:2005/04/19(火) 18:05:53
確かにデフォルトでは規格通りにして欲しかったな
206デフォルトの名無しさん:2005/04/19(火) 18:09:17
テンプレートクラスはnewで動的に作成するのは無理ですか?

無理だとしたら何故でしょうか?
207デフォルトの名無しさん:2005/04/19(火) 18:27:12
>>206
インスタンスの作成は、テンプレートの特殊化版であっても
通常のクラスと同様に動的生成可能

特殊化版の具現化は、newを使おうが何をしようが
動的には無理。全てコンパイル時に解決されなくてはならない。
208デフォルトの名無しさん:2005/04/19(火) 18:27:26
意味が分からん
std::vector<int>* p = new std::vector<int>;
209206:2005/04/19(火) 18:57:35
>>207
>>208
すいません、根本的に間違ってました。

クラスの宣言部と実装部をファイル分けしていたのが原因でした。

ごめんなさい。

210デフォルトの名無しさん:2005/04/19(火) 19:28:02
>>188
スィープラスプラス。一部でシープラプラ。
211デフォルトの名無しさん:2005/04/19(火) 20:00:33
シータスタス
212デフォルトの名無しさん:2005/04/19(火) 20:27:06
>>188
折りよく「C++の設計と進化」を読んでたんだが、「シープラスプラス」って書いてあった。
213デフォルトの名無しさん:2005/04/19(火) 21:38:26
VC6インスコしたときのビデオ見れば何て言うのかわかるやん
214デフォルトの名無しさん:2005/04/19(火) 21:39:25
ってここはVCスレじゃなかったな。
215デフォルトの名無しさん:2005/04/19(火) 22:33:43
ビデオなんかあったか?
216デフォルトの名無しさん:2005/04/20(水) 06:50:06
なんで
char str1[80]="こんにちわ";
char str2[80]="8等身です";
とやって、strcpy(str1,str2)に突っ込むと大丈夫なの?

配列を表す名前、str1はstr1の始まるアドレスをさすが、
ポインタではない
という説明をいたるところで見るんだけどstrcpyはchar型配列への
ポインタを引数にとると書いてあるから、配列名じゃだめだろうと
思ってたんだ。
試しに
char *pst1,*pst2;
pst1=str1;
pst2=str2;
とやってstrcpy(pst1,pst2)
とやってみたらstrcpy(str1,str2)と同じ動作をした。
つまり配列の名前はその配列へのポインタとおなじ振る舞いをすると
俺の中で間違った認識が生まれようとしている
おまいらつД`) タスケテクレ !!

217デフォルトの名無しさん:2005/04/20(水) 06:54:12

#include <stdio.h>
#include <string.h>

void main(void)
{

char *str1="こんにちわ";
char *str2="8等身です";

strcpy(str1,str2);
printf("%s",str1);
}
216のが動いて、
これが動かない原因が超絶にわからないのですが…
218デフォルトの名無しさん:2005/04/20(水) 08:10:21
ポインタも理解できないんだったら素直にJavaでもやっとけよ
219デフォルトの名無しさん:2005/04/20(水) 08:50:01
だれか193に答えて…
220デフォルトの名無しさん:2005/04/20(水) 08:53:31
>>216
配列の名前から値を取り出すと先頭要素ポインタになる
あと、>>217は文字列リテラルに上書きできないという別の問題だね
正確なこと忘れちゃったから微妙に間違っている可能性大w
221デフォルトの名無しさん:2005/04/20(水) 09:09:28
>>216-217
> char str1[80]="こんにちわ";
> char str2[80]="8等身です";

char型の変数80個分の配列を確保し、その個々の変数に文字列「こんにちわ」の各文字を格納する。
char型の変数80個分の配列を確保し、その個々の変数に文字列「8等身です」の各文字を格納する。

>char *str1="こんにちわ";
>char *str2="8等身です";

char型の変数を指すためのポインタ変数を確保し、どこかに確保されている文字列リテラル「こんにちわ」の先頭ポインタ値を入れる。
char型の変数を指すためのポインタ変数を確保し、どこかに確保されている文字列リテラル「8等身です」の先頭ポインタ値を入れる。




これらの処理の、どこに共通性があるんだ?
222デフォルトの名無しさん:2005/04/20(水) 09:36:58
>>193 freopen
223デフォルトの名無しさん:2005/04/20(水) 10:04:23
>>216
>つまり配列の名前はその配列へのポインタとおなじ振る舞いをすると
>俺の中で間違った認識が生まれようとしている

正しくは
「式の中に現れた配列名はその配列の先頭要素へのポインタとして評価される」
ただし例外もあるのでややこしい。
詳しくはCFAQでも読め。
224デフォルトの名無しさん:2005/04/20(水) 10:13:34
218,220,221,223
回答どうもです
回答とCFAQを読んで
配列名は先頭要素のポインタへと成り下がるから
strcpy(配列名,配列名)
が動くことはわかりました。

しかし221さんの仰せられることは理解できますが
char *str1="こんにちわ";
char *str2="8等身です";
strcpy(str1,str2);
としたとき、
str1,str2ははそれぞれ"こんにちは","8等身です"
の先頭を指すポインタとなるから、やはり
strcpy(str1,str2);
は動かないとおかしいと思うのです。

配列名のstr1も後者の文字列リテラルへのポインタとして宣言したstr1
もどちらもポインタで、strcpy()にとられる引数として
文句ないように見えるのですが…

225デフォルトの名無しさん:2005/04/20(水) 10:23:36
char str1[80]="こんにちわ";
の場合は、”こんにちわ”の文字の後ろに70char分空きがあるだけ
226デフォルトの名無しさん:2005/04/20(水) 10:30:44
>>224
文字列リテラルはCではchar*, C++ではconst char*
strcpyが通らないのはC++でコンパイルしてるんじゃ?
Cなら通るはずだぞ。
227デフォルトの名無しさん:2005/04/20(水) 10:36:46
>>226の言ってることに正しいことがただの一つもない件について
228デフォルトの名無しさん:2005/04/20(水) 10:40:56
>226
c++でコンパイルしていますが、イマイチよくわかりません
ただ、
char str1[]="こんにちわ";
char *str2="8等身です";

strcpy(str1,str2);
printf("%s\n",str1);
これは通りました

constcharについてすこし調べてみます

引き続き224についてなにか情報がありましたら、よろしくお願いします
229デフォルトの名無しさん:2005/04/20(水) 10:46:53
>>228
正しくは「C++ではconst 文字の配列」
ところがCとの互換のため char* への代入が認められている。
で、char* str = "hoge"; としたとき、strを介して文字列リテラルを
書き換えようとしたときの動作は未定義。
実装によってはstrcpyが通るかもしれん。
230デフォルトの名無しさん:2005/04/20(水) 10:48:17
↑「文字列リテラルはC++では…」ね。
231デフォルトの名無しさん:2005/04/20(水) 10:53:07
>>226
アホ杉w
232デフォルトの名無しさん:2005/04/20(水) 10:53:17
>>224
> しかし221さんの仰せられることは理解できますが

できてないよ。
233デフォルトの名無しさん:2005/04/20(水) 10:54:26
char* str = "hoge"; としたとき、strを介して文字列リテラルを
書き換えようとしたときの動作は未定義。

ということは、書き換えられる方は、素直に配列として宣言しておけ
と言うことなのでしょうかね…

結果としてよくわかりませんでしたが次に進んでみることにします
教えてくださった皆さんありがとございました
234デフォルトの名無しさん:2005/04/20(水) 10:58:14
>232さん
理解できてないでしょうか?

char *str="こんにちわ";
printf("%x\n",str);

char str[]="こんにちわ";
printf("%x\n",str);
も、割り当てられているメモリのアドレスにかなり距離がありますが、
どちらもアドレスが出力されるのですが…
235デフォルトの名無しさん:2005/04/20(水) 11:02:18
>>234
同じ内容の文字列リテラルは記憶領域を共有する可能性があるから、
文字列リテラルを書き換えるとロクなことにならない。

C では、おそらくこれくらいの曖昧な理由しかないが、 C++ では、
const なオブジェクトを書き換えることになり、明確に未定義動作となる。

プログラムの動作を保証したいのであれば、
同じ型のポインタでも、指している先の記憶領域が
リテラルであるかどうかは意識する必要がある。
236デフォルトの名無しさん:2005/04/20(水) 11:02:45
理解できてないことすらも理解できないのか
237デフォルトの名無しさん:2005/04/20(水) 11:09:55
どうやらそのようです
出直してきます
238デフォルトの名無しさん:2005/04/20(水) 11:15:12
どっちが理解できてないのか…
>>234氏はたぶん理解してるでしょ。

ちなみに、

 char *str1="こんにちわ";
 char *str2="8等身です";
 strcpy(str1,str2);
 printf("%s",str1);

BCCはこれを通すな。いいんかw
239デフォルトの名無しさん:2005/04/20(水) 11:17:14
>>238 >235
240193:2005/04/20(水) 11:24:03
>>222
FILEでなくストリーム(fstream)なんです…
ストリームにされてるファイル名を意識しないようにしたいので
開きなおすことはできないんです
あとモードを変更した後もファイルポインタは開きなおす前と
同じ位置をポイントしている必要があるんですが
開きなおしによってバイナリ/アスキー変更した場合だと
ファイルポインタの位置を復元することができません('\n'の関係で)
241234:2005/04/20(水) 11:31:11
>235,238
未定義のことはさせないほうが良いという結論に達しました
int i = 3;
i = i++;
が7になることもあるんですね
ありがとうございます
242デフォルトの名無しさん:2005/04/20(水) 11:43:46
させない方がいいじゃなくてしちゃいけないの
243デフォルトの名無しさん:2005/04/20(水) 11:49:29
>>234
出来てない。

一番の違いは、そのポインタ値が示す先にあるオブジェクト。
配列の中身は書き換える事が可能だが、
文字列リテラルは書き換えが出来ないオブジェクト。
ちなみに、リテラルは「定数」の事。

1 = 2;

が出来ないのと、根本的な理由は一緒。
244デフォルトの名無しさん:2005/04/20(水) 11:58:40
>>234
char a[80]="文字列";
は aに "文字列" がコピーされるの
つまり
char a[80];
strcpy(a,"文字列");
と等価

char* b="文字列";
とはぜんぜん違う。

245デフォルトの名無しさん:2005/04/20(水) 13:14:55
246デフォルトの名無しさん:2005/04/20(水) 14:33:11
おい!鼻から悪魔出てるぞ!!
247デフォルトの名無しさん:2005/04/20(水) 17:24:52
>>228
お前はそんなに領域破壊がしたいのか
248234:2005/04/20(水) 18:01:18
>244
なるほどでも
char a[80];
strcpy(a,"文字列");
char* b="文字列";
としたあとにaもb同様にアドレスをさすじゃないですか

char *a="あああ"
char *b="いいい"
この場合もaもbもアドレスをさしますよね

その結果何故strcpy(a,b)として領域破壊が起こるのか未だに
理解できません、、、

定義されていない動作かとおもいましたが
aもbもポインタそのもののはずです
249デフォルトの名無しさん:2005/04/20(水) 18:02:42
この流れで何で分かんねーの?池沼じゃあるまいし。
ちゃんと嫁よマジで
250234:2005/04/20(水) 18:03:14
それともchar *a="あああ" の用に宣言したときは
自動的に文字列リテラルとなり、書き換え不能となるのでしょうか?
それなら納得がいくのですが…
251234:2005/04/20(水) 18:14:17
どうも人一倍理解が遅いようです
すみません

さらに調べてみると
ポインタで宣言したchar *b="いいい"は静的記憶領域に
記憶されることがわかりました。
たぶんwindowsのメモリ領域のヒープとなんかのことだと思いますが、
つまり書き換え不可能で、書き換えようものならばセグメンテーション
フォールトを起こして落ちてしまうようです。

char a[]="あああ";
の場合は書き換え可能な領域(0x4000番地?)に確保されるため、
書き換え可能なので、strcpyの第一引数としてokで
ファイナルアンサーでしょうか

252デフォルトの名無しさん:2005/04/20(水) 18:22:58
>>251
書き換え可能だが第一引数としてダウト
253デフォルトの名無しさん:2005/04/20(水) 18:23:52
コンパイラがエラー出さないなら全部安全だと思うなよ
254234:2005/04/20(水) 18:24:13
あ、すいませんa[]をさすポインタのaのことです
つまりstrcpy(a[],b)じゃなくてstrcpy(a,b)です。
255デフォルトの名無しさん:2005/04/20(水) 18:24:26
腕たて臥せ10回分ぐらい危険
256234:2005/04/20(水) 18:25:45
>253
未定義のもの、意図しない動作ではあるが論理的に正しいモノは
通ることがわかりました。
今後アプリを作っていく上で意識しながらやっていこうと思っています。
257デフォルトの名無しさん:2005/04/20(水) 18:52:06
char a[] = "あああ";
 ┌─┬─┬─┬─┬─┬─┬─┐
 │  あ  │  あ  │  あ.  │\0│
 └─┴─┴─┴─┴─┴─┴─┘
   ↑
 「確保」 されるのはこの領域

char *b = "いいい";
 ┌─┬─┬─┬─┐             ┌─┬─┬─┬─┬─┬─┬─┐
 │     ========================>※│  い  │  い  │  い.  │\0│
 └─┴─┴─┴─┘      参照    └─┴─┴─┴─┴─┴─┴─┘
   ↑
 「確保」 されるのはこの領域

char *b = "いいい"; の時点で※の領域が確保されるわけではない。
確保されるのは char *b 分の領域のみ。

※の領域はプログラム起動時にメモリ上のどこかに配置される。
どこに配置されるかは処理系依存。


ちなみに変数のアドレスを printf("%p\n", b); で表示するのは間違い。
正しくは & 演算子を使う。

printf("%p, %d\n", &a, sizeof(a));
printf("%p, %d\n", &b, sizeof(b));
258デフォルトの名無しさん:2005/04/20(水) 19:03:02
>>257
ポインタに変換されるんだから&なしでも%pは平気だと思うが。
259デフォルトの名無しさん:2005/04/20(水) 19:12:45
>>258
printf("%p %p\n", b, &b);
260デフォルトの名無しさん:2005/04/20(水) 19:49:16
>>234
あんたがぐだぐだ言ってるからおれまで混乱してきた

謝罪と賠償を求める
261デフォルトの名無しさん:2005/04/20(水) 19:55:14
愛国無罪!!
262デフォルトの名無しさん:2005/04/20(水) 20:47:11
>>259
スマソ
bはchar配列だと思っていた。
263デフォルトの名無しさん:2005/04/20(水) 22:11:16
任意の文字を任意の回数だけ連続させる簡単な方法ってありますか?
perlなら「'-' x 20」って一発で書けちゃうような処理ですけど

char c='-';
string s;
while (cnt--)
s += c;
return s;

仕方なくこんな関数書いたんですけど、
標準ライブラリにこんな処理する関数無かったっけ?
264デフォルトの名無しさん:2005/04/20(水) 22:22:07
std::string s(20, '-');
これだけでいいだろ
265デフォルトの名無しさん:2005/04/20(水) 22:25:38
油断すると忘れるよな、そのコンストラクタ。
266デフォルトの名無しさん:2005/04/20(水) 22:26:45
>>263
std::string hoge( 20, '-' );
または
std::string hoge;
hoge.assign( 20, '-' );
267213:2005/04/20(水) 22:27:14
>>215
VC6かVC4か忘れた。はっきりと「びじゅある しー ぷらすぷらす」と言ってた。
しかもスゲー早口で
268デフォルトの名無しさん:2005/04/20(水) 22:27:41
>>264 266
うげー…、そんなのあったのか、サンクス…
269デフォルトの名無しさん:2005/04/20(水) 22:32:02
char s[20];
memset(s, 20, '-');
270デフォルトの名無しさん:2005/04/20(水) 22:35:37
>>263
size_t len = 20;
char c = '-';
string s;
s.insert(s.begin(), len, c);
return s;
271デフォルトの名無しさん:2005/04/21(木) 00:08:43
C言語によるプログラミング基礎編で
int a[ 4 ];
int *b;

とした時、b=a, b++, b+1, はOKでa=b, a++はエラーとなる。
ここまでは良いんですが、
a + 1 がOKと書いてあり、その理由が分かりません。
配列aに1を加えると言うのもどう言う事なのか…
どなたが教えてください。
272デフォルトの名無しさん:2005/04/21(木) 00:12:19
c が '\r' か '\n' の時に真を返す述語ってctypeあたりにないですか?
273デフォルトの名無しさん:2005/04/21(木) 00:22:39
述語・・・
ctype にあるわけなかろ
274デフォルトの名無しさん:2005/04/21(木) 01:12:43
配列全体のアドレスと配列の先頭要素のアドレスってどう違うんですか?
275デフォルトの名無しさん:2005/04/21(木) 01:20:41
>>274
質問の意味がわからんのだが、
例えば
int a[3]
があった場合、aと&a[0]の違いか?
値は一緒。でも型が違うので動作が違う。
276デフォルトの名無しさん:2005/04/21(木) 01:38:33
int a[3];
printf("%p %p\n", a, a + 1);
printf("%p %p\n", &a, &a + 1);
277デフォルトの名無しさん:2005/04/21(木) 01:38:38
>>275
レスどうも。

>>でも型が違うので動作が違う。

ここのところをもう少し詳しくご教授いただけますか。
278277:2005/04/21(木) 01:42:51
すみません。

>>276見てわかりました。どうもありがとうございました。
279デフォルトの名無しさん:2005/04/21(木) 01:59:14
>>277
275と276は流れが違うけど。
どうせなら、
printf("%d %p %p\n", sizeof(&a[0]),&a[0], &a[0]+1);
printf("%d %p %p\n", sizeof(a),a, a + 1);
printf("%d %p %p\n", sizeof(&a),&a, &a + 1);
を動かしてみな。

280デフォルトの名無しさん:2005/04/21(木) 06:42:41
csvもしくはタブ区切りファイルを読み込む関数もしくはクラスはありませんか?
出来るだけ移植性の高いものがいいですが、gccだけで使えるものでもかまいません。
281デフォルトの名無しさん:2005/04/21(木) 07:17:45
自分で作るのが基本です
282デフォルトの名無しさん:2005/04/21(木) 08:07:55
>>271の説明をどなたかお願いします
283デフォルトの名無しさん:2005/04/21(木) 10:34:04
284デフォルトの名無しさん:2005/04/21(木) 10:41:20
ifstream で開いたファイルのテキストを
char*とstringに入れるにはどうすればいいのですか?
285デフォルトの名無しさん:2005/04/21(木) 10:48:06
ifstream hoge;
string moge;
copy(hoge.begin(), hoge.end(), inserter(moge, moge.end());
286デフォルトの名無しさん:2005/04/21(木) 10:48:56
>>284
ifstream input;
vector<char> v((istreambuf_iterator<char>(input)),istreambuf_iterator<char>());
char* p = &v[0];
string s(v.begin(),v.end());
v.push_back('\0');
287286:2005/04/21(木) 10:51:21
ゴメン
ifstream input;
vector<char> v((istreambuf_iterator<char>(input)),istreambuf_iterator<char>());
v.push_back('\0');
char* p = &v[0];
string s(v.begin(),v.end()-1);
288284:2005/04/21(木) 11:54:03
char*はよくわからないことになったのでstringで統一することにしました。
返答ありがとうございます。
289デフォルトの名無しさん:2005/04/21(木) 13:37:34
public宣言イクナイ!ということでprivate宣言するようにしたのですが、
private変数の数だけpublic関数が増えてしまいます。↓こんな感じ。

class foo {
int a;
int b;
public:
int GetA(); //private変数の数だけpublic関数を用意する
int SetA();
int GetB();
int SetB();
};

これでいいんですか? もしくは、漏れは次にどんな本を読めばいいんでしょうか。
C++の文法自体は一通り覚えました。
290デフォルトの名無しさん:2005/04/21(木) 14:16:38
>C++の文法自体は一通り覚えました。
ならば次は本ではなく実践、足りないと思ったらまた本読む
291デフォルトの名無しさん:2005/04/21(木) 14:30:25
実装丸見えじゃん
292デフォルトの名無しさん:2005/04/21(木) 14:51:09
>>289
設計を見直せ。
クラスの内部だけで必要な情報ならパブリックなセッタゲッタは必要ないはずだ。
293デフォルトの名無しさん:2005/04/21(木) 16:18:16
仮にパブリックなセッタゲッタが必要だとしても、メンバ変数の数だけ作るというのが理解できん・・・
294デフォルトの名無しさん:2005/04/21(木) 16:33:32
try文が認識されないので教えてください。
コードは長いので2回に分けて書きます
void mo12(void){
char str12[5]={0};/*結果を入れてもらう変数*/
int strbl;/*strlenghtの結果を入れる為の変数*/
putchar('\n');
for(;1;){
printf("\t文字を入力してください(zで終了):");
try{
gets(str12);/*値を取得してstr12に格納*/
}catch(...){
printf("エラー");
break;
}
295デフォルトの名無しさん:2005/04/21(木) 16:34:25
>>294の続きです
//str12[0]='z';
strbl=strlen(str12);//文字の最大数を測定
//元の値の表示
if(strbl>5){er=-3;error1(&er);break;}
putchar('\t');
for(i=0;i<strbl;i++){printf("%X ",str12[i]);}
printf("が入力されました\n\t");
for(count=0;count<strbl;count++){
er=mondai12(str12,count);/*文字をHEXコードに変換し、上位ビットと下位ビットを入れ替える関数*/
if(er<0){/*エラー処理*/error1(&er);}else{
//結果の表示
if(count==0){/*最初のみ表示*/printf("上位ビットと下位ビットを入れ替えると");}
printf("%X ",er);
}
}
printf("\n\n");
for(count=0;count<strbl;count++){/*大文字か小文字のzを検索該当する値があれば-5をerに代入*/
if(str12[count]==0x7a||str12[count]==0x5a){
er=-5;}
}
if(er==-5){break;}
}
}
296デフォルトの名無しさん:2005/04/21(木) 16:40:35
>>295
おーい、向こうのスレに書かれていたレスは読んだのか?
297デフォルトの名無しさん:2005/04/21(木) 16:42:42
>>296
すみません、移動します(汗
298デフォルトの名無しさん:2005/04/21(木) 16:42:51
つーか、gets()をtryで囲って何がしたいのだろう。
そんなことするより素直にgets()を捨てればいいのに。
299デフォルトの名無しさん:2005/04/21(木) 16:44:27
char *str;
str = "(0,1,2,3,4,5)";
int ParseStart = strcspn(str,"(");
int ParseEnd = strcspn(str,")");
char *p = strchr(str,'(') + 1;
char *q = new char[ParseEnd-ParseStart-1];
strncpy(q,p,ParseEnd-ParseStart-1);

strの[(]と[)]に挟まれた部分[0,1,2,3,4,5]を抜き出したいのですが、
上記のような記述でもうまくいかないので、やり方があれば教えてください。
300デフォルトの名無しさん:2005/04/21(木) 16:48:34
>>299
char * str = "(0,1,2,3,4,5)":
char * buf = new char[strlen(str)];
sscanf(str, "(%[^)])", buf);
printf("%s\n", buf);
delete[] buf;
// C++ならC++らしく書くべきだとは思うのだけど。
301デフォルトの名無しさん:2005/04/21(木) 16:51:24
>>299
#include <stdio.h>
int main()
{
char *str = "(0,1,2,3,4,5)";
char r[32];

sscanf(str,"(%[^)]s)",r);
printf("%s\n",r);

return 0;
}
302デフォルトの名無しさん:2005/04/21(木) 17:04:00
>>300-301
できました!
どうもありがとうございました。
303デフォルトの名無しさん:2005/04/21(木) 21:24:25
インラインアセンブラを行いたいのですが、
C言語でのインラインアセンブラ用の命令を解説しているHP、
またはweb, VCのMSDNライブラリ用の検索語を教えてもらえませんか?
304デフォルトの名無しさん:2005/04/21(木) 21:29:31
アセンブラは環境によって違うが?
305デフォルトの名無しさん:2005/04/21(木) 21:29:34
"inline assembler"
306デフォルトの名無しさん:2005/04/21(木) 21:31:56
307デフォルトの名無しさん:2005/04/21(木) 21:49:25
みなさんありがとうございます。
>>303の紹介してくださったページを読んできます。
308デフォルトの名無しさん:2005/04/22(金) 00:28:59
new で領域確保が失敗した場合、
xalloc で例外処理をキャッチするみたいな事が本に載っていたのですが、
new.h をインクルードしてやってみても、xalloc の部分でエラーが出ます。
except.h exception.h 、共にありませんでした。
ちょっと、わかりにくいかもしれませんが、どうすればいいんでしょうか?
ご存知の方 Help !!
309デフォルトの名無しさん:2005/04/22(金) 00:34:55
>>308
それは昔のコムパイラかと

今はstd::bad_alloc(だっけ)
310デフォルトの名無しさん:2005/04/22(金) 00:52:46
ありがとうございます。なんとかコンパイルは通ったので、
これから色々テストしてみたいと思います。
311デフォルトの名無しさん:2005/04/22(金) 01:54:17
初心者で関数がわからないので教えてください。
下のプログラムを考えたときに、aaaでprintfで答えが出るのに
main関数では答えは 2 3 とならずに 1 1 に戻ってしまいます。
どうすればmain関数で 2 3 となるんですか?

#include<stdio.h>
void aaa(int a,int b)
{
a=a*2;
b=a*3;
printf("%d %d\n",a,b);
}

int main(void)
{
int a=1;
int b=1;
aaa(a,b);
printf("%d %d",a,b);
return 0;
}
312デフォルトの名無しさん:2005/04/22(金) 01:56:36
1.aaa()を直せ
2.aaa()を呼び出しているところを直せ
以上
313デフォルトの名無しさん:2005/04/22(金) 01:59:24
>>311
Cの関数は値渡し。
aaa()の引数をポインタにすればいい。

以上の話がわからなかったら入門書をよく読め。
314デフォルトの名無しさん:2005/04/22(金) 01:59:34
>312
すみません。どのように直せばいいのでしょうか?
315デフォルトの名無しさん:2005/04/22(金) 02:01:05
>>311
aaa関数の関数定義は引数が値渡しになっているのでmain関数のa,bとaaa関数でのa,bは別のメモリ領域を指していることになるからです。
316デフォルトの名無しさん:2005/04/22(金) 02:03:57
>>311
アセンブリ言語を調べてみなさい。
Cソースをコンパイルすると、どのようなアセンブリソースになるのかということを知りなさい。
関数呼び出しの仕組みだけでなく、Cの理解がより深まることでしょう。
317デフォルトの名無しさん:2005/04/22(金) 02:06:54
311ですけど、全くわからないです。
できれば直していただきたいのですが。
318デフォルトの名無しさん:2005/04/22(金) 02:07:57
アセンブリ言語はともかく、
まともな入門書なら「値渡し」とは何か
しっかり解説してるはずだが。
319デフォルトの名無しさん:2005/04/22(金) 02:08:04
void aaa(int *a,int *b)
{
*a=*a*2;
*b=*a*3;
printf("%d %d\n",*a,*b);
}


aaa(&a,&b);
320デフォルトの名無しさん:2005/04/22(金) 02:10:33
>>317
ま、直してみたところで「2 6」と出力されるわけだが。
#include<stdio.h>

void aaa(int *a, int *b) {
    *a = *a * 2;
    *b = *a * 3;
    printf("%d %d\n", *a, *b);
}

int main(void) {
    int a = 1, b = 1;
    aaa(&a, &b);
    printf("%d %d", a, b);
    return 0;
}
321デフォルトの名無しさん:2005/04/22(金) 02:11:25
>319
ありがとうございます。

>318
入門書持ってません。今度買ってみます。
322デフォルトの名無しさん:2005/04/22(金) 02:12:12
>320
ありがとうございます。
323デフォルトの名無しさん:2005/04/22(金) 05:54:19
クラスの宣言の時に
private:

public:

private:


のようにprivateが2回出てきたりしてるソースがあるのですが、
これって別にc++の文法的とか構文的な意味があるわけではなくて、
ただメンバの役割的に見た目上でグループ分けしたかったりしたいだけですよね?
(また、自分がそうしたいなら別にどこにどんな順序で何回書いてもいいんですよね?)
324デフォルトの名無しさん:2005/04/22(金) 06:21:14
>>321
入門書も持たんと何をやろうってんだ愚か者が・・・
325デフォルトの名無しさん:2005/04/22(金) 06:23:08
>>323
private、protected、publicはそれ以後別の指定が出るまではそのレベルのメンバだって示すだけだし、
一つのクラス宣言中に一回しか書いちゃいけないなんて決まりも無いから何回書こうが勝手

まぁ、あまり何度も出ると見難いけどな
326デフォルトの名無しさん:2005/04/22(金) 06:50:01
>>316
なさいじゃねーよ。何勘違いしてんだよ偉そうに。
たまにいるんだよなーこういう勘違い野郎。
教える教えられるという関係性以前に
他人様と話をしてる事を忘れてんじゃねーよバカが。
327デフォルトの名無しさん:2005/04/22(金) 06:51:26
君が一番忘れてるっていうオチなの?
328デフォルトの名無しさん:2005/04/22(金) 09:51:20
超初心者な質問だと思うのですが、
この!=の使い方はどういうことでしょうか。
if文でもないのに比較演算子が…教えてくださいお願いします。
例として簡単な他の使用例なんかも教えていただけると助かります。

ちなみにこの関数は
・成功すると、要求したデータ (32 ビット値) が返ります。
・失敗すると、0 が返ります。
だそうです。

hoge = (GetWindowLong(hWnd, DWL_DLGPROC) != 0);
329デフォルトの名無しさん:2005/04/22(金) 09:53:54
ここで俺がプギャーという。
330328:2005/04/22(金) 09:57:00
あ、比較演算子って真偽値を返すんですね。
何か今まで無意識に使ってました。
331デフォルトの名無しさん:2005/04/22(金) 10:49:49
VCでBCBの__propertyキーワードみたいな機能はないのですかね?

__property int A = {read = GetA, write = SetA};

みたいな書き方ができると便利なんですが・・・。
332デフォルトの名無しさん:2005/04/22(金) 11:31:48
>>331
自前プリプロセッサ作れ
333デフォルトの名無しさん:2005/04/22(金) 11:48:49
>>331
__declspec( property(ほげほげ))
334デフォルトの名無しさん:2005/04/22(金) 12:43:21
>>331
VC にプロパティあるだろ。
335デフォルトの名無しさん:2005/04/22(金) 14:31:27
コンストラクタをprivate に入れることってあるんですか?
また、そのメリットって何なのでしょうか?
336デフォルトの名無しさん:2005/04/22(金) 14:37:26
>>335
勝手に生成されないようにできる。
例えばSingletonではインスタンスが勝手に作られては困るのでコンストラクタをprivateにし
インスタンス取得用のstaticメンバ関数を用意するとか。
337デフォルトの名無しさん:2005/04/22(金) 15:21:29
Effective C++の46項に
ちょっとした例があるな。
338デフォルトの名無しさん:2005/04/22(金) 16:24:56
滅多に無いと思うがな
339デフォルトの名無しさん:2005/04/22(金) 16:36:11
そうですか。レス遅れて申し訳ないです。
ご教授ありがとうございました。
340デフォルトの名無しさん:2005/04/22(金) 16:39:10
どれに対するレスだよ
341デフォルトの名無しさん:2005/04/22(金) 17:38:17
WinSock2のrawモードを細かく日本語で解説した物ってありますか
342デフォルトの名無しさん:2005/04/23(土) 00:25:26
void swap(int *a, int *b)
{
int t;

t = *a;
*a = *b;
*b = t;
}


void swap(int *a, int *b)
{
int *t;

t = a;
a = b;
b = t;
}

上の関数だと引数の値が入れ替わるのに、
下の関数だと入れ替わらないのはなぜですか?
343デフォルトの名無しさん:2005/04/23(土) 00:26:38
>>342
上はポインタじゃなくて値そのものを代入しているから。
344デフォルトの名無しさん:2005/04/23(土) 00:28:04
>>342
void swap(int **a, int **b)
にして、ポインタを入れ替えれば変わるぞ。
345デフォルトの名無しさん:2005/04/23(土) 00:30:37
夜釣り禁止
346342:2005/04/23(土) 00:37:37
>>344
具体的に関数の中にどうかけば良いか教えてください。
347デフォルトの名無しさん:2005/04/23(土) 00:39:48
最近の奴は考える力がないな。
348デフォルトの名無しさん:2005/04/23(土) 00:43:20
ええ、ついでですから利用できるところまで利用してやろうかと。
349341:2005/04/23(土) 00:44:29
忘れないでー
350342:2005/04/23(土) 00:45:45
ポインタは入れ替えられないってことですか?
351デフォルトの名無しさん:2005/04/23(土) 00:45:47
急速にスレの質が低下してまいりました
352デフォルトの名無しさん:2005/04/23(土) 00:50:02
>>342
とりあえずメモリの状態を図に書いて一つ一つ追っていくとか
そういうとこから始めてみるのがいいと思うんだ
353デフォルトの名無しさん:2005/04/23(土) 00:53:01
VC++で.NETを使わずに正規表現を利用したいのですが、
何か良い方法はないでしょうか
354デフォルトの名無しさん:2005/04/23(土) 01:14:22
355デフォルトの名無しさん:2005/04/23(土) 01:17:01
boostでいいだろPerl互換の正規表現も使えるし
356デフォルトの名無しさん:2005/04/23(土) 01:20:17
⊂二二二( ^ω^)二⊃ブーンスト
357デフォルトの名無しさん:2005/04/23(土) 01:21:15
>>341
ネットワークプログラミング相談室 Port13
http://pc8.2ch.net/test/read.cgi/tech/1109793931/
358デフォルトの名無しさん:2005/04/23(土) 01:25:42
>>353
COMのVBScript.RegExpとか
359デフォルトの名無しさん:2005/04/23(土) 03:11:41
>>346
うわっ、本当にレス返してやがった。
#include <stdio.h>

void swap(int **a, int **b)
{
 int *t;

 t = *a;
 *a = *b;
 *b = t;
}

int main(void)
{
 int i = 123, j = 456, *a = &i, *b = &j;
 printf("交換前 i = %d, j = %d\n", *a, *b);
 swap(&a, &b);
 printf("交換前 i = %d, j = %d\n", *a, *b);
 return 0;
}
360目の前は壁だらけ・・:2005/04/23(土) 06:51:31
ただいまCを勉強中なんですが。
どうしても気持ち悪くて前に進めないので誰か助けてください。
ファイル入出力で
if(NULL == (fp = fopen("ファイル名","r")){
printf("オープンエラー\n");
return EXET_FAILURE;
}
と普通にソースコードが書かれている参考書しか見当たらないのですが
条件式を書く部分にファイルオープンの関数が入っていて
条件式としてだけでなくその関数が動いている??
文法的に理屈を説明できる人がいれば、ずっと気持ちが悪いので助けてください・・
361デフォルトの名無しさん:2005/04/23(土) 08:27:22
>>360
まずfp = fopen("ファイル名","r")の式が実行される。
つまりfopenの戻り値をfpに代入しているわけだな。
= (代入演算子)は代入した値(この場合fopenの戻り値)が演算子の結果となるので、それをNULLと比較している。

その書き方は真似するな。せめてif ((fp = fopen("ファイル名", "r") == NULL) {にしろ。

俺はこうしているが好きにしろ。
FILE *fp = fopen();
if (!fp)
362デフォルトの名無しさん:2005/04/23(土) 08:59:55
>>350
ポインタも入れ替えできるよ
実際それも入れ替わってる
値が入れ替わらないのはあたりまえ
363デフォルトの名無しさん:2005/04/23(土) 10:25:56
名刺を交換しても人が入れ替わらないのと同じだな。
364デフォルトの名無しさん:2005/04/23(土) 10:29:37
違うだろ。仮引数を入れ替えても呼び出し元のポインタには影響しないだけ。
365デフォルトの名無しさん:2005/04/23(土) 11:11:16
遊びで作ってみた以下のコードが期待したとおりの動作をしないのですが
なにが原因なのか教えていただけると助かります。

gccとvcでやってみたのですがどちらも期待どおりの動作をしませんでした
// printf("%s\n", (itostr(10)).str);
itostrの引数を定数にするとvcでは期待した結果が得られました

#include <stdio.h>

typedef struct {
char str[20];
} ITOSTR ;

ITOSTR itostr(int i) {
ITOSTR its;
sprintf(its.str, "%d", i);
return its;
}

int main()
{
int i;
for (i = 0; i < 10; i++)
printf("%s\n", (itostr(i)).str);
return 0;
}
366365:2005/04/23(土) 11:19:34
gcc3.3.3
vc7.1
です、よろしくお願いします
367デフォルトの名無しさん:2005/04/23(土) 11:28:15
>>365
漏れの VC6、VC7.1、VC8β、BCC 5.5.1 では動くよ
368デフォルトの名無しさん:2005/04/23(土) 11:32:39
>>367
拡張子は .c でよろしくお願いします。
369デフォルトの名無しさん:2005/04/23(土) 11:43:53
>>368
通った。
追記。VC4 でも OK。
370デフォルトの名無しさん:2005/04/23(土) 11:53:10
すみません実行できました!
vc7.1でコンパイルする時に/O2オプションをつけていたのが原因でした
gccのほうはMinGWを使ってるのが原因なのから不明です・・・
371デフォルトの名無しさん:2005/04/23(土) 12:16:01
一時オブジェクトはひとつの式が終わったところで破棄されるんじゃなかったっけ?
だとしたらオプションしだいで想定どおり動いたとしても間違ったプログラムということになる。
ま、このスレは環境依存OKだからそれでもいいのかもしれんけど。
372デフォルトの名無しさん:2005/04/23(土) 12:24:25
>>371
一時オブジェクトの寿命は完全式(だったかな?名前忘れた)の終わりまで。
つまりこの場合はprintf()の呼び出しが終わった後に破壊される。
373デフォルトの名無しさん:2005/04/23(土) 12:29:05
>360
a == (b = c)
の形の比較は、>361の言う通り。
(b = c)ではまず代入が処理され、代入後のbが値として返る。
それとaとを比較する事になる。
(b = c)は、bにcを代入し、bの値を返す式、なわけ。

fopenは、ファイルを開き、開いたファイルへのポインタを返す。
書かれたのがどこであろうと、fopenは常にこの両方を行なう。
a == (b = c)で、比較だけでなく代入操作も行なわれるのと理屈は同じ。
ちなみに、a = ++b;とか書くと、aへの代入とbのインクリメントが両方行なわれたりもする。
374デフォルトの名無しさん:2005/04/23(土) 12:34:06
「期待したとおりの動作をしない」が具体的にどうなったのかくらい書けよ
と言いたい。
375デフォルトの名無しさん:2005/04/23(土) 15:19:47
>>360
そんな本捨てろ。
文脈として、
if ((fp = fopen(...)) == NULL) {
...;
}
の方が読み易いだろ?
まぁ私は
fp = fopen(...);
if (fp == NULL) {
...;
}
とするが。
376デフォルトの名無しさん:2005/04/23(土) 15:48:30
>>375
> if ((fp = fopen(...)) == NULL) {
> ...;
> }
> の方が読み易いだろ?

主観的な事だからなんとも言えないww

> まぁ私は
> fp = fopen(...);
> if (fp == NULL) {
> ...;
> }
> とするが。
無駄に冗長。短いほうが良い。
377デフォルトの名無しさん:2005/04/23(土) 15:54:08
>無駄に冗長
冗長
378デフォルトの名無しさん:2005/04/23(土) 15:54:58
頭痛が痛い
379デフォルトの名無しさん:2005/04/23(土) 16:13:17
頭痛が痛いの何がいけないんだよ
380デフォルトの名無しさん:2005/04/23(土) 16:19:06
>>374
vc7.1では空の文字列が表示されて
gcc3.3.3では意味不明文字が表示されました、これであなたから納得できる回答がえられるのかな?
381デフォルトの名無しさん:2005/04/23(土) 16:19:30
(゚∀゚;)
382デフォルトの名無しさん:2005/04/23(土) 16:47:18
確かにC++としてコンパイルすると問題ないけどCとしてコンパイルするとダメだね。
383デフォルトの名無しさん:2005/04/23(土) 18:21:53
>>375
比較するときに定数の方を左に書くと間違って代入してしまうことがなくてよいという説もある。
見易さに対する意見としては同意だし、この場合には==と=を間違っても代入にはならんけど。
確かgccだとifとかwhileの条件の中で代入すると警告でなかったっけ?(オプションかも)
384デフォルトの名無しさん:2005/04/23(土) 18:24:24
出るよ。VC7でも確か出たと思う。
>>360のような書き方って醜いだけで全然意味がないと思う。
385デフォルトの名無しさん:2005/04/23(土) 18:28:33
gcc で以下の警告が出た。
17: warning: format argument is not a pointer (arg 2)

g++ なら出ない。
関数から構造体を返したときの扱いが C と C++ で違うみたいだな。
ちょっと調べてみよう。
386デフォルトの名無しさん:2005/04/23(土) 18:52:06
http://www.kouno.jp/home/c_faq/c17.html#4
定数を比較演算子の右側に置くのは両辺が変数のときに破綻する。

>>376
C++/C99なら>>361のように宣言ついでに初期化すれば冗長ではない。

387デフォルトの名無しさん:2005/04/23(土) 18:55:59
>>386
それじゃ意味が変わっちゃってるな。
「"=="と間違えて"="と入力するのを防ぐために定数を比較演算子の右側に
置く意義は、両辺が変数のときに破綻する。」
388デフォルトの名無しさん:2005/04/23(土) 19:01:05
また始まったよ
389デフォルトの名無しさん:2005/04/23(土) 19:08:31
>>386
頭悪いなお前。単にURI貼ればボロも出なかったのに。
390デフォルトの名無しさん:2005/04/23(土) 19:12:41
両辺が変数ならそもそも定数は存在しないじゃないか・・・
391385:2005/04/23(土) 19:25:28
>>365
調べてきた。

ttp://www-ccs.ucsd.edu/c/express.html ("array lvalue expression")
ttp://www.kuzbass.ru/docs/isocpp/conv.html#conv.array

配列からポインターへの変換が、
Cでは配列型の左辺値のみに起こり、
C++では右辺値でも起こることになってるみたい。

ここで itostr の戻り値は右辺値なので、可変長引数の領域には
Cでは char [20] がまるごとコピーされて格納され、
C++では char* が格納されることになる。

gcc で警告されたのも納得できる。
それぞれのアセンブリ出力も取ってみたが、
この違いを反映したものになった。
392365:2005/04/23(土) 19:39:30
>>391
お疲れ様です。
詳しく調べてくださってありがとうございます
393デフォルトの名無しさん:2005/04/23(土) 20:59:57
>>389

URIIIIIIIIIIIIIIIII
394デフォルトの名無しさん:2005/04/23(土) 22:15:45
Uniform Resource Identifier
Uniform Resource Locator
395デフォルトの名無しさん:2005/04/23(土) 22:25:46
>>393
頭悪いな
396デフォルトの名無しさん:2005/04/23(土) 22:35:24
初心者歓迎スレだからね
397デフォルトの名無しさん:2005/04/23(土) 22:45:20
>>393
バカ杉
398デフォルトの名無しさん:2005/04/24(日) 05:55:29
IN_ADDR構造体に直接値を書き込んで、たとえばffffffにして
inet_ntoa(inaddr)で変換したときに、255.255.255.255って表示させて
みたいんですけど、うまくいきません。

ためしたのは
IN_ADDR inaddr;
u_long sss=(u_long)0xffffff;
strcpy(&inaddr.S_un.S_addr,(char)sss);
です。

よろしくお願いします。
399デフォルトの名無しさん:2005/04/24(日) 05:56:43
エラーはstrcpyの一番目の引数をulong*_W64からcharに変換できません
とでます。
ちゃんとキャストしてるつもりなのですが…
400デフォルトの名無しさん:2005/04/24(日) 07:00:00
>>398-399
なんでそこで strcpy() なの?
401デフォルトの名無しさん:2005/04/24(日) 08:22:33
>>398
memcpy(&inaddr.S_un.S_addr, &sss, sizeof (u_long));
402デフォルトの名無しさん:2005/04/24(日) 08:58:21
ウホッ できました
>400
char型にしてstrcpyで無理矢理入れてしまえるかと浅はかな考えで
思いつきました。
>401
ネットワーク関連では構造体がいろいろでてきて卒倒しそうでしたが
一つ一つ地道に理解してゆく上での手助けとなりました。
ありがとう
403デフォルトの名無しさん:2005/04/24(日) 14:26:10
煽るわけじゃないけど、そのレベルでネットワークはキツイかと
404デフォルトの名無しさん:2005/04/24(日) 16:48:49
誰が何やろうが勝手。たまーにこういう奴いるんだよなー
言わなくていいことをわざわざ口に出さないではいられない奴って。
死ねばいいのに。
405デフォルトの名無しさん:2005/04/24(日) 16:51:05
>>404
おまえもなー
406デフォルトの名無しさん:2005/04/24(日) 16:52:01
確かに>>403>>404も言わなくていい事をわざわざ(ry
407デフォルトの名無しさん:2005/04/24(日) 16:57:17
だが自分のレベルを知ることは必要だ
それも知らず下手に作るとデータ壊れるぞ
408デフォルトの名無しさん:2005/04/24(日) 17:00:58
壊して良いじゃない。
409デフォルトの名無しさん:2005/04/24(日) 17:03:25
403みたいなデリカシーのない奴によって傷つけられてきた被害者として、
発見次第これからも仕返しとして言わなくていいことを言わせてもらおうと思う。
403みたいな糞は、頭に浮かんでしまった言葉が
人を傷つける言葉だと分かっているのに
自分の中にとどめておくことがストレスになるから
口に出さずにはいられなくなってしまうという、
アナル小さい病と潔癖症の合併症。
410デフォルトの名無しさん:2005/04/24(日) 17:05:14
他にここでよく見かけるのは、
「プログラマー向いてないと思う」とか言ってしまう糞バカ。
質問スレなのに。
こういうバカはプログラマーの前に人間に向いてないから死ねばいいと思う。
411デフォルトの名無しさん:2005/04/24(日) 17:17:16
>>407
先を越されるのが怖いから他人の勉強に足止めを食らわせたいって
素直に言えよバカ。
412デフォルトの名無しさん:2005/04/24(日) 17:18:18
急速にスレの質が低下してまいりました
413デフォルトの名無しさん:2005/04/24(日) 17:21:41
>>409
だからぁ、2chでその程度で一々傷つく方がどうかしているって事実に気付けよ。
ここはそう言う乗りの場所。被害者面して荒らして回る方がよっぽど迷惑だぞ。
そうだな、他人を糞呼ばわりしたかどであんたも人間止めてみたらどうだ?
414デフォルトの名無しさん:2005/04/24(日) 17:26:56
2CHなんだからどうとかいうバカは死んで欲しいと思う。
415デフォルトの名無しさん:2005/04/24(日) 17:29:01
「乗り」とか「空気」とかいうアホ理論を信じて疑わず
いつも自分がそれにあわせることに汲々として
それが絶対だと信じて疑わない、おてて繋いで一斉ゴール教育の被害者。
416デフォルトの名無しさん:2005/04/24(日) 17:32:14
2chだから何でもありって思ってる奴まだいたのか。貴重な化石だ。
417デフォルトの名無しさん:2005/04/24(日) 17:36:04
409みたいなのもどうかと
418デフォルトの名無しさん:2005/04/24(日) 17:39:48
なんか必死なのが一匹いるな
419デフォルトの名無しさん:2005/04/24(日) 17:41:27
必死とか言い出したな。
420デフォルトの名無しさん:2005/04/24(日) 17:45:11
「必死だな」「空気読め」
バカの常套句。
421デフォルトの名無しさん:2005/04/24(日) 17:47:55
もまえらおちけつ
422デフォルトの名無しさん:2005/04/24(日) 17:58:35
今時「おちけつ」ですか……
423 ◆yBEncckFOU :2005/04/24(日) 18:02:34
You is a big fool man. Hahahaha.
はははははははっはははっはは
あっはっはっはっはっはっは
うわっはっはっはっはっはっは
ケケケケケケケケケ
うけけけけけけけけけけk

彼の帰った後、部屋の雰囲気が何か違うことに気づいた。違和感がある。
テーブルだ。いつの間にかテーブルの上に見慣れた花瓶が置いてあった。
チッ チッ チッ ゴォーン 柱時計が午後4時を告げる。
はっ・・・・・・・・・その時 私は気づいた。
彼の話はすべて事実だったのだ・・と。

いや、だからさ、おちけつだとか必死だとか言ってる奴は、騙されたと思って、豆類、ちりめんじゃこなどの小魚、レバー、乳製品、卵黄、カシューナッツ、ごま、そば、たけのこ、ブロッコリー、バナナなどにも多く含まれています。
424423 ◆yBEncckFOU :2005/04/24(日) 18:03:14
ごめんなさい。
425デフォルトの名無しさん:2005/04/24(日) 18:03:30
何一人で暴れてんの?
426デフォルトの名無しさん:2005/04/24(日) 18:07:24
>>403-411
の議論は有益だと思うがなああ
427デフォルトの名無しさん:2005/04/24(日) 18:11:06
どのへんが?
428デフォルトの名無しさん:2005/04/24(日) 18:25:16
   ↓ここいら変
429デフォルトの名無しさん:2005/04/24(日) 18:34:35
m9(^Д^)プギャー
430デフォルトの名無しさん:2005/04/24(日) 18:36:52
本に載っていたx!を求める関数をいじって

int kaijo( int n)
{
int ans;
ans = 1;
for( ; n > 0; n--)
{ ans *= n;}
return ans;
}

と、しても上手く行ったのですが繰り返し部分を

while( n-- > 0)
{ ans *= n}

に変えるとコンパイルはできますが実行するとエラーとなります。
ためしにwhile(n-->1)にするとあり得ない答えが出てきました。
これはfor文ではans*=nの計算を行い、その後n--されるためOK
while文はans*=n--と言う定義されてない?計算のためおかしな動作となる。
と言う解釈であってますか?
431デフォルトの名無しさん:2005/04/24(日) 18:42:28
while文の方は
nが評価された後nを-1してそれから
ans*=nを行っているんじゃないの
432デフォルトの名無しさん:2005/04/24(日) 18:42:32
そういうのは{}の中でn--するもの
433デフォルトの名無しさん:2005/04/24(日) 19:00:28
>>431
while(n-->1)とした時は確かにnに5を入れて計算したら24でした。
(n-->0)の時は最後に0をかけて答えが0になってしまう。
メイン関数の中で分母としてこの値を使ったためにエラーとなったと。
ありがとうございます。

>>432
x^pを求める関数本で
int aaa(int x, int y)
{
int z = 1;
while(y-->0)
{ z *= x}
return z;
}
と言った感じになっていたんで、試しにやってみたいんです。
この場合はyが計算に使われないからうまく行ってたんですね。
434デフォルトの名無しさん:2005/04/24(日) 19:09:23
>>433
知恵をあげよう

do
{
 ans *= n;
} while(--n>0)
435デフォルトの名無しさん:2005/04/24(日) 19:26:20
なるほど。do-while文を使えば問題は解消できるんですね。
今回の場合は0が渡された場合の処置も必要になりますが。
436デフォルトの名無しさん:2005/04/24(日) 19:37:37
だからこそwhileにする意味が無い
437デフォルトの名無しさん:2005/04/24(日) 19:38:37
>>435
do-whileにするだけじゃなくて、--nになってんのも忘れんなよ
438デフォルトの名無しさん:2005/04/24(日) 22:43:01
>>437
プログラマー向いてないと思う
439デフォルトの名無しさん:2005/04/24(日) 23:03:57
経験と知識とセンス
440デフォルトの名無しさん:2005/04/24(日) 23:21:03
QueryPerformanceCounterを使って処理時間の計測をしているんですが、
実行のたびに計測値が大きくばらついてしまいます(100ms〜180ms)。
これはマルチプロセッサが原因なんでしょうか?
それとも他に理由があるのでしょうか?
どなたかご教授ください。ちなみにw2k、Pen4-3GHzです。
441デフォルトの名無しさん:2005/04/24(日) 23:28:10
想定の範囲内です
442デフォルトの名無しさん:2005/04/24(日) 23:28:44
Pen4-3GHzがいくつも搭載されているんだろうか
443デフォルトの名無しさん:2005/04/24(日) 23:38:26
こんにちわ
地方から出稼ぎに来ている44歳の無職です。先日都内のハロワの
トイレに入ってウンコをしようと思ったのですが、
「トイレットペーパー以外の物は流さないで下さい」と張り紙がしてあっ
たのでウンコをビニール袋に入れて持って来ました。
非常に不便さを感じました。皆さんはどのようにしているのでしょうか
参考に聞かせてくれませんか?
444デフォルトの名無しさん:2005/04/25(月) 00:13:01
>非常に不便さを感じました

いや、便があったんだろ?
445デフォルトの名無しさん:2005/04/25(月) 01:10:15
446デフォルトの名無しさん:2005/04/25(月) 06:32:08
出稼ぎに来て無職ですってよ奥さん
447デフォルトの名無しさん:2005/04/25(月) 06:32:40
>>438
そう僻むなよ
448デフォルトの名無しさん:2005/04/25(月) 14:28:18
質問です。
プリプロセッサの話なので微妙にCとは違うかもしれませんが…。

#define str.substring(x) MySubString(x)
という風に . を含む置換マクロは組めないのでしょうか。

'.' : マクロ定義内で指定された文字の使い方が間違っています。
と出てエラーになってしまします。
ご教授よろしくお願いいたします。
449デフォルトの名無しさん:2005/04/25(月) 14:50:05
マクロ名にできるシンボルは変数名と同じです。
"."など変数名に使用できない文字はマクロ名にも使用できません。
450デフォルトの名無しさん:2005/04/25(月) 14:54:31
>>448
エラーのとおり。つーか、一体全体藻前は何がしたいのだ?
451デフォルトの名無しさん:2005/04/25(月) 14:59:00
ありがとうございました。

>>450
JAVAのソースを、プリプロセッサでごにょごにょしてC++のソースに変換したかったのです。
素直にStringクラスつくってソースエミュレーションします。
452デフォルトの名無しさん:2005/04/25(月) 15:05:52
つーか、エディタで置換すればいいだけのような飢餓。
453デフォルトの名無しさん:2005/04/25(月) 15:24:03
もちろんその通りなのですがw
なるべくなら同じソースファイルから、#ifdefの切り替えによってソース互換性を保ちたかったのです。
454デフォルトの名無しさん:2005/04/25(月) 15:33:00
違う言語同士でソース互換はかなり無茶だと思うが。
455デフォルトの名無しさん:2005/04/25(月) 15:38:37
というかバグの温床になりそうだ
456デフォルトの名無しさん:2005/04/25(月) 15:40:48
(((( ;゚Д゚)))ガクガクブルブル
457デフォルトの名無しさん:2005/04/25(月) 18:54:45
N行L列の行列ととL行M列の行列の積Cを求めるプログラムの一部です。

for( i=0; i<N; i++){
  for( j=0; j<M; j++){
    for( k=0; k<L; k++){
      c[i][j] += a[i][k] * b[k][j];
    }
  }
}

参考書では2つ目と3つ目のfor文の間に c[i][j]=0; が入ってますが、
自分で作った時には初期化を忘れて上記のように組みました。
このプログラムでは初期化してないのでc[i][j]の値が不定のはずなのに
何故か正しい値が求められました。何故なんでしょうか?
配列も初期化しないと不定の値になると本に書いてあるのですが…
458デフォルトの名無しさん:2005/04/25(月) 19:00:45
運良く0が入ってたんだろ
459デフォルトの名無しさん:2005/04/25(月) 19:17:43
やはり運よく0が入っていたんですかね。
ありがとうございます。
460デフォルトの名無しさん:2005/04/25(月) 19:45:05
BCC5.5で最新のWin32SDKを使いたいんですけど、
可能ですか?
461デフォルトの名無しさん:2005/04/25(月) 19:47:28
PlatformSDK
462デフォルトの名無しさん:2005/04/25(月) 19:56:38
つかBCC5.5.1の同梱SDKは最低でもWindows2000まではサポート済みだから困ることあるか?
463デフォルトの名無しさん:2005/04/26(火) 03:59:15
ソースファイルAのグローバルで、
CHoge *hoge;
という感じにクラスhogeのポインタを生成し、ファイルAの関数内で
hoge=new CHoge(hwnd,100,100);
と、インスタンスを生成します。

ソースファイルBの先頭で
extern CHoge *hoge;
として、こちらのファイルB内の関数内などでhogeを使いたいのですが、
どうも上手くいってないようです。

ポインタの使い方が間違ってるでしょうか?
間違えてなければ別の部分にに問題があると分かるので、
教えて下さい。お願いします。
464デフォルトの名無しさん:2005/04/26(火) 04:07:46
>>463
毎度毎度同じ事を書かないとならない。
それだけの情報では誰も判断できないよ。
上手くいってないと判断した理由はなに?

あてずっぽうに言えばインスタンスを生成するタイミングと
B内の関数が参照するタイミングが前後してるんじゃないかと
思うけど、分からない。

まともな回答がほしかったらソース晒せ。
465デフォルトの名無しさん:2005/04/26(火) 04:09:32
>>463
それだけの情報ではなんともいえないが、
例えばファイルB内でhogeを参照する段階で生成済みであることが保証されているなら問題ないかと。
グローバル変数だとその辺が厄介だから、避けた方がいいと思うんだけどね。
466デフォルトの名無しさん:2005/04/26(火) 04:18:43
>>464>>465
ファイルBとその中の関数というのは、CHogeを定義(実装)しているものです。
で、ファイルBでhogeを使おうとしていた所を、思いついてthisとしたら
上手くいきました。
どちらにしろそのインスタンス自身のポインタをさしていると思うのですが、
なぜhogeではいけないのでしょうか?
仮にもう一つ別のインスタンスを作ったとして、
クラス定義のなかでhogeと書いていたらおかしくなりそうな感じはしますが、
インスタンスはhoge一つしか作ってません。
467デフォルトの名無しさん:2005/04/26(火) 04:54:07
>>466
グローバルインスタンスの初期化のタイミングの問題。
恐らくは、コンストラクタ内でhogeを参照しているのではないか?
hoge = new CHoge(...)
としているのなら、コンストラクタが呼ばれたときには未だhogeには代入されていないぞ。
468デフォルトの名無しさん:2005/04/26(火) 04:54:41
>>466
をいをい、無茶苦茶なことしてるな。

どこがおかしいかいちいち指摘する元気も出ないわ。
一から勉強しなおせ。
469デフォルトの名無しさん:2005/04/26(火) 04:59:44
じゃあ黙ってろよ
470デフォルトの名無しさん:2005/04/26(火) 05:26:45
オマエモナー
471デフォルトの名無しさん:2005/04/26(火) 13:48:48
(・∀・)
472デフォルトの名無しさん:2005/04/26(火) 20:15:21
Mac OS X、XCode1.5でC++を使ってるのですが、
バイナリの読み書きをリトルエンディアンで行うにはどうすればいいですか?
それとBIG_ENDIAN LITTLE_ENDIANが両方defineしてあるみたいですが、
場合分けはどうすればいいですか?
473デフォルトの名無しさん:2005/04/26(火) 20:19:02
>>472
後者は知らんが前者はマクロ書けばいいだけじゃ?
474デフォルトの名無しさん:2005/04/26(火) 20:38:31
>>473
ifstream.read で読み込んだ時点でエンディアンを変換させることはできませんか?
475デフォルトの名無しさん:2005/04/26(火) 20:40:27
むり。
476デフォルトの名無しさん:2005/04/26(火) 20:46:55
gccでコンパイルしているんですが
printf文に日本語が入っているとエラーとなることがあります。
キルケ・ unknown escape sequence:'\214'
などと表示されます。
日本語を削るとコンパイルできるんですが。
何故でしょうか?
477デフォルトの名無しさん:2005/04/26(火) 20:52:08
日本語が使えない環境で作ってるから。
478デフォルトの名無しさん:2005/04/26(火) 20:57:01
一応日本語を入れても問題なく動く事も多いです。
コンパイルできなくて悩んでると、大抵の場合日本語を削除すると上手くいったり…
日本語が使えない環境だと完全にコンパイルできないんじゃないんですか?
479デフォルトの名無しさん:2005/04/26(火) 21:00:45
SJISでソース書いてて0x5cが含まれているに1.5カノッサ
480デフォルトの名無しさん:2005/04/26(火) 21:01:10
C-x RET f euc-jp-unix
ってやって保存してからコンパイルして味噌
481デフォルトの名無しさん:2005/04/26(火) 21:01:43
だからエラーが出るんだろ?
482デフォルトの名無しさん:2005/04/26(火) 21:02:38
日本語使うことを想定してない環境といえば通じるのか

エラーは日本語の文字コードがエスケープシーケンスと被ってるんじゃね?
483デフォルトの名無しさん:2005/04/26(火) 21:03:45
では、どうすれば同じソースコードで違うコンピュータでも動作しますか?
いろいろ調べてみたんですが、よくわかりませんでしたのでご教授お願いします
484デフォルトの名無しさん:2005/04/26(火) 21:05:49
>>483
おまえはレスが読めんのかと
485デフォルトの名無しさん:2005/04/26(火) 21:06:42
1、日本語を使わない
2、日本語も通るコンパイラを使う
3、もっと勉強する
486デフォルトの名無しさん:2005/04/26(火) 21:08:02
文字コードを変えれば手っ取り早いのに。
487476=478:2005/04/26(火) 21:10:17
皆さんありがとうございます。
>>480を実行してからコンパイルしたら上手くいきました。
488デフォルトの名無しさん:2005/04/26(火) 21:11:57
SJIS通るgccもあるけどな
489デフォルトの名無しさん:2005/04/26(火) 21:15:30
>>484
それはどうなマクロですか?
490デフォルトの名無しさん:2005/04/26(火) 21:21:02
>>487
とりあえずおめでとう
レスはちゃんと読もうな
491デフォルトの名無しさん:2005/04/26(火) 21:26:12
>>483
streamのラッパクラス作って、内部でエンディアン判定、変換させればいいべ。
492デフォルトの名無しさん:2005/04/26(火) 21:29:22
>>487
0x5cを含む漢字の前に'\'を足してもいいね。
493デフォルトの名無しさん:2005/04/26(火) 21:32:41
>>491
なるほど、ありがとうございます。とりあえず試してみます。
494デフォルトの名無しさん:2005/04/26(火) 21:38:13
VC++6,0でやり始めたんだけど、よくわからないので教えてくれ
例えばprintfって打ち込むところを間違ってpintfって打ち込んだとする
直そうと思ってpの次にrを入れるわけなんだが、入れると
iが上書きされてprntfって感じになっちゃう
こんな感じでなにをしても文字が全部上書きされちゃう状態
上書きされちゃうから一文字間違ったらその一行やり直しになってしまう
オプションとか見てもどれいじればいいのかわからないぽ
かなりめんどくさいので上書きされないようにする方法おしーて
495デフォルトの名無しさん:2005/04/26(火) 21:39:18
>>494

Insertキー。普通は刻印が「INS」となっていると思われる。
496デフォルトの名無しさん:2005/04/26(火) 21:39:41
キーボードのInsもしくはInsertキーを優しく愛撫しる。
497デフォルトの名無しさん:2005/04/26(火) 21:41:28
>>495,496
おお、上書きされないようにできたー
ありがとう〜〜
498Insert:2005/04/26(火) 21:42:23
あっ・・・ふあっ・あんっ・・ああっ・・・
499476:2005/04/26(火) 21:42:54
たびたび申し訳ありません。
>>480の方法でコンパイルは出来ましたが実効すると文字化けするようになりました。

>>492
どういうことでしょうか?
ox5cとは\記号のことではないのでしょうか?
Meadowを使ってるためバックスラッシュが表示されますが。
500デフォルトの名無しさん:2005/04/26(火) 21:47:25
>>497
BackSpaceやHome押すときに間違えて押したりして上書きモードになることがよくある
VCのウィンドウの、ステータスバーの右端の方に「上書」って書いてあるとこがあるから
そこの文字がグレイだったら挿入モード、黒だったら上書きモード
501デフォルトの名無しさん:2005/04/26(火) 21:48:25
>>499
おまいはエスケープシーケンスを知らんのかと
あとox5cじゃなくて0x5c
502デフォルトの名無しさん:2005/04/26(火) 22:06:45
無駄に優しいと、質問者がつけあがって
更に言語と関係ないこと訊いてくるよ。
503デフォルトの名無しさん:2005/04/26(火) 22:12:44
>>499
492は間違っている。問題の字の後ろにバックスラッシュを付けるのが正しい。

Shift JISだと'表'は95 5cになる。2バイト目だけを見てコンパイラがバックスラッシュと解釈してしまう。
Cではバックスラッシュを2つ並べるとバックスラッシュを表すエスケープシーケンスになるから、
'表\'とすると95 5c 5cとなり、コンパイラが\\のエスケープシーケンスとして認識し95 5cを出力させるのがこの対策。
504476:2005/04/26(火) 22:13:18
文字コード適当に変えつつやってみます。
だめだったら日本語使わずにやります。
色々とご迷惑かけました。
505476:2005/04/26(火) 22:23:54
>>503
ありがとうございます。
確かに「表」と使ってました。
それに今までコンパイル出来なかった日本語の後に
バックスラッシュ付けたらコンパイルできるようになりました。
本当に皆さんご迷惑をおかけしました。
506492:2005/04/26(火) 22:23:55
>>503
あ、すまん。
507デフォルトの名無しさん:2005/04/26(火) 23:22:56
つうか
L"だめぽ"
508デフォルトの名無しさん:2005/04/26(火) 23:47:55
509デフォルトの名無しさん:2005/04/27(水) 01:29:03
>>508
「これからの嵐」 ワラタ
510デフォルトの名無しさん:2005/04/27(水) 09:59:44
質問です。

基底クラスから、派生クラスの関数を呼ぶ方法はありませんでしょうか。
以下ことの発端です。

JAVAのObjectのように、自滅してくれるクラスを作ろうと試してみました。
Objectクラスに参照カウンターを持たせ、デストラクタにて参照カウントを-1します。
カウントが0になってしまったのなら責任を持って参照先をdeleteします。
参照先は「ObjectData構造体」です。

この実装自体はうまくいき、きちんと自滅してくれます。

次にObjectを継承して、Stringクラスというものを作ってみました。
参照先は「StringData構造体」です。
デストラクタで参照カウントが0になった場合、「ObjectData」ではなく今度は「StringData」を消さなければなりません。

void* m_pDataというポインタを持っているため、指しているアドレスは同じですが
delete (ObjectData*)m_pData とすると正しく解放されません。
もちろんObjectクラスはStringクラスなんぞ知らないし、どう派生されるかもわからないので
delete (StringData*)m_Data と書くわけにもいきません。

ここで考えました。
「String::release()を呼び出せれば正しく解放できるんだけどなぁ…。
 releaseはオーバーライド必須にすればいい」

ですがObjectのデストラクタでreleaseを呼ぶと、Object::releaseを呼んでしまいます。
releaseを純粋仮想関数にすると「純粋仮想関数を呼び出してますよエラー」になってしまいます。
511デフォルトの名無しさん:2005/04/27(水) 10:12:33
>>510
仮想デストラクタでぐぐれ、というかその前に仮想関数でぐぐれ、というかboost::shared_ptrあたりでぐぐったほうがいいかも
512デフォルトの名無しさん:2005/04/27(水) 10:15:31
template
513デフォルトの名無しさん:2005/04/27(水) 10:17:51
>>511
お返事ありがとうございます。
仮想関数については、
「基底クラスポインタから呼び出しても、派生クラスのものが呼ばれるようにする」
と解釈いたしました。

これですと
class Object{
public:
 ~Object(){
  //ここで派生先の関数を呼びたい
 }
};
という目的とは合致しないように思えますが、私の解釈が検討はずれなのでしょうか。
514デフォルトの名無しさん:2005/04/27(水) 10:23:55
virtual ~Object();
515デフォルトの名無しさん:2005/04/27(水) 10:25:43
for(i=0; i<NUM; i++)
{
for(j=0; j<NUM-i; j++)
{
nCount++;
}
}
nCount を NUM使って数式にしたい。
516デフォルトの名無しさん:2005/04/27(水) 10:27:14
>>512
ありがとうございます。
template<T> として delete T とするのでしょうか。
Objectクラスの中でそうしようと思っても、ObjectはStringDataを知らないので目的通りの使い方はできないように思えます。

templateについては自信がないため、もしかすると超突拍子のない返事となっているかもしれません。
その際はご容赦ください。
517デフォルトの名無しさん:2005/04/27(水) 10:31:21
>>513
これで何が起こるか確認した方がいいよ。

#include <iostream>

class A
{
public:
virtual ~A() { std::cout << "A::~A()" << std::endl; }
};

class B: public A
{
public:
~B() { std::cout << "B::~B()" << std::endl; }
};

int main(int argc, char *argv[])
{
A *a = new B();
delete a;
return 0;
}
518デフォルトの名無しさん:2005/04/27(水) 10:32:12
>>514
デストラクタが仮想かどうかが問題になるのでしょうか?

基底クラスのポインタに、派生クラスのアドレスを代入して使っている場合
解放したときにきちんと派生デストラクタが呼ばれないのを防ぐため

というのが仮想デストラクタの意義だと解釈しておりましたが…。

現状 String::~String() → Object::~Object() の順で呼ばれております。
もちろん~String()で参照カウンターを参照し、StringDataの削除を行なえばいいのですが、
カウンターの管理はObjectにまかせたいのです。

519デフォルトの名無しさん:2005/04/27(水) 10:48:34
>>518
カウンターの管理はObjectで行ない、削除の必要の有無を返してStringで削除汁。
520デフォルトの名無しさん:2005/04/27(水) 10:49:28
> もちろん~String()で参照カウンターを参照し、StringDataの削除を行なえばいいのですが、
> カウンターの管理はObjectにまかせたいのです。

設計がクソな気がしてきた。
String::~String() で削除できないような StringData って一体何なの?
521デフォルトの名無しさん:2005/04/27(水) 11:11:58
>>519
カウンターの管理のうちの一つとして「Objectのデストラクタにて参照カウンタを減算」があります。
Objectのデストラクタが実行された後に、Stringに依頼を出す手段を探しています。

そもそもすでにStringはデストラクタで解体されてしまっているのに、
そこに命令を送ることは無理な気もしています。
>>520もおっしゃっているとおり、設計がクソというか、言語の概念自体誤認識しているのかもしれません。




522デフォルトの名無しさん:2005/04/27(水) 11:24:18
Objectのデストラクタに減算をいれず、継承先で減算を入れるようにしたら?
523デフォルトの名無しさん:2005/04/27(水) 11:30:30
>>522
そうしてしまいますと、Stringを継承したクラスを作るときに困ってしまいます。

「 カウンターが1のときは、Objectのデストラクタで0になる。
 つまりObjectのメソッドに bool checkRelease(){ return (1 == m_nCnt) } でも作って
 派生クラスはこれを参照することを義務付ける」
とするのが正しい実装なのかもしれません。

というか、基底クラスのデストラクタから派生クラスのメソッドを呼ぶ方法がなければこれを使うしかないわけですが…。
524デフォルトの名無しさん:2005/04/27(水) 12:02:57
StringDataをObjectDataから派生させりゃいいんじゃないの?
つーかObjectとかStringって何者なん?

>Objectクラスに参照カウンターを持たせ、デストラクタにて参照カウントを-1します。
>カウントが0になってしまったのなら責任を持って参照先をdeleteします。

これだけならboost::shared_ptrがそのまんまの機能を持ってるんだけど。
525デフォルトの名無しさん:2005/04/27(水) 12:14:49
>>515
(NUM)*(NUM+1)/2
526デフォルトの名無しさん:2005/04/27(水) 12:37:22
realloc でメモリを拡張すると、新しいメモリが今までと
違うメモリブロックに確保された時に以前に取得していた
ポインタが無効になってしまうのですが、それを

int* p = malloc(10 * sizeof(int));
int* hoge = &p[5];

int* newP = realloc(p, 100 * sizeof(int));
if (newP != p) {
    hoge += newP - p;
}

と hoge を補正しても大丈夫でしょうか?
527デフォルトの名無しさん:2005/04/27(水) 12:50:07
>>526
hoge = &newP[5];

の何が不満だ?
528デフォルトの名無しさん:2005/04/27(水) 12:56:24
>>527
void f(int* p, int* hoge)
{
    p = realloc(p, 100 * sizeof(int));
}

f(p, &p[5]);

のように、関数にポインタを渡さなければならないときに困るんです
529デフォルトの名無しさん:2005/04/27(水) 12:58:35
>>510
設計を見直すべき。
530デフォルトの名無しさん:2005/04/27(水) 13:22:21
>>526
>hoge += newP - p;
うまくいきそうな気がするけど、厳密には未定義。
安全を期すなら、こう。
hoge = newP+(hoge-p);
531デフォルトの名無しさん:2005/04/27(水) 13:42:56
>>528
>p = realloc(p, 100 * sizeof(int));
メモリが確保できなかったときにメモリリークする。
532デフォルトの名無しさん:2005/04/27(水) 13:54:08
>>524
STLに素晴らしい機能があるのは存じております。
私もC++だけでの開発となれば絶対そっちを使うのですが…。色々と事情がありまして。

>StringDataをObjectDataから派生させりゃいいんじゃないの?
>つーかObjectとかStringって何者なん?
データを参照するポインタみたいなものです。
参照カウンターを共有しており、デストラクタが動作した際に参照カウンターを減算。
0に達した場合はデータの破棄を行います。

JAVAのStringと記述的にもほぼ同等になることを目指しています。
533デフォルトの名無しさん:2005/04/27(水) 14:04:52
>>532
ObjectData自体に参照カウンタを持たせて、COMみたいにAddRef, Releaseで参照カウンタを増減させ
参照カウンタが0になったら自殺(delete this)。StringDataはObjectDataから派生。
ObjectはObjectDataをAddRef, Releaseで管理。(ObjectDataのdeleteはObjectData自身に任せる)

でいいんじゃないの?
534デフォルトの名無しさん:2005/04/27(水) 14:25:05
>>533
お返事ありがとうございます。
ObjectData側が自滅できるのならば私の望んでいる実装が可能そうです。

delete thisというのができるのを正直知りませんでした。
これで実装をためしてみようかと思います。

ObjectData側にreleaseを作り、それを仮想クラスとして扱えば
常に正しい型のreleaseが呼べますね。
これからすぐにでも試してみます。
535デフォルトの名無しさん:2005/04/27(水) 14:52:23
>>533
正しく解放されました!
delete this という知識が無かったので深みにはまってしまったわけですね。
的確なアドバイスに大変感謝いたします。
536デフォルトの名無しさん:2005/04/27(水) 15:30:12
WTLのCFileDialog関連の質問です。
OFN_ALLOWMULTISELECT | OFN_EXPLORERを指定して、複数ファイルの選択を取得したいんですが、パース部分のコードがどうにも、冗長になってしまいます。
MFCの場合、GetNext〜等あるようですが・・・・
(CodeProjectにあったCFileDialog(MFC)の機能を移植したCFileDialog(WTL)を使えばいいのかなぁ・・・)
スマートなコード見本等、ありませんか?
よろしくお願いします。
537デフォルトの名無しさん:2005/04/27(水) 15:41:14
そんなの、自分の好き勝手に作れ、お前が普通と思っているのwぷ
538デフォルトの名無しさん:2005/04/27(水) 15:50:35
wぷ?
539デフォルトの名無しさん:2005/04/27(水) 16:27:52

    WTL

      WTL
540デフォルトの名無しさん:2005/04/27(水) 17:56:19
strstrの逆で、検索文字列の後ろを返すのは?
541デフォルトの名無しさん:2005/04/27(水) 18:06:58
>>540
標準ではない
542540:2005/04/27(水) 19:33:49
543デフォルトの名無しさん:2005/04/27(水) 19:34:36
>>530
hoge += newP - p;
がダメで
hoge = newP+(hoge-p);
だといいのでしょうか?
544543:2005/04/27(水) 19:41:11
分かりました。
よく考えずに聞いてしまって申し訳ないです。。
545デフォルトの名無しさん:2005/04/27(水) 20:26:56
char* p = NULL;
の時に、&p[0] ってアドレスを取得してもやっても大丈夫?
546デフォルトの名無しさん:2005/04/27(水) 20:35:06
>>545
pと同じ意味じゃん。
547デフォルトの名無しさん:2005/04/27(水) 20:40:25
p[0]って*(p + 0)のシンタックスシュガーじゃなかったっけ?
548デフォルトの名無しさん:2005/04/27(水) 21:09:17
キタ━━━━━(゚∀゚)━━━━━!!!!
ぬるぽ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽ
ぬ・る・ぽーーーーーーーーーーーーーー!!
549デフォルトの名無しさん:2005/04/27(水) 21:32:54
>>548
落ち着け
550デフォルトの名無しさん:2005/04/27(水) 21:34:07
>>547
そう
551デフォルトの名無しさん:2005/04/27(水) 21:47:18
んじゃあ
&*pってなってぬるぽになっちゃうんじゃ?
552デフォルトの名無しさん:2005/04/27(水) 21:53:47
その通り
553デフォルトの名無しさん:2005/04/28(木) 00:26:44
inline を使いたくて、
#ifndef __cplusplus
# if defined(__STDC_VERSION__) && (__STDC_VERSION__>=199901L) /* c99 */
# define INLINE inline
# else
# define INLINE
# endif /* (__STDC_VERSION__) && (__STDC_VERSION__>=199901L) */
#endif /* __cplusplus */
のようにやっているのですが、他に何かいい方法はないでしょうか?
554デフォルトの名無しさん
>>553 何が気に入らないのか言わなくちゃ。